fpart-1.7.0/000755 001751 000000 00000000000 14745137275 013621 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/000755 001751 000000 00000000000 14745137273 015442 5ustar00martymacwheel000000 000000 fpart-1.7.0/Makefile.am000644 001751 000000 00000000156 14745137273 015655 0ustar00martymacwheel000000 000000 # Add Changelog to distribution package EXTRA_DIST = Changelog SUBDIRS = src SUBDIRS += tools SUBDIRS += man fpart-1.7.0/Changelog.md000755 001751 000000 00000000000 14745137273 024677 2docs/www.fpart.org/docs/changelog.mdustar00martymacwheel000000 000000 fpart-1.7.0/install-sh000755 001751 000000 00000036115 14745137275 015633 0ustar00martymacwheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # 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 # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_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 && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fpart-1.7.0/aclocal.m4000644 001751 000000 00000137005 14745137274 015466 0ustar00martymacwheel000000 000000 # generated automatically by aclocal 1.17 -*- Autoconf -*- # Copyright (C) 1996-2024 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, [m4_warning([this file was generated for autoconf 2.72. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2024 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.17' 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.17], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.17])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2024 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([_AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl AC_REQUIRE([_AM_PROG_RM_F]) AC_REQUIRE([_AM_PROG_XARGS_N]) dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2022-2024 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_RM_F # --------------- # Check whether 'rm -f' without any arguments works. # https://bugs.gnu.org/10828 AC_DEFUN([_AM_PROG_RM_F], [am__rm_f_notfound= AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) AC_SUBST(am__rm_f_notfound) ]) # Copyright (C) 2001-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2024 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_SLEEP_FRACTIONAL_SECONDS # ---------------------------- AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl AC_CACHE_CHECK([whether sleep supports fractional seconds], am_cv_sleep_fractional_seconds, [dnl AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], [am_cv_sleep_fractional_seconds=no]) ])]) # _AM_FILESYSTEM_TIMESTAMP_RESOLUTION # ----------------------------------- # Determine the filesystem's resolution for file modification # timestamps. The coarsest we know of is FAT, with a resolution # of only two seconds, even with the most recent "exFAT" extensions. # The finest (e.g. ext4 with large inodes, XFS, ZFS) is one # nanosecond, matching clock_gettime. However, it is probably not # possible to delay execution of a shell script for less than one # millisecond, due to process creation overhead and scheduling # granularity, so we don't check for anything finer than that. (See below.) AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) AC_CACHE_CHECK([filesystem timestamp resolution], am_cv_filesystem_timestamp_resolution, [dnl # Default to the worst case. am_cv_filesystem_timestamp_resolution=2 # Only try to go finer than 1 sec if sleep can do it. # Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, # - 1 sec is not much of a win compared to 2 sec, and # - it takes 2 seconds to perform the test whether 1 sec works. # # Instead, just use the default 2s on platforms that have 1s resolution, # accept the extra 1s delay when using $sleep in the Automake tests, in # exchange for not incurring the 2s delay for running the test for all # packages. # am_try_resolutions= if test "$am_cv_sleep_fractional_seconds" = yes; then # Even a millisecond often causes a bunch of false positives, # so just try a hundredth of a second. The time saved between .001 and # .01 is not terribly consequential. am_try_resolutions="0.01 0.1 $am_try_resolutions" fi # In order to catch current-generation FAT out, we must *modify* files # that already exist; the *creation* timestamp is finer. Use names # that make ls -t sort them differently when they have equal # timestamps than when they have distinct timestamps, keeping # in mind that ls -t prints the *newest* file first. rm -f conftest.ts? : > conftest.ts1 : > conftest.ts2 : > conftest.ts3 # Make sure ls -t actually works. Do 'set' in a subshell so we don't # clobber the current shell's arguments. (Outer-level square brackets # are removed by m4; they're present so that m4 does not expand # ; be careful, easy to get confused.) if ( set X `[ls -t conftest.ts[12]]` && { test "$[]*" != "X conftest.ts1 conftest.ts2" || test "$[]*" != "X conftest.ts2 conftest.ts1"; } ); then :; else # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". _AS_ECHO_UNQUOTED( ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], [AS_MESSAGE_LOG_FD]) AC_MSG_FAILURE([ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment.]) fi for am_try_res in $am_try_resolutions; do # Any one fine-grained sleep might happen to cross the boundary # between two values of a coarser actual resolution, but if we do # two fine-grained sleeps in a row, at least one of them will fall # entirely within a coarse interval. echo alpha > conftest.ts1 sleep $am_try_res echo beta > conftest.ts2 sleep $am_try_res echo gamma > conftest.ts3 # We assume that 'ls -t' will make use of high-resolution # timestamps if the operating system supports them at all. if (set X `ls -t conftest.ts?` && test "$[]2" = conftest.ts3 && test "$[]3" = conftest.ts2 && test "$[]4" = conftest.ts1); then # # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, # because we don't need to test make. make_ok=true if test $am_try_res != 1; then # But if we've succeeded so far with a subsecond resolution, we # have one more thing to check: make. It can happen that # everything else supports the subsecond mtimes, but make doesn't; # notably on macOS, which ships make 3.81 from 2006 (the last one # released under GPLv2). https://bugs.gnu.org/68808 # # We test $MAKE if it is defined in the environment, else "make". # It might get overridden later, but our hope is that in practice # it does not matter: it is the system "make" which is (by far) # the most likely to be broken, whereas if the user overrides it, # probably they did so with a better, or at least not worse, make. # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html # # Create a Makefile (real tab character here): rm -f conftest.mk echo 'conftest.ts1: conftest.ts2' >conftest.mk echo ' touch conftest.ts2' >>conftest.mk # # Now, running # touch conftest.ts1; touch conftest.ts2; make # should touch ts1 because ts2 is newer. This could happen by luck, # but most often, it will fail if make's support is insufficient. So # test for several consecutive successes. # # (We reuse conftest.ts[12] because we still want to modify existing # files, not create new ones, per above.) n=0 make=${MAKE-make} until test $n -eq 3; do echo one > conftest.ts1 sleep $am_try_res echo two > conftest.ts2 # ts2 should now be newer than ts1 if $make -f conftest.mk | grep 'up to date' >/dev/null; then make_ok=false break # out of $n loop fi n=`expr $n + 1` done fi # if $make_ok; then # Everything we know to check worked out, so call this resolution good. am_cv_filesystem_timestamp_resolution=$am_try_res break # out of $am_try_res loop fi # Otherwise, we'll go on to check the next resolution. fi done rm -f conftest.ts? # (end _am_filesystem_timestamp_resolution) ])]) # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) # This check should not be cached, as it may vary across builds of # different projects. AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). am_build_env_is_sane=no am_has_slept=no rm -f conftest.file for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 test "$[]2" = conftest.file ); then am_build_env_is_sane=yes break fi # Just in case. sleep "$am_cv_filesystem_timestamp_resolution" am_has_slept=yes done AC_MSG_RESULT([$am_build_env_is_sane]) if test "$am_build_env_is_sane" = no; then AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ]) AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SILENT_RULES # ---------------- # Enable less verbose build rules support. AC_DEFUN([_AM_SILENT_RULES], [AM_DEFAULT_VERBOSITY=1 AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls dnl to AM_SILENT_RULES to change the default value. AC_CONFIG_COMMANDS_PRE([dnl case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; esac if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi ])dnl ]) # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or # empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_REQUIRE([_AM_SILENT_RULES]) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])]) # Copyright (C) 2001-2024 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-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2024 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test x$am_uid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) elif test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test x$gm_gid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) elif test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # Copyright (C) 2022-2024 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_XARGS_N # ---------------- # Check whether 'xargs -n' works. It should work everywhere, so the fallback # is not optimized at all as we never expect to use it. AC_DEFUN([_AM_PROG_XARGS_N], [AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' ])dnl AC_SUBST(am__xargs_n) ]) fpart-1.7.0/tests/000755 001751 000000 00000000000 14745137273 014761 5ustar00martymacwheel000000 000000 fpart-1.7.0/Makefile.in000644 001751 000000 00000060115 14745137275 015671 0ustar00martymacwheel000000 000000 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in COPYING README.md TODO compile \ config.guess config.sub install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \ ; rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = -9 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = \ find . \( -type f -a \! \ \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Add Changelog to distribution package EXTRA_DIST = Changelog SUBDIRS = src tools man all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) $(AM_V_at)$(MKDIR_P) "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ dist-zstd distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% fpart-1.7.0/debian000755 001751 000000 00000000000 14745137273 021340 2contribs/package/debianustar00martymacwheel000000 000000 fpart-1.7.0/man/000755 001751 000000 00000000000 14745137275 014374 5ustar00martymacwheel000000 000000 fpart-1.7.0/make_release.sh000755 001751 000000 00000003000 14745137273 016564 0ustar00martymacwheel000000 000000 #!/bin/sh # Generates a release tarball _release=$(git tag | tail -n 1) _target_dir="/tmp" # Print a message to stderr and exit with error code 1 end_die () { [ -n "$1" ] && echo "$1" 1>&2 exit 1 } cd $(dirname "${0}")/ || \ end_die "Cannot change directory" echo "Checking out tag ${_release}..." { git checkout "${_release}" && \ [ "$(git status --porcelain)" = "" ] ;} || \ end_die "Current branch not clean, cannot proceed" echo "Copying sources to ${_target_dir}/${_release}..." { mkdir -p "${_target_dir}/" && \ cp -Rf ./ "${_target_dir}/${_release}" ;} || \ end_die "Error copying sources" echo "Running autoreconf..." echo "==" (cd "${_target_dir}/${_release}" && \ autoreconf -fi && echo "==") || \ end_die "Error running autoreconf" echo "Generating tarball..." { tar c -C "${_target_dir}" -zf "${_target_dir}/${_release}.tar.gz" \ --exclude ".git*" --exclude "autom4te.cache" "${_release}/" ;} || \ end_die "Error generating file: ${_target_dir}/${_release}.tar.gz" echo "Created file: ${_target_dir}/${_release}.tar.gz" echo "Signing release..." gpg --detach-sign --armor ${_target_dir}/${_release}.tar.gz || \ end_die "Could not sign tarball" echo "Created signature: ${_target_dir}/${_release}.tar.gz.asc" echo "Cleaning up temporary directory..." rm -rf "${_target_dir}/${_release}" || \ end_die "Error cleaning up: ${_target_dir}/${_release}" echo "Coming back to master branch..." git checkout "master" || \ end_die "Could not checkout master branch" echo "done." exit 0 fpart-1.7.0/configure.ac000644 001751 000000 00000004607 14745137273 016114 0ustar00martymacwheel000000 000000 AC_PREREQ([2.63]) AC_INIT([fpart], [1.7.0], [ganael.laplanche@martymac.org]) AC_CONFIG_SRCDIR([src/fpart.h]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) # Checks for programs. AC_PROG_CC([cc gcc]) AC_PROG_CC_C99 AM_PROG_CC_C_O AC_PROG_INSTALL # Checks for log10() in -lm AC_CHECK_LIB(m, log10) # Checks for header files. AC_CHECK_HEADERS([fcntl.h getopt.h paths.h stdlib.h string.h strings.h sys/mount.h sys/param.h sys/statfs.h sys/statvfs.h sys/vfs.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_PID_T AC_TYPE_SIZE_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([bzero dirfd fchdir getcwd getopt_long memmove memset strchr strerror strrchr strtol]) # OS detection AC_CANONICAL_HOST case "${host_os}" in solaris*) host_os_solaris=true ;; linux*) # Alpine Linux uses musl-libc which does not include fts(3) case "${host_os}" in linux-musl*) extfts=true ;; esac host_os_linux=true ;; esac # Default value for embedded fts support dflt_embfts=false # Enabled on Solaris if test x$host_os_solaris = xtrue then dflt_embfts=true fi # Embedded fts option AC_ARG_ENABLE([embfts], [ --enable-embfts enable embedded fts], [case "${enableval}" in yes) embfts=true ;; no) embfts=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-embfts]) ;; esac],[embfts=${dflt_embfts}]) # Static build option AC_ARG_ENABLE([static], [ --enable-static build static binary], [case "${enableval}" in yes) static=true ;; no) static=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-static]) ;; esac],[static=false]) # Debug option AC_ARG_ENABLE([debug], [ --enable-debug turn on debugging], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; esac],[debug=false]) # Large file support AC_SYS_LARGEFILE # Automake output AM_CONDITIONAL([DEBUG], [test x$debug = xtrue]) AM_CONDITIONAL([EMBEDDED_FTS], [test x$embfts = xtrue]) AM_CONDITIONAL([EXTERNAL_FTS], [test x$extfts = xtrue]) AM_CONDITIONAL([SOLARIS], [test x$host_os_solaris = xtrue]) AM_CONDITIONAL([LINUX], [test x$host_os_linux = xtrue]) AM_CONDITIONAL([STATIC], [test x$static = xtrue]) #AC_CONFIG_HEADERS([src/config.h]) AC_CONFIG_FILES([Makefile src/Makefile tools/Makefile man/Makefile]) AC_OUTPUT fpart-1.7.0/TODO000644 001751 000000 00000004560 14745137273 014314 0ustar00martymacwheel000000 000000 TODO (ideas) : ************** That file shares several ideas I've had for the project. Feel free to contribute ! Global : - Unit testing ! - Provide ready-to-use docker nodes ? - FS analysis tool to help optimize fpart/fpsync options ? Fpart: - Enable hooks in non-live mode (would help automating GH discussion #55) ? - chdir(2) to initial working directory before forking hooks ? - Implement pre-run hooks ? (is that useful ?) - Implement option -zzzz to list directories only (0-sized) ? - -E should probably not imply -z (as empty dirs are part of parent dirs' file lists) - To minimize memory footprint in non-live mode, add a 'checkpoint' capability to sort and flush partitions when a memory / file entry count limit is reached - Add an option to specify that a directory matching a path or a pattern should not be split but treated as a file entry - Add constraints, e.g. : force hardlinks to belong to the same partition - Improve sort by using, e.g. : http://en.wikipedia.org/wiki/External_sorting - Rework error code (errx(3), perror(3), ...) - Rework verbose and debug messages - Split fpart_hook() in two parts : fpart_hook_init_env() + forking code - Use queue(3) ? Fpsync: - Add an option to specify run ID name and set default run ID scheme to YYYYDDMM-HHMMSS - Ability to replay one or more jobs within a specific run (see: https://sourceforge.net/p/fpart/discussion/general/thread/5d001d74b6/) - Document job prepare/listing/resume/replay + log location - Show if dirsonly/aggressive mode is enabled in status - When waiting for sync jobs to complete, regularly show status (as a progress bar ?) - Provide per-job pre- and post-xfer rc scripts (useful to perform tasks such as computing an additional src/ or dst/ prefix - to be added too) - Enable fpart's option -n for prepare mode only ? - Add "debug" pseudo-tool ? - Homogenize variable names ('_', MAJ, min) - Improve portability (egrep vs grep, ...) - Check if src_dir/ is the same on all workers (using a stat fingerprint) and use the same method for dst_dir/ (stop using a witness file) - Add options to limit total bandwidth / per-syncer load - Provide a status socket Autotools: - Use config.h (for program version, data types, header inclusion, build options info [...]) - Add -Wall to CFLAGS when possible (gcc, clang) Documentation: - Better document fpart's option '-s' behaviour in live mode (see GH issue #36) fpart-1.7.0/COPYING000644 001751 000000 00000002452 14745137273 014655 0ustar00martymacwheel000000 000000 Copyright (c) 2011-2025 Ganael LAPLANCHE All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. fpart-1.7.0/config.guess000755 001751 000000 00000126014 14745137275 016145 0ustar00martymacwheel000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-08-29' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 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 # 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. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 set_cc_for_build() { : "${TMPDIR=/tmp}" # shellcheck disable=SC2039 { 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" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$driver" break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/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 ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-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) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; 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}${abi-}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$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 ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" case `isainfo -b` in 32) echo i386-pc-solaris2"$UNAME_REL" ;; 64) echo x86_64-pc-solaris2"$UNAME_REL" ;; esac 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) 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 set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` 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:4.4BSD:*) 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 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 set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) 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 ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi else echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf fi exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; *:Minix:*:*) echo "$UNAME_MACHINE"-unknown-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-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 set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-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. # shellcheck disable=SC2154 if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&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 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fpart-1.7.0/config.sub000755 001751 000000 00000105526 14745137275 015615 0ustar00martymacwheel000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-05-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -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 1992-2018 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 # Split fields of configuration type IFS="-" read -r field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 os=$maybe_os ;; android-linux) basic_machine=$field1-unknown os=linux-android ;; *) basic_machine=$field1-$field2 os=$field3 ;; esac ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc532* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* | hitachi* \ | c[123]* | convex* | sun | crds | omron* | dg | ultra | tti* \ | harris | dolphin | highlevel | gould | cbm | ns | masscomp \ | apple | axis | knuth | cray | microblaze* \ | sim | cisco | oki | wec | wrs | winbond) basic_machine=$field1-$field2 os= ;; *) basic_machine=$field1 os=$field2 ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc os=bsd ;; a29khif) basic_machine=a29k-amd os=udi ;; adobe68k) basic_machine=m68010-adobe os=scout ;; am29k) basic_machine=a29k-none os=bsd ;; amdahl) basic_machine=580-amdahl os=sysv ;; amigaos | amigados) basic_machine=m68k-unknown os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=sysv4 ;; apollo68) basic_machine=m68k-apollo os=sysv ;; apollo68bsd) basic_machine=m68k-apollo os=bsd ;; aros) basic_machine=i386-pc os=aros ;; aux) basic_machine=m68k-apple os=aux ;; balance) basic_machine=ns32k-sequent os=dynix ;; blackfin) basic_machine=bfin-unknown os=linux ;; cegcc) basic_machine=arm-unknown os=cegcc ;; cray) basic_machine=j90-cray os=unicos ;; craynv) basic_machine=craynv-cray os=unicosmp ;; delta88) basic_machine=m88k-motorola os=sysv3 ;; dicos) basic_machine=i686-pc os=dicos ;; djgpp) basic_machine=i586-pc os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=ose ;; gmicro) basic_machine=tron-gmicro os=sysv ;; go32) basic_machine=i386-pc os=go32 ;; 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 ;; hp300bsd) basic_machine=m68k-hp os=bsd ;; hp300hpux) basic_machine=m68k-hp os=hpux ;; hppaosf) basic_machine=hppa1.1-hp os=osf ;; hppro) basic_machine=hppa1.1-hp os=proelf ;; i386mach) basic_machine=i386-mach os=mach ;; vsta) basic_machine=i386-unknown os=vsta ;; isi68 | isi) basic_machine=m68k-isi os=sysv ;; m68knommu) basic_machine=m68k-unknown os=linux ;; magnum | m3230) basic_machine=mips-mips os=sysv ;; merlin) basic_machine=ns32k-utek os=sysv ;; mingw64) basic_machine=x86_64-pc os=mingw64 ;; mingw32) basic_machine=i686-pc os=mingw32 ;; mingw32ce) basic_machine=arm-unknown os=mingw32ce ;; monitor) basic_machine=m68k-rom68k os=coff ;; morphos) basic_machine=powerpc-unknown os=morphos ;; moxiebox) basic_machine=moxie-unknown os=moxiebox ;; msdos) basic_machine=i386-pc os=msdos ;; msys) basic_machine=i686-pc os=msys ;; mvs) basic_machine=i370-ibm os=mvs ;; nacl) basic_machine=le32-unknown os=nacl ;; ncr3000) basic_machine=i486-ncr os=sysv4 ;; netbsd386) basic_machine=i386-unknown os=netbsd ;; netwinder) basic_machine=armv4l-rebel os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=newsos ;; news1000) basic_machine=m68030-sony os=newsos ;; necv70) basic_machine=v70-nec os=sysv ;; 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 ;; os400) basic_machine=powerpc-ibm os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=ose ;; os68k) basic_machine=m68k-none os=os68k ;; paragon) basic_machine=i860-intel os=osf ;; parisc) basic_machine=hppa-unknown os=linux ;; pw32) basic_machine=i586-unknown os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=rdos ;; rdos32) basic_machine=i386-pc os=rdos ;; rom68k) basic_machine=m68k-rom68k os=coff ;; sa29200) basic_machine=a29k-amd os=udi ;; sei) basic_machine=mips-sei os=seiux ;; sps7) basic_machine=m68k-bull os=sysv2 ;; stratus) basic_machine=i860-stratus os=sysv4 ;; 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 ;; 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 ;; toad1) basic_machine=pdp10-xkl os=tops20 ;; 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 ;; vxworks960) basic_machine=i960-wrs os=vxworks ;; vxworks68) basic_machine=m68k-wrs os=vxworks ;; vxworks29k) basic_machine=a29k-wrs os=vxworks ;; xbox) basic_machine=i686-pc os=mingw32 ;; ymp) basic_machine=ymp-cray os=unicos ;; *) basic_machine=$1 os= ;; esac ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv6m | armv[78][arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper | csky \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nfp \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=${os:-none} ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; m9s12z | m68hcs12z | hcs12z | s12z) basic_machine=s12z-unknown os=${os:-none} ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=${os:-none} ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | amd64-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nfp-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | powerpcspe-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; abacus) basic_machine=abacus-unknown ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; amiga | amiga-*) basic_machine=m68k-unknown ;; asmjs) basic_machine=asmjs-unknown ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; bluegene*) basic_machine=powerpc-ibm os=cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=${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 ;; cr16 | cr16-*) basic_machine=cr16-unknown os=${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=${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 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=${os:-bosx} ;; dpx2*) basic_machine=m68k-bull os=sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; encore | umax | mmax) basic_machine=ns32k-encore ;; elxsi) basic_machine=elxsi-elxsi os=${os:-bsd} ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=hiuxwe2 ;; hp300-*) basic_machine=m68k-hp ;; 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 ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=solaris2 ;; j90 | j90-cray) basic_machine=j90-cray os=${os:-unicos} ;; iris | iris4d) basic_machine=mips-sgi case $os in irix*) ;; *) os=irix4 ;; esac ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; microblaze*) basic_machine=microblaze-xilinx ;; miniframe) basic_machine=m68000-convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; news-3600 | risc-news) basic_machine=mips-sony os=newsos ;; next | m*-next) basic_machine=m68k-next case $os in nextstep* ) ;; ns2*) os=nextstep2 ;; *) os=nextstep3 ;; esac ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=hiuxwe2 ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) 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) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; 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 ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=${os:-elf} ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=vxworks ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; tile*) basic_machine=$basic_machine-unknown os=linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; tower | tower-32) basic_machine=m68k-ncr ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; w65*) basic_machine=w65-wdc os=none ;; w89k-*) basic_machine=hppa1.1-winbond os=proelf ;; x64) basic_machine=x86_64-pc ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; none) basic_machine=none-none os=${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 ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x$os != x ] then case $os in # First match some system type aliases that might get confused # with valid system types. # solaris* is a basic system type, with this one exception. auroraux) os=auroraux ;; bluegene*) os=cnk ;; solaris1 | solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; solaris) os=solaris2 ;; unixware*) os=sysv4.2uw ;; gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) es1800*) os=ose ;; # Some version numbers need modification chorusos*) os=chorusos ;; isc) os=isc2.2 ;; sco6) os=sco5v6 ;; sco5) os=sco3.2v5 ;; sco4) os=sco3.2v4 ;; sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` ;; sco3.2v[4-9]* | sco5v6*) # Don't forget version if it is 3.2v4 or newer. ;; scout) # Don't match below ;; sco*) os=sco3.2v2 ;; psos*) os=psos ;; # Now 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* | esix* | aix* | cnk* | sunos | sunos[34]*\ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | kopensolaris* | plan9* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* \ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ | clix* | riscos* | uniplus* | iris* | rtu* | xenix* \ | knetbsd* | mirbsd* | netbsd* \ | bitrig* | openbsd* | solidbsd* | libertybsd* \ | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* \ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ | linux-newlib* | linux-musl* | linux-uclibc* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ | openstep* | oskit* | conix* | pw32* | nonstopux* \ | storm-chaos* | tops10* | tenex* | tops20* | its* \ | os2* | vos* | palmos* | uclinux* | nucleus* \ | morphos* | superux* | rtmk* | windiss* \ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=nto-$os ;; esac ;; hiux*) os=hiuxwe2 ;; nto-qnx*) ;; nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; sim | xray | os68k* | v88r* \ | windows* | osx | abug | netware* | os9* \ | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) ;; linux-dietlibc) os=linux-dietlibc ;; linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; lynx*178) os=lynxos178 ;; lynx*5) os=lynxos5 ;; lynx*) os=lynxos ;; mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; opened*) os=openedition ;; os400*) os=os400 ;; sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; wince*) os=wince ;; 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 ;; *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) os=mint ;; zvmoe) os=zvmoe ;; dicos*) os=dicos ;; pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=eabi ;; *) os=elf ;; esac ;; nacl*) ;; ios) ;; none) ;; *-eabi) ;; *) 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 ;; c8051-*) os=elf ;; clipper-intergraph) os=clix ;; hexagon-*) os=elf ;; tic54x-*) os=coff ;; tic55x-*) os=coff ;; tic6x-*) os=coff ;; # This must come before the *-dec entry. pdp10-*) os=tops20 ;; pdp11-*) os=none ;; *-dec | vax-*) os=ultrix4.2 ;; m68*-apollo) os=domain ;; i386-sun) os=sunos4.0.2 ;; m68000-sun) os=sunos3 ;; m68*-cisco) os=aout ;; mep-*) os=elf ;; mips*-cisco) os=elf ;; mips*-*) os=elf ;; or32-*) os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 ;; sparc-* | *-sun) os=sunos4.1.1 ;; pru-*) os=elf ;; *-be) os=beos ;; *-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 ;; *-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 ;; *-wrs) os=vxworks ;; *) os=none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in riscix*) vendor=acorn ;; sunos*) vendor=sun ;; cnk*|-aix*) vendor=ibm ;; beos*) vendor=be ;; hpux*) vendor=hp ;; mpeix*) vendor=hp ;; hiux*) vendor=hitachi ;; unos*) vendor=crds ;; dgux*) vendor=dg ;; luna*) vendor=omron ;; genix*) vendor=ns ;; clix*) vendor=intergraph ;; 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 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fpart-1.7.0/src/000755 001751 000000 00000000000 14745137275 014410 5ustar00martymacwheel000000 000000 fpart-1.7.0/compile000755 001751 000000 00000016705 14745137275 015210 0ustar00martymacwheel000000 000000 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fpart-1.7.0/configure000755 001751 000000 00000575301 14745137275 015543 0ustar00martymacwheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for fpart 1.7.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 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 ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: ganael.laplanche@martymac.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$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 || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear 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" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='fpart' PACKAGE_TARNAME='fpart' PACKAGE_VERSION='1.7.0' PACKAGE_STRING='fpart 1.7.0' PACKAGE_BUGREPORT='ganael.laplanche@martymac.org' PACKAGE_URL='' ac_unique_file="src/fpart.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_func_c_list= enable_year2038=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS STATIC_FALSE STATIC_TRUE LINUX_FALSE LINUX_TRUE SOLARIS_FALSE SOLARIS_TRUE EXTERNAL_FTS_FALSE EXTERNAL_FTS_TRUE EMBEDDED_FTS_FALSE EMBEDDED_FTS_TRUE DEBUG_FALSE DEBUG_TRUE LIBOBJS host_os host_vendor host_cpu host build_os build_vendor build_cpu build am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__xargs_n am__rm_f_notfound AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_embfts enable_static enable_debug enable_largefile enable_year2038 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures fpart 1.7.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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/fpart] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fpart 1.7.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-embfts enable embedded fts --enable-static build static binary --enable-debug turn on debugging --disable-largefile omit support for large files --enable-year2038 support timestamps after 2038 Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$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 configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. 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 printf "%s\n" "$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 fpart configure 1.7.0 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) eval "$3=yes" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 fpart $as_me 1.7.0, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "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=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (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; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* 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 do not provoke an error unfortunately, instead are silently treated as an "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 is necessary to write \x00 == 0 to get something that is 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 **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " vfork.h vfork_h HAVE_VFORK_H" as_fn_append ac_func_c_list " fork HAVE_FORK" as_fn_append ac_func_c_list " vfork HAVE_VFORK" # Auxiliary files required by this configure script. ac_aux_files="config.guess config.sub compile missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac 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. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" 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,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.17' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$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' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 printf %s "checking whether sleep supports fractional seconds... " >&6; } if test ${am_cv_sleep_fractional_seconds+y} then : printf %s "(cached) " >&6 else case e in #( e) if sleep 0.001 2>/dev/null then : am_cv_sleep_fractional_seconds=yes else case e in #( e) am_cv_sleep_fractional_seconds=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5 printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5 printf %s "checking filesystem timestamp resolution... " >&6; } if test ${am_cv_filesystem_timestamp_resolution+y} then : printf %s "(cached) " >&6 else case e in #( e) # Default to the worst case. am_cv_filesystem_timestamp_resolution=2 # Only try to go finer than 1 sec if sleep can do it. # Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, # - 1 sec is not much of a win compared to 2 sec, and # - it takes 2 seconds to perform the test whether 1 sec works. # # Instead, just use the default 2s on platforms that have 1s resolution, # accept the extra 1s delay when using $sleep in the Automake tests, in # exchange for not incurring the 2s delay for running the test for all # packages. # am_try_resolutions= if test "$am_cv_sleep_fractional_seconds" = yes; then # Even a millisecond often causes a bunch of false positives, # so just try a hundredth of a second. The time saved between .001 and # .01 is not terribly consequential. am_try_resolutions="0.01 0.1 $am_try_resolutions" fi # In order to catch current-generation FAT out, we must *modify* files # that already exist; the *creation* timestamp is finer. Use names # that make ls -t sort them differently when they have equal # timestamps than when they have distinct timestamps, keeping # in mind that ls -t prints the *newest* file first. rm -f conftest.ts? : > conftest.ts1 : > conftest.ts2 : > conftest.ts3 # Make sure ls -t actually works. Do 'set' in a subshell so we don't # clobber the current shell's arguments. (Outer-level square brackets # are removed by m4; they're present so that m4 does not expand # ; be careful, easy to get confused.) if ( set X `ls -t conftest.ts[12]` && { test "$*" != "X conftest.ts1 conftest.ts2" || test "$*" != "X conftest.ts2 conftest.ts1"; } ); then :; else # 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". printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment. See 'config.log' for more details" "$LINENO" 5; } fi for am_try_res in $am_try_resolutions; do # Any one fine-grained sleep might happen to cross the boundary # between two values of a coarser actual resolution, but if we do # two fine-grained sleeps in a row, at least one of them will fall # entirely within a coarse interval. echo alpha > conftest.ts1 sleep $am_try_res echo beta > conftest.ts2 sleep $am_try_res echo gamma > conftest.ts3 # We assume that 'ls -t' will make use of high-resolution # timestamps if the operating system supports them at all. if (set X `ls -t conftest.ts?` && test "$2" = conftest.ts3 && test "$3" = conftest.ts2 && test "$4" = conftest.ts1); then # # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, # because we don't need to test make. make_ok=true if test $am_try_res != 1; then # But if we've succeeded so far with a subsecond resolution, we # have one more thing to check: make. It can happen that # everything else supports the subsecond mtimes, but make doesn't; # notably on macOS, which ships make 3.81 from 2006 (the last one # released under GPLv2). https://bugs.gnu.org/68808 # # We test $MAKE if it is defined in the environment, else "make". # It might get overridden later, but our hope is that in practice # it does not matter: it is the system "make" which is (by far) # the most likely to be broken, whereas if the user overrides it, # probably they did so with a better, or at least not worse, make. # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html # # Create a Makefile (real tab character here): rm -f conftest.mk echo 'conftest.ts1: conftest.ts2' >conftest.mk echo ' touch conftest.ts2' >>conftest.mk # # Now, running # touch conftest.ts1; touch conftest.ts2; make # should touch ts1 because ts2 is newer. This could happen by luck, # but most often, it will fail if make's support is insufficient. So # test for several consecutive successes. # # (We reuse conftest.ts[12] because we still want to modify existing # files, not create new ones, per above.) n=0 make=${MAKE-make} until test $n -eq 3; do echo one > conftest.ts1 sleep $am_try_res echo two > conftest.ts2 # ts2 should now be newer than ts1 if $make -f conftest.mk | grep 'up to date' >/dev/null; then make_ok=false break # out of $n loop fi n=`expr $n + 1` done fi # if $make_ok; then # Everything we know to check worked out, so call this resolution good. am_cv_filesystem_timestamp_resolution=$am_try_res break # out of $am_try_res loop fi # Otherwise, we'll go on to check the next resolution. fi done rm -f conftest.ts? # (end _am_filesystem_timestamp_resolution) ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5 printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; } # This check should not be cached, as it may vary across builds of # different projects. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). am_build_env_is_sane=no am_has_slept=no rm -f conftest.file for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 test "$2" = conftest.file ); then am_build_env_is_sane=yes break fi # Just in case. sleep "$am_cv_filesystem_timestamp_resolution" am_has_slept=yes done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5 printf "%s\n" "$am_build_env_is_sane" >&6; } if test "$am_build_env_is_sane" = no; then as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1 then : else case e in #( e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ;; esac fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was 's,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ *'BusyBox '* | \ '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 ;; esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use plain mkdir -p, # in the hope it doesn't have the bugs of ancient mkdir. MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 AM_DEFAULT_VERBOSITY=1 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else case e in #( e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } AM_BACKSLASH='\' am__rm_f_notfound= if (rm -f && rm -fr && rm -rf) 2>/dev/null then : else case e in #( e) am__rm_f_notfound='""' ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5 printf %s "checking xargs -n works... " >&6; } if test ${am_cv_xargs_n_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3" then : am_cv_xargs_n_works=yes else case e in #( e) am_cv_xargs_n_works=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5 printf "%s\n" "$am_cv_xargs_n_works" >&6; } if test "$am_cv_xargs_n_works" = yes then : am__xargs_n='xargs -n' else case e in #( e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }' ;; esac fi if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='fpart' VERSION='1.7.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # Checks for programs. 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 for ac_prog in cc gcc 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cc gcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && 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 case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; 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 ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac 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 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thus: # 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$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 # Checks for log10() in -lm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for log10 in -lm" >&5 printf %s "checking for log10 in -lm... " >&6; } if test ${ac_cv_lib_m_log10+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char log10 (void); int main (void) { return log10 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_log10=yes else case e in #( e) ac_cv_lib_m_log10=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_log10" >&5 printf "%s\n" "$ac_cv_lib_m_log10" >&6; } if test "x$ac_cv_lib_m_log10" = xyes then : printf "%s\n" "#define HAVE_LIBM 1" >>confdefs.h LIBS="-lm $LIBS" fi # Checks for header files. ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" if test "x$ac_cv_header_fcntl_h" = xyes then : printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes then : printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default" if test "x$ac_cv_header_paths_h" = xyes then : printf "%s\n" "#define HAVE_PATHS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes then : printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes then : printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes then : printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mount_h" = xyes then : printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes then : printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/statfs.h" "ac_cv_header_sys_statfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statfs_h" = xyes then : printf "%s\n" "#define HAVE_SYS_STATFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statvfs_h" = xyes then : printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_vfs_h" = xyes then : printf "%s\n" "#define HAVE_SYS_VFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes then : printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default " if test "x$ac_cv_type_pid_t" = xyes then : else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _WIN64 && !defined __CYGWIN__ LLP64 #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_pid_type='int' else case e in #( e) ac_pid_type='__int64' ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h ;; esac fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes then : else case e in #( e) printf "%s\n" "#define size_t unsigned int" >>confdefs.h ;; esac fi # Checks for library functions. ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done if test "x$ac_cv_func_fork" = xyes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 printf %s "checking for working fork... " >&6; } if test ${ac_cv_func_fork_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : ac_cv_func_fork_works=cross else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* By R. Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_fork_works=yes else case e in #( e) ac_cv_func_fork_works=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 printf %s "checking for working vfork... " >&6; } if test ${ac_cv_func_vfork_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : ac_cv_func_vfork_works=cross else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #include #ifdef HAVE_VFORK_H # include #endif static void do_nothing (int sig) { (void) sig; } /* 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 sparc_address_test (int arg) { 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 (void) { pid_t parent = getpid (); pid_t child; sparc_address_test (0); /* On Solaris 2.4, changes by the child to the signal handler also munge signal handlers in the parent. To detect this, start by putting the parent's handler in a known state. */ signal (SIGTERM, SIG_DFL); 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); /* Alter the child's signal handler. */ if (signal (SIGTERM, do_nothing) != SIG_DFL) _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 munge the parent's signal handler? */ || signal (SIGTERM, SIG_DFL) != SIG_DFL /* 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 if ac_fn_c_try_run "$LINENO" then : ac_cv_func_vfork_works=yes else case e in #( e) ac_cv_func_vfork_works=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 printf "%s\n" "$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 printf "%s\n" "#define HAVE_WORKING_VFORK 1" >>confdefs.h else printf "%s\n" "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then printf "%s\n" "#define HAVE_WORKING_FORK 1" >>confdefs.h fi # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 printf %s "checking whether lstat correctly handles trailing slash... " >&6; } if test ${ac_cv_func_lstat_dereferences_slashed_symlink+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 : case "$host_os" in # (( # Guess yes on glibc systems. *-gnu*) ac_cv_func_lstat_dereferences_slashed_symlink=yes ;; # If we don't know, assume the worst. *) ac_cv_func_lstat_dereferences_slashed_symlink=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. 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 if ac_fn_c_try_run "$LINENO" then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else case e in #( e) ac_cv_func_lstat_dereferences_slashed_symlink=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 printf "%s\n" "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 printf %s "checking for GNU libc compatible malloc... " >&6; } if test ${ac_cv_func_malloc_0_nonnull+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | hpux* | solaris* | cygwin* | mingw* | windows* | msys* ) ac_cv_func_malloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_malloc_0_nonnull=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = malloc (0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_malloc_0_nonnull=yes else case e in #( e) ac_cv_func_malloc_0_nonnull=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes then : printf "%s\n" "#define HAVE_MALLOC 1" >>confdefs.h else case e in #( e) printf "%s\n" "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac printf "%s\n" "#define malloc rpl_malloc" >>confdefs.h ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 printf %s "checking for GNU libc compatible realloc... " >&6; } if test ${ac_cv_func_realloc_0_nonnull+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on platforms where we know the result. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | hpux* | solaris* | cygwin* | mingw* | windows* | msys* ) ac_cv_func_realloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_realloc_0_nonnull=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = realloc (0, 0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_realloc_0_nonnull=yes else case e in #( e) ac_cv_func_realloc_0_nonnull=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes then : printf "%s\n" "#define HAVE_REALLOC 1" >>confdefs.h else case e in #( e) printf "%s\n" "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac printf "%s\n" "#define realloc rpl_realloc" >>confdefs.h ;; esac fi ac_fn_c_check_func "$LINENO" "bzero" "ac_cv_func_bzero" if test "x$ac_cv_func_bzero" = xyes then : printf "%s\n" "#define HAVE_BZERO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd" if test "x$ac_cv_func_dirfd" = xyes then : printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fchdir" "ac_cv_func_fchdir" if test "x$ac_cv_func_fchdir" = xyes then : printf "%s\n" "#define HAVE_FCHDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" if test "x$ac_cv_func_getcwd" = xyes then : printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getopt_long" "ac_cv_func_getopt_long" if test "x$ac_cv_func_getopt_long" = xyes then : printf "%s\n" "#define HAVE_GETOPT_LONG 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" if test "x$ac_cv_func_memmove" = xyes then : printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset" if test "x$ac_cv_func_memset" = xyes then : printf "%s\n" "#define HAVE_MEMSET 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr" if test "x$ac_cv_func_strchr" = xyes then : printf "%s\n" "#define HAVE_STRCHR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" if test "x$ac_cv_func_strerror" = xyes then : printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr" if test "x$ac_cv_func_strrchr" = xyes then : printf "%s\n" "#define HAVE_STRRCHR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" if test "x$ac_cv_func_strtol" = xyes then : printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h fi # OS detection case "${host_os}" in solaris*) host_os_solaris=true ;; linux*) # Alpine Linux uses musl-libc which does not include fts(3) case "${host_os}" in linux-musl*) extfts=true ;; esac host_os_linux=true ;; esac # Default value for embedded fts support dflt_embfts=false # Enabled on Solaris if test x$host_os_solaris = xtrue then dflt_embfts=true fi # Embedded fts option # Check whether --enable-embfts was given. if test ${enable_embfts+y} then : enableval=$enable_embfts; case "${enableval}" in yes) embfts=true ;; no) embfts=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-embfts" "$LINENO" 5 ;; esac else case e in #( e) embfts=${dflt_embfts} ;; esac fi # Static build option # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; case "${enableval}" in yes) static=true ;; no) static=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-static" "$LINENO" 5 ;; esac else case e in #( e) static=false ;; esac fi # Debug option # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else case e in #( e) debug=false ;; esac fi # Large file support # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile,$enable_year2038" != no,no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5 printf %s "checking for $CC option to enable large file support... " >&6; } if test ${ac_cv_sys_largefile_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CC="$CC" ac_opt_found=no for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do if test x"$ac_opt" != x"none needed" then : CC="$ac_save_CC $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef FTYPE # define FTYPE off_t #endif /* Check that FTYPE can represent 2**63 - 1 correctly. We can't simply define LARGE_FTYPE to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31)) int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721 && LARGE_FTYPE % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_opt" = x"none needed" then : # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t. CC="$CC -DFTYPE=ino_t" if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) CC="$CC -D_FILE_OFFSET_BITS=64" if ac_fn_c_try_compile "$LINENO" then : ac_opt='-D_FILE_OFFSET_BITS=64' fi rm -f core conftest.err conftest.$ac_objext conftest.beam ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam fi ac_cv_sys_largefile_opts=$ac_opt ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CC="$ac_save_CC" test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5 printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; } ac_have_largefile=yes case $ac_cv_sys_largefile_opts in #( "none needed") : ;; #( "supported through gnulib") : ;; #( "support not detected") : ac_have_largefile=no ;; #( "-D_FILE_OFFSET_BITS=64") : printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h ;; #( "-D_LARGE_FILES=1") : printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h ;; #( "-n32") : CC="$CC -n32" ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;; esac if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5 printf %s "checking for $CC option for timestamps after 2038... " >&6; } if test ${ac_cv_sys_year2038_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CPPFLAGS="$CPPFLAGS" ac_opt_found=no for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do if test x"$ac_opt" != x"none needed" then : CPPFLAGS="$ac_save_CPPFLAGS $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_year2038_opts="$ac_opt" ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CPPFLAGS="$ac_save_CPPFLAGS" test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5 printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; } ac_have_year2038=yes case $ac_cv_sys_year2038_opts in #( "none needed") : ;; #( "support not detected") : ac_have_year2038=no ;; #( "-D_TIME_BITS=64") : printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h ;; #( "-D__MINGW_USE_VC2005_COMPAT") : printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h ;; #( "-U_USE_32_BIT_TIME_T"*) : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "the 'time_t' type is currently forced to be 32-bit. It will stop working after mid-January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See 'config.log' for more details" "$LINENO" 5; } ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;; esac fi fi # Automake output if test x$debug = xtrue; then DEBUG_TRUE= DEBUG_FALSE='#' else DEBUG_TRUE='#' DEBUG_FALSE= fi if test x$embfts = xtrue; then EMBEDDED_FTS_TRUE= EMBEDDED_FTS_FALSE='#' else EMBEDDED_FTS_TRUE='#' EMBEDDED_FTS_FALSE= fi if test x$extfts = xtrue; then EXTERNAL_FTS_TRUE= EXTERNAL_FTS_FALSE='#' else EXTERNAL_FTS_TRUE='#' EXTERNAL_FTS_FALSE= fi if test x$host_os_solaris = xtrue; then SOLARIS_TRUE= SOLARIS_FALSE='#' else SOLARIS_TRUE='#' SOLARIS_FALSE= fi if test x$host_os_linux = xtrue; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test x$static = xtrue; then STATIC_TRUE= STATIC_FALSE='#' else STATIC_TRUE='#' STATIC_FALSE= fi #AC_CONFIG_HEADERS([src/config.h]) ac_config_files="$ac_config_files Makefile src/Makefile tools/Makefile man/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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; esac if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then as_fn_error $? "conditional \"DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EMBEDDED_FTS_TRUE}" && test -z "${EMBEDDED_FTS_FALSE}"; then as_fn_error $? "conditional \"EMBEDDED_FTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXTERNAL_FTS_TRUE}" && test -z "${EXTERNAL_FTS_FALSE}"; then as_fn_error $? "conditional \"EXTERNAL_FTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SOLARIS_TRUE}" && test -z "${SOLARIS_FALSE}"; then as_fn_error $? "conditional \"SOLARIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STATIC_TRUE}" && test -z "${STATIC_FALSE}"; then as_fn_error $? "conditional \"STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$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 || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by fpart $as_me 1.7.0, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ fpart config.status 1.7.0 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See 'config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi fpart-1.7.0/README.md000644 001751 000000 00000004706 14745137273 015105 0ustar00martymacwheel000000 000000 --- _______ ____ __ _ __ / / ___| _ \ / /_ _ _ __| |_ / / / /| |_ | |_) / / _` | '__| __| / / / / | _| | __/ / (_| | | | |_ / / /_/ |_| |_| /_/ \__,_|_| \__/_/ --- # What is fpart ? Fpart is a **F**ilesystem **part**itioner. It helps you sort file trees and pack them into bags (called "partitions"). It is developed in C and available under the BSD license. Fpsync, a powerful file-migration tool is also provided. See the [documentation](http://www.fpart.org) for more details and examples. # Key features ## Fpart * Blazing fast crawling! * Generates partitions on a number/file number/size basis * Provides a live mode with hooks to act immediately on generated file lists * Supports generating partitions from arbitrary input (e.g. du's output) ## Fpsync * Parallelizes rsync(1), cpio(1), pax(1) or tar(1) jobs * Supports using a SSH cluster for efficient data migrations * Starts transfers while FS crawling still goes on * Supports remote target URLs when using rsync(1) * Parallelizes your final rsync(1) pass too! * Provides transfer runs' status/resume/replay * Nearly no dependencies (mostly shell and common tools) # Author / Licence Fpart has been written by [Ganael LAPLANCHE](mailto:ganael.laplanche@martymac.org) and is available under the BSD license (see COPYING for details). Source code is hosted on : * [Martymac.org](http://contribs.martymac.org) * [Github](https://github.com/martymac/fpart) * [Sourceforge](http://www.sourceforge.net/projects/fpart) Documentation is available on : * [Fpart.org](http://www.fpart.org) Thanks to Jean-Baptiste Denis for having given me the idea of this program ! # Third-party code fts(3) code originally comes from FreeBSD : lib/libc/gen/fts.c -> src/fts.c include/fts.h -> src/fts.h It has been slightly modified for portability and is available under the BSD license. # Supporting fpart If fpart (or fpsync) is useful to you or your organization, do not hesitate to contribute back! You can follow ideas in the [TODO](https://github.com/martymac/fpart/blob/master/TODO) file or just fix a bug, any kind of help is always welcome! You can also make a donation via Paypal: [![Paypal](https://www.paypalobjects.com/en_US/FR/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HSL25ZED2PS62&source=url) or [Github](https://github.com/sponsors/martymac?o=esb). That will help me not running out of tea :) fpart-1.7.0/docs/000755 001751 000000 00000000000 14745137273 014547 5ustar00martymacwheel000000 000000 fpart-1.7.0/tools/000755 001751 000000 00000000000 14745137275 014761 5ustar00martymacwheel000000 000000 fpart-1.7.0/depcomp000755 001751 000000 00000056217 14745137275 015211 0ustar00martymacwheel000000 000000 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "depcomp (GNU Automake) $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interference from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fpart-1.7.0/missing000755 001751 000000 00000017060 14745137275 015224 0ustar00martymacwheel000000 000000 #! /bin/sh # Common wrapper for a few potentially missing GNU and other programs. scriptversion=2024-06-07.14; # UTC # shellcheck disable=SC2006,SC2268 # we must support pre-POSIX shells # Copyright (C) 1996-2024 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autogen autoheader autom4te automake autoreconf bison flex help2man lex makeinfo perl yacc Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Report bugs to . GNU Automake home page: . General help using GNU software: ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing (GNU Automake) $scriptversion" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake|autoreconf) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; *) : ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" autoheader_deps="'acconfig.h'" automake_deps="'Makefile.am'" aclocal_deps="'acinclude.m4'" case $normalized_program in aclocal*) echo "You should only need it if you modified $aclocal_deps or" echo "$configure_deps." ;; autoconf*) echo "You should only need it if you modified $configure_deps." ;; autogen*) echo "You should only need it if you modified a '.def' or '.tpl' file." echo "You may want to install the GNU AutoGen package:" echo "<$gnu_software_URL/autogen/>" ;; autoheader*) echo "You should only need it if you modified $autoheader_deps or" echo "$configure_deps." ;; automake*) echo "You should only need it if you modified $automake_deps or" echo "$configure_deps." ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." ;; autoreconf*) echo "You should only need it if you modified $aclocal_deps or" echo "$automake_deps or $autoheader_deps or $automake_deps or" echo "$configure_deps." ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; perl*) echo "You should only need it to run GNU Autoconf, GNU Automake, " echo " assorted other tools, or if you modified a Perl source file." echo "You may want to install the Perl 5 language interpreter:" echo "<$perl_URL>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac program_details "$normalized_program" } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fpart-1.7.0/tools/Makefile.in000644 001751 000000 00000034117 14745137275 017034 0ustar00martymacwheel000000 000000 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_bin_SCRIPTS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(dist_bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_bin_SCRIPTS = fpsync all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-dist_binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_binSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_binSCRIPTS 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 pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_binSCRIPTS .PRECIOUS: Makefile # 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% fpart-1.7.0/tools/Makefile.am000644 001751 000000 00000000032 14745137273 017006 0ustar00martymacwheel000000 000000 dist_bin_SCRIPTS = fpsync fpart-1.7.0/tools/fpsync000755 001751 000000 00000211203 14745137273 016206 0ustar00martymacwheel000000 000000 #!/bin/sh # Copyright (c) 2014-2025 Ganael LAPLANCHE # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # This script is a simple wrapper showing how fpart can be used to migrate data. # It uses fpart and a copy tool to spawn multiple instances to migrate data from # src_dir/ to dst_url/. Jobs can execute either locally or over SSH. FPSYNC_VERSION="1.7.0" ########## Default values for options # External tool used to copy files OPT_TOOL_NAME="rsync" # External tool path OPT_TOOL_PATH="" # Number of sync jobs to run in parallel ("workers", -n) OPT_JOBS=2 # Same, but autodetected #OPT_JOBS=$(sysctl -n hw.ncpu) # On FreeBSD #OPT_JOBS=$(nproc) # On Linux # Maximum files or directories per sync job (-f) OPT_FPMAXPARTFILES="2000" # Maximum bytes per sync job (-s) OPT_FPMAXPARTSIZE="$((4 * 1024 * 1024 * 1024))" # 4 GB # Work on a per-directory basis (disabled by default) OPT_DIRSONLY="" # Pack erroneous dirs apart and enable recursive rsync OPT_AGGRESSIVE="" # SSH workers (execute jobs locally if not defined, -w) OPT_WRKRS="" # Shared dir (must be shared amongst all workers, -d) OPT_SHDIR="" # Temporary dir (local, used for queue management, -t) OPT_TMPDIR="/tmp/fpsync" # E-mail report option (-M) OPT_MAIL="" # Prepare mode (-p) OPT_PREPARERUN="" # List runs (-l) OPT_LISTRUNS="" # Run ID for resume mode (-r) OPT_RUNID="" # Replay mode (-R) OPT_REPLAYRUN="" # Archive run (-a) OPT_ARCHIVERUN="" # Delete run (-D) OPT_DELETERUN="" # User-settable tool options (-o) OPT_TOOL="" # Fpart options (-O) OPT_FPART="-x|.zfs|-x|.snapshot*|-x|.ckpt" # Sudo mode (-S) OPT_SUDO="" # Verbose mode (-v) OPT_VERBOSE="0" # Source directory OPT_SRCDIR="" # Destination directory OPT_DSTURL="" ########## Internal variables (cannot be set through CLI yet) # Force color usage (even if stdout and stderr are *not* associated with a terminal) OPT_FORCECOLORS="" # POSIX-compliant shell used within generated jobs. It must exist locally # and remotely (when using workers), as well as support '-c' (commands) and # '-s' (stdin) options. # That option may be used to work-around missing 'pipefail' option from '/bin/sh' # on certain systems (e.g. Debian) OPT_JOBSSHELL="/bin/sh" #OPT_JOBSSHELL="/bin/bash" ########## Various functions #set -o errexit #set -o nounset LC_ALL=C # Our color constants # See: https://en.wikipedia.org/wiki/ANSI_escape_code COLOR_BLUE=$(tput setaf 4) COLOR_GREEN=$(tput setaf 2) COLOR_ORANGE=$(tput setaf 3) COLOR_RED=$(tput setaf 1) COLOR_WHITE=$(tput setaf 7) COLOR_STOP=$(tput sgr0) # Disable 'pipefail' option if not supported QUIRK_PIPEFAIL='set -o pipefail' ${OPT_JOBSSHELL} -c "${QUIRK_PIPEFAIL}" 2>/dev/null || \ QUIRK_PIPEFAIL=':' # Print help usage () { cat << EOF fpsync v${FPSYNC_VERSION} - Sync directories in parallel using fpart Copyright (c) 2014-2025 Ganael LAPLANCHE WWW: http://contribs.martymac.org Usage: $0 [-p] [OPTIONS...] src_dir/ dst_url/ $0 -l $0 -r runid [-R] [OPTIONS...] $0 -a runid $0 -D runid COMMON OPTIONS: -t /dir/ set fpsync temp dir to (absolute path) -d /dir/ set fpsync shared dir to (absolute path) This option is mandatory when using SSH workers. -M mailaddr send an e-mail to mailaddr after a run. Multiple -space-separated- addresses can be specified. -v verbose mode (default: quiet) This option can be be specified several times to increase verbosity level. -h this help SYNCHRONIZATION OPTIONS: -m tool external copy tool to use: $(tool_print_supported) (default: 'rsync') -T path absolute path of copy tool (default: guessed) -f y transfer at most files or directories per sync job -s z transfer at most bytes per sync job -E work on a per-directory basis ('rsync' tool only) (WARNING!!! Enables rsync(1)'s --delete option!) Specify twice to enable "aggressive" mode that will isolate erroneous directories and enable recursive synchronization for them ('rsync' tool only) -o options override default copy tool options with See fpsync(1) for more details. -O options override default fpart options with pipe-separated See fpsync(1) for more details. -S use sudo for filesystem crawling and synchronizations src_dir/ source directory (absolute path) dst_url/ destination directory (or URL, when using 'rsync' tool) JOB HANDLING AND DISPATCHING OPTIONS: -n x start concurrent sync jobs per run -w wrks space-separated list of SSH workers e.g.: -w 'login@host1 login@host2 login@host3' or: -w 'login@host1' -w 'login@host2' -w 'login@host3' Jobs are executed locally if not specified (default). RUN HANDLING OPTIONS: -p prepare mode: prepare target(s) and create a resumable run by crawling filesystem but do not actually start synchronization jobs. -l list previous runs and their status. -r runid resume run (options -m, -T, -f, -s, -E, -o, -O, -S, /src_dir/ and /dst_url/ are ignored when resuming a previous run) -R replay mode (needs option -r): re-synchronize all partitions from run instead of working on remaining ones only. -a runid archive run to temp dir -D runid delete run See fpsync(1) for more details. EOF } # Print a message to stdout and exit with normal exit code end_ok () { [ -n "$1" ] && echo "$1" exit 0 } # Print a message to stderr and exit with error code 1 end_die () { [ -n "$1" ] && echo "$1" 1>&2 exit 1 } # Print (to stdout) and log a message # $1 = level (0 = quiet, 1 = verbose, >=2 more verbose) # $2 = message to log # $3 = color echo_log () { local _log_ts=$(date '+%s') local _color_start='' local _color_stop='' # Prepare color if { [ -t 1 ] && [ -t 2 ] ;} || [ -n "${OPT_FORCECOLORS}" ] then case "$3" in "blue") _color_start="${COLOR_BLUE}" _color_stop="${COLOR_STOP}" ;; "green") _color_start="${COLOR_GREEN}" _color_stop="${COLOR_STOP}" ;; "orange") _color_start="${COLOR_ORANGE}" _color_stop="${COLOR_STOP}" ;; "red") _color_start="${COLOR_RED}" _color_stop="${COLOR_STOP}" ;; "white") _color_start="${COLOR_WHITE}" _color_stop="${COLOR_STOP}" ;; esac fi is_num "$1" && [ ${OPT_VERBOSE} -ge $1 ] && [ -n "$2" ] && \ printf '%s\n' "${_log_ts} ${_color_start}$2${_color_stop}" [ -n "$2" ] && \ echo "${_log_ts} $2" >> "${FPSYNC_LOGFILE}" } # Check if $1 is an absolute path is_abs_path() { echo "$1" | grep -qE '^/' } # Check if $1 is a valid rsync URL # Cf. rsync(1) : # SSH: [USER@]HOST:DEST # Rsync: [USER@]HOST::DEST # Rsync: rsync://[USER@]HOST[:PORT]/DEST # Simplified as: "anything but slash" followed by at least one ":" is_remote_path() { echo "$1" | grep -qE '^[^/]+:' } # Check if $1 is a number is_num () { echo "$1" | grep -qE '^[0-9]+$' } # Check if $1 is an acceptable size argument # - must be greater than 0 # - may contain 'kKmMgGtTpP' suffix is_size () { echo "$1" | grep -qE '^0*[1-9][0-9]*[kKmMgGtTpP]?$' } # Check if $1 contains (at least) a valid e-mail address is_mailaddr () { echo "$1" | grep -qE '^[a-zA-Z0-9+._-]+@[a-zA-Z0-9-]+\.' } # Check if $1 is a valid run ID is_runid () { echo "$1" | grep -qE '^[0-9]+-[0-9]+$' } ########## Results handling # Get files from specified run's logdir, by extension # $1 = run ID # $2 = file extension run_logs_list_by_ext () { [ -n "$1" ] && [ -n "$2" ] && \ find "${FPSYNC_LOGDIR_BASE}/${1}" -type f -name "*.${2}" ! -size 0 2>/dev/null } # Check if file $1 exists and contains something # $1 = file path file_is_not_empty () { [ -s "$1" ] } # Return contents of .ret file $1 # $1 = .ret file path retfile_get_code () { cat "$1" 2>/dev/null } # Check if .ret file $1 exists and contains a non-error return code # $1 = .ret file path retfile_is_success () { grep -q '^0$' "$1" 2>/dev/null } # Check if .ret file $1 exists and contains an error return code # $1 = .ret file path retfile_is_error () { grep -q -v '^0$' "$1" 2>/dev/null } # Return corresponding .stderr files from .ret file list # Only non-empty log files are returned logfiles_filter_ret_to_stderr () { while read _line do case "${_line}" in *.ret) file_is_not_empty "${_line%.ret}.stderr" && \ echo "${_line%.ret}.stderr" ;; esac done } # Return .ret files containing an error return code from .ret file list logfiles_filter_ret_with_errors () { while read _line do case "${_line}" in *.ret) retfile_is_error "${_line}" && \ echo "${_line}" ;; esac done } # Return .stderr files with no error associated # Those logs may contain interesting additional warnings logfiles_filter_stderr_without_ret () { while read _line do case "${_line}" in *.stderr) retfile_is_error "${_line%.stderr}.ret" || \ echo "${_line}" ;; esac done } ########## Tool handling # Chek if a tool is supported # $1 = tool name tool_is_supported () { echo "$1" | grep -qE '^(rsync|cpio|pax|tar|tarify)$' } # Chek if TAR_BIN is GNU tar # TAR_BIN must be initialized tar_is_GNU_tar () { [ -n "${TAR_BIN}" ] && "${TAR_BIN}" --version 2>/dev/null | head -n 1 | grep -q 'GNU tar' } # Print supported tools in a friendly manner tool_print_supported () { echo "'rsync', 'cpio', 'pax', 'tar' or 'tarify'" } # Check if a tool supports a URL as sync target # $1 = tool name tool_supports_urls () { echo "$1" | grep -q '^rsync$' } # Check if a tool supports directory-only mode # (requires the ability to sync a single-level directory tree) # $1 = tool name tool_supports_dirsonly () { echo "$1" | grep -q '^rsync$' } # Check if a tool supports aggressive mode # (requires the ability to sync recursively) # $1 = tool name tool_supports_aggressive () { echo "$1" | grep -q '^rsync$' } # Get default tool-related options # $1 = tool name tool_get_base_opts () { [ "$1" = "rsync" ] && printf '%s\n' '-q -lptgoD --numeric-ids' } # Get mode-specific complementary tool-related options # (main call or left part of a pipeline) # $1 = tool name # $2 = dirs only mode (if string not empty) tool_get_tool_mode_opts () { if [ -z "$2" ] then # File-based mode: recursion is usually disabled here # as we are working with leaf elements only case "$1" in "rsync") # Non-recursive (more exactly: single-depth) rsync(1) printf '%s\n' '-d' ;; "cpio") # Passthrough mode, create directories, preserve modification time printf '%s\n' '-pdm' ;; "pax") # Read/Write mode, do not copy directories recursively, preserve everything printf '%s\n' '-r -w -d -p e' ;; "tar"|"tarify") printf '%s\n' '--no-recursion' ;; *) ;; esac else # Dirs-only mode case "$1" in "rsync") # Single-depth rsync(1) + deletion # Postpone deletion to limit impacts of a user interruption # XXX Aggressive mode can set option -r, which takes precedence # over -d (in fact, aggressive mode *depends* on having option -r # overriding -d) printf '%s\n' '-d --relative --delete --delete-after' ;; *) ;; esac fi } # Get mode-specific complementary tool-related options # (right part of a pipeline), if any) # $1 = tool name # $2 = dirs only mode (if string not empty) tool_get_tool_mode_opts_2 () { if [ -z "$2" ] then # File-based mode: recursion is usually disabled here # as we are working with leaf elements only case "$1" in "tar") # GNU Tar needs --delay-directory-restore during extraction. if tar_is_GNU_tar then printf '%s\n' '--delay-directory-restore' fi ;; *) ;; esac fi } # Get recursive option for specified tool # $1 = tool name tool_get_tool_mode_opts_recursive () { [ "$1" = "rsync" ] && printf '%s\n' '-r' } # Get file list separator option for fpart # $1 = tool name tool_get_fpart_separator_opt () { case "$1" in "pax") printf '%s\n' '' ;; *) # Every other tool supports a null-separated list of files printf '%s\n' '-0' ;; esac } # Get mode-specific fpart options # $1 = tool name # $2 = dirs only mode (if string not empty) # $3 = aggressive mode (if string not empty) tool_get_fpart_mode_opts () { if [ -z "$2" ] then # File-based mode case "$1" in "rsync") printf '%s\n' '-zz' ;; "cpio"|"pax"|"tar"|"tarify") # We want empty directory entries with those tools # and fix parent dirs' timestamps with option -P # to re-apply correct metadata printf '%s\n' '-zzzP' ;; *) ;; esac else # Dirs-only mode case "$1" in "rsync") if [ -z "$3" ] then # Regular mode # # We do *not* want fpart option -zz in regular dirs-only mode # because unreadable directories will be created when sync'ing # the parent printf '%s\n' '-E' else # Aggressive mode # # Erroneous dirs are -from fpart's point of view-, mostly leaf # dirs (no subdirs should have been packed before, except # maybe in case of partially-read directories containing # subdirs). Pack erroneous dirs separately and enable recursive # rsync for them to try to overcome transcient errors such as # Linux SMB client deferring opendir() to support compound SMB # requests. See: https://github.com/martymac/fpart/pull/37 printf '%s\n' '-E|-zz|-Z' fi ;; *) ;; esac fi } # Init tool-specific fpart hooks (black magic is here !) # $1 = tool name # $2 = aggressive mode (if string not empty) # XXX That function modifies a global variable to avoid too many escape # characters when returning values through stdout tool_init_fpart_job_command () { case "$1" in "rsync") if [ -z "$2" ] then # Regular mode FPART_JOBCOMMAND="${OPT_JOBSSHELL} -c '${SUDO} ${TOOL_BIN} ${OPT_TOOL} \ ${TOOL_MODEOPTS} --files-from=\\\"\${FPART_PARTFILENAME}\\\" --from0 \ \\\"${OPT_SRCDIR}/\\\" \ \\\"${OPT_DSTURL}/\\\"' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" else # Aggressive mode: enable recursivity for erroneous partitions # (i.e. where: (errno != 0) && (errno != EACCESS)) # Also, skip sync for errno==EACCESS as this is a legitimate error: # unaccessible dirs will be re-created by parents, anyway FPART_JOBCOMMAND="${OPT_JOBSSHELL} -c ' \ FPART_PARTERRNO=\\\"\${FPART_PARTERRNO}\\\"; \ TOOL_MODEOPTS_R=; \ if [ \\\${FPART_PARTERRNO} -ne 0 ]; \ then \ if [ \\\${FPART_PARTERRNO} -eq 13 ]; \ then \ exit 0; \ else \ TOOL_MODEOPTS_R=\\\"${TOOL_MODEOPTS_R}\\\"; \ fi; \ fi; \ ${SUDO} ${TOOL_BIN} ${OPT_TOOL} ${TOOL_MODEOPTS} \ \\\${TOOL_MODEOPTS_R} --files-from=\\\"\${FPART_PARTFILENAME}\\\" --from0 \ \\\"${OPT_SRCDIR}/\\\" \ \\\"${OPT_DSTURL}/\\\"' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" fi ;; "cpio") # XXX Warning: -0 and --quiet are non-standard # (not supported on Solaris), see: # http://pubs.opengroup.org/onlinepubs/7908799/xcu/cpio.html # XXX Exec whole shell cmd as root, because we need to cwd first FPART_JOBCOMMAND="${SUDO} ${OPT_JOBSSHELL} -c '${QUIRK_PIPEFAIL} ; \ cd \\\"${OPT_SRCDIR}/\\\" && \ cat \\\"\${FPART_PARTFILENAME}\\\" | \ ${TOOL_BIN} ${OPT_TOOL} -0 --quiet ${TOOL_MODEOPTS} \ \\\"${OPT_DSTURL}/\\\"' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" ;; "pax") # https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html # XXX Exec whole shell cmd as root, because we need to cwd first FPART_JOBCOMMAND="${SUDO} ${OPT_JOBSSHELL} -c '${QUIRK_PIPEFAIL} ; \ cd \\\"${OPT_SRCDIR}/\\\" && \ cat \\\"\${FPART_PARTFILENAME}\\\" | \ ${TOOL_BIN} ${OPT_TOOL} ${TOOL_MODEOPTS} \ \\\"${OPT_DSTURL}/\\\"' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" ;; "tar") FPART_JOBCOMMAND="${OPT_JOBSSHELL} -c '${QUIRK_PIPEFAIL} ; \ ${SUDO} ${TOOL_BIN} cf - \ ${OPT_TOOL} -C \\\"${OPT_SRCDIR}/\\\" ${TOOL_MODEOPTS} \ --null -T \\\"\${FPART_PARTFILENAME}\\\" | \ ${SUDO} ${TOOL_BIN} xpf - \ ${OPT_TOOL} -C \\\"${OPT_DSTURL}/\\\" ${TOOL_MODEOPTS_2}' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" ;; "tarify") FPART_JOBCOMMAND="${OPT_JOBSSHELL} -c '${SUDO} ${TOOL_BIN} c \ -f \\\"${OPT_DSTURL}/\${FPART_PARTNUMBER}.tar\\\" \ ${OPT_TOOL} -C \\\"${OPT_SRCDIR}/\\\" ${TOOL_MODEOPTS} \ --null -T \\\"\${FPART_PARTFILENAME}\\\"' \ 1>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stdout\" \ 2>\"${FPSYNC_LOGDIR}/\${FPART_PARTNUMBER}.stderr\"" ;; *) ;; esac } # Check if $2 contains invalid options regarding tool $1 # $1 = tool name # $2 = tool options tool_uses_forbidden_option () { # For rsync, prevent usage of : # --delete # --recursive, -r # -a (implies -r) # and leave fpsync handle them internally. [ "$1" = "rsync" ] && \ { printf '%s\n' "$2" | grep -q -- '--delete' || \ printf '%s\n' "$2" | grep -q -- '--recursive' || \ printf '%s\n' "$2" | grep -qE -- '(^|[[:space:]])-[^[:space:]-]*r' || \ printf '%s\n' "$2" | grep -qE -- '(^|[[:space:]])-[^[:space:]-]*a' ;} } ########## Options handling # Parse user options and initialize OPT_* global variables parse_opts () { local opt OPTARG OPTIND while getopts "m:T:n:f:s:Ew:d:t:M:plr:Ra:D:o:O:Svh" opt do case "${opt}" in "m") if tool_is_supported "${OPTARG}" then OPT_TOOL_NAME=${OPTARG} else end_die "Unsupported tool, please specify $(tool_print_supported)" fi ;; "T") if is_abs_path "${OPTARG}" then OPT_TOOL_PATH="${OPTARG}" else end_die "Please supply an absolute path for tool path" fi ;; "n") if is_num "${OPTARG}" && [ ${OPTARG} -ge 1 ] then OPT_JOBS=${OPTARG} else end_die "Option -n expects a numeric value >= 1" fi ;; "f") if is_num "${OPTARG}" && [ ${OPTARG} -ge 0 ] then OPT_FPMAXPARTFILES=${OPTARG} else end_die "Option -f expects a numeric value >= 0" fi ;; "s") if { is_num "${OPTARG}" && [ ${OPTARG} -ge 0 ] ;} || is_size "${OPTARG}" then OPT_FPMAXPARTSIZE=${OPTARG} else end_die "Option -s expects a numeric value >= 0" fi ;; "E") if [ "${OPT_DIRSONLY}" = "yes" ] then OPT_AGGRESSIVE="yes" fi OPT_DIRSONLY="yes" ;; "w") if [ -n "${OPTARG}" ] then OPT_WRKRS="${OPT_WRKRS} ${OPTARG}" else end_die "Invalid workers list supplied" fi ;; "d") if is_abs_path "${OPTARG}" then OPT_SHDIR="${OPTARG}" else end_die "Please supply an absolute path for shared dir" fi ;; "t") if is_abs_path "${OPTARG}" then OPT_TMPDIR="${OPTARG}" else end_die "Please supply an absolute path for temp dir" fi ;; "M") if [ -n "${OPTARG}" ] && is_mailaddr "${OPTARG}" then OPT_MAIL="${OPTARG}" else end_die "Please supply a valid e-mail address" fi ;; "p") OPT_PREPARERUN="yes" ;; "l") OPT_LISTRUNS="yes" ;; "r") if [ -n "${OPTARG}" ] && is_runid "${OPTARG}" then OPT_RUNID="${OPTARG}" else end_die "Invalid run ID supplied" fi ;; "R") OPT_REPLAYRUN="yes" ;; "a") if [ -n "${OPTARG}" ] && is_runid "${OPTARG}" then OPT_ARCHIVERUN="${OPTARG}" else end_die "Invalid run ID supplied" fi ;; "D") if [ -n "${OPTARG}" ] && is_runid "${OPTARG}" then OPT_DELETERUN="${OPTARG}" else end_die "Invalid run ID supplied" fi ;; "o") if [ -n "${OPTARG}" ] then OPT_TOOL="${OPTARG}" else end_die "Invalid tool options supplied" fi ;; "O") if [ -n "${OPTARG}" ] then OPT_FPART="${OPTARG}" else end_die "Invalid fpart options supplied" fi ;; "S") OPT_SUDO="yes" ;; "v") OPT_VERBOSE="$((${OPT_VERBOSE} + 1))" ;; "h") usage end_ok ;; *) usage end_die "Invalid option specified" ;; esac done shift $((${OPTIND} - 1)) # Validate OPT_SHDIR (shared directory) if [ -z "${OPT_WRKRS}" ] then # For local jobs, set shared directory to temporary directory [ -z "${OPT_SHDIR}" ] && \ OPT_SHDIR="${OPT_TMPDIR}" else # For remote ones, specifying a shared directory is mandatory [ -z "${OPT_SHDIR}" ] && \ end_die "Please supply a shared dir when specifying workers" fi # Run handling constraints _err_msg="Please specify only a single option from: -p, -l -r, -a or -D" [ -n "${OPT_PREPARERUN}" ] && \ { [ -n "${OPT_LISTRUNS}" ] || \ [ -n "${OPT_RUNID}" ] || \ [ -n "${OPT_ARCHIVERUN}" ] || \ [ -n "${OPT_DELETERUN}" ] ;} && \ end_die "${_err_msg}" [ -n "${OPT_LISTRUNS}" ] && \ { [ -n "${OPT_RUNID}" ] || \ [ -n "${OPT_ARCHIVERUN}" ] || \ [ -n "${OPT_DELETERUN}" ] ;} && \ end_die "${_err_msg}" [ -n "${OPT_RUNID}" ] && \ { [ -n "${OPT_ARCHIVERUN}" ] || \ [ -n "${OPT_DELETERUN}" ] ;} && \ end_die "${_err_msg}" [ -n "${OPT_ARCHIVERUN}" ] && \ [ -n "${OPT_DELETERUN}" ] && \ end_die "${_err_msg}" _err_msg= [ -n "${OPT_REPLAYRUN}" ] && [ -z "${OPT_RUNID}" ] && \ end_die "Replay (-R) option can only be used with resume (-r) option" # Validate partitions' constraints if is_num "${OPT_FPMAXPARTFILES}" && [ ${OPT_FPMAXPARTFILES} -eq 0 ] && \ is_num "${OPT_FPMAXPARTSIZE}" && [ ${OPT_FPMAXPARTSIZE} -eq 0 ] then end_die "Please specify a least a file (-f) or size (-s) limit for partitions" fi # Check for src_dir and dst_url presence and validity if [ -z "${OPT_RUNID}" ] && [ -z "${OPT_LISTRUNS}" ] && \ [ -z "${OPT_ARCHIVERUN}" ] && [ -z "${OPT_DELETERUN}" ] then # Check src dir, must be an absolute path if is_abs_path "$1" then OPT_SRCDIR="$1" else usage end_die "Please supply an absolute path for src_dir/" fi # Check dst_url, must be either an absolute path or a URL if is_abs_path "$2" || is_remote_path "$2" then is_remote_path "$2" && ! tool_supports_urls "${OPT_TOOL_NAME}" && \ end_die "URLs are not supported when using ${OPT_TOOL_NAME}" OPT_DSTURL="$2" else usage if tool_supports_urls "${OPT_TOOL_NAME}" then end_die "Please supply either an absolute path or a rsync URL for dst_url/" else end_die "Please supply an absolute path for dst_url/" fi fi fi # Handle tool-related options if [ "${OPT_DIRSONLY}" = "yes" ] && ! tool_supports_dirsonly "${OPT_TOOL_NAME}" then end_die "Option -E is invalid when using ${OPT_TOOL_NAME} tool" fi if [ "${OPT_AGGRESSIVE}" = "yes" ] && ! tool_supports_aggressive "${OPT_TOOL_NAME}" then end_die "Aggressive mode is invalid when using ${OPT_TOOL_NAME} tool" fi if [ -z "${OPT_TOOL}" ] then OPT_TOOL=$(tool_get_base_opts "${OPT_TOOL_NAME}") else tool_uses_forbidden_option "${OPT_TOOL_NAME}" "${OPT_TOOL}" && \ end_die "Incompatible option(s) detected within toolopts (option -o)" fi } ########## Work-related functions (in-memory, running-jobs handling) # Initialize WORK_FREEWORKERS by expanding OPT_WRKRS up to OPT_JOBS elements, # assigning a fixed number of slots to each worker. # Sanitize OPT_WRKRS if necessary. work_list_free_workers_init () { local _OPT_WRKRS_NUM=$(echo ${OPT_WRKRS} | awk '{print NF}') if [ ${_OPT_WRKRS_NUM} -gt 0 ] then local _i=0 while [ ${_i} -lt ${OPT_JOBS} ] do local _OPT_WRKRS_IDX="$((${_i} % ${_OPT_WRKRS_NUM} + 1))" WORK_FREEWORKERS="${WORK_FREEWORKERS} $(echo ${OPT_WRKRS} | awk '{print $'${_OPT_WRKRS_IDX}'}')" _i=$((${_i} + 1)) done else OPT_WRKRS="" WORK_FREEWORKERS="local" fi } # Pick-up next worker work_list_pick_next_free_worker () { echo "${WORK_FREEWORKERS}" | awk '{print $1}' } # Remove next worker from list work_list_trunc_next_free_worker () { WORK_FREEWORKERS="$(echo ${WORK_FREEWORKERS} | sed -E 's/^[[:space:]]*[^[:space:]]+[[:space:]]*//')" } # Push a work to the list of currently-running ones work_list_push () { if [ -n "$1" ] then WORK_LIST="${WORK_LIST} $1" WORK_NUM="$((${WORK_NUM} + 1))" fi } # Rebuild the currently-running jobs' list by examining each process' state work_list_refresh () { local _WORK_LIST="" local _WORK_NUM=0 local _JOB_PID="" local _JOB_PART="" local _JOB_HOST="" for _JOB in ${WORK_LIST} do # Extract job info _JOB_PID="${_JOB%%:*}" _JOB_PART="${_JOB#*:}" ; _JOB_PART="${_JOB_PART%:*}" _JOB_HOST="${_JOB##*:}" if ps -p "${_JOB_PID}" 1>/dev/null 2>&1 then # The process is still alive, keep it _WORK_LIST="${_WORK_LIST} ${_JOB}" _WORK_NUM="$((${_WORK_NUM} + 1))" else # Job exited (either naturally or by signal) if [ -n "${OPT_WRKRS}" ] then WORK_FREEWORKERS="${WORK_FREEWORKERS} ${_JOB_HOST}" fi # Not finding a .ret file is abnormal # Main job script (the one that generates the .ret file # itself) must have been killed. We mark it as erroneous by # simulating a SIGTERM with a return code of 143 (128 + SIGTERM). # See: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_08_02 if ! file_is_not_empty "${FPSYNC_LOGDIR}/${_JOB_PART}.ret" then echo "143" 2>/dev/null >"${FPSYNC_LOGDIR}/${_JOB_PART}.ret" || \ end_die "Error writing to .ret file: ${FPSYNC_LOGDIR}/${_JOB_PART}.ret" echo "Job killed (SIGTERM simulated by fpsync)" 2>/dev/null >>"${FPSYNC_LOGDIR}/${_JOB_PART}.stderr" || \ end_die "Error writing to .stderr file: ${FPSYNC_LOGDIR}/${_JOB_PART}.stderr" fi _retcode=$(retfile_get_code "${FPSYNC_LOGDIR}/${_JOB_PART}.ret") is_num "${_retcode}" || \ end_die "Invalid return code fetched for job: ${_JOB_PART}" if [ "${_retcode}" -le 128 ] && \ # XXX Workaround for rsync(1) returning 20 when killed { [ "${OPT_TOOL_NAME}" != "rsync" ] || [ "${_retcode}" -ne 20 ] ;} then # Job finished naturally, check return value if retfile_is_success "${FPSYNC_LOGDIR}/${_JOB_PART}.ret" then echo_log "2" "<= [QMGR] Job ${_JOB_PART} (${_JOB}) exited (success)" "green" else echo_log "2" "<= [QMGR] Job ${_JOB_PART} (${_JOB}) exited (error: ${_retcode})" "red" fi # Update status counters _run_done_jobs=$(( ${_run_done_jobs} + 1 )) _run_done_files=$(( \ ${_run_done_files} + $( \ job_files=0 ; \ . "${FPSYNC_PARTSTMPL}.${_JOB_PART}.meta" 2>/dev/null ; \ echo "${job_files}" \ ) \ )) _run_done_size=$(( \ ${_run_done_size} + $( \ job_size=0 ; \ . "${FPSYNC_PARTSTMPL}.${_JOB_PART}.meta" 2>/dev/null ; \ echo "${job_size}" \ ) \ )) # Mark job as done mv "${JOBS_WORKDIR}/${_JOB_PART}" "${JOBS_DONEDIR}" 2>/dev/null || \ end_die "Error moving job ${_JOB_PART} to done dir" else # Job killed, do *not* mark the job as done # to make the run resumable if [ ${SIGINT_COUNT} -le 1 ] then echo_log "2" "<= [QMGR] Job ${_JOB_PART} (${_JOB}) exited (killed)" "red" else echo_log "2" "<= [QMGR] Job ${_JOB_PART} (${_JOB}) exited (killed by user)" "red" fi fi # Remove useless log and result files file_is_not_empty "${FPSYNC_LOGDIR}/${_JOB_PART}.stdout" || \ rm -f "${FPSYNC_LOGDIR}/${_JOB_PART}.stdout" 2>/dev/null file_is_not_empty "${FPSYNC_LOGDIR}/${_JOB_PART}.stderr" || \ rm -f "${FPSYNC_LOGDIR}/${_JOB_PART}.stderr" 2>/dev/null retfile_is_success "${FPSYNC_LOGDIR}/${_JOB_PART}.ret" && \ rm -f "${FPSYNC_LOGDIR}/${_JOB_PART}.ret" 2>/dev/null fi done WORK_LIST=${_WORK_LIST} WORK_NUM=${_WORK_NUM} } ########## Jobs-related functions (on-disk, jobs' queue handling) # Initialize job queue and work directories job_queue_init () { mkdir -p "${JOBS_QUEUEDIR}" 2>/dev/null || \ end_die "Cannot create job queue directory ${JOBS_QUEUEDIR}" mkdir -p "${JOBS_WORKDIR}" 2>/dev/null || \ end_die "Cannot create job work directory ${JOBS_WORKDIR}" mkdir -p "${JOBS_DONEDIR}" 2>/dev/null || \ end_die "Cannot create job done directory ${JOBS_DONEDIR}" } # Dump job queue information to allow later resuming job_queue_info_dump () { # Create "info" file local _TMPMASK="$(umask)" umask "0077" touch "${JOBS_QUEUEDIR}/info" 2>/dev/null umask "${_TMPMASK}" # Dump necessary information to resume a run # XXX OPT_TOOL_NAME and OPT_TOOL_PATH are technically ignored when resuming # because fpart pass has finished and job scripts have already been written. # Anyway, we record them for 2 reasons: # - to display them to the user # - to check if OPT_TOOL_PATH exists on all workers cat << EOF > "${JOBS_QUEUEDIR}/info" || \ end_die "Cannot record run information" # Run information used for resuming, do not edit ! OPT_SRCDIR="${OPT_SRCDIR}" OPT_DSTURL="${OPT_DSTURL}" OPT_TOOL_NAME="${OPT_TOOL_NAME}" OPT_TOOL_PATH="${OPT_TOOL_PATH}" EOF } job_queue_info_load () { # Source info file and initialize a few variables . "${JOBS_QUEUEDIR}/info" || \ end_die "Cannot read run information" # Validate loaded options ! tool_is_supported "${OPT_TOOL_NAME}" && \ end_die "Invalid option value loaded from resumed run: OPT_TOOL_NAME" ! is_abs_path "${OPT_TOOL_PATH}" && \ end_die "Invalid option value loaded from resumed run: OPT_TOOL_PATH" TOOL_BIN="${OPT_TOOL_PATH}" is_abs_path "${OPT_SRCDIR}" || \ end_die "Invalid options value loaded from resumed run: OPT_SRCDIR" if ! tool_supports_urls "${OPT_TOOL_NAME}" then is_abs_path "${OPT_DSTURL}" || \ end_die "Invalid options value loaded from resumed run: OPT_DSTURL" else is_abs_path "${OPT_DSTURL}" || is_remote_path "${OPT_DSTURL}" || \ end_die "Invalid options value loaded from resumed run: OPT_DSTURL" fi } # Set the "fp_done" (fpart done) flag within job queue job_queue_fp_done () { sleep 1 # Ensure this very last file gets created within the next second of # last job file's mtime. Necessary for filesystems that don't get # below the second for mtime precision (msdosfs). touch "${JOBS_QUEUEDIR}/fp_done" } # Set the "sl_stop" (sync loop stop) flag within job queue job_queue_sl_stop () { touch "${JOBS_QUEUEDIR}/sl_stop" } ########## Status functions # Count total jobs to perform in specified run # $1 = run ID # FPSYNC_PARTSDIR can host several types of file : # part.: file listing for a sync job # part..meta: job meta-information (number of files, size) # run.meta: run meta-information (number of jobs, files, size) run_total_jobs_count () { ( total_num_parts=0 ; \ [ -f "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" ] && \ . "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" 2>/dev/null ; \ echo "${total_num_parts}" ) } # Count total files to transfer in specified run # $1 = run ID run_total_files_count () { ( total_num_files=0 ; \ [ -f "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" ] && \ . "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" 2>/dev/null ; \ echo "${total_num_files}" ) } ## Count total bytes to transfer in specified run # $1 = run ID run_total_size_count () { ( total_size=0 ; \ [ -f "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" ] && \ . "${FPSYNC_PARTSDIR_BASE}/${1}/run.meta" 2>/dev/null ; \ echo "${total_size}" ) } # List incomplete jobs in specified run # Incomplete jobs are those that remain in work dir # $1 = run ID # JOBS_WORKDIR can host several types of file : # : a sync job to perform # 'fp_done': present when every job has been scheduled run_incomplete_jobs_list () { [ -n "${1}" ] && \ find "${JOBS_WORKDIR_BASE}/${1}" \ -type f -a \ '(' ! -name 'fp_done' ')' \ -exec basename {} \; 2>/dev/null } # Count incomplete jobs in specified run # $1 = run ID run_incomplete_jobs_count () { run_incomplete_jobs_list "${1}" | wc -l | awk '{print $1}' } # List complete jobs in specified run # $1 = run ID run_complete_jobs_list () { [ -n "${1}" ] && \ find "${JOBS_DONEDIR_BASE}/${1}" \ -type f \ -exec basename {} \; 2>/dev/null } # Count complete jobs in specified run # $1 = run ID run_complete_jobs_count () { run_complete_jobs_list "${1}" | wc -l | awk '{print $1}' } # Count files transferred in specified run # $1 = run ID run_complete_files_count () { local _jobs_files=0 for _file in $(run_complete_jobs_list "${1}") do _jobs_files=$(( \ ${_jobs_files} + $( \ job_files=0 ; \ . "${FPSYNC_PARTSDIR_BASE}/${1}/part.${_file}.meta" 2>/dev/null ; \ echo "${job_files}" \ ) \ )) done echo "${_jobs_files}" } # Count bytes transferred in specified run # $1 = run ID run_complete_size_count () { local _jobs_size=0 for _file in $(run_complete_jobs_list "${1}") do _jobs_size=$(( \ ${_jobs_size} + $( \ job_size=0 ; \ . "${FPSYNC_PARTSDIR_BASE}/${1}/part.${_file}.meta" 2>/dev/null ; \ echo "${job_size}" \ ) \ )) done echo "${_jobs_size}" } # Check if specified run is resumable # $1 = run ID run_is_resumable () { [ -f "${JOBS_QUEUEDIR_BASE}/${1}/fp_done" ] || \ { [ -f "${JOBS_WORKDIR_BASE}/${1}/fp_done" ] && \ [ $(run_incomplete_jobs_count "${1}") -gt 0 ] ;} } # Check if specified run is replayable # $1 = run ID run_is_replayable () { [ -f "${JOBS_QUEUEDIR_BASE}/${1}/fp_done" ] || \ [ -f "${JOBS_WORKDIR_BASE}/${1}/fp_done" ] } # Print a specific run's status to stdout # $1 = run ID run_status_print () { if run_is_resumable "${1}" then echo "resumable (synchronization not complete, use -r to resume)" else if run_is_replayable "${1}" then echo "replayable (use -R to replay)" else echo "not resumable (fpart pass not complete)" fi fi } sigint_handler () { SIGINT_COUNT="$((${SIGINT_COUNT} + 1))" # Handle first ^C: # stop queue processing by setting the "sl_stop" flag if [ ${SIGINT_COUNT} -le 1 ] then job_queue_sl_stop echo_log "1" "===> Interrupted. Waiting for running jobs to complete..." echo_log "1" "===> (hit ^C again to kill them and exit)" # Handle subsequent ^C: # kill sync processes to fast-unlock the main process else [ ${SIGINT_COUNT} -le 2 ] && \ echo_log "1" "===> Interrupted again, killing remaining jobs" for _KJOB in ${WORK_LIST} do # Extract job info _KJOB_PID="${_KJOB%%:*}" [ ${SIGINT_COUNT} -le 2 ] && \ echo_log "2" "=> [QMGR] Killing job ${_KJOB}" "orange" kill -s INT -- "-${_KJOB_PID}" 1>/dev/null 2>&1 done fi } # Handle ^T: print info about queue status # (hint: on FreeBSD, SIGINFO verbosity can be reduced # by setting sysctl 'kern.tty_info_kstacks' to 0) siginfo_handler () { #### Jobs local _jobs_total=$(run_total_jobs_count "${FPSYNC_RUNID}") local _jobs_running="${WORK_NUM}" local _jobs_done="${_run_done_jobs}" # Jobs remaining, including running ones local _jobs_remaining=$(( ${_jobs_total} - ${_jobs_done} )) local _jobs_percent="??" [ ${_jobs_total} -ge 1 ] && \ _jobs_percent=$(( (${_jobs_done} * 100) / ${_jobs_total} )) #### Files local _files_total=$(run_total_files_count "${FPSYNC_RUNID}") local _files_done="${_run_done_files}" local _files_remaining=$(( ${_files_total} - ${_files_done} )) local _files_percent="??" [ ${_files_total} -ge 1 ] && \ _files_percent=$(( (${_files_done} * 100) / ${_files_total} )) #### Size local _size_total=$(run_total_size_count "${FPSYNC_RUNID}") local _size_done="${_run_done_size}" local _size_remaining=$(( ${_size_total} - ${_size_done} )) local _size_percent="??" [ ${_size_total} -ge 1 ] && \ _size_percent=$(( (${_size_done} * 100) / ${_size_total} )) # Time counters, relative to the current run (resume-aware) local _siginfo_ts=$(date '+%s') local _run_elapsed_time=$(( ${_siginfo_ts} - ${_run_start_time} )) local _run_jobs_done=$(( ${_jobs_done} - ${_run_start_jobs} )) local _run_size_done=$(( ${_size_done} - ${_run_start_size} )) local _run_time_per_job="??" local _run_time_remaining="??" if [ ${_run_jobs_done} -ge 1 ] then _run_time_per_job=$(( ${_run_elapsed_time} / ${_run_jobs_done} )) _run_time_remaining=$(( ${_run_time_per_job} * ${_jobs_remaining} )) fi local _run_bytes_per_second="??" if [ ${_run_elapsed_time} -ge 1 ] then _run_bytes_per_second=$(( ${_run_size_done} / ${_run_elapsed_time} )) fi local _color_start='' local _color_stop='' if { [ -t 1 ] && [ -t 2 ] ;} || [ -n "${OPT_FORCECOLORS}" ] then _color_start="${COLOR_WHITE}" _color_stop="${COLOR_STOP}" fi printf '%s\n' "${_siginfo_ts} <=== ${_color_start}Parts done: ${_jobs_done}/${_jobs_total} (${_jobs_percent}%), remaining: ${_jobs_remaining} (${_jobs_running} running)${_color_stop}" printf '%s\n' "${_siginfo_ts} <=== ${_color_start}Files done: ${_files_done}/${_files_total} (${_files_percent}%), remaining: ${_files_remaining}${_color_stop}" printf '%s\n' "${_siginfo_ts} <=== ${_color_start}Bytes done: ${_size_done}/${_size_total} (${_size_percent}%), remaining: ${_size_remaining}${_color_stop}" printf '%s\n' "${_siginfo_ts} <=== ${_color_start}Time elapsed: ${_run_elapsed_time}s, remaining: ~${_run_time_remaining}s (~${_run_time_per_job}s/job, ~${_run_bytes_per_second}B/sec)${_color_stop}" } # Get next job name relative to ${JOBS_WORKDIR}/ # Returns empty string if no job is available # JOBS_QUEUEDIR can host several types of file : # : a sync job to perform # 'info': info file regarding this fpsync run # 'sl_stop': the 'immediate stop' flag, set when ^C is hit # 'fp_done': set when fpart has finished crawling src_dir/ and generated jobs job_queue_next () { local _next="" if [ -f "${JOBS_QUEUEDIR}/sl_stop" ] then echo "sl_stop" else _next=$(cd "${JOBS_QUEUEDIR}" && ls -rt1 2>/dev/null | grep -v 'info' | head -n 1) if [ -n "${_next}" ] then mv "${JOBS_QUEUEDIR}/${_next}" "${JOBS_WORKDIR}" || \ end_die "Cannot dequeue next job" echo "${_next}" fi fi } ########## Program start (main() !) # Parse command-line options parse_opts "$@" # Base paths, common to all runs JOBS_QUEUEDIR_BASE="${OPT_TMPDIR}/queue" JOBS_WORKDIR_BASE="${OPT_TMPDIR}/work" JOBS_DONEDIR_BASE="${OPT_TMPDIR}/done" FPSYNC_PARTSDIR_BASE="${OPT_SHDIR}/parts" FPSYNC_LOGDIR_BASE="${OPT_SHDIR}/log" ## Paths to 3rd party binaries # Tar version to use for 'tar' and 'tarify' tools # Use 'gtar' on Solaris-based OS TAR_NAME="tar" # Paths to executables that must exist locally FPART_BIN="$(command -v fpart)" SSH_BIN="$(command -v ssh)" MAIL_BIN="$(command -v mail)" TAR_BIN="$(command -v ${TAR_NAME})" # Paths to executables that must exist both locally and remotely SUDO_BIN="$(command -v sudo)" SUDO="" [ -n "${OPT_SUDO}" ] && \ SUDO="${SUDO_BIN}" # Paths to executables that must exist either locally or remotely (depending # on if you use SSH or not). When using SSH, the following binaries must be # present at those paths on each worker. # # XXX OPT_TOOL_NAME, OPT_TOOL_PATH and TOOL_BIN may be overridden # later when resuming a run, see job_queue_info_dump() and job_queue_info_load() if [ -n "${OPT_TOOL_PATH}" ] then # Use the path to the tool if provided on the command line TOOL_BIN="${OPT_TOOL_PATH}" else # Provide defaults regarding tool name case "${OPT_TOOL_NAME}" in "tar"|"tarify") TOOL_BIN="${TAR_BIN}" ;; *) TOOL_BIN=$(command -v "${OPT_TOOL_NAME}") ;; esac # Set this for job_queue_info_dump and job_queue_info_load to work correctly OPT_TOOL_PATH="${TOOL_BIN}" fi ## Simple run-related -independent- actions, not requiring FPSYNC_RUNID # List runs and exit if [ -n "${OPT_LISTRUNS}" ] then echo "<=== Listing runs" for _run in \ $(cd "${FPSYNC_PARTSDIR_BASE}" 2>/dev/null && ls -1) do echo "===> Run ID: ${_run}, status: $(run_status_print "${_run}")" if [ ${OPT_VERBOSE} -ge 1 ] then if run_is_resumable "${_run}" then _jobs_total=$(run_total_jobs_count "${_run}") _jobs_done=$(run_complete_jobs_count "${_run}") _jobs_remaining=$(( ${_jobs_total} - ${_jobs_done} )) _jobs_percent="??" [ ${_jobs_total} -ge 1 ] && \ _jobs_percent=$(( (${_jobs_done} * 100) / ${_jobs_total} )) echo " Jobs done: ${_jobs_done}/${_jobs_total} (${_jobs_percent}%), remaining: ${_jobs_remaining}" else if run_is_replayable "${_run}" then _report_logs_fatal=$(run_logs_list_by_ext "${_run}" "ret" | logfiles_filter_ret_with_errors) if [ -z "${_report_logs_fatal}" ] then echo " Run completed without error." else echo " Run completed with errors." fi fi fi fi done end_ok fi # Delete run and exit if [ -n "${OPT_DELETERUN}" ] then { [ -d "${FPSYNC_PARTSDIR_BASE}/${OPT_DELETERUN}" ] && \ rm -rf "${FPSYNC_PARTSDIR_BASE}/${OPT_DELETERUN}" && \ rm -rf "${FPSYNC_LOGDIR_BASE}/${OPT_DELETERUN}" && \ rm -rf "${JOBS_QUEUEDIR_BASE}/${OPT_DELETERUN}" && \ rm -rf "${JOBS_WORKDIR_BASE}/${OPT_DELETERUN}" && \ rm -rf "${JOBS_DONEDIR_BASE}/${OPT_DELETERUN}" && \ end_ok "Successfully deleted run ${OPT_DELETERUN}" ;} || \ end_die "Error deleting run ${OPT_DELETERUN}" fi # Archive run and exit if [ -n "${OPT_ARCHIVERUN}" ] then [ ! -x "${TAR_BIN}" ] && \ end_die "Tar is missing locally, check your configuration" { [ -d "${FPSYNC_PARTSDIR_BASE}/${OPT_ARCHIVERUN}" ] && \ ( cd "${OPT_TMPDIR}" 2>/dev/null && \ "${TAR_BIN}" czf fpsync-run-${OPT_ARCHIVERUN}.tgz \ "${FPSYNC_PARTSDIR_BASE}/${OPT_ARCHIVERUN}" \ "${FPSYNC_LOGDIR_BASE}/${OPT_ARCHIVERUN}" \ "${JOBS_QUEUEDIR_BASE}/${OPT_ARCHIVERUN}" \ "${JOBS_WORKDIR_BASE}/${OPT_ARCHIVERUN}" \ "${JOBS_DONEDIR_BASE}/${OPT_ARCHIVERUN}" 2>/dev/null ) && \ end_ok "Successfully created ${OPT_TMPDIR}/fpsync-run-${OPT_ARCHIVERUN}.tgz" ;} || \ end_die "Error archiving run ${OPT_ARCHIVERUN}" fi ## Options' post-processing section, advanced variables' initialization # Run ID initialization if [ -n "${OPT_RUNID}" ] then # Resume mode, check if run ID exists if [ -d "${JOBS_QUEUEDIR_BASE}/${OPT_RUNID}" ] && \ [ -d "${JOBS_WORKDIR_BASE}/${OPT_RUNID}" ] && \ [ -d "${JOBS_DONEDIR_BASE}/${OPT_RUNID}" ] then FPSYNC_RUNID="${OPT_RUNID}" else end_die "Could not find specified run's queue/work/done directories" fi else # Generate a unique run ID. This run ID *must* remain # unique from one run to another. FPSYNC_RUNID="$(date '+%s')-$$" fi # Queue manager configuration for current run. # Those queues remain local, even when using SSH. JOBS_QUEUEDIR="${JOBS_QUEUEDIR_BASE}/${FPSYNC_RUNID}" # Sync jobs' queue dir JOBS_WORKDIR="${JOBS_WORKDIR_BASE}/${FPSYNC_RUNID}" # Currently syncing jobs' dir JOBS_DONEDIR="${JOBS_DONEDIR_BASE}/${FPSYNC_RUNID}" # Done jobs' dir # Shared paths for current run. # Those ones must be shared amongst all nodes when using SSH # (e.g. through a NFS share mounted on *every* single node, including the master # 'job submitter'). FPSYNC_PARTSDIR="${FPSYNC_PARTSDIR_BASE}/${FPSYNC_RUNID}" FPSYNC_PARTSTMPL="${FPSYNC_PARTSDIR}/part" FPSYNC_LOGDIR="${FPSYNC_LOGDIR_BASE}/${FPSYNC_RUNID}" FPSYNC_LOGFILE="${FPSYNC_LOGDIR}/fpsync.log" FPSYNC_LOGFIFO="${FPSYNC_LOGDIR}/.fpsync.log.fifo" # Prepare mode-specific tool and fpart options # used when starting a new run (only) TOOL_MODEOPTS=$(tool_get_tool_mode_opts "${OPT_TOOL_NAME}" "${OPT_DIRSONLY}") TOOL_MODEOPTS_2=$(tool_get_tool_mode_opts_2 "${OPT_TOOL_NAME}" "${OPT_DIRSONLY}") TOOL_MODEOPTS_R=$(tool_get_tool_mode_opts_recursive "${OPT_TOOL_NAME}") FPART_SEPARATOROPT=$(tool_get_fpart_separator_opt "${OPT_TOOL_NAME}") FPART_MODEOPTS=$(tool_get_fpart_mode_opts "${OPT_TOOL_NAME}" "${OPT_DIRSONLY}" "${OPT_AGGRESSIVE}") FPART_JOBCOMMAND= ; tool_init_fpart_job_command "${OPT_TOOL_NAME}" "${OPT_AGGRESSIVE}" FPART_POSTHOOK="echo \"${FPART_JOBCOMMAND}\" > \ \"${JOBS_QUEUEDIR}/\${FPART_PARTNUMBER}\" && \ printf '%s\n%s\n' job_size=\"\${FPART_PARTSIZE}\" job_files=\"\${FPART_PARTNUMFILES}\" > \ \"${FPSYNC_PARTSTMPL}.\${FPART_PARTNUMBER}.meta\" && \ printf '%s\n%s\n%s\n' total_num_parts=\"\${FPART_TOTALNUMPARTS}\" total_size=\"\${FPART_TOTALSIZE}\" total_num_files=\"\${FPART_TOTALNUMFILES}\" > \ \"${FPSYNC_PARTSDIR}/run.meta\" && \ [ ${OPT_VERBOSE} -ge 2 ] && \ echo \"\$(date '+%s') ==> [FPART] Partition \${FPART_PARTNUMBER} written\"" # [1] # [1] Be careful to host the job queue on a filesystem that can handle # fine-grained mtime timestamps (i.e. with a sub-second precision) if you want # the queue to be processed in order when fpart generates several job files per # second. # On FreeBSD, vfs timestamps' precision can be tuned using the # vfs.timestamp_precision sysctl. See vfs_timestamp(9). ## End of options' post-processing section, let's start for real now ! SIGINT_COUNT=0 # ^C counter WORK_NUM=0 # Current number of running processes WORK_LIST="" # Work PID:PART:WORKER list WORK_FREEWORKERS="" # Free workers' list # Check for local binaries' presence [ ! -x "${FPART_BIN}" ] && \ end_die "Fpart is missing locally, check your configuration" [ -n "${OPT_WRKRS}" ] && [ ! -x "${SSH_BIN}" ] && \ end_die "SSH is missing locally, check your configuration" [ -n "${OPT_MAIL}" ] && [ ! -x "${MAIL_BIN}" ] && \ end_die "Mail is missing locally, check your configuration" [ -n "${OPT_SUDO}" ] && [ ! -x "${SUDO}" ] && \ end_die "Sudo is missing locally, check your configuration" # Check for common commands/tools (we accept builtins here) for _tool in 'ps' 'grep' 'printf' 'head' 'cut' 'awk' 'sed' 'wc' do [ -z "$(command -v ${_tool})" ] && \ end_die "'${_tool}' is missing locally, check your configuration" done # Create / check for fpart shared directories if [ -z "${OPT_RUNID}" ] then # For a new run, create those directories mkdir -p "${FPSYNC_PARTSDIR}" 2>/dev/null || \ end_die "Cannot create partitions' output directory: ${FPSYNC_PARTSDIR}" mkdir -p "${FPSYNC_LOGDIR}" 2>/dev/null || \ end_die "Cannot create log directory: ${FPSYNC_LOGDIR}" else # In resume mode, FPSYNC_PARTSDIR and FPSYNC_LOGDIR must already exist if [ ! -d "${FPSYNC_PARTSDIR}" ] || [ ! -d "${FPSYNC_LOGDIR}" ] then end_die "Could not find specified run's 'parts' and 'log' directories" else # When replaying a run, cleanup previous logs to avoid leftovers # if replay gets canceled. Keep fpsync.log file to retain fpart # pass logs. Replay/rerun logs wil be appended to that file. if [ -n "${OPT_REPLAYRUN}" ] then find "${FPSYNC_LOGDIR}/" -type f -a '(' \ -name '*.ret' -o -name '*.stdout' -o -name '*.stderr' \ ')' -exec rm {} \; 2>/dev/null || \ end_die "Error replaying specified run (could not cleanup previous logs)" fi fi fi # Create or update log file { touch "${FPSYNC_LOGFILE}" 2>/dev/null && [ -w "${FPSYNC_LOGFILE}" ] ;} || \ end_die "Cannot create log file: ${FPSYNC_LOGFILE}" # Create / check for run's queue and work dirs if [ -z "${OPT_RUNID}" ] then # For a new run, create those directories job_queue_init else # When resuming a run, check if : # - the queue, work and done dirs exist # - we can get the number of workers previously implied # (the 'info' flag is present) # + For resume mode, strictly check if : # - fpart pass has completed # (the 'fp_done' flag has been created in the job queue dir) # - fpsync run has *not* completed # (the 'fp_done' flag is *still* present in the job queue dir, or # the 'fp_done' flag is present in the work queue dir and jobs remain # incomplete because of a crash or kill) # + For replay mode, we only check that : # - fpart pass has completed # (the 'fp_done' flag is present either in the job queue dir or # in the work queue dir) [ ! -f "${JOBS_QUEUEDIR}/info" ] && \ end_die "Specified run is not resumable ('info' flag missing)" [ ! -d "${JOBS_WORKDIR}" ] && \ end_die "Specified run is not resumable (work dir missing)" [ ! -d "${JOBS_DONEDIR}" ] && \ end_die "Specified run is not resumable (done dir missing)" # Simple resume if [ -z "${OPT_REPLAYRUN}" ] then if ! run_is_resumable "${OPT_RUNID}" then end_die "Specified run is not resumable (try -R to replay ?)" fi # Full replay (option -R used) else if ! run_is_replayable "${OPT_RUNID}" then end_die "Specified run is not replayable (fpart pass not complete)" fi fi # Run is resumable, try to reload info and prepare queues job_queue_info_load # Remove the "sl_stop" flag, if any rm -f "${JOBS_QUEUEDIR}/sl_stop" 2>/dev/null # Move the 'fp_done' flag (if any) to the jobs queue mv "${JOBS_WORKDIR}/fp_done" "${JOBS_QUEUEDIR}" 2>/dev/null # Move potentially-incomplete jobs to the jobs queue for _file in $(run_incomplete_jobs_list "${FPSYNC_RUNID}") do echo_log "3" "=> [QMGR] Rescheduling job ${_file} (incomplete)" mv "${JOBS_WORKDIR}/${_file}" "${JOBS_QUEUEDIR}" 2>/dev/null || \ end_die "Error resuming specified run (could not re-schedule jobs)" done # When replaying, also reschedule already done jobs to the jobs queue if [ -n "${OPT_REPLAYRUN}" ] then for _file in \ $(cd "${JOBS_DONEDIR}" && ls -1) do echo_log "3" "=> [QMGR] Rescheduling job ${_file}" mv "${JOBS_DONEDIR}/${_file}" "${JOBS_QUEUEDIR}" 2>/dev/null || \ end_die "Error replaying specified run (could not re-schedule jobs)" done fi fi # Validate src_dir/ locally (needed for fpart) for first runs or local ones if [ -z "${OPT_RUNID}" ] || [ -z "${OPT_WRKRS}" ] then [ ! -d "${OPT_SRCDIR}" ] && \ end_die "Source directory does not exist (or is not a directory): ${OPT_SRCDIR}" fi # When using SSH, validate src_dir/ and dst_url/ remotely and check for tool # presence (this also allows checking SSH connectivity to each declared host) if [ -n "${OPT_WRKRS}" ] then echo_log "2" "=====> Validating requirements on SSH nodes..." _FIRST_HOST="$(echo ${OPT_WRKRS} | awk '{print $1}')" for _host in ${OPT_WRKRS} do # Check for sudo presence (it must be passwordless) if [ -n "${OPT_SUDO}" ] then "${SSH_BIN}" "${_host}" "${SUDO} ${OPT_JOBSSHELL} -c ':' 2>/dev/null" || \ end_die "Sudo executable not found or requires password on target ${_host}" fi # When using a local (or NFS-mounted) dest dir... if is_abs_path "${OPT_DSTURL}" then # ...blindly try to create dst_url/ as well as a witness file on # the first node. Using a witness file will allow us to check for # its presence/visibility from other nodes, avoiding "split-brain" # situations where dst_url/ exists but is not shared amongst all # nodes (typically a local mount point where the shared storage # area *should* be mounted but isn't, for any reason). [ "${_host}" = "${_FIRST_HOST}" ] && \ "${SSH_BIN}" "${_host}" "${OPT_JOBSSHELL} -c 'mkdir -p \"${OPT_DSTURL}\" && \ ${SUDO} touch \"${OPT_DSTURL}/${FPSYNC_RUNID}\"' 2>/dev/null" fi # Check for src_dir/ presence "${SSH_BIN}" "${_host}" "${OPT_JOBSSHELL} -c '[ -d \"${OPT_SRCDIR}\" ]'" || \ end_die "Source directory does not exist on target ${_host} (or is not a directory): ${OPT_SRCDIR}" # Check for dst_url/ presence (witness file) if is_abs_path "${OPT_DSTURL}" then "${SSH_BIN}" "${_host}" "${OPT_JOBSSHELL} -c '[ -f \"${OPT_DSTURL}/${FPSYNC_RUNID}\" ]'" || \ end_die "Destination directory (shared) is not available on target ${_host}: ${OPT_DSTURL}" fi # Finally, check for tool presence "${SSH_BIN}" "${_host}" "${OPT_JOBSSHELL} -c '[ -x \"${TOOL_BIN}\" ]'" || \ end_die "Tool ${OPT_TOOL_NAME} not useable on target ${_host}: ${TOOL_BIN} not found" echo_log "2" "<=== ${_host}: OK" done # Remove witness file if is_abs_path "${OPT_DSTURL}" then "${SSH_BIN}" "${_FIRST_HOST}" \ "${OPT_JOBSSHELL} -c '${SUDO} rm -f \"${OPT_DSTURL}/${FPSYNC_RUNID}\"' 2>/dev/null" fi unset _FIRST_HOST else # Local usage - create dst_url/ and check for tool presence if is_abs_path "${OPT_DSTURL}" && [ ! -d "${OPT_DSTURL}" ] then mkdir -p "${OPT_DSTURL}" 2>/dev/null || \ end_die "Cannot create destination directory: ${OPT_DSTURL}" fi [ ! -x "${TOOL_BIN}" ] && \ end_die "Tool ${OPT_TOOL_NAME} not useable locally: ${TOOL_BIN} not found" fi # Dispatch OPT_WRKRS into WORK_FREEWORKERS work_list_free_workers_init # Let's rock ! echo_log "4" "----" echo_log "1" "Info: Fpsync started (syncing ${OPT_SRCDIR} => ${OPT_DSTURL}, pid: $$)" "blue" echo_log "1" "Info: Run ID: ${FPSYNC_RUNID}$({ [ -n "${OPT_REPLAYRUN}" ] && echo ' (replayed)' ;} || { [ -n "${OPT_RUNID}" ] && echo ' (resumed)' ;})" "blue" echo_log "2" "Info: Start time: $(date)" "blue" echo_log "2" "Info: Concurrent sync jobs: ${OPT_JOBS}" echo_log "2" "Info: Workers: $(echo "${OPT_WRKRS}" | sed -E -e 's/^[[:space:]]+//' -e 's/[[:space:]]+/ /g')$([ -z "${OPT_WRKRS}" ] && echo 'local')" echo_log "2" "Info: Shared dir: ${OPT_SHDIR}" echo_log "2" "Info: Temp dir: ${OPT_TMPDIR}" # The following two options are just a recall to the user # (they are technically ignored when resuming a run) echo_log "2" "Info: Tool name: \"${OPT_TOOL_NAME}\"" echo_log "2" "Info: Tool path: \"${TOOL_BIN}\"" if [ -z "${OPT_RUNID}" ] then # The following options are useless when resuming a run echo_log "2" "Info: Tool options: \"${OPT_TOOL}\"" echo_log "2" "Info: Fpart options: \"${OPT_FPART}\"" echo_log "2" "Info: Max files or directories per sync job: ${OPT_FPMAXPARTFILES}" echo_log "2" "Info: Max bytes per sync job: ${OPT_FPMAXPARTSIZE}" fi [ "${QUIRK_PIPEFAIL}" = ":" ] && \ echo_log "1" "Warn: shell '${OPT_JOBSSHELL}' does not support the 'pipefail' option, sync errors may be missed" "orange" # Record run information job_queue_info_dump # Initial status, required by siginfo_handler() _run_start_time=$(date '+%s') _run_start_jobs=$(run_complete_jobs_count "${FPSYNC_RUNID}") _run_start_files=$(run_complete_files_count "${FPSYNC_RUNID}") _run_start_size=$(run_complete_size_count "${FPSYNC_RUNID}") # Current status (incremented after each job is finished) _run_done_jobs="${_run_start_jobs}" _run_done_files="${_run_start_files}" _run_done_size="${_run_start_size}" # When not resuming a previous run, start fpart if [ -z "${OPT_RUNID}" ] then # Set limited traps during FS crawling # They will possibly be overridden if starting the queue manager trap ':' 2 trap '' 29 # Prepare logger for sub-shell below rm -f "${FPSYNC_LOGFIFO}" 2>/dev/null mkfifo "${FPSYNC_LOGFIFO}" || \ end_die "Cannot create named pipe: ${FPSYNC_LOGFIFO}" echo_log "2" "===> Starting Fpart" "blue" # Fpart process is forked in the same process group as its parent # (the main script) to allow SIGINT propagation and tty output # https://pubs.opengroup.org/onlinepubs/009604599/basedefs/xbd_chap11.html#tag_11_01_04 ( # Trap SIGINT to a noop to let sub-shell process # continue after fpart termination trap ':' 2 # We use a FIFO for logging to avoid a pipe because we would need # a 'pipefail' option from the shell, which is not always available # (Debian's dash does not support it, for example) tee -a "${FPSYNC_LOGFILE}" < "${FPSYNC_LOGFIFO}" & # Allow passing special characters within fpart sub-options # (OPT_FPART, FPART_MODEOPTS) set -o noglob # Allow spaces within fpart sub-options IFS="|" echo_log "1" "===> Analyzing filesystem..." "blue" # Start fpart from src_dir/ directory and produce jobs within # ${JOBS_QUEUEDIR}/ cd "${OPT_SRCDIR}" && \ ${SUDO} "${FPART_BIN}" \ $([ ${OPT_FPMAXPARTFILES} -gt 0 ] && printf '%s\n' "-f ${OPT_FPMAXPARTFILES}") \ $({ { is_num "${OPT_FPMAXPARTSIZE}" && [ ${OPT_FPMAXPARTSIZE} -gt 0 ] ;} || is_size "${OPT_FPMAXPARTSIZE}" ;} && printf '%s\n' "-s ${OPT_FPMAXPARTSIZE}") \ -o "${FPSYNC_PARTSTMPL}" ${FPART_SEPARATOROPT} -e ${OPT_FPART} ${FPART_MODEOPTS} -L \ -W "${FPART_POSTHOOK}" . 1>"${FPSYNC_LOGFIFO}" 2>&1 if [ $? -ne 0 ] then job_queue_sl_stop echo_log "1" "<=== Fpart exited with errors" "red" else # Tell job_queue_loop that crawling has finished job_queue_fp_done echo_log "1" "<=== Fpart crawling finished" "blue" echo_log "1" "<=== Generated $(run_total_jobs_count "${FPSYNC_RUNID}") parts ($(run_total_size_count "${FPSYNC_RUNID}")B, $(run_total_files_count "${FPSYNC_RUNID}") files)" fi # Remove FIFO (once tee exits and closes its fd) rm -f "${FPSYNC_LOGFIFO}" ) & echo_log "2" "<=== Fpart started (from sub-shell pid=$!)" fi # When not in prepare mode, start synchronization loop if [ -z "${OPT_PREPARERUN}" ] then # Set SIGINT and SIGINFO traps and start job_queue_loop trap 'sigint_handler' 2 trap 'siginfo_handler' 29 echo_log "2" "===> Use ^C to abort, ^T (SIGINFO) to display status" # Main jobs' loop: pick up jobs within the queue directory and start them echo_log "2" "===> [QMGR] Starting queue manager" "blue" _next_job="" while [ "${_next_job}" != "fp_done" ] && [ "${_next_job}" != "sl_stop" ] do _PID="" if [ ${WORK_NUM} -lt ${OPT_JOBS} ] then _next_job="$(job_queue_next)" if [ -n "${_next_job}" ] && \ [ "${_next_job}" != "fp_done" ] && \ [ "${_next_job}" != "sl_stop" ] then if [ -z "${OPT_WRKRS}" ] then echo_log "2" "=> [QMGR] Starting job ${_next_job} locally (${JOBS_WORKDIR}/${_next_job})" "blue" # We want a new process group for each sync process to # prevent SIGINT propagation set -m ( . "${JOBS_WORKDIR}/${_next_job}" echo "$?" > "${FPSYNC_LOGDIR}/${_next_job}.ret" ) & _next_pid="$!" work_list_push "${_next_pid}:${_next_job}:local" set +m echo_log "3" "=> [QMGR] Job ${_next_job} (${_next_pid}:${_next_job}:local) started, PID: ${_next_pid}" else _next_host="$(work_list_pick_next_free_worker)" work_list_trunc_next_free_worker echo_log "2" "=> [QMGR] Starting job ${_next_job} on ${_next_host} (${JOBS_WORKDIR}/${_next_job})" "blue" set -m ( "${SSH_BIN}" "${_next_host}" "${OPT_JOBSSHELL} -s" \ < "${JOBS_WORKDIR}/${_next_job}" echo "$?" > "${FPSYNC_LOGDIR}/${_next_job}.ret" ) & _next_pid="$!" work_list_push "${_next_pid}:${_next_job}:${_next_host}" set +m echo_log "3" "=> [QMGR] Job ${_next_job} (${_next_pid}:${_next_job}:${_next_host}) started, PID: ${_next_pid}" fi fi else work_list_refresh sleep 0.2 fi done if [ "${_next_job}" = "fp_done" ] then echo_log "2" "<=== [QMGR] Done submitting jobs. Waiting for them to finish." else echo_log "2" "<=== [QMGR] Stopped. Waiting for jobs to finish." fi # Wait for remaining processes, if any # (use an active wait to display process status) while [ ${WORK_NUM} -gt 0 ] do work_list_refresh sleep 0.2 done echo_log "2" "<=== [QMGR] Queue processed" else # We are in prepare mode, just wait for fpart to finish FS crawling wait fi # Display final status [ ${OPT_VERBOSE} -ge 1 ] && siginfo_handler if [ -f "${JOBS_QUEUEDIR}/sl_stop" ] then echo_log "1" "<=== Fpsync interrupted." "red" end_die fi # Examine results and prepare report if [ -n "${OPT_PREPARERUN}" ] then echo_log "0" "<=== Successfully prepared run: ${FPSYNC_RUNID}" "green" _report_subj="Fpsync run ${FPSYNC_RUNID} (prepared)" else _report_subj="Fpsync run ${FPSYNC_RUNID}" fi _ts_now=$(date '+%s') _total_run_elapsed_time="$(( ${_ts_now} - ${_run_start_time} ))" _report_logs_fatal=$(run_logs_list_by_ext "${FPSYNC_RUNID}" "ret" | logfiles_filter_ret_with_errors) _report_logs_fatal_stderr=$(echo "${_report_logs_fatal}" | logfiles_filter_ret_to_stderr) _report_logs_additional_stderr=$(run_logs_list_by_ext "${FPSYNC_RUNID}" "stderr" | logfiles_filter_stderr_without_ret) _report_body=$( if [ -z "${_report_logs_fatal}" ] then echo "Fpsync completed without error in ${_total_run_elapsed_time}s." else echo "Fpsync completed with errors in ${_total_run_elapsed_time}s" echo "" echo "Some jobs did NOT return 0 (success):" echo "${_report_logs_fatal}" if [ -n "${_report_logs_fatal_stderr}" ] then echo "" echo "You may find more information in the following logs:" echo "${_report_logs_fatal_stderr}" fi fi if [ -n "${_report_logs_additional_stderr}" ] then echo "" echo "Some jobs reported non-fatal problems to stderr:" echo "${_report_logs_additional_stderr}" fi if [ -n "${OPT_MAIL}" ] then echo "" echo "--" echo "Logs generated by fpsync(1) tool." echo "See https://www.fpart.org for more information." fi ) # Print report echo_log "1" "<=== ${_report_body}" echo_log "2" "<=== End time: $(date)" "blue" # Send mail if required [ -n "${OPT_MAIL}" ] && \ printf "Sync ${OPT_SRCDIR} => ${OPT_DSTURL}\n\n${_report_body}\n" | ${MAIL_BIN} -s "${_report_subj}" ${OPT_MAIL} if [ -n "${_report_logs_fatal}" ] then echo_log "1" "Info: Fpsync stopped (with errors)" "red" end_die fi echo_log "1" "Info: Fpsync stopped (with success)" "green" end_ok fpart-1.7.0/docs/www.fpart.org/000755 001751 000000 00000000000 14745137273 017274 5ustar00martymacwheel000000 000000 fpart-1.7.0/docs/fpsync-tree-change.txt000644 001751 000000 00000003347 14745137273 021001 0ustar00martymacwheel000000 000000 Below is a diff of file listings between a prepared run : $ fpsync -p /xxx/ /yyy/ and its finalization through -r: $ fpsync -r 1689103660-37834 It shows file movements within involved directories. --- /tmp/before.list +++ /tmp/after.list @@ -1,13 +1,22 @@ +/tmp/fpsync/log/1689103660-37834/1.ret # If job 1's return code != 0 +/tmp/fpsync/log/1689103660-37834/1.stderr # If job 1 wrote something to stderr +/tmp/fpsync/log/1689103660-37834/1.stdout # If job 1 wrote something to stdout +/tmp/fpsync/log/1689103660-37834/2.ret +/tmp/fpsync/log/1689103660-37834/2.stderr +/tmp/fpsync/log/1689103660-37834/2.stdout +/tmp/fpsync/log/1689103660-37834/3.ret +/tmp/fpsync/log/1689103660-37834/3.stderr +/tmp/fpsync/log/1689103660-37834/3.stdout /tmp/fpsync/log/1689103660-37834/fpsync.log # Main fpsync logs (contains fpart pass logs) /tmp/fpsync/parts/1689103660-37834/part.1 # File listing for job 1 (i.e. partition 1) /tmp/fpsync/parts/1689103660-37834/part.1.meta # Meta-information (number of files, size) for job 1 /tmp/fpsync/parts/1689103660-37834/part.2 /tmp/fpsync/parts/1689103660-37834/part.2.meta /tmp/fpsync/parts/1689103660-37834/part.3 /tmp/fpsync/parts/1689103660-37834/part.3.meta /tmp/fpsync/parts/1689103660-37834/run.meta # Run meta-information (number of jobs, files, size) -/tmp/fpsync/queue/1689103660-37834/1 # Job 1's script to be run -/tmp/fpsync/queue/1689103660-37834/2 -/tmp/fpsync/queue/1689103660-37834/3 -/tmp/fpsync/queue/1689103660-37834/fp_done /tmp/fpsync/queue/1689103660-37834/info +/tmp/fpsync/done/1689103660-37834/1 # Job 1's script once run +/tmp/fpsync/done/1689103660-37834/2 +/tmp/fpsync/done/1689103660-37834/3 +/tmp/fpsync/work/1689103660-37834/fp_done fpart-1.7.0/docs/Solving_the_final_pass_challenge.txt000644 001751 000000 00000023017 14745137273 023775 0ustar00martymacwheel000000 000000 Solving the final pass challenge : ================================== Until version 0.9.3, fpsync only worked with file lists. That mode was perfect to have balanced partitions with fine-grained specifications: a precise maximum number of files and a maximum size. In that mode, fpsync is blazing fast, but there is a catch: it was only able to perform *incremental* synchronizations. As a consequence, a so-called 'final pass' was needed to delete extra files that could have been deleted meanwhile (but already migrated) by users on the source area. When using fpsync to migrate big data shares, the recommended way was first to perform those several successive synchronizations on live data and then stop the service to keep the source share inaccessible and finalize the migration (as fast as possible) with a single -manual- rsync --delete pass. That final pass had to be performed through a single rsync command because rsync's --delete option is incompatible with a parallel usage when using lists of files, so fpsync could not pass that option to rsync jobs. The problem is, when you have to migrate several hundreds of TB of data, that the final pass can be tricky. With such a data quantity, a single rsync can take weeks just to crawl the filesystem, thus ruining all the benefits of fpsync. It can also consume very large chunks of memory to store the file list. Last but not least, rsync starts data transfer (or file deletion) only once crawling has finished. As that final pass is done while the service is offline to users, it should be fast and reliable, which was obviously not the case. I've wondered for several months how we could boost that final pass. For memory, and for the curious minds, here are the different steps I took to finally implement fpsync's option -E. [SIGSTOP] My first ideas were to try to speedup the single rsync pass, mostly by avoiding crawling the FS again. Here they are. [SIGCONT] Idea #1 : --------- Use last fpsync run's partitions to generate a single -temporary- file fulllist.txt containing all files present in /data/src/ and use that with a command such as : $ rsync -av --delete-missing-args --ignore-existing --files-from=fulllist.txt \ /data/src/ /data/dst/ That command would remove files not present in fulllist.txt and skip updating other files. Pros: - easy to generate fulllist.txt, no need to rescan filesystem Cons: - fulllist.txt can be huge - file list can be outdated, leading to removing a file in /data/dst/ if it is missing from the list - not really interesting as rsync will stat() files anyway - single rsync Idea #2 : --------- Use first pass' file list and last pass' file list to generate a diff and remove extra files and directories manually with simple (recursive, forced) rm's. Pros : - really fast, no need to stat() - blindly erasing will work Cons : - again, file lists can be huge to handle - at least two passes are needed before the final one - even the most recent file list can be outdated [SIGSTOP] Rsync's --delete option can only work if the tool can be aware of every single file that must be present witin a specific area (to be able to determine extra files to remove). When working with files, that means we are stuck with a single rsync process. If we want to split and parallelize cleaning jobs, we must work with directories. But how can we handle recursion ? How can we split a filesystem hierarchy into directories that do not overlap ? Wouldn't that always lead to the root directory ? I then realized that the problem here was recursivity. If we could perform a cleaning pass without recursivity for each single directory, we would be able to clean the entire tree in a parallel way: each jobs can independently clean its own directory. This is definitely the way to go, so I'll now try to work with directories instead of files. [SIGCONT] Idea #3 : --------- Use last pass' file list to determine *directories* (only). For each directory, diff the first depth (no recursivity) and spawn a deletion job to remove extra files and directories from the destination. Pros : - no need to stat() all files: 'ls -1', sort, comm and rm are enough - easy to spawn a job immediately after having determining a directory from the list - small jobs can be run independently and parallelized Cons : - we must determine directories from file lists, which implies concatenating and sorting them. Again, they can be huge so expect a big memory usage. - again, even the most recent file list can be outdated [SIGSTOP] Ideas #1 to #3 were trying to avoid re-analyzing the FS but I realized that the counterpart of re-using file lists is that they will *always* be outdated (I mean, there is nearly no chance they are up-to-date if the FS is live), which is not an acceptable tradeoff. So I re-oriented my ideas to try to produce a stream of deletion jobs as well as synchronization jobs to group those two tasks and parallelize them, if possible. [SIGCONT] Idea #4 : --------- Instead of determining the directory list from the file lists, add a 'post-directory' hook capability to fpart and use that hook to spawn a 'cleaning' job as described in idea #3 once a directory has been visited. Pros : - again, no need to stat() all files: 'ls -1', sort, comm and rm are enough - cleaning jobs are independent from synchronizing jobs and can be run after or before (provided the destination directory exists) file-synchronizing jobs - so those jobs can be easily sheduled and parallelized - no more need to handle huge file lists to determine directories Cons : - need to add a specific hook to fpart which does not seem to make sense when not used by fpsync - need to write the cleaning script executed by the hook and reinvent the wheel Idea #5 : --------- With a feeling that it would be better if rsync could do the single-depth synchronization job for me (instead of having to script something more), and crawling into the man page, I've finally discovered the great --exclude="/*/*" option. It allows what I was looking for: synchronizing a directory on a single-depth basis and skip further depths. It is also compatible with the required --delete option. Used with the --relative option, it gives something like : $ cd /data/src/ ; \ rsync -av --delete --relative --exclude="/foo/bar/*/*" foo/bar/ /data/dst/ if you want to synchronize the foo/bar/ directory without recursing. So idea #5 is based on that discovery as well as the will to avoid having to add a specific hook to fpart that would only do what a 'find -type d' can. Pros : - no need to modify fpart, use find instead Cons : - exclude pattern is variable and must include the source directory - with the double-star exclude pattern, rsync stat()s each files and directories under depth+1 (matching the second star), which means we will be stat()ing far too many files Idea #6 : --------- Digging again in rsync's man page, I've discovered an even better option. I had always used rsync's -a option, but it includes option -r (recurse) which is, after all, *exactly* what I do not want. And luckily, the opposite is available and is called option -d. The following will thus do better than the command line from idea #5 : $ cd /data/src/ ; \ rsync -dlptgoD -v --delete --relative foo/bar/ /data/dst/ as it will no more stat() each files and directories under depth+1. So why not jus use, for the final pass, a 'find -type d -exec' to spawn a single-depth 'rsync --delete' process, over each directory ? I ended up patching fpsync to test that solution and implemented a final pass option. But... it was far from optimal and was quite slow as too many cleaning jobs were scheduled (one per directory). Pros : - efficient FS crawling - no more exclude pattern to handle Cons : - too many small jobs spawned, which ruins performances (too much overhead) [SIGSTOP] Anyway, it worked! That first implementation proved that cleaning a FS hierarchy directory after directory and without recursion, works. Slowly, but it works. It could be nice if we could produce less cleaning jobs by grouping directories to avoid that overhead. [SIGCONT] Idea #7 : --------- Could rsync handle a list of directories in a non-recursive way ? Yes!!! It can: $ cd /data/src/ ; \ rsync -dlptgoD -v --files-from=dirlist --delete --relative \ /data/src/ /data/dst/ File dirlist contains a directory list such as: ./foo/bar/ ./foo/baz/ [...] Great! But how can we generate those directory lists efficiently? Wait... Fpart can generate file lists, it could generate directory lists as well! This idea lead to modifying fpart to make it able to generate single-depth directory lists when passing option -E. Fpsync has then been patched too (see option -E) to use that option and work with directory lists instead of file lists. That way, cleaning jobs work on groups of directories and can be started in parallel :) Pros : - That solution fits into global fpart and fpsync philosophy, patching is trivial - You get all the benefits from a standard fpsync pass: resumability, status, parallelism, FS crawling speed. Cons : - directory lists are coarse-grained and will probably be less balanced than file lists so maybe use file-based incremental synchronizations (standard mode) first and keep option -E (directory mode) for the final pass only - FS crawling could not be avoided... but is that something we really want if we want to work with up-to-date lists? Well, I hope that those thoughts will help you understand why I decided to implement the final pass that way. If you have any questions or remarks, do not hesitate to contact me! -- Ganael LAPLANCHE , Nov. 2017 fpart-1.7.0/docs/www.fpart.org/docs/000755 001751 000000 00000000000 14745137273 020224 5ustar00martymacwheel000000 000000 fpart-1.7.0/docs/www.fpart.org/mkdocs.yml000644 001751 000000 00000000567 14745137273 021307 0ustar00martymacwheel000000 000000 site_name: Fpart.org site_url: http://www.fpart.org repo_url: https://github.com/martymac/fpart edit_uri: edit/master/docs/www.fpart.org/docs nav: - Home: index.md - Fpart: fpart.md - Fpsync: fpsync.md - Changelog: changelog.md - Links: links.md # See: https://mkdocs.github.io/mkdocs-bootswatch/#litera theme: litera markdown_extensions: - attr_list fpart-1.7.0/docs/www.fpart.org/docs/fpart.md000644 001751 000000 00000016436 14745137273 021674 0ustar00martymacwheel000000 000000 ![Fpart](img/Fpart.png) # What is fpart ? Fpart is a UNIX CLI tool that splits a list of directories and file trees into a certain number of partitions, trying to produce partitions with the same size and number of files. It can also produce partitions with a given number of files or of a limited size. Fpart uses a bin packing algorithm to optimize space utilization amongst partitions. Once generated, partitions are either printed as file lists to stdout (default) or to files. Those lists can then be used by third party programs. Fpart also includes a live mode, which allows it to crawl very large filesystems and produce partitions in live. Hooks are available to act on those partitions (e.g. immediately start a transfer using rsync(1) or cpio(1)) without having to wait for the filesystem traversal job to be finished. Used that way, fpart can be seen as a powerful basis for a data migration tool. Fpart can also generate lists of directories instead of files. That mode can be useful to enable usage of options requiring overall knowledge of directories such as rsync's --delete. As a demonstration of fpart possibilities, a tool called fpsync is provided in the tools/ directory (see related documentation for more details). # Does it modify my data ? No. Fpart does *NOT* split or modify your data in any way. It only crawls your filesystem and produces file (or directory) lists. Those lists are called "partitions" because they are a subset of an entire file tree. Fpart only reads your data, never modifies it. # Examples The following will produce 3 partitions, with (approximatively) the same size and number of files. Three files: "var-parts.[1-3]", are generated as output : $ fpart -n 3 -o var-parts /var $ ls var-parts* var-parts.1 var-parts.2 var-parts.3 $ head -n 2 var-parts.1 /var/some/file1 /var/some/file2 The following will produce partitions of 4.3 GB, containing music files ready to be burnt to a DVD (for example). Files "music-parts.[0-n]", are generated as output : $ fpart -s 4617089843 -o music-parts /path/to/my/music The following will produce partitions containing 10000 files each by examining /usr first and then /home and display only partition 1 on stdout : $ find /usr ! -type d | fpart -f 10000 -i - /home | grep '^1 ' The following will produce two partitions by re-using du(1) output. Fpart will not examine the filesystem but instead re-use arbitrary values printed by du(1) and sort them : $ du * | fpart -n 2 -a # Live mode By default, fpart will wait for FS crawling to terminate before generating and displaying partitions. If you use the live mode (option -L), fpart will display each partition as soon as it is complete. You can combine that option with hooks; they will be triggered just before (pre-part hook, option -w) or after (post-part hook, option -W) partitions' completion. Hooks provide several environment variables (see fpart(1)); they are a convenient way of getting information about fpart's and partition's current states. For example, ${FPART_PARTFILENAME} will contain the name of the output file of the partition that has just been generated; using that variable within a post-part hook permits starting manipulating the files just after partition generation. See the following example : $ mkdir foo && touch foo/{bar,baz} $ fpart -L -f 1 -o /tmp/part.out -W \ 'echo == ${FPART_PARTFILENAME} == ; cat ${FPART_PARTFILENAME}' foo/ == /tmp/part.out.1 == foo/bar == /tmp/part.out.2 == foo/baz This example crawls foo/ in live mode (option -L). For each file (option -f, 1 file per partition), it generates a partition into /tmp/part.out. (option -o; is the partition index and will be automatically added by fpart) and executes the following post-part hook (option -W) : echo == ${FPART_PARTFILENAME} == ; cat ${FPART_PARTFILENAME} This hook will display the name of current partition's output file name as well as display its contents. # Migrating data (without fpsync) Here is a more complex example that will show you how to use fpart, GNU Parallel and Rsync to split up a directory and immediately schedule data synchronization of smaller lists of files, while FS crawling goes on. We will be synchronizing data from /data/src to /data/dest. First, go to the source directory (as rsync's --files-from option takes a file list relative to its source directory) : $ cd /data/src Then, run fpart from here : $ fpart -L -f 10000 -x '.snapshot' -x '.zfs' -zz -o /tmp/part.out -W \ '/usr/local/bin/sem -j 3 "/usr/local/bin/rsync -av --files-from=${FPART_PARTFILENAME} /data/src/ /data/dest/"' . This command will start fpart in live mode (option -L), making it generate partitions during FS crawling. Fpart will produce partitions containing at most 10000 files each (option -f), will skip files and folders named '.snapshot' or '.zfs' (option -x) and will list empty and non-accessible directories (option -zz; that option is necessary when working with rsync to make sure the whole file tree will be re-created within the destination directory). Last but not least, each partition will be written to /tmp/part.out. (option -o) and used within the post-part hook (option -W), run immediately by fpart once the partition is complete : /usr/local/bin/sem -j 3 "/usr/local/bin/rsync -av --files-from=${FPART_PARTFILENAME} /data/src/ /data/dest/" This hook is itself a nested command. It will run GNU Parallel's sem scheduler (any other scheduler would do) to run at most 3 rsync jobs in parallel. The scheduler will finally trigger the following command : /usr/local/bin/rsync -av --files-from=${FPART_PARTFILENAME} /data/src/ /data/dest/ where ${FPART_PARTFILENAME} will be part of rsync's environment when it runs and contains the file name of the partition that has just been generated. That's all, folks ! Pretty simple, isn't it ? In this example, FS crawling and data transfer are run from the same -local- machine, but you can use it as the basis of a much sophisticated solution: at $work, by using a cluster of machines connected to our filers through NFS and running Open Grid Scheduler, we successully migrated over 400 TB of data. Note: several successive fpart runs can be launched using the above example; you will perform incremental synchronizations. That is, deleted files from the source directory will not be removed from destination unless rsync's --delete option is used. Unfortunately, this option cannot be used with a list of files (files that do not appear in the list are just ignored). To use the --delete option in conjunction with fpart, you *have* to provide rsync's --files-from option a list of directories (only); that can be performed using fpart's -E option. # Limitations * Again, Fpart will *NOT* modify data, it will *NOT* split your files ! As a consequence, if you have a directory containing several small files and a huge one, it will be unable to produce partitions with the same size. Fpart does magic, but not that much ;-) * Fpart will not deduplicate paths ! If you provide several paths to fpart, it will examine all of them. If those paths overlap or if the same path is specified more than once, same files will appear more than once within generated partitions. This is not a bug, fpart does not deduplicate FS crawling results. fpart-1.7.0/docs/www.fpart.org/docs/img/000755 001751 000000 00000000000 14745137273 021000 5ustar00martymacwheel000000 000000 fpart-1.7.0/docs/www.fpart.org/docs/fpsync.md000644 001751 000000 00000026772 14745137273 022066 0ustar00martymacwheel000000 000000 ![Fpsync](img/Fpsync.png) # What is fpsync ? To demonstrate fpart possibilities, a program called 'fpsync' is provided within the tools/ directory. This tool is a shell script that wraps fpart(1) and rsync(1), cpio(1), pax(1) or tar(1) to launch several synchronization jobs in parallel as presented in the previous section, but while the previous example used GNU Parallel to schedule transfers, fpsync provides its own -embedded- scheduler. It can execute several synchronization processes locally or launch them on several nodes (workers) through SSH. Despite its initial "proof of concept" status, fpsync has quickly evolved into a powerful (yet simple to use) migration tool and has been successfully used to boost migration of several PB of data (initially at $work but it has also been tested by several organizations such as UCI, Intel and Amazon ; see the 'Links' section). In addition to being very fast (as transfers start during FS crawling and are parallelized), fpsync is able to resume or replay synchronization "runs" (see options -r and -R) and presents an overall progress status. It also has a small memory footprint compared to rsync itself when migrating filesystems with a big number of files. Last but not least, fpsync is very easy to set up and only requires a few (common) software to run: fpart, rsync/cpio/pax/tar, a POSIX shell, sudo and ssh. See fpsync(1) to learn more about that tool and get a list of all supported options. --- **Here is a simple representation of how it works :** fpsync [args] /data/src/ /data/dst/ | +-- fpart (live mode) crawls /data/src/, generates parts.[1] + sync jobs -> | \ \ \ | \ \ +___ part. #n + job #n | \ \ | \ +______ part. #1 + job #1 | \ | +_________ part. #0 + job #0 | +-- fpsync scheduler, executes jobs either locally or remotely -----------> \ \ \ \ \ +___ sync job #n... --------------------------------------> + \ \ | \ +______ sync job #1 ----------------------------------> | \ | +_________ sync job #0 -----------------------------> + / / Filesystem tree rebuilt and synchronized! <------------------+ [1] Either containing file lists (default mode) or directory lists (option -E) --- # Examples In its default mode, fpsync uses rsync(1) and works with file lists to perform incremental (only) synchronizations. You can choose to use cpio(1), pax(1) or tar(1) instead of rsync(1) with option '-m' (see [Cpio, Pax and Tar support](#cpio-pax-and-tar-support) below). The following examples show two typical usage. The command : $ fpsync -n 4 -f 1000 -s $((100 * 1024 * 1024)) \ /data/src/ /data/dst/ will synchronize /data/src/ to /data/dst/ using 4 local workers, each one transferring at most 1000 files and 100 MB per synchronization job. The command : $ fpsync -n 8 -f 1000 -s $((100 * 1024 * 1024)) \ -w login@machine1 -w login@machine2 -d /mnt/nfs/fpsync \ /data/src/ /data/dst/ will synchronize /data/src/ to /data/dst/ using the same transfer limits, but through 8 concurrent synchronization jobs spread over two machines (machine1 and machine2). Those machines must both be able to access /data/src/ and /data/dst/, as well as /mnt/nfs/fpsync, which is fpsync's shared working directory. As previously mentioned, those two examples work with file lists and will perform *incremental* synchronizations. As a consequence, they will require a final -manual- 'rsync --delete' pass to delete extra files from the /data/dst/ directory. # The final pass (A.K.A "Directory mode") If you want to avoid that final pass, use fpsync's option -E (only compatible with rsync tool). That option will make fpsync work with a list of *directories* (instead of files) and will (forcibly) enable rsync's --delete option with each synchronization job. The counterpart of using that mode is that directory lists are coarse-grained and will probably be less balanced than file lists. The best option is probably to run several incremental jobs and keep the -E option to speed up the final pass only. (you can read the file [Solving_the_final_pass_challenge.txt](https://github.com/martymac/fpart/blob/master/docs/Solving_the_final_pass_challenge.txt) in the docs/ directory for more details about fpsync's option -E) # Cpio, Pax and Tar support Fpsync's option '-m' allows you to use cpio(1), pax(1) or tar(1) instead of rsync(1) to copy files. Those tools are much faster than rsync(1) but there is a catch: when re-creating a complex file tree, missing parent directories are created on-the-fly. In that case, original directory metadata (e.g. timestamps) are *not* copied from source. To overcome that limitation, fpsync uses fpart's option -zzz to ask fpart to also pack every single directory (0-sized) with file lists. Making directories appear in file lists will ask the external tool to copy their metadata when the directory is processed (of course, fpart ensures that a parent directory entry appears after files beneath. If the parent directory is missing it is first created on the fly, then directory metadata is updated). This works fine with a single copy process (fpsync's option -n 1) but not with 2 or more parallel processes which can treat partitions out-of-order. Indeed, if several workers copy files to the same directory at the same time, it is possible that the parent directory's original metadata gets re-applied while another worker is still adding files to that directory. That can occur if a directory list spreads over more than one partition. In such a situation, original metadata (here, mtime) gets overwritten while new files get added to the directory. To handle that situation, fpsync leverages another fpart option (-P) that asks fpart to flush last file's parent hierarchy (that is, every single parent directory up to the root) before closing each partition. Adding parent directories at the end of each partition ensures that modification times get reapplied to directories whatever the processing order of partitions is. Used in conjunction with -zzz, this allows seemless migrations when parallelizing cpio(1), pax(1) or tar(1) jobs. # Tarify tool Tar(1) can be used in a special mode called 'tarify'. In that mode, fpsync(1) will *not* copy the original file tree but generate tarballs (one per partition) into the specified destination directory. Extracting (merging) those tarball to a another directory will reproduce the original file tree. # Notes about Debian Almquist shell (dash) Debian Almquist shell (/bin/sh on Debian since Squeeze / 6.0) does not support enabling job control without a tty in non-interactive mode (i.e. one cannot run 'dash fpsync ... &' or just 'fpsync ... &'). This is a known problem that has been discussed [here](https://lore.kernel.org/dash/7091680.J8PY2HnTC3@home.martymac.org/T/#u) and led to the following [patch](https://patchwork.kernel.org/project/dash/patch/dedaa3fa370ea9c4aeb1771b5568a7bef4065b04.1675113321.git.steffen@sdaoden.eu/) waiting for inclusion. Meanwhile, if you need to run fpsync in the background, just change its shebang to use another Bourne shell (bash for example). # Notes about GNU cpio Developments have been made with BSD cpio (FreeBSD version). Fpsync will work with GNU cpio too but there are small behaviour differences you must be aware of : - for an unknown reason, GNU cpio will not apply mtime to the main target directory (AKA './' when received by cpio). - when using GNU cpio, you will get the following warnings when performing a second pass : not created: newer or same age version exists You can ignore those warnings as that second pass will fix directory timestamps anyway. Warning: if you pass option '-u' to cpio (trough fpsync's option '-o') to get rid of those messages, you will possibly re-touch directory mtimes (loosing original ones). Also, be aware of what that option implies: re-transferring every single file. # Notes about hard links Rsync can detect and replicate hard links with option -H but that will NOT work with fpsync because rsync collects hard links' information on a per-run basis. Being able to propagate hard links with fpsync would require from fpart the guarantee that all related links belong to the same partition. Unfortunately, this is not something fpart can do because, in live mode (used by fpsync to start synchronization as soon as possible), it crawls the filesystem as it comes. As a consequence, there is no mean to know if a hard link connected to a file already written to a partition (and probably already synchronized through an independent rsync process) will appear later or not. Also, in non-live mode, trying to group related hardlinks into the same partitions would propably lead to un-balanced partitions as well as complexify code. If you need to propagate hard links, you have 3 options: * Re-create hard links on the target, but this is not optimal as you may not want to link 2 files together, even if they are similar * Pre-copy hard linked files together (using find's '-type f -links +1' options) before running fpsync. That will work but linked files that have changed since your first synchronization will be converted back to regular files when running fpsync * Use a final -monolithic- rsync pass with option -H that will re-create them # SSH options When dealing with SSH options and keys, keep in mind that fpsync uses SSH for two kinds of operations : * data synchronization (when ssh is forked by rsync), can occur locally or on remote workers (if using any) * communication with workers (when ssh is forked by fpsync), only occurs locally (on the scheduler) If you need specific options for the first case, you can pass ssh options by using rsync's option '-e' (through fpsync's option '-o') and triple-escaping the quote characters : $ fpsync [...] -o "-lptgoD -v --numeric-ids -e \\\"ssh -i ssh_key\\\"" \ /data/src/ login@remote:/data/dst/ The key will have to be present and accessible on all workers. Fpsync does not offer options to deal with the second case. You will have to tune your ssh config file to enable passwordless communication with workers. Something like : $ cat ~/.ssh/config Host remote IdentityFile /path/to/the/passwordless/key should work. # Limitations * Fpsync only synchronizes directory contents ! Contrary to rsync, fpsync enforces the final '/' on the source directory. It means that directory *contents* are synchronized, not the source directory itself (i.e. you will *not* get a subdirectory of the name of the source directory in the target directory after synchronization). # Portability considerations On OpenIndiana, if you need to use fpsync(1), the script will need adjustments : * Change shebang from /bin/sh to a more powerful shell that understands local variables, such as /bin/bash. * Adapt fpart(1) and grep(1) paths (use ggrep(1) instead of grep(1) as default grep(1) doesn't know about -E flag). * Remove -0 and --quiet options from cpio calls (they are not supported). As a consequence, also remove -0 from fpart options. * Use gtar(1) instead or tar(1) (adapt TAR_NAME variable). On Alpine Linux, you will need the 'fts-dev' package to build fpart(1). fpart-1.7.0/docs/www.fpart.org/docs/changelog.md000644 001751 000000 00000032231 14745137273 022476 0ustar00martymacwheel000000 000000 # Current: 1.7.0 ```nohighlight 2025/01/25, 1.7.0 ('About skiing and high school') : - fpsync: check for common commands/tools presence (discussed in GH issue #47) - fpsync: add support for pax copy tool (option -m) Note for packagers: adds a new dependency to pax(1) On FreeBSD, depends on the following fix: https://cgit.freebsd.org/src/commit/?id=681fd2bed8eaba88693867ba928a1c03a5b152cc - fpsync: rework return code handling and status report Use jobs' return codes to compute final status. Before that change, fpsync returned an error when a message was printed to stderr by a job. It now returns an error when at least one job did not return 0 and prints additional information regarding jobs that did return 0 but wrote something to stderr (fixes GH issue #61) - fpsync: fix failure detection for piped tools (tar, cpio, pax) - fpsync: rename main log file to fpsync.log - fpsync: improve startup logs - fpsync: cleanup log files when replaying a run - fpsync: fix wrong jobs rescheduled when resuming a run (option -r) That change introduces a new layout within fpsync's temporary directory. That version of fpsync will not be able to resume or replay runs generated with a previous version. - fpsync: fix wrong counters erroneously including killed jobs - fpsync: only display kill messages once when pressing CTRL-C - fpsync: colorize output - fpsync: display additional info when listing runs (-l) in verbose mode ``` # 1.6.0 ```nohighlight 2024/01/21, 1.6.0 ('College years') : - fpsync: fix run resuming caused by empty OPT_TOOL_PATH in info file (GH PR #44) - fpart: add option -P (add parent directories when closing intermediate partitions). Useful for fixing directory dates when parallelizing cpio(1) or tar(1) jobs - fpsync: enable fpart's option -P for 'cpio' and 'tar' tools. This finally enables keeping directory modification times intact when parallelizing cpio(1) and tar(1) jobs! - fpart: fix 2 errors detected by Coverity Scan, see: https://scan.coverity.com/projects/fpart - fpart: provide long options (for the most important ones) - fpsync: fix off-by-n error when calculating ETA in SIGINFO handler (fixes GH issue #48) - fpsync: show transmitted files count / data size in final status and SIGINFO handler (fixes GH issue #24) - fpart: final summary now shows total number of parts created, as well as total number of files packed and total resulting size - fpart: add new hook variables: FPART_TOTALSIZE, FPART_TOTALNUMFILES and FPART_TOTALNUMPARTS - fpart: add post-run hook (option -R), triggered just before program exits - fpsync: Limit useless log generation by removing empty log files (see: https://sourceforge.net/p/fpart/discussion/general/thread/5d001d74b6/) - fpsync: Facilitate tar tool change on Solaris-based OS ``` # 1.5.1 ```nohighlight 2022/06/22, 1.5.1 ('Feel the light') : - fpsync: add source, destination and total elapsed time to the email report (GH PR #41) - fpsync: add option -T to specify absolute path of copy tool (GH PR #42) - fpsync: output cleanups ``` # 1.5.0 ```nohighlight 2022/06/02, 1.5.0 ('Rebirth') : - added 'make_release.sh' script to automate release tarball creation - embedded fts: check errors from readdir() (GH issue #37) - fpart: re-enable large files support on GNU/Linux (fixes Debian bug #834328) - fpart: start numbering partitions from '1' instead of '0'. Special partition '0' is now exclusively reserved for files that do not fit in regular partitions when option '-s' *and* non-live mode are used. Note for 3rd-party tools: that change may impact you! (partly fixes GH issue #36) - fpart: avoid returning an additional -empty- partition '1' when only special partition '0' has been used - fpart: avoid returning special partition '0' when it is empty (partly fixes GH issue #36) - fpart: add option -S to skip, in live mode, files that are bigger than maximum partition size (see man page for more details, fixes GH issue #36) - fpart: add FPART_PARTERRNO hook variable that contains 0 if every single partition's entry has been fts_read() without error, else last erroneous entry's errno (GH issue #37) - fpart: add option -Z, used to isolate a failing directory alone within a partition (GH issue #37) - fpart: change display format when listing files to stdout: "partition_index (file_size): file_path" becomes: "partition_indexfile_sizefile_path" (GH issue #38) - fpsync: add more checks for incompatible rsync options - fpsync: force non-recursive rsync(1) in file-based mode - fpsync: add aggressive mode option (-EE) to enable recursive synchronization for erroneous directories (GH issue #37) - fpsync: start all idle workers before refresh (GH PR #40) - fpsync: rework child processes and SIGINT handling and fix missing display of last jobs' completion status (inspired by GH PR #40) ``` # 1.4.0 ```nohighlight 2021/09/24, 1.4.0 ('Joining together') : - fpsync: allow special characters and white spaces within fpart options Allows something like: fpsync ... -O "-y|foo bar|-y|*.txt" /src/ /dst/ (fixes GH issue #33) - fpsync: fix useless double call to sudo(1) in cpio(1) jobs - fpsync: add support for 'tar' and 'tarify' tools ``` # 1.3.0 ```nohighlight 2021/05/08, 1.3.0 ('Cleaning room') : - fpart: align get_size() and init_file_entries() behaviour and take exclusions into account when computing a directory size. - fpart: fix directory size computation when using options -y/-Y. Before that change, -D and -E would have returned a size of 0 for a directory included through options -y/-Y. - fpart: fix detection of an unknown option - fpart: various fixes on Darwin - fpsync: mask broken pipe errors when dequeueing jobs (fixes GH issue #22) - fpsync: fix bug where a job could remain resumable forever under certain conditions. - fpsync: fix detection of fpart exiting with errors - fpsync: add prepare run option (-p) - fpsync: add list runs options (-l) - fpsync: add replay run option (-R) - fpsync: add archive run option (-a) Note for packagers: adds a new dependency to tar(1) - fpsync: add delete run option (-D) - fpsync: rework help and man page for clarification - fpsync: add check for incompatible rsync option (--delete) - fpsync: add send mail option (-M) Note for packagers: adds a new dependency to mail(1) ``` # 1.2.0 ```nohighlight 2020/01/10, 1.2.0 ('Joking') : - fpsync: ability to set an unlimited number of files or an unlimited size per sync job (fixes GH issue #9) - fpart: exclude files earlier (fixes GH issue #14) Before that change, excluded files would not make a directory empty and still account for its size; excluded files are now considered absent. That change does not apply when a directory size is computed after a certain depth (option -d) has been reached (in that case, once the maximum depth has been reached, every single file accounts for a directory size). - fpart: allow to specify paths with options '-y', '-Y', '-x' and '-X' (fixes GH issue #17) - fpart: raise limits for different internal types: the size of a file or partition, the number of files inside a partition and the number of partitions. That will make fpart(1) ready to handle bigger filesystems. - fpart: accept human-friendly size formats for options -s, -p, -q and -r - fpsync: accept human-friendly size formats for option -s - fpsync: use 'command' instead of 'which' to find binaries (fixes GH issue #20) ``` # 1.1.0 ```nohighlight 2018/11/15, 1.1.0 ('Reading') : - fpart: options -D and -E now pack files if they are explicitly passed as arguments - fpsync: simplify and fix detection of remote URLs (fixes GH issue #2) - fpsync: implement simple ETA when displaying status - fts.h: portability fix for Solaris 10 and earlier (GH PR #4) - fpart: fix build on Alpine Linux (GH PR #5) - fpsync: add timestamps and part numbers to logs - fpsync: add support for cpio copy tool (option -m) - fpart: option -Z becomes option -zz (incremental -z) - fpart: add option -zzz to add all directories to file lists (as empty) - other: lower required autoconf version to 2.63 (GH issue #7) - other: update RPM .spec file for CentOS and Feroda (GH issue #7) ``` # 1.0.0 ```nohighlight 2017/11/10, 1.0.0 ('Dancing'): - fpart: update embedded fts(3) using FreeBSD 12-CURRENT's version - fpart: add option -E to pack directories instead of files - fpsync: add option -E to work with directories (enables rsync(1)'s --delete) That option finally enables fpsync(1) to parallelize the so-called final rsync(1) pass, needed to remove extra files with the --delete option! (of course it can also be used on a regular basis instead of the usual 'file' mode: you will get a perfect mirror without needing any extra --delete pass) - fpart: add option -0 to end filenames with a null (\0) character when using option -o - fpsync: use fpart's new option -0 in conjunction with rsync's --from0 option to avoid failing on filenames with special characters - fpsync: improve documentation ``` # 0.9.3 ```nohighlight 2017/04/27, 0.9.3 ('Funny words'): - fpsync: add support for rsync URL as target Suggested and tested by Harry Mangalam. Thanks, Harry! ``` # 0.9.2 ```nohighlight 2015/02/19, 0.9.2 ('What's that?'): - fpsync: add option '-S' to use sudo(1) for filesystem crawling and synchronizations - fpsync: add option '-O' to override default fpart(1) options - add RPM .spec file (see the contribs/package/rpm directory) ``` # 0.9.1 ```nohighlight 2015/02/06, 0.9.1 ('Let's play together'): - add tools/fpsync: a tool to sync directories in parallel using fpart and rsync. See fpsync(1) for more details. - fpart: print the number of files found in verbose mode only ``` # 0.9-1 ```nohighlight 2013/11/13, 0.9-1: (this minor change only impacts tarball users, fpart code itself has not changed) - Backport the following patch to config.guess: http://git.savannah.gnu.org/gitweb/?p=config.git;a=commitdiff;h=29900d3bff1ce445087ece5cb2cac425df1c2f74 it adds support for ppcle and ppc64le architectures. Submitted by: Madhu Pavan ``` # 0.9 ```nohighlight 2013/09/10, 0.9 ('I bite!'): - Code cleanup - Fix Debian bug #719338 (fix build on 32bit architectures) ``` # 0.8 ```nohighlight 2013/06/25, 0.8 ('Moving around'): - Keep environ(7) when forking hooks - Add sections about live mode and data migration in README - Use autotools and get rid of manual Makefiles ``` # 0.7 ```nohighlight 2013/02/18, 0.7 ('Can I take it ?'): - Added option -D to group leaf directories as single file entries - Big options and doc update/cleanup - Sync'd fts(3) code with current FreeBSD version (svn rev 245505) - Embedded fts(3) can now be used on GNU/Linux - Renamed option '-x' to '-b' - Added options '-y', '-Y', '-x' and '-X' to include or exclude files ``` # 0.6 ```nohighlight 2013/01/21, 0.6 ('Very funny'): - Options handling cleanup and various bugfixes - Added FPART_PID and FPART_HOOKTYPE hook variables - Added -z and -Z options to display empty directories ``` # 0.5 ```nohighlight 2013/01/09, 0.5 ('Cassounette'): - Added option '-L' (live mode) - Added options '-w' and '-W' (hooks to be used with live mode) - Fixed build on Solaris 9 - Removed option '-m' and associated code ``` # 0.4 ```nohighlight 2012/06/12, 0.4: - Now builds on Solaris (using FreeBSD's fts(3)) - Fix stack overflow when allocating file entry pointers' array - Added preloading/rounding options -p, -q and -r. See fpart(1) - Added more verbose messages (option '-v') - Better error handling when unable to add file entries (mostly when running out of memory) - Verbose mode now accepts several levels - Added option '-m' (disabled by default), that tries to lower physical memory usage (at least during FS crawling) by using temporary file(s) and mmap(2) facility ``` # 0.3 ```nohighlight 2011/12/06, 0.3: - Switch to fts(3) - Replaced getline(3) calls with fgets(3) for compatibility - New "handle arbitrary values" (-a) option - Strings handling cleanup (stop using FILENAME_MAX) - Various smaller changes ``` # 0.2 ```nohighlight 2011/11/24, 0.2: - New "follow symbolic links" (-l) option - Ending slash (if present in input path) is now left to allow following an initial symbolic link (without using option -l) - New "do not cross file system boundaries" (-x) option - Fpart now reads on stdin by default if no path is given - File size are now written to stdout when displaying partition contents - Various smaller changes ``` # 0.1 ```nohighlight 2011/11/18, 0.1: - Initial version ``` fpart-1.7.0/docs/www.fpart.org/docs/index.md000644 001751 000000 00000010601 14745137273 021653 0ustar00martymacwheel000000 000000 ![Fpart](img/Fpart.png) # About Fpart is a **F**ilesystem **part**itioner. It helps you sort file trees and pack them into bags (called "partitions"). It is developed in C and available under the BSD license. # Key features ## Fpart * Blazing fast crawling! * Generates partitions on a number/file number/size basis * Provides a live mode with hooks to act immediately on generated file lists * Supports generating partitions from arbitrary input (e.g. du's output) ## Fpsync * Parallelizes rsync(1), cpio(1) or tar(1) jobs using fpart(1) * Supports using a SSH cluster for efficient/distributed data migration * Starts transfers while FS crawling still goes on * Supports remote target URLs when using rsync(1) * Parallelizes your final rsync(1) (--delete) pass too! * Provides transfer runs' status/resume/replay * Nearly no dependencies (mostly shell and common tools) * Lower memory footprint (than raw tools) # Compatibility Fpart is primarily developed on FreeBSD. It has been successfully tested on : * FreeBSD 13, 14 (i386, amd64) * GNU/Linux (x86_64, arm) * Solaris 9, 10 (Sparc, i386) * OpenIndiana (i386) * NetBSD 9.3 (amd64) * Mac OS X 10.6, 10.8, 11.2 (x86_64, arm64) and passed Coverity Scan tests with success. [![Coverity Scan Build Status](https://scan.coverity.com/projects/27316/badge.svg)](https://scan.coverity.com/projects/fpart) # Installing from a package Packages are already available for many operating systems : * [FreeBSD](https://www.freshports.org/sysutils/fpart) * [Debian](https://packages.debian.org/fpart) * [Ubuntu](https://packages.ubuntu.com/search?keywords=fpart) * [CentOS/Fedora](https://src.fedoraproject.org/rpms/fpart) * [NixOS](https://search.nixos.org/packages?query=fpart) * [MacOS (Homebrew)](https://formulae.brew.sh/formula/fpart) * [Spack](https://packages.spack.io/package.html?name=fpart) so you can use your favourite package manager to get ready. # Installing from source If a pre-compiled package is not available for your favourite operating system, installing from sources is simple. First, get the source files : $ git clone https://github.com/martymac/fpart.git $ cd fpart Then, if there is no 'configure' script in the main directory, run : $ autoreconf -i (autoreconf comes from the GNU autotools), then run : $ ./configure $ make to configure and build fpart. Finally, install fpart (as root) : # make install # Author / Licence Fpart has been written by [Ganael LAPLANCHE](mailto:ganael.laplanche@martymac.org) and is available under the BSD license (see COPYING for details). Source code is hosted on : * [Martymac.org](http://contribs.martymac.org) * [Github](https://github.com/martymac/fpart) * [Sourceforge](http://www.sourceforge.net/projects/fpart) Documentation is available on : * [Fpart.org](http://www.fpart.org) Thanks to Jean-Baptiste Denis for having given me the idea of this program ! # Third-party code fts(3) code originally comes from FreeBSD : lib/libc/gen/fts.c -> src/fts.c include/fts.h -> src/fts.h It has been slightly modified for portability and is available under the BSD license. # Supporting fpart If fpart (or fpsync) is useful to you or your organization, do not hesitate to contribute back! You can follow ideas in the [TODO](https://github.com/martymac/fpart/blob/master/TODO) file or just fix a bug, any kind of help is always welcome! You can also make a donation via Paypal:
[![Paypal](https://www.paypalobjects.com/en_US/FR/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HSL25ZED2PS62&source=url)

or [Github](https://github.com/sponsors/martymac?o=esb). That will help me not running out of tea :) # Fpart supporters * Apple OSX support is eased by **MacStadium**'s Open Source Developer Program, big thanks to them! * Many thanks to **HPE** for providing me the successor of my old server! That's what I call OSS support :)
[![MacStadium](img/ext-logos/MacStadium.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://www.macstadium.com/company/opensource) [![HPE](img/ext-logos/HPE.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://www.hpe.com/us/en/open-source.html)

* Last but not least, big thanks to my **beloved wife and daughters** for their invaluable support and more particularly for the discussion we had about fpart logo :) fpart-1.7.0/docs/www.fpart.org/docs/links.md000644 001751 000000 00000014063 14745137273 021672 0ustar00martymacwheel000000 000000 # Resources * See [fpart(1)](https://www.freebsd.org/cgi/man.cgi?query=fpart&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE+and+Ports&arch=default&format=html) and [fpsync(1)](https://www.freebsd.org/cgi/man.cgi?query=fpsync&apropos=0&sektion=0&manpath=FreeBSD+12.2-RELEASE+and+Ports&arch=default&format=html) for more details. * Article about data migration using fpart and rsync (GNU Linux Magazine #164 - October 2013, french) : [Parallélisez vos transferts de fichiers](http://connect.ed-diamond.com/GNU-Linux-Magazine/GLMF-164/Parallelisez-vos-transferts-de-fichiers) * [Steve French](https://lwn.net/Articles/789623/) mentioned fpart and fpsync at 2019 Linux Storage, Filesystem, and Memory-Management Summit (LSFMM) * The [partition problem](http://en.wikipedia.org/wiki/Partition_problem) and [bin packing problem](http://en.wikipedia.org/wiki/Bin_packing_problem) descriptions on Wikipedia * I am sure you will also be interested in [Packo](https://github.com/jbd/packo) which was developed by Jean-Baptiste Denis as the original proof of concept. See also his newer tool, [Msrsync](https://github.com/jbd/msrsync) # Projects using fpart * Harry Mangalam, from UCI, has an excellent article about data transfer [here](http://moo.nac.uci.edu/~hjm/HOWTO_move_data.html). Check out his [parsyncfp](https://github.com/hjmangalam/parsyncfp) and [parsyncfp2](https://github.com/hjmangalam/parsyncfp2) tools. * Dave Altschuler wrote [dsync](https://github.com/daltschu11/dsync), a tool using fpart + rsync or rclone that can sync to the cloud * [K-rsync](https://doughgle.github.io/k-rsync/) uses fpart and the kubernetes Job scheduler to transfer files between PVCs # Fpsync users (Research / Education) * [Bioteam](https://www.slideshare.net/chrisdag/practical-petabyte-pushing) used fpart + fpsync + rsync to migrate 2 PB of data * [FAS RC (Harvard University)](https://www.rc.fas.harvard.edu/resources/documentation/transferring-data-on-the-cluster/#fpsync) writes about fpsync to move data on Harvard's Odyssey cluster * [Standford University's](https://www.sherlock.stanford.edu/docs/software/list/) Sherlock HPC cluster offers fpart as a file management tool * [Nantes University's](https://bird2cluster.univ-nantes.fr/news/rappel_transfert_02/) BiRD cluster provides a fpart module * [Sweden's NSC](https://www.nsc.liu.se/support/storage/snic-centrestorage/moving-data/) (National Supercomputer Centre)'s Centre Storage suggests using fpsync * [National Energy Research Scientific Computing Center](https://www.spectrumscaleug.org/wp-content/uploads/2019/10/HPCXXL19-NERSC-Site-update.pdf) (NERSC) writes about fpsync * [Utah's CHPC](https://www.chpc.utah.edu/documentation/data_services.php#ptt) suggests fpart to transfer data in and out of CHPC resources * Fpart is proudly referenced in the [French Government's 'SILL'](https://code.gouv.fr/sill/detail?name=fpart) # Fpsync users (Storage / Cloud providers) * [Intel](https://web.archive.org/web/20230314023512/http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/data-migration-enterprise-edition-for-lustre-software-white-paper.pdf) has written a white paper about data migration, presenting fpart and fpsync * [Amazon](https://s3.amazonaws.com/solutions-reference/efs-backup/latest/efs-to-efs-backup.pdf) uses fpart and fpsync in their EFS-to-EFS backup solution. See also their [Amazon Elastic File System (Amazon EFS) for File Storage](https://www.slideshare.net/AmazonWebServices/amazon-elastic-file-system-amazon-efs-for-file-storage) presentation (AWS Storage Days, New York, September 6-8, 2017) and the [Amazon EFS performance tutorial](https://github.com/aws-samples/amazon-efs-tutorial/tree/master/performance), both presenting fpart and fpsync capabilities * [Microsoft](https://learn.microsoft.com/en-us/azure/storage/files/storage-files-migration-nfs) suggests using fpart and fpsync to speed-up file transfers * [Alibaba (Aliyun)](https://www.alibabacloud.com/help/doc-detail/128764.htm) * [Oracle](https://docs.oracle.com/en-us/iaas/Content/File/Troubleshooting/transferring-windows-data-sms.htm) * [cunoFS](https://cuno-cunofs.readthedocs-hosted.com/en/stable/user-guide-tips-for-apps.html#fpsync) * [Nutanix](https://portal.nutanix.com/page/documents/solutions/details?targetId=TN-2016-Nutanix-Files-Migration-Guide:fpsync-for-nfs.html) * [Huawei Latin America cloud](https://github.com/huaweicloud-latam/migration-tool-map/tree/main/02-014-fpsync)
[![Intel](img/ext-logos/Intel.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://web.archive.org/web/20230314023512/http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/data-migration-enterprise-edition-for-lustre-software-white-paper.pdf) [![AWS](img/ext-logos/Aws.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://s3.amazonaws.com/solutions-reference/efs-backup/latest/efs-to-efs-backup.pdf) [![Microsoft](img/ext-logos/Microsoft.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://learn.microsoft.com/en-us/azure/storage/files/storage-files-migration-nfs)

[![Alibaba](img/ext-logos/AlibabaCloud.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://www.alibabacloud.com/help/doc-detail/128764.htm) [![Oracle](img/ext-logos/Oracle.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://docs.oracle.com/en-us/iaas/Content/File/Troubleshooting/transferring-windows-data-sms.htm) [![cunoFS](img/ext-logos/cunoFS.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://cuno-cunofs.readthedocs-hosted.com/en/stable/user-guide-tips-for-apps.html#fpsync)

[![Nutanix](img/ext-logos/Nutanix.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://portal.nutanix.com/page/documents/solutions/details?targetId=TN-2016-Nutanix-Files-Migration-Guide:fpsync-for-nfs.html) [![Huawei](img/ext-logos/Huawei.png){: style="width:175px;margin-right:75px;margin-down:75px"}](https://github.com/huaweicloud-latam/migration-tool-map/tree/main/02-014-fpsync)
fpart-1.7.0/docs/www.fpart.org/docs/img/Ico.svg000644 001751 000000 00000005251 14745137273 022236 0ustar00martymacwheel000000 000000 image/svg+xml /FP/ fpart-1.7.0/docs/www.fpart.org/docs/img/Fpart.svg000644 001751 000000 00000005067 14745137273 022605 0ustar00martymacwheel000000 000000 image/svg+xml /FP/art/ fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/000755 001751 000000 00000000000 14745137273 022721 5ustar00martymacwheel000000 000000 fpart-1.7.0/docs/www.fpart.org/docs/img/Fpart.png000644 001751 000000 00000023770 14745137273 022573 0ustar00martymacwheel000000 000000 ‰PNG  IHDRXÈ4ŸŸ¶sBIT|dˆ pHYs3¬3¬9¯ÐÒtEXtSoftwarewww.inkscape.org›î< IDATxœíÝytTç™&ð§ªT*­hE Z@;B˜Í bœÅ‰“tÒÓÓm÷çd™ôt&žNÇc·{bOÆélÓž´Ó±3N>Ž—^zIåŠÔÅ€%ÉîÝ»‡+Ø¿¿ŠÕ·2HHH@BBV®\ ànèjnnF]]jkkÑÞÞ®q•êÛºu«âp%%%*VCDî2 (**R¼¾ªª ƒƒƒ*V¤>,IvïÞ­xí­[·péÒ%«!_b4‘––†´´4áöíÛ8}ú4jjj0>>®uyª9ŸFGGqìØ1«!"w­^½ÉÉÉŠ×û¦‰K‚ÈÈHäææ*^_RR§Ó©bEäËRRR’’‚;w¢ªª •••Öº,iL&vîÜ©xý‘#G022¢bEDŸôË–aUT”âõ6>}ú´Šé›È¦Éét¢¼¼\Åj<ƒK‚;wÂl6+^ï Éœ´Š¢¢"äç磼¼•••>Üsrr0{ölÅëy>‘²##Q¯x}·^mVJ$`ÕÖÖ¢¥¥EÅj<ƒm$ùÃ@uuµŠÕ¿ Ág?ûY|ë[ßBLLŒÖå¸Mä|r88xð ŠÕ‘»ÒÓÓ±dÉÅë}eÓÄ€å&‹Å"ôVß011¡bEä¯æÏŸçž{‹/Öº·ìÚµKñÚS§N¡³³SÅjˆÈ]"›&€‹îÙ´ifÍš¥x½¯üá>…††â«_ý*òòò´.Å%‹/Fff¦âõ<ŸˆôO$`555áÊ•+*Vã9 XnùÙ˜˜À¡C‡T¬†èî[‡O=õ6mÚ¤u)ÂDwº¥¥¥*UBD2ÄÄÄ ''Gñú}ûö©Xg1`¹Áûzw0 xòÉ'…þŦ"«¡¡×®]S±"rWQQ”¿OçKW¥ù¡V­Zåw}=ü•Ýn—òV‹ÙlF`` 0kÖ,êíq žzê)´¶¶¢¹¹Yµï‘%>>«W¯V¼žç‘þ‰lšz{{ñÞ{ï©Xg1`¹A´¯GYY™ŠÕLï­·ÞBmm­fßï =‡’>¶Á`0 ""‰‰‰HNNFff&,X‹Å"í;Ìf3žyæ¼ð ºïµgÏ¡ÀÉ€E¤oÁÁÁغu«âõeee>5‹•Ë {öìQ¼V뾺ÿõ7N§ýýýèïïGCCŽ= ³ÙŒ¬¬,äææbáÂ…R¾'::»wïÆo~ó)Ÿ§‘ Kgg'Þÿ}«!"w 44Tñz_Û4ñ,ùk_R—ÍfCmm-^}õU¼òÊ+¸yó¦”ÏÍËËÃܹs¥|–„Ê/))ÃáP±""r—Ȧi||ÜçF^1`¹È_ûzç466âå—_Æïÿ{·Ã„ÑhÄÞ½{%U&ß¶mÛ¤x=Ï'"}3B#¯Ž=Š¡¡!+ò<,ùk_ò,‡Ã#GŽàG?úFGGÝú¬E‹!%%ERer‰œOV«•••*VCDîZ·n¯÷ÅM– ü¹¯i£¡¡?ùÉOÜž°eËIÉc2™°}ûvÅë>¬« ˆè“DG^ùÂpç1`¹ÀŸûzvñË_þÒ­ÏÈÎΖú–¢ yyyB3y>éŸHÀ:{ö,:::T¬F X.ð群­óçÏ£¦¦Æåã±téR‰¹Oä|²Ûí¨¨¨P±"rWFF,X x½¯nš°Y,(^_^^îS}=H{ï¼óŽ[-7²³³%Vã¾ââbÅk«««ÑÝÝ­b5Dä.Ñj°ÀÝgXÂÃï÷Õ?ÒÎðð0Ž=êòñ"Ôն|ùr¤¥¥)^Ïó‰HÿD®J766âêÕ«*V£,A¢}=Üù!$šÊÉ“'a³Ù\:6""ÑÑÑ’+rH³^€Ã‰ô...k×®U¼þwÞQ±m1` 0BÃ}±¯éƒÕjE}}½ËÇ?òÈ#«qȆåòåËøøãU¬†ˆÜU\\ “ɤx½/_•æ¨ìëAzrñâEdee¹t¬Èß±Z’’’„žÓëùg± #<„†â‘ÐPÄ!>(± €ÅhDȽ·Žm6ØN MNbÐfÃí‘´¡eduƒƒ¸20€qv¨wI°É„ááXŽÅ³fa~X¢b2!, ‘f3FívôNL wbM##¸aµâ†ÕŠ“ÝÝæ³²RˆlšºººpöìY«Ñ–öõ =¹qã†ËÇŠ´EPËž={`0¯×CÀJ º˜¬ŽÆŠÈH¬ˆŒD‚@ú™ØÔâLo/*ÚÛq¬«‹?üÓX2k¶'&bGB…Y`Xøýr*+qº§Gruþ'$$ùùùŠ×—••Án·«X‘¶°°¯éIWWFGG,|¬–ÈùÔÚÚŠ .¨XÍÃÅZ,(ˆ‹Ã–øxlŠ‹CšÀàZW˜FdEF"+2O?òƼÛÙ‰¹yemm˜t:Uý~~•…o ¾H‘PV†N…Íc-F#¾4w.¾ž™‰%³f¹Râ'<ó‡öîE˜@¯C%b-8?ó©Ÿù0uƒƒXzø°êßó0……… Q¼^›&51`)ľ¤7N§ÝÝÝ.¿‰ŒŒT¡"å"""°aÃÅëKJJàôP¸H Æg’“ñdJ ÖDGÃ(p•M6‹Ñˆ‰‰Ø‘˜ˆÖÑQüìÆ üÓõë~yU+ÈdÂ722𵌠ÄK¼j@èJ*MMdÓ422‚wß}WÅj´Ç€¥ûzõööº°U¨F¹íÛ· Õ öùˆ¢ÄD|&%Û Ãܤà`üÃÒ¥øFF^lhÀO½âŠ– y³gãŸW®Ä"IW¬¤¿ÚÞÇd2 w>räˆ[ýü¼–BìëAzäêh­–Èù488ˆãÇ«RG Ñˆ²ÇG~\œ.CÕÃÄZ,øáŠø|j*¾pö,nX­Z—¤š “ ?[¹_™7OÕ¤åUJ_±~ýzÄÆÆ*^ï!ئAѾîLžâêðg-–ÙlƶmÛ¯¯¨¨p{ÈõTFl÷špu¿µÑÑø`Ë|!5UëRTk±àX^þ\åpð‡PÑ‘WP±}àß•»víb_ò)žzžéa6nÜ(ô ϧ©…àWk×âÛ j]ŠTóÃÂp:?뮈¸ƒÏ`¹o×®]Š×ž:u wîÜQ±}`ÀR@´¯Ç™3gT¬†èO\½¥Ö!%DÎ'›Í†C‡©X÷3øÇeËðòòåZ—"E|PŽäåa~X˜Ç¾“ñÊ=K—.EFF†âõþ²ibÀšAHH6oÞ¬x½¯÷õ }y%ú~®ŽÙq—Á`î|üøqôõõ©X‘ïø› „Û#èM°É„}99ª·Ãx–{D6M€ÿŒ¼âCî3`_Ò3Wg ŽK®D™•+W ½õèçӸî±1ØœNX''a»×™=ÂlF°É„8‹Å冘3yyùr\·ZQÖÖ¦Êç«íWkÖà1 z´ñ!w÷ˆ¬ºº:\¿~]ÅjôƒkìëAze0„ÞÚ¹_¿äj”ÝéêõAX›Ãúûq±¿׆†puh£cl } n¿Æaѽ‘.9±±Ø4{6æ¸Ð0öA&ƒo®Yƒ%‡£ÍÅ7LµògsçâSÉÉ.Û=>Ž ýýøØjEóÈz'&0f·ÃîtÞ“ˆäà`,ˆ@VD¢¸µþ`ÀªêêBð ÏÝfGE!Fà½ÍáÀ Œºñ(@çØ:ÇÆpüÎüìÞÈ£µÑÑø|j*¾ˆ½xÖ,|:9¿½}[¥ =çÍæfÞf³áЇ´, ¯///׬ӼÞý—Ë—±31©û©ÔTüçK—tñ\™R á?]¸ u4 ‘MÓää$***T¬FŸ8*ç!Ø×ƒô(##_þò—ÝúŒ>øÀã]Ü7oÞŒððpÅëy>MÍ:9)|Ël¶Å‚•W´æðççÎÁ:9©u)4¢¢"ÅkOž<©Yï=-1`=ûzÞ,Y²Ï>û¬ÛWúŽ=*©"åDΧññq>|XÅj¼ß.´Ø§R5òýúÖ-œöÃco²bÅ ¤¥¥)^ﯛ&¬°¯é‰ÑhÄöíÛñì³ÏºÜµý®^½Š[îùc0„¦!TVVbhhHÅŠ¼ŸÍáÀÛ‚ozKÀ²;|îÊ ð%0eø ÖØ×ƒôbÁ‚øÔ§>…¹sçºýYN§û÷ï—P•˜5kÖ I Q&Ï'eÊÚÚðu62kcb`€þêß×ÚŠ›ÃÃZ—A3 X—.]Ò¤ïž0`=€}=HKf³ÙÙÙÈËËêÃ6“ššÝ7u:œ† Ð™žØ˜öÅ @jHˆÇ‹úÃ\FÒ¯ÔÔT¬˜éÏ›&¬û°¯y’ÑhDDD‘’’‚ÌÌLdffJ£r``ûöí“ú™J‰¬sçΡ¥¥EÅj|LjݎÃÃX(ðòÀÒˆ]¬Ž±1œä4 ÝãK`Ê1`Ý'//}=è¡ÂÃÃñï|ÇíÏ „Ùl†ÅbAXX˜Ð¿¨\a·ÛñÚk¯aXƒÛ.éééBã|x>‰¹aµ ,½v«îÞô¦VþJdÓÔÚÚªIß=½`Àºèpgìëá¯L&“”g¡<í·¿ý-nhtÛÅ[†;{«ž‰ ¡õ"½³´p¬³SëhÈËËS¼~ÿþý~ýß"¼Èpç'Nøe_ò%%%8~ü¸fß/²a¹qãêêêT¬Æ÷ˆö‰Jtó-T59Ôtwk]Í`çÎB0øû¦‰W°îñõ¾===°Z­Z—1%†UyœN'öíÛ§i?©˜˜¡ŽóZ¼áèí&¡õ :XV+º<ܗĉlšpâÄ «Ñ?¬{|½¯Gii)Μ9£u¤²±±1¼ñƸ ñ˜‘ââb˜L&Åë½mÃò0ÑH Ãü°0$!&0ñAAˆ Ĭ{ƒ®ÍF#†^O'Eð–ŸžVÃà Ö%Ð Ìf3¶nݪxýÁƒ1!xÛ×0`Ýþäíš››ñú믣SϲˆœO===8}ú´ŠÕÈ7ÛbÁúØX¬‰ŽÆºèhdEF"Zçó4C%;50`é_~~>"##¯÷…M“»ô{ÆyPRRûz×EYYªªªà¼m¤†àà`(^_VV†I/˜;·dÖ,ìIJ®9s°:* F•ß•-HaÏ,-°¹¨þ‰lšl6G^ °wï^öõ ¯322‚“'OâØ±cº/³eË„††*^¯çó)ØdÂgSRðW<‚œ˜­Ëq‹Eà–­§uòù+]3 B/UUU¡¿¿_ÅŠ¼Ø×ƒ¼KKK NŸ>šš]6º9ŸFGG5@=“@£ÿ1- Ï-Z„9ÁÁZ—#…Åh„Ñ`€C‡¯Íwêðï˜þäÑGErr²âõzÞ4y’ß,öõ ½s8¸uëêëëqîÜ9´µµi]Ò”ŒF£Ð4„cÇŽiÒu:ññø?>Š4«pÞÂ@û›ÈŸ4`³i]MCtä•·½¦¿X;vì`_Ò »ÝŽÎÎN´··£­­ MMMhllÔ啪‡yì±Ç x½žÎ§“ ?ÈÊÂÓééð®§«¼ß¸ž¤©‰¬ .àöíÛ*Vã=ü>`±¯)166&埽ÃáÀèè(€»·Ç&''144„ÁÁA `hhv»ÝíïÑŠÈùäp8t3Ü9!(¥ë×cut´Ö¥ø¥1/þ›÷uóæÍòe˯×Ó¦Ik~°Ìf3 ¯¯¨¨ðû¾þjll ï¼óŽÖeè^qq±âµgΜAGG‡ŠÕ(“†c6è~”Œ/›äcºÅ‘W®Óï{»À¾Dò,Z´ ,P¼^çÓl‹rs®ˆ¦ rUº©© —/_V±ïâ×W°Dûz:tHÅjˆ¼›è4­–ÅhÄ¡Ü\d„…IýÜI§ÍÃÃhÅ­‘´ŒŽþñ¿ON¢ÿÞÝ6N'¬““°¹p祥KñLzºÔÚ‰îÇ\ñz޼ú÷ü6`±¯‘\"ëêÕ«øè£T¬ff/.]Š•QQn΀͆ʮ.¼ÛÕ…s½½øp`£x¦hŒ†“ÊŠŠŠ 0@ëM“ÞømÀb_"yâãã±fÍÅëµ>ŸÖÇÆâ›™™.ïPÖÖ†×oÞDEGl„¾éHjÙ4õöö¢¦¦FÅj¼ß,öõ ’§¸¸FQ,Z¬ï/[æò¨›Ê®.|óÒ%\ÒøŠ¶YÇ£oÈûY,lÙ²EñúxÅÈ+ObÀR€}=ˆ¦'r>uuuáìÙ³*V3½í X+|œÃéÄß\¾ŒW¯]ƒÞy Öñèò~W¼^ëM“ùeÀb_"yBCC±yófÅëKKK5JýµŒ ácN'¾pö,ÞÖÑF‹‹Ô$²iÇ‘#GT¬Æ;ùå5föõ ’§°°AAAŠ×ky>%£ >^ø¸ïÖÕé*\@¬À "F£EEEŠ×¿û8¯~°D’yss3ûzMCä|Aee¥ŠÕLïs))0 >{u±¿ÿãêU•*r¯ ¡&ýY³f ¯çEˆ‡ó»€Å¾Dò˜L&¡á·ÆÈȈŠM/?.Nø˜ç®\]‡Æ“°H%¢#¯øØÃù]Àb_"yrss+ðÀ¸–ç“É`~¸ýæð0é`œÏƒ’ƒƒa6k]ù(‘€õþû½]Åj¼—ß,ѾÕÕÕ*VCäÝDÎ'»Ý®épçáᡤ¤­ ^½ÊñE$bþüùX´h‘âõ¼15¿ XìëA$—ȃ°555èîîV±šé¥»0çxW— •¸o•„ôD³wï^¡õ XSó«€Å¾Dò,[¶ óçÏW¼^ëói¾ «~pP…JÜçÊ›DJˆ\•nllDCCƒŠÕx7¿ XìëA$èpçòòr•*Q&A •pwN“†äOe–ÙŒµÑÑZ—á÷Do»:9À“âââ°nÝ:ÅëùØôü&`±¯‘\"ëÊ•+¸~ýºŠÕÌ,T°1ç˜Ý®ÉŒÁ™ì™3‡crt`BðoÃÃÁ$P§ÖW¥õÎoÎRöõ ’gΜ9xôÑG¯×Ãù*ðö0]†+øò¼yZ—@XA&“ît‹lšzzzpúôi«ñ~~°D‡;kù¶‘ÞíÞ½[zX‚·hÂÍfÝ])Ê ÇÆÙ³µ.ƒŒ ,ô}+88Š×—––Ân·«X‘÷Ó׿=T$Ú×£µµUÅjˆ¼›ÈùÔÖÖ†ÚÚZ«QfTðÇÀ`¶Å¢N1.úöÂ…^ñ,?蟘>&Lð*ª'mݺ!!!Š×ëaÓ¤w~°Ø×ƒHž°°0lܸQñúÒÒR8uÐKjÄ…Ýv¢àƒñjJ ÃSSµ.ƒî¹3>.|ÌÜÐP*‘CdÓ4::ŠcÇŽ©Xoð‹€Å¾Dòìܹ+;z9Ÿº\øAÔS¿©ggëî–¥?s%`¥ë4`F¡‘WGŽÁðð°Šù¿8[EûzÔ×׫X ‘w9Ÿ¬V+ªªªT¬F¹&~¶%$¨P‰¸'SR°]'µÐ]Í.´ðp¥›'¬_¿ñ½Õô²iÒ;ŸXìëA$ÙlƶmÛ¯?xð Æ]Øé«á†Õ*|ÌöÄDÍŸÃJ Ã? ¼±IžqÍ…6>ëbbT¨Ä}¢Ã<¨b5¾ÃçûzɳaÃD Ü6ÓÓùti`@øÕz‹Ñˆ¯gd¨TÑÌBð»ÇC$;ëÎÍáaáV›ãâ„Û…x®]»¯=uê:;;U¬Æwø|Àb_"yDÎ'›Í†ŠŠ «3f·ãB_ŸðqßÈÌÔäÖNÉ„’õë‘ÍÁκ4étâb¿Ð1A&v ôcô„Å‹#33Sñz=mšôΧûzÉ%2 áäÉ“ès!ШéPG‡ð1Á&~³n‚<ØÃ(< ûsr°9.ÎcßIâj\^þÜ¢EÔÑË ¢#¯JKKUªÄ÷è矲 Ø×ƒHžììlÌè"®Çóéw--.·** o¯[ç‘ƹ!!¨ÉÏG!j×½wî³<"¯¯Z¥›%°píÚ5«ñ-úø'¬öõ ’ÇÛ†;?Lýà j]¼ª¶{ÎÌÍUí¡w€¿HKÃ¥­[±<"bÆõÚw£#°NN ÷Źsq¾ O¦¤hÚÝ=>>«W¯V¼^›&=óÙ€%Ú×ãèÑ£ìëA4 ‘€uñâEܼySÅj\÷¿ÜØoŽ‹Ãå­[ñùÔT©så6Ìž“›6á_V­B„‚Ú»ÇÇñ»Û·%V@®µÛQÞÞîÒ±K#"ðöºuhßµ ¿^»»p!б <ÉÁÁˆ T}váîÝ»a¸’Æ€%F¯3H’““þD’¤¦¦"++Kñz=ŸO¿»}ß[¼™áá.Ÿt÷qÁüðúuü[K‹KW1"Ìf|&9_™7ëcc…Ž}úüyär&¡.ü¤±ŸKIqùø³ŸOMÅç%ÕS78ˆ¥‡+Z+²iêììÄûï¿ïjY~Égûzɳgϯî<•I§_»x¹¹n}NVd$þuõjüï•+Õ.¹0iIDATQÛׇS==8ÓÓƒ[##蛘@ïÄ''a6#ÔdBRp0懅aYDòfÏÆêèháÔð‹›7ñNk+–N¼×Ý÷º»…C²ÖŸŸ¯x}II ‚m)üϬââbÅkO:…Þ."ò"–[·náâÅ‹*Vã¾Cø·oãI7®<üAÉ„Çccñ¸~`kûúð5ÿë¾qéNççÃäEƒ¸·mÛ† Y›zÞ4é•O>ƒÅ¾DòDFF"WàjOII‰.†;Ïä¯ÎŸG£ Ýݵrmh;ª«]ºIê:×Û‹º~]ë2„ˆŽ¼ª¬¬T±ßä“‹}=ˆäÙ¹s'ÌĽeÃ2h³á‰S§Ð71¡u)3jöêj— “güíåË8ì%wBL&¶oß®xýáÇ166¦bE¾ÉïûzMOä|@uuµŠÕÈõáÀvÔÔ`XÇW…ê‘[U…›|ËY×&N|úôi”µµi]ÊŒòòò#0Ñ[6Mzãs‹}=ˆä±X,(,,T¼þÀ˜ð‚+B÷;ÓÓƒM'N ]‡;ôCÈ©¬tiP5yžur{N»r£:ž "²i²ÛíºyåM|.`±¯‘<›6m¬Y³¯÷Öóé\o/Ö¾û.N÷ôh] `ÜáÀ÷êêPTSƒ›MërH€ÃéÄ?44`Ù‘#øÍ­[¡=Aä%°êêjt»0ˆ|4`)žDÓ9Ÿ&&&pèÐ!«Q×í‘äVUáÛ~¨éՇʮ.,?rÏ××Ãî/ ÐÃݰZñÔÙ³H¯¨Àóõõ¸20 uI€åË—#--MñzoÝ4éOµiíëQZZʾDS0 B몪088¨bEê³;øþÕ«x«¹¿d ¾2ožK½ª\QÕÕ…76bk+ÇàøÛ##ø^]¾WW‡ùaax<6ÅÄàѨ(d†‡#<À³?Ã| Ìs|*`ú|_¦¦&VØ¥÷~m^ð१TVV ýwgUú›U«V!99Yñzo<Ÿ¦Ò2:Š¿¬­ÅóuuøËGÁHKCrp°ôïiEI[~ÖØˆ:ÁpZÙÕ…qÁ+mžØNVvu ßÓóK25Z­h´Zñ˦¦?þo AA˜ŠØÀ@ÄX,ˆ D€Ñˆ £Ñ¥9…3¼i*°>üðC|üñÇÂ5Ð]øÐÌÐ7ß|_úÒ—­µZ­˜={6_=%šÂ‹/¾ˆçž{NÑZ§Ó‰ÔÔT´´´¨\•6 VFEagb"Å£QQˆ úŒI§MÃÃhDÕ;8ÒÑ!ªˆÜ‘””„Û·o+žÊð /à»ßý®ÊUù.Ÿ¹‚e2™„†;³¯ÑôöìÙ£xmmm­Ï†+àî.ô|_Î÷õýñK Aê½ÿÄ"4 Á&N'Fìv Úl°NNbhr׆†ðñð°.x&ÿáK#¯¼Ï,öõ ’'==K–,Q¼ÞϧÛ##¸=2‚÷´.„H!‘Ûƒ­­­¸pá‚ŠÕø>Ÿy‹}=ˆä}Ö‘7‰ˆˆÀ† ¯÷–‘Wzæ3‹}=ˆä XMMM¸r劊Õ‘»¶oߎ@ç¹irŸO,öõ ’'&&999Š×ïÛ·OÅjˆH‘MÓàà Ž?®^1~Â'ûzÉSTT„Þ<ܰé›ÙlƶmÛ¯¯¨¨ðº‘Wzäw‹}=ˆ¦'r>õööâ½÷ø˜7‘žmܸ‘‘‘Š×sÓ$‡×¬¤¤$¬\¹RñzþáMÍb±   @ñúòòrLúI“H"o%²i²Ùl^=òJO¼>`íÞ½›}=ˆ$Ù²e ÂÃïçùD¤oƒAè%°'N ï¾~oä:ŸXJµµµáüùó*VCäÝDΧññq=zTÅjˆÈ]ÙÙÙHIIQ¼ž›&y¼:`EDD`ãÆŠ×ïß¿Ÿ}=ˆ¦`4…†;=zCCC*VDDî} ¬¼¼\¥JüWwr‹‹Ã«¯¾ªxýÛo¿­b5DÞ-&&o¼ñ†âõ|NƒHÿZZZðýï_ÑÚþþ~4Ý7ˆšÜãSÞ‰ˆˆˆôÀ«oé‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$‘d XDDDD’1`IÆ€EDDD$Ùÿ°XlsëÙ}—IEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/Fpsync.svg000644 001751 000000 00000005061 14745137273 022765 0ustar00martymacwheel000000 000000 image/svg+xml /FP/sync/ fpart-1.7.0/docs/www.fpart.org/docs/img/favicon.ico000644 001751 000000 00000001227 14745137273 023123 0ustar00martymacwheel000000 000000   ‰PNG  IHDR szzôHIDATX…í–¿KjaÇ?š6œ…8k"´F‹“"ÑR )Ò n9ŠÐ”ÿ@ÐPƒ"8$4)þ¥)BÜl0„¦ ƒSG »›Ýƒçà½p¡ážœ÷ý>Ïûýœç<Ãk¾øÁ0þ¤¹ è:€IKˆF£„Ãaööö888`uuU¡O&r¹²,Ç€étŠ,ËÜÜÜðøø¨¨I¥R,--Çg{šˆÅb,//°¶¶†Ífãýý}öȲÌt:Àáp oooŒÇc‰D‚õõuÅ™Á`Ñhôgp¹\œžžÎÖ¯¯¯d³Y­túý>ççç³u&“agg‡t: ÀÖÖ¢(ryy©¨Sí@8fee…““MÃE!I&Ó÷÷…B!z½÷÷÷Š<ÕD"Úí¶bOEgë§§'J¥’ª¹ÇãAEÅ øý~Æ\®*€ÇãQ´À`0`4~7ì÷w§ÓÉññ1f³‹ÅB¿ßçââ·ÛÝnçèèh1@ ÀjµR©TûÏÏÏœ©ñ0 xxxàóó“ápH«ÕšiÁ`I’¨Õj‹vwwéõzt:M3µ$‰ëëkUm{{›f³©ªÍ ¡Ïç£^¯ÿ•ù¢ØØØ P(,ØÜÜÄn·S.—ÿ™y2™d4Q,UuÅ/Øßßçåå…ÛÛ[ER«ÕâããCÓäîîŽÁ` ªy½^ºÝ®f­@„¹á¨V«š\]]ij“É„|>¯©ÐoÅ:€ üï¿Á^ÉÜlêHIEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/Fpsync.png000644 001751 000000 00000033754 14745137273 022764 0ustar00martymacwheel000000 000000 ‰PNG  IHDRÔÈȦv9sBIT|dˆ pHYs3±3±y‹­‹tEXtSoftwarewww.inkscape.org›î< IDATxœíÝy\Tç¹ðß0ನ÷ ЍÄD\0‰¨ ˜&i“6Mk—Û4Í­¹Mº$mÓÞÞ,·[Ú´IzÛ$í]²˜MQQ»"¨¨¸€ (*ÈÌpÿx51Vô¼gáœ3óû~>óɽö}gžÎá™÷¼ïó8t‚ˆˆˆˆˆT 0;""""";cBMDDDD¤j""""" ˜PiÀ„šˆˆˆˆH&ÔDDDDD0¡&""""Ò€ 5‘L¨‰ˆˆˆˆ4`BMDDDD¤j""""" ˜PiÀ„šˆˆˆˆH&ÔDDDDD0¡&""""Ò€ 5‘L¨‰ˆˆˆˆ4`BMDDDD¤j""""" ˜PiÀ„šˆˆˆˆH&ÔDDDDD0¡&""""Ò€ 5‘L¨‰ˆˆˆˆ4`BMDDDD¤j""""" ˜PiÀ„šˆˆˆˆH&ÔDDDDD0¡&""""Ò€ 5‘L¨‰ˆˆˆˆ44;_òè£bæÌ™ŠÆz<,[¶ íííRŸ´´45áÙÎPTT¤ûûN›6 111º¿¯Rmmmèèè€ÇãAkk+š››Q__úúzÔÖÖ¢¶¶¦ÅgsæÌÁÃ?¬xü‹/¾ˆS§N)µtéR$$$(ÛÑÑïÿûðx<Ge&Ô:úÙÏ~¦8QÛ²e‹t2 !!!HLL”žgG †$Ô£G¶ôß¡ÛíÆùóçQYY‰3gΠ´´gÏžõ»$û‰'žÀý÷߯hlmm-žxâ ƒ#"""¥ž{î9Œ1BÑØ7Ú:™˜Pë&66VjÕsÕªUFCvær¹0|øp >Ó§O455áèѣػw/Š‹‹ÑÖÖfr”Ær¹\˜?¾âñkÖ¬Qõ•ˆˆô7eÊÅÉ4à9j¤§§KÏÌÌ4(òE={öD||<âããáv»QXXˆ 6àôéÓf‡fˆyóæ!<<\ñx_¸ù ̉˜PëD懧¤¤¥¥¥FC¾Ìår!!! ())Avv6Ž;fvXº’¹žÜn7Ö­[g`4DD$Cæ^TT„²²2£éL¨u0hÐ L:Uñx®¦‘^ÆñãÇ£¸¸ï¾û.._¾lvHš9¤¤¤(ŸŸŸúúz#"""¥† †I“&)ï+9j¤¥¥Ááp(ï+?L¨5 ÃܹsÏÈÈ€×ë50"òw‰‰‰X¶l\.—Ù¡¨²dÉÅcwïÞ³gÏ )Õ«W/Ìž=[ñø•+WúLIX&Ô-Z´H*qñ•GdmcÆŒÁ²eËlv(RFqãÆ)Ï뉈È:RRR¤x¼/ÝÙPk$óh£±±ùùùFCô™Q£FáñÇG@€}.s™ÕiÀ·nÆDDv'“ÕÕÕ¡  ÀÀhº—}7ZZ@PP.\¨x|NNZ[[ ŒˆŒT^^Ž––Mïáp8‡ÃˆˆDDDšðŽ;÷ß?>üðCÃ>CO27ã'NàСCFCDDJ¹\.$''+ŸíSMʘPk0{ölôîÝ[ñx3WÓöìÙƒ7ÞxôÏ÷Ë—/×½Vf@@¢¢¢0tèPDGGc„ R.”HJJ‰'°oß>]ßWoQQQŸv†T‚«ÓDDÖ1wî\DDD(ïk÷p&ÔȬ¦y<¬]»ÖÀhÈŽ¼^/.^¼ˆ‹/bß¾}øøãѿ̜9‰‰‰ Õåszè!”””Xú IZZœN§âñ¾v3&"²3™œ¨½½ÝçrÙgs¥¥¦¦*[PP€êêj£!_QUU…+Và§?ý)rrràñx4¿gdd$ÒÒÒtˆÎ827ãêêjlÛ¶ÍÀhˆˆH)‡Ã!•åç磶¶ÖÀˆºj•¦L™‚èèhÅ㹚F²š››±råJ¼ôÒK8þ¼æ÷›3gŽÔ¥î‚¤¤$Åã333ÑÑÑa`DDD¤ÔwÞ‰!C†(ï‹9j•dVÓ`õêÕEB¾îÌ™3øõ¯#GŽhz§Ó‰yóæé•¾æÏŸž={*ï‹7c""»’mÈå‹9j•d~xŠŠŠt?ÌFþ¥¹¹¯½öŽ;¦é}-Y›ZæzjiiÁúõë Œ†ˆˆdÈÜÃ÷îÝë“ ¹˜P«0lØ0Lš4Iñx®¦‘ÚÚÚðú믣¦¦Fõ{còäÉ:F¥]@@-Z¤x|^^ššš Œˆˆˆ”5j&L˜ x¼¯æDL¨UHOO‡ÃáP<ÞWx¨û577ã­·ÞÒÔª5>>^Lj´›1cú÷ï¯x<¯'""ëÝë«÷p&Ô*ÈüðTTT °°ÐÀhÈß?~;wîT=üøñp¹\:F¤Ìõäõz±fÍ£!""2÷ðòòr8pÀÀhÌÄZRdd$ÏÈÈдšHt#™™™ðz½ªæaøðá:G¤žL9¿;vèRñ„ˆˆ´‹ŠŠÂŒ3ÏÈÈ00s1¡–”’’‚=z(ï«6È\—.]Bqq±êù#GŽÔ1õƇ1cÆ(Ï뉈È:RSS¨¼G /ßÙPK’y´QWW‡Í›7 ù³Ý»w«ž+SCÝHK–,‘ïË7c""»‘ɉjjj°uëV£1[Kp¹\X°`âñÙÙÙhkk30"òg„Çã‘j×}Õ€ ˆHžÌÍøÈ‘#8zô¨Ñ( ŠGGý‘Q@D ¢7à‚C€À Àëš›€ŽvÀÝ´µín ¥¨©.V—Ή×ÅJ ö’ÙÿväK\!À°1Àð1ÀÐÑÀÀá@x/ ¸'Òp-M€Ç4ÖÕUÀ…³ÀùÓ@ipºP¹»Ì縂ã€ÃÄ5ßw pÛ 4\ü=¡aâþÐÞ¸[¶ ¾¨«ªÏUgÄßí©Rñgv‚ùóç+Ÿ••åÓ ¹˜PK˜;w."""çj©µµ6l˜ôܨ¨(8S÷÷÷ïßwÞy§âñf^O0r<7pû`tœHF” —hPÙî*Ê€ò#âuìpò HxôÖÃIžOõzDfWA=€²¥Ø;¦mŸëÉ–Œv7Ðæ–ÿ¬È(`ê\àÎ{€‰Óný߸ç•_ký‡£b?ÿ¿µ4%»m9Àî@k³|cv$Ê +Võ^&ÿÄ‚™{ø®]»pîœnº¿jF…ØØØ[¼Âm584,¥šUáÃétbáÂ…ŠÇçää ¹Ù˜šÎ@à/©_3äím#w¹üœY)r•NÌ–ô üœ¢mÀ… ýcÑâÎyÀ/þôêkv$Ÿ·ð+ÀCß7;Š[›ÿ%àÅwžsR'&&cÇŽU<Þ_r"&Ô È||»µ&Y‹–Uf³j¤Ïž=}û*ÏŒº;Àwÿ˜–dÈÛÛÊò•C‚CÕð3ƒ¯Fœ< øÁïÅá@+ú¿X÷É…3xâ%à[?7o‹Œ¯øÂ¾ 5Þ_r"&Ô È$Ôååå8pà€Ñ}F¦èõÌJ¨e®'ǃìlÉZc }á_€Ù‹ ykÛéìT—<ªYõ5ƒšÃˆ—/¨Û c”˜8QâÐiñÚ\KŸõ𭤇 xú^ïz‘¹‡?~GŽ10ë°ø¥i¾¨¨(̘1Cñxù&FÖЧOÕsÝn#t––¦xìÖ­[5•ìJÌ$àÇu[´»E´ÚK@û•Έ­ÍâP›Ã!:ªŠŽŠá½E…«ìáÌ_ |é_å9Ž/^'KŒ‹KjVM7®4¦™Ž†?yÝZUºÒÃ<ùàGZã0gHOàG¯”÷’æñˆ/`õ—¯tDmÝRCÂDµŽ>ý>kžcwýúõôiÓ_¹r¥ÑX ê[HMME` ò¿&Ù+DÖpÛm·©ž«¥äžZqqqˆŽŽV<ÞˆëÉ|ç—ÚOõ{<@i!°ÿÑtåüiÑJ\vkzdѾ|p40r0:V´Šîî•ÈÆ:`ÛZ`ιyIûwcbÒÃÕ¤_†×+ªŸXA`°ì·¢]¸Œš ¢ûÞ±" ò”h'^{ è¸Ò;8T$è· íÈÇL&ÍÉ»VCc€ä‡€ì·µ¿—N'ðäoõM¦½^ t¿ø»=º8sL´¿Õ—¯. ÿPÑþ}øX`Ì$ñÅ^k•žî–––fù†\faB} 26jjj°uëV£!ú¼#F¨š×ÚÚjØA¿›‘=`D©¥Ämå§ÎŸV½l[´4j§®F¼Žì6\Iâ‚CE7C´;ﯼ¾&ë?O¨g.þïwÖ휨ê0âVàb¥þ±¨ñð2å% [š€M¢éϱ⛹km¯ºjàø`Ë•K-&N”Á›>_[öïÙ`b³¯?#êÉë¡üˆxг-GüÉjsgދ׶ñgA"©ŽŸ L ©O¬F’mȵcÇ£±&Ô7ár¹”¤üÄÒš5kÐÑag\äÂÃÃÑ¿Us««UüFÐÌÍøàÁƒ8vì˜þ1|SݼÚKÀÿþV¬âÝc¦µY´Þ»øÇKb…uú`vª\WCYÇŠ²¹òrWüYí þ0âz‹ü»Lœ.V2oÅÝ*¾ä­}hÒØüôX1ðǧUãÇŸ†Q÷>=#€ùÿ—¶xÔZø±J®Õ±"ࣿû·È?}º•Žvàðñzçe`È(Q;q±Ø&b5¡¡¡R ¹²²²à±Ê¾©nÀC‰7qï½÷"<<\ñxz´Aæ›4i’ê²y••Ý¿ü6xð`ÄÇÇ+oÄõ4f’xä*«´xú>`ësZŸ,¿p¿øý“@ñvã>+÷}ù9V=œ8s‘|i¿ê* °À˜xd|ë&CÅÛ¤ýE{2}­²àÙ‡ÄϼZɉ=ÄÝmèhÑE‹¦±•égˆŸ‡î¨2zöð΀ǓÄu~dŸñŸ)#99¡¡Ê}ø[NÄ„ú&dVÓÜn7rss Œ†èód†\¯¬¬LÇH”Y²d‰Ô#nÆjV+ËJ€ç¿-™Íãvæ‰x~ü °#Wÿ_ô[³E2!CÍ>åî &ÑWÓ9Ò bõ÷…ï ª•ÝÞüù'b«ƒ½ú óõéVœÀ/jKäOž^"žº˜Q®ßë×ùs?ý2°ß";Ieråååõ0¡îB@@RSSÏËËCCƒäo!"•† †1cT>‹…9 µÌ͸²²{öìÑ=†‰ rãÛÜÀž[0¬¦ì0ðò€=ùú¾¯»(X-?Ïj«Ôª#®0&=uz¿ýxÿUñúYâ³íV7Æ]ù¥û¾-ßóZ[×Ï}M<©°‚cÅÀ‹‰äúòEóâp:HIIQ<>77×”s:fbBÝ…„„ 0@ñx{´Aæºï¾ûTÏmmmÅéÓ§uŒæÖ"##q÷Ýw+¿jÕ*Ý;9Fô–?ô“»\B´2#VÐrß—ß™‹¬SP—àˆŠ V÷æóŸ`íðÚ³@³ŠC¸q3€Ð0ýcº‘ÞýÔŸ‘Ä!Ê??#Ê_ZÍ‘}À%»wÏš5Ë ¹¬Œ‡» ³šæõz ©F §‰'â…^0;Œ›zùå—M;,g'ñññ?^ýLqqq·ž]¸p¡TWG#nƃGÞz?êõ¬xЮ;TœJvîR>çêÀ —l,²ìðß{í;¢Kw»tN||x™Ü¼ ¢ÃãÕÊFzà1õ]$wo^ÿ©ñ+þv%ÛkÍ ›ïmŠ ud~xvíÚ…sçLüꨀËå‚Ëeí‚—N­…ý@TT¾úÕ¯jzÂÂB¢QNæzjllĦM›tA¶¾îÅ  ²\÷0l#÷}¹„«ÂVH¨ÕF¼t(ÜbL*šÉw‡ñ õÀáÀ=r±?Uqxõ{ì7‹ÌØmÛ¶áâE÷§˜„[>n &&cÇŽU<ÞmP÷ DzeˤNY_¯±±Ð1ª[ ‚Ê7RfggÒű—ò§•€3'tÁVvm¥eŒš mÿª^TF\aN¥<À_~nnÒçn$eÝ~‡þ±\/õkêš!µ¹ß-³nu+ˆELŒòâýþš1¡¾Ùý©þúÃCݧoß¾xê©§T×¾jÓ¦Mhoo×)*eæÌ™ƒ^½”·y3êz’ÝßkfC +ðt¨Û§›¤¢Í·žÔFôx¬Ó±+¹ï§õ/Ë.mS†üœa£åŸÈf)?/÷9+þ Ttÿm[‘mÈ•™™iP$ÖÆ„úd~xŽ?ŽÃ‡ ù»)S¦à™gžÁÀ5½O{{»![)nEæzjooÇÚµk ‰£‡äÞJ‰îº>+ïCùUÛY)æNœ§"¡ß·I´ê¶ª67ñ¦ÙQ'sårsÀ h#¢f¥¨KØ+Ê€ÕÿÐ?_#s/))Aii©ÑXe\§_¿~Rõ}W®TY “èˆÇ{ =ö´“_·n]·—vt8HKKS<~óæÍ¸|Ù˜‚ÏÉs˜½o3$ [©>ìÝ$7Gí@=¨]©Ì³À¾ï›ÙºÆÜ’i×Ûÿ‰üœÁ&ÔóîW7ï£×E·BêÚ Aƒ0uêTÅã32T<Âð<”x´´4©ÃqÜîAzr:?~}зo_ :#GŽÄرc¬²îS:;;ñöÛowûÞi@~ï‘å'eØEöU.ŒlómEÛ€ª3@åß‹>=œXVb\\7¢æ0↭]*íÒ9àh÷湩“‡äçôÑvü£KSfË—ÃDùA+Bµ ™{xUU•! ¹ì‚ õ5BCCqÏ=Ê—b²²²àñ÷å+?òØci®ß€àà`8În+c˜™™iÚ>™›qaa!ÊËË ‹EMS„¾ Øií„Ëh^±JýÈSró’Þø•11ÝHôx‘ÈËðtXoõ÷zV,åw¡B<¹‘©tÚ+ʘXîPÞ/êSžàcŽjø”°°0Ì™3GñøŒŒ xýø[ êk$''K•$óçGþH¦R…Uìß¿ÙÙÙ¦|öðáçx¼Ñ×Óiçdnuw3ÿ[÷pl%?øÒ@ÄwÀY)Àÿý®ûÚ¶«©.²g“µö&ßÈ >íhûëû V>'¢þq±Ê<}jÿV Á˜£>eÑ¢ER ?þžñPâ5dVÓZZZ——g`4DÚ:to¾ù¦î-¼•Z²d‰Ôx£oÆÕUê*9<ò”¨qëÏ.ÛsåætçáDÕ‡Mè8(KÍöŠîÐT'7>B²ŒƒGª«(³w³þ±ø"Ù†\ùùùFc}\¡¾Âét"%Eù977ÍÍÝ´ô¢ƒúúzTTT˜ÆMµµµ™‚Ï(**Âßþö·no1~-™›ñéÓ§QTTd`4BáùŠðè‰Ó€ÿùÿvOÌ]Ì^,7'éî9œ¨æ0bÕY Ø‚«¿×jn.VšÅ5K6B‘yº¡Tô8uóîÔ7_„… *Ÿ““ƒÖÖV#²>&ÔWÌœ9}û*o¥f·G¥¥¥xã7̃ ÖÙÙ‰ÜÜ\Ó÷²õéÓ‰‰‰ŠÇ¯Zµª[VÒw®W_bkÊl n°5Xÿ>Pj|þo)¥E@ù`ÄíÊ猊IO™Á[øUFüÈú{ã«N&=`º¥VÙ„º‡þ1¨©îqépþ´þ±øšÙ³g£woåì–[>®YMóz½¦íK%êJmm-^}õU¬X±Âôƒ!))) Tþ}½»nÆW+V¨å îNžøí ýÀ º…gyëUl‘P“ìÊPs±£Ýú‡k7›in”oDB=|Œü£¿Üù ™œ¨££Ã°†\v„úŠÅ‹•?Ëüä“OPUUe`4DÊy½^lܸ¿øÅ/pðàA³Ã w3®­­EAAÑ|¦Ó ¬ú»>ï5| ð•Ì^É{­'Í4·K Ñ¶dÉ'R³ûw¢æ0âî@]µþ±èÍÊ&e›éC_Íc­Ð¾Ýdr¢‚‚TWÛà‚2·|ˆELLŒâñ|´AVÐÑÑ;wbݺu–ú‚çr¹0þ|Åã׬YÓ­5²7~ ,ø20Lù%KGiKÅËãNJö%{cE@£ä.«jm V‹¿?¥B€™ E½g½ùjgÄ«ÜÞ’ê5¹b¬Ã!šºÈ:{\ÿX|Í”)S0bÄÅã™ L¨!ß|"33Ó HˆníÒ¥Kصk6oÞŒÚÚZ³Ãù'óæÍCxx¸âñÝ}3özמÛ6Œx ít1“Ä+ý›ble¹H¬îï±÷ÁÆõÈ%ÔÀ•Ή$Ôj#ž? ´øaÄ«ÚÝfG`]½Õt¼t^ÿX| s"u˜PC¤¤¥¥* Ú©äõzqöìY=zûöíÃÉ“'Íé¦d®'·Ûu뺿ÿoÙaàï/ßù¥ñŸåpƒ£ÅkΕJ‚—/w‡®¼ªÎ‡^Î_ ÆMU>ǨÉj¶{ä}h݃~×ó˜W¤ÇòÔv^¬µð6«¹‡¡¬¬ÌÀhìÃïêAƒaêTå¿øhƒŒÔÑÑóçÏãܹs¨¬¬ÄÙ³gqüøqÛ”ht8Rå'óóóQ__o`D]Ûð‘XåzxY÷vï~@bªx¢4Ú¾ÍÀŽ\àð^ë·DÎ}_.¡Ä*µž£Ç‰D]FG;°)C¿Œf—Äß ²O&®²ò¾t+6l&Mš¤xjkk ŒÈžürËÇäÉ“­x¼WÓˆŒ‚¤¤$Åã³²²ÐÑá»=•ëªÅžÝÿþOàÇ_–N^|LÔ“®0 Œyp¨hLc&Ùm€|r<âv‡ÝÀæÕrsÈj.¨û¢Ô»Ÿþ±ØÝÔ©S1dÈÅã™ݘ_&Ô2«i°z5ïÈD]¹÷Þ{ѳ§ò>Àþv3ni‡÷Þyø·ÅÀ²±ûÈ>ýVN'&wÜ­Ï{©qdpªTnŽìáD5«ÓÛsÆ:ùyd}ím@½ŠÆµ‡ë‹ÝÉ6äÊÌÌ40ûbB} EEEìŽGt2×SKK rss ŒÆúÎCž{xr1°ê-}*P¤}Cû{h±þ}¹ñ2‡]!"—ŽIÅÊ9ÙGu•üœ¡£õÃîdîá{÷îÅ™3g ŒÆ¾ü.¡6l&Ož¬x¼¿­¦É@JŠòL'//MMMFd/çÊwþ<~/°ò ÑÒ[­qwƒFè˜ [²Äj¼ ¥«Îj#ž9eWdŸV©b­kØýã°³Q£F!6Vù^*æD]ó»„:==‰º9üá!êÚŒ3пÅãy=ݘ»xïÑþ¼â¤ú÷I˜¯_L²ZšDR-ãêáÄ[Q{‘|›š¦KÑ·«k[î«d·ÀòÞ5¿L¨•ª¨¨@a!—8ˆº"s=y½^¬Y³ÆÀh쯢 øåRàì uó'&è¬Üåòsn•,¸]$Þ2Ü­@¾ø¼2 u ¯,v%s///Ç ŒÆÞü*¡ŽŒŒDbb¢âñèd½%¢.¥¥¥)»cÇœ?ÞÀh|C]5ðòŠB(£b+ѧÄéc•Œ[NTu1hjŸGöRvXÝÁÞ‰ÓôÅŽ¢¢¢0cÆ Åã322 ŒÆþü*¡NIIAÊ»ðÑQׯ‡1c”oHäõ¤ÜÙ@öÛòó‚C¾õG†žÕFävÿÐÜ(_˦'³c" úq*oGÂ{øÍùUB-óh£®®›7o60"{ãÞ;c©M o¤o²¶¯ê$Ë™Í{àÆ>k‘üaÄS¥@i‘ܲ¯}òsúÆLÒ?»‘¹‡×ÔÔ`ëÖ­Fc~“P÷èÑ ,P<~íÚµhkk30""{“¹;v G50ßsîPY.?/2J÷P¤t´‹vä2bâ€ácÿùÏ»J´o†«ÓþEMB ÷ܯov‚ùó•Ÿb^³fO7äÒƒß$Ô÷Üs"""çjQ×ú÷ï»îºKñø+$3,œ–l–È5K1JÞ‡@§WnÎõ{¥UFl¶°ç„_9~@]òÄT j€þñØERRréÌoj™Õ´ööväää ‘½¥§§#@âôoÆêÔ^’Ÿ¤².Tˆî2S?ÿe@ÍaÄm9b_-ùN¯|¹F@\'iKõÇ.dr"·Ûí÷ ¹”ð‹„Úáp 55Uñøüü|ÔÖÖ‘½ÉÜŒ/\¸€;wï’m”­ÍúÇ¡F®dçÄÐ0`Æ•]y®`;#’Byª«ö1ÿKÀQúÇcujr54°lέøEB=uêT 2Dñx®¦u-,, ÷Üsâñ«W¯†×+ùüŸˆ$S–š$Ü…[€‹•rs®®JÏX ÿï^~D<þ'ÿSY”ì–Ÿç ¾õsÿ«ø‘€”ïwaN¤Œ_$Ô2«iÈÌä&<¢®$''#88XñxÞŒÕSÓJüÒ9ÝÃPÅë•? xõp¢ší\öoÙ福7~*ú5}c±:Ù†\YY*öÔø!&Ô×Ù·oΜ9c`4Dö&s=577cãÆFã»\ÁÀ˜Érs:½@e™1ñ¨±q…¨ú!cé3"±–ÑÚ lÍ–›C¾eÏFõO(¾üoÀ¸©úÆce2÷ð]»váÜ9‹|K·8ŸO¨GŽ‰ØØXÅ㹚FÔ5§Ó‰… »èÂqëÖ­Cs³ù›z{¸€°H³£“,_±£òÐæ6&5êªyrsÆ«Hl>ÉZxѯuvï½¢n®Ó <ý`hŒ¾1YQLL ÆŽ½AÊ.0'RÎçj6Ÿ ÒObb"úöí«x¼U®§ˆ>Àk¹À—Ÿ"z›Í­õp÷G~^ñ6ýcÑJöp¢ÜîAp`P¤òï <÷–µ):tÈØî»ï>©ñV¹‡Ûêk”——£¸¸ØÀhˆìMæzòxa¾ØžfÙ†\;vXô‘—EùlBír¹””¤xüš5kÐÑÑa`DDö&s3>xð Ž;f`4Ɖ'^>Ô\{€îާn®±z?[üí¡íýÞ~Ùú‰åúôO¨eë\“ÿh¨þóqàùwÅÓ-ÆÝ!^5€¹Àî ¢DŸ»UÝûˆŠ"ãîÆÅ“g‰/ÖF •jÈ•••Çc`D¾Çgê{ï½ááʯ">Ú êÚàÁƒ¯x¼¯\O}ú3‰ j*Ÿ+ΞÝÙj.—/ŠòpMõ"ÙnmŒ]Á"Qî,*‹ !µ ŠFŽ‚\úĸ#W¬þZ]ù ´3IŸ÷;~@™Pˬ¦y½^dff ‘½-\¸=zôP<ž7ccÙüôaQo׎ֿ¯½R†ô‰…üË©£ÀOJü‰lC.;Uh²¿O¨wíÚ…sçÎ ‘½É\OØ´i“qÁø1XùðïßÐgÛ„YªÎªo ÇŠÄG"5Zš€?> ¼õ‚8Dèd¶ÀnÛ¶ /^40ßås uLL ÆŽ«xŒØP ¼ó¹9G ‰E»7—|ì×Je9ð×_ ˜@X/ ,â³.l=#€¶VQsÙë t} PY¬D5Øgߎ`îäçi9ÈH¤–×ûYò»nùgÞ[$Ö½¢D›ñžWZ‡‰Öãâ>ÐP4ÖŠýÚÕUÝ{¨Xæ^UU…Ý»wïó™„:44óæÍS<>++ ÇÀˆˆìmÉ’%ŠÇ¢¬¬ÌÀh¬ÅÓÑu²M7;M¬üËhjv®7&"5.[ûËqXXæÎ«x|FF¼^<°Ñ,pGÉÉÉ Uþ †6ˆº6|øpÄÅÅ)Ï뉔šw¿üœM<ŒH$cÑ¢Ep¹”—1â=\;ŸI¨em´´´ //ÏÀhˆìMfuà͘”‰è Üyü¼ë ‘/“mÈ•ŸŸo`4þÁ'j§Ó‰””ÅãsssÑÜÜl`DDö&s3>}ú4ŠŠŠ Œ†|ż€ å]ìˆêgŽ‘/ ÂÂ… ÏÉÉAk+iå õÌ™3Ñ·o_Å㹚FÔµ^½zaÖ¬YŠÇ¯Zµ ¾Ôu„ á’ŸÇΈDrfÏžÞ½•×üdN¤ŸH¨eVÓ¼^/²³³ Œ†ÈÞRSS¤x‘P/^¼XñØmÛ¶¡ªªÊÀhˆìMæf\WW‡-[¶ ùŠE_•Ÿ³þ}Q~ˆ”KMMU<¶  ÕÕÕFã?lŸPÇÆÆ"&&Fñx®¦uÍår!99Yñø¬¬,´µ1ã¡›‹™LL›ãéò¸ÝƒHÊ”)S­x¡–m>±zõjƒ"!²¿yóæ!<<\ñxÞŒI‰¿+?gG.PsAÿXˆ|s"óøUB]RR‚ÒÒR£!²7™ëÉívcݺuFC¾`ìd`²ò3®ŸÊyOÿXˆ|Ì=¼¨¨È¯rÍÖN'>úè#|ü±²"¥ÅÅÅGDdo;wîÄÉ“'­ªªB}}½Á‘9À·~.?¯¬8Z¨ 1 LÂ'Y@IDATx윤Eµ·«{f6–œEQÁ„$É,A@Q1€~*ˆb")(\½^½.^½  ¯Â &rÚ%KRAP$©ä´iBÏSýVÓÓÛÝÓ3Ó³ì.Uó«©êz«N:•þï©z«BÈ&K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K  ”:ˆ“£,E¨Ì ½a­P …J¸·ùp(•ˆ—M–@–@–@–@–@–@–@–@÷$P©ŒÂº—U¦”%%%%%ð¼‘@ïó¦¤ËpAII5p|صÕwn¹ÊÅ" ì =ᇤ»­W¹4+ø(›,,,,,,.H ¬.±S¬Åg&`Iî訅ŠK}€ª£J«„W†§àªgQÎÊÆráК2ÜÈÿ{°b® °B6YYYYYÝ@XÝb‚ª°f"Ý*h‹Ä7 µI6öGCáqÁUeA˜‘IØÆ¼ü]éõÀÈÂ˜ÑÆ‹Ä‰Áù_–@–@–@–@–@–ÀØ$ÖØä6b*—ÝÂŽØ9aˆå·ÁpγI]² œ{É£§]Á…A«úÅzÙd d d d d d t[`uQ¢T¹Ü†F¨´/ ªXv«¦ô„MYž{ëp–.Ž}OMÀUK›Ie d d d d d ´’@X­$3Šp5Rê…й)îeª¦³@·%á»¶[ÏPxEiUB kóûÂðù¸\8aš¬Q°Ÿ£f d d d d d tY`S µ/ø\óûjX>L¯ƒäž„ï ¸zEij|…ù„>«„m*§†5AV¯ìÃBÝ9QÓ5N.rò,,,,,,%I`£6â2Z«Ê a È|%Öଗ…©)]óPþJ`«¡ÐSê ë¾OÏ‚•3ÀGä¤YYYYYK¨9'i åsIe«*¿¾0 põÁÒráe¸C‚ªÊBìË…n:/ÅCÜV>úˆ0Þ ÄIêKjÁ2_YYYYYYc—@Xc—]|— ÷¬þ›¯ò4ƒTUO¡*GÝU}@*–w|꘰:n¥rv³Óªêd–@–@–@–@–@–ÀÒ& °ÆQcn» ߊÚ)> »©úmeJ‚°ROxár“¶1ÒíÀ± 2m ·æq‚¸Éd³²²²²ž?Èk¼u½Rõ«Ážr˜]”ª»Úâ—„MH{úáYG {úœ3²Ô‚5‰;î ¶jBr7Ë™@–@–@–@–@–À2!¼É}¼Õ¸o`•  ž®`û»€P¬&Õ™¹LÂÌʆUJŸáà†sاåÒb6YYYYY‹G¥}öÙ§üÐCÅ×ívÚ)ÜvÛm•sÎ9'ÏE]’Xã$-3î£ò`Q4Qç“ÞI¯¡©~;¸(ý6À»L¸!_z¤Ã¹‹FéNˆ½¦­«;Ùd*YYYYKŸ†©Ù³g/}%XÂ9Ϋ‹Ä2áÀÓ?X&\ƒåBßši±Ä=ý,ö¡çr™ð\î)dÅpâ®Ïéb3©,¥YñM}Ö¬Yѵ ¼±×ü©`›l²I|/!^z?InŠ’Ý,¥^h¯zV_}õsçÎ-÷õõU&Ož\Â?xÆgÅø%a<˽ULJsJÓÂ;8ªÁo 9”¡©(M ½€±?•懭JŸOT¸»ýX­ön5%’ëÓr&×Uhƶ5*·¯I/1¨÷Šõ‡]JG„Ëü’±¸Ú'‘Ìn–À2#J¥R:úè£K`jÒ%Z•4åÂX:±Ž*}kÊùI–Às#•Ë€úЇ6*—Ë¿Z@õ ܬˆ½»û·¾õ­'R¼ñr™úÐXúOJ+KãÒåóJƒ%ážÀR·ÁD:nAºŒÀç÷ †wДm36ŽÓ¿&,…—†¶æÙX÷a `5ЮýÌ3AMÙóü•sG|¯u‡øÃ}Ï<óÌÔI“&ñÒ>yLMüàgß °O3ÉÌe€¯õIÚÌ™3{YJÉç×=ÛÓ2SrÚø$ÚûS¦Lé]¸páj¸aÞ¼y/ìéa-¦KÆ>ƒ©õ!ÉÒ§&Ý}÷ÝÓz{{'Ócÿ#N¹¿¿ß>Ú?88¸€tOuÖYóëûŸ€Oír}X—Øœ02Ï€¸êõ‹=%Y¯ñéšd‹ãXœfêa4D«¶[&Dë5È5:=Cóâ2á^Ý5^ Bª'»N´ÛLfzY$ⲃ1€ê•d±7ƒ¸÷€®ÅIJêôéÓ—ç÷rø§ÖË ÇB~÷óûž=Bºûñߎÿ:ž_‡û~8П}öÙCüÎÝ d³tJ€ö˾áÊS€«•pçâÚždu¥]ÛÿÈÃþ÷2è¾™<^ÄïµxàÕÀU+¶üÀÀ÷žDeD/`O ¶÷i\ûß½¸·îêùóç_ûƒüà´Xº½Ø¥â%g™Xñ„£Yó8„ãà ªrM¾øûc×AÖçÙs5‹µ·#Â_Y¦»†|Þ œkßPÙ¥Ú…» —Cûõ´w–ºx7aûÌiºÙd ,Ã` w¤ƒöÛ—_~ùÏ3Ho¾J©p›ÂPtõkø£$ w5âù&¿of0Î= ø¿ä÷©h¶þh<ùàbÂü/K`)“í»D»Ø_0tië½3fÌèJIêúß;é³ûŸ}PcÿKÆ~…åîÒ‹áo Âßð h×n¡ÿ}ÿ7èwó»µ|™ò(·kªÀ‰bpò‘–Õ=pÑB°‹;Ø¥¿¨¹úHè¯|5,ÏáŸß “Â÷ZW©, ùºn(L otÅ·P7½wGî&”VéãáϽ–|5Ã6øÅÿyz»'eñ µ+€pšZ5ŽlXæê¤VæìÉXŒ`‰bXßöM3hÒ=ƒzcÜm ßw;öeénËX¾oÒ;0 ŠÿzÞ®{°öæƒÿá~Ò~8 ë_ ~¡¨›M–@–À³Hý/½€4ô¿ÓÐpmB_ÚéÛßþöL–ÝwÃîzÇwì…­yÉÙ–gGÒo£¿ºÒd§-&ðš­}ðƒ\wIY]["{V¬Ï¯þ¸ÔÖ¼W~£<-¼ª27òä¦8ÉA—æ*åðå…_סåºÎ¥BÀÏÇee+5Z%­„7@°õàËê˃šW‡yasÜ+X|jP6YY!bâöo|ã÷7¡?°'°n°½š%Àã|ðÁ2  íÕò,_¢ø;gñ&}!q~·ÓN;å¯ H6Y#I@mæAúsî°y×/t±®½i¿ýöûîWé{‡ÐõT>Ld±'k]6ãû‚ó1@–J ‰6_-âÁse–€¥æª¶$xbø’þgMM\YVL*kOˆÅrá ñih¹v,}*2Àé猗?Ø(a*ËѲÄRãP:nðvA¹5Se ^«» Ó2ákˆac¹«Æ­ÖèFËCGñÇ#;Ê"GÊXR%P,ŽÈžà V'WßáÍù`û³7«ÂàîÆÝõ°¯Ð…¾u§‰aDÂh©deÓæV[mµZL4hø•â¨Æë󇆓Y~ý³þa¼©Íx±|ÒÐÅŽŠ—D <ŒåfòV>Þµ(S-˜²8¾j£)èÄ ?…éš·uaÝè^~ùå"ëŽóJùXîÆú•>2uýš®•1?òŠåjÌÏßc‘U«¼ÆÞiÿ[e•UœÇÃi§v'/8ײr€–u0„ßÃI_èód’ÌÓïä>ªv—Òé¦6X†¿£º[6wùYxΠúßʉáD4S<ñÙBKPctâqzñ_ùz¸¾ôÉp‡ kÜû±6*/Ä€«KÑ”=Í2árm— ýšpJýX³ÂëW¸c¾°È)6òÒ'­C'„à`flÛùÕn‘ix=y¡K<Œ\û-Å’d d 4HÀ2ûõŸ‹pÆ÷ÒZ­Þ¢WmˆÛô'‹^Ò¨!ï7ÂAä Ú/ ­ÏO—>|>ë‰ñyôÑGÿÊ5êu“~Ë Túm´‘‡¤–}Ëg˜àoˆ/³b2f¾ôþ÷¿U¿ÞÂDЂÆî@¡|8©'ËÇÑSåaÚ´ižmTbÍ£.ù¤8®å,NÉü¢µð~¼—!“â*#¼%OÚ¿bþÍÆß 9¹vrðk…e§Ø ½‚|)+ʸ‚¾ J°&øuÐZä³9vM¢N"ï‹ùâ펂‡(ÒÔŒù†ã„l Ë[”#âoU°Ö¯çªýƒ<ÿtúé§«_'ò±=‰_¢ÇvñÑ~ô…ä÷~¯ ßóÉódÿ§ï|ç;X¶iºÂ;Ì鹋V|¥«¼a–²ùQJ(¾XŒu‹|WäPÓÁÔæ¨âA.µþ'eoÙwÚ”®ràzWã4Û‹ñØ`߃ŒŸ¦þk“.>rÐX&ŒÜãÙWŸˆ;ž> ¸zÍ‘àª}£Eƒ¸òÚš]ÂJaVFZr£dHµCLiÐJY/Ò)‹,ʹìnß”³æ]& aÇgUØEœQ;­25¡œ Kày.bW Õo’ñ0èÆ.†Û|å³2sÉ­'6ìîÉä}ÁõØ+™èÎÌ|ðq:îY$;Ÿüל¨=‡xŸÁ¾ÀÉ× "MŽÏ’Žš’8ްtÏb¸“ üÜßòû€®xÎ^³´ tâ 7¶ÍàãFžy6Ø XO®ß߸ðж¬<¼8)‘ÿyðq@ï:hÜFò 6«I§/DË©\‘Ñðq*Q¯ÇÎa’ü ´¾ ­o ¯@Û3“n@6?TìDœxG]3º<‹&ñèùyüz¿†ÖÐúŸ8`²‘ˆ3°ÿþû¯ÝcùyöÄûGxœ‚Glà>ÊEd`¾¤’ÿC9d}Ò{5õx-yü¯õ‹=r|{žuOœó±ï–¦éÚñnœ“å4ú×~Øs)˯Éó"eßgçIw ¿oàùO±»š—´Ÿõ½DO”Å:IÀh=<—á_ Ö ëX'¸¯!ü&Ê~+þ›Çïø}_¿ÞxЊm\;C¼ØŽ?üðÐ:Ÿ:ûîØßBïÐ}£éGª³H¤]FKÓ³’g_¹Ä÷‰p#¯YŸUQ¶ãJày§bÏÔçØ˜¾{kÝ({¹.âÐѹ¥rL­s‰ÍùC€¼I¼Ɔ÷àÙd d Œ_éTjÖå jŒí¯ñg|‹n–K1PÇ%7€À–Lp9ÁÞÇ`­fc“­Ç>x¾Nÿ4‰³q¶Å~ º×“îSÒrrˆÔçE¸L8ázè˼¹O!ýÚXï\T´K}ü‘ü”ñ S§N}“òÐXzÒØÛtä¡¡åТÇx”mSÒ¿Ž ~e\+üàgœqŸÏÙC5l,´LPÀŠXÁÌU¤=៌ˆ< ܉T­‹_’•x¶.òy7ü^NšÓø¤z3ù˜_ƒ)#—Iðµ.Ú¿f{å_µê^MØÀî')Ã:Ö/yzÍ ñã¡:õû›¤ë$›@ |Ÿ×Ã×,øÛ ùùÕiâ]P3M5g«gòøi.n(‘&ló³ìºÔ…÷üm‡÷Jdõ}x~y®î3ò±1-ÄõEøÚ<ß—|ýXã,¢¨Ý|w°HØc\N—ä³>Î6¶ÊïÍ ^wõ7Ê%÷¤÷Ñú Ф:W¦¬k*gÛqÿŸñ>ÿùϯeû5ŽÆ%W].…ß<¶$¿å µ2\ìûi Wùܽyº­Ì2°ŠBF´[:<œ„Ÿrr»e´‘µ3=—Pžáü©•cÂê ¬µKÔö™wj ¿*Ý tÒ$$Ôýs·X|F~}:2°8®ú6‚Õe–½YY£–@ìŸ ²)í^=Å€ïÉï‹ ¶L€µ%+&µƒä¯d€ÞÚI{“-£“C¶ÛW¸=ÄuRžïäο“þWôÅÒÝjh׃,µ7qB`àÿÅܹsÝ€¯ñj '¤-åÅ Ó ¡àUpçó]3”m4.ß¼˜ä`hÄI™ø;ÂK,þ~ùÀœã?AùÕÆBü\AC_NYAÎñ¼#Ò*Ÿxϼ`»„Ìzc ùU”£ùæ &Õ_¢‰š¡|š•þ óé,“ó3 <üðÃóý”°_B{øµ~æó,F0²XdHMà w*uü_¤=ŽúZ]¾Ä6Ö¯` üeÊS¶\ÆAÎZûzÒ\Nù7µŽ”GŠßÄUWâ^½­ Y,´Î2KÆvU2Œüw.½^/j]’–^ÜÓ=Ïý?*Ác_±,mýE9V¥|j8“LÌÒ®KeãùYž3l¿ÔW?–æÁñ®Ôïº<«PW#Í«¥o~ó› 3ìe~È7öè)§³É÷nóµ­µ×HµK»D>«_ž “ÃÇø¢ð¯œ‡åׄmAazÑ4õÈ6êÿU:ÔIõÐѸ/\P«Ú’›IÎ-ùÕ®¼yÿý¤/“¶1=Ž{¥)ý0Q ½–Åe5žŸØØ” qé)ÿdÜ{‘Ïqðð.èíÁï½ÕÁ„ýœß%x2ÎBÒô#Ÿ™¤ù®´  Òtü$ÙB¬Ñú ·g¥•VšNþ'ÒÖƒö\ÂaeòèM"2°>j@¾#hµ}þ'äÿ.Ò2/´~‰ú uù=x?<Êû<;€°3ð?Y´AÒx:ùºÐ?›º]KyHÓ¼M"¸¢=탞{ã²ë¾«GmC=÷+ÈëÛäûkâDpÊ2íez3urœôáEÐP«Ã&Úg¬›5×\³À­eÖR~y©$p…L>M9¡,²ÕO]L¢¾ÿ„ü\Æõ¨•È»G>ø›¢ü’2?„<ûøÙ‡<üem~Ç¥rã´3ÊÚ¤ûævV>Ã&#Gåõ¿$-—þV¦Rn•f‰d ÄýX ÿdÉï`6²ŸÏ.‰^—á`¾i§+ Õ *Oï$ÝUQ V_{ÛUá‹CG9 âBö„ý;Ë„“Úðµh,Ná€Ò]ÉçfìØò-˜Œ­tT çÈYYp l~&¦—8Èb\¢òÍöÏ à¿7 ðú¤äYÚ;€4_*f'Â^{ÕÍ ÔŸyüñÇ/1žiê Ä7#¿/wâºYaRYÈ$¾îwˆûæ"˜ÜûãXáÁŒ3!]Äôbé1‰ú¶?ƒü·àç‚@Þº}4ÌÔ´És:y:a÷`Pú¡ÑÇ„½‰þ«xk_dxQ³å3x)ù¾Ú2›^9ñûz6G 8® PðÛG~ßcâ| y¨5šB~j\¾ƒl?ò¢›þÍéhp,ß$î pû‘‹ loè‚NMocBhV_ey ˜§q÷¥œo|(¯iЀ—óyvÏb©h%üq9ª8®¡ Ù+÷5êåÍäoýF”Cy® ŸÃàýÂÍ÷ЦGœo ëp½f!åß<¿Jäý‹61LÆ•×vðú lÔÒ_«6UMáq¸ßbCû_ë3Eν÷ÝwßÖë߈º;nw[x”†QÓrw}²‰ôǽŒÍ>x Œ1_d´<þ my_ù¥âKe|„²ïwê©§>" +dA5áD+ÝŒ~I=~YˆŽl½ {¦ñ‹¶ 3«û—–ýÈs;òÞ7>µM⿉ºžm€¤Æmþ-“ËòÆ%¾}B éBŽnø"ڬϱSÂW­Î£ŠÉøÇb!ð9„¯îZkvžÑ™âÐQ–GÞ7ánæÇ¥ÃV /Be2ám'Cßw³üx¿hÏ9v–Àó@Ä#3žEœ'ì Hs4Ödq`eðÕ.“ùõ}ò®6b`?Î4XÇž\ËDþÎüàÏH€g¥}÷Ý7soƒÿ`ä&¹þLÒ|€IØŒ{ ñ&Â?F¾'Õˆ aiIå&–÷ëÕ½L¢jŸ~ÔlR(&›4Y¼žåI~\útbri'ìà[}1±Ei`2 ¼™“Ñ y†–_\ d.4yEUJ£Ëó#™´vdât&£¸}‚«ãøbï“>—?€[mÌ,ÎtdçÊüV&½‹)ãÊðè2Žù…&|Dúa)õF”Xå¢\«òû0²²~\Ö¼~ƒþæß`x—™âÄØ zŸ€wËárŸ¥KØãõæã?~ž¼[GiÒ–÷¢Žÿðž÷¼çM,×] (Ü’<ðfµÀñ óN€Õ@é`XU‹viz‰o›Jàê øz7mâ<ã&µqÛ”²Uƒ¸2;–úù$rS.ÆIñðN¸qï—™¼–rî‚ë—¡.ýZ!.Ï@ž¶%v{êÃ¥âx þÉô›Û¨ë÷Ù?R?“X2Ū“î„Ç> H‚ÞNÔ׫½uý&%M®/ ÊJóFÛuå Miü¯ãy#ÓÔgª±›ü_fV,ë&à$ÁðcaVeFØÆ/ùbPa9h´2é*éh¾Y9.lX›—öEµJÔ4|õ!@róý ,–XísûÆH¶ê?1¼’¸·Œç2ê8„4e,f d èa"‹‡I&‰$S¼2!½Ò›Ii'Bâùöï÷aÞ•VojËd¤ù ®GÄšÁZÍÕoIó.Á´;3 ìªq°&O5 .÷“,dÂ<ü×'í.)ïb‚:’Éöì³Î:ëïi¢I4x»àðî*N¢ÐsbØÒcÈs¶¶7LÆÓd# äç뜌˜ÀÕªŠ–£ ïÀïÆû p·$LÍN£Q{'&øÛɉ‰r Fí”@òâúi‚:øàƒ×#¿›'Æë‡¦ ¯‹¸¢ì}ð«ü†$Ëà yÞÌDýò92÷Ag~ׇÏ}Hs*V`6,-ü : eüNîî½Zƒz\ýZ¯œñmYÉo®W'ÝÉ÷ ® y‹š†åoûŒ‰úI€à'Ès4W4h c9x¬Ft ò15Œ$â¾PvžrÌѦ=C,MjÛ¼zFyõcDf«!ëýh-.AnïEÎïmÌÔ: \![ÊÕ†ÑKµþ‰ú=ƒòK¹Q¾¨ÍkLo¹‘›éÇ×RÆ­¡ážDµ›Ó ùf›i#)å¤Ühw‚î]à¸ö÷è<ÿטg»ßVÚ2kJ³ªÇ%èÒ\=Œ¢Pp{s›‚§«t6*‡¯ÅxûB+}qØ&aý#^ làUû5á<ÓrDÔÃ:\]ï&ôÐÑi ßÝbøí‹õí¢Ž•ìÍXv%À„äR”“æB'2\Œ–6öÏÊ}$0dWò¼,ë£Hó4ñ&‘ÏÂ"¯4×ÙÛ¯Ç&œ£H;×Lý<] ²ú;}ž i"ß¼Ýÿ•°äQZN˜—\Pš¦ã>qgBs“‘ Ï´³±×9áaÜ7fX—¡&S”»èó«Á­ á#OÛÖ½‘IýV=”7ÉПN¢ï¥,kP$÷EMá·có,Ÿ ®úrK€™þˆtw“—Œ&ú-¿z¤<õ¼ hãÆixPÆ\Qޏß*µ ]hÇtœË+Ÿ:V;3ñÊž{êt¿æ—’ò®¦ƒßõyù\S9餓b"òºšßç"ƒQƯu  œNøµ¥Txý€áéªÙ±M¸ú¹ñ¬Û3~+ ÆÑõ·²LmŠtÿ ß 9ÉŒ¨oS<Ÿ².b¨G—9ý¸cåŠàªàH­â‚+ ¤pѼYNÊ$Ï £[_xã‹Æ[·Ö§òòa½Av1Œ¼üzðE0h}¸wM—Ðwÿ`|Ïj«O×Ê¿H­".­á¥YñàÐÞ)œÒNmQ4w{ýH*ûñ5û§e©pß–fé“Ö”Ïo ñ›ïŠ/[È4¶úê>üØ%º‹´¾ô »YÏ_ øõ™ûNÞÉ$xZ›÷0Q¾‰ mwü{a÷#üó¸?c€½‘õ?˜tWr&@dq_oÑ%&“™°m÷¨„·òܲÄ/*ñ«½ºÆø€Š=~Jk˜L“é俺‚~`ò×°ìÅz˜Œ£LÒ2]Q'>ªe "ëë¥yÖYg ÀëåT‹‹'Ö¼¾£˜xÒV¾÷Rþ³˜N'Î0žy”~Gi\ò½žôzdG…r¬EºTWÆO“þÖø7«6Å`<ëé ò<ÉĘašÉjÐðÿ´A}ï)§œòOΆï¡UYÓónºÐ[¦õ6ZúŒ_ÒNA®S‘‹ó´Oíé>ÈèVúå¹ô×Ím„ǶԊ1dùsÚî?Ì˸…Ü^‹†p{Ó4Û¤îþ:Ÿ!ÿ½«^°šQ_tâæ0Ú“Æv$¯e`)¡À‘ ±~Èp÷M¾ÔÔªøkѾæx•Â'UŽ/.ͬ‚µE£¶ Uï&äg>ò½¤è^Õk|š'«::¶âòçc”£ÇìZŽͳ͡YÏ ¸¤âd¾%ùq¸?dàüæ ¨¿ä÷÷ ŸÅÀïŲ«2õßAÖÏÝ£špõ€€)-úøÅ‘~'SÁ^'Å]øƒùç(ý£ + @ë¿ÐW7ÛJO±‘ž´‡K¿ÞgûZ!¿ìw"ÅÝÆgu<Ö4n¢­ãÑ6ÒE‚š;9ýúϤÿ#åÿ'ôzŠ<_Á>˜×J“æË H>Û!&79yVûg’öâ»ø—´+®¸¢Û ^UÐí#`ãWFS®ŸQ£GÂf‰3T§Iû­é1ñè 謊Ì_f@Ã×ÕýqŸ˜²%ÍO|˜À¢þF#ø2ß|àË“ßöÖ+é\B´_îÉò¦!NÖ>ãç"Öð´ÿ­äïR¥òì§ J"~I./ “ߎ…låß/(wIññ€š® lgÖ—üÎ.d_CYíÒuéYW´©ËéGÿ†ý€ç‹ö)ìW°ß@¿ÂþÙú¤öÙöà5jUÙ«÷üWótüPf—Àcy´›(Ÿ3Ï<óÂεn0QSYtá·ä¯_cÝZ/¼ly–Ø.ðhŸ±?ø‘Æ_h÷¯ñ4ÃZ™ÔAZ=_&Â})ch‹e-/G¡™ú Ëp ·+cºJg RŸnĨQšUXÚ¥}öÙ®EÞ¥pûºéFŒv±Ó=çY:}ÞN¦„剱۳ÁÙ—%%Ð% Äe6æ~Ï*@ $ëoà ä®ö1ÈOr&HÍÊëÑ\ý»|¤É6ñ”@i_HØF¦Ç8ùª5{œÁúZM:™4˜CëF¬ýxÑ4ÏŠ„m"!Ž ˆã[L$.ÉýÎÉšIc°àeË#+L}Ü»™Üã2&ÏbYR¤z7/dï /*äϵâ÷ Æuy°>M+â'žç… Û(FÞùO‡/h¨ÔÈ_Ìw6Ö<­ ˜ÐßíLZZ%Î}äí²¨Ñ;JÛŽn‡Ïâ!¡Äýýè?±Ÿåeåsö)ì¿â?ˆåÎ7QG[ggêä›òH;ñEa0¦¶p¿OC›ud]žÖe2 –:q³»}ÀߊU»§ Ê6kN‰R_`,؉<ü2Õtˆ'Êç—ßÿþ÷‡}µ˜Òµs#í",+Ïâéì³8åýSá©…_SðË9ºa `FÔ_r“òV¯Ò™Â '„ÏòUâÃm a:25ÚY£|°Ø°"Ÿù>nÚ½Åc«´65g4¨¸Lxbu¸-;~¾sP–@–@s 8ƒ¸h¯:™ ‹Å êHµD ¶÷a½òä§ë¬³Î/”ÕL(Ñ´Ë/$þjÅ`yÄoÀ÷›QÒH Ë´ÅA oä}=ÿdÒ¸ÚëQÝßä¦ùÖ'…/²Ž›°ýòq6eÙ‚çIûôRŽ…P«sS±±½~cú‚1Lo—ú£0—ãî ]gí.üþ‚²ÀƯäŒG~à¼yùSÍžîELœýÆ“7ÒÏó—q"]Éø1ÐqŸM/KAdË2l¬La…|ËL´ž›åfyÉ›©‰ô¯æ¿$ïV «3.µùó®§Ÿ~úQ=œöíÒ“Þ–†öã)üS ’|?ïo Ñ$xo9V'þqËÄw lÓðÛüÒ\´ª?’qY–d_TÄQÛÕKÝ›ÇmÆi‘)];.ƒF¡tÛEïö³ô8j…cƒ±­m¤‚Vî1Âmw—#Ë3¨[´ØÌ2c”™š­cxv;å8t½ØXžÕ´Sœì>›~y-}ekÒÆ>}Ê»Ñ~$`¶aj}z{Q¿j­ÔÂúU¨kü·‘êâûsD³D¬Š!ïÿÛÇ“z[ 3R„’û±ª—B_Xú @ç8ª6vHÒÆÙ„F5œEšÿX*¼¦tD¸Ì£_6‰¿HùùÎ<>\°Ko"‹Ä-Xˆ¾×Í?!¼tÊááOürhÙi‹tÜT°aùG–ÀóDÍ&Vß Õ`]Ì@ý;~¾;…Ôîâ€ú ¿½{þ[Wo¼.A0˜·ë‹«’GÚ ä[°âïéX†â2ãD²­[L8Æqö½OZ˜Z׆n ´OÕ×Õ ]Æäp~'ïx¸)“Œ_ބ˃”e/ùÖd2ÙN`D÷›4®6Na®p’á™{„Œ³)ÀàÈEãRD¸[Qî•Io\/:l^\Ð0ž£šZ’ݺųTo—Þ†´péŽd(W”¯|QŸi‚uÙÈý]NÞm ñ"ÃyDY¹]¾ ¬‘×:.7áZ—ŸÔT¾Šò¾ o[‰¡O‘¹NþÕ6 ü‡ñ0^€á—mQ6x ÷é%¾íN\x…'È4ë)+dœÚ€–è/¸¾¸Ô@»ñÑhÝÈý»³üˆbp;ž­‡ë׉?ñkÀÓ_¤¥á÷ï¿…ùìµÐó”òå ·ne?U`c°£Îtâ癓˜–[8ýf4€4ú¬è3ÒÖæù4ß'×çõþ$»ú0ýðïrnœÏüͲ®÷ÈÕæé43æ-M,¯ÐÑtZ9+š'Ʋ˜&¦3ïÄ›®´Óo#û[“ÂRd5Wüvã·2ŒÄ‘[LÀsë9i¹" þ-dò*ý£[ehŒ‰Û%kÖÿZÄOíÁÇI‹U‹ €šÂG°¬w(r¹Æýz´/ë|SÚæ›ˆ¬J™Õê¼®ÍýŒ¸Ÿ!î¶qÓavñ@\÷¯ ®ÒÈߥò¤ uB~gßýöŸÎæ{sÀÄJ¬zÿÿ¦WlæÞÍÐÞrÐÍ‹–›•H0'0Šy q•μpw‡WéTn˜6BwfÁ´:•aµâ{à ´¦ß‡êûI«ÁÚF?(eÖ"÷Œ¼î[ݨ߬L­Âê[í"q&¬[-’SÈX%—(/̦¦J¢ësÂÒ§ïÑùÍÛï"½‹{‘°EŽÈK}4&ù8†¤‰ØgICä üôTwƒ£F ›ó™ºKRµeÂvcR1(Òâ÷…þ°ìÊ‚Ém>ËeµRjnv1KmU¥ØÛµ5˜ÁñxÂ/õ<(é$íëL ¦|¼Kï6&Ñ›q‹ý þß’×o’Maº)L—x¿aâÔÞ¬põGòO{ªb–i­ËÌ^h§É7¬¸š¼o”wy(øjÊ Þ-Ç,UÞ ý¨1qIJ&‰o~ÑϳÈ7õäì¶Ã|Œ¸”ÿ£ý-°ìh‘®Æ½°i‰,wÚ/¸«´U_U8xŠ~àÒßßÕ/Š6µ"õ´—é”±íX?²}co¾€—‹‡hï¿òYzqÑß©‰ ¼ÓÈÝŒ'0LEšCáØ0-ì=xB8¾üxø Ú¡ùu3_iÀ¨·ô‰p?ÀîPú~åùT´WóZdÀ­å_ eY@ö–¯D öÍ"þÈ<Ί/-ö§)çÅtÏW¶]çˆ_Ò\¶_0þZlԯʬÆTöd d ŒVtÄØgyËDÔ’ãOoÐ>S_c@~¦ {'Bò‹ †p~ª4©Íµ¼[yà)ò ]O½Éâ ÀCý©î—2‘ìGï4ê‹Ù ¶1îuÒl¡ÙÞgð4™ E-Ù%FÔÔ·‹xv$Añ>6xÙÊCBùjî^㱄õJÂ6*òðëA ZÚ›f¼ãÄi¼x^igrÛšw n™P8sªsA5Orkîbî'2» ûF¬í"ö dðòâ‰WÛëÇó¨u*^þ‹vþ!eF=©­°¾t'&‚+¾ ]›°™EŽ_÷|ÚáÝ„'À¦·c󜬸ç 6*GpÍÞñÌ©©áj{;ÅGÙçUË-QÇ%ê4â,4B‚¼#¹œsõå0%ü+<ØØ´­:µàËmñ=D:váñáפÿm'áöǓΧ„-P¦Ïa3ø!’ŽÚ&7”wÙxü0’},ü;y_ÁÑ ¢Ú‘À\ºJg¹Þû±¾¦DÙ<ß1‹óÃõ´‹?ÄeÂV‡ŽÒn 7TèÓü2¥*‹Öào‘ì«…[$¸Ðöa‹498K K ¥ÒFsè{ˆôvŒ[¼¿h¹å–{‘N†ñAÿê&Œ=ýàž£€ŸÞ!™Æ ÅLÔ¤SÝ™8ŒO,ÇÝÚèìÌr‰ÞŸ ë<êÔÔ_"ýÏfe¸m¦ÿ ³u1Qq.Cå‰õñܨ ·v¶ñï*ÂãýtМÂï—æUA8qÃ3ù ÀFeá]áw,góìÄÔÕÝÝÖ«õ@º¸ÉØU‰xÄ„üÊÃhùNé y'¿0¹¼ù)žÝ[ÈXYD@Lþ›yv\ÖTh¨ýò˜Œø2 ¥ÀįSå9dòìX¸¶alG?-Òùû Çqn5:²|CÑ®ãYdÔç­²Ù>Ëò é;ÀŠû®¼›ïÔ°לÎFnJNr` š¡ùl&ï Ë•'‡SXJû¯§Ž «Ç»ü¸¸Y“LwË”ÎäÞH,DÞ‘·»=Èâ…!ϳš^DZ ÿùaó<µÜ¾‘×í”>žD^KÓ>EIÉ@w;6Ö¯ó9»»2è–,3,ç»ÒõO>ùä]ÈâÎhÄkA¨§1¨ÏTFiÙg4òb"Ø«0©«º(ÁßXî‹Ú&µpqYŬ7ib!,ê¿7`™d=?I‡æ¦N*…†ëZ&ê?Jƒ¼£FKÒÌ19] ˆºÛ ª˜ˆ^üÖc2z±a<ó Ò;NñPU’§²K*šDt×Ï«L 'YŒúæt$<86.Q†3²¢\Ü'F™o`!Ãxý¿·âtúe¸ÐÀu…w÷ JúW$àoýd½瀩ŪaŸµ1µóž ·wñ àcãj“î9{Ÿ¶ïˆÚ)ïü¶Üõ ðŽÔOˆgø0“úuv/~e{#}’ߦœ¥õÚÞ+ _ö(põ쫹Äý 5{I0¼³XV(®|ü?îøû(Ërš¨cm`¶Ú æ¢Íš6茠Íú5X¿ÜsCz÷Wé˜éãá{l;`§Yd`ˆ¡Ïþ£é•ÂÉ•SÂú‰·g£4ñ=$~Ãô²î;þ\ƒ–M¢<‡7‡™rñ5¡Ú¿n–½y¾94K K`|ø_6ÕÆ«j ãržK:›³çヒ-&Ͷc) &€ý™wrïÆ1Û À ÷ÇÚ [dbIoó,…ø5]<Õ4ýüîe2y9þ-àIÍZSñk©ØÔè¥ ê»ßýîCĽ¢D‘“ÑæLN/çh˲P FœË¹¦äQ~‡^[ðHïÙFF¤øu—“Ü' À ;i»Ôþ?ù)‹¶rmO¡ýSø­× þ¼ˆí~8÷·y¨ì¿†ÌºQ¿=µáO¡—A‡‡> p‘Óld}g’—y"¯åÈó_L£æÌ½Béë~—ø¨Áõà mJÍÍ›‹v¤Ìj†jþ%ÀSzÿûß?Y>çëqvX*+üñ *êdŽÏ©{Ë^k·†Õ™TÆx²;ájîi·†ÏÄ?³h»ñ~Ïf/âoMÝÔ?ü9*“2U¢±D @æs§¢9¡è¢ÒV<(À>4Yl ¥òÔðÙÊŠáb€ÌFÒ1½Ëcá¥1 ô+‰ù|²òL¸¥K++ªzã×ýNWé¬Öíà ժLÕc(ЇÇe }VÅ/­%:Š»{ÖÖõñìï&lÕÒ²È?³²º$&Ö<‘ÿ˜¥h54„}‰Éms'C&Œ^—”xîXW³†š®…ÄݘÁþkÁHgÀs’0¿b¸DORúë I+¥“O>]y˜]h+â1 „¿†ßÛÃLÈ?ßûp•E…rx©÷®h”¾bNÖ±õ¨¬‚†YÃä]Pd)w\-âáTWžnNœõèa›ñRnÂö'ýGŒ=›ãRž…\¢|¤O>=¶…¹Ÿ´–§OŸÞ•yµ`¿©SÈ#i‡†ÉE¾-oQï% ñ‹UÏ‚P`¼r°õäq®™¤zÑßÄÄ~‰öô Ò_m¿”Žmw?dø–B#¨ÖåÞŸJ^Ú¶&Ù j‡v‡Çǯšæé«Ü¯W ßã«ÁÕYôu,Ž>#îe¯Ö _–¦…Ñz]=p|ø_ïý ¸Q¾n#Ðñq:‹%Ã'øªð£ðw)G)L¢*­Ìv Ϋt†Ø ¿óÿµç¾HôTúvf­H5`]>TÐwPX$å 0eµÂÄùñNüË&K K`‰”@m™î¼Äöh|ü:Î;fàþ¯––ÑäK~ÖÏ€žîžd©Ì}Mg“f µ;ÐóŠŸIМKüÏYz'gÒÄå7˜ KUŽ]ž~)à(ü“1˜] ›ªPàa¢WÁÏŸ}@¢þdÒäEþ~•ø îZÅ„´#tæJ‡0pý<_ÒµrSgœqÆeL¤?ä”î÷òE£ûb€Nrß'|5@Ê)éPÎD.“j“˜Š(¿{Ýc”Ò¤ÝtàA÷wÀÔ×à÷$è»ùz9xÓ§à}ú +¬ðéc=öóæYb!y6†ÉüÒÍTÕtóISƒ|OCF‡wå)ëWðy:mj:uxüEU'n=(øõ¤ü3I¿!é]“FDìFæw‰+y˜®OßU?ÙØž›¢ú:q(×.ðz*íô¥È×0¯ ÂýºÀÓzǶêgQjÝQ7ÿE:_ |!PþÛ!?Ï1@.î!¼›|Î'\åVõŽþÿbX5À1-¬\Y¿€+æ­°Ú—T"MƒæÅ ð«’àû,n_.s"úÇ“QûÄ&s´GãFÜU½Jç*ïdùîkphe6?s>.Ò_¾ÐWéìæÄÍó­®Ò)î&ì Wñ^sàéE€(yo& é3 ²¿?.þ˜r¸LH~ip)XÉN–@–Às-43ÙÝ΄Æq,¥3±žYÔÏàí~'OãXõ³wñܾû³oë<ßñ/Ä]¿ã¤_çõY6èæò…oùäÕrR1n2¼ô@IDAT±ßȤQ;Õð×a4ZH—iÜ‚fœØü ùı•3î‡ï+ák_€ž“³_Î¥ÃXWPž˜.¥ÑßÄÔ€(´Ž\m/qY•r«A˜„=™Éð-¸ß&ìJ6:ÿÉZµqç^Æ=ƒ²ù…åÎ÷ßÿ^ÄH^Ѫ,MxuZCʨyÜ €ø6Ê Nfƒû[%h§l”QØms­î;r|KyªÌ [öŸ†þ5¦­tC›õìU:ÇWé¼Y`7Ý0€«·gA8­òe®àùHx,~1™S­/Ü,ÆHñØ‘ááÁ¹t€E­–)ãׄ ­ùúrÍÒ!áïhï|ËH ®žzÍŸa- {²²‹ pQbþ“ìšL_b¢ð°Ï… àNˆÓûwÂåù¸îGròõžÍ˜tW'®qÕF”ˆ+@ó-ûiVäѶ<)ާº“§ºoP$pxðkD'.7Ê_Ö–Ãkݤ“ø¾Äw"Vs#ß‚+'íø"“][ñ`NŠÆS´/“ü¯˜8×a‾@ 1ô튻+ÑQL=ð'âý2x¹³s×r¸«ÿø×FF=.ý09¿–ßW`'ÌÀsM#B&\­ï;âÂRe!2U“µ ò8…ßãþùßKܹø•ý4ʳ ü®‡]êa ÀÆë}îç÷)ÊwØžê’úÿ ´6&íçÌúìË­Th+eäµ3òrŸÒãÈåŸÐpàÊØµ•@ÊìIÇKzå d¹3y[oÎ?ÏÆšH€e{ó%Á‹±· ¿yXï•ó]¾×§aW•7ãc-‡Z«>ÊÑÃ׳SÏ"~|)àQÛ¹Ðx…üJ€§{iG¿¢~>d›-ŒšSAÛh rwzÊOG/0Eœ W¦Kh—¢Öå“áÞò,º ¸Z(\YˆTÁ)I+׎5褽ºg(\޶é“F&Êål€¯6ÌVéÛ†G>jFš?È)ïó¸`uRÇÖiùeÅ~–17šÊ%Ò˜,›lH§×TBqÜBÙeBá[E;P53=h¸üšp=ân#ìÓ,„=W«*IuŸ¶žE\¸•ÿ|aÜœJÍXú%P÷i·Z ä îr™üD·}—:œ Ý‹óŸLZf0Ÿ‹VÁKˆãiÒLvý ê+3)¾žÉù@ž}ÿž„­Î„ÒOŸO"Ü ˜ÿAú}¡¯é*hwR†Ú¦lX¹Ô …üeËQg!ôõ_ Ý¿èiµŸËgÉfì=ŒkbÁŽ| þ\:œc¼´¤˜Ò´r)ÇÀN,sÜP¼+óÛµ”—¹¯×í#.¹-€®“ßÚÈf&Ïþì¸ïÅÝ›°my¶q]î™WTk¼^LÂïXXóOg!W÷/äø¨HuÔÔס‘¾¼#»'ÈûM€«Àw ¾ä]~Xð7¹¼Žà}àû}¸ûÃ÷;,áw EœOÙm—;ú¥,hçgë2†‘ç¿Ó~fY—Ðqµœ„yÝç”™çFðó ܵy¦&ËÊ<öÀÒ·2O'ü#†(?6èdë$Û›&ýOy›÷b¾^ÞŒ}gQ—Öé~üÞž·àùª–žm_"íØH+:–þò¦qhoèoÏLõ©ò‹àú? #‡ˆ'x÷tá^‚æùF£S·£n¦«7Xÿ¬ë~ÚBE-“„ùbïX~Ïäì©[%†ÉK§hѸ½ñÌ,öIq û±CLJŸ¡[¯4³¸Âoà#Pã|¬i€Aší¡r¯©"Ⱥ¥éøUʓ€¾c¬‘7¤_xúàÉblfªÏà€ß=FاŀPbŸ_ABo*àµG­Z¹ÞåÂjÃCnvÌÐÕâ#Áü/K๗€{q .¦0x»47¥¨ ž2Ñ2˜×Î0biíÛ æÛ0¨ÿ†ݤbbŒoèLΊ€|¬eBQq*¼nɤzެ AÚò?{ö앉ÖýSÏ09!Š^éëñÙ¹þƒfo;º |‡—Þ8mwoïdeª¾®/>…ïH»fžøóžGÊ©§™”÷SLòwC[”h+NŠÊ† 7ʉ8qC<òq91Ï=`SÑl¸?íN¼Ò€$“®âù$d`’ôLÓO<—ÑFmä]åA ð¿?ò}¼ßTð¤lܼg¬ü»!^@ù#Š É“Ã}0mœ—“¼ë™²~°ñ9ùM^{cOú2åÁési5nÔ–~ʃg’uS¼ lˆˆKÂä·°Ý4]ÌX m¼~É Q™ÔÿÈcªýü'+p\ú´.•C¬OÁNcR–Xÿ2Nïãù7a`x?ÊÍú£W‘÷üÉßPþ;†;ï¦óÛ¾g€íQYë‰5£MÁË,6å¹×éãìW*£‘™¾-ŽÄÚÛa:Ö¬ô¹ 5H{K¥ÌøãÂ[Èc(jÆsüGxÛ…Oxü9Ü[ Ç|Ô–7uBQƒÄ«å±l–Ek‹È©HÜgøÚÚKÎP°è© 4â*`ïœôÕ7VŽ ëàÖ¾|¬§Møõ•ÇÂïmW¡Q»Ù · µ1ìépäâ§Ôì‘[4ßz¢ÙŸ%°J ]ëw=õÔS·3]Í„sµ~Ã,R³IÌðn™b.901ü­ÁÛØ·gbùü\ @x¼üÊϱXû4<ÞåDÈ„rqV‡bÿ& èùÖ=ªþ ˆ/n0:“Éì&ò¸ ú×á?ð¢œý¢ôÊð8 äŸõñGY†EÚÅ?øÁ5kJ¦“Ÿ2| ݽ×'íÆv˜Â'Ò¥>{ï¹çž•(ÿrÔá4ë‘üÔîÅû Pç^¬¹€AðØS#÷Ö›TÞ47Ö?ëÈŸÊN›úmçs·8'«-£ŽÀ.¯ØNWÓÚæûœ,9‹Ky\!#–Õ^J? P²³ï*nßFvÛR<ûÐ3³zÕ6D®æAhˆnIù¨Õz6jg¾bÔFv¯ì¬àIó¤Žo,M©æØJ9zy—8¦çðð/¤å³×kƒX À¡‘BûökŽ…X‡2û–6Y^U4%4QBïj€Õy¸—‡W‡¿Ä¥Ð¦™çÀ,,%X%&ݵ#M¬ô.ioÌJ‡rp¨K¦™Ðh”] åN޵#ò–â/&yµ-{â…Hjü¬»‘Œ™y÷º%@ƈå­'˜òÃm R¿¶-ýú¼·_@Th”¥r•lêù%}N\íôb@èu€ºÕº W]òGâ¾€õ„²ÂvRoõä›úíXϹ‰àƒ½Jq9m_1ÌG”þÍ}I4ª^G¸Ñ)¯ Æs©Ü£õ$‰Žd}ÛB¶=:Á-LYhÙ>ÔÓ¾À@YÑí4ltžËõË–‡‡_¸¿A –‰ÜOYùÞ7Â+J€6Ë7Ø«ñž×S—qÅ_êÙ3­éêÃôGY6¶ø EÒ·ˆšƒ³–f x8aÜa’ÑyNÛ?¼DÇJ+­TGÜ<Á !ÜÂ×™±Ê¡‘ÖXéÔ±²¨× e¸rºÃ0ÅH² (QöÒ±¤¶ÁÏ®ó/ïÔgIö$™oâÝ%ênMæGMgc{"¼-ÐS‹Kîƒã£þ>DÅQ3 r±>ºR'ÖC’3GYüPõÿÐ^‰-zð—ñÂòìiIÃUchœžÆ2NrãKž€ŒTÐfíŽdOeoÕÇ hRЭµF&J¦ªA@ Ô'Z~À 2G” DÙ(ÏÌJc³ä9ë{±ÿÐÜxÂüHÚ5—-ýºð^´SÛ’î«/£ôè`íG>'QÊK¨7Îæ0Õ»“LÁ{i¬Kž‰Nv³²²²²žH W1Kƒ‡£½:ž=g}!àjÚ«›YªÝŽçóêX7d³D, )‡Ûx±àrçÊ1aõ¡¾pRyrx§‹rhŽÜß é”o¥ØH+qöÖ8¨ïˆêy/@g$a¦øl0_™å¼«XA~¹Ç2näýXSÙ5/ü¢|xx‹ùXF´u‚ƨqŠ/Qžr?%¬ÄÞª¿žŒùÆMèlŠÏ§$•ìf d d d d ´—€©ÑàêÝÄþQ¡­3¬—}p~iù´W¿¨ÛžjçO;*SìRّ̤ÚCØ®÷Uö4MgÙOÁ¨R×vbÔ| ˆ¼×pÕíY,×}Ñ„¼Œb|ZâãNÀáçRöDõø#¤ÚiÖ̿’e™ýXŸä*ãXaa„G>ŠÕ ýËV€{Óª¡ù–@–@–@–@–@–ÀH`2®.ù…§qW‡°z²ð€sv…/{ÙPÿö]Èï„…âœlšn˜D´´ºNCä¾, /<1lÖ;¾6jsÏ~E Ž"Ó~Q_à¨@Ú…­ƒY‚û«Ëá4Jm€÷|­—{ÿ¥Â/¢Åâ¶ÈöÚÉr‡=òŒê-h©Î«ìƒf -]â?ñ²¦*‰$»YYYYYc–‡¶® ú€ÕûÝkW€«xû®nC{µÃ™gžùh·÷^%†;Õ¥ø‹ÕM›ÞZ“>ní€è$õEl€¡öc;EœÕ3³DhÂÜßu-û¼Þé²[<3Ë¥¸‘M…C9c~h¢¾P;?ÚY{­R¿âB¢û±ð½8FÜd8߉¼ ØJŒ9iÖ*'‡Aã*`ÓÚ|õ×L£¦†ªŸeøüñ£hÍÎq£†¬çH¬9Û,,,,,eA♨\ýbúôéoâdÿ¬¢¢°Õ¸òÜ´½Y¼Ê¥Ä´Œ8X¢5XõN‡uº”Ö{DøoîqßТ©ì^(âªÍÙT7È÷E@$ü™Âþ®¾0°´¹š,7Ÿ  Ú*4k½\^}×àPø¸@š5Mܸ^¤uIÒ«jW?cØ6‚+ŸepUH(;YYYYYÝ‘@¼\Rh§nH ®<ÕÞ³ÅzÙs%¸ºÿ.‚+—'\ÉÇR°d6í“M=*ÜÅWyo`?ÖgÜhî&v¢¨Eª9&ke¼ºziô”°|^Á’áÇŒœ”š¦V‰=*!½¡pb¼Û¯š·ùW7Õs™5çZ}>ßZ:(Ü/¢®¼–dóƒ,,,,,,±K€=WpüÂG2LUkà`Cû)¬½²j"—ë¹^ª–ŒÇ½J³â=QË„VèË  Ùl~;Kq†Y¦¸1Þø#ã¦K£§†ÉáD¾X<§rjXSfq¼›Ñ›Ñˆ{¥Øï³òŒðiޏgþù€Ÿ[X܉ íÇ'.+ruLg@6YYYYYY]“€·J ÍÕïqnἫù€ª3ø½=Z«ÃÎ:ë¬Ç'â8†Vh­¡i•b ´”9#ª7©s>ÕP9|EpÖ3³púFQÀúýRwñ!硽ŸäjÌ›°ùGš/A¦½a ¿6åÎ÷«Yœ:4?|³<Ÿ}]ŸOtº¯k kf%K K K K K`©–_nŠæêi4V. ’î2¬}½?Ñþ˜hVÆN?O%.Nþ {_Sà ö>EÐDp§š:ê# r°i¯pjh(|¹¼Nø\í+Ãgf ôÐx œÞÏY Ó9gë”È K™Qæl²²²²²²‡Ä6Q›…›€•ÛwRØâà¡Í£³Z$KÀè0É„DSSTÛ£u\ØHu k‡0‰Vš~á׎nõfOWõÒè+ج~×ÜÜn‚ú|ê ¸«~ù¯U¼ú4ÙŸ%%%%%%Ð} ¸‰]ª‹á²ô–ÌKƒST!@+î‰z.ïÉä„ti4Ëz|?ðçð)·¿ñÒhO`ïἫGÙOõIö{¥$Ó²`£T‹ü½+Û3/Rnä%ÿÎÈÈÈÈÈxî$0.€%Û+ôÉ‘O¨¹#çTk7ÑrÌô³²²– 8 7ý討G·…,Öe º¼³7K`˜Æ °ÀÀ|ŠÖüný¸qyX7ü&-Õ™“ñpÜŒOL–ûþˆ_ÿqZº ˆ3®Ö憓øÊïíÂ@üýdÝ7ŠìÐõðu` vÚ©òuàUË‚£ —£f d d d t.çªNÓhâvÎAŽ™%0J Œ `%`xê­Ì×”f„-Â3´þ~N} áfn1¾¥¹ ñÿ†½K†EÁÖZ¼´ÓwËD^ºE¬­1µ‘&ô¿M²ÍAKˆR[²=eǾcZ'ÑÜ–ÂóÈL¢¬ ±;bgcÛ™x8›Ò´‹ÛìYj§>³­%Û,nËh+1Mž °p(ç¿­¾È&p¼úÁÏÝï½v ز‘ÞÊ¿K9úà‚Þõ¥ÃS‰3ÂKáìøÂ>kã§Ç]qB TŽ Ó‡&…cÊ=á ¹FóÖÏ3AVKyXxˆèÐÜp:àê`‚üBqØ×ƒ†-F#¿²¶´˜¥ß¥E®K*ŸÖ·ýÎ6êQoìo«cWÁ.‡õ%Mc_t2}û8öa¬a&½¬d°Õ(™eï·¯í¶­±W`­{Û¶4¶ãÜwÀ^[ünÖnxÔÔ¤¶*Fc~ÍÂãåßYÃ$`£•©TÔØDPto“ÜZÞL d£·Q–ÐlõÆæowàf ÒþŒ/±œOŒëJŸÖ3A½îÙ û¶º ê¿äܪw—‡Âñh³V/ÎÌ’4p׳¤¿Ÿ¥Å>ÀäoK Â¥O…§FyƒÀ:X'e3jÙ“&Ó>€U§¢@ÖZÐvò‹õˆ;V#òË¡ÊïXùËéº/û‘õn[רþ7ÅnƒÝû2¬kEìtlêw¦qb`i½˜õnìmØßboÆÞ…MÆö¯Mù¤ðì.;°íØ&l;WŲ¾ëVòoKø5Ø”¦ˆÞÖ1mj?¶¥u±“°O`øš ²ªrÈÿG!Ó¨LðSB ´ðøðšÞR¸ªÔ¦³iÜ 8 ÍèÙxµj{zbÓ76»³¸GðN´@—ÑÂϦ]Ã2â?µC7}+ôn¶i»¨ÙŠ_9àkq6dOÕ逬] ~ìÈvÎz3H9{(çÀâNì+».É¡>R ê˜N(—bWÃz¥áN&£5Êqì‘Ø¯cë~ŽÛ$zòyvc¬ÚFáhù5~j{á¿;šèÙ,epL±Î}éÒ¬Ýûvìk±}‹ Q'¼°çb…½«Ií¶ú+ÿ_–$ÆŒ‰XõíÆvêÊ„cž_ÇÛÖ¿‚½›Ær¼Ùd Œ,'ÍÑ5Kî Ù…&8½X´‘¶3>/óžéIé^, ö›Ö&… K½aCÂ>LÀÝlDŸCÌ €lWÆî'ž€'šúãJ³joéqÇn<™ðV9šü‰g·ÁÃç9ëêóì¯êC#gžv&ù–WõúÏ”WÕCMÓÂã¶&XßÔ×ÀJ×c¼f°\õƒÄxé&Zªã_Q“÷ñšD#Éc¼ôrú%O©¿Ø7èG`?€µÝ'ãËXµO¥ªêÙ_U_gŠÀß¾³*vÏÂþ;îÙØ/cÕ¦¶‹7›,%àXäø©9k{ª7Ëóã@ìîØ7boÁÚmÃÙd Œ(Q,´6åt@iÆÆÖ`ð кÁ”Q³°,W`ë…4ßoÞýûOW1bž7 Ì™zd¸'åm¦lݽ××§)öy $MTÏÇÃÑì)» mÖiì³Ú¨Ø7'ƒxyó¼ð3ö]Å‹›ãù^툖&ŠiuÁN@Nc1IÞ.·l€ý ¶Zc¡¶hš4à8‰iÜ3ªvSUÿ¥‰Ñ²º ¤Iò¨þÊÿ— ÔO5¶wëÝ8Ú±iØ>Su‰ñPì÷°°l»æ›Û-BXÆŒmѶ¹6+·1¸<¨±ù|]ìIØ™XÇ_ÛDjƒx³Éh.ÑMœ\¬,€ÈK@¯SïØ‚¤¤—x¨nl¼ö–úÂ:h¶ÞIó~çäJøçÐñ,G–¸|y(ÌaÏÖ5°5 ~f4ƶЄ ²"ØáØ…K+džmÙ`vbyRx7y÷ø°u/Kƒ‡É[dú;4QfÄ]›&ÝÞ!™Z4Óٹݬ–I€Õ-“µM3 ¢òå3†Lê'%ß5õaÕüi—€m$ö]Ü/a?SÈÉI“úxõWõ¿m8—äú$õ ÛœþdÓ3óÒ&Ú—ã¿Ñ‡˜nLzægÞZË”hžÛ.BXFŒõ›ÚЊ2ù2éÒ`2©ø{ìöØ+°†§v7›,æh6ð5i¨'³k†Â;J+…•+~ãƒ!Ð#Ò@¨;cºÈô†ÐbU¢e0l­ŽŽìm„¾ P÷ÇC\Knðû2®¯ùƒ )f8 ^X¾‹þQœ"Oú¸i¿¸4úaÒ¿‡%Ã9,OÞÓ†ÂÁ½ ÷Õoytö/ Ê `Ø1Ç*#s4­åµ“ï‚ý!6ÑLy4&£ì¤%p{iAa<¼$¢#ÀÌfÙ“€m&«3ðXÑ6ê³úöcûL“Ï:5‰¾ñm÷ÒÔÕ\TuâØQŠ€Q8‰—ÄŸù¥<§~'ßl– ¤vé~Ö—ÅJmª¾”ƳÍúÌxW`Ç;ÎB"›çƒF°¸c/ÌB,ì\݆ï%,ŸM*ÙüúiuC4Ä S)€iÐâá¨M}C¯°÷iHa.=hµVlíů½Ðx=غž’àâpx¸µ¦Ù"²š)z‚| ¢ÚqA/ª ³©_2üVÿqáOåùaãÞ#âfÚ> iG¥í³´ÉÎY_¾¶‰ZXó½küÄ ÞŽmÛ|ÖÁz܃«ÞøÌ8Žsq<¨˜ýK½¬ÓÔnþÿXëÛ6lx§­5WÃ^ŽÕ¤gÕ_ù–@ Œ`%:¤Td¼Ø(oа¾N ¯ä*™]÷¤)¾°µ<ÃcÙX€¢ Æ×ØÓÀFñÏt¦×¶† :$56¤Ofa€Ó6¥yá³ðô;¾H¼„VôN ×s7áÜj2Î⸆Y¼]79Ø´tˆïÚÝ1IƒÕ­Î™èì{i`ÐËd ,S:µ‘þ¶ŽÆÜ>H›Lâ3íÁò·ôSxŠ—Ý¥GÖ_|YÁý,Ö¶íDÔ¨éImH­Õ»°¿ÇjR»Jm®¾-H[£›¬¿¥usaOÀ}/ö"¬¦>}5däÿ)5eÑ} sL±%šiŒ)¢dg’@ªãÓ)Ó°»Õ•-µ´,ø)ž=„µ=¤¶_={³•@jD‹>EH lRê÷@I‚s­^Î0¹ -yO~¾Ž£VŽM”á’+jlàœhÚ®ðn;A°U=ØÊœÙe~·â½˜Ü.fÝPút<­—`ž«!ã`S÷Z5jµb„Ñÿ³<©ÿÿ{°ýØ>ìxå³³û¦¿ ÖÉˉKyŽÖ$`æï•XµXÝâS~äë—Ø7c5õr©†äÿK“R;syZ-¶íÆ>g;J&Õû=ìŒý+ÖvŸú&ÞQÛŒíÝþT?Áµ-¥‰rè]…u™0õ)¼µòæ>,—"S¼Ù,F Ønç®.ò­ooõþmyn›LiŠè-T§+ã«X_’¶Ý6l½uü²­iÒ˜^ý•ÿg ´€å¸MiVŒläj„ÊhƒJj~Ôù•ÁÚS*DZÎÝvfsú4Ñm9Ôsu¦Þ>»Nزkëk~ŽÊ˜6¦ïDþª§ÈObEv~ødeJøš­KÙÃuü\ ¨r£ßì‚­.¬Äø …§[ÓòIËÁ`{lÒàµIǦ¤ÔjxZóMiZÅi ¯?Ì´Ý’Cc>ù÷ÄK Õ“‘ઘ˜»cA[ÃÿW¬Ú-µ\c5æ™^RÛ4ŸÄËXéÚ½±ÒÈé–^ ¤¶ë^¬cÅnŒµýÞ‡Ukj»MãÝxÛ¤²y¾H ‚]+o¶"½¨: Ã „x~´ßªœÂ ÃŽC Þ´Ü8amštoB\ÕAÛÆ\K‘èèÿUÓ§Sä«`ËÞÒ À{9{·^Ø:”%Æ;[sàù¼žIá"ÀÕÓdŽ3®ÜNitÓ™þné8áX‡3±ª¹ým¸yŽÅìF"é%º­hŒ¥ ¬ñN²­øÉá‹Oö''%7›Û^šñÜ;囿Æ6Õ-cþÝ2cí+ÝÊ?Óyî%`{²½Úî(,Nͤ1±=YH ë«>ÓBCZn)̪¾)F°uh¼CìûÄÿ~åä°ö (÷‡=ùÜpGb­ÏRbOÆ[Né¾iŽer·ë˜NkG²'UØö·È³ŒèÁ¦räĆ•'Ã;xÿV‹ó4—p”¹E­ƒ¹ëøÝX#™­ð¸Äñw¬å ÏÊ$ 0»ãŸ(#ÀRÛQÿ68Qyeº'Û—ê¥Øšdã³4®üWñ¼—žœM–À+ۭƶ[?Ç86vóåÀ<²yžH „^\Z¬ghņªfköÑ¡g§bÏVé°ø™ìO`â'•câ¡¢Ûsüƒš­?–¦ÓèmælA%m[Þmˆ^jXgM9ìD½¦†æô–òµH™ã wEBé`ÕÑPmW€åfÚNŒoQòv+ö…X—SÞa&-m¼€Ðͱ¿ö´³Ò°^^u¯‰&‚Ъ·ö¿ž‡ë Й¯5“øÀÛÒ$ VËùÁR%–uª±½&c;Ñ<Œ½1úªí·ðf'K`‰–@SKtõ,]Ì-6€U/–B³U[h‰ÊaéêU7ÿ$îÿhÙ³µ2Ðb롹Ü{ȩ倭—óEbl¡9¹ãD@0Þ³¶& c84õ\y­ÌB«UBÓ¨¹­˵'®W`}»jb|®f@ ÁÎX–q OÞŽÌnĦôíÏ÷`Xæ#Àt‰P#a¤Û Öç×ȯ¿“žºIÓr$[Owq–/ÉoÝ‚VíÅ/®Ô¨jŒ“ÍØ%ê¼¾žµÔvS½¤ð%ÍmU†¥…ÿ%MžË?ÍÚÄD¶‡fù)Ç Ëó9Xõ-£¶ŒÈ¦x4\Õ«n<´ú%Ÿ›Î<çVN +0LoÅÙÍ{€¨v%ì•€­EÃҢˈ‚-rH³I–à–fȯ 9¬ô HÍnkôÒ€(pIk$*V¶éîÁÎÀ¶X<®•ñ›Ï|¬å—ÎHÆxém÷"²2lÖ._ný vß"~§Ž{všÝ4òŸêZ¾µ¶ƒ±˜TæÚÇB`‚ÒÔ—1µñ±de¿°]Yc•Q}¾+?¤—ê þ¹íÊc–“úbâ'ýNn oæ¦8ºÉß,^ ë¤ï¥¸ÍÜú:OõÕŽ¦–ÓXÞ$ÓÆðf¼¦¸ºÄoFc¤°Ô®Í#Ùú4Ö™`åžêÏzµ¾å©¾~Ó„RF”ÅbäͲhó—/Ë +Ïö;÷d6–×26†4¡f¢êu¢èv"Œ‰È{¬4SûnÏ w¬HmÂö`»¨o;¶&oÛ¡4Mgžõ&õ#óö™J‰úöf:M=ÕQþi%¹îEG:•´ÁU©r4¶8}½8(t¹ÍA³åÒÞf,#¾m˜Ë\›¶ârŸÕ ­ *u|Ýg»¸*Õ.}…Ê,–K‹TʳiFïóˆ†NeøPªÁÓØl\é™aÉfC°Ñ숽Û©I v& äÑFf^ÍLŠ+ý±–'ÑÀ²Œ‰/Ë*Ÿ;ÂK°¯Â¾»öEØÕ±–GPk¾Æ²BžÀÞ‡½ ûkì•Ø?bS‡´Œæ—ÊŽwBM*§yj5–[ð¼%öµØ—c_€D ®¬÷F#ÿ©|à¿{ Öºû Ögæ5žrÍ#}2Ò‘^½ºOO€eRá]"LâGY$‡T)M· êÛü¥èÛn_еÞu_„]+°ö™í^¾}Qxk¶ÝÞˆ½ûV£ÜÍ#ñoØDù² )?÷nÝ ›Ú­/N¨Æ±ú’óWìo±×bû_ê‹<Êf)•€ã¨õ˜Ú·mb[¬ãöúØU°S±¶ _ïÆ:N]†µ=§6`ûJm oK“ÚaJgÿÙë㠰ζMãÍÅ>ˆµÝ]ƒµOi‘Ƈjì&ÿ-øo;°VHP™«`{n†Š+pÌ5h¶¾õŒ«ÝÐbíÁвG1LÃM÷#Vk"ê_Š^±É:…Å ÿêóÏ3'FMªèfi KévÆ,Ö†UÎÏEŒƒoj¬{OýÝ Èƒæ*¬oÍxñy£Iñ¤»\ãÃ~§ô‰Wç­±{b·ÇnŒ];’I2’žÖ¦]û:ìXÁ€å; û3l’ã⩎S9_JþoþûêÿßÞyØR”Ù¿î¼@RE%‰€T$ ˜]Ö¸««+"HRL+0¨k@%ƒèßuqÝuUÔ]39)(É,*ˆ AA@áÅ™¹ÿó«î3¯æÎí{û†yoÞ£¾÷Îíê _}uªºú›êº}…nÜ¥íc¬­Sâ‰:ÂB{n>)œ)ÀƒË)XKÜw—¹á&Ÿã 0¡1q¹Lšoy„á>·N|Ž=€´µ¸Bl;aÛLÜÙÎ8¼VñÅÍc¾€Ós¸ð[Áõ)8MHC—û›1¼‡ðBñø$gªÁêý¶p¶p½€`7}?SWðä¶l«ð? /ž,˜K; _!|^øš^:­­‡¼uÄý³‰2Z`>X,xÐ?ØN¿¾KÀ¶º\RŽòG ¯î¨ÏB_q_¸\xGé2åi_lG7ãç3Â<Á<*m¢âp`̃‚•bÛŽTŽ×ÌõÁÝ%» eõSßk…7 8ÜÌãU²“¨c¡€Î“… ÆW7þÓtœ¸· /Öªd{%p?¡m·_NîsZœ=œ>q¶„¹Óvkd7š'‡§ ï˜8%\ Üßü”6ÄZ8][¶NãÂaQó¬x~ eÐÁŠYªk€0¼Rú£Ã­GÒœÎ͕ɟù––ÇÖ2œ3€9ò×à¦⺋³éŸ¾Ø¹ïR=­u0°‰cÀ“»nˆëdé.Kø%ÒͶ"WÙåÉuäâ½F0Gè4à[ Ωۜ¦Gâ[ó·ê¼\yö,sò‘±–òÁ_wg ÷ n›nÇ^Û—öÃI*ôÓ&Û 7¶+ÕMöqü¦`™r}:r†¶u7Õc[«Ž­ý_•¯N<7ÄõgË>ÓùeSE 8¢ít·ŽS¸]R"­}À ðã7q¤Ê–"µÿOúÕíÙXanLÒ¶`›mµíÇ1ÍO˜ëo7±í;)ì|i{Ó0ynèÝÄy¶QFë­:2‡#8[Ý><Þ¿¨p•Nâ˜(3ITÏA_ÓÏTÉNõ’†ã˜ßâ¬ý§õž¦ä*½×&EŸ¨]…+…´\:&è ‰´O)gXÁ¶öÂë|\™¿U‡u·«ë,µïv¿^°X·Ï^G1Ão ްo+îÝji>?Ù£‰*‡ë[rªît¶N-œ.¥qóèh):È©îQ-ø&ŸvdN'ù—•ÿ ,Ë Hó¦át ½º,çºËÓi˜7•zё֟êgðs~µ€ðÿ-qì"=ÕÉ_rH7ÛÈã~`åæß;š¶‹ Âèd»ów;b'úZÛóaÅYêØí¼uŽ´Ñ“êF Jà/hÛj{8¦<:½—#yœ¼BaÄ7˜â¬Þ§Ç͆Ê~»€ Ø—Úâzˆó8ž¯ðòÛº³*†W8d,ÓÇFnÝ.Óz$Ýý†c³ƒ€¸þâ¬øts8^h×èFŸÇ46·CÊ7aòPƶ:ýgŠã/t¤=EJŸ©¾×JÅ‚ëÅŽ´ޝ:b¿m'L>Žï,»*àòéKÃ;•™ëŒm_Ï[«Ì¥núѶ3VSçK¤î8öüõ•¡ü"Á}‹NΉ?_°xlø¼Ÿ£ûäé*ì1évP¯ÃÔ½GYË”§mæê½JMÛC›Ü–«v»­äpÌ!ýD~ŽîctµC:œŽþ'ˆí! o®wW…o\Æœw«üØ…­”qù¶ÔáÉyWícÜ·5W¶ÒŽˆæ'{š§„7OœΑ³uŸ0¾ä”bRlçœ À”ëfÑahî¼Öc:^\ÖËM·NY .h„AWuÁ¦ñ_Q>ôsáµÚãsë>QyG ¿Hwšó¶i—ø7 Hê<܈î(Ï„A}Ö×Zװα9å㳑±]ÅYÿŸ©ž¥æ6ÁöS7mLǃÓú=š3VÆž" © EL÷Ït\}UÙ±§ÝpÜ­Jß²TËÍ){eôŒܾUƒÛ?LNÓ¾°þªëYe‹\Ú@Çá8¸<ý _¶£'zâ­Ûù9’‡´´\šNyß`¹~vÏIÅYÿŸn>)¸nÚR5ÏÑÛÜz¤LÚ~ÛŽÞ³dGÁõ¤œ¤a·³‹Ç˜<ÚEwj»í!¾×?|Ãÿl©—öÚvŽ>¿HaË0® ÷ –Û’ò“¶iϲb—±íŽæ³Ý½Ìõü\‘þ Ân3ýéº9RÆc€°Óœ?=b¿Çu<^@l·¹>@qÎÇÑín­z–Ö“†Ç>?Ua‹ëòy>vt¶N [juëEÍÑâ:ÄǃïÉì…é,_Tî¸Ö£ÇÈ¿ÎçtŸ§Gëþ‰ò¯IA‰`q¶ìÓƒçåz|‘¤: §Ñ+ë*þ·e¹t ¶–õ¹usq"Uv©Ågz#ÿ‚¢Ðå6ZïL±Û¶ãdYÌŸÏ{=z\Pî#‚ÛAû\Ÿã†u´ÞŸªŽ5¤ßvØ~Cìc\¶›î¯_+ÝNýêò ΨxœqÓå¯lÆ2/cÖÀÆv¶§¼“ÇùÛIG?eX é´‚å¶ï®|袌¯1ŽÄu³'µÍáªvø†óGéµ£k^Õ—¸<ÇÿlƒÛãs{UiÎñµý”3G*¼àüæÌå¿“ò vгöŸî‹é`]˜˜¶28XÉ^sî¾ñÜr£Ò[¶ç½e>ò269vŒ‘´_ݧ©ËcùÛ [¼¢È½Éö8çtbOÕuc{mÃQe…ûåiçƒXç\+yj¹I2CsT7¾(á•Ããr"ƒ0ìx¦sïƒ(Ϊ?Ém 2&l0+(NWpšøâd²?ך™AÂàã/íMÊĪ›-ùH»C¸®Ì —ØØ«ø¯óÒ©ãÔcOÁ(©ÝQÌ÷…k˘©Ó‡+è”g•JkŒ.›TâjUùcÔaTÎÖð'zß8˜t{:Ûƒï…o¸IYŸ‚Ó„ÁA¹Õ&í Uùɇì?‹Aç_FM; ïÖ$¿'ÙiÛDØ.$„s.Ç×Nœ~…¹¹PÛ)Û*ä%ÍeZÓ}O ®×m}¯Â•¨}‘%¥ºþKñ¯¬ÛA’}¨A·ùg¥ÖÔ–^+‚gÆ “Û„o ØO¼ëQ0ŠyâæøUá?… 7 }IÊ‚aŠõÝ.¥8Ø ßÔ ˜Œ-¼\Àiaìxl9ÌñkÂ]wÕø"žvp"/âú‹³â“8òqøžÀµj§ï~…Ͼ%\%Ü"¯“pSÛSx·°s™‘:Ò~ oh7ùÞ*œ)¸ ÖʸýTøó™Ö‡Bâá›xœ©/ ßøƒ‘]Ê 7¼M„]…× ØiŽ8R'×þ‘:‘ÖúŠØü9S ¸ß—¤cÁu2&^ø¹ ¢àkèŸéä÷]i÷ H;®5ì‰OóÄ¢£Ëòí:?ÕáÇ_U“¨/”§*Ï_»èµ=‹•ï9‚…É‹¥Rê¶ã‘ÚѶ]g+¿%åÇq­Gòø&À Èõa—u¦u1IÞ$\.|M8[øwá¿V à%å0 §zÚ…Ó‹ì•҃ԙċœËnNoP„õ›_Ÿ×=ºýuÊc÷¢²Î;u|¢€ c‚°ŽùÒw€ýŒ‡”«´M¶ÛqV^œ³g © Ô#i¹Natäóu°…Âw Ø”ŽsK“>â2ÖSu,rWRá/unÛr’ˆÛÏØwÞ$y2HyÓqxšÎÝ–´ûü #i¹"¦ú“zÇ7ÔÑîÚ÷uIÚ› m?ô¸]ØOØíuŠŠ/ƒäšMÛbû‰Ká¾"n'©Ó6÷gv° Î:}š«—)“¹Oû£5œ^K¬®ZZû;í{Òþ€ïtÏt]÷*߃ö0\'e-XÒ:ZÃÎÃÊT;'ÛmõXg5ÌÒéÚtž|œ!Rò¯Pt”€;­õèô»”÷ ‰]»•åÉïÁÕZ–sO4èyž€¤“ç¾PþEaë«Òi{®S^½W ”÷„ÚÎÇypâôX|1ù¼êhû÷VÛk½%|Jx½Àò47·QÁ)²¶Îàåda¡@y·1ÕYv[¿©r–´Ÿ×z´=[*áýÖUUW»øtq:ÎÓ-ÂOþzdeñ·NƒÇƒó2Í»ŠHܶu¥årºà´¯¤¥íÇgR¤ý‡‚ѹ@ŽÉßIБÂvo¡ø^¬TGU¸“UižøÑÙÌ+ ­¡#c~H9NÏ¿UæåP·>_‡U™TaÃ}Îñ•‚þ^úq‰ÃŽÆÖªú\o:ÎW6ëBZJݾpþvG÷ÓÓ•èþHùIçú=K.ÓNŸã|½°*dÞS]ÄqN]i}GèÜÂíÔFÒ|Ÿaç⪾Oë ì¶^¤°ÇÇNõ)9Þݶ7éÜíhm›ë»Oy¶¢ ¤oEΪOÕÖÍÀª¢÷x&„Aõ3Žó ÜNÿƒÒ×,Sàf¡Ø<èJûòìR_ë$œÚå4= žÄiÛ¥y'-×¶ƒužò[ÌÏ«ŽÄüE/èæ†ø9ᣄ*¡½Uõ좴[ô™÷V»[Ï‹lkIù-b¦~¦œ³LŽNóѪ¿Ó¹ë&iñ—Ô? Û Œ•G Ü\!¬'l* ñ¸z’”us°ž^Vè2èß:Ð9,½ÜP7 ô7‰ôFá1Ä#ÑM¤¯ÎÃ…Ç@è¶.÷uZ×Û•ŽÐ®ªë/fèðá¶0¦<¶Ž×í›ç;•:=Wu¨b²í+rëÂÄÀa\“KŒY÷QÊO:ö,ëv™Ä”iAN–ûÃõž•h©S‡³»ïÓÇ‘i\q´Çõ1Ÿo\*±Žò´ã!£U}:¾ßRjë:ÆLZÛÚy'ß´;9 vÞªL¨e½ÕVï,‰œÐ· 1Ñ ?šsD8›Ô6EÅÉc˜&² •_aà ‹&„‹Ž“̦Ý©¬cGåC„è žÄ9NÉs„NB~‹ÊŒèA°›g¯ÂÍß¶Ô-K]û·øü€ð{Á‚NÚfÝØn8ŸB§ñ'qÞ #Ní¤žôBÓé4!}ë; ¬uúŠ `/áÊÌú¯Ì2å@y÷Åþ¸ðÓ)9¦ž°l~p‹p•p¶ð!!Ì¢Û÷€4½B Þ/Pim¦R1ŒIì¡[ ï¾"œ!0ö]ýä1¡àJ/´}Xb]¬Þ.l,gžÍ?°=M¸E¨#æûMʼ®€ÎÖk…J®@P@IDAT8úUj;òô©Ë*Ø“0¿p“dLñÇâ…úÑ×Z·¢²,'ºõ§ÇÛ ²ç=¥Mô›ç:f:/céÂ.B»~÷|ìñpŒòÝ.0nz¹?¡›¹Š{î)NdëXãÚqÛvUø3v_9—¢¤Zî‹™o×=Mo·Ø“ïqéwûV RÝî÷Äß±£c š<ň>¬©Ë¦“#Éòe‚õ*ØVœÎÊý1Ay ºÀv lUžTõ(ƒ‰ññáš2ozqõ2€ËâÑÑ\]'<ž«+éà=Z…”±`y°·“ÇÜÀ)m»Xø†ðJòU\() åé Êâ ~®<'>µS§QœŸÿUÏEœ::1c‡×ǘ8X8»Ì‹nÚA½Uu“•|pô'N$U¶©ýb'öÀã±Â%ÂGxBˆÇNò`C*Ä!¤c+GÆî¿¯þC8A¸U@\Oq–?ÍÜ!ô5×ìÆ\Zà~€¿§ <êNÓu:MÌ5«¢”©”Iû\Ì5LjoXÅYŸ\+Ôs‰ðáŸêêv*K–b€ë¼JÒqñqeº_èg0ŽOÔÅY»ŒÃT¿N£xìqüï2®“e–iô — W Ì[Ø‘Ž5êG¸®)p/"Ýñ NQ-w¥áA¶C7Ç# ]d¼1oø¬ŒÌ„xÂÁ©èEØ“Âä‚XϵÅix­_&Ńóo®³m„ ô™'_ã>$âTUýéAs…òÜ- Ž#Ü‹ƒe›ÖP¹^,êBÐÁ€æˆÍ\Di›t:)äaà{ðc7pþô¼Xñ8Xä­#怋Œ2è¤>Ç+8)¤Ãñ³„ýËØ*¾Ëä)O8W/|G .O>i;ÝQ¨7å cæ>±×<^¢ðó…ƒ…Ã…MÛØã¼ F¡mæ]pËDvˆ@/œ%˜—^Ú¯b«¼À-üÁÏõÂ+„Tà—<ÈÅ!æMãËèi‡½³™à:¦ePÄç…_ ØàùKÁ¾…º<Ö?«ðënØŒ‹Ö±£¨,ËÆJ•øº¼Q¾Zf"n¹L…Y‘„à¹6Õg{p®˜<þÓm_Œlóa»7TÚzeºãÚdQ§O–­±Åmˆ >Òöâ à\a3uÑ®:¶*Û¤´ã`2qˆxÆ6lå…“ö‚½Oø€ýô<¸oÚµ…~$v“o}áSÂÿ LnĹ|X \¸4à ¹«8Äô2æzã$í„xøGü¼§ùéoêdÎú¼€¤éELÿŸ¾n¯– ÿ‘é¸þµæ’3Á€Çs«WŒÇõZŸûøü}Y¸Uy{<ùA™gƒçæ•J8Oëô¸^GñÌÿ]¥ÖE+FŠjô–†éÒ.nz®ê˜åY>©« ub,‰ª¶±wFê`ÕUÃdÅD†x Ý©ðO…'ÙA¨×7;Xœ3™,/ì PÅÙ²OÜ{uy^ÛBÔ’2¾ÎÁ\àhÚÁªS®5OZ?iØo»HKÓ§s¸ÚTØDàýGOü5„ÃCßo, ¶±8«þt>.26Þ{u¯µ¶Á÷j¾e¢Ë–§ôÅgÊœ­m,£gÝ^±ßýGÎXUy­°«@û4?eR±Ã`}/W"·þA¸Nð¸Vp•ÆáFÂY Çûº¼§Œ€OòµŽ=®…n{U(CÙu…¤Ucœ:®~, Ä Kóè§]ÔÁÊB« ŠÊ²‚`œøz¾´´…~ëw, á^x“ÀžAÇ)ÅcãVý¾Œä`ý¬ÀÝ/0Ç·ÚÅy]¥–ƒÕUKÎЉnætHqã‘[D¾‰\¡ðKô‘·ÛDàÄÁ{H ¯ìÄ=A@ªì²W)ƒ¡l* üºb;u°\vnºV“ž+ì,EÙ'¾–~Uꀗ^®ÙªÎEk2@ŸÓ/<ø]Í2²Ñ¿î÷;:eTÚ‚61Eét”Y*·TŽ{¬TcÝãŽ?®‘4½ˆI>=©%Q¯`ü¹œ™mr§›pkÍž¬pˆRa áàðG2ƒÁùœ"Žß\±à‚ãv,sZOy:y`Àxb÷¤é:yxüÓ«xRïµ\šß¶Ð~Â{ { › 턼ØÜz1p·n¯‚]Å#Ûe¼Ëù¸¼ËckR7oÖ`€žT¬·ËåY=B<Àã4 ß/ñÆä:ʨ)§=C±ö¶ óXIu1ŧãÏ/#™ü­+Í—Àvéi^ÂÎÓ«ƒE»}±ºq™°‡€pƒá†ÂÍ–|¶]Á*¾®¸Y>¾GKÌÓŸTî¶²,m\U…¶Ñv´Ÿ*ì*à`Øù0/ŠŠB_›gV2Y)D—ãœõ‚­Œ[Æð¿<þ²ðwÂc„txá:€ÊÁ ÄÓ~ò E6(µ´^_>¿CéÙù ÕYI€¯y³$iƃCÏ\ ÕrÃä k5žè7ÆÂ¼òE£òK¢Ôjxš×a«+_–’æuØÇe¹ªC­yãù„&4í i.ª÷,µZ{eŠÇ£Êž+ (¡45¾÷Ãù¬ÇÇ+•°@àQªË(8E|£y²b™ ÿ xÿUU9â™ð™Ì/×[œ-ûô#ªú—å,Bè!ï#[:œc 7 ä )‚}¤qSêUÜ)o®zÕÕ-?{´Ø+ÔüU…XÅAR[‹˜Uè ð+aOá«Âþã€>OÅc•ýoXùò؞휥c{Ùý1ÁïŒ × \0OÓÚæëò¤×½þ”µ'A/u²§Ë$V)¸§Lp™ª|9>3Ð 35¶ëØ0”ù£³ƒugy1ÏÑÛTÿ~¯+{ñœÆŒ]Ðu=´<ãZÉšó€ÞáÕˆ¯Öz‡¸š•N4©ƒU×~?"L˜;ü7R£;¾…åR;½LÌÈú¦ÂÊ ”k×÷LÞ”û©ð3q½ÅÙ²Ï^¬”º+XØá›ÉY ó˜»A/ŽöSÆí@/H¹ÕéPź±Sšô%8‘é*a_JVÂBîcV]ùCâ•ÂEÂóþªl·ô%òRáCŸâÜß Î:I+Veq®‡Ý„ÝNøà:àœøTˆgµGœãBŽ;8EÛ ¾ö<&Õ“0~½^U0¯f3ïUö¯Èø~ûeEÚüp¨{(ý⋸-aÑ0¡Çi 9×+ÈRŸO4uWlÈïNõ„•Öæô%мBÀYri>‡ÑÅ̤Ì*ÖÕQêÈÅÊÄͽÝÊ62™#œw²#fÒ7 ôÕåÃõ¼Kep®¨t³JO…› zZoLi‡Ñí:7è‘ö‚~›7ˇ£0ι±3Î~ àœ{)Åünª³…o Ä‘o6 ¶q]"' GÄPñÍHrAÆ£+·ñÅýDø±ðkáf‡’ÍßüÁg”ãÚ}¦À5ÏêglÛC©©”tŒRW–ú d¾êsµÒåìz³bU§9'¬½Í§)7ËÞJר)»-¿ ÍÆ9“Þ”,œÀ‘/œº+6Tgn”uûœSô1Ù1é~_8R ÿˆOóétR¸ÉPf+ ÷ñâ »8+>ÉË\Xb>œ”vâ,Ò:Ùà²æ£ŽƒE»¨÷ÙÂK¾Ù”§´…ú<¾¹qCòMé ? ð¥¸8UØB N—Qp`ÁßL{UÆÊc'å¹W+{~Æ/«©ŸŽà4¿Œ}8&ãk¶ ¶ú:ø°Âv®w8“Úˆ0q^h_¸L¸S¨#p7ˆØNt¤áT§çôšIÛ˜æÍáÌÀÃŽô¨l|c4Nj¾è+óå„i 0iÖq(\ÐÖBGT¯Sü]ÂúB'§À7¢í”ï¯Òzƒ*b—ÅÿF×”‘U+ÉÝl,UL;ts8á€6!Ç pÈÍ"½é´R|³%ï„Ï ç 7 UÜxÄ‚tjo‘£Þ§õps´³\¯ä²\Vð±Â=ýøp½þ|Mü88T`Tá­•†0~fãž~d|¾Zx¯€pžÎÃéø=WiÇ ?Rq~3Ƀ£É¸óKÄ "\{¾[õ¸^öƒ">/Îògf`0Vúñäð`4¬ä¥Õ‹žÄ‡ÕëãfÐÍ¡pé`òªEG>Ÿßª0 ÇgS?Ý¿üeÿÆ2ɶM͹ŒƒË•Àêù:ÝÔûu°Ö*+Fw;[lóîJq™×7”ò´òà›œ|@x®p¢Àž5œ+êㄾÕÊsnúIU÷ Ùy+“ºÌÉ:ʹe™Ûq] ¯‚Ìåõj@ªÆåFEò¬üdÜ1>7Øs…ào¡]>UxÁÎc”4Æ@ \ VrDZ/Âîv­¯W*t_õ¢ÿáž×ýýpça•l¿of«dã:5нeÍÑ0hÆš©‰«—,LfÒ­šÐÒ ød–pVÙÏdLÚºÂËp»›uª÷åCpBªô’n'p/b‡³J·ã,•ÂGqš¶á •9NxH€Úbܸ9¡—ºø Ýu*8±>8º»Gô6"»‡¡Ý,Ku+Õ~EX ü] U0¶pœ‘vã¼HY±Ÿ‡¨ú'ŒÁÔ±gÌØæUøx!ñŒWÆ…Ç–‚3*®;ï-krœ+öùÆŠàC܆âl¸Ÿ®c¸ZgV[7>Ò10³–¬|Ú»q7ë[´2ؾImŽê&»&€ëµïªoZL3!«K¹WlºÕãÉŠ‰´ÊÁB‡uÿ@an>8¯à!ÝÀNÆ” eq· WøÆVœ-ût=Øèú—¥V‡\ÎV»œn yv/3TÙÜZÞü}V ÿ¯Ld|Wõ±íiÕ3Œss ?·” ÝÝêu>нPø€À2E;^ >¬ÄœøF_Õxú›?jªW•›éx÷+=¯)+kô-öSøp™‡sæƒ!Œaó~[…n#³ï,ËTd8ºî\:pECTÐmþa¯%÷ þ3ßèÞ}3 ]YGŸ p¯ÒªÒ iŒ.sFål·^xŠn¿¯Ð]pë‘‘pTã°ðgò§ù$‡Õ+&|¤î€gE¥“ƒeGâçÊw£°µà8Û uwªßåq®A@êŽß"÷Ì|2±é¦ õÓ+k–¹c&Äóˆ‰ò”¿$zÖ=—WÙ»¶,æ>akX `ëý‡TÕ]¤æÏc`•t°&*}S°q`œpãͼùi-·/ O×t¶·ݯ9žÕX#¬g‰ÅáKŠûN\áÝé#‹nZ=‰,UF.¶*áÂÃ7஘ØêõDy~©Èk;½¶çÌk—©CœPÆ{¢¬"ž6W˜¿ìÇgí?­ƒÁoÊ,U9¶jð_Äש«µ|·s¾RO[W‡uê ös}¾Oà[d÷ðÆøx¸I¼~ÕhÆN'á‘0‰âlÅ~ÚþK3¸†}ó#ʶ^£ð‰Ì¦~þUaRØê1̼áqú<…/܇&æo»Rc+C«hˆŠÌó4ÂyÊ]ŒÔ«šþ,¸Œ‚ËkÈ f`•p°ØO¥_ï‰ëóøo4ÞÈâEÙ¾)ù·Ë>Nùb‹³Á>}Sø¥ÔüZØ^°u4Ã7¯-„3…8ÇÉ"¾]Ê¾Ò }B[£OìÒŠ;º¤·K®ÓçÔݯPÖcáÉ¥’ª¾»®Ì›–é·^®KÛ]§í걬–óe örÒ–vÎá~Šÿh™î>ÓéÀb.÷8qˆí*Îfç§9ÇqB|^œ-;g‹qí? >èqÛRàAõåò}0À$¾ÒJó+ºÐy/W#ŒkôŽÇ7Ũ5Íë¦?7<[3ÁþMV«áiÕµ™]—eC.œ*ß ˜(æ°Æ¥´½š k˳z 9ª‰it(1ÎD:Õá§¥Ó :Vx뙈VÛ ÝjFä2èiÿxùø/ÚßIaušz»ùHØO¹öVÞíFVSˆ.Ò-INÏ“CÚîér¬ž¬iô¹Ês¾à‹ZÁ¤WGÊxfßmr¢Èo…_LlÄõ3ñ¸ íF˜0}‘ƈ–zœЫ𨌿®ù‹Ø“uøÜu8¾îqceÜH¸YèÔ‡8aêõhÇá:"ð—Ž‹9¤¯IÏ‘¥þ^ú)åãM*ÿ„RÏõ:z Ð_îC§y@§þœR Çìë·¯êVeöUÇ ­üQ? ׇž>¹Ö|½¥mq½YeTsžªt1&×]œõöéq±kYŒ¾ïw\›kŽÌ{­¶1öà:þEÀÁ² $Ôe]ÿ¤0uÀ\ÎvñXºU†òÇ$s^*´ Þàoç2¾âÜm.£kÌÏ.*áþGßÊ*­cm¥kǬ'?¾NA+UqµJôòÖõÆAaicTò>Ö;9¼tüäpÆÚ í]˜«¿ÖÔl~xªz¦¡ro.cZŚд@[¹0[ÛÜPã|cb$>&äïd_ýv¨Ë{Bõy} ”É~U~ôÑòý ÌÔKe‘xãåæ„Sw‰#k™èzq°|±°Ð:Ù´Vù@á2­é­çpAû¹¿¸L$ÎÎaƒ1àÙÉ ?Uä&¤â•≒ÕÁsË\ÔÕ‹˜ʽ@`Õò+bñ´§HƒVOvx̃XoqÖß'ºÍq:—â†ÁgÕómeV8Mm7Ç·)žÇg?¹ÞªVŒ­gãREZog­ÓS)Û­¼9xíGà ›7|TÕY·®ä;Žu´ŽaçyÒv°ë|Pq{X¹ú§Rãme›eì¥Á­œ›·ç+Ý«ú«[›Ñåyí] ûÚqíÊ÷[W;]9® t¬“¸§êxMÜlR×ã?8yA?xBX­ÕÃ.á…­»Í ›Ç/¹2 ëvß\‡µìblÚJœ"ªAuí¥ðkjelAst oº¶G•upÞi §¦¤+XÖ“¦;ì‹ãrE-à8ßñ v&8b#ö¯ÊÜê,³ÄÎU/–Ë2ñrÃGZmõùíErLÇFÇ—ÑÓ¤3FhËû…+ÚÔNÐ'w:œ"¼Yè¥o”}Š,_S¢'OÐí‰îT…¹éÑOØPw<(kl?ù匩w ×–øµŽw ‹òáðØs‰{káir‰Àê!ù&¯+…{8§}ÖA;i†À­u«0ösN=©Pyqþ$Ø.; ¶#+AØq„=¦ài["$izSÿ“›ó;ÉVe¢ÛÝ)o§4œÑ ¸ÁþvBœÔç—С¶l¬œv¦kJ2zŒÐ7'ß¾.øôœ‚îOk úÑá±Å ã=eéV‡€ëÓ7ñ³Ë<”7GeTÇNé‚WÛeÞ]‘üa€Mn¿‚µÄ<¤Ü\§¬˜VÉs•ðá^Áã¹*ok¼íÛQ G–‰Æ6í¨3~ÑAпŸp°8‡{tXl/õŸ&$0G¸¬-ití!Pu´Ö«¨)’Ú4%a9Ÿ¤¼]ªºÿ^h¿˜ä8œâÿ~#¬&0.뜠ƒþÙK8Q@ºñTäÊŸ3ÊÊ “æ¨.ÐâÅŸ ­1@+# ‹•ú‚¿"7ꢽƒLÈuÊÂ3㓱ý¯ÂžN £.zÚˆ`?ºá;Z¹$­Ôç ý õÓ'Û o*#ûÿ„ …tL»°ñ±8[öiÛ9Âc‹6+' ´×meùþ[¸ªŒ¬{Ýb‹mû]YÖv”§“õ=S/Îà¾k'”§þ´œc#Çë…ý„ÖzH§Ìf§óœêRô4¡,yál#ál??á±Ó¼ˆ ­v(ª­À=¸ù¦ðRÁׂQÐåv¼EaVâà ;h‡û¦µM¶ƒò„Íï'>T°æ¼Ž›ÍG·“ëâ9¨uÓwô°|ZØGàÂa&¯9SpŠÀ|Qa\ýà¾Go7®º¥KÅ •Ùn_Wr:]€] ÷“¡9c¢1:uð,:9l½Z3ìÙlèUãáyrª;‚…ºÜšKb^_Ô”g .|±/þq Ç9ZIûûæá£CƒìûJ7Ò÷P™/,;X>¯£‚‰ÉÒ©ÀÉ÷&=Î)Sg`Z7“þµRu1©Å§Ëqa3©#Ž+κ²úÒNÐã6}Ká]ÛeêçòpðÄiê€3òÕá)-ë0:(ËͶŽÀ#ù÷ÂÛ…/ ”µ ö,Ø` ’Ý.Ž\+ˆoZ[§“ùËÓÚlFö.qÌà|€k„ÿ¾'üBðä¯`m— ïv*Kµã‰ö÷.aT@Ü÷ÅYçOø¢O°ñçeVÊ»o‰‚?×ÍjÝO……nB9÷yÑ˵u©p”às÷MZϱJ¿Xø­€}º òÄaº·¾$l-ЦÖ:…²º­?Ftø s5ªð>7rs£`tc ÇÃ…Íœ¬› m¶Ãí¢úÍVbSˆë!¼l!Ð÷”µ£Ôm“óÏä{l>Wø8ú&l¦Ï˜÷þI`\[h£Ûi¾8¢ GìÂñ‚ûýä'|­õG:f™A–Ë`lâTí&üyê‹?iWóDío‰«Fû«×wÔâè: .?Mrªšº…3YŒh8°Ê4¬ÁÀc@hålN¢ ÎEŠÑ£©E ã2=«ƒÊÚ}(XP–ñÕI…ó\©Lðä µõ‚ê¤ãR%R'e<Á)XKøK«ñ…í¬NeqBÞ!<^pÛ:åOÓh uQŽ£¾Hk÷ŒÒ̧‚µdõZ¹ŠLp‹þ¯[ Ì9Ç~¥ÕæÖóV½O*#Üæ”ŸÖ¼­ç\™”ÃÞݤ¸> NŸ­sð~ë‡Nׯ…? üÏ£2׉¾G¶vp®ÐPÒÊuz.Àaýƒ@Ÿß\¥B)ÐOi}„‰ÛT¸@8V8Oø³`ûx¤³Ž°‰ðGá~p;}]]¢8þ Á¢,í·Pö¯/|]x­€C×*Öéxxx£ðoÂzu¡—úmÇVáÆŒÝuÛ°ñ'¨ð1ÁžT?u›þèÛQ8Sø¢€sê4§ÉVŠyð6á±yÑÍ‘º¯>'|V¨‹ªôå7—ŸQ ûhOÚ÷:çôÝ ®›„ÿîÐÓÚï*n?®vÊøGøOá­ÂšB»:±-Ë 20#k$4t ÒÉ<œú6u­ -½-/Ü&ü^à úöâm*¼A eh/ŒEþhÃ9`u¦‡z¸Ž/N¾"üNà óå¦ÂŽØsÄí¡¯áø.aS¡ÌW$ü÷"ææ¢_)ÐØÝ,ç´ÿq¨ÀJ_+ÀÝýú%l. o'a¡¬ùðµñ.ÅQÆcYÁiâ¼ÓVP„ûäbÕO_(×Úø#Ž´M…3…àëFá/Âu²¥°ƒÀuƒ0¾Ê;ü!…©“•Ä*a d™AÀCú††O1hZߦÎOÔ, ÏTÏïÛücØgî ŽÕ4)iHÅêu 2BOç´¢T\¨Ã°‹ ‘Á/ÈÆÙ6OP¼½]ÓϵZ½:OÎÖš,gjIJÙÒó> ^¯ÔH]Wqn|ˆÏ‹³öŸ¾Pÿ¦ä«&æ:åà…ÀÍ“‚®ºBðc«n9糃ÕãO¨À‹þ ¦†=!Ðfxøky¤¿°©‡n»²M~’pwO‚ïQø>á£7nT¤aÏLˆÛ„#°ÀMÛq½Ö·› p“÷MòØàv„öоJèP)èCÐÓ: þò ”›-ã¡®/FÔüÀVê¡ÞO /(ÏÑ… ©Ð_oOP´xi'¶ï,%¾Nx¦ÐnLSöàxpƒ=R¸A¸]`Œ0F76+Ã:Li»Çã 9YÀnÇ»Ï×TèEhƒyx£ÂŒ£ì">åŒzà–º§ýKp^%Îï~áˆ#0W1öÜúÏíQ0ŠFÒfƒ¤cì}2hwáqœy,+…¶˜_•ˆ‰m>èGá…ð—„S„§ KþHù0o«+>Ë 2àÁÛwñýT÷éÂzK“Ã⋃Gkh–xÖÈ9U‹â3ûíGV/oZ¼£J•ú‚ë•Ò³Q¼V´uòs7sµkNn:Ñû°R×(xîHSNÕáçÑ8‘Åj&ÛÁ LG£Žž«o)À ®ë`yÀ£bA‹žn§p— o˜ä8¯¢“xOP—+|o™êHjë¢:Úäéæ`a?cýÿ,\,¬/0Y0)UµMIµ„60Áá°Ý!ü£ð!áy‚')+ûàyÝ2G]îÈî²?&üZ`¥bÁ.tÇk‚ˆ! 6?Qø@=“׬ÂÄã†<Ü(-8¤Ù^ÂÝÜÐVŽ)tó¥ùÛÍG”ÅFúü%¨ð?Byú·ÿëRpŽp€à±m©ÐFÚ@·)̓Uc›ü”ç’C„KnpŒéÖ?à:¨ 'hû:LçA/ý@ý+¿Ü`_ˉÑe®‰#o?[¨ûø£îÂW…]Ú‡ ­}èqA9ò`}–Ž·ƒ8ç§Ü®“ ó#iÎG\ÚÌ»³MÌËM2ì áÚÖ®ïÛ–Ž³´ßˆæŠ#úáîÇÿ, ‹Æ[Ê º(¤ñELþ*­C-åÍQu.¯1Xö6õq†Mócš\æÇŸ¨ÙW9ö™Ó Ûëñ_#^Vº$äTqÅ‹L=)å«#Ѩ2¾f€É3ý уº]ñ4Í+Xíòµ‹£íÈ„&Mâ¸ðR½:Bœûý¼2޼SÚ^ÆW|‘ÚDg»ºZË;ÿÊ÷yk>Î=)á€0‘3)ád0v°£¡>OFÜÔnþA¸Z¸S°t²‹<朽Cýˆû‡²ß®ŽÞ ø¦âvÒ7n§Šª-n GOè[(|Qm EFëáì G;rR ãÇíÂÎV8_·#õtq„8@¾!¼Gø`ýî Eõ%ÔÁXÂ~¸y†ÀMœzSþuë%?HÅ׬4ÍaòPŽkõuÂWÆ!ýÂ5év*8©Ÿ2ØØ*´Ÿü´Ÿ±âq3ªðñrq˜ÌWžNöÓcÑã‘ú°÷ná…§…רSÅ[ÊíIÛ„.„8{·çÝŠ;ÄRpìœÇz¬ Núu¬Ã:©Ž0:‡!ô#üüŸð&áß…ª¾WRå8#Í‚Núß\Ño+ãtˆ÷œ,„|ôm"Œ-ýpežT|²á('mÒª“ó4. £¾T‡uT§vª¸cXµÙá “BS?Q3>v’C³Ÿ¾ý·§V±¶õ;ªâã¿ôu üj`³¸¹8j©» @›ßåZ§®sÇn:»¥Ãtô\smÄfS/þ|¬.u9ì/çcõò–q­†!¾D#ý¡ø¸…þžÍ+Š•Ÿ”Žl˜/7¬×e®÷bý©1®WL„ï)íÒÆ‘qådáæhyѧÇÉcÌÉ -½Í}žV´âE¬W6¬£ÇNÉ „w  « v·›¾m'Ž§Ï¿'ì$/¼FÀ‰H…þqùúig·)Ïgп¤cË>wyÛg=Jš|éiëü­B?Ѹ;S =\Ÿ´e=Á\(¥N{~§œŸp>X­BöŹ_Gæe·ÅÇ”“ºý%5“×,up!ÖI˜¶YZûÆñ½Í3õáÿL8V€¯Õ…TÈë¾sŸ¥í$/ýýEáÂÝñÞ¥#cÀ:Rûî…+©Š?¶#å‡Õ8ä‘‚Ó}Œ }|¸¼ç[ÛmU>_ÓCè¥O}»Þ^ŽýÚè:ú)ïö¥vo.…LJ› ÜH¸È™xÿ*0>¸øç–t2"®[¬kØGlñµ”¶Óõ01rC`¦­n y™ ¸éÿ­<ê0MÈÏøer†¸OÐÕÎ^âqJ°™ÕB&DÊP?“0N!ö> ´ŠuÓÞÖ:Ú›ÿ”£G*ãcø'¶2áãÞ#¤sB/ã‰þHyƒ«­…-nfœ£~åæú{›ê‹yJõÔµ¡n>×ÕéØnlm¢´eSa=›vÂÛ]ÂÍí¹W°´ÓCZ][ëæëEg¯yÉßMh'cÌcnà l$p͇qÆjÕ-\Á™…¶z<:®—ãl状¥×a/m›é¼]¹#Cm±Ò<=ë xSã'…ƒeà r®¡MòÜæóâÓññðʹG†¯ÇLJeÞ.•À-¼ôıòÃçlP2mŠpñƒºBÿÀí£ý u¢§\¨¾XÛñ‹>F^V;ºÕ…Mn+6§7ÐneIw›Í9:úºFêT¦<Ô¨—#ö¶ãZÑm…r´)×KYeº` 61κñfÛ{m3FÕÛÝK3^á¨Sò ßcVÁÉ0e{¹†([GÆf»þï‡+t¡³U¬Ÿ#àSàÇÁ—ÅuÎÄ8nÇõºÎZÜ¥ÆÚèÊ# c-'kCîá z§¯á•zÊO ¼ø³ØS¥®“SÃÖõªëâ‘=~™?ÒJËŽ“¢•¤¹zÑÄ©B™ôÄßBä„ûxxÜšóÂI#óõ<\ÔiµŒAÂ…<Ö˜æjŸ×:>¯qH¸ú£321aV–ú xr¢D—-E=¾Ië6µ•§´§6Ôíç˜Âé+êØj¯û{R›™|¾¢l­ª×màæ‚pn[Íõ°n¾vN¨ÇuFÌñ³™¯hli/í±¬ìíq;fêÈøòkåŠ:ÝÿÌeíÒÉ“e1à«m’‹æÉÚ37|I+Y»FŒhóÁ€äõÛÔã‘“ÆêÓO•p‘ÿ'½WÉ‘a 9J\©:§Ô€ò–NžÓû9º”]zr|¥Ä™µÂÍ“6¦ÃÒÆažìüæÈÅïc©üˆœ,Ú’%3È d2™ÌÀz_yb噣 æcqUg#­î´÷¦‹=U8!¤ó:ÖªŠ·©/Ò Ñ"½A]›BÇႹãáº9GÅýh¯IÐ^*@ò:…¡¬@Dgíx½'K+P8IÚÈ~œtÛÐÎ9WKUœ¤Î•Nµ‚¥×Mè±áKµÁÿhíÇú¸Vа-Kf 3È d2™i ôì$ÈSŠeôÑlž¢÷Ŭ^¥Çz8?©SÂ9Ž•ßQ],½£ŠšÑ©RêùÚ¦ûí©Â©‰‚Ã3ùÓXŠ›à˽ZÍO†­šÅFö½ØiÕœ˜|$hsZãrçèÑáb½¸t/=¶¼BöæG…­,åóÌ@f 3È dú[…ñFo=&üGíRú¼V°¼Jµl¥Šï7éLÎ×ßt¼Fû¬Î[:.˜wTøiúˆ/:U¬£üçô¿Q½[_ÚfòÉ1|V²NÑc¿õX™*˦b•º1­tÍ•£øS½1~ïÆ¡á^ìÏ «èÊñ™Ì@f 3xx2Ðû#Bxâ[{’Ecá2=Yû“œÇLJ€8UJ‘r¿ö])'†ßý»¸qT|Ã8EBx‡Òµò7©/{›zÔWdî§8^ÊOùLÌ×KÙæ†·° 'çj©pPw%¯¡¶5Ö ÛOÜÞ­rïhº|ÆÈ§Y2™Ì@f 3x˜3P×±˜Bû˜¼ ¥U¬oèm/Õ[†x/Ë5ú•åïi£úÅÃÃi¡èTÑË?Óòý„©Óßö[zRxž–¨>ÕX3<]ŽÒ뷗꡾O(Ojqø¦ˆ{WãˆðÛ”‹~lÌe2™Ì@f 3Xõèk çjÒ±h„Så\](j¾!§êÖ”¢¸ç©Ü¨nG'Œ¦9f&÷‰}ZÎU¹¿K¿—x”vÉX÷V“s…cÅ7ë¶Õµq•'Çj©ö`£MîÃr9p#âbÆVߨ#Kf 3È d2+}­`¹™“N–#tŒ+U|ÓpH¯SHT× F§®¬{Á©aãÕÇÃéúößËp«’w[ÕÒ¥Lq•K«^|Ãð—ÚÜþV6·S8]³2.ÂyO–ÉÇÌ@f 3È <<ÈÁ‚²èTl oø6õaП¾‘}ìÄð2=ªf2™Ì@f 3ð0` žÓ1‹‰`E‰ŸºÁÄÅ'‡§Íc#ûa'~SŽW|ÄWÛ|V­x*?¹¹H¿Î=ÞÖx{ø åÓzR}ÍTÿ9aœôæz·—4í×z]ãàp7Ž—¾?Ù =-“ÙÌ@f 3È ¬Ú tûy›YÝúæ%ÚÈ^:Wz·Õ[æ7ÂåÚoµÙå\ñX°îFv.•c4—Õ«‰…ZÛ ìƒsÅJTÜkVÖ“ÂBWØ–*sGø Gî)çnm†¿Jö¼G†ÑùÒ·Ór9œÈ d2™ÌÀªÍÀJ¹‚W†ôrRœ«æéá1Kõ#Í«…×Çwpé‘`#:JuÛÆêRCŽÑˆ³ßë[‡èÛçÒíªgò5í†Atðöcc'…Í ߎešzÓû|}[‘·Ã7ÿ< Ÿá‘£¾E+dìïÊ’È d2™ÌÀ*Í@]'dÖ:=zýžzý™Z9ÚºâGš«íöFöòÝVaqøòCKÂxW¸+:p*‰cT¥Àv4O *וÚqõD9U~$‰#5Êi»X›åÖ[ßoˆ+^h3|~dXEkŽÏ d2™ÌÀ*ÁÀJã`ñ˜ÎÙa^?º|¬Œ?NõFx?•¢ø†`ÝGž8Nzœ8W?åó^¿ðn½~á ÅÅìÝ6§ã€ÙùÒ‹V¿Ö¯#… óÐQ +cM­ŒñCÑ÷¨Ž#TÇ“––/óæCf 3È d2«+ÅÞ øj¢Qí­:1lщï¶Ú7þHó"­5¦86ݺ‡oöÍ•SÄ#ÁkÆ&ÂÛæ®¥ŸÉ—“vQ‚#71~Rx§~ìçªÝ~¯9²«‰ãÕ˜ÖÓƒÁÿRþç¬>7À'oÃïRWNÎ d2™Ì@f`%c`Ö;XñÕúAx;%¼ª9¤ùq äpñ˜Gqõ„½Ocrvæá©üiúÄw˹Z8ý."\7Uѽ!^›ØwbUYÝÓWϰN«Zú1ìøèpdpÈÄ_Ã/w–~ØšüùÛ…"!Kf 3È dV5ê:'˽ݾâÅDZDï¶z‘v!®oùmªU+V¡pgº­Q4fTƒ–úGšµoëì‘ùá¨ÆÛÂ}ÉFvtÖ–rßÕ86ÊY»D*w®éð-ÕÊÛ<íѺºq_ØCNÒëråqõjT/!ågvþ.Óž®£û¥Ç™l×cÅ{ºR«_ßÑùÅ£Âï&Ë&,Ç1®`Ý>,²ô¿nîö:rlf 3È d2ÓX¡+XqEGÞXbeibðAÝñßî&93¼~¡§w[ÉY˜ÄFöûµÊô­}ŽÇU«§­M#£5":+ÞŒ¾(|H+b;ÇG•l°ïì–Œk¿Õ¼øŽ­‘ðÖè\©}ÚïŪW*qõ*ܶWä¬Óé‘èí5ÓÃÜ‘¹z½Ã¼ðR¹™/•£vßÄÉá Åodiøªœ®ø[‡Ò=ÅaŒ“>²d2™Ì@f 3°âXaV\ÍÑ#«é¼Ûj[¹RŸÒ;¢v?Ò¼8:W½Øæ7§È9¹\›ÚÖ~§ë¡µ\5julê1^îÓOá¼\ÎÞ»°M2"窓 ƒÃ3‚kØ G~¼ÑiÎUˆûª”yb"¼@ß2\]eY¿¢‚¦ÊO¨®Üˆ¶uµª÷âÆÂðbùa×)înâ…)–γd2 î¯IDAT™Ì@f 3°‚èä(̘i-ÿY?wóI=N[GŽN¨#8cúí¿y¬þL4ÃGGîÇhUg §fר)Ò¦öM´Òv…¾ ¸±ßgÕŰ¥¬¢é=[ÿ­´×‘—•:Ñe¥?¾ žcsm=þ[#ìÖñÑc3,Q;çˆ+÷‡Ýb½ìaã'xÆN ŽŒ„cUÏê\¶‹MëcÙ²T6­'|A6~¤}¶33™Ì@f 3è^V‰z×ÞRgB«6üHóÒæGºk„å½/ :Å£·iA‹Ÿ.{·Õ‚ð:DÎÂwH´sFµ·céüÄU/9gÈùÙX—J˼.š–j(;2Ž o²R7µ¨xˆOÕÔsx+½bXk/¤©öÆÒp^t®´oK޲­JŸ£ôFؤñh­>¨hÕ ó颖5Ö‘m÷¨7ã£#FöªÚ§ëÈ1™Ì@f 3È T2°Ü¬Òi‰³ôHp7ýÜͧô.©§”¯;À™™WçöŽ G`){œ´FÅKG¿¦ó·ëÛvwRGø•|Švã*)h“P:?ã§„÷Èaz±œ?™n\ó¾-í•šÃøÖÆ;Ã=ÍK´ïj6“*'ÆÃ>âa¸·«ºÞZ?—}iªãü¤ø² ¯qŒ4ô ó!ñ²$ºl¬ÚŲóÄù’ÆCzàØ ÅË&’L fÉ d2™Ì@f`@º9 ª/Š— &škMÌ GêNl\é)^ÔÉFöºvð^©‰XvqXØïÑ»­N¥–øbÎƒä€ ¸')>¾d…íÔ°›V–>Ý”Â5±£R4jê'9ìžÒû¶Ž‘³wi\¹ªp®J>âê“§ýKÇÒÐTÍÅÙ¸^YÁþ²ÿ.„ŸÄ(o¾oÉ-vDxídŽ´!“b‹´Ëšã2™Ì@f 3è•Él¯{Ê|y£Ÿ¶V…dÏ”VzKÜêÚ€ó4¢ÇusUòÇú‘æÝõn«Â¹Ò~+ÞŸ¥ôNNJW“µõh…íѼ=^NÍ\y4Xå¨Xç˜ìÑÚÑweS|™©¶ØWÛRüaÐþ®í¤à¹±†uHÑH|~×çoyXXWêF;è·UüVc–Ì@f 3È d–;u› ‹{†Få~¬–cʇV8Wuò,åçfâ:×¢p†’çëGš¯f•gcàG‚’ê™NÖ+žRnºÇÎjiÆŸÂaßÕÕšCÈ(]seS|Ú¶ ¿7(áÛƒZ[«9®¼’•é&´"5GúÇõøï¼2YÁZÜM×–c2™Ì@f 3˜qê>šš!sŽÒûœvÖŠÏ~r–Jq'fÙFö…áOòXŸ{Dø2ÆøQÞÐ c•H>V•Þ"‹^¯ýN¼Œ¡›:¡=Qþ)œCµzuKé\Å òíl+ÆtyIû•nÕ„j«ê‹ Ù3¢U»Ÿ…G…kKÕÎ[»Js\f 3È d2Ë•nÄÐŒaEç…Ú~ˆœ«?iU çªÊáGšçèõ #Ê{žÂ;ã\i9«÷7é‘à°Œ³S´ä¤°½ O”ßÍù«æ§xü6V+Q'6ÿ‹óÄ«!:ÚU>.Õ¯mÔ?Œ+ZÓÊuĵ-é¾°ñư(¶]\NËÛ&"ÚÓ&>Ge2™Ì@f 30³ T;3P¯œ¬ø~*~_Õ(rɳÀéJÂÅë&ôma8VÙ÷‹?”ŒƒF™^~¤¹K;J‡»VŸ§o6Ê¡{¤Ùá¼U­(y4¸ºöh- ?¹/¼7Fjo•6­ËÂÒ {éñà£TùÛ÷CS¿Í¨·ÙëQ¥¶‚Åß& ᾊ¼5ªÌY2™Ì@f 3X> ´¿±ÏdÝZáae…Õ(ýVàzYbk\ÞÆˆö?± þ7ããao½Ûêƒdð*Sm†B]$®ð”›Ñõ3=ÓjÔŽµö]iÕß;”sõ@c"$ÇqIùȲãê•Ú0¹_Luï_ºJ¬àµ_ÁbŸ•ÖøÔæŸÏm†«bsîì²BÖ¥Í993È d2™™g ó*Í ÔƒÄª‘TŒ…wËIÙQ+A;ȱY(§e = z úêwøŽšwD¸7æ•Äê×ÐÍÑã:ôŽ™›ü)œÉÔ‹çe¿ìT[Þ¡Õ¸_Dç¯Î#ËòýZÍÓÃVZ¹Ú±|ÈÙÉÉmF¦–† ôCÏ ãÛÚG³ƒÕ¡{rRf 3È dfnî3f ø¢SrtxHÎÊÁѹz„^¶9¦`KÂ[´þŸ‡Ê¹â‘àzïUÍ=G½ëç‘åia3m6?‡I«J8q9‘½cZakL, gkSû¿Ç:»í»j1Le÷Ô«*ÖU{ǵvUUçF§o¢|(ÿÎÉz£üêa_9W8>ݸççyäð,‘#øV9‚÷÷ôªˆâå¢ãúöà“´c}çã«GÅËCƒq¿XÝ ôÓœ#2™Ì@f 3Xž ts*fÔVX’•ñrÕªãFñA ²S¤U³½T÷qñ§p ¥òe*¥øf Ö·ôX£Â÷K[Yõª'åËEåRòxðÑú­@^.ZõãÎÅûµJõH87VÀ~1=ž¬WY‘+rÛKœ73È d2™¡0Pµÿg(Êë(±“ÛÍ䪕ŒQÅOᜫU¤³äèŒÔþ)œ5õ(oaø†¾ÕxBlWëä¥?@>¬rêx¹({Â~­Ÿc.¾=Xþ˜sNsžÌ@f 3È dV,+ÜÁ¢ù8YÚ“åW5Ì#ÑÓ¾/”ë'jNi¬¶Ð*+PÝö]É›§7»ß&ëPÊGG­{G‹}Vú±ëÍälí\®CU9WT¡·_E^.n¼'<€ílö'¡‰{°z)óf2™Ì@f 30Vè#¡´ ¾œÉ‰æIú½ÀùáÕñ§pºï»š“27LÞСzÙéíñcW2´±k|nØcÎ<­žáÖU[‘:çÄŸÂö·7ˆ‹Rmôæ¨Ì@f 3È df ËNÑ’óô«Å./V„ÚƒO lº’SÅOáŒèmòÓ«#¾W’êcT£(#oÿ¸•~i<¯â>¾\T«k7ªþ+âpÉ/4äÌ@f 3È ¬, TÝäWû»ÚéÍèr²ÖÔ·ÏÒ·×Ô{·X êøhPÎÍR½¾ažÞCuÙÈÓÃûcE¿âifêÊo.<%l"¯m—îY|qƒê¹H/1½§n¦Ÿv%1gÈ d2™Ì@f 'Vi‹oÑé_Ü»¤·ÃŸ0²–Þ¿ º8+1èŸÂ¹O?L}pcò7Ë=\=1\fž× Ï×^®õµ2ÅâXÕÊisùf£Ù¾W6Ëp>d2™Ì@f 3°0°J;Xá3úÖ V¢´ïêÕZ‹:DÎÒmc?Ù\žj¹êH½­ý×ZEš«U¤ž^‘@Eñ5 åËEåQ—ttðÆå„±çë¦9sËǃ½®˜Qq–Ì@f 3È dV(ÝœjÜ •G§H›Ñ›ŸÔïþ5Â)8Lœ¤nmžÐ£Ar~¦qxø¼–”z[Vïæ:°¨kÁ‰a#éÙ=>˜ì\“=ZÍp1?„Áª›U­¾$®àõU2Ê d2™Ì@f`º9ƒè^aeË}Kcõ0îL9L|so© ê¶bÇOáÌÕJ×ÏäVðíê÷ êÛnÝü†Î ÊZVqŽ#5ǃz7W|<÷õ[÷ c?WœÈ d2™Ì@ÕÍ~¥e&®8•ÖO¬FÃzc{o?…³xŒŸÂ9,üµy‰ òòÓråK¯`aéÚG«=»<äMñ·ÌŸ|<Ø>gÍØ¾Úús¶Ì@f 3È dÚ3ÐmE§}©Ùûéòmí§„ýdæ1ú ¥xH賩GVFp‚cá=óß~t û®´¹}j¶úgåêÓxómla7éE:Ùàß¼´qt¸;æöo5Æ“ü‘È d2™ÌÀÊÂÀ*µ‚¥G‚ÅOáœ6Ðþ£3xƒ·áÚT}kÏý4¦Çˆ ýó×ôj„“‰Ü}ÐÍå÷•WÓãÁ¹á åËE«¬bc=1åãÁO‡yyŠžÈ’È d2™•UÆÁ’sÅû¢â:‘6µŸ&‡ióøS8¼‰½³,?…³0ܬW2¼¬ÑQíñ}WIñ1eùBRý,Ï qô$ØVÅwS{´x¾ÑXKÎÕâ°P ßÒ8(,hò2ÏA~ '­”ð“wÖcÊ-£‹×Z3Æó¦^Æoj•­øíA^”š{°-Y923È d2+«Ô VJ||•œ›¸šU¬½¼yrø7mÖº}äˆp]\m*V¹Òbƒ…ï,^ñ0¡ßÑãÁøˆìÓrV™Ð+æèÛƒÖñÒ6é9*3È d2™•”UÖÁ¢?Ø—XÍbeHG}Ëð_‰g{ù8‘Ó¡H|ÔÈËEO ÒƒJ¿M«©ÊªÆ—‹ê7 ¯Ð·oŽFŒá\CiMV’È d2™ÌÀ ¬’[ ‰ ‹ ð#ñ=UÅî§Ölƒ—/›Ï“Kõ”òñ`¿¬iÍ)_ÆP|{Ç•C¶+¿k°.Í¥3™Ì@f 3Ð/U@¿úfm9V¬"f`+bþ&¢–÷ «ËS*¾=XÅï„~º¡oþE/ޤÍÀoæý\³v8fÃ2™Ì@f`g ÊXÅ›=äæê‘#/+=#qeŠ5ªj‰/ÕãÃ+‡…›b¶øö`^Áªî€œ’È d2™™d ;XÃ`w›rŸÕ’ð9ZÛ^.Ú˜üFáÔŠ´¸ñ]ÐŒ¾\4¯`M¥>Ÿe2™Ì@f`y1¬a0}=ûæùÍýöàz<8Ñáå¢M=ªäÛƒ‹Âý#óËǃð!ëÈ d2™Ì@f`Ö0¬»"¾î—‹žÖл¯ö‰ß¬úÞ`Q×D˜ÏW¸²qh¸!F•Ú€¦äâ™Ì@f 3È ÌVé×4,Žw‹¿u81ÖÏÓ O‹CŒkW=+]ñÛƒÍp.üz‡v™s\f 3È d2+'ykÐ~»¬P0·öm¬®oê –§ªÖ°x<8¢·ÉÿudN¸(–,_ï0¨¹|f 3È d2³‡ì` ÐåãÁ±æÇÃZR³_ÜyÅJWƒ°æ)g3\­o^«>næ^.š¿E8@çæ¢™Ì@f 3€ì` @žŠüÍ Ûȧz*ï¿jÌ «éÛ{¬` c+Zv¹â·•Xüöà%3ûÛƒù[„b?Kf 3È dVÙÁ„tÿ´Í¼ðk9Mû‡ÃIúmÁ_jå(4Ös«É‘ÆcÃfXBXTÌù±ÚË©<—Í d2™Ì@f`¶27¹Ð3rª¢/Õ8DNS^6ªu«ç†…aùYû(n;œ-ÅÍáñ`c~«åñàh åÌ@f 3È dV!²ƒ5`gÚÉ _Ѻ”^·P:[l`¿H{´Ö k‡çÈÙÚWÎÖ^ZÁzöD#œG•ñÛƒ™Û5`³rñÌ@f 3È d` ;Xç¢8YáÀÂYbã»âGÂ6r¶ ¾4ÿ#¬>vØQ„ÿVç!ÌÀOãD½ù#3È d2™Î@v°†Üü ´T‚0élé¼ñưHQ—ÆøfñÛ…„³d2™Ì@f 3°ê1¬ìS;[ìyοY¨•«™üvŸ–Ï&¢{׌+jªzšhÁMirG’G”DfÉ d2™Ì@f`8 dk8Kf 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™Ì@f 3È d2™åÍÀÿ~ÛÇ»$ˆIEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/Nutanix.png000644 001751 000000 00000015354 14745137273 025065 0ustar00martymacwheel000000 000000 ‰PNG  IHDR{1;Š µ„iCCPICC profile(‘}‘=HÃ@Å_ÓŠR+vâ¡:ÙEE:Ö*¡B¨Zu0¹ô š´$).Ž‚kÁÁŪƒ‹³®®‚ øâêâ¤è"%þ/)´ˆñà¸ïî=îÞB«Ê434Ý22©¤˜Ë¯Šý¯"‚A—™YŸ“¤4<Ç×=||½‹ñ,ïsŽ!µ`2À''Xݰˆ7ˆg7­:ç}â0+Ë*ñ9ñ¤A$~äºâòç’ÃÏ ÙÌüÏÀ•Þõ×Z@ü“ôfW‹ÃÛÀÅuWSö€Ë`ô©.²#ùi Å"ð~Fß”FnàšÛ[g§@–ºJ߇ÀD‰²×=Þ=ÐÛÛ¿g:ýý¦ƒr»@ÿ‡,bKGDÿÿÿ ½§“ pHYs × ×B(›xüIDATxÚí]}XTeÚÿÝç ƒ€ Â èZöV»åö©"f3˜š¥»¡¨»}mem»ºÛê̘[À^«Ì€ÕÚw–½i¥‚m[mjÈ€˜2$`»}ضon_[:$š(sÎýþ–眙ù]×¥pžûÜÏÇý;÷ó<÷s?„ŒËÊÕ׎È!…€ó˜Ð,_ÊÌ;††EVؾ¸‚è´G¢ÃÃÚn"ðˆ®žc™¿ð‰ù+ö-j;ý÷F“}&ˆ~ÚÝ{dÀ+2¶rZÿå× g‹qŸ.ˆâѽÒǼ'ñbC¥õØužj' ˜&† ƒN’(½î~kùçZeÅ¥ÛS2eÂù™Aô9XØQW¶¬*Ðê=.+WßÐ8è&¥ž²Mbþ¯ÌÂŽaúA;É6ã2V èæÀ°®Ÿ$®IWôUÕ}Íg–wÌü¸Ûa.sëøú’åNý®Ø•<\£u~¤thQʼncaÜ6µâd Ž}cÆêK™äUF+¬ƒñª§ÌšOŸ¾úO@žÛiÍ=õÿx³c‚̨ Gð㨠‹W*_ú…šÂ“ý2­gàªsõ·Ì­ueËÞ„Ê&˜ìc$Л]Œ÷C¬r{O<íwÛÌÉ •‘ÿpaGêë§eöé ‹ô¡‚7VzœÖɧþST“:ƒÁ[Õ;¨bIš³ i¯'¼!Ó> 2^h¨JGÏLóú ÑÀ0Y”g«òŽLö™UŸ‹è;úû*"¹Ú`²ßè÷šŽ&L"ÚÖÍxgà1ƒ.²"!ó¡ùSÝ‘®Hcωøš3¼uATjkgzäÍ#SCü¥7³bÛŒPaȰgäþΞèZ+ƒf8ªRÄ`¿º©6ÅêýG¥9F7ë"w3ðK ³”=&%»Ë–~tú—õ ²1h³Ñì°†¨$„@‡Üµš‹UXÌùb$úoÃjl3D&Gî@îó+KLás•"DbØ7W§<ûLíø> jˆ3¤zu¨0Aƒ˜gÝÑéîí÷ן=©öãÁ »ÁìXƒœ!D)!"â2fß­pï2¦Û§ûEyÒ`›@ŽÁäX‹´œ»Œ™=Ñõ¡ ýD0vkèƒ;†rxùÆÚ´‘½­¯ÁTp1—0¨!ÁæqZï:;ñÙGhó>°ØPùׄY9‘!j !öH4ÖAÁ†|§Ä)ÐscfæÇø¡ ËßiÐE½2msÁ„І¡1ÃÌ ¼¬aId²À­Uk“Ò+J¦åèâL;ÀÏ@} Å10Ív—ZçzÀWùlédäθŒ•†Å„Ðë=ZÏе> å1×!ád«ðH¶ÕRsTÅ@¶Ímo™7ÞõKò°J1 L®ûRÒ}©Û¨ŒU# bT Z–ÄÀ$O™åÍ®òÝò #‘HW•¹ê'!ШñË~Uâncìã2 ÌóÕ;‰qKœÉñ³ m±‰Dºªx“ã’jDàù]¹Ì4€ÚƒS1‚Œ’M5É÷úB§¸ŒÂ˽$Ö€Xõ„Ý&¥ôä৯×ÚÇJ²è2š ® Qlà EÒ?ðÞ~R­±Ñ'‹»z`DúãˆÔÇ[w1ÚY¤í6V*¦ü´l ó+‹éĨS)BG Ç‹ªSÖg‰jõ0š ²ˆd€±ª³¶®1:ãìØs*Þ íÃÌ%“ývÓ¶1DµþÇ‘Šß4rÚÊxA4­‹$ —elá|3‹·ˆ÷ÈÔ¦é(: º&ÏŽeužnüþ0¡à9†÷BSÆB’ž¤>bBIœÙþ«ºRÛKÕæNrU½\=9Y„ü&zxÆè‡£ ‹1öàÅŵã³çNØwTII£¹ÀÂÌ«48Û^0þà)³*rhzk§> —Œ&ÇŧÛÁ¿h(YqÈb>5˜ìåÝÞó)4½æv~ïÛ›0˜ óÙ§¦}»0Çh²Ïu;mÅA: ôÄ´Áhr\8msaâžO_~rªî¤ü T-£0ø:æðÝ›ª’n˜ŸüÎçÝz i¹ƒѱ™æhP½„,ÓZ¦´`o†Lv„Ù×aü3a¡ÿ€IVX€ûB­x“ã0ç÷zõAOƦƒ¸O…f>?msáå{ãŽë§ð¤1—‘N¨Ù´/õšnÉVñH ÑÓÇ2Ñ$O©r¢ïm²?¥àí†áG¶ŸþèP„Bo!-G'ƒÖC{¸bO0B±¶´Úm†˜Æm1&û°:l¦N­ðfOpÝ æßUŠI2—nªIéîÄ«†™5ïhñ†%×—Z>Q+¡oC1ÌamÍ{ü¨)„þ cXäƒOTXì0ɘà ¾ñ¬8“ýæào92éA»ºmf'V­èzÇTŠ'`}QuŠ=‡;çUÓrµ‡*ÅZOcÌõ{oªÑ—'_/“dï;±æ‚+CÔ‚/Ÿ™?ž6åNýÚ]n­—o”‡§èÑ“}L?hÂvÛ4å_5  båvY&« ß¹륵)E¯ÙÙŸÝNk.ˆîDϵy ø­Çi]ÔÙ‰Ø@&{H˜ßöÛñóúfåD²,l h홀=e–"ørëòF"ºYÅ4~˜¬˜úCS Þ6š f äñ´`üÞ÷Y¤dûÔ/dà¦ã^ùÒ;“:Mï)µ<ÇfèÊS? AžævZ÷UÝ“=1î“–°­!,ÐkÆ Ç-!ª A+äæÈ‡”&9cÂWúpyÉé¿s—ZvCÅ)Y2L…wB[0#àç5ˆÌ̯L·ä15ÿêʃ­ú¦k¼¦AÌ•:øNñ¾Éã;ûcs™S&JÐÙü'¢„ÏŽå徬—b²gQXï)³ü’6¨?z¬g ù !„ íIΰHé÷H¾åË­ËÀtúˆþ©‚fŽ–¡¿Û£¸Úã´ý D¿Ó`›a¯3˜k²mÞ|ÅûÇçMpýŒÕ­±ŸrñGɲ´«¨6¹ÓTÕõ¥–Ot,%3¾OÔF@I‹WŸxp§õß¾®“êew©ÕÁà[¡þ’`5š/ŒËÊÕ#„`ÌÌüx “œã‘syL¶/n!hV¨N” /JöWO©e µßN¤þc±ÁTPt~ZΠ:ƾK±ºC=ÏQ3½º©&%·³¿~]vÿ7‘Þ™ äø½;fìL­±>'ûö©ˆmÓ¡þ’0èæ†Ã‘Û£Ó‰QX=EK‹ð4±âË—?Ò{ K'¦léGXT¨”jpEý6PÚÇ]jÙBŒîÖ…»CV³.Ò™¶zä@kó'V®cæéÚ’ÈÙT“²®xÿ¸8¶ŸWä¬sZóíIΆtÌ”ü¨{á$Ë.ÉØ–¹’Ûi½§Ã6eÕ¶ <6m³¨&y>J¨Î%DŒGÿ5¡*knJUs_ëßkå)µ¬éÍlUÿÄbceDñèä‡#ÂÀEß&9ó ¸*.æÈý¨[Ghf6´†fî‰xe Ø&3hSMJ.ƒ6PŠêá×ó]KòHõ‡60ÉèÍd­¡™?o‹j+7N_b½ ƒ.2WE’3¿ƒ€?ꦦOB3‰æ´Eµî âÛ»ºÅ†÷.*ªMy•€ beÓ²'¸žêìq…—LŽCFÁ£2VJ²€ö,| ¾Ò & m➸ô‚ÿ E†èoà ƒ,-Aª¾Nf^¨“N ÍÔpG1M‚,!ë¸_-ëlz75Aß:x€ÙÄ| AN]0ÞÕéA¾8S¡‰H~ÀÏò’XmÈ,üiP’=xœ¶$), Œ÷ÔÊ`àbäweà­ $ÌʉdÆËP˜ä,ÀüûK›uQ9ª{§m¿DHÖ6 \$HÂ;hC{ÅÕ)W’ÄïP Î@U«ÉÙãßéô2p£¹àV‚¼ gî\Y®êËíûìKüMù}_ËRódh ͤ¡Æ „5IÎl‰5Ù'ªv ¥Öƒ,×@[hæ×ö‡qWT“òs™P @uŽ&.Û8ãæ+\uýÕhrä2óÿžÃ‘LÀ+q&‡Ý—›à}:íª¯ÈmòxOÜHÀÓ!* ¡+Ä™ 2U$9 Tz.73=;–÷ÄŒ½‘@O äq·¹:y ÅÔ.31Ù㫲;‹¸—•«7dnàî÷ˆkœ+²ÈYtd¨ÈóžþÅßýì÷õVÂ’ÁÊX5‚˜_€Â$g ~ÜÕ¶* •Ü2Wr;-¿Öš”ØöÉôðÍ5©ëAô ¼ØÂÀ-ó]6¢r[lZîà†Æˆ·@ü‹ÆMäJ_¤«ðÛ†ŠOB3Õ‹ß*,‘à÷ôµ,LQ¦2 fÃó’ø$€ø~È)‹¦ü´@WÒ'¡™A„W÷&ŽøöÈÑ«¾f’oˆ‘9¢ëÅs’­1ÀTžÂìªã3íS´ÔÓ¯»ç§…fé«wŠáM¥M-HÂÿ\?Çd4Ûïñ…^äÑ`5<•IÎàÓöü/}ù¥cI`ëbÓrz?¸K-[Xæ ßôëe›š”Ÿ¶ b -Dz€d!e^¢ëí®’tÞm¤>‘Z¬,“3ÎìP{úÙ·éTy;–—§Ú'³HÛЛ¯ÿžwÂ`r4PbpWJ  &ÇK$óßtaú½_•Üw¸WÌÉÞŽ¼HÖ±‰¹ð6fR 3FÃKÈ|èG’ì}L…Wµ».fìÔÞLÛŒÓWÅr›øƒ‚bˆºˆB÷zÔ•Û\ÆŒÕS˜¤mú]FÚ͵)™`4Lƒ˜²pþ¦9WUtë°6”¬84ff~RK‹°P•ö#ŒOLŽ«FÆ4ÿvÿ–\E«"º@ht÷NÛþ‘ÓV& ’îM®îy?@“Šp' tg›ÔƒÉq¨cFr”€£ |«Fj?~>  h€£Q £$"ªý’ u[$лAgy99‚´Gz¥÷´ˆÀ¢¾&z =YšÁì¸ Œ×~œÓío¸ËmÛÞÃ/[úQlZA’ Ã›÷›Œ´›kRîã -ÈÀóßRËÝ‹®rõøb“/·.oDZÎu†°È‡ÀX¬òÕw54FŒ‹ËXùóº²=ž]ê¥ñJVŠM˽–t›ÌìÍw£„ “4ЉïøÑ´ËÌüKã‡ì#ÏŽeŸ›ñ*£–€8]y_òƒ‡ÊlÿòÛÌ´Ôú†ÁìØ F¶"µ<;ffþe]h¨¯°¸ ™…×BæÍ‚:#mqq–(ýúZ.šaþ4¢+WUéŠ<¯Xb0ìøq¨;G’ AWŸ™?ûÐŽå=J_-Ö ÊmjÿêÝÐLÅ á:ÅÀ†ð\°ior\ðJEÿ©4uqo@'K¿âõ{uò$=,}Ôš9;˜C3_ß“:„Ç~ýºF¢? `j¢?½M–µ aU|bŒ–ea—1ÃqSБ=€³3óq/ ÜψðúJÍ\d¯>É™W”éWØ·Èïí¯ËîÿPžÒ›ˆní“’½k›Ášùrõä šÃy/kX5 àS²'º6ûJ¯:ç2§,ʉÔÎN£˜PÜ“X›Ë‡¡™®å¶ê"òþº=ƒpOC¥õX0)­6Éò–[foÂã´½ŽöÃ8J äé`K$æ)µ¬aÆÍ½e›¾FQMRªr€K4ˆùÀ+"9;ÑUãó’åÚÂ"’ þ3`5TF¾c² :²oÿêù"4“:ûíáí‹¿•I¸A¦xV?è)µ¾LÇe&°©¨ëǃÚNÜ%Ñ+Þ åᘱ`yM°¶º2ëË,óT ê½õe{ŠÍÕ)·1„r&¨ÿ 2Jj¹fáÕ®/zKÏÃÛë‰{# bfêA»ãLùÙ·/¹,/G{ÞŽÿª]Ú8çµÔòO|=€Ã^HLXêqZþT}fa”@ò ”Þ×*3áŽÏ+òîÀÏÁŠ¥ ^¬‚L²&ûÜ`xuå6±x-T^hN]ئæinGzž × j­á¸þú¹öõ¾S¸e®Tç´ÚZõ{Š—„ƒÙ‘tdßNøË>”Dï$”OۙʻœB9m{DAw%€]AHôŸÈLSëJ­æÌj“œ=ZWj© Ôj¹¶b&¼¢œï鉨´c°u£»léG²—’Ô]hÞµmª…rÐKLX’=ѵhêÔ o_¶©ÇiY+3e¨W)b8oÍkБ=Ðqir3Ò(QPì¤ÀâÆn=²ø¯'õD:1²4¦zí+¦ü EžÆèqõe–ݯ.Ñíqæ‚L0+¿Ç“ñ¹ìm~ Ы«kïP§°ØHAÄÚ`œZÖWXÜš+ÉhÛ^öµ.>ÊAßD,Ì™?Áõ¨ßڴ̲[å¨ß¸Õ1ÃnÈp<;.+WŠì•¬‡7{Z›ZüFø•Öc3¬D¢üÀ¡ò¥=›bæåÉî2ë+n§õj–9•”“¨2€˜¨€eNõ8mãÑEÛŸŽVžt—[¿¿p&/—ªSñÚ5uÎeÎ`ñv=e¶ÍVz™ÇIY’Os¾„\ô,âÅËÀŸl_ÜâoÛt—ÙrdȼyŽñq„ˆã.µþ`#RзP2#"О3½þ kK WÓFbÒ‚ñ{ß”qôåÖåž¶3<®žïqMË`ïÛ½«´ݘ¨ACº|©{xS Ä4Ÿ„´Õ#½:ùZbÅàÂgú&ÝîëÛÛÛsr„1µƒ†)ëHÛ€AŠÑÉGÃ[ΙzHdËñsåï33?¦ÇÓÉã-mÁàÑw†áÓ:X8Þ£Mh½uâl—•«?v"Ýwî­Ïëu^·ï½Ý§ªN×ùžªzžz2™L&ÓUB¯+Éd2[eÁФP±Æ2Bûä‹ëjÓš]--“Éd¶ýq@Mçnáj¬év£6 ïw[íÝ·cOjt»½™Lf§"¾€ðu~ì[à6Ñ?àŠn·j“ðƈO"îÕáFŽˆßÀºn76“Éìt bךÎÝ{3ëßTh¨`á-„§¡¬¡¼$IÌ›Éd¶…¨ž©x«Ç÷Ë–jоöQƒ²Q/“ÉLaŠ^W “Éd¦Ù«!3>®H?랬™T–Ûëg2# of|´ ¢>ÍêñØS=¼Z „:ì ™LÏÈ›E„éø8Rç± \)„c°¾×ÍÍd:IÞÌŽÒluØ ²£wfR’k™L&Óe²ðf2™L—É›Éd2]& o&“Ét™,¼™L&Óe²ðf2™L—É›Éd2]& o&“Ét™,¼™L&Óe²ðf2™L—É›Éd2]& o&“Ét™,¼™L&Óe²ðf2™L—É›Éd2]& o&“Ét™­ oÝÁ§r–áL&3…Ù”"eÌÚ 8W ª¡¼€5¢;„¬½™Lfj²IxoÀ/³Ì«Ñª¡´€?àù×ዽn{&“Éô„MÂ{¹4êTèjŸÿÁøæ#h¼ ÿÜëög2™L×Ù$¼OÏSÿL&“éÙ«!“ÉdºLÞL&“é2Yx3™L¦ËdáÍd2™.“…7“ÉdºLÞL&“é2Yx3™L¦ËdáÍd2™.ÓÜñSdîÁ+.d´Åô÷ŽÓŸªþR€Œô¶˜^ı÷†ôíœ9·×­Êt‹Ó.Lßy«yϾã=û íþÓþ_äîø'±ý¿æ±à¬çöºU™-¸§ð.\N«¢YÓ@8¢lÇÞ9çÙÛö™µ;]P[`¢¢*X|Üöö´ Ù}7íÊ@+Ý0ýMBƒªìôc:æ`vAŸt÷Œ¶õ¸ wbH4êE#®y{*cá žAYzL=×a"³pùø>0£?õé÷<«×­¸'¯ý2’ ƒ©oÇ@)…§š‰uú‰}R™ŽÒ¦þ±FD¥þ3,ÄQ1´„¾Q­1ÝCŠô‰öŸœ}l¯[?¥¹§ðÆ‚f# ݦÇm ôo¯¨76 c uŠª1¾öÎ_Ápƒ››4UÑ/E£8D,‚‡coL#ô‹š‚"¬B)jF°«¿wÍۯõø-~«\£YV"N½(}|<ŠíË5*ܲ²ŽþØ]gì/-ÜF¸Ytµ"^‰ŸàjwZ¸‘¾‚¡r²ö¡ ɽ×xC8¸ ³k)18° ðO8²–:Åð.âý ï+/aöFÖWíA‡8\£|!áþó×*Ã7ñ%ÑVk ^™öc–=¡–KÔ#‰swð¿PňníI N½4ý¬ZllÃt!ª*<‘„¶š’ïƒ?Ç‹p~)„ËÅx‰à—FâEÁ¼‹Ò§²×N6®m V*6öÂ4iô}2ž¡®ÔÖé“FÄÆ‹…pñ“b¸ÔŒåw ¯ü:»¬ã#yÙS¬DH‚[ÒèÛKŒG NÄáÒh¾ì!õß#¯]Aøñ2}ý«”-æ¯Lï\šºu‘…÷þ˜wƒ´zVîO<‡]{\»Ù8Oâeg)ªËô ägJ×™¿<­+‡ˆQbcEß ¢—â ’ql¢°žK<?V¶>%¸PQÞ¬ œ¼")Ä’Ü:MÞûbþrVmdïi³56œ$:]2–M$¦á8¦,>)Ä3ô_¯Q&O€©a€ë=/ù³vIà>ÄjW±y‚43ú+Éf2QÙOÆ_‰^*Ë„ê«ú§.gÃtÎ{z¯ë9iÈ(¶ÆÉ—$O‡}§D<[ô>Ot7gœ!ú”¢:J£ ª"|3õrÊ Ü!4Tñb8‹%A›È¢»9ýíú.‹óDOU„B…é똗ûR§È»% WЬ˜¹–*>]ð)¼X2ðí Žk5ŠÅ€ˆW]’¬ê™Î³`EàŽŠèÁbõN|ÇK#É‘iÒrÚç´âÛİ—² (˜I¯ë6)È»9óW¤]eåh°aƉø(žØëjƒ}ñ¯Šò-*ÓUs¦³èò^×kr± =ŒE¡ò·ø Þ$­NöÅ[ۙǟd—ÛQmjwfÜdáÝ’j h4_ŒIì;+ÓñF…·‹Å 7®ïu&/»”Ï|\{ÃLEy>§¸÷>ñGáS6Îù{bZ69ýBõl²šdáÝœÝJ1ô<ü«ô´ßÙÀ«)ߤwÑiTŸ?§^’6Ï\±Ñ~Ä÷ã]’¯ìdæaøàM˜¥lpÚWó,jœdáÝœ›öiÃÂda¯¢ !°ðë½®ÓÎɼ•” 7Py”—âËE¬NvÅ›ñNUØM«Éë8þç½®×NGÞD%=ÑßÛþ9Ù˜7+â\q”Xõº>;§^JÑ 1JQ<Ë$7¾É¶´ð@ àTü‹"ì¦Øÿ÷½®ÓNGÞ´Pµ'Þ‰Ãz]™Ùï ù(q$/9l —§‹ÕU|×kž'x©þvº®ñæÉ›ä°;Îíø=~‰ß´_¯nçP í-–³¤t@HAÌr³õ2jU'jVŸS…;,ºœE“2ìßö=V¬`!b˜)Ä7¹g*¦n±JêG¿h7ˆV ÖaD0, Rÿú×ÞÒ÷Çã©Íér½q†ÑòJ?O3†ÌÖÈÂ;>Z’Ð.Ç×Uá—b\mÆ@iãæ©½âf?!‚AÑCðÒøgH"Ü þ‚p˜h¥k×ô¨ ÷ËüÌXÂËí§Àu #Û5ññD<§‹m]+åC»ßâ5k(Ë”èóöiÄ@lÒnŠÅnx¬”iâhª{»ë‰ÓNÃpŽ ½u²ðnQ‚¾¬ô†ûbJØ8”25ǶNLN™†§µ× UØ@¸F¬®ÂE‡ ^,åÃêv|ˆY8Zq©Ùýã·:¹F2j7ºO@©‡¶iÜ»pe dã#ðjÝ ë¸ZÛÏ*â‚ÕZ¡§Jq¡«¶è.=fëg˜w1‘´#1”-±X%ºL_ãr­ê,â‘RhÓ§I^uó|1~EU¬0 m[# ï¶s'ÎÃÙÊþk5Fm°÷¯Y?›¼bÛÏôªKPЪFÕUÅÏ„x‘M =»iÈyšÑjÂ],s[)%Ñݱ°jUpwZó¢ U|þ¬æ¶µpÎ\&„ b¤ ¬)ٳəۘólÙ‚ü–¯ nßq‹Øø”ÐZA8¯’2bÔÉ®X(”WmÜéÔK9û¨š‹Ü¹È»m\‡wˆåhkn$6Æ?…:ëèö‹Èë¿Ìú–*~C®Á?cžîM †Ço4›a¶î¼_ —·G»áϤ”òuÆ`¸gb™"Þª ¬¢8¿«ïÞÌÝxþrŠÄþÕby¾¢ù-1¾'afmð\ f ¸Yðfü‡äÑ fàÉÂvŒ '+EÕ ž„‡ÔXÊ/qŠþ꽄[­H3§O?·3¢»%KcñsMƒˆ7¨Âð:Ô9Ë™Ž“hÌKÎÈP6' ïýóœ¢(¿Œc8÷H-êl)gÍô+µ¿ŽõÊâÝRö‹n)់q–ÆuUó9áPõÔ¾ƒ“„p‘V¨„È'Žä£Gïð‰ÅGqWL6‡`Xcö¹X ÍæêâÉBðm](x1>dÂnõ¨“Æïh4ö=Ï®©”ßâõÄŸiŠÈÒ.‹îæ,™›æRU ̽XÚ$rGM¥AH¾Ð§|µwmž`dáÝ:Ÿ}YÙö¼YÒM?Ä@sly7\Ž/t¡Ðc¦ÚZ\5slúýLiãA§¹ ï4غBU$?®ö§û`éÜ4–ˆ+I}ìLã÷—¾?ö"-&Ææº‰AÞ{sh±"™1zß¾“u²d.ƒ#„jDJ¢ø§šK,ðH«{µ—£G4*Bc,y^>Ÿ'\`¨™Fº‹·ÑE¬,™Ûö9¯Z‚ÅøF ¥<ƒrŽf_¯[FŠÒÖI6â×w¯—ϯqó@G'f‘BKÚ<;|öY‚ƒÄøMûL!î}…wW)Â"ÿñ‚^×eï}a2H7nSŸðö Ìþþ×óèuËë¥YPVýB8¸†³aŽrÏYeÐÙ{®ÐÙHvE;ñlié­Óúpˆ¢Yˆå”wèÍ›(ñKâtù „‹þ$Ån­‹&š>ñ2LráM±7fHY:Í,¼GˆCî=jlêÜH2HÂÛ‰óÅö¹ iöS‡{Ë#ÅØû²ðöº„âµ ¶U’/hmÛ:ÇH£³Çý&%œ™üÌPO$²†Þe™Èì'ÄéŠÖ½®H¯ÉƵÄêtL`W—*ÜZs)…ˆ™Sf‡Ñ®zŸÈr*1“¸{v)ËÂ;Æ­B¸kâŽx£P –]E÷¦œ2¡}ô6áèTcºî'àœL™;ì¸S uï Û1b1ÒëjL*‚9b¾ºÈ ªÖ¬; yÄ›Ø(VÃâ^óo6ÉÂÛY¢Yº›ßnª3 ˜6a'–]$ obƒG&t‡hµÈqõ:Í4ùè&MSÊWü¾É.1¢¨Zi53…è¤kWæ)äåMdáÝD+ÅfÍL% Yx»I‘Ž|ɳðf¦2)&W¦‹dÑ% ofj3* o¦dáÍLeÖ«'ÏX&s¿dáÍLeÖÈ›éYx3S—nG«×ÕÈL=²ðf¦.E\…á^W#3õÈ›'±}ÔjœêTÈÃûhBX«þˆo™MÔû}îDdgæÌ8 Pë\#íWë×á÷èt0ô»p n¯·þ;ñº^Wd"…73>Š•XëiŸPÕ4+‹’ð××pò :OPcΟ•ü" of¼¤Œ\)=b}bQOi2Ðj‰~£óùÅfžE¼”PN¼¬&™^“×x3ã#FʪT¯W@ƒÐWË()Hœ¹J=qŽŸI±/yËk¼D™‘,¼™ñ‘Ò,–ÒèâôZ‚}ôè±WWã–ê~0ñ™œÛ1³Yx3ãcÃ(;RÚýUƒbœ][ª˜€"ÞŠŸÖpöüeœ£¯Á¼‹j»H™,¼™ñÑ×`´$íþª‹]»§éú:ö‰ÅF\©·¸§´³¦g2‰l\ËŒsŸÍ‚$áí´qjŒØ—ÈÆ’‡ =šþnNeu”éx•èÛBø£ù+X: m —Sc+TUºFKŽëuÍ&yÄ›ÙQîTŸgC¥ÕL«aÄ»øXéy®ÆÏjjÓ°PÕפ`áÅ5³,ZÄü•í¥—¢Ot´Ê#„†Tç½®á¤# ofG¹]½.eOÒÝUˆœ\ƒ[lŒ„j=¾ªžÔJ(FŸÃhò¤˜i—k;™w 7?¡ýK«Ë“p¾à“Äg A”<3f·äN‘…7³£Ü¨^φÇá Î=¦óg/ï[ݽ¿«© »áЯߣ(™?\Ì\DÙΟZPõ½ ïÁž8 ‡^…éŠ@5›pľ’…7³£ÜŒ 5ž^.†¬d~‡½šshÓú´Í·.}P,ž iZ¿°Gâ{â©ì€þ&ì®ß&‰î›½óÁøW¼QÜžãÔ•é™q“…73~B¼ «j.éÙÄ—«F ¡Á«VðÊiä’£¨úh V¸·ÕØŽ'`™XaÍôô—=ßÝg Pöãçà’1sKvÁœ/6žâèƒÓ aÛQ`fK²ðfÆOD ëqSÍ%MÇÛý¯ÁLúJNYÁ[?m‡=ÁÎ~¶öSä‡êõÂãñ1³7¼ƒæ_\ÿ~ÁEœ²²½ÄQ!î©hŽÏâ9ØÃéi8ßÊ«OQñoËäÌIã#»“evŒè.¡¶µÑÍÙï!!ú8~¤ rÛìÒ‚•¸Ë{hgߟ+W…0„ã˜vyuq >$†¿}P1|Ø·É{`q]Îæ¯”nóQ‘gP): O‘êõ¥¹8«EbøOEõÚKÙ0²ãwôü‹ùm#h@l iͼ Þ¥,FÓ¼¢äAW¤mÙ›‘…7³c´"ÍßýIïDªsTrðš>ˆw¹ï¥ŒÌ&ÆE|,ñÃFʺý»»Ë©—p×í©”á)Ž<û ï}ŸêkBü‰bdÈŸþÒ–’²ofÇ8çx©¿Â÷z]ްôØÔ¦Æ†¨²TòuÍl³ñZÂS“H^N]Á³˜>‹ÂÞF¼gH¶ßá:i‰ç•„¯ˆÅG„x" &_ê6yÄ›ÙqÊÍæFÑ1Wò:ع‰}-ÊæZÁ;D•6dîŸ}MkeÞÁªÕ(öWù7Épy>>+T¿£Ê@Qö‰ááx>^ŽG‹á5BñöåyÄ›é!¤Ø­ü7~Øëêt„eÇpÖ³éŸA¬®'¼¿èuµ&8It“7Hò»Ë¼‹Ò5˜wâϰPt.á ±1Wåï„x|ÚoñéïÀI’ßó©N“SÓÅ,¼™géqÌ¢QÞŠa¨×Uê ÖFBƒè‡x½4ÌÜ›Rúîß‚;„jrÖŠŒm>y3V #~’xñ\âÇðE!\äðõÏÂ7ð<¯Si—àdáÍtˆË¥l|EùNÎ>º³7Rù^‹ßöºZŒaœ‰7á6!$W²I³‘"P¶ö½—(+Ú. }Òˆv¹$Ê/ÃYx ©âÍòkøž#VUEú‡²ðf:ÄjÍq§JðÆ^W©c,i[£ Ä8×ôºZ„5x7ñ­¸,ždþ»! ЇàKåèN“×(¤€!¡x~ŽG¤UTø DOQDîÜ= o¦ƒ,=–X0Òw%>€½®RÇXrlz° „ÿÂÉøA¯«Õcþ¯Sÿ"ZGµé!5Ùž -¡mmŽÊþx°X> `hˆñ׸OR††×x3&¢¯U©Šs$CKiºËÒcÛÛC*bq¥dµþ2Z½®Zø^nxõÇ4â(M¤v’Ú ë¤ L›¥%†¯¥#|J czžèmWË5íÏíF&Yx3fÙ1"®¼ŸQO.³Þ°¤-¾}-*¿,F÷„gr°çà¥.Ó¿kÚ·vÇZךiâ0Š>1›ÝÍq•´1„S ÐÔÒ¡(£t wo,Îd:LÙbÿ‡Ã*1¾A²v×™—­»,>.y:,»•h•ß.:ÿÓëªÕÌUx5á üÖˆ%í¬¹Ûºrçä:Ìì3Ÿ¨MÀW…x’4ÈØµ:nˆ>ª&±ØWŠïü¥RÌ›©ƒeÇóûë™>á•×Kþ·÷ºjã̹’›&„aƒÕâø°1#ÓäáÉZÿ|ý>FLÓísŽeÙ$]Ó½7ß—Ö˜ž²•p$•¢¸KúîoN>ßÕÊ–ö{—ˆ~SSCÞLM,;ž kH–„µŠê=’R]a2­û.9–‘wôÃuBüG¼Xr1ª3 h7Ø€ ñ"¡xáCÒªæd5¢m”ÁäZ\‰—÷kǼSàÂ%#ƒ¿Üê%,ÔŠ ¡ÚC²üßѨò–áLŒùq.\N ¥$F?‘|ÿA ¾ó?ü?~ô¦v2*ÄK‰ß‹c¥›îp @Þ î’ç‰.QXK•ܪ¦Îw31ál|o½™p}ÛoýW¦=œþë áÓb<3ô9P 'Iû_«¿¼É‡GñfºÁâãÒ²WQâMÖ þ›NÀ?IS¸õ;XÂÄ`ñqÚŽõ°F?C|!^!ùrNô%ˆ?I^Fx‘/ÀZ ª’r¯^ׯGTiÍPù]iÉìyBü€VQ¼Hl~Þ/nh¿7Þ&o œ…WKš—ˆáÃMž|î;HÎÎSuûÙYÚ[g=‹ZÏ¿äXNºœw2³ ø­ÝßoäöOŠž„#¥À#ÜqvÎAÁX¢Êù+’þîâçUÅ !>'H9ã†^Wk%£Ù¿J¸JUlTÄö6Ùª×Þ c©Jë:÷³ø¸”Uc°…â3ªª¼ødâW„êRοˆ½Äê‰x®Gùƒ¢ qˆÀÅV…7޶O²Qçs7Æ·î¥Ñ­:¿>ØÄj¡aBßëE‹ªy›´]µŽœÚÑØÈ³¨©ŸŸ÷ôôóÄ ØwC·Š[Äâ+Šê"ÑÞ‚GŠžˆC%qÚW2LL“—¶·r½ùRÇb¯Îkg‹å:\Nü–"8\ô,ÁÛíìVƈR2r^%4úšèçîüõ*sNïJ½áÌçôäÒmÁ]ÒH¼Ó2àva³a÷ÇÒã¤$¤UË÷.ÿ´Ãž~µàÉ º@lŸ'”4î;x£à2c=K6íèÛšð^Kx®z:l Žg+é0þYŠòÞiÑ ¸S¬„ ên"ƒk£ »G¸°Æ’nÑ_ó`s×£E‹¸þ¦ÝV¶Ë¿ ß´n 0}x7ÁnR¼ÓIÉ'÷±)½Í,Iû$QÞò(ð[Bï68,;zÓë+ \O¸^ËçõÅKē֔6»Ùñ¬Í•4¢½Eò5½?ý70´ZhGðÜíQI’—M´í¾á³¸¬¦“—‚ßoó»—›F¾‡AðU8MQ@x´Ô7›¸‰x~+†¡»—ž¶0FnExÃFéi8‘¨p}½EÔ1ˆìdõÜÖ>ê£Û‹.‹aÑ=ÿ¶p%­êí½{é40PG‚á¾>¡ØEˆ}¢¦ CSˆc¢0,4צýö=fìæ;ñöÝr¤…Ò/‹>¡Ú‡°Ÿ”Éã¡Òg?Ét¦´<1Ö¾h,fUÝÙ¾^·K±2n ü‰¸ 7)šëUígP@˜“N±¤Ûiå¶‹Uícb0–Äó´åŒ†¿#þN,ÚßÈf:²f„=8óÞÉ Ð3™íäŒ ˜u7ïE(î™ú<[8¸''v¥Gõºæ÷Íüî¥8v[V"bƒT±©0ˆ¦ !Šh‰aTŒ£Bh)T¢J(£8¶2Ó¾KŽM±e'C¨Æœ,¼™ÌDãÔåiަ‰X”‚Í7Ú·ìfz*i·`Ql¶>ÒC¨¿Úêˆ+Ó[þ? xœÀøž%tEXtdate:create2023-01-31T08:58:03+00:00Ÿ¤¹%tEXtdate:modify2022-09-26T19:38:52+00:00E¯¡(tEXtdate:timestamp2023-01-31T10:19:56+00:00²6¾IEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/HPE.png000644 001751 000000 00000025631 14745137273 024052 0ustar00martymacwheel000000 000000 ‰PNG  IHDR»%äç*, pHYsÊ&ó? IDATxœíÝÛqÛH¾ÇqôÖ¼K8H8˜~ÙWq"0À–䳘ŽÀÔãÙ—¡"0ÁH˜Š`ÅNõø5†&‰¾ü—Æ÷SÅ:{v-—ðë ºùßÿ™Ea?†eûÿøç–sÀq?E1/Šâ–c ·¢(î8m÷7Ž rEØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [?EîØKQ[ŠlRŇ€4bÃîêÿþñÏ;Î æoÿþ—½~n9|¤Á0d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶~ŠÜ±ùßþý¯)Å6áÐNlؽÐ; c@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]dë§¢(6œ^`¸vh`ʲä K c@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙú›1æÎS~îÚ:0Ûh?SŠ0މ(W*R‰¼7‡|¶¶LËgiŒYpïÌ›œë ò2öc‡öŔן8_€¢(.äc]WÄcÿÏcQkû)ËrËÁ0$ c4±á÷cQ_¥u…_ƒAØø°Á÷ ¡ÀPv!ªÐkÇ÷žsôaã]Q¶•wÂQÐG¼ @žyà÷mʲŒžá¢Û0B—EQ<Ùa eY>ý`èÂ.M6hÞF|ŸFÐìÃ6ŒÑ™´ð^1c€>a@‹ ¼kÆðèÂ.@“ÒÐÚ‚CЄ° ÐöŽiÉôa­»z° HášÖ]}@Ø€ü<–ei\?EQü\ÅÛ¢(î‹¢Ø)e @×»0rvª°²,×eYÎeê¶JGä ‹Mèað_eY¾–eiÇÛþ¢ÔÊËP"ì~ +¡iÕG@—»€ƒ$ðÆi¸âèèË'b—Ì,ŠâÐ*BO¶›0‹Dç(gHÍi0Æ,du´vE5Íò(ã€Þ}¹âSûW–%ËY+“ÿŽUÊ^¥Ò‡'Žq+Ï*®¹1ͤËϞ̋SßjŒ}ù¹x´'Ù®%o_ ‰ÝŠˆ)~¢ 'ÂÖA17ê†Ò)YܬúPΊæsÓŠ7Qšªª­mS…beŠˆø{{N¼¯})óWò™JFœ·àc°ßO}(g²=e>‡O’ûJí8ÇÜ›U˦<´bΙó±’²T*óûŸ'¹žÎÛ¸vOìãDöq«´_Õµíu¹–÷ûJc_Žõ"Ñ}k+×iÔ=õÈv‡nÓÁ\&åÞ©¼En÷•”ÅØãºØ¿N#Ï!a7`[œ MÀ'(ŒØÚXÄoÝø€Áe&b—‰ÊVÒ°ÛÇr¦pÃÉé3¦°R±­ß¿HXÞ÷?¯r|[ ½bîÕ.ŸµëµÝfØ•s¬q~ç÷Ï6ïUÑ {Ûºw{ßcËœWÅ1âr÷?¶¼Ì4Ê+/¨y°ÍòÆ{°?»t¥º±Ó3÷üó˜n¬Ðî’¿‹é¦ýÛUÄo¶®çå #¤Ð­y´ÛÚs'µ Ëû>Û¥zkד|¶Û}nŒ±÷¡?ìÜÉî\Û}{1p¥p~?•eyò~nϧ1f+÷ÏëÈßóaï©_¥<÷‚”û,iªC~çIŽ&[^~7Æ,c¿“°ëHnˆO-]<öFüYnŽ®bÂnèÍ>$|^˸)/2~)ä™—!וðÙçrh»xù-Ö™ÖÃôyvlSÎbÇÅj’òíª€.+ò-Z¬4rk+BžsšjA7éµ%Ϭ?ów±Ï)®9™¿wpC¾q=ÁÒòòø;Þ¡UŸ‡ÖÛlÌ›Ëò@øÜçrd*úazˆ\Ó]<;zC*n#·çe`ó5ÛÆŠÎ¯ü û9åoÔÜÄ4v´|2ñ "¡­»]^mG½Ñ â-e9DZ„7)[·0l KþaÖ ÕJ_®éÎÕBWŒŒÛÚÌ'—Þ»Ô­ÛR‰é2y!ìžÐƒ [¹q[Ùæ¸ÝÖ®Ü,BZ‘wC˜’GÎm›]œÇ¼kcü")vüçP†ÝÈœÂQ$èöášîšFëâbÀSG^vðÎÈ4ršÀFRùÌtw…Â<»s¥y1{GZ:ûTkYÚq@§æÏ³ÿ›1æ90Îd*W1çýÒ^,s†°Þaèaíx%ç†)P7¦J]Dc:‡ª ]}ЕãûîAã iðÆ6"´ØðÒÆû«¡ ͉ »OB©ëEÛ™„Ѧ‡N蛗ΈTbÏûԣƬ{]óìy9c–üIÊiTØت_gÒ ì} (O<¥ãðìøBÚ,‡ÖzŒôD¶9Ë… †1–|¼K 7-éÁµ`.lÖ|ŸïÈu¼î²§µã…1šÈGl9}à‘ð¾zZymâ8Ýœz/r˜æQÎí ßí`¹à=Òj;ÞåEZXŸjcÕª¥ùf‘sÞÍOuÏÛ±MƘ—À°>u¼IiÜ„œ¬œíCŸ»â¥ÒÛÕ™²œµl!/JãɇԪ[·«»1ϺP£1NwšáPªÅÐæ|?`1Ô2NØýQL­e'ƒéOè; :ËÀ0b[îÆ“­ûÌñæ®vÏluxñ ×ñº1û”³Ð‰Üÿ|QçÈçÔ9 }™°ð®±Ö|[Ûõ¸fyQë£ÂWÅ\‹ûºƒëþK+ìD^¤›*-Üàz?¬~_û¥ ¹—o÷®¹+)ãÓ¾u'+Óý-á i»ZyÚÈÒÃ?ü–´`^I™šJYˆ y¾ïªô‘vÈ®º®åÿ¯®ã$=ë1KRåã´¬§äÐ}zòYzRnV¡k¿7-½³ŽýÉååÂ×:ï'÷C~/ô9/Û±ýAK²FÃ6˙ӲœŠû¦²üx¶Ai?:Y.XŽŸæ2«'Ëë¿•Æ€«ˆ}˜(-Ëëºì®æ2©+×}—ëûز¸Ï=Íå‚•ž +…ëfŸ^å˜Î"¾³ê¾Ý?ç{ªbyŠ>·e|®ð*ãRÑÐ8ÞÿýвûW¡­mÞóÚ+cd¿üÞÉ™ì[ŸÆ˜]`M´iVÍqTÓS¿1åØsÏkÏ¡µão÷ž”³j…_³ ºÝÆêÜs¦œ«Z«¨f«Ê½Gy}”°]æäúŸ)LÖø"­´êj̾ð,aȹUSŽíJfQ™Ê3¬õÖ^¥©¨ì}[³åðEž/«Ø!ò÷ cÌSäì9>/fk{–ß>T¾¦µëÿXnÐ87Ne\þ÷…Ìý¾ÖZÝ﵉×Àï÷n‹mHØÒ°NÕà»rq…|¯Wë\Äö{·žI Ah9‹i™HRÎü-»JŸLîÍ-”rOqºG–‡mÊò Cb“WÃö¼¶Ù²Ñ{T}^}zãöiéÒkñý1­øÎÏ ÅkО× t~èßÊßY×è9a6!­¬!-¡/‘-Ac„ZmBÇÉë&-­ª­ û‘ã”c§jΧ&è u)Ü?ɳ"öż÷Cš‡YBù.ðÏÛœÉàY±lÅ>û •™yÌ4†ŒÙý®ËVÄÇ€Ó“s@ÊX͇À·’MA–"ìüΈ)Çú>Ïeè1Ôx„¬®Ç|»Ñ4cŒ—½·ã•É'é ÿa¶YY2ÕIŒ½'.‡úv¾ýØñ§÷‰[a’^«ó#ú­|ÎÖ å­ï +Ì+Q1±½ß’L³ }§€°û]hí|®p# .³‰»>ÿ} ;Ëù‹2»)ÇäúòF9;ÙJu-»ð`j«¶M}_š“ëä±6½TÊ{BÌõ±êý"v>Ýç6[ÿ¥º*OÎÏ{)OÏ-•'-÷Ê=œ1Á¾eœ°?.±«¥!]‚Ë:pžÌæTè®;åÐ[ÿ!aw×âúã!bŒ£_‚ƒ`ä>s§0¯éµ|´ç¾ÝsM¯¾pBï‡oH¥i!]à1³Œ\ÊGcÖ6¨L9†1zQ9ˆ »-îHʇ}ìÉìBãFºïBº®‹S¤øT|§=ûËoEL9Ö÷! Cl%¥e®‚_´’kþ®…pª-f˜Ï˜—ž§¾!‹¢ŒqU»r«nTïE_Þ¡‰ »v˜7cR†Ýœè¡sÔí·¶ú„ݵg×ãþwçºjÚ+U, Ÿì[ð!GJÆç¯S­š”XÌ6÷ùEÚ”>¤ì“ŠÓzcjSéS¹êͶ0CþBo*ûÔ'ìúŽkºîËߪsK ÐÛ‹ó62ènt£ |ÙØP)Èjåi¬A7…˜ÆÀÞ”qÂnæ¤ !dºŽ³j,³Ü@|F!ƒøgGþ³«‡Œcfä†Ü²@èÎU0cïAðJwµ×°¡FZtW ß-«˜IÂ.ZÚâY…NŸ–Öj©^ß߬ë§+»È€ iï%äÞ…V0%˜Œ5è} -;K¸\®Ú²²Èawb‡2øa(ä!øð[¹Ž×-dP`h¥÷—²,'²BWlY^|<ø˜_ü¼6ƨe—Ѻ€£˜zlìê4ÆßŠjܰ[ûÏ®5íjØDHØ}Èø·§Ày_;Ï—C^÷þýæÄ„úQä:ûu0ö?o1kòU›ÉiÄ<[{S©#ìŽÇ:pŽ@ß©[êawí9•Ð,°*U·0TOeY¦XFƒæBÏ{=&“¡¼ì¶?—ù…NkYY)…¡¹båáe/Ü…Nƒ™“˜2Ú›ˆ»ßÄœÌGÍ I(4ìú„ÕÇz÷¦´(§ú­ºÁ¬«È·•è%i…‹mÕ½—ŽÏ’±ÿWRNÙŠü®÷ç22ÿˆØfÛsx§0;Ã<òïå<]äC^ª«ÊSì‚'cÒ›¡%„ÝobÂnòU`”´ýÆcâÿÒ—I«lG9P9N “_yë2ûƒÜìg%Aåk¢³¼Vÿ‘•#ÃcċÈŸìp;_ÐóIaeÏ.a[Zàÿ|ñºöråXZ|£ž¯¶âÙ‡g4/¨}s"boÞ­ ôø·ݰRÏ’0¤¹u£*UŠÛt%¦Ûú}È4g‰‡ Ä4"¼I5 W[$(ú¼ˆ|È*bIÚ˜òôÒª,ÏÒÑ4<Èþî"¾"¶å]a÷ûÉ ÷PsüYj)ƒáîHí ÝÞëj‘`„ú:T)öþóNÆ–܃?)‡VïoþÖ1åüL£RW‡„°û]L á²5—&Ò²ÛåtÌ©‹!Uëk×­º!]17õÊY„>téŽyþÓ,¥¼fæ?d£½6´|¯¸SXnH÷·œïÇÄVênc*uµÕñ‚_ $ì~œÎRܰ*v\—1f¥Ô‚œê…ˆSCªÖ×®ÃnÈ‹)}/gë{*úÐrMëy?Å”ùÔCb‡WT×utEËÞŒ1K™%¡µŠ›„þØûFÊÕÕÔH ô¨¦#“ÖûØÚ 2®õB aW(¼Àu©uêÈëNÞ$¾QjùJ<›fDHvµ¾7xú8ß®7i]™®®*gj­ µäW™¦©«Ö ¥ óòÈ™¬Æ„~¹ ©äÉý8õù\+êºÚÖÚ³b1…c¥á ö¥½V^Æ ù)ƒ};Þ†ØÆ¥3ß2.çh«Q¹ ìþUl!¶'ä{Ó‰i}“.¨•œä˜i]~ ¡4¶»ißÉЙhøÄCO¦â ¢QΞËÙ±ãà–±;…±x ¼ÉÄÌŒàõB‘F×§ ¹iô2IÙÛÚJŸËµm+ÛRQ­ž]Ïÿª1œÁgv†ÖÊ“XŽx‘ V÷z_j´‘F[þí}üw­2Í<»5²‚Ƽ°·2FåA‚àæÔXZ&Ò…:ka ߕ͚¸´°jÏKØ—Yªà¹®µ(N¥ qyhj;}’1&f2úBnõr¶–U³šÊY}²}õrfüž ‰ì³ûõ»ŸõVÚ©\Ÿ¿6¼œ²cŽUÃ÷®¶áxÜ_#çUžÓ½ï=¯-ü¡v^<ÊSò2pýÎ{VÆ? cØ#-5)_¸”ÚKgë·+Oöì2i{Èdð±¿é¡õõé3/g}˜Ò‡i…zHiUÕ*d‡Œ•ÕGÆœîªõMi…\Ìž1wŽï&hŒ%µ=_öÊÓ¤=´'";eY® ƒla÷°ùPO¨­ðéÓóbVö»]uEk<ú¨]û /è¯Á.‘ë ×kÚK˳3ä\žúh v u–ùM«‹°«@TÇë&ziÏåw_3]¸óñÔÒ“0úÐÑSË\ÏÜKx¹ñû5Û{uÝô²¨ô’i5¤ A ½’IvÈý¦¥8¬À'ÀjüæK¢µî;iÇo]üv*âï{°)ƒYJzL¤|d»T«tõfuMGÐhéþè0¥'Œv͇6d‡°{ÂnZ±µ³GŸé¿”Æ § 0«®Z›2-g}3¬}ßSeY.sn#ð~£4œ¡hjŒgË…߃ÚyL a·Ü´~Í´Û-68† KˆʤVZ‹;›,\ÊÙÛ\Ê™ÏØ æ5¶`ÍZlj½*·k:”ô"ÆVl.eÑŒ£äÁ¶z”Fÿ"¢T0¦-—ïàãNØu ]ÍW=h‰Ð^D¡‹°ó›;…Ž’›egçX W=¸‘ª”³²,]ïK×çÇIëд…2ò[WCZztMwM£ð¶i8CY–óï=Ã&¾i9ðF]Ç„]G¶•¨,Ë©ð¶kêö÷ÞKןy؄ބwêÇ´ì¶ñÀšu9ø^Ê™½¡¿Ï¤œµfšÌ¼ýT ¼)zly~+-¬éèš~ébJÅc¤—EcXѺiu5 ¼©Žõù~|?ÞO2Çuª{¬ÊuLØõ$|"Ý£©ßàßÉïL´ƒnMh ­rÓ =nÉî}ø–e9“ãÞY÷£œï¶ÊÙKªr&ÇóªË! ² S†4ô“œŸ… Óz`ÞKyîÍKŠ-]Ó; d“D/òS§}ášå·®[yívÿâ²zßÕî±Ú• µë˜°@N¬]ej"c²îOðN¾ÏÖdÎåw´‡/Ô…¢Ö[hÛ|pÉMíª¥°ylÚ*g“ÔåLÂÌÏJûð2ÔBÎi§Û€ãlO‘<0 a÷¹( æ¤ì×¹‘ »»µÇð„æÞ€¼ø„Ý­„h-/ž9lúŠ yaÌ.€¬•ei‡%,öñ¹,Kfc€Ìvd¯,KÛbûÖS8²¯Ÿw-­¿€ vŒJz9ë0 c@¶»ÈaÙ"ì [„]d‹ÙcÎeª¢cópÚ•å¶L_tš1Æ¿‰|äq4ÆØ²q¾÷_¿–eùÔÁvLjÓjýe{Š¢°Ûó4Äåpk×à¾ÁíÃuP«Þ] e¬¨mw«eNÉ6ìcæ'&•ͱ%åá:—ÏeÃ÷ÜÊ߼ȔF«˜›½1f"¿kjŒñYj+“ï«ý˜ÉçÚá;ëÇq#óŸ&™"JGÓ"G‡”/»_oNüÆN–Ù>zL]Ïõ±•½$|,d_.š¾GþæYŽï2u˜r,¯C×kPÊËôÔ¾8žï£Ç9Fí:p¹—ìo÷NÎÕ¦‹ù€åT×ðÔqÉåúv¯e»WÁ{s/>öaR å#7Ú¦ýº;´?rL^˱ýýIÈñ’‡JÌoo³Æù•JÆJi›ìÃ}®]îËýÇCÎÍÖcû–1ßs}äï\ʸK9Mvm‡£€kðä>¸Þç”÷]ëíŸ/õëáÀ¶Ÿ+ÝKùû]ç©·›>|}³[c[ÉŒ1[iatjÁ8Á¶d~5Ƹ¬ÉŸÛ dŒYÚý.ŠâFiŸlkågcÌ“´bvFZ)¿¸¶ ¦P;Æ_[Ë›ØïøbŒÙH d§dÿž”®ÁNÈ>¬ÏQݵ\[Y Nܳ´îƒ…|‡ý®dÛ §v…tKo™òàËšQRÞ%ÚOÛýû‡œ§ÖÉ9¼íòJÝ$:Æ6D=uu|‹ï]æß®þ>©]Z•½cì}êw©ø¨nÿÇD3Ùæìï‡ú…°û=è~NØ’t“ó ^Žß-µx~n;IKWêðÒ´ UˆJÏäø¶^V3 º)*̧¨ôvȶo´Dbï‡,×  5£»òâÊç~ê&Ç! µŠB›Z ¼>¶¼‡¬ZìÖï¢rv7ð […õÁ ½¨…ô6·ý -¼Ú2ö°;‘·…Ûrׇq‘Z: º•ÏRQIM­›8RÛAðF³‹¼Á$á𗶬 ºÞn4|ËËR{¡²‰ÓžØVØ| ?IDATÉG™bêèöÈ÷.äãòÝUå!Õð—mx9pÜÚ÷X÷(çãi~çZY=9'ð +û=XÜàqïÿ?ïѰ×ÖÉT—.´½9nCÎ]“¥ç1|‘køäðéñ¹ó»¼Ô{ ‡¹)¹§{×0¤)t’wy«84tÜËM½qå´ôlúT–eT@3Æ”ÿìC¢Iò]ËL!ø™OËM-L»>àö cžû°ïE¶ouìwk‹Eœ\¨CZ¿nǣ̹êZI™ÈõîÛ’úP–eДQŽåô˜G †G[–e*«™ü»£ ¹¸žï²,ÏÊ1ýêðOŸe.à ^ˆÁDz,½‡ó”»÷eYzõäx^c¿i.hû\•èä1)zÈdìK°qý­Â¤ïA“õ+üîÄc?Ÿb&’÷X˜bðÝ¡å~©99~à"¯1 H+šÏÂeÄuºÁL¹Ü&YTB§Ëþ¨”iÑ®_A Áxœ»íWÛëz_Œ¾'òáÃ‡Ï±ÏØ_P«{–ςƎI«DÓЃÊE× $Dpm)~‰iÉ*¾ÓùîëCfÒò•šm}Zt¼ôéNŽkp+˜´€^I™wÕÖ‹DÕu8”©©\ZUï´ÊŒý¹.~•²àM†¸1˜Æ,}îq_¼hé…S#DØý&:˜Å‡\¼8þóÁÝØ¥ËÖµ |¦ô€Ÿ;<ÔϤ+;¥>t³îbÃGEÎÍÔ£¼^·Fv×aË\*YÑçkŸTÊ«e¹}¹V\Þ+•µ;ÇŠÕà_ÜÐO„Ýo´‚Yáñ âd®£ÉâÛƒrëø@Ovz2žp®u\‹ï×縥#š×a[:ë¡‘V^¯r)—VÝGß1º \î‹,% Âî·—Å4Äʱ{qˆÃ\ÂÎ.ÁÜ´.ß—ªÕqד§û]ûRö?9þó”aä~ ÓO¹ÌØÑÆW®eYuØŠ”ݦ^„³ïÐc„Ý4‹¸„ç>=ÉCÈ¥EÈiZ%ÒºÛÔ šêA¹êIkcÊÕ÷î+hg2ûAªm"—a }Ú7—ó÷˜¨âáRYcÜ.uc»‰æuyP miTדª»ß嘦xPöbµ”[¾Ûõ¼¥8ÆÏ=˜Ç7”Ëv_Ú¥q[z‰ò(ÂàÒÛ5 `ä|•xÞ[-'ê/ŽdÌå!ô˜0´l–”ÕCa¾VŽKö¦#C™yá­ã|ÞöÅΩ,(ÓÕøo§s—pû\Âî z¼ ƒOØ]°¤ã¨¹ HY>\*ZÚA,·ÊÝQvì®1æÅa¨ÊÐz$R[{ÌPbígYláä¢$‰¸\Ã.Sý±=Æ4®ÙÑöêƒF€å‚ÑH¦séþ|M8=->é­]Zwí9¦âû}ñʳó\:ûBV»5Æv|4y“;ÃzÂ,#–ž¾”ëæc Á×%dÞ,'­Ê¾hª9CŒý5¸ÊœÀ>­kø‘kÀâ%¢EšTÁ÷«1Æ+YH¯J4­ïi ½8Tvábˆ `ÀßX^ÆKaªx+õà»VZÀ5 `´»þ4¢™'ÔÕ–_Ö ¼•7EQ|1ÆlZX²²CصÀëº"¯k ½Ë®çì€!!ì€x˲´«Ýýœp/;cƆÀ n» Ì )Ër*¡÷Þq9f—^pÃÔcÐò’p™Q´€ñ údô\BéL>o”~èRrÑœrïƒâw…bì8U„]h¹)˜?ˆ'ÏûçªiÊÁ÷R– nºö\Wܰ`€Ü0Œ.œ~›Ë?rmÙ%ìFq½v©`vÿ^ÅoEQ²—iÞcÔ¯„™Ç¾cÃlùþÓºàr9ÍÜ =4./›Z1IÇïÚá©»y;Ó|È”S®ö3 ¼êaTZÔìP‰/#œ*ÉŽ§\Åi€öÑãO–L9vÔ;cÌSÂÊ˰ Ÿ¹}†}NÕÂ+÷¦'^ˆaw¸\Çñ-•ÂKù?màýbƒ•ÖxÓÚòVãûʶÆ>…T$lY0ÆØ²óÎãÏ^ÂÐèRZyWš/wIK¾Ë0çVwyQÍgÅ6Û»ÑÚ/鑱ÛðYîÔO_>ïºËØaý÷1qmÉ©ZXvÂúØãc[÷¤¥çw?{'åg%-„^/9ÉCv.×ñ¥¹»ŠÄ£Ó“aGfs˜y [¨[ЪëìFZßeŒõ:äØÉ½v™p–Œ…ôЏ†M»àÈWcŒ÷w%Ù™Tvgò»®û*|ÂnÈCRa÷;Ÿ‡Í™tG.åïöƒò¹<øì¼ž¬Œ1Ÿ<[ÏäßÛ.ß—Úv íSY§JÀ=éZ^&*d,æSmyç‰|\VF;æ¾)Hã kùØëî¹VÞmEïi?K…®*ï3Ï@xï¨m…SzI|*­E-Ìïjûtì^tUÛ'.€Îø„]ôˆ´°Ú®È7[u&ÿþØß¸¾¸b!Ã#B‚ÔEõÐ ø[wl÷={,6ã.÷ÞTN4ìB¤Òú!pHPý^2æ!E€1»ÃÖõ8Ê™ãêN¢¦ _è½EÌÜÇ24ÌuIb$Âh¢J‚дËm‘-îê Awî•ÆáÏ[._Ð*Âî𹮟„¬ß?ëða9Š@&-pï[ø)[–®d>Vœ¶õ˜wZÛ' ©*¤|½íh¨THа;pµÖÕN‡ÈÃòŸq¿‘ìCùCY–£™Kö5e ±ÇóŠ]72|àªåž {îßÚ1óÚ_,/"NZÖpÏ<»R#ìf x?u¹7¶5Pfsø-qø¾—ÖÇÑÍΑ(Ø ÊÏLíçÏ^éÙøµ…h¯ïIÊÙ1¤§f.û“2ÄÛ2÷«ý-*WR#ìfBR¶µçgyèvÕ½j·ÅÎÃyU Ûò,Ýø—dðK9CW $1çz'áɆÜ阧;~^ÎÉߥ²÷ Ü·6ß±ìÏLÊØ'…dNyÙ+s^sõ@(S–%/S21ýTºZÏåÿîO"ÿ,c72~’Ð#Ó”UsçVÛshîÍgÃ÷Z›‡w“k뜣/Mÿ®,Ë“sUÉ¢ÓÚܦõ¹‰wµùwŸä<3&·RîëóÍÎO¥´©®É>UBd.àéÞ¾šêîE¶¿èë¾Â.Ð!­° c²EØ@¶»ÈaÙ"ì [„]d‹° €lv-Â.²EØ@¶»ÈaÙ"ì [„]d‹° €lv­Ÿ8µ@§¶EQ|à@QÿܽÞÂ{áª?IEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/Microsoft.png000644 001751 000000 00000024550 14745137273 025402 0ustar00martymacwheel000000 000000 ‰PNG  IHDR^K8Gï† cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEç Žºƒ$(HIDATxÚíy˜U™ð喙÷öžtB@À„UE7T\a@Fq!Î|3£Ìè étwBdq%é$>tT„ÁeFtTE”@XŒ@"!dï%ݹKÕy¿?NUÛéÜ{ûöÞ‘ú=Oèîs«êTÕ}Ï{ÞUºßøƒÀIL ¾^—Nö'oÚ>üÊ®jk¹ øød_TÄÍ"|ØÙvÚd_JBBÂþŒ™ì HHHHx©‘Þ„„„„ &¼ L"x&˜Dð&$$$L0‰àMHHH˜`Á›0Á$‚7!!!a‚ñ'û¦ ,@Dؾ};?üáÇå‰àMHHxI³xñbŒÙÛÐÐÐ@KKKÿÏ"Buu5ù|žå˗꜉àMHHxÉÑÚÚJ6›%“ÉJ¥( /¦µa¦D$ ªÚ-"ë1/ŽÅùÁ›0î,]ºUÅZ €ª¢ªtttLöå%¼ÉçóTUU¡ª""G …oŽêDÄȉHªþg6›½ÜZ[íùÁ;‰,]ºÁZÛ/”†ÂZ‹1†U«VëuÅçŠd9â-Z{{û^¿¿ä’KèîîFUY±b---ˆH= Ãpk*• -ZD*•båÊ•ã6Ÿ„„˜ÖÖVÀ-þ"2MU?¢ªŸŽ¼" *ú7OU= ¼û3‘PU=¨®ä#À.Ïó:/¸à‚QÛ™Š±xñâø¥L³ôUí¶þCOO"0§µµõ#"òv`¦ˆìN¥R7c+ ,X°€«¯¾zünvB0gζlÙ‚ˆÌ²Ö^, ²ï@eÚQ$‚w à \."§âk9Œ1æzzz.ô­ªÁàš ¥ËÐáŸ%I4Þý—ZàtcÌMÖÚÞÑh÷îݤR)R©Ô™ªzÈX]`l>PÕNUýV&“¹¡P(T©jNDBU¥P(ôçË'$ŒªŠçy¨jšÒ‚×½q&éx“Þ©Môâ"н0ïŽTÕGFÓûᘚš€Yªz6Å߉.\„°nµØsÏ=—<ЪjÀgœÁ-·ÜÂUW]5)76¡8­­­¨*Ƭµý‹g”ì³_ÖÖr¹étºœ¶ŠHLHúz"x§69à.œ³ëÀ"Ÿ£ªg444<’ÏçGt‚L&׋x3ðª"CòÀÀ›ù«ó`Ø\ýõ{ýçyMMML›6K/½t¯c¬½ZŠXÄsÊårTUUAµˆTžˆTµ°---%çö¹Ï}ŽÆÆF¶lÙÂÎ;™6m½½½u@ÎéãžqˆsFöªjwycLÿ=©^ºt)»wï& ÃXøÕˆÈÀ ™L3Ƥ>`°رvíÚ¯|å+I§Ó¬\¹’ 6T,€çÏŸÏ'?ùIn½õÖþâPžçÕªjP-"©s¢9÷ÔÖÖf­µ,Z´ˆL&SR{†ñ¢ËÐÑa%ïAô eD¤äõ$‚wj#À.àÇÀi/Xs¼ˆ¼Å÷ý[†{ð¶¶6zzzÀ¥+ÿ]‰a¿UÕ'#á?æà´åjövFîExª’Å‚ú«´UÇ[kO‘c€y"2hPÕLtüÝÀ6cÌsÀ“À}"ò(°û£ý(7ÜpÃàû} .yd°ãÄ[ß…ljHÊZ{b†§ŠÈ±ª:+zF½¸àùoûÔo]²d a’ÏçÙ³gà2ü^×××w¢ˆ ¼ ˜ÔD¥ óÑ<¶ˆÈ`ªþQDö´¶¶âyÖÚŠ„pSS[¶l! Ãxp¨ˆ¼ÛóV\rÁѸlàŠ™^ž8á„:ßüùó9üðÃÉårcx×»ÞÅ­·Þ:x1æDU=JD^ ªµ¸§ ª½ÀVÙ†á:y@D ð·¥¥…={öA±âJ~ôÎJ$ £…òJÛxªž…ÛYz ˆ¼•ÒÁ u"r.t­Øù¶'‚wÿàçÀ\­ÐÁÌN ‚à¶æææ\¡P¨Xûxúé§Ù´i'Ÿ|òY¸/û`z€›qÚÖHmÆ…ŒÍa_a–‘‹©@ð6559MÁ÷QÕFU}‡µöŸ“€C¨Ìþªê&cÌ£===_™5kÖÏþÑ#ªúqUýp‘kõ»µÀ9TU›Däý8A=øKøzœ‰f/ÁÛÜÜŒµ– L*•:¶»»{>n·qxô,+!ž·ÖÞ§ª7ˆÈ¯ …ÂîmÛ¶1þ|n¼ñƲîëëãàƒFUë|ßÿ`TñDʧÑú¸ð©#E佸tÚK^|ñÅ«ÒétYïþ¼yóÃÎÎN™9sæ­­­óq)éGãjßV‚UÕMžç=|GUYWW×iŒa`¥¾È1VeŒù ð>ö.ᘢô{ì>Váõ¥ït`%¢Dä¡Dðîxž÷—0 4—r:0Ïód¥áe±å ƒšƒ{A‹½D†aøGc̉´8>në\,“'ÃÐe'ã¸I …‚xž÷U]͹v¨Ï¾•ÀaÀaQFÒÏ‹Œ©.sÜ™§ªÿ—áWêË üáâ‹/& …ª:3•J}øn1î¢æã„ý\9 ¸É³rÞ¼y뺻»)eÞhmm¥P(àû>ÖÚƒŒ1žÏpif¤R)JùZ[[ûíÄ@ýÌ™3ÿ VxÃe58 öPàÝ"òã0 WwÜq<öØc477÷¤‰¾Õ¸÷k8!3c^[îX^Ç;õ‘ ,.þu[‰1óDäÔ¶¬Šˆbߎ‹ .ògýqmmí.F®íBùxÇ!ãvb H§ÓéUÕk0|¡;˜Rï~¹•KEdð8-µâïO, TõHY| §ñ6eo:ðoªzM__ß;úúúð}Ÿ € ð}™eŒù"NðDèÆ ùü"¡{°WfôUùo%¨þ¸níÚµgÅœqú|dV˜Ò9è‰àÝø¥+xùÀ# .,{ Øàïy^]T§X‘š?‰ÈÙlvÒ&kL@ZD«)nn™(ø0¥Ë\åöÛo'ŸÏ#"G‹ÈW€Áu4KÞ¤ª_©¯¯?5ŸÏ3wîÜ};žç«ŸüYœ¦;.ßÿ¶¶¶BðPÜsû£_,óJà+¾ï¿§¯¯o¿Ê9Oï~BUUU'ð3œ“£'ŠÈÉÆjkË¿ßq˜Žµöà]%†ÝmŒY7Ùó>øàƒ‘ùÀçqÚ]%Øè>å´å%‡ÿÄ0µÄÛn»l6{ 𜉤ò¸h‚^\‰ÁJ4¸ã€ËŒ1Ǭ]»– øëÔhÀ'âl™åÌŒ9\G‘?ÏDÿßC5vîÜ/˜Ó‹€s¨l¡*à—ñœ+Éd˜ \^__ÿê¿*pM"^bãÝOسgÀ­"²×j0gŠÈ]…B¡lS:$Ƙ÷á<êƒén¶Öæ&«jX¬­mÞ¼ù¸î³†øH€sÒ=< l‹2äfâ¢6Žî[##çÐ"¿S\¨Õnœ½ºg_ì4©TÊÏçóŸbhM9žÃ}¸hÍ@^UEäÀqÅéëËãT`±µ¶9•JõµµµÑÖÖÆÍ7ßÌI'ÄŒ3Ρ¸#5æQ\IÃßà"jDDªUužª¾5²)¿š2Úk:Æ÷}S(ÎÅiÖ忬¸Åû£/Ù¨Ú‘À›€×ñÜNTÕe¸¢û]ªâÞCØ{á‰ë"\ê:žçÌÐÌŽîc±±¹è9v–øûÓ~…'™(d f&õ>EÄ&œÖ{L‰aï´Ö¾\Dž-•†ÛÒÒǾˆ³S›×:U½{²*†Å 8N Λ^ŽõÀµÀÃ0|ÚÄIñíÞü\Ù¾‘ìößÇ€ïá„d7Î|0'ÁyâÉçó¯gh-³øºªÞPUUõD.—ë×öâ†0 g‰ÈßMOv‰ù°ˆÜ¬ª·uu¹’Íï|ç;Á ì×—ùÜóÀß÷1P[ŽžÅ³ÕÕÕwìÙ³çy7ðï@apzíÒ¥K±Ö’Ïç‘ÏP>R¢ø6puk=Ï &ŽDsn‘Ó£9¿±Ì±ÞcŒù{ùn6›Íc–_aÀNADþøb‰g«Tõ© ¿ADþXRbìàbà÷ÅÎ%"Ü úàP'š|à÷ùŒQ5  üÅc ›Ìá~ ¹É2Ù÷õõQ___Ãð§8a1 ðU"òkí³¹\ñâ÷2„N£¸Wœ¶»½Âb!cŽªRUUE.—{/¥ã‹ãk½ XÖÛÛû‡ºº:ÛȯY³èלØdŒù‘µöWªú^™¥J„ø±ˆ\ÒÞÞþø’%KöJ¬0ÆÜÁUíJ¥RÕa~ §}•b'ð…0 ¿‘J¥²QäC¿—¾©©‰L&C†ÛÒéôu¹\î±ÈV\Jˆ6ŠÈÇßc–ä<ˆò;‡û1wA@†ý÷0¾†­[·R__¿IU¯‘_© Dl‹¢šÎžªþ+åíñ½@{+}ßï£â´÷¦¦&jjjèííÝåyÞ÷ƒ X'"«qiòŨþÅZûËt:½•Aa|Ñ{¿µÌõ¨ˆl6V¸ËÛYæoVU;¥”즊Pž;ªZó)Åò^Àõ¢\?ú#B•qi194 qú惪z/ðÞ"ÃÒÀ17‰È>’·¹¹9NýlPÕ3)n«Üh­½Ãó<}üñÇ9î¸bãGœ$‘ÍfgFJ¹mõݪºPDÖVWW“N§Ù°aÃ^q¬±¹¥µµ•l6K&“éò}ÿ;ªZ]jqª€ßªj«çyÏ,^¼˜9sæðàƒÒØØH6›eöìÙ1f“ª†áp‹\)rÀù†çyÙ£>šO|â{ ˆàâÅ‹ÉårˆÈ}8ó˵7¼AU_ üî3ŸùL¼ØÖP>|¯³§§§P]]½—Ðx qSkíó±°ŒwW‹/¦P(€¸g–9ßVù¾ß»råJš››÷:çÀ9 Œ1kqZä‘”îŽò&y­µöÖL&ÃW\Ñÿì+¨Õά2de´˜¥•”ÎÈôn~njHݘ›6 üij]Û$²|ùr.¿ür¶mÛ¶Ëó¼Ÿâ¾ÌÅ<ãoŽWÕÛy1±fv®1~+"©*õõådÞø0@C8g¯,Å‹@[:^ÛÝÝM&“áK_úRÉÁqá“¥K—Æ÷ \qörtí¾ï?SWWÇç?ÿù¢ƒ¢/§Ds8¬ÌñîRÕ¯áìšûÝttt ŒTø•ªÞ$"ç•~ˆˆœÁïjjjâ¼<åskkk€îq±)'”ÔW8•òæ¡G€5aîîèè(›RåinnŽœëqá|ŘœêyÞ/ …ÂX:U‹1ªí Ïww :E€ÆÀ‡jõê_ŠOØo€™RögP·È“súžžž8së6à9àE†Œs²=8xËýlpYCÅ:ï~*"}ªÊ7Þ¸WšîDÙfµö”ïÅöà®|>O*•ª¸jÖYù ðû X»vmÙyµªúŽ2ÇÊ©êu¾ïoïééák_ûÚ'_µjU,|ó"ò?8³S±¾v¼Æ÷ýiÖÚ¸7_ì,Å«Zk¿aŒ)´´´0sæLvîÜYQÅ®¨xO-Î!VJ³¶ÀÍžç=™J¥¸ð +ºéGqÏ<óŒ~Šë|p‰¡oŽ®a¼»VJ6ù(Ÿ{Øh2FøX{;?ïûn@`I‘ƅ`ãu×ëp¶©IáŠ+®ˆc›Däg¼.Dì:y¡µµ••+WÒÖÖFoo/ªz°ª–ê ü'¹Æ®zØp‰’:ª€·–¶ø_œÇÌ[ÜÁ¾ïwåóù²©¹‘ö7·»(ÅÓ"r†Ì;·â  |ÇÕŸ(eë}.¤«+ŠÛ­µëËŒŸü‡1f®ª~KDþ´cÇŽœ1†óÏ?Ÿ3fMÌÄ \|m)v·„a8¬EðÙgŸÿ÷\ŒR‚÷U)"!xG,|}”÷#úêq¾ÈJÙCOï÷ÔªxÀ[p-c¦ÓqìI¼à²R©T`­ý‰ˆ|„âΒשêkUõ…ØA6mÚ4ººº0ÆœAémà-"²m" AÁÁ”ßž?­ªOCe•ÏÆÀŸ‚ ˆ“Ê¢ªGQ¾ËòÀ€ûï¿X-P»1QZŸ?²7‡Æ˜Ÿ¨ê)ÀqÐ,"Ägú1ðÏóz»»»ijjÂSÔ í¨Eäð2—þ.zbX¬\¹2^lvàÂÏJQ#"/Ç èñdT¦ÃÔ²£*S·Û씹°H0>Š+ÚRŒ:\¨XÊZKss3Ï?ÿ©TJqξRˆª6Äï@*•¢P(l.*ÍJ<˜|WDn°Ö¾¨ ‚€ ÐÔÔÔ?0RæP^(m5ÆF²¸0uá¢AŠáQ~—1VŒZãMØÏЮúç”Öx^¦ªýšˆÓv‹}Ëû€_„aØs衇NHë“RD[èzJ—y´L^W⼪V\¼BDj(_½¬OU‹jCQ__k°}C Í lßãy===¿ã?*¥甽ND¾ÁA d³Ù~á™_j(/xw¯_¿>ˆ[ >J§/ T¼÷¥ÆªU«bïÿ_p^Þbd€3€‘0;Wþ±ë_xžGggçdO/¾örFÔ ·wÂÍíWÓ·Òñå2C5bDÒ××/o‡26÷ï ÚÛÛQUjkkI§Ó¿À¥óþ?Ê' f6Nhÿ§µöˆºººþ~l‘ùe¨¬/{öÙgÖ6ï•»¯Œm}Ž}Oà§£r®%‚w?FU-λ_ªíÏëpÅsÀ áRyê·c6‹H%^ëq%ZP,¥mê†h+ÙØ8š² B¾Ì<|\«›}ZUtà¿ÖÀ-—~§ ²§vttàû>…ByÌó¼…¸ð¬Ry–ΑÏAÐN;3J¤ªù_íã?î$+rÀ»·E*†eœàQ¬rbjx‰³—6[ŒÙÀéª:çl+VÀa»ˆü$ C[‰§~¼‰´ó^Êk-ôõõ™É,YY!Ý”Þiô}ŸíÛ·ô>y¸Â/¥È;kÕíííýæ$UíSÕájIœƒKPØXÁ%pŽ1惵µµ¬Y³&Ö|;)†aj$šþŒ3b3Û J8/ˆÈ–a|ø$¦†—"+W®Œ_Â]À­”v²‰K/~C‰¿ÿÖZû8P‘§~¼‰4Þ­¸²€¥˜WSSsïûý §(/²wë™Á¼< úL&3¢FÔ\³\=„Í”±‡¯\¹²¿ NÛ½=‚¸øù5¸Ja娑èéé™¶aÆØ|°™òå#jF"x7lØ€1ÆÃíÜJÉ®•-£e”™k û5‘ðý…1f=Å×.¤xo«,ðsÏóv …}òó'‘gpV¥zƒûoš¬B>• ª‘,¥CãŽUÕUuý=÷Ü3¬cG ÔtU*A£³Üq:R.\ˆˆäEä÷ÖÚû€ŸˆÈ(ß$òƘc{£Ÿ·á„ïÜRsf‰ÈpìÊS¥gSnj~4ðKÊ{Ùße­ý¤µ¶*žCܯl K–,á /DDÈf³b­ýÊ×*~DUï Ãk®¹†ºº:jkkõ<ïuªš²ÖökœÅ´Îüàq!r‹³™–rvZ ã‘÷Ýw¸÷pS™k{£ˆ,ŠâœY²d ÍÍÍû,‚mmmÌ;—¸T£ªžs–â!à^!.?ŽôRZðNŽŒ•âø\¸p! .¤¥¥%±ñþ-†!©TªÓZ{®åxu»GD&=„l0ÑBòNø~¤Ìзâº6\¬ª¿‹ì“|îsŸ£³³“éÓ§#"äóy¬µ¤R©T'c)ÏóÎeSÁ#νªzðöê%Æ‘¯û¾ß­ª,[¶Œ;v0cÆ D„B¡×âMe2™÷K)]«8|Ÿhtã7Æ6ÒW_TÕ;Uõ[ÀŸUµ°hÑ"fϞݟ̡ª´¶¶b­5Ƙ#(íê‰Ï‡©©ê}Ƙ{(-$ÓÀ§qa»Y´hxžGWWúЇLKKË鸾{¥bàæÞÞÞ窫«9øàR5tÆŒNœ±X(ïVÕoc6[kikk£§§q»ºñ¾º„ñ'Ö6€ÛqÕª†"ü, ÃáÇ13twwÇÛô«qvÒ’SÇ• üŽˆ´ï^V]]mª««ÉçóÜ{ï½àœ9ï ‚`®èË¿Œgø\GGG¬1> Ñ*§õÎÚTõZkíÙÀa©TÊkhh ‚8Qd&pŠª~×ÒæåeŽ÷ë¨VïàZŠsz] "?‘"r&0/¿³³“ÖÖVZZZ¸øâ‹QÕiƘs)x°YUŸRUV¬XA]]¾ï÷ßÄU‘+E=°DU¿53=ð£Ì:6oÞŒªN‘×ã  _ƒ³‰—âùnmm­Â„(¦|ÄÊÛ‹Tõ•@õÆÁ5 xS>Ÿ_¢ñþ ÐÑÑÁ>ð<ðÀ 555·' ñ‘gTõŽ©âPL]]]àçy_.£|èAÀùQÇŠ§ººº6‰È. ÒI'5ªêËpk{ ¶Øî©ª7GîÃe†Wã4Äw©êº¾¾¾"²CUƒt:==šã±”¯Ú®€LG&“Ù5HLê5×Çì\yªªªj½µvC‘Ž:€ƒ[Øf”9ß=ªÚŸ¶~Ùe—ÅÚõ]Àwó)mÒIã{Þ PW¢wóvù#pÐ&‚wjPê9”«Â´UUUq—×;qšï`ø©çyÛ†¹Ê¿+f„Ÿr~«W¯ŽCÀ¶ÿ¡ªçábc‡*ÆRŽ>àÑ7j i¨y[p­Y³c »ví"“ÉÜ­ª®ÀÙcGÃnà¿soA°'.ýX‚,#oò n±ø£ˆœïyÞ•Aì±ÖÆÚmQ¢jwãœ6\%¼ÑD’ô?þ½ªªjµˆtçóùŠâå»ÓÞÞ×ÄîQÕ/álÙÃÉ·7‰w’‰*q=ó’|{÷0;+=V{{;MMMXk7ø¾Kdcpñ˜wŒ j_t}»Ø÷K“"j_3Äg{ØÛ¡Ïo×P'Ðöeª~¸[DÞ+Ð}Îã_®ëA.:ÿVœàø!p÷é§Ÿ®çœ³OÄÓæ"ÏÜö»\ØFóØ®ª÷'‚w‰VÍœµö"U-{«Æ˜ae£Eq‚j­]#"ßfï/T–HHVÚÌ2ÚŽ?‚r^ñ!Å FžG|ßÿÇŸU*4¬ZµŠæææXûý‹çy×Að}9 × þpœc­·äpÚ]'.ÿcÌ£"²% Ãàmo{Û^çÈårÖó¼/cJµ—Èzž7ª¼¶¶6šššˆâgï‘qi^Õ]x9®X}<·xí‘MªúDô™ç"Gétkm%Í#{_‹È]aÖzžwLÔn.®ëG=.›.sNà>†á:ÏóºUµ¿˜R¥ówíÚEcc#ÖÚX+"Yk¯Š:¢¼2:ÿ,Ü♎æœÅ-Ê/àú´=àûþ3aæUß÷ ð¢°1c ===TWWߪª¥šÛ©µvëpž¥çytwwÓÐаcÏž=_«©©ùµöD\äBÜÉ‹îûVÙ ªc6$‚w‰ ¨ˆl.µU®²££ƒ .¸€\.×+K8ªãEìÁy°‡uÑœ²ªºa,ì©«W¯fáÂ… ªªª‘>y·0ËåL*•Êc}:Û·o§§§‡¯~õ«{ßZ‹çy[qÚÕ˜ŸÏk<_k-O>ù$'tA”³!ïClwmii‰ZÔó¼"r;pû7¿ùM,XP§ªñù­ªŒ1½"RˆwhUUU´µµ±lÙ2–/_^ñùĹ÷0†ÝK:::8ï¼ó8ᄸ÷Þ{‘¸žvw€S<®¼òJš››ûß›8Bøö®‘!ã>'НCþ³_­»0 [»{‚iCCPsRGB IEC61966-2.1(‘u‘Ï+DQÇ?3cùÅ‚²VFŒšØ(#¡&Mc”_›™g~¨™ñzïI“­²U”Øøµà/`«¬•"R²”5±azΛ§F2çvîùÜï½çtï¹àŒe•œ^Õ ¹¼¡EÇBÞ™Ù9¯ç7­ÔÐNS\ÑÕáH$LEû¸ÃaÅ¿U«ò¹­v1©+à¨RTͯªÅÛÂÍJ&¾(|*Ü­É…o-=aó‹Åi›¿,ÖbÑp6 {Ó¿8ñ‹•Œ––—ãËeW”ŸûX/©Kæ§§$vˆ·¡eŒ^&e„ } ÊÄO€YQ!¿·”?ɲä*2«ÐX"MƒnQW¤zRbJô¤Œ,«ÿûª§úvõº¸ŸLó­<[PÜ4ÍÏCÓ,ë.òåüåx}³¬ùö¡aÎ.ËZbÎ7 åAkñ’äw¦Rðzõ³Ðt 5óvÏ~ö9¾‡Øš|ÕìîA—œoXøBjgÕkÛï pHYsÄÄ•+ IDATxœíw¸ÛÔÙÀ !˜ ¢°AŒ²Ú² ¥leZölK¡¶SÖÇŽ€¢°i¡Å€m6e†²g€ˆvØP– 0!Éýþx¹²¯mɾ¶lß{~Ï£ç^[ÇÒk[ÖyÏ;‡ôôô <ÒæÀaÀÀѱTþ¦6‹¤Ñh4š60¬Ý´ƒBÚ\XXXPm •ý­ôÿÀ૲¿•þÿ x/–ÊÏŽê}Õ¢6çŽF¨§×´ Ñh4ƒ­Òæ¢ÀÚÀªeÛbý8ì¢uŒVH›//Õß7b©üÌ~œ¿. is8p 0X¼l÷RQÉ¡Ñh4šÎb@)…´¹°1°‰ÚVk¯DÌï“¥H¡6_¦W)x$–Ê¿ÙìÒæÀ¾À)ÀrU†-Øìój4¦;èj@Mr›»[Ë·W¢PÄ€õÔ@!m¾ Ü©¶'b©ü¼6‡;bíÐh4¦Cº-°6‡{»£Ú+QÓù¸Qò_‡y‘šø·Æë„<×ͱT~׆¤Ôh4MWÓ5 €òç§èõÁâ»þ Ò»x,–ÊWü² iscà4ÄýQZÐh4šAJÇ+…´¹,p$È6O›Åi'o—w©ÿç¶BVþ F£¤tl @!m® ì ÌÑfq:Ÿç¨m Ð,ÒV‰4FÓµtœPH›ó!~ì¿CÚ,N§2"xˆF£Ñh4Õé( 6·.–i·,F£Ñ d:B(¤MøÙ¯Ñh4¦Å´](¤Í€ÛÐþlF£Ñh"ch;O^H›»¢'F£Ñh"¥-U´æHàÜvœ_£Ñh4šÁNä €*ß{>RÔG£Ñh4Mh‡ àôä¯Ñh4M[‰T(¤Í½€#¢<§F£Ñh4š¾D¦Òæ Õù4¡˜Ñn4FÓ¢´ ,áù4Á|Ün4FÓ" T-|‰â\>¾Þ/Û>D:ìõø¶ÙeÃî› I_\XTý5€U€Õ€¹[ÿûV4fUÀÊÀB-<~x<¼Kå¿máùj #™Ëk¿,`#:«©Ñ·À“íB£Ñh4í!’vÀ…´¹pu“û*pp?ðX,•/4ùøM¥6¶¶CÚøŽj£8/{ÄRù·Ú(ƒF£ÑhÚHT À4'õopp^,•¦ Çk Ê%²&½ÊÀ¯‰&ãCàïÀU±T~fçÓh4M‡•ð$2É5Ê7@¸ –ÊØ©:‡BÚ\ØQ’VjÁ)&#-–s±Tþ‡_£Ñh4]FT À`ƒF^ œŠLümóéG…² lŠX†ôó_g#Ÿßô~K£Ñh4ˆ¨€›ë|ÙãÀƒÕO]H›+¡þÊo‘rËÿˆ¥ò_7[6F£Ñt?Q)"“Y¦ÇÅRùÙ­“ª;(¤Íù€c€£XÀð€ 3c©üç­–M£Ñh4ÝKTi€Ÿ†÷°I,•£•ÂtÊõqR!m^ œ ìUaØLà2`L,•ÿ(Jù4FÓ 9zü^À(ϱÎkÕI is+$]¯Ó€Íb©üÄVÉ1(¤Íuc]ÿXàÔX*ÿn[Óh4MW1däèñw#©h›xŽõx+N¢‚ÛòÀ²U†ülKåiÅù"…´¹ðe,•ŸÖnY4FÓ} E*Õ .5l7ÈÇÜÊ—y!'êÉ¿>b©ü$=ùk4¦Q†Kªÿü³…çºø±Âó?¨}F£Ñh"b(Òð¦ÈA†íÕŠ©>c*ìº)–ÊOiÅ95F£ÑTf(R^×Ï9†íîÚ¢ó ¼\öÜ%-:—F£Ñh4š* ERÈü þcØîoš}²X*?‰^/¶¡} x¬ÙçÑh4¦[)¤Í¡…´¹p!m.UH›sµê¾F£Ñh4Ý€Êèú­ÚVFPÚ>þ àà#ààöX*ÿfÏ=däèñ_Q½Ôì;À†žcMîï‰4F£i%*å|u`` d"]Dý]ˆÖu]ý4–ʇîwSH›#€Ã=i¼Ü[ÀíÀ¿b©üÇAƒ+1däèñ_ P5òÀöžcý¯‘h4FÓ* isð`_`c`á6ˆñQ,•_:h𸣲彾þœ]ojx¥ ÀrLàIÃv7oP8F£ÑhšJ!mÎ_H›‡o#Qw¤=“ …´9¤6ÞCÜßÍšüæVÇ|§6ÿTÏ Ã( ¦“q†íî߀pF£Ñ4BÚÜ1Ÿ,×^ijSH›ó µn.há©FWÒæù…´9Gàh*gTcNàrÃv/0lwîF%Ôh4¦ i3VH›ç÷£Ú-O…´¹"ð$P×ʼŸÜQH›ÊFX €Ÿ0ѰÝu‘L£Ñh4šz)¤Í…€' ®ã)¤Í•€ H¹ý¨Ùx¬6kºDQVAâN6l7ª–ÂF£„ÒæÜÀÀÚí–% …´9 ,VçKgÏ÷ q ×O_6 Æ/€ëUdE†Ñ˜P|í)Àv†íþÑs¬~ç$j4FãGM`×#þõÒ| ||Fãó]?MÐ…´9?2/òµ³€ÿ×b©üôJƒ ise`o$Ûa…ÇÞ88²ÒÎ!#GX5äÁª1¸ã9Ö×ý<–F£Ñh4ÒæqÀ!‡\<„LúŸ¨ ´‘QH›ÿE*Þ†ájàï±T>_Çñ‡°`È—íKå¯,rÈÈÑã_~öäLQB]è9V¥ÎF£Ñ„¢6Þ%8z~&pðÏX*ߪU~ …´¹%ð@ˆ¡ÓûS ·6 àV L¢¯3–Êå²Ñ€jŒ@Ò2^oaC!MD¶;ʰ݃ Ûµ Ûí¯•H£Ñhêe4áRçvŠ¥òç´yòü+ÄÐOõú[?–Ê{À–HlD Ç•?9däèñÏëôGLŽñë‰_Ód Û llEoéÌ÷€<Çêi—lfðPH›K“ôZü#–Êÿ_ë%ªM!m¦Wx-¦ÇRùò®¸ý9ï0Äê°YÐP`¥X*ÿQñ‰þ†á7Àã†í>œÜì9Vغš1lwà Iåà•åÅ‘†FÓj¶#xò81Y Øßü¡™“?@,•ŸYH›{%j E¬?ÉÙl@5~ Üä Û=ưÝj͇4cØî:†í^t™:‹Ú‘«ËF#•F£Ñ°MÀþb©üQS‹BÚ\øYÀ°Ëb©¼ÛŠó+wÀ_C ÝY5LÄåŠ|id’9ɰÝ+yŽõv„ç׆í.üYñ¯_ÇKçmDFÓK!mΉ¸ kqZ3Zâ6‰ß쟆Ä3´’{§©}O_X xDø¾ÅBUb^ÄÇ|°a»÷ 5’ï÷«² Û]ØYmѺ¶˜FÓ_~Ipð߸( IpZ¥·ŒX*ßSH›§¸=>à›V À%ÌöÀw†íŽnîòkJå¶»’º  K7k4šn¡–/dEýR‚„d€ýwF"…5¶NQ:¥pÏ$Óbcµ­‡ô†Öh4šnfdÀþ§#‘"A²~Kå£to¿@mÀ(¤Í!±T¾gðUªjû£zü£a»¯Ò«< ¼:ÐS Û‰øï‹þš@¨¾Ï0lwA`Iß¶„úk f³©ˆBü R¬c"ðÆ@¿®2†íFnÒ†ú;à©m20Ås¬Ùm²Å¶CZç.¬¶…|g"¹ö“€IžcuÊ‚0ÈP±^~›0öG=Ç5šùþ§ îNk¹HÍeN$’q- ®žûѰÝ÷|…í]ϱ¦¶CÐFQ7®å)ðƒÒL4> Û±ŠìüŽÆ\"ß¶û"¢hÞ<ä9VËRgCtלÕiŘÔç<¤ÆÙQM°†í.€TGÛØÉ< üL Ûý4qy ƒ&ºQ÷ŽU‘UàÖÀ¦Ôö û_û5¢ <üߦ²î¡äíj]ûQ§)~„ôA¨Å`ÊžžÔjz û‹§ 5¥ß¾ðmŸ—?Ž"Á°ÝyéÕÄ `%`E¤ËÓŠ€Im¿R;ØÊs¬Û-D-Ôº2éï@ýí8ƒø©iq-0±Ù“±a»Ÿ ©:Õø™çXo5óœýŰÝ4’ÕSã=Ç:³…çŸ8‰Úˆà ?ˆYHßùÛ€œçX´Ú¬Ša»ë!¹à[#ŠO3ø ùnB”HëÒæEHÛjKåÏŽB– isdî¨Æ7À±T¾£wèý¡†h¾ÃÛ(K«¡¶_ 4l÷{Da˜¥¶Ùýü;”R³ÛB ìÏ:rÔªggÄšÕJKÉâÀj{ưÝ<ÇßÂóiª`ØîœÀ_€“©­4ÕËÀ&j;ưݿ—ujƒ3ÃvWÆœŠÖ û«íKÃvO.îÔÏ¢ÄRù/ ióK`‘*CD\O-Ml„ažc7lwo`,:?$nÉv ¡ ‡a»›g"æþ(Yxа݇€=Çz2âóJT¿ŠÝIoÅŸnp1ð†íŽÆvJ¼€a»Ë§ûÍ}{¤ÙMÒ°Ý#<Çê¤<üvó&]Uè@à§‹Æs¬›·“r+5šª¶»ša»÷!)6QOþ~6&¶;VõTдå:» qôzò÷³p=0VÉÐ6 ÛðÝÓIçOD¿h[¸Ï°Ý; Û]9âsw*A ;ÒÅ^rᨮ}ë£3Ó5 ÛÝ Éþ¨•î5»/¶TÂTÓªšå㈫§]ì$Â{2’/û%ð¹’yQÜ–WW¦±âJ‡«¶»‹çXß5(¯P•;¹xùwÈ÷ý!ðâ‡dÞ,,lÌWçqG¶»C™1†íZHZÞ ¼¼Qž^A~Åí+$@mqäýŒÖFLüõ2Xΰ݃i€àCHm‚Zî¡S ió–X*EÞP¦ËxŽ5Á°Ýu‘” ‰`× NÚÖ¬I­~îD‚iêap’å2±F×§T0ã)ïî@’úã ¶A¬;xŽÕ)%·» ÕÏb,õMþ_#þú;‘º 5«†¶;°R+boÂO²s!1¿òëÝ:ä« Ãv÷C®ázŠ~}ƒ\ó÷ã<Çú¼Žó­„¤ÑU†]Ù,mØîîÝVw¥¿ÄRù©…´y-½ui*±0¦6Oè””À!==áåP•èNAÚÈjóæàc™vôe0lמ–«ãeŸ" ëeÍÊ]6lwM ìK}+Æ-=Ç ªÐ¥ë”wä{»"ý‰R?Ós¬†ª¯¶»0p’Véx ØÀs¬iœ3@žÍ/ak|ü8·ÅŒTŠá9ÔçvxØ¢?¿»nªP¤6×Bª‡‘R` ¨+(Ás¬ÉžcŒDÄ^HôŽ4íãGàã¨OjØîÜÀ턟ü§Ç+zŽuq3 —xŽõ¢çX!ôu¼tMàzU1O•êw á'ÿ»•<Ç:¶ÑÉÀs¬¯<Ç:)ÌuwÈ—­üGÉÜ4”ÕëfÂMþ3‹€<Dz›UÉÐs¬×<ÇÚø-ðrÈ—mœ×Œów±TþàÆC“Àu…´Ùöj‡ ]°žc}ä9V Q.@ê¨k6ÏGÿ¬n¨Waƒ­^ÖõëœVúÝ=ÇúÖs¬¿û +®0l…øI5á81ɇát`ÇfZ§Ô±vÎù’€£šu~ÃvB\#B ÿ ØÈs¬C<Çú¬Y2øñë$>àŸ!_r°a»´B–çH¤§H»“ ió„BÚl$®£)ôKcõëcu#4ói£XÓRÆ{¶á¼§!©ua¸ X?Jó¸çX×!ÊÉÛ!_rœa»íLaë T-…B ýØËs¬[¡œªŒ¨¸€0ÖΕ ¡_¨rÖ7.Þå`=ϱZÞO}G!îž0Ÿ÷E*{cÐKå?Ž 9Ü@îqÒæy…´¹j!mFšIÑ“•çXŸzŽub¸¬ÇÔ´•ˆßñ0Ĥ¸çXïG)€a»B|±a8ØÃs¬o[(RE<Çz)/}[È—d”o[Sc€ùCŒÛÏs¬Z-ŒçX×#w‚X¹ûË©ˆÉ=ˆÿG—ã9ÖEˆu&è÷6¸Ù°ÝQ­—ª£È".ò°Ì‹d ½¼YH›gÒæ†…´Ùr—aS}VJ8¸´™ÇÕDÂdàJ`W`Qϱ~ë9Ö¿=ÇÊG-ˆZE…õ!æ9Ö¹íì§ü­»†¾p|k%ê^ Û]84ÄÐã=Ǻ©ÕòñëFàÄCSA« ¡Êû†q%Ü ìÙ®FEžc݃¸=‚Ù–@ÊtT„ÿaÈwT/+!JäãÀ§…´yY!mþ®6IE¤¿]³ªq-’¢él^îRÛ3Rã1ÿ†1¥žá9Ö¿[-L<ÇšiØî^HÄPÂ# ÛÍzŽ5©õ’uÇ\wájà¬d)ç Ä,¿_1ó –«#<Ç‚3¬^öie[ê0xŽå¶{$’yQ‹ý Û=Ûs¬×›xúa…´U&ZO,•¯«¶A,•ŸUH›»#ÿa¬G•X ivõà»BÚ¼±4ÞKå›’Vܪ҄•¦¤ù‰’|0’Ò·¦çX£=ÇzªS&Ãv—GJQq9áVd‘á9Ö'HŠ`5b.ÄÌ«ñ¡*'þ%`ØWÀí°ø¨sԨŪSa]¶»6XZ‹Ïßµ"å°A.@jÔb(’’ÛLNCâ2¢ØkDÀX*_@º(A¸˜‰Z̃t{¼ø¬6o(¤Ím i³_‹ø–(êF¹?VS‘Ï€K‹x޵½J‹<Ÿ?$§¼$Úiö¯†çX÷#7§ ö2lWwœ,eCjWR8Õs¬)QS UË!h2›Ø žãª2ºç„ºkÔñ8µP¿Áƒ`ÄZìlØn`+öF,•òçë4é°s{ ‹¹ isL!m†ÉéC+›èò§íç`yϱâžcÝÙé%i Û]àlƒÈä?3‘åàá€1ÀTË%é.¶ Øÿ.’ëÞn.Þ ô^Êù-`Œ¹Îs¬0q&‘â9ÖHú[§·Z–NEÕØéÐÌŽ»£Kè{…´yR!mÖ`Üq݉4Måä 2¨F˜ ñìV–]mÊ7»0gÀf·KÆ%hÒ¼ª™…EMxW «WøsÀþÀè:žc= Ü0lKUYpP¢¬·ÄRù5‘š i¤I3Xø;¢$¦¶*°Õ<ŒøF ÍíOE´¨QUò¶ öá ³´SÑqÝ€a»K¿v{²„ävàäû×2lwT˜Â<*^ ¨ÔnÚs¬ «C»9Q|jM>Û#¥“5Ê"ph!m‰TNÜImËõóÐ#ÀÃm ióÀX*ÿE­Áݪ\ë9V \M"Ë!ÊÀJÀ2ÀÒ¾¿‹3x¬o´[€:YX$`̱îÆÐ4Ì:ûßC¢ß;……t™cÖ!\9á‘Õ˜A˜Ï=ÇzÙ°ÝÿR»x×ö@GÕðo'*»à!à¡BÚ<i\T‚~µØ X¿6÷Ž¥òUÔ­ @E3 2½¾«¶>æ(UakIDXX)â²R•i Ñm}‚ʾNnBM[°ÿñN úô«Ç°ÝǨµ”Z$èÚ¦‘T‡0–Ú À††í.¤»cöEÕxYmN!m.…oï4RQqp_!mþ>–ÊWtÏt«Ð*pì}µ•`Øîe§ uu§!µ™öß®|¯šIðI$RÔGLAï©ý¤t’ë#ˆqÈâ£Z'Å9€Ç±ý<Ï»H«ï(h‹55–Ê„½^TH›k#éÛ{\'ÃÏpà¶BÚüC,•¿§|ç0Ãv7G\í9Ö“M»[¹¥trgØî²ÀÃ"«ú¦i A“å§‘HQAþý@qU®0æ®pâ´ϱ¦¶û bê¯Ævô_ÈuZ;àVKå'ÒæÑHÀèÁˆ; Ã[ is‹X*ÿ¸ÇP¤ôkx°ÝË Ûm(Ÿp0Ðêt“`å€ýÓÞšKÐdéE"E})%a€ É¢çX‘·áî'A%pƒ~ïš*ÄRù¯b©üyÀÏ…{XWÊpà?åi‚C齇 +àÿ¶[«Ô¥¦;è& ÈWúb—¥3jê'èèÄN£A2…‰j”ó¿²tA%Z¼UäÄRùÙ±Tþ&$ð¹/[éÚûCé[s}1àjÃv4l7¬‰AÓy $ ý¿šæÒ5.«:ó RºñÚÿ `ÿ`ëØ2b©ü{Ha:äKö/¤Í-‹j¥Äm¼jØîÙº}iWÒM7T­h+Qø˜Ú]ç1lw¾¨„èÄRùb©ü¡Hyà0ÒÇÿ ʉŸ iMø¶a»qÃvKý@ ›,‹ìï6¨F– sx×)*Û*è7«ÝM&–ÊN 1tËBÚü%„/Š3ÈUÖ€¦óé& ÈЉ`M3²tM5Ï2‚‚Ó´Ðþ <bÜPU¼_®a»· æšÎ]B7)AuˆÓh*µ*v2å±eåè ÞKåg"-ˆ ºC!mmÔ¤¿ð¬a»)ÃvKJ¸¶» áR`4­£›b‚Ìœ‹G"…F=AÖ­nMË*ëØ#AÓ±Tþ‚KG/¬ÑßIb]µýðݻÔóA-]5­§_U6y+¤j×òÀžcµª"Y¿P+šJ´’î8 ÛóÔÒLŽHœÁÊ9H·ÑZ‹üÍšµJüAmšÎ !À°Ý úæ»Sê›_‹Ö•$ ²è´!Í@e Z‚dþ\ jZD,•Ÿ^H›¯!Í…ª±A+ÍÄã‚" wBõ'Ö4ù Ûæ‡fØîªÈ¤¿ÒR¹Ë¶»’çXo7SHE ¨ZÚ@¢ Þô—øžšEÔ"¹ *ë­ÍÿÑð<µ€Å[™Öw¦çXGz޵>°GJDê›A4Ì,Um§a»K¶{”a»EíDªOþE–m¢|~‚€ÕU¿€Á@i´"ƒdÒYÕ š 71l·ZcNe›€ýZˆ†  #[i˜TüÇs¬Ï€K€K Ûñ-o‹´8ü92YišÏ²ø¾ÃvDz?ìlJýY ­â}$*8VcÌŽÀшÓV>Øß‰î  ÷4˜y9`ÿÜÀožñÝBôž»‚BÚ ¼ÆRùÙQÈR…¶*ñë{àµaØî<À:Àú¾mé€Ã ¤·V’3l7ƒäÜ® lMõ6mÃs¬ï Û‡d—Tc'‡dèD H&ðUϱ>0l÷Uj›Í·¤Ke©[5`X7µ7®ÅcˆrV§€ "’¥ïì_°í©bžc}‡|Ÿ3lwqJ‚_þÒ‘ E)c³2R¢¸•Ú Àf†í.â9Ö—Q Ô&‚&Ë%#‘"$ªŸ}LZ¨Í=ÔVv5l÷$ϱj•×íjý†¾JÛù nA©­&¨„ÿ—mW*á9Ö§ÀmjC• ^Ø T;ذÝ×€ žcMmÒi»1Úö+ÄÿšÚÞ@´¾ß·Q®F¸©^Í4p ¾:Ö” ›ÊæÀ˜( ÉêÔ.å<èJ[¹¹¶«±2’•s}4â4†Jÿ«õ>îêE& ®¥NLB’þà9Ölàµ]hØîãÀ½†íNÞS[Þ÷ÿ{À$ϱf„<ÍZÍ–»I íC¤5hq²])J•ȶ{,Òþ±+ðkŠa»#M¨ªq¸a»ϱދH¬vðXÀþM Ûá9Ö”H¤ æ÷û'蔯@&ßP»êŸmØîØŸ<"Ø4PÌÿ¬Œ(¤ÍEb©|»à b|Ÿ£;#2ýQã#Ô¶N…q³ Ûý„R¥ ´«œ‚¬ ¿B4µ}[)p~ÞÞFÞÓ'å[?nô]¤(n¥¶08ƒ]hêe仫V+}`;àšÈ$ªMÉw\$Rt1žcýhØî½Ô¾®WExoŒFªúPÝ®*{Y IDATýŽVˆ@œ¨R@ÞoÕ6 Ø?y"Ü^ÓL´<‰r_Jm·Nœº™€¤Ý=ÖBþ›·•\œLíæ@{¶{çXOD$SC¶{rîŞcýÍÿ„çX³U@äk¼î`Ãv¯õ«§¿röÃv×G*Öâ¾(dœM°b{ºa»÷yŽÕ‰¿í£nêu¡çXoq®ƒgCŒÙ†ö)AÙo õëÄ¥‰†YÀÞžc=Übs^['‡FP7¶Ñ!†ÞhØnGÃù1l÷àÿ L­­Ú*>hÕ¼°[¿„ì'*ø/(ÀôsàÅÄéz<Çz0Ì.SŸ}Ç :ÄÚþN‹@œ(y _šuv,¤ÍÈ:Òæ²Hó¾ZÜUÌcÜÎ1)t>÷ëýv ÑÁ\Fpžð’À]ÊìØQ¶»!á0¯óë™*û@ÅZœ¥‚®ÚÅ®ÔN¸OÅïhÂqÁßû.À߯D†JûKp-—S=ÇêÖÖÆ‰¥ò=Hðr-FµÞ˜“ö¼0Às¬éžc툮Ô×j¾m·Œ²ŠbèšÀ †ívL)Ãv—n!¸NÅ×À‘ÕvzŽõ9peÀ1–#¸ãWK0lw à¼CÿÑjYžc½Ið÷p®a»¿n±8¨¢n·P; $îê¢ÖKÔ‚€# i3è3j…´¹ð§€awÅRùž’JFžc]†DÃ¥ MÈ]B'Gñvžc=„±=Rì¨í…¡TA«Û×ûXϱ‚Êã:÷ô>°݃ÂÈ×,”ÕåN‚£½oòë¥DhœJpŒÓ0àÕ¸«-¶;QVÖ1ü¸:²±ºG®t9?pI˜Êý¥6çÒWy½…Jƒ<ÇzÓs¬=hm÷·ÁLǬX Jsîá„ËPù p¿a»AH-C5Sš@¸›áàÒ AÊMtIˆã¥ ÛÝ.ĸ~£¬-×ü>gl‚ÔTÀs¬€CC ]xаÝm[,R Û]IÃÞ=Äð;€ÿ¶V¢öKåg Êz¿Nh¥,…´9q?Eÿ?Ü5´ϱ^òë÷H>ÉÛ<:¥þ~#Df½P7Âí W§b3àYÃv×l©Pe¶;İݿ"]·‚n@RO÷­Ã/~:Á«Á¡À͆í¶4“ǰÝ€›ß…~çXo´RžŒçX—ÙCçî0lwŸ‹ô†í.(±Vˆá/û´;[%²—Ý8µ6÷h¡Ç„w´Š_žŒ<ÇzÎs¬m‘tŸ Ý™^ÖIt³ R÷…çX‘h÷0ç]˜`Øn°ݖW¸4lw²²É! [‚˜ìVO#ϱ>&\ät ¸Î°Ý3ZaØîŠHùÖ œø† ˆpM0‡®dî0àÃv/5l·¥~fÃv7EêÛÕúÉ‘ÿçX>æIY¬î‡×Òæ‘jµÞ isÎBÚü7R#%ˆ›b©üSÅ¡W£žc=ï9ÖAHç¯}‘æ]³kÝlˆÜç9Ö½@2äð¹%õ5ÃvwW%¤›Ša» ªUÿKÀÎu¼ôϱÜNyáŽî5lw•ÎÓÃvç0l÷OH¾ój!^2ØÓs¬IÍ8ÿ`Æs¬ˆÿ0Åf@V~o¶oöuoØîj†íÞ‰úoØZæ9ÖTÃvwž!¸ÃÈçóWà†íÞXîªÑ;¢à·âãßiòSc‘ïFÓD<ÇzR™Þï¢zyèrÖF UUÉ+Î$ϱ Õ^¤êJl„4û-áâZüÌâžc Ø ¿ZÄRùO iówˆ% Ìê~Ià?Àq…´y#cóFÑ?_N!mÎøm¤ù5ûñsd,•¿«üɦLÒjbŒS¹Ð¤¼ð)Í8þ£[,Ï"f­›:Á¤«&жûrC«'ê8¢ n…T¯›mØî—HúÎçHpޢȄ¿ÍûŽŽ÷ëÌfÈs¬7 ÛÝIß™'äËæB&ôß¶›GLÊŸ!-zçF&•QH]zn(~þ2‚½Ú‚çXÏ©¼ÿ{ç/2 ¤Ý¾ø„¯7ÊgÈu4?Òj}~dBj´¸”üÁs¬Òê·!b©üK…´¹’AÖÏ¿:’þy*ðq!m¾|„Ü›@zÕ,Š(ds5 ÖEÀ¿+íhú*Ýs¬ ÛݘjØî6Hnô]žc½Úìsu)lxYÉuĤ_ ϱ2lwd" ªC_¡ˆѪÔÁï”çX—7ó žc3lw#ÂåáWÂT[3¹ H(Ÿµ¦ExŽ5IU™¼Ézi”%hÜšU‰ÀNžc}Ôäãv%±TþÎBÚÜIã­·FÉ’4öۮƥÀaÕ¬ -™Œ<Çš†Ü×G"_1lw’a»¶»]›K˜¶›N²ÌžFÒGLϱ~å9Ö9:ùQÁE#eƒ;g€µš=ùQ5ã×£Mñ>z Ãýõä ª”îÖ„¨#!7ëÉ¿”X*b®oW·Ý™À!@<–ÊWmÇÝJ?ýtJÓ£–VÛw†íºÀ݈u`0]BŠ=]¡]?•‰¥òOÒæºHUÓ(¿§/€]c©ü#A[©ÔZÌì ¶‹ Û})6tð¸çXA%PÃBu*QuòZÚ÷ÿÛˆiÿàéw!Œϱ5lw¤õåiHÐ^”Ì@,gEÙäÉs¬ï€= Û½ 8“pUûËHpÙ˜¥Œ5-Äs¬ *.`oäûª;æ—ÈïìâZ…!–Ê\H›› íß \p`¸8.–Êfp+€zrÆ¡¶c€iÊ:p/p¯ª÷*Z9ÒŠoM¦¥“¯ªÑ} °5 pQ«W¥íD­@îUÏ;ÇÓú ñÄÿ}¶*ØÓ<ÇzÀ°ÝñH ÒiHjn+¸°=ÇÊ·èøš:QÁ××¶{+Ò\êÏ4?ƣȷHþú?=ÇšÚ¢s Hb©|° ióäÞt0˜ÜLîNŒ¥òuõßèÀÏüH*áN†í¾XîEVÏDÜ ÝJS'bUßDZ³n…ä„΋X`ÖL7luCü/ð_Ãv—¶C" ·$|ä|->C¢{oê”'ê}ßhØî-ˆ´=°-Á]Ú‚x±Ýä9Ö+ýϱzTÙÎ¥è;Áÿ4¦àØžcÕS=oP¢&ÊÈ÷2} »Jà§BG‹"7šï‘Iª¾Ñ”›pAä{×F!mGR”¦“c©|˜¦huÓJ`Ъ~Õ«5ÚmL­¨ç§W!ðÿ-þ?7⫟…˜ìù¿ü¹bQ–Õ(³iê\Íöâ9ÖE-8®F£Ñh­\ Eò÷‡i¾Ðs¬ïé]ùDŠªbWT†"Z¸F£Ñh4‘3Ô°Ý¡†í¶Â‡ÞRÆ€I¿Óh4Mw3iàñµa»w©â"ÍB+}i¥UD£Ñh4šÐ ,Ä÷½=ð°a»¶»yŽ­F£Ñh:”¡ô­L´)à¶û¨a»[öãØZÐh4¦CJõæ4¶û„a»¿màØZÐh4¦CFpsšßã Û} 8¸#D­~Ð €F£Ñh4K- @9¿Fʬ~lØî¹†í®0^G¼k4˜d"ÞM8;ýyj¢&Œ œÅ€£€£ Û}éM=Vu'óÓŸøM¡ªÎq-pM“LÄI&âŸ'g²¹ûÚ-S·¢&þÓ€ý“‰ø;À‰™lîÑ6‹¥ #¼ ªí_†í^\ê9Ös†ín”²Õt)†í.€4Ù©¡ÿ>ÝÝ…1ÉDü4ÀßCá7™lî“vÉÓl’‰ø1H7²"Ûe²¹×ë<ÆjÀêáRÀ…ÉD|¥L6×}šE2Ÿ xÓ÷Ô¸L6—hàP!]â@J—ÿƒhûÇk)X*±†íN¡r3M‡£j„o‹L€¿b¾ÝsµE¨èY„Òn“ýQ;‘…(}s6pŒòfV#ëãûF…êbüŸåb cñ²ÇF2ÚI U2wèí.ùE&›³ù:ýµTb„úû:Ò/ý{¤#ÕTï\§iª äFȤ¿½ß_9ƒEÐóÒl;¤{âi™ln0NþÍâ6à Äšú0¦“&ÅÞHs2€÷€('ávž{@Ó, @%.÷ëêÿ Ôêr䦱ð³W#¬Pm‡a»‹¿UÛVô]h4UÉds=ÀöÉDܦd²¹¯Û-S7“Éæf%ñ•€Ï2Ù\ýN4šzh¥ð‚ÿçX3>ÆG¶k"ŠÀÖˆ¿Ë¨ãغ…e0›ÿQÊ׆Ègý[Ä—?¨"Ž“‰øˆKcR3WWÉD|~¤Ïú,à-59Öóú!ˆ²6-“Íyýc`9àCàózåPǘCÉòI&›û6h|&›Ë7pŽ˜:ǤL6WW‹Ód"> XE½6P¾dJokñ©À‡ý±l¨÷ºð¦šäk’ÉæÞyÜ9”œ£€·3ÙÜÔ:å‚Xú–Fî¥ïe²¹B=Çè/ÉD|A`EàDéiz[Úd">XqxÈuÝp»ïd"nÔúªßà¢ÈwÒð=&™ˆ/†¸êÞiôsQ׈,îÞ­¦¤9züT¤n³ÙÜs¬‡Ã6lw `-`mßße+  ÷«ÓLd¨VÄåÙ­ä]ä¾0O?5Ûs¬–øÃ“‰ø8D1˜•Éæ*v©L&â' ÑÒE¬L6÷ÚgŸùö]Žt^<Q4—RÏOGLØËdsïU8G‰g)²L&›û°lÌ`?5î7¾]_—Öº1'ñ­€= Ì2êéw‡c·Ìm¾—šÉæÒeÇXø'°>r3/ò5p!pN&›û¦ì5§Óp¢ .€|®k#•AgÏ÷NùMSÝXýJøm™lî¾ýcwR‘ùRãÇ¿D=êýž \SíF§ndÛ eËDZi¿‚|>ð/àßËVÍdsÿ«t¼*çX¹Vö£Ô?ù Ò™lîÞ ¯› q¹ œ=ØX‰±˜<Üd2ÙÜeÇYøÜ÷ÔÕ™lîOη,’µ/½qV³—‘kîÖâï¡Êû®dK Š”ŸW‘ÀÎ3ÙÜ,ßk.þR혊U2ÙÜ›cH&â#‘ëuCäžTä[ààôL6÷EÏLÄ×G¾Ï?Pêºü¸8?“ͽVA¾m×V‘C+~9[ e²¹EË^³r}n…|ßC€)À“ˆ+ç©d"î¿¶Ìds[U8÷*ê½nEo°õà)àd$ØÔ?¹5“Íí\á8KÓ{,¢žî¡÷¹=“Í=X?”iPã9Ö'žcÝí9–ã9ÖΞc-‡¼-£ëGuãäßb<ànäfºòcYi­Fÿ'ÿndà Nïä2Áí¼’LÄ·©÷ ÉD|d⹊ÒÉDûÿ=ÅýB2¯˜5‘LÄwA&–èü‹2€üèkÖÙH&â0Ø•ÒÉdõp"ð|2 È=Qˆ6¦·,øÀzÀIÀ•jeÜÎnDnEån²¼¸¡R¼zîß@¹™ÛgE‰“ÛéÇ&™ˆï¼Iß ¾¡ˆòxO2¿D­èk1 ¸H#uSŠ–óªãœ\«”šzåÜx™”üßéPdÂ8p“‰øy•¾¯d"¾$rÿ<Ê×ÖÀµÀƒÉD|îzå "™ˆ¯‡(•ûP:ùƒ(ˆG ¿É%úqŽ¡ÉDü`°'}ã–æD~…8äüÀ½ˆÒÔÇ¥šLÄ—Aöãu鵪Ž@õÖI&â{‡{%ä»9šÒL«Èuó(’tœmkä0z'”\¿RÀÉDüÂâ58 ÑN«~µϱ¦ãÕ6X&xH S€ç|Û³žc}ä`ØîÀ_›p®nÆßÙr2©ùo¼ó—$ñUÚ“Õ„t9°cÙ®iÈŠØ¿:0»’‰øZ™lî§Õ]2߸ŽÚ®·3个ì|ï"æTÿijR§c—çò_'ÓéÛdDÁ<ªÆ1‚Húþÿ޾ éîÀÀ5eÏŸLiÊb%¶oX¨D|C¤¸Y¹Å©‡¾.²ÕsÖ8ä^WÎ.@&™ˆÇÚw•"y30¼l×$ÄJê?çáÀ—Àßë‡#Jëºe¯ÿq‹ù¯Å̀듉øšl–ÏQªˆ¿ôm@ïD= Yè5Ú•öäš)§üûœ ¸(™ˆOÍds×Ö8ÞÉT ~Vfúû)}OåÌ…(UUQŠÙÔÎ ™¸2à8«·¨±~&Ñ÷9¹FNŠ˜E4ÑPOýTd‚¿¹wVðkϱ¶öëDϱn-Ÿü<Çúø )w7¯!æÆyÕ¶3¥¦Ö¥(5±3¥“éÛˆ¿èkÛšRâ’À Åjeu¥7ò—UübÀÏ‘ÕDUn]Jo<Ïds+f²¹M¥À³c2ʾ9™ÉææCnÂÙ²ýûõ³JÝLÄ­± ² 3‘ ßÏYþs$ñÍè{3K¯`SnеH&âs"“ò‡¸AbÈ*Õ¡´¢éÉD¼\ùóS”ÿÄ¥µbY¹´lÜHd{9‡ fhÿ5“VÏdsË#ÖŸ#·O‘¿+s{‘#(üóÈïb`$buò»yvB\P ´9‘ɺÈ$õ\q{+à=˜È ô'ù3ÙÜr™lnsd¥êw[l¢&źÎLÄN©{°8¹Öæ~¸hüä”ë°ÅÉÿ=ÄÂz³oßÅ”²OG¬0+#1$û"Jy—SêêþQ˜W@¾Û?}îñ¸ŒÒÉ? üB]#K"V/}ûG'ñ%‡¡€H0lwmÄüæçGäÇø&r!¿Uüßs¬ÏèïÓ‹C·2ø}&›{G=ž ÜšLÄA4å"õ(eå«¿£2Ùœ"»?™ˆ?‚(nk¨çü«™u)M…} ØÒç÷üx5™ˆ¿ ÜDõÝr‹ÝO+µL675™ˆ‚(ŒE£úïü¶L6w„ïõž2® Û‚/†Lˆ}b&Br^&›;Û÷ø½d"¾òþ‹¦Õ%奨 •·$ÿðg_pÕ£ÉDü1ä†yX2íD©ëd<°­oÕû>pR2ÿ¸È7.…LðÕ¸ØÓ7ñx2™ ÿÏ7nsV‡Šu(½F_+~™lîcà¼d"þ¢ ¬è7nQ „ßÊ3[½Ïâ¤ý%py2A©•gwà±b<@™»§Î`ºr7”ÿzžLÄö/ÿqç>ˆRK†Éæü Á+Êõ6Q¸A,QûSÃÚ†LÆ—øƒú”‹Å}€2ÙÜþç®U×ç#ôuy3'’Wä[`ëL6÷´ï¹«’‰øuœŠÙZJùYß÷ÔÀ!ÅÏ/“Í} ü;™ˆOB\f ÊêÆÃ€É•:X0lwUäÆþ9rž…|8CÕß!!ûŸŽ¬Ð–A´»e(õS¾Œ¬<ŸÙX©Z›zyÚ7ùû¹©MQÔ–ƒzZ?£ùË[ÿ˜XÅgù(½ ÀšÉD|AŒW30ÆôT$“ÍÝšLÄD, •x™øŠ>ñÑÊ8©F÷$„†>“P&›ëI&â×Sz“[ŸÆ€Jçø!™ˆß‚ø=‹üŒ^ ü³:ª<²ZÉy ÔäŸ/§|%b“wNÉX¬lºU2Ÿ·Fáå”’óÄôZt”¿¿j”_`”RdýLD&÷â$¸ ¢è®H©ÿúßäï—ñ\$V£LD,’ÅÉ¡ÉD|r½Þ“Éæ^F¬ýa'ßÿ_QὨïáXz€âëª)d²¹rkˆrìWÂo+›ü‹çû ™ˆŸM©égMJ¯ÛëË&ÿâqÞN&âçgU9Nù5’EŠI•{ Yt]„›Cn ûÑ[!&´(9Ös¬Ç[|ŽÁ®Lªôd&››LÄß§wâ_´Ò¸ Œ¢Ô\¼ áLsÅBKwÓ÷¦ÿX×=A “ÍÍH&âg§«§†!¾ú}€o“‰ø½ˆ«alˆ•Ú¤Ï×òuñ~Ès, ?)[¿ö=ÿ†?ŽÂú,žELíõ°\Ùã—«V2‰ÒÒæK# `9ïªÕV¥ãü˜LÄŸD ¢¬šLÄGd²¹)r–î«-ˆ¢å©üõ¡³#š…šxÏ@2SŠ Ênjû>™ˆß\¯×—gH„Aecøñ×kç=Ľº€z\)ӬȳUž/ÿ×êÛðD}Í:Nùw|¾Ú‚Øt(bZÌ´£ÂÝKœc *õø¡kYV±ºô'Uv!õ×ï—E©O®œk0“Í(åuüçCn¬×"QȵnpPý³h¦eªÞsÌC©«$ÈJYó³ªÂ¾ÿ¿§4¯œr÷ÉGËQžCFùlôº+^s寯«f@³ÈdsDI›X¶knd~ðT2o¤@\yàjÕÂTÊÊãÿ>«}—Ð÷û*2²ìq­ë³Ö5Ѭã4| CR¥&WFÓ¦{ŽUq•ÐdºIðI™Ãg2/§Ù*å?À§MŠšýÓô®lç@ `U³¬_åùŸÈds÷«'ñ‘Þ ÅÆME6DÌÀë„”³#ÈdsÓ’‰økÀêê©_%ñ93Ù\5…!ð³ªÀGô¦ÍrV‹»Y¯ìñ‡GÁºrnàû PÉEUNùuw<á,OÅI°¼‘UyÊhdd²¹ À:*}®x½nF¯U`Mà¾d"nÖ™ð¥n½ªè’‰øR”Z ª}— .•J”›é7 4@ÐO­k³Òqîoà8å׈MuËžŸ©Ã<ÇšaØîϳR`®¡¦ßDUà›€‰H U‘µüÚrÖŠDš ¨IéCzo #ëÊýÒ*èª<§XMîIJÖv¥‚LÄçE\SIJõA¿;âÝL6w ¶$_ŒWX;™ˆ¯X%¢“y’^`¤PyæÉD| ë<ú*¥®Ï]¨ Ð%ñåŸo‘ÉT_΃Dÿß]á8k–ÉùTÈjqåk&g²¹òtÉb@™¿±SÑõóŽú¿x½lUIIQ–¢-|O}Z©øQ#¨,¿le²¹ ‘.’#y1»f9D1~&ìñ•‹áUz;(®’LÄ×Èds¯V^îVkÄû,¥ñÛ'ñ“2Ù\¥"o;Ux®ÈSewL&âg”WT÷”ZÇ)¿F¾{ ðk²çX» >ÄZfIM÷ЪÏ­`BÙã3ÊS×’‰øÎô š«}ÿ›ÀqŠ®‰¤·|ûÊßçß’‰øßüO¨TÁÛ©=©FVÅí§ÔD~NÙøòl7PþY]—” o?¡,ã<þ•eOM&â%–àù@Ù¸K&îëUÑÿqVF ?ù)Õ¸¹ŽŠ8¾4¹âñC\Aþën UÖ¯8-œX–r9©‡p™o[µL¬Â’I)ˆ–ƒ)½^ÊJÈds“ém-]¤|µæÜWúþ \Z– I2ßI¡ô“ ¾U7į8¬üW}Žþóƒ¤2V;ÎdJ­@k#×yy]Š¿#Þªq\äeeñË2‰sñ_#Û–œÈs¬ë Û½Iu9ŠÒjBšî¢›,O#>ñ¢Ì¿FÒvnFÒu¨]Ì&*.D"΋¾ÛÓ€¿&ñÿ QΛÓ7¿Û)š33Ù܇ÉDüº²1ÿJ&â ¤G†Ü¸ƒ|ÃW!EO~’KM2"Qßþt³À ÷ö:ŠÛ‘€µb°æ|HJÝ“ÈÊiMħ\oô?™lîÉDü$_Ľô”ÊLx©É`ÑëK1§ÿ;àÐóO¨Ô­§«ÕÆ”Æ}Ф5†‘sZ2?8E=µð¾ ôîUSw¸IDAT¼QD÷@¾÷"ÏQªpœ˜Ü‹÷û“‘æCã‘Ïm(ð§"ùé~Þ¢·–Àpà™d"þ(RkL¦v‹k” Eeù¬d"¾¸’qiàoeã,{æÜW#EVRãÖGî!w ® ÷˜|¥5êál¤ŽD‘m“‰øˆûe Âe]JiÂ.À*0ò{Ä’·b¥Édsß—@>)%Öÿ‹(}»•Éó2pgŸU¢çXÓ<Ç:C½èx$5NÓ}4[hÙu V)—Œ\G!uqò¯*Â{_Jc–C|n—Ðwò·3Ù\ùÊoú®*WCn‚{Ð;ùW‹@&“ͽNo¹gwÄiÈ„s-¥®’{3Ù\kJDŽŠŽßšRÿæ0d2=q‘Ä›d£Aµ•½v’ÿ~2âõOþß»¨U[5ÞCªë CÒðŽFnàþÉÿ`›L6WO¡®1”ú†ç@\fW מßEñ°›ß‡žÉ枥T)™ NGÒïü“ÿÀŽ™¾ÍcÊ‹ý Yɧ(ýœúÉæ>¡Ô*µ ò?‰¤úãVž¡o¦Bà¹Õª|7Jï#‘ïшrîŸüÿìÓhµÃL6w}SG"VôCèl«þŽçÒ×ݹ8r?LÒ;ù¥õžE©ëi¤ŒðåHIoÿwü1°s&››]ÕLì9Ö·žc‰˜"S!ÐtÍVžkòñJP%9÷§T (ÒƒÜ0Z•§šL67Iß©Õüäs¤ǘòÊ¿· ÕMÀ³‘ÈiUöI æÅZiS]×£&É­©¨5Iwk(¥VM"L­‰à `ÍL6Wî³-çEd2«±= ™\+¦Ös2áŸEižrî6Ëds“*ã_HÌI­´Ã×€í3Ù\ŸÌ°Œ4:–ÚÙUÉdsÇ!fìZ ¯C|•|aÏÉæ^B”ßZî•Ùˆ‹ãW!R0k’ÉæÎ§öïôf|]Y«cb=¸œêß핈§Öqf#}HÆP;ƒç~äyúÖÀîƒçXß"¦Ï Û]ù÷¦7@§³ökZK3€T/fÑ42ÙÜUÉDün䦼1²~x4“ͽš”ò°§û^âÏ/Ÿ^¶ïù§º”ÞöÓåV…{)ƒéÓ›=“Í=ŸLÄWCV; Nbˆ?ï5àÚ…bŠfÝ€±+ÂGÈDóh&››¤Ž_õý¨›ä%ÉDüÄe²Rîôd"z.“ÍU ¤z˜Òɮڊöƒ²óû#–g—í+OE¼)“\¤Ú éŲãT*Póš P[Q6B”¯Ç€Ç3ÙÜ×ÉD¼¼c\è*uê{úk2wûÚªÈ ìKdES&›{¡ÊËg•Éÿz&›{A&nŒDu¯‰|ÆÏ!]þJÃSA{Ç%ñ"«ÌŸ#î€/ëî¾ %“Íݬ®—b¶È2ˆåd¥z[Æ× °ÂëÏV.¬ ‘âBÅô»Pi&›»!™ˆ?Dïõº&¢,¿„?QmEöÜ™lî=õÛZQx–C* ~‚\§×g²¹jYïþR<ßèd"~5²b/ZbžPÛóªîˆÿ˜}Êg¤óÉDüäž²5â’z\m/Ñ[ô«HŸk\Õü°“‰ø¿‘kùHà/‘ïøþL6WRO`HOOcýTæÀžˆÿhMú-æ9VÇ» Û=ñçDÅ4Ï±ê  iÃv? 9)?Ó=Ǫ–ž¢Ñ´5©m«N®5‘uÉí€5ƒ—d"þKDa.2:SZê¸!-Õðë¤'÷‰†í.‚Ìl…D¿Û “ÿ§?€d…õà&ϱÚê{× >’‰ø–”¦L^Éænª0nzÓ¿@ÒëºfòWô§Ñ’¦‹I&âYzë| ü5S¹;éekU Mà €Õ}î&µi:ƒF€·Iÿϱ&5W¦.Þ¤´6ÄÉD|’ h~ª—¡4k"lz]'ñ˲ǃº?Ë £ßQdX2ßÇ_ ™ˆÿšÞ,âk‚‚ CÑ@Ó‘„ ÖùÑ$]à~ϱ}^M¨”Éé-h47’þõ6RY1†Xùsâ ÀQÊÙ’‰øÑˆ¿·¼&üÛ†k&ÿAz‹.ô]‘ÂBL…Ÿ!«¿•hl­£zÐ ÀÀå5ú6ºø ªsÕö¤çXu7ßÐh"bd²÷¯Do®·Ÿ¤ßQÖ$Ö§¯i÷ JÛUk0™lîÉd"~ ¥uæF®‹òkÄ2vp³Î¯€è‰jÂ=)8ò`ô ð˜ÊêÐh:žL67%™ˆoäqHõ¢? ¾ÓnT}ˆg*´ˆÖ \2ÙÜÉDüK$Õyí*Ãf#i’‡4šIR‰†³ mÈxÃs¬Õ"<ŸFÓõ¨²®Û uI–GÒ >B|þã»0ðd"¾R襘røLyxÍàA•gÞɪ[IUö€F£ÑhúÐM cZEÔ>ðFz—k4FÓT´ã©]´™|Fi¥)F£ÑhÚ w¶» ÒxaqÄï2 )½8‰œ¯µÍ@Ò馪íßÿþÇ_<ǪU§Y£Ñh4šHø=|šá£Å¯IEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/AlibabaCloud.png000644 001751 000000 00000062166 14745137273 025744 0ustar00martymacwheel000000 000000 ‰PNG  IHDR^,-¶Ðd cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEç &Lú®ZcVIDATxÚí½wœeGu'þ=§êÞûRçžžœG3š¨4Ê$D4&ƒ1öb›µA„„ “Ì.¶×^ï:a²Èˆ QÎa$MÐ$MîžéüÞ»¡êœß÷¾îi¢ ëßžÏç©{ÔïÕ»U·î©Sç|¿ß"<Çnþг%Ì‹‡¸= Û³ÁÞŠ6Oà."Â…D™H´ÈTÑpDe! ¯£ìÔ@¸à¯`i÷LqÓöºzÐó •Å_¬ùúþÓ®» Çjík0Æå`a¶÷äSâgþçÌfˆsP´³Gf<7àmbC°Ž‚SRã @€1®¸ÞaO)ð@ªtçH¹¼¾¿ÜÓ«ôº±J×ÄKßÇ1_×ñÚO¯; P(ŠJ¦0¢P¤ˆe4ƒ¡ø­Ol<¦ön¼þb€ˆ‚Æ0ÊÚ€Zƒ:BŒ˜^eÞtåÍ€]u&@ͧdÕAI[FÓD´mÊP¼õª[ßÿ«%PUtwÔH|uÈHª3•Äá’+oÿ¥Ï‹e·ÿå)JÔSUÄx6Ͱ/èÐá°¡døó«nþU_æÿ1ûÙUgA0€^Êš„b0ÆÕª…âì>rlí|ül():ŽŒŒ#4²Šz5 (^ÿ‘»~ÕÝý•Û÷®»Œ^¥’4a‘ c‹:Wð¬´)Ø©xø‹1˜?üeV9…!oøBch+*D\&(€ª² @ J 3À @À4 ®{w×þ,¹ÿ‚~¸ÿá·\tÜyð¡ìNÿögPŠô^§)jš"@ ©‚•%Ì(¾ €>`bÞÍP`¡.ìµô-Rýgq+U½ù} ñÒÏl}QoÄ?}öQ²8E@iT«U P"¨0JЄòk=ªýðú³@@‘uˆP…)RÆ HxñpÄ!AÛ7šÞuõb@#Q$™†˜|/ HHeœT²[>~^rõ/oqúE즜…gKӠûÀ@i1as# &@~Õ×úK‹÷-Fœ8Lë©¡¯r»FkäD¤(ÚÚ }Ö<ã3OøMï^†-a{{;JÎáe×ÞyP[·\·ýµéðc#0ꫤږÏ_"(À( èØæîf»ïÚËð¬Ž"@Z#h…J€:‚ŽH&ï}^ç="œ»2qo­¸ôMìÒs‡!f*‡œ± 侎аB!ÅÿwŽ€ù»[³Êñk–Ž¥ϱ;’ßÇ|Ú?R§àsã68!=;ô>€PÈC (Žò3Þ$ñœ™nðÌ¡úè=δý¦üPU)»å½ ñ’ϾˆÎ—D0 KÛO2£ß±±?¹äÕUˆ2Æ…*Ýët­7føKŸ?o}ÏÏÚ¨çñ“ÚžýãipK:^¹Ìc¶´{Wê¿ÅÐﵞ‚iÍáhv<øûek^J¬©!“’ J2ð÷Ves«ÑZ¤='ÐÀûtlçêj)2Æ(6ÝØÐØ®­;íCÿö/úµ¿XŒ7aóD› ‚‚̬ÆöymióM¡¸—õ.5£¶ï"þIóï ÿU÷ÿWnD˜c¦u´ïyúÂ6yMHù„TR64j«CwÀ×,GºÎ{ÔKÕ ‡w¾³-‹ß¤n®f‚ 4¹S#=ärFÀ”NOx6È(@lJ_Šmõ»çùã]_èø\ï»®ú>ô†Sùáú}딫ÿЖf”­,µqHS()„ªÅBp¤ à ›fµ2›¥¡—™U“Í/?½á­}š5ïú˹8÷ov¼(÷Â؃ƒ²^÷ŸÁ^_8]zx+£Vªz§~Þ®¶®/ß?sáãsdžÜáÚúî5k$d:f¢yfgÚ<ÅÆÎyÓn|­m[%âÇŠ.Ä€@œ)ÏBœKFg°…$aÄATE¥u³Êæ²ÏŸ£v¡y*“¿ pÞªÁcÄZlëß»ǃ/ʘü2¬Šq¤ÁtôèþjUÆ—‡p—°¯8ÑÞros< Ç*&ú¦Uÿ«¾Ô_Š=üþÕÁCåiÁt?<ÿ5åý—DC¯ŽZ\†t–|£½ 9 ¨äëÍv¸Qqõþ8,oøôº½ívÁߌúއÞÕ‡}I‚Š1¨Õ÷`\›è?P©8w‚¹¡HÙ¨ ƒaÜ^&|õÿ¼@8²ž¸}¥'–\z>#] d>5ÂJÙ)@öæA0"œ»hxÇíÈ¿]rI«ƒ‚‚È‘‡”NO°48ÂpØ~ËXPùÊEç|eË ÷ý nþàixé èÐm çù¥ÊlÙMîFfY¹xš¡¬+¢ ¡¸šÃš@àTA¤Ò ÖS[hý…J’FšÅ…ïêfJn¹|^òé-¿ðÍèÍ—dÂnø¥"2  /@36}AmZ¿KÖ,Ü»uSEüØÑÚÕ0˜`¦69ÒðÞ&ˆK€}8? 0ÞkÄ©7[€C0>dõ©!X—æï…j$ŽÂ²x£¨±†aÆFêïûu´1F3‡ÄÆì(µÖ Ykd UÅÕR{fúÏèxï¾æÄ*h*WÞ:²î¢Hâ7°ÈVtq ŽBö qð^ ù4® é,¬èwÒËŒYÖ/Á—ïÏè‘?YXsßì7˜ïÁ¨ÍÐÕhhÀ"f¨a£%µ€ ý?Ç ? OÆUuŒq!„d,È cK6ð`Çl -¯LÜ[Û²ä %—ôu€ˆBÒ#¨WÀ«S jBx2±g·mÜ–6 Fÿ´¥}Ö£ßzèO´Ý7pÒ§Ö¿ ]ü±-¸óªÑ©á®ÿÐ{S:·øÙš)Æ PÀøÐÃìˆ Í'Ÿ€ÔÔ¢”9ê¢ô"¨Z­~ ›ô‰ÿ1^û…oÄw®>>ÀBŸÌŒ`Y›ƒÂ`yf6NÑV£ŽÔœ„,ùQ »÷½'ã¬Ï>zØv­Šv㜤`ï<<v þèÃ?{Á×, Üݶ”_}à‰e*Ál+ùÞZEYE5¢>5+Û`k]”ì{@*‡lÏ._Ÿ(ÍTMLÞ/ycâ!H@ Uº Uì ›iYì8ƒ‚Œõ äñ°<GŽUÐ>¼§¸· RÎL(HójÀj@y"ý×ÒzÚgmí*$©‡²ÀEÆpAÎ2TÝ/þe¿vãå˱OÎ gái7Ô6§ÿésÛÝÈDˆ/É”bn l&s‰Ui†Þa–ÕŒˆ%RXMˆIÚ ²¯ñÂmͰ:¾«²üÁ¸ÙHµÑŸG*œ×S@)œ5pÆAÈC@`úŽ×³‡'°ƒ’¡x^ G䋟¶- äìÓ>õ «`b8("zA@b”P'E¿ö'6ÚY·•'5zpˆ*O¼äú§¶õ¿gIQÍF`Dpú1BVŽÅÖ~ü1Ü{Íj„‚Í¢ºyAÏ;ø]º{úìxxyG6pj‰ÌCv•MWP'@¬b¬#“ÎwbDÔƒ ¨°okåWôùÆ#ótè®;pÂ/t­•€1æ6¿Té&¥<ÒÍ! ùO£D.-÷¸tIl¢iß<áÃ[_²ã?²ÛÂñÞSZe¹a¨©"€¤Á3å e½”;ÞDÕíöÙáƒØ85lë&X¿?¥~£¯p¨ªZ¬ÐyIRWÔÀƒ!¿ÆŽW¡8ãÓ;èkÿ~&Ù$I  qàR›Áü'‰x÷£ ð`ÒoQ|BwÜÿús­qUåªJ¬ÊfØlk¿¡îÓ~n#ª¶¼ÐzZÊ"ój[(A¥›Å\hÕïÝ׌÷žôðK·>tÒ×K…ãx8ãá9…²ƒâ¨ Éÿ_˜‚!09”†òQÉg& $bj»üP¯]2u˜È"ÅC§F5˜‘ABaœX³?1¼×1?•qpoÌ¥ÃêæóOúû¡Çï~‹VÕã–GÚæƒTð²kîþ¥tð¬>¸áÊ•øòðw¥­VÙcÔï)ûÆ-O¶ŸXêI‡–u§uËBSÉæ—´9-”¸Ãª7F<ܤ¢' ,© IÏ.k¶¦ãÔoßóõïÿ…ªø¡ïG-1“[¦ª=9€ 9øbj8î<"õ½Ží’Kwk]IÜ+Ä1Ø4Ó”42' ˆ%U+Ž(Çöµ¶~¤š²ÊFåF*V€UÁE÷!¹C%(X XóôE>u‚Mkàü¯oª¡1°÷üϹº¢ÖÃ@\n,¢v(çÛÿËíž+¦Ãê^0 …ðí}Y|N•â—K—'êH]ÆáîÄTnªÁ·úËÑýK÷¬;°¿VÅôÏŽcÝÕ çt¦#çv¦ß,Kv‘ÌU°z‚Jw Í— ̽_=ùÎý§Fn\F ‹!`„x«GžÄú¿\Q‹Ä‚Ø‚*ÐV­g°Ÿâß¶‚ø$bN¢ ö *¶—p<"V1屺–î>`*ßÙËtëͶõgQúŠ0AÅ'øÑÃïB© —\ûôÿÑŽ¾áONüþè–cwe:³ÑبœU_0º7õ^0»Ã ¯œƒ½/¯¦î‘óKdY°àü'qI§á`þ×6_ÑÕ­ã^ÈuýôŠUï'&ž§ìV‹q^ò¸€ŽŽ¨È䈰=%h Þ®êÆ¿ûW§ãµŸ{à vk• ZÌœ:m¢‰RØÐÃ!9ö‘ª…Bð¦«:æë}òÝó Kke(Ö$1%hf/ øƈï‹ÞAÜø†qGjVÀY+e˜ÿ©ÁÚúNl©v˜ŠúE‘w¿ õ}ð‘… ¹Ø2ÌÁ7¶r×?VÄíŒ$Ñ ³–•pïGO¾`ÑÎZtÉׯX÷…Ç ì ¼#Síd¯H}F{`.]eä~ìŽ7q@pAîtY€Ðeep( &ðÿËñ¢“*ð6@6"°cÐܧZap±cµ¡¤Käß)p€VNWÙ@8¨ ÿ 5|E“ý‚Ì;@çq†?õâ@®^ ;ùSÏwú7}ð|(h·heÏSºwV©þœ¾‡S¿:làH‚¸eHwo6Ô]–ì9ÞÖ¬Q@ÙjË2à!EÄËJ{Ix+€S¡¾ €@RQ’óÉ—;îPTÛ~Rn ;“!ʲÖƒ`R°hÍNyï·?~*@¯ÔQ‘BÌ%Œhë‡X&˜NÆ­I‡ÍÙ€ˆÁ”€IñÕ«OA@„™A2^‰ÀVÊJ Ï4ÇPc‹×}øþ㳟}ô¬‰ß˾ ¯ ¨4BÌ%—}üÞC~¾­\Åü³ŽièLYa‘S… ѪT ¾ýîsáEÑ^²¨,ã`JáŒCÓDˆM£‚W|äñãîÇ ×œ¡ eˆ¤‰PxfŒ8 ?*xãõ^ÈÔA€›{Ó¼dµ’ÕO²ŠåІ€Ñ$öþ¶ý&üò±“Ý=óã3"ïºæL|fÃßè=ËÿhÃò'?ÿ<ðs y¼¨+÷j}iÒ…~zÇN38¢­¹-sLŠW+wvhûÁ•—A@Õ£SšÝHc$Cl šˆÐ? ´‚ßù›GÙÆ¿}ìTÄ,(Tã@ê`M †7CaÁ*xÕÏÇÁûú sd”zt'#0’Ïö4«µµã©†¢Ý¿ó¡ž÷ù]yµè3ã°È@äáY‘2!å.D”dpbQ©•À\D¸Åž²wf'ˆÕQ%BJìFOá'ƃ`o_:à2ÿ·-mš}Ò Žn ۾ߠÒ728ćz» ¨Ýˆ¶½Ðz-^¤ÕÒ,oVV‰: i¾Ë( ¶@ìmð¼‚Ö’HÞº£Fç¾ÏžjÍ!‚KçœsǤI« ¨gh¡ìHCŸG#ϱ pðkòL:ùj奊±©‡Q‡N·¤ÍV{t¸¶^kQq¦¶}ÔökqÃÚË©\í¶aj4ª¼šÖ"1˜àpßc~‰}hõãE±j¹‚ÞRȦTë´D³…Np˜|…›mÕ[NûÜÖ§g§;‹·”ç çÉvÖ¦Q[þQJ´U êL¾üV›IOÍ%ËM)ëB™…ˆ@š/ÌÎ*ëàŒƒçüçqŒÍ/2w¦ŽmëQ;žñ}î÷ï½?ì¼ÙGŠTb ²l 8Ô‚dÌRR2ã£&º/aÚrûôÜɃ;Q–oÿ̦ã§_]úÉ|å{ä3°=¸ðcÛöïzïcyÈNœìì”ÁQ@U[1ß ²ù² Ž/Ë#ò5…B9G<«b3ÄÜ ÕÓÁX€;@ã6cÊsÞP¬Õ†ŸÛn\ÏŸ×RØn‚Æ0”Gªê°1ikãòƒ+s²E–ǯ'X +lÀÏ¢¢à”Ô<”‹‚€ @StÆ{pî´¿ÇwßÅBaK AÀnRݪüûYorw]Ù€ÇYŸ8rêéÖ÷/Á¦z€S;´';°/˜Î)ó¡˜K@ )©©âAw=ݳjäÁMnBÖ^wð<üƒ{?¯ÃQ—3Ĉ!"@¡o@%ßÍjjÔì°€™Tô°‹ »"ÉšÛʳômù¼-½ /ûÄ‘£Ó‡?p<´gã¸Ë–БÅm ,Л+ª»ØUÔÿGßirû B„W|aà¸ç×øð20[MºX.Œ#(x$…yjÌæ¡Ë§£¤.<4ñÜÞ‡­×¬ÁÎÊt pw²Êl.¹ä~H¶P¤àíÈÜ Ô]*h]G€g 3…nÀa®óž¬FÆç—‚Ÿ ]H [0 Àjí´a‚îà÷ÿös³Ã…Þùý<©Pt&KtøÀvØ 9ÂÐårù³09½¾¤@“€õÅ3qÐ òð×"ãÀü$¶PôaÝÈq#Ž ;Y±{'ÂæŠæ~ÄÍ&JÖ€ãA,Q˜êBf‚dµ÷|èèk ý'LeM;£" ^$áPñ¿ÝðáÓQª¢â=+0+Êâ…d’²’€ 5#jÌöº ¶2ù§ ãeÆ{„”dõ5%¿}:«~nÛ¼eM2&Rä(1¢N9Œ`É òj(¥H ä‘¯¨y–Þ seo»zœû7϶…}_¹b%~à;²Å 8”vB%c0³"⪠(«OòÞrþ¸xârš¿¦âxôѵx¶mdèIô·ÍåûG³™ódç¹ÕŒ^8·8¬[§M8ï›Î™½Ž+Ooûâ‰?OIî^ƒ{¶b6n¸â´c —^ÿ¦eã¸ÓÌ”sG7ÎêðñÛ­×ßv. %R!.ÁÝsôiÙ}¨¾NK† `Ž$Ö¼“•N7ª–‘§¼³92òo}vÚ—Û³ÄÀï? °×¥ØÛ»‚_ÕÏR¦±Ë˜’‹¬øEV´ @36â(<àµò°Uü ÍÉö†s²o±,åjÍŽŒ†W"8 ¤T³ÖžyíS/Ø!ýª-€€N ¡ƒV5mE¹ (TÕ¨ª=^jóDk |¯kΈÆc È¥½ÐŒÕäÄ bÞd+ÕG2»¿Ý&G„Ø*, #iùÆŠÍzØðÐ_,Ài_Ø6Ñv¥Rà{54¦Ñ ˆ‚9OÚçE5“Ëètu@$÷ÆCåŽÀϱ,=ž›{壦Z6Zož³kE1$ÖÌgÈfŸ²ùçïbæ7—™Vžº×‰ $ðâ–U½_ºñ3»ìøÚ½Õyÿ>²ý©m•ispïåsqÖ§'ëŒÅ¶0¤yÞ—¶6Ú—-s{ßf$½4?ËzÓEöä!¤ Ï`5ð*+j¬gu{ÿ²-]Ó¾²ü½?ß~[|]õ4üû»VBEð÷}Z·Wgx±AÞƒ$… €²Õ´Ñx}Ñø™vmÆ¥nAP2’ÁJ †Há‰NêJâU&={ciîÿúÚÛ¿þØïýËëå¶+ã¢ës ƒô|¨º’!lìZjjÉÐŒ¥£Ï¼¹Í5_ÉðË…tA ‡) 'ÏËÚÈžYÍ+ªÕò÷v•ª7•gúð2œö±ch6 ²°b”TµGÏåJ ëa{2ã㣶µ?søÒ{¿/÷~qÁî„K_ŽÉ?€ÉĬ²Ù@ûú¹{WH H°`2¨†Û>²cÖâßó üôC«»–÷?rnÔß\qÙ©ÆGó­— ‹4…ÀA½B•W*¹ÓÝØøÅ‘‘û‚Ž/ï¨Ôî~ÃÝw¤ß;ë2<ùþ³1’í@;ÅhÏÚáâj ~¡Ÿ„¸Ž7mùak„lÏêyî]Û•ÍfÑÅ µVÎ;î]w™;¸æcÜúW'ÁyÂ%ýCøêìÞ¶Wï¾ùÕéÈëÄdk½‘YFYŸï-… ޼ªºåVeUàÝ= íCKdjÂr/àŽ—Šÿ:²hré×·”}æ92@àñ|å‰"ÚZi‡ #«UTÚº©ÔÜ*'gz“uÎÌ"ØÍ¥ê–wìï¿,Ü`¢˜›°gÇ5M†^fÍüo£¸ï/ÔvkÅ4Þ‹÷^m`ÔC3‚…EäAÁVŠü äv¹¤2" `@4EІ/±ZÍñÍ@áx‹uZ(w¼$R¶–ÎïõÌ$ó‹# 2ÐDzNÁ*Ì‚> ê IçP¼=J{gÿ¯Di;`åÖ+–ãâëŸÆ]ï›3>Žå¡+Ï÷ãçÔ$û}N›/Øõ„^`}ŽWRxÊ…H T@¼.ž=ÝË´NvÞݵà«jÛ>J·ž‚‡^–€>£Øzù œ¦£°ÞÁÚ¡ó”Hu €ˆüLC¾d%ƒ‚sȤø©d› ”ÖX`¾MëÕýÍ)ÿ'µK|7M̉¦©æxv X1ðÈ¢9¨ÿ^Uo*I|Âj¢Fk!YxDæ(ÓŸú9DñŒÑrû¿ª$O=tÍbœöÑÍ8cÉ d¬ù͸ø.VF *®†²=í1áó_<ïùä]õ|ò=/Nž]gý( ÚRÆêñ¿AÏò´þ{˜Ã¼ªÆ .DÀ%XAÙ€Uqç'OFS¯ùà=¸å¯ªÝ‹+æemFÿØfé%ï+Ö§ i‚’‡?ÀªQø®4M»Úžßa³fîÛù/;—.¹ñ7ùIã=W<€ßýîëQ¡’‰+;×0â3%ÊPUv• m¨1‡a­–œƒ£ìªY*q¤°¬€xQã BOè7ñxnŸ¦gÇ#¯®ºø]V³SÉ¥%€”AZ$ 5%EÚ à<‚,ÉHÔ“oϳ9rÄ‹<êÍ·ÿ÷û^Ç)­UûHF¹”^HqÍ4 #­C\³¸SÁ¾Ò‚gy¦Ø)¶Çàg;×q€›áqõ˜•š\×­â]·%»øÁ÷-ïjg74µí‘ÑÜ™–á¨7W–ÌïLA …2[8^£¹®Ba¤ÅœñŠÀxñ0*wwò1mÅ/ "D$:×xB)`dž‘æᛳÜ&'»U5d êoÏ4ÁpSÍß6ÿ}d6~ð×¢9´Ï$AðŠlß™5Iÿ8pé+X¤JÄpÄð†ë)ëÞŒ¬ÒˆtRq;‚4‰z!§×ÓFÙ#½óÀœ³·^} nºf-^1v“´eM Ä”‰po‡ëYNVA4^V À +Ð C•ôе‹ÛgEÙKËiüÇ¡çóˆ!!Pîµài 1Q9U…UÀˆvØ,yiÁx_’}3–üä]ßøÝzNK°b@9T%O{H±à3çm…à‰`„`|^Á¡V&O!š*±O¯öwÌNÆNîJFþKÄñé¬>Ï“K1°*Œf0šÀ¨”07oñðv hx;®Œç?윉ßç˜qÔ4ƒ‚ÛÒÖ¶˜üylÆ9z»°„ì¬ô¡æšø«n9†Ï+Šu‹KrÐ_©Èó&…vŽ7ÛpïUËQÎbôd©©ˆÎ<Ïg±!“@¡HC;0ŽpÓ¬xÿvõ…v,ôþ~À_j)ª7byåÌ GCßù³…øÍ/n¼Æ|,ˆ Ã{b±‡óMM5ÒT«`UÔŠÛË-@îÆ)ÕdreUn(ð\ü]ATðù}þ 8¤ *?­d¶0¹aÀ‚,&Ÿ,+‘ô”Ä"0Tò2¿†ì ãa×wóœ‡ÎîL³Í¥¼ê±ÛѵzöüjÚ|m5M^ÉÎWØX¤Ž!Qm$az0%~x4äMMë¤ä²Ù¥$=)ònmH2ÏŠƒ…†FÆWyÅTß¶©Òñàô ·9¼»„(Ù¯Ì aW…‘œú.ì‘2à ÇÂf»2=£$$0L4#Ì+‰œ`2Ïp E¨Ú0¿ª¿qÓâ3¶ôîßGí»iº¿µ½Çà‚2Üo±Äs„)enjlŠ™Š-mpD{è „Oé$][Ê’¥¤YÁCÓd&!{­–JÛþËÿ¸þ˜ ¦ÍçÛB ž@ ”’ciüðÌÒ}WŒœÁD”QŽÒ|wÄ”)—ð'Ú†cغfŽ ­¨©¾Þ:¹@RáŒå0œ"SŸ5#Þ—’޲ˆ œv¢Ý¡H`¸ð ©‹ŒÓ³)Lâ¡jiÛ-K—=¶j׳j!ÄÐ Æ)0á¾µåíSH9¿Îâ}Ôªåh9ôÌpdtùqîÖxf·m¾¶,éZ–4å+œø@š\:0V6 ѳw S1„åÆ'sBE·U"3áÛj8¬åy)‡@ããr¼“›6DñLG&R0E>°NÙÜ£µÖÆÜ2²vù´;ú§•1QªW9É0Ñi) q9SÖ oÃÖö¹åŠøÕG=ì-ÁdùÉÙ1h«;FUÀç3Â=_âî»G*#ezýž“Ãæà+ûy•,5qø|i¼.aÒ×Vµ±Сù6ã/ymøòÝ·Ÿ¹ø¢ÈeA”T´4ˆr×FMåoŸê\õØI{¿‘6Û:±ðšA<ø—+f÷Û¥€~Ϩ΀Ðga—ZT»^¶"L· ›=ß0óùÒÆVkÅA”Ã9A>çRûÔ"k²¹+µ•odå®;‡Ë]»ÇÔќמ4ζä~ǘì š§ÐÅÏÕ9w߆;8ËûÂ…ïÃÝý™°Úœßî“ß%ÕY…F€¤B¹óŸv‡]?9ýî§÷>{J=iw÷œ1cu¼ó5ÚxgèýI Z”3žOYã²—øú&ÐÇþg9&æü/î=ì/«GÑæq*ýp_µëGƒay}3°C=é`g§>'ˆùå]‰\XËð–ÔḯN½T=¾tguR¡§Ó§ï¬¤…Â3ìdMŸûËÑ,`Bî<•`b ¿<Œö›ÛµÑ<¦ŠsX¶ÈÝÌquzb¼œù|õé®Ô$^eÔ `…3È<Ó3 ®m4E{*è¯u$sF÷l´vhÁ ÁŠÈ<ñnÑŸóí=_`Oq_òñJ`,±!Ñœà Ë`ð‘ m­Nt¡`Ñ+µ¸‹€2TBB€ZlŸeBć” DÈ 'aøãýYé£mÔ±©Œ&—‘Ž…ÿÌ÷,}‚ÆvHãñ?ÈÏ5Å‚eÔ‡¡6O÷pí«öﺣâ¼ÙõmYv^ ºJ‘o“3‹¦«Ô~>f‚¿Êæ7žöO­x ‚OàŽ­ÀiÙèSûªÓþE}½Êêþ«€KA ZÎŒ¾Ä©û鬯Î=Ûg¯7|¡,’3ñò„±‚UžÍ£ ô…'jË~º,ÙT“¨óXºgßàS}ó6!ÝÜÙëY«X¼V½-¥ñRÜwb) ÇNÜüs ­– ¯36DË„ H˜ãŽÿmãŠßüòügnÉ~pñ©èk$ØV&Tºfï}z붯/5ÄlÞd²ÂBÁÈBß]5ÃØËFšæÉA±G“ ©ºÓS´ÿ[¹y%@ØC^x©bÂr%Éo?¤90¹ œ3†·‡‘w‹C/çª „r|uTªd Ç;F}y¤\ýÊ6¿pý\ÿ¸(ø6ÓV©¦$šü–E2ÝÂD–ÊÖO¯ ~qwÚüiäd_Z ! (='â%.t|¸mê„·.FNsÉÛB ªÈÙ3FÇA³ÉÖ°oÎdy‘ b͘ê·mû¬/vù掦KQsM„šhö|í®ð„gB×*ûúÊ\&¡TÛ~)Äû^J‹1¡j_ÒxEy|è”’8Xc&Ü'€É瘃Ê<mmM=<,m·õºácú´h®ytW¯¹Ž»æ,°ã±ŠÃ+wÞCe4*ŽWe!Há-ZJ”tSÓ÷î1ˆZ"øà;~*·|nõmëRXX§€u  ©ý¤·”•û[í§i>¶gÂNa¨óÈ#_çxŸ”Â!´ /“,ÅÁ9 d²ë¦ BÍ”ŸØÃå©”eS£¹ !€µŸÊñ´w|ê<Û±p þjÛøð̲ßV­Á#«”¤ÞÛ:¦íÄsw­ÉFtzÿι¡PÔŽ%²fàu<Ìv(7¿!”lú}-› ÿô›€ûÞ³;»gaGeú³k†7}_4¸Ôs°Rà9вRâÜÂáó¿µôOY5ð•4a ,yhDZóLb$ðöfQtûi£ë“þ°§_³|h)™s2öצ5‚[î—´þ¥Nã®(Q2 ųo6gûñxÞ¥ç^Iw,Зï{(L©´<Ѹ‰ß¨*%(•~kå¦eÏ|/kÝx͇ÜýÞ> ÞA<²W+?hƒ;—Óx¡aW¶ä©ÔlöÌf» ¦§Z±v Ç2Mö´ä»·_´™)Å¡¾1¨Øþ‡9 s™‚æL¼ÅC$ñÆ%øùh÷´ëìÛ1#‹ƒíØ—ö\pÓ†u›/™û¢¶Rz{$±Õ$)gQ»‰z ‡³ªOÞCËÒ·ác¼¸ãéHnÂÌŠ1•Äv–…f*i±ÞhÀiLX×@vû´ر}õrœó‰uùý½j1î‘Řᣇ(lëãt÷JBÖ hùPßóKq¼6iÝ#”ã&u‰C˜5¡‰ätÍñÆ”iÙ£ÔöDèÓÝHÓYAèÀ•LÚVÚ§'uƒtÜ iÐo‚è«ùæÔzi„Gf¼Ñ6ív16ƒ*NûóG'Ú>óó±áòE8ûºG\ãOkýJ¼ J+À`­m3¶'×ÜöžeØø²Åçh[ùŸ†œWâliP‘âF£+un_)«}ó„Ïø»‡¾ô ÷éH&‰g‰eŸõ&†!8§@Æ.08Ù0¶²ó tε9eó{OF“ùiIšë`ü2(OЪiJú—qá“«l¾â¶¦ñ$Jày(‹c±©é‰Â {Qg&äX¾Hd/$è¨ø :_5Ê0Ž32•G3ÛþÌÎZž,Àoü3t”GG}toGÃÇA{ !@!§^k}x>A'„L±ZuûFš4›Úf  ƒ313GÌVž¸- ^‹hO….PëUUøVѲ(œL+åCx˜Á;*ËF_RßzÈ~{© HËj×0š~T¡Þ¢Œ¦L> 1\Ÿæ§¡¾…€g÷mAÝ2wÒ@êȨ3A&ÆÊ¡Æ=-¶lCÞ‘2ü~#¢L„0l+¬4¯vì¬þÙÀ ±KޏP°¬±©4‚ö˜ƒ±ÁW 2zþÔ‰*PDž‡ÚM¸KÄ,øC¡Þ“ˆ¿|ø²/éœ1ìÁ?sdyw©;êÌÆ2Ȉ8%Ÿ‘q–½Ò1ƒŽ{Ÿ °¥†9Í ìAÅs»Ãp2š-÷‡˜ª/:¯Ÿ('¥äÿ˜(’«iS¢ ‚ï@Îl™dŸñcʉîéx^Ó Œñ¨=í«ïñž7ty!ˆ¢Í Í’難úYÂÀE}/vϲÐ;˜‚&e-«Oˆ“ŽÎ&ù8D‚Ópe9égvÍáR)Ž×•&4ÈÛZ6’6PÊl0 Ï¢ãI1¦TÈæ¡ÓFpQ ²¹”Kì¿ÝܛƱíÕ=VÝùl(h%úY ¬çÍ^K»L‚̓¤–]GS·V öªJ/`Ø€a|¶Ø¨[6k†Ã¹ÃJ¹¬FC8¬-0²¢XˆÛ>5òü1<ÜØú“íL,Í<½Hw=ï£|ànlý³…b%S Ë1Y­| Z¨ZxX¶8ø&þìO>•¼äsïÁ§F¾ 1¯ü›G°åU}ðaý_Í(C¹æ=5|ã0" !Êò‹¤ '쫚Hû0E4fa4›ré‰ t$¨JÃDjT qPNýÄ£¸ûç¢ÈŒ«gò¤qÉÑ-ø«çùIÍi ?˜yiò±;>­ëçÏĘŸ†³÷n@¢Ó°õÏ–Á‹b˜¬ŽÊÐ8ÆÛ ™°A‘8SäД’ít¿|h \H¢˜¬“ÀUåÀë‘ÉÀ/’‰q€/œîÄN°:XMl  ÅéŸ>žS(«’ÉäHú£¿ÇÛ@ë¸_l JŸ*í3CQoÈNžFŒ"×{<¾M‹âZÞ¸I9¸mضǡ{±…­U¡pTȹ‹Ý}í)°É°°iRÊ*µÆ¨8äª8Yb©±16á^pŠÈ$©UÀ Býúgü¬v”•dï*|›÷ƒ¬Þ¾¿oÖœZz ²¢iV©Dš$u0/¡yñ¹>Jþ€ˆÂKžç=œˆK.7™ÿ]4C {G’«žõ6ÑaÀN.ôH#…d)YN¾ œ[BjJŽ'|v/nüÄÙøîç/E{ÿVìl[`{‡÷/|âµÁÊ’¸Ô«PÓª*€þ¹ýøÁÍ—k¤¦ÓPó,ba§eeÊp F”…`NËœæÛof5 ¼Éûxò!°²Dqþ´S B† ± àCPq*ˆumxÕUàé«Oƒ†Óð–ý·èWçžÄ‹+;º§É3kǨ¼"H© @Mcáµ( V×÷# u ±öªé7¡¶ŠØTX'"™²ƒT‘ð$òEËñN!=ÿo4YÐË·S×”òãÁTË“¡1ž“äà&25ê=M@6ŠÔ€4â;­ø|ó$ðÆÃå+nëàtä9_ e™ñÈØ 3Š ˜:‡ò!Çäx—D°> €;DQéÛ• (Ä™ƒÐÇ?)Æñ:²c7µêÎqOÓ§…r<êáNLžÒã\½è¸ d„á®|¿Ä¥yþYFý¼L…¹¥°¨2ÊÈ\H#3¢.vÔÒñpo­ÁÆA)LeŒ<\J¼I`•ÔÂÌïvVsþyË™6Ur6œÀPÒÖ¤ŸŠ"legw/[:¡F‘SA'ÕùÆ×¨¢œÅ°rèEN¬‡±9v6{$>W¯2~Bÿ¾ka\côw.‹Ê{·­\¼oÓ«ç9¯œŒÏ$A—²- ù¢pÁdlR“Ëgj®é§ ’ü„é ‚Q(XT<´Z”ý  l žîc DTuõ|’N0 îºútp2ŽÅv`üU½—†Ï^jұˌº56õ½œj¤. ^Õ ÄÄð.;‡l4"’ÒDÍÂxc0Z‹ã•B¤¦…ŠšÈò·È-ßû"˜AÈÞ=_Ô[HÀ…Z.ưð“‡ún &÷ŸkF¬z0<¨8 F AÒm Ä/ktìÖ‚ãyÊýŤ„Ëä‚–Ÿ{èÁõ¬ùñ?L0¢8œŽãQ/i®4<Ög&N-‹Ž|š³‡äEv¼ìpb²Ò8¦O{#@œÃ:Á§WæØf1v•fbiò`GÙ7W†ª]Æ 1O¬zíüÛ猼²3cG¬„À)‚NB[Ú`NuµÊM…óJ”œýìß?¸bâûŒŠ’Z `A`¸‰ó44‰ÙÅ$ªá BÈ”¿†²b„=y´˜EiyÃqþÿaŠ€e"/ žÄ$£™Ä(»IÉ %­ž¾ùg—¥ù{eÊίx7£Q{•8.˜ùà ‹É•£žˆÂ4öS£°¾j÷äØä)¼ßÂaûÍJ9™D©È¡NÁiUyàÏf­­m3© Û§Íž}`ç[v—±Ñ Z†&Põ0jPýyvðFAZ©IRìDJ dh˜£åø°õTsœ¿ZsY&úÐzåÇ5M}^^¨eR«È\~Ÿ'Æ…álbAÍiÝ9QÈs¾ËÊÓO-4MñÙC½°À’Ë’zˆõ!Rxòð”FÀ¶5—)>ÌÃM-çy„‡¿»d)ê$*Vš&¯òaÇ5µM¢6gG&Ph‹zz|‰úß¿ú®z_€û) ’Ózž¾ûÇsQÖÄïÿ×/Éà_„í¡¸U¡ÀšÖ®+Ÿ|5bœ]ö)8ópÄíIaLx 6 ÏY‘FãéÉ¢wÐ)ö~‡ Âü–Aˆ ry93 ³%.& åás.”N\8ÍÓÌ b‘˜¦Æêv…b©ÌÐBDR£,ß3 ˔ÓX19wHVSX8+P£x¨wzôê]ë/êJ›ïª8÷RÈ 2e <ùé”D” ”rRˆÍ/Íj¡9ƒâáô¤ÈXa¥>HÁ­ôšʹ88”‘ÓVóÐHÂgáƒ!„œ`ÄÀ¿¯EéM¼jßF£I²°-§²ý=×§At¡…!L Í— £*!–@¤Þ@••Î8ÄaISÄë8—ftœÓ“}Q45EQ”´™ýâ!¢¨‡J ‘ YÓ)Û§çèQh¾£ÒÓJ… ò‡Í^³7`b‚V¬†r޲‘–ã w•…C=sm’€uäÅÈ(è)–-ŽA›ÂŽË7‡îKîüLNCÙ‘#^*‘_tØÀ¯ÄØ@9UöÅÓ¤.ÃÚo}‰n¹õÓŒâ$nÝ/v)ÁŠ‚‡ã\zш欣"J·PÅæQ}• þ¢}hvÅ‡Û ˆ4&ˆkB½Gq Ö±_pKåa"ç;E¬x²òœ!Šy@ ä×|ȱe8mBùÙÑâÀ&AuÓF\4:´ª·Ô|òÒH|ä@È‚™†M‚Ù\?Fa¹_Ô{OŽ)wZbÖnœ¢Š5¤šóTY¡â´ “c‹ƒ_àK\D<|®ÄÁC2ÕLX”Í<\æá‡ðм†n[×;ÝÑkm&¿›ô))ÄðTRD;|XzBŒ<ë_'4Á(£ÌÖ‚ÍiFùd‚´åkœ @ü1E¼ÒÒ›(^¢$WÜ0!Fbé1Ìóÿ}ÝE4Ë’=.A$1’ ƒƒÆÞ¥(Œ (Y°Ë&óVÂ` ‹¢cÑ×<‚× ¢Îsûr8:/õ`w6™«n%RôˆS\ðD‡M§åœŽºÛÍ뇊œž¿i}îhï|¿'ʳÇb·\y8íÇçüt¤°óYÝ ´ ÖE„(̶ ÄyŸ<,ç”BVÍó’Åb7!ÞAbŒÊ¬™Y|B(º½I!FE‡¨gSÒ¬~&Ë`X F ª¾UÕÖg§ZÁpË™*’W«E'^@šP/‘". !üäûžkLc9wXžsL¡íëbdè˜>'j¯]Z¥ì¢ˆ$1Œ$, …wŒÃ|s?ÙŸ\ü‡Wè‚wL~ÙàÚ·€/ßüÅdu«…ã=èÖyÐA+›?u3 æ˜$³·.À *°ì_n>…ÊK¬§ß‚†=Ðfñ UE}驦_Ûï¢ooˆg<óÆŸÝž`'ÐÓ^|ÿœA<~ñ¬Ú\ÉÞ]V,0Š6 p@UU{l/ù™|å®/Ô• ÞI¨H¡@“r€Œ %Ú”¥BêÛ³ÂI )šŒÍŽëMpÆú"’ðJˆ™²Ú=ϹæwáXöG©½ñ“¹ÃÏ…ù’"cp,îl*‚ãø“åGû†#;^Uuº± ÕØÃWNÇ©ŸØwÜòë`ÄôÀÚ#ö½(®£)4€ÔváÒ¬J-i@Ô`8JqÔR‡ˆAŽx΂‘ Ù*a>PõíP V•45Ó®üôk·ýìcß¿÷µ£IlÇØQ-b¨Pq²BNyxñì¾]9)×A4"hs‹]Jéè¬ÂÈ,&Í·Ì@£<:V¯?ÐÖ}oß½òÀ?\‡G®\QP`=º“®zï§$ù¯íNÁ†ZŽ}êEÕ ²@àœV'°¯‡Û&jQ”V¸ %´"ÃÀ?mèæ¹®ÞV»œ”NÈ󪤙)íirퟟm˜îŒÜÐ a?žzÍr¸Ð¡6¡š¡#!À» am–Á1yD@’Ÿž¸cS/ÉÄ##B¦¹È©Qr‹”»ÈèèPË®l ¢–{Òæ´¯ %9/¦””<È‹«:÷p³;9M‹mÝãГ§î´ÞA¬Š|écÀ{ŸË|f콘D ñ¹ìåñÍ¿B%ï°ŽµÀ[vÇóœý¢ÅÉ#ÜÈÖy€‡| CH•“lvbB{÷ÜEÙê½#xì=«qÒç IðëbO]>£2ú‘b÷ûzÚ•dÚF¬<¶@Ÿ½Gôw TþÒÍaå“Y[•-…øÌÚ6ºúžÜ탽؆GäL–8“ô¼F™"d«)BIºk’¾º,Ér«„"°’õU´yÊŸýäìÊÉ_›apùÀþ46¤. ”…@Y Ñó1c‡r5‡)@<÷ß4™•ðtø'a¡µ¨ðšÃ§”¡wèuŒn!Kœ-#ÕYS#Qƒ”ÌÏ;ýôŽí’ö¹8óê'jÿÙ÷.©"þ³vb3‘gäP™^/E€fì¡¥üžPñ`ò®k¡3¨S¢¶)hpš©«õÔÁbÖ‚‚ 8#°Gj‚d”鎱°rë › Å ÂÉû|œçºË§AŒ bÃ$’_dqÞªõÇ`5³y’Á‰úHŠUC¤žYRÛîFMÅg¸û#KpÎGž9l[]nŽ"Û›Îíͯ$~[+y öG^¦[‘pÒ˜rJ_±«) x45·ÚbÞä“¡%™Ä1²Ã¡¼G½ÙÐ0 (ÔÈdq‚ð8Á®¤ª¬rXmFKszʳ1 üÙbýµõVa“¤£CÏ¡ÉE[¦Ú€bwY|ÎØ‹ÃDIE ¾Ö9c,¨-8oÏàÆvñÛLþåò%¨ñÆOoį³ýìçÃC²]¨ÄÏàÞÌè%IO"uKŽòQÅ1éî¿b¨>¼(e¾ÇˆYDjrð m†<Öì ãÞÝäL­™×¡§ ñA_H°µÀ¸¦ ¼ŸhÚG"#žI}A7}h3´¤b8—Àed[Î%wµS™kà<ÐêRËM8­ÖáPÚ‚?L¹ÄÜ©ñ\¥#!Qr ,,¤šAY œ;x¹Œ\¨Ó”Q`Ñå–zÆv=qÖ<ÏéÈe¥QÚ;q¡Ïq¢D<Á¼k­DµZ€±ü˜m"UüøªUxùµ“”Þ]s*Øåˆ"¦\SgÒ•ò‘M,]`ž¦”¢°ÇgÇ÷ÛÊ®Š¯cõß®;èº~ò®ÙC` òèPÕ òñZP~îy+µ*<D)‰O†ö³ÀM²B¥d4›=-™QvÉž¡Ú¬Ã¶óàûW ò)‚ DoV¯t¦¾P›ÂCX(ÈT¯F©ž*×ÜBä…4% ó-¯­$OÔj5öÅÂxãÇ×â•WßøñOoŽ£™yp%Ú^S HݤïPù‹ç«rÎ8Üüµxé§œøÛ¯\ “È1ß*“@g ?íÊåRšN<¼ËòCe½LÞ#ï<œ÷äý¹G5€<†ÃðAH°]d–Móô®î„¦7›‹mz¼Z‰¿z£f6‹T´/tÍ×T5{S(þˆ©†Ž Ñ1¡µ§ù&néY"³¬b^ºadÆŠïîÞ)][%;ǽ+"é‰W6õõ'þy¶®ý„l̶ot¶ b¼M¢tfj“ÕiÐ}!ð%´;ƒ²Ú)šoŽ€rÔ7N¾!RPךlO %9†¬¢$Ê@.ß #ÕŒ¨×OêUN‚'Ä*‹Ë¡o Q‚»?rbêé4äÊåGµŸpš†á½1÷XkÂÈzúš´ ç3vâ;t¡HGNW@›Lhš¡t§QJi芌ÊŶg?Ù ¤†ØI—f¾Š–ˆO‘wÅ’ÙQ]cÍ&†›M‰“æû€IÑl#–Ä­œ)͵Û–Ø(;²xßBi`^ܨUÅ-%=…Ä!rŠÐ©Zè([l Ó%AfS8“å‚òE޵†G 5°È‘ሌ™ ¶\=Ó4b ³Ä¡íÑ^;Yçl‹üC W|$†ö²jXÖôPGÙ¥ &‘N¨tj&‘Dæü|AcƘü')Ã`cˆ¬©F„²=BĨÔ|XüØŒƒ€¦FZ¢jSº¥È‹Ý"íUÍÞbE»]ÞÀ G-°{§FɦÌÃpTƒS>þ«?óÁ¿šU…aF5ŠÐ{àçx¨û‚ÎÀŒ.ìn ¿¾‚Æ+äÓÁ±Ì”Û'0 Ìàþ¨k°;=êwþpÆj~ãð¦™%øøNP¾µÊˆ}âîi2F|†k%\rÝáOÝýêG„ß[õÛÙ½üíÃFh H‚\IúŒÆ+øN;9ì¤Z´ÂfÄ©ÊÓ©NEER^µU*Îïm®ç¬ðxu ¨L‰x§îE@ά٬^]Ì*mx.<µì¯wîÿ‹Á2†îúÇ<ŸÓ&ò¡òØ 6Tí Õs„1B Í­_0\žv÷wç¼fä„¡'õ‰÷¯Æ(†1àKÕ%ô»îÙ›ÄK$_—1(“f¬š0ï ªõYY§gŸœà[ëyFŪ›ÖÐÚâGíܽ]Rï}ïœõÙÇ'Æìw¯¥WŽ>U™á› A˜ÀºDÁ«ðððМ$.Ÿûkº€öX—­èhÆÓ­øÍ[þê,ú\~Êõ—w7&F‰ì –‘¢ë¹kD«=›ØÊc »/ÌâY¡$|c§…%‚KÒcuì7Ú|ãìedv,4üˆ7ÇŠ>õ®ŸÑØœÜóá…Pa4¹_~wéG9ê$úEì»= û²«jˆcˆÆú±òóûqßûf.(¯ÜWê9{ec㊚øes‘.Vm·0ÑOQÔ¡éix,‘í¯}ý·†¾ù¯:â÷wd¾|æeúί?2Ó"]L”å|m¨zB]ÃÒcÞVë©:„räºAqÇ=_À¸òŽPý.£,ð†I¨½+ŽOÜYê ÃÈ4Ã,ˆˆ´ B¡|TböH Yljên.ÃÅî\ Œ¥#Íä–j&@d˜ˆ+0ÎQÙ7×̃üή¶¾MƒåÁѺð•ÏBO¥¼wßYüfuãEžì%Ž’ •ÍhGÆæÀžêÌlùøø~C¨3ZyM"ãÍÌç_>Ø>ÿ6N"I¶É?_±óC`¤ÜŒíÁ—–ÿW~ûºÿ±Æx}ƒ*:}×#ÊѤ’çÚu¾ÈǶòÓ¡*bÊõ‘™'ohçú–…ÙàS?/ÏÄ×?sj#û1ÝaN£Im¦1·ƒ¯«¦¾Ûæ×‡ÄX?¶ ‡íà ÒΑg‡C¸ýíÔª€•PöYÉè‹K2üó¿Ÿ~ò–—§âï½~Æuè@]ŽÁÑдj6ú»¡±+1`@ˆL€1 Gw¼D„3$é¥#*ÛK¨¯k“Æ,è2ÊjeõÌôi–`žiŸq×Ì‘ÇÝpXÆ\Œ@JIÏR¹¶ÚŒ_óõ?@Öx‰cφr²I=¥ñ‘°zo”v,s=Ni‘W@]Q¥(• <[ˆLG}ùh¸É °biái e~z—6/šÍ‡.ÛvÛfšÍãÏ„íhKRœSß9¥¹3zÜø++Yó·ŸvE!ÇÖlo»ù'ååãcÖt‡ÙìT3‚be‚'X#Í•ŠËVùxË é®­w]€G®¹•–bf|z1d£°¹ÒdÍ×9ƒR@¢ßn Èh HÆbÏ¡`¢9°=·®Ô‘6N ¼9w_Ô·‰m6pÕ+á»"Ä#;±(ëǡ٫²ø<£t:+uNTBi2Ïlmç~R¹£Cü"«YÓÔÜÅÔ꤃E£­"Ôe´@VAtÈímËlÜWj{Ê“Y?n+÷¿üšG÷o}OIJÓqÇUË`ÔãÜëž9Ú\:.»õªÅ2hß…—'ûñÓ鯫õÅÍ#àä=ž´"ë_lœe2#wª·p0ŒW Ä<bö–ïFØöxãŸVʧùÄ#^G9Žqç5—«..Í'ãW!lÉ¿‘z¢Qa³n¤ÔÕ¬fu\ðѧØÖ›¯¹O\±û*=£œíZçvÌÁz-W2·„YÔ§õõ¦ ‰Å c.´'°«LÂf¸u´tîÞsì+C9§>ªNÉ£Eµ›œ,Šn³¾az¼ÏÕö¯\_Y¶î›îòíOîÆÝs,xeióKC—¼ê×´¾Âƒ4³a#-u¬ÏÈŒ¬5O¥lû3¦1¾L§“óÏ ùjèëg£Ï¼;« üÏÇkÓþíýÓ˜;üî^ººó þÓ¹Ö%¿gáÏGKß¼¸¾VŸ³µÒbɘœ»L@¤’4Û­q/ lH[ƒ¶ÝR©Þûöu÷7ñ”ÃO_½ºgA½U¥1üŽ(É.°ŠÌ=OǶ¼u Ò·¾–Œ" :÷p&¿m¥PÞqK½â¿u`n9ñü›æm¼¨„²x|³í¥æ5Wu»á·E’¼. î1hF>ZZDïGw¼|r¾óW‹@*Ðgâ¿Ó&XIW‹K*ZôZõ/kwz«É#·î‰ª÷Å­o0geËm/Y“ízIîâÉ kQ"¤¤Jb)µïHQþþ&mÛÓõŒ¤0&_QI¥`&zˆ÷ðš«Ç½óÊ›“§ß¿`=”Ö)è”B&$•Õ­Œ²¡÷Õ²ÆÚý]]wgV6s¦2PîZ:'¾ÀdÉE¡d+XZ€^¯u 1Ê¥{ÆlùÙ7Ö‘mÁl SilNPÚDN7Âe§Ée $ííÿÊÀ¥Ø.þÖî•o~ø´{¯Oÿ°þ8¾Ó³¨²2Ù{vÅï´š«@¤L“ÚèšÈc¬{.*ñî\cCIÓ!2ZX%Iæ±ðk…†Æwuμñõûؾ·Ù‰OÍëVÏçÆkËž_ÇB ó§LÐ)v€Ê©!ùf»I.BÚèÊ©j˜’ΞL<ŒNä›{ Ú㘗T}sm_’ ñ^#xfÇû;ŸçèñÄ„Owôn±ƒÃþ'ï_ËþúÅ9þ¶+A”ÑŒ °f[P]¶f×íK»ÂP2§Ä˜m¼T¦¡yt"³³oÔð–Š”,¦11Ámi{ïúÍI½îðQê÷?všC{pçKN+µgÝBC2Oí;Çgì¤,ÙvÑU¦?úЊ£w @½`°£Cê£Xx¿+Ì)€2Уà3X°ÉS*&?Œ” žóô`}~ńңèšL#1òܪ‚Qš‚}Ì XÞV‘Š•˜Üü²ê;–¥ÉI_÷ƒ6Ø 4–TjK³á5¡ÇI¡dóf¢ŒHbŽv§a퇩-nLÊH*æÙ™™¿«Âéi¹…D ÇBqW„ôµmª3_9Ø|t„ƒÍpØ?8cvçÊ¡]kŒkžÁ­2šZg4P^P'Ê18H¸ ¶ÅÞ*fm«× 1F³™6Ó×U³lᥙdG÷Œ]éY Z>²í„öÀ,ç×AС>-dÞR ±ÈýÛÛ§=±`DPï›6në{wÍFÚv~:lˆçšžrHÅö Æ3o qqÊ1€û®XŒ½ˆvÏf¾Õ¯±êϦ‰[¥UF²ÖCÖbÿÒÙ 7P¯Up æA´Û™®é]Z/Ù C·ì2íýcdQÖÛÂîxecði/þ^#8…àÙæ*6Æ‚O`¤o5ñ¾•§ÞzÕ&Œú‡£Îè¡]s$;£èöY»ržŽ£b–õ`lê`µÜÛLÓÆ3=Éàå,þ ZÎcomžRmŸ?ŸÕ_™þL¬¢Ù?…žÖTÄŸæÒsZ¤PöðåÞî,õ C™-ñ72D3Iý &? ¡8’Á@QõY©$Ù\O4WÈœ®È«¢Ï”ê»6ïI’/mæÞ1FÆïºb)νþ…£ nþ`ŽóZGŠ®³Gw½£#m\Ò77×ç‰#A‰ŸåâÍA0嘒âšÅäÔN–œ{ U$^àKŒÝ>âôç§Fo9ð³Áÿ†?ýÌㇽ%²ßü2mûñÛæH5Xb¼+yžUj8Ö—áG·\Þ‹ð•†Æ\‚-IYúlŸVÖ=&d)`˜I¡V’SüÕ8ä4¨çQRA"j¥ 2ルXlsŠcÆ‹«.†C`T`Ta¦òE#˜\àb©ä}¼\ˆÏ¶)³Õ’ê1"¹d#@¦®T•ðûâì®»¤/Y0^õ©u-WÍûâ+Ôù·XhÕ@!fÒSq—#ÎÎ-iÐËj¤Ùöi›™Â]ŸÐ„È/3Qe¯j‘P”Yü¹¥  W± P¥íLöâìLÉ|¬ªYo(Æx`9'&(àÕhÊænnyó†;Gnœ½{«s]-ÜT3ö+%¡yD˜ €¼(,qµzZ)‹—+û–ü°*w4ݨk$¯ëçÅ(Éiì¹øãs¼¯üìVÜøž•ørÛJlͰ³•n¨iÒY2îÕFµO‹t€pXò³kB³}÷°*(‹À(A¬‡Eì©2|¹²{Pé{Þ}sŸ¦Ãû¥ ã6@ÓJ>§n·`RF,¬FPX0ûÆàU··¹ó=]÷ª£…%Éúu‹' ,l5Vó4-̬+NÀæ¼ÂÔ‚ïeŒtÄš­0ø² í£/¯¯OþnúY8yÏÞvڻܖ[?°#àö ôLV]›Ÿ,, ø°D4ÓŸ^–øLöIÝÄ64î M+‘XÀçÏÇD  V)4x=ú¼ÃÓKΉí\·•‡å;ê‡N±>;ÁÀÀä+¡o®fçN ÙÔ-€ d ¼o7’ çÓó¨BÈC Ûæ›PsW­óKY#›Ý–ÉïV³f§õ2™(;‚‘V©¨¬+@ t;Â=#•¸Ûº½ÃŸîzÅ=8~—þäãçಫï>.‡ ?½r2dŠ…†*+ìèÛÚÐüãNM¦·‰‚Ô!cʨEÛ+4ñ'ö£-¦c%Ь1UŒšÚðÁýË3™{⎽ÿ ùAK‡·’Ë0÷‘RË"2´H}ž§c†ªRÝkðpJ6eU\ríÓÇÐË\(û7ïÒýZÝ3ÓÒN“e ÁG‚AÖÖ!cË„©fFËq – †ò£È ¬±`Hš‚UÌ$’¬5 àá‘"…@ ®Té»É]y"g…R2T;/Ô:~¸0¯¹>tÁ  ;º/5ÿ–ŠfÔP€»>~*[tîÓ/ü+_g ’¾L}V <&Á¹vo;@’|^‰Ïg›1ÃPÉôµžfk,…Ö ¯BµÈ¨NMDä ¨C•Œ÷µÐ(³×HEû 2àÖÔ1b4™âqSy¸T¿¼³:ýÑÝÕ‘ V>)1²¡°ôãH£Å%7`¶ˆ€™Qb ©ø¥ì(d9U–*Ú0JªUV©¡8 @ˆ``Ùñ@™Z‹+š÷š®‡N«(zR7N_Ÿ,f/ X/[PAiÍ2À82UÔfi`·ø°vÃg¾¶_xS¼pª 3ÕÊ‚@@[µw…+è  f÷]¾ëË‹vŸ0¾ûÛÙx¨NÿÐ87Ϧ|ÁÏ2„ÎNA† â X£BIÙ'Ç£ð›Âò 7.<{hÇ®õXP‚Å£÷|[º•Æž½ŸÓá ]R2J'’’…zK`ŽX{¾Ž!âò㯜Rݯ¹P{-Y(å…õ ^꘵ó)ò¥ö;2ußìðß­J:ß+ ãÓ@I;#,l>Gsõ»H°VA…ºD¡«ã‹:½ôº‡ðäU'bÜ鎣®¿=ɹÀ‚ÞÀÈz´Pb*¤àíz u‹¹’Mä+¬`m\X}݇G¸»³>¸mîu#ÀÕÇF{ÙvBÿæ_!7¾“çqxi‡Ç[ÊȦ—IaŠçËú,‚д®­…3ÌÛɆùÏÎ+²À"ŒÕMôø€àoáÍ]Fxœuý‘óÒÖ1ÞÚØËqêáù%€-ļÐXªö‘1)¥Ç®üÒk·á¯ÀžJïðÊ6Ç{)tó3a(!¬"ž7nJ‹,ÜH]KPÃD–Ad b!&4T.1Tƶ¸CDΖ™¼g.B×”-Ã’äE uŸÏ¡„ªBä”à‹E‹Ìæ>“ÉÏ¥Ë2Â"…·d²\ÆyBÀh ²1¥gëAùg#¶ý_×qÝ“+þh!TÎýäf<ôñU8kí~K°ø®5v/Q2kÖ¸È0Mgò&… … ¸8+Ž!jFàu½ ƒu"Ú¥ª¯"†|¢Àqøy3jhì)Q‰‹ ºütXfnªÇš¹MŽÍjoy9‘T…)12Š`Œ‹Bˆ@úëlîÙ]êø ]snšÕ¯¸ ç|ì^Üð‘“1vêB7º+b÷}c£‰°ù ¿PØW„ZøbÅ3¨ƒ(\F¥=†änñÒ$Ñó˜t ‰BIÙ;=‘‹?—§ïîúà ÌAœl)M{ØÅã#ÓL¸3$þ h¶ÂxßÉÊ\(ºç8 "P§…5iŠô7-=•†öÆRúz9Ù··;ê© Á‚‡›?£(¼C$‘( š–4±”f”K]øß÷âÉ÷ÏGàF³yû÷nØÛÝõ¯>óqèèµÞ˜åÄÔ˜b!e -q~´ºD|F¤°ÁSY¹|ÃPÛ¬oütÑ+/Øúc ¥‰ ¯ÉœZÿ¾Õ˜ÞÜáê(íX9è¿Ýå%.™èÞÑJ ÈZX䮩Bß‹$^o oôl.PÒÅ °!E†Ä&¶š §1"}W×âÝÙþO§5÷¦¥Ô¼’”NT ÆCƒ,þQE¦ “¶{ äa¯ŽÄÐé0˜Žd¦D– PàW^»·\¹3Å?Ýv~¡Ôú%K^£Y¼(DZ 4as4y Ž4E”Õ£&¿Ùù`Ë#å%ÿ~Ç+Çë8¯øÔ}Ç<¹¾øÑ×a‘ìÂÀMïæyÁŒEÝÙ¾÷„Yº8Lµ8Ø@°0ÅþÒÈ KSyí¢ /ŠŒMÒôfÏ(wwÌøgªtý¼»9ždÄ8ë3G/:²Xƒ¡` Uu¦´ÅvO~b¯q±ê†ª<ÛO5_Öã;!c Ü‡Ëÿä«é?zƃ}d~X ôÔTÉ{vâ9îwÌí âÔÖÆ² }¤ÁÚpÎyÇU—D={Çl´TA•nä#àü°³{Ÿ>`Åu¢ k5 +RG÷ yáº/¯¦CAð˜A3`¤s)©ò°ÊßâŽ97H:úPœŒÿŽÂÏWNÛ>ŒÀØ(vd‡F=¶ ÁÜ<\íún§fÛNù‹<·}ÚGrqÚÕëðø•KQÉÒæ-¾óÖ%‚Ý]aíIoüK5ç*i-#*Y¨ ­ifìäÁØÉðü Kv–UR ¤A[cÄ–Të´Š´Ô›TÉ=kÕÝ“ ‰*™p,QsGRÆ7¼$§…AðJfYíÕõÅž‚X¬±lS —l÷±-Ý–´õÜ`¦/~bñÐÎdŒ'"?W«"9/Iz‚‡«>5Ë o2A| 8[é‰z…l  …²¤©ññ˜o¯Kå§µ}ÇŒ-ë `"dûá/¤šÂn†é"9® àÜO>…û¯^õÍø‰ù§>]Þ»yÇ<+÷WÒæoãã§´…vŽó®&¬Â’Ž-§& Q5Ù3MÉîòæ¶;/¹ï’Æãâ+Ó8çc›ðÓ÷ÍÁ[;·ë(·Õ5³Ï8Ÿþ<óÎ*ŒŒ‡ÕAíìxŠL˜µ‚³•½ë®\„;ŸŠÏÍ^¹ýºÝ›þ¾:>|/7F+ ì”¶J8C²¤¤¢¡e!J nÔ¹x{ݧ÷p[×Iíçç÷ Þôc¸ðªÉsþNüÌxú½ó0«áeá®Á].^ü•6—í 9{M`ét‚ôf’Fd`ȯ„ØÞ錿9ƒýI%S£ìUH`!4®fÿ ÷¦•ßlZœö‘‡ñÓ+VມÍÕ­Ïv,ü¬ÞóPIõ5Dzzf²iÎ$QfBÕbÆÆl ÃÊO­á{šÍ±yÆÊ]̪âRÝT÷Ûöé»[œ¾ {ôŠÅ.ÏÀ(‡¥ÅéÀyíYý-méÈÉe?>3”¬9ðý¹È´B±EiY H hH©‚ýÜvßjŸX;°ù{?ž}üŽ÷Žp%ý—æM]ó]ÿ‡fŒïüƒ@²NK+ r HˆE¾ª'“Ò†­ŸZxR¤Þk=ÉÊå ûM÷÷F+Ó¿›™Ò^%HG2ŠS?öø1]×O¯:\&¨­âÓjÐ×T Ü^£}IÃt¿'ÒžfŠ‹¯?¶TüøÀKo¬mo UÃÌ•F•2N%¶ÁhJ&é§®`¦ µ•\3`&TŰí¦aÛ™the² 0Rí„õ”“,(»LÉ1h,°éÖ 7ªé £1`WØŽ”MO·mQr@É¥ RVb'4f°€Ÿnµ¹Ì›t% ¦G …•°cGVêxlGìŸR[Ýß‘m©âÂk]P½ë½KÐäCåv”\„ägVh5[!Ä}Pc4¡Ñ ª=ã+íO=›Ä[ëAuܸý\µ\ê2hÓF!GH‚ Úr}ÀV阷qÃôFZ© ©fãCjˆµwc¯W¤¢ƒcA%³.©M³¼isMš6§Qd«q¿õ²GLå "³y œÎíèD6±ê}w<¯ëþrùÄïÌîÃüÑñöª=I+26Ó„¸]‰2Ýkœ{ªIåõvŸ£ª³Ê5‰ËR× <{ªÆõ—ºÇ”(€ß¼òžãõ¿¸ý£« 6„Ž¡ß.A°"ÙÌ6—“I—+»i¤l„h8%ê×RycXëØØ¿ìÀ­Kÿ̽úéOÀ¨ÃÅ×n=¨Ý¯ÿõZd̶§™U+.+’ifA¤í®ŽbQ¢̓ûLP¢¢tD^I'îÉ$;Ÿ ­ø1hÀš¬ÓDÉN$UNy÷OÛ‡U3y_o½º!3ànî-þ÷‰‚Ä«UÀŒ4:•«R³3óðPvá5“Tå\= ŽL ¸gØIÀÍ_SK€ÄÁè%[ÿ—||Ó!Û-æ•S`T§\÷äߟOt^[,ºÿòá.4ˆµ ª+a€Íxh1¯{2ò0NÀÅŸxô¨}=í3yü£œäQd¬*Å=má"Í1zâ‰$ã¡ 4yîÜh]ÈT§ k>ñ¾õ‘óáˆ2%%à~çp(Q‚x6ZËšPЈF&ïm‹›”'åÿ?B»¤œå+.%tEXtdate:create2023-01-30T14:14:19+00:00}}¡y%tEXtdate:modify2020-01-09T03:47:52+00:00GèK°(tEXtdate:timestamp2023-01-31T10:19:38+00:00$HDdIEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/Huawei.png000644 001751 000000 00000026036 14745137273 024660 0ustar00martymacwheel000000 000000 ‰PNG  IHDRÈÈ":9É+åIDATxœìxEÇgË]îÒ+!$HïEá{± " ‚t)ŠÒDEDJ(@éH $¤^Úµ-ß³;[f÷J.Âæ.¸ÿgŸ<³{[fï~yßwÞ™%Y–ºtÝjáþ®€®ÛS:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:Xº4‘–.M¤ƒ¥Ké`éÒD:XˆN*ãSPXÙ㘲R:70´6Õª–"ý]¿Šaœ©ç'S'NRç/P—.–5v¾'zÑg•:Mùë©‹ç€ÑHÔ¬E$&‘‰wµëQ1šÕ»ûoÎóîL»P¾j­uK2S‘$0˜àÿ’€$"ÎêØÁÇSQ—.–®^ œ[pÃq€€aXd´¡I cËvDt¬ÆwˆúÏEedZ&L·mݸ@’€<‰«¤±}»¨… |ˆÎ»A]¾Hã¸äЄ˜Ê IÐçJÖ.¶Ÿ:¢ýýþ3`9ƒ†½9–-+çä ÈTa8†áü'Üvë¶í¾œÕ~ü0 ÎV‘Wà#ÂŒ$Ï HŒmÏöò›ý_ ðÿ`QTÞ“ƒË×|+bÄÅ‚}‚l à Ãí{÷V Ë:Ϩ"%Jp$!F‹ßÂ1G¥*Û¶0LÕÜ´õŸ«pø»¶Ÿ·"x†„‚Û°EEŽ”ï§u^¹Ä–—pt H„ š+oÃ8{†§.¥•ÿ¾UÓ› Ýþ`•}ý}ÙÒÕò:b™ ×Ã0i£´p[íz?³óüÎ{âüÂGîÏ–ÔÀŒœõ"0’àÚŒî<}Ôqö¤æ·íoÝæ`Ñ9¹E#ÆÉëEiÁ)í–ãØ1ï'§ÒÓ¸ï‹Í0LÀ 63atÅûAn#„ßÓöÛV¦¬T«{ Ýæ`OžÅYÄ5Lp PoÅdgÓ9ÙžÎL0yJgÊq#ûD`q¡=&ç  Ÿµ[íýªÍŠng°èkYe+×*·¡I;5IŠ-|Ñ™rÆÓÉ©Ë"¨˜Ê‡rNǹ0 š(¾±)²‹A§Ž2%–[r›©Û¬²Õëө܆ÂäšfÒ]:Ïõtrêò%ù(‹° À°€EäJ4í8yô_ÞXuÐí –õ§_þÍa%Îóç=íE_ÍTBÃ/ Ë2 `@Ѭ“b)Р˰"a ¿9ÎÜÎ!üm SXäüû”roH8hDû!,"â^ÒþÌõkLY™›³ÛlLî ä$ÜáR4OŜآ9Ôd¼Șœ,¦¤Xã¯ÁoºmÁrœLî»AYe™•½+R%‘ǰÔåL×S8³¯ñ¸°¼5bXšüÂ(Pët²ŠåØ¢ù-4Ë3hV†ŒaèìëZÝ¿¿UÍÀr¦]ôqOúÒe÷( ożHH,³,Kgº‹¾~•|Ço™(š3QN~¡8‹Åý…TQ<趘¢o‡Êôp;ªêVñg˲[w¶ÿuÈ—™KóA•”_ `.‰¨?(Å[RRŒo4áQÑîï¦-S§³…E¢Yed#ÊW²lÑ—öƒ=Ö9€ÁbÙ¼×F±57¨Ct:V4q†ûÃIÒØ¡ëI9¶8‹Å ±”Ât±¼ûƒN&?™¼<ôLA>Ò„;j«ä˜âr¤Å“ģȤ;<ÝzéªÕÔ©'¡&/X=ÐtшñÜyU VÉúlûÃ2ë¦ÃXÜmÎBÛÎßÜ~Ôµ³»Í,`‰ôðö‰a‚ùq)5@çå£Ç3ù€Bƒ1Btå¹#œÑhölÐÈmµ/_»žEód´\+øÀ2,uúl銯+õ•V¥,§³pÒ,×ÍnøbÙüAoÒ¹y®Ÿ˜zÜïáìR8 ÿûÑ2äŒR‰¦UÏF3……BxÓ¡$F IH:(a‘“Ü¥fQ†fÍ]kÆX,Å3gqþ®älª˜SMðµ-™1—µú”b­z(X%ë~p¦{|K…“S0d„ënA:`n’@H:0¬ìøDª^?Î&ÁU°ŠÄAÈ-X™$„61ÏS…4t­Xñ's™ì¬"‰JËÞYZ`òöjVÙªu¾«U©«há2©ì˵¶_’K¯To%Is¿‡<!ûA™$Õ'ü¨î-–È%XJ† ¹Bxhƒ‡îjBU'ë/[ìóørÙv²rÂú³(ýb…_i+Á²ý}Òvì8,ûþ˜vјœçÕ]Ôæ§ú{<@p|,«dK1T,Š¡žl‘ìRŽ”d¢Ü§I…}x"ƒ:Þ«ª}íZÉÂ/„Ʀh2Ñj¨B.®Xêlªý`  D°JØ$ÆØ²¤øEþ¢bË­/¾¡j(™{uÃkxʱBNAÛY±‹Fü-żc)VT\"z@±F¼s8…Ëéfü “ÆBÂŒwÞ©¨ M[¦ÍdKJù6Ìæ3Šk…„T ²ý´åß|Ë+Á*Û¡nåùh·‡YfÎSl2‚=ëaw ˆ%Rb*þ´ ì¶¼Ô—ŽJh ¡•œ¦,‡œCöƒR¢+èþ®*?X¶vóÄ)9‹±ü RÉ32òPhÛî=>~±U©€‹)·ÚO¥¨ãù®âéŸ8”GC^èúŽxbVö,0XF­…ÔaLÑŒØøb­V ˜I—òRÊ JtŽ®¹îXSÏ^h=œ.–.[)ÄUR"á’DˆœÁª¢‡Ÿ:ããð›ªTÀ帘ÎðîŒuI_Uè 99©‚—†¤ÇÚи±[/Wcd kh˜©’‡ØÍZm¢­’z—EO‡†VÚ­ˆë ­Z‘µ“äËSTñ”é€?-вÐk$Ô‰±(Fùäw*ÝÍhDÿ*àÀ¢ø±Vò°s—B…rž>k™ªèJ ùšçÝùXŽf1 ÅÈæÖ°¸X ïÊð±X¨¡r²ÊæþŠöDé—«©³©R3S¸"M+< âšÝŽ·¦snøüõT‘,Öîðf|SñG GK«æ¾ÿ#5ðrMq¨à†dg$…ÒvÁ²»œ¾¢Do(¹9ÉV9ÄÅ)F]üB$Ô º§£tagjZÙò•¢?•º€„ú@ÃÉ0î¿»ã&¾-Mp`áÁÁ’×Ç¢£vËoÈÙ=º`ð[@êgÄñ°Q¯{½¬È%k¨o’NåpÈé+©_Y ÌUÙv—†¡ùÉÇ.~çeù`*k³ )1q´r]Þ4Ò¢[ôD÷¯ãÚÝîgXDB¼[hGily’óôÙâäYùB^z÷0BKº„Ä–2Üá qHË)?Ú]ž ¤„– bì¨øܧ·t¹Ò•k¨”³Ò0@õØ1¼ƒ-ÏT@TtkU¯€+¨a}ÌhÇRGªjyù¨xÆ\çÙ4XƂ͡£‡y½2‹Ú-¤U‡‹é1Ž$íÌ,–ƒFZÊØKÌl…<÷,0ÁÓP™¥ —ˆ#eª€hH=K^d0Ôõzk~PÀ…AíÚ(¤²‰r5c^ØbíŽÂWFH,„¾1®x"Pá¹SEÐCɳ¥1ÈØv…­¢‡TUyQ.ðÂBB‚ŸzL:‰å½Éli9Ü¥È{@‰i‘*ÿAÆvw£ë?+àÀâq÷BŸJvÇ“¯‘½ýÀ‘’¥«` ­Èh‰ãâFa<œ´D'K30¢’!pãõÔ‰à¤B¾€ñá# ìÛK¹{!xW ØÆä° ]‘ɦ‡{ùømT¥¬ˆçŸf \ùu²žò6!‹ßŸFg ³…Ž| «prlø0´˜Í‚1âFÛ®†I~2Ç!yFÁ bá‘!…:7¯dúGJDJ\‘¢ëä’8üÂSïVå D°ŒuïÐUÆX*€\–'¶Kqá¨÷a ?Ê·Z`Ü5ÄH ÑÉÙœÈ#Îb$>.áÞn…¼>D2WÅ“f0yBzÂ! Ò:ˆÿ+„ên; 2?Ö¬ëq$ªˆ`â>|¤ µÑò±y°~¿Éº}7,‡¾1˜HªåCDžYž-1G€á¸Ô]£ty4g¥$ψ¸H¼FО‡ÛÿØgý~“<„†¢‘AZbtźþyI†OïýøA –©EÓèQÃ\Œ–ǯ¼Âß¡høX8Ø3›Â§¾WÉê°rŸ1ŽË·ë³„J6EâS:acG A»½èí hO"b¥x¤˜ Á …¾=ÌмI%壘 `jL›tW+×ñ3Þ¢'Q—‹?þ–C>C¶r3,Ø›d°VJ;9¥´zŒh±È¦¥Æ`ñüÅTÚE¤Ÿ‘’žC¬,RÃ]­"*ýRu \°p“©ößñqÊœVÑË/S2ûS*ƒï¬%ˆˆÙ“+ULÌ?“‘2ϸ‰«(U¦”[§¼œŸðŸ’Ù äA0–‚GT¾û ‹Ùøµ\«À“ßÀb(êHÿÇ ÷ð²±~Ý;’71Ñ,’wpËdÕcZËf+|{,›ûô êÕÍ÷ÚJ?!f2‰Ïæ³0ÀžÒ‘¨rpœ=ØÕÔS¸Šeôlq) Ìyžù<ÞjíFxtTlòd=o1»uÛ®œÎ¡£<ªX~«àà¡ë?oÞß¹ëñÇž*;—êi7Ó]­ëìM&k'ºÍ—ŠùWñþ+Ù6o·nÛˑ󦻎:÷$,HKe$” ? „°`XÄÇS„ëîøÍºq3“—ÿ Ÿ„ת·w‹‘ÜÊ~øØúå=ü´cÿaéù¹ª—ßÀÊ?xþÛfÿ´é@«v©C‡ÙÝÍëjޤξÆÍ|qˆªhÔûðÿØÐ¢YÈk/ùZ]ÁP¹‚…J15`Èë/ ‘µÓY$æ;nRd“F5þL6ð_…«œ2òžzùFÇžö=ÁJ8ü7Þo`ž:ÉÙ¢iêꊕ‡¶Ìœ8…²¸™–ÓP§v?“ƒ{?¨øé”ÿø¬²çÇSäB]H/Ÿl ŸúæC'Ÿ ,$ħýcb"ÄD@ÉâUTªÇIr}WPÏjØáÖÒ¹ù…#Æe·¸Çºágt»#åÜÍ_÷ßÉo`•dfÒ€¥Å™„À:­ÖË3fkÔ*kábÆeF"2²ö/ßE)¥ÆáöáTЧÎ71ÑÓ'ør,"¤7‰PŸÀ Ÿ9öK2…%S“Ûs€óÄiO‡ÊwAúíeò~ËÁˆ`¹Æ„q… Ï5omô{ta‘|îPØÛÃ)$5¨«×ó ËéØÓñ§Ç×{î0e¥¦.¼TCSù ¬ÄDÉh1‚ÑâF´a’CD-ÊÃÐ…_®IoÒ6oæ\in21!~ý—5wn44k‚æ·Üš.(ËôO¤¹ÂßyÓк…ªª¸ XªóÚ´û a“Í^2môxé>'›6ŠÛ¹1öûU¤8ö)·Z¦~œÝ´Cùšo=¼d x ª¤Û„íÛ ñžÎ µü9l¦þsÏIeq…ŒÜND7Š4ìµ—A°^M—eÖ¶\˜ÁؾMØØ·Ð}T$1 6~”±ʰVkɬùÜ6A„¼:(áü‘ðw†Km9N¦ÜèÚ7ÿé!ô?×<ç )•ûƒÂ‚Íaçoª ù,SllóáÃ¥UÉ!¢Q<#ÇòrÈÅ*½¤èAéï{2ÛÜ—óÖX)ãEÄ׈]2/ñÄ>óC=¼˜.:çFÉy¦ÉˆÉãÈf¥U¢¦â9c¼fœT&[6‹˜8FZ-]úåíRA½ºÕ<¾'zé|éÙe&¿°`øØœvÝìÞ“  ¤\‘B©’ÌUØCˆŠŸGÒPëÙ‘Wìùù?4ibÏ—ç»&¹3ŒäBüKðïì&à ^á â+¼Å:“11±Ó'F„:µòäÝïLtžM^\¯|†ˆKÌ8.=Kc?xôÆ}ÁÇ ®ž!å„u埬:ü||$¿§±}¸µZ¯×oËxx3Ù¢i䜩æÞÊ›(ºdùWÅgxêÑc=”‘¬+s,?ðŽ´#ª6GËÏC“ƒbbÚü1º…vg·PϨŒë¥×,t”)•ŸŸóÆèËíºZ÷É#Tƒz0é䟱+>Ój¹ºE:'·d™üBÀ {îý&Ë?ïEÖˆCkHŠÆ&lÜH‰*Î\­øÚ-UDbBÔò 'ö¡TÙ÷îÏnß½hØ·T)çAqC•'C£ÏèÙ“ýK•ÿ-Ôî®l’Ç2`¼ÝNІŠM—l·£%ü•ì,‡?÷Dìœéd­šÒù«µøÓ¥–°EñŠ$ )ýo emöìöÝéìI¹êÜÁÕ˜údí¤š‡wË϶;×¶SEHXTDø¸Q¡o½ŠËoù¢³²‹Þý°ü›ï]¿7çFžÆøK‰•à¾Õúå[¯ßwU( ¦è²r%LÄC‰¼5¥Äæ!’¦—í–*0Á†¯û!³Y‡Â¹ŸK‰PÜlŽ?*)ýxøØ·€Ù,úZVÉêõR50SPÌW‹ w¶t­°¡U‹è5‹ÑJ¿ZR…™ÍaãFÖJ?>n¤LE•,X’Õ´#J•ë°D/£ѦŸbxŒøÙ°~üW‹þÕp‹ Pœž¾íþûË‘ÑÉ8g´´Xb˜Å…_¸»…)Ê\(MWPë5Í3wîˆ^—Êʶ̜W²ì+8^™lP/)õˆ”¨ôU4Õ¬£óBÆØ }uPø„ÑDMEɾÿpá°1Ž“)^Nãå—pN!q¿"—´w»ÑÝ8¨ÂbÂ4èýë¯!µkK[œböA ¹…t#¢¹.—,`öpeû©3W»<”3t/¿.šL¨³ðãÄ´#!ƒŸ$éL¿TúÃÏ•­|ùÆ-Î €$C†L8$jáG(UtAaþ«£rîë­¢ÊmâT¹úºNu®A2TðS"¡fâîÍBUY,¨²«Ww÷ïŸ옴Z)i$HÈM”*Þâÿ V º€X&ãbbçÎñÕÕé—Š¦ÍaŠ,ñ›ÖVªÚy/¼Ž™ƒ"ÞMÖ«£¾£¯¿+=Qõš'ïòÔIàj¥¤²±u‹ÄÍßêÔ®Tµ5U`ÅýÛí‡ÇŒ9÷ÅR‡†;¶Èãb&s ç1—L&ºÈ]k,]`pÿ¾Ì[ gFfÁëïØvýîû!žf£ð‚ âÕ—âæÏÄÅDI€(àÀ‚ÊÞ»÷àˆ'OÂU”-1³ÐH ã·à.!J.N÷.á…›Í1“ÇE¿3ü´¤(˼E–?R½L X `ÞçÌQ•]‘2¶j^cþ¬àêÑ>  ð3QelØpfÁ‚܃]Ù"\ØÂ‘põƒ®¦ (­—©Ý]5W- ªìläH9—?x¸ãÈqÔ¹eÊ{Šiý)ž1uê5âõ°'úÃç÷P –¨¢ÔÔKßmÇŽÂcÇ0»CÄ 'Ä 5W*·èl¡žQ¼ †¸™“¢Æ¼u“UµÌ_TôÞÖëäØî‚t÷[Pi4ÝÓ>øÝCô56¬“UÕZÕ,I´ÃQœ–V–qÉvý:SVh£hŒErI8ÆOmÅ­$†‰9Þ÷ñ+Fp’‰5Ãú÷½É–oÛ齯ð¦}Åàg°q™b $ÁÕœÀAàá†zu ëù>'€ßUÀÒU ZWu—ßž;»bYÚf£­VÚj£mVÆjc¬ò_Öjelü_®Ì¸¿6XVÝ.ÌkEӵׯ ºéì¢#íâ¯q‹$1ƒ3›p³ 3™1³ .ܪٌ™àª¶ [„Oùn2Wº ¸`›8±$=‚èØl´ÝN•—ÓV+W9ž¬8Ãr,á.D1G3¨Âªœ/Šª½hþÍSŵÿ›4 cpîˆqLI©§}<'ÔI,– 8à‚ÚC‚1³ ðPêÔNœúÁÍW[ nŒuqíÚ½/¼Pán¸˜‰@†?ÈmC¤©(ã…æ·Â{v¯»r±1)ñÖÜ™y%{àkpÄŽ§/×{zUvªÁê}µ,vàs·°æ·P `çÃ_ݶ­ÂÝ0ž-Bi·T>˜ ^D°ùŽYÓjM~kÒ-Mç²0oòLÖ®˜=ÁkfÁ͘q`T–ÄVxï^M·ýtëk~‹Ð`•gemjÓÆ–SQžÎûuOö”¦ Dtº·ñÊ¥æ&4­¿ýLêõ—^·=î9wå:ƒ»ŸPv¢K¦‹€Œ‹m}ò1¡¦¦õ¿t«08!áuë0ßú[àh'`ù…q†âËâ %Á›ë-˜sçÞÝZSjÑ´ÞÝq³>¦ ÕWF=Q`Ôcür¶a-Cà ×­dªÝbA¥­Xñ×С¾ï‹žQŠ·¤X¾F¯ž-—|a®WÕïʲ_H¿:ô­²=J[\{iPoè)´‚>±Áçók½é屡jàô'Ÿ;¶R‡ˆl QWp|ÍÖs?NzÞ¡.Ã|µîú¸œ¹yÊ`Ëuú8u8Å ÁVÝ)“êL ÜéÝ%U°©K–>œu7׊'Á ž$ MßÖjêC„ßæô‘D^Ÿ0%wÙJث㶙ug«¸¿ÖàãwŒyÛ¿·à£ª X€k»ví8Кíû!‰½zu˜;7ª¥›që~Tù©”+cÞ·ìúÕå1t¤¨bä>Ù|Õò¸þýü\uŸUÀXsr“¾v­—y  â:vl7cF­=ªªj•VÑö—'M+9zÌ“”ÊqiúÙõœjãºÕ«^>"Hœüªï£æÎš˧NϺ~-¡–âYêd•¼es£&ŠçA.e¤Ÿ?'\.44ì=ÝÖêžNç-Zê¥Ú!!^_~î'éKÖêeK¤rx᩽¼¼Ü-›6ªö¬]§Î]m…Wë²,»s›Ú&oU›1WoˆÕ³wo“ÉÍ;8Æ  ññ^–ÐÐJÞhUHKPúÅ {~û–ë7l4e¶ü"–ÕË—¹î¯ô† °NŸ8qõŸ+ªýϧ¦¦_P¼á °úö¿­ü –¬¯–/“Ó<¤GÏ^µïæÖ>w&åà_ªöïÓïQ\œôá衃ùyrŒ†í ÊÏ[£Fëúµ«§Nœ€åèè˜Î÷âµ7£€ˆ±¶ýòsêÙ3n?:rÈã»ko¡Š 7nø–ÃÂÂ<ù4N/2óÃIpãêåKïé|zH\|ü=ïÛ¿o/ÿ,*³+yû3/ „mß"€e2›gÍÿô©~}àjò–_†¿ý,ïܾUzjõ¡¾ýHÏÓ?vô‰¾½]·/X²,))€&vW) ÀúñÛõþ­À·ß¬±‰Sg?þ̳0jyâ™çÌù¨¼¬ ðÛ®—3/Õ©«˜¾oÿ,è× XgOŸ¾’)äl»÷ìÕöîö 7¹x> ¦=/e¤×«ß€ß+ro~°¤¸øÄ±£®Ûíâë†Sº+N§SÊFböâËC`9<"bÀ“OÃ2Ã0_­X®:ð}úÄ÷4øëO‹Å¢òƒ˜¾ýåWè&ÿò Ìa;|n©™Pë¼?ÿè6ëß>m´ý—Í9YY°Üµ{:H}ààW0afxðãwëKŠ‹Ñ#"#ïïÖ–)§ó÷];Ð@*,,¼k÷07!_‹ÿtwòvFœ8ùáGûã^'è 2™“j».^¼g ( *7äõaM›»Ÿ¿WròNwH(Ò`Ê6Ï®Áá'^7ƒTŸ®Z.gš4k!µ ¡êÔ«—™‘(+-ݰ~íà×Þ@?í×ÿ±_w]™;¶niÖ¢å¥ôt¸Ú³O˜ýª[¿~Ë;ïLáß²q6åôåÌKÉh^´¯ïxo§•ë¾ó¾O* ÀêÔå~øÏíªkW¯z+2*J*_#Wýså²TމU¼)ù衃§ÅÖ`éçŸ.ýüSOçY³rÅ W^%ÉÖ{ôú_pp0ìEÞ÷ÇïwÔ•'HB‰éûè€ñõ-ß}óµÔƬ[¿~«;ïòt¹j­êí  Cvow?©¤ÍjýkïiµQEo·ªÇ»®^¹²;y;ºÅÜã ²Ù¤8,:&¦Ó}÷K»=üHÉ¥®\º˜r:aùöK_IªÞ`uº¯‹TNK=ç6“9oö¬¢Bá½Ë£±Ã=ò<ÿ\¹²K J…r±E /qUeÛuè¨ÚG~Ýf Wø¯Õ¶}‡ú f\¼W§Oš–zöéç^¨ß°Ã0i©g׬Xvô>üHÿ°ðpiuÍ—Ëq­î=ÿ×o€ûŸ™¢¨ cFÃ@í衃)§N¶l}§ôi—ºEDFZŠŠÐC\MQßþŽ*srÍZ´lØX=ØËUV«õJf¦—’H ¼„Võ Çñ÷&OúâóÒ– ëÖnXçþ5–!¡¡£Þ/­––”lX/ï9æý è`•ü¹oã÷B½jÙÒ¹ŸËï]6=Üﻵò¸¼š wwPgz÷}dÚÄ÷id⸠Ãv¨#t¿·½—j%î;v—SU¥ª·+t{°×Ûã*ž:Ñh4~ºdyòjà ëו–”ÀrçûðB`ÐW¥ò¶Í›nä(&Sxéóˆ› BLl콈ã{øöõƒ·X€7Gž¿hiœçÙ‹šµlõíÏ[èñ ´…¦é5_Ê ÏÁ¯V0Wl‹Ö­ïîp,;ε«W¡Ÿv¼·“4‚çÌ=1¨l{÷Ý(å·Ÿüæ <ùô½]„ÿ`©»×Umïn?ôÍá°|W›vžvë7à±^}þmgò¾?þH¿pÞRT„xLl\Óæ-èñ`§.]0Lñ/”“Õ»ß#°d2IyN/;áiô=¨A<~Ò‡gNŸäÏfn}g·gèջυ4aÖ}]»y¹Vzõ¤»®PáኹUk&Ô&G®QÓoSvëócéÒD·ƒ+Ô€ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰t°ti",]šHK—&ÒÁÒ¥‰þÿÿVɶ7D»¹IEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/Aws.png000644 001751 000000 00000216441 14745137273 024171 0ustar00martymacwheel000000 000000 ‰PNG  IHDR^ÒR¾tN cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿÿÿÿ X÷Ü pHYs``ðkBÏtIMEç ÂÚ%6€IDATxÚìgxTÕÖ€ß}fÒ{o¤Bè½#  EŠ€"M¬4 EDQ•¦ "¢‚HP¤I‘&½÷–Þ{ï™ÉÌÙß$Âå»ÞëU’Íû<fÉYrȘÇÀ'òs¹ ¸ÂU®§8Ç9W¹Ê  ˜|ŠQñ¯òÎ*(OðÝkwÖSï^àS˜y‰ù‹ ZC~Zþ– PðNáå¢/¡ìhYi™èmõõÁPöLY³²Ñ ãÔçdà‚7.€ŠŠ ´mD °|ɲÀ¢=h>W(ýÁ|¹EóT°‹±bëWìWØMûváààoßÄΜ/»$:K¾ó³Ný@A\áÿƒ~*;ø—¢†j¨¡†ª+¬±†CÉÐÒHé’¶-c¤,Oy$5R_JÏÌx rfåþšÿ4ä%ç‹ü¯ ¿y¾¡p¯+ *Yú úÑeס,§ì§²kl°º«’IÍ4M¾FƒÍß5¿ ÖOXk­~ûoìŽÛ¶ûñö©vKÀ1Õa‹}xj=–»½Þs=‹Ý?¯g<Ÿóøllll¬ÿŒ¡[3Þþ[D‡÷¿Pi0*((ük‰Y/g…Xï¸!‰ ðHâ¸äpHõK=•¾ Ò§e®Íz²Ss s»@AãÂýE'¡ôji§Ò­ OÖ.Ûz½^)[ zÊú”%@Ù ý…²@0S/«1 öRg§ñªzIÕ³e?>,±Á’;¾'ž¸ƒö=Í»šV ¼”ZÂ4±Êe6˜Í3kk–æ Ì£Íß‹§Í-ÌÞóÉ ̯ƒ¥¥¥bQì/Ùžµ›®í]G9-)îy®îà}ÔëÏJ øÞoøøë|7€UˆåE‹‚ÿ ¨ )ì°ÅÆÔ7»(¤ˆbÀ¬M-L ÷;M¥çÇ´ÃÍŸì¿jø/Ü}ŸË1­añ'. yä‘8à€ýï–<%Õ#m2D_бˆ‘«¢Ä]„˜¢Øì!-==!ó6,ÚR4ŠÛZ EË‹›Ÿ]‘®·>ô«ôeÝAŸ«Dÿ+NÜ#Á8L]h\ê-õºê h1û·a!E˜&UÍ)Í&å}ÐŽÒv×^ód³/ÍÁÜ×üŠÙ»`f1×<¬Û[}ge6§mX/Û6EÖõÁ1ÕÑÛÁ <žp{Ìõx$º×síËÜ{¸½¾e>½£!ð‡€_ÌW˜{›Å™úf=¸Ôxx+) €BÀ»Y:¸g (;RVj˜IõS¤–@ÂÍļäÎ8-é\ÊO¼8Õ2íMHß’•év[2·CÆäL5{;äổÈ˼ðüøüP¼¦Ø·$ŒÍŒU3ñ-ˆŸpf°D, –°€é@¢è$ÞцÖLð»ùR4:à„;@E‡\‰#ÅÀ|)'IdÝÁêؤ،±Yvæ ̲ù}C·ÆþsdI6à†+Îÿÿã¼§òÛØ@qañè’! ³Ð9胺Az W„’ý¯Fé-¢‰M[͇Êç`¿Æ.ÒÖ †9äÚoÅJ‹î:þïæá«0t1Ƶ'$LO\•|ÂOGN‰.ƒˆæQ bë/ž…ä-)ÓCê³ióÓ‡´®éVY¡ðPaÛ¢€+颟Ø*œ@ì¹Ô±U¬‡€,þ –Š…D?ðWGÅ^ÑD+ZÑäßÈ)pCÃ8B(Èòã€|-ׂœ ­ùÄfÙäPù!@†Ë|Yd¦<*­@g¤ì –u-nZ¼Áö®vƒÁ±‰ã{ö–àèíàän£\²œÛ€×&¯`Áoh­“Þ¾à7Ý÷˜ü#ý¾õ>ßz­õüÌ·›·5+ûz.¡„RÀ +,M}Óï?ÿïícKCÈYs éó5u$7Ií›Ö ’ ÉO¤M…8Ïøƒ ïB̰Ø/ëCÌð¸¨3H.c^f6èZè¦èƒ@±R Ä(o*OƒÒZ4n ¼„µÀ)ˆA<*:ÑУ§ì]’IÔø³<(€ô"¶ ÃÔXY r½üY=ª½ÚHö±\|Åbpïîx‚ž èäW(õš†XC½Iu7 Ac÷øM„€3~oú>î¹Ít¹õP+î£òtä -Z´¾&ã|VG¸ðó¥ºW·Âõ·BÃGAÁ°ü¸Â  ÚÈ¥ê7 o’L EùS›#ç,X´fþ>Ø8ZײÞvííÖØž­îu\u²)xa`g¨;»Î‚ÚŠƉñb"PJ):ÀK,L­Ä˜Ê BÅÓ˜µ${NN$DÜŠºÛbׯY$Ô‚ôþ—3§C¡ÐPd ºæºÎúK îVÛ¨=@~ÏyÎ6Xü} '±s£ùGf¶`e=ÜúØåÙŽ³] ®Ž.vN_@ðä íþu¡þÑPÿ:¥`¶ÆÌßÌ´§ ­øûFUÅ=Ô,]vrnˆXõELcˆYÛ2~4¤OŠN÷(~JCK›éŽ:Uê¥-Pˆ7^üﮦ+„ÚO4‡4—Á~ŒÝ»PïbèÈàÐfk˶Më‚Ë#Îub€%|Â,S+í×ë½äõÌwÍ/ƒ˜eqn‰ÏAXݰ Q'á:7/‡™Áշdž·†ðôHýÅM/©¸â#(F%Qe£ò¹2D¦H—'œqáÎóÿ PùêÐQ r‚œ"g€L–…ÒäM#KA^ѲÔõò€<ÊñŠp÷ýnS]ý!Ð'à9ß§¡ö¢Àzþ_C`´ÿ__ðõ¯õ¢w ø¼èÝÃs$øöÝæÓì^²ÝlýoäɯpÚßã|Hùû¼•†£9æ˜ýÿe+ÙKö‚œÖ¹Wò:@ÖѬk9Á4$ePj ¸Ý7<9j\>}õùÀõ=7×…Ý„”©+Ò?ù‚œ"WƒX&扱 ú+]”ú ²ˆã*ˆ¢ŸèÁƒçŸB¥Ç(t2@>.{ËÁ ®”;åP'¿»9v§m¿‡úÏÔíWg3<òZ‡+­÷BÛö­š/ZÞÏyå€{=·×\.ƒÈ»ÅŽ»ÚyH ²_ÿüÖ/_Àç9_¹¬Ú‘µ£^ e²X¼ ¸á€Ý©ô ÿÄn‚!G3 Hy\ö8«Ná±~[µ_/yÎ|ÈSPûXíÚ¥ ­­)ÔüÂß©ô>‘ûmÞ°ü—aOØþO†w'®÷½æ¥çJÛê<Ãb‡X ¢;ÝéxâŒ3åþðà[9Pã4çAÎ’sYògyY‚ƒ}O»¡ÐöÑÖG›€g7 ±ÐÚömåÐ|?˜1k¨Ýgj­=|ä§L( {Yvø3ØÚn[ÀÏnpmññ·—nÎI?X&>g6ˆ  7àXC ÒÀªØtÌsŒÏ?W¡~ïzŸ‡ì‚W¹øÙfÐçdÏèn«Ai­x‰|SkëßPV1š•;î%oKþÜ‚ÅÐ-qdrC¸X|eÊõspÄáXî©·à²Ç•†7v@ÎÄÜÇò'‚æ3Í$åq‹·Ä0ˆ©âMÀ G¹³’ñw¥²ˆ#Žd²–lêõ€¼ª™ P»€v£æ M;ððwÛèö4×7-m8ÚÌjõ~Óòfðð}¥–Ÿwwpà<ϱ'höjÞÑ42õEÞ?þ>¯#*åóÝKtÍèB(}´t“Î ’ '>©O¦Ì8g,ÏY^^¿¾rüòé&p#ú¶køJ(ØSàP˜â€Ø#¶·¸MJ:™üý_¤ª¢ò­˜1ÊrÜ fm´fÚÏÁ'Ñç#Ïà‰¢îý;=Vwsëü3ø ö=áS6{¬¬&xS\xäòÛ×`Ïòý›ÇÀ¹zV^õƒü= Žƒa–¡½q"ËŒ/@¼*ˆü× ùþG*;¨ŠÍj¢ŸxB< †¡Æ.ƶï’ðqr¬ÊZ?mócðËÛ‡Þ= #úÕ |]Þù£öeàè¶Øu0ˆqQ|oê‹úïN~16ãÃPÃ!` 1Ril¯~yD±ÈP<±dwÉ$8ØñðÌã=`@ë>§{äKˆK§Q  Õè5ߘZ{ o3‹9Pü]ɸÒáà…_‡ŸL…Èœh‹Ø™ 9©¬WPÊ|¦W£\ï—øR,ó@ŸTVTÖ bgÄíMX f^{Ìe˜ß»)Ø—‡×ð{Ìåc¾€‡’&¥6ðKê!ßcpûýðÁQ AsIsSù–rC÷óêKô}E060.7úBé'¥3u. _§WL­´C…¡+e¡ Æ&éà¢ñòK×/ÁJ«u}¾Ï€ëënvKâóÅíK@Õª­ÔÆ æ‹Ùbw–Ök Ý?F¥Ž*Wš“I%í®Ÿ9Âqˆ ‰·JŠ…o^]¸Ñ v9RzÂì{ªG8 ÈèÛÓ s‡ PrD”8 ˆ¿©/òóð¼÷ìzO[Ÿ6<£ =vðôw°ïéƒî¿Z@x\d·˜P¨+œ[ä%Î¥¹¥›AÆÈ.òG`4/°Dm*Z.¸à̃ãówÃk¬€£ç<¨ùª­l%JÉ»¥éóz\Ÿ„…ð™ëÒ)ßzÁ™AçÎ_C­í|r ´¡Uf³ò3¹šúRþ6glæZGÝ-»Ÿleؤ¼äÑœ<À±b ®ºðÅíä3ò(Ž*9Q:Nž)º`„€-þßúZ€Çt÷[±&Â8CýB= 7šÞÔ…9@ŠwJ‹´^`¸`xÃZomŒv`i¢Í¶åYOÄë c*ù¹ô)8úà ë3_@Ïoo×E©1xÿê õ  —ì¯~p½Ä?Ÿ¸9©.”½W[– Ú íFí<Àæ·…jA>%‡Ê1`af‘hn N8jíˆbÁÀSkîßw Á-ɶÙïødïØQ´{Ä/í £SV|ö$Ð?©ÿEï r¯üLñ¤è]áx*PkÆãûKEˆ‰qz\Ícs#Æöµ$æ³Ø°¢îšW6½ 7Gܾ±Þ8ýúÆ‘ÀÛÆ«Ðà ” ‡kÏëÃ#ëï<è¥Ï”nѽ »úî9sðøpÄǃ>„¯ë}ûúúúp.áâŠ+ÞÚ8­EF)iY¢é,=© â€Ø!Ö$ˆ>€3Î8QóbU•z6+Oï"ÚŠV4ÑMt€¡¯a‘á dÍjžó>¹rlëikXòù²£«¯ÃO‰»¢ö±‹q±qï8ÿ‚G3÷—]ƒ§ôкY€+ÇË©&¥\+ÑUtãÆRcc8VvÒü쫹,ëÛl·»ŽÖ£Gojí=8Æ:Ægá\ï‹ÖW.BÖ‚ìI¹@ ˆúüÿüœÕMÅs/–Š…â#(k\öjÙ °ŽÞ9‘¹—ò’L­Å{ú ã`ãdõ{8vì¤×¹H{<½ufˆÏÅe8åéM°™GÝ wÉK`ßÏþ ÝJH Xék"^„‰S&ÒÛàXÁÉ#çì`Ѻ/¬V¤Ãæ)?®ßù)$~šÜ*å8èNè\tïe”¡1L<#p'[ÀÖÿÝÍiBC6Â(2ÁÐÃ0Ëx2ºe>‘µ ~í|ÂöÌ`XRòõêÕÑ—Ó9/˜Åx¾4µôœ‡Çà­\ÂhLkzB‘R4­x2¬ßñ½v[XylÝàïSáˆ×±z§G@܇‰õ’A·W×V¿4£5}?ÁÂCÍESQó"=hTÞ+,±ñŽ˜(^Í4Í¥ Ü.|¹¨)\¨}iÒµTX³ó»È-oÂÆô-ßnÏÒq¥Gu_IÄ“ÆçÆT1×÷<_^ïyöðx‚êÎð3YO¶™NÝ¢ž¨KmP}Ô†j_ˆì½'¶¤öJkœ„sšk”oþü#é²þ®Ü³ùT¾¡¾/—µÜY·WA^qþÚü¹ V) •É”?oB¿B‚@î‘'d8j‹æ=±-ã?H|Н”ô*¹nj! î,•—`Ý£ºÇuIpõýk‡o9C•ù'@9¨ló¨þ~Å 3Ì@5S½ÔŽà<Ý)Ùa Ôoz¬Noá(ŒÕ(Oelî=ºt™úo`»õ®iûÝ`E¿ÕIöÃá/ŽÎ8% mNú¦¬À‘ ~q@ìßSžîíî‚I5T/EåéÄ/b»Ø¢µ¨#Ì ï…¼–ùpÌáä£g»Á±¯N|~æG(Š-z¥¸®©…þã<<oeáe.e“áħÍÏ÷—l¾§®^ôVsÐë&鮂ÙPm€6„y"žš|“;¥å›A4Ã4]w(K-³1|כݴ ëß ý~ÑOgagøžãb@¬Û£ïx×÷•ßvÁWïçžX3ŸÎÞ ž^P§eíai ?’_ÉCÅÀQÝXW,žËtæ@ñ¨âïK;B¬CÜg‰á{2oiþ?!Oò£"­®„Ò ò|W0I|#y,”>_ú³îI©ÄŠK¦ö.*Ÿ÷zÔ!Ô…ê—r-„oŠX]ò¯çÏ-œij!<ŒßO <5ådÚköXƇ™‡@_G?­ì4ˆõâa‚°y–‹\åÑA„€ëm×—%òl¬ Ñ ,…*2«AÊ à=Ù[JòKŸÒÕ‚?_øå¬~ü»Ø-MàLÄù—.BqóâåÅÏ‚ö3íHMˆ†Ô¥.5ãóƒFe”xI ƒA'ŒsP@¡¾ð}8q&øÂ÷Pز(ªø!òð>t1¼º¯ô±eO¾'=ê Éá©{ÒæÇh=(s”·”gùÍ@ªáoFÅî\eŒòŒèÒZºÈo!†8MÂ>X5o}÷ÍGÁÉÇÑÒÁiÙ~nk°8oñ®yP\‘XÛ¦"v¸šñ:àñ™{Ô™S{]À+ Õj¯içƒô—~ÒH,/MYm›2îÉš!<…=FˆQ‡cêCúðŒç³N€#Ø©~}=h”õ.›gˆ„˜¹qn‰û ߢÀ¾h¨TKµ'hzhºj* –IjÔ‚Ã:ûWíÿ&¾y>.àôŽC‰ƒiU)@Åõjÿ5­X±Wñ%cáЩ£OåÃÊ÷×6ý~Dí}2îȺj]9”úнRDy¢êÓ[ }…á»’¥,c#êKï›8)i2èoè—ê"OüC×¥[gAü‹ñk¿Ý%·~ˆF"HØQcèþS¨¨#òDЏÆƶƩûjì‹ éðß<µ. n¯"ÊŒ‰ªFmÁC×Dù‘->´haþ ø=âé îo¹uµ>e3ùmfm2ü„¯ðÈõQ>1í!34Sͺ»"›ñŸ½Ô¨ÏÖ×Ó/‡ÛÂô‘Ù £ß ÷ÊDžˆ¢üþ=H†nÂWÔÂÔgÕqr!DæD¿ùKó»t»ëÀª¡{áZÖJ?£, ®gÞ´k ¥Ÿ—u_0ˆƒÉVŠÔ+jšj¾kj½æ3 ꟭{«ÎÝ1ÄU+Û€áÒX]{Ýv87ââ¹+]`ɉ¯ÍV†˜ÉqG‚\£.“É …™ÈâN)ù.ZÓšf Ú¨j;Èž;%ÿO/¢]Í]×&ÏÈp©ƒü …£Šöq¡ñ°Ñxž¡ 0µt5T;¡â±^,‡²+FgcO¸ýNÄ–¨TØra[Úî9¡CÒÝé¡´ÿ>ñyuáfpup™M ]­×D pFîd1Âo>seÖÝ%4ÿl©ã¿ úÀ²gËöÀíÅᾑ‚ÎV7PÄ  ¤—ûÃxàŽ+È_äY ‰-“¦¦Œ‚¬¬ûGS ÷pÏŠŠÎ¨kª? 7½o­øJ3KÛ”ž‘$¢Ä9ÈWái“ãåu%ø5÷kë½ ê}Z¯{ýÕÐþ=›‹¥¡< èm«°ýQÏ—aË»®ý “wƒ±‹q€úˆEâ1‹;±¾•rQL ]QB¼²Ät*idɤÄ“H2H)ÜIÿ•V‘¿?‹lr€\òÈ **™UÜßvO‘+ÎÂèÊPƃޣì´áMPÏÈ,édjáþ8ÝÐ%;É'e(ÝVúzé;` W­U{EkÑê/Ÿ¾†‡•Ê,µðÁÊ®•¹–½»'î5p:ûìÜ‹ý  ±pjÑS n‹]Ö9»Cã^ ›×ÛÊ`¥—Ò˜;^Su{¡ ¹mó |!yYŠ]Z ”L)mYjŠþC¿K_¤ ÂDÄ‚è% «­«ÏqTüÂVSK÷¨Œµ¼Á n‚ñ3ãrãˆ3‹Û›Ø rÞÊuÈëkj!M4Ê8jCÎc¹óòž‚Øoâ}g‚¾ƒ~vY>ˆ â[Qùv“ë„<Ë9Жi¦k?ÿ'kÍ÷ùjÛöõO¬î™D̈]ßÞê°½\uk_x,n¬ ƒ@4õ©‹É šÊ=hCKà:gÙb¬":‚X+Š âűK¥@\åI¥¥b JkÅ[)EI∓b»X b¦'žÑQ4^ Ì„*Ò‰¼ÂhÀµ¢ò⃶i¯òÞëÐQœá’¼NyžS ÷ÇyøÅ0"ˆõuœüø\¶–ß6L¥©…»‹Ê¢Â€‘áDÌ’ÉÏ€ùŒ¯@~%WÊõÀ7|Ë?²Ÿcò4g_9)Ï·¹E8A9@"©¤Rî,<Ë=8øR oÀ±"½ZkZÐ hOkÑDwñ(€çÆÓÀ8^/‚˜+f1ø„yDOÑ]‚¢áÅŠ§‚zB•jˆíb“X ŒäE†ï2AŒ±R|ç >³Å4À/<»ÒªÕ$”¯ôiàa+þñð¼•3ŸT’H¦©øp&Õv¿Î¾t~Çåþ°«çëƒ/BþÍ‚ žMM©æ å{$Ì0½¡kYžÖRöýåP¨›Ô[ î–©2lwÙ,³> Áó‚¾hu[½~ k­÷ºnŸ¸>çò186r8c¶ÝmB­×…ÎBoá šÍ ÊrÐ|¢i¬)%KyMy4AšG4¥ ÏÈ“òKŒ/_ãëêXu.?1¬4æ€á€ñ„ñ<¨ÝTã(ÝUÚQo ù¡ù g ó«ìs9ŸCæ´,mv1d½–µ?{¤¦§gdN„¸iñÙ‰@’Uò²´0øÔÒy¯_M­o¼CÀ{®W´Çuðèïë: \縎p ŽÝÞµìWÛu°[ öûìûÚž› ›…ÖãÀª¿å/–O€å÷–qo€ùÇf³Í2€¯GØ¿‘wTÄ~ný¤üJ{êŠu£¡ô©Ò:{(YâUz êŽ(úòºçÏËßÙ²æ¾é[3^ÊÉWSn¦‡èé±2.ÂÏD¾û $§ôI}Ê&—}iˆíçÚW5 @ø 7¡r'FÉÔT>ອ:U?ޝ?Ùäœ%4x¢žrºÓ•NpçE®(Q]eܳ Þ~“]”­4ÿ¹IhÃ(ˆ˜õjLK0ì541,2¡ú^O)m!.!Á;i$nHz!%XQq@åæ-Ú*ß(óP4»°¸ø„}ñaÔ[ ^RcUkàEžå`7[Ymj)ÿúÑ[t‡˜Ëq¯&\‡ÌÕYßg_^c2ùçº?,°À ‹†7„É·„ßÃÆÛÆ0 =oñ &3xÕQª­ú8„ô¨s;èMÚ°Ô7¨œ WñýJ®2?ÍŽ?1ü̸éÖ8â{P6+ç”@Oºq´úõòÛuç“OÈÇär(0Ô7¼Ö?[ ´Ê:9ÁýƒBӌƿÖïµ#{û>½}<óÀ'ÐûISàú“ËëΖ࠷ï`¿´›µÍ4©ÿÒâódVüüO á•{þ2˜mÀ×÷üõ¯ÿöÿ€Zö*QÔò5ù£ {Bþð‚c…õ!wRî'y·!ýrÆ L+H^“úIújH4&ýœR %O)†¸% ¯&= ©KÒ2†AIƒ’Ñ¥e  ÔHå(õ%Äñ¶x°Ã~?¸ŠQª€7>؃¸"ÂÄ 0YÒáðäÿ>ƒ·r ½ÆuÂ"ôsçÁÿ_g–•Aø+äj¹ ä&¹O^u“zBÍñ£8"vƒ}}ûWí¾Ón»]w‚{{#×Åàaåæéúø®¯ÕÐ{ |Æoîõwðµ†Z£|Æzu‡þö}ìž ‡çî‘¡ðëÿåo¿¹wýþÕïȯ«¨€eñ¯…ÄQ ¢~«ßðÛO§U¿-Y6`$“ÿå|ƒñc8Ü,ü ÂODZG ííy‘—ázÓoûÁ ÏÛ#Ã;A|jü¹¤b(ê[¼µøKÐLÓ Òºƒè":ÐÓïú®YÐxiŠ”CpsyØâˆmp¾ìRêU l_¿u=°J±zÕòV5Ès>l¿°­mÛ š—6Ó5Z ?8ïè¿§d(g‚x_¼"úQíÙ„NäßfL̺IÃ’I› ²©ô‘A\IbYõÉSíÜ3*<\Ü§Ø Âr#êG/£«±zPñbÁ+š‰Æ4€Ì­Y9¯BÚiû2¦‚ñÕImEÉQ®˜ZÊj ÂЭ$· o}þ'Yµ<¶11î1> ¢è%ºµ ¤:—8**¹9´sXe?‚fè|§ó§aŽU»;¾r'zv8ßε¼e"èŸÕ¬í“ÚÞÚÕ¨J* áÈýò ¿ui%;YªÙm/h°±~LÝzÐärÃz[ M­–7-RšMo| <&¸×r]q×ùÙñ/ço ÜmèVf_©°ª m¹¾m±)¶iZ’ Þxá0î·#üíÏCr”7Ó!¶sÜÔDˆVãêÅ?‘]£¢b@Ô/1âJ!>&a`’R®¦F¥ïÃÃjc8(‹•·ÄK ¾sÅ+ fˆ©b"PX‘U#‘$RA JˆK£ÅÏ@|§Lo0¤šŸ€?©Þ‡ñ¥—2JÔ“/úkù+ÊKZÜu|¥!\J):äy¤"íð¹[žP#@ó½f«æ°_fWjëÎï9uzÜóÜ.¹XAíìÀ>þ-¡¾sèÜÖPoZݾµoCð¼ÚÏv›&Ö±V7€³ä­jÔ‡Å}ª€UQS³òMvÙv£lûC šÑ˜ŠŸ©˜•[ŽÖ?ÙáÌb8°ópòñSp¹àjÎÍ:þxFƒÌ: ·ÈCr7ˆ~¢·xœòV˜l©KÌÓÅ(™Vr°ÔÂÞ ‰ÒÁõ]·V„Ý„V4§É_oæÆúc+WË7 tJˆ!x8q·Ÿ …M m‹²Aî•9âqñh¹+ºšô5Pô½A÷žîœ¾¤ J‘>’½S2Ó¢ "™Ãß—{<ý… µE1ñz1Ý@}A¤~œ‰bi`j¡ÿ¬±ÆÔÆÆÆé46eLÚHk”Ö5üoT °ÿJ#t뾃DǤ·Sá¬:žþî}‚{XC›Ñ-'7›;ýôËØtþ‡!;ÏAÊäÔ‰é!`ljlbì\æ 7¹S½º©ð„kѺi¢ Ê?&:~œÝ}¾Å寡•kó”&逖ØÎ8áX r}ÊG¼N] ì?„z}BÎo¬w²®ä|EgK:”4ÕúXUä)Vü4Ši›ÓÛd~‘¢çÇ ý¼•´À‹G!‹¬›9£!eHª[Ú“ vVŸVc@4â:×yøzÒŠi§X(ÞWž‡¤ÃɳSC’y²_ªï]¥ÙM³ƒs§Cزˆ]ÑE@?p˜òR·•»æ«ÓЭ\a0 § ÓðZ½ÅàµÛc‡ÛY ÅqUR$å Áé:ç_|"ì#¿‹í úŸÊ†—½fµÓ´oPõ[¤î•ëW¸âU±\| öËícì áÑy·ÝX7xìæžßáµÒ¼C@ü,bE—ê”°Šùí ‹H‹^æaÐL-Ÿ7mÓè@ý_ èt‘¦X…ó£/qÕŽŒ>yº\оÒþúPHß›±=³!èµúe06VÓÁÙ¹½ã<èð]ÛÍ­¾Û6Í­™Z)œ‡­›F Pl”<ð|Æã5·Á´;Ù3õCÐÑ/ÒŠ)ç@¼'^ƒ@k¦=«ækÌ:šÝ§÷¦; ‚6«Zkú!t<Ýî‡Öí iÏÆÁõýÀmŽë—› 9¦™¢ÌMWM& D;ñ¼p¦|‰é!™ÍT î¸q×Rš—ð,rïCŸzfù“ƒÁ/ɯs­‘ð©í’3Ë7C‰MRÆ‚!Æk4‚!„@û¯%)« E/Å!Hù6uoº\]vcñí·!DÁÇ…MÀ^c×Ñöu`-˨ÆZóæ‰f¯C‹ƒÍ¦5|.¾òÓõMPxµ(¦øSÍ£ÂÎúÚ%Ö‹O ííôýë Zļ× :Ó‘6Õ/Nµ“óJîëyoCt£¸/>ãQã‡jð ßs›‡7íRâi¥‹hI[’¥:AR³”RŸ„V0Ó+¦"kNv«œ9þ^Ô`0Ïñ*åýTuÞßJC7|Ai ø*аv½óuëƒçrnqÀ7¦^´¯/w È7Õêr8?àRƒkoAÊ­´Áé4o)¾J! ¨ŽÆw¨ðdËi”v`ÓÏæ¶u´ m}²ù"xó… çF§€û»®]–xNt]ªU“ÊlˆGE¶ómûØŒ€ŽëÛ_jmíö·îÒâH˜þ^ú8¸Öì· pcÁͽá 0²¨Uñ§Ú0äËÚ@Ÿ¶½Zt›ö¹öÚ-ÊK'=ðÐTîF_ÆWÌÿ-ÔŒžm6¶X òiõÌÈD˜sù“9_œƒ´³Y™… ÏÊn4Ñ^´Ây“E7ñ˜è ê«êcHOÍÏz nn¾u+ÂZŸh©iºª"ÉCu¼¾æ™æoC‹/šù5Þ .oyg‡%Ȥôñ™:L¶‚ ìWÖ*@ÚÛéOe ˆ~!¶U|*°“ËFý/¢<%º‹ædLvNý’Z&÷Nm_ñaSKW}dµÍn’; ÂÖDlŒÚr!ϳù˜jÌ»+É UœÁç;ï Ïóà·Ê÷¤Ï`0/4?l¾± ¨G(m È­¨U± Ü>Ö&RÙŸfŸÉõ±A¤Š·€a á©jÔË9yŽ«@$»BpXí[F_~iäð¶àvÖõs—ã tQ*w§ü—HäpÀ{àÇØ~Çï¤mPþÓw·ÏïtpÏsmàº:oÐz'¨?©êË`~ÌÜÑ<lšÛ|`=˜ÌM.w2Ç?Ð+ÜÁk1Õ<Ø|<ñd÷6¾ûÝ}]AÆœŒ.YKÁ>Ю‡Ý,ð2ó ron]]Ý\:€Ë[Î#ǃ]¾]mÛÀŠ™u׉_e7Oq'ñeˆþ=•‰ìï æ·Kµjû´Ù×jO³Ã0ÐûÉ«½öÃÆ¶lO…¬‘ÙµrÐXk¬+ ˜’jM\­)÷Ø(Ÿ+3Åó³,;*÷\;q³ïí!Ðjt‹:CË|Whm‰ö”æcLèë—žý=^p»‰jRDŠ_0Ž2¾bX!>«>¹ÄqRì‡ââ’k%ÏAŠYêät²Ë~*'\Jóœ^Nrà.¼ðG¹gb‘íœcŸ7"¿ŽžW¤AfÊ€7˜ò/ýÇCŠØ%¶Š¦pua;H]ž¶2#Jæ—ö.«)–»-ƒL-eÕ¡z¨Þê H]“öqúöNúk™ŽÀ3<É&îôsÕÅ!ù«<š®Ú0íjhú}#ÿúûÁy¢ó ÇP€ 3³²4ú}^a0FÍŒàö™ð%Q.Õ"{Fί`l¯~`œfMµ¥Új4t+QªQª9x¥zr7Â#GÚ‹Ö› 4¢Î‡µÍAóˆò’²ó®/<ì!†ÕMe[ïò ƒUo+,'‚Vq–ï9vØ]ÿ—¡>¢< èƒÎÃ㛨0DÅN±\¼®[\æ:7†G?²±Ýóðäæ>æ=&Aϫݿì2 Z=Û·IøÎ¿~­k`—o÷²í¨sÞ{7QÕºÿ•ÁüKa•8 u¼ä°úèÓ¬Ç8±~9èX¼kÑÂìÈ&²ìny+î·8*¶)‹!{hnPn?¸ÞýF—ÛÍAm¨¶V«Fy*=åïó6o€µ•õ«¨ï[÷p6àðŠý'v+@}G~*¿3¾êJÐFv—½!»aNfnD†F-=êQyIÆ›@®ªâž2kGÎÔœ¯ zXŒŒ{ ØÈVvpÿÒÊ4ˆÓå<¹$ÒAú‚ì/Ÿ‘#«ðzC©CÈÞêKê×Þ-£SV!$¬KÌIþº•¤§gXd~qëâ%Ư w—Œ­.*]mKYÁZÐŒÓ<­„B‹QÍ¢}Ž]í;ÿËñUJc 24Î(¯˜)q —|]ò((.Â(*ªNæbS¶ñˆ1Éè.~Ëj­‡ÎOtx±ÍW`6ÞÌ^û ÐŒ&Ô§ÆÐý³üÙçé!1t+yx Þß1DÍ÷›4·»~¶;m¶€¹™YŠÙÝË+ÑWóbÜ*ÒÄTæµÙâšØ  ü¨õ>î{× #ÄÑLÔÛ66]m®AƒÏê- ‰»hÛ'l&ÿåfþ+ÆïÔ£j.ÄÏO,Nn%WKÛê"€T-.PíYväV¹]îí íÛšáP+­Ö|ï«PϹ®G @ÅùçË©Ïkø<<‡:Æî¡ãž¼–ô¡¡k³.V_‚À1þ›k­!Åe‘r¿ëdÏÔFiæÝ=vG¼/E”ˆ$Èõš|CN³fffK!¨_à6¿®àÙÙÃÛýyPF*=?î„UêU5Eu„¤ÃÉ'RƒîùÒïum@\æ{«_-2˜&t»t»¶Ï×Ë¡îSÀ"Ëb²ù/”Wv³®~¹jx8©1k¨RDÑVøCÀAÿÞµnBÈôàQAiàpÂ>ÚÎä ¦¦›@° Ï–(Iâ:è^Ô_×? ±óã÷&:‚¡ƒqšáWè+Tø s¨µÕç[¯·¡–½Ïm¯ý`uÔª—ÕõdKÙÍrumEø|[¸¢ãb[Åý%«JÌJ7¯3‰÷xÀ·,üqR^I–Þ ú$,O>¢»h/©2’œ!?U·‚—™§·{ 4Û¤sÃÔ/`ªßXª<Ö]™­LOCÖöì}9õ Ö"î@¢Èl f@‰$W]ûÕ†æ_ ÉçSZ¤eCbFÒ¸” ¸@u¦Yª,Q¯•ö2¬ÆXz[ŒÖ}ZŒhR–í,‹-Üu|çƒUŸW§ÈÏ!c}æÅl_Ð÷-[S&A|#>&Ø…/i/kƒS¦£¥Ã!p9à|ȱf;y ’ƒ·†j¥I\#§zOÿM¿µ>õAÝ P³M'8$~›@×Nÿ±Þâòã_LúŒ£ ‹ŒWM +®¸-èÇT¨7¹®ep*x¿íõ±û‡ š«žê£&ÐÓKb¸Æ(£«Úr䆿÷€˜ýñ£‚a²q­Ñž±*"¥gÚ¦ôÚïøKò¶Â(ª0“ú¡\,Ï/<×¹‚¦]?×`'u Hô ä•—N­*D„¸.NBÑÏÅæ%?Bê3éM3¶BNyíž äÙªk¿ºÉZ‘ýSÎ^H¾•Ò4m=”Ì.)*} ÄÑWôªFAŠ)¦ät>ä°z×*Ýr0´x¾é¸ÆCÁê-KÅ”j”§ì+‡CiãÒΥɠÎS¨¿]+k°W3Êåg`õˆå%Ë‘`5Ú*ÍrÂ_>k ÿPj Þª•Ðïë>ܼz ðxÔÚjK9“U`cëXzE߸l6$ÎK~*%Œ—©F÷¿~úÿ™{<ˆõŸ Mª3|úxýìéj‰ê¡¶6¾*bE²ç"{¯*i7ß½õK¸=º”Í27¾ªˆÔ_Òvf,„íIá)î TQ(b« ¡ŠÒ×2FM“¼æz.sßMeã‹õg@à'ßûÆò#(•¯ŠMµŽ8bâKˆ)瘷:ÿ Dku²ú¡º¶JU^­ÄŽËIhIkR–¥NÑStÁT{V¹B®“߃F«\TV€ËëNcœ¡^qèˆàþ`þ¹ùóëÕ(O/†0J\KŽ—^ã,ããÏ@7: S¼ùä“"Kä’ Â^¸(ö&£†¿5o ÕŠ¿»oGŸãà1Ùý1·ë >TV‰ö #ˆ ®úå“Å1 {Ã(È ÉNÏyŒ—ÔdµjkÕÿ!BW…4 ^ >ÅÞ^@Ng ‡€l²1g\X £H‡’Í%¥;àæ°ÛeEPö²áSCÂ_?¿©)žQ¼­äHœÖ-}~Yغ¨Äñ†xõþ·'op“0°L±gQžEîËÝšÏ*ïÒZzJoÀWªBßïËä'àý†×óž·Àý3÷¯\ïŠQtlà°Ü~ „ú‡×z ”›Ê1eÈpAôýGyM"…üùS ž…ð6Qb¾õõØ¿dã0ÕŠÌ}"¦]œYâ‹4/EI-e§ò2µ¨ØL­vSËwÀáS‡0û_¡ÅÁ¦ÓŃf³fžæi(¦xL´Í)M+Í5à”Hç@fZ­iÚ*8Ã^(™ÿMáÈ+ÊoX0Éz©áoAÁ[CõpÏéšåï4 \›¹Ø; ÒYúISÔ2Éób0ß2®5¦AÎìÜùËÁð¡ñsÃö»Ž«ît7÷è+È5 •_ vöÏ÷IP_Ug¨Ëª_]b‘˜'¦C™¿áYÃ>HéžúfzHÛš± ÓÔQê7ê±ê—ë~W’ðZR4¤mM;–±”弨ÄÿÛÝ¿ÏÉ1L‚ û€—}}Àc´[O×»6MÙýdÛÚ¦Ô=V§wPgPÚ(AJ1p•ëòÖý—GôíD0Ø*ú¢.F/‹Ë†2ÊÊʦß}àC¶=ñ 繅ϦýIó“W¥~# ’ cL‘ ª3f?‡lòA6§¿ìNÇý~†f­›Ä5|4M5VšKÕ¯&±•Í,«×,{Y¼šg•ŠpDþ*O™@žB‘!nCîð¼¼üzœÚ3ÝÊž*»aJ(¥´úåªáá¤Æà­¡z¸g€tzÙék‡nàòªÓŽ @Ö•Ídu|¨«¥hN#P[«}Ô©P^Ò¯´9èètú×}Õ~*ðuG¨T?àW0¾©.VJ5¾øà òY9A¾¥3Keér÷Šè- ¤Aé¸Rgêí/÷|üü¤MúIúÄ _+ó”ªx*òêÊ`ÈNpÉ¿U­ŸÀ}¾ûD×]w³s³{Ëv)ÔõiWûPr”pe'p’3œç¾žâ;±R|z½þ‘² þ|ÆÐÌ~+£$k¨ãÔ¹êþª½U—,g-D÷ŽÝ_2efu´ÚS¾¢-iZ}âHé%CÁZµZh• ¾íjåzÛC­`Ÿl¯RP"•ÓbCõ«I4¾ÂìØçÛ=ZmŠf°ˆ¥˜ ¤EÌïˆ7@×F¿[ïñÇžJQ3bœ+,±¼[±÷ÊC UKÁ[ƒI°ïiÚ.,fÚ} ²ŸÄó&äN‰äòA~)WÈÕPœ\2¹ô1]ä³ò]Sk |gÔêáAõÏøµód³ÓfOùPX‚1¢‚øLÌ3À`ahl|nvºe őŽJÌÿz3ÕF69äÜù5¡8©[r!d~‘ù~önPF‹gÄýÌŠQ9 Ûc(>¢ÐBÀl¿¾µÀÍÖµ¹óŠ;‡Û>f»Ù&ê4¨=8ÐÌÆk½µ¶@#êÒˆûŸ®Lƒ³òJ„,ƒÒtºÉæÙ9j9”•1ìüëÍT7ò ¹œµ–q8ú ÈÊʾ‘㊅R \¦ÊóÛÞ‹j®©]Àã}·Î®¹Ðpo½WëžímœfÐŽö˜ ¸8ªü¨|îz7£ë10¯kk>äPù¢¬‚öÿJÅó­}G3@㱚¸¦‰ŸÀQqüÕ31`Ї'ɤ’Æ `á[ÿ¡Æà­Á$ØŒµ6X›|ëYÖqÀ >’ L(Î8‚|GN‘s¡,¤, ì0¨‹ÕÏäSk 475ç43ÁW©åè µ4µ‚½òAž•ç¹lÞfc l¥!Ò 7fܾqŠ·?RR…é»î;kÙȽ+ç»Ü¯!µÚ‘ŒvPô^qÓ’'Ä^±å>¶WiXäE†‚Í›·¬gÏ!ïEžëÀÊÙr‡eí;‡›µÑ¦h‚‡w{ÏàXË¡ŽýPPÜ•%äQyRž¹òU–ÞÎñâ”æ–öÔ°áu£V@™³¡‡áËjº7÷1-d{4òBt)džÏvÌ e²\|Pí¡æ¨öjð|˳ŽÛ3Ð8¾á¨Ð2À¢š+)Þƒ¦ƒRKÉ‚ZéÞ/yº‚åe‹—-l(ÛÐÓtr)Ó•—4- Ñ=ù‰”§ápâÑä“oAä†èñQ ú¨ÃÔ‰w}áa ¹©¡Z¨1xk0 VöVK °šký¦Õ$Ÿ±˜ý¼ì±ÞáÞýFýFýÏ wÈênSkëÞÉ^Û=ŽAƒ³¡BV?±Kš`‰YŒ/‰gÁhb\á½"ÇŬ„‚Ô M‹ý'‘ýä`FAdQ´1nä4ÌõÏ Ê åÑ—û?pæS@?a'Ê ¶10Õ8s˜ê°ø÷¿fUj)-CݳuB‚ÞóæóÍÊ€çÉ›U ˜.Î@É¥Òîº$¸]7|lÔ8(‹(«]öQ´WU|ÃJVƒþý ýOÝ(ö äŽÏuÊâ}1ATc!y›0"e|%Ö÷HÏU—¡~íz7ë|t ­L§.å˜f­2jÏÔûoë-Ví-¿©“fÒÃtr‰GD+Z˸ BxÇÈ1[à«W—ß\» 2<2ÇdMõ¦´”ަ“³†›ƒ·“`þ’Ùx³á`±Çüg³µÀvy Z+Ý‹=öØ‚|W¾+?†²ïË6ž¹]îU°þÏâÝÔk£‡4x±ÞÍfÀŽpŒê÷høâ‹7È|Y"í hqѱâíÛ)î›ÄsP²­Ô¡t¥©µõxŠárD¹ÆÌŽýræÏ½ÜRWA{¹äQ¢±6P§0øÝÀ­àðŽC„ÝößÿšE;‹“æïB¨wÈÍà0—f›ÌÇ€,_”c￘â9º‘º½º–±;ªOÌ&Ðë†è¿«½TêuzbÆÇÝLȇìÙOçÃWƯy F‰‘bXõÉ#·©Õ«àÖØ­¯‹_ (õË›7­ã¬ûR^xÆÙW*Ñ>­ Õ¤C½¡oO›ý6¾6=@ž—‘2Ó… hË=ßÂSqz(2/žWÜNõ;»÷âfX²æë5­!eSª]Ú  .}¨o:=Öð`RcðÖ`´+µã4*h/jVhê׸I„ ²Á+`)Ø † †7 _ÔË ÙÀÔÚºƒó÷NW€:¿ÖÖN›©6éÖ'€ÅÌg*PT^¹©Ê©ˆ}–¤“ êçê*ã5kñX´äîÈ]”¿×ÔÚú7Ü3`Ër ß@dDÔã±y’{1Ï”Ê4Q1å2[f“ÂEXŠ"i^ûdàp|Ã!Üþ?¤}²lg‘m1êiCÏs½ù>³ {Ðg¹ÿ›×zŠî¢ w¨Ô\Èk”÷iÁYHÌMj™Ò !†¡†M÷_?÷Ãe£ÞØnõºýFä`(Ð~U4įll°®>yTgµ±É~µ®BÈðà&w§C»§ôqu£tRê)Zð}Ñçiïià½Ù+Ê£/X^±üÆ¢ȶ²“|Âtò‰4£1È—åX9 ò.æO-˜û›zö¨?Ì=½à­¥/ÂùF—\ýŒMŒŒÿ͉Ԛß"5o &ASOÓX£€f fˆ¶>F˜ 7¥@(h€ÒHyKzá r§8ijme0ÞùÕ£¡Ç×il8” Êae5Èb‰¯>±„KEì3ÒFúÁíw#¼¢ô30W“×ñ®ÕªIëõ¿ \aþÌN@Ù²£e]!¦Sl`Â&È+?¾Àb˜è/îçÒ²Â_Ð|¨Y¤ù‚ýjo (‡kömíþC¡óÍG›gCHHð¢ X°t·L³pÜ ÄÈ"‹Üû(¯VXæHÌ LWV»ìS·Œ Š~Š»•\.sÿoÏ_æž ÑÂh7/Üžþ § e¨Ò[4§ú<–òŒj¨q86Èõ} B‡‡„Õ~bÞUT$ð“–W-—ZxB“¼F¿ÖënŸ¸~è’ j¡j«6Ãt1²e”Qâ-1Q¼êNõ„zr¼sòsÝá×ÛÇß= Ÿ=¿tÒÊæ°ªÓº [ž‡¨×¢ â¾½ë<¿—ݦf³Ûßšƒ·“ ^ãÄ$Pf*3ÄG˜¬rØoTvr•Yð°Ĝ!ë€ÍÝo«óŽï;΀¦×Ïl¸”@ÅFIÎËKò*Õ7 Ùa‹-¨Qj¦”þ\D‡èCûMÞÝiŒÓz®îEMUµj¤®OKMŸ ™×²"³Û€¾»þ³²"_ŠEböýkOž”g8JE£Äƒ[„˧Î}Áãi÷·¡ ¹¨§ùiù”ÎJ3Q®ö®=ÏS‰nî`žhöƒYCåóò~¦O«Ü¼ö £†uÆKª%„mÿ$ºG.±ªª»ó¸ç¹/»\ö¢a ÜZþET{(œYäP| D[QOTc%E¹WàXçZ°Š‡Àgü“|OƒÏïÞ^ÏšZi”¿Ÿw÷öåžö©m”îP+Ég‰×I0«Ës´ÕY‚ùÿ¡C‡DÑGôá"‘¥²´¡îk8±÷Ts `Ý–9?teÓWÕù®lûiç‡û| 2;ú»Ø|PÏ«ª¼»T÷½ýf!…™ð:k¸¯<@CP ÿ(b‰!d4ÑDSÞÑÔ<¿Ï½yŒ# g¡iŸFçë}ÚõšÎšf€F´”{„˪A®JO`wú3RÞI;Ÿþ,¤å¦—f 5EP¯˜Zyÿã2ãi£Âl"£OBñ¤â×K¬A",M…Çë~ñ9_ËÕ µ×ÜÐ|!ñÁ'ÝÁÆËº¥ÕÝi¾îõ„ßãqÒ>§í­Ù!¶ÁM‚®¿Íbëd×e¼¬ŠyCÆWŒ 7àöªðÀ¨®PP<£äñ»ŠñîS£nR/¨©¹!kföMHÚÜ(Õ ô-ôËô ŽˆÝ¢:C2ºÐK¿Z¾|ö€Gßk-e„b-Jzô¦ÖÚ]¬à >†z¶u½ê¼u-ëÔ :v:»Á6Ë@H¤=¦Ï†Pšà„Ž ¬„y`¶Ûl¬V‰“›¥‡Ïl_½ÇÇyîÛñ°zÅz±eìî»÷ëyp³õíú>×"/5ÿî0[l±ù7íÖx‚JjLŒjx±*´šlù+ÿT»k`wpêàØÊ!ƒ©yBžáB5R9à%’@ Ó ÔNë7=ñdäfæe?gjmý §Œ–Ö&bWôPt¦¸nIˆ`á.ª"ç'|Æ2Ðö2óמ…P»º ƒß+«½–w ÷zÂï1(4¿(K5ã!ôzÈÁÚ}Àö€Ÿõ(Gä™xÿõ$ú‰Þâq0µÔÁs"6 ~-äo-hXpWú´ßVFtëuñúñp«ýíÅ« dpÉ›¥£[œ#pÇ£Z6‡U-6Ø€(#O„A½iuwïßóµæx¿fj-ýqÚ>ÒÚ®ù hùr‹g›| æÃÍýÍ"An•Û䮿~þ*£ò}p®ð_'Ä~Pº*E 7+q+y~=wüÐi'˜ýô'ê’0îÓÉ‹§_…¹[¾¼ÔöÖÿå§#‰y>zGœ#佟ߴàI(ñ(ù¤´1N ÆVÀLæò åÀëê£æ–Üo.q…k@Úñ8È'ä r¨£Ô9ê60.50–c#ãd0Ì0ì0j ¬ÌÐÒ°Êv•ú€ÞNßGŸ…±…‹ÇCÎÆÜÕ¹=;;+÷ dÍù&Ï ¶ô/4]#ÝXÝ1([^aèeÇʤa8”¥‚ ¯áÃ50Ü6Z‚q¸ñcãY0ƪ–jPÇ© Ô ªÒCv¹Zîgñ¼Åt ‹ì»+RÕð``SÏj‘U´×lb£§À¢Ôâ3óɾrhõË#ö‰Åˆ^;>> R#Òü2¢L­¥ÿÎB×J?"×E׎s„’K%-Kõ Œ¢€û)oyä~ˆ`°xÁ¼y,„ îTVë,Ÿ°<þÇO§Y­yGÓ‚• pÿU`7ÆnŸ- ú2”—Xb‰»òWz²*6ÝÉãò†L‡ÈÒh%îäþ˜÷M~Ø}lï>QšXÚRwnÝZ¶ôgôÚ²·Al›Duäû®Ð¯1†çÀi“c®ý² ˜ëçöÓí"lSL­¥?ŽÝÛ#6 Ðþ£6ƒZ4ƒ6}Z¾ßtÈY†\ŒþïRù<—UÜŸÏXÎJP÷«7T#r ÆW!}cƈ¬_àð¦£ãO}s__xhéy9ná”7àíaÓ͙߅o–?]‡go%„õ†ÂÇ‹nϵ–ÚE}Ôëj¶tÚÑ…>”{~«±¢_ ÿŠ kºü=1jŒ¡jkÈrÈ®½ >I²Jq‡ÄI)+ ¹yÊ¡ôQÝ'{^N7ÈuÊ;•ÿ4äÚänÌk ùý óA÷®¾¿>d²Ü/Oœ*ÏÈ] wÉOÙ8Чy ”OÄEa¡%b9h½´[´õÁzÕK7ÐNÒ~¥ÝvWm“m¢ÀiŽ“ãupìæ¸Ï¾58µv¸á0œÞsêïМ?tîø!¸ê]œçƒ÷jϧÜëýçöÎvN¦Ön ÷bµÛúy«ãÐ<²éúÆËÀr‘Eº…%È©|Äbà;lÐQ¾KÜ¢ZÇj±â;ÆïNj ©«Ó®d4 µ©uP–m¨m˜qß&„'ù@þæ‚È© nSãÔ1 ,WWº–XÜ}Éaòeù˜Ÿ4Çì+ðiæìù$8e9ÚO±DLÿK(@·8¶l·™µÚøÔ󌂭om·YÅ»ŠóKÍAé¤4½¯¡•åúÊ^òˆšÝ2ö1È ÌëžgO<Þv»¯wꯑïY -ø"úD%ÇZƒ¾O™¦ìm X,m€z„R§ ¨H(„ÙÐpL½„áà1ßý˜k,/w<ªÁx|-¢šNläñßv{£ó3pã«[óÂm ¿]AËÂ$à§9ÿ_Ͻ˜c†¿­dˆ.â|@=§ž—ƒ@÷†î]ÝPjYú^im(\W¸­hd=‘ýcÎËpmâͤÛó`‹²mÉ®&à•ãYÏã84lSÿJÈ,h1¶éèFÐп~|Ýóà¦qÕ¸ü««rÂÔ1Ò3j ÞJ*°Rtè+,ÿÝ€§þ"ƒÔ#Ó*vP‚3D¶Ê]ás#'Æä@\DBÏÄ å›µ4' ÝŠB‹Ó p|Ѫ¢éPì_4±ÄJ›éfè²A×H·XïºîúÑú@ß\?«ì"¨ýÔ Æ@GÚ‹&À»t!¸@1–€ä8*Ї(€Ù)÷0Ï*¯€ö[­·f<(qʯŠ˜6³Ð.Ë^C,¶ÅO—ÍÃÀ¢ÈÜÜb,XܰXn _Xö±ø ¬FZZZ¼6‡­#­ ÁÑÏ¡Èþ pÛìö•Kx,rëç·Ü—»Úç'ÜÆ‚ÏPïnž/[–«êrõ÷Õ­\Pv+Ë@c¥¼Çeø·jø]´¡U³|NyÏô(_C­óÞ½&ç™\3({´L-{Ä qPlÿËÍýWDц–PìQR»¤$˜òeÚPÈ›ïœnÙgÛ[šN_ºn¥ŸëB!loÄê¨g@ÿ½ÞR¿hO{ÇIá÷mÉ[ÚKOY¬6Yö³øBêG…‚ùdóóÊMJ³ùã†'ž¸ƒ¢*B¹µó—ù—€ÓÇÇ)PôfчÉ;ÊÕ¼wWc*[ÊŽò ˆx)êpìë»4÷üºÇLôè)ã·4\ÕMɘ’„Òç zHìöø¾PT¿ðÛâwA~ ÷ɱ ÖˆPQ•†n¥’A&Y Nˆ£b4íÓä׆óÁí9×o]ÝuüƒnÞ#ŸU++­å£ÐaE» ­ÚATXL«¸Ïaí÷ÿø:àƒ†¨G0ÜfÆÿJev’–¢MËÿ$~a!,„9ÈÃò(' Ø©¤Vi­):^rRo¤ÞJφ¸€xϤA~1bw´+ó8!ÏN~î3]×BÀ ¿´ZêÛÔkòÔï:*$‚7]ñ? Ê>e·²žß7tk á¿DÁ[IåTaè팣!æH\Ï„EöBxVT,ÜÞ‘ÕâNÆ_Oz’S®¥m„¤–)ûRCÖ¦¬!9?‚®­®¹>”fÊ;b8ˆ:Â]A´ Ä ‹âà®0Ä÷ÂN|ÊcŠ‹r4fš3ÊÀ)NÑ8õdw\Ñ2èI²A®”ëe#0F­ïÁÒ8ÛØJlK•> rŽ|]ú€|† zËÁòQÈ| ²‡l&/yM~fãÌ&›¹½jo7:,µwGÕ!ÀÞ œœ]–‚Ë@çÍŽ¿‚ë×..MÁ#Úmªk)xÞö8ïž‹=?p;ZOÍ9­5è.ë'éo£-†ßq ?S? •IÅf!+o«ï-o@£GÌU!êRÌðØ-½3»yî4ÎÕÔ?Vn¾éÁ$Ñ {''¥Ì‡ø ß'O…F4À~¡éÔVê®{_çamÈ eÖe¾†2`…!uñºŸ›‡¤QZH°zÜ*ɪ„Ô]Tû-ÐZhGi?«8h6ÿ»áS‡@ü¡ÎSµ? 8.µËC ~hÂGIŸ‚æœæ‡ûª83ÌÐ/ñ*oCb“äR†@¦WÖΜÇLÂd†n%ùQŸ,…[Ü>9ŒûÕj PH;þ‡Xé?MAE«‰Œáy0w4ûĬ«]W'—Gœ.p‚§L§§ÿ™{úßÏ|Fy …¾ú^­º5ƒ¨)ÑCã¯À©ág.¬UQ?W÷‚°F‘ÉО‡]¹#L´mh|ÊûSÍ«¢C¹~”'Àhc|Æø¤­MŸšé )‹S·§½ ¢2^éöì†Úv¿^çz_j~‡}çú¨àïìÛß' ÷ôô« µgZøý³ ý¾Ç®í?⿺5ñäŸcðþJAç‚ôÂMÕ4&>~Ülu{pø1¸6å†þv4\Ÿp30|DŒ¼c º“úWt_‚p‹þ ôQ²” &Š¶â °X`1À|:`ƒŽ)@ò= úV<Žï0’>wýýQ:ü¶øû¿l>1T&¨CmAÌ3Ä]›ÙÄnêb ®ŠÀç\¥ü§wÅ!ǘláu(agJ²•Œ—_A^T^Ÿü!7<7=Ïò–L•?Ë™2Ôk2I^«¦D3Ü{¸nvYÞ£½zx´Ÿ}Þ/yö‡~ýínAä ‘7c?e«¯QÙR“rÏ®xíÍLmWhI³«À¡Ÿì?~2›gþš=”eŸ2™ß:î*£¢ÃUÎ+»Ä—8=ù`êˆ[,ñf¹ÁZzªŒÕ3+/MZ:±ôœ¾/Üê~,ò è‹ÊlË€XÌÇÔ`sîC»X`r‹< o€•Öò‹­P¯qÝùÁßÙmsM°îOžCÁaA=ÌÁ9ÓéGG¨Ž²¡Ú0ÓՔ'ê¿1ƒ•ýæQNrŠV7( ‚¤K)ÛS?†‚o Gõ»Q¶·lª³Â^e¬lEéÙ|«‚Í…›áfç°¯#üA½¦NP=€4•©:qä~yHm»&|ƒj5öÊßæµì½rÁÌL{BÛ«õs¿¨ìorË Wåº2O¡N!¯ûÁ³Ï i<`1dOÈy9ç „7Žls ³ ¿ @« øûî©ÐØ)~k@³Sóƒ…Æ\y¤£Ìä ¦–GÁõy7ó·ÂÕÇo„ßfg´=´CÀ/Õ÷MŸ%P7,x_Ðx¹RçxM8àç>oû¼ìùÔºå½Ó+ <Þuoìúå]rüÿ<ÂEñÛæÉ:_ƒ÷ž齆na‡ÂSE{ Ñ-yPŠ\yùÔu88ùÈíƒà|ÆÅWwBOá…ÍAY«Ø+cA|$º‰Á`vÉ,Öl )XE3«ÙÌâ ©/þ>P9S´,÷x‹wÄ;bâ˜8ÖªøÙ³k}Ñ N>×çRk°íiû¾ÍVhY¿é„F.ðÈÇ.µÞÍF5YÙ`2x}éiæ±lv[w¶þ,v[ ;sv,xâ‹|˜ÓdAÜÒ`¸TrÅõÆнª_¡÷±X|"fÿh +D´¸!ŽCãÍ ¾ª×Üw»íuñÕ\ú©]«QŽúÔ§6Èíê& d,ϰÈ2ƒ˜^±6ñ?%”PZ}òä÷,¸U˜—#Æ4ÙM>£¾Kùîl¯ûßžœ£~¡n‡ÎÚ­†:NÁënè(šŠ*hÏïs¿W||À«©gG÷A _“ïɯ«NŸâ¼8.vCüž„Ìä' Í%]—ñ?¤W»ßd„dæfƒˆ‘‘Gbžu“ºIn¢|óX&U¾9LÞàá x‹Z"l¾²ic­@ãÀ†=C{‚M›ÅÖá¦ÓOuaö…Ù03- ýìéiO> cF¾øóðhÔ¬AHhwÐ\Uv(ó€QŒ`0`¼Ïy£ÿnT¢9ä$@2È%r³< …®©…'àXÇSßž] ó—~úÔWóáµ—&yLo s}._zNN:SçBG(´+|§¨êž3ìžæYÆð·7t+ùû¼dïÈžŸ›Û3vuߟ S“g=>¿+1?–y ÈÝ‘ûVÞG`lm|Ú8˜Ï§| 8üë̵†&ÄÉòl w4\zܺžtª¨v©FA*¯+³• bdôÌ|&;"œ£t±kbJ(ùË­üaò­ ®l„ðÐÈ'¢çÚS}A¾øQKøÜÿöÔÙr©ÜŽ£.Ù'CŸà‚¦h*j‹*Hïççî›í³¼.z†¹çƒ:Q)Wýõóþ.ß‹5â Hy4í­ôîú\Z· *l￱?óV–"ZGÕŽ ´c[u­À9”gã°|Ë2ÔbÔŸjQǥ÷öC€MìcµéôSmŒa$ÏùLóGÌÂàñ¹]Ÿ~äxóéñY£¡×‰M{Ì¥ùçfw'*ü‡\™Ê‰[&Yä€t"¦PöfÙ.PªÕÖåBJ»ÔwÓ‡ÃþS]ŽêaÖ¹¹Ï/j “ýß øh&xôð”ÏCѲbË’M}QÕÇß.¤!|t¤6züàûÓî=§a¿ùÁGŽ:C’uÊžÔZ ûÊEr pHì[@4 E}î,­Ô„(Ôð0óëù êòbíÓàyÍcˆ[KÐÌWº*v ÷È·9¢—èZ•›w*GÄÊBÈœ’å—u"6F~s°ëá†k6\Fe”ÇœšAÁ´ÇB7‰¼³ T:\ Â_øñP‹ûcöV´'Q{«ãÁ¡¹ýLûá²(øíÀ ‹Ðª0xýçùFûhÁó¤Ç‡îé ~ êÔº€ ¥€áþ¦‡¡„ eM˦NBÊ·iC2jAz«Œ˜Ìsà~Îmk½û¿Q¹¯"¦8czæºì11'j_¬ˆ|¡âK¹¿PO«a2l–Z¯³^ -4Kil–ªE‹H`ð&ÿ˜¥ãJ,YäY €f»—68.νëC=ÿºvÁƒà‡:?Íúy-DnŒ·„…"”ŠüÅ„”oÂþmói å((Àgœ@¼ †‹AüÖÿ¨Ô¡ò¹u*.¢6EA%!«_öÈÜLˆ[šÐ#é8òÞ±Î'ÇÀÀ¦OŠ^«¡é•F›Ló¯Í›å¥è1–˜ÿ¬Å¿‡÷Ò×W6^?«¦¬‹Ø<¶³{û~ˆËK“8dŽô AÄ‹0qDêBÍ‹TÃß‹´¥%Xu°¼e9‚NôknË\£\f€üR®S©>q”%ÊtñdMËž{¢b â_c+£¿ñ3à4§¸P Wtü•d¹f_ÏÉ‚dŸdçT{'ä™ ¸áŠËýkV~)¿‘«@;CÛÇ,\¶¸luújÍ÷vðô/nŠ“÷ÿr6;Þvø¼öx®tOë4ëÏ­b@n—»äþ*ÐoÅ6-ñœx\„@êÆÔ“éÍ!¡Iâ')Õ:S™&­‚Ôzif‘œ“’ ¸SµªJ´å+rµÜ'oƒMŠÍë_ •W‹·šìóÎæÙæïߣµ€¡ûùäSæ½Í-Í@ð ƒ/ÁSŽO>Õk+¼±}ÜÌQk`ÈØ§öýÜN¹LunÆ(cœj ÆvÆ¡ÆE WÊ5r+`õ?:æ÷¿Q1Ñ=ÊÊÛÊËJoPÜQ %%ëJ­ ܹ=º-ì-þå‰_{ÁgO/]¸r ¬ûpSЫ ¡sâ…äsüm ÝJƒ÷wÒë\p¾ôêµ`X7iãåß‚}×6?Z Ò3B2WÖS¯ýÄsb°À<‘5~Üþ®Ü5 Öm²«¶üzøzøä‚š¦ªjÕ6ðŠ}âG±tt{tõ u_ºSÆ;j“Ö=ãÈErmdX\*\ s’ÌS P¢”ö/Í–ò5«ù- ÉýBž’·d8¶tìoß|»ø¬÷:f¥f3Íê=éJçûx•žì <í<šº ¯-žgÝÓ€>}:|~õÞå¹XÆ^¦CÙfC”¡!¨+Ômò$PBiuîxè¨ì‚ $”ÞJQ45ó5# p\Qiñ)8åwæÒùÛ°¾Ù¦q?Þ„5Ž>ÜZ—ò¯ö¸1p&ôß®©W öƒo»QD1`ƒ Ö ËMò¸ínµ Vµ\nóz8–}bÓÙ=P¸½È½¨hSµ{´)OŸR`ꋸÿÈË\ç:pZž•K\äpг\ˆ"¨G=jÁøáøã‡P‡‚€4õAÔ!vØaGMhÇß„º£ë|VûWð+ô-ñÑÀÙgÏk.·­ø°:âšc%wQ*nAÁ‹……?Ãíá'"g‚GšG¾ÛТùª*’5¤gZeÑ¥±$8€h&êˆÇxnWE“ÚWŽ”³ÁC¸¥¸zB`ÿ[¾U¹ùõO¶ç!·Ýn‚Ž_¯Zæß?Á"©5ˆ$qI$ÜÿæÅGâmåH‘š> âç$~Ÿ\~#_¨8¤R¿U2ÁJ8œè› qõÞHšJoå âü€¬Ž _ê$9[®—Ùãí}¡AJ½Ä_Àú«MV͉øò~ áªÆâžRÝ•ùa_â9ž„ÚáÔ&è' Ma«°æáè—'Úž®3/û^‚˜°8³„1šöAÆ3P0°àƒÂV B„§(å=e”2Hâ,ˆÖ´¤ w*þÓ©|=ñÀ ”g•Þ ?³ç!nUü‘$¶¼ú£Ùî£Ò"uXº<ÛbH€}ÐÒ»Y¯Æ{À,ÙlY/î<Ï÷fÇz@yp_½ÊB •†î@ù¼œ Éo¥¬L›«–®Ÿ»y0œå0h¯jwi瀹½y„Ù»`ñ¥E;‹}`^b¾Ú¬?˜}¦}Uëš¡šöštPâ”CÊR Œ[2 Ô'ÕWÕÏA5¨.jP›¨ÝÕQ ¾¬¾¥~ê"uºÔ+2F€ô‘!²5ȱr¢|äÏrŸ®>£¾îµÜ{º,€1þM|«qSˆg+÷ÅnÞpÊwµÏnyR‘nTÙVø 'QÙ­rló¦CòÚ”+iÁpÌpÝd“Cî}lðžëHèŸ41ù}ˆ³Œï’ø.(/*O‰öU«cà·]-PÍÕÆàRêÜÓ)š}ØtCkPžWž­î:þŸjèþÿ¥B¨mHÝÚ}atØ‹9ÃÀ ûEo,…1s_üeøaèúxgß_@Ý!“j_Ï MîÁò¤e_‹ï€L™!Aí¥ŽP§¬#›ÊN ·É]r/g²Ê)+G;FÛCcÅ %ÍK´pHûëÍ+á³öKŸ_Ù.d_j|í(-ÕõÔEi¤’ÉC÷w”=¸¯`E~ºJ2¿Ìz=ç4lõÚöÍîÏàà±#µO\…‚Ç w}J¦¡ìJ°%ŽÊ „Rt@4±Ä߉­SÎ+¿Š/ÁÜÅü†ù `ký²Õ&pHqè`ßœ½s4‚ë~׳΃Ác¢Û«®Qà;Þ'É{(Ô¾èê¡+ëf?Mš7êÞÀZîjÖ»Ñeh’ÝðËúßAý‹õ4!žÚ.äÃÚ_@íäÀPÿïÁWÔZç}<Þö˜æ¦ׯ.œo€óD§¹ŽO€ãPÇï‚Ãçöavñ`›i3Ìz Xe[NµŒó›æsÌ€æGÍ"Í+@'ºÒä1y’³ /ÈË\"ˆ"H'ƒÌ»ôñ€¿ =ÓéC/8ãgæ³üZÖ: 2K¨‚ÍS¿‡"WB,ÜY´ne…{F•qñ¸1÷~6ô¯žÄÌé™}²Ó Ö)®{â /Oˆªˆ1-.O³&ûʾ Ç݆»îÿþV>;«V·wãqÃ]ºõÿd¿_k½{ÅJªl‰_´Íhj˜ÚRuL߬§sÆB|~b¿ä7ãœâüýlð_ïoâÓIçS¢ !=qBÊT}EG\µ: –8Û2‰8pÛäú©³%4¹Þ°~è%1⸲¶äø‡àuÍó’» 8ݯkÏðÑÕ·ÞÞ‹ä¼àÏÀÈϯò8´mÕòÍf€w²×j«`ߨ~¾ÝW`9ÛÒÇòcÐ5ç5k@^'Œh7¸E8wdÿtOpe e;¡9`XfØbÌ‚k-n„Ün óJmûj3Üøõæ×áË@ÿš~_™ß]ßÀcÔø†b}É+¥îpaÂ¥vWçÂÆw¶Úí0ƒÂf…—‹¶gÅM‘4§)xp ¨Ê¤ Î8_°™ D+§•­ JÄ11\š¸|éuxBg„ Îù^Ÿï®Žà>Û­‘ë:pØb¿ÊîÐÌ×ô×Ôñx_| ¨\A É\±N̳A~'Ÿ‘¯¯QŸ™ WÊYr90’LùŠ<É« ;ª›¥[yVù-òWAÞ”¼sŸ@öâ\ë< yÛóÒ šCzbÆ3™»!åÇÔœôlHi˜š“¶’Ö¦D¤5Ìy™‹²ú@YpYŠ¡9¨7eœ,!wK7yÒ(@–Ié LàfÙd‘ÇÿÂ<¬ø{ûyÕ: !mêÈ Ú¹?úDìæòÏ4OW}ûÂE˜‹B(ÞVܶ$b¾‹Í‹‚Bÿ¢²"o°jo5À²p’m¸ V$WOû0crVHqHÛ”þ9(í• Êeî{½7¹Qþ w‚Å‹ÞæÀã ÷×ܾWÅY:­zýVb9Ïòy‹XðúÚó¬û`ÿƒj3 Šzu-ùø‰]àþy+Î#Æ)/ŠÇ {nŽOnD/‹)‹ß A‡ýêýèÍã÷ï: ºl*jÉ)nis!ÿýÂ…¿€ùÓffŸN8âPuzV³d±´»ƒvËl&ƒ_¬_ª<_ô(vŸt ‹hÀ¾*²<ÿI%š‹w†ë V›,„:)µµÀ?È×Êg6 ØÛooÏnútjƒô†pµÏ1·ù+_q‡«ß\Ÿ|k$~œ<15ÔH5NÍ5LýH]òGyX^¾bë¥èùçKæå…µÄS¢¿è eɆTC:DuŠJŸ²dÇò®0=ää - ndˆUí$Á”TEšÇûÅoðF:G~ó%¬Y¼!hëÓ=÷L^¨ƒÕ+2D Ñš¦€D5©¡«T¼%èÑl([Éî \„"nÿ{çæDñÿñ×lr¹Þû×齃ô^•®4AªŠPÄÞDl(** ¢€ŠJ‘Þ{;¸Þ{oIv~$'ÈOýªÜ‘÷õ<>ã…ÍÎgf“Í{g><÷{¹ß#n{·M t˜ÚöÖc¡Î/uDî¯Ç=úºŸ‡™ªƒ 8$8̵ì׆ÙÝvQvEv'@TˆCâêÚÙðW¯$øc©ÿ½yëª×`<_\õ÷)ÆsõÊÓK°Ô¿ƒï[`zÕôŠ9L1æn¦·Á<ÅeNãI£¿éI¨¨cœX±*Â+î7þ å=*ÂŒOBI’ÇJì Ý9#:«%ÄFÇ'%:Bl“¸%‰?C츔â–$,Jì ¹OæÍ+h¼Ïýüøàû[í5*#l|è{µ\¡Þ²Úé‘OÀÆõ?ºmtŸq#Ò$‰–¢Í@í¥NU—@QZñÅë!ºÑe;Ü{¸ýâ}%¦ôzIßœ±9k#¤|’²3í ˜›š_3çƒâ¢8)Õå-3d±4@ K€ÞïeÚø•ÿIàQfW߬^mÀïÓ]yôúÊs1D¶oö=œ.<ûé…BvÒ]Fbñ©4T]÷ÊñŠ˜9[sFæ}—ƒcìâûB¯˜îÃ:ýZõÃÍŠ_•ð¤õK(ó( ãaì°,0xRí[Öj¡ê¡6‡àG ÆA£Ðúåu]lâXõõûŸ§òºŽaîì¤;âˆî-K븙\{¹¼ Áýƒž†Îµ:Žm;òßÌÛQ0 >MÚ–R ÇžJ:»ŽÿtrÜ™zp¶×ùÉÑg ¨¸hnñ‹@)a'ÊE"ˆÅb¡˜„A˜­'ã`]°N–RÒåC+ª(„Ó›ÏöºØV¬\Ýf}Ü{z’ÝØV;„àÝü¶ã…“õ‚ÔjŽà­Ì©·|‚S§½”ѶÏù¥×žIpêÇÓ™çOƒ<$–ëAlÛ¨åÆmK¡ë‚ Î ÒQú‚ºO]#í àaÿQ¾§¡ÇÔ®ßuü º<رU[OŸæ]ë¶òðÛ .N.eΙÀÓWó] >sH»êõ«…nUA˜¬iÙ¬5é•ÊÇÊ#á¡8gp'PÏúKZ¥+ o¿ª=À€ŠÆcŒ‘ÐrSsÇÆû¡à|Aߢ (ˆ(|³h”Pò@ɃðCËŸ|vt/.íþ'صӣÿц×óÅý5·t×ç!Ü%ìbÈóàµÕc§Ç(ìPôaQ`/8Lõ ßÊ•ÀbƒøÊ>+/,Îv8½šnjôcƒÞ`˜bP‚7åëÔÓ‚侩ËÒSAèÅ" ˆfOu̯Ü-OÈTYüNÐÓtà÷þ_\ÿyÿ6×\7ÏD£»Ô~,ò…ð‡àtë³Åê™À³T¹à‹•×”!{FnN^\¾/Ö)¾à…ûï~eª(„íÒO1+ã_€4§ŒG3ƒò«8§lTn¯Úµûk¨Ìsz¿ùuu¯ êp© "ëuªÆ~5,üÍß;e²M™ ®–Ÿg\qyÇ”þø‘þŸ…¹Bãq ëÕë}ïï9¤k¤ŸÌÐeÎèi—SâzÁ¹©çïŽîgï¼°(ú1Hœ”Ü2õ60õ3Fg‚¢WR”ý ä*”@žHg@4§ ŠßgQ¹éP­ ‰µ-Q…ò+¾åG(mTv¡¬luýùâîphôqƒ–uŸÏÃî~àö‚kžK5.X³æ^ýï£ûNÍ=»âü—°Å´ãË]Û Ì»ü£òPPžP~T¶ó›Ð´™ ƒƒ%êÔ¼Ò¼CÍÇ‘ØOfç›vlØŒêóhÐþá6²Å£u2òlØËלcäUÿ_B ¥üý<ƒUõ² ÝÍŸ$R7œ6|a>xã…µµ¤çy–YP¹î•螬O)ƒ•߬ñø&àÆ$ŠÿÏPYÂ׺ôØ2 Ð/ê^ªí1ŽÀÜÅ$ªOðV~NΊÃb;”¿Xî]ág8—|±)”­ð4¾.3¹´z/ÿß%YIqO+ƒäu)Ÿ¦~ b›øTéì`!¾U?ù”–Ïu ànÍ›Y]Qý[øÕP>»\_q.l‰žt¹=”.Ý_*À;’Bø×B·’d]ŠSZ.$7Oév(C•^¢àdTøî§)c!D 6~ AK’ü,óØ®ê{û߸·qßêº"ãà ú^ºÆºw¡¢D§ZÒá$U¶Ò+zŠ®tµ‹:[ö€üòo/øâFÇwLM\]jð èèþÝïß'|Îj(ÛVÖªü-H˜–x_Jä®Ë˜¿„ÂXÍûÕ9¯2UI{ðëíÛÍçoöC­­à¨sØhïÁ®’ÚMÃ?ô•òzÊó¨Ç“à…'OB3šh˜æOÍ!îóøáIKàâÈK¦˜~pñò¥u±±¿7Á9é{H©íÓ€äÃ)/¥~™†¬²œPqwÅ"c<(}”Š”óÊñ%ˆÙbº˜ŠåAÔ‰++«5 ÕúùöÇ_ÐmÒ½«› ÇfžøêÌØ·à@Ç#÷AýEu§E=^»={̳µÑW¨AÚÛ‘¹Ç~8Ù ªG<î jSuºú:Wö&n4×]jN8vvLwl};ôhëS]&<6ú.èöEç·5=º"ÝWã¼ÿ5®w&™db)–ð_œŒÏjŸ¯qÐ(ºAëº!`7ÈÎGèOoºóÿÄW5âAqŸ˜æQæ'Ì[ í¾ô®™Éæœ>##Lùæ^ægÿýùM:SÓ(H­›6==rfäÉ"Qœ«a@V— ×ï\.8{@àK§ý:ƒ£tî\}óø¿ÐmÓMÑE€ÿëþ‹|Ï‚÷pïþž:«Ä[bÈ3œ'º ;´® ‰•‡Åp(ÚTÜ®Ä.ØGïùÌýÕiæÿýée¦,“Ž8"© dFfEålÓvS‘ù!ÓÄq‚U_ÙD½ê4®ýZDÔ.Žœž}ÕÿÕûú­JåŒU€ê†ë&èÚBÔ½‘®aBÿe}<»_<0eR <ûÀßOoÓ—N[<1F~=ì½;^ƒn[;}Ñ~4 ¨Yç!ðæ{w9(ÊAåSP{¨CÔ }d¨l\&–x®¶º±æó­¨gmL€}[†é‡æÝtâ[÷ÿ©1‚WÝ«Q÷ÂÉ)§=Ÿçß»8áò³  VZ*••ÑlñÄSY©Ä×úD3B×Oç -W5¿±L*÷ÐÈh¡kúr£§¯»·ÿ;ØÁ@w}+z‡VöÛ7‚ˆ)aBFƒo=ïÝ >/‹i /ML5`gÝâò¥)uÁiÎ0à\ã .…¢MECŠýÿýéžH”Ò2¦gÙå´ùŽL‘;:„^ ã±¦× fy|Tï~^U)$¯—1N÷8í‡zîu^Žrý4};°F®“ßU}J'ÑHøCQûâË%‹à‚oôm1€:ÙüººáߟW.‘_Ê_áÜ€ /%C^Bþ‹ù@¹¬+ùÓJœUF¥/âór¶\u:D΢ÆE û©ûÕ°-•0 ÊßyñšíùŽG{èOWç€IDATؼýìÖ«ááSÓ\&®ƒI¯ýøl#xöÓǧo‡a·z·¿34º·~³:ÝÀo›ï¯ÞÀ¾ƒ}±á`.sxä‹ò5iq0ÖH«.Ó­SÞQ¦À™áç".ž„#'ŽÆž©ÙÆ}¶6ò 5Fð^hó \î[e Êòˆ€xM¼(l($åy„ 6Šuâmðéá³×ëa˜ÚqÂccB¡QjSÝ[°’ÛBuRUoÀ®Cèhü3ÜrÛãú ´Èhº¦Q*è·ëßÖ÷Vɯä·7À€ît£#˜™;ªÏÁùY_’P´µÈ\|imb'ǯMü²ffwË~ÄGÊëbf5Ž£”RJ!rB„[˜|žóÞîõÁõŸ¶ªpzÎÉϱÔ©®9ªt³tCu®À—|ÍuÐ?C4Šw- ƒèÝ—o‹ SGó$óÊ^u†ú¶\ç†\xèräÍÉ_°ćʫÊÄ0‘Ùä’ Žß8x8äBd§ˆáaõ `«ÿ|ßn@ÿ7~øât¢m¯¼ìjrí2Ú6m} ÙÛð°ëý™zÂâà·£^ˇ™w>øê”û¡µ˦aࡺßîÖôë:éô 5¶`†xQ<-†²eßT¼ G]vUàôº³Ë/܈G“#xw=ÙøL>ć$ŽNÞb™ò¶ò6÷m•vxËÚà4Ú1Æñ6¸³ûüaP¿´®9*ìî°óÔϱõìÝ„Tð ïCŹŠsÆÑ úÓOô°µQÿÜîvûÁõ3h±ªùäÆŸ‚þ¸~…n °Š/ùöЋî¢#¨þæÎæYp¶õùQ—&CáТÒâë(wO܉ 󑬮9g@Y*ˆ‡ªqe–DíQ“#ÜCïg¼¶zVGa‹‰ój箎@ý:õ–×^ ú×tSôá WóUµÞŸÄñTÜSñq…¤lO]~7侚{{^$È>rŒ¼ïŸŸ×Øo}ÏD˜—ûò€§²à¹]O¬í»´íÕò<èûèOë-jMÔHqkú1åWeXqGâïM €#NÇß=ÙÜÖÆ]áÆ Þ?qM8?÷âó—GBÚœ´m/‚¢ˆte76seŸÊ•òkÐ-U^U€ß]~S¼W@¿²^³ºõ¯žîï]õk£Æß£âžŠÃC Ü¾ü© =0Œ;ª¥ä«Æâ6Àõs—$hîÕxuÃ@p˜oØi¿ ˜Ì@F™äVE4ýŸ!Z‹æ4óa5Cu‚¸þ å‰û g}î–¼ëH³+Î)q%dê³Îf?ÊJå}eV^y?rÇ HHá ‘Ñá¡§À»Ä+ÆóF¦#û8Îu,tu¾Žœžö#í_7L1‡™ ¤‘U¥%ØC !äsòyù”~]Rv¢Ÿ‹y/nTœ­hn\ý÷O§6R‡ª/Còc)mÒ¢ cHæÈìŸÁØÖø†1Är±X¼YXy½ße1K¡ñÊë¾ÁÇǬúƒã44®æÚ,×|N„ðÇ ÎõœÞwLÿWýž÷ †S»½Ù± à‘Û§9ÂÃ}ï5q;ÔªôVÀ ÛÉÛdÛåNöKº<›a—¢SR•=¶6½<ó8÷ÆùO/=æóvµ pˆCœ°™7^ðV>™ôa wCÁœ‚Ø¢.|(Å>í}VÜ»ØÂATˆª¼ÿCäOò€Œ—g³ZAëÃ-îh* hEÐþ;@yF¹WéÕôI:þeøñ“òÛ+Nï†òŠ+<áâúØÚªÿÊQåe>ø·õîsÂóÂ? ¹  ÇË)rF5àŽ;nÀpÆ2JJ–ê Î'~tâ»P8¦° (þoœ§7ƒ ùë Ž€´˜ŒŒ­PòF‰kéq Vœ»«ÐîTÒHÑN4^à×ͧ§×6ð3úÚù<º&ºzÊùjœ·ˆ€ÊÁãgh·D¨UüqÀ4°ëlg´{ä49S>W…š-ùÔÅ1±WümŒOÏÃùÌ [/ÝåuË/ÿÁ|Æ7L¿˜8_|ñÔ¥ÚPÔºøtñg‰#!ˆ€j˜¸Jaâ‚+î ¾E.4^Ý0·ÞYr 4ûýn¢kÖŠ›FÍäo~Nœ‡:¥:EAƒîõž®Ýî|oèÞ‹áþÌÉÝï΀Æß5 ¨wtŸëÞSîYKÖ“mgk+[ o­X%Þ‡²…å—Ê߇´œôÀLI‘)Rï¹E–q¶³ÏfMý@ýRî€ø¼ÄדÆA®S^Bþa0ÿª^VóAô=èbì¥[Ô‘ršœ ®‡\#]ÚCÇíjó æÛ5^s¼&tÿ1oWøTt‡ò{*ŠA ¡¿¶Â{¸ÆÌÑä°×¡Zön6 ñjpLq˜çRHgúï»ùÛè­ßŸ4b8û_rŒ= YãsúçnýÃùP]#wAlxü§‰9÷^Þs@ýQž•É ZÒŒÆUg®<#Ï Š»R œ„Ú†H¯ð3àÖÓm­Ëš«´ ?›qÍJ’!ÃpÀð(Ô?^·[” 8ä8|b_2\6«¾{±^¬K âB…Å+p¾ÇÅ£—@ù¢ŠãÆî1Oרmh|ÙtÎ,>ûâ…vPúQ©(û”6¢žðáJÁ¢ª&“,r@„ a¿Bß½>m!,7tQ­0pÜí8ÈáñjèWC,Ùr® RóyÜû3¯Fpû·Föª ãÕ1 ‡{@赂ƒî^]kÈ{åLù¶Ëëˆö bÄ^q ‚ ß-< —Å쌟 êùˆ|ÇvÓj3©&?‘ß©{ ~~bëä\(^’^2”'Åd1ˆÿwÁoÉ$“ ¡Ã n­]Ϲ&_52×ûôOéoו\u¼ödÿ¯(M+½¿LBÉŒ’’ÒEÀ#<(¦ØÚªÿ×ÜíÚØß­Gµ,njGÕñ#‡»äI™‰¥²Tu¦Å©´g/9 Ñ/5͆ì­Ù«s=®:®r'åäTù˜úD>ó´*Ü\ô(ëÄå9®dY©*ŽsJž¥‹©”C½euWGW³Ë.W/é~_Hç†sÍ}É®Ž]ÝûÐàh½~už/û=öí@zË`Qõ÷±Où˜7Á8¶bQ…K.?;J·•µ/Ëû‹yºÆŽŠ7›f8]zîäÅr(¹»toés Ü„"ªÑåFž“ˆ¥‰â¡dBÓ©Cêûo[o½×gWø'ŸK ë¢2?ö5€NŽ_9¶þ_õNêî ƒ¸ºÏÛàyÔã˜{ȧäãrPn£¬ÖÑTÔ®P<¬d}éC°Žw:`ÿÈž –ã¸Rb¼ª¦kª˜$Æ‚é%ó'æxHMû&óyÈZžµ!g0¨¨«Ô¿ NœÂÝŒ‡ü¢üW æBl¿¸€Ä P~¼¼mÅGÄ.Q Aw¿ îÕ'Ai¯D(ZömîÙ¤¼Žz:xä^uüuHÑÐøKþäAÔÞÉ>Ú0F·»ó‘ÁŽÐ`i½•µÓÀPf·Ô®ȶ²‡dC³²Cl†2÷²ùåç!óɬ}ÙK@ÚIŸ²sø'ØNðJéAd(YS²ÏBYbÙÔòà˜Ø%6ÚnB¤§ “MÁi‡c3‡÷Àÿ~¿DŸÇAé$æ(¯Úή[¬Y[rŽAæ÷Y?e_a¹âïølV'–èWËŽ8à@+XÕˆûÄHq;xŒðøÀýÔy¡öÁˆîà¼Ö¹¶ÓpûåY5ër– DCfXö€ì:%}kFß4&›B®6ø÷?æ¦'Í{ ºûåqÞPpga@Q8(w‹þ¢iÚ—G>ÀýLãÁ°Ýð´]Sˆ:qoøhpëœâÔáÌÓ¿D¿¾Ž>"'E m ®N®³]ö€ò¦x]< rÜÇ*ìÐÞš0?'ô`na.5Aôù˳cÇC‘¹ø‰’ÿüí¥£Ê¶•=Ñß\÷ ”¬/=V¶d}!;QDV •cI?&žOŠGÀ¾Ôþ;C7hZ»±_ƒåàÑÌãq·ª|ÒÐøˆ®¢…ðóî ÝöB÷ºÚw¸Aæ@7=˜Ÿ1¿£VeìÂ?µïQñãÁ4ÏtÄ4ŠR‹—•à1ž• lg—ío;ÙU†œ¯sïÍ? åK*â*î±’¥¼e» ‘Ê=`ÿ¬}3ûÀk¥g¶Ç\ˆ¼d;»n5²ff™²_„Œñ™Ùó@HQ.Rlh‚@rÉ'ä&ʇ€ó\à’­g«úÑÕÖ¡ÛÍ»7õhô x¾â±ËýP‡É{åk7À€J_έrk!îÁ„àäq”öbúäYUó¥A¶‚¬%ÙÓrM¾$㕬¾PaW1 âˆ­b£¨Âl ò]ù‘üôÇõêÆAð÷õý߯6^m<,ZW©À®j^gO£›C¦ƒÂæ†Ö: ÎÉΜ–€L‘…Ò¾úmB€yƒzT-€‹—/‰]EñEãþ*ßrÉ%]JËàô×çÒ/–ƒiˆq)ăbªOµ¹’Éä¹ôoèGê!Ê-â©°(Èó÷-å¸ò½¢¹^iÔ”¦Š·È‚ö‹[kÑü£ý¿ôµ\z«­±ËÍ îc×› Mí¡h`±¡d'È'䋨°Ô°íÖ®>a_BÙ+e”=æs²ÚÂ`ÑÏvÂçr…\ úhý)ݳàèí(Z½è):ÛЮ›k¶¢3ó²Sr* óÓÌÕÙGA˜D®H°¡}Íi*ÚRí¡N…œÝ93óŽ€é ã&F½Þ(t_)o(£ åÊf6þ:°ûB§Þ äÛòC¹ÌvÍÓÅt0M5}mÚEsŠzÝ rOÈ'm7_¶[áýš r-”o(ïU~ ÔAæWÍc@ôݰeâöóÄâ31I¹ôçtÝtž@-´J`×uE¦ì¶²Óå }nƱ¬Ç Ð·h[ÑQàsñ±°áVÍE3ÚDí.Ç@ö¢ÜI¹£Àø‚iƒ©ƒcj J¦rJÙ Qc#¿ûÂüýü¦ƒÝ÷v/ÚÙœ.gɪßÑR‰®;?¡Aâ ì“úPú=ÿÿ8c¹±«ñ8sÑþr.”•—O+WAHQ â¨rA"ï’ãä408Ú±» Œ©w¬ö×`_bØ`¨wõjv«X-ÞQž€ºuk׎8nŽ®]§ƒúŽ\)·T½ý¢™h,€zBMSÝàÒÆËíã6CáÒBû¢«·\•ß÷[8«øÙâ³pá•èM—W€)ßÔÐ4x˜{EuTV³Ç€d‰Ò wØÚ½ mæµZÒ¬#8µp:íxõƒÌ-îê¤q“Ðö´ý·úyúÁàÝÓûEÏ&à¼×iŒÓb-åmØb±! ˆu´úüŒ¯š~4 s”Ó¶›.Û}ea7{¡b±1Éè ª¡jc Íif» ¡=íDKP¿UU‹ b¡q«±pž ò?°µ]ÝD¯ˆé»’:¤¼ú<¨9ª³ ¢)©wýçÿ·ˆüñY‹(ÙJ•ÒÞe:P¨—U[ÏZ5R¹"ù/ò8¶uØá0 ê<µ#âðŽôàéêù¸|»úÍiÄp Ò>Iû"£$oL=ýÛ ïU¾ÄÆûL›Já¼ábüe'(Ý]V·üˆ4.‹ƒUhÁ*„üd„lvà õí@ƒ¼zSëìûNöÅöÏWÿ¼TÊ^åk±êÉ:"ÍàÖÇí—·A¾ ~"Åâ¿^•+ÔÖ•vi”.2r=òÂòK uhzfÆ0þjªmqåðŠYƾdN™z'ä Ííž7d?y|D3Ñ„†U?/ò#ù™\ ºæº2e/xzžõ\ õ?¨›åö#ìì«2_±†F5à¶Çµ¶kopüÞ©«Ã2àvFÈ 60ä8§9J‚ò½8vÁú%ve@GÚbÃXÛ ^; ¸€x–gD!Д&b `ÂH©í&D<(îå0-76AÉ·%A¥'€ üÀßÈ ªñדß5ÿ9¸°ýâ+1 A]ª¾']@f“A!–¬Õð«%Se±4€³ÓÛŽePIÝ÷¢z€gcfîýA8P@PA…MÒ=ihü ôƒõyº@ç ìÕ͹#¶¨l&×ÊoÙ ººzºDpÌr|Óáˆû™"ÆÚn~l'x{Ñ.`¸`Xn7”úŠ·bpæic:1 ŒÏ™Þ1•BÉôâe¥ €ËDcë,7×ú0¾À+¼ 9çúçÝGÆ[j $?œ²!m( %ÝÖF!2I–Ig(>T²¸t$˜{ª³Õÿ`º´†ëê­­ý }8Ù)0“)r1E6ÙÕØq9唃ò†ò°®+¤vJ[’ñ0Äo”°ä2ù¼™³>Èîv™õ²€I1µ3M1[Ì\¿¿Ñ”޲Ø¿cfÿ=„Ì Ú诸ÝéÚ„+ÙœÃö…&þ.}éGOЯןÑχЄqÁmÀs»Ç^·… WË-òT5ô«·>(µ¥)MáòúØòøG!;3{UîUyžsãr¿ÍO…sÓ.Ž¹Ô $Ò]ƒðƨriká i-4äÖØm¡ëGÐf[ˇ›]o}”îê`Z늿†FM¤Â±âÉŠX0ù™&׸›»bC>áS¹ô©úú>àüžSmÇ8àñ8÷Ûn~l&xÅŠ`ßÂ0Óð-èV+”@Ûänl¸¢&–ˆEbT|]QQ±òÖæS¹ÚvB†H§¡ôûRcÙÍ,é“ÔÖ²Ÿ:r.å¬Ë¯ ¦wL»Má¶6ÎvD ŒØVa†ÐyÁ*¨Õ{ä+Õ߯²ZY¬¼éMÒ3&BÜôø·GAÉ„ÒV¥ŸÂ…碼ìæ{Í_™O€Ç] «z;äAõŒÌ—9ÎÞN- ¾{…‘o‚î¢n‡nNõÏCuñbxÛÐõàóµO¬÷PÇɇÔê -¥Œ2ˆÛïšô.d}ž39÷â•Îx.ó‡¬]X˜Ô#¥ÈÚ²©ì 8áD5dK‘ƒåHy?Ø/³d÷u óó„ÈÛ"Ž„~ º3Êfņi”44þ’í–‚=3*fCfl¦1ë9(êRԻ؈ñâä7K:IOY¿pšèø!Õ |ЈJ}án»é²Ý o gÄaðÖ{ð\özûŸíŸy‡ } )?¥žO?ÇwŸøäLwˆ=gN|Ä«<ÃTßýÕL§RÓTOðŸë7ÄûGh¶»I»†§8ΉÃÕ8~ õ÷ÝW™ËBØS¾ÿ‡C;!u^ÚÉô7@颴QœÝ ÞAuÀ{SÔgåà<Ìù3§T9l^­ÇAyZLm7}¶¼õEÐAàÌÀÖ~=Àq’cŽC[ž²–´eZ²Ê‰yYyT …à b‹NÂÞðÏ~ÊËV\=²%£¨üñÉ …4 ü ÿÕ‚&…Ãá‡þ?~¶ÝVoýú“ïœ!ýÍŒÅY^ :ªuÕ–,b5/q»>xìÃÆAÙ‡¥Ñe+ ñ½¤°”<(ÝPæ[¶ÎÖFÞxœ_sîéô6„}âS«øõ ôN¹\®”kª±c&L KV~Õ½ I=RÞO Ûþ²j?äå=[p äògy D‘U¹’!‘Çd<¸žvíåò8„¶)n Ž;û8œÞa/só>ð^cwpZà ÎàÆï-߉ È‹²ƒIÅD1L´ƒ”7R积†£u:í1OÅ'¼b¯Ø.¾©ÆñGs‘`€˜%ÿ\¿Ù¾ÉÐøÉõž±I¬åÓj쿦aÆü¯îÇ7K°æÍNå<[cd¸ì)'@’oòÊÔo`ŸãÁsG·Afë¬9⥔*Õ|ú?}å0y784wøÖ¾;´ð¿à7‚FÔò»D$lôi3Á«¼¨Lƒ!¢<ìñ}àò¢s©“=¨ÔGå"~{R°%"KDC銲Šòwà܈ó"ºN;=x> *ÖU$¯Ž6´cÜòTŠ{?‚€l5·]ÞøáÃÛo﫾XóÓ·..ˆ&ƪ—¡Þâ'ñ­X ”PjË´sÿsxÎ8aê)y^^„³nç^Ü 9札yW?ؘk˜`¯j¬‚³’Z³jµ ìuÛÕî¹ Éú×gÿÛ(EÊe±2•¬’œ©pâžSœûÔ—Õ—Ô8 …d2©òtUê=r–|¼ó\àyÔŽˆžÄ’ò»,7ëï5v×Ú<>pÔÚ|àQP?’_ÉÕØýHÑWiñÞLÚ G;ŸX}Z…¤ø”É©¡Àrófõõ¯žQãe x®pÏu?Ï„ù„¤ç6O÷­ÀE·ßhò) ß²UT’Ÿž”ù)\l½3fÄE'ôJšEoå_õgÁšš®L¿º•w+¾¯äMøÖ{ãé-cáâ‘èÕ1­ â@E`Åó Šâûo®zŸ|B¾>½Ïw vvä¼ð,0ì2¼mðîánîÄf ¶[á(:‹Ú2<82PO¹Ÿt_ º5º÷” ›Ùn+ë@4£ €Œ”c OÍ;[°Ö?´aÂAÚCéd\7ÖGøBá¦å¬À&ÎKž‘:Ö/únÅæ®°òôš€ozÀ™7Î-¹0 WŨ1QŒwñ[°JÇÜAn–{d Ýy|ëé{!Ý%£VÖ§W§»Å+-éÑsUº¨ZM‚½s a“ ëÜê2õ¹¨Àxu”pU#æ‹×ÄÓPÑ´bXE õ.z¿x?O!€=ö¨ºtUÖ­nÙC½K} ¼Zzõu‡Ú~Q}Ã_F0Ä&•‹ª™ZiÁ1_C­ÉAãZƒì®WgQm‚^¸)²!õéô3ûClãøÓ‰¿BáúÂÑE ‰¢o5 Ô:5]UÔº: äbÐ~¨_T·vÔÕý0`WM“]“pÇ W0…˜î4} _rŠ9_}²~ÞÆyðɮϛ¬> \õàÚ øÊn}ÉÆàçv…í}.7Šù&~0¯,q.¹:µ&„¯rk¾gý5BwsI¯ÒvðKÿÝÁ¶À7¿ßþc;Èk™± ”g”»•¦@…ÜÈüàVýcv572O†à5Aï¾ M¿l|±þ}Úh¡@ý§ø—¼Ì³¦ø?í; Úoi3¸Õ£Ðé›ÛòZÇC£€¿Ôý¼öúÄ£¸/t+w ÏÖ¯ÑßÉM›¾ï†c-uM¹dBÁòÂiEOÂþ׎8:ûÉã+Ú@jtZIƃ vQQ·ƒ/ÆŠ;o¼¹ò[ù=[@Ÿ§óЄ¨Ç"ÞÝ MîkäS¿ÐÖ“yÛ ÞkhüTÃGê÷†ƒ÷>|œéw.)ÚÅòûIæfyæKVð-”5)«Sî',üâcp uêåØút鱬Ëp^ììè4hD(7S°Såh÷ñ(_6m2é¡ð\á½E·Ã~ýÁÒ£-aÕ‰5Ï~ 'Õ3ZAù/å#Ê€nŸN¯D`ŒÕ¸âWíT ¶– 5å­+–VÜGëŸqz4kÕä͆¡QDØÚÖˆ]]ýýÃòJp^`,Ôj<8ð>H,Oê–bY e–Šu5(ñŸ"ß’ïÈ%`Øk8h÷+øÍðMòþüû=âs(£Œr[[YõØ¿hH2<[ý_õ›Ϻ…ºý…'‹Æ§€h+ZÓ¢ ;´.kþë…<&Op ôÙúPýv»'T­‘¥o†Y –Œaù³§¦PܨxCé8Ø;ðÀÔ#f¨8QV±”ÍÊÊ0M-qä5>ƒŒ½™Û²‡ÂÆ‘?vÚ [ŒÛ¿þås›º·ÖiènîÒú¶#ЭQçÖ·ÅBXÛÐ~Ázp|Ô1Ö¡VÛÝkWúz©ß Ìà1¦^ï(nL{M%æŽóJîÚÜ=°ãÄ/ ÷…O~þüë5E¸&©~ÊxPóÔËj'O‹Ùâalö@!gÈÔO äÞZ·eC㞪W<{y”¸× ¿cJÓcÖÿBŽw Zj?9E}Û—r¬\z·VØ‘Y²PÚCÚWédfÂû3>Nüü]øÖscÒ–mPè]äV¬íèL_ „J¨y+I$’ò²Ì@€ô•Må(ÚV4¨8­?âqb¼4úµô·Üâ7v½×ŽùŸÆåo•_*Ÿ”PD!àVM‰ámEårœ¸$Àá/¾xr\LŽîÛûúO³â3ß{…Wch¶¼ñó *@|"æ‹A¦“A–­­»~ä;rµÜþë}‡ø¤@ˆðýWçÙ:¶ šñ{ʧ·÷WÑ.ìîËÀrVɵ¶¶ªê*2BÕZô „_ Y«è"•#ÊPèVbzּ” Ù½süs×€:Y}Iý DÑGtò €rÊ0õiIw0¯S¨ùPæ\þhy\*9WŸ—¯~z]àhèTß©î_%L¯ ~º^ŸÐJAýw}c&S—»!þ@ÂsIaOÿýŸ>{žßït踨^êÛ²~Λó ”üZz{é] ï’Óä ‹Ä‡b%F(Áüû¬ •®•ï·Ã®&ùΉ½b‹Xq#Ú'u“þgzŸ{ n›Ú.·å›àµÄ³Ð£:Ó7Õ0¼_ó^åÙš§6í×plž¹uÂϽÀüº9‰@ˆDQóðþ&ê,õUùx,õs†ÐŸC"‚-i÷úýVþ|¥O=¯¹1>Â.ä<œœt¦û¹¯mmUÕ!¿QwÉh¨× NZ¤DL ûªVGà$o[ø‡÷Ñ[…@B]0)Æ“=È{emùˆ•bÉæKw¶ÍiJ# ˆcÓ#¦¯Mß‚±‹éGÓ]Pt¸(¿øW(|½ðHÑW=ærd¬7lxÿ‡Ï·n¿æ>ý¼^„úÛëÕ®e£Üzç þ¹º{jσ°—B®Õ…öÃÿŸªê÷õïòw]]Ñc€ÌyY]s6ÂÑ1Ç¢N>ÛKwéöu†ÓµÏ<¾7¤Mkšþ M*ö,ñºÐ€Æ Å[b-6w‘+åj¹‚ß<쟷Íj—ÞjÔ]{k”õ ´b{Ák½Á(}•Û•ºÐ<¬iA£h¸þˆ¡Ö²-îƒÁ<Ù¼À¼’𧤦¶…Û7÷Ýþ \ž»(~´¬×̯ñÇÐ.µõÓ-&A½Ÿê^ˆÚ ž·y,vïBÕ}¯¹AËûåÙ’'¥~Ÿö&Äû%¤&„èy—ÎÇ‚è¨ËĶƒÄà¤ûS?„”Úi#Ó[Bz¯ô%™ó¡xNÉÄÒË <«x+9 š+9ÂDs±E¬ÅâêáÂ?º•vz㉨O«È- çÉOÕ >O+ƒ@é¨4A€žxØðº7 .Q`:cªkº—p2ZŽlÖ¥ñèK/ºÚÀ,[á>Ü=Í-ê—×kWg.89}ìô$ž’Hæ Ø’Å㦡2˜i˜œ¨>óšûÅCh£ºÁ5p¥¢ºð}Íw’·DV„7 ÙZv“@ü,¾ó»ß3Þ4¨¨HP}ÕVêÝPß¿n\ío ü­°­!ÞW÷_ºVd2É2ä¼!ß’¸›Lþ·p«¼/W à©â1¢òEKÑÊëW´¨è ¥i™‡ÊŸ€ŒËÅÙe÷y|\b6\p¹~Ü °gîÔÃ3Àó¸{ž{GðLöjåq‚{÷¿‚Wè ~Ë|—y?>§½C½vƒÏDïæ^Áç´wC¯Dp}Û5ÀÙÈ.¶Î—ù>ó3æȹ˜{1Ï’HÍIß—î¼\÷4œoñÙË%—o—8Òb2¢2—BòCÉ1i½¡p^QZñ/À7¬–@y^ùTy $l't+¿…QªŸì)_¾'{tM€vŸµÝ<”WqK Fàd ê·1¶¿u]sƒiîÓT×h$´^×bF“ÍpìŵO<ñ"KTiMð´>9Šeb‘xD´ˆqýL·¹ûaïëûë >¾øYLG8âr|ôéo¡VNÐ’ÀG!p`ÀXßo ð‹Àuþ+Ás·ûV÷4p¼Ýa«ýD°_ã°Ð~%Ø/745œõ%uŽ4‚阹—i”¹”-(Ï‚¢±ÅÑ% ð®Â…g ÷ɼzu!ëÅì¥Ù.«AÎ]Ñ!Ó=ë<$oM½œ i#Ò7e„BÉ'¥ûËœ@Ù!ÞU>]–®³ úWõžºZX¾À¡Ô·Žüú¢ò}-ÁlFãXÓOµ-²QX¿3tq-§. 8ŸyÆ<û/ÙRJÉá{£1ZóÁ6Ô©ºƒp¡v´CÌ·pàéÃƒŽµNÚµµg?§O³×[̵£‰ˆ âH¿ ß5Þ'¡NÏÈ7ɵ§œ{Œï?2.ñºxI`ê`l: gw™ÎBñ]Åç‹GC^£üàäÎË«_0 ºx–B¶SHÍI½'=’£SßO›ùGó[ŒÎOñèš)g•çAô}”f ^‹O€ñÃv ?ËΫ\%¿’ß‚øR|">„¦'ujðôÜßUßñ5¨5=øTàÕu jˆÐ­Äö‚÷¼}¼œ=6Cë†-76-‚ÝÍöu8´Έsm/e“²By…+Ád¶^ñ­LCA(µ@÷­îmÝ8ßÉòÈš•=7g¤wÎX–5Ô:²£:œ8éã ð®€ö~3À{ ×^õÀ1Õñ{8.sxÑþI°ÿÖ¾Øþ=CÕyŒýMËMïAiEÙ²2'(œS8»è>Èßœ?®`?d/Îý:ï1È›–ß½à1ùê,5ÄT‘ ôå=ÅGlÅE¹Mù mì¶Ùý¸0žP ïß|¦«òÉØêûhjmšlú‚·-ñ;†÷ÿ¢×h}¨EǦŸÃú‚6_€–ÿ”¶c¨Åj€z»U@=Iµ§Áú3D’8/öCÑEÅGàTç3m/4‡£Ž78õ,tŽêàÚöj¡{ëmê¯8.Ï8¿ã ­¶Ýt œ[xaÄ¥; b‰±¾ñaóˆ¬ßÏ¿‰\"?—«ÁõG×nÎvpŸÿ¿ºàÜÒi€c±­­»`¹Jâñ©xü¢|_õiþÞ~;|¦Bª1­nÆFy2OæcÉÂâek£ÿæ¸$ð³˜u××NÈ‚ Ë;üûиŒx‹ûhÿÏy*·>øI¨–ëJ;ì±ñ²xNÌác¹M*•ï”ûK|y@î§eÝQâ…¯~[´dO¹SŽ9AÞ'ƒ@zI•Pþr‰ NQ:‚«âZËåep q;æÚ œG8E8ÇnN`ˆ6l7t‡ ö¯æƒÈ ‹à-£d‚œO ˜¦™\LwBùçã*ž££qŸqTL®˜kœ…ÙE+Št³"wGž€’Q¥²ìCÔÏä~P¼”ƒâ>1Ê|åKPŠÄyeØ5´‹´û ¸Ëä®ò€<õ[¨-c˜¬Y§ä ¹Z~¢±)œÀ»«§Ñ³îl04g`$4Õ ¤î' ˆrq(´¦E«a @5Gð^ãûÒ4½Ñì/€}ìÑbÎÇù&Œòœòö›€ýìç5GøVRB ¥ †Š;DŸ+zG‰Qö*¡€Jc¶ƒñã[¦;!Þ˜ Ov‡¸Ûú$·>–«å"`5_ò=È»ø‘2`%Ëh¢9¹ÇD†˜+OËù˜) f³8vkõèõ@_Óxµ¿ ¯AWÙë„3öT_å³t2ȵŽÚYÞc¼ßòêw\ì¿¢w< +Þï2ú¬ô+‚ ÅøXÅVØà#ç gIî£y+@="cd!ˆ¦4¦ ®k69ä~ ^¯Û±kãº&‡oÇÚj}´E{0t5œ¶{˜ÊxFÚÀÎêâáîáô™Ó1hIó§{ÀWÏ}óÅÆÅk‹Ïb¦Gõ¥«bdSn£?„ žä~Ã}K®>à–{€ù=׌ʭ£ÛF× P÷`ía‘ç meúÄÌGAEFÊá šÕpÁ[y¬÷cS:ÐL4Q®ÿ¥~|z]uüUèVòÛ*cNl)´¬ÂX´miñû¯nüŸ¼'êÊÿÊ󜧔òãœà °†3œ—¥NÙÎ= ×ªîwuª½çõhßé[pÿܭܵ)–Q•'t+ÒŠ­ ù3ÎÄž+¸ø3ÌßõöN†ƒÃO?þ(˜›™'š¿ëÐMóÃzËS) RH%èÀmÜ. Î=ƒ¡?êÝÿKsè®O? Qƒ#æ…ù]y{F«ÌY»`®û‚ÉïÛüòäž (]_Z§l?7ÈÆv8¹ä’ ÆŸM¥¦!ÐzE‹‡›¦Ã)s6?ã ¡KB.ïÅAdˆ½¶¾ÕOJQêÙô0±Ç´¶³Bì¯ñºÄ÷@^PJˆb¸°E툯Õ轩ǰÎÏýË&Š1vÐbU³—‡ØÚºOêÚ´ìŒÍ°ê£5ùß‚e}W¼¾& ŒƒŒ/O¸]ô½®¿Ÿj£‚ Œ@7ºpض[¡ ózùç§Bïð-;ûnö ómm¬í‰™šðŒH{âþ-P8©¨°ègK¾dÑpƧëîF£¦Sùda]¨’Óåóò pZ䨯q&´¶o¹¤É>xnÍ|Bsj- šÊ£Ê%ÜÖÆÿoj|8F—¢J"VÁ” ÷Øúü½|£½G⯔)g@G8NÍYáý¯Rù„jÄDˆ.¢¨.\v:K¸sÖÐÛn Æ=?*eØ›ÿ_èVâ‘áÞÎ-F,;°<œÜïvëdE>G<‰6§x€èBjC±Sq·’Zžðfr;j”:èº{¹ipùÒåçG Ñ} öÔ[ÎŽŽ«sA¦È|iÚéÿÙAö”Ã!Ì)ôB­Àÿ ÿÏ}/ØÚ*Ûá>ÖíM× nh튈ŸA©¥”(1@‘%Xµfßoåiy†ó œPv*ŸB@˜¿EÚµÖEMè^‹îGåå>p{Þík׃ ”4åÈ}òGmmÆ ÃZUî?É`7Æ®].4ÕdMƒWà±¢'îÛµŽ-xìæº•ÔxÁkøÔ`·šôm´µþ,˜ôÑø¦#“Áí´k—±@Md,7âÿPå«G,±$¾Dàž%¹§Â´USºŽ»ã]ÆÔþ:„¾Ú'8ìª÷_ŠÙhøÐP¥7pªÛÚŒoehV\Nºôpê"u¥ú³­ ò3¹Šo@¿Iÿ¢.œ;:í¶ñXfkën†_ì³ó…Vkšoj¼ \ì]†;ò;¹GÞ ‚ÑÞZAlo‹¥6?ddð+à¿Ú÷gß±¶6Îv8•;½æ¸"W…‹àe_Û^b‹X%¾2È$ÓÖVþ+Y#¿Ý/ºÅº¡Ð¢y3‡F‚G¡G_· «Ž«i[É6Â`6ü`áI¡÷Öj vÚuÑç¯2O¾kkë4nr‰üL®]ÅQ‰ƒ¶—[U4 ¦{Þÿð¤IPûBTAÄaÐß­¯£¿|õköp%5Wðš~_sÛ}ˆÛë®s¡of¯_ºµ„‘}‡‡ß‘ž=to¦oL̾€?¾xÿë^5þ.Viž2 ÔCê>5Bß I Vaf«?™ü ®3°^ŸC48(8 7(ÎÂ,ÎqÅ©½2ÍÑ5×Ûõ^—‹Î†Í”Ñßüùöö9êLõCõ,–ªéKébÙÒSKUgµ¸~ïÚ͹Ô›Z·4ªêæÔ™¹tSuƒn¦'ÞëÅ®½]±~´*iñtÓ à¼Ç¹½óPçÉeò',ש&Þe*ó??ĽL¿»|;z׿g|;û¤€n–.BI·µ‘¶Çmº›ÁÕa·‡½]«ôõ¿ê¹H~(?³µu@e­ù¼ÃG A?P­j±§érpßî–ì*ÿàøÿ8N9¹8vƒöϵÑ þvц ×Ëmò4¿•\׸Ű>ð©Oªo¨«Á°ÁðŽ! ú5îÓ±›'<¼ëþ  ¡YÓ&4xì‚ô§õó€6´¤97]lCÍýªW¦½© »_Ü-nÿ~ßù …;>pÜÝ¿ ×2ðiëæµ ŒSŸ›J7\p䦹7 ™d &ijlš«s8ïîp©í˜1wÚìIåÐß»ÏOÝ¿¿Í¾ox›@8SL2PL1%ü§ökÒé‚t…ºÐ<¿É’†ó¡kûŽ-Û¹‚ïHŸAÞ—Ál074§ú*¼U~‘/s‰0¹šÚ™^Ç Ž~ý k‡NmÚoQãFÄJ×6.¿8ÇGÙÏnš'ÞëEW ;¡[!Õjäµò‚~ ¸Žm¢í‡¬#›I[–ÿ3ŒÖ4këÅ*ñD¹ED„ï¹^³=Ú]uÜ5b·<×|n8¶vø ê_ªkõØ™í~ÑÏçYæØÚØ?0ÿg¹¢Ÿh-\ÁÅËùy§~ÐxI#ÏúGÁeˆsгëñÿpyÚ9Û)ºÏíòP‡,hâݸ}ý&`m·Ê®˜#Ì]ÌOØãˆö p³qmžþåòsù˜™¶˜KÀ{¼WwÏsp×—Cߘ“¾0ê3h±¯ÙüFMÁ0ÒPËî•ÿ}ÞšNÍÿÈ:á„#Pn-1ü+[Y ¡kCF€QFtÔ †µ»ã½~¾P«m°}`g0Ö6Î0]y¿|X>ÉF€T•7´$’Iµ§:Z}LLsMïCøa%![aXÄ Æý>†{[Mzqì½0`Kßçº÷gÜÒ]W]u¾Êômÿ+ø¡r‹ñ6±œ78»:Í„!Kïøµ¯´(möU£¦`w—]°ÝÞ2\6Ç’ˆûz>Í•‚;–8@]ª®Uw)ÛÜÒÜ"‡Gd„=#¼†,¸î90võˆÚÐʾù¡&÷ýÁùn²Á?¦ò:=Ål¦ãe‡ìw@«ÁÍE“'Á§¡÷m^g@V Õ@l^è7*K¤Zƒ2ˆ¢aÐôLã¨úÏ‚o}Ÿ Þß]uüÍ’o¶ª¸æsëð¹C¤Ã"h4¢^zv _¤¬·ÙYö•#¨q•i*ÛÊÞ`ߨ>Ù0n¬ïS§>¸ù‡ù¥‹â"ø-¯ôž2Ê©ÝiÝ ÝCP{Fäê°{a<£— ÷ƒÞÙ=2:O_ݳÁ8͸ÑêÇê¹-X¼¦c]’óä›r˜_1ªžö‘†4»Øä|ƒaü¬1͇o€ñ džXMï?”]Ê+Ê\ ½É¹y>ªö0p¥¦¶õ¦\gUíîaìÙQ}‡>Î §;΄ï‡m:¸m Ä7J<Ÿ¼ Ì÷šŸ6â1e¢ÒD}KšM[±ÇÈ=r‡Aî•§Õ vÒpðÈðˆt{¢n0…ùBßGzöê2ú}×ûínß@ðŠ ãiÀŠ?9¿þoVhú“•ƒ†ëßWçeèÿdŸuÝß‚ÔÒò3ÚÁ™mç¶\Ü ÂAH‘Œ¥ÂWàßèçÊ»]eyÈ…r´œ.·¹|㜠ž¨×¸vKèÛ¥WQ×¾Ð÷Ùžy]7Cà™€\¿çl}ÑlÈ5×I(¢H$C'ÿam̰kËžMV@â¬$CêÐ-Õ ÂpÆÅ¦ÑÞR ¼Èlûƒ†ö†$hšÞädÃ7Á÷qŸ(ïdë±Ãlhg Áñk‡¡ö_AÃŒ†MêîçB§ïœÖ@ARÁ¬ÂžÀy.p ˆ"’°ëíí:p¶,Œ¨Ô1êSà|Á)Ði9ôÐu=ÛÑ œžvx×Á¸â†¡ 5°¬Ø°¸ø¨ ûI÷‘î^èI7:Þ ¾ûìózüöÍõ{#dñ‡D%ù£”=PÔ§hvqKP J–²Äq»¸ DÑOôà·ßíwöá`‰IïÊä' f«:Yt¥º4% ðÞ;ލVw6 úvÀÄÞ;¡Gx×ÅF€ó;Ξ¸ê|•yï jÔƒí¿¤æ¯ð^˵«fÖ Ò0ø§À`ÜŽÑM‡/{S&úޱ‡¦•{À}µ[kpPžÑ ÛÈÎòà—‰ãï ²[Å"øäwò¹Ôò˜L1B ¡?8×r^êtj÷‹ü)lôuë¹¥k&<¾é‘6÷w„qËG/æÁï½0Ë ü xìýc÷§:ï‚AŒëø×õê7ê™d‘C.~ƒ­L¤½_à(HW"kƒ>V¿GwÔšÜ3ðèq¾«kÇ7áñÑdNKƒ±ÍGžº Ï´ö{¨°&ª×@t-D04ì_¿NP¯UÝùQ‡Áe´K¡³¨mÔ¾êýX\ n¤‹@僴ü'§Ë'äó ¸*9Ê1ˆz0rV؈:±6t)–BíŽØz6kúïôOëÃ!âR8¡Ó¡Þ±º-"ï‡öOÙg€ºLýFÝØÙèѺÂ,›É²è]Œî;hàŸè; :\h÷i«àì°Î¾ÖUﻕw_þ ²CÖô½Æ·5x^z¿ÿÄvðÐg÷=pOKè6ºÓ³íË â`ØÀÐp¿èéÚ„ƒð¹ þ¤–1 ƒdmÙ äòG¹ß\‰nñý¯GeV…gåËr>¨÷¨© AÑ+©Ê%ðèè1Ëí9hü\ÃEõVÃðNƒ8Ï žÝæáu0pW?§žqà|ȹ³Ó,…G®Î¿l¨a;8×IÏÃû9ÉqNÉ`gþ.FGoŒé +˾<±¾vÍß³ä@+È{?¿a/02Î1&ºUÝ£^ÑSt±”Dtãæßš®~Ö/d’ òœ¼H,è.é6+sÁ®®]ŠÝ›àQêÞÁ-Z¼Ùl|#ŒüzxÞzhžÑtV#_p®å´Ä1XÁRÞúÓ›î7~Xé'3ÞËj _ [7äû °tÛçÛ×|¥)¥µJ?†2•{aݶ)É_åy”YÊDe0ØçÙo3ø@D^Øg!p×Ã?»ÃnŸÓozÏ0p{Áõv×i <ÅYŽ mTø¢¦sMá˜Ýú}úC-à“/?^“ ûž8Pt8 Ô ÕYÖ+£IçÊÎ^XVܪê»Vé{[,->ãzPÆ+½E;ðjä9É#¦}?%iÜZôôÀ„Þ³Ác¬ûR·§m=™5еfãtؾ|çžÝ/Ã{>Œüt\Ú3.î Èò9ùpÝEÀQ8àÀo‚TTº’\'Ò„ 3W~˜wɽòˆÏÄûb.ÿxgÀ¦äÑo9Ü×ròþ»'ƒa›a¶Ý-°%k3žâY悜&gÊ'!?·`uá7prÇéãçšÀ– ÛïÊmGk ¹ó¶B¹Oùðò0&ëšõ)u±ºd¼Œ! „¿ðÃKºG7,¥hµØ›+TÎAe6£\òÈ™E6¹ ÚÑŽ¶ Ÿ­ï¬/ûqG»…à—è·Û÷èìСsÛÞ0xÐÀc½kACs}ß:i ¬V^Ò ¡Š0K¥Ø[[Gð^-h‘ùœª¨·A¾9EÁ—p¶õ¹ÎÑaMÔú׿ ;ôʱÁ?µ ¹0x–×Y2^æJJ Ü|_ÀÊŽžxâ¬æ3Þe¾2[ â1NŒZÍ‚÷¦A‡oÚe´zl躣C#hþc“e #ÀiˆSŠSg°‹²Kп¼È“Ì´õà®×"þhb&|5ô›¾?Ôƒ/?ÿÚí»­Pò|éä²U ”sä‡ÀpÑ0¢b/ų‹G8toÛe|‡Ýp÷öQK†¦CÄÏa"$  Ž+ @&GøÅÖ£¼ù0/5ÿj.€_ºìv:°Vþúe­õ½à`Ä‘_×uú¬ò)ùª| ØÀ~Ä’^°˜ÿ}«º}éAGmé@Ka"Q”ƒïEß×}&ÃÒ;~éÛÆ…ÌzxÏõþÔ³p/“¸ÛÖ³W™ÅS¼¥óËrËçš#ë–mø Ö\X{ÿ÷ÏAlßx]b[GDcá,åc>¹D~*?åJÚBëÖùß¾¶•¿LÖHÑ—¾ô÷‹ñ ›Ènr4 œì¿9 ï}îQÇ^ñx¾îà¾È&•“¶žÄ[ .„€i€ñeã(R¶¢üvÈž{4ß%ýñÄT8 ;üÜñáxß_ž~R§¤ÏÏðó~ó.µÈx™/¨‡ÕójÐaŒÒÉ$ -8®„RJ»Å0-EmáÊe·²ôêèC Q‹ú ë<½¿èáÕ9:]îеB¾^´ ŸØßa8ú]šîC[ÊvÜ:‚·’ÿ‘&£|AyJŃu!;6§3\Jy=.ö:íïÈã°«ÝÞÖzÂåý1¯Å—€ºY}O-ÒD¬8 bòˆYb¦˜„S‹`nüYeé¿ó\$xW.–Ÿ€Í¦t–~²>(ÓÅD1|ºúÌ÷ª-¿mÚø¸÷rÝíú„&Öê4¢²£ÜÃ÷AèæZÝÞÒ«©g:ЇátÅv.·•+ìzôÌ9œžŒ…¢ò¢O‹ƒÂÉEeÅ— àž‚s…©×*á¤]pJw¦Óù>pvÐùþÑuábÞ¥±1nþHƱìΠîSsTW1âû@,óÄóÀ^ç9“Ä8q'à…;¶ž”ëšOËÎãn¹—À¦ÉÇ@ö–·Ë± z¨ud_p>å<Êñ3¨Û®ö‘qÐî±Öí›{AëÇZ®mvÂ.„N ® >q^‰^÷«Éõ!ç@Ù¡¬Sþ˱&×pë Þkù_Pãv£4M†Œá™C³.@R«”ý©@ÜíñiIñpáXtÓËþp¾ÿEŸËµ >4aLòÈ8™ùrV<7û_q@”ˆ‹À9qTl±ž5bˆwÅk¼´¥-m€A }¹’–«”|ò}ì—G€ÏùŠõ ¿”ëX|ÁjùÈ®²/wƒ´“Þ2 äûr…ÜöwØš€o ŸÞÞ.ñMx³W Î„¨ePûÓ¨»Ã'C­†A«wAÀó~]|6Bà‚ÀÁþ¯ƒÛ׃.»l}‘þyäSxX]O¬Ï.>_r â’%} ß„ÖÝý]Wð)öîîuwú¯òËÇ·žø×VhüÖ­7<ñÀýÊËæ×ÍÛ̹P’XÒ­ô"”ë*Þ­¨ ¦Sž¹;Èñrœ|Ë΄ǿè÷Ç8úúu`·ÅîC»pߨ÷ýóöô¾2«O¶ØÿÃ>ÿËdRÀY(y³D)=ÅçK†• …ò7*Î;ñ[cž±Ô~j?õmà2—IäïgU©Üu¨CèÐoÒ? {»“v·ƒë×Hç¡àâäüó:à Þå[Oʈ˜‡µüíò_+ÆAvûœÆ¹÷Aîëycòß‚œ¦¹ya2%­qú#÷@üÖ¤O!±~Ò´_Hz4¹_j7H^’òRÚQÈî“3&ï}Pg«iê^E"Žó RD’8"SĉãÀÏl«@| Þb°¹âo‹y¼ <Í,ñˆV¢±gé­ãú+*Çk½oÈ rƒü Ç<r„å>&Ç0‘¶²»²Hêd¨¿Ê2øH.æ+pní¼Ö©6„„ nu–F5 oµçGUDÌSø!Ó xb`wÿÆàwÀï¢O(ø÷Yå3ìî¶ Ñ¯ú;+wÌ\´<Êð_¼ÿã\£4CÊ©¤= ISJ[­2=³C–Ö›9%™œýZÎ;?÷³ü"(ø¦0º¨.Õ+~¶x”–æ” ó8Ó8Ó}Pññ;c} – ”M€Bú ºCúçÀ0Ó`X † Ãr»9`hp²›®® \üÁÓÍ#ÐÝ <~ðs¯ Š{G·2ðrõ¬çáþïû½és?u Ôù׆€þ÷øÝŠýdCÂ_ ¸ÒÇ׋ïÝÍB9å”s¥bÖ?Åš–ç·heª¥Ò÷Ìî?z«sÍJ~¡Âš¾Ò`õ ×°-ÿpGИ`zÚôdÖÉÙåùCö‡9{ {oöÝ9Û ûýì¹» ëxΦ\OÈy(牼[7ÿõüZ73ï‚2ÈSòÏdC¡OÑÎâ]Pr°¤O©„ÒI¥ñ¥wCIóÒïJ[@Ù/eÍË¿Ó<ó³H–ÉdÝÄm´ü ÂÇjœ’H Ø(·°¸CÜA?0Üa×ßî88»9µpÚÎÝœƒK'ç=NþàºÅUçâ^<ëxìßù>˽žŸ{}b¼ Àç3¯m^›!àÿ™¾ñxÀ4¿;!ÈëÞ=½úx6¢¨ÿ—X™þó¿„ÿ7Ño%fëS÷϶êóà ü í!knö[¹Þ_œß¸à3(\[èTT ÅK—tSº)ÍTöãH³ôÖ‰0v#ô½õ9`ßÅ~¹¡?Øo1 ·o †Ëö‡ îàþ½[˜Ë3àÝÂ+Ä3¼y?ç9ì ïþ‰³yMý¡ÒÐÐÐÐøoq.r¹y/åW@¶KîÒ¼îû\Î’¼¶#róóBþãm GCñ+Ån%1Pܤd{i_(..™[â¥[KÛ•îS‘©Ì<LŸš–™u ¾ Wã@–Éó2(§„2}•E=Ðe*ëÞ]².Yy ÁÃ|p™áò¸s:¸5r™éü(¸¬t uº¯r[>zôÚþ üÂ|Ï‚ÿ¿ÝÞŸá‚aᎿ1àJøëÍ;ÿE¼· šÕÐÐÐи¹q%lw`Ó8S¶ÙÔP5I M(wé>Tj¾³.K· z·uŒÌ-Ž&x54444444*ƒ¢ÖØi •T ÑÊ sšëÀM…&x544444444ni´Es [MðjhhhhhhhhÜÒh‚WCCCCCCCCã–F¼·4šàÕÐÐÐÐÐÐÐи¥Ñ¯††††††††Æ-&x544444444ni4Á«¡¡¡¡¡¡¡¡qK£ ^ [MðjhhhhhhhhÜÒh‚WCCCCCCCCã–F¼·4šàÕÐÐÐÐÐÐÐи¥Ñ¯††††††††Æ-&x544444444ni4Á«¡¡¡¡¡¡¡¡qK£ ^ šŒ´µÕ<:sõw¢·õ(54444444þST Xñ7ÿÃã*ÈŸP½ bpþ·ý vT *ð0æ}`z»¸@ícÌPXZsçòr¸)@.”ñ8@1 â1Q@7Ü¡€>Þ1@÷¼#úNCô;\ìì_ð†eì'{îpèä ü@n—³^ÅÏ${ÈI𜵳îÖóWʹ¦Ö¶R Úÿ¥U5—ÊÙL±¶•Âùgë?aýÛgf—â8Àwoëtmd×£5€ç °ßä  xÚEZû1[çG§ ^ ¿C{`¾¿üSëÒé¥ËÒš¤îþå<@Êg;S27z ø«Ä¹2SÍ“älù”º€¯¬6ŸË€–P R“ê¬.! ™ ¾T>”2G?¿©QuF¨ëvO¯cMZð8~多àÕÐÐÐÐÐÐиB ™Ì–Kdžú @é–ô©=wmHxw“7@zûÝ/”}‘³ÀÜ <@ÝY1 @žQ‡ ZÏïdm+Wh+=}o¶•ÚE引ZÛbK#ΊSJ…a(@ÔøQÅÍ{=ÙÀéþ–+'¹Zðþné÷_ ­&‰ÿü³‰††††††ÆÍÊ9K“]ûÄ1€¸ÛÖç$ŸÞ>  (:Ñ’¡in @Å7…›d >…«|j{XÛk« ÚªÅê¡>aiÝ? ß Ð8súe€&såà«ã­B·¼{v2@ªï®ã™_ Óð:Úh.@`H×P‡~¾•Qq¿ºªÕ½Y±FÍihhhhhhhØŠrr°Çów¯ß©®Èp?àp|ÓY€ôø½õrÏž (9—:@v 5ð[°–øÐÚ^´žoÊoÒVÛ?¯N,9$Pî´´Eeñ.Ù™Ç/PL+^`e…7YîToc+€sÓ?tˆn¾*  ïr€£ëà:7t€OÓVý‚z4ž×c€ýïÔ?4L[ÖÐÐÐÐÐиQ˜¬›àz÷z š½÷ÔQ€ûV¤ïßó(@æ´CËJ&e~ ÀfËÛD+ëûÛ[­ÔmÀêò`¶„ªþS?/€ëV6°_àm¼/©»¤„".üÒpòv€„ÛW(]¬'´>¯È†–V™ki}7·ú $kÀy€À—:wðîÑâ€C7Ÿl=ÿþd%·ôÇô3ioýz nÒ†ÏâÞP¾&ÿ4ó-Ç‹$ëC­‚Ùü›©FMºjf‘¾µb»üÐÙ磉/Õ`qiØÅD€òGsLmJ-Öº+Ь˜2ËHì³vei2>:r@懖¼~“Ûõˆêq×€ ûzÚ¸Î=`ÈòlÊ¡b´öûgà44444444þ«Ð5{—”äŠ~ !iプڮêsüÜaM‹%^üí ‡Ï`k MèÖl¬º@«Î5Jcaá/œQ;Cø¸Ô m à” [e=Ñ ë“ÒµÁlÖ„Å"Ïú·½E¨f<}`;ÀÁÏ”ì‰x耘zk7·N,0.à4ÿ_èÊßâò44444444þ#Eêc_€4§Ýû9=ó(ÀáuÏ?~.@DX÷®§Zß_éø ­B·¦Pé8QiUé?lËùo`uiKÌO˜×–Y¼«Øhy†éÇOöv^®aýoÿ pËå™Y£· ÏšÅÁýO:ª\¡½Íò§ùbY@º~ok€¼Cg=âšû:@óÓø¿yÛ·†öO¥ÇHÎÛzî4444444nâø #ê€À ý‚‡’Úz €ÑøPú[VªšM¥Ðu°ÚÅ8Úó4ð?wÄ…Î’øL&Zt›¸ÃÖCªV*…ýP–ˆ9¢X¯®WYtgcó’òæg–-rÈ~ât1€Ø÷?¢í­ÿ¾ÏrAäQËBmÙ¡œ…Éõwè²'#‚|ºÜ PÇs¼À?¸C7®6ëÏ¢*54444444*9Ê+—§®ÎȘz`€lÎ`QB:ðï…nåN·ÁZ²¶R—Øã\)ek° ˜Ê¿í~û»²uù][Tg¨(Ö¶˜ñŠò€RË®'€Nï@ýP­þZs½x@i: `\X¼¸¢«*ȳ¶ùÖÖR’·Œ,kÿ‰Xì Èú·ú[‘ášE™µ$êÐY÷·ym^Ë ­°<1T4ÌóH>ºÃp~ÿ’ÇîøñQ¹P¯rfÿDW¦%˱NÐGÖƒ[Zû'\·8'Õ*ð=Øn@Ä}C–}ÑóK;—oÿp€×›?XCCCCCCãæçCiøiÞ g€¸}-º#ÚòÏ¢«¥•¿XßùûVnýã×Y`}ÿ»–Öàü €ýïX‡1Þà Ü/œÝŸ0¬t; `w—{c»q®c ã]°àÚ@å´@—f  v@?ñ@9lï |¦ÿ@¸(ƒp&ÀbøŸ¸€YF,k™˜Ç–ºTd”ÊP›· |m~@Y£ŒÖ…{â÷<ý @aýøÇä«Öµæ+[û‹²–Ô0Qr£.ùÕ¨/Z‡Ý¯ãB€Ž,ZàÛ¬à+­­ÊßÎêôÝ®t@Zöî#ç_Ò 6lýr´9€§¬ï÷´.±Wº8\KeZ²Ë’ý-/ËÑ–ÖÞß9 À£a}gßWÛnJéîPë¥Þ*€á3~x~“µ‡g[L¸††††††† ØÅ½çîüð+€è…+ó .LjVº0CÛ†fÝì[ºÿ `Xï¹À~G€!Òc%€á%éöÝÝûè“]^Ð;8Ý`gï¼@7Í!@7È!@çï Ërؠ˵ Ë·  Kvh ô² ,Ö§(ßë'«´«Ži’mL?˜Æ–¦˜W•†˜æ•m06*ò¨˜” Púbæ €"§„Þ9ÃN¦¤tþù€Â±¨wÉ ¢ õȹ±®©æ^–6$·û€®£—þà:8âÍ¿.-œoUðî–Ïêqã€Ì¦‡SÎ=üa€¸3ßf”o)x@L³¾¿ã?TúŽ-[·´V(Ñnw€·CóóÁù=øŸ½ÍÀÖm#Ò|ÿáyµ·>VÝR:>- óù#›ŠžŠ7ˆ ÝB»‡\} /¸¾`÷’›e!-Ï=Àð±[ »ÇÜR ñîç”ÙvoØzˆÿˆÊ<Á¢j¼•e¬¹ ÿíh€ô‡÷)‰Ç6OHi¶óG€çLË|í´ú[]Iª «/³9ŲÐß÷@>_¼ `ïàuä¯o%eÖšÒø0H¶Èßqa5À‰Í §Ä×ÞРôõôçØk}ÿVkôäßÀra*}_>·ø–H«lV.‰–>s[} Öeð €Àé~ðôl4ÀaïrUûAÐÐÐÐÐÐÐиeø›.£Ùé'œª»0 vé7«ŒoZ|'T³dÔ¥–6*nè]½z~5@|¬—Oð^¸É:pK~º…2 d[ª àD»76Ķ_ŸP|4)@~§¾ÀëûÔëL÷‘km—[Û¯hà·£íB€È9#¶>Ûm€Kth)€ÃJo@äéÏýáy+íR~WpYCCCCCCCCãZ®Y8LyeÇF€ã%¯§$<¿õ^eE5—Z^kiÄL7@]ý= ºöùdוƒþ‰à½–rktßGR`üºh8ÀÙs‹Oœ_õ‰¥41—^;Õž„Wö}ÝC´œÁÙ²d.>·T³º‘®m"Ú„¯< ²ÿ£ÜžªÓÀî¸K€âlgYÄökÎ/׆†††††††Æb:\Òà„ÿü‡½ä dXPª§_ÙÈÒ:nñ¾ AÀ½ï´™öÚUÙ½®Gð^Ë60.;mÀé²wݲû@>"-…&r9c±ô: LTÚ^lm­+Àb€R kí à8Û÷,@pƒÞƒj{ŒIðikI3léÀ}ŠÅ÷x²m¢ 54444444nV.L^ °÷ÔôŒÃŠX“·U9r‹¥uoÕ qÌô —N¿Ê•¶*ï5˜ºUdÌ>t7À….ËÇ\Jüâ>ùÙ¢ù+ YTæï•×¹ä]é“{Ázž¬¯oc$€!Ç= ÀqºoW¯zM–„¶¿Ý dnßõNeÁõ«~V44444444n!®ñõ)üz;Àþ’ÇŽ-H˜ `IPõ¨­-­ÿ¾Ö»šÕz< rðîUµÞªiM€¬ßåbˆí4ÀPâ^à4Ù/ àܧŸ4¨èœgñ©íj}ÿV \™ùŸ[a9O]ëßïXG¹‰5åwZN[¶;;@q뤧rfœî˜÷Óx€à=.;÷œàöYí—ÿzÆ­iØþGå [†k‚Út›íOØíw¾€2fWkÿã-c¹o€«KØQK¹‘JªÖŸBXÏi˜E$(v|µ8Ð0uZ!@óMOLðØÒ @$ˆu²Ü*tÝ«èY 2Ø.ÔjäëÐ-õF0•ÍÈÝÝ ®ßz{€S&~ð_€“'z¤®ÚÕÀÔ£Øñwý\+tM¿9Yhhhhhhhhü7ØÉ,¶–쨮H(½EwI«úrXåß ÀÕ="ÿ®>\¬³r¥vŽxÀuNÒÀþW¯a—ßü² sÀA€ò¸âhÅ}W]ÎΕT¼Ôã¦Ý¹Ýr¾@â3?zø/mÿ@àîÎ:/Ù¼6€çΆ}œ»×ê ôÊè?ìOK‡¦¡¡¡¡¡¡ñ¿¸ÞBZ6ªD«šŒLÛÊn`}5utѲ³®Ë¶üé4Ê¿!€CŒïóÿÿàjôáýT§‰?–®I£zà¼ýÒB€d¿í_”uÎÍ;¬V–2®.\IåŠmžÕUa™um¬ÿ¼ƒr¯“ÍòB>î—¸§K-÷±õ8½ ?ãœx=󣡡¡¡¡¡ñÄl Ç7u,*0VMP›‡èŠìƒì#=YúôkÞ_€ûj±OµêÅ¢_. ]5 `o™eÙY›ªâ~gYÇÕ~´|üÙ¯}ØR?âwºêFfœý3!gõù­µºï«NÆ 2§ž3.o_Ó lxv ™ª~ `-ƒQuÁnÿß.‹Ðu³þ=³rd\²< }êÄ%€‹ÏÞ xZÂ^œàw[›>†N÷Øu Ûõþp~4¬¡¡¡¡¡q+ñ×éN -.˜æeÇL‹Ç”ÌMk ësz*@Þ° î¦K¥w8µ³¬lúÈ–wxôl0À¾›—'€xN÷YµŽJù½N©x€ËÏ~õ@´Ê †»˜ÍÈt:ü$@Üwß))?ì°(z*q=€l®ZbˆvÉ4!âìN»N¨=çî‰ ?¸ÿ€{ZÝŸ Ûïì¨bÌíKŒ¥»2î0O ”G«g2å$Këvªöy׌ˆ­ÿÔæÿ]o%••ΞÍÍþëj×½{€ÛàºOœúea@JðÏYæË-‚wíw°p¡à“§|“Zß rªÿcA÷uÀ…°·Hàüi€K"emåWCCCCC£æR¹ó\B2ÎÔPŒ›ò^(Høf“@âº[ ˆžPÞ ÿ“OÉ÷òN³Å§7Âz~;¾°ì7ƒéƒ2O€ =–ZçÚ²d€–už‰pÊ .@#Õ@ÉÞŒJŸMo @së?TWÄÒƒ–Æ}WÔÝ®+ÃÿüàéÃûw1c¹ :~÷²Z> oÖÙ)1™k?¸¸ùÓyE«SòÄBëFb© f¤èwZ T:‰[Æ·Z^–•O:>–ưÌÅÀ1Ö/ ÀedèfŸ…-ƒ‚³{¶¸¿Ó}vOºMü'󦡡¡¡¡¡a;JǤý òü΋)Kw\È.zìÿÚ»Ïø8ªëÿãïÝU—,ɽ÷N° Át ¦÷Ð!ô Á„–„ðBè=t¡¡÷Þ{h6Å6®Ü»eIVÝÝÿƒ¹kbÿC°ÁàÂ|è¼îìêÎÎl™3çžó=0`ÄÑïáKQUÌœ%ïô»(&ôà§|gï(}þ€ƒaËWw€~‡ùÌWÿÓšáÍ‘sØrß s–Jž­¯Øöoõ”çõüÆm~Ƕ0g¿··‚ô¹Mw@âôàø¦¿gÇ7WYÆA.1)Œ£Æ3kæCÃ{‘]|Àäö° íGŸÀìÅo óúýÚî3ôJhwÍfû@«û]©E~í+ /á{=111111k3+Pjh1ÿN˜÷ب?ÃÜ'ßé óûa?XÔy܃P}Ó¤õ þ“êg ñW@"\¹°Ö3!p¶að'¾ª3m.’Ü9rˆÉèyµOo óÿ<òðkÕßåiªûtöP¨{yö;˜8pï(Z@×êåõ“P6°Û§Ë<þ_‹ôÖD‡7Gr¹W·Ü”ëþôMþ(ùq§õaÒÿÓF>wÔ\0³-$ßóäR¾«b·%txŽÔ‡Iä‡E‰£¢dÝö Ö‡%£ß³ny{˜ùð«‹ Íî ­îÒZ>¼ÞýP¹é€m¡bÃ>{BjVñ›aÿÝÑ#Ã111111|U`h¹ëcÓâšrX4vìaa·1ÇÀ‚[?®„ùÙ«aA͇¿%[ÌݲAí)1ÆTHÞ&üupls²/_Ͳã¯õ‘C<( _K—@úÎÆý–y|Õ­eŠëk?œö4Ôüየ“î6Áá|ã[ï)z?šÃûóh´±Ý›<-Žè6 ¢~º¾BbMvx—ç+ä4’éÂG¡«Ý@‹+z>e·vߦd:}4¶#d^KGI'…×+|sŽßê¢)Üyý(&fEop¢UxÑý™ÅïO©„ªÒ)`ÊAÿÊ/í{t¸ÅsÐöºM–@åuvÒÃ»ì ¥ùw€¼¢’Aá¼ÆŽnLLLL̯[é\f{s‡šk¡ö3Þ‚š+?&GŸ³î~cO˜Uúæ@¨2c.d “ýÁr\‰æàØ>ÙK_ÕÊ9¶_Eœe"¢pD«c |@ïè:Ÿ·tÍyÕ«%jŒü§êm?›µ•3ú@âøð¼­¿å~Òá}ëmWH•w´™ùã4”¼Ö¹Å×O²&æð~S–ÓkúÑâ`êMÏtÑ/]3Œþè#høÙ¢hÑàÏî¹6…_‘#³¦‘Ëž¾(¡s\v‹È&wN6CùF}»@§O†ƒN[m; *³v‚âkÚÝÛVÜyƒJv[ÁW§HÄÄÄÄĬ¹|]£§×üšfWŸV] WÍTÜ fìôò4˜¹ë«CaÑ!¢ã¢hš¨­†[‰¹N¯ß59àÆàœl tkÜíØèü33Ðö£Mw…¹5æUÃ’Ó¯…·Þ;å2õ=ŸAªÏ*:‹ÂaNH,„õ=‚m/¸ë^hßeó=[—Þåi02™æÍañµ/†~sù0õ¼'§@ÝôÙ=!sHsÔ«cdh‰Wù¥äîê>”•"禷µ!$NI c’•ì‘åWôÛ:¸ÍXèÒuç!ÐfɆs ÿò(7ø¥¨'vêÚ‚cà o.q;<¹Ù.ïÁ'ývLúûÝåP½å”4¤×o,‡ìK™6=%56h²x™ýßäjœzÛS³¡uÙŸÁGüþZèûÅaË«:}'+² _³1Ôö™^ ‰ñ«hâœC¿0v: t¹oÇ  x›ö+¡6±.Gx¿f)£¹Í{P}Ù”ðÙ¹N¿ëNXX<¡ ’/…èž;g«ûÀ¾õy‰l(šË†û¿äGÉ÷ `§ò¡ ¦üC(ؽ²*öéw ´?j³[¡cïmv‡–w¬)¤¶(*úšýÇäbbbbbV„‹Hž•= ªžßfç½u3Ì\òÊ>°`ðÇWAÝ›³3и¤êeh|½º'd;Ge^‰Â|¹âöÜu?¹šW|sîì°(ÚœÊ+8zUð:ôÏu1´ûtÓJÈ{¹l£•ÛÑ ³ÌûòÚfÇœãïýÇDHoR+8ç[îedØÉe©ƒ¡²oßK`ǃ¼ */xÑŠO¶.;¼Ëó5ŽÖ’fî³w}ý˜tÛ}‡Áç?v 4_\_ ‰\à|}ùø²ñÚJî|4…ó4²AÐÙ‘aüPd N+.€â=Ú·…Ò“;õƒ»õl­Nü´m9ô h3ëÇeP0¼òëzxÇ9Á1111?$V2ÒxEÕù0ÿnsKß»ôuÔ¼: ,ynæ¡°ä”éwBìêýA([êH]Æ=‚M­!©Œ¹ó‘/Š0·‰\Ü䉎PñbÿÃaÀâ£ÇA—7vì •íô„äo Ž_f¾Uhº<;êÆÍÞ ^Úèˆà‹žÛ’¹õÞvßâ {Dô>¼Rö8ôvø#0ô†?ÿ ŠNj%M4«Ã×4Ôø!9¼+HæÈÆõ`þ¹¾_ôxüpø|«ÇÚÀ¼!#£P˜h ÿ¸Þjntñ]“Ó°852Ùöá|…¥‹¼£zÌÒ»¬oô͇òƒûžýúž·õýTÔöí-Ê{¾ ©S‹&~ík€LhéœüÞ›IÇÄÄÄĬÙð7r$¿&œ‘¹¤ñXü“ÉC¡jÞ„S¡jôøñ°øÜ /ÀâüÉ;CÕ±Nƒê_M92{—ö’h¾De°;èÔžr2§k9…‡-LP7(Ú¿â:èòAÏVû=]Jw¾ 7kùÉ2óÔ„Îne:/3{úŸ0µÅSEðNÓy×}|$Ëó>'ÙpT¥tضIüý ètØv7Cê‚¢•<‹Þ/©3 ëðŸ›/_t/|¾×ãOÁç=<fzíz¨{kÎhÈž=?ʤAþZ¢öð͉>’9Y³'¢;¬¨s6Ù™ÁŽˆlIa˨ܽÿŽP9z½ 2Ó&”wìÕŠgt%%¶†²õ:?É1…mW÷ÇÄÄÄÄü99­œJÀ×±uæm¨ÛrN!ÔüiÚPûË©§Àâ?M®ƒE׎m ËÇ< ‹{?Ôm¸hXM—-vss󻶨-å|¯Ú0ü"²É)‰¡"ÛïVè¶åî@ï§:Ú¾¸ÉCÿu¾ïJW?§²ˆR+²¥Ííáݲ? ãn¿msXòÖœ=!ñmÝìÃyx§`KèÐe‹ aûõ﹊Ïj¿ØÊ+>iìðþÿ|Õx‰ PeÂÖðé’›¿€éO=ÿ¨zqü¿ q«šñw˜NZ}®ËäÄH®‰LöçÁ†ÛŠdXR*Þ¥í½ÐjÑೡÕaƒ‡@Ûç‡þ Z ë9Šwmó:Ö·Ú :W”AbrÞG+ôzVö:&&&æ‡ËJ¥še·oŽ®ƒ3«&BÃá O‚†õ>µ›M¿ 6Œsg½÷Ì+ÙÕs>²¡$,1!Ø\ƒ†b§t-qh—'wÝ©ס…óvCd‹ÜêqhU1hsèýÏC6€^X…»µ\¼â;ûx'r0/[ÔÏÞºïaÖ€W'A¦OzcðÓo8ˆpgO"Üeçtþ ~ùäa½ÛÝ R%…‘ç°R×óØá]¢³4ÉýݯyLïþÂwÆm‘N_·Wÿ £ç?é?7DzwÛ†YB*À“+´ºÉ%ã‡lŸ ý@ϨÕF¢)5Ê÷èu;´yohohܦûBëc6xÊšºu€ÔVE—@ÞÉÅ÷CêÊâ õxaÔÔù°°ÔóÃåÕLdwnŽ®kŸÖg ùÖúë¡yÇš# ¦÷ÃaÞßF†¹ƒÞ+€¹'¼Óª›¦l é"Ç­«=ÁQÀ¢ÚçáÕ}?úµß=ËvtÍ%îmj¤†Í‚â‹Û^ ÝÜ+ ý»ý¼ÚümÃ+ÁY« WÙ* 3¡é1˜7âýbxqø¡›Â¢S'—Cò¦o¹ƒ)‘É©Cùæ3`ø†·‚òtï½!Qœ¼yå'Þ•'wG1#*ïÊ^’>»/zf\öbÆžyóÓ0ë©×O„ôñõïC¶9s˜ä ¬]Ýî¾OrwlQï¹ÄÄä`H’ú9$÷Lmɳ¢TÞâÚ¾-? mçl|-´»oè›ÐrÔž†‚­+_‡ÄÀä]–׃“UàÍdä--cˆ‰‰‰Y7™!Ò“=5{d§¤»CöÝt2Ÿ§7ô¿ê›¡¦Ï-`þ¨Q{ÀÜ¿¿ó"Ìmõþ\XtǸÏ!s\ã!ûzzdþÖ|6dd"‡öQ„n]_gËõOkrO&Þ†üÃË÷‚v“7©‡Aœø4´»góàð—w“Ñ kFÍJÓCÕ£`ô.×͆÷¿l}X²ýÜ.(ûvógCI]É_Úž ý¦9 69ûÂ18!%;TF7 +Gìl­<9G¬sÔS%qejNi}=t[´çUÐê±Á£aZÅsÃØnÜm>ndÆq‡ÁkéÒÌwMîÆbatçŸÍf"{~æNÈ´ çï_QÊRÓù5;AíY3΂™'¾ÒyÓŠ·‚‚Ë*oÊ^ý&@ë37Xmºm8Zõüc(Û£ë–àŠd™/ ͞˃\®7(Štž—F¨cbbbÖ¢0V£èF~±É JTfÜÛAݳ9u7Î{þóãÛ`þ›}t8,l7f:ÔýnÎ>îZ0¤óêBóùõ÷C漦«ðeÜ8¤°™å4Xªi”·Ž¯pæŽj\d?Iž•éþ¯Á€ù¿üôØgïK ¤gÇÉJm >\z+°Fݤ§Ôw†Yû¾z!4-¬yW„'üß·;_Ù»"[ñ΀» ûo÷š¿Ôñ Ýq„÷Û³\2÷R² 4¼¼`",Ê{|^ýh_˜¸ó=BõÐ/¢¦ÀácxV)hÊ¥±ÇüW¾ìáÝ(ä–Š¢FѲ·„qÈJ„D†¼SK¶„‚­*·Â•ûAÁÜ–[Bé¾ýÏŠßõ{*ªú €Š×ûî EGµÙo¥^o:üÔ§‚œ]LLLÌŠò e¥š¿Xr4,Þ{Âaáicß„EgŽ‹6W5‡MíM©:[.ÞU} éµê(RÛ:û"8&ì ê¿)‘slw ¶p¹¥üu\¸*èÚg‚VSÙw„CöÞz¿pÐÐrÑzïAш¶É¯˜/º^$׌ëEvRfXpóG;ÂÓçîÙµOM{ |àX¶ä%ˆÖ½l]>¾}À†Î>÷H¥ £ëm‹o³ò;¼«ž\«Á|-þÛÃÕÙ)]`ÎÝÿn_T=~ L;ü¹§ æÅÙ§C2¨Éå’öã8â7&úá~x/ˆ6f vçeŸœ”ª€âMÛ<E§µ½Š¶ýŠŠÚœ %‹:ž eC» „§u?ZLêñ[(;¢ûÏ è̶ûË×ëÇĬk|ËâÙæî5×BõM_\5·~^5Ï~¾Ô ûâc¨í8= K~?ëX¨ë2g ÔÍ›ýs¨jÞŸ éˆ¦ r0¹€Áma|Yo¶tE2÷»ôÃòr+z‹C ëÊhs&¨ ¾_ö>tjÜvt»ç¿¡ã_†_}û¾R†,3o&Ì·†®6,XxL|é®sáëþð4>Q{$îú†2dÁOJïùMݶÝn/ذ󟞅Nn·-ƒW”Øáýîùš;ó>¬†i›<·?L¿åÅÉ0o§÷ª¡v½¹³!±KôüÄèð}ƒ^_³Uøø²üX”9%»G°á¼Û5ŒwˆlÞôH6¦d\ÇßBi.Ý tD—ùPšè2J+:·‡’G;NƒâÚu‚¢ÓÛ< E[·} ŠmÆC^^ÉÙ«û”ÄÄĬ$ßÖa9,ûÔo?oÔí=÷a¨›?çr¨»hÖ1Pwç¬P;ræéP›œ6 jó§_ µm§ß K~4¾Rw8dí&1'ØÐ`(ñdØ®ÑPì ,Kî†$Ý ds*G&ÿ­¢ç¡í6é~0t}u—ÑÐfZTt–úmÑñ+¼Ï5†ÐË­P%To8ùXx³Ûˆ^0mò³ŸCz`ãõ`‡o¸ŸgÂyìQ¶7 ùÙi[ÀàgNêy§”°ê*vxײEM³`Þð‘»Â”‰ 3¾º%,JÛêÇÍ ²'Gÿ—ÈÉM©Íq*ÄwDN8=ú¶¼m̆¥‡…ñAÁÙÔØèXzp§ÿƒ =ú@Y—nWCéË]o€²›º>%ûw…Ã*w†ü‡*Î…‚gË·ƒ‚ÊùO”ïymJ:‰‰‰Y5¬¢ŽTÙWÒÏAÓ±‹{Aã‹/‡Æ«Î…¦ƒ T½õ7ÎÝjGMÕ×}~9T—N©‚ê_N.…š_ …¦½›7‡Ä½a‡AÞ*q[°!•ËQÁ¶^G:ƒ~_¤BÇ®3‚¾ü&Ñæ¼ •‡öÿ;´½e“è9yß«¡Ó“ÃÏÔŸ‹f,3_½y H›Õ}h+ŘH•jfëÇà Gx)Ôµ›“…ìöÙ#@땜7¤€d£’IÝŽÛµ 6|á#¡ÃYÃúàËF^ù¾e9±Ã»&ðÃ2w5.€ùÓG=®ÿGo˜Yûê)P}Ñ”× éæêK!ójötHœ&踎¬-, ö`£ 8ÙWÂøÙ`{D&ÕœEŒ»u}Êè5ZÜÐs"”_Óë|hqr¯g¡ìº®—AÁæCjFá.SX©©…!ùfaRO~©« £– ï&>^ݧ(&fM%û·t$Ãõㆤë¢b­Êú3!]Òp7¤Kë߆æô’7¡þž¹oAõCŸåÁâ&‚ê“&? ‹™¼ªÛMÙê³ £ZŽEaÇÛ»]d;…ñ°`ãÛÜUKNMá¥ÈdÿÙ¼ o…â±íC›]6š }Î?x[èvëž@^×â©ËÌ·†åà®ˤÐÕŸ>wŒ?èŽø÷¤Ó@vRf7P±Â~Fô¼æð¼VzBáÝ•ÿ›®ñÓÐwîa'AêoÅ›®úC‹Þ5—iž§fï€ÌË¿„yUL€ñÜ^ ÓþùüX²ÞôÁ>¤aÈvÏF95­Â|kÛ×î‡F*Üðt´$ =ûŽODj'$ZAâ·‰¨ƒÎƉ‘<¢àt(ݳӯ¡ôÔ.õP6¨ÛGÐb¿îWAÙ˜n£¡ô’®»Ci».ï@ѦmfAò7‘Ü[bxjKHì“· $·HA¢U2ªÆM§ÎŽl2*Wù8]z[5‹˜˜5©QM¶eævÈŽO÷„ì˜tÈŽMw ãÒ0Žl]æ8Hÿ­±'Ôí1ë"¨®ù¢j*¦ ÕœRÕ‡NùT¿0å"¨½dêlh*­Þ²‡g¢ïÉuÙÈ^•z‚]•ÙÂÅ÷ÅÐR!³´‰{ÌwCäxe‚ãŠË”EWÊäþùŸ@ÞCÅOCÛë‡ö€¾[qtc?BÁÓ-ÿ‰yÉÈñô(R!—uaÞ„~ ï?uö}ðÅK?Ùí³›Á ‹¥åŠúZêÉ{ò6†~UGäÁà6'_•÷®WüÝMìð®=„;ÆÌ¦±~¿~'˜ý¨}`â†wÏÏg<òOXrÊìõ Û!ý*xІ Nôƒ—@­™ä¾‹¹…ÇÆ¯°¹Ä•‚<^‡äã–× ’û¤¢%ÏR{Ab—Ôš‰Lˆ^¤ÔIDAT9ùePp|ùt(ëÛ5 e×t›eƒº•Bé]@É´Ž›Bñzí»Aq×ö›CÑã­ÿÉêü(Âqb¢$¶Mü예ê–wto߉Üö­ƒçƉ¨9÷¢ØJ§Pï]åŬãÌ Âúï9¼–ýxÎþ}9õnz%dQ>/Êí{.J"ʾ’ʺïŒb£™‹+¡n—Ù¡ö¨'À’m¦w…Úm§¯µÃ§ßÆ÷@í iµ°$=«#4]XÝ2»6½Ù¤/‡ì]é‹ sGóÍýkú ȼžþ œ]¶x§à+l.±F–*­ƒä~W9Ï'çB²sAÚ¼Y ô{íð6Щå¶ëCI‹Nÿ„ÔÑpÖÿ%†¬Ìn×V¦ {ð÷ðÊÉGo ]Fk•ï‰Ö’W4ñgVd’Bé±]7‚áß2:4|$¨J>þã;(ÖŽÞµÿùÆgöjÜê?¿¾øÉ©0å݇ÿŸU>¸,ÙeVT–p‚AÈÖ&üôf–ºR1k‰ðyh ŸÏÃöÉÁN\ÖfsãOƒ- Ó4GÂm©O ÿ ©'£Ej|a1$ï)¸RûD‘àžQã-ò…ÔÖE¡è°VÇAщí^„â«ÛÝEW¶ý5_Ù¶Š®n;Š×î(z±Õ/¡àœ–BÁÜŠ ükA.;}õ²Šr:×`Öìéí¡ñòE þÔ{CýÙso„ú^s÷úó–@ýMQ1oÝñs“P÷›¹CýEsë áÙùEÐ\X·¤n8 2ÿ×ø4¤Ïhx 2j¼17ÞéS£…ÌM»B¶Â|% '«o÷ ¶°½‚-_ÎjŒ<ÑŠØ»Qä<TòÛ•CǙÀÞG<Ún¼qÔ¹ó†.ƒü-Þ''¶Z݇ò}²äÈûÂè®]#ÿq~T^öëðÉn²b-Žsï#õ†¼óŠk`ßœñ: ÜòèB(šÞnøwT±Ã»öÒÔ –þƒìÀæ¡Pý‹)ÀÂÆ\3wz¥ ¦žóÔ=°hûO?…ôžÙ("xq˜à”Þ´t±'f]"ç¸5Gî‹°ýáÈd㇂ UÜÙÛæÕ`?öבIMK% ïÒâžw[qHÝR\y·©[‹CÞ_‹;BjÇ¢7 õra3$]ÐòFWCþ>-ºBÁkå»B~«ó!ÿìÈÏkÑ ÛT< ùÃ[ÔCÞÕ¥@ÞcÅ[Bª°(Ê Û²èO÷¯’!Õµè"H]Z0RŸõ„dmAîÌü°(ÎìÍ¿­ŸͯÖþ šw_Ò šw\Òš_Yr)4ß±d>4·[²54¿]û 4~P=šÎ«NAS]T¤Õ8³êIhÜ­ú hµø·ÐübígÐ|oý =©áVHW·š¨ÛÒÔ_ͧԵ‡ôÏêzAó‘u;BzD]Ho’Þ²9½ØÍ#“S»‘ˉÝyY›Ès­à»›Œk"Ö BBH6èg¢†òJN¨<:î°õ­Ðõ’ÝmOܨ3Ttì7òÏoñÀ7§†”·ìõva¹Z¢éCž;>øÕ¹Å0£Ë«çñ¥žý×ÞÈ…ó”=0:oyÙ¢?Cç>ۃ͞ºì¨Ü´ßÐRä¾ÓCìð® ä:êDú¿Kc ËPýÐgûÀ¼²ÜÇÞ³j_ŸóúðzhX¯®’9Ùš)a‚–qG¸˜ÿ ÷›QìÓas¨wO°w‡íw/·=ØìÃaüB°A.ñ“Èæý.õOÈ«,i©ËŠ#‡x\ä0ç[2ò¶-Ù R·¼¡Eƒ y]áiìž¿)¤¶/XÉ+ Þ†äà‚ ùvþ(H¦ò3z²àH.É?TAêø‚qø<ïQH H ‰¡©Û!q]~´TúD2Š©–}7'O…äa÷C"•<tå6„òÆCÑ-GQHå¸5•)å"U–FöBfrc2gDªž3 ²/¤?ôõ ‘0üF™ŸBºGÃhÈÞ|dº6µ€Ì¦(§´}Ó¡>»é'.¬¿ÒÇ6´‚ÌÑaûC^ܰÒÛ5DŽjYÔ‰)}XÝHh^¯n64Ÿ^÷4?W9Ô‰ºë y׆¨CWîèÆÔN? ã}–µ‰ðxN*g—nÏ9´¹šø8Òºns„Òá:À³!Þ˜ 5+es;”B»a›€ŽÏ ;ÚŸ³Åhý‹!à õEñ¼ÿºŸtpSK¿w? BêÁÇ_Ñ޻謖Ðt}ußükþ?÷þ¼ÞŸÓ]-˜„M׿äqè²ÙNU<8?J‘XNí»!vx×EVh‰²þÁ¹Ãì;Þ¼füíåWaÞFï_ ï{*,Ùl^_H„ö ‰\®ÙÎA¶¥yi‘Eü)Šùöät/§‡ºé—£ÍÙ'ÂãAå"§ß¸TõâÑ0~.Ø7‚lhñ™³Üö\ŠÇgÁŽÏ îP’'¹Èz¶ðHvÍb…ƒü’‡æµƒä¿ó£ìêw“íÁDwAâ¡äº;J IôI=E„êÃÒù/Ñ 8”›^•Ïó—‹,5DÏOÿ­akÈî‘Þ²dÿ ÙkÓ# ½[Cd;¥“~­>r”fþ ™©ÏîNÿaþÁÁæj¥7vÃð¼ÜöÍ‚ÝhÙç'¶ã\D51Ý+<ö·´3W.% èÖ¡+æ“S/šE ³áÆ&®C©MPvo&hõÁú;Cû›6»:_¾ÓÐzüèû9"ÿÙÞ÷ÅïMÞ>xàœa0v¯Û/‡Ô'áw9³TÏâ¿“ܲ§E)e:õ‚w—‚!Në©!…«á}ˆÞA@[jÙ?éau×Üß}>¿òÑÌÚêõÛ fìç÷A]Ç9“!ótærH½¥9ÁâHpÌ:@Îñ® ß—\Žô´`ç›û”ç2Úæ›» Ì-Ì…¦lîÿk—ûÿÜíéò*©¹¢¦å£sÏ­<95–Ü·º"Ø.ÁæjŸ{›ÓÍllQü½YÈ}Î? Ã’’84²ù—M‚ÒÏ;g¡|Ç>N?Þæfè~é^s¡âžW‚{-3N§>/WÅóŸL8üýáó/yæùq[Hñ5ÿŠ‹³ã£HmÁ‚ÒñЫËŰÉã ÅÇwˆB ‡-ýýkb‡7&Gc¸d‡”ˆÌsMÇ@Õ±ãv†É¿½¯¦žþÔh¨þð‹ © :Š$õ«Û²;dgâˈON/2çÀÅÄÄÄÄü¹>¡¡˜,·Ò’8=J ÊÿiéëPtm»ñÐîÆMºCÏ+ö?:ÏØ~{(x¼ü}øá1oB»7ÿl™ç¯G7G¬ýóÿ}€{Eú— Éý!Õ'ÊÝ/™ØùAèÖe÷^Ðñ•­_ƒªª ?ƒ©‡?sLÝüñÝaÁáŸ\ ™¦æî ® Öô°·x 5&&&f]&/$Õ$4ƒN®€‚½+—@Ç;·~º½]WÚÜb8”ü¥ÃÙŸ×" É –]\?ZÃ×í:æðVöD˜ÑæÅ1°¸lR¤çŠÖýè+rêsÅiG×ï6wl° <ê—»A—æ-]þc ?ŒÞ˜ÿŸÿýüSb_¾TgÉû}IŠ~Üú(ß«×èqÒO΄…»Œ©m^¸¦]ø\ Ô~8+ÊÎ ¹†‰™aþãÔ‡˜˜˜˜µŠÜ¯uÐ<Ȇ%ðlË;1¯?T®? :_¸C:Ýno(ß®O9”|Þ1j•Þ»òFpÛ×î1Ößø&Ü£;4ͨ~ fµz}$Ôœ65ê wfx^ÎÑÍN òe­"G·üú>ûÂú]N|ºŽÚµ ÏæE‘݆ ãS¸´ª`5çðÆ|S¾ŒÌFwz_ñ³“îY·T=1qX8ô@˜ûÁ»¥0kÎëCaþO>:Ëë/‡dÈN„¢¿ ¶e(ãÉüå=11111ß%…¢VçÏG²xÙõ¢ÍÙºÈætZ+nè³´ï´é¥Ð潡åÐòè'CŇ}.†ù=_Ó“#þëþšD3çû[ÎþðÈöo>f<øòùðæÛ#n€ùÙ1çB2¤œ( j1§G·2‰DðªüÃÀßÀ º;@Ïúý®†Â3Z]ÿ”Im±ºõKb‡7fU“ KVÉÿ½~PûÉô ˜wÜ{ïÀ¼­F> ·s,*ûtO¨j¿=4U5Ž¥Uç‰õƒ½!LØ"®2‰‰‰Y%ä|‚ ÿ— ²q™¨¸ÔGŽ…ÒšÎ?ƒÊÙ:@Ëç×;ZwÝ`´=kèeP9pÀ^ü¨àŽÕ}h1¤¨› #Gž—c¹y+Xò×Ù£!±yÔr%[µ&Jn’­÷<Öëÿ«› ÷Æ?½ òÝâÅev°Fv¨Œޘ«Î<$»5TUßf÷z«Ìéøï±PµÝ„ƒ ¦ÕÔ³`ÉúÓûBcÏÚ¨…AÐ MätXÿleœ"³ ‰Xáw3¾dCÃÔщ Pür»¿Céú]Cyiï¡Ðzß @ûS6¿Úîºñ½wgéôÿºß/eÁJ–¾’˜ïæ?Ö> ¯}qÜA0¥à¡jhøkm´‚:jæmSÐÚÞ´Ñî0àü_,€¾»Þ’w\·ÌÄk¤£›#vxcV7˵4ü*ªFŽ¿fÎ}õ#˜q‹ÛžoõÇÍ? Ÿ]´4Tw:dC„"±¼~—Xà>&&f'ú›~çÞŠ6fC§ÃDX1KnŸw&ìWy^Zy”þ®Ë¯ ]×MŸƒ.ît6´}ièI_W¾ÿÿÜûíýpIÿ²>#·>ÿD˜ôø=×C݈9ÇAÞ¸’ùкï5Ð?uÔFÐë²ý€û£Ô†µ‹¸h-fuóÕŽnô] TWÜ×·”Ýç9è[yØ-°¸yÒoaú/ž¦=ö\7˜ãÈÛ éäš/ }~ÃÁy¬i7ÈŽËDÊ-ÃÞrñ†\¦Xüó³¶»mÏU6„œZÕÑ#‰ÇC²e~H¾_pä}Pz#”uì~1té°Ý;Ðù;ímß`CÈÿMù(H|”¸<ŸÌ¥&üo‡7vt×HR¯L‚ù¿xò¿(5¦Ý­» ù:Ùvh1 ×ŸÁ3‰÷ÂkaÑ`áY[Yõ¼Êþ5}¤7n¨ƒæçk5-§~³F¾¶#̼ýÕ Ì=ùÝË`IË™ÑRÌ­ÙW!»wvoÈœ9 Lö/|ÙS=&&&fM#W±ÐÚHž˜îO< ‰;“7Aá­j õ v~;´?p‹³ å9ƒÔÅÅ •*ü;$;Deiû›ºº5f2?j®žmÈœéê>ƒìÈt ’åù|½p$ú$ç~£ý¬QÄoÌÚÆ vjÉþ*½94¿¸ šNY<ê·ž7ª˜ð[˜7øýaöˆ·'ÁÜýÞÛš{ÖÿBÂ…ÄIaâMƒ- M\³_Ó[<&&&æÛ~‡ü;Øèv|©üW2(§–žÒ¥ ´Ûx“û¡CÁV}¡Íü¡Aé5ï‚ü=[¼Ç•GUùÏ<ò?÷Ÿ ¿sÉe[ÒǬu|³Èlî:—X›ßÿØáYWXÉ\±æô’ P¿åܨ:µÅÌc zÈ”c`AÝGÕ0ïÈQûüvÜK›ý#ÈÞÍ“È}wBÑGâú0îl".š‹‰‰ù rÅ[£&»Ùß…íA–1;4ŒŽLéImß…–Ÿ¯÷hõôà}¡Õƒš Åè= xh‡Ý¡d@Çã¡(¿Í; ¿¬îCމY=ÄoÌ…”KËQ;{zW¨>vòÞ°¸Ã¤¡êׄÅ'Nx <¹5T5% KÎ+…li4Oâ©`ÇûdØÁáKóXF-&f]%÷íßûlÈxÍYÅlø]HQ§â£Û¼å {…òºÞ³ |lïk ÅÈÅPö«nwB‹.=O„²ç»^É_lêÑ *[ݧ&&æû%vxc~è¬ldøÚ4,þÕÄ,:{üi°øÌ ;Àâî“O‚Ú·gô„ºN3%[Î:꟞»4÷N¿ îŠæMÜl®ä„`Û†¢¾ÌÒE͘˜˜ÕMžè–öƒHf+{nØþËÈd ã¨ÔGª$ñ>}ØæwPür‡_A‰Ž¡lx—þP^ÜgT<Þ[¨|¢ÿŽPqKŸÝ 9¹°£˜˜˜o@ìðÆÄ¬+˜ù”™ÜÔ UcÇÿ üäzX¸éÇ}`áÇc/ÚK¦Í†Æ› †ª~3½ÍÍ Ñ…í”0ñ1ÁÌÄÞa¼C°]ƒk¢cbVž\êQcø¦çJ´rú´‡ñ}Áþ_ø·FÉù×—ÝãÊ/„‚…Cþ§åAɳ/Šõû=­žXÿ§Ðzô= âÈþ?ÔŽ…+VË}ÅĬ$±Ã³ªˆ¾EÍQ.žÅ¢.ò ½ý2[4ž5¿šz>ÌkõÁb˜õÈ7aþÄQ=añ“'ASyͳ9¯ñIHoß°¤7jè™;« ›²Š‹Â«il§`;›“a‹/“1?$rë#󃳜͹™!~šX’¸ ’Ç †ÔÝ…×Aª©ð$HÞ]x-h³Töî÷hµÃà# Õƒ®„V¯ *„Òl—í yh~”K;!äÒ¶%7TèòפV¬11ë±Ãóý2Æ-`xfdžH¿ÙWÒc {qóÐ8bñ3PµÝÄgaáf£Ï†E?{,LUgLx†,ܲÿJ?Ùéë!;-½ d?Ê´„ì.™A`†×°V©(ÆÄ¬4ù!õ`+…ćÉ$êR'A¢>ùGHLL®É6ù³¡pjË—¡âñ~ÿ†ÊžZC«>ƒvƒÖ½‡ì -¦öÜòŽ-ý[˜÷Hlœ¬…dÿÔ<ðdòuÐÛ«û”ÄÄü0‰Þ˜˜ï‹•“ƒy8ÒÕÌÜÒØÒÃðe„7sxã%Ðr²HEÚ€’“- k%aM#/j!“8$1R÷†WvSûÞóú­û÷ß *JûN‡Òá]݋ZCò©Â'!ÕX8RŠÞ…d~~‘ma³<‚µP°?&f] vxcbÖ ²·¤÷‚¦Þ5 iãš(%âºÅ—Aã3U@ý’yo@í“Ó…Úû§EvÃéePS2õ ¨MNÛ jë§„Æ‹ª› Ûv˜ËaÌçìOÃöÃ8×Êy@°ù±LÛš\jA®_Óc‘É>ÆAÕĽaûß—'BNmщ-߀Ò#»Ì…²“ºÞ¥ýº ¥õ]Æ@™®¿‚Ò-ºný+’ÿnY ò_*ëù3˶‚ügËn‚Äœ¼I+u\ë„NiL̺LìðÆÄ¬dƒÌZâ›5ošT=ßÅrm«¶†ÆSíª>ƱUBýýóÏ„º-æäCÝq³ï‚%çÏ*…º¼Ù—@ýésk¡a·…‡Æ‡CóîÙãð¥pþ¯#“øYGÙ‘aû±aOäß/Ø\<-× :Ž—­*¢3™kð’Ëq Žhv9‡Ô³Á>¿-Œƒu6§K}{°}#“ßœ5ý¡Õt(ܱÕp(lÝú,(Ú«Í9PrUû¡Püç%PüLû‡ ð¨V  ðO•BÁæWAAçÊ‹  U±-þ¹r1¤Þ)±ºOlLLÌê$vxcbÖmV°3ÝŠÒØoá§PwüÜ®PÍÜ' >^ÔÿvÁžÐØbѵиó⇠é€Å} ñùê{¡éýÅOCÓèšÐ4´úhšZÝšN®¾ÇTƒæ­jž¦ j{A:ãe,u´–F7ŽL"'Øü ýï6±E vp°•ÁVÛ3Ø ¯¼4Ž7p¹ç…ßÒDN<ª[°_§¶œ+"ü"L3s¹ýä"£¹âªÙÁNvL°;6Ì3.Œ?YîñÜxtx^ˆœzbÙÇM‘Í›÷'È›[r5ä=Pz ä½^R y?*} †–½ù÷•WCÁå‹ àΊ½ ÿÑò3 `ÓÊ¡pLåqPxB˾P°kå(üy«Í¡øœ¶·AÑñmwƒ‚9½’oJœRóƒ$vxcbb¾G‡/Úê/˜?n]P ý‚}dþ¥PßfþB¨¿uÁhÜpÁiÐðªK¡ù„Ú®¾¨q d&6þ2Ó›®‚ÌÔ¦w!3­ñ¯‘mú}ôxãhHOlº2oº2GA¦gs”¤±oæDÈþ<{dJ Ù 2£ÀQ+ÌÍ‘ËøËÛLf£žôÍ™ž}¿ùCÐ2‘s¥ÿ; ³#!±QÞ1(LÍ3²Q u‹H5 1$µ ’ƒ qLêPH>ŸWÉOò‡äyÇAâê¼ ùaþ^™ÿ^dó.ƒÄ«ùÇBjtÁ ú¼hHÝYØòfÿ &Wl ù7·x ly(äUþS(¨©E#Zo E[σ¢²6‘M¶Ý ž©½J?P«ø†.&&f]%vxcbbÖbÒ/5ÜM=j®„¦²êaÐTQó4—Wï« ¡©²f:4¥«w…Æãª÷„æ+k>…¦[j£ÖÑǤ‚ÌÍAznÃå–Ž:Y=õÌjîP·d®mމä{2·6ì é .ÿ?äS—AjdÑH[8 ¼‘= &€Ô›…3!¹~~'HíZ4 òÊKμ]K…¼%@Þ#%c!oÛ’v·UÙÖ?¬ä_×­t_(¸£â(|¿ÕfPPUñä\Òý;~ ãˆkLLÌ÷@ìðÆÄĬ4E®LpøÄ•àãìea|UGŽê'. ã«#9˜>p9ø4lÿ4ÈÆ-ö¨ö9d§e_À—j¹Îw“Âþ«—&DÅKs³‘ Õ Ïãë[ZçZ_w² h›¶Ì~òC+ØŽ¶mDòr]í ‰¾‰A¿P>Ø'Øž‰ƒÃöC"›8&Œý_xÞV‰è< sØ$Ÿ!~ö_^iì˜ÆÄĬ…ü?I òOpiõ%tEXtdate:create2023-01-30T14:11:32+00:00Ûv9º%tEXtdate:modify2017-09-12T17:00:50+00:00$C„(tEXtdate:timestamp2023-01-31T10:20:24+00:00JµcEIEND®B`‚fpart-1.7.0/docs/www.fpart.org/docs/img/ext-logos/Oracle.png000644 001751 000000 00000017621 14745137273 024643 0ustar00martymacwheel000000 000000 ‰PNG  IHDR^ˆ4ÒT cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEç 4Â4+WqIDATxÚíyœTÕ•Ç÷½zµ÷ÂÒ BÓ€tCThd‰ŠQ0£7 3“™L>‰qËŒ5.P3 âB¢‚0‚š¨Èb³É¾(44[³öRû«÷Þ?îëîê®ê¦—ª×My¾ŸO}ôS¯¹ïÖy÷ýî½çž{.;Ú·AaR{W€ âÛ /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /A„ÅðAX /Ññà0 ñ_‚HClí]vsó€`,õ÷b ZÙϵ‡ÕÜ“±ÔÚ'ÃdR§l0‡Fu¸?`mÀà7¬¹oÃò{ÖVþþ–PÓAZa+Iªoóÿ™Ë€ƒ‡ÂÛV1|»„×I1·rÏž°\ [AlÝ»y<€-IæàˆD WTB?zÑýû¡)ƒqö¬h¨Í`Î!÷èÌŸÏËÌ´F€£QèçÏC+-…ºc'´ƒß€ƒ­ï4Z€Ò¿?ÜÓ¦Â^<Ìå„~æ,Âÿø¡+aTU¥þ…2„ØJ9]aëÕ Jáe{åCêÜ ÌéLþý Á¥ËY» u튌û ¤Îê=k Á÷ÒËÐë8¢Rc«Ü\ØzçC)*„-¿7¤.…­RÐ^B+V"ôÁ aÎ!_r \ß¿ ríð„>üH¼gÅNðí^sÔ)uéÇèkàºa<ìƒAÊÉSl©M…=p‘’„>ú;¢ûöªzáûr)#Îñã!wʶÆT1õÖ+*)Y໋Ù¼дÔ4hÀ}H1²û”Ë/¯ýZà5Êw¢úÙÿIørÈ2”ÂB¸nú×\Ûeý y<€,§äž €ºgô²²Ú£äñÀuó°uëVûÃïGà/oC/;Úþ‚b€Í¥¨®›n„côha+—«ÞÀ%ÙµŒ: ßœ¹µ’œ“﬙€aÀ¨®¯¬„Ô©2f̈́綾­é¨Û@ú /ç`N'œãÆÂs÷tØ‹‹Í© êF©IÊ2˜× {ñ`Ø‚ûÖÉ}°·ßvøÈ…çB¼S]Ïõ–sràžt œ£FÂÿæ[¼¹Fuur4çrrñóŸ Ñmð™Ý÷Ô)ІÞkÉÿœCîÙžNƒ{ò$Èyyu¿/Uíƒ1>|/¿íðá˜)4t½Þ³æŒëzÇðwä¼b|œƒðªÏk§m³ÎRN2~úïºv…ïù?$W|% ž©Sà9"ñsáÌn‡gútD6nBtÇÎäÌP8$ ŽkF!söOa:¤NSÝ>8Gðƒ•öYÇ|îà¸f26öaC­³€ðg«„‹¡Æ`ËËC¤¤rïÞrrEQY îÀÖ¯ ½MuAÒ7ªÁ0`ëÛÙÿÞûî¢ÛXC©YHŧ!æýíW^ì§ž„çöibŠÖšla™ÝÏwÀ{ÿ}€¢$ç…3 د¼žéwŠ2ƒsØò{!cÆý`Þ¶ßÛt-¸où:=óìÇÕ¹¥ØÎÑÒRø¼.|çƒð2×Ä èôÌÓ°_5ÜR[éÇÃ?ïµú®ÎÁ£Q±.Ã9¸ßæp@;qÌëWÕö¶ØIϯa@îÕ ÙýãÆ&ܘoTWƒû|àQ I™$I˜Ã ); Ìáß5¼?çsrùà€Àâ÷ÄÈ·¹è:ô“'Á#$Í£&10r×®bšÖ`™) AY\Uxç]Dwî‚­¨0 ±·¿´e3Çv"½„×0  Ï]w‚9ìq/4WU-†oîKÐËËÛ¶©¡uÒƒïÅ—¡n߉¬eàÀ8ñU®¸îú!ªŸû_@×/\. 1ñIÖKS޶o?ªŸ{ûöÜ+æÅãRf&ìÇ"²iSËïÁ9˜Ëï½÷ÀÖÿ²ø:ª!°ð/.[ù’îpŒ‰~×&"òE B~°ƒÃ1r$ÜSo‹ŒAݵþ?¿-¶R×”)IbÇÚ‚7âc^9¹ ~<RnNÓç°õì)|Ê Ÿ…ßàÒeàþ¶Eh¤ œCÎÍrùwêÏD¸XpùûÐŽíSÓ¬ù4gÍã"#=×8‡”-|» Ñu„×®/VG^ Ö--…ãê˜Å Î!y½°@ݲµ}ëÈ9¤œ®pŽ›ð²v¤¬ù£Î!åæ cÖŒø.ÆÀ}~øç¿ýèÑ„Ï(ôñßá7®LŒ+×1r$ÜSnƒÿ•yMÞßÖ¯RFFÜ¥èÁo îÚÝqÚFÀÖ§/¤ììß2@Ua»´/¼3gˆY‰0Æ Ÿ:ðgŸ‰ìciÒ9¦ðfx!åv«ÿ½éfˆ––vŒ©{l•ƒAD÷~U_x@’Ĉ·©ÝA©Æ0DäÁ¦C<(¾îª uëÖæûøƒgê8F$Þúø#±¨ÕÈ¿å>ü ^‡}Hq¼+Éfƒ÷®» nØuûŽÄjfyc.WÜýµ}ûÀ«ªÚÇÎÎ!çõìö¸ÈævÃ{ÏÝÖÕ…<ªÁ÷Âp5š6¢ ¤‹«s±S,ÃwÉøaœ9ÓñF4ºýøñøïƒÔ©SËË«‰ÒhëÇfƒ­°?2ø%¼÷ß–Àϧ8uûöæÕË0`t%2ÔÍ_"ðÞ’´s7¤Çˆd)^$‘í©#îÝæ1‰›Àìöx#FÀ9þ:ñÂðšèóUPȹ¹u~æDuÐ4—-‡~üD³ÒZ²ÌL3ô+/®,®ª¼¹ѯ¾ºpYºŽà¢÷à=Ž«¯Š+ËyÃøºíÄ ‘$‘þ3Q#pΓžÆðb†)¶öïˆj¢\þïU§Ow¼SIáÕ„À2oý$*̦ÔíŽjïÆ c`^OÂK<i™›sD÷íƒë{ãá¾ýv±y¤­4’ß"¼n‚K—5»÷Ä p^]ÂßY·ÁeË›W$A?u þù¯A)*¬KzdÖµv;ñÖmÐöï¯ÿ¢xDM¸œ¹\IÚr>ðH¤ñ÷ÅÂÓH‹›Q.é÷|ÒCxÍœFu5¤Îë_ÊðBîÖ ÚþÒö®e}d¶üüøï9‡~î\‹¿qæ ªžýègÎÀ;kf|œl[1#ªŸûCó\7†¥°žûo ÖOŸ†ÿÕù0**šÿb1†Èšµ}°BÄð6°›Ò¿¿ØNüÄïÀC¡zÙ¬ŒÊÊ„é7k|¿än¨C?w\ÓÄ 2Î…]“‘³¢)$ ê®]üùm ªY¶g%i#¼†¯zy¹ªÁÜå¤ (Bd]I{ײ~½23ÅÖá†è:ô#GZ.š’1;w™?ÿم욃énˆl܈꧟Etw3"Ì…ϽwC¹ì²„îŸàâ÷ùrKËÄ®&)ö›oÁqÕpØ”íš8Al'^±²®l3½ …jS Ö AêÔ ú‰$¼€°ÕÑ£"ïBì›éŸ7êî½)CƴÇ͸ûô|&é#¼•UÐ+ç ®9ÇCð½%ñ»ÅÚ Ã€½xp|Âf3kZôàÁÖ¹FDX´FE2|¶Þ½/,¾Ý‡sèå§zÿoð/\(ŽžiÎè”s8¯»î‰ÞKݾE‹Åßél¡ñ8ô#e¼³™üR¤ÝlGÂ;sÔ»êÂÓ̸FedO}÷Ž­Oo؇ EhùñÖ#}ÑŽ”A?}¶Øð;Óà á?N}%¬È£Òޤ‡ð€¦!òå—pO7µµ†cìX„–¿ßþÂk.8¹§Ü&âJˆbôë}âPÃ–ì ‹…1À0úèc••Èzä¡„GêÄÖǨªIaFÁýèååP·nEèÓUbñ«&iÌ…¨ÙáG¿XNÐ耤O—%IÐËËúðÃøí¶œÃ~ÅÈüå/DÖöˆ 4¯ó†ñÈø×‰æg Ú¡ÃòIRmݳ•?ŠÐßVÔŽþb¿j8\?˜ãüy¨;wB;|XˆnK§{ºǨ‘ðLÆ •–Âÿúà¡0x0(ü…ûöÕÙ§¥Ÿ&l-u邌Ï‚”›[Ûá…׬Aôë}qÎìvdüx\7ßܾW: ’„ÈúõPw쌿f¼÷üH„=¦z¡-M‘Ñ©ócí]‰¤a0NŸãªássã.+ý ç÷‚VzFMä€=¶¹Ì=y²~ý+1ÝM°àäŸÿŸ®ª·/wí ÷m·‚yÜukŽJ‚K—Á8}¦éßÀŒÊJD¾ÜÉé„RTÓÊdÊ€"(@ûæ7ÙR»˜‰³³~JQaü¶àp¾?Î#PÓïjœ?Qá}Mü z°õì^U u«È×Ê}>@–á} XƒÍÌã}H1¸?íà7õsFX„”U炊µ]$‚à_—¶î¹´ÆÀƒ!ðhαcâòŸ0E}Ð 0EAtÿ~ð@°.i9Ñ,ÒKxM‘ᑜ£FÅdz2¥ öáÃÆéÓ"Qºûåß©; .[~/Ø‹‹¡Ÿ8!r1´dO’à~—8¼3Áh7üégð¿ø²ˆM¸^V¥O(……mßu×Y†­Oo¨[·ŠrÆ —…í²~P âSJpŒ¸¶¼<0**…o»æxõ”|P»rߤð¾·zy¹Øè‘²ºÔÿèǎÖ——0ú†9°)†RXðÃ8w^lTJÅ»ûIÆé€ôññÆZ±Ê€ðÞ{wü9g”¢Bdýæxþ釈l؀螽¿©&çÌ5˜g®Ùò{Á>lìC‡@îfæ‘HtòÁ¡C¨~aŒS§R·`afâòÿéÿ`TœGæìÙº6HXÃ9”¢Bdÿî øþ8§.Ñõ…ºaÀ^\ Ïô»âOLf zy9üóæ‹XÚXÿº™‡Á÷ê<°¬,{ÜšÀEgëWPäÌ9ä¼ùÔº†džUZù¡7{èA‘{µm¤Œ düó!wëŽê?¼ ú4"¾®ÆN f ê—[¬InÓ„x•¨=à°§NÁÿÚØ]YÿDÜÛ‰£_-Ö®CåoþYýÊ€ñÏ+vÛyÃN4IhGÊXò×ú»ìyf­JœÔJ¢»v#ôÁ 1‘e¨[·¡òQa+û°¡ñ õ¶èÛDa’1ÎCàíwÒ&ä/½|¼±˜GºD6m¯öA)(SÙöî)Í“"«× ê‰')Yß䆤øxÔAø;Ë îØ [Ÿ|ØzõŠ/G–¡ Ûe—AÛ¿?~qÇ0 !ë‘ÅbfØÝÊJT=ó,¢;w^øei«W’ —Ÿ‚œ ûâ¸ß"uéf·#òEIm̲~¤ ê–m:w‚­W~£‰tRW£ðÏ}á|R[W–á…gÊÓåÒ˜3êß?uÓæú;ÿNœ€ºy3˜Û ¥Oo1±0oƒÿ7|oIûØ%¤¯ð¢a¨*Ô;¡nÛ¦(s»¹ÝÖ:éÍ{qMƒöõ×ð½2¾¹/BûæPÓ‚”*á)Ç8}êÖ­ssÅ[ êcëÓöAƒ =ýرZen72>;áðX´Á?¿Ýh[ÒÑ4èÇŽÃ1|8än ¢Zƒ-¿7´C‡ íÛ_ûLŒ3gù¢ú‰ºv…Ô¹³ˆxHe}CxÕ*øæ¼X?Gœ£¯™áÚÆ\¶¯Ç'¹7w‡FJÖCûæ¤ì,Èfg–j[©Û·£ú÷ÏWT¶ÿÀ)I¤·ðµÓ"ýÄ DÖ®ƒºe‹é#’ÄŞd?P3²G£0N–#²ao¼ß‹/!²v˜^6#çAJ…×,˨0ÃÍ<(…ýæb•»åÂqÕpU•"ÜJÓàºéF“\óòÅ|¢_ïCõÓψúY55¬‰jÑõºµ˜–9ì°åå!RRRç'4}ÀÑÝ»Y½Zü¶hÌn.†¦¢&ZYGýÄ Týîi±™§Æ6æ Á¨¨î’ìì¶ÏZøÑJ êɧ`Ԝ îˆF¡íÛ‡ðç«ýê+ð`eH.X²ó*˜;«ÿœ8‘% \ µ?--×£&$E’ åt…í’K ççCîÞ Ìã““5Õäà‘ŒŠJèÇŽ‰‘byy]¨XsçŠy¦MÂ[ó¤Àƒ!—,~*I±†)+® âOy¨A’`TT ´b%ô3gàžt‹ðò«ýŒ!²®áÕ«›wïdÂÅÁ–žÞ¹{·„‹}¡?§U4´›ÙY2r÷nóò`ËË£`§IYÙ’¢{¿‹©‰6ò0¥¨Ž1£!wé’òÅ´˜#²q#Ÿ~Öl;Ã0ÀH¹¹»w‡­—i+—39Ñf'Zùá…ýàß.áÅ0âãTk{TƒYFÝâÚ:jª‰÷lxŸTŒÒkê›Ð â(›Z½n¯¥µIÚ¡^û`1϶Ílºó­ [kûµbãL¼­’LtkHϨ†æÐØÃLFÛaÉ*¨¦ * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _OPTIONS_H #define _OPTIONS_H #include "types.h" #include /* stat(2) */ #include #include /* Program options */ struct program_options { /* number of partitions (option -n) */ #define DFLT_OPT_NUM_PARTS 0 pnum_t num_parts; /* maximum files per partition (option -f) */ #define DFLT_OPT_MAX_ENTRIES 0 fnum_t max_entries; /* maximum partition size (option -s) */ #define DFLT_OPT_MAX_SIZE 0 fsize_t max_size; /* input file (option -i); NULL = undefined, "-" = stdin, "filename" */ char *in_filename; /* arbitrary values (option -a) */ #define OPT_NOARBITRARYVALUES 0 #define OPT_ARBITRARYVALUES 1 #define DFLT_OPT_ARBITRARYVALUES OPT_NOARBITRARYVALUES unsigned char arbitrary_values; /* output file (option -o); NULL = stdout, "filename" */ char *out_filename; /* add a null character after filename in file lists */ #define OPT_NOOUT0 0 #define OPT_OUT0 1 #define DFLT_OPT_OUT0 OPT_NOOUT0 unsigned char out_zero; /* add slash to directories (option -e) */ #define OPT_NOADDSLASH 0 #define OPT_ADDSLASH 1 #define DFLT_OPT_ADDSLASH OPT_NOADDSLASH unsigned char add_slash; /* add parent directories (option -P) */ #define OPT_NOADDPARENTS 0 #define OPT_ADDPARENTS 1 #define DFLT_OPT_ADDPARENTS OPT_NOADDPARENTS unsigned char add_parents; /* verbose output (option -v) */ #define OPT_NOVERBOSE 0 #define OPT_VERBOSE 1 #define OPT_VVERBOSE 2 #define OPT_VVVERBOSE 3 #define DFLT_OPT_VERBOSE OPT_NOVERBOSE unsigned char verbose; /* follow symbolic links (option -l) */ #define OPT_FOLLOWSYMLINKS 0 #define OPT_NOFOLLOWSYMLINKS 1 #define DFLT_OPT_FOLLOWSYMLINKS OPT_NOFOLLOWSYMLINKS unsigned char follow_symbolic_links; /* cross fs boundaries (option -b) */ #define OPT_NOCROSSFSBOUNDARIES 0 #define OPT_CROSSFSBOUNDARIES 1 #define DFLT_OPT_CROSSFSBOUNDARIES OPT_CROSSFSBOUNDARIES unsigned char cross_fs_boundaries; /* include files, case sensitive (option -y) */ char **include_files; unsigned int ninclude_files; /* include files, case insensitive (option -Y) */ char **include_files_ci; unsigned int ninclude_files_ci; /* exclude files, case sensitive (option -x) */ char **exclude_files; unsigned int nexclude_files; /* exclude files, case insensitive (option -X) */ char **exclude_files_ci; unsigned int nexclude_files_ci; /* include certain directories (option -z) */ #define OPT_NOEMPTYDIRS 0 #define OPT_EMPTYDIRS 1 /* include empty directories */ #define OPT_DNREMPTY 2 /* also add un-readable directories */ #define OPT_ALLDIRS 3 /* include all directories */ #define DFLT_OPT_DIRSINCLUDE OPT_NOEMPTYDIRS unsigned char dirs_include; /* pack un-readable directories in separate partitions (option -Z) */ #define OPT_NODNRSPLIT 0 #define OPT_DNRSPLIT 1 #define DFLT_OPT_DNRSPLIT OPT_NODNRSPLIT unsigned char dnr_split; /* display directories after certain depth (option -d) */ #define OPT_NODIRDEPTH -1 #define DFLT_OPT_DIR_DEPTH OPT_NODIRDEPTH int dir_depth; /* pack leaf directories (option -D) */ #define OPT_NOLEAFDIRS 0 #define OPT_LEAFDIRS 1 #define DFLT_OPT_LEAFDIRS OPT_NOLEAFDIRS unsigned char leaf_dirs; /* pack directories only (option -E) */ #define OPT_NODIRSONLY 0 #define OPT_DIRSONLY 1 #define DFLT_OPT_DIRSONLY OPT_NODIRSONLY unsigned char dirs_only; /* live mode (option -L) */ #define OPT_NOLIVEMODE 0 #define OPT_LIVEMODE 1 #define DFLT_OPT_LIVEMODE OPT_NOLIVEMODE unsigned char live_mode; /* skip big files (option -S) */ #define OPT_NOSKIPBIG 0 #define OPT_SKIPBIG 1 #define DFLT_OPT_SKIPBIG OPT_NOSKIPBIG unsigned char skip_big; /* pre-partition hook (option -w) */ char *pre_part_hook; /* post-partition hook (option -W) */ char *post_part_hook; /* post-run hook (option -R) */ char *post_run_hook; /* preload partitions (option -p) */ #define DFLT_OPT_PRELOAD_SIZE 0 fsize_t preload_size; /* overload file entries (option -q) */ #define DFLT_OPT_OVERLOAD_SIZE 0 fsize_t overload_size; /* round file size up (option -r) */ #define DFLT_OPT_ROUND_SIZE 1 fsize_t round_size; }; void init_options(struct program_options *options); void uninit_options(struct program_options *options); #endif /* _OPTIONS_H */ fpart-1.7.0/src/file_entry.c000644 001751 000000 00000150326 14745137273 016721 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "types.h" #include "utils.h" #include "options.h" #include "partition.h" #include "file_entry.h" /* stat(2) */ #include #include /* fprintf(3) */ #include /* strerror(3), strlen(3) */ #include /* errno */ #include /* malloc(3), exit(3) */ #include /* fts(3) */ #include #include #if defined(EMBED_FTS) #include "fts.h" #else #include #endif /* open(2) */ #include /* close(2) */ #include /* assert(3) */ #include /* wait(2) */ #include /* _PATH_BSHELL */ #if defined(__sun) || defined(__sun__) #define _PATH_BSHELL "/bin/sh" #else #include #endif /* signal(3) */ #include #if defined(__GNUC__) static void kill_child(int) __attribute__((__noreturn__)); #endif /**************************** Live-mode related functions ****************************/ /* Live status (complements main_status) */ static struct { char *entry_path; /* current fts(3) entry path */ int fd; /* current output file descriptor (if option '-o' used) */ char *filename; /* current output file name */ pnum_t partition_index; /* current partition number */ fsize_t partition_size; /* current partition size */ fnum_t partition_num_files; /* number of files in current partition */ int partition_errno; /* 0 if every single entry has been fts_read() without error, else last entry's errno */ int exit_summary; /* 0 if every single hook exit()ed with 0, else 1 */ pid_t child_pid; } live_status = { NULL, STDOUT_FILENO, NULL, 0, 0, 0, 0, 0, -1 }; /* Signal handler, kills child and exit() */ static void kill_child(int sig) { #if defined(DEBUG) fprintf(stderr, "%s(): killing child process %d\n", __func__, live_status.child_pid); #endif if(live_status.child_pid > 1) { killpg(live_status.child_pid, sig ? sig : SIGTERM); waitpid(live_status.child_pid, NULL, 0); } exit(EXIT_FAILURE); } /* Executes 'cmd' and waits for it to terminate - returns 0 if cmd has been executed and its return code was 0, else returns 1 */ int fpart_hook(const char *cmd, const struct program_options *options, const struct program_status *status, const char *live_filename, const pnum_t *live_partition_index, const fsize_t *live_partition_size, const fnum_t *live_partition_num_files, const int live_partition_errno) { assert(cmd != NULL); assert(options != NULL); assert(status != NULL); if(cmd != options->post_run_hook) { /* those arguments are only relevant in *-part hooks */ assert(live_partition_index != NULL); assert(live_partition_size != NULL); assert(live_partition_num_files != NULL); assert(live_partition_errno >= 0); } int retval = 0; /* env variables' names */ char *env_fpart_hooktype_name = "FPART_HOOKTYPE"; char *env_fpart_partfilename_name = "FPART_PARTFILENAME"; char *env_fpart_partnumber_name = "FPART_PARTNUMBER"; char *env_fpart_partsize_name = "FPART_PARTSIZE"; char *env_fpart_totalsize_name = "FPART_TOTALSIZE"; char *env_fpart_partnumfiles_name = "FPART_PARTNUMFILES"; char *env_fpart_totalnumfiles_name = "FPART_TOTALNUMFILES"; char *env_fpart_parterrno_name = "FPART_PARTERRNO"; char *env_fpart_pid_name = "FPART_PID"; char *env_fpart_totalnumparts_name = "FPART_TOTALNUMPARTS"; /* env variables' values */ char *env_fpart_hooktype_string = NULL; char *env_fpart_partfilename_string = NULL; char *env_fpart_partnumber_string = NULL; char *env_fpart_partsize_string = NULL; char *env_fpart_totalsize_string = NULL; char *env_fpart_partnumfiles_string = NULL; char *env_fpart_totalnumfiles_string = NULL; char *env_fpart_parterrno_string = NULL; char *env_fpart_pid_string = NULL; char *env_fpart_totalnumparts_string = NULL; /* XXX As setenv(3)/unsetenv(3) are not available on all platforms, and there does not seem to be a standard way of unsetting variables through putenv(3), clone current environment (to avoid working on environ(7)) and add fpart variables. This is a convenient way of starting from a clean environment and add only needed FPART_* variables for each hook (putenv(3) would leave variables from a hook to another, even if next hooks do not need them) */ char **envp = clone_env(); if(envp == NULL) return (1); size_t malloc_size = 1; /* empty string */ /* determine the kind of hook we are in */ if(cmd == options->pre_part_hook) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Executing pre-part #%ju hook: '%s'\n", adapt_partition_index(*live_partition_index, options), cmd); /* FPART_HOOKTYPE (pre-part) */ malloc_size = strlen(env_fpart_hooktype_name) + 1 + strlen("pre-part") + 1; if_not_malloc(env_fpart_hooktype_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_hooktype_string, malloc_size, "%s=%s", env_fpart_hooktype_name, "pre-part"); if(push_env(env_fpart_hooktype_string, &envp) != 0) { retval = 1; goto cleanup; } } else if(cmd == options->post_part_hook) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Executing post-part #%ju hook: '%s'\n", adapt_partition_index(*live_partition_index, options), cmd); /* FPART_HOOKTYPE (post-part) */ malloc_size = strlen(env_fpart_hooktype_name) + 1 + strlen("post-part") + 1; if_not_malloc(env_fpart_hooktype_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_hooktype_string, malloc_size, "%s=%s", env_fpart_hooktype_name, "post-part"); if(push_env(env_fpart_hooktype_string, &envp) != 0) { retval = 1; goto cleanup; } } else /* cmd == options->post_run_hook */ { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Executing post-run hook: '%s'\n", cmd); /* FPART_HOOKTYPE (post-run) */ malloc_size = strlen(env_fpart_hooktype_name) + 1 + strlen("post-run") + 1; if_not_malloc(env_fpart_hooktype_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_hooktype_string, malloc_size, "%s=%s", env_fpart_hooktype_name, "post-run"); if(push_env(env_fpart_hooktype_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_PARTFILENAME */ if(live_filename != NULL) { malloc_size = strlen(env_fpart_partfilename_name) + 1 + strlen(live_filename) + 1; if_not_malloc(env_fpart_partfilename_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_partfilename_string, malloc_size, "%s=%s", env_fpart_partfilename_name, live_filename); if(push_env(env_fpart_partfilename_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_PARTNUMBER */ if(live_partition_index != NULL) { malloc_size = strlen(env_fpart_partnumber_name) + 1 + get_num_digits(adapt_partition_index(*live_partition_index, options)) + 1; if_not_malloc(env_fpart_partnumber_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_partnumber_string, malloc_size, "%s=%ju", env_fpart_partnumber_name, adapt_partition_index(*live_partition_index, options)); if(push_env(env_fpart_partnumber_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_PARTSIZE */ if(live_partition_size != NULL) { malloc_size = strlen(env_fpart_partsize_name) + 1 + get_num_digits(*live_partition_size) + 1; if_not_malloc(env_fpart_partsize_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_partsize_string, malloc_size, "%s=%ju", env_fpart_partsize_name, *live_partition_size); if(push_env(env_fpart_partsize_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_TOTALSIZE */ malloc_size = strlen(env_fpart_totalsize_name) + 1 + get_num_digits(status->total_size) + 1; if_not_malloc(env_fpart_totalsize_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_totalsize_string, malloc_size, "%s=%ju", env_fpart_totalsize_name, status->total_size); if(push_env(env_fpart_totalsize_string, &envp) != 0) { retval = 1; goto cleanup; } /* FPART_PARTNUMFILES */ if(live_partition_num_files != NULL) { malloc_size = strlen(env_fpart_partnumfiles_name) + 1 + get_num_digits(*live_partition_num_files) + 1; if_not_malloc(env_fpart_partnumfiles_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_partnumfiles_string, malloc_size, "%s=%ju", env_fpart_partnumfiles_name, *live_partition_num_files); if(push_env(env_fpart_partnumfiles_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_TOTALNUMFILES */ malloc_size = strlen(env_fpart_totalnumfiles_name) + 1 + get_num_digits(status->total_num_files) + 1; if_not_malloc(env_fpart_totalnumfiles_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_totalnumfiles_string, malloc_size, "%s=%ju", env_fpart_totalnumfiles_name, status->total_num_files); if(push_env(env_fpart_totalnumfiles_string, &envp) != 0) { retval = 1; goto cleanup; } /* FPART_PARTERRNO */ if(cmd != options->post_run_hook) { malloc_size = strlen(env_fpart_parterrno_name) + 1 + get_num_digits(live_partition_errno) + 1; if_not_malloc(env_fpart_parterrno_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_parterrno_string, malloc_size, "%s=%d", env_fpart_parterrno_name, live_partition_errno); if(push_env(env_fpart_parterrno_string, &envp) != 0) { retval = 1; goto cleanup; } } /* FPART_PID */ pid_t fpart_pid = getpid(); malloc_size = strlen(env_fpart_pid_name) + 1 + get_num_digits(fpart_pid) + 1; if_not_malloc(env_fpart_pid_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_pid_string, malloc_size, "%s=%d", env_fpart_pid_name, (int)fpart_pid); if(push_env(env_fpart_pid_string, &envp) != 0) { retval = 1; goto cleanup; } /* FPART_TOTALNUMPARTS */ malloc_size = strlen(env_fpart_totalnumparts_name) + 1 + get_num_digits(status->total_num_parts) + 1; if_not_malloc(env_fpart_totalnumparts_string, malloc_size, retval = 1; goto cleanup; ) snprintf(env_fpart_totalnumparts_string, malloc_size, "%s=%ju", env_fpart_totalnumparts_name, status->total_num_parts); if(push_env(env_fpart_totalnumparts_string, &envp) != 0) { retval = 1; goto cleanup; } /* fork child process */ int child_status = 0; switch(live_status.child_pid = fork()) { case -1: /* error */ fprintf(stderr, "fork(): %s\n", strerror(errno)); retval = 1; break; case 0: /* child */ { /* become process group leader */ if(setpgid(live_status.child_pid, 0) != 0) { fprintf(stderr, "%s(): setpgid(): %s\n", __func__, strerror(errno)); exit(EXIT_FAILURE); } execle(_PATH_BSHELL, "sh", "-c", cmd, (char *)NULL, envp); /* if reached, error */ exit(EXIT_FAILURE); } default: /* parent */ { /* child-killer signal handler */ signal(SIGTERM, kill_child); signal(SIGINT, kill_child); signal(SIGHUP, kill_child); pid_t wpid; do { wpid = wait(&child_status); } while((wpid != live_status.child_pid) && (wpid != -1)); /* reset actions for signals */ signal(SIGTERM, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGHUP, SIG_DFL); /* reset child PID */ live_status.child_pid = -1; if(wpid == -1) { fprintf(stderr, "%s(): wait(): %s\n", __func__, strerror(errno)); retval = 1; } else { if(WIFEXITED(child_status)) { /* collect exit code */ if(WEXITSTATUS(child_status) != 0) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Hook '%s' exited with error %d\n", cmd, WEXITSTATUS(child_status)); retval = 1; } } else { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Hook '%s' terminated prematurely\n", cmd); retval = 1; } } } break; } cleanup: if(envp != NULL) free(envp); if(env_fpart_hooktype_string != NULL) free(env_fpart_hooktype_string); if(env_fpart_partfilename_string != NULL) free(env_fpart_partfilename_string); if(env_fpart_partnumber_string != NULL) free(env_fpart_partnumber_string); if(env_fpart_partsize_string != NULL) free(env_fpart_partsize_string); if(env_fpart_totalsize_string != NULL) free(env_fpart_totalsize_string); if(env_fpart_partnumfiles_string != NULL) free(env_fpart_partnumfiles_string); if(env_fpart_totalnumfiles_string != NULL) free(env_fpart_totalnumfiles_string); if(env_fpart_parterrno_string != NULL) free(env_fpart_parterrno_string); if(env_fpart_pid_string != NULL) free(env_fpart_pid_string); if(env_fpart_totalnumparts_string != NULL) free(env_fpart_totalnumparts_string); return (retval); } /* Print or add a file entry (redirector) - returns (0) if entry has been added - returns (1) if entry has been skipped (option -S) - returns (-1) if error */ int handle_file_entry(struct file_entry **head, char *path, fsize_t size, int entry_errno, struct program_options *options, struct program_status *status) { assert(options != NULL); assert(status != NULL); assert(entry_errno >= 0); /* overload and round size */ size = round_num(size + options->overload_size, options->round_size); if(options->live_mode == OPT_LIVEMODE) return (live_print_file_entry(path, size, entry_errno, options, status)); else /* XXX propagate (and exploit) entry_errno in non-live mode too ? */ return (add_file_entry(head, path, size, options, status)); } /* Display a single entry line */ void display_file_entry(pnum_t partition_index, const fsize_t entry_size, const char * const entry_path, const unsigned char entry_display_type) { assert(entry_path != NULL); if(entry_display_type == ENTRY_DISPLAY_TYPE_STANDARD) fprintf(stdout, "%ju\t%ju\t%s\n", partition_index, entry_size, entry_path); else fprintf(stdout, "S\t%ju\t%s\n", entry_size, entry_path); return; } /* Print a file entry - returns (0) if entry has been added - returns (1) if entry has been skipped (option -S) - returns (-1) if error */ int live_print_file_entry(char *path, fsize_t size, int entry_errno, struct program_options *options, struct program_status *status) { /* split states */ #define SPLIT_NONE 0 #define SPLIT_DO 1 #define SPLIT_END 2 assert(path != NULL); assert(entry_errno >= 0); assert(options != NULL); assert(options->live_mode == OPT_LIVEMODE); assert(status != NULL); char *out_template = options->out_filename; char *ln_term = (options->out_zero == OPT_OUT0) ? "\0" : "\n"; int split = SPLIT_NONE; /* option -S: skip files bigger than maximum partition size (option -s) and print them to stdout in hardcoded pseudo-partition 'S' ('S'kipped). Preloading and overloading are already done at that step */ if(options->skip_big == OPT_SKIPBIG) { fsize_t needed_part_size = options->preload_size + size; if(needed_part_size > options->max_size) { /* partition_index irrelevant here */ display_file_entry(0, size, path, ENTRY_DISPLAY_TYPE_SKIPPED); fflush(stdout); return (1); } } /* beginning of a new partition */ if(live_status.partition_num_files == 0) { start_part: /* very first pass of first partition, preload first partition */ if(live_status.partition_index == 0) { live_status.partition_size = options->preload_size; /* count part in */ status->total_size += options->preload_size; status->total_num_parts++; } if(out_template != NULL) { /* compute live_status.filename "out_template.i\0" */ size_t malloc_size = strlen(out_template) + 1 + get_num_digits(adapt_partition_index(live_status.partition_index, options)) + 1; if_not_malloc(live_status.filename, malloc_size, return (-1); ) snprintf(live_status.filename, malloc_size, "%s.%ju", out_template, adapt_partition_index(live_status.partition_index, options)); } /* execute pre-partition hook */ if(options->pre_part_hook != NULL) { if(fpart_hook(options->pre_part_hook, options, status, live_status.filename, &live_status.partition_index, &live_status.partition_size, &live_status.partition_num_files, 0) != 0) /* partition_errno irrelevant here */ live_status.exit_summary = 1; } if(out_template != NULL) { /* open file */ if((live_status.fd = open(live_status.filename, O_WRONLY|O_CREAT|O_TRUNC, 0660)) < 0) { fprintf(stderr, "%s: %s\n", live_status.filename, strerror(errno)); free(live_status.filename); live_status.filename = NULL; return (-1); } } } if((options->dnr_split == OPT_DNRSPLIT) && (entry_errno != 0)) { if (live_status.partition_num_files > 0) { /* close current -non-empty- partition, do not (yet) count file in and create a new partition to add our single -erroneous- entry */ split = SPLIT_DO; goto end_part; } else /* work on current partition */ split = SPLIT_END; } /* count file in */ live_status.partition_size += size; live_status.partition_num_files++; /* in live mode, global counters are not updated from handle_file_entry(), because that would make them updated *after* hook calls, rendering FPART_TOTALSIZE and FPART_TOTALNUMFILES variables erroneous */ status->total_size += size; status->total_num_files++; if(entry_errno != 0) live_status.partition_errno = entry_errno; if(out_template == NULL) { /* no template provided, just print entry to stdout */ display_file_entry(adapt_partition_index(live_status.partition_index, options), size, path, ENTRY_DISPLAY_TYPE_STANDARD); } else { /* print to fd */ size_t to_write = strlen(path); if((write(live_status.fd, path, to_write) != (ssize_t)to_write) || (write(live_status.fd, ln_term, 1) != 1)) { fprintf(stderr, "%s\n", strerror(errno)); /* do not close(live_status.fd) and free(live_status.filename) here because it will be useful and free'd in uninit_file_entries() below */ return (-1); } } /* display added filename */ if(options->verbose >= OPT_VVERBOSE) fprintf(stderr, "%s\n", path); /* if end of partition reached */ if(((options->max_entries > 0) && (live_status.partition_num_files >= options->max_entries)) || ((options->max_size > 0) && (live_status.partition_size >= options->max_size)) || (split == SPLIT_END)) { end_part: /* display parent directories if requested */ if(options->add_parents == OPT_ADDPARENTS) { char *parent = NULL; char *grandparent = NULL; if(options->verbose >= OPT_VVERBOSE) fprintf(stderr, "Adding parents to finalize partition...\n"); /* allocate and compute parent paths, stop when live_status.entry_path has been reached */ parent = parent_path(path, 1); while((parent != NULL) && (parent[0] != '\0') && (strstr(parent, live_status.entry_path) != NULL)) { if(out_template == NULL) { /* no template provided, just print parent to stdout */ display_file_entry(adapt_partition_index(live_status.partition_index, options), 0, parent, ENTRY_DISPLAY_TYPE_STANDARD); } else { /* print to fd */ size_t to_write = strlen(parent); if((write(live_status.fd, parent, to_write) != (ssize_t)to_write) || (write(live_status.fd, ln_term, 1) != 1)) { fprintf(stderr, "%s\n", strerror(errno)); free(parent); /* do not close(live_status.fd) and free(live_status.filename) here because it will be useful and free'd in uninit_file_entries() below */ return (-1); } } /* display added parent */ if(options->verbose >= OPT_VVERBOSE) fprintf(stderr, "%s\n", parent); /* root reached */ if((parent[0] == '/') && (parent[1] == '\0')) break; /* next parent */ grandparent = parent; parent = parent_path(grandparent, 1); free(grandparent); } if(parent == NULL) /* do not close(live_status.fd) and free(live_status.filename) here because it will be useful and free'd in uninit_file_entries() below */ return (-1); free(parent); } /* display added partition */ if(options->verbose >= OPT_VERBOSE) display_partition_summary(adapt_partition_index(live_status.partition_index, options), live_status.partition_size, live_status.partition_num_files, live_status.partition_errno, PARTITION_DISPLAY_TYPE_ERRNO); /* close fd or flush buffer */ if(out_template == NULL) fflush(stdout); else close(live_status.fd); /* execute post-partition hook */ if(options->post_part_hook != NULL) { if(fpart_hook(options->post_part_hook, options, status, live_status.filename, &live_status.partition_index, &live_status.partition_size, &live_status.partition_num_files, live_status.partition_errno) != 0) live_status.exit_summary = 1; } if(out_template != NULL) { free(live_status.filename); live_status.filename = NULL; } /* reset current partition status */ live_status.partition_index++; live_status.partition_size = options->preload_size; live_status.partition_num_files = 0; live_status.partition_errno = 0; /* count part in */ status->total_size += options->preload_size; status->total_num_parts++; /* create another partition with single entry */ if (split == SPLIT_DO) { split = SPLIT_END; goto start_part; } } return (0); } /********************************************************* Double-linked list of file_entries manipulation functions *********************************************************/ /* Add a file entry to a double-linked list of file_entries - if head is NULL, creates a new file entry ; if not, chains a new file entry to it - increments *status counters - returns (0) if entry has been added - returns (-1) if error - returns with head set to the newly added element */ int add_file_entry(struct file_entry **head, char *path, fsize_t size, struct program_options *options, struct program_status *status) { assert(head != NULL); assert(path != NULL); assert(options != NULL); assert(options->live_mode == OPT_NOLIVEMODE); assert(status != NULL); struct file_entry **current = head; /* current file_entry pointer address */ struct file_entry *previous = NULL; /* previous file_entry pointer */ /* backup current structure pointer and initialize a new structure */ previous = *current; if_not_malloc(*current, sizeof(struct file_entry), return (-1); ) /* set head on first call */ if(*head == NULL) *head = *current; /* set current file data */ size_t malloc_size = strlen(path) + 1; if_not_malloc((*current)->path, malloc_size, free(*current); *current = previous; return (-1); ) snprintf((*current)->path, malloc_size, "%s", path); (*current)->size = size; /* set current file entry's index and pointers */ (*current)->partition_index = 0; /* set during dispatch */ (*current)->nextp = NULL; /* set in next pass (see below) */ (*current)->prevp = previous; /* set previous' nextp pointer */ if(previous != NULL) previous->nextp = *current; /* count file in */ status->total_size += size; status->total_num_files++; /* display added filename */ if(options->verbose >= OPT_VVERBOSE) fprintf(stderr, "%s\n", (*current)->path); return (0); } /* Compare entries to list directories first - compar() function used by fts_open() when in dirs_only or leaf_dirs mode */ static int #if (defined(__linux__) || defined(__NetBSD__) || defined(__APPLE__)) && !defined(EMBED_FTS) fts_dirsfirst(const FTSENT **a, const FTSENT **b) #else fts_dirsfirst(const FTSENT * const *a, const FTSENT * const *b) #endif { assert(a != NULL); assert((*a) != NULL); assert(b != NULL); assert((*b) != NULL); if(((*a)->fts_info == FTS_NS) || ((*a)->fts_info == FTS_NSOK) || ((*b)->fts_info == FTS_NS) || ((*b)->fts_info == FTS_NSOK)) return (0); /* place non-directory entries after directory ones */ if(S_ISDIR((*a)->fts_statp->st_mode)) if(!S_ISDIR((*b)->fts_statp->st_mode)) return (-1); else return (0); else if(S_ISDIR((*b)->fts_statp->st_mode)) return (1); else return (0); } /* Initialize a double-linked list of file_entries from a path - file_path may be a file or directory - if head is NULL, creates a new list ; if not, chains a new list to it - increments *status counters - returns != 0 if critical error - returns with head set to the last element added */ int init_file_entries(char *file_path, struct file_entry **head, struct program_options *options, struct program_status *status) { assert(file_path != NULL); assert(head != NULL); assert(options != NULL); assert(status != NULL); /* prepare fts */ FTS *ftsp = NULL; FTSENT *p = NULL; int fts_options = (options->follow_symbolic_links == OPT_FOLLOWSYMLINKS) ? FTS_LOGICAL : FTS_PHYSICAL; fts_options |= (options->cross_fs_boundaries == OPT_NOCROSSFSBOUNDARIES) ? FTS_XDEV : 0; char *fts_argv[] = { file_path, NULL }; /* sort function */ #if (defined(__linux__) || defined(__NetBSD__) || defined(__APPLE__)) && !defined(EMBED_FTS) int (*fts_sortfuncp)(const FTSENT **, const FTSENT **); #else int (*fts_sortfuncp)(const FTSENT * const *, const FTSENT * const *); #endif if((options->dirs_only == OPT_DIRSONLY) || (options->leaf_dirs == OPT_LEAFDIRS) || (options->add_parents == OPT_ADDPARENTS)) fts_sortfuncp = &fts_dirsfirst; else fts_sortfuncp = NULL; if((ftsp = fts_open(fts_argv, fts_options, fts_sortfuncp)) == NULL) { fprintf(stderr, "%s: fts_open()\n", file_path); return (0); } /* current dir state */ unsigned char file_as_argument = 1; /* by default, we assume file_path points to a file, not a dir */ unsigned char curdir_empty = 1; /* current dir is empty */ unsigned char curdir_dirsfound = 0; /* other dirs have been found in current dir */ unsigned char curdir_addme = 0; /* current dir must be added */ fsize_t curdir_size = 0; /* current dir size */ int fts_read_errno = 0; /* kept apart because p->fts_errno is only significant with FTS_ERR, FTS_DNR and FTS_NS (see fts(3)), but fts_read_errno is needed in FTS_DP */ /* keep a copy of current entry path in live mode */ if(options->live_mode == OPT_LIVEMODE) { /* free() previous entry path if necessary */ if(live_status.entry_path != NULL) free(live_status.entry_path); /* copy current entry path */ size_t malloc_size = strlen(file_path) + 1; if_not_malloc(live_status.entry_path, malloc_size, return (0); ) snprintf(live_status.entry_path, malloc_size, "%s", file_path); } while((p = fts_read(ftsp)) != NULL) { if(options->verbose >= OPT_VVVERBOSE) { fprintf(stderr, "%s(%s): fts_info=%d, fts_errno=%d\n", __func__, p->fts_path, p->fts_info, p->fts_errno); } /* update fts_read_errno with relevant values only */ switch (p->fts_info) { case FTS_ERR: case FTS_DNR: case FTS_NS: fts_read_errno = p->fts_errno; break; default: fts_read_errno = 0; break; } switch (p->fts_info) { case FTS_ERR: /* misc errors, but also partially-read dirs */ fprintf(stderr, "%s: %s\n", p->fts_path, strerror(fts_read_errno)); if(!S_ISDIR(p->fts_statp->st_mode)) continue; /* else, fallthrough to FTS_DNR for directory-related errors as fts_read() may return FTS_ERR during an un-finished readdir(). Note: we may be adding parent directory entries while children files have previously been packed, e.g.: Partition 1 containing /tmp/foo/file1 [readdir() error while reading /tmp/foo/] Partition 2 containing /tmp/foo/ + errno set Do we need an option to enable that fallthrough here ? Or provide a way to consumer to differentiate FTS_ERR from FTS_DNR ? */ /* errors for which we know there is a file or directory within current directory */ case FTS_DNR: /* un-readable directory, which can be: - because of EACCES (permission denied) - because of a readdir() *technical* error with directory not read at all - because of a readdir() *technical* error with directory partially-read (because of FTS_ERR fallthrough above) */ { fprintf(stderr, "%s: %s\n", p->fts_path, strerror(fts_read_errno)); /* if requested by the -zz option, add directory anyway by simulating FTS_DP */ if(options->dirs_include >= OPT_DNREMPTY) { curdir_empty = 1; /* avoid re-crawling erroneous dir through get_size() */ goto add_directory; } /* else, mark current dir as not empty */ curdir_empty = 0; curdir_dirsfound = 1; continue; } case FTS_NS: /* stat() error */ fprintf(stderr, "%s: %s\n", p->fts_path, strerror(fts_read_errno)); case FTS_NSOK: /* no stat(2) available (not requested) */ /* mark current dir as not empty */ curdir_empty = 0; continue; case FTS_DC: fprintf(stderr, "%s: filesystem loop detected\n", p->fts_path); case FTS_DOT: /* ignore "." and ".." */ continue; case FTS_DP: { add_directory: /* if dirs_only mode activated or leaf_dirs mode activated and current directory is a leaf or at least empty dirs display requested and current dir is empty */ if((options->dirs_only == OPT_DIRSONLY) || ((options->leaf_dirs == OPT_LEAFDIRS) && (!curdir_dirsfound)) || ((options->dirs_include >= OPT_EMPTYDIRS) && curdir_empty)) curdir_addme = 1; /* if current directory has not been added by previous rules but we request all directory entries, we fake an empty dir to avoid a call to get_size() below as we want it with a size of 0 */ if((!curdir_addme) && (options->dirs_include >= OPT_ALLDIRS)) { curdir_addme = 1; curdir_empty = 1; } /* add directory if necessary */ if(curdir_addme) { char *curdir_entry_path = NULL; /* check for name validity regarding include/exclude options */ if(!valid_file(p, options, VF_FULLTEST)) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Skipping directory: '%s'\n", p->fts_path); goto reset_directory; } /* count ending '/' and '\0', even if an ending '/' is not added */ size_t malloc_size = p->fts_pathlen + 1 + 1; if_not_malloc(curdir_entry_path, malloc_size, fts_close(ftsp); return (1); ) /* add slash if requested and necessary */ if((options->add_slash == OPT_ADDSLASH) && (p->fts_pathlen > 0) && (p->fts_path[p->fts_pathlen - 1] != '/')) snprintf(curdir_entry_path, malloc_size, "%s/", p->fts_path); else snprintf(curdir_entry_path, malloc_size, "%s", p->fts_path); /* adapt curdir_size for special cases */ if((p->fts_level > 0) && (options->cross_fs_boundaries == OPT_NOCROSSFSBOUNDARIES) && (p->fts_parent->fts_statp->st_dev != p->fts_statp->st_dev)) /* when using option -b, set size to 0 for mountpoint (non-root) directories */ curdir_size = 0; else if(curdir_empty) /* we know that the current dir is empty (or that we fake an empty one), ensure curdir_size is 0 */ curdir_size = 0; else if((options->dirs_only != OPT_DIRSONLY) && ((options->leaf_dirs != OPT_LEAFDIRS) || (curdir_dirsfound))) /* when dirs_only mode activated (-E) or leaf_dirs mode activated (-D) and current directory is a leaf, then we can trust current *single-depth* curdir_size. In all other cases (e.g. when dir_depth requested and reached), we must compute the directory size *recursively* through get_size(). */ curdir_size = get_size(p->fts_accpath, p->fts_statp, options); /* else, trust curdir_size and leave it untouched. */ /* add or display it */ if(handle_file_entry(head, curdir_entry_path, curdir_size, fts_read_errno, options, status) < 0) { fprintf(stderr, "%s(): cannot add file entry\n", __func__); free(curdir_entry_path); fts_close(ftsp); return (1); } /* cleanup */ free(curdir_entry_path); } /* reset parent (now current) dir state */ reset_directory: curdir_empty = 0; curdir_dirsfound = 1; curdir_addme = 0; curdir_size = 0; continue; } case FTS_D: { file_as_argument = 0; /* argument was not a file */ curdir_empty = 1; /* enter directory, mark it as empty */ curdir_dirsfound = 0; /* no dirs found yet */ /* check for name validity regarding exclude options */ if(!valid_file(p, options, VF_EXCLUDEONLY)) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Skipping directory: '%s'\n", p->fts_path); fts_set(ftsp, p, FTS_SKIP); continue; } /* if dir_depth requested and reached, skip descendants but add directory entry (in post order) */ if((options->dir_depth != OPT_NODIRDEPTH) && (p->fts_level >= options->dir_depth)) { fts_set(ftsp, p, FTS_SKIP); curdir_addme = 1; /* as we have not crawled into this directory yet, remove the empty flag to allow a call to get_size() in FTS_DP */ curdir_empty = 0; } continue; } default: /* XXX default means remaining file types: FTS_F, FTS_SL, FTS_SLNONE, FTS_DEFAULT */ { /* get current file size to add it to our current directory size. We must have visited all directories first for that total to be right ; this is achieved by using a compar() function with fts_open() */ fsize_t curfile_size = get_size(p->fts_accpath, p->fts_statp, options); /* Note about include/exclude options and curdir_size: Computing the right value of curdir_size is not as easy as it seems because of include/exclude options. Basically, exclude options are honoured when both computing directory size and selecting entries to be added to the final listing, while include options (wich are more restrictive because we then default to a default 'deny all' scheme) must be *ignored* when computing directory size and only filter entries to be added to the final listing. A simple way of handling that problem would have been to just get rid of curdir_size and add an option to get_size() to enable single-depth (non-recursive) computation and add a call in FTS_DP when adding a directory. *But* that would imply a second crawl for each directory added and would impact performances, that's why we chose to maintain curdir_size anyway, but with a two-pass check to handle include and exclude options properly. */ /* first pass: check for name validity regarding exclude options only. Honoring include options here would make most files excluded (which is not what we want). This is needed to get the right size of a subdir that would be selected through a -y option. E.g. : fpart -f 10 -e -y './my/sub/dir' -E ./ */ if(valid_file(p, options, VF_EXCLUDEONLY)) { curdir_empty = 0; curdir_size += curfile_size; } /* second pass: re-check for name validity regarding exclude *and* include options */ if(!valid_file(p, options, VF_FULLTEST)) { if(options->verbose >= OPT_VERBOSE) fprintf(stderr, "Skipping file: '%s'\n", p->fts_path); continue; } /* skip file entry when in dirs_only mode (option -E) or in leaf_dirs mode (option -D) and no directory has been found in current directory (i.e. we are in a leaf directory). We must have visited all directories first and file entry must not explicitly point to a file (in such a case, file entry has been explicitly given as argument so we must add it) */ if((!file_as_argument) && ((options->dirs_only == OPT_DIRSONLY) || ((options->leaf_dirs == OPT_LEAFDIRS) && (!curdir_dirsfound)))) continue; /* add or display it */ if(handle_file_entry(head, p->fts_path, curfile_size, 0 /* fts_read_errno is always 0 here, so hardcode it */, options, status) < 0) { fprintf(stderr, "%s(): cannot add file entry\n", __func__); fts_close(ftsp); return (1); } continue; } } } if(errno != 0) { fprintf(stderr, "%s: fts_read()\n", file_path); fts_close(ftsp); return (1); } if(fts_close(ftsp) < 0) fprintf(stderr, "%s: fts_close()\n", file_path); return (0); } /* Un-initialize a double-linked list of file_entries */ void uninit_file_entries(struct file_entry *head, struct program_options *options, struct program_status *status) { assert(options != NULL); assert(status != NULL); /* be sure to start from last file entry */ fastfw_list(head); struct file_entry *current = head; struct file_entry *prev = NULL; while(current != NULL) { if(current->path != NULL) { free(current->path); } prev = current->prevp; free(current); current = prev; } /* live mode */ if(options->live_mode == OPT_LIVEMODE) { /* display added partition */ if((options->verbose >= OPT_VERBOSE) && (live_status.partition_num_files > 0)) display_partition_summary(adapt_partition_index(live_status.partition_index, options), live_status.partition_size, live_status.partition_num_files, live_status.partition_errno, PARTITION_DISPLAY_TYPE_ERRNO); /* flush buffer or close last file if necessary */ if(options->out_filename == NULL) fflush(stdout); else if(live_status.filename != NULL) close(live_status.fd); /* execute last post-partition hook */ if((options->post_part_hook != NULL) && (live_status.partition_num_files > 0)) { if(fpart_hook(options->post_part_hook, options, status, live_status.filename, &live_status.partition_index, &live_status.partition_size, &live_status.partition_num_files, live_status.partition_errno) != 0) live_status.exit_summary = 1; } if(live_status.filename != NULL) { free(live_status.filename); live_status.filename = NULL; } if(live_status.entry_path != NULL) { free(live_status.entry_path); live_status.entry_path = NULL; } /* execute post-run hook */ if(options->post_run_hook != NULL) { if(fpart_hook(options->post_run_hook, options, status, NULL, /* remaining arguments are irrelevant here */ NULL, NULL, NULL, 0) != 0) live_status.exit_summary = 1; } /* print hooks' exit codes summary */ if((options->verbose >= OPT_VERBOSE) && (live_status.exit_summary != 0)) fprintf(stderr, "Warning: at least one hook exited with error !\n"); } return; } /* Print a double-linked list of file_entries from head - if no filename template given, print to stdout */ int print_file_entries(struct file_entry *head, struct partition *part_head, pnum_t num_parts, struct program_options *options) { assert(head != NULL); assert(part_head != NULL); assert(num_parts > 0); assert(options != NULL); char *out_template = options->out_filename; char *ln_term = (options->out_zero == OPT_OUT0) ? "\0" : "\n"; /* no template provided, just print to stdout and return */ if(out_template == NULL) { while(head != NULL) { display_file_entry(adapt_partition_index(head->partition_index, options), head->size, head->path, ENTRY_DISPLAY_TYPE_STANDARD); head = head->nextp; } return (0); } /* a template has been provided; to avoid opening too many files, open chunks of FDs and do as many passes as necessary */ assert(PRINT_FE_CHUNKS > 0); struct file_entry *start = head; pnum_t current_chunk = 0; /* current chunk */ pnum_t current_fd_index = 0; /* current file index within chunk */ /* current -absolute- partition index */ #define current_partition_index \ ((current_chunk * PRINT_FE_CHUNKS) + current_fd_index) /* current_partition_index gets incremented by PRINT_FE_CHUNKS */ while(current_partition_index < num_parts) { int fd[PRINT_FE_CHUNKS]; /* our file descriptors */ /* open as necessary file descriptors as needed to print num_part partitions */ while((current_fd_index < PRINT_FE_CHUNKS) && (current_partition_index < num_parts)) { /* skip empty partition '0': XXX No need to skip write() calls below, as no file entry should be associated with that partition */ if((current_partition_index == 0) && (part_head->num_files == 0)) { #if defined(DEBUG) fprintf(stderr, "%s(): skip creating empty partition '0'\n", __func__); #endif fd[current_fd_index] = (-1); /* for close() calls below */ current_fd_index++; continue; } /* compute out_filename "out_template.i\0" */ char *out_filename = NULL; size_t malloc_size = strlen(out_template) + 1 + get_num_digits (adapt_partition_index(current_partition_index, options)) + 1; if_not_malloc(out_filename, malloc_size, /* close all open descriptors and return */ pnum_t i; for(i = 0; i < current_fd_index; i++) close(fd[i]); return (1); ) snprintf(out_filename, malloc_size, "%s.%ju", out_template, adapt_partition_index(current_partition_index, options)); if((fd[current_fd_index] = open(out_filename, O_WRONLY|O_CREAT|O_TRUNC, 0660)) < 0) { fprintf(stderr, "%s: %s\n", out_filename, strerror(errno)); free(out_filename); /* close all open descriptors and return */ pnum_t i; for(i = 0; i < current_fd_index; i++) close(fd[i]); return (1); } free(out_filename); current_fd_index++; } /* write data to opened file descriptors */ while(head != NULL) { if((head->partition_index >= (current_chunk * PRINT_FE_CHUNKS)) && (head->partition_index < ((current_chunk + 1) * PRINT_FE_CHUNKS))) { size_t to_write = strlen(head->path); if((write(fd[head->partition_index % PRINT_FE_CHUNKS], head->path, to_write) != (ssize_t)to_write) || (write(fd[head->partition_index % PRINT_FE_CHUNKS], ln_term, 1) != 1)) { fprintf(stderr, "%s\n", strerror(errno)); /* close all open descriptors */ pnum_t i; for(i = 0; (i < PRINT_FE_CHUNKS) && (((current_chunk * PRINT_FE_CHUNKS) + i) < num_parts); i++) close(fd[i]); return (1); } } head = head->nextp; } /* come back to first entry */ head = start; /* close file descriptors */ pnum_t i; for(i = 0; (i < PRINT_FE_CHUNKS) && (((current_chunk * PRINT_FE_CHUNKS) + i) < num_parts); i++) close(fd[i]); current_fd_index = 0; current_chunk++; } return (0); } /*************************************************** Array of file_entry pointers manipulation functions ***************************************************/ /* Initialize an array of file_entry pointers from a double-linked list of file_entries (head) */ void init_file_entry_p(struct file_entry **file_entry_p, fnum_t num_entries, struct file_entry *head) { assert(file_entry_p != NULL); fnum_t i = 0; while((head != NULL) && (file_entry_p != NULL) && (i < num_entries)) { file_entry_p[i] = head; head = head->nextp; i++; } return; } fpart-1.7.0/src/fpart.h000644 001751 000000 00000003526 14745137273 015701 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _FPART_H #define _FPART_H #include "types.h" #define FPART_VERSION "1.7.0" /* maximum input line length, including '\n' and '\0' */ #define MAX_LINE_LENGTH 2048 /* Main program status */ struct program_status { fsize_t total_size; /* total partitions size created so far */ fnum_t total_num_files; /* total number of files added so far */ pnum_t total_num_parts; /* total number of partitions created so far */ }; #endif /* _FPART_H */ fpart-1.7.0/src/fts.c000644 001751 000000 00000103343 14745137273 015352 0ustar00martymacwheel000000 000000 /*- * SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 1990, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $OpenBSD: fts.c,v 1.22 1999/10/03 19:22:22 millert Exp $ * * This version of fts has been patched to build on Solaris and GNU/Linux. * Solaris notes : * - no support for FTS_WHITEOUT (sparse files) * - no support for O_CLOEXEC and O_DIRECTORY flags * GNU/Linux notes : * - the FTS_NOSTAT speedup trick is disabled * - no support for FTS_WHITEOUT (sparse files) * */ #if defined(__FreeBSD__) #include __SCCSID("@(#)fts.c 8.6 (Berkeley) 8/14/94"); __FBSDID("$FreeBSD: head/lib/libc/gen/fts.c 345552 2019-03-26 19:35:41Z emaste $"); #include "/usr/src/lib/libc/include/namespace.h" #else #define _open open #define _close close #define _fstat fstat #define _dirfd dirfd #endif /* defined(__FreeBSD__) */ #include #include #include #if defined(__sun) || defined(__sun__) #include #include #include #else #if defined(__linux__) #include #include #endif /* defined(__linux__) */ #endif /* defined(__sun) || defined(__sun__) */ #include #include #include #include "fts.h" #include #include #include #if defined(__FreeBSD__) #include "/usr/src/lib/libc/include/un-namespace.h" #include "/usr/src/lib/libc/gen/gen-private.h" #endif #if defined(O_CLOEXEC) #define _HAS_O_CLOEXEC #else #define O_CLOEXEC 0 #if defined(DEBUG) #warning O_CLOEXEC not supported by open(2) #endif #endif #if defined(O_DIRECTORY) #define _HAS_O_DIRECTORY #else #define O_DIRECTORY 0 #if defined(DEBUG) #warning O_DIRECTORY not supported by open(2) #endif #endif #if defined(__sun) || defined(__sun__) || defined(__linux__) void * reallocf(void *ptr, size_t size) { void *nptr; nptr = realloc(ptr, size); /* * When the System V compatibility option (malloc "V" flag) is * in effect, realloc(ptr, 0) frees the memory and returns NULL. * So, to avoid double free, call free() only when size != 0. * realloc(ptr, 0) can't fail when ptr != NULL. */ if (!nptr && ptr && size != 0) free(ptr); return (nptr); } #endif static FTSENT *fts_alloc(FTS *, char *, size_t); static FTSENT *fts_build(FTS *, int); static void fts_lfree(FTSENT *); static void fts_load(FTS *, FTSENT *); static size_t fts_maxarglen(char * const *); static void fts_padjust(FTS *, FTSENT *); static int fts_palloc(FTS *, size_t); static FTSENT *fts_sort(FTS *, FTSENT *, size_t); static int fts_stat(FTS *, FTSENT *, int, int); static int fts_safe_changedir(FTS *, FTSENT *, int, char *); #if !defined(__linux__) static int fts_ufslinks(FTS *, const FTSENT *); #endif #define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) #define CLR(opt) (sp->fts_options &= ~(opt)) #define ISSET(opt) (sp->fts_options & (opt)) #define SET(opt) (sp->fts_options |= (opt)) #define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd)) /* fts_build flags */ #define BCHILD 1 /* fts_children */ #define BNAMES 2 /* fts_children, names only */ #define BREAD 3 /* fts_read */ /* * Internal representation of an FTS, including extra implementation * details. The FTS returned from fts_open points to this structure's * ftsp_fts member (and can be cast to an _fts_private as required) */ struct _fts_private { FTS ftsp_fts; #if defined(__sun) || defined(__sun__) struct statvfs ftsp_statvfs; #else struct statfs ftsp_statfs; #endif dev_t ftsp_dev; int ftsp_linksreliable; }; #if !defined(__linux__) /* * The "FTS_NOSTAT" option can avoid a lot of calls to stat(2) if it * knows that a directory could not possibly have subdirectories. This * is decided by looking at the link count: a subdirectory would * increment its parent's link count by virtue of its own ".." entry. * This assumption only holds for UFS-like filesystems that implement * links and directories this way, so we must punt for others. */ static const char *ufslike_filesystems[] = { "ufs", "zfs", "nfs", "ext2fs", 0 }; #endif FTS * fts_open(char * const *argv, int options, int (*compar)(const FTSENT * const *, const FTSENT * const *)) { struct _fts_private *priv; FTS *sp; FTSENT *p, *root; FTSENT *parent, *tmp; size_t len, nitems; /* Options check. */ if (options & ~FTS_OPTIONMASK) { errno = EINVAL; return (NULL); } /* fts_open() requires at least one path */ if (*argv == NULL) { errno = EINVAL; return (NULL); } /* Allocate/initialize the stream. */ if ((priv = calloc(1, sizeof(*priv))) == NULL) return (NULL); sp = &priv->ftsp_fts; sp->fts_compar = compar; sp->fts_options = options; /* Logical walks turn on NOCHDIR; symbolic links are too hard. */ if (ISSET(FTS_LOGICAL)) SET(FTS_NOCHDIR); /* * Start out with 1K of path space, and enough, in any case, * to hold the user's paths. */ if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN))) goto mem1; /* Allocate/initialize root's parent. */ if ((parent = fts_alloc(sp, "", 0)) == NULL) goto mem2; parent->fts_level = FTS_ROOTPARENTLEVEL; /* Shush, GCC. */ tmp = NULL; /* Allocate/initialize root(s). */ for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) { len = strlen(*argv); p = fts_alloc(sp, *argv, len); p->fts_level = FTS_ROOTLEVEL; p->fts_parent = parent; p->fts_accpath = p->fts_name; p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW), -1); /* Command-line "." and ".." are real directories. */ if (p->fts_info == FTS_DOT) p->fts_info = FTS_D; /* * If comparison routine supplied, traverse in sorted * order; otherwise traverse in the order specified. */ if (compar) { p->fts_link = root; root = p; } else { p->fts_link = NULL; if (root == NULL) tmp = root = p; else { tmp->fts_link = p; tmp = p; } } } if (compar && nitems > 1) root = fts_sort(sp, root, nitems); /* * Allocate a dummy pointer and make fts_read think that we've just * finished the node before the root(s); set p->fts_info to FTS_INIT * so that everything about the "current" node is ignored. */ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) goto mem3; sp->fts_cur->fts_link = root; sp->fts_cur->fts_info = FTS_INIT; /* * If using chdir(2), grab a file descriptor pointing to dot to ensure * that we can get back here; this could be avoided for some paths, * but almost certainly not worth the effort. Slashes, symbolic links, * and ".." are all fairly nasty problems. Note, if we can't get the * descriptor we run anyway, just more slowly. */ if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = _open(".", O_RDONLY | O_CLOEXEC, 0)) < 0) SET(FTS_NOCHDIR); return (sp); mem3: fts_lfree(root); free(parent); mem2: free(sp->fts_path); mem1: free(sp); return (NULL); } static void fts_load(FTS *sp, FTSENT *p) { size_t len; char *cp; /* * Load the stream structure for the next traversal. Since we don't * actually enter the directory until after the preorder visit, set * the fts_accpath field specially so the chdir gets done to the right * place and the user can access the first node. From fts_open it's * known that the path will fit. */ len = p->fts_pathlen = p->fts_namelen; memmove(sp->fts_path, p->fts_name, len + 1); if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) { len = strlen(++cp); memmove(p->fts_name, cp, len + 1); p->fts_namelen = len; } p->fts_accpath = p->fts_path = sp->fts_path; sp->fts_dev = p->fts_dev; } int fts_close(FTS *sp) { FTSENT *freep, *p; int saved_errno; /* * This still works if we haven't read anything -- the dummy structure * points to the root list, so we step through to the end of the root * list which has a valid parent pointer. */ if (sp->fts_cur) { for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) { freep = p; p = p->fts_link != NULL ? p->fts_link : p->fts_parent; free(freep); } free(p); } /* Free up child linked list, sort array, path buffer. */ if (sp->fts_child) fts_lfree(sp->fts_child); if (sp->fts_array) free(sp->fts_array); free(sp->fts_path); /* Return to original directory, save errno if necessary. */ if (!ISSET(FTS_NOCHDIR)) { saved_errno = fchdir(sp->fts_rfd) ? errno : 0; (void)_close(sp->fts_rfd); /* Set errno and return. */ if (saved_errno != 0) { /* Free up the stream pointer. */ free(sp); errno = saved_errno; return (-1); } } /* Free up the stream pointer. */ free(sp); return (0); } /* * Special case of "/" at the end of the path so that slashes aren't * appended which would cause paths to be written as "....//foo". */ #define NAPPEND(p) \ (p->fts_path[p->fts_pathlen - 1] == '/' \ ? p->fts_pathlen - 1 : p->fts_pathlen) FTSENT * fts_read(FTS *sp) { FTSENT *p, *tmp; int instr; char *t; int saved_errno; /* If finished or unrecoverable error, return NULL. */ if (sp->fts_cur == NULL || ISSET(FTS_STOP)) return (NULL); /* Set current node pointer. */ p = sp->fts_cur; /* Save and zero out user instructions. */ instr = p->fts_instr; p->fts_instr = FTS_NOINSTR; /* Any type of file may be re-visited; re-stat and re-turn. */ if (instr == FTS_AGAIN) { p->fts_info = fts_stat(sp, p, 0, -1); return (p); } /* * Following a symlink -- SLNONE test allows application to see * SLNONE and recover. If indirecting through a symlink, have * keep a pointer to current location. If unable to get that * pointer, follow fails. */ if (instr == FTS_FOLLOW && (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) { p->fts_info = fts_stat(sp, p, 1, -1); if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { if ((p->fts_symfd = _open(".", O_RDONLY | O_CLOEXEC, 0)) < 0) { p->fts_errno = errno; p->fts_info = FTS_ERR; } else p->fts_flags |= FTS_SYMFOLLOW; } return (p); } /* Directory in pre-order. */ if (p->fts_info == FTS_D) { /* If skipped or crossed mount point, do post-order visit. */ if (instr == FTS_SKIP || (ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev)) { if (p->fts_flags & FTS_SYMFOLLOW) (void)_close(p->fts_symfd); if (sp->fts_child) { fts_lfree(sp->fts_child); sp->fts_child = NULL; } p->fts_info = FTS_DP; return (p); } /* Rebuild if only read the names and now traversing. */ if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) { CLR(FTS_NAMEONLY); fts_lfree(sp->fts_child); sp->fts_child = NULL; } /* * Cd to the subdirectory. * * If have already read and now fail to chdir, whack the list * to make the names come out right, and set the parent errno * so the application will eventually get an error condition. * Set the FTS_DONTCHDIR flag so that when we logically change * directories back to the parent we don't do a chdir. * * If haven't read do so. If the read fails, fts_build sets * FTS_STOP or the fts_info field of the node. */ if (sp->fts_child != NULL) { if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) { p->fts_errno = errno; p->fts_flags |= FTS_DONTCHDIR; for (p = sp->fts_child; p != NULL; p = p->fts_link) p->fts_accpath = p->fts_parent->fts_accpath; } } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) { if (ISSET(FTS_STOP)) return (NULL); return (p); } p = sp->fts_child; sp->fts_child = NULL; goto name; } /* Move to the next node on this level. */ next: tmp = p; if ((p = p->fts_link) != NULL) { /* * If reached the top, return to the original directory (or * the root of the tree), and load the paths for the next root. */ if (p->fts_level == FTS_ROOTLEVEL) { if (FCHDIR(sp, sp->fts_rfd)) { SET(FTS_STOP); return (NULL); } free(tmp); fts_load(sp, p); return (sp->fts_cur = p); } /* * User may have called fts_set on the node. If skipped, * ignore. If followed, get a file descriptor so we can * get back if necessary. */ if (p->fts_instr == FTS_SKIP) { free(tmp); goto next; } if (p->fts_instr == FTS_FOLLOW) { p->fts_info = fts_stat(sp, p, 1, -1); if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) { if ((p->fts_symfd = _open(".", O_RDONLY | O_CLOEXEC, 0)) < 0) { p->fts_errno = errno; p->fts_info = FTS_ERR; } else p->fts_flags |= FTS_SYMFOLLOW; } p->fts_instr = FTS_NOINSTR; } free(tmp); name: t = sp->fts_path + NAPPEND(p->fts_parent); *t++ = '/'; memmove(t, p->fts_name, p->fts_namelen + 1); return (sp->fts_cur = p); } /* Move up to the parent node. */ p = tmp->fts_parent; if (p->fts_level == FTS_ROOTPARENTLEVEL) { /* * Done; free everything up and set errno to 0 so the user * can distinguish between error and EOF. */ free(tmp); free(p); errno = 0; return (sp->fts_cur = NULL); } /* NUL terminate the pathname. */ sp->fts_path[p->fts_pathlen] = '\0'; /* * Return to the parent directory. If at a root node or came through * a symlink, go back through the file descriptor. Otherwise, cd up * one directory. */ if (p->fts_level == FTS_ROOTLEVEL) { if (FCHDIR(sp, sp->fts_rfd)) { SET(FTS_STOP); return (NULL); } } else if (p->fts_flags & FTS_SYMFOLLOW) { if (FCHDIR(sp, p->fts_symfd)) { saved_errno = errno; (void)_close(p->fts_symfd); errno = saved_errno; SET(FTS_STOP); return (NULL); } (void)_close(p->fts_symfd); } else if (!(p->fts_flags & FTS_DONTCHDIR) && fts_safe_changedir(sp, p->fts_parent, -1, "..")) { SET(FTS_STOP); return (NULL); } free(tmp); p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; return (sp->fts_cur = p); } /* * Fts_set takes the stream as an argument although it's not used in this * implementation; it would be necessary if anyone wanted to add global * semantics to fts using fts_set. An error return is allowed for similar * reasons. */ /* ARGSUSED */ int fts_set(FTS *sp, FTSENT *p, int instr) { if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW && instr != FTS_NOINSTR && instr != FTS_SKIP) { errno = EINVAL; return (1); } p->fts_instr = instr; return (0); } FTSENT * fts_children(FTS *sp, int instr) { FTSENT *p; int fd, rc, serrno; if (instr != 0 && instr != FTS_NAMEONLY) { errno = EINVAL; return (NULL); } /* Set current node pointer. */ p = sp->fts_cur; /* * Errno set to 0 so user can distinguish empty directory from * an error. */ errno = 0; /* Fatal errors stop here. */ if (ISSET(FTS_STOP)) return (NULL); /* Return logical hierarchy of user's arguments. */ if (p->fts_info == FTS_INIT) return (p->fts_link); /* * If not a directory being visited in pre-order, stop here. Could * allow FTS_DNR, assuming the user has fixed the problem, but the * same effect is available with FTS_AGAIN. */ if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */) return (NULL); /* Free up any previous child list. */ if (sp->fts_child != NULL) fts_lfree(sp->fts_child); if (instr == FTS_NAMEONLY) { SET(FTS_NAMEONLY); instr = BNAMES; } else instr = BCHILD; /* * If using chdir on a relative path and called BEFORE fts_read does * its chdir to the root of a traversal, we can lose -- we need to * chdir into the subdirectory, and we don't know where the current * directory is, so we can't get back so that the upcoming chdir by * fts_read will work. */ if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' || ISSET(FTS_NOCHDIR)) return (sp->fts_child = fts_build(sp, instr)); if ((fd = _open(".", O_RDONLY | O_CLOEXEC, 0)) < 0) return (NULL); sp->fts_child = fts_build(sp, instr); serrno = (sp->fts_child == NULL) ? errno : 0; rc = fchdir(fd); if (rc < 0 && serrno == 0) serrno = errno; (void)_close(fd); errno = serrno; if (rc < 0) return (NULL); return (sp->fts_child); } #ifndef fts_get_clientptr #error "fts_get_clientptr not defined" #endif void * (fts_get_clientptr)(FTS *sp) { return (fts_get_clientptr(sp)); } #ifndef fts_get_stream #error "fts_get_stream not defined" #endif FTS * (fts_get_stream)(FTSENT *p) { return (fts_get_stream(p)); } void fts_set_clientptr(FTS *sp, void *clientptr) { sp->fts_clientptr = clientptr; } static struct dirent * fts_safe_readdir(DIR *dirp, int *readdir_errno) { struct dirent *ret; errno = 0; if (!dirp) return (NULL); ret = readdir(dirp); *readdir_errno = errno; return (ret); } /* * This is the tricky part -- do not casually change *anything* in here. The * idea is to build the linked list of entries that are used by fts_children * and fts_read. There are lots of special cases. * * The real slowdown in walking the tree is the stat calls. If FTS_NOSTAT is * set and it's a physical walk (so that symbolic links can't be directories), * we can do things quickly. First, if it's a 4.4BSD file system, the type * of the file is in the directory entry. Otherwise, we assume that the number * of subdirectories in a node is equal to the number of links to the parent. * The former skips all stat calls. The latter skips stat calls in any leaf * directories and for any files after the subdirectories in the directory have * been found, cutting the stat calls by about 2/3. */ static FTSENT * fts_build(FTS *sp, int type) { struct dirent *dp; FTSENT *p, *head; FTSENT *cur, *tail; DIR *dirp; void *oldaddr; char *cp; int cderrno, descend, saved_errno, nostat, doadjust, readdir_errno; #ifdef FTS_WHITEOUT int oflag; #endif long level; long nlinks; /* has to be signed because -1 is a magic value */ size_t dnamlen, len, maxlen, nitems; /* Set current node pointer. */ cur = sp->fts_cur; /* * Open the directory for reading. If this fails, we're done. * If being called from fts_read, set the fts_info field. */ #ifdef FTS_WHITEOUT if (ISSET(FTS_WHITEOUT)) oflag = DTF_NODUP; else oflag = DTF_HIDEW | DTF_NODUP; #else #define __opendir2(path, flag) opendir(path) #endif if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) { if (type == BREAD) { cur->fts_info = FTS_DNR; cur->fts_errno = errno; } return (NULL); } /* * Nlinks is the number of possible entries of type directory in the * directory if we're cheating on stat calls, 0 if we're not doing * any stat calls at all, -1 if we're doing stats on everything. */ if (type == BNAMES) { nlinks = 0; /* Be quiet about nostat, GCC. */ nostat = 0; } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) { #if !defined(__linux__) if (fts_ufslinks(sp, cur)) nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2); else #endif nlinks = -1; nostat = 1; } else { nlinks = -1; nostat = 0; } #ifdef notdef (void)printf("nlinks == %d (cur: %d)\n", nlinks, cur->fts_nlink); (void)printf("NOSTAT %d PHYSICAL %d SEEDOT %d\n", ISSET(FTS_NOSTAT), ISSET(FTS_PHYSICAL), ISSET(FTS_SEEDOT)); #endif /* * If we're going to need to stat anything or we want to descend * and stay in the directory, chdir. If this fails we keep going, * but set a flag so we don't chdir after the post-order visit. * We won't be able to stat anything, but we can still return the * names themselves. Note, that since fts_read won't be able to * chdir into the directory, it will have to return different path * names than before, i.e. "a/b" instead of "b". Since the node * has already been visited in pre-order, have to wait until the * post-order visit to return the error. There is a special case * here, if there was nothing to stat then it's not an error to * not be able to stat. This is all fairly nasty. If a program * needed sorted entries or stat information, they had better be * checking FTS_NS on the returned nodes. */ cderrno = 0; if (nlinks || type == BREAD) { if (fts_safe_changedir(sp, cur, _dirfd(dirp), NULL)) { if (nlinks && type == BREAD) cur->fts_errno = errno; cur->fts_flags |= FTS_DONTCHDIR; descend = 0; cderrno = errno; } else descend = 1; } else descend = 0; /* * Figure out the max file name length that can be stored in the * current path -- the inner loop allocates more path as necessary. * We really wouldn't have to do the maxlen calculations here, we * could do them in fts_read before returning the path, but it's a * lot easier here since the length is part of the dirent structure. * * If not changing directories set a pointer so that can just append * each new name into the path. */ len = NAPPEND(cur); if (ISSET(FTS_NOCHDIR)) { cp = sp->fts_path + len; *cp++ = '/'; } else { /* GCC, you're too verbose. */ cp = NULL; } len++; maxlen = sp->fts_pathlen - len; level = cur->fts_level + 1; /* Read the directory, attaching each entry to the `link' pointer. */ doadjust = 0; readdir_errno = 0; for (head = tail = NULL, nitems = 0; (dp = fts_safe_readdir(dirp, &readdir_errno));) { #if defined(__sun) || defined(__sun__) || defined(__linux__) dnamlen = strlen(dp->d_name); #else dnamlen = dp->d_namlen; #endif if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name)) continue; if ((p = fts_alloc(sp, dp->d_name, dnamlen)) == NULL) goto mem1; if (dnamlen >= maxlen) { /* include space for NUL */ oldaddr = sp->fts_path; if (fts_palloc(sp, dnamlen + len + 1)) { /* * No more memory for path or structures. Save * errno, free up the current structure and the * structures already allocated. */ mem1: saved_errno = errno; if (p) free(p); fts_lfree(head); (void)closedir(dirp); cur->fts_info = FTS_ERR; SET(FTS_STOP); errno = saved_errno; return (NULL); } /* Did realloc() change the pointer? */ if (oldaddr != sp->fts_path) { doadjust = 1; if (ISSET(FTS_NOCHDIR)) cp = sp->fts_path + len; } maxlen = sp->fts_pathlen - len; } p->fts_level = level; p->fts_parent = sp->fts_cur; p->fts_pathlen = len + dnamlen; #ifdef FTS_WHITEOUT if (dp->d_type == DT_WHT) p->fts_flags |= FTS_ISW; #endif if (cderrno) { if (nlinks) { p->fts_info = FTS_NS; p->fts_errno = cderrno; } else p->fts_info = FTS_NSOK; p->fts_accpath = cur->fts_accpath; } else if (nlinks == 0 #ifdef DT_DIR || (nostat && dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN) #endif ) { p->fts_accpath = ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name; p->fts_info = FTS_NSOK; } else { /* Build a file name for fts_stat to stat. */ if (ISSET(FTS_NOCHDIR)) { p->fts_accpath = p->fts_path; memmove(cp, p->fts_name, p->fts_namelen + 1); p->fts_info = fts_stat(sp, p, 0, _dirfd(dirp)); } else { p->fts_accpath = p->fts_name; p->fts_info = fts_stat(sp, p, 0, -1); } /* Decrement link count if applicable. */ if (nlinks > 0 && (p->fts_info == FTS_D || p->fts_info == FTS_DC || p->fts_info == FTS_DOT)) --nlinks; } /* We walk in directory order so "ls -f" doesn't get upset. */ p->fts_link = NULL; if (head == NULL) head = tail = p; else { tail->fts_link = p; tail = p; } ++nitems; } if (readdir_errno) { cur->fts_errno = readdir_errno; /* * If we've not read any items yet, treat * the error as if we can't access the dir. */ cur->fts_info = nitems ? FTS_ERR : FTS_DNR; } if (dirp) (void)closedir(dirp); /* * If realloc() changed the address of the path, adjust the * addresses for the rest of the tree and the dir list. */ if (doadjust) fts_padjust(sp, head); /* * If not changing directories, reset the path back to original * state. */ if (ISSET(FTS_NOCHDIR)) sp->fts_path[cur->fts_pathlen] = '\0'; /* * If descended after called from fts_children or after called from * fts_read and nothing found, get back. At the root level we use * the saved fd; if one of fts_open()'s arguments is a relative path * to an empty directory, we wind up here with no other way back. If * can't get back, we're done. */ if (descend && (type == BCHILD || !nitems) && (cur->fts_level == FTS_ROOTLEVEL ? FCHDIR(sp, sp->fts_rfd) : fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) { fts_lfree(head); cur->fts_info = FTS_ERR; SET(FTS_STOP); return (NULL); } /* If didn't find anything, return NULL. */ if (!nitems) { if (type == BREAD && cur->fts_info != FTS_DNR && cur->fts_info != FTS_ERR) cur->fts_info = FTS_DP; return (NULL); } /* Sort the entries. */ if (sp->fts_compar && nitems > 1) head = fts_sort(sp, head, nitems); return (head); } static int fts_stat(FTS *sp, FTSENT *p, int follow, int dfd) { FTSENT *t; dev_t dev; ino_t ino; struct stat *sbp, sb; int saved_errno; const char *path; if (dfd == -1) path = p->fts_accpath, dfd = AT_FDCWD; else path = p->fts_name; /* If user needs stat info, stat buffer already allocated. */ sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp; #ifdef FTS_WHITEOUT /* Check for whiteout. */ if (p->fts_flags & FTS_ISW) { if (sbp != &sb) { memset(sbp, '\0', sizeof(*sbp)); sbp->st_mode = S_IFWHT; } return (FTS_W); } #endif /* * If doing a logical walk, or application requested FTS_FOLLOW, do * a stat(2). If that fails, check for a non-existent symlink. If * fail, set the errno from the stat call. */ if (ISSET(FTS_LOGICAL) || follow) { if (fstatat(dfd, path, sbp, 0)) { saved_errno = errno; if (fstatat(dfd, path, sbp, AT_SYMLINK_NOFOLLOW)) { p->fts_errno = saved_errno; goto err; } errno = 0; if (S_ISLNK(sbp->st_mode)) return (FTS_SLNONE); } } else if (fstatat(dfd, path, sbp, AT_SYMLINK_NOFOLLOW)) { p->fts_errno = errno; err: memset(sbp, 0, sizeof(struct stat)); return (FTS_NS); } if (S_ISDIR(sbp->st_mode)) { /* * Set the device/inode. Used to find cycles and check for * crossing mount points. Also remember the link count, used * in fts_build to limit the number of stat calls. It is * understood that these fields are only referenced if fts_info * is set to FTS_D. */ dev = p->fts_dev = sbp->st_dev; ino = p->fts_ino = sbp->st_ino; p->fts_nlink = sbp->st_nlink; if (ISDOT(p->fts_name)) return (FTS_DOT); /* * Cycle detection is done by brute force when the directory * is first encountered. If the tree gets deep enough or the * number of symbolic links to directories is high enough, * something faster might be worthwhile. */ for (t = p->fts_parent; t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent) if (ino == t->fts_ino && dev == t->fts_dev) { p->fts_cycle = t; return (FTS_DC); } return (FTS_D); } if (S_ISLNK(sbp->st_mode)) return (FTS_SL); if (S_ISREG(sbp->st_mode)) return (FTS_F); return (FTS_DEFAULT); } /* * The comparison function takes pointers to pointers to FTSENT structures. * Qsort wants a comparison function that takes pointers to void. * (Both with appropriate levels of const-poisoning, of course!) * Use a trampoline function to deal with the difference. */ static int fts_compar(const void *a, const void *b) { FTS *parent; parent = (*(const FTSENT * const *)a)->fts_fts; return (*parent->fts_compar)(a, b); } static FTSENT * fts_sort(FTS *sp, FTSENT *head, size_t nitems) { FTSENT **ap, *p; /* * Construct an array of pointers to the structures and call qsort(3). * Reassemble the array in the order returned by qsort. If unable to * sort for memory reasons, return the directory entries in their * current order. Allocate enough space for the current needs plus * 40 so don't realloc one entry at a time. */ if (nitems > sp->fts_nitems) { sp->fts_nitems = nitems + 40; if ((sp->fts_array = reallocf(sp->fts_array, sp->fts_nitems * sizeof(FTSENT *))) == NULL) { sp->fts_nitems = 0; return (head); } } for (ap = sp->fts_array, p = head; p; p = p->fts_link) *ap++ = p; qsort(sp->fts_array, nitems, sizeof(FTSENT *), fts_compar); for (head = *(ap = sp->fts_array); --nitems; ++ap) ap[0]->fts_link = ap[1]; ap[0]->fts_link = NULL; return (head); } static FTSENT * fts_alloc(FTS *sp, char *name, size_t namelen) { FTSENT *p; size_t len; struct ftsent_withstat { FTSENT ent; struct stat statbuf; }; /* * The file name is a variable length array and no stat structure is * necessary if the user has set the nostat bit. Allocate the FTSENT * structure, the file name and the stat structure in one chunk, but * be careful that the stat structure is reasonably aligned. */ if (ISSET(FTS_NOSTAT)) len = sizeof(FTSENT) + namelen + 1; else len = sizeof(struct ftsent_withstat) + namelen + 1; if ((p = malloc(len)) == NULL) return (NULL); if (ISSET(FTS_NOSTAT)) { p->fts_name = (char *)(p + 1); p->fts_statp = NULL; } else { p->fts_name = (char *)((struct ftsent_withstat *)p + 1); p->fts_statp = &((struct ftsent_withstat *)p)->statbuf; } /* Copy the name and guarantee NUL termination. */ memcpy(p->fts_name, name, namelen); p->fts_name[namelen] = '\0'; p->fts_namelen = namelen; p->fts_path = sp->fts_path; p->fts_errno = 0; p->fts_flags = 0; p->fts_instr = FTS_NOINSTR; p->fts_number = 0; p->fts_pointer = NULL; p->fts_fts = sp; return (p); } static void fts_lfree(FTSENT *head) { FTSENT *p; /* Free a linked list of structures. */ while ((p = head)) { head = head->fts_link; free(p); } } /* * Allow essentially unlimited paths; find, rm, ls should all work on any tree. * Most systems will allow creation of paths much longer than MAXPATHLEN, even * though the kernel won't resolve them. Add the size (not just what's needed) * plus 256 bytes so don't realloc the path 2 bytes at a time. */ static int fts_palloc(FTS *sp, size_t more) { sp->fts_pathlen += more + 256; sp->fts_path = reallocf(sp->fts_path, sp->fts_pathlen); return (sp->fts_path == NULL); } /* * When the path is realloc'd, have to fix all of the pointers in structures * already returned. */ static void fts_padjust(FTS *sp, FTSENT *head) { FTSENT *p; char *addr = sp->fts_path; #define ADJUST(p) do { \ if ((p)->fts_accpath != (p)->fts_name) { \ (p)->fts_accpath = \ (char *)addr + ((p)->fts_accpath - (p)->fts_path); \ } \ (p)->fts_path = addr; \ } while (0) /* Adjust the current set of children. */ for (p = sp->fts_child; p; p = p->fts_link) ADJUST(p); /* Adjust the rest of the tree, including the current level. */ for (p = head; p->fts_level >= FTS_ROOTLEVEL;) { ADJUST(p); p = p->fts_link ? p->fts_link : p->fts_parent; } } static size_t fts_maxarglen(char * const *argv) { size_t len, max; for (max = 0; *argv; ++argv) if ((len = strlen(*argv)) > max) max = len; return (max + 1); } /* * Change to dir specified by fd or p->fts_accpath without getting * tricked by someone changing the world out from underneath us. * Assumes p->fts_dev and p->fts_ino are filled in. */ static int fts_safe_changedir(FTS *sp, FTSENT *p, int fd, char *path) { int ret, oerrno, newfd; struct stat sb; newfd = fd; if (ISSET(FTS_NOCHDIR)) return (0); if (fd < 0 && (newfd = _open(path, O_RDONLY | O_DIRECTORY | O_CLOEXEC, 0)) < 0) return (-1); if (_fstat(newfd, &sb)) { ret = -1; goto bail; } /* * On Darwin, this check causes problems with automounts and firmlinks * so we just disable it. * See: /usr/share/firmlinks for a list of problematic directories * and https://opensource.apple.com/source/Libc/Libc-1439.40.11/gen/fts.c.auto.html * (function fts_safe_changedir()) for more details. */ #if !defined(__APPLE__) if (p->fts_dev != sb.st_dev || p->fts_ino != sb.st_ino) { errno = ENOENT; /* disinformation */ ret = -1; goto bail; } #endif /* !defined(__APPLE__) */ ret = fchdir(newfd); bail: oerrno = errno; if (fd < 0) (void)_close(newfd); errno = oerrno; return (ret); } #if !defined(__linux__) /* * Check if the filesystem for "ent" has UFS-style links. */ static int fts_ufslinks(FTS *sp, const FTSENT *ent) { struct _fts_private *priv; const char **cpp; priv = (struct _fts_private *)sp; /* * If this node's device is different from the previous, grab * the filesystem information, and decide on the reliability * of the link information from this filesystem for stat(2) * avoidance. */ if (priv->ftsp_dev != ent->fts_dev) { #if defined(__sun) || defined(__sun__) if (statvfs(ent->fts_path, &priv->ftsp_statvfs) != -1) { #else if (statfs(ent->fts_path, &priv->ftsp_statfs) != -1) { #endif priv->ftsp_dev = ent->fts_dev; priv->ftsp_linksreliable = 0; for (cpp = ufslike_filesystems; *cpp; cpp++) { #if defined(__sun) || defined(__sun__) if (strcmp(priv->ftsp_statvfs.f_basetype, #else if (strcmp(priv->ftsp_statfs.f_fstypename, #endif *cpp) == 0) { priv->ftsp_linksreliable = 1; break; } } } else { priv->ftsp_linksreliable = 0; } } return (priv->ftsp_linksreliable); } #endif fpart-1.7.0/src/partition.c000644 001751 000000 00000016023 14745137273 016565 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "fpart.h" #include "utils.h" #include "options.h" #include "partition.h" /* fprintf(3) */ #include /* malloc(3) */ #include /* assert(3) */ #include /******************************************************* Double-linked list of partitions manipulation functions *******************************************************/ /* Add num_parts empty partitions to a double-linked list of partitions from head - if head is NULL, creates a new list ; if not, chains a new list to it - returns with head set to the last element */ int add_partitions(struct partition **head, pnum_t num_parts, struct program_options *options, struct program_status *status) { assert(head != NULL); assert(num_parts > 0); assert(options != NULL); assert(status != NULL); struct partition **current = head; /* current partition pointer address */ struct partition *previous = NULL; /* previous partition pointer */ pnum_t i = 0; while(i < num_parts) { /* backup current structure pointer and initialize a new structure */ previous = *current; if_not_malloc(*current, sizeof(struct partition), return (1); ) /* set head on first pass */ if(*head == NULL) *head = *current; /* initialize partition data */ (*current)->size = options->preload_size; (*current)->num_files = 0; (*current)->nextp = NULL; /* will be set in next pass (see below) */ (*current)->prevp = previous; /* set previous' nextp pointer */ if(previous != NULL) previous->nextp = *current; /* count part in */ status->total_size += options->preload_size; status->total_num_parts++; i++; } return (0); } /* Remove a specific partition from the chain */ int remove_partition(struct partition *part, struct program_options *options, struct program_status *status) { assert(part != NULL); assert(options != NULL); assert(status != NULL); assert(status->total_size >= options->preload_size); assert(status->total_num_parts >= 1); /* unlink partition */ if(part->prevp != NULL) part->prevp->nextp = part->nextp; if(part->nextp != NULL) part->nextp->prevp = part->prevp; /* free memory */ free(part); /* count part out */ status->total_size -= options->preload_size; status->total_num_parts--; return (0); } /* Un-initialize a double-linked list of partitions */ void uninit_partitions(struct partition *head) { /* be sure to start from last partition */ fastfw_list(head); struct partition *current = head; struct partition *prev = NULL; while(current != NULL) { prev = current->prevp; free(current); current = prev; } return; } /* Crawl partitions and return the least-loaded partition index */ pnum_t find_smallest_partition_index(struct partition *head) { assert(head != NULL); /* be sure to start at first partition */ rewind_list(head); /* start values */ fsize_t smallest_partition_value = head->size; pnum_t smallest_partition_index = 0; pnum_t i = 0; while(head != NULL) { if(head->size < smallest_partition_value) { smallest_partition_value = head->size; smallest_partition_index = i; } head = head->nextp; i++; } return (smallest_partition_index); } /* Return a pointer to a given partition */ struct partition * get_partition_at(struct partition *head, pnum_t index) { assert(head != NULL); /* be sure to start at first partition */ rewind_list(head); pnum_t i = 0; while((head != NULL) && (i < index)) { head = head->nextp; i++; } return (head); } /* Adapt partition index for output, regarding program options - returns an index suitable for user output (display or filename) */ pnum_t adapt_partition_index(pnum_t index, const struct program_options *options) { assert(options != NULL); pnum_t offset = 1; /* compute output index offset: fpart always produces partitions starting from '1' (but they internally start from '0'). Partition '0' -used for large files that do not fit in regular partitions- only appears when option '-s' is passed *and* non-live mode is used */ if((options->max_size != DFLT_OPT_MAX_SIZE) && (options->live_mode == OPT_NOLIVEMODE)) offset = 0; return (index + offset); } /* Display a partition summary */ void display_partition_summary(pnum_t partition_index, const fsize_t partition_size, const fnum_t partition_num_files, int partition_errno, const unsigned char partition_display_type) { if(partition_display_type == PARTITION_DISPLAY_TYPE_STANDARD) fprintf(stderr, "Part #%ju: size = %ju, files = %ju\n", partition_index, partition_size, partition_num_files); else fprintf(stderr, "Part #%ju: size = %ju, files = %ju, errno = %d\n", partition_index, partition_size, partition_num_files, partition_errno); return; } /* Print partitions from head */ void print_partitions(struct partition *head, struct program_options *options) { assert(options != NULL); pnum_t partition_index = 0; while(head != NULL) { /* skip empty partition '0' */ if((partition_index != 0) || (head->num_files != 0)) display_partition_summary(adapt_partition_index(partition_index, options), head->size, head->num_files, 0, /* partition_errno irrelevant here */ PARTITION_DISPLAY_TYPE_STANDARD); head = head->nextp; partition_index++; } return; } fpart-1.7.0/src/utils.c000644 001751 000000 00000045773 14745137273 015732 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "types.h" #include "utils.h" #include "options.h" /* log10(3) */ #include /* malloc(3) */ #include /* fprintf(3), snprintf(3) */ #include /* fts(3) */ #include #include #if defined(EMBED_FTS) #include "fts.h" #else #include #endif /* strerror(3), strlen(3), strchr(3) */ #include /* errno */ #include /* getcwd(3) */ #include /* MAXPATHLEN */ #include /* assert(3) */ #include /* opendir(3) */ #include /* fnmatch(3) */ #include /* isblank(3) */ #include /* strtoumax(3) */ #include #include /**************** Helper functions ****************/ /* Convert a char (K, M, G, ...) to a size multiplier */ uintmax_t char_to_multiplier(const char c) { uintmax_t ret = 0; switch(c) { case 'k': case 'K': ret = 1 << 10; break; case 'm': case 'M': ret = 1 << 20; break; case 'g': case 'G': ret = 1 << 30; break; case 't': case 'T': ret = (uintmax_t)1 << 40; break; case 'p': case 'P': ret = (uintmax_t)1 << 50; break; } return (ret); } /* Return the number of digits necessary to print i */ unsigned int get_num_digits(double i) { if((int)i == 0) return (1); double logvalue = log10(i); return (logvalue >= 0 ? (unsigned int)logvalue + 1 : 0); } /* Return the size of a file or directory - a pointer to an existing stat must be provided We assume that when that function is called, then the choice of including or excluding the related file or directory has already been made. Thus, exclusion list is only honored when computing size of a directory and when depth is > 0 (i.e. we always accept the root dir but may skip subdirs). */ fsize_t get_size(char *file_path, struct stat *file_stat, struct program_options *options) { assert(file_path != NULL); assert(file_stat != NULL); assert(options != NULL); fsize_t file_size = 0; /* current return value */ /* if file_path is not a directory, return st_size for regular files (only). We do *not* check for valid_file() here because if the function has been called, then the choice of including the file has already been made before */ if(!S_ISDIR(file_stat->st_mode)) { return (S_ISREG(file_stat->st_mode) ? file_stat->st_size : 0); } /* directory, use fts */ FTS *ftsp = NULL; FTSENT *p = NULL; int fts_options = (options->follow_symbolic_links == OPT_FOLLOWSYMLINKS) ? FTS_LOGICAL : FTS_PHYSICAL; fts_options |= (options->cross_fs_boundaries == OPT_NOCROSSFSBOUNDARIES) ? FTS_XDEV : 0; char *fts_argv[] = { file_path, NULL }; if((ftsp = fts_open(fts_argv, fts_options, NULL)) == NULL) { fprintf(stderr, "%s: fts_open()\n", file_path); return (0); } while((p = fts_read(ftsp)) != NULL) { if(options->verbose >= OPT_VVVERBOSE) { fprintf(stderr, "%s(%s): fts_info=%d, ftp_errno=%d\n", __func__, p->fts_path, p->fts_info, p->fts_errno); } switch (p->fts_info) { case FTS_ERR: /* misc error */ case FTS_DNR: /* un-readable directory */ case FTS_NS: /* stat() error */ fprintf(stderr, "%s: %s\n", p->fts_path, strerror(p->fts_errno)); case FTS_NSOK: /* no stat(2) available (not requested) */ continue; case FTS_DC: fprintf(stderr, "%s: filesystem loop detected\n", p->fts_path); case FTS_DOT: /* ignore "." and ".." */ case FTS_DP: continue; case FTS_D: /* Excluded directories do not account for returned size. Always accept root dir here because, if the function has been called, then the choice of including the directory has already been made before */ if((!valid_file(p, options, VF_EXCLUDEONLY)) && (p->fts_level > 0)) { if(options->verbose >= OPT_VVVERBOSE) { fprintf(stderr, "%s(): skipping directory: %s\n", __func__, p->fts_path); } fts_set(ftsp, p, FTS_SKIP); } continue; default: /* XXX default means remaining file types: FTS_F, FTS_SL, FTS_SLNONE, FTS_DEFAULT */ /* Excluded files do not account for returned size */ if(!valid_file(p, options, VF_EXCLUDEONLY)) { if(options->verbose >= OPT_VVVERBOSE) { fprintf(stderr, "%s(): skipping file: %s\n", __func__, p->fts_path); } } else file_size += p->fts_statp->st_size; continue; } } if(errno != 0) fprintf(stderr, "%s: fts_read()\n", file_path); if(fts_close(ftsp) < 0) fprintf(stderr, "%s: fts_close()\n", file_path); return (file_size); } /* Return absolute path for given path - '/xxx' and '-' are considered absolute, e.g. will not be prefixed by cwd. Everything else will. - returned pointer must be manually freed later */ char * abs_path(const char *path) { assert(path != NULL); char *cwd = NULL; /* current working directory */ char *abs = NULL; /* will be returned */ size_t malloc_size = 0; if(path[0] == '\0') { errno = ENOENT; return (NULL); } if((path[0] != '/') && ((path[0] != '-') || (path[1] != '\0'))) { /* relative path given */ if_not_malloc(cwd, MAXPATHLEN, return (NULL); ) if(getcwd(cwd, MAXPATHLEN) == NULL) { free(cwd); return (NULL); } malloc_size += strlen(cwd) + 1; /* cwd + '/' */ } malloc_size += strlen(path) + 1; /* path + '\0' */ if_not_malloc(abs, malloc_size, /* just print error message (within macro code) */ ) else { if(cwd != NULL) snprintf(abs, malloc_size, "%s/%s", cwd, path); else snprintf(abs, malloc_size, "%s", path); } if(cwd != NULL) free(cwd); return (abs); } /* In-place remove multiple ending slashes from path leaving a single ending slash, if any - path must point to a writeable address */ void cleanslash_path(char * const path) { assert(path != NULL); size_t path_len = strlen(path); while((path_len > 1) && (path[path_len - 1] == '/') && (path[path_len - 2] == '/')) { path[path_len - 1] = '\0'; path_len--; } return; } #if 0 /* Add an ending slash to path - returns a new slashed path address - returned memory must be freed afterwards - NULL is returned when an error occurs */ char * slash_path(const char * const path) { assert(path != NULL); size_t path_len = strlen(path); char *slashed_path = NULL; /* will be returned */ if_not_malloc(slashed_path, path_len + 1 + 1, return (NULL); ) snprintf(slashed_path, path_len + 1 + 1, "%s/", path); return (slashed_path); } #endif /* Allocate and return path's parent - returned memory must be freed afterwards - returned parent ends with zero or a single ending '/' - multiple intermediate slashes are *not* removed - an empty string is returned when attempting to retrieve a single-level relative path's parent - NULL is returned when an error occurs Examples : "/foo/bar///baz///" => "/foo/bar/" "/foo///bar///baz///" => "/foo///bar/" "foo/bar///baz///" => "foo/bar/" "foo///" => "" "///foo" => "/" "foo" => "" "" => "" */ char * parent_path(const char * const path, const unsigned char keep_ending_slash) { assert(path != NULL); char *parent = NULL; /* will be returned */ char pe_seen = 0; /* has a path element (any char != '/') been seen ? */ size_t path_len = strlen(path); if_not_malloc(parent, path_len + 1, return (NULL); ) snprintf(parent, path_len + 1, "%s", path); /* crawl the string from the end and erase last path element */ while( /* absolute paths: allow erasing up to the initial '/' */ (((parent[0] == '/') && (path_len > 1)) || /* relative paths: allow erasing up to the empty string */ ((parent[0] != '/') && (path_len >= 1))) && /* only slashes seen yet */ ((pe_seen == 0) || /* current char belongs to last path element */ ((pe_seen == 1) && (parent[path_len - 1] != '/')) || /* we erased last path element but next char is also a slash */ ((pe_seen == 1) && (parent[path_len - 1] == '/') && (parent[path_len - 2] == '/'))) ) { if(parent[path_len - 1] != '/') pe_seen = 1; parent[path_len - 1] = '\0'; path_len--; } /* remove ending slash if requested, always leaving initial '/' intact */ if((!keep_ending_slash) && (path_len > 1) && (parent[path_len - 1] == '/')) { parent[path_len - 1] = '\0'; path_len--; } return (parent); } /* Push str into array and update num - allocate memory for array if NULL - return 0 (success) or 1 (failure) */ int str_push(char ***array, unsigned int *num, const char * const str) { assert(array != NULL); assert(num != NULL); assert(str != NULL); assert(((*array == NULL) && (*num == 0)) || ((*num > 0) && (*array != NULL))); /* allocate new string */ char *tmp_str = NULL; size_t malloc_size = strlen(str) + 1; if_not_malloc(tmp_str, malloc_size, return (1); ) snprintf(tmp_str, malloc_size, "%s", str); /* add new char *pointer to array */ { if_not_realloc(*array, sizeof(char *) * ((*num) + 1), free(tmp_str); return (1); ) } (*array)[*num] = tmp_str; *num += 1; return (0); } /* Cleanup str array - remove and free() every str from array - free() and NULL'ify array - update num */ void str_cleanup(char ***array, unsigned int *num) { assert(num != NULL); assert(array != NULL); assert(((*array == NULL) && (*num == 0)) || ((*num > 0) && (*array != NULL))); while(*num > 0) { if((*array)[(*num) - 1] != NULL) { free((*array)[(*num) - 1]); (*array)[(*num) - 1] = NULL; *num -= 1; } } free(*array); *array = NULL; return; } /* Check if a string begins with a '-' sign - return 1 if it is the case, else 0 */ int str_is_negative(const char *str) { assert(str != NULL); /* skip blanks to test first character */ while(isblank(*str)) str++; if(*str == '-') return (1); else return (0); } /* Convert a str to a uintmax > 0 - support human-friendly multipliers - only accept values > 0 as input - return 0 if an error occurs */ uintmax_t str_to_uintmax(const char *str, const unsigned char handle_multiplier) { assert(str != NULL); char *endptr = NULL; uintmax_t val = 0; uintmax_t multiplier = 0; /* check if a negative value has been provided */ if(str_is_negative(str)) return (0); errno = 0; val = strtoumax(str, &endptr, 10); /* check that something was converted and refuse invalid values */ if((endptr == optarg) || (val == 0)) return (0); /* check for other errors */ if(errno != 0) { fprintf(stderr, "%s(): %s\n", __func__, strerror(errno)); return (0); } /* if characters remain, handle multiplier */ if(*endptr != '\0') { /* return an error if we do not want to handle multiplier */ if(!handle_multiplier) { fprintf(stderr, "%s(): %s\n", __func__, "unexpected unit provided"); return (0); } uintmax_t orig_val = val; /* more than one character remain or invalid multiplier specified */ if((*(endptr + 1) != '\0') || (multiplier = char_to_multiplier(*endptr)) == 0) { fprintf(stderr, "%s(): %s\n", __func__, "unknown unit provided"); return (0); } /* check for overflow */ val *= multiplier; if((val / multiplier) != orig_val) { fprintf(stderr, "%s(): %s\n", __func__, strerror(ERANGE)); return (0); } } #if defined(DEBUG) fprintf(stderr, "%s(): converted string %s to value %ju\n", __func__, optarg, val); #endif return (val); } /* Match an fts entry against an array of strings - return 0 (no match) or 1 (match) */ int file_match(const char * const * const array, const unsigned int num, const FTSENT * const p, const unsigned char ignore_case) { assert(p != NULL); assert(p->fts_name != NULL); assert(p->fts_path != NULL); if(array == NULL) return (0); unsigned int i = 0; while(i < num) { if(strchr(array[i], '/') == NULL) { /* Current string contains a file name */ if(fnmatch(array[i], p->fts_name, FNM_PERIOD | (ignore_case ? FNM_CASEFOLD : 0)) == 0) return (1); } else { /* Current string contains a path */ if(fnmatch(array[i], p->fts_path, FNM_PATHNAME | FNM_PERIOD | (ignore_case ? FNM_CASEFOLD : 0)) == 0) return (1); } i++; } return (0); } /* Validate a file regarding program options - exclude_only (ignore include lists) is useful to: - be able to crawl the entire file hierarchy (honoring include lists would prevent the caller from entering a non-included directory and break crawling) - compute leaf directory size, when only exclude lists are needed - return 0 if file is not valid, 1 if it is */ int valid_file(const FTSENT * const p, struct program_options *options, unsigned char exclude_only) { assert(p != NULL); assert(p->fts_name != NULL); assert(p->fts_path != NULL); assert(options != NULL); int valid = 1; #if defined(DEBUG) fprintf(stderr, "%s(): checking name validity (%s includes): %s (path: %s)\n", __func__, exclude_only ? "without" : "with", (p->fts_namelen > 0) ? p->fts_name : "", p->fts_path); #endif /* check for includes (options -y and -Y), if requested */ if(!exclude_only) { if((options->include_files != NULL) || (options->include_files_ci != NULL)) { /* switch to default exclude, unless file found in lists */ valid = 0; if(file_match((const char * const * const)(options->include_files), options->ninclude_files, p, 0) || file_match((const char * const * const)(options->include_files_ci), options->ninclude_files_ci, p, 1)) valid = 1; } } /* check for excludes (options -x and -X) */ if(file_match((const char * const * const)(options->exclude_files), options->nexclude_files, p, 0) || file_match((const char * const * const)(options->exclude_files_ci), options->nexclude_files_ci, p, 1)) valid = 0; #if defined(DEBUG) fprintf(stderr, "%s(): %s, validity: %s\n", __func__, (p->fts_namelen > 0) ? p->fts_name : "", valid ? "valid" : "invalid"); #endif return (valid); } /* Create a copy of environ(7) and return its address - return a pointer to the copy or NULL if error - returned environ must be freed later */ char ** clone_env(void) { unsigned int env_size = 0; char **new_env = NULL; /* import original environ */ extern char **environ; /* compute environ size */ while(environ[env_size]) env_size++; /* ending NULL */ env_size++; size_t malloc_size = sizeof(char *) * env_size; if_not_malloc(new_env, malloc_size, /* just print error message (within macro code) */ ) else { /* copy each pointer, beginning from the ending NULL value */ while(env_size > 0) { new_env[env_size - 1] = environ[env_size - 1]; env_size--; } } return (new_env); } /* Push a str pointer to a cloned environ(7) - return enlarged environ through env - returned environ must be freed later - return 0 (success) or 1 (failure) */ int push_env(char *str, char ***env) { assert(str != NULL); assert(env != NULL); assert(*env != NULL); unsigned int env_size = 0; char **new_env = NULL; /* compute environ size */ while((*env)[env_size]) env_size++; /* add our pointer */ env_size++; /* add ending NULL */ env_size++; size_t malloc_size = sizeof(char *) * env_size; if_not_malloc(new_env, malloc_size, return (1); ) /* copy each pointer, beginning from the ending NULL value */ new_env[env_size - 1] = NULL; new_env[env_size - 2] = str; env_size -= 2; while(env_size > 0) { new_env[env_size - 1] = (*env)[env_size - 1]; env_size--; } /* free previous environment and update env */ free(*env); *env = new_env; return (0); } /* Display final summary */ void display_final_summary(const pnum_t total_num_parts, const fsize_t total_size, const fnum_t total_num_files) { fprintf(stderr, "Summary: size = %ju, files = %ju, parts = %ju\n", total_size, total_num_files, total_num_parts); return; } fpart-1.7.0/src/dispatch.c000644 001751 000000 00000026537 14745137273 016366 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "types.h" #include "utils.h" #include "dispatch.h" /* NULL */ #include /* fprintf(3) */ #include /* assert(3) */ #include /***************************** File entry dispatch functions *****************************/ /* Sort an array of file_entry pointers given file size, biggest to smallest This function is used by qsort(3) */ int sort_file_entry_p(const void *a, const void *b) { assert((a != NULL) && (*(struct file_entry **)a != NULL)); assert((b != NULL) && (*(struct file_entry **)b != NULL)); if((*(struct file_entry **)a)->size < (*(struct file_entry **)b)->size) return (1); else if((*(struct file_entry **)a)->size > (*(struct file_entry **)b)->size) return (-1); else return (0); } /* Dispatch file_entries by assigning them a partition number - a sorted array of file entry pointers must be provided as an argument - as well as a pointer to a double linked-list of partitions' head that will contain the total amount of data of each assigned file */ int dispatch_file_entry_p_by_size(struct file_entry **file_entry_p, fnum_t num_entries, struct partition *head, pnum_t num_parts) { assert(head != NULL); assert(num_parts > 0); fnum_t i = 0; while((file_entry_p != NULL) && (file_entry_p[i] != NULL) && (i < num_entries)) { /* find most approriate partition */ pnum_t smallest_partition_index = find_smallest_partition_index(head); struct partition *smallest_partition = get_partition_at(head, smallest_partition_index); if(smallest_partition == NULL) { fprintf(stderr, "%s(): get_partition_at() returned NULL\n", __func__); return (1); } /* assign it */ file_entry_p[i]->partition_index = smallest_partition_index; #if defined(DEBUG) fprintf(stderr, "%s(): %s assigned to partition_index %ju (%p)\n", __func__, file_entry_p[i]->path, file_entry_p[i]->partition_index, smallest_partition); #endif /* and load the partition with file size */ smallest_partition->size += file_entry_p[i]->size; smallest_partition->num_files++; i++; } return (0); } /* Dispatch empty file_entries (files with zero-byte size) from head by assigning them a more appropriate partition number. The idea is to get empty files spread accross partitions and not get them all in the last one. - a double-linked list of partitions is provided as an argument */ int dispatch_empty_file_entries(struct file_entry *head, fnum_t num_entries, struct partition *part_head, pnum_t num_parts) { assert(head != NULL); assert(part_head != NULL); assert(num_parts > 0); /* backup head */ struct file_entry *start = head; /* first pass: count empty files */ fnum_t num_empty_entries = 0; while(head != NULL) { if(head->size == 0) num_empty_entries++; head = head->nextp; } /* go back to original head */ head = start; /* compute mean file entry number per partition */ fnum_t mean_files = (num_entries / num_parts); /* be sure to start at first partition as we are handling indexes here. Starting at first file_entry is not necessary as we would not corrupt any information, but just skip a few file entries */ rewind_list(part_head); /* for each empty file, associate it with the first partition having less files than mean_files */ while(head != NULL) { if(head->size == 0) { /* empty file found */ pnum_t j = 0; /* backup partition head */ struct partition *part_start = part_head; while(part_head != NULL) { if((head->partition_index != j) && (part_head->num_files < mean_files)) { struct partition *previous_partition = get_partition_at(part_start, head->partition_index); if(previous_partition == NULL) { fprintf(stderr, "%s(): " "get_partition_at() returned NULL\n", __func__); return (1); } /* unload the previous part (only affects the number of files, size does not change) */ previous_partition->num_files--; /* load the new part */ part_head->num_files++; /* assign new index to file entry */ head->partition_index = j; #if defined(DEBUG) fprintf(stderr, "%s(): %s (empty) re-assigned to partition_index " "%ju (%p)\n", __func__, head->path, head->partition_index, part_head); #endif break; } part_head = part_head->nextp; j++; } /* go back to original head */ part_head = part_start; } head = head->nextp; } return (0); } /* Dispatch file_entries from head into partitions that will be created on-the-fly, with respect to max_entries (maximum files per partitions) and max_size (max partition size) - must be called with *part_head == NULL (will create partitions) - if max_size > 0, partition 0 will hold files that cannot be held by other partitions - returns the number of parts created with part_head set to the first element */ pnum_t dispatch_file_entries_by_limits(struct file_entry *head, struct partition **part_head, fnum_t max_entries, fsize_t max_size, struct program_options *options, struct program_status *status) { assert(head != NULL); assert((part_head != NULL) && (*part_head == NULL)); assert(options != NULL); assert(status != NULL); /* number of partitions created, our return value */ pnum_t num_parts_created = 0; /* when max_size is used, create a default partition (partition 0) that will hold files that does not match criteria */ if(max_size > 0) { if(add_partitions(part_head, 1, options, status) != 0) { fprintf(stderr, "%s(): cannot init default partition\n", __func__); return (num_parts_created); } num_parts_created++; } struct partition *default_partition = *part_head; pnum_t default_partition_index = 0; /* create a first data partition and keep a pointer to it */ if(add_partitions(part_head, 1, options, status) != 0) { fprintf(stderr, "%s(): cannot create partition\n", __func__); *part_head = default_partition; return (num_parts_created); } num_parts_created++; struct partition *start_partition = *part_head; pnum_t start_partition_index = num_parts_created - 1; /* for each file, associate it with current partition (or default_partition) */ pnum_t current_partition_index = start_partition_index; while(head != NULL) { /* max_size provided and file size > max_size, associate file to default partition */ if((max_size > 0) && (head->size > max_size)) { head->partition_index = default_partition_index; default_partition->size += head->size; default_partition->num_files++; #if defined(DEBUG) fprintf(stderr, "%s(): %s assigned to partition_index %ju (%p)\n", __func__, head->path, head->partition_index, default_partition); #endif } else { /* examine each partition */ while((*part_head) != NULL) { /* if file does not fit in partition */ if(((max_entries > 0) && (((*part_head)->num_files + 1) > max_entries)) || ((max_size > 0) && (((*part_head)->size + head->size) > max_size))) { /* and we reached last partition, chain a new one */ if((*part_head)->nextp == NULL) { if(add_partitions(part_head, 1, options, status) != 0) { fprintf(stderr, "%s(): cannot create partition\n", __func__); *part_head = start_partition; return (num_parts_created); } num_parts_created++; #if defined(DEBUG) fprintf(stderr, "%s(): chained one partition (%p)\n", __func__, *part_head); #endif } else { /* examine next partition */ *part_head = (*part_head)->nextp; } current_partition_index++; } else { /* file fits in current partition, add it */ head->partition_index = current_partition_index; (*part_head)->size += head->size; (*part_head)->num_files++; #if defined(DEBUG) fprintf(stderr, "%s(): %s assigned to partition_index %ju (%p)\n", __func__, head->path, head->partition_index, *part_head); #endif /* examine next file */ break; } } assert(*part_head != NULL); } /* examine next file */ head = head->nextp; /* come back to the first partition */ current_partition_index = start_partition_index; *part_head = start_partition; } /* empty partition cleanup: When using option -s, if only special partition '0' (default_partition) has been populated, remove start_partition to avoid returning an additional -empty- partition */ if((max_size > 0) && (start_partition->num_files == 0)) { remove_partition(start_partition, options, status); start_partition = NULL; num_parts_created--; *part_head = default_partition; } return (num_parts_created); } fpart-1.7.0/src/fpart.c000644 001751 000000 00000103246 14745137273 015674 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "fpart.h" #include "types.h" #include "utils.h" #include "options.h" #include "partition.h" #include "file_entry.h" #include "dispatch.h" /* NULL, exit(3) */ #include /* strtoumax(3) */ #include #include /* fprintf(3), fopen(3), fclose(3), fgets(3), foef(3) */ #include /* getopt(3) / getopt_long(3) */ #include #if defined(HAVE_GETOPT_H) #include #endif /* Short options */ #if defined(_HAS_FNM_CASEFOLD) #define OPTIONS "+hVn:f:s:i:ao:0ePvlby:Y:x:X:zZd:DELSw:W:R:p:q:r:" #else #define OPTIONS "+hVn:f:s:i:ao:0ePvlby:x:zZd:DELSw:W:R:p:q:r:" #endif /* Long options */ #if defined(HAVE_GETOPT_LONG) #define GETOPT getopt_long static struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, { "parts", required_argument, NULL, 'n' }, { "files", required_argument, NULL, 'f' }, { "size", required_argument, NULL, 's' }, { "arbitrary", no_argument, NULL, 'a' }, { "verbose", no_argument, NULL, 'v' }, { "include", required_argument, NULL, 'y' }, { "exclude", required_argument, NULL, 'x' }, { "leaf-dirs", no_argument, NULL, 'D' }, { "dirs-only", no_argument, NULL, 'E' }, { "live", no_argument, NULL, 'L' }, { "pre-part-cmd", required_argument, NULL, 'w' }, { "post-part-cmd", required_argument, NULL, 'W' }, { "post-run-cmd", required_argument, NULL, 'R' }, { NULL, 0, NULL, 0 } }; #else #define GETOPT getopt #endif /* strlen(3) */ #include /* bzero(3) */ #include /* errno */ #include /* assert(3) */ #include /* Print version */ static void version(void) { fprintf(stderr, "fpart v" FPART_VERSION "\n" "Copyright (c) 2011-2025 " "Ganael LAPLANCHE \n" "WWW: http://contribs.martymac.org\n"); fprintf(stderr, "Build options: debug="); #if defined(DEBUG) fprintf(stderr, "yes, fts="); #else fprintf(stderr, "no, fts="); #endif #if defined(EMBED_FTS) fprintf(stderr, "embedded\n"); #else fprintf(stderr, "system\n"); #endif fprintf(stderr, "Long options are "); #if defined(HAVE_GETOPT_LONG) fprintf(stderr, "supported\n"); #else fprintf(stderr, "not supported\n"); #endif } /* Print usage */ static void usage(void) { fprintf(stderr, "fpart v" FPART_VERSION " - Sort and pack files into " "partitions\n"); fprintf(stderr, "Usage: fpart [OPTIONS] -n num | -f files | -s size " "[FILE or DIR...]\n"); fprintf(stderr, "\n"); fprintf(stderr, "General options:\n"); fprintf(stderr, " -h, --help print this help\n"); fprintf(stderr, " -V, --version print version\n"); fprintf(stderr, "\n"); fprintf(stderr, "Partition control:\n"); fprintf(stderr, " -n, --parts pack files into " "partitions\n"); fprintf(stderr, " -f, --files limit partitions to files " "or directories\n"); fprintf(stderr, " -s, --size limit partitions to " "bytes\n"); fprintf(stderr, "\n"); fprintf(stderr, "Input control:\n"); fprintf(stderr, " -i read file list from " "(stdin if '-' is specified)\n"); fprintf(stderr, " -a, --arbitrary input contains arbitrary values " "(do not crawl filesystem)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Output control:\n"); fprintf(stderr, " -o output partitions to " "template (stdout if '-' is\n"); fprintf(stderr, " specified)\n"); fprintf(stderr, " -0 end filenames with a null (\\0) " "character when using\n"); fprintf(stderr, " option -o\n"); fprintf(stderr, " -e add ending slash to directories\n"); fprintf(stderr, " -P add parent directories when " "closing intermediate\n"); fprintf(stderr, " partitions (needs -L)\n"); fprintf(stderr, " -v, --verbose verbose mode (may be specified " "more than once to increase\n"); fprintf(stderr, " verbosity)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Filesystem crawling control:\n"); fprintf(stderr, " -l follow symbolic links\n"); fprintf(stderr, " -b do not cross filesystem " "boundaries\n"); fprintf(stderr, " -y, --include include files matching " "only (may be specified\n"); fprintf(stderr, " more than once)\n"); #if defined(_HAS_FNM_CASEFOLD) fprintf(stderr, " -Y same as -y, but ignore case\n"); #endif fprintf(stderr, " -x, --exclude exclude files matching " "(may be specified more\n"); fprintf(stderr, " than once)\n"); #if defined(_HAS_FNM_CASEFOLD) fprintf(stderr, " -X same as -x, but ignore case\n"); #endif fprintf(stderr, "\n"); fprintf(stderr, "Directory handling:\n"); fprintf(stderr, " -z pack empty directories too " "(default: pack files only)\n"); fprintf(stderr, " -zz treat un-readable directories as " "empty\n"); fprintf(stderr, " -zzz pack all directories (as empty)\n"); fprintf(stderr, " -Z pack un-readable directories in " "separate partitions\n"); fprintf(stderr, " -d pack directories instead of files " "after a certain \n"); fprintf(stderr, " -D, --leaf-dirs pack leaf directories (i.e. " "containing files only,\n"); fprintf(stderr, " implies -z)\n"); fprintf(stderr, " -E, --dirs-only pack directories instead of files " "(implies -D)\n"); fprintf(stderr, "\n"); fprintf(stderr, "Live mode:\n"); fprintf(stderr, " -L, --live live mode: generate partitions " "during filesystem crawling\n"); fprintf(stderr, " -S do not pack files bigger than " "specified maximum partition\n"); fprintf(stderr, " size but print them to stdout " "instead (needs -L and -s)\n"); fprintf(stderr, " -w, --pre-part-cmd pre-partition hook: execute " "at partition start\n"); fprintf(stderr, " -W, --post-part-cmd post-partition hook: execute " "at partition end\n"); fprintf(stderr, " -R, --post-run-cmd post-run hook: execute " "before exiting\n"); fprintf(stderr, "\n"); fprintf(stderr, "Size handling:\n"); fprintf(stderr, " -p preload each partition with " "bytes\n"); fprintf(stderr, " -q overload each file with " "bytes\n"); fprintf(stderr, " -r round each file size up to next " " bytes multiple\n"); fprintf(stderr, "\n"); fprintf(stderr, "Example: fpart -n 3 -o var-parts /var\n"); fprintf(stderr, "\n"); #if !defined(HAVE_GETOPT_LONG) fprintf(stderr, "Note: Long options are not supported on this platform.\n"); #endif fprintf(stderr, "Please report bugs to Ganael LAPLANCHE " "\n"); fprintf(stderr, "WWW: http://contribs.martymac.org\n"); return; } /* Handle one argument (either a path to crawl or an arbitrary value) and update file entries (head) - returns != 0 if a critical error occurred - returns with head set to the last element added - updates main_status.total_size and main_status.total_num_files with the number of elements added */ static int handle_argument(char *argument, struct file_entry **head, struct program_options *options, struct program_status *status) { assert(argument != NULL); assert(head != NULL); assert(options != NULL); assert(status != NULL); if(options->arbitrary_values == OPT_ARBITRARYVALUES) { /* handle arbitrary values */ fsize_t input_size = 0; char *input_path = NULL; if_not_malloc(input_path, strlen(argument) + 1, return (1); ) if(sscanf(argument, "%ju %[^\n]", &input_size, input_path) == 2) { if(handle_file_entry(head, input_path, input_size, 0, options, status) /* entry_errno irrelevant here */ < 0) { fprintf(stderr, "%s(): cannot add file entry\n", __func__); free(input_path); return (1); } } else fprintf(stderr, "error parsing input values: %s\n", argument); /* cleanup */ free(input_path); } else { /* handle paths, must examine filesystem */ char *input_path = NULL; size_t input_path_len = strlen(argument); size_t malloc_size = input_path_len + 1; if_not_malloc(input_path, malloc_size, return (1); ) snprintf(input_path, malloc_size, "%s", argument); /* remove multiple ending slashes */ cleanslash_path(input_path); /* crawl path */ if(input_path[0] != '\0') { #if defined(DEBUG) fprintf(stderr, "init_file_entries(): examining %s\n", input_path); #endif if(init_file_entries(input_path, head, options, status) != 0) { fprintf(stderr, "%s(): cannot initialize file entries\n", __func__); free(input_path); return (1); } } /* cleanup */ free(input_path); } return (0); } /* Handle options parsing - initializes options structure using argc and argv (through pointers) - returns a value defined by the mask below */ static int handle_options(struct program_options *options, int *argcp, char ***argvp) { /* Return code mask */ #define FPART_OPTS_OK 0 /* OK */ #define FPART_OPTS_NOK 1 /* Error */ #define FPART_OPTS_EXIT 2 /* exit(3) required */ #define FPART_OPTS_USAGE 4 /* usage() call required */ #define FPART_OPTS_VERSION 8 /* version() call required */ assert(options != NULL); assert(argcp != NULL); assert(*argcp > 0); assert(argvp != NULL); assert(*argvp != NULL); /* Options handling */ extern char *optarg; extern int optind; int ch; while((ch = GETOPT(*argcp, *argvp, OPTIONS #if defined(HAVE_GETOPT_LONG) , long_options, NULL #endif )) != -1) { switch(ch) { case 'h': return (FPART_OPTS_USAGE | FPART_OPTS_OK | FPART_OPTS_EXIT); case 'V': return (FPART_OPTS_VERSION | FPART_OPTS_OK | FPART_OPTS_EXIT); case 'n': { uintmax_t num_parts = str_to_uintmax(optarg, 0); if(num_parts == 0) { fprintf(stderr, "Option -n requires a value greater than 0.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->num_parts = (pnum_t)num_parts; break; } case 'f': { uintmax_t max_entries = str_to_uintmax(optarg, 0); if(max_entries == 0) { fprintf(stderr, "Option -f requires a value greater than 0.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->max_entries = (fnum_t)max_entries; break; } case 's': { uintmax_t max_size = str_to_uintmax(optarg, 1); if(max_size == 0) { fprintf(stderr, "Option -s requires a value greater than 0.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->max_size = (fsize_t)max_size; break; } case 'i': { /* check for empty argument */ if(strlen(optarg) == 0) break; /* replace previous filename if '-i' specified multiple times */ if(options->in_filename != NULL) free(options->in_filename); options->in_filename = abs_path(optarg); if(options->in_filename == NULL) { fprintf(stderr, "%s(): cannot determine absolute path for " "file '%s'\n", __func__, optarg); return (FPART_OPTS_NOK | FPART_OPTS_EXIT); } break; } case 'a': options->arbitrary_values = OPT_ARBITRARYVALUES; break; case 'o': { /* check for empty argument */ if(strlen(optarg) == 0) break; /* replace previous filename if '-o' specified multiple times */ if(options->out_filename != NULL) free(options->out_filename); /* '-' goes to stdout */ if((optarg[0] == '-') && (optarg[1] == '\0')) { options->out_filename = NULL; } else { options->out_filename = abs_path(optarg); if(options->out_filename == NULL) { fprintf(stderr, "%s(): cannot determine absolute path " "for file '%s'\n", __func__, optarg); return (FPART_OPTS_NOK | FPART_OPTS_EXIT); } } break; } case '0': options->out_zero = OPT_OUT0; break; case 'e': options->add_slash = OPT_ADDSLASH; break; case 'P': options->add_parents = OPT_ADDPARENTS; break; case 'v': options->verbose++; break; case 'l': options->follow_symbolic_links = OPT_FOLLOWSYMLINKS; break; case 'b': options->cross_fs_boundaries = OPT_NOCROSSFSBOUNDARIES; break; case 'y': case 'Y': /* needs _HAS_FNM_CASEFOLD */ case 'x': case 'X': /* needs _HAS_FNM_CASEFOLD */ { char ***dst_list = NULL; unsigned int *dst_num = NULL; switch(ch) { case 'y': dst_list = &(options->include_files); dst_num = &(options->ninclude_files); break; case 'Y': dst_list = &(options->include_files_ci); dst_num = &(options->ninclude_files_ci); break; case 'x': dst_list = &(options->exclude_files); dst_num = &(options->nexclude_files); break; case 'X': dst_list = &(options->exclude_files_ci); dst_num = &(options->nexclude_files_ci); break; } /* check for empty argument */ if(strlen(optarg) == 0) break; /* push string */ if(str_push(dst_list, dst_num, optarg) != 0) return (FPART_OPTS_NOK | FPART_OPTS_EXIT); break; } case 'z': options->dirs_include++; break; case 'Z': options->dnr_split = OPT_DNRSPLIT; break; case 'd': { char *endptr = NULL; long dir_depth = strtol(optarg, &endptr, 10); /* refuse values < 0 (-1 being used to disable this option) */ if((endptr == optarg) || (*endptr != '\0') || (dir_depth < 0)) return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); options->dir_depth = (int)dir_depth; break; } case 'D': options->leaf_dirs = OPT_LEAFDIRS; break; case 'E': options->dirs_only = OPT_DIRSONLY; options->leaf_dirs = OPT_LEAFDIRS; break; case 'L': options->live_mode = OPT_LIVEMODE; break; case 'S': options->skip_big = OPT_SKIPBIG; break; case 'w': { /* check for empty argument */ size_t malloc_size = strlen(optarg) + 1; if(malloc_size <= 1) break; /* replace previous hook if '-w' specified multiple times */ if(options->pre_part_hook != NULL) free(options->pre_part_hook); if_not_malloc(options->pre_part_hook, malloc_size, return (FPART_OPTS_NOK | FPART_OPTS_EXIT); ) snprintf(options->pre_part_hook, malloc_size, "%s", optarg); break; } case 'W': { /* check for empty argument */ size_t malloc_size = strlen(optarg) + 1; if(malloc_size <= 1) break; /* replace previous hook if '-W' specified multiple times */ if(options->post_part_hook != NULL) free(options->post_part_hook); if_not_malloc(options->post_part_hook, malloc_size, return (FPART_OPTS_NOK | FPART_OPTS_EXIT); ) snprintf(options->post_part_hook, malloc_size, "%s", optarg); break; } case 'R': { /* check for empty argument */ size_t malloc_size = strlen(optarg) + 1; if(malloc_size <= 1) break; /* replace previous hook if '-R' specified multiple times */ if(options->post_run_hook != NULL) free(options->post_run_hook); if_not_malloc(options->post_run_hook, malloc_size, return (FPART_OPTS_NOK | FPART_OPTS_EXIT); ) snprintf(options->post_run_hook, malloc_size, "%s", optarg); break; } case 'p': { uintmax_t preload_size = str_to_uintmax(optarg, 1); if(preload_size == 0) { fprintf(stderr, "Option -p requires a value greater than 0.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->preload_size = (fsize_t)preload_size; break; } case 'q': { uintmax_t overload_size = str_to_uintmax(optarg, 1); if(overload_size == 0) { fprintf(stderr, "Option -q requires a value greater than 0.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->overload_size = (fsize_t)overload_size; break; } case 'r': { uintmax_t round_size = str_to_uintmax(optarg, 1); if(round_size <= 1) { fprintf(stderr, "Option -r requires a value greater than 1.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } options->round_size = (fsize_t)round_size; break; } case '?': default: return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } } *argcp -= optind; *argvp += optind; /* check for options consistency */ if((options->num_parts == DFLT_OPT_NUM_PARTS) && (options->max_entries == DFLT_OPT_MAX_ENTRIES) && (options->max_size == DFLT_OPT_MAX_SIZE)) { fprintf(stderr, "Please specify either -n, -f or -s.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } if((options->num_parts != DFLT_OPT_NUM_PARTS) && ((options->max_entries != DFLT_OPT_MAX_ENTRIES) || (options->max_size != DFLT_OPT_MAX_SIZE) || (options->live_mode != DFLT_OPT_LIVEMODE))) { fprintf(stderr, "Option -n is incompatible with options -f, -s and -L.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } if(options->arbitrary_values == OPT_ARBITRARYVALUES) { if((options->add_slash != DFLT_OPT_ADDSLASH) || (options->follow_symbolic_links != DFLT_OPT_FOLLOWSYMLINKS) || (options->cross_fs_boundaries != DFLT_OPT_CROSSFSBOUNDARIES) || (options->include_files != NULL) || (options->include_files_ci != NULL) || (options->exclude_files != NULL) || (options->exclude_files_ci != NULL) || (options->dirs_include != DFLT_OPT_DIRSINCLUDE) || (options->dir_depth != DFLT_OPT_DIR_DEPTH) || (options->leaf_dirs != DFLT_OPT_LEAFDIRS) || (options->dirs_only != DFLT_OPT_DIRSONLY)) { fprintf(stderr, "Option -a is incompatible with crawling-related options.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } } if((options->out_zero == OPT_OUT0) && options->out_filename == NULL) { fprintf(stderr, "Option -0 is valid only when used with option -o.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } /* option -P (needs '-L') */ if((options->add_parents == OPT_ADDPARENTS) && (options->live_mode == OPT_NOLIVEMODE)) { fprintf(stderr, "Option -P can only be used with options -L.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } /* We do not want to mix -E and -d as directory sizes are computed differently for those options: -E produces a single-depth total while -d computes a recursive total */ if((options->dirs_only == OPT_DIRSONLY) && (options->dir_depth != DFLT_OPT_DIR_DEPTH)) { fprintf(stderr, "Option -E is incompatible with option -d.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } /* Options -D and -E imply empty dirs request (option -z) */ if(options->leaf_dirs == OPT_LEAFDIRS) options->dirs_include = max(options->dirs_include, OPT_EMPTYDIRS); if((options->live_mode == OPT_NOLIVEMODE) && ((options->pre_part_hook != NULL) || (options->post_part_hook != NULL) || (options->post_run_hook != NULL))) { fprintf(stderr, "Hooks can only be used with option -L.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } /* Option -Z requires -L and -zz (or -zzz) */ if((options->dnr_split == OPT_DNRSPLIT) && ((options->live_mode == OPT_NOLIVEMODE) || (options->dirs_include < OPT_DNREMPTY))) { fprintf(stderr, "Option -Z requires options -L and -zz (or -zzz).\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } /* option -S (needs '-L' and '-s') */ if((options->skip_big == OPT_SKIPBIG) && ((options->live_mode == OPT_NOLIVEMODE) || (options->max_size == DFLT_OPT_MAX_SIZE))) { fprintf(stderr, "Option -S can only be used with options -L and -s.\n"); return (FPART_OPTS_USAGE | FPART_OPTS_NOK | FPART_OPTS_EXIT); } if((options->in_filename == NULL) && (*argcp <= 0)) { /* no file specified, force stdin */ char *opt_input = "-"; size_t malloc_size = strlen(opt_input) + 1; if_not_malloc(options->in_filename, malloc_size, return (FPART_OPTS_NOK | FPART_OPTS_EXIT); ) snprintf(options->in_filename, malloc_size, "%s", opt_input); } return (FPART_OPTS_OK); } int main(int argc, char **argv) { /* Status */ struct program_status main_status = { 0, /* total partitions size created so far */ 0, /* total number of files added so far */ 0 /* total number of partitions created so far */ }; /****************** Handle options ******************/ /* Program options */ struct program_options options; /* Set default options */ init_options(&options); /* Parse and initialize options */ int options_init_res = handle_options(&options, &argc, &argv); if(options_init_res & FPART_OPTS_USAGE) usage(); if(options_init_res & FPART_OPTS_VERSION) version(); if(options_init_res & FPART_OPTS_EXIT) { uninit_options(&options); exit(options_init_res & FPART_OPTS_NOK ? EXIT_FAILURE : EXIT_SUCCESS); } /************** Handle stdin ***************/ /* our main double-linked file list */ struct file_entry *head = NULL; if(options.verbose >= OPT_VERBOSE) fprintf(stderr, "Examining filesystem...\n"); /* work on each file provided through input file (or stdin) */ if(options.in_filename != NULL) { /* handle fd opening */ FILE *in_fp = NULL; if((options.in_filename[0] == '-') && (options.in_filename[1] == '\0')) { /* working from stdin */ in_fp = stdin; } else { /* working from a filename */ if((in_fp = fopen(options.in_filename, "r")) == NULL) { fprintf(stderr, "%s: %s\n", options.in_filename, strerror(errno)); uninit_options(&options); exit(EXIT_FAILURE); } } /* read fd and do the work */ char line[MAX_LINE_LENGTH]; char *line_end_p = NULL; bzero(line, MAX_LINE_LENGTH); while(fgets(line, MAX_LINE_LENGTH, in_fp) != NULL) { /* replace '\n' with '\0' */ if((line_end_p = strchr(line, '\n')) != NULL) *line_end_p = '\0'; if(handle_argument(line, &head, &options, &main_status) != 0) { uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } /* cleanup */ bzero(line, MAX_LINE_LENGTH); } /* check for error reading input */ if(ferror(in_fp) != 0) { fprintf(stderr, "error reading from input stream\n"); } /* cleanup */ fclose(in_fp); } /****************** Handle arguments *******************/ /* now, work on each path provided as arguments */ int i; for(i = 0 ; i < argc ; i++) { if(handle_argument(argv[i], &head, &options, &main_status) != 0) { uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } } /* come back to the first element */ rewind_list(head); /**************** Display status *****************/ /* no file found or live mode */ if((main_status.total_num_files == 0) || (options.live_mode == OPT_LIVEMODE)) { uninit_file_entries(head, &options, &main_status); /* display final summary */ if(options.verbose >= OPT_VERBOSE) display_final_summary(main_status.total_num_parts, main_status.total_size, main_status.total_num_files); uninit_options(&options); exit(EXIT_SUCCESS); } /************************************************ Sort entries with a fixed number of partitions *************************************************/ if(options.verbose >= OPT_VERBOSE) { fprintf(stderr, "Sorting entries...\n"); } /* our list of partitions */ struct partition *part_head = NULL; /* sort files with a fixed size of partitions */ if(options.num_parts != DFLT_OPT_NUM_PARTS) { /* create a fixed-size array of pointers to sort */ struct file_entry **file_entry_p = NULL; if_not_malloc(file_entry_p, sizeof(struct file_entry *) * main_status.total_num_files, uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); ) /* initialize array */ init_file_entry_p(file_entry_p, main_status.total_num_files, head); /* sort array */ qsort(&file_entry_p[0], main_status.total_num_files, sizeof(struct file_entry *), &sort_file_entry_p); /* create a double_linked list of partitions which will hold dispatched files */ if(add_partitions(&part_head, options.num_parts, &options, &main_status) != 0) { fprintf(stderr, "%s(): cannot init list of partitions\n", __func__); uninit_partitions(part_head); free(file_entry_p); uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } /* come back to the first element */ rewind_list(part_head); /* dispatch files */ if(dispatch_file_entry_p_by_size (file_entry_p, main_status.total_num_files, part_head, options.num_parts) != 0) { fprintf(stderr, "%s(): unable to dispatch file entries\n", __func__); uninit_partitions(part_head); free(file_entry_p); uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } /* re-dispatch empty files */ if(dispatch_empty_file_entries (head, main_status.total_num_files, part_head, options.num_parts) != 0) { fprintf(stderr, "%s(): unable to dispatch empty file entries\n", __func__); uninit_partitions(part_head); free(file_entry_p); uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } /* cleanup */ free(file_entry_p); } /*************************************************** Sort entries with a variable number of partitions ****************************************************/ /* sort files with a file number or size limit per-partitions. In this case, partitions are dynamically-created */ else { if(dispatch_file_entries_by_limits (head, &part_head, options.max_entries, options.max_size, &options, &main_status) == 0) { fprintf(stderr, "%s(): unable to dispatch file entries\n", __func__); uninit_partitions(part_head); uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_FAILURE); } /* come back to the first element (we may have exited with part_head set to partition 1, after default partition) */ rewind_list(part_head); } /*********************** Print result and exit ************************/ /* print partitions summary */ print_partitions(part_head, &options); /* display final summary */ if(options.verbose >= OPT_VERBOSE) { display_final_summary(main_status.total_num_parts, main_status.total_size, main_status.total_num_files); } if(options.verbose >= OPT_VERBOSE) fprintf(stderr, "Writing output lists...\n"); /* print file entries */ print_file_entries(head, part_head, main_status.total_num_parts, &options); if(options.verbose >= OPT_VERBOSE) fprintf(stderr, "Cleaning up...\n"); /* free stuff */ uninit_partitions(part_head); uninit_file_entries(head, &options, &main_status); uninit_options(&options); exit(EXIT_SUCCESS); } fpart-1.7.0/src/fts.h000644 001751 000000 00000014734 14745137273 015364 0ustar00martymacwheel000000 000000 /*- * SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)fts.h 8.3 (Berkeley) 8/14/94 * $FreeBSD: head/include/fts.h 326024 2017-11-20 19:45:28Z pfg $ */ #ifndef _FTS_H_ #define _FTS_H_ #if !defined(MAX) #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #endif /* IllumOS provides dirfd() , see /usr/include/dirent.h */ #if defined(__sun) || defined(__sun__) /* Solaris 10 and Earlier */ #if !defined(HAVE_DIRFD) && !defined(__XOPEN_OR_POSIX) #define dirfd(X) ((X)->dd_fd) /* traditional SVR4 */ #else /* Solaris 11 and later */ #if !defined(HAVE_DIRFD) && defined(__XOPEN_OR_POSIX) #define dirfd(X) ((X)->d_fd) /* POSIX conformant */ #endif #endif #endif #if defined(__FreeBSD__) #include #else #if defined(__linux__) #include #include #endif /* defined(__linux__) */ #endif /* defined(__FreeBSD__) */ #if !defined(__FreeBSD__) && !defined(__GLIBC__) typedef dev_t __dev_t; typedef size_t __size_t; typedef ino_t __ino_t; typedef nlink_t __nlink_t; #endif /* !defined(__FreeBSD__) && !defined(__GLIBC__) */ typedef struct { struct _ftsent *fts_cur; /* current node */ struct _ftsent *fts_child; /* linked list of children */ struct _ftsent **fts_array; /* sort array */ __dev_t fts_dev; /* starting device # */ char *fts_path; /* path for this descent */ int fts_rfd; /* fd for root */ __size_t fts_pathlen; /* sizeof(path) */ __size_t fts_nitems; /* elements in the sort array */ int (*fts_compar) /* compare function */ (const struct _ftsent * const *, const struct _ftsent * const *); #define FTS_COMFOLLOW 0x001 /* follow command line symlinks */ #define FTS_LOGICAL 0x002 /* logical walk */ #define FTS_NOCHDIR 0x004 /* don't change directories */ #define FTS_NOSTAT 0x008 /* don't get stat info */ #define FTS_PHYSICAL 0x010 /* physical walk */ #define FTS_SEEDOT 0x020 /* return dot and dot-dot */ #define FTS_XDEV 0x040 /* don't cross devices */ #if !defined(__sun) && !defined(__sun__) && !defined(__linux__) #define FTS_WHITEOUT 0x080 /* return whiteout information */ #endif #define FTS_OPTIONMASK 0x0ff /* valid user option mask */ #define FTS_NAMEONLY 0x100 /* (private) child names only */ #define FTS_STOP 0x200 /* (private) unrecoverable error */ int fts_options; /* fts_open options, global flags */ void *fts_clientptr; /* thunk for sort function */ } FTS; typedef struct _ftsent { struct _ftsent *fts_cycle; /* cycle node */ struct _ftsent *fts_parent; /* parent directory */ struct _ftsent *fts_link; /* next file in directory */ long long fts_number; /* local numeric value */ #define fts_bignum fts_number /* XXX non-std, should go away */ void *fts_pointer; /* local address value */ char *fts_accpath; /* access path */ char *fts_path; /* root path */ int fts_errno; /* errno for this node */ int fts_symfd; /* fd for symlink */ __size_t fts_pathlen; /* strlen(fts_path) */ __size_t fts_namelen; /* strlen(fts_name) */ __ino_t fts_ino; /* inode */ __dev_t fts_dev; /* device */ __nlink_t fts_nlink; /* link count */ #define FTS_ROOTPARENTLEVEL -1 #define FTS_ROOTLEVEL 0 long fts_level; /* depth (-1 to N) */ #define FTS_D 1 /* preorder directory */ #define FTS_DC 2 /* directory that causes cycles */ #define FTS_DEFAULT 3 /* none of the above */ #define FTS_DNR 4 /* unreadable directory */ #define FTS_DOT 5 /* dot or dot-dot */ #define FTS_DP 6 /* postorder directory */ #define FTS_ERR 7 /* error; errno is set */ #define FTS_F 8 /* regular file */ #define FTS_INIT 9 /* initialized only */ #define FTS_NS 10 /* stat(2) failed */ #define FTS_NSOK 11 /* no stat(2) requested */ #define FTS_SL 12 /* symbolic link */ #define FTS_SLNONE 13 /* symbolic link without target */ #define FTS_W 14 /* whiteout object */ int fts_info; /* user status for FTSENT structure */ #define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */ #define FTS_SYMFOLLOW 0x02 /* followed a symlink to get here */ #define FTS_ISW 0x04 /* this is a whiteout object */ unsigned fts_flags; /* private flags for FTSENT structure */ #define FTS_AGAIN 1 /* read node again */ #define FTS_FOLLOW 2 /* follow symbolic link */ #define FTS_NOINSTR 3 /* no instructions */ #define FTS_SKIP 4 /* discard node */ int fts_instr; /* fts_set() instructions */ struct stat *fts_statp; /* stat(2) information */ char *fts_name; /* file name */ FTS *fts_fts; /* back pointer to main FTS */ } FTSENT; #if defined(__FreeBSD__) #include __BEGIN_DECLS #endif FTSENT *fts_children(FTS *, int); int fts_close(FTS *); void *fts_get_clientptr(FTS *); #define fts_get_clientptr(fts) ((fts)->fts_clientptr) FTS *fts_get_stream(FTSENT *); #define fts_get_stream(ftsent) ((ftsent)->fts_fts) FTS *fts_open(char * const *, int, int (*)(const FTSENT * const *, const FTSENT * const *)); FTSENT *fts_read(FTS *); int fts_set(FTS *, FTSENT *, int); void fts_set_clientptr(FTS *, void *); #if defined(__FreeBSD__) __END_DECLS #endif #endif /* !_FTS_H_ */ fpart-1.7.0/src/file_entry.h000644 001751 000000 00000006711 14745137273 016724 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _FILE_ENTRY_H #define _FILE_ENTRY_H #include "fpart.h" #include "options.h" #include #if !defined(PRINT_FE_CHUNKS) #define PRINT_FE_CHUNKS 32 /* files per chunk when flushing partitions to disk */ #endif /* A file entry */ struct file_entry; struct file_entry { char *path; /* file name */ fsize_t size; /* size in bytes */ pnum_t partition_index; /* assigned partition index */ struct file_entry* nextp; /* next file_entry */ struct file_entry* prevp; /* previous one */ }; int fpart_hook(const char *cmd, const struct program_options *options, const struct program_status *status, const char *live_filename, const pnum_t *live_partition_index, const fsize_t *live_partition_size, const fnum_t *live_partition_num_files, const int live_partition_errno); int handle_file_entry(struct file_entry **head, char *path, fsize_t size, int entry_errno, struct program_options *options, struct program_status *status); /* display types */ #define ENTRY_DISPLAY_TYPE_STANDARD 0 #define ENTRY_DISPLAY_TYPE_SKIPPED 1 void display_file_entry(pnum_t partition_index, const fsize_t entry_size, const char * const entry_path, const unsigned char entry_display_type); int live_print_file_entry(char *path, fsize_t size, int entry_errno, struct program_options *options, struct program_status *status); int add_file_entry(struct file_entry **head, char *path, fsize_t size, struct program_options *options, struct program_status *status); int init_file_entries(char *file_path, struct file_entry **head, struct program_options *options, struct program_status *status); void uninit_file_entries(struct file_entry *head, struct program_options *options, struct program_status *status); int print_file_entries(struct file_entry *head, struct partition *part_head, pnum_t num_parts, struct program_options *options); void init_file_entry_p(struct file_entry **file_entry_p, fnum_t num_entries, struct file_entry *head); #endif /* _FILE_ENTRY_H */ fpart-1.7.0/src/Makefile.am000644 001751 000000 00000001216 14745137273 016442 0ustar00martymacwheel000000 000000 # Disable -I. AUTOMAKE_OPTIONS = nostdinc bin_PROGRAMS = fpart fpart_SOURCES = types.h utils.c utils.h options.c options.h partition.c partition.h file_entry.c file_entry.h dispatch.c dispatch.h fpart.c fpart.h fpart_CFLAGS = fpart_LDFLAGS = if DEBUG fpart_CFLAGS += -g -DDEBUG endif if EMBEDDED_FTS fpart_SOURCES += fts.c fts.h fpart_CFLAGS += -DEMBED_FTS else if EXTERNAL_FTS # fts(3) provided as an external library LIBS += -lfts # else (default), provided by libc endif endif if SOLARIS fpart_CFLAGS += -D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -xc99 endif if LINUX fpart_CFLAGS += -D_GNU_SOURCE endif if STATIC fpart_LDFLAGS += -static endif fpart-1.7.0/src/options.c000644 001751 000000 00000015453 14745137273 016255 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "utils.h" #include "options.h" /* NULL */ #include /* assert(3) */ #include /************************* Program options functions *************************/ /* Initialize global options structure */ void init_options(struct program_options *options) { /* check our default values */ assert(DFLT_OPT_NUM_PARTS >= 0); assert(DFLT_OPT_MAX_ENTRIES >= 0); assert(DFLT_OPT_MAX_SIZE >= 0); assert((DFLT_OPT_ARBITRARYVALUES == OPT_NOARBITRARYVALUES) || (DFLT_OPT_ARBITRARYVALUES == OPT_ARBITRARYVALUES)); assert((DFLT_OPT_OUT0 == OPT_NOOUT0) || (DFLT_OPT_OUT0 == OPT_OUT0)); assert((DFLT_OPT_ADDSLASH == OPT_NOADDSLASH) || (DFLT_OPT_ADDSLASH == OPT_ADDSLASH)); assert((DFLT_OPT_ADDPARENTS == OPT_NOADDPARENTS) || (DFLT_OPT_ADDPARENTS == OPT_ADDPARENTS)); assert((DFLT_OPT_VERBOSE == OPT_NOVERBOSE) || (DFLT_OPT_VERBOSE == OPT_VERBOSE) || (DFLT_OPT_VERBOSE == OPT_VVERBOSE)); assert((DFLT_OPT_FOLLOWSYMLINKS == OPT_FOLLOWSYMLINKS) || (DFLT_OPT_FOLLOWSYMLINKS == OPT_NOFOLLOWSYMLINKS)); assert((DFLT_OPT_CROSSFSBOUNDARIES == OPT_NOCROSSFSBOUNDARIES) || (DFLT_OPT_CROSSFSBOUNDARIES == OPT_CROSSFSBOUNDARIES)); assert((DFLT_OPT_DIRSINCLUDE == OPT_NOEMPTYDIRS) || (DFLT_OPT_DIRSINCLUDE == OPT_EMPTYDIRS) || (DFLT_OPT_DIRSINCLUDE == OPT_DNREMPTY) || (DFLT_OPT_DIRSINCLUDE == OPT_ALLDIRS)); assert((DFLT_OPT_DNRSPLIT == OPT_NODNRSPLIT) || (DFLT_OPT_DNRSPLIT == OPT_DNRSPLIT)); assert(DFLT_OPT_DIR_DEPTH >= OPT_NODIRDEPTH); assert((DFLT_OPT_LEAFDIRS == OPT_NOLEAFDIRS) || (DFLT_OPT_LEAFDIRS == OPT_LEAFDIRS)); assert((DFLT_OPT_DIRSONLY == OPT_NODIRSONLY) || (DFLT_OPT_DIRSONLY == OPT_DIRSONLY)); assert((DFLT_OPT_LIVEMODE == OPT_NOLIVEMODE) || (DFLT_OPT_LIVEMODE == OPT_LIVEMODE)); assert((DFLT_OPT_SKIPBIG == OPT_NOSKIPBIG) || (DFLT_OPT_SKIPBIG == OPT_SKIPBIG)); assert(DFLT_OPT_PRELOAD_SIZE >= 0); assert(DFLT_OPT_OVERLOAD_SIZE >= 0); assert(DFLT_OPT_ROUND_SIZE >= 1); /* set default options */ options->num_parts = DFLT_OPT_NUM_PARTS; options->max_entries = DFLT_OPT_MAX_ENTRIES; options->max_size = DFLT_OPT_MAX_SIZE; options->in_filename = NULL; options->arbitrary_values = DFLT_OPT_ARBITRARYVALUES; options->out_filename = NULL; options->out_zero = DFLT_OPT_OUT0; options->add_slash = DFLT_OPT_ADDSLASH; options->add_parents = DFLT_OPT_ADDPARENTS; options->verbose = DFLT_OPT_VERBOSE; options->follow_symbolic_links = DFLT_OPT_FOLLOWSYMLINKS; options->cross_fs_boundaries = DFLT_OPT_CROSSFSBOUNDARIES; options->include_files = NULL; options->ninclude_files = 0; options->include_files_ci = NULL; options->ninclude_files_ci = 0; options->exclude_files = NULL; options->nexclude_files = 0; options->exclude_files_ci = NULL; options->nexclude_files_ci = 0; options->dirs_include = DFLT_OPT_DIRSINCLUDE; options->dir_depth = DFLT_OPT_DIR_DEPTH; options->dnr_split = OPT_NODNRSPLIT; options->leaf_dirs = DFLT_OPT_LEAFDIRS; options->dirs_only = DFLT_OPT_DIRSONLY; options->live_mode = DFLT_OPT_LIVEMODE; options->skip_big = DFLT_OPT_SKIPBIG; options->pre_part_hook = NULL; options->post_part_hook = NULL; options->post_run_hook = NULL; options->preload_size = DFLT_OPT_PRELOAD_SIZE; options->overload_size = DFLT_OPT_OVERLOAD_SIZE; options->round_size = DFLT_OPT_ROUND_SIZE; } /* Un-initialize global options structure */ void uninit_options(struct program_options *options) { options->round_size = DFLT_OPT_ROUND_SIZE; options->overload_size = DFLT_OPT_OVERLOAD_SIZE; options->preload_size = DFLT_OPT_PRELOAD_SIZE; if(options->post_run_hook != NULL) free(options->post_run_hook); if(options->post_part_hook != NULL) free(options->post_part_hook); if(options->pre_part_hook != NULL) free(options->pre_part_hook); options->skip_big = DFLT_OPT_SKIPBIG; options->live_mode = DFLT_OPT_LIVEMODE; options->dirs_only = DFLT_OPT_DIRSONLY; options->leaf_dirs = DFLT_OPT_LEAFDIRS; options->dnr_split = OPT_NODNRSPLIT; options->dir_depth = DFLT_OPT_DIR_DEPTH; options->dirs_include = DFLT_OPT_DIRSINCLUDE; if(options->exclude_files_ci != NULL) str_cleanup(&(options->exclude_files_ci), &(options->nexclude_files_ci)); if(options->exclude_files != NULL) str_cleanup(&(options->exclude_files), &(options->nexclude_files)); if(options->include_files_ci != NULL) str_cleanup(&(options->include_files_ci), &(options->ninclude_files_ci)); if(options->include_files != NULL) str_cleanup(&(options->include_files), &(options->ninclude_files)); options->cross_fs_boundaries = DFLT_OPT_CROSSFSBOUNDARIES; options->follow_symbolic_links = DFLT_OPT_FOLLOWSYMLINKS; options->verbose = DFLT_OPT_VERBOSE; options->add_parents = DFLT_OPT_ADDPARENTS; options->add_slash = DFLT_OPT_ADDSLASH; options->out_zero = DFLT_OPT_OUT0; if(options->out_filename != NULL) free(options->out_filename); options->arbitrary_values = DFLT_OPT_ARBITRARYVALUES; if(options->in_filename != NULL) free(options->in_filename); options->max_size = DFLT_OPT_MAX_SIZE; options->max_entries = DFLT_OPT_MAX_ENTRIES; options->num_parts = DFLT_OPT_NUM_PARTS; } fpart-1.7.0/src/dispatch.h000644 001751 000000 00000004033 14745137273 016356 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _DISPATCH_H #define _DISPATCH_H #include "fpart.h" #include "partition.h" #include "file_entry.h" #include "options.h" int sort_file_entry_p(const void *a, const void *b); int dispatch_file_entry_p_by_size(struct file_entry **file_entry_p, fnum_t num_entries, struct partition *head, pnum_t num_parts); int dispatch_empty_file_entries(struct file_entry *head, fnum_t num_entries, struct partition *part_head, pnum_t num_parts); pnum_t dispatch_file_entries_by_limits(struct file_entry *head, struct partition **part_head, fnum_t max_entries, fsize_t max_size, struct program_options *options, struct program_status *status); #endif /* _DISPATCH_H */ fpart-1.7.0/src/utils.h000644 001751 000000 00000010403 14745137273 015715 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _UTILS_H #define _UTILS_H #include "types.h" #include "options.h" /* stat(2) */ #include #include /* fts(3) */ #if defined(EMBED_FTS) #include "fts.h" #else #include #endif /* fnmatch(3) and FNM_CASEFOLD FNM_CASEFOLD is a GNU extension and may not be available */ #include #if defined(FNM_CASEFOLD) #define _HAS_FNM_CASEFOLD #else #define FNM_CASEFOLD 0 #if defined(DEBUG) #warning FNM_CASEFOLD not supported by fnmatch(3), \ options '-X' and '-Y' disabled #endif #endif #define round_num(x, y) \ ((((x) % (y)) != 0) ? (((x) / (y)) * (y) + (y)) : (x)) #define rewind_list(head) \ { while((head) && (head)->prevp) { (head) = (head)->prevp; } } #define fastfw_list(head) \ { while((head) && (head)->nextp) { (head) = (head)->nextp; } } #define min(x, y) (((x) <= (y)) ? (x) : (y)) #define max(x, y) (((x) >= (y)) ? (x) : (y)) #define if_not_malloc(ptr, size, err_action) \ ptr = malloc(size); \ if(ptr == NULL) { \ fprintf(stderr, "%s(): cannot allocate memory\n", __func__); \ err_action \ } /* use enclosed in curly brackets to avoid namespace clash */ #define if_not_realloc(ptr, size, err_action) \ void *old_ptr = ptr; \ ptr = realloc(ptr, size); \ if(ptr == NULL) { \ ptr = old_ptr; \ fprintf(stderr, "%s(): cannot reallocate memory\n", __func__); \ err_action \ } uintmax_t char_to_multiplier(const char c); unsigned int get_num_digits(double i); fsize_t get_size(char *file_path, struct stat *file_stat, struct program_options *options); char *abs_path(const char *path); void cleanslash_path(char * const path); char * parent_path(const char * const path, const unsigned char keep_ending_slash); int str_push(char ***array, unsigned int *num, const char * const str); void str_cleanup(char ***array, unsigned int *num); int str_is_negative(const char * const str); uintmax_t str_to_uintmax(const char *str, const unsigned char handle_multiplier); int file_match(const char * const * const array, const unsigned int num, const FTSENT * const p, const unsigned char ignore_case); #define VF_FULLTEST 0 #define VF_EXCLUDEONLY 1 int valid_file(const FTSENT * const p, struct program_options *options, unsigned char exclude_only); char ** clone_env(void); int push_env(char *str, char ***env); void display_final_summary(const pnum_t total_num_parts, const fsize_t total_size, const fnum_t total_num_files); #endif /* _UTILS_H */ fpart-1.7.0/src/Makefile.in000644 001751 000000 00000077017 14745137275 016471 0ustar00martymacwheel000000 000000 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = fpart$(EXEEXT) @DEBUG_TRUE@am__append_1 = -g -DDEBUG @EMBEDDED_FTS_TRUE@am__append_2 = fts.c fts.h @EMBEDDED_FTS_TRUE@am__append_3 = -DEMBED_FTS # fts(3) provided as an external library @EMBEDDED_FTS_FALSE@@EXTERNAL_FTS_TRUE@am__append_4 = -lfts # else (default), provided by libc @SOLARIS_TRUE@am__append_5 = -D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -xc99 @LINUX_TRUE@am__append_6 = -D_GNU_SOURCE @STATIC_TRUE@am__append_7 = -static subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__fpart_SOURCES_DIST = types.h utils.c utils.h options.c options.h \ partition.c partition.h file_entry.c file_entry.h dispatch.c \ dispatch.h fpart.c fpart.h fts.c fts.h @EMBEDDED_FTS_TRUE@am__objects_1 = fpart-fts.$(OBJEXT) am_fpart_OBJECTS = fpart-utils.$(OBJEXT) fpart-options.$(OBJEXT) \ fpart-partition.$(OBJEXT) fpart-file_entry.$(OBJEXT) \ fpart-dispatch.$(OBJEXT) fpart-fpart.$(OBJEXT) \ $(am__objects_1) fpart_OBJECTS = $(am_fpart_OBJECTS) fpart_LDADD = $(LDADD) fpart_LINK = $(CCLD) $(fpart_CFLAGS) $(CFLAGS) $(fpart_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/fpart-dispatch.Po \ ./$(DEPDIR)/fpart-file_entry.Po ./$(DEPDIR)/fpart-fpart.Po \ ./$(DEPDIR)/fpart-fts.Po ./$(DEPDIR)/fpart-options.Po \ ./$(DEPDIR)/fpart-partition.Po ./$(DEPDIR)/fpart-utils.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(fpart_SOURCES) DIST_SOURCES = $(am__fpart_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ $(am__append_4) LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Disable -I. AUTOMAKE_OPTIONS = nostdinc fpart_SOURCES = types.h utils.c utils.h options.c options.h \ partition.c partition.h file_entry.c file_entry.h dispatch.c \ dispatch.h fpart.c fpart.h $(am__append_2) fpart_CFLAGS = $(am__append_1) $(am__append_3) $(am__append_5) \ $(am__append_6) fpart_LDFLAGS = $(am__append_7) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: -$(am__rm_f) $(bin_PROGRAMS) fpart$(EXEEXT): $(fpart_OBJECTS) $(fpart_DEPENDENCIES) $(EXTRA_fpart_DEPENDENCIES) @rm -f fpart$(EXEEXT) $(AM_V_CCLD)$(fpart_LINK) $(fpart_OBJECTS) $(fpart_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-dispatch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-file_entry.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-fpart.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-fts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-options.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-partition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpart-utils.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` fpart-utils.o: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-utils.o -MD -MP -MF $(DEPDIR)/fpart-utils.Tpo -c -o fpart-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-utils.Tpo $(DEPDIR)/fpart-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='fpart-utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c fpart-utils.obj: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-utils.obj -MD -MP -MF $(DEPDIR)/fpart-utils.Tpo -c -o fpart-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-utils.Tpo $(DEPDIR)/fpart-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='fpart-utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` fpart-options.o: options.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-options.o -MD -MP -MF $(DEPDIR)/fpart-options.Tpo -c -o fpart-options.o `test -f 'options.c' || echo '$(srcdir)/'`options.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-options.Tpo $(DEPDIR)/fpart-options.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='options.c' object='fpart-options.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-options.o `test -f 'options.c' || echo '$(srcdir)/'`options.c fpart-options.obj: options.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-options.obj -MD -MP -MF $(DEPDIR)/fpart-options.Tpo -c -o fpart-options.obj `if test -f 'options.c'; then $(CYGPATH_W) 'options.c'; else $(CYGPATH_W) '$(srcdir)/options.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-options.Tpo $(DEPDIR)/fpart-options.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='options.c' object='fpart-options.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-options.obj `if test -f 'options.c'; then $(CYGPATH_W) 'options.c'; else $(CYGPATH_W) '$(srcdir)/options.c'; fi` fpart-partition.o: partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-partition.o -MD -MP -MF $(DEPDIR)/fpart-partition.Tpo -c -o fpart-partition.o `test -f 'partition.c' || echo '$(srcdir)/'`partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-partition.Tpo $(DEPDIR)/fpart-partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partition.c' object='fpart-partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-partition.o `test -f 'partition.c' || echo '$(srcdir)/'`partition.c fpart-partition.obj: partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-partition.obj -MD -MP -MF $(DEPDIR)/fpart-partition.Tpo -c -o fpart-partition.obj `if test -f 'partition.c'; then $(CYGPATH_W) 'partition.c'; else $(CYGPATH_W) '$(srcdir)/partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-partition.Tpo $(DEPDIR)/fpart-partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partition.c' object='fpart-partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-partition.obj `if test -f 'partition.c'; then $(CYGPATH_W) 'partition.c'; else $(CYGPATH_W) '$(srcdir)/partition.c'; fi` fpart-file_entry.o: file_entry.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-file_entry.o -MD -MP -MF $(DEPDIR)/fpart-file_entry.Tpo -c -o fpart-file_entry.o `test -f 'file_entry.c' || echo '$(srcdir)/'`file_entry.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-file_entry.Tpo $(DEPDIR)/fpart-file_entry.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='file_entry.c' object='fpart-file_entry.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-file_entry.o `test -f 'file_entry.c' || echo '$(srcdir)/'`file_entry.c fpart-file_entry.obj: file_entry.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-file_entry.obj -MD -MP -MF $(DEPDIR)/fpart-file_entry.Tpo -c -o fpart-file_entry.obj `if test -f 'file_entry.c'; then $(CYGPATH_W) 'file_entry.c'; else $(CYGPATH_W) '$(srcdir)/file_entry.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-file_entry.Tpo $(DEPDIR)/fpart-file_entry.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='file_entry.c' object='fpart-file_entry.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-file_entry.obj `if test -f 'file_entry.c'; then $(CYGPATH_W) 'file_entry.c'; else $(CYGPATH_W) '$(srcdir)/file_entry.c'; fi` fpart-dispatch.o: dispatch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-dispatch.o -MD -MP -MF $(DEPDIR)/fpart-dispatch.Tpo -c -o fpart-dispatch.o `test -f 'dispatch.c' || echo '$(srcdir)/'`dispatch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-dispatch.Tpo $(DEPDIR)/fpart-dispatch.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dispatch.c' object='fpart-dispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-dispatch.o `test -f 'dispatch.c' || echo '$(srcdir)/'`dispatch.c fpart-dispatch.obj: dispatch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-dispatch.obj -MD -MP -MF $(DEPDIR)/fpart-dispatch.Tpo -c -o fpart-dispatch.obj `if test -f 'dispatch.c'; then $(CYGPATH_W) 'dispatch.c'; else $(CYGPATH_W) '$(srcdir)/dispatch.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-dispatch.Tpo $(DEPDIR)/fpart-dispatch.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dispatch.c' object='fpart-dispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-dispatch.obj `if test -f 'dispatch.c'; then $(CYGPATH_W) 'dispatch.c'; else $(CYGPATH_W) '$(srcdir)/dispatch.c'; fi` fpart-fpart.o: fpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-fpart.o -MD -MP -MF $(DEPDIR)/fpart-fpart.Tpo -c -o fpart-fpart.o `test -f 'fpart.c' || echo '$(srcdir)/'`fpart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-fpart.Tpo $(DEPDIR)/fpart-fpart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fpart.c' object='fpart-fpart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-fpart.o `test -f 'fpart.c' || echo '$(srcdir)/'`fpart.c fpart-fpart.obj: fpart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-fpart.obj -MD -MP -MF $(DEPDIR)/fpart-fpart.Tpo -c -o fpart-fpart.obj `if test -f 'fpart.c'; then $(CYGPATH_W) 'fpart.c'; else $(CYGPATH_W) '$(srcdir)/fpart.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-fpart.Tpo $(DEPDIR)/fpart-fpart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fpart.c' object='fpart-fpart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-fpart.obj `if test -f 'fpart.c'; then $(CYGPATH_W) 'fpart.c'; else $(CYGPATH_W) '$(srcdir)/fpart.c'; fi` fpart-fts.o: fts.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-fts.o -MD -MP -MF $(DEPDIR)/fpart-fts.Tpo -c -o fpart-fts.o `test -f 'fts.c' || echo '$(srcdir)/'`fts.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-fts.Tpo $(DEPDIR)/fpart-fts.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fts.c' object='fpart-fts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-fts.o `test -f 'fts.c' || echo '$(srcdir)/'`fts.c fpart-fts.obj: fts.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -MT fpart-fts.obj -MD -MP -MF $(DEPDIR)/fpart-fts.Tpo -c -o fpart-fts.obj `if test -f 'fts.c'; then $(CYGPATH_W) 'fts.c'; else $(CYGPATH_W) '$(srcdir)/fts.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fpart-fts.Tpo $(DEPDIR)/fpart-fts.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fts.c' object='fpart-fts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fpart_CFLAGS) $(CFLAGS) -c -o fpart-fts.obj `if test -f 'fts.c'; then $(CYGPATH_W) 'fts.c'; else $(CYGPATH_W) '$(srcdir)/fts.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/fpart-dispatch.Po -rm -f ./$(DEPDIR)/fpart-file_entry.Po -rm -f ./$(DEPDIR)/fpart-fpart.Po -rm -f ./$(DEPDIR)/fpart-fts.Po -rm -f ./$(DEPDIR)/fpart-options.Po -rm -f ./$(DEPDIR)/fpart-partition.Po -rm -f ./$(DEPDIR)/fpart-utils.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/fpart-dispatch.Po -rm -f ./$(DEPDIR)/fpart-file_entry.Po -rm -f ./$(DEPDIR)/fpart-fpart.Po -rm -f ./$(DEPDIR)/fpart-fts.Po -rm -f ./$(DEPDIR)/fpart-options.Po -rm -f ./$(DEPDIR)/fpart-partition.Po -rm -f ./$(DEPDIR)/fpart-utils.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% fpart-1.7.0/src/partition.h000644 001751 000000 00000005211 14745137273 016567 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _PARTITION_H #define _PARTITION_H #include "fpart.h" #include "options.h" #include /* A partition (group of file entries) */ struct partition; struct partition { fsize_t size; /* size in bytes */ fnum_t num_files; /* number of files */ struct partition* nextp; /* next partition */ struct partition* prevp; /* previous one */ }; int add_partitions(struct partition **head, pnum_t num_parts, struct program_options *options, struct program_status *status); int remove_partition(struct partition *part, struct program_options *options, struct program_status *status); void uninit_partitions(struct partition *head); pnum_t find_smallest_partition_index(struct partition *head); struct partition * get_partition_at(struct partition *head, pnum_t index); pnum_t adapt_partition_index(pnum_t index, const struct program_options *options); #define PARTITION_DISPLAY_TYPE_STANDARD 0 #define PARTITION_DISPLAY_TYPE_ERRNO 1 void display_partition_summary(pnum_t partition_index, const fsize_t partition_size, const fnum_t partition_num_files, int partition_errno, const unsigned char partition_display_type); void print_partitions(struct partition *head, struct program_options *options); #endif /* _PARTITION_H */ fpart-1.7.0/src/types.h000644 001751 000000 00000003510 14745137273 015722 0ustar00martymacwheel000000 000000 /*- * Copyright (c) 2011-2025 Ganael LAPLANCHE * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _TYPES_H #define _TYPES_H #include /* Handles the size of a file or partition. Must be unsigned and longer than off_t */ typedef uintmax_t fsize_t; /* Handles the number of files in a partition and the number of file entries. Must be unsigned and longer than ino_t */ typedef uintmax_t fnum_t; /* Handles the number of partitions. Must be unsigned and can be smaller than fnum_t */ typedef uintmax_t pnum_t; #endif /* _TYPES_H */ fpart-1.7.0/man/Makefile.am000644 001751 000000 00000000041 14745137273 016421 0ustar00martymacwheel000000 000000 dist_man_MANS = fpart.1 fpsync.1 fpart-1.7.0/man/Makefile.in000644 001751 000000 00000034434 14745137275 016451 0ustar00martymacwheel000000 000000 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = fpart.1 fpsync.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am 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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic 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 maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am uninstall-man \ uninstall-man1 .PRECIOUS: Makefile # 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% fpart-1.7.0/man/fpsync.1000644 001751 000000 00000027474 14745137273 015774 0ustar00martymacwheel000000 000000 .\" Copyright (c) 2015-2025 Ganael LAPLANCHE .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .Dd January 27, 2015 .Dt FPSYNC 1 .Os .Sh NAME .Nm fpsync .Nd Synchronize directories in parallel using fpart and an external tool .Sh SYNOPSIS .Nm .Op Fl p .Op Fl n Ar jobs .Op Fl w Ar wrks .Op Fl m Ar tool .Op Fl T Ar path .Op Fl f Ar files .Op Fl s Ar size .Op Fl E .Op Fl o Ar toolopts .Op Fl O Ar fpartopts .Op Fl S .Op Fl t Ar tmpdir .Op Fl d Ar shdir .Op Fl M Ar mailaddr .Op Fl v .Pa src_dir/ .Pa dst_url/ .Nm .Fl l .Nm .Fl r Ar runid .Op Fl R .Cm [OPTIONS...] .Nm .Fl a Ar runid .Nm .Fl D Ar runid .Sh DESCRIPTION The .Nm tool synchronizes directories in parallel using .Xr fpart 1 and .Xr rsync 1 , .Xr cpio 1 , .Xr pax 1 or .Xr tar 1 . It computes subsets of .Pa src_dir/ and spawns jobs to synchronize them to .Pa dst_url/ . .sp Synchronization jobs can be executed either locally or remotely (using SSH workers, see option .Fl w ) and are executed on-the-fly while filesystem crawling goes on. This makes .Nm a good tool for migrating large filesystems. .Sh COMMON OPTIONS .Bl -tag -width indent .It Fl t Ar tmpdir Set .Nm temporary directory to .Ar tmpdir . This directory remains local and does not need to be shared amongst SSH workers when using the .Fl w option. Default: .Pa /tmp/fpsync .It Fl d Ar shdir Set .Nm shared directory to .Ar shdir . This option is mandatory when using SSH workers and set by default to .Ar tmpdir when running locally. The specified directory must be an absolute path ; it will be used to handle communications with SSH hosts (sharing partitions and log files) and, as a consequence, must be made available to all participating hosts (e.g. through a r/w NFS mount), including the master one running .Nm . .It Fl M Ar mailaddr Send an e-mail to .Ar mailaddr after a run. Multiple -space-separated- addresses can be specified. That option requires the .Xr mail 1 client to be installed and configured on the master host running .Nm . .It Fl v Verbose mode. Can be be specified several times to increase verbosity level. .It Fl h Print help .El .Sh SYNCHRONIZATION OPTIONS .Bl -tag -width indent .It Fl m Ar tool External copy .Ar tool used to synchronize files. Currently supported tools are: .Sy rsync , .Sy cpio , .Sy pax , .Sy tar , and .Sy tarify . Default: .Sy rsync . Special tool .Sy tarify generates tarballs into destination directory. .It Fl T Ar path Specify absolute .Ar path of copy tool (guessed by default). If you force a specific .Ar path , the copy tool must be present at that .Ar path on each worker. That .Ar path cannot be changed when resuming a run. .It Fl f Ar files Transfer at most .Ar files files or directories per sync job. .Sy 0 means unlimited but you must at least specify one file or size limit. Default: .Sy 2000 .It Fl s Ar size Transfer at most .Ar size bytes per sync job. .Sy 0 means unlimited but you must at least specify one file or size limit. You can use a human-friendly unit suffix here (k, m, g, t, p). .br Default: .Sy 4294967296 (4 GB) .It Fl E Work on a per-directory basis (rsync tool only). In that mode, .Nm works with lists of directories instead of files. That mode may generate coarse-grained lists but enables .Xr rsync 1 's .Cm --delete option by default ( .Sy WARNING ! ! ! ), making it a good candidate for a final (cleaning) pass after several incremental passes using standard (file) mode. When option .Fl E is specified twice, it enables 'aggressive' mode which isolates erroneous directories and enables recursive synchronization for them. This advanced mode can be useful to try to overcome transcient errors such as Linux SMB client deferring .Fn opendir calls to support compound SMB requests. .It Fl o Ar toolopts Override default .Xr rsync 1 , .Xr cpio 1 , .Xr pax 1 or .Xr tar 1 options with .Ar toolopts . Use this option with care as certain options are incompatible with a parallel usage (e.g. rsync's .Cm --delete ) . Default for rsync: .Dq -lptgoD -v --numeric-ids . Empty for cpio, pax, tar and tarify. .It Fl O Ar fpartopts Override default .Xr fpart 1 options with .Ar fpartopts . Options and values must be separated by a pipe character. .br Default: .Dq -x|.zfs|-x|.snapshot*|-x|.ckpt . .It Fl S Sudo mode. Use .Xr sudo 8 for filesystem crawling and synchronizations. .It Pa src_dir/ Source directory. It must be absolute and available on all participating hosts (including the master one, running .Nm ) . .It Pa dst_url/ Destination directory or URL (rsync tool only). If a remote URL is provided, it must be supported by .Xr rsync 1 . All participating workers must be able to reach that target. .El .Sh JOB HANDLING AND DISPATCHING OPTIONS .Bl -tag -width indent .It Fl n Ar jobs Start .Ar jobs concurrent sync jobs (either locally or remotely, see below) per run. Default: .Sy 2 .It Fl w Ar wrks Use remote SSH .Ar wrks to synchronize files. Synchronization jobs are executed locally when this option is not set. .Ar wrks is a space-separated list of login@machine connection strings and can be specified several times. You must be allowed to connect to those machines using a SSH key to avoid user interaction. .El .Sh RUN HANDLING OPTIONS .Bl -tag -width indent .It Fl p Prepare mode: prepare, test synchronization environment, start .Xr fpart 1 and create partitions but do .Sy not actually start transfers. That mode can be used to create a run that can then be resumed using option .Fl r . .It Fl l List previous runs and their status. .It Fl r Ar runid Resume run .Ar runid and restart synchronizing remaining partitions from a previous run. .Ar runid is displayed when using verbose mode (see option .Fl v ) or prepare mode (option .Fl p ) and can be retrieved afterwards using option .Fl l . Note that filesystem crawling is skipped when resuming a previous run. As a consequence, options .Fl m , .Fl f , .Fl s , .Fl E , .Fl o , .Fl O , .Fl S , .Pa src_dir/ , and .Pa dst_url/ are ignored. .It Fl R Replay mode: when using option .Fl r , force re-synchronizing run's all partitions instead of remaining ones only. That mode can be useful to skip filesystem crawling when you have to replay a final pass several times and you know directory structure has not changed in the meantime (you may miss files if you use replay mode with a standard, file-based, run). .It Fl a Ar runid Archive run .Ar runid (including partition files, logs, queue and work directories) to .Ar tmpdir . That option requires the .Xr tar 1 client to be installed on the master host running .Nm . .It Fl D Ar runid Delete run .Ar runid (including partition files, logs, queue and work directories). .El .Sh RUNNING FPSYNC Each .Nm run generates a unique .Ar runid , which is displayed in verbose mode (see option .Fl v ) and within log files. You can use that .Ar runid to resume a previous run (see option .Fl r ) . .Nm will then restart synchronizing data from the parts that were being synchronized at the time it stopped. .sp This unique feature gives the administrator the ability to stop .Nm and restart it later, without having to restart the whole filesystem crawling and synchronization process. Note that resuming is only possible when filesystem crawling step has finished. .sp During synchronization, you can press CTRL-C to interrupt the process. The first CTRL-C prevents new synchronizations from being submitted and the process will wait for current synchronizations to be finished before exiting. If you press CTRL-C again, current synchronizations will be killed and .Nm will exit immediately. When using option .Fl E to enable directory mode and rsync's .Cm --delete option, keep in mind that killing rsync processes may lead to a situation where certain files have been updated and others not deleted yet (because the deletion process is postponed using rsync's .Cm --delete-after option). .sp On certain systems, CTRL-T can be pressed to get the status of current and remaining parts to be synchronized. This can also be achieved by sending a SIGINFO to the .Nm process. .sp Whether you use verbose mode or not, everything is logged within .Pa shdir/log/ . .Sh EXAMPLES Here are some examples: .Bl -tag -width indent .It Li "fpsync -n 4 /usr/src/ /var/src/" .sp Synchronizes .Pa /usr/src/ to .Pa /var/src/ using 4 local jobs. .It Li "fpsync -n 2 -w login@machine1 -w login@machine2 -d /mnt/fpsync /mnt/src/ /mnt/dst/" .sp Synchronizes .Pa /mnt/src/ to .Pa /mnt/dst/ using 2 concurrent jobs executed remotely on 2 SSH workers (machine1 and machine2). The shared directory is set to .Pa /mnt/fpsync and mounted on the machine running .Nm , as well as on machine1 and machine2. The source directory .Pa ( /mnt/src/ ) is also available on those 3 machines, while the destination directory .Pa ( /mnt/dst/ ) is mounted on SSH workers only (machine1 and machine2). .El .Sh LIMITATIONS Parallelizing .Xr rsync 1 can make several options not usable, such as .Cm --delete . If your source directory is live while .Nm is running, you will have to delete extra files from destination directory. This is traditionally done by using a final -offline- .Xr rsync 1 pass that will use this option, but you can also use .Nm and option .Cm -E to perform the same task using several workers. .sp .Nm enqueues synchronization jobs on disk, within the .Pa tmpdir/queue directory. Be careful to host this queue on a filesystem that can handle fine-grained mtime timestamps (i.e. with a sub-second precision) if you want the queue to be processed in order when .Xr fpart 1 generates several jobs per second. On .Fx , .Xr VFS 9 timestamps' precision can be tuned using the 'vfs.timestamp_precision' sysctl. See .Xr vfs_timestamp 9 . .sp Contrary to .Xr rsync 1 , .Nm enforces the final '/' on the source directory. It means that directory .Sy contents are synchronized, not the source directory itself (i.e. you will not get a subdirectory of the name of the source directory in the target directory after synchronization). .sp Before starting filesystem crawling, .Nm changes its current working directory to .Pa src_dir/ and generates partitions containing .Sy relative paths (all starting with './'). This is important to keep in mind when modifying .Ar toolopts or .Ar fpartopts dealing with file or directory paths. .sp If you want to run .Nm in the background, your shell must support enabling job control without a tty in non-interactive mode. As of this writing, Dash does not support that feature and will send a SIGTTIN to the whole process group, suspending fpsync execution. .Sh SEE ALSO .Xr cpio 1 , .Xr fpart 1 , .Xr mail 1 , .Xr pax 1 , .Xr rsync 1 , .Xr tar 1 , .Xr sudo 8 .Sh AUTHOR, AVAILABILITY Fpsync has been written by .An Gana\(:el LAPLANCHE and is available under the BSD license on .Lk http://contribs.martymac.org .Sh BUGS No bug known (yet). fpart-1.7.0/man/fpart.1000644 001751 000000 00000032242 14745137273 015573 0ustar00martymacwheel000000 000000 .\" Copyright (c) 2011-2025 Ganael LAPLANCHE .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .Dd November 18, 2011 .Dt FPART 1 .Os .Sh NAME .Nm fpart .Nd Sort and pack files into partitions .Sh SYNOPSIS .Nm .Op Fl h .Op Fl V .Fl n Ar num | Fl f Ar files | Fl s Ar size .Op Fl i Ar infile .Op Fl a .Op Fl o Ar outfile .Op Fl 0 .Op Fl e .Op Fl P .Op Fl v .Op Fl l .Op Fl b .Op Fl y Ar pattern .Op Fl Y Ar pattern .Op Fl x Ar pattern .Op Fl X Ar pattern .Op Fl z .Op Fl zz .Op Fl zzz .Op Fl Z .Op Fl d Ar depth .Op Fl D .Op Fl E .Op Fl L .Op Fl S .Op Fl w Ar cmd .Op Fl W Ar cmd .Op Fl R Ar cmd .Op Fl p Ar num .Op Fl q Ar num .Op Fl r Ar num .Op Ar FILE or DIR... .Sh DESCRIPTION The .Nm utility helps you sort file trees and pack them into bags (called "partitions"). .Sh GENERAL OPTIONS .Bl -tag -width indent .It Fl h , Fl -help Print help .It Fl V , Fl -version Print version .El .Sh PARTITION CONTROL .Bl -tag -width indent .It Fl n Ar num , Fl -parts Ar num Create exactly .Ar num partitions and try to generate partitions with the same size and number of files. This option cannot be used in conjunction with .Fl f , .Fl s or .Fl L . .It Fl f Ar files , Fl -files Ar files Create partitions containing at most .Ar files files or directories. This option can be used in conjunction with .Fl s and .Fl L . .It Fl s Ar size , Fl -size Ar size Create partitions with a maximum size of .Ar size bytes. With this option, a special partition 0 may be used to handle files that do not fit in a regular partition, given the provided .Ar size limit. This option can be used in conjunction with .Fl f and .Fl L . You can use a human-friendly unit suffix here (k, m, g, t, p). .El .Sh INPUT CONTROL .Bl -tag -width indent .It Fl i Ar infile Read file list from .Ar infile . If .Ar infile is .Dq Li "-" , then list is read from stdin. .It Fl a , Fl -arbitrary Input contains arbitrary values; just sort them (do not crawl filesystem). Input must follow the .Dq Li "size(blank)path" scheme. This option is incompatible with crawling-related options. .El .Sh OUTPUT CONTROL .Bl -tag -width indent .It Fl o Ar outfile Output partitions' contents to .Ar outfile template. Multiple files will be generated given that template. Each .Ar outfile will get partition number as a suffix. If .Ar outfile is .Dq Li "-" , then partitions will be printed to stdout, with partition number used as a prefix (so you can grep partitions you are interested in, or do whatever you want). .It Fl 0 End filenames with a null (\(cq\&\e0\(cq\&) character when using option .Fl o . .It Fl e When adding directories (see .Sx DIRECTORY HANDLING ), add a trailing .Dq Li "/" to each directory entry. .It Fl P Add parent directories when closing partitions. That option can be used in conjunction with .Fl zzz to produce partitions that can be synchronized .Sy in parallel with tools such as .Xr cpio 1 , .Xr pax 1 or .Xr tar 1 . Adding parent directories at the end of each partition ensures that modification times get reapplied to directories whatever the processing order of partitions is. Directories added that way are 0-sized and .Sy not subject to partition counters (for example, a file limit given using option .Fl f will be exceeded by n parent directories). Also, they are not subject to inclusion/exclusion options ( .Fl y , .Fl Y , .Fl x , .Fl X ) and they always have a trailing .Dq Li "/" even if option .Fl e has not been used (this simplifies symlinks handling as we always want to add targets here, never the links themselves). That option may lead to creating duplicate directory entries when next partition begins with a directory entry that has already been added as a parent when closing the previous partition. Only intermediate partitions will get parent directories added, not the very last one which gets its parents through option .Fl zzz when .Xr fts 3 crawling finishes. Requires live mode (option .Fl L ) . .It Fl v , Fl -verbose Verbose mode (may be specified more than once). .El .Sh FILESYSTEM CRAWLING CONTROL .Bl -tag -width indent .It Fl l Follow symbolic links (default: do not follow). .It Fl b Do not cross filesystem boundaries (default: cross). .It Fl y Ar pattern , Fl -include Ar pattern Include files or directories matching .Ar pattern only (and discard all other files). This option may be specified several times. .Ar Pattern may be a leaf (file or directory) name or a specific path. Shell pattern matching characters .Dq ( Li \&[ , .Dq Li \&] , .Dq Li * , .Dq Li \&? ) may be used. Include patterns are ignored when computing size of directories. .It Fl Y Ar pattern Same as .Fl y but case insensitive. This option may not be available on your platform (at least .Fx and GNU/Linux support it, Solaris does not). .It Fl x Ar pattern , Fl -exclude Ar pattern Exclude files or directories matching .Ar pattern . This option can be used in conjunction with .Fl y and .Fl Y . In this case, exclusion is performed after. This option may be specified several times. .Ar Pattern may be a leaf (file or directory) name or a specific path. Shell pattern matching characters .Dq ( Li \&[ , .Dq Li \&] , .Dq Li * , .Dq Li \&? ) may be used. Exclude patterns also apply when computing size of directories. .It Fl X Ar pattern Same as .Fl x but case insensitive. This option may not be available on your platform (at least .Fx and GNU/Linux support it, Solaris does not). .El .Sh DIRECTORY HANDLING .Bl -tag -width indent .It Fl z Pack empty directories. By default, fpart will pack files only (except when using the .Fl d or .Fl D options). This option can be useful for tools such as .Xr rsync 1 to be able to recreate a full file tree when used with fpart (e.g. using rsync's --files-from option). See the .Fl zz option to also pack un-readable directories. .It Fl zz Treat un-readable or erroneous (partly-read) directories as empty, causing them to be packed anyway. Partly-read (non-empty) directories can end up being packed while some of their children have already been packed. .It Fl zzz Pack all directories (as empty). Useful when 3rd party tools need directory entries to update them (e.g. .Xr cpio 1 , .Xr pax 1 or .Xr tar 1 ). .It Fl Z Pack un-readable/erroneous directories in dedicated partitions. This option helps isolating erroneous parts of a filesystem. Used in conjunction with FPART_PARTERRNO variable, hooks can try to handle or work around the error. Requires live mode (option .Fl L ) and option .Fl zz ( or .Fl zzz ) .It Fl d Ar depth After a certain .Ar depth , pack directories instead of files (directories themselves will be added to partitions, instead of their content). You can force a specific file to be packed anyway by listing it on the command line explicitly. .It Fl D , Fl -leaf-dirs Implies .Fl z . Pack leaf directories: if a directory contains files only, it will be packed as a single entry. You can force a specific file to be packed anyway by listing it on the command line explicitly. .It Fl E , Fl -dirs-only Implies .Fl D . Pack directories only (work on a per-directory basis): in that mode, no file will be packed. Instead, each directory will be packed as a single entry with a size being the sum of all top-level files' sizes. You can force a specific file to be packed anyway by listing it on the command line explicitly. .El .Sh LIVE MODE .Bl -tag -width indent .It Fl L , Fl -live Live mode (default: disabled). When using this mode, partitions will be generated while crawling filesystem. This option saves time and memory but will never produce special partition 0 (see options .Fl s and .Fl S ). As a consequence, it will generate partitions slightly larger than the size specified with option .Fl s . This option can be used in conjunction with options .Fl f and .Fl s , but not with option .Fl n . .It Fl S Skip big files (default: disabled). In live mode, no special partition 0 can be produced and big files are added to the current partition as they are found while crawling the filesystem. That can lead to huge partitions. That option makes fpart skip files bigger than the specified maximum partition size (option .Fl s ) and print them to stdout (even when using option .Fl o ) as belonging to a pseudo-partition S (as in 'S'kipped). It allows a consumer to handle them immediately through a separate process (no fpart hook will be executed for skipped files). That option can only be used in Live mode (option .Fl L ), when a maximum partition size has been given (option .Fl s ). .It Fl w Ar cmd , Fl -pre-part-cmd Ar cmd When using live mode, execute .Ar cmd when starting a new partition (before having opened next output file, if any). .Ar cmd is run in a specific environment that provides several variables describing the state of the program: .Ev FPART_HOOKTYPE ("pre-part", "post-part" or "post-run"), .Ev FPART_PARTFILENAME (current partition's output file name), .Ev FPART_PARTNUMBER (current partition number), .Ev FPART_PARTSIZE (current partition's size), .Ev FPART_TOTALSIZE (total partitions' size), .Ev FPART_PARTNUMFILES (number of files packed in current partition), .Ev FPART_TOTALNUMFILES (total number of files packed so far), .Ev FPART_PARTERRNO (0 if every single partition's entry has been read without error, else last erroneous entry's errno. For error detection to work properly, you may need to rebuild fpart using embedded .Xr fts 3 library, depending on the version shipped with your OS), .Ev FPART_PID (PID of fpart), .Ev FPART_TOTALNUMPARTS (total number of partitions generated so far). Variables may or may not be defined, depending on requested options and current partition's state when the hook is triggered. Hooks are executed in a synchronous way while crawling filesystem, so 1) avoid executing commands that take a long time to return as it slows down filesystem crawling and 2) do not presume cwd (PWD) is the one fpart has been started in, as it is regularly changed to speed up crawling (i.e. use absolute paths within hooks). Size-related variables are affected by preloading, overloading and rounding options. .It Fl W Ar cmd , Fl -post-part-cmd Ar cmd Same as .Fl w , but executes .Ar cmd when finishing a partition (after having closed last output file, if any). .It Fl R Ar cmd , Fl -post-run-cmd Ar cmd Same as .Fl w and .Fl W but executes .Ar cmd just once before exiting. Note that only FPART_TOTALSIZE and FPART_TOTALNUMFILES environment variables are available in post-run hooks. .El .Sh SIZE HANDLING .Bl -tag -width indent .It Fl p Ar num Preload each partition with .Ar num bytes. You can use a human-friendly unit suffix here (k, m, g, t, p). .It Fl q Ar num Overload each file size with .Ar num bytes. You can use a human-friendly unit suffix here (k, m, g, t, p). .It Fl r Ar num Round each file size up to next .Ar num bytes multiple. This option can be used in conjunction with overloading, which is done *before* rounding. You can use a human-friendly unit suffix here (k, m, g, t, p). .El .Sh EXAMPLES Here are some examples: .Bl -tag -width indent .It Li "fpart -n 3 -o var-parts /var" Produce 3 partitions, with (hopefully) the same size and number of files. Three files: var-parts.1, var-parts.2 and var-parts.3 are generated as output. .It Li "fpart -s 4724464025 -o music-parts /path/to/music ./*.mp3" Produce partitions of 4.4 GB, containing music files from /path/to/music as well as MP3 files from current directory; with such a partition size, each partition content will be ready to be burnt to a DVD. Files music-parts.0 to music-parts.n, are generated as output. .It Li "find /usr ! -type d | fpart -f 10000 -i - /home | grep '^1 '" Produce partitions containing 10000 files each by examining /usr first and then /home and display only partition 1 on stdout. .It Li "du * | fpart -n 2 -a" Produce two partitions by using .Xr du 1 output. Fpart will not examine the file system but instead use arbitrary values printed by .Xr du 1 and sort them. .El .Sh SEE ALSO .Xr du 1 , .Xr find 1 , .Xr fpsync 1 , .Xr grep 1 , .Xr rsync 1 .Sh AUTHOR, AVAILABILITY Fpart has been written by .An Gana\(:el LAPLANCHE and is available under the BSD license on .Lk http://contribs.martymac.org .Sh BUGS No bug known (yet). fpart-1.7.0/tests/fake_readdir.c000644 001751 000000 00000002132 14745137273 017523 0ustar00martymacwheel000000 000000 /* Small library to test implementation of option -Z and FPART_PARTERRNO Inspired from: https://lists.gnu.org/archive/html/bug-gnulib/2016-06/msg00058.html $ cc -fPIC -shared -o libfake_readdir.so fake_readdir.c $ mkdir -p /tmp/test/a/b/c/d/e/f/g/h/i/j $ LD_PRELOAD=./libfake_readdir.so fpart -L -E -zz -Z -f 2 -vvv /tmp/test $ mkdir -p /tmp/test/b/{c,d} $ touch /tmp/test/b/{c,d}/{a..z} $ LD_PRELOAD=./libfake_readdir.so fpart -L -E -zz -Z -f 2 -vvv /tmp/test/b */ #include #include #include #include #include #include #include static size_t counter = 0; #define FAIL_EVERY 7 static struct dirent *(*real_readdir)(DIR *dirp) = NULL; struct dirent *readdir(DIR *dirp) { /* Keep original pointer */ if(real_readdir == NULL) real_readdir = dlsym(RTLD_NEXT, "readdir"); counter++; if((counter % FAIL_EVERY) == 0) { fprintf(stderr, "XXX Failing call to readdir(), counter = %zu\n", counter); fflush(stderr); errno=EIO; return NULL; } return real_readdir(dirp); } fpart-1.7.0/tests/test-parent_path.c000644 001751 000000 00000002041 14745137273 020404 0ustar00martymacwheel000000 000000 /* cc -I../src -lm -o test-parent_path test-parent_path.c ../src/utils.c */ #include #include #include #include #include "utils.h" #define NB_STRINGS 38 static char strings[NB_STRINGS][255] = { "/foo/bar///baz///", "/foo///bar///baz///", "foo/bar///baz///", "foo///", "///foo", "foo", "", "/a/a///", "/a/a/", "/a/a", "/a///", "/a/", "/a", "/abcd/abcd///", "/abcd/abcd/", "/abcd/abcd", "/abcd///", "/abcd/", "/abcd", "///", "/", "", "a/a///", "a/a/", "a/a", "a///", "a/", "a", "abcd/abcd///", "abcd/abcd/", "abcd/abcd", "abcd///", "abcd/", "abcd", "/abcd///abcd///", "abcd///abcd///", "/abcd//abcd///", "abcd//abcd///" } ; int main(void) { int i = 0; char *parent = NULL; while (i < NB_STRINGS) { parent = parent_path(strings[i], 0); printf("%d: %s\t\t => %s\n", i, strings[i], parent); free(parent); i++; } return(0); } fpart-1.7.0/contribs/package/000755 001751 000000 00000000000 14745137273 017035 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/package/README-rpm.txt000644 001751 000000 00000000414 14745137273 021326 0ustar00martymacwheel000000 000000 To build RPM packages: git clone https://github.com/martymac/fpart.git cp -f fpart/contribs/package/rpm/fpart.spec rpmbuild/SPECS/ spectool -g -R rpmbuild/SPECS/fpart.spec rpmbuild -ba rpmbuild/SPECS/fpart.spec Packages are available in Fedora and EPEL repositories fpart-1.7.0/contribs/package/rpm/000755 001751 000000 00000000000 14745137273 017633 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/package/README-debian.txt000644 001751 000000 00000001253 14745137273 021754 0ustar00martymacwheel000000 000000 How to build Debian packages (e.g. for fpart version 1.1.0) : ************************************************************* 1) Firt, install required tools: # apt-get install build-essential curl debhelper automake dh-autoreconf 2) Clone fpart repository: $ git clone 'https://github.com/martymac/fpart.git' $ cd fpart 3) Checkout desired tag : $ git checkout fpart-1.1.0 $ curl 'http://contribs.martymac.org/fpart/fpart-1.1.0.tar.gz' > ../fpart_1.1.0.orig.tar.gz 4) Get latest package files from master branch : $ git checkout master contribs/package/debian $ mv contribs/package/debian . 5) Build source and binary packages: $ dpkg-source -b . $ dpkg-buildpackage -us -b fpart-1.7.0/contribs/package/debian/000755 001751 000000 00000000000 14745137273 020257 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/package/debian/manpages000644 001751 000000 00000000031 14745137273 021767 0ustar00martymacwheel000000 000000 man/fpart.1 man/fpsync.1 fpart-1.7.0/contribs/package/debian/source/000755 001751 000000 00000000000 14745137273 021557 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/package/debian/control000644 001751 000000 00000002742 14745137273 021667 0ustar00martymacwheel000000 000000 Source: fpart Section: misc Priority: optional Maintainer: Ganael LAPLANCHE Build-Depends: automake, debhelper-compat (=13) Standards-Version: 4.6.2 Homepage: http://sourceforge.net/projects/fpart/ Vcs-Browser: https://salsa.debian.org/debian/fpart/ Vcs-Git: https://salsa.debian.org/debian/fpart.git Package: fpart Architecture: any Depends: bsd-mailx | mailx, cpio, pax, rsync, sudo, ${misc:Depends}, ${shlibs:Depends} Description: sort file trees and pack them into bags Fpart is a tool that helps you sort file trees and pack them into bags (called "partitions"). It is developed in C and available under the BSD license. . It splits a list of directories and file trees into a certain number of partitions, trying to produce partitions with the same size and number of files. It can also produce partitions with a given number of files or a limited size. Once generated, partitions are either printed as file lists to stdout (default) or to files. Those lists can then be used by third party programs. . Fpart also includes a live mode, which allows it to crawl very large filesystems and produce partitions in live. Hooks are available to act on those partitions (e.g. immediately start a transfer using rsync(1), cpio(1), pax(1) or tar(1)) without having to wait for the filesystem traversal job to be finished. Used this way, fpart can be seen as a powerful data migration tool. fpart-1.7.0/contribs/package/debian/rules000755 001751 000000 00000000117 14745137273 021336 0ustar00martymacwheel000000 000000 #!/usr/bin/make -f export DEB_BUILD_MAINT_OPTIONS = hardening=+all %: dh $@ fpart-1.7.0/contribs/package/debian/copyright000644 001751 000000 00000006671 14745137273 022224 0ustar00martymacwheel000000 000000 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: fpart Upstream-Contact: Ganael LAPLANCHE Source: http://sourceforge.net/projects/fpart/ Files: * Copyright: Copyright (c) 2011-2025 Ganael LAPLANCHE License: BSD-2-Clause Files: src/fts.h Copyright: Copyright (c) 1989, 1993 The Regents of the University of California License: BSD-3-Clause Files: src/fts.c Copyright: Copyright (c) 1990, 1993, 1994 The Regents of the University of California License: BSD-3-Clause Files: debian/* Copyright: Copyright (c) 2013 Jean-Baptiste Denis Copyright (c) 2014-2025 Ganael LAPLANCHE License: BSD-2-Clause License: BSD-2-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. . THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. License: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. . THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. fpart-1.7.0/contribs/package/debian/upstream/000755 001751 000000 00000000000 14745137273 022117 5ustar00martymacwheel000000 000000 fpart-1.7.0/contribs/package/debian/docs000644 001751 000000 00000000017 14745137273 021130 0ustar00martymacwheel000000 000000 README.md TODO fpart-1.7.0/contribs/package/debian/changelog000644 001751 000000 00000005054 14745137273 022135 0ustar00martymacwheel000000 000000 fpart (1.6.0-1) unstable; urgency=low * New upstream release * debian/control - Bump Standards-Version to 4.6.2 (no changes required) * debian/copyright - Bump copyright dates * debian/rules - Enable hardening -- Ganael LAPLANCHE Tue, 23 Jan 2024 22:08:02 +0100 fpart (1.5.1-1) unstable; urgency=low * New upstream release * Fix large files handling on 32-bit machines (closes: #834328) * debian/control - Bump Standards-Version to 4.6.1 (no changes required) * debian/copyright - Bump copyright dates -- Ganael LAPLANCHE Fri, 01 Jul 2022 17:26:19 +0200 fpart (1.4.0-1) unstable; urgency=low * New upstream release * Include README.md instead of symlink (closes: #988871) * debian/control - Bump Standards-Version to 4.6.0 (no changes required) - Add mailx to Depends - Refine description * debian/copyright - Fpart is BSD-2-Clause, not BSD-3-Clause - Add missing copyright for src/fts.{h,c} * debian/watch - Add PGP signature check * Add debian/upstream/signing-key.asc file -- Ganael LAPLANCHE Tue, 19 Oct 2021 21:02:12 +0200 fpart (1.2.0-1) unstable; urgency=low * New upstream release * debian/control - Bump Standards-Version to 4.5.0 (no changes required) -- Ganael LAPLANCHE Tue, 21 Jan 2020 22:18:40 +0100 fpart (1.1.0-1) unstable; urgency=low * New upstream release (closes: #881806) * New package maintainer (closes: #911246, #924334) * debian/control - Update Vcs fields - Bump Standards-Version to 4.4.0 (no changes required) - Use debhelper-compat (= 12) - Add cpio to Depends - Remove unnecessary minimal versions from Depends * debian/copyright - Use machine-readable format * debian/watch - Switch to version 4 - Use https in URL -- Ganael LAPLANCHE Wed, 21 Aug 2019 23:41:38 +0200 fpart (0.9.2-1) unstable; urgency=low * New upstream release * debian/control - add sudo in Depends - add dh-autoreconf in Build-Depends -- Carl Chenet Sat, 25 Apr 2015 06:21:34 +0200 fpart (0.9.1-1) unstable; urgency=low * New upstream release * debian/control - Bump Standards-Version to 3.9.6.1 * debian/manpages - Added fpsync -- Carl Chenet Tue, 10 Feb 2015 18:54:43 +0100 fpart (0.8-1) unstable; urgency=low * Initial release (Closes: #708383) -- Carl Chenet Sun, 30 Jun 2013 17:15:39 +0200 fpart-1.7.0/contribs/package/debian/watch000644 001751 000000 00000000154 14745137273 021310 0ustar00martymacwheel000000 000000 # See uscan(1) for format version=4 opts=pgpsigurlmangle=s/$/.asc/ https://sf.net/fpart/fpart-(.*)\.tar\.gz fpart-1.7.0/contribs/package/debian/upstream/signing-key.asc000644 001751 000000 00000007704 14745137273 025043 0ustar00martymacwheel000000 000000 -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBF2fFJ4BEAC5gqS/DL3GUgdIdMRdaDO96VVHscZqZTMYZQN0CNrBuQVmWxdf c3kMmHwVRBj0IT8hmNoqpmHMsx2CeTiV+I8ehj0sdULK8trcKJQABKe9zX87NuRu fibNLyx9a2Nt3MVUMN5exviAfFJCceY4waI8voZDKm7FFmRPJUUS8TcMtluYGeBX Rn5O/d8p0tLAwfkX95hONem14icn7YhLxbA4ZDc4nzWIEsmllKXBQ8H59C2JwFCJ PpNC7Wdh2mqjEbzuxsEYc83t3ZWN6By1fHFQDrKLGpaUY0kn0PxXUJFxOfZ+1QQi mg9u+wOoel1P6nrCU4gA2zKRdVkJ2REdarVziFeTxEO6a4uze/jw2iX+u17govzR urCwng+TtBlgiBekLaFk2D7FW3MnEJWI9FaHzFWOu8yJgeBTOfakaMRPkYuwX3/n 7H6etL2IC0wHUVzozAKtwra6CLOGQgsz7QORGmH92YDp7+1YpZnJ+gnAhVpzT/sd 3088wlWYPIQtgZhiUYN2IeDmqTyzw71t1G8Iw9qa77CYgMqdUc4T8xzFmTrDyIPv YKTz3n99BKXRVehfd6o61TELyexiMjGfdg8SfMyxB7IBWHmLcbqH2Yu4pP5net2r tti58BdX1IQzNwLnVqpNermHw4M8n+DriUFfkWxFRFjMSfIf4WzWoXQ3YQARAQAB tDBHYW5hZWwgTGFwbGFuY2hlIDxnYW5hZWwubGFwbGFuY2hlQG1hcnR5bWFjLm9y Zz6JAlQEEwEIAD4WIQTkci0w9cbmOndNdjp6Ni2hT6CP1AUCXZ8UngIbAwUJBaOa gAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRB6Ni2hT6CP1EgGD/95nMWtM4ex GZZxRoyEIqftApjaC8fZdY0N7TgWS/KTJqfeZBPyPP0ffiiPlctxAaiKC8yJZYQ5 BJ0mCIR/Tww5+0f3ZJ427RIASsbPg0UvnFgYCFLkAHU5jMs3Hl62jdqe2bH/WpFC 2lg2OS3iQF8m5oI83qlZ65zL4/nmMU4ni0mBnSOAJ3bxudo2/Z4QnQxwwWfnMYJT xn8xcym3thhTS65PzpOZ+RlrTr4nX4aRSquZ0sY10VPmOgr1V7VKaXF5LcJJQdEG 5p4E8gXFKBFzjZoAcQqPoYSKLYaKv3K/9K3yabira12ryXhlrnOLsI+Gb1Z0vtnM nNOsHccfsgGoAkfCjrcfuLK5/+7jbxGfYxfDORbx0ZC9gjMMnAwCmgo6jTYK34rG jZg4G1tl8VUIFYLW0s+UPYn38W50dHXKq99K8X+rs9NDVrxcGWHBN8CYOZXewrSP drMX/BhlGwd8TByN9FHSrlLFEFP5WwWKGtjInl8pZazwAXUy5iTFKh6Nrh5KU5K4 gY1e4g1BpB1DeME+SBK1znJDXma7nfp6+OQtMF9QxzoTseD1CTnzSa+TGSoAD4I7 XR4BzZcPxbndePWoxhr/3DiI0elQKppkIShDe+y8mzyex4BcnWwmk6Q9o3l25joy VOcTMC0MTV2QDJUnaaWZII3Bx5hzchRUVbQnR2FuYWVsIExhcGxhbmNoZSA8bWFy dHltYWNARnJlZUJTRC5vcmc+iQJUBBMBCAA+FiEE5HItMPXG5jp3TXY6ejYtoU+g j9QFAl2fFsACGwMFCQWjmoAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQejYt oU+gj9SasQ/6AsdiKe/fqQIZtokyuLGAKtvDjQwlaTHAEAi4R6DSDGKHQNq9DqPZ d8+kFGruDXxt2SQ3fuBdTFgy/Jqyzgb+wr3pqczkGFkuDTlXqoAKKZjq3QWVLSUc uv+KjDDQUd7LT8k6/heeaPRF2gp5htEoSGaNh9YYV26jXq80MDvlndQX5ISgEOs5 BJ3fuKB/b71sWsIwz5MFmLQ2amMl7yhRSd28Slm7u9pD7SFPQ1rxjw2IYSFuK8PI sbGNNeXnAEUzUvop21TXFHLgOgsTww6+KdKeSROzyEqQ1wxMKlhP2+CJvyyOVLml tQdVMq8P1dUYP6Y/suDrDl7a0Rp1G8RT04mcAGvYAvW37xBw4RcbTm3qH3HU7gcA kwJtkhPeLlqwvbNT6+a35zv5HR1apN4SbU9nZe8CGExQj7cMWfBNSxeavah6M2kw s+53RKGyFv2PyqrsjpI5mbGq62S9ciGTsmuKGhgasFjps8azJtv8fRi+aDqZCRbS DWh9PaepQsOWOH+e6n2VFakdQiEVZ7LL1u9OpzXA95o59DIhfXsWP+uZiXDYbUIQ vlKwj4Ma0q27UPwseG8SxzSW2396mxYTWmQmdedV2JeYnqyyydASxRGEyiR80h+5 WoJlbbjPBJQv9jtqi3CAwzj3Q3jBKTd+GYeoKq6Z0mx1OAJceFpDyBe5Ag0EXZ8U ngEQAN/cpt5lptcmyYbqQASxbq+AtLSGg1/GK9p1lHGj/jcNrxDxTzHkA22ofZ2C yIhZP/INnE1i8o6S0F2RgI4FOPJvBaE1hNLwFvwHzn9uPThCUXZHYjXo4ikas0WY yIlsCIcrTB0oHGclLfuGbAXprH6BzTrIh2ms4vzhEsQ3QbNM8BGcjZxy392ZVXUY LXJtEhtf4i4QbkP6zNGxQkUMlf9khNedC5mt0uEdvynkpqlSCxNyAJZonFi/w5zg BV2Gy9gPU5ZhoQ3FhrZJ1/q9oAZKwR5z8Y5tQ27gMkFqm3UgCRsGebIj4TF7hNNZ +IQxxDXKaoAsk3OMq72ibAyqEse3c8blusFoDoXYrkAx7EVwHcBRRRbKdfv0J/qU F1vD1Epuy+wr/kFhATLR35TtYCvGtxBhG8O+bHX+oyvjNCGagzqkQiiDq800lIgd osO394AnkFZKZYTXwVYbxUpgKXPaVI4fOm7Ef2+JY6Rsb4hkQEuBm5ZkCAmWrLxo uO6eZmwWO1sPZ9Rz9dHEECVxzIRNfvwK1khdrSH+LTNRu18yvJNFXeKF6lmnqn3o qKqo1qh8KNsxdjqW2wT9J6/xVIKy+ZmeCir32BclHFRjRR+0t0fexooiR4nxEqhp U5KE1HT2eMBXvvSd2Kw0WAvQp/ade2OtgxVlKjyar9LFKx6RABEBAAGJAjwEGAEI ACYWIQTkci0w9cbmOndNdjp6Ni2hT6CP1AUCXZ8UngIbDAUJBaOagAAKCRB6Ni2h T6CP1JmeD/9ilKJFc7runh3iU03mIcKiD01EQElQ64cQzFZEdW4KFImKSW7GIuRr 8j+VguI34ssBx639DaNY2x4Sbxp/d+euVo+/g7/nuxBEJABw6DyGZWcagL85Qe14 aRlOUDq5aSzz1tJbZT8a3TEKsjbr1dOucBCLRPGAjDVF0k28dWIR/PT/usC/7Z5F Kd1K+WlCzVRV/uim/jP60lLJMKMaQyO/NNsXUpLn9WaYY307qnCIgmJOVTmA9RrB cnGNoba5NNTnw5EMIDkMc5oT4PTrf/vmwzI6hSw/y9VKb07g619ZtFG8UyGXIEJ1 sVNdmnO5OOWzhmEOTI9CLWtmff2Mx1ObXNFnuiPgydBX81Y60jGgO50NMzL1W+5E TtkRYmYGWnEIWxX53dTMj3X1VF/B1bEA8T1Uux/vZUChoNPQjB0aPjQbuoBRnalt s8tqphTC2lXGmmntz9pQf5W/JQLxxoGtxNNr9WyjNgDOqWj936J3Zz71WJMACdql AoSpGi5Dn30x/x+wrlqAAmDdw4+HbgRRzv8ay5gwCBZs0DX7Q2j0WBs+tJVdUTVR xcgC2Q8qmhwkf2PJ06+FxyQSrjkzfjbjUymPNdKJctqwlCc3f4WS55Zl1vTpWQI9 4mBVPOVuFbr/P+Z7OMxkVJeJ3/D2EOn9B2CD9/tG1Hv0pok6bgV0tw== =Llq8 -----END PGP PUBLIC KEY BLOCK----- fpart-1.7.0/contribs/package/debian/source/format000644 001751 000000 00000000014 14745137273 022765 0ustar00martymacwheel000000 000000 3.0 (quilt) fpart-1.7.0/contribs/package/rpm/fpart.spec000644 001751 000000 00000005576 14745137273 021640 0ustar00martymacwheel000000 000000 Name: fpart Version: 1.2.0 Release: 2%{?dist} License: BSD Summary: a tool that sorts files and packs them into bags URL: http://contribs.martymac.org Source0: https://github.com/martymac/%{name}/archive/%{name}-%{version}.tar.gz %if 0%{?fedora} Suggests: sudo rsync cpio %endif BuildRequires: gcc autoconf automake %description Fpart is a tool that helps you sort file trees and pack them into bags (called "partitions"). It is developed in C and available under the BSD license. It splits a list of directories and file trees into a certain number of partitions, trying to produce partitions with the same size and number of files. It can also produce partitions with a given number of files or a limited size. %prep # The name macro is used twice due to the way the upstream project includes the project name in its release tags %setup -q -n %{name}-%{name}-%{version} %build autoreconf --install %configure make %{?_smp_mflags} %install %make_install %files %license COPYING %doc Changelog README TODO %{_mandir}/man1/fpart.1* %{_mandir}/man1/fpsync.1* %{_bindir}/fpart %{_bindir}/fpsync %changelog * Fri Dec 06 2019 Sam P - 1.2.0-2 - Revised rpmbuild instructions - Added comment about git release tag naming - Added mass Fedora 31 rebuild commit history entry * Tue Oct 29 2019 Christopher Voltz - 1.2.0-1 - Version 1.2.0 - Added instructions for building RPMs - Fixed build directory name * Thu Jul 25 2019 Fedora Release Engineering - 1.1.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild * Mon Nov 19 2018 Sam P - 1.1.0-2 - cleaned up prep and build sections - trued up changelog entries - corrected desciption - added missing weak dependencies * Fri Nov 16 2018 Sam P - 1.1.0-1 - repackaged to stable release version 1.1.0 * Fri Nov 16 2018 Ganael Laplanche - 1.1.0 - Version 1.1.0 * Mon Nov 12 2018 Sam P - 1.0.0-4.20181109git57f49f5 - pulled down latest snapshot which merged patch * Wed Oct 31 2018 Sam P - 1.0.0-3.20181022git130f8fd - added patch for autoconf version for EL6 compatibility * Wed Oct 31 2018 Sam P - 1.0.0-3.20181022git130f8fd - updated to snapshot 130f8fdadf2bbcc3cdaad479a356e8d0e3f6f041 * Thu Apr 19 2018 Sam P - 1.0.0-2 - Used %%buildroot macro - Correctly marked license - Other small packaging corrections * Fri Nov 10 2017 Ganael Laplanche - 1.0.0 - Version 1.0.0 * Thu Apr 27 2017 Ganael Laplanche - 0.9.3 - Version 0.9.3 * Tue Feb 17 2015 Ganael Laplanche - 0.9.2 - Version 0.9.2 * Mon Feb 16 2015 Tru Huynh - 0.9.1 - Initial build of the package.