aMule-2.3.1/0000755000175000017470000000000011657306265011477 5ustar topiusersaMule-2.3.1/m4/0000755000175000017470000000000011657306274012017 5ustar topiusersaMule-2.3.1/m4/stdint_h.m40000644000175000017470000000204311575347521014073 0ustar topiusers# stdint_h.m4 serial 2 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_stdint_h=yes, jm_ac_cv_header_stdint_h=no)]) if test $jm_ac_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) aMule-2.3.1/m4/libupnp.m40000644000175000017470000000651111575347521013734 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule project. # This file is part of the libupnp library project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl -------------------------------------------------------------------------- dnl LIBUPNP_CHECK([VERSION = 1.6.6], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl Check for the libupnp library dnl -------------------------------------------------------------------------- dnl dnl This macro sets these variables: dnl - LIBUPNP_VERSION dnl Something like "1.6.7" dnl - LIBUPNP_CPPFLAGS dnl Flags to be added to CPPFLAGS dnl - LIBUPNP_CFLAGS dnl Flags to be added to CFLAGS dnl - LIBUPNP_LDFLAGS dnl Flags to be added to LDFLAGS dnl - LIBUPNP_LIBS dnl Library to be added to LIBS dnl dnl The LIBUPNP_CPPFLAGS, LIBUPNP_CFLAGS, LIBUPNP_LDFLAGS and LIBUPNP_LIBS variables are also substituted. dnl AC_DEFUN([LIBUPNP_CHECK], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl m4_define([MIN_LIBUPNP_VERSION], [m4_ifval([$1], [$1], [1.6.6])])dnl dnl Test for --with-libupnp-prefix AC_ARG_WITH( [libupnp-prefix], [AS_HELP_STRING( [--with-libupnp-prefix=PREFIX], [UPnP library location])], [export PKG_CONFIG_PATH=$withval/lib/pkgconfig]) dnl Check for libupnp >= MIN_LIBUPNP_VERSION AS_IF([test $cross_compiling = no], [ AC_MSG_CHECKING([for libupnp version >= MIN_LIBUPNP_VERSION]) AS_IF([test -n "$PKG_CONFIG"], [ AS_IF([$PKG_CONFIG libupnp --exists], [ LIBUPNP_VERSION=`$PKG_CONFIG libupnp --modversion` AS_IF([$PKG_CONFIG libupnp --atleast-version=MIN_LIBUPNP_VERSION], [ result=yes resultstr=" (version $LIBUPNP_VERSION)" LIBUPNP_CPPFLAGS=`$PKG_CONFIG libupnp --cflags-only-I` LIBUPNP_CFLAGS=`$PKG_CONFIG libupnp --cflags-only-other` LIBUPNP_LDFLAGS=`$PKG_CONFIG libupnp --libs-only-L` LIBUPNP_LIBS=`$PKG_CONFIG libupnp --libs-only-other` LIBUPNP_LIBS="$LIBUPNP_LIBS `$PKG_CONFIG libupnp --libs-only-l`" ], [ result=no resultstr=" (version $LIBUPNP_VERSION is not new enough)" ]) ], [ result=no resultstr=" (try to use --with-libupnp-prefix=PREFIX)" ]) ], [ result=no resultstr=" (pkg-config not found)" ]) AC_MSG_RESULT([$result$resultstr]) libupnp_error="libupnp >= MIN_LIBUPNP_VERSION not found$resultstr" ], [ dnl Currently cross-compilation with libupnp is not supported. result=no libupnp_error="cross compiling" ]) dnl Execute the right action. AS_IF([test ${result:-no} = yes], [$2], [$3]) dnl Exported symbols AC_SUBST([LIBUPNP_CPPFLAGS])dnl AC_SUBST([LIBUPNP_CFLAGS])dnl AC_SUBST([LIBUPNP_LDFLAGS])dnl AC_SUBST([LIBUPNP_LIBS])dnl m4_undefine([MIN_LIBUPNP_VERSION])dnl ]) aMule-2.3.1/m4/kde.m40000644000175000017470000001102511657246511013020 0ustar topiusersAC_DEFUN([KDE_CONFIG_OPTIONS], [ AC_ARG_WITH( [kde4-config], [AS_HELP_STRING([--with-kde4-config=PATH], [kde4-config script to use])], [KDE4_CONFIG=$withval], [KDE4_CONFIG=""]) AC_ARG_ENABLE( [kde-in-home], [AS_HELP_STRING([--enable-kde-in-home], [install KDE related stuff in your home dir])], [KDE_IN_HOME=$enableval], [KDE_IN_HOME=no]) ]) AC_DEFUN([KDE_CONFIG_CHECK], [ AS_IF([test -z ${KDE4_CONFIG}], [ AC_PATH_PROG(KDE4_CONFIG, kde4-config) ], [ AC_MSG_CHECKING(for kde4-config) AS_IF([test ! -x KDE4_CONFIG], [ KDE4_CONFIG="not found" AC_MSG_RESULT(not found) exit 1 ]) ]) AS_IF([ test "${KDE4_CONFIG}" != "not found"], [ KDE_CONF_VER=`${KDE4_CONFIG} --version | grep KDE | sed -e 's/^.*: //' -e 's/ (.*$//'` AS_IF([test `echo ${KDE_CONF_VER} | sed -e 's/\..*$//'` = 4], [ AC_MSG_RESULT(found ${KDE4_CONFIG} with version ${KDE_CONF_VER}) ], [ AC_MSG_RESULT(at least version 4 required) exit 1 ]) ], [ AC_MSG_RESULT(not found) exit 1 ]) AC_SUBST(KDE4_CONFIG) ]) AC_DEFUN([KDE_HEADER_CHECK], [ AC_MSG_CHECKING(for kde4 headers) [KDE_HEADER_DIR=`${KDE4_CONFIG} --path include`] AS_IF([test -f ${KDE_HEADER_DIR}kdirwatch.h], [ AS_IF([test -f ${KDE_HEADER_DIR}plasma/dataengine.h], [ AC_MSG_RESULT(${KDE_HEADER_DIR}) ], [ AC_MSG_RESULT(dataengine.h not found) exit 1 ]) ], [ AC_MSG_RESULT(kdirwatch.h not found) exit 1 ]) AC_SUBST(KDE_HEADER_DIR) ]) AC_DEFUN([KDE_SERVICE_PATH_CHECK], [ AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING(for kde4 services Path) AS_IF([test `echo ${prefix} | grep home | wc -l` == 1], [ KDE_IN_HOME="yes" ]) AS_IF([test ${KDE_IN_HOME} = "yes"], [ KDE_SERVICE_PATH=`${KDE4_CONFIG} --path services | tr ":" "\n" | $EGREP '(/home|/root)' | head -1` ], [ KDE_SERVICE_PATH=`${KDE4_CONFIG} --path services | tr ":" "\n" | grep /usr | head -1` ]) AC_MSG_RESULT(${KDE_SERVICE_PATH}) AC_SUBST(KDE_SERVICE_PATH) ]) AC_DEFUN([KDE_MODULE_PATH_CHECK], [ AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING(for kde4 plugins Path) AS_IF([test `echo ${prefix} | grep home | wc -l` == 1], [ KDE_IN_HOME="yes" ]) AS_IF([test ${KDE_IN_HOME} = "yes"], [ KDE_MODULE_PATH=`${KDE4_CONFIG} --path module | tr ":" "\n" | $EGREP '(/home|/root)' | head -1` ], [ KDE_MODULE_PATH=`${KDE4_CONFIG} --path module | tr ":" "\n" | grep /usr | head -1` ]) AC_MSG_RESULT(${KDE_MODULE_PATH}) AC_SUBST(KDE_MODULE_PATH) ]) AC_DEFUN([KDE_ICON_PATH_CHECK], [ AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING(for kde4 icons Path) AS_IF([test `echo ${prefix} | grep home | wc -l` == 1], [ KDE_IN_HOME="yes" ]) AS_IF([test ${KDE_IN_HOME} = "yes"], [ KDE_ICON_PATH=`${KDE4_CONFIG} --path icon | tr ":" "\n" | $EGREP '(/home|/root)' | head -1` ], [ KDE_ICON_PATH=`${KDE4_CONFIG} --path icon | tr ":" "\n" | grep /usr | head -1` ]) KDE_ICON_PATH=${KDE_ICON_PATH}hicolor/scalable/mimetypes/ AC_MSG_RESULT(${KDE_ICON_PATH}) AC_SUBST(KDE_ICON_PATH) ]) AC_DEFUN([KDE_MIME_PATH_CHECK], [ AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING(for location for mime-type installation) AS_IF([test `echo ${prefix} | grep home | wc -l` == 1], [ KDE_IN_HOME="yes" ]) AS_IF([test ${KDE_IN_HOME} = "yes"], [ KDE_MIME_PATH=`${KDE4_CONFIG} --path xdgdata-mime | tr ":" "\n" | $EGREP '(/home|/root)' | head -1` ], [ AS_IF([test -n ${prefix}], [ KDE_MIME_PATH=`${KDE4_CONFIG} --path xdgdata-mime | tr ":" "\n" | grep ${prefix} | head -1` AS_IF([test -n ${KDE_MIME_PATH}], [ KDE_MIME_PATH=`${KDE4_CONFIG} --path xdgdata-mime | tr ":" "\n" | $EGREP -v '(/home|/root)' | head -1` ]) ], [ KDE_MIME_PATH=`${KDE4_CONFIG} --path xdgdata-mime | tr ":" "\n" | $EGREP -v '(/home|/root)' | head -1` ]) ]) AC_MSG_RESULT(${KDE_MIME_PATH}) AC_SUBST(KDE_MIME_PATH) ]) AC_DEFUN([KDE_APPLNK_PATH_CHECK], [ AC_REQUIRE([AC_PROG_EGREP]) AC_MSG_CHECKING(for kde4 applinks Path) AS_IF([test `echo ${prefix} | grep home | wc -l` == 1], [ KDE_IN_HOME="yes" ]) AS_IF([test ${KDE_IN_HOME} = "yes"], [ KDE_APPLNK_PATH=`${KDE4_CONFIG} --path xdgdata-apps | tr ":" "\n" | $EGREP '(/home|/root)' | head -1` ], [ AS_IF([test -n ${prefix}], [ KDE_APPLNK_PATH=`${KDE4_CONFIG} --path xdgdata-apps | tr ":" "\n" | grep ${prefix} | head -1` AS_IF([test -n ${KDE_APPLNK_PATH}], [ KDE_APPLNK_PATH=`${KDE4_CONFIG} --path xdgdata-apps | tr ":" "\n" | grep -vE '(/home|/root)' | head -1` ]) ], [ KDE_APPLNK_PATH=`${KDE4_CONFIG} --path xdgdata-apps | tr ":" "\n" | grep -vE '(/home|/root)' | head -1` ]) ]) AC_MSG_RESULT(${KDE_APPLNK_PATH}) AC_SUBST(KDE_APPLNK_PATH) ]) aMule-2.3.1/m4/nls.m40000644000175000017470000001053111575347521013054 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl ---------------------------------------------------- dnl MULE_CHECK_AUTOPOINT([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl check if autopoint is installed dnl ---------------------------------------------------- AC_DEFUN([MULE_CHECK_AUTOPOINT], [ AC_MSG_CHECKING([for autopoint]) autopoint_version=`autopoint --version | head -n 1 | sed -e 's/.*[[^0-9.]]\([[0-9]]\{1,\}\(\.[[0-9]]\{1,\}\)\{1,2\}\)[[^0-9.]]*/\1/'` AS_IF([test -n "$autopoint_version"], [ AC_MSG_RESULT([yes ($autopoint_version)]) $1 ], [ AC_MSG_RESULT([no]) $2 ]) ]) dnl --------------------------------------------------------------------------- dnl GENERATE_MANS_TO_INSTALL(TESTNAME, BASENAMEPATH) dnl dnl This function will generate the list of manpages to be installed. dnl dnl TESTNAME is the name of a FEATURE selected by MULE_ARG_ENABLE() if this dnl set of manpages need installing. The list of files will be returned in dnl the TESTNAME_MANPAGES variable. dnl dnl BASENAMEPATH is the path and basename of the manpages we test for, relative dnl to the package root (top_srcdir) dnl --------------------------------------------------------------------------- AC_DEFUN([GENERATE_MANS_TO_INSTALL], [m4_define([MANPAGES], [m4_translit([$1], [a-z-], [A-Z_])[]_MANPAGES])dnl MULE_IF_ENABLED([$1], [ AS_IF([test -z "$LINGUAS"], [MANPAGES=`ls -1 ${srcdir}/$2.* | sed -e 's:.*/::g'`], [ MANPAGES=`ls -1 ${srcdir}/$2.* | sed -e 's:.*/::g' | grep $Generate_Langs` MANPAGES="`basename $2.1` $[]MANPAGES" ]) MANPAGES=`echo $[]MANPAGES | tr -d '\n'` ], [MANPAGES=]) AC_SUBST(MANPAGES)dnl m4_undefine([MANPAGES])dnl ]) dnl --------------------------------------------------------------------------- dnl MULE_CHECK_NLS dnl dnl Checks and tests everything needed for Native Language Support dnl --------------------------------------------------------------------------- AC_DEFUN([MULE_CHECK_NLS], [ AC_ARG_WITH([language], [AS_HELP_STRING([--with-language=], [Specify a comma-separated list of languages you want to have installed. See po/LINGUAS for available languages])], [AS_IF([test "$withval" != "all"], [LINGUAS="`echo $withval | sed -e 's/,/ /g'`"])]) AM_GNU_GETTEXT([no-libtool], [need-ngettext]) AS_IF([test $USE_INCLUDED_LIBINTL = yes], [INCINTL=-I\${top_builddir}/intl]) AS_IF([test x$USE_NLS = xyes], [MULE_CHECK_AUTOPOINT(, [USE_NLS=no])]) AS_IF([test x$USE_NLS = xno -a x${enable_nls:-yes} = xyes], [MULE_WARNING([You need to install GNU gettext/gettext-tools to compile aMule with i18n support.])]) AS_IF([test ${USE_NLS:-no} = yes], [ AC_MSG_CHECKING([for requested languages]) Generate_Langs=`echo $LINGUAS | $AWK ['OFS="\\\\|" { for (i = 1; i <= NF; ++i) $i = "\\\\." $i; print }']` GENERATE_MANS_TO_INSTALL([amule-daemon], [docs/man/amuled]) GENERATE_MANS_TO_INSTALL([amulecmd], [docs/man/amulecmd]) GENERATE_MANS_TO_INSTALL([webserver], [docs/man/amuleweb]) GENERATE_MANS_TO_INSTALL([amule-gui], [docs/man/amulegui]) GENERATE_MANS_TO_INSTALL([cas], [src/utils/cas/docs/cas]) GENERATE_MANS_TO_INSTALL([wxcas], [src/utils/wxCas/docs/wxcas]) GENERATE_MANS_TO_INSTALL([ed2k], [docs/man/ed2k]) GENERATE_MANS_TO_INSTALL([alc], [src/utils/aLinkCreator/docs/alc]) GENERATE_MANS_TO_INSTALL([alcc], [src/utils/aLinkCreator/docs/alcc]) GENERATE_MANS_TO_INSTALL([monolithic], [docs/man/amule]) AC_MSG_RESULT([${LINGUAS:-all}]) ]) AC_SUBST([INCINTL])dnl ]) aMule-2.3.1/m4/wxwin.m40000644000175000017470000011136411575362545013445 0ustar topiusersdnl --------------------------------------------------------------------------- dnl Author: wxWidgets development team, dnl Francesco Montorsi, dnl Bob McCown (Mac-testing) dnl Creation date: 24/11/2001 dnl RCS-ID: $Id: wxwin.m4 10580 2011-06-13 10:24:37Z gonosztopi $ dnl --------------------------------------------------------------------------- dnl =========================================================================== dnl Table of Contents of this macro file: dnl ------------------------------------- dnl dnl SECTION A: wxWidgets main macros dnl - WX_CONFIG_OPTIONS dnl - WX_CONFIG_CHECK dnl - WXRC_CHECK dnl - WX_STANDARD_OPTIONS dnl - WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl - WX_DETECT_STANDARD_OPTION_VALUES dnl dnl SECTION B: wxWidgets-related utilities dnl - WX_LIKE_LIBNAME dnl - WX_ARG_ENABLE_YESNOAUTO dnl - WX_ARG_WITH_YESNOAUTO dnl dnl SECTION C: messages to the user dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl - WX_BOOLOPT_SUMMARY dnl dnl The special "WX_DEBUG_CONFIGURE" variable can be set to 1 to enable extra dnl debug output on stdout from these macros. dnl =========================================================================== dnl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl ... dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1]) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl dnl If you want to support standard --enable-debug/unicode/shared options, you dnl may do the following: dnl dnl ... dnl AC_CANONICAL_SYSTEM dnl dnl # define configure options dnl WX_CONFIG_OPTIONS dnl WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared]) dnl dnl # basic configure checks dnl ... dnl dnl # we want to always have DEBUG==WX_DEBUG and UNICODE==WX_UNICODE dnl WX_DEBUG=$DEBUG dnl WX_UNICODE=$UNICODE dnl dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl WX_CONFIG_CHECK([2.8.0], [wxWin=1],,[html,core,net,base],[$WXCONFIG_FLAGS]) dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl # write the output files dnl AC_CONFIG_FILES([Makefile ...]) dnl AC_OUTPUT dnl dnl # optional: just to show a message to the user dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WX_CONFIG_OPTIONS dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONFIG_OPTIONS], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION_FULL" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONFIG_CHECK(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against (it may include contrib libraries). If dnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to dnl link with all of the core wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([WX_CONFIG_CHECK], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION_FULL="" min_wx_version=ifelse([$1], ,2.8.0,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5 $4" WX_VERSION_FULL=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION_FULL | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION_FULL | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION_FULL | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION_FULL)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` ifelse([$2], , :, [$2]) else if test "x$WX_VERSION_FULL" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION_FULL is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_RESCOMP="" if test ! -z "$5"; then wx_error_message=" The configuration you asked for $PACKAGE_NAME requires a wxWidgets build with the following settings: $5 but such build is not available. To see the wxWidgets builds available on this system, please use 'wx-config --list' command. To use the default build, returned by 'wx-config --selected-config', use the options with their 'auto' default values." fi wx_error_message=" The requested wxWidgets build couldn't be found. $wx_error_message If you still get this error, then check that 'wx-config' is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is $1 or above." ifelse([$3], , AC_MSG_ERROR([$wx_error_message]), [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_VERSION_FULL) AC_SUBST(WX_RESCOMP) dnl need to export also WX_VERSION_MINOR and WX_VERSION_MAJOR symbols dnl to support wxpresets bakefiles WX_VERSION_MAJOR="$wx_config_major_version" WX_VERSION_MINOR="$wx_config_minor_version" AC_SUBST(WX_VERSION_MAJOR) AC_SUBST(WX_VERSION_MINOR) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl WX_CONFIG_CHECK(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl WXRC_CHECK([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WXRC_CHECK([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl WXRC_CHECK([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([WXRC_CHECK], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) dnl --------------------------------------------------------------------------- dnl WX_LIKE_LIBNAME([output-var] [prefix], [name]) dnl dnl Sets the "output-var" variable to the name of a library named with same dnl wxWidgets rule. dnl E.g. for output-var=='lib', name=='test', prefix='mine', sets dnl the $lib variable to: dnl 'mine_gtk2ud_test-2.8' dnl if WX_PORT=gtk2, WX_UNICODE=1, WX_DEBUG=1 and WX_VERSION=28 dnl --------------------------------------------------------------------------- AC_DEFUN([WX_LIKE_LIBNAME], [ wx_temp="$2""_""$WX_PORT" dnl add the [u][d] string if test "$WX_UNICODE" = "1"; then wx_temp="$wx_temp""u" fi if test "$WX_DEBUG" = "1"; then wx_temp="$wx_temp""d" fi dnl complete the name of the lib wx_temp="$wx_temp""_""$3""-$WX_VERSION_MAJOR.$WX_VERSION_MINOR" dnl save it in the user's variable $1=$wx_temp ]) dnl --------------------------------------------------------------------------- dnl WX_ARG_ENABLE_YESNOAUTO/WX_ARG_WITH_YESNOAUTO dnl dnl Two little custom macros which define the ENABLE/WITH configure arguments. dnl Macro arguments: dnl $1 = the name of the --enable / --with feature dnl $2 = the name of the variable associated dnl $3 = the description of that feature dnl $4 = the default value for that feature dnl $5 = additional action to do in case option is given with "yes" value dnl --------------------------------------------------------------------------- AC_DEFUN([WX_ARG_ENABLE_YESNOAUTO], [AC_ARG_ENABLE($1, AC_HELP_STRING([--enable-$1], [$3 (default is $4)]), [], [enableval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --enable-$1 option]) if test "$enableval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 elif test "$enableval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$enableval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, no, auto) ]) fi ]) AC_DEFUN([WX_ARG_WITH_YESNOAUTO], [AC_ARG_WITH($1, AC_HELP_STRING([--with-$1], [$3 (default is $4)]), [], [withval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-$1 option]) if test "$withval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 dnl NB: by default we don't allow --with-$1=no option dnl since it does not make much sense ! elif test "$6" = "1" -a "$withval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, auto) ]) fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS([options-to-add]) dnl dnl Adds to the configure script one or more of the following options: dnl --enable-[debug|unicode|shared|wxshared|wxdebug] dnl --with-[gtk|msw|motif|x11|mac|mgl|dfb] dnl Then checks for their presence and eventually set the DEBUG, UNICODE, SHARED, dnl PORT, WX_SHARED, WX_DEBUG, variables to one of the "yes", "no", "auto" values. dnl dnl Note that e.g. UNICODE != WX_UNICODE; the first is the value of the dnl --enable-unicode option (in boolean format) while the second indicates dnl if wxWidgets was built in Unicode mode (and still is in boolean format). dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS], [ dnl the following lines will expand to WX_ARG_ENABLE_YESNOAUTO calls if and only if dnl the $1 argument contains respectively the debug,unicode or shared options. ifelse(regexp([$1], [\bdebug]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([debug], [DEBUG], [Build in debug mode], [auto])]) ifelse(index([$1], [unicode]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([unicode], [UNICODE], [Build in Unicode mode], [auto])]) ifelse(regexp([$1], [\bshared]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([shared], [SHARED], [Build as shared library], [auto])]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-toolkit since it's an option dnl which must be able to accept the auto|gtk1|gtk2|msw|... values ifelse(index([$1], [toolkit]), [-1],, [ AC_ARG_WITH([toolkit], AC_HELP_STRING([--with-toolkit], [Build against a specific wxWidgets toolkit (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-toolkit option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) TOOLKIT="auto" else TOOLKIT="$withval" dnl PORT must be one of the allowed values if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \ "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" -a \ "$TOOLKIT" != "base" -a "$TOOLKIT" != "cocoa" -a \ "$TOOLKIT" != "osx_cocoa"; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb, base, cocoa, osx_cocoa) ]) fi AC_MSG_RESULT([$TOOLKIT]) fi ]) dnl ****** IMPORTANT ******* dnl Unlike for the UNICODE setting, you can build your program in dnl shared mode against a static build of wxWidgets. Thus we have the dnl following option which allows these mixtures. E.g. dnl dnl ./configure --disable-shared --with-wxshared dnl dnl will build your library in static mode against the first available dnl shared build of wxWidgets. dnl dnl Note that's not possible to do the viceversa: dnl dnl ./configure --enable-shared --without-wxshared dnl dnl Doing so you would try to build your library in shared mode against a static dnl build of wxWidgets. This is not possible (you would mix PIC and non PIC code) ! dnl A check for this combination of options is in WX_DETECT_STANDARD_OPTION_VALUES dnl (where we know what 'auto' should be expanded to). dnl dnl If you try to build something in ANSI mode against a UNICODE build dnl of wxWidgets or in RELEASE mode against a DEBUG build of wxWidgets, dnl then at best you'll get ton of linking errors ! dnl ************************ ifelse(index([$1], [wxshared]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxshared], [WX_SHARED], [Force building against a shared build of wxWidgets, even if --disable-shared is given], [auto], [], [1]) ]) dnl Just like for SHARED and WX_SHARED it may happen that some adventurous dnl peoples will want to mix a wxWidgets release build with a debug build of dnl his app/lib. So, we have both DEBUG and WX_DEBUG variables. ifelse(index([$1], [wxdebug]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxdebug], [WX_DEBUG], [Force building against a debug build of wxWidgets, even if --disable-debug is given], [auto], [], [1]) ]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-wxversion since it's an option dnl which must be able to accept the auto|28|29... values ifelse(index([$1], [wxversion]), [-1],, [ AC_ARG_WITH([wxversion], AC_HELP_STRING([--with-wxversion], [Build against a specific version of wxWidgets (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-wxversion option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) WX_VERSION="auto" else wx_requested_major_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\1/'` wx_requested_minor_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\2/'` dnl both vars above must be exactly 1 digit if test "${#wx_requested_major_version}" != "1" -o \ "${#wx_requested_minor_version}" != "1" ; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, 2.8, 2.9) ]) fi WX_VERSION="$wx_requested_major_version"".""$wx_requested_minor_version" AC_MSG_RESULT([$WX_VERSION]) fi ]) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" echo "[[dbg]] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" echo "[[dbg]] SHARED: $SHARED, WX_SHARED: $WX_SHARED" echo "[[dbg]] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" echo "[[dbg]] VERSION: $VERSION, WX_VERSION: $WX_VERSION" fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl dnl Sets the WXCONFIG_FLAGS string using the SHARED,DEBUG,UNICODE variable values dnl which are different from "auto". dnl Thus this macro needs to be called only once all options have been set. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS], [ if test "$WX_SHARED" = "1" ; then WXCONFIG_FLAGS="--static=no " elif test "$WX_SHARED" = "0" ; then WXCONFIG_FLAGS="--static=yes " fi if test "$WX_DEBUG" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " elif test "$WX_DEBUG" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " fi dnl The user should have set WX_UNICODE=UNICODE if test "$WX_UNICODE" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " elif test "$WX_UNICODE" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " fi if test "$TOOLKIT" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " fi if test "$WX_VERSION" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_VERSION " fi dnl strip out the last space of the string WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" fi ]) dnl --------------------------------------------------------------------------- dnl _WX_SELECTEDCONFIG_CHECKFOR([RESULTVAR], [STRING], [MSG] dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Outputs the given MSG. Then searches the given STRING in the wxWidgets dnl additional CPP flags and put the result of the search in WX_$RESULTVAR dnl also adding the "yes" or "no" message result to MSG. dnl --------------------------------------------------------------------------- AC_DEFUN([_WX_SELECTEDCONFIG_CHECKFOR], [ if test "$$1" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([$3]) dnl set WX_$1 variable to 1 if the $WX_SELECTEDCONFIG contains the $2 dnl string or to 0 otherwise. dnl NOTE: 'expr match STRING REGEXP' cannot be used since on Mac it dnl doesn't work; we use 'expr STRING : REGEXP' instead WX_$1=$(expr "$WX_SELECTEDCONFIG" : ".*$2.*") if test "$WX_$1" != "0"; then WX_$1=1 AC_MSG_RESULT([yes]) ifelse([$4], , :, [$4]) else WX_$1=0 AC_MSG_RESULT([no]) ifelse([$5], , :, [$5]) fi else dnl Use the setting given by the user WX_$1=$$1 fi ]) dnl --------------------------------------------------------------------------- dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl Detects the values of the following variables: dnl 1) WX_VERSION dnl 2) WX_UNICODE dnl 3) WX_DEBUG dnl 4) WX_SHARED (and also WX_STATIC) dnl 5) WX_PORT dnl from the previously selected wxWidgets build; this macro in fact must be dnl called *after* calling the WX_CONFIG_CHECK macro. dnl dnl Note that the WX_VERSION_MAJOR, WX_VERSION_MINOR symbols are already set dnl by WX_CONFIG_CHECK macro dnl --------------------------------------------------------------------------- AC_DEFUN([WX_DETECT_STANDARD_OPTION_VALUES], [ WX_VERSION="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" dnl The wx-config we are using understands the "--selected_config" dnl option which returns an easy-parseable string ! WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Using wx-config --selected-config" echo "[[dbg]] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" fi dnl we could test directly for WX_SHARED with a line like: dnl _WX_SELECTEDCONFIG_CHECKFOR([SHARED], [shared], dnl [if wxWidgets was built in SHARED mode]) dnl but wx-config --selected-config DOES NOT outputs the 'shared' dnl word when wx was built in shared mode; it rather outputs the dnl 'static' word when built in static mode. if test $WX_SHARED = "1"; then STATIC=0 elif test $WX_SHARED = "0"; then STATIC=1 elif test $WX_SHARED = "auto"; then STATIC="auto" fi dnl Now set the WX_UNICODE, WX_DEBUG, WX_STATIC variables _WX_SELECTEDCONFIG_CHECKFOR([UNICODE], [unicode], [if wxWidgets was built with UNICODE enabled]) _WX_SELECTEDCONFIG_CHECKFOR([DEBUG], [debug], [if wxWidgets was built in DEBUG mode]) _WX_SELECTEDCONFIG_CHECKFOR([STATIC], [static], [if wxWidgets was built in STATIC mode]) dnl init WX_SHARED from WX_STATIC if test "$WX_STATIC" != "0"; then WX_SHARED=0 else WX_SHARED=1 fi AC_SUBST(WX_UNICODE) AC_SUBST(WX_DEBUG) AC_SUBST(WX_SHARED) dnl detect the WX_PORT to use if test "$TOOLKIT" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([which wxWidgets toolkit was selected]) WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*") WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") WX_BASEPORT=$(expr "$WX_SELECTEDCONFIG" : ".*base.*") WX_COCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*cocoa.*") WX_OSXCOCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_cocoa.*") WX_PORT="unknown" if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi if test "$WX_BASEPORT" != "0"; then WX_PORT="base"; fi if test "$WX_COCOAPORT" != "0"; then WX_PORT="cocoa"; fi if test "$WX_OSXCOCOAPORT" != "0"; then WX_PORT="osx_cocoa"; fi dnl check at least one of the WX_*PORT has been set ! if test "$WX_PORT" = "unknown" ; then AC_MSG_ERROR([ Cannot detect the currently installed wxWidgets port ! Please check your 'wx-config --cxxflags'... ]) fi AC_MSG_RESULT([$WX_PORT]) else dnl Use the setting given by the user if test -n "$TOOLKIT" ; then WX_PORT=$TOOLKIT else dnl try with PORT WX_PORT=$PORT fi fi AC_SUBST(WX_PORT) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Values of all WX_* options after final detection:" echo "[[dbg]] WX_DEBUG: $WX_DEBUG" echo "[[dbg]] WX_UNICODE: $WX_UNICODE" echo "[[dbg]] WX_SHARED: $WX_SHARED" echo "[[dbg]] WX_VERSION: $WX_VERSION" echo "[[dbg]] WX_PORT: $WX_PORT" fi dnl Avoid problem described in the WX_STANDARD_OPTIONS which happens when dnl the user gives the options: dnl ./configure --enable-shared --without-wxshared dnl or just do dnl ./configure --enable-shared dnl but there is only a static build of wxWidgets available. if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then AC_MSG_ERROR([ Cannot build shared library against a static build of wxWidgets ! This error happens because the wxWidgets build which was selected has been detected as static while you asked to build $PACKAGE_NAME as shared library and this is not possible. Use the '--disable-shared' option to build $PACKAGE_NAME as static library or '--with-wxshared' to use wxWidgets as shared library. ]) fi dnl now we can finally update the DEBUG,UNICODE,SHARED options dnl to their final values if they were set to 'auto' if test "$DEBUG" = "auto"; then DEBUG=$WX_DEBUG dnl in case user wants a BUILD=debug/release var... if test "$DEBUG" = "1"; then BUILD="debug" elif test "$DEBUG" = ""; then BUILD="release" fi fi if test "$UNICODE" = "auto"; then UNICODE=$WX_UNICODE fi if test "$SHARED" = "auto"; then SHARED=$WX_SHARED fi if test "$TOOLKIT" = "auto"; then TOOLKIT=$WX_PORT fi ]) dnl --------------------------------------------------------------------------- dnl WX_BOOLOPT_SUMMARY([name of the boolean variable to show summary for], dnl [what to print when var is 1], dnl [what to print when var is 0]) dnl dnl Prints $2 when variable $1 == 1 and prints $3 when variable $1 == 0. dnl This macro mainly exists just to make configure.ac scripts more readable. dnl dnl NOTE: you need to use the [" my message"] syntax for 2nd and 3rd arguments dnl if you want that m4 avoid to throw away the spaces prefixed to the dnl argument value. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_BOOLOPT_SUMMARY], [ if test "x$$1" = "x1" ; then echo $2 elif test "x$$1" = "x0" ; then echo $3 else echo "$1 is $$1" fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl Shows a summary message to the user about the WX_* variable contents. dnl This macro is used typically at the end of the configure script. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG], [ echo echo " The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION" echo " has the following settings:" WX_BOOLOPT_SUMMARY([WX_DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([WX_UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([WX_SHARED], [" - SHARED mode"], [" - STATIC mode"]) echo " - VERSION: $WX_VERSION_FULL" echo " - PORT: $WX_PORT" ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN, WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl Like WX_STANDARD_OPTIONS_SUMMARY_MSG macro but these two macros also gives info dnl about the configuration of the package which used the wxpresets. dnl dnl Typical usage: dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl echo " - Package setting 1: $SETTING1" dnl echo " - Package setting 2: $SETTING1" dnl ... dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN], [ echo echo " ----------------------------------------------------------------" echo " Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed." echo " Summary of main configuration settings for $PACKAGE_NAME:" WX_BOOLOPT_SUMMARY([DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([SHARED], [" - SHARED mode"], [" - STATIC mode"]) ]) AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_END], [ WX_STANDARD_OPTIONS_SUMMARY_MSG echo echo " Now, just run make." echo " ----------------------------------------------------------------" echo ]) dnl --------------------------------------------------------------------------- dnl Deprecated macro wrappers dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [WX_CONFIG_OPTIONS]) AC_DEFUN([AM_PATH_WXCONFIG], [ WX_CONFIG_CHECK([$1],[$2],[$3],[$4],[$5]) ]) aMule-2.3.1/m4/gettext.m40000644000175000017470000005730111657306247013753 0ustar topiusers# gettext.m4 serial 17 (gettext-0.11.5) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2002. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define(gt_included_intl, ifelse([$1], [external], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], gt_cv_func_gnugettext_libintl, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext_libintl=yes ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. INTLOBJS="\$(GETTOBJS)" BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) AC_SUBST(INTLOBJS) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for all prerequisites of the po subdirectory, dnl except for USE_NLS. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Search for GNU xgettext 0.11 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then AM_LC_MESSAGES fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) aMule-2.3.1/m4/build-tools.m40000644000175000017470000001021411575347521014513 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # # # This package has been tested with GNU Autoconf 2.59, and not guaranteed to # work with any other version. However, you only need to worry about it if # you're cross-compiling. # _AC_CHECK_BUILD_PREFIX # ----------------------- # Checks and sets the build prefix, if it is given by --build. AC_DEFUN([_AC_CHECK_BUILD_PREFIX], [ac_build_prefix= test -n "$build_alias" && ac_build_prefix=$build_alias- ]) # AC_CHECK_BUILD_PREFIX # AC_PROG_BUILD_CC([COMPILER ...]) # -------------------------- # COMPILER ... is a space separated list of C compilers to search for. # This just gives the user an opportunity to specify an alternative # search list for the C compiler. # # IMPORTANT: Run all other compiler tests *before* calling this macro! # # This is a stripped-down check, it checks only what we need, # i.e. BUILD_CC and BUILD_EXEEXT # AC_DEFUN([AC_PROG_BUILD_CC], [AC_REQUIRE([_AC_CHECK_BUILD_PREFIX])dnl dnl Set new names of important variables. pushdef([ac_tool_prefix], [ac_build_prefix])dnl pushdef([CC], [BUILD_CC])dnl pushdef([EXEEXT], [BUILD_EXEEXT])dnl pushdef([ac_cv_exeext], [ac_cv_build_exeext])dnl pushdef([ac_exeext], [ac_build_exeext])dnl dnl Don't use the values for the cross-compiler pushdef([CPPFLAGS], [BUILD_CPPFLAGS])dnl pushdef([CFLAGS], [BUILD_CFLAGS])dnl pushdef([LDFLAGS], [BUILD_LDFLAGS])dnl pushdef([LIBS], [BUILD_LIBS])dnl # Even if we're cross-compiling, we want a compiler here # that is not a cross-compiler. saved_cross=$cross_compiling cross_compiling=no dnl From now on, this is just a mere copy of Autoconf's AC_PROG_CC macro. AC_LANG_PUSH(C)dnl m4_ifval([$1], [AC_CHECK_TOOLS(CC, [$1])], [AC_CHECK_TOOL(CC, gcc) if test -z "$CC"; then AC_CHECK_TOOL(CC, cc) fi if test -z "$CC"; then AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc) fi if test -z "$CC"; then AC_CHECK_TOOLS(CC, cl) fi ]) test -z "$CC" && AC_MSG_FAILURE([no acceptable C compiler found in \$PATH]) # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for _AC_LANG compiler version" >&AS_MESSAGE_LOG_FD ac_compiler=`set X $ac_compile; echo $[2]` _AC_EVAL([$ac_compiler --version &AS_MESSAGE_LOG_FD]) _AC_EVAL([$ac_compiler -v &AS_MESSAGE_LOG_FD]) _AC_EVAL([$ac_compiler -V &AS_MESSAGE_LOG_FD]) dnl Forcibly include _AC_COMPILER_EXEEXT, to determine the build exeext. _AC_COMPILER_EXEEXT dnl End of copy, here some parts are stripped out. We only want a working C dnl compiler, and doesn't need the objext, the preprocessor, the dependency dnl style, whether it's gnu or not, etc. # Restore configuration environment cross_compiling=$saved_cross dnl Restore variable names. popdef([LIBS])dnl popdef([LDFLAGS])dnl popdef([CFLAGS])dnl popdef([CPPFLAGS])dnl popdef([ac_exeext])dnl popdef([ac_cv_exeext])dnl popdef([EXEEXT])dnl popdef([CC])dnl popdef([ac_tool_prefix])dnl dnl dnl AC_LANG_POP(C) must be called after the variable names are restored, thus dnl it will restore the correct (host) environment, not the build environment. AC_LANG_POP(C)dnl dnl Substitute variables for the build compiler AC_SUBST(BUILD_EXEEXT)dnl AC_SUBST(BUILD_CPPFLAGS)dnl AC_SUBST(BUILD_CFLAGS)dnl AC_SUBST(BUILD_LDFLAGS)dnl ]) # AC_PROG_BUILD_CC aMule-2.3.1/m4/qt.m40000644000175000017470000000353411575347521012711 0ustar topiusersAC_DEFUN([QT_CONFIG_OPTIONS], [ AC_ARG_WITH( [moc], [AS_HELP_STRING([--with-moc=PATH], [Search in PATH for Qt's meta object compiler])], [QT_MOC=$withval], [QT_MOC=""]) ]) AC_DEFUN([CHECK_MOC_VERSION], [ AS_IF([test -z ${QT_MOC}], [ AC_PATH_PROGS(QT_MOC, moc-qt4 moc) AS_IF([test -z ${QT_MOC}], [ echo moc not found exit 1 ]) ], [ AC_MSG_CHECKING(for moc) AS_IF([test -x ${QT_MOC}], [ AC_MSG_RESULT(${QT_MOC}) AC_SUBST(QT_MOC) ], [ AC_MSG_RESULT("not found") QT_MOC="not found" exit 1 ]) ]) AS_IF([test "${QT_MOC}" != "not found"], [ AC_MSG_CHECKING(for moc version >= 4) QT_MOC_VERSION=`${QT_MOC} -v 2>&1 | sed -e 's/^.* (/(/'` AS_IF([test `echo ${QT_MOC_VERSION} | sed -e 's/^.* //' -e 's/\..*$//'` = 4], [ AC_MSG_RESULT(found ${QT_MOC_VERSION}) ], [ AC_MSG_RESULT(not found ${QT_MOC_VERSION} is too old) QT_MOC="not found" exit 1 ]) ]) ]) AC_DEFUN([CHECK_QT_HEADERS], [ AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_MSG_CHECKING(for qt) AS_IF([test `${PKG_CONFIG} QtCore` --exists && `${PKG_CONFIG} QtGui --exists`], [ AC_MSG_RESULT(found) AC_MSG_CHECKING(for qt core cflags) QT_CORE_CXXFLAGS=`${PKG_CONFIG} --cflags QtCore` AC_MSG_RESULT($QT_CORE_CFLAGS) AC_MSG_CHECKING(for qt core libs) QT_CORE_LIBS=`${PKG_CONFIG} --libs QtCore` AC_MSG_RESULT($QT_CORE_LIBS) AC_MSG_CHECKING(for qt gui cflags) QT_GUI_CXXFLAGS=`${PKG_CONFIG} --cflags QtGui` AC_MSG_RESULT($QT_GUI_CFLAGS) AC_MSG_CHECKING(for qt gui libs) QT_GUI_LIBS=`${PKG_CONFIG} --libs QtGui` AC_MSG_RESULT($QT_GUI_LIBS) ], [AC_MSG_RESULT(not found)] exit 1 ) AS_IF([test `${PKG_CONFIG} QtDBus --modversion | sed -e 's/\.//g'` -ge 470 ], [ QT_DBUS_LDFLAGS="-lQtDBus" AC_SUBST(QT_DBUS_LDFLAGS) ]) AC_SUBST(QT_CORE_CXXFLAGS) AC_SUBST(QT_CORE_LIBS) AC_SUBST(QT_GUI_CXXFLAGS) AC_SUBST(QT_GUI_LIBS) ]) aMule-2.3.1/m4/GeoIP.m40000644000175000017470000000754411575347521013235 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl --------------------------------------------------------------------------- dnl MULE_CHECK_GEOIP dnl dnl Checks if the GeoIP library is requested, exists, and whether it should and dnl could be linked statically. dnl --------------------------------------------------------------------------- AC_DEFUN([MULE_CHECK_GEOIP], [ MULE_ARG_ENABLE([geoip], [no], [compile with GeoIP IP2Country library]) MULE_IF_ENABLED([geoip], [ AC_ARG_WITH([geoip-headers], AS_HELP_STRING([--with-geoip-headers=DIR], [GeoIP include files location]), [GEOIP_CPPFLAGS="-I$withval"]) AC_ARG_WITH([geoip-lib], AS_HELP_STRING([--with-geoip-lib=DIR], [GeoIP library location]), [GEOIP_LDFLAGS="-L$withval"]) MULE_BACKUP([CPPFLAGS]) MULE_APPEND([CPPFLAGS], [$GEOIP_CPPFLAGS]) MULE_BACKUP([LDFLAGS]) MULE_APPEND([LDFLAGS], [$GEOIP_LDFLAGS]) AC_CHECK_HEADER([GeoIP.h], [ AS_IF([test x$SYS = xwin32], [ AC_MSG_CHECKING([for WinSock library needed by GeoIP]) # Actually, we might not need any if GeoIP is linked as a .dll # - but that's even harder to check for AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ #include #ifdef _WINSOCK2_H I do know it's not the best approach, but at least works with MinGW stock headers. (tested with w32api-3.12) #endif ]]) ], [ GEOIP_WINSOCK_LIB="-lwsock32" ], [ GEOIP_WINSOCK_LIB="-lws2_32" ]) AC_MSG_RESULT([$GEOIP_WINSOCK_LIB]) ]) AC_CHECK_LIB([GeoIP], [GeoIP_open], [ AC_DEFINE([SUPPORT_GEOIP], [1], [Define if you want GeoIP support.]) GEOIP_LIBS="-lGeoIP" AS_IF([test x$SYS = xwin32], [MULE_APPEND([GEOIP_LIBS], [$GEOIP_WINSOCK_LIB])]) MULE_APPEND([GEOIP_CPPFLAGS], [-DENABLE_IP2COUNTRY=1]) AC_ARG_WITH([geoip-static], AS_HELP_STRING([--with-geoip-static], [Explicitly link GeoIP statically (default=no)]), [ AS_IF([test "$withval" != "no" -a ${enable_static:-no} = no], [ MULE_BACKUP([LIBS]) MULE_PREPEND([LIBS], [-Wl,-Bstatic $GEOIP_LIBS -Wl,-Bdynamic]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include ]], [[ GeoIP *g = GeoIP_new(GEOIP_STANDARD); ]]) ], [ GEOIP_LIBS="-Wl,-Bstatic $GEOIP_LIBS -Wl,-Bdynamic" ], [ MULE_WARNING([Cannot link GeoIP statically, because your linker ($LD) does not support it.]) ]) MULE_RESTORE([LIBS]) ]) ]) ], [ MULE_ENABLEVAR([geoip])=disabled MULE_WARNING([GeoIP support has been disabled because the GeoIP libraries were not found]) ], [${GEOIP_WINSOCK_LIB:-}]) ], [ MULE_ENABLEVAR([geoip])=disabled MULE_WARNING([GeoIP support has been disabled because the GeoIP header files were not found]) ]) MULE_RESTORE([CPPFLAGS]) MULE_RESTORE([LDFLAGS]) ]) ]) AC_SUBST([GEOIP_CPPFLAGS])dnl AC_SUBST([GEOIP_LDFLAGS])dnl AC_SUBST([GEOIP_LIBS])dnl aMule-2.3.1/m4/codeset.m40000644000175000017470000000157611575347521013717 0ustar topiusers# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) aMule-2.3.1/m4/ulonglong.m40000644000175000017470000000200011575347521014254 0ustar topiusers# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40) dnl Copyright (C) 1999-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], [ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], [unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull;], ac_cv_type_unsigned_long_long=yes, ac_cv_type_unsigned_long_long=no)]) if test $ac_cv_type_unsigned_long_long = yes; then AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, [Define if you have the unsigned long long type.]) fi ]) aMule-2.3.1/m4/uintmax_t.m40000644000175000017470000000211411575347521014266 0ustar topiusers# uintmax_t.m4 serial 6 (gettext-0.11) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_PREREQ(2.13) # Define uintmax_t to `unsigned long' or `unsigned long long' # if does not exist. AC_DEFUN([jm_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, [Define to unsigned long or unsigned long long if and don't define.]) fi ]) aMule-2.3.1/m4/lcmessage.m40000644000175000017470000000261611575347521014230 0ustar topiusers# lcmessage.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([AM_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) aMule-2.3.1/m4/inttypes-pri.m40000644000175000017470000000222711575347521014732 0ustar topiusers# inttypes-pri.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_REQUIRE([gt_HEADER_INTTYPES_H]) if test $gt_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], gt_cv_inttypes_pri_broken, [ AC_TRY_COMPILE([#include #ifdef PRId32 char *p = PRId32; #endif ], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, [Define if exists and defines unusable PRI* macros.]) fi ]) aMule-2.3.1/m4/intdiv0.m40000644000175000017470000000356511575347521013646 0ustar topiusers# intdiv0.m4 serial 1 (gettext-0.11.3) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ AC_TRY_RUN([ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. case "$host_cpu" in alpha* | i[34567]86 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac ]) ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) aMule-2.3.1/m4/inttypes_h.m40000644000175000017470000000207311575347521014450 0ustar topiusers# inttypes_h.m4 serial 4 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_inttypes_h=yes, jm_ac_cv_header_inttypes_h=no)]) if test $jm_ac_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) aMule-2.3.1/m4/libpng.m40000644000175000017470000001264611644117343013536 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl --------------------------------------------------------------------------- dnl MULE_CHECK_LIBPNG([VERSION = 1.2.0], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl adds support for --with-libpng-prefix and --with-libpng-config dnl command line options dnl dnl Test for libpng, and define LIBPNG_CFLAGS, LIBPNG_LIBS and LIBPNG_CONFIG_NAME dnl environment variable to override the default name of the libpng-config script dnl to use. Set LIBPNG_CONFIG_PATH to specify the full path to libpng-config - dnl in this case the macro won't even waste time on tests for its existence. dnl --------------------------------------------------------------------------- AC_DEFUN([MULE_CHECK_LIBPNG], [dnl m4_define([REQUIRED_VERSION], [m4_ifval([$1], [$1], [1.2.0])])dnl m4_define([REQUIRED_VERSION_MAJOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl m4_define([REQUIRED_VERSION_MINOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl m4_define([REQUIRED_VERSION_MICRO], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl AC_ARG_WITH([libpng-prefix], [AS_HELP_STRING([--with-libpng-prefix=PREFIX], [prefix where libpng is installed (optional)])]) AC_ARG_WITH([libpng-config], [AS_HELP_STRING([--with-libpng-config=CONFIG], [libpng-config script to use (optional)])]) LIBPNG_VERSION= # do we have libpng-config name: it can be libpng-config or libpng12-config or ... AS_IF([test x${LIBPNG_CONFIG_NAME+set} != xset], [LIBPNG_CONFIG_NAME=libpng-config]) AS_IF([test -n "$with_libpng_config"], [LIBPNG_CONFIG_NAME="$with_libpng_config"]) # deal with optional prefix AS_IF([test -n "$with_libpng_prefix"], [LIBPNG_LOOKUP_PATH="$with_libpng_prefix/bin"]) # don't search the PATH if LIBPNG_CONFIG_NAME is absolute filename AS_IF([test -x "$LIBPNG_CONFIG_NAME"], [ AC_MSG_CHECKING([for libpng-config]) LIBPNG_CONFIG_PATH="$LIBPNG_CONFIG_NAME" AC_MSG_RESULT($LIBPNG_CONFIG_PATH) ], [AC_PATH_PROG([LIBPNG_CONFIG_PATH], [$LIBPNG_CONFIG_NAME], [no], [$LIBPNG_LOOKUP_PATH:$PATH])]) AS_IF([test ${LIBPNG_CONFIG_PATH:-no} != no], [ AC_MSG_CHECKING([for libpng version >= REQUIRED_VERSION]) LIBPNG_CONFIG_WITH_ARGS="$LIBPNG_CONFIG_PATH $libpng_config_args" LIBPNG_VERSION=`$LIBPNG_CONFIG_WITH_ARGS --version` libpng_config_major_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/']` libpng_config_minor_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/']` libpng_config_micro_version=`echo $LIBPNG_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/']` libpng_ver_ok= MULE_IF([test $libpng_config_major_version -gt REQUIRED_VERSION_MAJOR], [libpng_ver_ok=yes], [test $libpng_config_major_version -eq REQUIRED_VERSION_MAJOR], [ MULE_IF([test $libpng_config_minor_version -gt REQUIRED_VERSION_MINOR], [libpng_ver_ok=yes], [test $libpng_config_minor_version -eq REQUIRED_VERSION_MINOR], [MULE_IF([test $libpng_config_micro_version -ge REQUIRED_VERSION_MICRO], [libpng_ver_ok=yes])]) ]) AS_IF([test -z "$libpng_ver_ok"], [ AS_IF([test -z "$LIBPNG_VERSION"], [AC_MSG_RESULT([no])], [ AC_MSG_RESULT([no (version $LIBPNG_VERSION is not new enough)]) LIBPNG_VERSION= ]) ], [ LIBPNG_LIBS=`$LIBPNG_CONFIG_WITH_ARGS --libs` LIBPNG_LDFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --ldflags | sed -e "s/ *${LIBPNG_LIBS}$//"` LIBPNG_CFLAGS=`$LIBPNG_CONFIG_WITH_ARGS --cflags` AC_MSG_RESULT([yes (version $LIBPNG_VERSION)]) AC_MSG_CHECKING([if libpng is usable]) SAVED_CFLAGS=$CFLAGS SAVED_LDFLAGS=$LDFLAGS SAVED_LIBS=$LIBS CFLAGS+=" $LIBPNG_CFLAGS" LDFLAGS+=" $LIBPNG_LDFLAGS" LIBS+=" $LIBPNG_LIBS" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include #include ]], [[ png_uint_32 libpng_vn = png_access_version_number(); printf("\nlibpng version %i\n\n", libpng_vn); ]]) ], [ AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no (failed to compile and link test program)]) LIBPNG_LIBS= LIBPNG_LDFLAGS= LIBPNG_CFLAGS= LIBPNG_VERSION= ]) CFLAGS=$SAVED_CFLAGS LDFLAGS=$SAVED_LDFLAGS LIBS=$SAVED_LIBS ]) ]) AS_IF([test -n "$LIBPNG_VERSION"], [$2], [$3]) AC_SUBST([LIBPNG_CFLAGS])dnl AC_SUBST([LIBPNG_LDFLAGS])dnl AC_SUBST([LIBPNG_LIBS])dnl m4_undefine([REQUIRED_VERSION])dnl m4_undefine([REQUIRED_VERSION_MAJOR])dnl m4_undefine([REQUIRED_VERSION_MINOR])dnl m4_undefine([REQUIRED_VERSION_MICRO])dnl ]) aMule-2.3.1/m4/lib-prefix.m40000644000175000017470000001175511575347521014332 0ustar topiusers# lib-prefix.m4 serial 1 (gettext-0.11) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) aMule-2.3.1/m4/cryptopp.m40000644000175000017470000001465611575347521014154 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl -------------------------------------------------------------------------- dnl MULE_CHECK_CRYPTOPP([VERSION = 5.1], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl Check for cryptopp library dnl -------------------------------------------------------------------------- dnl dnl This macro sets these variables: dnl - CRYPTOPP_PREFIX dnl This is the user or system directory where crypto++ is installed or sources dnl - CRYPTOPP_VERSION_STRING dnl Something like "5.5.2" dnl - CRYPTOPP_VERSION_NUMBER dnl Something like 5005002 dnl - CRYPTOPP_STYLE dnl "sources", "installed" or "gentoo_debian" dnl - CRYPTOPP_LIB_NAME dnl "cryptopp" or "crypto++" dnl - CRYPTOPP_INCLUDE_PREFIX dnl The string that goes here: #include <@CRYPTOPP_INCLUDE_PREFIX@/rsa.h> dnl - CRYPTOPP_CPPFLAGS dnl Flags to be added to CPPFLAGS dnl - CRYPTOPP_LDFLAGS dnl Flags to be added to LDFLAGS dnl - CRYPTOPP_LIBS dnl Library to be added to LIBS dnl dnl The CRYPTOPP_CPPFLAGS, CRYPTOPP_LDFLAGS and CRYPTOPP_LIBS variables are also substituted. dnl dnl Worth notice: dnl - cryptopp_includedir dnl The string that goes in -I on CPPFLAGS dnl - cryptopp_libdir dnl The string that goes in -L on LDFLAGS dnl - cryptopp_header_path dnl The file we use to discover the version of cryptopp dnl AC_DEFUN([MULE_CHECK_CRYPTOPP], [dnl AC_REQUIRE([AC_PROG_EGREP])dnl m4_define([MIN_CRYPTO_VERSION], [m4_ifval([$1], [$1], [5.1])])dnl AC_ARG_WITH([crypto-prefix], [AS_HELP_STRING([--with-crypto-prefix=PREFIX], [prefix where crypto++ is installed])]) AC_MSG_CHECKING([for crypto++ version >= MIN_CRYPTO_VERSION]) cryptopp_file_with_version="cryptlib.h" CRYPTOPP_STYLE="unknown" CRYPTOPP_LIB_NAME="unknown" cryptopp_includedir="unknown" CRYPTOPP_INCLUDE_PREFIX="unknown" cryptopp_libdir="unknown" AS_IF([test -n "$with_crypto_prefix"], [ CRYPTOPP_PREFIX="$with_crypto_prefix" # Find the Cryptopp header in the user-provided location MULE_IF([test -f $CRYPTOPP_PREFIX/$cryptopp_file_with_version], [ CRYPTOPP_STYLE="sources" CRYPTOPP_LIB_NAME="cryptopp" cryptopp_includedir= CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_PREFIX" cryptopp_libdir= ], [test -f $CRYPTOPP_PREFIX/include/cryptopp/$cryptopp_file_with_version], [ CRYPTOPP_STYLE="installed" CRYPTOPP_LIB_NAME="cryptopp" cryptopp_includedir="$CRYPTOPP_PREFIX/include" CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" cryptopp_libdir="$CRYPTOPP_PREFIX/lib" ], [test -f $CRYPTOPP_PREFIX/include/crypto++/$cryptopp_file_with_version], [ # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package CRYPTOPP_STYLE="gentoo_debian" CRYPTOPP_LIB_NAME="crypto++" cryptopp_includedir="$CRYPTOPP_PREFIX/include" CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" cryptopp_libdir="$CRYPTOPP_PREFIX/lib" ]) ], [ for CRYPTOPP_PREFIX in /usr /usr/local /opt /opt/local /usr/pkg /mingw ; do # Find the Cryptopp header in system locations MULE_IF([test -f $CRYPTOPP_PREFIX/$cryptopp_file_with_version], [ CRYPTOPP_STYLE="sources" CRYPTOPP_LIB_NAME="cryptopp" cryptopp_includedir= CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_PREFIX" cryptopp_libdir= break ], [test -f $CRYPTOPP_PREFIX/include/cryptopp/$cryptopp_file_with_version], [ CRYPTOPP_STYLE="installed" CRYPTOPP_LIB_NAME="cryptopp" cryptopp_includedir="$CRYPTOPP_PREFIX/include" CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" cryptopp_libdir="$CRYPTOPP_PREFIX/lib" break ], [test -f $CRYPTOPP_PREFIX/include/crypto++/$cryptopp_file_with_version], [ # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package CRYPTOPP_STYLE="gentoo_debian" CRYPTOPP_LIB_NAME="crypto++" cryptopp_includedir="$CRYPTOPP_PREFIX/include" CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" cryptopp_libdir="$CRYPTOPP_PREFIX/lib" break ]) done ]) AS_IF([test $CRYPTOPP_STYLE = "unknown"], [result=no; resultstr=""], [ # Find out the crypto++ version and check against the minimum required cryptopp_header_path="${cryptopp_includedir+$cryptopp_includedir/}$CRYPTOPP_INCLUDE_PREFIX/$cryptopp_file_with_version" CRYPTOPP_VERSION_STRING=`$EGREP "Reference Manual|API Reference" $cryptopp_header_path | sed -e ['s/[^0-9]*\([0-9.]*\).*/\1/']` CRYPTOPP_VERSION_NUMBER=`echo $CRYPTOPP_VERSION_STRING | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}'` minvers=`echo MIN_CRYPTO_VERSION | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}'` AS_IF([test -n "$CRYPTOPP_VERSION_NUMBER" && test "$CRYPTOPP_VERSION_NUMBER" -ge $minvers], [ result=yes resultstr=" (version $CRYPTOPP_VERSION_STRING, $CRYPTOPP_STYLE)" AS_IF([test -n "$cryptopp_includedir"], [CRYPTOPP_CPPFLAGS="-I$cryptopp_includedir"], [CRYPTOPP_CPPFLAGS=]) AS_IF([test -n "$cryptopp_libdir"], [ CRYPTOPP_LDFLAGS="-L$cryptopp_libdir" CRYPTOPP_LIBS="-l$CRYPTOPP_LIB_NAME" ], [ CRYPTOPP_LDFLAGS= CRYPTOPP_LIBS="${CRYPTOPP_INCLUDE_PREFIX}/lib${CRYPTOPP_LIB_NAME}.a" ]) AH_TEMPLATE([CRYPTOPP_INCLUDE_PREFIX], [Define this to the include prefix of crypto++]) AC_DEFINE_UNQUOTED([CRYPTOPP_INCLUDE_PREFIX], $CRYPTOPP_INCLUDE_PREFIX) ], [ result=no resultstr=" (version $CRYPTOPP_VERSION_STRING is not new enough)" ]) ]) AC_MSG_RESULT([$result$resultstr]) AS_IF([test ${result:-no} = yes], [$2], [$3]) dnl Exported symbols AC_SUBST([CRYPTOPP_CPPFLAGS])dnl AC_SUBST([CRYPTOPP_LDFLAGS])dnl AC_SUBST([CRYPTOPP_LIBS])dnl m4_undefine([MIN_CRYPTO_VERSION])dnl ]) aMule-2.3.1/m4/progtest.m40000644000175000017470000000407411575347521014134 0ustar topiusers# progtest.m4 serial 2 (gettext-0.10.40) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) aMule-2.3.1/m4/plasmamule.m40000644000175000017470000000170611657246511014422 0ustar topiusersm4_define([DISABLE_PLASMAMULE], [MULE_ENABLEVAR([plasmamule])=disabled]) AC_DEFUN([PLASMAMULE_CHECKS], [ CHECK_MOC_VERSION AS_IF([test "${QT_MOC}" = "not found"], [DISABLE_PLASMAMULE]) MULE_IF_ENABLED([plasmamule], [ CHECK_QT_HEADERS AS_IF([test -z "${QT_CORE_CXXFLAGS}"], [DISABLE_PLASMAMULE]) ]) MULE_IF_ENABLED([plasmamule], [ KDE_CONFIG_CHECK AS_IF([test "${KDE4_CONFIG}" = "not found"], [DISABLE_PLASMAMULE]) ]) MULE_IF_ENABLED([plasmamule], [ KDE_HEADER_CHECK AS_IF([test -z ${KDE_HEADER_DIR}], [DISABLE_PLASMAMULE]) ]) MULE_IF_ENABLED([plasmamule], [ AS_IF([test -e `$BUILD_CC -print-file-name=libplasma.so` && test -e `$BUILD_CC -print-file-name=libkdecore.so`], [ KDE_APPLNK_PATH_CHECK KDE_SERVICE_PATH_CHECK KDE_MODULE_PATH_CHECK KDE_ICON_PATH_CHECK KDE_MIME_PATH_CHECK ], [DISABLE_PLASMAMULE]) ]) MULE_IF_ENABLED([debug], [ DEBUGFLAG="-D__DEBUG__" AC_SUBST(DEBUGFLAG) ]) ]) aMule-2.3.1/m4/isc-posix.m40000644000175000017470000000213311575347521014175 0ustar topiusers# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) aMule-2.3.1/m4/readline.m40000644000175000017470000000420011575347521014037 0ustar topiusersdnl dnl Copyright (c) 2003-2011 aMule Team (http://www.amule.org) dnl Copyright (c) 1995-2008 Free Software Foundation, Inc. dnl dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl Original file available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/vl_lib_readline.html dnl AC_DEFUN([VL_LIB_READLINE], [ AC_CACHE_CHECK([for a readline compatible library], vl_cv_lib_readline, [ ORIG_LIBS="$LIBS" for readline_lib in readline edit editline; do for termcap_lib in "" termcap curses ncurses; do if test -z "$termcap_lib"; then TRY_LIB="-l$readline_lib" else TRY_LIB="-l$readline_lib -l$termcap_lib" fi LIBS="$ORIG_LIBS $TRY_LIB" AC_TRY_LINK_FUNC(readline, vl_cv_lib_readline="$TRY_LIB") if test -n "$vl_cv_lib_readline"; then break fi done if test -n "$vl_cv_lib_readline"; then break fi done if test -z "$vl_cv_lib_readline"; then vl_cv_lib_readline="no" LIBS="$ORIG_LIBS" READLINE_LIBS="" else READLINE_LIBS="$vl_cv_lib_readline" fi ]) if test "$vl_cv_lib_readline" != "no"; then AC_DEFINE(HAVE_LIBREADLINE, 1, [Define if you have a readline compatible library]) AC_CHECK_HEADERS(readline.h readline/readline.h) AC_CACHE_CHECK([whether readline supports history], vl_cv_lib_readline_history, [ vl_cv_lib_readline_history="no" AC_TRY_LINK_FUNC(add_history, vl_cv_lib_readline_history="yes") ]) if test "$vl_cv_lib_readline_history" = "yes"; then AC_DEFINE(HAVE_READLINE_HISTORY, 1, [Define if your readline library has \`add_history']) AC_CHECK_HEADERS(history.h readline/history.h) fi fi AC_SUBST(READLINE_LIBS) LIBS="$ORIG_LIBS" ])dnl aMule-2.3.1/m4/lib-ld.m40000644000175000017470000000626011575347521013427 0ustar topiusers# lib-ld.m4 serial 1 (gettext-0.11) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi]) with_gnu_ld=$acl_cv_prog_gnu_ld ]) dnl From libtool-1.4. Sets the variable LD. AC_DEFUN([AC_LIB_PROG_LD], [AC_ARG_WITH(gnu-ld, [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) aMule-2.3.1/m4/gdlib.m40000644000175000017470000001143511575347521013345 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl --------------------------------------------------------------------------- dnl MULE_CHECK_GDLIB([VERSION = 2.0.0], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl adds support for --with-gdlib-prefix and --with-gdlib-config dnl command line options dnl dnl Test for gdlib, and define GDLIB_CFLAGS, GDLIB_LIBS and GDLIB_CONFIG_NAME dnl environment variable to override the default name of the gdlib-config script dnl to use. Set GDLIB_CONFIG_PATH to specify the full path to gdlib-config - dnl in this case the macro won't even waste time on tests for its existence. dnl --------------------------------------------------------------------------- AC_DEFUN([MULE_CHECK_GDLIB], [dnl m4_define([REQUIRED_VERSION], [m4_ifval([$1], [$1], [2.0.0])])dnl m4_define([REQUIRED_VERSION_MAJOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl m4_define([REQUIRED_VERSION_MINOR], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl m4_define([REQUIRED_VERSION_MICRO], [m4_bregexp(REQUIRED_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl AC_ARG_WITH([gdlib-prefix], [AS_HELP_STRING([--with-gdlib-prefix=PREFIX], [prefix where gdlib is installed (optional)])]) AC_ARG_WITH([gdlib-config], [AS_HELP_STRING([--with-gdlib-config=CONFIG], [gdlib-config script to use (optional)])]) GDLIB_VERSION= # do we have gdlib-config name: it can be gdlib-config or gd-config or ... AS_IF([test x${GDLIB_CONFIG_NAME+set} != xset], [GDLIB_CONFIG_NAME=gdlib-config]) AS_IF([test -n "$with_gdlib_config"], [GDLIB_CONFIG_NAME="$with_gdlib_config"]) # deal with optional prefix AS_IF([test -n "$with_gdlib_prefix"], [GDLIB_LOOKUP_PATH="$with_gdlib_prefix/bin"]) # don't search the PATH if GDLIB_CONFIG_NAME is absolute filename AS_IF([test -x "$GDLIB_CONFIG_NAME"], [ AC_MSG_CHECKING([for gdlib-config]) GDLIB_CONFIG_PATH="$GDLIB_CONFIG_NAME" AC_MSG_RESULT([$GDLIB_CONFIG_PATH]) ], [AC_PATH_PROG([GDLIB_CONFIG_PATH], [$GDLIB_CONFIG_NAME], [no], [$GDLIB_LOOKUP_PATH:$PATH])]) AS_IF([test ${GDLIB_CONFIG_PATH:-no} != no], [ AC_MSG_CHECKING([for gdlib version >= REQUIRED_VERSION]) GDLIB_CONFIG_WITH_ARGS="$GDLIB_CONFIG_PATH $gdlib_config_args" GDLIB_VERSION=`$GDLIB_CONFIG_WITH_ARGS --version` gdlib_config_major_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/']` gdlib_config_minor_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/']` gdlib_config_micro_version=`echo $GDLIB_VERSION | sed ['s/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/']` gdlib_ver_ok= MULE_IF([test $gdlib_config_major_version -gt REQUIRED_VERSION_MAJOR], [gdlib_ver_ok=yes], [test $gdlib_config_major_version -eq REQUIRED_VERSION_MAJOR], [ MULE_IF([test $gdlib_config_minor_version -gt REQUIRED_VERSION_MINOR], [gdlib_ver_ok=yes], [test $gdlib_config_minor_version -eq REQUIRED_VERSION_MINOR], [MULE_IF([test $gdlib_config_micro_version -ge REQUIRED_VERSION_MICRO], [gdlib_ver_ok=yes])]) ]) AS_IF([test -z "$gdlib_ver_ok"], [ AS_IF([test -z "$GDLIB_VERSION"], [AC_MSG_RESULT([no])], [ AC_MSG_RESULT([no (version $GDLIB_VERSION is not new enough)]) GDLIB_VERSION= ]) ], [ AC_MSG_RESULT([yes (version $GDLIB_VERSION)]) GDLIB_CFLAGS="`$GDLIB_CONFIG_WITH_ARGS --cflags`" GDLIB_LDFLAGS="`$GDLIB_CONFIG_WITH_ARGS --ldflags`" GDLIB_LIBS="`$GDLIB_CONFIG_WITH_ARGS --libs`" MULE_BACKUP([CFLAGS]) MULE_APPEND([CFLAGS], [$GDLIB_CFLAGS]) AC_CHECK_HEADER([gd.h],, [GDLIB_VERSION=]) MULE_RESTORE([CFLAGS]) ]) ]) AS_IF([test -n "$GDLIB_VERSION"], [$2], [$3]) AC_SUBST([GDLIB_CFLAGS])dnl AC_SUBST([GDLIB_LDFLAGS])dnl AC_SUBST([GDLIB_LIBS])dnl m4_undefine([REQUIRED_VERSION])dnl m4_undefine([REQUIRED_VERSION_MAJOR])dnl m4_undefine([REQUIRED_VERSION_MINOR])dnl m4_undefine([REQUIRED_VERSION_MICRO])dnl ]) aMule-2.3.1/m4/lib-link.m40000644000175000017470000005563311575347521013775 0ustar topiusers# lib-link.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L, dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. AC_DEFUN([AC_LIB_RPATH], [ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) aMule-2.3.1/m4/glibc21.m40000644000175000017470000000172711575347521013512 0ustar topiusers# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([jm_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) aMule-2.3.1/m4/fallocate.m40000644000175000017470000000454411575347521014221 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # AC_DEFUN([MULE_CHECK_FALLOCATE], [ AC_MSG_CHECKING([for fallocate]) MULE_BACKUP([CPPFLAGS]) MULE_APPEND([CPPFLAGS], [$WX_CPPFLAGS]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #define _GNU_SOURCE #ifdef HAVE_FCNTL_H # include #endif #include ]], [[ fallocate(0, 0, 0, 0); ]]) ], [ AH_TEMPLATE([HAVE_FALLOCATE], [Define to 1 if you have the fallocate() function.]) AC_DEFINE([HAVE_FALLOCATE]) AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) ]) MULE_RESTORE([CPPFLAGS]) AC_MSG_CHECKING([for SYS_fallocate]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include #include #include ]], [[ syscall(SYS_fallocate, 0, (loff_t)0, (loff_t)0); ]]) ], [ AH_TEMPLATE([HAVE_SYS_FALLOCATE], [Define to 1 if you have the SYS_fallocate syscall number.]) AC_DEFINE([HAVE_SYS_FALLOCATE]) AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) ]) AC_MSG_CHECKING([for posix_fallocate]) AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #define _XOPEN_SOURCE 600 #include #ifdef HAVE_FCNTL_H # include #endif ]], [[ posix_fallocate(0, 0, 0); ]]) ], [ AH_TEMPLATE([HAVE_POSIX_FALLOCATE], [Define to 1 if you have posix_fallocate() and it should be used.]) AC_DEFINE([HAVE_POSIX_FALLOCATE]) AC_MSG_RESULT([yes]) ], [ AC_MSG_RESULT([no]) ]) ]) aMule-2.3.1/m4/inttypes.m40000644000175000017470000000171711575347521014145 0ustar topiusers# inttypes.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H if exists and doesn't clash with # . AC_DEFUN([gt_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, [ AC_TRY_COMPILE( [#include #include ], [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) ]) if test $gt_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, [Define if exists and doesn't clash with .]) fi ]) aMule-2.3.1/m4/iconv.m40000644000175000017470000000665311575347521013410 0ustar topiusers# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) aMule-2.3.1/m4/pkg.m40000644000175000017470000001207311575347521013044 0ustar topiusers# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright (c) 2004-2011 Scott James Remnant ( scott@netsplit.com ). # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES aMule-2.3.1/m4/zlib.m40000644000175000017470000001130511575347521013220 0ustar topiusers# -*- Autoconf -*- # This file is part of the aMule Project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # Any parts of this program derived from the xMule, lMule or eMule project, # or contributed by third-party developers are copyrighted by their # respective authors. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl ---------------------------------------------------- dnl MULE_CHECK_ZLIB([MIN_ZLIB_VERSION = 1.1.4], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl check if zlib is on the system and is at least MIN_ZLIB_VERSION dnl dnl Add support for --with-zlib command-line parameter. dnl PREFIX may be a directory prefix where zlib is installed, e.g. /usr/local dnl or may be one of the following special keywords: dnl sys - use system zlib dnl dnl Will set the output variables: dnl ZLIB_CPPFLAGS dnl ZLIB_LDFLAGS dnl ZLIB_LIBS dnl ---------------------------------------------------- AC_DEFUN([MULE_CHECK_ZLIB], [dnl m4_define([MIN_ZLIB_VERSION], [m4_ifval([$1], [$1], [1.1.4])])dnl m4_define([zver_max], [m4_bregexp(MIN_ZLIB_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\1])])dnl m4_define([zver_mid], [m4_bregexp(MIN_ZLIB_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\2])])dnl m4_define([zver_min], [m4_bregexp(MIN_ZLIB_VERSION, [\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)], [\3])])dnl AC_ARG_WITH([zlib], AS_HELP_STRING([--with-zlib=PREFIX], [use zlib in PREFIX])) case "${with_zlib:-yes}" in no) $3 ;; yes | sys) ;; *) zlib_prefix="$with_zlib" esac MULE_BACKUP([CPPFLAGS]) MULE_BACKUP([LDFLAGS]) MULE_BACKUP([LIBS]) AS_IF([test -n "$zlib_prefix"], [ ZLIB_CPPFLAGS="-I$zlib_prefix/include" ZLIB_LDFLAGS="-L$zlib_prefix/lib" MULE_APPEND([CPPFLAGS], [$ZLIB_CPPFLAGS]) MULE_APPEND([LDFLAGS], [$ZLIB_LDFLAGS]) ], [ ZLIB_CPPFLAGS= ZLIB_LDFLAGS= ]) ZLIB_LIBS="-lz" MULE_PREPEND([LIBS], [$ZLIB_LIBS]) AC_MSG_CHECKING([for zlib >= $1]) AC_RUN_IFELSE([ AC_LANG_PROGRAM([[ #include #include ]], [dnl Do not use double-quoting here! char *zver = zlibVersion(); FILE *f=fopen("conftestval", "w"); if (!f) return 1; fprintf(f, "%s", zver[[0]] > 'zver_max' || (zver[[0]] == 'zver_max' && (zver[[2]] > 'zver_mid' || (zver[[2]] == 'zver_mid' && zver[[4]] >= 'zver_min'))) ? "yes" : "no"); fclose(f); f=fopen("conftestver", "w"); if (f) { fprintf(f, "%s", ZLIB_VERSION); fclose(f); } ]) ], [ AS_IF([test -f conftestval], [result=`cat conftestval`], [result=no]) AS_IF([test ${result:-no} = yes], [ AS_IF([test -f conftestver], [ ZLIB_VERSION=`cat conftestver` z_version=" (version $ZLIB_VERSION)" ], [z_version=]) ]) AC_MSG_RESULT([$result$z_version]) ], [ result=no AC_MSG_RESULT([$result]) ], [ result=no z_version= AC_LINK_IFELSE([ AC_LANG_PROGRAM([[ #include #include ]], [[ printf("\nZLIB_VERSION_START" ZLIB_VERSION "ZLIB_VERSION_END\n\n"); zlibVersion(); ]]) ], [ ZLIB_VERSION=`grep -a '^ZLIB_VERSION_START.*ZLIB_VERSION_END$' conftest$ac_exeext | sed 's/^ZLIB_VERSION_START\(.*\)ZLIB_VERSION_END$/\1/'` cross_zver_max="`echo $ZLIB_VERSION | cut -d. -f1`" cross_zver_mid="`echo $ZLIB_VERSION | cut -d. -f2`" cross_zver_min="`echo $ZLIB_VERSION | cut -d. -f3`" MULE_IF([test "$cross_zver_max" -gt "zver_max"], [result=yes], [test "$cross_zver_max" -eq "zver_max"], [ MULE_IF([test "$cross_zver_mid" -gt "zver_mid"], [result=yes], [test "$cross_zver_mid" -eq "zver_mid"], [MULE_IF([test "$cross_zver_min" -ge "zver_min"], [result=yes])]) ]) AS_IF([test ${result:-no} = yes], [z_version=" (version $ZLIB_VERSION)"]) ]) AC_MSG_RESULT([$result$z_version]) ]) MULE_RESTORE([CPPFLAGS]) MULE_RESTORE([LDFLAGS]) MULE_RESTORE([LIBS]) AS_IF([test ${result:-no} = no], [ ZLIB_CPPFLAGS= ZLIB_LDFLAGS= ZLIB_LIBS= $3 ], [$2]) AC_SUBST([ZLIB_CPPFLAGS])dnl AC_SUBST([ZLIB_LDFLAGS])dnl AC_SUBST([ZLIB_LIBS])dnl m4_undefine([zver_max])dnl m4_undefine([zver_mid])dnl m4_undefine([zver_min])dnl m4_undefine([MIN_ZLIB_VERSION])dnl ]) aMule-2.3.1/amulegui.desktop0000644000175000017470000000044211644077302014673 0ustar topiusers[Desktop Entry] Name=aMuleGUI Exec=amulegui Icon=amulegui Terminal=false Type=Application Categories=Network;P2P; Comment=aMule remote control Comment[de]=aMule-Fernsteuerung Comment[fr]=Contrôle à distance d'aMule Comment[hu]=aMule távoli vezérlő Comment[tr]=aMule uzaktan kumandası aMule-2.3.1/src/0000755000175000017470000000000011657306261012262 5ustar topiusersaMule-2.3.1/src/GapList.cpp0000644000175000017470000002211311575347521014333 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "Types.h" #include // for PARTSIZE #include "GapList.h" #include "Logger.h" #include void CGapList::Init(uint64 fileSize, bool isEmpty) { m_filesize = fileSize; m_iPartCount = fileSize / PARTSIZE + 1; m_sizeLastPart = fileSize % PARTSIZE; // file with size of n * PARTSIZE if (m_sizeLastPart == 0 && fileSize) { // that's only for pre-init in ctor m_sizeLastPart = PARTSIZE; m_iPartCount--; } m_gaplist.clear(); m_partsComplete.clear(); if (isEmpty) { m_partsComplete.resize(m_iPartCount, incomplete); AddGap(0, fileSize - 1); } else { m_partsComplete.resize(m_iPartCount, complete); } m_totalGapSizeValid = false; } void CGapList::AddGap(uint64 gapstart, uint64 gapend) { if (!ArgCheck(gapstart, gapend)) { return; } // AddDebugLogLineN(logPartFile, CFormat(wxT(" AddGap: %5d - %5d")) % gapstart % gapend); // mark involved part(s) as incomplete uint16 partlast = gapend / PARTSIZE; for (uint16 part = gapstart / PARTSIZE; part <= partlast; part++) { m_partsComplete[part] = incomplete; } // total gap size has to be recalculated m_totalGapSizeValid = false; // find a place to start: // first gap which ends >= our gap start - 1 // (-1 so we can join adjacent gaps) iterator it = m_gaplist.lower_bound(gapstart > 0 ? gapstart - 1 : 0); while (it != m_gaplist.end()) { iterator it2 = it++; uint64 curGapStart = it2->second; uint64 curGapEnd = it2->first; if (curGapStart >= gapstart && curGapEnd <= gapend) { // this gap is inside the new gap - delete m_gaplist.erase(it2); } else if (curGapStart >= gapstart && curGapStart <= gapend + 1) { // head of this gap is in the new gap, or this gap is // directly behind the new gap - extend limit and delete gapend = curGapEnd; m_gaplist.erase(it2); } else if (curGapEnd <= gapend && curGapEnd >= gapstart - 1) { // tail of this gap is in the new gap, or this gap is // directly before the new gap - extend limit and delete gapstart = curGapStart; m_gaplist.erase(it2); } else if (curGapStart <= gapstart && curGapEnd >= gapend) { // new gap is already inside this gap - return return; // now all cases of overlap are ruled out } else if (curGapStart > gapstart) { // this gap is the first behind the new gap -> insert before it it = it2; break; } } // for fastest insertion point to the element AFTER which we want to insert if (it != m_gaplist.begin()) { --it; } m_gaplist.insert(it, std::pair(gapend, gapstart)); } void CGapList::AddGap(uint16 part) { if (part >= m_iPartCount) { wxFAIL; return; } uint64 gapstart = part * PARTSIZE; uint64 gapend = gapstart + GetPartSize(part) - 1; AddGap(gapstart, gapend); m_partsComplete[part] = incomplete; } void CGapList::FillGap(uint64 partstart, uint64 partend) { if (!ArgCheck(partstart, partend)) { return; } // AddDebugLogLineN(logPartFile, CFormat(wxT(" FillGap: %5d - %5d")) % partstart % partend); // mark involved part(s) to be reexamined for completeness uint16 partlast = partend / PARTSIZE; for (uint16 part = partstart / PARTSIZE; part <= partlast; part++) { m_partsComplete[part] = unknown; } // also total gap size m_totalGapSizeValid = false; // find a place to start: // first gap which ends >= our part start iterator it = m_gaplist.lower_bound(partstart); while (it != m_gaplist.end()) { iterator it2 = it++; uint64 curGapStart = it2->second; uint64 curGapEnd = it2->first; if (curGapStart >= partstart) { if (curGapEnd <= partend) { // our part fills this gap completly m_gaplist.erase(it2); } else if (curGapStart <= partend) { // lower part of this gap is in the part - shrink gap: // (this is the most common case: curGapStart == partstart && curGapEnd > partend) it2->second = partend + 1; // end of our part was in the gap: we're done break; } else { // gap starts behind our part end: we're done break; } } else { // curGapStart < partstart if (curGapEnd > partend) { // our part is completely enclosed by the gap // cut it in two, leaving our part out: // shrink the gap so it becomes the second gap it2->second = partend + 1; // insert new first gap iterator it3(it2); if (it3 != m_gaplist.begin()) { --it3; } m_gaplist.insert(it3, std::pair(partstart - 1, curGapStart)); // we're done break; } else if (curGapEnd >= partstart) { // upper part of this gap is in the part - shrink gap: // insert shorter gap iterator it3(it2); if (it3 != m_gaplist.begin()) { --it3; } m_gaplist.insert(it3, std::pair(partstart - 1, curGapStart)); // and delete the old one m_gaplist.erase(it2); } // else: gap is before our part start (should not happen) } } } void CGapList::FillGap(uint16 part) { if (part >= m_iPartCount) { wxFAIL; return; } uint64 gapstart = part * PARTSIZE; uint64 gapend = gapstart + GetPartSize(part) - 1; FillGap(gapstart, gapend); m_partsComplete[part] = complete; } uint64 CGapList::GetGapSize() { if (!m_totalGapSizeValid) { m_totalGapSizeValid = true; m_totalGapSize = 0; ListType::const_iterator it = m_gaplist.begin(); for (; it != m_gaplist.end(); it++) { m_totalGapSize += it->first - it->second + 1; } } return m_totalGapSize; } uint32 CGapList::GetGapSize(uint16 part) const { uint64 uRangeStart = part * PARTSIZE; uint64 uRangeEnd = uRangeStart + GetPartSize(part) - 1; uint64 uTotalGapSize = 0; // find a place to start: // first gap which ends >= our gap start ListType::const_iterator it = m_gaplist.lower_bound(uRangeStart); for (; it != m_gaplist.end(); ++it) { uint64 curGapStart = it->second; uint64 curGapEnd = it->first; if (curGapStart <= uRangeStart && curGapEnd >= uRangeEnd) { // total range is in this gap uTotalGapSize += uRangeEnd - uRangeStart + 1; break; } else if (curGapStart >= uRangeStart) { if (curGapStart <= uRangeEnd) { // start of this gap is in our range uTotalGapSize += std::min(curGapEnd, uRangeEnd) - curGapStart + 1; } else { // this gap starts behind our range break; } } else if (curGapEnd >= uRangeStart && curGapEnd <= uRangeEnd) { // end of this gap is in our range uTotalGapSize += curGapEnd - uRangeStart + 1; } } wxASSERT( uTotalGapSize <= uRangeEnd - uRangeStart + 1 ); return uTotalGapSize; } bool CGapList::IsComplete(uint64 gapstart, uint64 gapend) const { if (!ArgCheck(gapstart, gapend)) { return false; } // find a place to start: // first gap which ends >= our gap start ListType::const_iterator it = m_gaplist.lower_bound(gapstart); for (; it != m_gaplist.end(); ++it) { uint64 curGapStart = it->second; uint64 curGapEnd = it->first; if ( (curGapStart >= gapstart && curGapEnd <= gapend) ||(curGapStart >= gapstart && curGapStart <= gapend) ||(curGapEnd <= gapend && curGapEnd >= gapstart) ||(gapstart >= curGapStart && gapend <= curGapEnd)) { return false; } if (curGapStart > gapend) { break; } } return true; } bool CGapList::IsComplete(uint16 part) { // There is a bug in the ED2K protocol: // For files of size n * PARTSIZE one part too much is transmitted in the availability bitfield. // Allow completion detection of this dummy part, and always report it as complete // (so it doesn't get asked for). if (part == m_iPartCount && m_sizeLastPart == PARTSIZE) { return true; } // Remaining error check if (part >= m_iPartCount) { wxFAIL; return false; } ePartComplete status = (ePartComplete) m_partsComplete[part]; if (status == unknown) { uint64 partstart = part * PARTSIZE; uint64 partend = partstart + GetPartSize(part) - 1; status = IsComplete(partstart, partend) ? complete : incomplete; m_partsComplete[part] = status; } return status == complete; } inline bool CGapList::ArgCheck(uint64 gapstart, uint64 &gapend) const { // end < start: serious error if (gapend < gapstart) { wxFAIL; return false; } // gaps shouldn't go past file anymore either if (gapend >= m_filesize) { wxFAIL; gapend = m_filesize - 1; // fix it } return true; } aMule-2.3.1/src/SafeFile.cpp0000644000175000017470000003361711575347521014461 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "SafeFile.h" // Interface declarations. #include "MD4Hash.h" // Needed for CMD4Hash #include "kademlia/utils/UInt128.h" // Needed for CUInt128 #include "ScopedPtr.h" // Needed for CScopedPtr and CScopedArray #include "Logger.h" #include // Needed for CFormat #if defined(__SUNPRO_CC) #define __FUNCTION__ __FILE__+__LINE__ #endif #define CHECK_BOM(size, x) ((size >= 3) && (x[0] == (char)0xEF) && (x[1] == (char)0xBB) && (x[2] == (char)0xBF)) const char BOMHeader[3] = { '\xEF', '\xBB', '\xBF'}; CSafeIOException::CSafeIOException(const wxString& type, const wxString& desc) : CMuleException(wxT("SafeIO::") + type, desc) {} CEOFException::CEOFException(const wxString& desc) : CSafeIOException(wxT("EOF"), desc) {} CIOFailureException::CIOFailureException(const wxString& desc) : CSafeIOException(wxT("IOFailure"), desc) {} CIOFailureException::CIOFailureException(const wxString& type, const wxString& desc) : CSafeIOException(wxT("IOFailure::") + type, desc) {} /////////////////////////////////////////////////////////////////////////////// // CFileDataIO CFileDataIO::~CFileDataIO() { } bool CFileDataIO::Eof() const { return GetPosition() >= GetLength(); } void CFileDataIO::Read(void *buffer, size_t count) const { MULE_VALIDATE_PARAMS(buffer, wxT("Attempting to write to NULL buffer.")); // Check that we read everything we wanted. if (doRead(buffer, count) == (signed)count) { return; } // To reduce potential system calls, we only do EOF checks when reads fail. if (Eof()) { throw CEOFException(wxT("Attempt to read past end of file.")); } else { throw CIOFailureException(wxT("Read error, failed to read from file.")); } } void CFileDataIO::Write(const void* buffer, size_t count) { MULE_VALIDATE_PARAMS(buffer, wxT("Attempting to read from NULL buffer.")); if (doWrite(buffer, count) != (signed)count) { throw CIOFailureException(wxT("Write error, failed to write to file.")); } } uint64 CFileDataIO::Seek(sint64 offset, wxSeekMode from) const { sint64 newpos = 0; switch (from) { case wxFromStart: newpos = offset; break; case wxFromCurrent: newpos = GetPosition() + offset; break; case wxFromEnd: newpos = GetLength() + offset; break; default: MULE_VALIDATE_PARAMS(false, wxT("Invalid seek-mode specified.")); } MULE_VALIDATE_PARAMS(newpos >= 0, wxT("Position after seeking would be less than zero!")); sint64 result = doSeek(newpos); MULE_VALIDATE_STATE(result >= 0, wxT("Seeking resulted in invalid offset.")); MULE_VALIDATE_STATE(result == newpos, wxT("Target position and actual position disagree.")); return result; } uint8 CFileDataIO::ReadUInt8() const { uint8 value = 0; Read(&value, sizeof(uint8)); return value; } uint16 CFileDataIO::ReadUInt16() const { uint16 value = 0; Read(&value, sizeof(uint16)); return ENDIAN_SWAP_16(value); } uint32 CFileDataIO::ReadUInt32() const { uint32 value = 0; Read(&value, sizeof(uint32)); return ENDIAN_SWAP_32(value); } uint64 CFileDataIO::ReadUInt64() const { uint64 value = 0; Read(&value, sizeof(uint64)); return ENDIAN_SWAP_64(value); } // UInt128 values are stored a little weird way... // Four little-endian 32-bit numbers, stored in // big-endian order CUInt128 CFileDataIO::ReadUInt128() const { CUInt128 value; for (int i = 0; i < 4; i++) { // Four 32bits chunks value.Set32BitChunk(i, ReadUInt32()); } return value; } CMD4Hash CFileDataIO::ReadHash() const { CMD4Hash value; Read(value.GetHash(), MD4HASH_LENGTH); return value; } float CFileDataIO::ReadFloat() const { float retVal; Read(&retVal, sizeof(float)); return retVal; } unsigned char* CFileDataIO::ReadBsob(uint8* puSize) const { MULE_VALIDATE_PARAMS(puSize, wxT("NULL pointer argument in ReadBsob")); *puSize = ReadUInt8(); CScopedArray bsob(*puSize); Read(bsob.get(), *puSize); return bsob.release(); } wxString CFileDataIO::ReadString(bool bOptUTF8, uint8 SizeLen, bool SafeRead) const { uint32 readLen; switch (SizeLen) { case sizeof(uint16): readLen = ReadUInt16(); break; case sizeof(uint32): readLen = ReadUInt32(); break; default: MULE_VALIDATE_PARAMS(false, wxT("Invalid SizeLen value in ReadString")); } if (SafeRead) { readLen = std::min(readLen, GetLength() - GetPosition()); } return ReadOnlyString(bOptUTF8, readLen); } wxString CFileDataIO::ReadOnlyString(bool bOptUTF8, uint16 raw_len) const { // We only need to set the the NULL terminator, since we know that // reads will either succeed or throw an exception, in which case // we wont be returning anything std::vector val_array(raw_len + 1); val_array[raw_len] = 0; char* val = &(val_array[0]); Read(val, raw_len); wxString str; if (CHECK_BOM(raw_len, val)) { // This is a UTF8 string with a BOM header, skip header. str = UTF82unicode(val + 3); } else if (bOptUTF8) { str = UTF82unicode(val); if (str.IsEmpty()) { // Fallback to Latin-1 str = wxString(val, wxConvISO8859_1, raw_len); } } else { // Raw strings are written as Latin-1 (see CFileDataIO::WriteStringCore) str = wxString(val, wxConvISO8859_1, raw_len); } return str; } void CFileDataIO::WriteUInt8(uint8 value) { Write(&value, sizeof(uint8)); } void CFileDataIO::WriteUInt16(uint16 value) { ENDIAN_SWAP_I_16(value); Write(&value, sizeof(uint16)); } void CFileDataIO::WriteUInt32(uint32 value) { ENDIAN_SWAP_I_32(value); Write(&value, sizeof(uint32)); } void CFileDataIO::WriteUInt64(uint64 value) { ENDIAN_SWAP_I_64(value); Write(&value, sizeof(uint64)); } // UInt128 values are stored a little weird way... // Four little-endian 32-bit numbers, stored in // big-endian order void CFileDataIO::WriteUInt128(const Kademlia::CUInt128& value) { for (int i = 0; i < 4; i++) { // Four 32bits chunks WriteUInt32(value.Get32BitChunk(i)); } } void CFileDataIO::WriteHash(const CMD4Hash& value) { Write(value.GetHash(), MD4HASH_LENGTH); } void CFileDataIO::WriteFloat(float value) { Write(&value, sizeof(float)); } void CFileDataIO::WriteBsob(const unsigned char* value, uint8 size) { WriteUInt8(size); Write(value, size); } void CFileDataIO::WriteString(const wxString& str, EUtf8Str eEncode, uint8 SizeLen) { switch (eEncode) { case utf8strRaw: case utf8strOptBOM: { Unicode2CharBuf s(unicode2UTF8(str)); if (s) { WriteStringCore(s, eEncode, SizeLen); break; } } default: { // Non UTF-8 strings are saved as Latin-1 wxCharBuffer s1 = wxConvISO8859_1.cWC2MB(str); WriteStringCore(s1, utf8strNone, SizeLen); } } } void CFileDataIO::WriteStringCore(const char *s, EUtf8Str eEncode, uint8 SizeLen) { uint32 sLength = s ? strlen(s) : 0; uint32 real_length = 0; if (eEncode == utf8strOptBOM) { real_length = sLength + 3; // For BOM header. } else { real_length = sLength; } switch (SizeLen) { case 0: // Don't write size. break; case sizeof(uint16): // We must not allow too long strings to be written, // as this would allow for a buggy clients to "poison" // us, by sending ISO8859-1 strings that expand to a // greater than 16b length when converted as UTF-8. if (real_length > 0xFFFF) { wxFAIL_MSG(wxT("String is too long to be saved")); real_length = std::min(real_length, 0xFFFF); if (eEncode == utf8strOptBOM) { sLength = real_length - 3; } else { sLength = real_length; } } WriteUInt16(real_length); break; case sizeof(uint32): WriteUInt32(real_length); break; default: MULE_VALIDATE_PARAMS(false, wxT("Invalid length for string-length field.")); } // The BOM header must be written even if the string is empty. if (eEncode == utf8strOptBOM) { Write(BOMHeader, 3); } // Only attempt to write non-NULL strings. if (sLength) { // No NULL terminator is written since we explicitly specify the length Write(s, sLength); } } CTag *CFileDataIO::ReadTag(bool bOptACP) const { CTag *retVal = NULL; wxString name; byte type = 0; try { type = ReadUInt8(); name = ReadString(false); switch (type) { // NOTE: This tag data type is accepted and stored only to give us the possibility to upgrade // the net in some months. // // And still.. it doesnt't work this way without breaking backward compatibility. To properly // do this without messing up the network the following would have to be done: // - those tag types have to be ignored by any client, otherwise those tags would also be sent (and // that's really the problem) // // - ignoring means, each client has to read and right throw away those tags, so those tags get // get never stored in any tag list which might be sent by that client to some other client. // // - all calling functions have to be changed to deal with the 'nr. of tags' attribute (which was // already parsed) correctly.. just ignoring those tags here is not enough, any taglists have to // be built with the knowledge that the 'nr. of tags' attribute may get decreased during the tag // reading.. // // If those new tags would just be stored and sent to remote clients, any malicious or just bugged // client could let send a lot of nodes "corrupted" packets... // case TAGTYPE_HASH16: { retVal = new CTagHash(name, ReadHash()); break; } case TAGTYPE_STRING: retVal = new CTagString(name, ReadString(bOptACP)); break; case TAGTYPE_UINT64: retVal = new CTagInt64(name, ReadUInt64()); break; case TAGTYPE_UINT32: retVal = new CTagInt32(name, ReadUInt32()); break; case TAGTYPE_UINT16: retVal = new CTagInt16(name, ReadUInt16()); break; case TAGTYPE_UINT8: retVal = new CTagInt8(name, ReadUInt8()); break; case TAGTYPE_FLOAT32: retVal = new CTagFloat(name, ReadFloat()); break; // NOTE: This tag data type is accepted and stored only to give us the possibility to upgrade // the net in some months. // // And still.. it doesnt't work this way without breaking backward compatibility case TAGTYPE_BSOB: { uint8 size = 0; CScopedArray value(ReadBsob(&size)); retVal = new CTagBsob(name, value.get(), size); break; } default: throw wxString(CFormat(wxT("Invalid Kad tag type; type=0x%02x name=%s\n")) % type % name); } } catch(const CMuleException& e) { AddLogLineN(e.what()); delete retVal; throw; } catch(const wxString& e) { AddLogLineN(e); throw; } return retVal; } void CFileDataIO::ReadTagPtrList(TagPtrList* taglist, bool bOptACP) const { MULE_VALIDATE_PARAMS(taglist, wxT("NULL pointer argument in ReadTagPtrList")); uint32 count = ReadUInt8(); for (uint32 i = 0; i < count; i++) { CTag* tag = ReadTag(bOptACP); taglist->push_back(tag); } } void CFileDataIO::WriteTag(const CTag& tag) { try { WriteUInt8(tag.GetType()); if (!tag.GetName().IsEmpty()) { WriteString(tag.GetName(),utf8strNone); } else { WriteUInt16(1); WriteUInt8(tag.GetNameID()); } switch (tag.GetType()) { case TAGTYPE_HASH16: // Do NOT use this to transfer any tags for at least half a year!! WriteHash(CMD4Hash(tag.GetHash())); break; case TAGTYPE_STRING: WriteString(tag.GetStr(), utf8strRaw); // Always UTF8 break; case TAGTYPE_UINT64: WriteUInt64(tag.GetInt()); break; case TAGTYPE_UINT32: WriteUInt32(tag.GetInt()); break; case TAGTYPE_FLOAT32: WriteFloat(tag.GetFloat()); break; case TAGTYPE_BSOB: WriteBsob(tag.GetBsob(), tag.GetBsobSize()); break; case TAGTYPE_UINT16: WriteUInt16(tag.GetInt()); break; case TAGTYPE_UINT8: WriteUInt8(tag.GetInt()); break; case TAGTYPE_BLOB: // NOTE: This will break backward compatibility with met files for eMule versions prior to 0.44a // and any aMule prior to SVN 26/02/2005 WriteUInt32(tag.GetBlobSize()); Write(tag.GetBlob(), tag.GetBlobSize()); break; default: //TODO: Support more tag types // With the if above, this should NEVER happen. AddLogLineNS(CFormat(wxT("CFileDataIO::WriteTag: Unknown tag: type=0x%02X")) % tag.GetType()); wxFAIL; break; } } catch (...) { AddLogLineNS(wxT("Exception in CDataIO:WriteTag")); throw; } } void CFileDataIO::WriteTagPtrList(const TagPtrList& tagList) { uint32 count = tagList.size(); wxASSERT( count <= 0xFF ); WriteUInt8(count); TagPtrList::const_iterator it; for (it = tagList.begin(); it != tagList.end(); it++) { WriteTag(**it); } } uint64 CFileDataIO::GetIntTagValue() const { uint8 type = ReadUInt8(); ReadString(false); switch (type) { case TAGTYPE_UINT64: return ReadUInt64(); break; case TAGTYPE_UINT32: return ReadUInt32(); break; case TAGTYPE_UINT16: return ReadUInt16(); break; case TAGTYPE_UINT8: return ReadUInt8(); break; default: throw wxString(wxT("Wrong tag type reading int tag")); } } // File_checked_for_headers aMule-2.3.1/src/OtherFunctions.h0000644000175000017470000003017311575347521015414 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef OTHERFUNCTIONS_H #define OTHERFUNCTIONS_H #include // Needed for wxLANGUAGE_ constants #include "Types.h" // Needed for uint16, uint32 and uint64 #include "Preferences.h" // Needed for AllCategoryFilter enumeration #include // Needed for std::for_each // Do_not_auto_remove (mingw-gcc-3.4.5) class CPath; /** * Helper function. * * @param ArgA The base value. * @param ArgB The value to compare ArgA against. * @return See below. * * Use this function to safely compare two arguments of a type that supports * the "<" operator. It works like strcmp and returns a negative value if ArgA * is less than ArgB, zero if ArgA is equal to ArgB and a positive value if * ArgA is greater than ArgB. */ template int CmpAny(const TYPE& ArgA, const TYPE& ArgB) { if ( ArgA < ArgB ) { return -1; } else if ( ArgB < ArgA ) { return 1; } else { return 0; } } //! Overloaded version of CmpAny for use with wxStrings. inline int CmpAny(const wxString& ArgA, const wxString& ArgB) { if (ArgA.IsEmpty() && !ArgB.IsEmpty()) { return -1; } else if (!ArgA.IsEmpty() && ArgB.IsEmpty()) { return 1; } else if (ArgA.IsEmpty() && ArgB.IsEmpty()) { return 0; } else { return ArgA.CmpNoCase( ArgB ); } } //! Overloaded version of CmpAny for use with C-Strings (Unicoded). inline int CmpAny(const wxChar* ArgA, const wxChar* ArgB) { return CmpAny(wxString( ArgA ), wxString( ArgB )); } /** * Removes the first instance of a value from a STL-like list: list, vector or deque. * * @param list The list to manipulate. * @param item The value to search for and remove. * @return The number of instances removed. */ template unsigned int EraseFirstValue( LIST& list, const ITEM& item ) { typename LIST::iterator it = list.begin(); for (; it != list.end(); ++it) { if (*it == item) { list.erase(it); return true; } } return false; } /** * Removes all instances of a value from a STL-like list: list, vector or deque. * * @param list The list to manipulate. * @param item The value to search for and remove. * @return The number of instances removed. */ template unsigned int EraseValue( LIST& list, const ITEM& item ) { typename LIST::iterator it = list.begin(); unsigned int count = 0; for ( ; it != list.end(); ) { if ( *it == item ) { it = list.erase( it ); count++; } else { ++it; } } return count; } //! Used by DeleteContents struct SDoDelete { // Used for lists, vectors, deques, etc. template void operator()(TYPE* ptr) { delete ptr; } // Used for maps, hashmaps, rangemaps, etc. template void operator()(const std::pair& pair) { delete pair.second; } }; /** Frees the contents of a list or map like stl container, clearing it afterwards. */ template void DeleteContents(STL_CONTAINER& container) { // Ensure that the actual container wont contain dangling pointers during // this operation, to ensure that the destructors cant access them. STL_CONTAINER copy; std::swap(copy, container); std::for_each(copy.begin(), copy.end(), SDoDelete()); } /** * Copies elements from the range [first, first + n) to the range [result, result + n). */ template OutputIterator STLCopy_n(InputIterator first, size_t n, OutputIterator result) { return std::copy(first, first + n, result); } /** * Returns a description of the version of aMule being used. * * @return A detailed description of the aMule version, including wx information. * * Use this rather than just using the VERSION or CURRENT_VERSION_LONG * constants, when displaying information to the user. The purpose is to * help with debugging. */ wxString GetMuleVersion(); /** * Helperfunction for accessing a child of the calling widget. * * @param IdOrName The ID or the Name of the widget to find. * @param type The widget-type to cast the found widget to. * * Use this function as a replacement for the following constructs: * - wxStaticCast( FindWindow( ), ) * - (*)FindWindow( ) * * It has the advantage of validating the cast in debug builds and being much * shorter than than manually typing wxStaticCast + FindWindow. This mean that * we will be alerted in case of widget changing type, instead of getting just * getting bad mojo due to casting a pointer to the wrong type. */ #define CastChild( IdOrName, type ) dynamic_cast( FindWindow( IdOrName ) ) /** * Helperfunction for accessing the child of a any widget by ID. * * @param ID The ID of the widget to find. * @param parent The parent of the widget to find, or NULL to search from the top. * @param type The type to cast the widget to. * * @see CastChild() */ #define CastByID( ID, parent, type ) dynamic_cast( wxWindow::FindWindowById( (ID), (parent) ) ) /** * Helperfunction for accessing the child of a any widget by Name. * * @param Name The Name of the widget to find. * @param parent The parent of the widget to find, or NULL to search from the top. * @param type The type to cast the widget to. * * @see CastChild() */ #define CastByName( Name, parent, type ) dynamic_cast( wxWindow::FindWindowByName( (Name), (parent) ) ) // From Gnucleus project [found by Tarod] // Base16/Base32/Base64 Encode/Decode functions wxString EncodeBase16(const unsigned char* buffer, unsigned int bufLen); unsigned int DecodeBase16(const wxString &base16Buffer, unsigned int base16BufLen, unsigned char *buffer); wxString EncodeBase32(const unsigned char* buffer, unsigned int bufLen); unsigned int DecodeBase32(const wxString &base32Buffer, unsigned int base32BufLen, unsigned char *buffer); wxString EncodeBase64(const char* buffer, unsigned int bufLen); unsigned int DecodeBase64(const wxString &base64Buffer, unsigned int base64BufLen, unsigned char *buffer); // Converts the number of bytes to human readable form. wxString CastItoXBytes(uint64 count); // Converts the number to human readable form, abbreviating when nessecary. wxString CastItoIShort(uint64 number); // Converts a number of bytes to a human readable speed value. wxString CastItoSpeed(uint32 bytes); // Converts an amount of seconds to human readable time. wxString CastSecondsToHM(uint32 seconds, uint16 msecs = 0); // Returns the amount of Bytes the provided size-type represents uint32 GetTypeSize(uint8 type); // Returns the string associated with a file-rating value. wxString GetRateString(uint16 rate); // The following functions are used to identify and/or name the type of a file enum FileType { ftAny, ftVideo, ftAudio, ftArchive, ftCDImage, ftPicture, ftText, ftProgram }; // Examins a filename and returns the enumerated value assosiated with it, or ftAny if unknown extension FileType GetFiletype(const CPath& filename); // Returns the description of a filetype: Movies, Audio, Pictures and so on... wxString GetFiletypeDesc(FileType type, bool translated = true); // Shorthand for GetFiletypeDesc(GetFiletype(filename)) wxString GetFiletypeByName(const CPath& filename, bool translated = true); // Returns the name associated with a category value. wxString GetCatTitle(AllCategoryFilter cat); /* Other */ //! Returns the number of items in an array. #define itemsof(x) (sizeof(x)/sizeof(x[0])) /////////////////////////////////////////////////////////////////////////////// // ED2K File Type // enum EED2KFileType { ED2KFT_ANY, ED2KFT_AUDIO, ED2KFT_VIDEO, ED2KFT_IMAGE, ED2KFT_PROGRAM, ED2KFT_DOCUMENT, ED2KFT_ARCHIVE, ED2KFT_CDIMAGE }; class EED2KFileTypeClass { public: EED2KFileTypeClass() { s_t = ED2KFT_ANY; } EED2KFileTypeClass(EED2KFileType t) { s_t = t; } EED2KFileType GetType() const { return s_t; } private: EED2KFileType s_t; }; EED2KFileType GetED2KFileTypeID(const CPath& fileName); wxString GetED2KFileTypeSearchTerm(EED2KFileType iFileID); wxString GetFileTypeByName(const CPath& fileName); EED2KFileType GetED2KFileTypeSearchID(EED2KFileType iFileID); /////////////////////////////////////////////////////////////////////////////// // md4cmp -- replacement for memcmp(hash1,hash2,16) // Like 'memcmp' this function returns 0, if hash1==hash2, and !0, if hash1!=hash2. // NOTE: Do *NOT* use that function for determining if hash1hash2. inline int md4cmp(const void* hash1, const void* hash2) { return memcmp(hash1, hash2, 16); } // md4clr -- replacement for memset(hash,0,16) inline void md4clr(void* hash) { memset(hash, 0, 16); } // md4cpy -- replacement for memcpy(dst,src,16) inline void md4cpy(void* dst, const void* src) { memcpy(dst, src, 16); } // DumpMem ... Dumps mem ;) wxString DumpMemToStr(const void *buff, int n, const wxString& msg = wxEmptyString, bool ok = true); void DumpMem(const void *buff, int n, const wxString& msg = wxEmptyString, bool ok = true); void DumpMem_DW(const uint32 *ptr, int count); // Returns special source ID for GUI. // It's actually IP<<16+Port #define GUI_ID(x,y) (uint64)((((uint64)x)<<16) + (uint64)y) // And so... #define PORT_FROM_GUI_ID(x) (x & 0xFFFF) #define IP_FROM_GUI_ID(x) (x >> 16) inline long int make_full_ed2k_version(int a, int b, int c) { return ((a << 17) | (b << 10) | (c << 7)); } wxString GetConfigDir(const wxString &configFile = wxT("amule.conf")); #if !wxCHECK_VERSION(2, 9, 0) enum { wxLANGUAGE_ASTURIAN = wxLANGUAGE_USER_DEFINED + 1 }; #endif /** * Adds aMule's custom languages to db. */ void InitCustomLanguages(); /** * Initializes locale */ void InitLocale(wxLocale& locale, int language); /** * Converts a string locale definition to a wxLANGUAGE id. */ int StrLang2wx(const wxString& language); /** * Converts a wxLANGUAGE id to a string locale name. */ wxString wxLang2Str(const int lang); /** * Generate MD5Hash of prompt input */ wxString GetPassword(); #if wxUSE_THREADS #include /** * Automatically unlocks a mutex on construction and locks it on destruction. * * This class is the complement of wxMutexLocker. It is intended to be used * when a mutex, which is locked for a period of time, needs to be * temporarily unlocked for a bit. For example: * * wxMutexLocker lock(mutex); * * // ... do stuff that requires that the mutex is locked ... * * { * CMutexUnlocker unlocker(mutex); * // ... do stuff that requires that the mutex is unlocked ... * } * * // ... do more stuff that requires that the mutex is locked ... * */ class CMutexUnlocker { public: // unlock the mutex in the ctor CMutexUnlocker(wxMutex& mutex) : m_isOk(false), m_mutex(mutex) { m_isOk = ( m_mutex.Unlock() == wxMUTEX_NO_ERROR ); } // returns true if mutex was successfully unlocked in ctor bool IsOk() const { return m_isOk; } // lock the mutex in dtor ~CMutexUnlocker() { if ( IsOk() ) m_mutex.Lock(); } private: // no assignment operator nor copy ctor CMutexUnlocker(const CMutexUnlocker&); CMutexUnlocker& operator=(const CMutexUnlocker&); bool m_isOk; wxMutex& m_mutex; }; #endif /* wxUSE_THREADS */ #endif // OTHERFUNCTIONS_H // File_checked_for_headers aMule-2.3.1/src/ThreadTasks.cpp0000644000175000017470000004761511626251560015215 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2006-2011 Mikkel Schubert ( xaignar@amule.org / http:://www.amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include // Needed for wxTheApp #include "ThreadTasks.h" // Interface declarations #include "PartFile.h" // Needed for CPartFile #include "Logger.h" // Needed for Add(Debug)LogLine{C,N} #include // Needed for CFormat #include "amule.h" // Needed for theApp #include "KnownFileList.h" // Needed for theApp->knownfiles #include "Preferences.h" // Needed for thePrefs #include "ScopedPtr.h" // Needed for CScopedPtr and CScopedArray #include "PlatformSpecific.h" // Needed for CanFSHandleSpecialChars #ifdef HAVE_CONFIG_H # include "config.h" #endif //! This hash represents the value for an empty MD4 hashing const byte g_emptyMD4Hash[16] = { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }; //////////////////////////////////////////////////////////// // CHashingTask CHashingTask::CHashingTask(const CPath& path, const CPath& filename, const CPartFile* part) // GetPrintable is used to improve the readability of the log. : CThreadTask(wxT("Hashing"), path.JoinPaths(filename).GetPrintable(), (part ? ETP_High : ETP_Normal)), m_path(path), m_filename(filename), m_toHash((EHashes)(EH_MD4 | EH_AICH)), m_owner(part) { // We can only create the AICH hashset if the file is a knownfile or // if the partfile is complete, since the MD4 hashset is checked first, // so that the AICH hashset only gets assigned if the MD4 hashset // matches what we expected. Due to the rareity of post-completion // corruptions, this gives us a nice speedup in most cases. if (part && !part->GetGapList().empty()) { m_toHash = EH_MD4; } } CHashingTask::CHashingTask(const CKnownFile* toAICHHash) // GetPrintable is used to improve the readability of the log. : CThreadTask(wxT("AICH Hashing"), toAICHHash->GetFilePath().JoinPaths(toAICHHash->GetFileName()).GetPrintable(), ETP_Low), m_path(toAICHHash->GetFilePath()), m_filename(toAICHHash->GetFileName()), m_toHash(EH_AICH), m_owner(toAICHHash) { } void CHashingTask::Entry() { CFileAutoClose file; CPath fullPath = m_path.JoinPaths(m_filename); if (!file.Open(fullPath, CFile::read)) { AddDebugLogLineC(logHasher, CFormat(wxT("Warning, failed to open file, skipping: %s")) % fullPath); return; } uint64 fileLength = 0; try { fileLength = file.GetLength(); } catch (const CIOFailureException&) { AddDebugLogLineC(logHasher, CFormat(wxT("Warning, failed to retrieve file-length, skipping: %s")) % fullPath); return; } if (fileLength > MAX_FILE_SIZE) { AddDebugLogLineC(logHasher, CFormat(wxT("Warning, file is larger than supported size, skipping: %s")) % fullPath); return; } else if (fileLength == 0) { if (m_owner) { // It makes no sense to try to hash empty partfiles ... wxFAIL; } else { // Zero-size partfiles should be hashed, but not zero-sized shared-files. AddDebugLogLineC(logHasher, CFormat(wxT("Warning, 0-size file, skipping: %s")) % fullPath); } return; } // For thread-safety, results are passed via a temporary file object. CScopedPtr knownfile; knownfile->m_filePath = m_path; knownfile->SetFileName(m_filename); knownfile->SetFileSize(fileLength); knownfile->m_lastDateChanged = CPath::GetModificationTime(fullPath); knownfile->m_AvailPartFrequency.insert( knownfile->m_AvailPartFrequency.begin(), knownfile->GetPartCount(), 0); if ((m_toHash & EH_MD4) && (m_toHash & EH_AICH)) { knownfile->GetAICHHashset()->FreeHashSet(); AddDebugLogLineN( logHasher, CFormat( wxT("Starting to create MD4 and AICH hash for file: %s")) % m_filename ); } else if ((m_toHash & EH_MD4)) { AddDebugLogLineN( logHasher, CFormat( wxT("Starting to create MD4 hash for file: %s")) % m_filename ); } else if ((m_toHash & EH_AICH)) { knownfile->GetAICHHashset()->FreeHashSet(); AddDebugLogLineN( logHasher, CFormat( wxT("Starting to create AICH hash for file: %s")) % m_filename ); } else { wxCHECK_RET(0, (CFormat(wxT("No hashes requested for file, skipping: %s")) % m_filename).GetString()); } // This loops creates the part-hashes, loop-de-loop. try { for (uint16 part = 0; part < knownfile->GetPartCount() && !TestDestroy(); part++) { if (CreateNextPartHash(file, part, knownfile.get(), m_toHash) == false) { AddDebugLogLineC(logHasher, CFormat(wxT("Error while hashing file, skipping: %s")) % m_filename); return; } } } catch (const CSafeIOException& e) { AddDebugLogLineC(logHasher, wxT("IO exception while hashing file: ") + e.what()); return; } if ((m_toHash & EH_MD4) && !TestDestroy()) { // If the file is < PARTSIZE, then the filehash is that one hash, // otherwise, the filehash is the hash of the parthashes if ( knownfile->m_hashlist.size() == 1 ) { knownfile->m_abyFileHash = knownfile->m_hashlist[0]; knownfile->m_hashlist.clear(); } else if ( knownfile->m_hashlist.size() ) { CMD4Hash hash; knownfile->CreateHashFromHashlist(knownfile->m_hashlist, &hash); knownfile->m_abyFileHash = hash; } else { // This should not happen! wxFAIL; } } // Did we create a AICH hashset? if ((m_toHash & EH_AICH) && !TestDestroy()) { CAICHHashSet* AICHHashSet = knownfile->GetAICHHashset(); AICHHashSet->ReCalculateHash(false); if (AICHHashSet->VerifyHashTree(true) ) { AICHHashSet->SetStatus(AICH_HASHSETCOMPLETE); if (!AICHHashSet->SaveHashSet()) { AddDebugLogLineC( logHasher, CFormat(wxT("Warning, failed to save AICH hashset for file: %s")) % m_filename ); } } } if ((m_toHash == EH_AICH) && !TestDestroy()) { CHashingEvent evt(MULE_EVT_AICH_HASHING, knownfile.release(), m_owner); wxPostEvent(wxTheApp, evt); } else if (!TestDestroy()) { CHashingEvent evt(MULE_EVT_HASHING, knownfile.release(), m_owner); wxPostEvent(wxTheApp, evt); } } bool CHashingTask::CreateNextPartHash(CFileAutoClose& file, uint16 part, CKnownFile* owner, EHashes toHash) { wxCHECK_MSG(!file.Eof(), false, wxT("Unexpected EOF in CreateNextPartHash")); const uint64 offset = part * PARTSIZE; // We'll read at most PARTSIZE bytes per cycle const uint64 partLength = owner->GetPartSize(part); CMD4Hash hash; CMD4Hash* md4Hash = ((toHash & EH_MD4) ? &hash : NULL); CAICHHashTree* aichHash = NULL; // Setup for AICH hashing if (toHash & EH_AICH) { aichHash = owner->GetAICHHashset()->m_pHashTree.FindHash(offset, partLength); } owner->CreateHashFromFile(file, offset, partLength, md4Hash, aichHash); if (toHash & EH_MD4) { // Store the md4 hash owner->m_hashlist.push_back(hash); // This is because of the ed2k implementation for parts. A 2 * PARTSIZE // file i.e. will have 3 parts (see CKnownFile::SetFileSize for comments). // So we have to create the hash for the 0-size data, which will be the default // md4 hash for null data: 31D6CFE0D16AE931B73C59D7E0C089C0 if ((partLength == PARTSIZE) && file.Eof()) { owner->m_hashlist.push_back(CMD4Hash(g_emptyMD4Hash)); } } return true; } void CHashingTask::OnLastTask() { if (GetType() == wxT("Hashing")) { // To prevent rehashing in case of crashes, we // explicity save the list of hashed files here. theApp->knownfiles->Save(); // Make sure the AICH-hashes are up to date. CThreadScheduler::AddTask(new CAICHSyncTask()); } } //////////////////////////////////////////////////////////// // CAICHSyncTask CAICHSyncTask::CAICHSyncTask() : CThreadTask(wxT("AICH Syncronizing"), wxEmptyString, ETP_Low) { } void CAICHSyncTask::Entry() { ConvertToKnown2ToKnown264(); AddDebugLogLineN( logAICHThread, wxT("Syncronization thread started.") ); // We collect all masterhashs which we find in the known2.met and store them in a list std::list hashlist; const CPath fullpath = CPath(theApp->ConfigDir + KNOWN2_MET_FILENAME); CFile file; if (!fullpath.FileExists()) { // File does not exist. Try to create it to see if it can be created at all (and don't start hashing otherwise). if (!file.Open(fullpath, CFile::write)) { AddDebugLogLineC( logAICHThread, wxT("Error, failed to open 'known2_64.met' file!") ); return; } try { file.WriteUInt8(KNOWN2_MET_VERSION); } catch (const CIOFailureException& e) { AddDebugLogLineC(logAICHThread, wxT("IO failure while creating hashlist (Aborting): ") + e.what()); return; } } else { if (!file.Open(fullpath, CFile::read)) { AddDebugLogLineC( logAICHThread, wxT("Error, failed to open 'known2_64.met' file!") ); return; } uint32 nLastVerifiedPos = 0; try { if (file.ReadUInt8() != KNOWN2_MET_VERSION) { throw CEOFException(wxT("Invalid met-file header found, removing file.")); } uint64 nExistingSize = file.GetLength(); while (file.GetPosition() < nExistingSize) { // Read the next hash hashlist.push_back(CAICHHash(&file)); uint32 nHashCount = file.ReadUInt32(); if (file.GetPosition() + nHashCount * CAICHHash::GetHashSize() > nExistingSize){ throw CEOFException(wxT("Hashlist ends past end of file.")); } // skip the rest of this hashset nLastVerifiedPos = file.Seek(nHashCount * HASHSIZE, wxFromCurrent); } } catch (const CEOFException&) { AddDebugLogLineC(logAICHThread, wxT("Hashlist corrupted, truncating file.")); file.Close(); file.Reopen(CFile::read_write); file.SetLength(nLastVerifiedPos); } catch (const CIOFailureException& e) { AddDebugLogLineC(logAICHThread, wxT("IO failure while reading hashlist (Aborting): ") + e.what()); return; } AddDebugLogLineN( logAICHThread, wxT("Masterhashes of known files have been loaded.") ); } // Now we check that all files which are in the sharedfilelist have a // corresponding hash in our list. Those how don't are queued for hashing. theApp->sharedfiles->CheckAICHHashes(hashlist); } bool CAICHSyncTask::ConvertToKnown2ToKnown264() { // converting known2.met to known2_64.met to support large files // changing hashcount from uint16 to uint32 const CPath oldfullpath = CPath(theApp->ConfigDir + OLD_KNOWN2_MET_FILENAME); const CPath newfullpath = CPath(theApp->ConfigDir + KNOWN2_MET_FILENAME); if (newfullpath.FileExists() || !oldfullpath.FileExists()) { // In this case, there is nothing that we need to do. return false; } CFile oldfile; CFile newfile; if (!oldfile.Open(oldfullpath, CFile::read)) { AddDebugLogLineC(logAICHThread, wxT("Failed to open 'known2.met' file.")); // else -> known2.met also doesn't exists, so nothing to convert return false; } if (!newfile.Open(newfullpath, CFile::write_excl)) { AddDebugLogLineC(logAICHThread, wxT("Failed to create 'known2_64.met' file.")); return false; } AddLogLineN(CFormat(_("Converting old AICH hashsets in '%s' to 64b in '%s'.")) % OLD_KNOWN2_MET_FILENAME % KNOWN2_MET_FILENAME); try { newfile.WriteUInt8(KNOWN2_MET_VERSION); while (newfile.GetPosition() < oldfile.GetLength()) { CAICHHash aichHash(&oldfile); uint32 nHashCount = oldfile.ReadUInt16(); CScopedArray buffer(nHashCount * CAICHHash::GetHashSize()); oldfile.Read(buffer.get(), nHashCount * CAICHHash::GetHashSize()); newfile.Write(aichHash.GetRawHash(), CAICHHash::GetHashSize()); newfile.WriteUInt32(nHashCount); newfile.Write(buffer.get(), nHashCount * CAICHHash::GetHashSize()); } newfile.Flush(); } catch (const CEOFException& e) { AddDebugLogLineC(logAICHThread, wxT("Error reading old 'known2.met' file.") + e.what()); return false; } catch (const CIOFailureException& e) { AddDebugLogLineC(logAICHThread, wxT("IO error while converting 'known2.met' file: ") + e.what()); return false; } // FIXME LARGE FILES (uncomment) //DeleteFile(oldfullpath); return true; } //////////////////////////////////////////////////////////// // CCompletionTask CCompletionTask::CCompletionTask(const CPartFile* file) // GetPrintable is used to improve the readability of the log. : CThreadTask(wxT("Completing"), file->GetFullName().GetPrintable(), ETP_High), m_filename(file->GetFileName()), m_metPath(file->GetFullName()), m_category(file->GetCategory()), m_owner(file), m_error(false) { wxASSERT(m_filename.IsOk()); wxASSERT(m_metPath.IsOk()); wxASSERT(m_owner); } void CCompletionTask::Entry() { CPath targetPath; { #ifndef AMULE_DAEMON // Prevent the preference values from changing underneeth us. wxMutexGuiLocker guiLock; #else //#warning Thread-safety needed #endif targetPath = theApp->glob_prefs->GetCategory(m_category)->path; if (!targetPath.DirExists()) { targetPath = thePrefs::GetIncomingDir(); } } CPath dstName = m_filename.Cleanup(true, !PlatformSpecific::CanFSHandleSpecialChars(targetPath)); // Avoid empty filenames ... if (!dstName.IsOk()) { dstName = CPath(wxT("Unknown")); } if (m_filename != dstName) { AddLogLineC(CFormat(_("WARNING: The filename '%s' is invalid and has been renamed to '%s'.")) % m_filename % dstName); } // Avoid saving to an already existing filename CPath newName = targetPath.JoinPaths(dstName); for (unsigned count = 0; newName.FileExists(); ++count) { wxString postfix = CFormat(wxT("(%u)")) % count; newName = targetPath.JoinPaths(dstName.AddPostfix(postfix)); } if (newName != targetPath.JoinPaths(dstName)) { AddLogLineC(CFormat(_("WARNING: The file '%s' already exists, new file renamed to '%s'.")) % dstName % newName.GetFullName()); } // Move will handle dirs on the same partition, otherwise copy is needed. CPath partfilename = m_metPath.RemoveExt(); if (!CPath::RenameFile(partfilename, newName)) { if (!CPath::CloneFile(partfilename, newName, true)) { m_error = true; return; } if (!CPath::RemoveFile(partfilename)) { AddDebugLogLineC(logPartFile, CFormat(wxT("WARNING: Could not remove original '%s' after creating backup")) % partfilename); } } // Removes the various other data-files const wxChar* otherMetExt[] = { wxT(""), PARTMET_BAK_EXT, wxT(".seeds"), NULL }; for (size_t i = 0; otherMetExt[i]; ++i) { CPath toRemove = m_metPath.AppendExt(otherMetExt[i]); if (toRemove.FileExists()) { if (!CPath::RemoveFile(toRemove)) { AddDebugLogLineC(logPartFile, CFormat(wxT("WARNING: Failed to delete %s")) % toRemove); } } } m_newName = newName; } void CCompletionTask::OnExit() { // Notify the app that the completion has finished for this file. CCompletionEvent evt(m_error, m_owner, m_newName); wxPostEvent(wxTheApp, evt); } //////////////////////////////////////////////////////////// // CAllocateFileTask #ifdef HAVE_FALLOCATE # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif # ifdef HAVE_FCNTL_H # include # endif # include #elif defined HAVE_SYS_FALLOCATE # include # include # include #elif defined HAVE_POSIX_FALLOCATE # define _XOPEN_SOURCE 600 # include # ifdef HAVE_FCNTL_H # include # endif #endif #include #include CAllocateFileTask::CAllocateFileTask(CPartFile *file, bool pause) // GetPrintable is used to improve the readability of the log. : CThreadTask(wxT("Allocating"), file->GetFullName().RemoveExt().GetPrintable(), ETP_High), m_file(file), m_pause(pause), m_result(ENOSYS) { wxASSERT(file != NULL); } void CAllocateFileTask::Entry() { if (m_file->GetFileSize() == 0) { m_result = 0; return; } uint64_t minFree = thePrefs::IsCheckDiskspaceEnabled() ? thePrefs::GetMinFreeDiskSpace() : 0; int64_t freeSpace = CPath::GetFreeSpaceAt(thePrefs::GetTempDir()); // Don't even try to allocate, if there's no space to complete the operation. if (freeSpace != wxInvalidOffset) { if ((uint64_t)freeSpace < m_file->GetFileSize() + minFree) { m_result = ENOSPC; return; } } CFile file; file.Open(m_file->GetFullName().RemoveExt(), CFile::read_write); #ifdef __WXMSW__ try { // File is already created as non-sparse, so we only need to set the length. // This will fail to allocate the file e.g. under wine on linux/ext3, // but works with NTFS and FAT32. file.Seek(m_file->GetFileSize() - 1, wxFromStart); file.WriteUInt8(0); file.Close(); m_result = 0; } catch (const CSafeIOException&) { m_result = errno; } #else // Use kernel level routines if possible # ifdef HAVE_FALLOCATE m_result = fallocate(file.fd(), 0, 0, m_file->GetFileSize()); # elif defined HAVE_SYS_FALLOCATE m_result = syscall(SYS_fallocate, file.fd(), 0, (loff_t)0, (loff_t)m_file->GetFileSize()); if (m_result == -1) { m_result = errno; } # elif defined HAVE_POSIX_FALLOCATE // otherwise use glibc implementation, if available m_result = posix_fallocate(file.fd(), 0, m_file->GetFileSize()); # endif if (m_result != 0 && m_result != ENOSPC) { // If everything else fails, use slow-and-dirty method of allocating the file: write the whole file with zeroes. # define BLOCK_SIZE 1048576 /* Write 1 MB blocks */ void *zero = calloc(1, BLOCK_SIZE); if (zero != NULL) { try { uint64_t size = m_file->GetFileSize(); for (; size >= BLOCK_SIZE; size -= BLOCK_SIZE) { file.Write(zero, BLOCK_SIZE); } if (size > 0) { file.Write(zero, size); } file.Close(); m_result = 0; } catch (const CSafeIOException&) { m_result = errno; } free(zero); } else { m_result = ENOMEM; } } #endif if (file.IsOpened()) { file.Close(); } } void CAllocateFileTask::OnExit() { // Notify the app that the preallocation has finished for this file. CAllocFinishedEvent evt(m_file, m_pause, m_result); wxPostEvent(wxTheApp, evt); } //////////////////////////////////////////////////////////// // CHashingEvent DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_HASHING) DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_AICH_HASHING) CHashingEvent::CHashingEvent(wxEventType type, CKnownFile* result, const CKnownFile* owner) : wxEvent(-1, type), m_owner(owner), m_result(result) { } wxEvent* CHashingEvent::Clone() const { return new CHashingEvent(GetEventType(), m_result, m_owner); } const CKnownFile* CHashingEvent::GetOwner() const { return m_owner; } CKnownFile* CHashingEvent::GetResult() const { return m_result; } //////////////////////////////////////////////////////////// // CCompletionEvent DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_FILE_COMPLETED) CCompletionEvent::CCompletionEvent(bool errorOccured, const CPartFile* owner, const CPath& fullPath) : wxEvent(-1, MULE_EVT_FILE_COMPLETED), m_fullPath(fullPath), m_owner(owner), m_error(errorOccured) { } wxEvent* CCompletionEvent::Clone() const { return new CCompletionEvent(m_error, m_owner, m_fullPath); } bool CCompletionEvent::ErrorOccured() const { return m_error; } const CPartFile* CCompletionEvent::GetOwner() const { return m_owner; } const CPath& CCompletionEvent::GetFullPath() const { return m_fullPath; } //////////////////////////////////////////////////////////// // CAllocFinishedEvent DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_ALLOC_FINISHED) wxEvent *CAllocFinishedEvent::Clone() const { return new CAllocFinishedEvent(m_file, m_pause, m_result); } // File_checked_for_headers aMule-2.3.1/src/MuleCollection.cpp0000644000175000017470000002253611575347521015717 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2007-2011 Johannes Krampf ( wuischke@amule.org ) // // Other code by: // // Angel Vidal Veiga aka Kry // * changed class names // // Marcelo Malheiros // * fixed error with FT_FILEHASH // * added inital 5 tag/file support // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "MuleCollection.h" #include #include #include #include #include CollectionFile::CollectionFile( const std::string &fileName, uint64_t fileSize, const std::string &fileHash) : m_fileName(fileName), m_fileSize(fileSize), m_fileHash(fileHash) { } CMuleCollection::CMuleCollection() : vCollection(0) { } CMuleCollection::~CMuleCollection() { } bool CMuleCollection::Open(const std::string &File) { return OpenBinary(File) || OpenText(File); } std::string CMuleCollection::GetEd2kLink(size_t index) const { if (index >= GetFileCount()) { return "Invalid Index!"; } std::stringstream retvalue; // ed2k://|file|fileName|fileSize|fileHash|/ retvalue << "ed2k://|file|" << GetFileName(index) << "|" << GetFileSize(index) << "|" << GetFileHash(index) << "|/"; return retvalue.str(); } std::string CMuleCollection::GetFileName(size_t index) const { if (index >= GetFileCount()) { return "Invalid Index!"; } std::string retvalue = vCollection[index].m_fileName; if (retvalue.empty()) { return "Empty String!"; } return retvalue; } uint64_t CMuleCollection::GetFileSize(size_t index) const { if (index >= GetFileCount()) { return 0; } return vCollection[index].m_fileSize; } std::string CMuleCollection::GetFileHash(size_t index) const { if (index >= GetFileCount()) { return "Invalid Index!"; } std::string retvalue = vCollection[index].m_fileHash; if (retvalue.empty()) { return "Empty String!"; } return retvalue; } template intType CMuleCollection::ReadInt(std::ifstream& infile) { intType integer = 0; infile.read(reinterpret_cast(&integer),sizeof(intType)); return integer; } std::string CMuleCollection::ReadString(std::ifstream& infile, int TagType = 0x02) { if (TagType >= 0x11 && TagType <= 0x20) { std::vector buffer(TagType - 0x10); infile.read(&buffer[0], TagType - 0x10); return buffer.empty() ? std::string() : std::string (buffer.begin(), buffer.end()); } if (TagType == 0x02) { uint16_t TagStringSize = ReadInt(infile); std::vector buffer (TagStringSize); infile.read(&buffer[0], TagStringSize); return buffer.empty() ? std::string() : std::string (buffer.begin(), buffer.end()); } return std::string(); } bool CMuleCollection::OpenBinary(const std::string &File) { std::ifstream infile; infile.open(File.c_str(), std::ifstream::in|std::ifstream::binary); if(!infile.is_open()) { return false; } uint32_t cVersion = ReadInt(infile); if (!infile.good() || ( cVersion != 0x01 && cVersion != 0x02)) { infile.close(); return false; } uint32_t hTagCount = ReadInt(infile); if (!infile.good() || hTagCount > 3) { infile.close(); return false; } for (size_t hTi = 0; hTi < hTagCount;hTi++) { int hTagType = infile.get(); // hTagFormat == 1 -> FT-value is given uint16_t hTagFormat = ReadInt(infile); if (hTagFormat != 0x0001) { infile.close(); return false; } int hTag = infile.get(); if (!infile.good()) { infile.close(); return false; } switch (hTag) { // FT_FILENAME case 0x01: { std::string fileName = ReadString(infile, hTagType); break; } // FT_COLLECTIONAUTHOR case 0x31: { std::string CollectionAuthor = ReadString(infile, hTagType); break; } // FT_COLLECTIONAUTHORKEY case 0x32: { uint32_t hTagBlobSize = ReadInt(infile); if (!infile.good()) { infile.close(); return false; } std::vector CollectionAuthorKey(hTagBlobSize); infile.read(&CollectionAuthorKey[0], hTagBlobSize); break; } // UNDEFINED TAG default: if (!infile.good()) { infile.close(); return false; } break; } } uint32_t cFileCount = ReadInt(infile); /* softlimit is set to 1024 to avoid problems with big uint32_t values I don't believe anyone would want to use an emulecollection file to store more than 1024 files, but just raise below value in case you know someone who does. */ if(!infile.good() || cFileCount > 1024) { infile.close(); return false; } for (size_t cFi = 0; cFi < cFileCount; ++cFi) { uint32_t fTagCount = ReadInt(infile); if (!infile.good() || fTagCount > 5) { infile.close(); return false; } std::string fileHash = std::string(32, '0'); uint64_t fileSize = 0; std::string fileName; std::string FileComment; for(size_t fTi = 0; fTi < fTagCount; ++fTi) { int fTagType = infile.get(); if (!infile.good()) { infile.close(); return false; } int fTag = infile.get(); if (!infile.good()) { infile.close(); return false; } switch (fTag) { // FT_FILEHASH case 0x28: { std::vector bFileHash(16); infile.read(&bFileHash[0], 16); std::string hex = "0123456789abcdef"; for (int pos = 0; pos < 16; pos++) { fileHash[pos*2] = hex[((bFileHash[pos] >> 4) & 0xF)]; fileHash[(pos*2) + 1] = hex[(bFileHash[pos]) & 0x0F]; } break; } // FT_FILESIZE case 0x02: { switch(fTagType) { case 0x83: { fileSize = ReadInt(infile); break; } case 0x88: { fileSize = ReadInt(infile); break; } case 0x89: { fileSize = infile.get(); break; } case 0x8b: { fileSize = ReadInt(infile); break; } default: // Invalid file structure infile.close(); return false; break; } break; } // FT_FILENAME case 0x01: { fileName = ReadString(infile, fTagType^0x80); break; } // FT_FILECOMMENT case 0xF6: { FileComment = ReadString(infile, fTagType^0x80); break; } // FT_FILERATING case 0xF7: { if (fTagType == 0x89) { // TAGTYPE_UINT8 // uint8_t FileRating = infile.get(); } else { infile.close(); return false; } break; } // UNDEFINED TAG default: infile.close(); return false; break; } if( !infile.good() ) { infile.close(); return false; } } AddFile(fileName, fileSize, fileHash); } infile.close(); return true; } bool CMuleCollection::OpenText(const std::string &File) { int numLinks = 0; std::string line; std::ifstream infile; infile.open(File.c_str(), std::ifstream::in|std::ifstream::binary); if (!infile.is_open()) { return false; } while (getline(infile, line, (char)10 /* LF */)) { int last = line.size()-1; if ((1 < last) && ((char)13 /* CR */ == line.at(last))) { line.erase(last); } if (AddLink(line)) { numLinks++; } } infile.close(); if(numLinks == 0) { return false; } return true; } bool CMuleCollection::AddLink(const std::string &Link) { // 12345678901234 56 7 + 32 + 89 = 19+32=51 // ed2k://|file|fileName|fileSize|fileHash|/ if (Link.size() < 51 || Link.substr(0,13) != "ed2k://|file|" || Link.substr(Link.size()-2) != "|/") { return false; } size_t iName = Link.find("|",13); if (iName == std::string::npos) { return false; } std::string fileName = Link.substr(13,iName-13); size_t iSize = Link.find("|",iName+1); if (iSize == std::string::npos) { return false; } std::stringstream sFileSize; sFileSize << Link.substr(iName+1,iSize-iName-1); uint64_t fileSize; if ((sFileSize >> std::dec >> fileSize).fail()) { return false; } size_t iHash = Link.find("|",iSize+1); if (iHash == std::string::npos) { return false; } std::string fileHash = Link.substr(iSize+1,32); return AddFile(fileName, fileSize, fileHash); } bool CMuleCollection::AddFile( const std::string &fileName, uint64_t fileSize, const std::string &fileHash) { if (fileName == "" || fileSize == 0 || fileSize > 0xffffffffLL || !IsValidHash(fileHash)) { return false; } vCollection.push_back( CollectionFile(fileName, fileSize, fileHash)); return true; } bool CMuleCollection::IsValidHash(const std::string &fileHash) { if (fileHash.size() != 32 || fileHash == "") { return false; } // fileHash needs to be a valid MD4Hash std::string hex = "0123456789abcdefABCDEF"; for(size_t i = 0; i < fileHash.size(); ++i) { if (hex.find(fileHash[i]) == std::string::npos) { return false; } } return true; } aMule-2.3.1/src/GuiEvents.h0000644000175000017470000005163111575347521014355 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2004-2011 Froenchenko Leonid (lfroen@users.sourceforge.net) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef GUIEVENTS_H #define GUIEVENTS_H #include #include "Types.h" #include "Constants.h" #define __need_convertinfo // We need only the ConvertInfo struct from PartFileConvert.h #include "PartFileConvert.h" class CKnownFile; class CSearchFile; class CPartFile; class CServer; class CFriend; class CClientRef; DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_NOTIFY, -1) /** * This namespaces contains a number of functions and classes * related to defered function calls, allowing a notification * call to be delayed till it can be initiated from the main * thread. */ namespace MuleNotify { /** * Creates a deep copy of the object passed. * * Note that this function should be overwritten as * needed. See the wxString version below. */ template inline ValueType DeepCopy(const ValueType& value) { return ValueType(value); } /** Special DeepCopy for wxString, which uses reference counting. */ inline wxString DeepCopy(const wxString& value) { return wxString(value.c_str(), value.Length()); } //////////////////////////////////////////////////////////// // Notification handlers // // These functions should not be called directly, but // through the Notify_*, etc. macros. // void SharedFilesShowFile(CKnownFile* file); void SharedFilesRemoveFile(CKnownFile* file); void SharedFilesRemoveAllFiles(); void SharedFilesShowFileList(); void SharedFilesUpdateItem(CKnownFile* file); void DownloadCtrlUpdateItem(const void* item); void SourceCtrlUpdateSource(uint32 source, SourceItemType type); void DownloadCtrlAddFile(CPartFile* file); void SourceCtrlAddSource(CPartFile* owner, CClientRef source, SourceItemType type); void DownloadCtrlRemoveFile(CPartFile* file); void SourceCtrlRemoveSource(uint32 source, const CPartFile* owner); void DownloadCtrlHideSource(CPartFile* file); void DownloadCtrlSort(); void DownloadCtrlDoItemSelectionChanged(); void SharedCtrlAddClient(CKnownFile* owner, CClientRef client, SourceItemType type); void SharedCtrlRefreshClient(uint32 client, SourceItemType type); void SharedCtrlRemoveClient(uint32 client, const CKnownFile* owner); void ServerAdd(CServer* server); void ServerRemove(CServer* server); void ServerRemoveDead(); void ServerRemoveAll(); void ServerHighlight(CServer* server, bool highlight); void ServerRefresh(CServer* server); void ServerFreeze(); void ServerThaw(); void ServerUpdateED2KInfo(); void ServerUpdateKadKInfo(); void SearchCancel(); void SearchLocalEnd(); void KadSearchEnd(uint32 id); void Search_Update_Sources(CSearchFile* result); void Search_Add_Result(CSearchFile* result); void ChatUpdateFriend(CFriend* Friend); void ChatRemoveFriend(CFriend* Friend); void ChatConnResult(bool success, uint64 id, wxString message); void ChatProcessMsg(uint64 sender, wxString message); void ChatSendCaptcha(wxString captcha, uint64 to_id); void ShowConnState(long state); void ShowUserCount(wxString str); void ShowUpdateCatTabTitles(); void ShowGUI(); void CategoryAdded(); void CategoryUpdate(uint32 cat); void CategoryDelete(uint32 cat); void NodesURLChanged(wxString url); void ServersURLChanged(wxString url); // Partfile conversion: Core -> GUI void ConvertUpdateProgress(float percent, wxString label, wxString header); void ConvertUpdateJobInfo(ConvertInfo info); void ConvertRemoveJobInfo(unsigned id); void ConvertClearInfos(); // Partfile conversion: GUI -> Core void ConvertRemoveJob(unsigned id); void ConvertRetryJob(unsigned id); void ConvertReaddAllJobs(); // // GUI -> core notification // void PartFile_Swap_A4AF(CPartFile* file); void PartFile_Swap_A4AF_Auto(CPartFile* file); void PartFile_Swap_A4AF_Others(CPartFile* file); void PartFile_Pause(CPartFile* file); void PartFile_Resume(CPartFile* file); void PartFile_Stop(CPartFile* file); void PartFile_PrioAuto(CPartFile* file, bool val); void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool bSave); void PartFile_Delete(CPartFile* file); void PartFile_SetCat(CPartFile* file, uint32 val); void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val); void KnownFile_Up_Prio_Auto(CKnownFile* file); void KnownFile_Comment_Set(CKnownFile* file, wxString comment, int8 rating); void Search_Add_Download(CSearchFile* result, uint8 category); void Search_Update_Progress(uint32 value); void Download_Set_Cat_Prio(uint8 cat, uint8 newprio); void Download_Set_Cat_Status(uint8 cat, int newstatus); void Upload_Resort_Queue(); void Client_Delete(CClientRef client); // // Notifications that always create an event // void IPFilter_Reload(); void IPFilter_Update(wxString url); //////////////////////////////////////////////////////////// // Notification utilities /** * The base class of the functions. * * This class allows the the notification call to be executed * without knowing the exact specifics of a given functor. */ class CMuleNotiferBase { public: /** The constructor does nothing. */ CMuleNotiferBase() {}; /** The destructor is virtual since we will be deleting pointers to this type. */ virtual ~CMuleNotiferBase() {}; /** Executes the actual notification call. */ virtual void Notify() const = 0; /** Returns a copy of the functor (function + arguments). */ virtual CMuleNotiferBase* Clone() const = 0; }; /** Notification functor for functions taking no arguments. */ class CMuleNotifier0 : public CMuleNotiferBase { public: typedef void (*FuncType)(); /** Creates a functor from the given function. */ CMuleNotifier0(FuncType func) : m_func(func) {} /** @see CMuleNotifierBase::Notify */ virtual void Notify() const { m_func(); } /** @see CMuleNotifierBase::Clone */ virtual CMuleNotiferBase* Clone() const { return new CMuleNotifier0(m_func); } private: FuncType m_func; }; /** Notification functor for functions taking 1 arguments. */ template class CMuleNotifier1 : public CMuleNotiferBase { public: typedef void (*FuncType)(ARG); /** Creates a functor from the given function and arguments. */ CMuleNotifier1(FuncType func, ARG arg) : m_func(func), m_arg(DeepCopy(arg)) {} /** @see CMuleNotifierBase::Notify */ virtual void Notify() const { m_func(m_arg); } /** @see CMuleNotifierBase::Clone */ virtual CMuleNotiferBase* Clone() const { return new CMuleNotifier1(m_func, m_arg); } private: FuncType m_func; ARG m_arg; }; /** Notification functor for functions taking 2 arguments. */ template class CMuleNotifier2 : public CMuleNotiferBase { public: typedef void (*FuncType)(ARG_1, ARG_2); /** Creates a functor from the given function and arguments. */ CMuleNotifier2(FuncType func, ARG_1 arg1, ARG_2 arg2) : m_func(func), m_arg1(DeepCopy(arg1)), m_arg2(DeepCopy(arg2)) {} /** @see CMuleNotifierBase:: Notify */ virtual void Notify() const { m_func(m_arg1, m_arg2); } /** @see CMuleNotifierBase::Clone */ virtual CMuleNotiferBase* Clone() const { return new CMuleNotifier2(m_func, m_arg1, m_arg2); } private: FuncType m_func; ARG_1 m_arg1; ARG_2 m_arg2; }; /** Notification functor for functions taking 3 arguments. */ template class CMuleNotifier3 : public CMuleNotiferBase { public: typedef void (*FuncType)(ARG_1, ARG_2, ARG_3); /** Creates a functor from the given function and arguments. */ CMuleNotifier3(FuncType func, ARG_1 arg1, ARG_2 arg2, ARG_3 arg3) : m_func(func), m_arg1(DeepCopy(arg1)), m_arg2(DeepCopy(arg2)), m_arg3(DeepCopy(arg3)) {} /** @see CMuleNotifierBase:: Notify */ virtual void Notify() const { m_func(m_arg1, m_arg2, m_arg3); } /** @see CMuleNotifierBase::Clone */ virtual CMuleNotiferBase* Clone() const { return new CMuleNotifier3(m_func, m_arg1, m_arg2, m_arg3); } private: FuncType m_func; ARG_1 m_arg1; ARG_2 m_arg2; ARG_3 m_arg3; }; /** * This event is sent when a worker-thread makes use of a notify-macro. * * This insures that all notifications are executed on the main thread, * thereby improving overall threadsafety. The events are currently * sent to wxTheApp. */ class CMuleGUIEvent : public wxEvent { public: /** Takes ownership a notifier functor. */ CMuleGUIEvent(CMuleNotiferBase* ntf) : wxEvent(-1, MULE_EVT_NOTIFY) , m_functor(ntf) { wxASSERT(m_functor); } /** Destructor, frees the functor object. */ virtual ~CMuleGUIEvent() { delete m_functor; } /** Executes the notification. */ void Notify() const { m_functor->Notify(); } /** @see wxEvent::Clone */ virtual wxEvent* Clone() const { return new CMuleGUIEvent(m_functor->Clone()); } private: /** Not copyable. */ CMuleGUIEvent(const CMuleGUIEvent&); /** Not assignable. */ CMuleGUIEvent& operator=(const CMuleGUIEvent&); //! The actual functor object, CMuleNotiferBase* m_functor; }; /** * This function will execute or queue a given notification functor. * * If the caller is the main thread, the functor is executed immediatly, * thus acting like a regular function call. OTOH, if the caller is a * worker thread, the functor is cloned and sent via an event to * wxTheApp. */ void HandleNotification(const CMuleNotiferBase& ntf); /** * These functions take a function pointer and a set of arguments, * matching those of the function-pointer. A functor is created * from these and either executed immediatly, or sent as an event * in the case of non-main threads calling the functions. * * Note that the return-value of the function must be void. * * IMPORTANT: Note that the functions passed to DoNotify must not * take arguments via references, since this causes the functors * to store references to the arguments, rather than a copy and * thus ends up with dangling references. */ //@{ inline void DoNotify(void (*func)()) { HandleNotification(CMuleNotifier0(func)); } template inline void DoNotify(void (*func)(A1A), A1B arg1) { HandleNotification(CMuleNotifier1(func, arg1)); } template inline void DoNotify(void (*func)(A1A, A2A), A1B arg1, A2B arg2) { HandleNotification(CMuleNotifier2(func, arg1, arg2)); } template inline void DoNotify(void (*func)(A1A, A2A, A3A), A1B arg1, A2B arg2, A3B arg3) { HandleNotification(CMuleNotifier3(func, arg1, arg2, arg3)); } //@} /** * The same as above, but these functions will always send an event, * even from the main thread. */ void HandleNotificationAlways(const CMuleNotiferBase& ntf); inline void DoNotifyAlways(void (*func)()) { HandleNotificationAlways(CMuleNotifier0(func)); } template inline void DoNotifyAlways(void (*func)(A1A), A1B arg1) { HandleNotificationAlways(CMuleNotifier1(func, arg1)); } template inline void DoNotifyAlways(void (*func)(A1A, A2A), A1B arg1, A2B arg2) { HandleNotificationAlways(CMuleNotifier2(func, arg1, arg2)); } template inline void DoNotifyAlways(void (*func)(A1A, A2A, A3A), A1B arg1, A2B arg2, A3B arg3) { HandleNotificationAlways(CMuleNotifier3(func, arg1, arg2, arg3)); } } //! Placing CMuleGUIEvent in the global namespace. using MuleNotify::CMuleGUIEvent; //! The event-handler type that takes a CMuleGUIEvent. typedef void (wxEvtHandler::*MuleNotifyEventFunction)(CMuleGUIEvent&); //! Event-handler for completed hashings of new shared files and partfiles. #define EVT_MULE_NOTIFY(func) \ DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_NOTIFY, -1, -1, \ (wxObjectEventFunction) (wxEventFunction) \ wxStaticCastEvent(MuleNotifyEventFunction, &func), (wxObject*) NULL), // SharedFilesCtrl #define Notify_SharedFilesShowFile(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesShowFile, file) #define Notify_SharedFilesRemoveFile(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesRemoveFile, file) #define Notify_SharedFilesRemoveAllItems() MuleNotify::DoNotify(&MuleNotify::SharedFilesRemoveAllFiles) #define Notify_SharedFilesShowFileList() MuleNotify::DoNotify(&MuleNotify::SharedFilesShowFileList) #define Notify_SharedFilesSort() MuleNotify::DoNotify(&MuleNotify::SharedFilesSort) #define Notify_SharedFilesUpdateItem(file) MuleNotify::DoNotify(&MuleNotify::SharedFilesUpdateItem, file) // download ctrl #define Notify_DownloadCtrlUpdateItem(ptr) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlUpdateItem, ptr) #define Notify_DownloadCtrlAddFile(file) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlAddFile, file) #define Notify_DownloadCtrlRemoveFile(file) MuleNotify::DoNotify(&MuleNotify::DownloadCtrlRemoveFile, file) #define Notify_DownloadCtrlSort() MuleNotify::DoNotify(&MuleNotify::DownloadCtrlSort) #define Notify_DownloadCtrlDoItemSelectionChanged() MuleNotify::DoNotifyAlways(&MuleNotify::DownloadCtrlDoItemSelectionChanged) // source ctrl #define Notify_SourceCtrlUpdateSource(ptr, val) MuleNotify::DoNotify(&MuleNotify::SourceCtrlUpdateSource, ptr, val) #define Notify_SourceCtrlAddSource(p0, p1, val) MuleNotify::DoNotify(&MuleNotify::SourceCtrlAddSource, p0, p1, val) #define Notify_SourceCtrlRemoveSource(ptr0, ptr1) MuleNotify::DoNotify(&MuleNotify::SourceCtrlRemoveSource, ptr0, ptr1) // upload ctrl #define Notify_SharedCtrlAddClient(p0, p1, val) MuleNotify::DoNotify(&MuleNotify::SharedCtrlAddClient, p0, p1, val) #define Notify_SharedCtrlRefreshClient(ptr, val) MuleNotify::DoNotify(&MuleNotify::SharedCtrlRefreshClient, ptr, val) #define Notify_SharedCtrlRemoveClient(p0, p1) MuleNotify::DoNotify(&MuleNotify::SharedCtrlRemoveClient, p0, p1) // server #define Notify_ServerAdd(ptr) MuleNotify::DoNotify(&MuleNotify::ServerAdd, ptr) #define Notify_ServerRemove(ptr) MuleNotify::DoNotify(&MuleNotify::ServerRemove, ptr) #define Notify_ServerRemoveDead() MuleNotify::DoNotify(&MuleNotify::ServerRemoveDead) #define Notify_ServerRemoveAll() MuleNotify::DoNotify(&MuleNotify::ServerRemoveAll) #define Notify_ServerHighlight(ptr, val) MuleNotify::DoNotify(&MuleNotify::ServerHighlight, ptr, val) #define Notify_ServerRefresh(ptr) MuleNotify::DoNotify(&MuleNotify::ServerRefresh, ptr) #define Notify_ServerFreeze() MuleNotify::DoNotify(&MuleNotify::ServerFreeze) #define Notify_ServerThaw() MuleNotify::DoNotify(&MuleNotify::ServerThaw) #define Notify_ServerUpdateED2KInfo() MuleNotify::DoNotify(&MuleNotify::ServerUpdateED2KInfo) #define Notify_ServerUpdateKadKInfo() MuleNotify::DoNotify(&MuleNotify::ServerUpdateKadKInfo) // search #define Notify_SearchCancel() MuleNotify::DoNotify(&MuleNotify::SearchCancel) #define Notify_SearchLocalEnd() MuleNotify::DoNotify(&MuleNotify::SearchLocalEnd) #define Notify_KadSearchEnd(val) MuleNotify::DoNotify(&MuleNotify::KadSearchEnd, val) #define Notify_Search_Update_Sources(ptr) MuleNotify::DoNotify(&MuleNotify::Search_Update_Sources, ptr) #define Notify_Search_Add_Result(s) MuleNotify::DoNotify(&MuleNotify::Search_Add_Result, s) // chat #define Notify_ChatUpdateFriend(ptr) MuleNotify::DoNotify(&MuleNotify::ChatUpdateFriend, ptr) #define Notify_ChatRemoveFriend(ptr) MuleNotify::DoNotify(&MuleNotify::ChatRemoveFriend, ptr) #define Notify_ChatConnResult(val0, val1, s) MuleNotify::DoNotify(&MuleNotify::ChatConnResult, val0, val1, s) #define Notify_ChatProcessMsg(val0, s) MuleNotify::DoNotify(&MuleNotify::ChatProcessMsg, val0, s) #define Notify_ChatSendCaptcha(val0, s) MuleNotify::DoNotify(&MuleNotify::ChatSendCaptcha, val0, s) // misc #define Notify_ShowConnState(val) MuleNotify::DoNotify(&MuleNotify::ShowConnState, val) #define Notify_ShowUserCount(str) MuleNotify::DoNotify(&MuleNotify::ShowUserCount, str) #define Notify_ShowUpdateCatTabTitles() MuleNotify::DoNotify(&MuleNotify::ShowUpdateCatTabTitles) #define Notify_ShowGUI() MuleNotify::DoNotify(&MuleNotify::ShowGUI) // categories #define Notify_CategoryAdded() MuleNotify::DoNotify(&MuleNotify::CategoryAdded) #define Notify_CategoryUpdate(cat) MuleNotify::DoNotify(&MuleNotify::CategoryUpdate, cat) #define Notify_CategoryDelete(cat) MuleNotify::DoNotify(&MuleNotify::CategoryDelete, cat) // server.met/nodes.dat default urls #define Notify_NodesURLChanged(url) MuleNotify::DoNotify(&MuleNotify::NodesURLChanged, url) #define Notify_ServersURLChanged(url) MuleNotify::DoNotify(&MuleNotify::ServersURLChanged, url) // Partfile conversion: Core -> GUI #define Notify_ConvertUpdateProgress(val, text) Notify_ConvertUpdateProgressFull(val, text, wxEmptyString) #define Notify_ConvertUpdateProgressFull(val, text, hdr) MuleNotify::DoNotify(&MuleNotify::ConvertUpdateProgress, val, text, hdr) #define Notify_ConvertUpdateJobInfo(info) MuleNotify::DoNotify(&MuleNotify::ConvertUpdateJobInfo, info) #define Notify_ConvertRemoveJobInfo(id) MuleNotify::DoNotify(&MuleNotify::ConvertRemoveJobInfo, id) #define Notify_ConvertClearInfos() MuleNotify::DoNotify(&MuleNotify::ConvertClearInfos) // Partfile conversion: GUI -> Core #define Notify_ConvertRemoveJob(id) MuleNotify::DoNotify(&MuleNotify::ConvertRemoveJob, id) #define Notify_ConvertRetryJob(id) MuleNotify::DoNotify(&MuleNotify::ConvertRetryJob, id) #define Notify_ConvertReaddAllJobs() MuleNotify::DoNotify(&MuleNotify::ConvertReaddAllJobs) // // GUI -> core notification // // PartFile #define CoreNotify_PartFile_Swap_A4AF(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF, ptr) #define CoreNotify_PartFile_Swap_A4AF_Auto(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF_Auto, ptr) #define CoreNotify_PartFile_Swap_A4AF_Others(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Swap_A4AF_Others, ptr) #define CoreNotify_PartFile_Pause(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Pause, ptr) #define CoreNotify_PartFile_Resume(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Resume, ptr) #define CoreNotify_PartFile_Stop(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Stop, ptr) #define CoreNotify_PartFile_PrioAuto(ptr, val) MuleNotify::DoNotify(&MuleNotify::PartFile_PrioAuto, ptr, val) #define CoreNotify_PartFile_PrioSet(p, v0, v1) MuleNotify::DoNotify(&MuleNotify::PartFile_PrioSet, p, v0, v1) #define CoreNotify_PartFile_Delete(ptr) MuleNotify::DoNotify(&MuleNotify::PartFile_Delete, ptr) #define CoreNotify_PartFile_SetCat(ptr, val) MuleNotify::DoNotify(&MuleNotify::PartFile_SetCat, ptr, val) // KnownFile #define CoreNotify_KnownFile_Up_Prio_Set(ptr, val) MuleNotify::DoNotify(&MuleNotify::KnownFile_Up_Prio_Set, ptr, val) #define CoreNotify_KnownFile_Up_Prio_Auto(ptr) MuleNotify::DoNotify(&MuleNotify::KnownFile_Up_Prio_Auto, ptr) #define CoreNotify_KnownFile_Comment_Set(ptr, v0, v1) MuleNotify::DoNotify(&MuleNotify::KnownFile_Comment_Set, ptr, v0, v1) // Search #define CoreNotify_Search_Add_Download(ptr, val) MuleNotify::DoNotify(&MuleNotify::Search_Add_Download, ptr, val) #define CoreNotify_Search_Update_Progress(val) MuleNotify::DoNotify(&MuleNotify::Search_Update_Progress, val) // download queue #define CoreNotify_Download_Set_Cat_Prio(cat, pri) MuleNotify::DoNotify(&MuleNotify::Download_Set_Cat_Prio, cat, pri) #define CoreNotify_Download_Set_Cat_Status(cat, st) MuleNotify::DoNotify(&MuleNotify::Download_Set_Cat_Status, cat, st) // upload queue #define CoreNotify_Upload_Resort_Queue() MuleNotify::DoNotify(&MuleNotify::Upload_Resort_Queue) // client #define CoreNotify_Client_Delete(client) MuleNotify::DoNotify(&MuleNotify::Client_Delete, client) // // Notifications that always create an event // // IP filter #define NotifyAlways_IPFilter_Reload() MuleNotify::DoNotifyAlways(&MuleNotify::IPFilter_Reload) #define NotifyAlways_IPFilter_Update(url) MuleNotify::DoNotifyAlways(&MuleNotify::IPFilter_Update, url) #endif // __GUIEVENTS_H__ // File_checked_for_headers aMule-2.3.1/src/ColorFrameCtrl.cpp0000644000175000017470000001006611575347521015652 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include "ColorFrameCtrl.h" // Interface declarations #include "MuleColour.h" ///////////////////////////////////////////////////////////////////////////// // CColorFrameCtrl CColorFrameCtrl::CColorFrameCtrl( wxWindow* parent,int id, int wid,int hei ) : wxControl(parent,id,wxDefaultPosition,wxSize(wid,hei)), m_brushBack(*wxBLACK_BRUSH), m_brushFrame(CMuleColour(0,255,255).GetBrush()) { SetSizeHints(wid,hei,wid,hei,0,0); wxRect rc=GetClientRect(); m_rectClient.left=rc.x; m_rectClient.top=rc.y; m_rectClient.right=rc.x + wid; m_rectClient.bottom=rc.y + hei; } // CColorFrameCtrl ///////////////////////////////////////////////////////////////////////////// CColorFrameCtrl::~CColorFrameCtrl() { } // ~CColorFrameCtrl BEGIN_EVENT_TABLE(CColorFrameCtrl,wxControl) EVT_PAINT(CColorFrameCtrl::OnPaint) EVT_SIZE(CColorFrameCtrl::OnSize) END_EVENT_TABLE() ///////////////////////////////////////////////////////////////////////////// // CColorFrameCtrl message handlers ///////////////////////////////////////////////////////////////////////////// void CColorFrameCtrl::SetFrameBrushColour(const wxColour& colour) { m_brushFrame = *(wxTheBrushList->FindOrCreateBrush(colour, wxSOLID)); Refresh(FALSE); } // SetFrameColor ///////////////////////////////////////////////////////////////////////////// void CColorFrameCtrl::SetBackgroundBrushColour(const wxColour& colour) { m_brushBack = *(wxTheBrushList->FindOrCreateBrush(colour, wxSOLID)); // clear out the existing garbage, re-start with a clean plot Refresh(FALSE); } // SetBackgroundColor //////////////////////////////////////////////////////////////////////////// void CColorFrameCtrl::OnPaint(wxPaintEvent& WXUNUSED(evt)) { wxPaintDC dc(this); wxRect rc; rc.x=m_rectClient.left; rc.y=m_rectClient.top; rc.width=m_rectClient.right-m_rectClient.left; rc.height=m_rectClient.bottom-m_rectClient.top; dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(m_brushBack); dc.DrawRectangle(rc); dc.SetPen(*wxBLACK_PEN); dc.DrawLine(rc.x+1,rc.y+1,rc.x+rc.width-2,rc.y+1); dc.DrawLine(rc.x+rc.width-2,rc.y+1,rc.x+rc.width-2,rc.y+rc.height-2); dc.DrawLine(rc.x+rc.width-2,rc.y+rc.height-2,rc.x+1,rc.y+rc.height-2); dc.DrawLine(rc.x+1,rc.y+rc.height-2,rc.x+1,rc.y+1); dc.SetPen(*wxWHITE_PEN); dc.DrawLine(rc.x+rc.width-1,rc.y,rc.x+rc.width-1,rc.y+rc.height-1); dc.DrawLine(rc.x+rc.width-1,rc.y+rc.height-1,rc.x,rc.y+rc.height-1); dc.SetPen(*wxGREY_PEN); dc.DrawLine(rc.x+rc.width,rc.y,rc.x,rc.y); dc.DrawLine(rc.x,rc.y,rc.x,rc.y+rc.height); } // OnPaint ///////////////////////////////////////////////////////////////////////////// void CColorFrameCtrl::OnSize(wxSizeEvent& WXUNUSED(evt)) { // NOTE: OnSize automatically gets called during the setup of the control // Kry - Not on Mac. wxRect rc=GetClientRect(); m_rectClient.left=rc.x; m_rectClient.top=rc.y; m_rectClient.right=rc.x + rc.width; m_rectClient.bottom=rc.y + rc.height; } // OnSize // File_checked_for_headers aMule-2.3.1/src/ServerListCtrl.cpp0000644000175000017470000004612411575347521015727 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ServerListCtrl.h" // Interface declarations #include #include #include #include #include #include "amule.h" // Needed for theApp #include "DownloadQueue.h" // Needed for CDownloadQueue #ifdef ENABLE_IP2COUNTRY #include "IP2Country.h" // Needed for IP2Country #include "amuleDlg.h" // Needed for IP2Country #endif #include "ServerList.h" // Needed for CServerList #include "ServerConnect.h" // Needed for CServerConnect #include "Server.h" // Needed for CServer and SRV_PR_* #include "Logger.h" #include // Needed for CFormat #define CMuleColour(x) (wxSystemSettings::GetColour(x)) BEGIN_EVENT_TABLE(CServerListCtrl,CMuleListCtrl) EVT_LIST_ITEM_RIGHT_CLICK( -1, CServerListCtrl::OnItemRightClicked) EVT_LIST_ITEM_ACTIVATED( -1, CServerListCtrl::OnItemActivated ) EVT_MENU( MP_PRIOLOW, CServerListCtrl::OnPriorityChange ) EVT_MENU( MP_PRIONORMAL, CServerListCtrl::OnPriorityChange ) EVT_MENU( MP_PRIOHIGH, CServerListCtrl::OnPriorityChange ) EVT_MENU( MP_ADDTOSTATIC, CServerListCtrl::OnStaticChange ) EVT_MENU( MP_REMOVEFROMSTATIC, CServerListCtrl::OnStaticChange ) EVT_MENU( MP_CONNECTTO, CServerListCtrl::OnConnectToServer ) EVT_MENU( MP_REMOVE, CServerListCtrl::OnRemoveServers ) EVT_MENU( MP_REMOVEALL, CServerListCtrl::OnRemoveServers ) EVT_MENU( MP_GETED2KLINK, CServerListCtrl::OnGetED2kURL ) EVT_CHAR( CServerListCtrl::OnKeyPressed ) END_EVENT_TABLE() CServerListCtrl::CServerListCtrl( wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) : CMuleListCtrl( parent, winid, pos, size, style, validator, name ) { // Setting the sorter function. SetSortFunc( SortProc ); // Set the table-name (for loading and saving preferences). SetTableName( wxT("Server") ); m_connected = 0; InsertColumn( COLUMN_SERVER_NAME, _("Server Name"), wxLIST_FORMAT_LEFT, 150, wxT("N") ); InsertColumn( COLUMN_SERVER_ADDR, _("Address"), wxLIST_FORMAT_LEFT, 140, wxT("A") ); InsertColumn( COLUMN_SERVER_PORT, _("Port"), wxLIST_FORMAT_LEFT, 25, wxT("P") ); InsertColumn( COLUMN_SERVER_DESC, _("Description"), wxLIST_FORMAT_LEFT, 150, wxT("D") ); InsertColumn( COLUMN_SERVER_PING, _("Ping"), wxLIST_FORMAT_LEFT, 25, wxT("p") ); InsertColumn( COLUMN_SERVER_USERS, _("Users"), wxLIST_FORMAT_LEFT, 40, wxT("U") ); InsertColumn( COLUMN_SERVER_FILES, _("Files"), wxLIST_FORMAT_LEFT, 45, wxT("F") ); InsertColumn( COLUMN_SERVER_PRIO, _("Priority"), wxLIST_FORMAT_LEFT, 60, wxT("r") ); InsertColumn( COLUMN_SERVER_FAILS, _("Failed"), wxLIST_FORMAT_LEFT, 40, wxT("f") ); InsertColumn( COLUMN_SERVER_STATIC, _("Static"), wxLIST_FORMAT_LEFT, 40, wxT("S") ); InsertColumn( COLUMN_SERVER_VERSION, _("Version"), wxLIST_FORMAT_LEFT, 80, wxT("V") ); #ifdef __DEBUG__ InsertColumn( COLUMN_SERVER_TCPFLAGS, wxT("TCP Flags"), wxLIST_FORMAT_LEFT, 80, wxT("t") ); InsertColumn( COLUMN_SERVER_UDPFLAGS, wxT("UDP Flags"), wxLIST_FORMAT_LEFT, 80, wxT("u") ); #endif LoadSettings(); } wxString CServerListCtrl::GetOldColumnOrder() const { return wxT("N,A,P,D,p,U,F,r,f,S,V,t,u"); } CServerListCtrl::~CServerListCtrl() { } void CServerListCtrl::AddServer( CServer* toadd ) { // RefreshServer will add the server. // This also means that we have simple duplicity checking. ;) RefreshServer( toadd ); ShowServerCount(); } void CServerListCtrl::RemoveServer(CServer* server) { long result = FindItem(-1, reinterpret_cast(server)); if ( result != -1 ) { DeleteItem(result); ShowServerCount(); } } void CServerListCtrl::RemoveAllServers(int state) { int pos = GetNextItem( -1, wxLIST_NEXT_ALL, state); bool connected = theApp->IsConnectedED2K() || theApp->serverconnect->IsConnecting(); while ( pos != -1 ) { CServer* server = (CServer*)GetItemData(pos); if (server == m_connected && connected) { wxMessageBox(_("You are connected to a server you are trying to delete. Please disconnect first. The server was NOT deleted."), _("Info"), wxOK, this); ++pos; } else if (server->IsStaticMember()) { const wxString name = (!server->GetListName() ? wxString(_("(Unknown name)")) : server->GetListName()); if (wxMessageBox(CFormat(_("Are you sure you want to delete the static server %s")) % name, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES) { theApp->serverlist->SetStaticServer(server, false); DeleteItem( pos ); theApp->serverlist->RemoveServer( server ); } else { ++pos; } } else { DeleteItem( pos ); theApp->serverlist->RemoveServer( server ); } pos = GetNextItem(pos - 1, wxLIST_NEXT_ALL, state); } ShowServerCount(); } void CServerListCtrl::RefreshServer( CServer* server ) { // Cant really refresh a NULL server if (!server) { return; } wxUIntPtr ptr = reinterpret_cast(server); long itemnr = FindItem( -1, ptr ); if ( itemnr == -1 ) { // We are not at the sure that the server isn't in the list, so we can re-add itemnr = InsertItem( GetInsertPos( ptr ), server->GetListName() ); SetItemPtrData( itemnr, ptr ); wxListItem item; item.SetId( itemnr ); item.SetBackgroundColour(CMuleColour(wxSYS_COLOUR_LISTBOX)); SetItem( item ); } wxString serverName; #ifdef ENABLE_IP2COUNTRY // Get the country name if (theApp->amuledlg->m_IP2Country->IsEnabled() && thePrefs::IsGeoIPEnabled()) { const CountryData& countrydata = theApp->amuledlg->m_IP2Country->GetCountryData(server->GetFullIP()); serverName << countrydata.Name; serverName << wxT(" - "); } #endif // ENABLE_IP2COUNTRY serverName << server->GetListName(); SetItem(itemnr, COLUMN_SERVER_NAME, serverName); SetItem(itemnr, COLUMN_SERVER_ADDR, server->GetAddress()); if (server->GetAuxPortsList().IsEmpty()) { SetItem( itemnr, COLUMN_SERVER_PORT, CFormat(wxT("%u")) % server->GetPort()); } else { SetItem( itemnr, COLUMN_SERVER_PORT, CFormat(wxT("%u (%s)")) % server->GetPort() % server->GetAuxPortsList()); } SetItem( itemnr, COLUMN_SERVER_DESC, server->GetDescription() ); if ( server->GetPing() ) { SetItem( itemnr, COLUMN_SERVER_PING, CastSecondsToHM(server->GetPing()/1000, server->GetPing() % 1000 ) ); } else { SetItem( itemnr, COLUMN_SERVER_PING, wxEmptyString ); } if ( server->GetUsers() ) { SetItem( itemnr, COLUMN_SERVER_USERS, CFormat(wxT("%u")) % server->GetUsers()); } else { SetItem( itemnr, COLUMN_SERVER_USERS, wxEmptyString ); } if ( server->GetFiles() ) { SetItem( itemnr, COLUMN_SERVER_FILES, CFormat(wxT("%u")) % server->GetFiles()); } else { SetItem( itemnr, COLUMN_SERVER_FILES, wxEmptyString ); } switch ( server->GetPreferences() ) { case SRV_PR_LOW: SetItem(itemnr, COLUMN_SERVER_PRIO, _("Low")); break; case SRV_PR_NORMAL: SetItem(itemnr, COLUMN_SERVER_PRIO, _("Normal")); break; case SRV_PR_HIGH: SetItem(itemnr, COLUMN_SERVER_PRIO, _("High") ); break; default: SetItem(itemnr, COLUMN_SERVER_PRIO, wxT("---")); // this should never happen } SetItem( itemnr, COLUMN_SERVER_FAILS, CFormat(wxT("%u")) % server->GetFailedCount()); SetItem( itemnr, COLUMN_SERVER_STATIC, ( server->IsStaticMember() ? _("Yes") : _("No") ) ); SetItem( itemnr, COLUMN_SERVER_VERSION, server->GetVersion() ); #if defined(__DEBUG__) && !defined(CLIENT_GUI) wxString flags; /* TCP */ if (server->GetTCPFlags() & SRV_TCPFLG_COMPRESSION) { flags += wxT("c"); } if (server->GetTCPFlags() & SRV_TCPFLG_NEWTAGS) { flags += wxT("n"); } if (server->GetTCPFlags() & SRV_TCPFLG_UNICODE) { flags += wxT("u"); } if (server->GetTCPFlags() & SRV_TCPFLG_RELATEDSEARCH) { flags += wxT("r"); } if (server->GetTCPFlags() & SRV_TCPFLG_TYPETAGINTEGER) { flags += wxT("t"); } if (server->GetTCPFlags() & SRV_TCPFLG_LARGEFILES) { flags += wxT("l"); } if (server->GetTCPFlags() & SRV_TCPFLG_TCPOBFUSCATION) { flags += wxT("o"); } SetItem( itemnr, COLUMN_SERVER_TCPFLAGS, flags ); /* UDP */ flags.Clear(); if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES) { flags += wxT("g"); } if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETFILES) { flags += wxT("f"); } if (server->GetUDPFlags() & SRV_UDPFLG_NEWTAGS) { flags += wxT("n"); } if (server->GetUDPFlags() & SRV_UDPFLG_UNICODE) { flags += wxT("u"); } if (server->GetUDPFlags() & SRV_UDPFLG_EXT_GETSOURCES2) { flags += wxT("G"); } if (server->GetUDPFlags() & SRV_UDPFLG_LARGEFILES) { flags += wxT("l"); } if (server->GetUDPFlags() & SRV_UDPFLG_UDPOBFUSCATION) { flags += wxT("o"); } if (server->GetUDPFlags() & SRV_UDPFLG_TCPOBFUSCATION) { flags += wxT("O"); } SetItem( itemnr, COLUMN_SERVER_UDPFLAGS, flags ); #endif // Deletions of items causes rather large ammount of flicker, so to // avoid this, we resort the list to ensure correct ordering. if (!IsItemSorted(itemnr)) { SortList(); } } void CServerListCtrl::HighlightServer( const CServer* server, bool highlight ) { // Unset the old highlighted server if we are going to set a new one if ( m_connected && highlight ) { // A recursive call to do the real work. HighlightServer( m_connected, false ); m_connected = 0; } long itemnr = FindItem( -1, reinterpret_cast(server) ); if ( itemnr > -1 ) { wxListItem item; item.SetId( itemnr ); if ( GetItem( item ) ) { wxFont font = GetFont(); if ( highlight ) { font.SetWeight( wxBOLD ); m_connected = server; } item.SetFont( font ); SetItem( item ); } } } void CServerListCtrl::ShowServerCount() { wxStaticText* label = CastByName( wxT("serverListLabel"), GetParent(), wxStaticText ); if ( label ) { label->SetLabel(CFormat(_("Servers (%i)")) % GetItemCount()); label->GetParent()->Layout(); } } void CServerListCtrl::OnItemActivated( wxListEvent& event ) { // Unselect all items but the activated one long item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); while ( item > -1 ) { SetItemState( item, 0, wxLIST_STATE_SELECTED); item = GetNextItem( item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } SetItemState( event.GetIndex(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); wxCommandEvent nulEvt; OnConnectToServer( nulEvt ); } void CServerListCtrl::OnItemRightClicked(wxListEvent& event) { // Check if clicked item is selected. If not, unselect all and select it. long index = CheckSelection(event); bool enable_reconnect = false; bool enable_static_on = false; bool enable_static_off = false; // Gather information on the selected items while ( index > -1 ) { CServer* server = (CServer*)GetItemData( index ); // The current server is selected, so we might display the reconnect option if (server == m_connected) { enable_reconnect = true; } // We want to know which options should be enabled, either one or both enable_static_on |= !server->IsStaticMember(); enable_static_off |= server->IsStaticMember(); index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } wxMenu* serverMenu = new wxMenu(_("Server")); wxMenu* serverPrioMenu = new wxMenu(); serverPrioMenu->Append( MP_PRIOLOW, _("Low") ); serverPrioMenu->Append( MP_PRIONORMAL, _("Normal") ); serverPrioMenu->Append( MP_PRIOHIGH, _("High") ); serverMenu->Append( MP_CONNECTTO, _("Connect to server") ); serverMenu->Append( 12345, _("Priority"), serverPrioMenu ); serverMenu->AppendSeparator(); if (GetSelectedItemCount() == 1) { serverMenu->Append( MP_ADDTOSTATIC, _("Mark server as static") ); serverMenu->Append( MP_REMOVEFROMSTATIC, _("Mark server as non-static") ); } else { serverMenu->Append( MP_ADDTOSTATIC, _("Mark servers as static") ); serverMenu->Append( MP_REMOVEFROMSTATIC, _("Mark servers as non-static") ); } serverMenu->AppendSeparator(); if (GetSelectedItemCount() == 1) { serverMenu->Append( MP_REMOVE, _("Remove server") ); } else { serverMenu->Append( MP_REMOVE, _("Remove servers") ); } serverMenu->Append( MP_REMOVEALL, _("Remove all servers") ); serverMenu->AppendSeparator(); if (GetSelectedItemCount() == 1) { serverMenu->Append( MP_GETED2KLINK, _("Copy eD2k link to clipboard") ); } else { serverMenu->Append( MP_GETED2KLINK, _("Copy eD2k links to clipboard") ); } serverMenu->Enable( MP_REMOVEFROMSTATIC, enable_static_off ); serverMenu->Enable( MP_ADDTOSTATIC, enable_static_on ); if ( GetSelectedItemCount() == 1 ) { if ( enable_reconnect ) serverMenu->SetLabel( MP_CONNECTTO, _("Reconnect to server") ); } else { serverMenu->Enable( MP_CONNECTTO, false ); } PopupMenu( serverMenu, event.GetPoint() ); delete serverMenu; } void CServerListCtrl::OnPriorityChange( wxCommandEvent& event ) { uint32 priority = 0; switch ( event.GetId() ) { case MP_PRIOLOW: priority = SRV_PR_LOW; break; case MP_PRIONORMAL: priority = SRV_PR_NORMAL; break; case MP_PRIOHIGH: priority = SRV_PR_HIGH; break; default: return; } ItemDataList items = GetSelectedItems(); for ( unsigned int i = 0; i < items.size(); ++i ) { CServer* server = (CServer*)items[ i ]; theApp->serverlist->SetServerPrio(server, priority); } } void CServerListCtrl::OnStaticChange( wxCommandEvent& event ) { bool isStatic = ( event.GetId() == MP_ADDTOSTATIC ); ItemDataList items = GetSelectedItems(); for ( unsigned int i = 0; i < items.size(); ++i ) { CServer* server = (CServer*)items[ i ]; // Only update items that have the wrong setting if ( server->IsStaticMember() != isStatic ) { theApp->serverlist->SetStaticServer(server, isStatic); } } } void CServerListCtrl::OnConnectToServer( wxCommandEvent& WXUNUSED(event) ) { int item = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); if ( item > -1 ) { if ( theApp->IsConnectedED2K() ) { theApp->serverconnect->Disconnect(); } theApp->serverconnect->ConnectToServer( (CServer*)GetItemData( item ) ); } } void CServerListCtrl::OnGetED2kURL( wxCommandEvent& WXUNUSED(event) ) { int pos = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); wxString URL; while ( pos != -1 ) { CServer* server = (CServer*)GetItemData(pos); URL += CFormat(wxT("ed2k://|server|%s|%d|/\n")) % server->GetFullIP() % server->GetPort(); pos = GetNextItem( pos, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } URL.RemoveLast(); theApp->CopyTextToClipboard( URL ); } void CServerListCtrl::OnRemoveServers( wxCommandEvent& event ) { if ( event.GetId() == MP_REMOVEALL ) { if ( GetItemCount() ) { wxString question = _("Are you sure that you wish to delete all servers?"); if ( wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES ) { if ( theApp->serverconnect->IsConnecting() ) { theApp->downloadqueue->StopUDPRequests(); theApp->serverconnect->StopConnectionTry(); theApp->serverconnect->Disconnect(); } RemoveAllServers(wxLIST_STATE_DONTCARE); } } } else if ( event.GetId() == MP_REMOVE ) { if ( GetSelectedItemCount() ) { wxString question; if (GetSelectedItemCount() == 1) { question = _("Are you sure that you wish to delete the selected server?"); } else { question = _("Are you sure that you wish to delete the selected servers?"); } if ( wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES ) { RemoveAllServers(wxLIST_STATE_SELECTED); } } } } void CServerListCtrl::OnKeyPressed( wxKeyEvent& event ) { // Check if delete was pressed if ((event.GetKeyCode() == WXK_DELETE) || (event.GetKeyCode() == WXK_NUMPAD_DELETE)) { wxCommandEvent evt; evt.SetId( MP_REMOVE ); OnRemoveServers( evt ); } else { event.Skip(); } } int CServerListCtrl::SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData) { CServer* server1 = (CServer*)item1; CServer* server2 = (CServer*)item2; int mode = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; switch (sortData & CMuleListCtrl::COLUMN_MASK) { // Sort by server-name case COLUMN_SERVER_NAME: return mode * server1->GetListName().CmpNoCase(server2->GetListName()); // Sort by address case COLUMN_SERVER_ADDR: { if ( server1->HasDynIP() && server2->HasDynIP()) { return mode * server1->GetDynIP().CmpNoCase( server2->GetDynIP() ); } else if (server1->HasDynIP()) { return mode * -1; } else if (server2->HasDynIP()) { return mode * 1; } else { uint32 a = wxUINT32_SWAP_ALWAYS(server1->GetIP()); uint32 b = wxUINT32_SWAP_ALWAYS(server2->GetIP()); return mode * CmpAny(a, b); } } // Sort by port case COLUMN_SERVER_PORT: return mode * CmpAny( server1->GetPort(), server2->GetPort() ); // Sort by description case COLUMN_SERVER_DESC: return mode * server1->GetDescription().CmpNoCase( server2->GetDescription() ); // Sort by Ping // The -1 ensures that a value of zero (no ping known) is sorted last. case COLUMN_SERVER_PING: return mode * CmpAny( server1->GetPing() - 1, server2->GetPing() -1 ); // Sort by user-count case COLUMN_SERVER_USERS: return mode * CmpAny( server1->GetUsers(), server2->GetUsers() ); // Sort by file-count case COLUMN_SERVER_FILES: return mode * CmpAny( server1->GetFiles(), server2->GetFiles() ); // Sort by priority case COLUMN_SERVER_PRIO: { uint32 srv_pr1 = server1->GetPreferences(); uint32 srv_pr2 = server2->GetPreferences(); switch ( srv_pr1 ) { case SRV_PR_HIGH: srv_pr1 = SRV_PR_MAX; break; case SRV_PR_NORMAL: srv_pr1 = SRV_PR_MID; break; case SRV_PR_LOW: srv_pr1 = SRV_PR_MIN; break; default: return 0; } switch ( srv_pr2 ) { case SRV_PR_HIGH: srv_pr2 = SRV_PR_MAX; break; case SRV_PR_NORMAL: srv_pr2 = SRV_PR_MID; break; case SRV_PR_LOW: srv_pr2 = SRV_PR_MIN; break; default: return 0; } return mode * CmpAny( srv_pr1, srv_pr2 ); } // Sort by failure-count case COLUMN_SERVER_FAILS: return mode * CmpAny( server1->GetFailedCount(), server2->GetFailedCount() ); // Sort by static servers case COLUMN_SERVER_STATIC: { return mode * CmpAny( server2->IsStaticMember(), server1->IsStaticMember() ); } // Sort by version case COLUMN_SERVER_VERSION: return mode * FuzzyStrCmp(server1->GetVersion(), server2->GetVersion()); default: return 0; } } // File_checked_for_headers aMule-2.3.1/src/ServerConnect.h0000644000175000017470000000760511575347521015226 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // // // Client to Server communication // #ifndef SERVERCONNECT_H #define SERVERCONNECT_H #include "amuleIPV4Address.h" // Needed for amuleIPV4Address #include "Timer.h" // Needed for CTimer #include // Needed for std::map class CServerList; class CServerSocket; class CServer; class CPacket; class CServerUDPSocket; #define CS_FATALERROR -5 #define CS_DISCONNECTED -4 #define CS_SERVERDEAD -3 #define CS_ERROR -2 #define CS_SERVERFULL -1 #define CS_NOTCONNECTED 0 #define CS_CONNECTING 1 #define CS_CONNECTED 2 #define CS_WAITFORLOGIN 3 #define CS_RETRYCONNECTTIME 30 // seconds typedef std::map ServerSocketMap; class CServerConnect { public: CServerConnect(CServerList* in_serverlist, amuleIPV4Address &address); ~CServerConnect(); void ConnectionFailed(CServerSocket* sender); void ConnectionEstablished(CServerSocket* sender); void ConnectToAnyServer(bool prioSort = true, bool bNoCrypt = false); void ConnectToServer(CServer* toconnect, bool multiconnect = false, bool bNoCrypt = false); void StopConnectionTry(); void CheckForTimeout(); // safe socket closure and destruction void DestroySocket(CServerSocket* pSck); bool SendPacket(CPacket* packet,bool delpacket = true, CServerSocket* to = 0); // Creteil Begin bool IsUDPSocketAvailable() const { return serverudpsocket != NULL; } // Creteil End bool SendUDPPacket(CPacket* packet,CServer* host, bool delpacket, bool rawpacket = false, uint16 port_offset = 4); bool Disconnect(); bool IsConnecting() { return connecting; } bool IsConnected() { return connected; } uint32 GetClientID() { return clientid; } CServer*GetCurrentServer(); uint32 clientid; uint8 pendingConnects; bool IsLowID() { return ::IsLowID(clientid); } void SetClientID(uint32 newid); bool IsLocalServer(uint32 dwIP, uint16 nPort); void TryAnotherConnectionrequest(); bool IsSingleConnect() { return singleconnecting; } void KeepConnectionAlive(); bool AwaitingTestFromIP(uint32 ip); bool IsConnectedObfuscated() const; /** * Called when a socket has been DNS resolved. * * @param socket The socket object requesting DNS resolution. * @param ip The found IP, or zero on error. * * Note that 'socket' may or may not refer to an valid object, * and should be checked before being used. */ void OnServerHostnameResolved(void* socket, uint32 ip); private: bool connecting; bool singleconnecting; bool connected; int8 max_simcons; bool m_bTryObfuscated; bool m_recurseTryAnotherConnectionrequest; CServerSocket* connectedsocket; CServerList* used_list; CServerUDPSocket* serverudpsocket; // list of currently opened sockets typedef std::list SocketsList; SocketsList m_lstOpenSockets; CTimer m_idRetryTimer; ServerSocketMap connectionattemps; }; #endif // SERVERCONNECT_H // File_checked_for_headers aMule-2.3.1/src/UploadClient.cpp0000644000175000017470000007062611575347521015367 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "updownclient.h" // Needed for CUpDownClient #include #include #include #include "ClientCredits.h" // Needed for CClientCredits #include "Packet.h" // Needed for CPacket #include "MemFile.h" // Needed for CMemFile #include "UploadQueue.h" // Needed for CUploadQueue #include "DownloadQueue.h" // Needed for CDownloadQueue #include "PartFile.h" // Needed for PR_POWERSHARE #include "ClientTCPSocket.h" // Needed for CClientTCPSocket #include "SharedFileList.h" // Needed for CSharedFileList #include "amule.h" // Needed for theApp #include "ClientList.h" #include "Statistics.h" // Needed for theStats #include "Logger.h" #include "ScopedPtr.h" // Needed for CScopedArray #include "GuiEvents.h" // Needed for Notify_* #include "FileArea.h" // Needed for CFileArea // members of CUpDownClient // which are mainly used for uploading functions void CUpDownClient::SetUploadState(uint8 eNewState) { if (eNewState != m_nUploadState) { if (m_nUploadState == US_UPLOADING) { // Reset upload data rate computation m_nUpDatarate = 0; m_nSumForAvgUpDataRate = 0; m_AvarageUDR_list.clear(); } if (eNewState == US_UPLOADING) { m_fSentOutOfPartReqs = 0; } // don't add any final cleanups for US_NONE here m_nUploadState = eNewState; UpdateDisplayedInfo(true); } } uint32 CUpDownClient::CalculateScoreInternal() { //TODO: complete this (friends, uploadspeed, amuleuser etc etc) if (m_Username.IsEmpty()) { return 0; } if (credits == 0) { return 0; } const CKnownFile* pFile = GetUploadFile(); if ( !pFile ) { return 0; } // bad clients (see note in function) if (IsBadGuy()) { return 0; } // friend slot if (IsFriend() && GetFriendSlot() && !HasLowID()) { return 0x0FFFFFFF; } if (IsBanned()) return 0; // score applies only to waiting clients, not to downloading clients if (IsDownloading()) { return 0; } // calculate score, based on waitingtime and other factors float fBaseValue = (float)(::GetTickCount()-GetWaitStartTime())/1000; fBaseValue *= GetScoreRatio(); // credits // Take file upload priority into account // // One yet unsolved problem here: // sometimes a client asks for 2 files and there is no way to decide, which file the // client finally gets. so it could happen that he is queued first because of a // high prio file, but then asks for something completely different. float filepriority; switch (pFile->GetUpPriority()) { case PR_POWERSHARE: filepriority = 250.0f; break; case PR_VERYHIGH: filepriority = 1.8f; break; case PR_HIGH: filepriority = 0.9f; break; case PR_LOW: filepriority = 0.6f; break; case PR_VERYLOW: filepriority = 0.2f; break; case PR_NORMAL: default: filepriority = 0.7f; break; } fBaseValue *= filepriority; if ( (IsEmuleClient() || GetClientSoft() < 10) && m_byEmuleVersion <= 0x19) { fBaseValue *= 0.5f; } return (uint32)fBaseValue; } // Checks if it is next requested block from another chunk of the actual file or from another file // // [Returns] // true : Next requested block is from another different chunk or file than last downloaded block // false: Next requested block is from same chunk that last downloaded block bool CUpDownClient::IsDifferentPartBlock() const // [Tarod 12/22/2002] { bool different_part = false; // Check if we have good lists and proceed to check for different chunks if ((!m_BlockRequests_queue.empty()) && !m_DoneBlocks_list.empty()) { Requested_Block_Struct* last_done_block = NULL; Requested_Block_Struct* next_requested_block = NULL; uint64 last_done_part = 0xffffffff; uint64 next_requested_part = 0xffffffff; // Get last block and next pending last_done_block = m_DoneBlocks_list.front(); next_requested_block = m_BlockRequests_queue.front(); // Calculate corresponding parts to blocks last_done_part = last_done_block->StartOffset / PARTSIZE; next_requested_part = next_requested_block->StartOffset / PARTSIZE; // Test is we are asking same file and same part if ( last_done_part != next_requested_part) { different_part = true; AddDebugLogLineN(logClient, wxT("Session ended due to new chunk.")); } if (md4cmp(last_done_block->FileID, next_requested_block->FileID) != 0) { different_part = true; AddDebugLogLineN(logClient, wxT("Session ended due to different file.")); } } return different_part; } void CUpDownClient::CreateNextBlockPackage() { try { // Buffer new data if current buffer is less than 100 KBytes while (!m_BlockRequests_queue.empty() && m_addedPayloadQueueSession - m_nCurQueueSessionPayloadUp < 100*1024) { Requested_Block_Struct* currentblock = m_BlockRequests_queue.front(); CKnownFile* srcfile = theApp->sharedfiles->GetFileByID(CMD4Hash(currentblock->FileID)); if (!srcfile) { throw wxString(wxT("requested file not found")); } // Check if this know file is a CPartFile. // For completed part files IsPartFile() returns false, so they are // correctly treated as plain CKnownFile. CPartFile* srcPartFile = srcfile->IsPartFile() ? (CPartFile*)srcfile : NULL; // THIS EndOffset points BEHIND the last byte requested // (other than the offsets used in the PartFile code) if (currentblock->EndOffset > srcfile->GetFileSize()) { throw wxString(CFormat(wxT("Asked for data up to %d beyond end of file (%d)")) % currentblock->EndOffset % srcfile->GetFileSize()); } else if (currentblock->StartOffset > currentblock->EndOffset) { throw wxString(CFormat(wxT("Asked for invalid block (start %d > end %d)")) % currentblock->StartOffset % currentblock->EndOffset); } uint64 togo = currentblock->EndOffset - currentblock->StartOffset; if (togo > EMBLOCKSIZE * 3) { throw wxString(CFormat(wxT("Client requested too large block (%d > %d)")) % togo % (EMBLOCKSIZE * 3)); } CFileArea area; if (srcPartFile) { if (!srcPartFile->IsComplete(currentblock->StartOffset,currentblock->EndOffset-1)) { throw wxString(CFormat(wxT("Asked for incomplete block (%d - %d)")) % currentblock->StartOffset % (currentblock->EndOffset-1)); } if (!srcPartFile->ReadData(area, currentblock->StartOffset, togo)) { throw wxString(wxT("Failed to read from requested partfile")); } } else { CFileAutoClose file; CPath fullname = srcfile->GetFilePath().JoinPaths(srcfile->GetFileName()); if ( !file.Open(fullname, CFile::read) ) { // The file was most likely moved/deleted. So remove it from the list of shared files. AddLogLineN(CFormat( _("Failed to open file (%s), removing from list of shared files.") ) % srcfile->GetFileName() ); theApp->sharedfiles->RemoveFile(srcfile); throw wxString(wxT("Failed to open requested file: Removing from list of shared files!")); } area.ReadAt(file, currentblock->StartOffset, togo); } area.CheckError(); SetUploadFileID(srcfile); // check extention to decide whether to compress or not if (m_byDataCompVer == 1 && GetFiletype(srcfile->GetFileName()) != ftArchive) { CreatePackedPackets(area.GetBuffer(), togo, currentblock); } else { CreateStandardPackets(area.GetBuffer(), togo, currentblock); } // file statistic srcfile->statistic.AddTransferred(togo); m_addedPayloadQueueSession += togo; Requested_Block_Struct* block = m_BlockRequests_queue.front(); m_BlockRequests_queue.pop_front(); m_DoneBlocks_list.push_front(block); } return; } catch (const wxString& DEBUG_ONLY(error)) { AddDebugLogLineN(logClient, CFormat(wxT("Client '%s' (%s) caused error while creating packet (%s) - disconnecting client")) % GetUserName() % GetFullIP() % error); } catch (const CIOFailureException& error) { AddDebugLogLineC(logClient, wxT("IO failure while reading requested file: ") + error.what()); } catch (const CEOFException& WXUNUSED(error)) { AddDebugLogLineC(logClient, GetClientFullInfo() + wxT(" requested file-data at an invalid position - disconnecting")); } // Error occured. theApp->uploadqueue->RemoveFromUploadQueue(this); } void CUpDownClient::CreateStandardPackets(const byte* buffer, uint32 togo, Requested_Block_Struct* currentblock) { uint32 nPacketSize; CMemFile memfile(buffer, togo); if (togo > 10240) { nPacketSize = togo/(uint32)(togo/10240); } else { nPacketSize = togo; } while (togo){ if (togo < nPacketSize*2) { nPacketSize = togo; } wxASSERT(nPacketSize); togo -= nPacketSize; uint64 endpos = (currentblock->EndOffset - togo); uint64 startpos = endpos - nPacketSize; bool bLargeBlocks = (startpos > 0xFFFFFFFF) || (endpos > 0xFFFFFFFF); CMemFile data(nPacketSize + 16 + 2 * (bLargeBlocks ? 8 :4)); data.WriteHash(GetUploadFileID()); if (bLargeBlocks) { data.WriteUInt64(startpos); data.WriteUInt64(endpos); } else { data.WriteUInt32(startpos); data.WriteUInt32(endpos); } char *tempbuf = new char[nPacketSize]; memfile.Read(tempbuf, nPacketSize); data.Write(tempbuf, nPacketSize); delete [] tempbuf; CPacket* packet = new CPacket(data, (bLargeBlocks ? OP_EMULEPROT : OP_EDONKEYPROT), (bLargeBlocks ? (uint8)OP_SENDINGPART_I64 : (uint8)OP_SENDINGPART)); theStats::AddUpOverheadFileRequest(16 + 2 * (bLargeBlocks ? 8 :4)); theStats::AddUploadToSoft(GetClientSoft(), nPacketSize); AddDebugLogLineN(logLocalClient, CFormat(wxT("Local Client: %s to %s")) % (bLargeBlocks ? wxT("OP_SENDINGPART_I64") : wxT("OP_SENDINGPART")) % GetFullIP() ); m_socket->SendPacket(packet,true,false, nPacketSize); } } void CUpDownClient::CreatePackedPackets(const byte* buffer, uint32 togo, Requested_Block_Struct* currentblock) { uLongf newsize = togo+300; CScopedArray output(newsize); uint16 result = compress2(output.get(), &newsize, buffer, togo, 9); if (result != Z_OK || togo <= newsize){ CreateStandardPackets(buffer, togo, currentblock); return; } CMemFile memfile(output.get(), newsize); uint32 totalPayloadSize = 0; uint32 oldSize = togo; togo = newsize; uint32 nPacketSize; if (togo > 10240) { nPacketSize = togo/(uint32)(togo/10240); } else { nPacketSize = togo; } while (togo) { if (togo < nPacketSize*2) { nPacketSize = togo; } togo -= nPacketSize; bool isLargeBlock = (currentblock->StartOffset > 0xFFFFFFFF) || (currentblock->EndOffset > 0xFFFFFFFF); CMemFile data(nPacketSize + 16 + (isLargeBlock ? 12 : 8)); data.WriteHash(GetUploadFileID()); if (isLargeBlock) { data.WriteUInt64(currentblock->StartOffset); } else { data.WriteUInt32(currentblock->StartOffset); } data.WriteUInt32(newsize); char *tempbuf = new char[nPacketSize]; memfile.Read(tempbuf, nPacketSize); data.Write(tempbuf,nPacketSize); delete [] tempbuf; CPacket* packet = new CPacket(data, OP_EMULEPROT, (isLargeBlock ? OP_COMPRESSEDPART_I64 : OP_COMPRESSEDPART)); // approximate payload size uint32 payloadSize = nPacketSize*oldSize/newsize; if (togo == 0 && totalPayloadSize+payloadSize < oldSize) { payloadSize = oldSize-totalPayloadSize; } totalPayloadSize += payloadSize; // put packet directly on socket theStats::AddUpOverheadFileRequest(24); theStats::AddUploadToSoft(GetClientSoft(), nPacketSize); AddDebugLogLineN(logLocalClient, CFormat(wxT("Local Client: %s to %s")) % (isLargeBlock ? wxT("OP_COMPRESSEDPART_I64") : wxT("OP_COMPRESSEDPART")) % GetFullIP() ); m_socket->SendPacket(packet,true,false, payloadSize); } } void CUpDownClient::ProcessExtendedInfo(const CMemFile *data, CKnownFile *tempreqfile) { m_uploadingfile->UpdateUpPartsFrequency( this, false ); // Decrement m_upPartStatus.clear(); m_nUpCompleteSourcesCount= 0; if( GetExtendedRequestsVersion() == 0 ) { // Something is coded wrong on this client if he's sending something it doesn't advertise. return; } if (data->GetLength() == 16) { // Wrong again. Advertised >0 but send a 0-type packet. // But this time we'll disconnect it. throw CInvalidPacket(wxT("Wrong size on extended info packet")); } uint16 nED2KUpPartCount = data->ReadUInt16(); if (!nED2KUpPartCount) { m_upPartStatus.setsize( tempreqfile->GetPartCount(), 0 ); } else { if (tempreqfile->GetED2KPartCount() != nED2KUpPartCount) { // We already checked if we are talking about the same file.. So if we get here, something really strange happened! m_upPartStatus.clear(); return; } m_upPartStatus.setsize( tempreqfile->GetPartCount(), 0 ); try { uint16 done = 0; while (done != m_upPartStatus.size()) { uint8 toread = data->ReadUInt8(); for (sint32 i = 0;i != 8;i++){ m_upPartStatus.set(done, (toread>>i)&1); // We may want to use this for another feature.. // if (m_upPartStatus[done] && !tempreqfile->IsComplete(done*PARTSIZE,((done+1)*PARTSIZE)-1)) // bPartsNeeded = true; done++; if (done == m_upPartStatus.size()) { break; } } } } catch (...) { // We want the increment the frequency even if we didn't read everything m_uploadingfile->UpdateUpPartsFrequency( this, true ); // Increment throw; } if (GetExtendedRequestsVersion() > 1) { uint16 nCompleteCountLast = GetUpCompleteSourcesCount(); uint16 nCompleteCountNew = data->ReadUInt16(); SetUpCompleteSourcesCount(nCompleteCountNew); if (nCompleteCountLast != nCompleteCountNew) { tempreqfile->UpdatePartsInfo(); } } } m_uploadingfile->UpdateUpPartsFrequency( this, true ); // Increment Notify_SharedCtrlRefreshClient(ECID(), AVAILABLE_SOURCE); } void CUpDownClient::SetUploadFileID(CKnownFile* newreqfile) { if (m_uploadingfile == newreqfile) { return; } else if (m_uploadingfile) { m_uploadingfile->RemoveUploadingClient(this); m_uploadingfile->UpdateUpPartsFrequency(this, false); // Decrement } if (newreqfile) { // This is a new file! update info newreqfile->AddUploadingClient(this); if (m_requpfileid != newreqfile->GetFileHash()) { m_requpfileid = newreqfile->GetFileHash(); m_upPartStatus.setsize( newreqfile->GetPartCount(), 0 ); } else { // this is the same file we already had assigned. Only update data. newreqfile->UpdateUpPartsFrequency(this, true); // Increment } m_uploadingfile = newreqfile; } else { m_upPartStatus.clear(); m_nUpCompleteSourcesCount = 0; // This clears m_uploadingfile and m_requpfileid ClearUploadFileID(); } } void CUpDownClient::AddReqBlock(Requested_Block_Struct* reqblock) { if (GetUploadState() != US_UPLOADING) { AddDebugLogLineN(logRemoteClient, wxT("UploadClient: Client tried to add requested block when not in upload slot! Prevented requested blocks from being added.")); delete reqblock; return; } { std::list::iterator it = m_DoneBlocks_list.begin(); for (; it != m_DoneBlocks_list.end(); ++it) { if (reqblock->StartOffset == (*it)->StartOffset && reqblock->EndOffset == (*it)->EndOffset) { delete reqblock; return; } } } { std::list::iterator it = m_BlockRequests_queue.begin(); for (; it != m_BlockRequests_queue.end(); ++it) { if (reqblock->StartOffset == (*it)->StartOffset && reqblock->EndOffset == (*it)->EndOffset) { delete reqblock; return; } } } m_BlockRequests_queue.push_back(reqblock); } uint32 CUpDownClient::GetWaitStartTime() const { uint32 dwResult = 0; if ( credits ) { dwResult = credits->GetSecureWaitStartTime(GetIP()); if (dwResult > m_dwUploadTime && IsDownloading()) { // This happens only if two clients with invalid securehash are in the queue - if at all dwResult = m_dwUploadTime - 1; } } return dwResult; } void CUpDownClient::SetWaitStartTime() { if ( credits ) { credits->SetSecWaitStartTime(GetIP()); } } void CUpDownClient::ClearWaitStartTime() { if ( credits ) { credits->ClearWaitStartTime(); } } void CUpDownClient::ResetSessionUp() { m_nCurSessionUp = m_nTransferredUp; m_addedPayloadQueueSession = 0; m_nCurQueueSessionPayloadUp = 0; // If upload was resumed there can be a remaining payload in the socket // causing (prepared - sent) getting negative. So reset the counter here. if (m_socket) { CEMSocket* s = m_socket; s->GetSentPayloadSinceLastCallAndReset(); } } uint32 CUpDownClient::SendBlockData() { uint32 curTick = ::GetTickCount(); uint64 sentBytesCompleteFile = 0; uint64 sentBytesPartFile = 0; uint64 sentBytesPayload = 0; if (m_socket) { CEMSocket* s = m_socket; // uint32 uUpStatsPort = GetUserPort(); // Extended statistics information based on which client software and which port we sent this data to... // This also updates the grand total for sent bytes, etc. And where this data came from. sentBytesCompleteFile = s->GetSentBytesCompleteFileSinceLastCallAndReset(); sentBytesPartFile = s->GetSentBytesPartFileSinceLastCallAndReset(); // thePrefs.Add2SessionTransferData(GetClientSoft(), uUpStatsPort, false, true, sentBytesCompleteFile, (IsFriend() && GetFriendSlot())); // thePrefs.Add2SessionTransferData(GetClientSoft(), uUpStatsPort, true, true, sentBytesPartFile, (IsFriend() && GetFriendSlot())); m_nTransferredUp += sentBytesCompleteFile + sentBytesPartFile; credits->AddUploaded(sentBytesCompleteFile + sentBytesPartFile, GetIP(), theApp->CryptoAvailable()); sentBytesPayload = s->GetSentPayloadSinceLastCallAndReset(); m_nCurQueueSessionPayloadUp += sentBytesPayload; if (theApp->uploadqueue->CheckForTimeOver(this)) { theApp->uploadqueue->RemoveFromUploadQueue(this); SendOutOfPartReqsAndAddToWaitingQueue(); } else { // read blocks from file and put on socket CreateNextBlockPackage(); } } if(sentBytesCompleteFile + sentBytesPartFile > 0 || m_AvarageUDR_list.empty() || (curTick - m_AvarageUDR_list.back().timestamp) > 1*1000) { // Store how much data we've transferred this round, // to be able to calculate average speed later // keep sum of all values in list up to date TransferredData newitem = {sentBytesCompleteFile + sentBytesPartFile, curTick}; m_AvarageUDR_list.push_back(newitem); m_nSumForAvgUpDataRate += sentBytesCompleteFile + sentBytesPartFile; } // remove to old values in list while ((!m_AvarageUDR_list.empty()) && (curTick - m_AvarageUDR_list.front().timestamp) > 10*1000) { // keep sum of all values in list up to date m_nSumForAvgUpDataRate -= m_AvarageUDR_list.front().datalen; m_AvarageUDR_list.pop_front(); } // Calculate average speed for this slot if ((!m_AvarageUDR_list.empty()) && (curTick - m_AvarageUDR_list.front().timestamp) > 0 && GetUpStartTimeDelay() > 2*1000) { m_nUpDatarate = ((uint64)m_nSumForAvgUpDataRate*1000) / (curTick-m_AvarageUDR_list.front().timestamp); } else { // not enough values to calculate trustworthy speed. Use -1 to tell this m_nUpDatarate = 0; //-1; } // Check if it's time to update the display. m_cSendblock++; if (m_cSendblock == 30){ m_cSendblock = 0; Notify_SharedCtrlRefreshClient(ECID(), AVAILABLE_SOURCE); } return sentBytesCompleteFile + sentBytesPartFile; } void CUpDownClient::SendOutOfPartReqsAndAddToWaitingQueue() { // Kry - this is actually taken from eMule, but makes a lot of sense ;) //OP_OUTOFPARTREQS will tell the downloading client to go back to OnQueue.. //The main reason for this is that if we put the client back on queue and it goes //back to the upload before the socket times out... We get a situation where the //downloader thinks it already sent the requested blocks and the uploader thinks //the downloader didn't send any request blocks. Then the connection times out.. //I did some tests with eDonkey also and it seems to work well with them also.. // Send this inmediately, don't queue. CPacket* pPacket = new CPacket(OP_OUTOFPARTREQS, 0, OP_EDONKEYPROT); theStats::AddUpOverheadFileRequest(pPacket->GetPacketSize()); AddDebugLogLineN( logLocalClient, wxT("Local Client: OP_OUTOFPARTREQS to ") + GetFullIP() ); SendPacket(pPacket, true, true); theApp->uploadqueue->AddClientToQueue(this); } /** * See description for CEMSocket::TruncateQueues(). */ void CUpDownClient::FlushSendBlocks() { // Call this when you stop upload, or the socket might be not able to send if (m_socket) { //socket may be NULL... m_socket->TruncateQueues(); } } void CUpDownClient::SendHashsetPacket(const CMD4Hash& forfileid) { CKnownFile* file = theApp->sharedfiles->GetFileByID( forfileid ); bool from_dq = false; if ( !file ) { from_dq = true; if ((file = theApp->downloadqueue->GetFileByID(forfileid)) == NULL) { AddLogLineN(CFormat( _("Hashset requested for unknown file: %s") ) % forfileid.Encode() ); return; } } if ( !file->GetHashCount() ) { if (from_dq) { AddDebugLogLineN(logRemoteClient, wxT("Requested hashset could not be found")); return; } else { file = theApp->downloadqueue->GetFileByID(forfileid); if (!(file && file->GetHashCount())) { AddDebugLogLineN(logRemoteClient, wxT("Requested hashset could not be found")); return; } } } CMemFile data(1024); data.WriteHash(file->GetFileHash()); uint16 parts = file->GetHashCount(); data.WriteUInt16(parts); for (int i = 0; i != parts; i++) { data.WriteHash(file->GetPartHash(i)); } CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_HASHSETANSWER); theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); AddDebugLogLineN(logLocalClient, wxT("Local Client: OP_HASHSETANSWER to ") + GetFullIP()); SendPacket(packet,true,true); } void CUpDownClient::ClearUploadBlockRequests() { FlushSendBlocks(); DeleteContents(m_BlockRequests_queue); DeleteContents(m_DoneBlocks_list); } void CUpDownClient::SendRankingInfo(){ if (!ExtProtocolAvailable()) { return; } uint16 nRank = GetUploadQueueWaitingPosition(); if (!nRank) { return; } CMemFile data; data.WriteUInt16(nRank); // Kry: what are these zero bytes for. are they really correct? // Kry - Well, eMule does like that. I guess they're ok. data.WriteUInt32(0); data.WriteUInt32(0); data.WriteUInt16(0); CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_QUEUERANKING); theStats::AddUpOverheadOther(packet->GetPacketSize()); AddDebugLogLineN(logLocalClient, wxT("Local Client: OP_QUEUERANKING to ") + GetFullIP()); SendPacket(packet,true,true); } void CUpDownClient::SendCommentInfo(CKnownFile* file) { if (!m_bCommentDirty || file == NULL || !ExtProtocolAvailable() || m_byAcceptCommentVer < 1) { return; } m_bCommentDirty = false; // Truncate to max len. wxString desc = file->GetFileComment().Left(MAXFILECOMMENTLEN); uint8 rating = file->GetFileRating(); if ( file->GetFileRating() == 0 && desc.IsEmpty() ) { return; } CMemFile data(256); data.WriteUInt8(rating); data.WriteString(desc, GetUnicodeSupport(), 4 /* size it's uint32 */); CPacket* packet = new CPacket(data, OP_EMULEPROT, OP_FILEDESC); theStats::AddUpOverheadOther(packet->GetPacketSize()); AddDebugLogLineN(logLocalClient, wxT("Local Client: OP_FILEDESC to ") + GetFullIP()); SendPacket(packet,true); } void CUpDownClient::UnBan(){ m_Aggressiveness = 0; theApp->clientlist->AddTrackClient(this); theApp->clientlist->RemoveBannedClient( GetIP() ); SetUploadState(US_NONE); ClearWaitStartTime(); } void CUpDownClient::Ban(){ theApp->clientlist->AddTrackClient(this); theApp->clientlist->AddBannedClient( GetIP() ); AddDebugLogLineN(logClient, wxT("Client '") + GetUserName() + wxT("' seems to be an aggressive client and is banned from the uploadqueue")); SetUploadState(US_BANNED); Notify_SharedCtrlRefreshClient(ECID(), UNAVAILABLE_SOURCE); } bool CUpDownClient::IsBanned() const { return ( (theApp->clientlist->IsBannedClient(GetIP()) ) && m_nDownloadState != DS_DOWNLOADING); } void CUpDownClient::CheckForAggressive() { uint32 cur_time = ::GetTickCount(); // First call, initalize if ( !m_LastFileRequest ) { m_LastFileRequest = cur_time; return; } // Is this an aggressive request? if ( ( cur_time - m_LastFileRequest ) < MIN_REQUESTTIME ) { m_Aggressiveness += 3; // Is the client EVIL? if ( m_Aggressiveness >= 10 && (!IsBanned() && m_nDownloadState != DS_DOWNLOADING )) { AddDebugLogLineN(logClient, CFormat( wxT("Aggressive client banned (score: %d): %s -- %s -- %s") ) % m_Aggressiveness % m_Username % m_strModVersion % m_fullClientVerString ); Ban(); } } else { // Polite request, reward client if ( m_Aggressiveness ) m_Aggressiveness--; } m_LastFileRequest = cur_time; } void CUpDownClient::SetUploadFileID(const CMD4Hash& new_id) { // Update the uploading file found CKnownFile* uploadingfile = theApp->sharedfiles->GetFileByID(new_id); if ( !uploadingfile ) { // Can this really happen? uploadingfile = theApp->downloadqueue->GetFileByID(new_id); } SetUploadFileID(uploadingfile); // This will update queue count on old and new file. } void CUpDownClient::ProcessRequestPartsPacket(const byte* pachPacket, uint32 nSize, bool largeblocks) { CMemFile data(pachPacket, nSize); CMD4Hash reqfilehash = data.ReadHash(); uint64 auStartOffsets[3]; uint64 auEndOffsets[3]; if (largeblocks) { auStartOffsets[0] = data.ReadUInt64(); auStartOffsets[1] = data.ReadUInt64(); auStartOffsets[2] = data.ReadUInt64(); auEndOffsets[0] = data.ReadUInt64(); auEndOffsets[1] = data.ReadUInt64(); auEndOffsets[2] = data.ReadUInt64(); } else { auStartOffsets[0] = data.ReadUInt32(); auStartOffsets[1] = data.ReadUInt32(); auStartOffsets[2] = data.ReadUInt32(); auEndOffsets[0] = data.ReadUInt32(); auEndOffsets[1] = data.ReadUInt32(); auEndOffsets[2] = data.ReadUInt32(); } for (unsigned int i = 0; i < itemsof(auStartOffsets); i++) { AddDebugLogLineN(logClient, CFormat(wxT("Client %s requests %d File block %d-%d (%d bytes):")) % GetFullIP() % i % auStartOffsets[i] % auEndOffsets[i] % (auEndOffsets[i] - auStartOffsets[i])); if (auEndOffsets[i] > auStartOffsets[i]) { Requested_Block_Struct* reqblock = new Requested_Block_Struct; reqblock->StartOffset = auStartOffsets[i]; reqblock->EndOffset = auEndOffsets[i]; md4cpy(reqblock->FileID, reqfilehash.GetHash()); reqblock->transferred = 0; AddReqBlock(reqblock); } else { if (auEndOffsets[i] != 0 || auStartOffsets[i] != 0) { AddDebugLogLineN(logClient, wxT("Client request is invalid!")); } } } } void CUpDownClient::ProcessRequestPartsPacketv2(const CMemFile& data) { CMD4Hash reqfilehash = data.ReadHash(); uint8 numblocks = data.ReadUInt8(); for (int i = 0; i < numblocks; i++) { Requested_Block_Struct* reqblock = new Requested_Block_Struct; try { reqblock->StartOffset = data.GetIntTagValue(); // We have to do +1, because the block matching uses that. reqblock->EndOffset = data.GetIntTagValue() + 1; if ((reqblock->StartOffset || reqblock->EndOffset) && (reqblock->StartOffset > reqblock->EndOffset)) { AddDebugLogLineN(logClient, CFormat(wxT("Client %s request is invalid! %d / %d")) % GetFullIP() % reqblock->StartOffset % reqblock->EndOffset); throw wxString(wxT("Client request is invalid!")); } AddDebugLogLineN(logClient, CFormat(wxT("Client %s requests %d File block %d-%d (%d bytes):")) % GetFullIP() % i % reqblock->StartOffset % reqblock->EndOffset % (reqblock->EndOffset - reqblock->StartOffset)); md4cpy(reqblock->FileID, reqfilehash.GetHash()); reqblock->transferred = 0; AddReqBlock(reqblock); } catch (...) { delete reqblock; throw; } } } // File_checked_for_headers aMule-2.3.1/src/BitVector.h0000644000175000017470000000757611575347521014356 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2009-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2009-2011 Stu Redman ( sturedman@amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef BITVECTOR_H #define BITVECTOR_H // // Packed bit vector // class BitVector { public: BitVector() { m_bits = 0; m_bytes = 0; m_allTrue = 0; m_vector = NULL; } ~BitVector() { clear(); } // number of bits uint32 size() const { return m_bits; } // is it empty? bool empty() const { return m_bits == 0; } // get bit at index bool get(uint32 idx) const { if (idx >= m_bits) { wxFAIL; return false; } return (m_vector[idx / 8] & s_posMask[idx & 7]) != 0; } // set bit at index void set(uint32 idx, bool value) { if (idx >= m_bits) { wxFAIL; return; } uint32 bidx = idx / 8; if (value) { m_vector[bidx] = m_vector[bidx] | s_posMask[idx & 7]; // If it was not all true before, then we don't know now. if (m_allTrue == 0) { m_allTrue = 2; } } else { m_vector[bidx] = m_vector[bidx] & s_negMask[idx & 7]; m_allTrue = 0; } } // set number of bits to zero and free memory void clear() { m_bits = 0; m_bytes = 0; m_allTrue = 0; delete[] m_vector; m_vector = NULL; } // set number of bits and initialize them with value void setsize(uint32 newsize, bool value) { if (newsize == 0) { clear(); return; } m_bits = newsize; m_bytes = newsize / 8; if (newsize & 7) { m_bytes++; } delete[] m_vector; m_vector = new uint8[m_bytes]; memset(m_vector, value ? 0xFF : 0, m_bytes); m_allTrue = value ? 1 : 0; } // are all bits true ? bool AllTrue() const { if (m_allTrue == 2) { // don't know, have to check bool foundFalse = false; uint32 lastByte = m_bytes; if (m_bits & 7) { // uneven: check bits of last byte individually lastByte--; for (uint32 i = m_bits & 0xfffffff8; !foundFalse && i < m_bits; i++) { foundFalse = !get(i); } } // check bytewise for (uint32 i = 0; !foundFalse && i < lastByte; i++) { foundFalse = m_vector[i] != 0xff; } // This is really just a caching of information, // so m_allTrue is mutable and AllTrue() still const. m_allTrue = foundFalse ? 0 : 1; } return m_allTrue == 1; } // set all bits to true void SetAllTrue() { if (m_bytes) { memset(m_vector, 0xFF, m_bytes); } } // handling of the internal buffer (for EC) // get size uint32 SizeBuffer() const { return m_bytes; } // get buffer const void* GetBuffer() const { return m_vector; } // set buffer void SetBuffer(const void* src) { memcpy(m_vector, src, m_bytes); m_allTrue = 2; } private: uint32 m_bits; // number of bits uint32 m_bytes; // number of bytes in the vector uint8 * m_vector; // the storage mutable uint8 m_allTrue;// All true ? 0: no 1: yes 2: don't know static const uint8 s_posMask[]; // = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; implemented in OtherFunctions.cpp static const uint8 s_negMask[]; // = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; }; #endif aMule-2.3.1/src/FileDetailListCtrl.h0000644000175000017470000000317511575347521016127 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef FILEDETAILLISTCTRL_H #define FILEDETAILLISTCTRL_H #include "MuleListCtrl.h" // Needed for CMuleListCtrl class CFileDetailListCtrl : public CMuleListCtrl { public: CFileDetailListCtrl(wxWindow * &parent, int id, const wxPoint & pos, wxSize siz, int flags); private: struct SourcenameItem { wxString name; long count; }; static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); void OnSelect(wxListEvent& event); DECLARE_EVENT_TABLE() }; #endif // FILEDETAILLISTCTRL_H // File_checked_for_headers aMule-2.3.1/src/EditServerListDlg.h0000644000175000017470000000311211575347521015772 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Drager // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef EDITSERVERLISTDLG_H #define EDITSERVERLISTDLG_H class wxTextCtrl; class EditServerListDlg : public wxDialog { public: EditServerListDlg(wxWindow *parent, const wxString& caption, const wxString& message, const wxString& filename); virtual ~EditServerListDlg(); void OnOK(wxCommandEvent& event); protected: wxTextCtrl* m_textctrl; wxString m_file; private: DECLARE_EVENT_TABLE() }; #endif // EDITSERVERLISTDLG_H // File_checked_for_headers aMule-2.3.1/src/StatisticsDlg.cpp0000644000175000017470000002534311575347521015561 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include // Needed for std::ceil #include "ColorFrameCtrl.h" // Needed for CColorFrameCtrl #include "OtherFunctions.h" // Needed for CastChild() #include "OScopeCtrl.h" // Needed for COScopeCtrl #include "Preferences.h" // Needed for thePrefs #include "muuli_wdr.h" // Needed for statsDlg() #include "StatisticsDlg.h" // Interface declarations #include "Statistics.h" class CTreeItemData : public wxTreeItemData { public: explicit CTreeItemData(uint32_t uniqueid) : m_uniqueid(uniqueid) {} uint32_t GetUniqueId() const throw() { return m_uniqueid; } void SetUniqueId(uint32_t val) throw() { m_uniqueid = val; } private: uint32_t m_uniqueid; }; // CStatisticsDlg panel const wxColour& CStatisticsDlg::getColors(unsigned num) { wxCHECK(num < 15, *wxBLACK); return acrStat[num]; } CStatisticsDlg::CStatisticsDlg(wxWindow* pParent, CStatistics* stats) : wxPanel(pParent, -1) { wxSizer* content=statsDlg(this,TRUE); content->Show(this,TRUE); pscopeDL = CastChild( wxT("dloadScope"), COScopeCtrl ); pscopeDL->graph_type = GRAPH_DOWN; pscopeUL = CastChild( wxT("uloadScope"), COScopeCtrl ); pscopeUL->graph_type = GRAPH_UP; pscopeConn = CastChild( wxT("otherScope"), COScopeCtrl ); pscopeConn->graph_type = GRAPH_CONN; stattree = CastChild( wxT("statTree"), wxTreeCtrl ); m_stats = stats; } CStatisticsDlg::~CStatisticsDlg() { } void CStatisticsDlg::Init() { InitGraphs(); InitTree(); } void CStatisticsDlg::InitGraphs() { // called after preferences get initialised for (int index=0; index<=10; ++index) { ApplyStatsColor(index); } pscopeDL->SetRanges(0.0, (float)(thePrefs::GetMaxGraphDownloadRate()+4)); pscopeDL->SetYUnits(_("kB/s")); pscopeUL->SetRanges(0.0, (float)(thePrefs::GetMaxGraphUploadRate()+4)); pscopeUL->SetYUnits(_("kB/s")); pscopeConn->SetRanges(0.0, (float)(thePrefs::GetStatsMax())); pscopeConn->SetYUnits(wxEmptyString); SetUpdatePeriod(thePrefs::GetTrafficOMeterInterval()); } // this array is now used to store the current color settings and to define the defaults wxColour CStatisticsDlg::acrStat[cntStatColors] = { wxColour(0,0,64), wxColour(192,192,255), wxColour(128, 255, 128), wxColour(0, 210, 0), wxColour(0, 128, 0), wxColour(255, 128, 128), wxColour(200, 0, 0), wxColour(140, 0, 0), wxColour(150, 150, 255), wxColour(192, 0, 192), wxColour(255, 255, 128), wxColour(0, 0, 0), wxColour(128, 255, 128), wxColour(0, 210, 0), wxColour(0, 128, 0) }; void CStatisticsDlg::ApplyStatsColor(int index) { static char aTrend[] = { 0,0, 2, 1, 0, 2, 1, 0, 1, 2, 0 }; static int aRes[] = { 0,0, IDC_C0,IDC_C0_3,IDC_C0_2, IDC_C1,IDC_C1_3,IDC_C1_2, IDC_S0,IDC_S3,IDC_S1 }; static COScopeCtrl** apscope[] = { NULL, NULL, &pscopeDL,&pscopeDL,&pscopeDL, &pscopeUL,&pscopeUL,&pscopeUL, &pscopeConn,&pscopeConn,&pscopeConn }; const wxColour& cr = acrStat[index]; int iRes = aRes[index]; int iTrend = aTrend[index]; COScopeCtrl** ppscope = apscope[index]; CColorFrameCtrl* ctrl; switch (index) { case 0: pscopeDL->SetBackgroundColor(cr); pscopeUL->SetBackgroundColor(cr); pscopeConn->SetBackgroundColor(cr); break; case 1: pscopeDL->SetGridColor(cr); pscopeUL->SetGridColor(cr); pscopeConn->SetGridColor(cr); break; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: (*ppscope)->SetPlotColor(cr, iTrend); if ((ctrl = CastChild(iRes, CColorFrameCtrl)) == NULL) { throw wxString(CFormat(wxT("CStatisticsDlg::ApplyStatsColor: control missing (%d)\n")) % iRes); } ctrl->SetBackgroundBrushColour(cr); ctrl->SetFrameBrushColour(*wxBLACK); break; default: break; // ignore unknown index, like SysTray speedbar color } } void CStatisticsDlg::UpdateStatGraphs(const uint32 peakconnections, const GraphUpdateInfo& update) { std::vector v1(3); v1[0] = const_cast(&update.downloads[0]); v1[1] = const_cast(&update.downloads[1]); v1[2] = const_cast(&update.downloads[2]); const std::vector &apfDown(v1); std::vector v2(3); v2[0] = const_cast(&update.uploads[0]); v2[1] = const_cast(&update.uploads[1]); v2[2] = const_cast(&update.uploads[2]); const std::vector &apfUp(v2); std::vector v3(3); v3[0] = const_cast(&update.connections[0]); v3[1] = const_cast(&update.connections[1]); v3[2] = const_cast(&update.connections[2]); const std::vector &apfConn(v3); if (!IsShownOnScreen()) { pscopeDL->DelayPoints(); pscopeUL->DelayPoints(); pscopeConn->DelayPoints(); } static unsigned nScalePrev=1; unsigned nScale = (unsigned)std::ceil((float)peakconnections / pscopeConn->GetUpperLimit()); if (nScale != nScalePrev) { nScalePrev = nScale; wxStaticText* label = CastChild( ID_ACTIVEC, wxStaticText ); label->SetLabel(CFormat(_("Active connections (1:%u)")) % nScale); label->GetParent()->Layout(); pscopeConn->SetRange(0.0, (float)nScale*pscopeConn->GetUpperLimit(), 1); } if (!IsShownOnScreen()) { return; } pscopeDL->AppendPoints(update.timestamp, apfDown); pscopeUL->AppendPoints(update.timestamp, apfUp); pscopeConn->AppendPoints(update.timestamp, apfConn); } void CStatisticsDlg::SetUpdatePeriod(int step) { // this gets called after the value in Preferences/Statistics/Update delay has been changed if (step == 0) { pscopeDL->Stop(); pscopeUL->Stop(); pscopeConn->Stop(); } else { pscopeDL->Reset(step); pscopeUL->Reset(step); pscopeConn->Reset(step); } } void CStatisticsDlg::ResetAveragingTime() { // this gets called after the value in Preferences/Statistics/time for running avg has been changed pscopeDL->InvalidateGraph(); pscopeUL->InvalidateGraph(); } void CStatisticsDlg::SetARange(bool SetDownload,int maxValue) { if ( SetDownload ) { pscopeDL->SetRanges( 0, maxValue + 4 ); } else { pscopeUL->SetRanges( 0, maxValue + 4 ); } } void CStatisticsDlg::InitTree() { #ifndef CLIENT_GUI wxTreeItemId root = #endif stattree->AddRoot(theStats::GetTreeRoot()->GetDisplayString()); ShowStatistics(true); #ifndef CLIENT_GUI // Expand root stattree->Expand(root); // Expand main items wxTreeItemIdValue cookie; wxTreeItemId expand_it = stattree->GetFirstChild(root,cookie); while(expand_it.IsOk()) { stattree->Expand(expand_it); // Next on this level expand_it = stattree->GetNextSibling(expand_it); } #endif } void CStatisticsDlg::GetExpandedNodes(NodeIdSet& nodeset, const wxTreeItemId& root) { wxTreeItemIdValue cookie; wxTreeItemId temp_it = stattree->GetFirstChild(root,cookie); while (temp_it.IsOk()) { if (stattree->IsExpanded(temp_it)) { nodeset.insert(dynamic_cast(stattree->GetItemData(temp_it))->GetUniqueId()); } if (stattree->ItemHasChildren(temp_it)) { GetExpandedNodes(nodeset, temp_it); } temp_it = stattree->GetNextSibling(temp_it); } } void CStatisticsDlg::ShowStatistics(bool init) { NodeIdSet ExpandedNodes; // If it's not the first initialization of the tree, i.e. application startup if (!init) { GetExpandedNodes(ExpandedNodes, stattree->GetRootItem()); // Update sorting / get tree via EC m_stats->UpdateStatsTree(); } CStatTreeItemBase* treeRoot = theStats::GetTreeRoot(); wxTreeItemId root = stattree->GetRootItem(); FillTree(treeRoot, root, ExpandedNodes); #ifdef CLIENT_GUI if (!init) { static bool firstUpdate = true; if (firstUpdate) { // Expand root root = stattree->GetRootItem(); stattree->Expand(root); // Expand main items wxTreeItemIdValue cookie; wxTreeItemId expand_it = stattree->GetFirstChild(root,cookie); while(expand_it.IsOk()) { stattree->Expand(expand_it); // Next on this level expand_it = stattree->GetNextSibling(expand_it); } firstUpdate = false; } } #endif } #ifdef CLIENT_GUI void CStatisticsDlg::RebuildStatTreeRemote(const CECTag * tag) { m_stats->RebuildStatTreeRemote(tag); } #endif void CStatisticsDlg::FillTree(CStatTreeItemBase* statssubtree, wxTreeItemId& StatsGUITree, const NodeIdSet& expandednodes) { wxMutexLocker lock(statssubtree->GetLock()); #ifndef CLIENT_GUI StatTreeItemIterator temp_it = statssubtree->GetFirstVisibleChild(thePrefs::GetMaxClientVersions()); #else StatTreeItemIterator temp_it = statssubtree->GetFirstVisibleChild(); #endif wxTreeItemIdValue cookie; wxTreeItemId temp_GUI_it = stattree->GetFirstChild(StatsGUITree,cookie); while (!statssubtree->IsAtEndOfList(temp_it)) { wxTreeItemId temp_item; if (temp_GUI_it.IsOk()) { // There's already a child there, update it. stattree->SetItemText(temp_GUI_it, (*temp_it)->GetDisplayString()); temp_item = temp_GUI_it; uint32_t uid = (*temp_it)->GetUniqueId(); dynamic_cast(stattree->GetItemData(temp_GUI_it))->SetUniqueId(uid); if (expandednodes.find(uid) != expandednodes.end()) { stattree->Expand(temp_GUI_it); } else { stattree->Collapse(temp_GUI_it); } temp_GUI_it = stattree->GetNextSibling(temp_GUI_it); } else { // No more child on GUI, add them. temp_item = stattree->AppendItem(StatsGUITree,(*temp_it)->GetDisplayString()); stattree->SetItemData(temp_item, new CTreeItemData((*temp_it)->GetUniqueId())); } // Has childs? if ((*temp_it)->HasVisibleChildren()) { FillTree((*temp_it), temp_item, expandednodes); } else { stattree->DeleteChildren(temp_item); } statssubtree->GetNextVisibleChild(temp_it); } // What if GUI has more items than tree? // Delete the extra items. while (temp_GUI_it.IsOk()) { wxTreeItemId backup_node = stattree->GetNextSibling(temp_GUI_it); stattree->DeleteChildren(temp_GUI_it); stattree->Delete(temp_GUI_it); temp_GUI_it = backup_node; } } // File_checked_for_headers aMule-2.3.1/src/FileDetailDialog.h0000644000175000017470000000442011600726027015547 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef FILEDETAILDIALOG_H #define FILEDETAILDIALOG_H #include class CPartFile; // CFileDetailDialog dialog class CFileDetailDialog : public wxDialog { public: CFileDetailDialog(wxWindow *parent, std::vector & files, int index); virtual ~CFileDetailDialog(); protected: void OnTimer(wxTimerEvent& evt); DECLARE_EVENT_TABLE() private: void UpdateData(bool resetFilename); std::vector & m_files; CPartFile* m_file; int m_index; wxTimer m_timer; bool m_filenameChanged; void OnClosewnd(wxCommandEvent& evt); void FillSourcenameList(); void setEnableForApplyButton(); void setValueForFilenameTextEdit(const wxString &s); void resetValueForFilenameTextEdit(); void OnBnClickedButtonStrip(wxCommandEvent& evt); void OnBnClickedShowComment(wxCommandEvent& evt); void OnBnClickedTakeOver(wxCommandEvent& evt); void OnListClickedTakeOver(wxListEvent& evt); void OnTextFileNameChange(wxCommandEvent& evt); void OnBnClickedOk(wxCommandEvent& evt); void OnBnClickedApply(wxCommandEvent& evt); void OnBnClickedPrevFile(wxCommandEvent& evt); void OnBnClickedNextFile(wxCommandEvent& evt); }; #endif // FILEDETAILDIALOG_H // File_checked_for_headers aMule-2.3.1/src/EMSocket.h0000644000175000017470000001072411575347521014114 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef EMSOCKET_H #define EMSOCKET_H #include "EncryptedStreamSocket.h" // Needed for CEncryptedStreamSocket #include "ThrottledSocket.h" // Needed for ThrottledFileSocket class CPacket; #define ERR_WRONGHEADER 0x01 #define ERR_TOOBIG 0x02 #define ES_DISCONNECTED 0xFF #define ES_NOTCONNECTED 0x00 #define ES_CONNECTED 0x01 const uint32 PACKET_HEADER_SIZE = 6; class CEMSocket : public CEncryptedStreamSocket, public ThrottledFileSocket { public: CEMSocket(const CProxyData *ProxyData = NULL); virtual ~CEMSocket(); virtual void SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0); bool IsConnected() { return byConnected==ES_CONNECTED;}; uint8 GetConState() {return byConnected;} void SetDownloadLimit(uint32 limit); void DisableDownloadLimit(); virtual uint32 GetTimeOut() const; virtual void SetTimeOut(uint32 uTimeOut); uint32 GetLastCalledSend() { return lastCalledSend; } uint64 GetSentBytesCompleteFileSinceLastCallAndReset(); uint64 GetSentBytesPartFileSinceLastCallAndReset(); uint64 GetSentBytesControlPacketSinceLastCallAndReset(); uint64 GetSentPayloadSinceLastCallAndReset(); void TruncateQueues(); virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, true); }; virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, false); }; uint32 GetNeededBytes(); void Destroy(); bool OnDestroy() { return DoingDestroy; }; //protected: // these functions are public on our code because of the amuleDlg::socketHandler virtual void OnError(int WXUNUSED(nErrorCode)) { }; virtual void OnSend(int nErrorCode); virtual void OnReceive(int nErrorCode); protected: virtual bool PacketReceived(CPacket* WXUNUSED(packet)) { return false; }; virtual void OnClose(int nErrorCode); uint8 byConnected; uint32 m_uTimeOut; private: virtual SocketSentBytes Send(uint32 maxNumberOfBytesToSend, uint32 minFragSize, bool onlyAllowedToSendControlPacket); void ClearQueues(); uint32 GetNextFragSize(uint32 current, uint32 minFragSize); bool HasSent() { return m_hasSent; } // Download (pseudo) rate control uint32 downloadLimit; bool downloadLimitEnable; bool pendingOnReceive; // Download partial header byte pendingHeader[PACKET_HEADER_SIZE]; uint32 pendingHeaderSize; // Download partial packet byte* pendingPacket; uint32 pendingPacketSize; // Upload control byte* sendbuffer; uint32 sendblen; uint32 sent; typedef std::list CPacketQueue; CPacketQueue m_control_queue; struct StandardPacketQueueEntry { uint32 actualPayloadSize; CPacket* packet; }; typedef std::list CStdPacketQueue; CStdPacketQueue m_standard_queue; bool m_currentPacket_is_controlpacket; wxMutex m_sendLocker; uint64 m_numberOfSentBytesCompleteFile; uint64 m_numberOfSentBytesPartFile; uint64 m_numberOfSentBytesControlPacket; bool m_currentPackageIsFromPartFile; bool m_bAccelerateUpload; uint32 lastCalledSend; uint32 lastSent; uint32 lastFinishedStandard; uint32 m_actualPayloadSize; uint32 m_actualPayloadSizeSent; bool m_bBusy; bool m_hasSent; bool DoingDestroy; }; #endif // EMSOCKET_H // File_checked_for_headers aMule-2.3.1/src/MuleTrayIcon.cpp0000644000175000017470000003426111575347521015352 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 Patrizio Bassi ( hetfield@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include "MuleTrayIcon.h" #include #include #include "pixmaps/mule_TrayIcon_big.ico.xpm" #include "pixmaps/mule_Tr_yellow_big.ico.xpm" #include "pixmaps/mule_Tr_grey_big.ico.xpm" #include #include "amule.h" // Needed for theApp #include "amuleDlg.h" // Needed for IsShown #include "Preferences.h" // Needed for thePrefs #include "ServerConnect.h" // Needed for CServerConnect #include "Server.h" // Needed for CServer #include "StatisticsDlg.h" // Needed for CStatisticsDlg::getColors() #include "Statistics.h" // Needed for theStats #include // Needed for CFormat #include "Logger.h" #include // Needed to access menu item constants /****************************************************/ /******************* Event Table ********************/ /****************************************************/ BEGIN_EVENT_TABLE(CMuleTrayIcon, wxTaskBarIcon) EVT_TASKBAR_LEFT_DCLICK(CMuleTrayIcon::SwitchShow) EVT_MENU( TRAY_MENU_EXIT, CMuleTrayIcon::Close) EVT_MENU( TRAY_MENU_CONNECT, CMuleTrayIcon::ServerConnection) EVT_MENU( TRAY_MENU_DISCONNECT, CMuleTrayIcon::ServerConnection) EVT_MENU( TRAY_MENU_HIDE, CMuleTrayIcon::ShowHide) EVT_MENU( TRAY_MENU_SHOW, CMuleTrayIcon::ShowHide) EVT_MENU( UPLOAD_ITEM1, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( UPLOAD_ITEM2, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( UPLOAD_ITEM3, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( UPLOAD_ITEM4, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( UPLOAD_ITEM5, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( UPLOAD_ITEM6, CMuleTrayIcon::SetUploadSpeed) EVT_MENU( DOWNLOAD_ITEM1, CMuleTrayIcon::SetDownloadSpeed) EVT_MENU( DOWNLOAD_ITEM2, CMuleTrayIcon::SetDownloadSpeed) EVT_MENU( DOWNLOAD_ITEM3, CMuleTrayIcon::SetDownloadSpeed) EVT_MENU( DOWNLOAD_ITEM4, CMuleTrayIcon::SetDownloadSpeed) EVT_MENU( DOWNLOAD_ITEM5, CMuleTrayIcon::SetDownloadSpeed) EVT_MENU( DOWNLOAD_ITEM6, CMuleTrayIcon::SetDownloadSpeed) END_EVENT_TABLE() /****************************************************/ /************ Constructor / Destructor **************/ /****************************************************/ long GetSpeedFromString(wxString label){ long temp; label.Replace(_("kB/s"),wxT(""),TRUE); label.Trim(FALSE); label.Trim(TRUE); label.ToLong(&temp); return temp; } void CMuleTrayIcon::SetUploadSpeed(wxCommandEvent& event){ wxObject* obj=event.GetEventObject(); if (obj!=NULL) { wxMenu *menu = dynamic_cast(obj); if (menu) { wxMenuItem* item=menu->FindItem(event.GetId()); if (item!=NULL) { long temp; if (item->GetItemLabelText()==(_("Unlimited"))) { temp=UNLIMITED; } else { temp=GetSpeedFromString(item->GetItemLabelText()); } thePrefs::SetMaxUpload(temp); #ifdef CLIENT_GUI // Send preferences to core. theApp->glob_prefs->SendToRemote(); #endif } } } } void CMuleTrayIcon::SetDownloadSpeed(wxCommandEvent& event){ wxObject* obj=event.GetEventObject(); if (obj!=NULL) { wxMenu *menu = dynamic_cast(obj); if (menu) { wxMenuItem* item=menu->FindItem(event.GetId()); if (item!=NULL) { long temp; if (item->GetItemLabelText()==(_("Unlimited"))) { temp=UNLIMITED; } else { temp=GetSpeedFromString(item->GetItemLabelText()); } thePrefs::SetMaxDownload(temp); #ifdef CLIENT_GUI // Send preferences to core. theApp->glob_prefs->SendToRemote(); #endif } } } } void CMuleTrayIcon::ServerConnection(wxCommandEvent& WXUNUSED(event)) { wxCommandEvent evt; theApp->amuledlg->OnBnConnect(evt); } void CMuleTrayIcon::ShowHide(wxCommandEvent& WXUNUSED(event)) { theApp->amuledlg->DoIconize(theApp->amuledlg->IsShown()); } void CMuleTrayIcon::Close(wxCommandEvent& WXUNUSED(event)) { if (theApp->amuledlg->IsEnabled()) { theApp->amuledlg->Close(); } } CMuleTrayIcon::CMuleTrayIcon() { Old_Icon = -1; Old_SpeedSize = 0xFFFF; // must be > any possible one. // Create the background icons (speed improvement) HighId_Icon_size = wxIcon(mule_TrayIcon_big_ico_xpm).GetHeight(); LowId_Icon_size = wxIcon(mule_Tr_yellow_big_ico_xpm).GetHeight(); Disconnected_Icon_size = wxIcon(mule_Tr_grey_big_ico_xpm).GetHeight(); } CMuleTrayIcon::~CMuleTrayIcon() { } /****************************************************/ /***************** Public Functions *****************/ /****************************************************/ void CMuleTrayIcon::SetTrayIcon(int Icon, uint32 percent) { int Bar_ySize = 0; switch (Icon) { case TRAY_ICON_HIGHID: // Most likely case, test first Bar_ySize = HighId_Icon_size; break; case TRAY_ICON_LOWID: Bar_ySize = LowId_Icon_size; break; case TRAY_ICON_DISCONNECTED: Bar_ySize = Disconnected_Icon_size; break; default: wxFAIL; } // Lookup this values for speed improvement: don't draw if not needed int NewSize = (Bar_ySize * percent) / 100; if ((Old_Icon != Icon) || (Old_SpeedSize != NewSize)) { if ((Old_SpeedSize > NewSize) || (Old_Icon != Icon)) { // We have to rebuild the icon, because bar is lower now. switch (Icon) { case TRAY_ICON_HIGHID: // Most likely case, test first CurrentIcon = wxIcon(mule_TrayIcon_big_ico_xpm); break; case TRAY_ICON_LOWID: CurrentIcon = wxIcon(mule_Tr_yellow_big_ico_xpm); break; case TRAY_ICON_DISCONNECTED: CurrentIcon = wxIcon(mule_Tr_grey_big_ico_xpm); break; default: wxFAIL; } } Old_Icon = Icon; Old_SpeedSize = NewSize; // Do whatever to the icon before drawing it (percent) wxBitmap TempBMP; TempBMP.CopyFromIcon(CurrentIcon); TempBMP.SetMask(NULL); IconWithSpeed.SelectObject(TempBMP); // Speed bar is: centered, taking 80% of the icon heigh, and // right-justified taking a 10% of the icon width. // X int Bar_xSize = 4; int Bar_xPos = CurrentIcon.GetWidth() - 5; IconWithSpeed.SetBrush(*(wxTheBrushList->FindOrCreateBrush(CStatisticsDlg::getColors(11)))); IconWithSpeed.SetPen(*wxTRANSPARENT_PEN); IconWithSpeed.DrawRectangle(Bar_xPos + 1, Bar_ySize - NewSize, Bar_xSize -2 , NewSize); // Unselect the icon. IconWithSpeed.SelectObject(wxNullBitmap); // Do transparency // Set a new mask with transparency set to red. wxMask* new_mask = new wxMask(TempBMP, wxColour(0xFF, 0x00, 0x00)); TempBMP.SetMask(new_mask); CurrentIcon.CopyFromBitmap(TempBMP); UpdateTray(); } } void CMuleTrayIcon::SetTrayToolTip(const wxString& Tip) { CurrentTip = Tip; UpdateTray(); } /****************************************************/ /**************** Private Functions *****************/ /****************************************************/ void CMuleTrayIcon::UpdateTray() { // Icon update and Tip update #ifndef __WXCOCOA__ if (IsOk()) #endif { SetIcon(CurrentIcon, CurrentTip); } } wxMenu* CMuleTrayIcon::CreatePopupMenu() { // Creates dinamically the menu to show the user. wxMenu *traymenu = new wxMenu(); traymenu->SetTitle(_("aMule Tray Menu")); // Build the Top string name wxString label = MOD_VERSION_LONG; traymenu->Append(TRAY_MENU_INFO, label); traymenu->AppendSeparator(); label = wxString(_("Speed limits:")) + wxT(" "); // Check for upload limits unsigned int max_upload = thePrefs::GetMaxUpload(); if ( max_upload == UNLIMITED ) { label += _("UL: None"); } else { label += CFormat(_("UL: %u")) % max_upload; } label += wxT(", "); // Check for download limits unsigned int max_download = thePrefs::GetMaxDownload(); if ( max_download == UNLIMITED ) { label += _("DL: None"); } else { label += CFormat(_("DL: %u")) % max_download; } traymenu->Append(TRAY_MENU_INFO, label); label = CFormat(_("Download speed: %.1f")) % (theStats::GetDownloadRate() / 1024.0); traymenu->Append(TRAY_MENU_INFO, label); label = CFormat(_("Upload speed: %.1f")) % (theStats::GetUploadRate() / 1024.0); traymenu->Append(TRAY_MENU_INFO, label); traymenu->AppendSeparator(); // Client Info wxMenu* ClientInfoMenu = new wxMenu(); ClientInfoMenu->SetTitle(_("Client Information")); // User nick-name { wxString temp = CFormat(_("Nickname: %s")) % ( thePrefs::GetUserNick().IsEmpty() ? wxString(_("No Nickname Selected!")) : thePrefs::GetUserNick() ); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Client ID { wxString temp = _("ClientID: "); if (theApp->IsConnectedED2K()) { temp += CFormat(wxT("%u")) % theApp->GetED2KID(); } else { temp += _("Not connected"); } ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Current Server and Server IP { wxString temp_name = _("ServerName: "); wxString temp_ip = _("ServerIP: "); if ( theApp->serverconnect->GetCurrentServer() ) { temp_name += theApp->serverconnect->GetCurrentServer()->GetListName(); temp_ip += theApp->serverconnect->GetCurrentServer()->GetFullIP(); } else { temp_name += _("Not connected"); temp_ip += _("Not Connected"); } ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_name); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_ip); } // IP Address { wxString temp = CFormat(_("IP: %s")) % ( (theApp->GetPublicIP()) ? Uint32toStringIP(theApp->GetPublicIP()) : wxString(_("Unknown")) ); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // TCP PORT { wxString temp; if (thePrefs::GetPort()) { temp = CFormat(_("TCP port: %d")) % thePrefs::GetPort(); } else { temp=_("TCP port: Not ready"); } ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // UDP PORT { wxString temp; if (thePrefs::GetEffectiveUDPPort()) { temp = CFormat(_("UDP port: %d")) % thePrefs::GetEffectiveUDPPort(); } else { temp=_("UDP port: Not ready"); } ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Online Signature { wxString temp; if (thePrefs::IsOnlineSignatureEnabled()) { temp=_("Online Signature: Enabled"); } else { temp=_("Online Signature: Disabled"); } ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Uptime { wxString temp = CFormat(_("Uptime: %s")) % CastSecondsToHM(theStats::GetUptimeSeconds()); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Number of shared files { wxString temp = CFormat(_("Shared files: %d")) % theStats::GetSharedFileCount(); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Number of queued clients { wxString temp = CFormat(_("Queued clients: %d")) % theStats::GetWaitingUserCount(); ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Total Downloaded { wxString temp = CastItoXBytes(theStats::GetTotalReceivedBytes()); temp = CFormat(_("Total DL: %s")) % temp; ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } // Total Uploaded { wxString temp = CastItoXBytes(theStats::GetTotalSentBytes()); temp = CFormat(_("Total UL: %s")) % temp; ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp); } traymenu->Append(TRAY_MENU_CLIENTINFO,ClientInfoMenu->GetTitle(),ClientInfoMenu); // Separator traymenu->AppendSeparator(); // Upload Speed sub-menu wxMenu* UploadSpeedMenu = new wxMenu(); UploadSpeedMenu->SetTitle(_("Upload limit")); // Download Speed sub-menu wxMenu* DownloadSpeedMenu = new wxMenu(); DownloadSpeedMenu->SetTitle(_("Download limit")); // Upload Speed sub-menu { UploadSpeedMenu->Append(UPLOAD_ITEM1, _("Unlimited")); uint32 max_ul_speed = thePrefs::GetMaxGraphUploadRate(); if ( max_ul_speed == UNLIMITED ) { max_ul_speed = 100; } else if ( max_ul_speed < 10 ) { max_ul_speed = 10; } for ( int i = 0; i < 5; i++ ) { unsigned int tempspeed = (unsigned int)((double)max_ul_speed / 5) * (5 - i); wxString temp = CFormat(wxT("%u %s")) % tempspeed % _("kB/s"); UploadSpeedMenu->Append((int)UPLOAD_ITEM1+i+1,temp); } } traymenu->Append(0,UploadSpeedMenu->GetTitle(),UploadSpeedMenu); // Download Speed sub-menu { DownloadSpeedMenu->Append(DOWNLOAD_ITEM1, _("Unlimited")); uint32 max_dl_speed = thePrefs::GetMaxGraphDownloadRate(); if ( max_dl_speed == UNLIMITED ) { max_dl_speed = 100; } else if ( max_dl_speed < 10 ) { max_dl_speed = 10; } for ( int i = 0; i < 5; i++ ) { unsigned int tempspeed = (unsigned int)((double)max_dl_speed / 5) * (5 - i); wxString temp = CFormat(wxT("%d %s")) % tempspeed % _("kB/s"); DownloadSpeedMenu->Append((int)DOWNLOAD_ITEM1+i+1,temp); } } traymenu->Append(0,DownloadSpeedMenu->GetTitle(),DownloadSpeedMenu); // Separator traymenu->AppendSeparator(); if (theApp->IsConnected()) { //Disconnection Speed item traymenu->Append(TRAY_MENU_DISCONNECT, _("Disconnect")); } else { //Connect item traymenu->Append(TRAY_MENU_CONNECT, _("Connect")); } // Separator traymenu->AppendSeparator(); if (theApp->amuledlg->IsShown()) { //hide item traymenu->Append(TRAY_MENU_HIDE, _("Hide aMule")); } else { //show item traymenu->Append(TRAY_MENU_SHOW, _("Show aMule")); } // Separator traymenu->AppendSeparator(); // Exit item traymenu->Append(TRAY_MENU_EXIT, _("Exit")); return traymenu; } void CMuleTrayIcon::SwitchShow(wxTaskBarIconEvent&) { theApp->amuledlg->DoIconize(theApp->amuledlg->IsShown()); } // File_checked_for_headers aMule-2.3.1/src/CFile.h0000644000175000017470000001337411642657242013427 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 1998-2011 Vadim Zeitlin ( zeitlin@dptmaths.ens-cachan.fr ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CFILE_H #define CFILE_H #include // Needed for CPath #include "SafeFile.h" // Needed for CFileDataIO #include // Needed for constants #ifdef _MSC_VER // silly warnings about deprecated functions #pragma warning(disable:4996) #endif /** * This class is a modified version of the wxFile class. * * In addition to implementing the CFileDataIO interface, * it offers improved support for UTF8 filenames and 64b * file-IO on both windows and unix-like systems. * * @see wxFile */ class CFile : public CFileDataIO { public: //! Standard values for file descriptor enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr }; /** @see wxFile::OpenMode */ enum OpenMode { read, write, read_write, write_append, write_excl, write_safe }; /** * Creates a closed file. */ CFile(); /** * Constructor, calls Open on the specified file. * * To check if the file was successfully opened, a * call to IsOpened() is required. */ CFile(const CPath& path, OpenMode mode = read); CFile(const wxString& path, OpenMode mode = read); /** * Destructor, closes the file if opened. */ virtual ~CFile(); /** * Opens a file. * * @param path The full or relative path to the file. * @param mode The opening mode. * @param accessMode The permissions in case a new file is created. * @return True if the file was opened, false otherwise. * * Calling Open with the openmodes 'write' or 'write_append' will * create the specified file if it does not already exist. * * Calling Open with the openmode 'write_safe' will append ".new" * to the file name and otherwise work like 'write'. * On close it will be renamed to the original name. * Close() has to be called manually - destruct won't rename the file! * * If an accessMode is not explicitly specified, the accessmode * specified via CPreferences::GetFilePermissions will be used. */ bool Open(const CPath& path, OpenMode mode = read, int accessMode = wxS_DEFAULT); bool Open(const wxString& path, OpenMode mode = read, int accessMode = wxS_DEFAULT); /** * Reopens a file which was opened and closed before. * * @param mode The opening mode. * * The filename used for last open is used again. * No return value - function throws on failure. */ void Reopen(OpenMode mode); /** * Calling Create is equivilant of calling open with OpenMode 'write'. * * @param overwrite Specifies if the target file should be overwritten, * in case that it already exists. * * @see CFile::Open */ bool Create(const CPath& path, bool overwrite = false, int accessMode = wxS_DEFAULT); bool Create(const wxString& path, bool overwrite = false, int accessMode = wxS_DEFAULT); /** * Closes the file. * * Note that calling Close on an closed file * is an illegal operation. */ bool Close(); /** * Returns the file descriptior assosiated with the file. * * Note that direct manipulation of the descriptor should * be avoided! That's what this class is for. */ int fd() const; /** * Flushes data not yet written. * * Note that calling Flush on an closed file * is an illegal operation. */ bool Flush(); /** * @see CSafeFileIO::GetLength * * Note that calling GetLength on a closed file * is an illegal operation. */ virtual uint64 GetLength() const; /** * Resizes the file to the specified length. */ bool SetLength(uint64 newLength); /** * @see CSafeFileIO::GetPosition * * Note that calling GetPosition on a closed file * is an illegal operation. */ virtual uint64 GetPosition() const; /** * Returns the current available bytes to read on the file before EOF * */ virtual uint64 GetAvailable() const; /** * Returns the path of the currently opened file. * */ const CPath& GetFilePath() const; /** * Returns true if the file is opened, false otherwise. */ bool IsOpened() const; protected: /** @see CFileDataIO::doRead **/ virtual sint64 doRead(void* buffer, size_t count) const; /** @see CFileDataIO::doWrite **/ virtual sint64 doWrite(const void* buffer, size_t count); /** @see CFileDataIO::doSeek **/ virtual sint64 doSeek(sint64 offset) const; private: //! A CFile is neither copyable nor assignable. //@{ CFile(const CFile&); CFile& operator=(const CFile&); //@} //! File descriptor or 'fd_invalid' if not opened int m_fd; //! The full path to the current file. CPath m_filePath; //! Are we using safe write mode? bool m_safeWrite; }; /** * This exception is thrown by CFile if a seek or tell fails. */ struct CSeekFailureException : public CIOFailureException { CSeekFailureException(const wxString& desc); }; #endif // CFILE_H // File_checked_for_headers aMule-2.3.1/src/UPnPCompatibility.h0000644000175000017470000000340011575347521016007 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) // Copyright (c) 2006-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef UPNPCOMPATIBILITY_H #define UPNPCOMPATIBILITY_H #include "upnp.h" #include "upnptools.h" #include #include // for CMuleException:: #include // for char2unicode() #include "Logger.h" // for Add(Debug)LogLineM() class CUPnPException : public CMuleException { public: CUPnPException(const std::ostringstream& msg) : CMuleException( wxT("CUPnPException"), wxString(char2unicode(msg.str().c_str()))) {} }; // There is no need to create mutex/mutex locker classes using ithread.h // because wx already has them. #define CUPnPMutex wxMutex #define CUPnPMutexLocker wxMutexLocker #endif // UPNPCOMPATIBILITY_H aMule-2.3.1/src/SHA.h0000644000175000017470000000617711575347521013064 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // // Kry - Modified version of the original SHA.cpp to work on linux and // use wxWidgets. Original license follows. // /* --------------------------------------------------------------------------- Copyright (c) 2002-2011 Dr Brian Gladman ( brg@gladman.me.uk ) All rights reserved. LICENSE TERMS The free distribution and use of this software in both source and binary form is allowed (with or without changes) provided that: 1. distributions of this source code include the above copyright notice, this list of conditions and the following disclaimer; 2. distributions in binary form include the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other associated materials; 3. the copyright holder's name is not used to endorse products built using this software without specific written permission. ALTERNATIVELY, provided that this notice is retained in full, this product may be distributed under the terms of the GNU General Public License (GPL), in which case the provisions of the GPL apply INSTEAD OF those given above. DISCLAIMER This software is provided 'as is' with no explicit or implied warranties in respect of its properties, including, but not limited to, correctness and/or fitness for purpose. --------------------------------------------------------------------------- Issue Date: 30/11/2002 This is a byte oriented version of SHA1 that operates on arrays of bytes stored in memory. It runs at 22 cycles per byte on a Pentium P4 processor */ #ifndef __SHA_H__ #define __SHA_H__ #include "SHAHashSet.h" class CSHA : public CAICHHashAlgo { // Construction public: CSHA(); virtual ~CSHA() {}; // Operations public: virtual void Reset(); virtual void Add(const void* pData, uint32 nLength); virtual void Finish(CAICHHash& Hash); virtual void GetHash(CAICHHash& Hash); protected: void Compile(); private: uint32 m_nCount[2]; uint32 m_nHash[5]; uint32 m_nBuffer[16]; }; #define SHA1_BLOCK_SIZE 64 #define SHA1_DIGEST_SIZE 20 #endif // __SHA_H__ // File_checked_for_headers aMule-2.3.1/src/ClientList.h0000644000175000017470000003014211575347521014510 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CLIENTLIST_H #define CLIENTLIST_H #include "DeadSourceList.h" // Needed for CDeadSourceList #include "ClientRef.h" #include #include class CUpDownClient; class CClientTCPSocket; class CDeletedClient; class CMD4Hash; namespace Kademlia { class CContact; class CUInt128; } enum buddyState { Disconnected, Connecting, Connected }; #define BAN_CLEANUP_TIME 1200000 // 20 min /** * This class takes care of managing existing clients. * * This class tracks a number of attributes related to existing and deleted * clients. Among other things, it keeps track of existing, banned, dead and * dying clients, as well as offers support for matching new client-instances * against already exist clients to avoid duplicates. */ class CClientList { public: /** * Constructor. */ CClientList(); /** * Destructor. */ ~CClientList(); /** * Adds a client to the global list of clients. * * @param toadd The new client. */ void AddClient( CUpDownClient* toadd ); /** * Removes a client from the client lists. * * @param client The client to be removed. * * To be called from CUpDownClient::Safe_Delete only. */ void RemoveClient( CUpDownClient* client ); /** * Updates the recorded IP of the specified client. * * @param client The client to have its entry updated. * @param newIP The new IP adress of the client. * * This function is to be called before the client actually changes its * IP-address, and will update the old entry with the new value. There * will only be added an entry if the new IP isn't zero. */ void UpdateClientIP( CUpDownClient* client, uint32 newIP ); /** * Updates the recorded ID of the specified client. * * @param client The client to have its entry updated. * @param newID The new ID of the client. * * This function is to be called before the client actually changes its * ID, and will update the old entry with the new value. Unlike the other * two functions, this function will always ensure that there is an entry * for the client, regardless of the value of newID. */ void UpdateClientID( CUpDownClient* client, uint32 newID ); /** * Updates the recorded hash of the specified client. * * @param client The client to have its entry updated. * @param newHash The new user-hash. * * This function is to be called before the client actually changes its * user-hash, and will update the old entry with the new value. There will * only be added an entry if the new hash is valid. */ void UpdateClientHash( CUpDownClient* client, const CMD4Hash& newHash ); /** * Returns the number of listed clients. */ uint32 GetClientCount() const; /** * Deletes all tracked clients. */ void DeleteAll(); /** * Replaces a new client-instance with the an already existing client, if one such exist. * * @param client A pointer to the pointer of the new instance. * @param sender The socket assosiated with the new instance. * * Call this function when a new client-instance has been created. This function will then * compare it against all existing clients and see if we already have an instance matching * the new one. If that is the case, it will delete the new instance and set the pointer to * the existing one. */ bool AttachToAlreadyKnown( CUpDownClient** client, CClientTCPSocket* sender ); /** * Finds a client with the specified ip and port. * * @param clientip The IP of the client to find. * @param port The port used by the client. */ CUpDownClient* FindClientByIP( uint32 clientip, uint16 port ); /** * Finds a client with the specified ip. * * @param clientip The IP of the client to find. * * Returns the first client found if there are several with same ip. */ CUpDownClient* FindClientByIP( uint32 clientip ); /** * Finds a client with the specified ECID. * * @param clientip The IP of the client to find. * */ CUpDownClient* FindClientByECID(uint32 ecid) const; //! The list-type used to store clients IPs and other information typedef std::map ClientMap; /** * Adds a client to the list of tracked clients. * * @param toadd The client to track. * * This function is used to keep track of clients after they * have been deleted and makes it possible to spot port or hash * changes. */ void AddTrackClient(CUpDownClient* toadd); /** * Returns the number of tracked client. * * @param dwIP The IP-adress which of the clients. * @return The number of clients tracked at the specifed IP. */ uint16 GetClientsFromIP(uint32 dwIP); /** * Checks if a client has changed its user-hash. * * @param dwIP The IP of the client. * @param nPort The port of the client. * @param pNewHash The userhash assosiated with the client. * */ bool ComparePriorUserhash( uint32 dwIP, uint16 nPort, void* pNewHash ); /** * Bans an IP address for 2 hours. * * @param dwIP The IP from which all clients will be banned. */ void AddBannedClient(uint32 dwIP); /** * Checks if a client has been banned. * * @param dwIP The IP to check. * @return True if the IP is banned, false otherwise. */ bool IsBannedClient(uint32 dwIP); /** * Unbans an IP address, if it has been banned. * * @param dwIP The IP address to unban. */ void RemoveBannedClient(uint32 dwIP); /** * Main loop. * * This function takes care of cleaning the various lists and deleting * pending clients on the deletion-queue. */ void Process(); /** * This function removes all clients filtered by the current IPFilter. * * Call this function after changing the current IPFiler list, to ensure * that no client-connections to illegal IPs exist. These would otherwise * be allowed to exist, bypassing the IPFilter. */ void FilterQueues(); //! The type of the list used to store client-pointers for a couple of tasks. typedef std::deque SourceList; /** * Returns a list of clients with the specified user-hash. * * @param hash The userhash to search for. * * This function will return a list of clients with the specified userhash, * provided that the hash is a valid non-empty userhash. Empty hashes will * simply result in nothing being found. */ SourceList GetClientsByHash( const CMD4Hash& hash ); /** * Returns a list of clients with the specified IP. * * @param ip The IP-address to search for. * * This function will return a list of clients with the specified IP, * provided that the IP is a non-zero value. A value of zero will not * result in any results. */ SourceList GetClientsByIP( unsigned long ip ); //! The type of the lists used to store IPs and IDs. typedef std::multimap IDMap; //! The pairs of the IP/ID list. typedef std::pair IDMapPair; /** * Returns a list of all clients. * * @return The complete list of clients. */ const IDMap& GetClientList(); /** * Adds a source to the list of dead sources. * * @param client The source to be recorded as dead. */ void AddDeadSource(const CUpDownClient* client); /** * Checks if a source is recorded as being dead. * * @param client The client to evaluate. * @return True if dead, false otherwise. * * Sources that are dead are not to be considered valid * sources and should not be added to partfiles. */ bool IsDeadSource(const CUpDownClient* client); /** * Sends a message to a client, identified by a GUI_ID * * @return Success */ bool SendChatMessage(uint64 client_id, const wxString& message); /** * Stops a chat session with a client. * */ void SetChatState(uint64 client_id, uint8 state); uint8 GetBuddyStatus() const {return m_nBuddyStatus;} // This must be used on CreateKadSourceLink and if we ever add the columns // on shared files control. CUpDownClient* GetBuddy() { return m_pBuddy.GetClient(); } uint32 GetBuddyIP(); uint16 GetBuddyPort(); bool RequestTCP(Kademlia::CContact* contact, uint8_t connectOptions); void RequestBuddy(Kademlia::CContact* contact, uint8_t connectOptions); bool IncomingBuddy(Kademlia::CContact* contact, Kademlia::CUInt128* buddyID); void RemoveFromKadList(CUpDownClient* torem); void AddToKadList(CUpDownClient* toadd); bool DoRequestFirewallCheckUDP(const Kademlia::CContact& contact); void AddKadFirewallRequest(uint32 ip); bool IsKadFirewallCheckIP(uint32 ip) const; // Direct Callback list void AddDirectCallbackClient(CUpDownClient *toAdd); void RemoveDirectCallback(CUpDownClient *toRemove) { m_currentDirectCallbacks.remove(CCLIENTREF(toRemove, wxEmptyString)); } void AddTrackCallbackRequests(uint32_t ip); bool AllowCallbackRequest(uint32_t ip) const; protected: /* * Avoids unwanted clients to be forever in the client list */ void CleanUpClientList(); void ProcessDirectCallbackList(); private: /** * Helperfunction which finds a client matching the specified client. * * @param client The client to search for. * @return The matching client or NULL. * * This functions searches through the list of clients and finds the first match * using the same checks as CUpDownClient::Compare, but without the overhead. */ CUpDownClient* FindMatchingClient( CUpDownClient* client ); /** * Check if we already know this IP. * * This function is used to determine if the given IP address * is already known. * * @param ip The IP address to check. */ bool IsIPAlreadyKnown(uint32_t ip); /** * Helperfunction which removes the client from the IP-list. */ void RemoveIPFromList( CUpDownClient* client ); /** * Helperfunction which removes the client from the ID-list. */ bool RemoveIDFromList( CUpDownClient* client ); /** * Helperfunction which removes the client from the hash-list. */ void RemoveHashFromList( CUpDownClient* client ); //! The type of the list used to store user-hashes. typedef std::multimap HashMap; //! The pairs of the Hash-list. typedef std::pair HashMapPair; //! The map of clients with valid hashes HashMap m_hashList; //! The map of clients with valid IPs IDMap m_ipList; //! The full lists of clients IDMap m_clientList; //! This is the map of banned clients. ClientMap m_bannedList; //! This variable is used to keep track of the last time the banned-list was pruned. uint32 m_dwLastBannCleanUp; //! This is the map of tracked clients. std::map m_trackedClientsList; //! This keeps track of the last time the tracked-list was pruned. uint32 m_dwLastTrackedCleanUp; //! This keeps track of the last time the client-list was pruned. uint32 m_dwLastClientCleanUp; //! List of unusable sources. CDeadSourceList m_deadSources; /* Kad Stuff */ CClientRefSet m_KadSources; CClientRef m_pBuddy; uint8 m_nBuddyStatus; typedef struct { uint32 ip; uint32 inserted; } IpAndTicks; typedef std::list IpAndTicksList; IpAndTicksList m_firewallCheckRequests; typedef CClientRefList DirectCallbackList; DirectCallbackList m_currentDirectCallbacks; IpAndTicksList m_directCallbackRequests; }; #endif // File_checked_for_headers aMule-2.3.1/src/Proxy.cpp0000644000175000017470000012020011575347521014105 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "Proxy.h" /* for Interface */ #include #include "ArchSpecific.h" /* for ENDIAN_HTONS() */ #include "Logger.h" /* for AddDebugLogLineN */ #include "OtherFunctions.h" /* for EncodeBase64() */ #include /* for unicode2char */ //------------------------------------------------------------------------------ // CProxyData //------------------------------------------------------------------------------ CProxyData::CProxyData() { Clear(); } CProxyData::CProxyData( bool proxyEnable, CProxyType proxyType, const wxString &proxyHostName, unsigned short proxyPort, bool enablePassword, const wxString &userName, const wxString &password) : m_proxyEnable(proxyEnable), m_proxyType(proxyType), m_proxyHostName(proxyHostName), m_proxyPort(proxyPort), /* * The flag m_enablePassword is currently not used. The first * authentication method tryed is No-Authentication, the second * is username/password. If there is no username/password in * CProxyData, a NULL username/password is sent. That will probably * lead to a failure, but at least we tryed. Maybe this behaviour * could be altered later. */ m_enablePassword(enablePassword), m_userName(userName), m_password(password) { } void CProxyData::Clear() { m_proxyEnable = false; m_proxyType = PROXY_NONE; m_proxyHostName.Clear(); m_proxyPort = 0; m_enablePassword = false; m_userName.Clear(); m_password.Clear(); } #ifndef CLIENT_GUI #include // Do_not_auto_remove (NetBSD, older gccs) //------------------------------------------------------------------------------ // ProxyEventHandler //------------------------------------------------------------------------------ CProxyEventHandler::CProxyEventHandler() { } BEGIN_EVENT_TABLE(CProxyEventHandler, wxEvtHandler) EVT_SOCKET(ID_PROXY_SOCKET_EVENT, CProxyEventHandler::ProxySocketHandler) END_EVENT_TABLE() // // THE one and only Event Handler // static CProxyEventHandler g_proxyEventHandler; void CProxyEventHandler::ProxySocketHandler(wxSocketEvent& event) { CProxySocket *sock = dynamic_cast(event.GetSocket()); if (sock) { sock->m_proxyStateMachine->Schedule(event.GetSocketEvent()); } else { // we're doomed :) } sock->m_proxyStateMachine->Clock(); } //------------------------------------------------------------------------------ // CProxyStateMachine //------------------------------------------------------------------------------ CProxyStateMachine::CProxyStateMachine( wxString name, const unsigned int max_states, const CProxyData &proxyData, CProxyCommand proxyCommand) : CStateMachine(NewName(name, proxyCommand), max_states, PROXY_STATE_START), m_proxyData(proxyData), m_proxyCommand(proxyCommand), m_isLost(false), m_isConnected(false), m_canReceive(false), m_canSend(false), m_ok(true), m_lastRead(0), m_lastWritten(0), // Will be initialized at Start() m_peerAddress(NULL), m_proxyClientSocket(NULL), m_proxyBoundAddress(NULL), // Temporary variables m_lastReply(0), m_packetLenght(0) { } CProxyStateMachine::~CProxyStateMachine() { delete m_peerAddress; } wxString &CProxyStateMachine::NewName(wxString &s, CProxyCommand proxyCommand) { switch (proxyCommand) { case PROXY_CMD_CONNECT: s += wxT("-CONNECT"); break; case PROXY_CMD_BIND: s += wxT("-BIND"); break; case PROXY_CMD_UDP_ASSOCIATE: s += wxT("-UDP"); break; } return s; } bool CProxyStateMachine::Start(const wxIPaddress &peerAddress, wxSocketClient *proxyClientSocket) { m_proxyClientSocket = proxyClientSocket; try { const wxIPV4address &peer = dynamic_cast(peerAddress); m_peerAddress = new amuleIPV4Address(peer); } catch (const std::bad_cast& WXUNUSED(e)) { // Should process other types of wxIPAddres before quitting AddDebugLogLineN(logProxy, wxT("(1)bad_cast exception!")); wxFAIL; return false; } // To run the state machine, return and just let the events start to happen. return true; } t_sm_state CProxyStateMachine::HandleEvent(t_sm_event event) { // Default is stay in current state t_sm_state ret = GetState(); switch(event) { case wxSOCKET_CONNECTION: AddDebugLogLineN(logProxy, wxT("Connection event")); m_isConnected = true; break; case wxSOCKET_INPUT: AddDebugLogLineN(logProxy, wxT("Input event")); m_canReceive = true; break; case wxSOCKET_OUTPUT: AddDebugLogLineN(logProxy, wxT("Output event")); m_canSend = true; break; case wxSOCKET_LOST: AddDebugLogLineN(logProxy, wxT("Lost connection event")); m_isLost = true; m_ok = false; break; default: AddDebugLogLineN(logProxy, wxT("Unknown event")); break; } // Aborting conditions: // - wxSOCKET_LOST event // - More than 10 times on the same state if ( m_isLost || GetClocksInCurrentState() > 10) { ret = PROXY_STATE_END; } return ret; } void CProxyStateMachine::AddDummyEvent() { wxSocketEvent e(ID_PROXY_SOCKET_EVENT); // Make sure this is an unknown event :) e.m_event = (wxSocketNotify)( wxSOCKET_INPUT + wxSOCKET_OUTPUT + wxSOCKET_CONNECTION + wxSOCKET_LOST); e.SetEventObject(m_proxyClientSocket); g_proxyEventHandler.AddPendingEvent(e); } /* * Notice! These includes are here as long as it is impossible to retrieve * the event handler from the socket. They should be removed. For now, * please leave it here. */ void CProxyStateMachine::ReactivateSocket() { /* If proxy is beeing used, then the TCP socket handlers * (CServerSocketHandler and CClientTCPSocketHandler) will not * receive a wxSOCKET_CONNECTION event, because the connection has * already started with the proxy. So we must add a wxSOCKET_CONNECTION * event to make things go undetected. A wxSOCKET_OUTPUT event is also * necessary to start sending data to the server. */ CProxySocket *s = dynamic_cast(m_proxyClientSocket); // If that is not true, we are in serious trouble... wxASSERT(s); if (CDatagramSocketProxy *udp = s->GetUDPSocket()) { // The original socket was a UDP socket if(m_ok) { // From now on, the UDP socket can be used, // remove the protection. udp->SetUDPSocketOk(); } // No need to call RestoreState(), that socket will no longer // be used after proxy negotiation. } else { // The original socket was a TCP socket s->RestoreEventHandler(); wxSocketEvent e(s->GetEventHandlerId()); e.m_event = wxSOCKET_CONNECTION; e.SetEventObject(s); wxEvtHandler *h(s->GetEventHandler()); h->AddPendingEvent(e); e.m_event = wxSOCKET_OUTPUT; h->AddPendingEvent(e); if (!m_ok) { e.m_event = wxSOCKET_LOST; h->AddPendingEvent(e); } s->RestoreState(); } } wxSocketBase &CProxyStateMachine::ProxyWrite(wxSocketBase &socket, const void *buffer, wxUint32 nbytes) { wxSocketBase &ret = socket.Write(buffer, nbytes); m_lastWritten = m_proxyClientSocket->LastCount(); /* Set the status of this operation */ m_lastError = wxSOCKET_NOERROR; m_ok = !m_proxyClientSocket->Error(); if (!m_ok) { m_lastError = m_proxyClientSocket->LastError(); m_ok = m_lastError == wxSOCKET_WOULDBLOCK; if (m_ok) { m_canSend = false; } } return ret; } wxSocketBase &CProxyStateMachine::ProxyRead(wxSocketBase &socket, void *buffer) { /* Always try to read the full buffer. That explicitly demands that * the socket has the flag wxSOCKET_NONE. */ wxSocketBase &ret = socket.Read(buffer, PROXY_BUFFER_SIZE); m_lastRead = m_proxyClientSocket->LastCount(); /* Set the status of this operation */ m_lastError = wxSOCKET_NOERROR; m_ok = !m_proxyClientSocket->Error(); if (!m_ok) { m_lastError = m_proxyClientSocket->LastError(); m_ok = m_lastError == wxSOCKET_WOULDBLOCK; if (m_ok) { m_canReceive = false; } } return ret; } bool CProxyStateMachine::CanReceive() const { #ifdef AMULE_DAEMON return true; #else return m_canReceive; #endif } bool CProxyStateMachine::CanSend() const { #ifdef AMULE_DAEMON return true; #else return m_canSend; #endif } //------------------------------------------------------------------------------ // CSocks5StateMachine //------------------------------------------------------------------------------ /** * The state machine constructor must initialize the array of pointer to member * functions. Don't waste you time trying to statically initialize this, pointer * to member functions require an object to operate on, so this array must be * initialized at run time. */ CSocks5StateMachine::CSocks5StateMachine( const CProxyData &proxyData, CProxyCommand proxyCommand) : CProxyStateMachine( wxString(wxT("Socks5")), SOCKS5_MAX_STATES, proxyData, proxyCommand) { m_process_state[ 0] = &CSocks5StateMachine::process_start; m_state_name[ 0] = wxT("process_start"); m_process_state[ 1] = &CSocks5StateMachine::process_end; m_state_name[ 1] = wxT("process_end"); m_process_state[ 2] = &CSocks5StateMachine::process_send_query_authentication_method; m_state_name[ 2] = wxT("process_send_query_authentication_method"); m_process_state[ 3] = &CSocks5StateMachine::process_receive_authentication_method; m_state_name[ 3] = wxT("process_receive_authentication_method"); m_process_state[ 4] = &CSocks5StateMachine::process_process_authentication_method; m_state_name[ 4] = wxT("process_process_authentication_method"); m_process_state[ 5] = &CSocks5StateMachine::process_send_authentication_gssapi; m_state_name[ 5] = wxT("process_send_authentication_gssapi"); m_process_state[ 6] = &CSocks5StateMachine::process_receive_authentication_gssapi; m_state_name[ 6] = wxT("process_receive_authentication_gssapi"); m_process_state[ 7] = &CSocks5StateMachine::process_process_authentication_gssapi; m_state_name[ 7] = wxT("process_process_authentication_gssapi"); m_process_state[ 8] = &CSocks5StateMachine::process_send_authentication_username_password; m_state_name[ 8] = wxT("process_send_authentication_username_password"); m_process_state[ 9] = &CSocks5StateMachine::process_receive_authentication_username_password; m_state_name[ 9] = wxT("process_receive_authentication_username_password"); m_process_state[10] = &CSocks5StateMachine::process_process_authentication_username_password; m_state_name[10] = wxT("process_process_authentication_username_password"); m_process_state[11] = &CSocks5StateMachine::process_send_command_request; m_state_name[11] = wxT("process_send_command_request"); m_process_state[12] = &CSocks5StateMachine::process_receive_command_reply; m_state_name[12] = wxT("process_receive_command_reply"); m_process_state[13] = &CSocks5StateMachine::process_process_command_reply; m_state_name[13] = wxT("process_process_command_reply"); } void CSocks5StateMachine::process_state(t_sm_state state, bool entry) { /* Ok, the syntax is terrible, but this is correct. This is a * pointer to a member function. No C equivalent for that. */ (this->*m_process_state[state])(entry); #ifdef __DEBUG__ int n = 0; switch (state) { case SOCKS5_STATE_START: case SOCKS5_STATE_END: case SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD: case SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI: case SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD: case SOCKS5_STATE_RECEIVE_COMMAND_REPLY: default: n = 0; break; case SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD: case SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI: case SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD: case SOCKS5_STATE_SEND_COMMAND_REQUEST: n = m_packetLenght; break; case SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD: case SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI: case SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD: case SOCKS5_STATE_PROCESS_COMMAND_REPLY: n = m_lastRead; break; } if (entry) { DumpMem(m_buffer, n, m_state_name[state], m_ok); } else { AddDebugLogLineN(logProxy, wxString(wxT("wait state -- ")) << m_state_name[state]); } #endif // __DEBUG__ } /** * Code this such that the next state is only entered when it is able to * perform the operation (read or write). State processing will assume * that it can read or write upon entry of the state. This is done using * CanSend() and CanReceive(). On daemon, these functions always return * true, because sockets are blocking. */ t_sm_state CSocks5StateMachine::next_state(t_sm_event event) { // Default is stay in current state t_sm_state ret = HandleEvent(event); switch (GetState()) { case SOCKS5_STATE_START: if (m_isConnected && !m_isLost && CanSend()) { ret = SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD; } break; case SOCKS5_STATE_SEND_QUERY_AUTHENTICATION_METHOD: if (CanReceive()) { ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD; } break; case SOCKS5_STATE_RECEIVE_AUTHENTICATION_METHOD: ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD; break; case SOCKS5_STATE_PROCESS_AUTHENTICATION_METHOD: if (m_ok) { if (CanSend()) { switch (m_lastReply) { case SOCKS5_AUTH_METHOD_NO_AUTH_REQUIRED: ret = SOCKS5_STATE_SEND_COMMAND_REQUEST; break; case SOCKS5_AUTH_METHOD_GSSAPI: ret = SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI; break; case SOCKS5_AUTH_METHOD_USERNAME_PASSWORD: ret = SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD; break; case SOCKS5_AUTH_METHOD_NO_ACCEPTABLE_METHODS: default: ret = SOCKS5_STATE_END; break; } } else { AddDebugLogLineN(logProxy, wxT("Can't send")); } } else { ret = SOCKS5_STATE_END; } break; case SOCKS5_STATE_SEND_AUTHENTICATION_GSSAPI: if (m_ok) { if (CanReceive()) { ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI; } } else { ret = SOCKS5_STATE_END; } break; case SOCKS5_STATE_SEND_AUTHENTICATION_USERNAME_PASSWORD: if (m_ok) { if (CanReceive()) { ret = SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD; } } else { ret = SOCKS5_STATE_END; } break; case SOCKS5_STATE_RECEIVE_AUTHENTICATION_GSSAPI: ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI; break; case SOCKS5_STATE_RECEIVE_AUTHENTICATION_USERNAME_PASSWORD: ret = SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD; break; case SOCKS5_STATE_PROCESS_AUTHENTICATION_GSSAPI: case SOCKS5_STATE_PROCESS_AUTHENTICATION_USERNAME_PASSWORD: if (m_ok) { if (CanSend()) { ret = SOCKS5_STATE_SEND_COMMAND_REQUEST; } } else { ret = SOCKS5_STATE_END; } break; case SOCKS5_STATE_SEND_COMMAND_REQUEST: if (m_ok) { if (CanReceive()) { ret = SOCKS5_STATE_RECEIVE_COMMAND_REPLY; } } else { ret = SOCKS5_STATE_END; } break; case SOCKS5_STATE_RECEIVE_COMMAND_REPLY: ret = SOCKS5_STATE_PROCESS_COMMAND_REPLY; break; case SOCKS5_STATE_PROCESS_COMMAND_REPLY: ret = SOCKS5_STATE_END; break; case SOCKS5_STATE_END: default: break; } return ret; } /** * So, this is how you do it: the state machine is clocked by the events * that happen inside the event handler. You can add a dummy event whenever * you see that the system will not generate an event. But don't add dummy * events before reads, reads should only be performed after input events. * * Maybe it makes sense to add a dummy event before a read if there is no * state change (wait state). * * The event system will generate at least 2 events, one wxSOCKET_CONNECTION, * one wxSOCKET_OUTPUT, so we will have 2 clocks in our state machine. Plus, each * time there is unread data in the receive buffer of the socket, a wxSOCKET_INPUT * event will be generated. If you feel you will need more clocks than these, use * AddDummyEvent(), but I suggest you review your state machine design first. */ void CSocks5StateMachine::process_start(bool entry) { if (entry) { } else { } } void CSocks5StateMachine::process_end(bool) { ReactivateSocket(); } void CSocks5StateMachine::process_send_query_authentication_method(bool entry) { if (entry) { // Prepare the authentication method negotiation packet m_buffer[0] = SOCKS5_VERSION; m_buffer[1] = 2; // Number of supported methods //m_buffer[1] = 3; // Number of supported methods m_buffer[2] = SOCKS5_AUTH_METHOD_NO_AUTH_REQUIRED; m_buffer[3] = SOCKS5_AUTH_METHOD_USERNAME_PASSWORD; m_buffer[4] = SOCKS5_AUTH_METHOD_GSSAPI; m_packetLenght = 4; //m_packetLenght = 5; // Send the authentication method negotiation packet ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } } void CSocks5StateMachine::process_receive_authentication_method(bool entry) { if (entry) { // Receive the method selection message m_packetLenght = 2; ProxyRead(*m_proxyClientSocket, m_buffer); } /* This is added because there will be no more input events. If the * world was a nice place, we could think about joining the * process_receive and the process_process states here, but some day * we might have to deal with the fact that the i/o operation has been * incomplete, and that we must finish our job the next time we enter * this state. */ AddDummyEvent(); } void CSocks5StateMachine::process_process_authentication_method(bool entry) { if (entry) { m_lastReply = m_buffer[1]; m_ok = m_ok && m_buffer[0] == SOCKS5_VERSION; } /* Ok, this one is here because wxSOCKET_OUTPUT events only happen * once when you connect the socket, and after that, only after a * wxSOCKET_WOULDBLOCK error happens. */ AddDummyEvent(); } void CSocks5StateMachine::process_send_authentication_gssapi(bool) { // TODO or not TODO? That is the question... m_ok = false; } void CSocks5StateMachine::process_receive_authentication_gssapi(bool) { AddDummyEvent(); } void CSocks5StateMachine::process_process_authentication_gssapi(bool) { AddDummyEvent(); } void CSocks5StateMachine::process_send_authentication_username_password(bool entry) { if (entry) { unsigned char lenUser = m_proxyData.m_userName.Len(); unsigned char lenPassword = m_proxyData.m_password.Len(); m_packetLenght = 1 + 1 + lenUser + 1 + lenPassword; unsigned int offsetUser = 2; unsigned int offsetPassword = offsetUser + lenUser + 1; // Prepare username/password buffer m_buffer[0] = SOCKS5_AUTH_VERSION_USERNAME_PASSWORD; m_buffer[offsetUser-1] = lenUser; memcpy(m_buffer+offsetUser, unicode2char(m_proxyData.m_userName), lenUser); m_buffer[offsetPassword-1] = lenPassword; memcpy(m_buffer+offsetPassword, unicode2char(m_proxyData.m_password), lenPassword); // Send the username/password packet ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } } void CSocks5StateMachine::process_receive_authentication_username_password(bool entry) { if (entry) { // Receive the server's authentication response m_packetLenght = 2; ProxyRead(*m_proxyClientSocket, m_buffer); } AddDummyEvent(); } void CSocks5StateMachine::process_process_authentication_username_password(bool entry) { if (entry) { // Process the server's reply m_lastReply = m_buffer[1]; m_ok = m_ok && m_buffer[0] == SOCKS5_AUTH_VERSION_USERNAME_PASSWORD && m_buffer[1] == SOCKS5_REPLY_SUCCEED; } AddDummyEvent(); } void CSocks5StateMachine::process_send_command_request(bool entry) { if (entry) { // Prepare the request command buffer m_buffer[0] = SOCKS5_VERSION; switch (m_proxyCommand) { case PROXY_CMD_CONNECT: m_buffer[1] = SOCKS5_CMD_CONNECT; break; case PROXY_CMD_BIND: m_buffer[1] = SOCKS5_CMD_BIND; break; case PROXY_CMD_UDP_ASSOCIATE: m_buffer[1] = SOCKS5_CMD_UDP_ASSOCIATE; break; } m_buffer[2] = SOCKS5_RSV; m_buffer[3] = SOCKS5_ATYP_IPV4_ADDRESS; PokeUInt32( m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress()) ); RawPokeUInt16( m_buffer+8, ENDIAN_HTONS( m_peerAddress->Service() ) ); // Send the command packet m_packetLenght = 10; ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } } void CSocks5StateMachine::process_receive_command_reply(bool entry) { if (entry) { // The minimum number of bytes to read is 10 in the case of // ATYP == SOCKS5_ATYP_IPV4_ADDRESS m_packetLenght = 10; ProxyRead(*m_proxyClientSocket, m_buffer); } AddDummyEvent(); } void CSocks5StateMachine::process_process_command_reply(bool entry) { if (entry) { m_lastReply = m_buffer[1]; unsigned char addressType = m_buffer[3]; // Process the server's reply m_ok = m_ok && m_buffer[0] == SOCKS5_VERSION && m_buffer[1] == SOCKS5_REPLY_SUCCEED; if (m_ok) { // Read BND.ADDR unsigned int portOffset = 0; switch(addressType) { case SOCKS5_ATYP_IPV4_ADDRESS: { const unsigned int addrOffset = 4; portOffset = 8; m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset) ); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; break; } case SOCKS5_ATYP_DOMAINNAME: { // Read the domain name const unsigned int addrOffset = 5; portOffset = 10 + m_buffer[4]; char c = m_buffer[portOffset]; m_buffer[portOffset] = 0; m_proxyBoundAddressIPV4.Hostname( char2unicode(m_buffer+addrOffset)); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; m_buffer[portOffset] = c; break; } case SOCKS5_ATYP_IPV6_ADDRESS: { portOffset = 20; // TODO // IPV6 not yet implemented in wx //m_proxyBoundAddress.Hostname(Uint128toStringIP( // *((uint128 *)(m_buffer+addrOffset)) )); //m_proxyBoundAddress = &m_proxyBoundAddressIPV6; m_ok = false; break; } } // Set the packet length at last m_packetLenght = portOffset + 2; // Read BND.PORT m_proxyBoundAddress->Service( ENDIAN_NTOHS( RawPeekUInt16( m_buffer+portOffset) ) ); } } AddDummyEvent(); } //------------------------------------------------------------------------------ // CSocks4StateMachine //------------------------------------------------------------------------------ CSocks4StateMachine::CSocks4StateMachine( const CProxyData &proxyData, CProxyCommand proxyCommand) : CProxyStateMachine( wxString(wxT("Socks4")), SOCKS4_MAX_STATES, proxyData, proxyCommand) { m_process_state[0] = &CSocks4StateMachine::process_start; m_state_name[0] = wxT("process_start"); m_process_state[1] = &CSocks4StateMachine::process_end; m_state_name[1] = wxT("process_end"); m_process_state[2] = &CSocks4StateMachine::process_send_command_request; m_state_name[2] = wxT("process_send_command_request"); m_process_state[3] = &CSocks4StateMachine::process_receive_command_reply; m_state_name[3] = wxT("process_receive_command_reply"); m_process_state[4] = &CSocks4StateMachine::process_process_command_reply; m_state_name[4] = wxT("process_process_command_reply"); } void CSocks4StateMachine::process_state(t_sm_state state, bool entry) { (this->*m_process_state[state])(entry); #ifdef __DEBUG__ int n = 0; switch (state) { case SOCKS4_STATE_START: case SOCKS4_STATE_END: case SOCKS4_STATE_RECEIVE_COMMAND_REPLY: default: n = 0; break; case SOCKS4_STATE_SEND_COMMAND_REQUEST: n = m_packetLenght; break; case SOCKS4_STATE_PROCESS_COMMAND_REPLY: n = m_lastRead; break; } if (entry) { DumpMem(m_buffer, n, m_state_name[state], m_ok); } else { AddDebugLogLineN(logProxy, wxString(wxT("wait state -- ")) << m_state_name[state]); } #endif // __DEBUG__ } t_sm_state CSocks4StateMachine::next_state(t_sm_event event) { // Default is stay in current state t_sm_state ret = HandleEvent(event); switch (GetState()) { case SOCKS4_STATE_START: if (m_isConnected && !m_isLost && CanSend()) { ret = SOCKS4_STATE_SEND_COMMAND_REQUEST; } break; case SOCKS4_STATE_SEND_COMMAND_REQUEST: if (m_ok) { if (CanReceive()) { ret = SOCKS4_STATE_RECEIVE_COMMAND_REPLY; } } else { ret = SOCKS4_STATE_END; } break; case SOCKS4_STATE_RECEIVE_COMMAND_REPLY: ret = SOCKS4_STATE_PROCESS_COMMAND_REPLY; break; case SOCKS4_STATE_PROCESS_COMMAND_REPLY: ret = SOCKS4_STATE_END; break; case SOCKS4_STATE_END: default: break; } return ret; } void CSocks4StateMachine::process_start(bool entry) { if (entry) { } else { } } void CSocks4StateMachine::process_end(bool) { ReactivateSocket(); } void CSocks4StateMachine::process_send_command_request(bool entry) { if (entry) { // Prepare the request command buffer m_buffer[0] = SOCKS4_VERSION; switch (m_proxyCommand) { case PROXY_CMD_CONNECT: m_buffer[1] = SOCKS4_CMD_CONNECT; break; case PROXY_CMD_BIND: m_buffer[1] = SOCKS4_CMD_BIND; break; case PROXY_CMD_UDP_ASSOCIATE: m_ok = false; return; break; } RawPokeUInt16(m_buffer+2, ENDIAN_HTONS(m_peerAddress->Service())); // Special processing for SOCKS4a switch (m_proxyData.m_proxyType) { case PROXY_SOCKS4a: PokeUInt32(m_buffer+4, StringIPtoUint32(wxT("0.0.0.1"))); break; case PROXY_SOCKS4: default: PokeUInt32(m_buffer+4, StringIPtoUint32(m_peerAddress->IPAddress())); break; } // Common processing for SOCKS4/SOCKS4a unsigned int offsetUser = 8; unsigned char lenUser = m_proxyData.m_userName.Len(); memcpy(m_buffer + offsetUser, unicode2char(m_proxyData.m_userName), lenUser); m_buffer[offsetUser + lenUser] = 0; // Special processing for SOCKS4a switch (m_proxyData.m_proxyType) { case PROXY_SOCKS4a: { unsigned int offsetDomain = offsetUser + lenUser + 1; unsigned char lenDomain = m_peerAddress->Hostname().Len(); memcpy(m_buffer + offsetDomain, unicode2char(m_peerAddress->Hostname()), lenDomain); m_buffer[offsetDomain + lenDomain] = 0; m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1 + lenDomain + 1; break; } case PROXY_SOCKS4: default: m_packetLenght = 1 + 1 + 2 + 4 + lenUser + 1; break; } // Send the command packet ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } } void CSocks4StateMachine::process_receive_command_reply(bool entry) { if (entry) { // Receive the server's reply m_packetLenght = 8; ProxyRead(*m_proxyClientSocket, m_buffer); } AddDummyEvent(); } void CSocks4StateMachine::process_process_command_reply(bool entry) { if (entry) { m_lastReply = m_buffer[1]; // Process the server's reply m_ok = m_ok && m_buffer[0] == SOCKS4_REPLY_CODE && m_buffer[1] == SOCKS4_REPLY_GRANTED; if (m_ok) { // Read BND.PORT const unsigned int portOffset = 2; m_ok = m_proxyBoundAddressIPV4.Service(ENDIAN_NTOHS( RawPeekUInt16( m_buffer+portOffset) ) ); // Read BND.ADDR const unsigned int addrOffset = 4; m_ok = m_ok && m_proxyBoundAddressIPV4.Hostname( PeekUInt32( m_buffer+addrOffset ) ); m_proxyBoundAddress = &m_proxyBoundAddressIPV4; } } AddDummyEvent(); } //------------------------------------------------------------------------------ // CHttpStateMachine //------------------------------------------------------------------------------ CHttpStateMachine::CHttpStateMachine( const CProxyData &proxyData, CProxyCommand proxyCommand) : CProxyStateMachine( wxString(wxT("Http")), HTTP_MAX_STATES, proxyData, proxyCommand) { m_process_state[0] = &CHttpStateMachine::process_start; m_state_name[0] = wxT("process_start"); m_process_state[1] = &CHttpStateMachine::process_end; m_state_name[1] = wxT("process_end"); m_process_state[2] = &CHttpStateMachine::process_send_command_request; m_state_name[2] = wxT("process_send_command_request"); m_process_state[3] = &CHttpStateMachine::process_receive_command_reply; m_state_name[3] = wxT("process_receive_command_reply"); m_process_state[4] = &CHttpStateMachine::process_process_command_reply; m_state_name[4] = wxT("process_process_command_reply"); } void CHttpStateMachine::process_state(t_sm_state state, bool entry) { (this->*m_process_state[state])(entry); #ifdef __DEBUG__ int n = 0; switch (state) { case HTTP_STATE_START: case HTTP_STATE_END: case HTTP_STATE_RECEIVE_COMMAND_REPLY: default: n = 0; break; case HTTP_STATE_SEND_COMMAND_REQUEST: n = m_packetLenght; break; case HTTP_STATE_PROCESS_COMMAND_REPLY: n = m_lastRead; break; } if (entry) { DumpMem(m_buffer, n, m_state_name[state], m_ok); } else { AddDebugLogLineN(logProxy, wxString(wxT("wait state -- ")) << m_state_name[state]); } #endif // __DEBUG__ } t_sm_state CHttpStateMachine::next_state(t_sm_event event) { // Default is stay in current state t_sm_state ret = HandleEvent(event); switch (GetState()) { case HTTP_STATE_START: if (m_isConnected && !m_isLost && CanSend()) { ret = HTTP_STATE_SEND_COMMAND_REQUEST; } break; case HTTP_STATE_SEND_COMMAND_REQUEST: if (m_ok) { if (CanReceive()) { ret = HTTP_STATE_RECEIVE_COMMAND_REPLY; } } else { ret = HTTP_STATE_END; } break; case HTTP_STATE_RECEIVE_COMMAND_REPLY: ret = HTTP_STATE_PROCESS_COMMAND_REPLY; break; case HTTP_STATE_PROCESS_COMMAND_REPLY: ret = HTTP_STATE_END; break; case HTTP_STATE_END: default: break; } return ret; } void CHttpStateMachine::process_start(bool entry) { if (entry) { } else { } } void CHttpStateMachine::process_end(bool) { ReactivateSocket(); } void CHttpStateMachine::process_send_command_request(bool entry) { if (entry) { // Prepare the request command buffer wxString ip = m_peerAddress->IPAddress(); uint16 port = m_peerAddress->Service(); wxString userPass; wxString userPassEncoded; if (m_proxyData.m_enablePassword) { userPass = m_proxyData.m_userName + wxT(":") + m_proxyData.m_password; userPassEncoded = EncodeBase64(unicode2char(userPass), userPass.Length()); } wxString msg; switch (m_proxyCommand) { case PROXY_CMD_CONNECT: msg << wxT("CONNECT ") << ip << wxT(":") << port << wxT(" HTTP/1.1\r\n") << wxT("Host: ") << ip << wxT(":") << port << wxT("\r\n"); if (m_proxyData.m_enablePassword) { msg << wxT("Authorization: Basic ") << userPassEncoded << wxT("\r\n") << wxT("Proxy-Authorization: Basic ") << userPassEncoded << wxT("\r\n"); } msg << wxT("\r\n"); break; case PROXY_CMD_BIND: m_ok = false; break; case PROXY_CMD_UDP_ASSOCIATE: m_ok = false; return; break; } // Send the command packet m_packetLenght = msg.Len(); memcpy(m_buffer, unicode2char(msg), m_packetLenght+1); ProxyWrite(*m_proxyClientSocket, m_buffer, m_packetLenght); } } void CHttpStateMachine::process_receive_command_reply(bool entry) { if (entry) { // Receive the server's reply -- Use a large number, but don't // Expect to get it all. HTTP protocol does not have a fixed length. m_packetLenght = PROXY_BUFFER_SIZE; ProxyRead(*m_proxyClientSocket, m_buffer); } AddDummyEvent(); } /* * HTTP Proxy server response should be something like: * "HTTP/1.1 200 Connection established\r\n\r\n" * but that may vary. The important thing is the "200" * code, that means success. */ static const char HTTP_AUTH_RESPONSE[] = "HTTP/"; static const int HTTP_AUTH_RESPONSE_LENGHT = strlen(HTTP_AUTH_RESPONSE); void CHttpStateMachine::process_process_command_reply(bool entry) { if (entry) { // The position of the first space in the buffer int i = 8; while (m_buffer[i] == ' ') { i++; } // Process the server's reply m_ok = !memcmp(m_buffer + 0, HTTP_AUTH_RESPONSE, HTTP_AUTH_RESPONSE_LENGHT) && !memcmp(m_buffer + i, "200", 3); } AddDummyEvent(); } //------------------------------------------------------------------------------ // CProxySocket //------------------------------------------------------------------------------ CProxySocket::CProxySocket( wxSocketFlags flags, const CProxyData *proxyData, CProxyCommand proxyCommand, CDatagramSocketProxy *udpSocket) : wxSocketClient(flags), m_proxyStateMachine(NULL), m_udpSocket(udpSocket), m_socketEventHandler(NULL), m_socketEventHandlerId(0), m_savedSocketEventHandler(NULL), m_savedSocketEventHandlerId(0) { SetProxyData(proxyData); if (m_useProxy) { switch (m_proxyData.m_proxyType) { case PROXY_NONE: break; case PROXY_SOCKS5: m_proxyStateMachine = new CSocks5StateMachine(*proxyData, proxyCommand); break; case PROXY_SOCKS4: case PROXY_SOCKS4a: m_proxyStateMachine = new CSocks4StateMachine(*proxyData, proxyCommand); break; case PROXY_HTTP: m_proxyStateMachine = new CHttpStateMachine(*proxyData, proxyCommand); break; default: break; } } } CProxySocket::~CProxySocket() { delete m_proxyStateMachine; } void CProxySocket::SetProxyData(const CProxyData *proxyData) { m_useProxy = proxyData != NULL && proxyData->m_proxyEnable; if (proxyData) { m_proxyData = *proxyData; m_proxyAddress.Hostname(m_proxyData.m_proxyHostName); m_proxyAddress.Service(m_proxyData.m_proxyPort); } else { m_proxyData.Clear(); } } bool CProxySocket::Start(const wxIPaddress &peerAddress) { SaveState(); // Important note! SaveState()/RestoreState() DO NOT save/restore // the event handler. The method SaveEventHandler() has been created // for that. SaveEventHandler(); SetEventHandler(g_proxyEventHandler, ID_PROXY_SOCKET_EVENT); SetNotify( wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_OUTPUT_FLAG | wxSOCKET_LOST_FLAG); Notify(true); Connect(m_proxyAddress, false); SetFlags(wxSOCKET_NONE); bool ok = m_proxyStateMachine->Start(peerAddress, this); return ok; } bool CProxySocket::ProxyIsCapableOf(CProxyCommand proxyCommand) const { bool ret = false; switch (m_proxyData.m_proxyType) { case PROXY_NONE: ret = false; break; case PROXY_SOCKS5: ret = proxyCommand == PROXY_CMD_CONNECT || proxyCommand == PROXY_CMD_BIND || proxyCommand == PROXY_CMD_UDP_ASSOCIATE; break; case PROXY_SOCKS4: case PROXY_SOCKS4a: ret = proxyCommand == PROXY_CMD_CONNECT || proxyCommand == PROXY_CMD_BIND; break; case PROXY_HTTP: ret = proxyCommand == PROXY_CMD_CONNECT; break; } return ret; } //------------------------------------------------------------------------------ // CSocketClientProxy //------------------------------------------------------------------------------ CSocketClientProxy::CSocketClientProxy( wxSocketFlags flags, const CProxyData *proxyData) : CProxySocket(flags, proxyData, PROXY_CMD_CONNECT) { } bool CSocketClientProxy::Connect(wxIPaddress &address, bool wait) { wxMutexLocker lock(m_socketLocker); bool ok; if (GetUseProxy() && ProxyIsCapableOf(PROXY_CMD_CONNECT)) { ok = Start(address); } else { ok = wxSocketClient::Connect(address, wait); } return ok; } CSocketClientProxy& CSocketClientProxy::Read(void *buffer, wxUint32 nbytes) { wxMutexLocker lock(m_socketLocker); CProxySocket::Read(buffer, nbytes); return *this; } CSocketClientProxy& CSocketClientProxy::Write(const void *buffer, wxUint32 nbytes) { wxMutexLocker lock(m_socketLocker); CProxySocket::Write(buffer, nbytes); return *this; } //------------------------------------------------------------------------------ // CSocketServerProxy //------------------------------------------------------------------------------ CSocketServerProxy::CSocketServerProxy( wxIPaddress &address, wxSocketFlags flags, const CProxyData *) : wxSocketServer(address, flags) { /* Maybe some day when socks6 is out... :) */ } CSocketServerProxy& CSocketServerProxy::Read(void *buffer, wxUint32 nbytes) { wxMutexLocker lock(m_socketLocker); wxSocketServer::Read(buffer, nbytes); return *this; } CSocketServerProxy& CSocketServerProxy::Write(const void *buffer, wxUint32 nbytes) { wxMutexLocker lock(m_socketLocker); wxSocketServer::Write(buffer, nbytes); return *this; } //------------------------------------------------------------------------------ // CDatagramSocketProxy //------------------------------------------------------------------------------ CDatagramSocketProxy::CDatagramSocketProxy( wxIPaddress &address, wxSocketFlags flags, const CProxyData *proxyData) : wxDatagramSocket(address, flags), m_proxyTCPSocket(wxSOCKET_NOWAIT, proxyData, PROXY_CMD_UDP_ASSOCIATE, this) { m_udpSocketOk = false; if ( m_proxyTCPSocket.GetUseProxy() && m_proxyTCPSocket.ProxyIsCapableOf(PROXY_CMD_UDP_ASSOCIATE)) { m_proxyTCPSocket.Start(address); } else { } m_lastUDPOperation = UDP_OPERATION_NONE; } CDatagramSocketProxy::~CDatagramSocketProxy() { // From RFC-1928: // "A UDP association terminates when the TCP connection that the // UDP ASSOCIATE request arrived terminates." } wxDatagramSocket &CDatagramSocketProxy::RecvFrom( wxSockAddress &addr, void* buf, wxUint32 nBytes ) { wxMutexLocker lock(m_socketLocker); m_lastUDPOperation = UDP_OPERATION_RECV_FROM; if (m_proxyTCPSocket.GetUseProxy()) { if (m_udpSocketOk) { char *bufUDP = NULL; if (nBytes + PROXY_UDP_MAXIMUM_OVERHEAD > PROXY_BUFFER_SIZE) { bufUDP = new char[nBytes + PROXY_UDP_MAXIMUM_OVERHEAD]; } else { bufUDP = m_proxyTCPSocket.GetBuffer(); } wxDatagramSocket::RecvFrom( m_proxyTCPSocket.GetProxyBoundAddress(), bufUDP, nBytes + PROXY_UDP_MAXIMUM_OVERHEAD); unsigned int offset; switch (m_proxyTCPSocket.GetBuffer()[3]) { case SOCKS5_ATYP_IPV4_ADDRESS: { offset = PROXY_UDP_OVERHEAD_IPV4; try { amuleIPV4Address &a = dynamic_cast(addr); a.Hostname( PeekUInt32( m_proxyTCPSocket.GetBuffer()+4 ) ); a.Service( ENDIAN_NTOHS( RawPeekUInt16( m_proxyTCPSocket.GetBuffer()+8) ) ); } catch (const std::bad_cast& WXUNUSED(e)) { AddDebugLogLineN(logProxy, wxT("(2)bad_cast exception!")); wxFAIL; } } break; case SOCKS5_ATYP_DOMAINNAME: offset = PROXY_UDP_OVERHEAD_DOMAIN_NAME; break; case SOCKS5_ATYP_IPV6_ADDRESS: offset = PROXY_UDP_OVERHEAD_IPV6; break; default: /* Error! */ offset = 0; break; } memcpy(buf, bufUDP + offset, nBytes); // Uncomment here to see the buffer contents on console // DumpMem(bufUDP, wxDatagramSocket::LastCount(), wxT("RecvFrom"), 3); /* Only delete buffer if it was dynamically created */ if (bufUDP != m_proxyTCPSocket.GetBuffer()) { /* We should use a fixed buffer to avoid * new/delete it all the time. * I need an upper bound */ delete bufUDP; } /* There is still one problem pending, fragmentation. * Either we support it or we have to drop fragmented * messages. I vote for drop :) */ } } else { wxDatagramSocket::RecvFrom(addr, buf, nBytes); } return *this; } wxDatagramSocket &CDatagramSocketProxy::SendTo( wxIPaddress &addr, const void* buf, wxUint32 nBytes ) { wxMutexLocker lock(m_socketLocker); m_lastUDPOperation = UDP_OPERATION_SEND_TO; m_lastUDPOverhead = PROXY_UDP_OVERHEAD_IPV4; if (m_proxyTCPSocket.GetUseProxy()) { if (m_udpSocketOk) { m_proxyTCPSocket.GetBuffer()[0] = SOCKS5_RSV; // Reserved m_proxyTCPSocket.GetBuffer()[1] = SOCKS5_RSV; // Reserved m_proxyTCPSocket.GetBuffer()[2] = 0; // FRAG m_proxyTCPSocket.GetBuffer()[3] = SOCKS5_ATYP_IPV4_ADDRESS; PokeUInt32( m_proxyTCPSocket.GetBuffer()+4, StringIPtoUint32(addr.IPAddress())); RawPokeUInt16( m_proxyTCPSocket.GetBuffer()+8, ENDIAN_HTONS( addr.Service() ) ); memcpy(m_proxyTCPSocket.GetBuffer() + PROXY_UDP_OVERHEAD_IPV4, buf, nBytes); nBytes += PROXY_UDP_OVERHEAD_IPV4; wxDatagramSocket::SendTo( m_proxyTCPSocket.GetProxyBoundAddress(), m_proxyTCPSocket.GetBuffer(), nBytes); // Uncomment here to see the buffer contents on console // DumpMem(m_proxyTCPSocket.GetBuffer(), nBytes, wxT("SendTo"), 3); } } else { wxDatagramSocket::SendTo(addr, buf, nBytes); } return *this; } wxUint32 CDatagramSocketProxy::LastCount(void) const { wxUint32 ret; if (m_proxyTCPSocket.GetUseProxy()) { switch (m_lastUDPOperation) { case UDP_OPERATION_RECV_FROM: case UDP_OPERATION_SEND_TO: ret = Ok() ? wxDatagramSocket::LastCount() - m_lastUDPOverhead : 0; break; case UDP_OPERATION_NONE: default: ret = 0; break; } } else { ret = wxDatagramSocket::LastCount(); } return ret; } #endif // CLIENT_GUI /******************************************************************************/ // File_checked_for_headers aMule-2.3.1/src/EncryptedDatagramSocket.h0000644000175000017470000000400311575347521017202 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef ENCRYPTEDDATAGRAMSOCKET_H #define ENCRYPTEDDATAGRAMSOCKET_H #include "Proxy.h" #include "Types.h" class CEncryptedDatagramSocket : public CDatagramSocketProxy { public: CEncryptedDatagramSocket(wxIPaddress &address, wxSocketFlags flags = wxSOCKET_NONE, const CProxyData *proxyData = NULL); virtual ~CEncryptedDatagramSocket(); // TODO: Make protected once the UDP socket is again its own class. static int DecryptReceivedClient(uint8_t *bufIn, int bufLen, uint8_t **bufOut, uint32_t ip, uint32_t *receiverVerifyKey, uint32_t *senderVerifyKey); static int EncryptSendClient(uint8_t **buf, int bufLen, const uint8_t *clientHashOrKadID, bool kad, uint32_t receiverVerifyKey, uint32_t senderVerifyKey); static int DecryptReceivedServer(uint8_t* pbyBufIn, int nBufLen, uint8_t** ppbyBufOut, uint32_t dwBaseKey, uint32_t dbgIP); static int EncryptSendServer(uint8_t** ppbyBuf, int nBufLen, uint32_t dwBaseKey); }; #endif aMule-2.3.1/src/MuleNotebook.cpp0000644000175000017470000001450411575347521015400 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include #include "MuleNotebook.h" // Interface declarations #include DEFINE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING) DEFINE_LOCAL_EVENT_TYPE(wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED) BEGIN_EVENT_TABLE(CMuleNotebook, wxNotebook) EVT_RIGHT_DOWN(CMuleNotebook::OnRMButton) EVT_MENU(MP_CLOSE_TAB, CMuleNotebook::OnPopupClose) EVT_MENU(MP_CLOSE_ALL_TABS, CMuleNotebook::OnPopupCloseAll) EVT_MENU(MP_CLOSE_OTHER_TABS, CMuleNotebook::OnPopupCloseOthers) // Madcat - tab closing engine EVT_LEFT_UP(CMuleNotebook::OnMouseLeftRelease) EVT_MOTION(CMuleNotebook::OnMouseMotion) END_EVENT_TABLE() CMuleNotebook::CMuleNotebook( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxNotebook(parent, id, pos, size, style, name) { m_popup_enable = true; m_popup_widget = NULL; } CMuleNotebook::~CMuleNotebook() { // Ensure that all notifications gets sent DeleteAllPages(); } bool CMuleNotebook::DeletePage(int nPage) { wxCHECK_MSG((nPage >= 0) && (nPage < (int)GetPageCount()), false, wxT("Trying to delete invalid page-index in CMuleNotebook::DeletePage")); // Send out close event wxNotebookEvent evt( wxEVT_COMMAND_MULENOTEBOOK_PAGE_CLOSING, GetId(), nPage ); evt.SetEventObject(this); ProcessEvent( evt ); // and finally remove the actual page bool result = wxNotebook::DeletePage( nPage ); // Ensure a valid selection if ( GetPageCount() && (int)GetSelection() >= (int)GetPageCount() ) { SetSelection( GetPageCount() - 1 ); } // Send a page change event to work around wx problem when newly selected page // is identical with deleted page (wx sends a page change event during deletion, // but the control is still the one to be deleted at that moment). if (GetPageCount()) { // Select the tab that took the place of the one we just deleted. size_t page = nPage; // Except if we deleted the last one - then select the one that is last now. if (page == GetPageCount()) { page--; } wxNotebookEvent event( wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, GetId(), page ); event.SetEventObject(this); ProcessEvent( event ); } else { // Send an event when no pages are left open wxNotebookEvent event( wxEVT_COMMAND_MULENOTEBOOK_ALL_PAGES_CLOSED, GetId() ); event.SetEventObject(this); ProcessEvent( event ); } return result; } bool CMuleNotebook::DeleteAllPages() { Freeze(); bool result = true; while ( GetPageCount() ) { result &= DeletePage( 0 ); } Thaw(); return result; } void CMuleNotebook::EnablePopup( bool enable ) { m_popup_enable = enable; } void CMuleNotebook::SetPopupHandler( wxWindow* widget ) { m_popup_widget = widget; } //#warning wxMac does not support selection by right-clicking on tabs! void CMuleNotebook::OnRMButton(wxMouseEvent& event) { // Cases where we shouldn't be showing a popup-menu. if ( !GetPageCount() || !m_popup_enable ) { event.Skip(); return; } // For some reason, gtk1 does a rather poor job when using the HitTest wxPoint eventPoint = event.GetPosition(); int tab = HitTest(eventPoint); if (tab != wxNOT_FOUND) { SetSelection(tab); } else { event.Skip(); return; } // Should we send the event to a specific widget? if ( m_popup_widget ) { wxMouseEvent evt = event; // Map the coordinates onto the parent wxPoint point = evt.GetPosition(); point = ClientToScreen( point ); point = m_popup_widget->ScreenToClient( point ); evt.m_x = point.x; evt.m_y = point.y; m_popup_widget->GetEventHandler()->AddPendingEvent( evt ); } else { wxMenu menu(_("Close")); menu.Append(MP_CLOSE_TAB, wxString(_("Close tab"))); menu.Append(MP_CLOSE_ALL_TABS, wxString(_("Close all tabs"))); menu.Append(MP_CLOSE_OTHER_TABS, wxString(_("Close other tabs"))); PopupMenu( &menu, event.GetPosition() ); } } void CMuleNotebook::OnPopupClose(wxCommandEvent& WXUNUSED(evt)) { DeletePage( GetSelection() ); } void CMuleNotebook::OnPopupCloseAll(wxCommandEvent& WXUNUSED(evt)) { DeleteAllPages(); } void CMuleNotebook::OnPopupCloseOthers(wxCommandEvent& WXUNUSED(evt)) { wxNotebookPage* current = GetPage( GetSelection() ); for ( int i = GetPageCount() - 1; i >= 0; i-- ) { if ( current != GetPage( i ) ) DeletePage( i ); } } void CMuleNotebook::OnMouseLeftRelease(wxMouseEvent &event) { if (GetImageList() == NULL) { // This Mulenotebook has no images on tabs, so nothing to do. event.Skip(); return; } long xpos, ypos; event.GetPosition(&xpos, &ypos); long flags = 0; int tab = HitTest(wxPoint(xpos,ypos),&flags); if ((tab != -1) && (flags == wxNB_HITTEST_ONICON)) { // User did click on a 'x' DeletePage(tab); } else { // Is not a 'x'. Send this event up. event.Skip(); } } void CMuleNotebook::OnMouseMotion(wxMouseEvent &event) { if (GetImageList() == NULL) { // This Mulenotebook has no images on tabs, so nothing to do. event.Skip(); return; } long flags = 0; int tab = HitTest(wxPoint(event.m_x,event.m_y),&flags); // Clear the highlight for all tabs. for (int i=0;i<(int)GetPageCount();++i) { SetPageImage(i, 0); } if ((tab != -1) && (flags == wxNB_HITTEST_ONICON)) { // Mouse is over a 'x' SetPageImage(tab, 1); } else { // Is not a 'x'. Send this event up. event.Skip(); } } // File_checked_for_headers aMule-2.3.1/src/ClientUDPSocket.cpp0000644000175000017470000003065011575347521015735 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ClientUDPSocket.h" // Interface declarations #include #include // Sometimes we reply with TCP packets. #include #include #include #include // Needed for CFormat #include "Preferences.h" // Needed for CPreferences #include "PartFile.h" // Needed for CPartFile #include "updownclient.h" // Needed for CUpDownClient #include "UploadQueue.h" // Needed for CUploadQueue #include "Packet.h" // Needed for CPacket #include "SharedFileList.h" // Needed for CSharedFileList #include "DownloadQueue.h" // Needed for CDownloadQueue #include "Statistics.h" // Needed for theStats #include "amule.h" // Needed for theApp #include "ClientList.h" // Needed for clientlist (buddy support) #include "ClientTCPSocket.h" // Needed for CClientTCPSocket #include "MemFile.h" // Needed for CMemFile #include "Logger.h" #include "kademlia/kademlia/Kademlia.h" #include "kademlia/utils/KadUDPKey.h" #include "zlib.h" #include "EncryptedDatagramSocket.h" // // CClientUDPSocket -- Extended eMule UDP socket // CClientUDPSocket::CClientUDPSocket(const amuleIPV4Address& address, const CProxyData* ProxyData) : CMuleUDPSocket(wxT("Client UDP-Socket"), ID_CLIENTUDPSOCKET_EVENT, address, ProxyData) { if (!thePrefs::IsUDPDisabled()) { Open(); } } void CClientUDPSocket::OnReceive(int errorCode) { CMuleUDPSocket::OnReceive(errorCode); // TODO: A better solution is needed. if (thePrefs::IsUDPDisabled()) { Close(); } } void CClientUDPSocket::OnPacketReceived(uint32 ip, uint16 port, byte* buffer, size_t length) { wxCHECK_RET(length >= 2, wxT("Invalid packet.")); uint8_t *decryptedBuffer; uint32_t receiverVerifyKey; uint32_t senderVerifyKey; int packetLen = CEncryptedDatagramSocket::DecryptReceivedClient(buffer, length, &decryptedBuffer, ip, &receiverVerifyKey, &senderVerifyKey); uint8_t protocol = decryptedBuffer[0]; uint8_t opcode = decryptedBuffer[1]; if (packetLen >= 1) { try { switch (protocol) { case OP_EMULEPROT: ProcessPacket(decryptedBuffer + 2, packetLen - 2, opcode, ip, port); break; case OP_KADEMLIAHEADER: theStats::AddDownOverheadKad(length); if (packetLen >= 2) { Kademlia::CKademlia::ProcessPacket(decryptedBuffer, packetLen, wxUINT32_SWAP_ALWAYS(ip), port, (Kademlia::CPrefs::GetUDPVerifyKey(ip) == receiverVerifyKey), Kademlia::CKadUDPKey(senderVerifyKey, theApp->GetPublicIP(false))); } else { throw wxString(wxT("Kad packet too short")); } break; case OP_KADEMLIAPACKEDPROT: theStats::AddDownOverheadKad(length); if (packetLen >= 2) { uint32_t newSize = packetLen * 10 + 300; // Should be enough... std::vector unpack(newSize); uLongf unpackedsize = newSize - 2; uint16_t result = uncompress(&(unpack[2]), &unpackedsize, decryptedBuffer + 2, packetLen - 2); if (result == Z_OK) { AddDebugLogLineN(logClientKadUDP, wxT("Correctly uncompressed Kademlia packet")); unpack[0] = OP_KADEMLIAHEADER; unpack[1] = opcode; Kademlia::CKademlia::ProcessPacket(&(unpack[0]), unpackedsize + 2, wxUINT32_SWAP_ALWAYS(ip), port, (Kademlia::CPrefs::GetUDPVerifyKey(ip) == receiverVerifyKey), Kademlia::CKadUDPKey(senderVerifyKey, theApp->GetPublicIP(false))); } else { AddDebugLogLineN(logClientKadUDP, wxT("Failed to uncompress Kademlia packet")); } } else { throw wxString(wxT("Kad packet (compressed) too short")); } break; default: AddDebugLogLineN(logClientUDP, CFormat(wxT("Unknown opcode on received packet: 0x%x")) % protocol); } } catch (const wxString& DEBUG_ONLY(e)) { AddDebugLogLineN(logClientUDP, wxT("Error while parsing UDP packet: ") + e); } catch (const CInvalidPacket& DEBUG_ONLY(e)) { AddDebugLogLineN(logClientUDP, wxT("Invalid UDP packet encountered: ") + e.what()); } catch (const CEOFException& DEBUG_ONLY(e)) { AddDebugLogLineN(logClientUDP, wxT("Malformed packet encountered while parsing UDP packet: ") + e.what()); } } } void CClientUDPSocket::ProcessPacket(byte* packet, int16 size, int8 opcode, uint32 host, uint16 port) { switch (opcode) { case OP_REASKCALLBACKUDP: { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket; OP_REASKCALLBACKUDP") ); theStats::AddDownOverheadOther(size); CUpDownClient* buddy = theApp->clientlist->GetBuddy(); if( buddy ) { if( size < 17 || buddy->GetSocket() == NULL ) { break; } if (!md4cmp(packet, buddy->GetBuddyID())) { /* The packet has an initial 16 bytes key for the buddy. This is currently unused, so to make the transformation we discard the first 10 bytes below and then overwrite the other 6 with ip/port. */ CMemFile mem_packet(packet+10,size-10); // Change the ip and port while leaving the rest untouched mem_packet.Seek(0,wxFromStart); mem_packet.WriteUInt32(host); mem_packet.WriteUInt16(port); CPacket* response = new CPacket(mem_packet, OP_EMULEPROT, OP_REASKCALLBACKTCP); AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: send OP_REASKCALLBACKTCP") ); theStats::AddUpOverheadFileRequest(response->GetPacketSize()); buddy->GetSocket()->SendPacket(response); } } break; } case OP_REASKFILEPING: { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: OP_REASKFILEPING") ); theStats::AddDownOverheadFileRequest(size); CMemFile data_in(packet, size); CMD4Hash reqfilehash = data_in.ReadHash(); CKnownFile* reqfile = theApp->sharedfiles->GetFileByID(reqfilehash); bool bSenderMultipleIpUnknown = false; CUpDownClient* sender = theApp->uploadqueue->GetWaitingClientByIP_UDP(host, port, true, &bSenderMultipleIpUnknown); if (!reqfile) { CPacket* response = new CPacket(OP_FILENOTFOUND,0,OP_EMULEPROT); theStats::AddUpOverheadFileRequest(response->GetPacketSize()); if (sender) { SendPacket(response, host, port, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); } else { SendPacket(response, host, port, false, NULL, false, 0); } break; } if (sender){ sender->CheckForAggressive(); //Make sure we are still thinking about the same file if (reqfilehash == sender->GetUploadFileID()) { sender->AddAskedCount(); sender->SetUDPPort(port); sender->SetLastUpRequest(); if (sender->GetUDPVersion() > 3) { sender->ProcessExtendedInfo(&data_in, reqfile); } else if (sender->GetUDPVersion() > 2) { uint16 nCompleteCountLast = sender->GetUpCompleteSourcesCount(); uint16 nCompleteCountNew = data_in.ReadUInt16(); sender->SetUpCompleteSourcesCount(nCompleteCountNew); if (nCompleteCountLast != nCompleteCountNew) { reqfile->UpdatePartsInfo(); } } CMemFile data_out(128); if(sender->GetUDPVersion() > 3) { if (reqfile->IsPartFile()) { ((CPartFile*)reqfile)->WritePartStatus(&data_out); } else { data_out.WriteUInt16(0); } } data_out.WriteUInt16(sender->GetUploadQueueWaitingPosition()); CPacket* response = new CPacket(data_out, OP_EMULEPROT, OP_REASKACK); theStats::AddUpOverheadFileRequest(response->GetPacketSize()); AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: OP_REASKACK to ") + sender->GetFullIP()); SendPacket(response, host, port, sender->ShouldReceiveCryptUDPPackets(), sender->GetUserHash().GetHash(), false, 0); } else { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket; ReaskFilePing; reqfile does not match") ); } } else { if (!bSenderMultipleIpUnknown) { if ((theStats::GetWaitingUserCount() + 50) > thePrefs::GetQueueSize()) { CPacket* response = new CPacket(OP_QUEUEFULL,0,OP_EMULEPROT); theStats::AddUpOverheadFileRequest(response->GetPacketSize()); SendPacket(response,host,port, false, NULL, false, 0); // we cannot answer this one encrypted since we dont know this client } } else { AddDebugLogLineN(logClientUDP, CFormat(wxT("UDP Packet received - multiple clients with the same IP but different UDP port found. Possible UDP Portmapping problem, enforcing TCP connection. IP: %s, Port: %u")) % Uint32toStringIP(host) % port); } } break; } case OP_QUEUEFULL: { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: OP_QUEUEFULL") ); theStats::AddDownOverheadOther(size); CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); if (sender) { sender->SetRemoteQueueFull(true); sender->UDPReaskACK(0); } break; } case OP_REASKACK: { theStats::AddDownOverheadFileRequest(size); CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); if (sender) { CMemFile data_in(packet,size); if ( sender->GetUDPVersion() > 3 ) { sender->ProcessFileStatus(true, &data_in, sender->GetRequestFile()); } uint16 nRank = data_in.ReadUInt16(); sender->SetRemoteQueueFull(false); sender->UDPReaskACK(nRank); } break; } case OP_FILENOTFOUND: { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: OP_FILENOTFOUND") ); theStats::AddDownOverheadFileRequest(size); CUpDownClient* sender = theApp->downloadqueue->GetDownloadClientByIP_UDP(host,port); if (sender){ sender->UDPReaskFNF(); // may delete 'sender'! sender = NULL; } break; } case OP_DIRECTCALLBACKREQ: { AddDebugLogLineN( logClientUDP, wxT("Client UDP socket: OP_DIRECTCALLBACKREQ") ); theStats::AddDownOverheadOther(size); if (!theApp->clientlist->AllowCallbackRequest(host)) { AddDebugLogLineN(logClientUDP, wxT("Ignored DirectCallback Request because this IP (") + Uint32toStringIP(host) + wxT(") has sent too many requests within a short time")); break; } // do we accept callbackrequests at all? if (Kademlia::CKademlia::IsRunning() && Kademlia::CKademlia::IsFirewalled()) { theApp->clientlist->AddTrackCallbackRequests(host); CMemFile data(packet, size); uint16_t remoteTCPPort = data.ReadUInt16(); CMD4Hash userHash(data.ReadHash()); uint8_t connectOptions = data.ReadUInt8(); CUpDownClient* requester = NULL; CClientList::SourceList clients = theApp->clientlist->GetClientsByHash(userHash); for (CClientList::SourceList::iterator it = clients.begin(); it != clients.end(); ++it) { if ((host == 0 || it->GetIP() == host) && (remoteTCPPort == 0 || it->GetUserPort() == remoteTCPPort)) { requester = it->GetClient(); break; } } if (requester == NULL) { requester = new CUpDownClient(remoteTCPPort, host, 0, 0, NULL, true, true); requester->SetUserHash(CMD4Hash(userHash)); theApp->clientlist->AddClient(requester); } requester->SetConnectOptions(connectOptions, true, false); requester->SetDirectUDPCallbackSupport(false); requester->SetIP(host); requester->SetUserPort(remoteTCPPort); AddDebugLogLineN(logClientUDP, wxT("Accepting incoming DirectCallback Request from ") + Uint32toStringIP(host)); requester->TryToConnect(); } else { AddDebugLogLineN(logClientUDP, wxT("Ignored DirectCallback Request because we do not accept Direct Callbacks at all (") + Uint32toStringIP(host) + wxT(")")); } break; } default: theStats::AddDownOverheadOther(size); } } // File_checked_for_headers aMule-2.3.1/src/PlatformSpecific.h0000644000175000017470000001006211575347521015667 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef PLATFORMSPECIFIC_H #define PLATFORMSPECIFIC_H #include #include "Types.h" namespace PlatformSpecific { /** * Create sparse file. * * This function will create the named file sparse if possible. * * @param name The file to be created (sparse if possible). * @param size The desired size of the file. * @return true, if creating the file succeeded, false otherwise. */ bool CreateSparseFile(const CPath& name, uint64_t size); /** * Returns the max number of connections the current OS can handle. * * Currently anything but windows will return the default value (-1); */ #ifdef __WXMSW__ int GetMaxConnections(); #else inline int GetMaxConnections() { return -1; } #endif /** * File system types returned by GetFilesystemType */ enum EFSType { fsFAT, //! File Allocation Table fsNTFS, //! New Technology File System fsHFS, //! Hierarchical File System fsHPFS, //! High Performace File System fsMINIX, //! Minix file system fsOther //! Unknown, other }; /** * Find out the filesystem type of the given path. * * @param path The path for which the filesystem type should be checked. * @return The filesystem type of the given path. * * This function returns fsOther on unknown or network file systems (because the * real filesystem type cannot be determined). */ EFSType GetFilesystemType(const CPath& path); /** * Checks if the filesystem can handle special chars. * * @param path The path for which the file system should be checked. * @return true if the underlying filesystem can handle special chars. * * This function checks if the file system of the given path can handle * special chars e.g. ':' in file names. This function will always return * false on MSW, since Windows cannot handle those characters on any file system. * * Based on http://en.wikipedia.org/wiki/Comparison_of_file_systems */ #ifdef __WXMSW__ inline bool CanFSHandleSpecialChars(const CPath& WXUNUSED(path)) { return false; } #else // Other filesystem types may be added inline bool CanFSHandleSpecialChars(const CPath& path) { switch (GetFilesystemType(path)) { case fsFAT: case fsHFS: return false; default: return true; } } #endif /** * Check if the filesystem can handle large files. * * @param path The path for which the filesystem should be checked. * @return true if the underlying filesystem can handle large files. * * This function checks if the file system of the given path can handle * large files (>4GB). * * Based on http://en.wikipedia.org/wiki/Comparison_of_file_systems */ inline bool CanFSHandleLargeFiles(const CPath& path) { switch (GetFilesystemType(path)) { case fsFAT: case fsHFS: case fsHPFS: case fsMINIX: return false; default: return true; } } /** * Disable / enable computer's energy saving "standby" mode. * */ #if defined __WXMSW__ || defined __WXMAC__ #define PLATFORMSPECIFIC_CAN_PREVENT_SLEEP_MODE 1 #else #define PLATFORMSPECIFIC_CAN_PREVENT_SLEEP_MODE 0 #endif void PreventSleepMode(); void AllowSleepMode(); }; /* namespace PlatformSpecific */ #endif /* PLATFORMSPECIFIC_H */ aMule-2.3.1/src/NetworkFunctions.h0000644000175000017470000001041111575347521015755 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef NETWORK_FUNCTIONS_H #define NETWORK_FUNCTIONS_H #include "Types.h" // Needed for uint16 and uint32 #include // Needed for CFormat #include // Network ip/host handling functions // These functions take IPs in anti-host order inline wxString Uint32toStringIP(uint32 ip) { return CFormat(wxT("%u.%u.%u.%u")) % (uint8)ip % (uint8)(ip>>8) % (uint8)(ip>>16) % (uint8)(ip>>24); } inline wxString Uint32_16toStringIP_Port(uint32 ip, uint16 port) { return CFormat(wxT("%u.%u.%u.%u:%u")) % (uint8)ip % (uint8)(ip>>8) % (uint8)(ip>>16) % (uint8)(ip>>24) % port; } // These functions take IPs in host-order inline wxString KadIPToString(uint32_t ip) { return CFormat(wxT("%u.%u.%u.%u")) % (uint8_t)(ip >> 24) % (uint8_t)(ip >> 16) % (uint8_t)(ip >> 8) % (uint8_t)ip; } inline wxString KadIPPortToString(uint32_t ip, uint16_t port) { return CFormat(wxT("%u.%u.%u.%u:%u")) % (uint8_t)(ip >> 24) % (uint8_t)(ip >> 16) % (uint8_t)(ip >> 8) % (uint8_t)ip % port; } /** * Parses a String-IP and saves the IP in the referenced variable. * * @param strIP A string-ip in the format "a.b.c.d". * @param Ip The value to save the result in. * @return True if the string was parsed, false otherwise. * * When parsing the IP address, whitespace before or after the * ip-address is ignored and the resulting IP is saved in * anti-host order. * * The reason for the existance of this function is the fact that * the standard inet_aton function treats numbers with 0 prefixed * as octals, which is desirable. * * Note: The reference value will not be changed unless the string * contains a valid IP adress. */ bool StringIPtoUint32(const wxString &strIP, uint32& Ip); /** * Parses a String-IP and returns the IP or 0 if it was invalid. * * @param strIP A string-ip in the format "a.b.c.d". * @return The resulting IP-address or zero if invalid (or 0.0.0.0). * * The IP will be saved in anti-host order. */ inline uint32 StringIPtoUint32(const wxString &strIP) { uint32 ip = 0; StringIPtoUint32( strIP, ip ); return ip; } /** * Parses a String-IHost and returns the IP or 0 if it was invalid. * * @param Host A string with the Host to convert. * @return The resulting IP-address or zero if invalid (or 0.0.0.0). * * The IP will be saved in anti-host order. */ uint32 StringHosttoUint32(const wxString &Host); /** * Checks for invalid IP-values. * * @param IP the IP-address to check. * @param filterLAN Specifies if LAN IP-ranges should be filtered. * @return True if it was valid, false otherwise. * * Note: IP must be in anti-host order (BE on LE platform, LE on BE platform). */ bool IsGoodIP( uint32 IP, bool filterLAN ); inline bool IsGoodIPPort(uint32 nIP, uint16 nPort) { return IsGoodIP(nIP, true) && nPort!=0; } #define HIGHEST_LOWID_ED2K_KAD 16777216 inline bool IsLowID(uint32 id) { return (id < HIGHEST_LOWID_ED2K_KAD); } /** * Checks for LAN IPs. * * @param ip The IP-address to check. * @return True if it was a LAN IP, false otherwise. * * @note IP must be in anti-host order. */ bool IsLanIP(uint32_t ip) throw(); #endif // NETWORK_FUNCTIONS_H // File_checked_for_headers aMule-2.3.1/src/TransferWnd.cpp0000644000175000017470000003472711626513176015241 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "TransferWnd.h" // Interface declarations #include #include // This include must be before amuleDlg.h #ifdef __WXMSW__ #include // Needed for windows compilation #endif #include "amuleDlg.h" // Needed for CamuleDlg #include "PartFile.h" // Needed for PR_LOW #include "DownloadQueue.h" // Needed for CDownloadQueue #include "CatDialog.h" // Needed for CCatDialog #include "DownloadListCtrl.h" // Needed for CDownloadListCtrl #include "SourceListCtrl.h" // Needed for CSourceListCtrl #include "amule.h" // Needed for theApp #include "muuli_wdr.h" // Needed for ID_CATEGORIES #include "SearchDlg.h" // Needed for CSearchDlg->UpdateCatChoice() #include "MuleNotebook.h" #include "Preferences.h" #include "Statistics.h" // Needed for theStats #include "SharedFileList.h" // Needed for CSharedFileList #include "GuiEvents.h" // Needed for CoreNotify_* BEGIN_EVENT_TABLE(CTransferWnd, wxPanel) EVT_RIGHT_DOWN(CTransferWnd::OnNMRclickDLtab) EVT_NOTEBOOK_PAGE_CHANGED(ID_CATEGORIES, CTransferWnd::OnCategoryChanged) EVT_SPLITTER_SASH_POS_CHANGING(ID_DOWNLOADSSPLATTER, CTransferWnd::OnSashPositionChanging) EVT_BUTTON(ID_BTNCLRCOMPL, CTransferWnd::OnBtnClearDownloads) EVT_BUTTON(ID_CLIENTTOGGLE, CTransferWnd::OnToggleClientList) EVT_MENU_RANGE(MP_CAT_SET0, MP_CAT_SET0 + 15, CTransferWnd::OnSetDefaultCat) EVT_MENU(MP_CAT_ADD, CTransferWnd::OnAddCategory) EVT_MENU(MP_CAT_EDIT, CTransferWnd::OnEditCategory) EVT_MENU(MP_CAT_REMOVE, CTransferWnd::OnDelCategory) EVT_MENU(MP_PRIOLOW, CTransferWnd::OnSetCatPriority) EVT_MENU(MP_PRIONORMAL, CTransferWnd::OnSetCatPriority) EVT_MENU(MP_PRIOHIGH, CTransferWnd::OnSetCatPriority) EVT_MENU(MP_PRIOAUTO, CTransferWnd::OnSetCatPriority) EVT_MENU(MP_PAUSE, CTransferWnd::OnSetCatStatus) EVT_MENU(MP_STOP, CTransferWnd::OnSetCatStatus) EVT_MENU(MP_CANCEL, CTransferWnd::OnSetCatStatus) EVT_MENU(MP_RESUME, CTransferWnd::OnSetCatStatus) END_EVENT_TABLE() CTransferWnd::CTransferWnd( wxWindow* pParent ) : wxPanel( pParent, -1 ) { wxSizer* content = transferDlg(this, true); content->Show(this, true); downloadlistctrl = CastChild( wxT("downloadList"), CDownloadListCtrl ); clientlistctrl = CastChild( ID_CLIENTLIST, CSourceListCtrl ); m_dlTab = CastChild( ID_CATEGORIES, CMuleNotebook ); // Set disabled image for clear complete button CastChild(ID_BTNCLRCOMPL, wxBitmapButton)->SetBitmapDisabled(amuleDlgImages(34)); // We want to use our own popup m_dlTab->SetPopupHandler( this ); // Set default category theApp->glob_prefs->GetCategory(0)->title = GetCatTitle(thePrefs::GetAllcatFilter()); theApp->glob_prefs->GetCategory(0)->path = thePrefs::GetIncomingDir(); // Show default + userdefined categories for ( uint32 i = 0; i < theApp->glob_prefs->GetCatCount(); i++ ) { m_dlTab->AddPage( new wxPanel(m_dlTab), theApp->glob_prefs->GetCategory(i)->title ); } m_menu = NULL; m_splitter = 0; wxConfigBase *config = wxConfigBase::Get(); // Check if the clientlist is hidden bool show = true; config->Read( wxT("/GUI/TransferWnd/ShowClientList"), &show, true ); clientlistctrl->SetShowing(show); // Load the last used splitter position m_splitter = config->Read( wxT("/GUI/TransferWnd/Splitter"), 463l ); } CTransferWnd::~CTransferWnd() { wxConfigBase *config = wxConfigBase::Get(); if ( !clientlistctrl->GetShowing() ) { // Save the splitter position config->Write( wxT("/GUI/TransferWnd/Splitter"), m_splitter ); // Save the visible status of the list config->Write( wxT("/GUI/TransferWnd/ShowClientList"), false ); } else { wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); // Save the splitter position config->Write( wxT("/GUI/TransferWnd/Splitter"), splitter->GetSashPosition() ); // Save the visible status of the list config->Write( wxT("/GUI/TransferWnd/ShowClientList"), true ); } } void CTransferWnd::AddCategory( Category_Struct* category ) { // Add the initial page m_dlTab->AddPage( new wxPanel(m_dlTab), category->title ); // Update the title UpdateCategory( m_dlTab->GetPageCount() - 1 ); theApp->amuledlg->m_searchwnd->UpdateCatChoice(); } void CTransferWnd::UpdateCategory(int index) { uint32 nrCats = theApp->glob_prefs->GetCatCount(); std::vector files, downloads; bool showCatTabInfos = thePrefs::ShowCatTabInfos(); if (showCatTabInfos) { files.insert(files.begin(), nrCats, 0); downloads.insert(downloads.begin(), nrCats, 0); #ifdef CLIENT_GUI for (CDownQueueRem::const_iterator it = theApp->downloadqueue->begin(); it != theApp->downloadqueue->end(); ++it) { CPartFile *cur_file = it->second; #else std::vector fileList; theApp->downloadqueue->CopyFileList(fileList, true); int size = fileList.size(); for (int i = 0; i < size; ++i ) { CPartFile *cur_file = fileList[i]; #endif bool downloading = cur_file->GetTransferingSrcCount() > 0; int fileCat = cur_file->GetCategory(); if ((index == -1 || fileCat == index) && cur_file->CheckShowItemInGivenCat(fileCat)) { files[fileCat]++; if (downloading) { downloads[fileCat]++; } } if (index == -1 && fileCat > 0 && cur_file->CheckShowItemInGivenCat(0)) { files[0]++; if (downloading) { downloads[0]++; } } } } int start, end; if (index == -1) { start = 0; end = nrCats - 1; } else { start = index; end = index; } for (int i = start; i <= end; i++) { wxString label = theApp->glob_prefs->GetCategory(i)->title; if (showCatTabInfos) { label += CFormat(wxT(" (%u/%u)")) % downloads[i] % files[i]; } m_dlTab->SetPageText(i, label); } } void CTransferWnd::OnSetCatStatus( wxCommandEvent& event ) { if ( event.GetId() == MP_CANCEL ) { if ( wxMessageBox(_("Are you sure you wish to cancel and delete all files in this category?"),_("Confirmation Required"), wxYES_NO|wxCENTRE|wxICON_EXCLAMATION, this) == wxNO) { return; } } CoreNotify_Download_Set_Cat_Status( m_dlTab->GetSelection(), event.GetId() ); } void CTransferWnd::OnSetCatPriority( wxCommandEvent& event ) { int priority = 0; switch ( event.GetId() ) { case MP_PRIOLOW: priority = PR_LOW; break; case MP_PRIONORMAL: priority = PR_NORMAL; break; case MP_PRIOHIGH: priority = PR_HIGH; break; case MP_PRIOAUTO: priority = PR_AUTO; break; default: return; } CoreNotify_Download_Set_Cat_Prio( m_dlTab->GetSelection(), priority ); } void CTransferWnd::OnAddCategory(wxCommandEvent& WXUNUSED(event)) { if (theApp->glob_prefs->GetCatCount() >= 99) { wxMessageBox(_("Only 99 categories are supported."), _("Too many categories!"), wxOK | wxICON_EXCLAMATION); return; } CCatDialog dialog( this, // Allow browse? #ifdef CLIENT_GUI false #else true #endif ); dialog.ShowModal(); } void CTransferWnd::OnDelCategory(wxCommandEvent& WXUNUSED(event)) { RemoveCategory(m_dlTab->GetSelection()); } void CTransferWnd::RemoveCategory(int index) { if ( index > 0 ) { theApp->downloadqueue->ResetCatParts(index); theApp->glob_prefs->RemoveCat(index); RemoveCategoryPage(index); if ( theApp->glob_prefs->GetCatCount() == 1 ) { thePrefs::SetAllcatFilter( acfAll ); } theApp->glob_prefs->SaveCats(); theApp->amuledlg->m_searchwnd->UpdateCatChoice(); } } void CTransferWnd::RemoveCategoryPage(int index) { m_dlTab->RemovePage(index); m_dlTab->SetSelection(0); downloadlistctrl->ChangeCategory(0); } void CTransferWnd::OnEditCategory( wxCommandEvent& WXUNUSED(event) ) { CCatDialog dialog( this, // Allow browse? #ifdef CLIENT_GUI false #else true #endif , m_dlTab->GetSelection()); dialog.ShowModal(); } void CTransferWnd::OnSetDefaultCat( wxCommandEvent& event ) { thePrefs::SetAllcatFilter( static_cast(event.GetId() - MP_CAT_SET0) ); theApp->glob_prefs->GetCategory(0)->title = GetCatTitle( thePrefs::GetAllcatFilter() ); UpdateCategory( 0 ); downloadlistctrl->ChangeCategory( 0 ); theApp->glob_prefs->SaveCats(); downloadlistctrl->SortList(); } void CTransferWnd::OnCategoryChanged(wxNotebookEvent& evt) { // First remove currently showing sources (switching cat will deselect all) CKnownFileVector filesVector; clientlistctrl->ShowSources(filesVector); // Then change cat downloadlistctrl->ChangeCategory(evt.GetSelection()); downloadlistctrl->SortList(); } void CTransferWnd::OnNMRclickDLtab(wxMouseEvent& evt) { // Only handle events from the category-notebook if ( evt.GetEventObject() != (wxObject*)m_dlTab ) return; if ( m_dlTab->GetSelection() == -1 ) { return; } // Avoid opening another menu when it's already open if ( m_menu == NULL ) { m_menu = new wxMenu( _("Category") ); if ( m_dlTab->GetSelection() == 0 ) { wxMenu* catmenu = new wxMenu(); catmenu->Append( MP_CAT_SET0, _("All") ); catmenu->Append( MP_CAT_SET0 + 1, _("All others") ); catmenu->AppendSeparator(); catmenu->Append( MP_CAT_SET0 + 2, _("Incomplete") ); catmenu->Append( MP_CAT_SET0 + 3, _("Completed") ); catmenu->Append( MP_CAT_SET0 + 4, _("Waiting") ); catmenu->Append( MP_CAT_SET0 + 5, _("Downloading") ); catmenu->Append( MP_CAT_SET0 + 6, _("Erroneous") ); catmenu->Append( MP_CAT_SET0 + 7, _("Paused") ); catmenu->Append( MP_CAT_SET0 + 8, _("Stopped") ); catmenu->Append( MP_CAT_SET0 + 15, _("Active") ); catmenu->AppendSeparator(); catmenu->Append( MP_CAT_SET0 + 9, _("Video") ); catmenu->Append( MP_CAT_SET0 + 10, _("Audio") ); catmenu->Append( MP_CAT_SET0 + 11, _("Archive") ); catmenu->Append( MP_CAT_SET0 + 12, _("CD-Images") ); catmenu->Append( MP_CAT_SET0 + 13, _("Pictures") ); catmenu->Append( MP_CAT_SET0 + 14, _("Text") ); m_menu->Append(0, _("Select view filter"), catmenu); } m_menu->Append( MP_CAT_ADD, _("Add category") ); if ( m_dlTab->GetSelection() ) { m_menu->Append(MP_CAT_EDIT,_("Edit category")); m_menu->Append(MP_CAT_REMOVE, _("Remove category")); } m_menu->AppendSeparator(); m_menu->Append( MP_CANCEL, _("Cancel")); m_menu->Append( MP_STOP, _("&Stop")); m_menu->Append( MP_PAUSE, _("&Pause")); m_menu->Append( MP_RESUME, _("&Resume")); PopupMenu(m_menu, evt.GetPosition()); delete m_menu; m_menu = NULL; } } void CTransferWnd::OnBtnClearDownloads( wxCommandEvent& WXUNUSED(evt) ) { downloadlistctrl->Freeze(); downloadlistctrl->ClearCompleted(); downloadlistctrl->Thaw(); } void CTransferWnd::Prepare() { wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); int height = splitter->GetSize().GetHeight(); int header_height = s_clientlistHeader->GetSize().GetHeight(); if ( m_splitter ) { // Some sanity checking if ( m_splitter < s_splitterMin ) { m_splitter = s_splitterMin; } else if ( m_splitter > height - header_height * 2 ) { m_splitter = height - header_height * 2; } splitter->SetSashPosition( m_splitter ); m_splitter = 0; } if ( !clientlistctrl->GetShowing() ) { // use a toggle event to close it (calculate size, change button) clientlistctrl->SetShowing( true ); // so it will be toggled to false wxCommandEvent evt1; OnToggleClientList( evt1 ); } } void CTransferWnd::OnToggleClientList(wxCommandEvent& WXUNUSED(evt)) { wxSplitterWindow* splitter = CastChild( wxT("splitterWnd"), wxSplitterWindow ); wxBitmapButton* button = CastChild( ID_CLIENTTOGGLE, wxBitmapButton ); if ( !clientlistctrl->GetShowing() ) { splitter->SetSashPosition( m_splitter ); m_splitter = 0; clientlistctrl->SetShowing( true ); button->SetBitmapLabel( amuleDlgImages( 10 ) ); button->SetBitmapFocus( amuleDlgImages( 10 ) ); button->SetBitmapSelected( amuleDlgImages( 10 ) ); button->SetBitmapHover( amuleDlgImages( 10 ) ); } else { clientlistctrl->SetShowing( false ); m_splitter = splitter->GetSashPosition(); // Add the height of the listctrl to the top-window int height = clientlistctrl->GetSize().GetHeight() + splitter->GetWindow1()->GetSize().GetHeight(); splitter->SetSashPosition( height ); button->SetBitmapLabel( amuleDlgImages( 11 ) ); button->SetBitmapFocus( amuleDlgImages( 11 ) ); button->SetBitmapSelected( amuleDlgImages( 11 ) ); button->SetBitmapHover( amuleDlgImages( 11 ) ); } } void CTransferWnd::OnSashPositionChanging(wxSplitterEvent& evt) { if ( evt.GetSashPosition() < s_splitterMin ) { evt.SetSashPosition( s_splitterMin ); } else { wxSplitterWindow* splitter = wxStaticCast( evt.GetEventObject(), wxSplitterWindow); wxCHECK_RET(splitter, wxT("ERROR: NULL splitter in CTransferWnd::OnSashPositionChanging")); int height = splitter->GetSize().GetHeight(); int header_height = s_clientlistHeader->GetSize().GetHeight(); int mousey = wxGetMousePosition().y - splitter->GetScreenRect().GetTop(); if ( !clientlistctrl->GetShowing() ) { // lower window hidden if ( height - mousey < header_height * 2 ) { // no moving down if already hidden evt.Veto(); } else { // show it m_splitter = mousey; // prevent jumping if it was minimized and is then shown by dragging the sash wxCommandEvent event; OnToggleClientList( event ); } } else { // lower window showing if ( height - mousey < header_height * 2 ) { // hide it wxCommandEvent event; OnToggleClientList( event ); } else { // normal resize // If several events queue up, setting the sash to the current mouse position // will speed up things and make sash moving more smoothly. evt.SetSashPosition( mousey ); } } } } // File_checked_for_headers aMule-2.3.1/src/skins/0000755000175000017470000000000011657306262013412 5ustar topiusersaMule-2.3.1/src/skins/kde4.zip0000644000175000017470000014140210676261004014761 0ustar topiusersPK 6zǎ  Toolbar_Transfers.pngUT [ZFFUxPNG  IHDR szzbKGD pHYsvv}ՂtIMET7IDATXýk]Us;3vZvi0AL4AB0j$bR@ZIM%BB,Ri>(鴝>go?PvDq%ge9{B)ձi6lJ-˯~Լ [W ?4n\0f]9oG-X6+-XqlCG΅s0->)aOmտ:̗R1~z>'8q>PYyNlU 6&q2_v ]G)q=ɚDZ7zvo* 9-3:GL0]Oމ<^v/V~~㪿ͿzVɲL')^Rs=jT))*J9;[=#j*P!Ǒ4rg9{SSm,?sxnݍK79MH/=Ҷ3Q 82<'>F'&uAńqLMPYJgGCX,mW5#&7^si٤02AGqJ&,jk"bvxZaؖ~)k|?" #iٶGD^<{zθX.| Ja^D "GjT݈ LqL1mT/bt{o+T {wq?1Mz};|R z}[w(\A"t8Mp9?TpY%s)K1 (A!zGz+ٶ8N „0PGT݈sX$XIc}s?DZ-<Ŭ諏#3ο\X򮺼 q~p1IT #cY$NR$~U=o F8AˋgE?bWa{ h©7]G44}IPJCy(I^S0|߆lpXIu ;rR.8,s~LHЄnG_xrˌsG$>}M^5࠻HI,*9 J%nDosog[}t}K~;;t%';卫Sʤ_~oʢIdIENDB`PK 17&.Toolbar_Stats.pngUT  FFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATX;lY5cόvdĊ(!Y.Z$PPQ@E (JCAKR$,^؈M'3x<3}V[p}ܫ{/%"|E[*J)CH}>H"r`K@e@?OEī၇qjjjAZkn""JJ)GPEtՅ7m`O:2ըOӁ 0UjZ_, X__G)sR1 sbd! /^鰲"-r6(k;4P9B:YU3sΒec>#kɲ D[nݻwZ uAJ0L(P#ӿ$NbN~#9s'NR "j5\ݑf"ӧ5̞v4o6:!ʙ%}JX@F8aQ >)%VVV`;vlg |}<`V4 % YɲY'_9aާ\TKt>$&BC"UTO$0|FFDXZZbiipȨ1.{;EG2TPD#^YEVh Z?e )%zѣMvwNsLn;B# ]!Dg=W?gn`~mmo""ܾ}EQE H#!zmS4ꦦɓܹsz>5j'ɓ2̗FcSE礟/ԓE@ I^0==2#e'ԖBo{56d'^pgvޟ"v_>e+FHB$RGr0A Û_6#'Qk:SKbnΓ+Wc_rJW\^H}f85a,C<i$@(!ms,z@l=#A!yIJ}|n>TTv~ZjrѨEo^\/#9'K))20VK :֨;YsfyMLqj]p 2ZmÁj1"pL!t'A~oc1Q'_ ~3Ձ?3.XyG9 AbrzD4:O4R id&9Qe7HcEMT gT%~QMtbG)@ "*/Gl"S |DgZMdE漏B yVaYUϿp>lX:12cr`UoNgՃDn1D1,NgՃ[]QcO()/(\/SM6k /YM菀7wo ; IENDB`PK z6T8, Toolbar_Search.pngUT ZFFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATXYl\g9g<3gfNf,TH%44 BE@ JT)j@T"pђfQ N"UԨApSCܤuM/qijv=sl\ԱL E(/^?#ϧY⧚~8RطwʕOo.9}ϭ[SرښZiэY͛wdgϭݻ% ŧOQQPhoo'zHg||]v}f'GqKK|Ni{^`ӡTT$=4;5\\4aTW_hk;uAWH$z.<13T&=]$}tw%+|yWYV>ZT-Y(X  u,+ $$Ibz^ICݛHګ;rx#}}};Gkk+""edXd2֤%qή\c&ye裏Nנ:~ou4t^xQ ImAE j5|iHϟu ,sR5x,Nee%Tuka#RY__?0|/\4eaQLddd]0.W'j4_u ϣ( 7|x!tw>#=s}e۶q\'͒N9|6#jxʕ#2@q,ёy"@0xe@Ez4 V؎$JHI #8_oDגd-ؠ(yO YɳIյV/7owVPl ϧ ћg ͆^ȟtՙQ]='{LsbIENDB`PKz6Toolbar_Prefs.pngUT ZFFUx5uPKBnINAZXiC/!-HRK)!"R<|3̽Q%ħŇ@ jJ/& 6Pۀm3B<75cOD LoåMCnr 2u%y},_}=W^%*BUC >q0o4-xUP`L`u+ BcqG*< wBou+apF , 'üd/dgK +kK9v >7;5jwQmh{Il_݌^9)1o3%=]Md6ŞA8 zH xy>F8I?'ҀuǠC+KЮ̑y*¥n}E1fAj4n:B swc@AfEDq"F>][Om3dmMn.6Ɯ$P > F.QIg0p$W,^ߓ}hO:;GIBꆚlPc>|"x[,hjXa0-޺~h9dRb7VKq0w3X <>tf"s?Yez$rKӕ`w24U͹SO)A)ĵbSX4$ЖAeeɐ- ?YҴc tUOvìL(z|Ue0['j\fks-K'vMD͕*rb{(% mƊ~N?[VҳW6=go&)j7;C~VAuCۉé&"(Ȳ3f'!4TzK3);NJ?WuvyUqyzs'(ܟNB<6V/+qAM,Q8qw1uύ BĞG&\8ȃsFؘ 2?/sv;rPBuV$Cq%1"2:Ѿ| vlwo/,(0%t=Wm Ӟcel' 0}؍Ge+{wb{fUqnlwƧo"rN'J{c^^o 8f䳤cjrۂ^D+ .0R`%~ddgh_ۿGRJX}owہ>f^118 jÏ6j}"ZQz챲M }dWup0R Ŕp h2`{!E8 1V3}'I`f3n:()Q\gw]-XCRapVt*+jm)ݓU>"o:XXs*ɂvɊ2>OH!aN Ҥ8}H i/mw&vW/~ ,0Rp rOǒrNe.44S )ϮJ _K_q70׺W*%%2$B\7t7G\]BΌ|kg^(dLIz =r4Ox . *ʮh}Ȕžz|\÷h ~C6a,jjD后X+da0"|om -*w{>cHj s@^kPU>qr@Z:V;Kb~ϴ$(u.@;tZR/j\{+ir Bmve_rЙߖ4,EYR)%n>r`w'rc!AAM3wObX}%mO=cUD0J pJ"+n$bZWpsyɼ[ۆk^ͧKCgDPfd;CH"8Q=Sv4zؖ+˝`{w)$Q4$xٳGx8Ͻ3hqJ襅~kO&~'Do2> ZDBWsϸ_ /; 5(x[?"q`6k=xoܿ Vy\p&DZӚ( e{Fh͂ P'(Fʴw&="~0t<:Ȅ;{ް^;D%G6.]ZdukY]7}ᕊb e LGq 93cntڰiktI B^"Y+I̵AhdNa5eY,2c/oM5׊y.{gFpY[OE^5Wz{$ P]n:/RC|ꤐyWa :寔&yUH@;( S }8m4vqȖBL̠eҴGԸ-_MЂ}TKT`*.l$b3dZn N~ܖ%6o+R Jw)->@'C5LLIt^v̨ZQLǾ2l?%!0f.#[M*ޮN=8M-W^`^4>={~~ XK2ᚈޮuq\I{_ ʎӴ͑5g.r"bZg;tzf -W .wu,KL(F(a'Ϻ|8f#iA"L7d:`-`gO~65ob+XQ[$q3#+hP8.C3⻉Cm[n'#D81wTE,/AIp#k&6zrŻͽy/Ddpx-rٍeyh)lk? |Z91ʐ+Ɖ7=خj,SdbwRa+B$$܏Rts- ޢ8;`f LF#?̎@qa) H<«RS dOöj++}6__(!*@&Za9q,<.Z'vQlgsw/ɫ4sx[Izܒ'e9DھYւVIMpK:"I3\7hV\ ,'L Z `?pӑaBKwx bUSrܟ+ŦXJ ȡ-:ᗷx;lUBwޞ+h1L22oQp, b\:5( >!QvBŭ󥲍{Gd \SkGW%sC%s&\ ]K.qY\f8ΑϦl ~m7~ "ޘpT?PK 27 ;O O Toolbar_Network.pngUT FFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org< IDATX[U]93sf\=oc8ސZJ.RPMUT%@"JPMN3sf̹|]cksg=/m ~G y,j4݈8~sK]=O| u1OzG+Z tC‘Њb6vwV3f֋<3'zhGl; F)~J$iá@Όۂz}n֗?ɣط4 Bo]!t;.&,-Fpy|k\{+oկ<0ÿ_[?ɱfk@PR24A3L/N16?I{yv)Z̒Yx4+طFo6 3[G AhO)Ruqo\/t3/_8yrődΐc'JRA*({E 3t`”B;=n񱀃g?;pql7vaѬmF>2G.g(!qxb5*c!nrgm$qF3;7[aŮ%xl}:c+KDίaRr٣'BYb~ZD&Tx@SLSIbG0V|IX,ON#dOQZҏ3޺ӒnbIMjuczÂ:yhD` pB>Inz()%I-NJanhrVJR'5N+0AGHB秉7<_5]6}HAk>^GX^I,%78(Bx k1_,pJc{[1V+h]賹Giɍ=q^;;]Qxae#H BzF{ %hAcǿ^á*1LL$R\Рq8)Y vx%HRg$2R!ݍ|Ғkݘ9*cՉB0i3i 3r!irV8_h 8Tj @BT3") /0ZThWenB!۽VZ7zotfgK(Bz5ynѢ@kC=B2_ޖZ7-PJ`# ĹO V .O#|Mi{hQh-P1Vx:&;k zV޻7nw8V Yǭ3ՐFʷocDydz2$,Oz5x]T,O҉7yF9b4Rk;Dn=K 3Sݔ>}ΝkV[m4`ڲoLI )i v}PģO*I( Gf+h-JG@+T+ ZXliKn N=zTJLVpa@8YƯv'O:BDGr5p9e{rVFB'NݫkqYs/1pǾuJ)Y3U/%U9Ea # (uz ;ϯ_7}U.޹Yq^=8qv9Q4d Zx\āͳAU/32vA*19} Eqˤm36؂M,FQ_yfӽ(f>j3rk`fIfê͓sV !s7PԑFMظ?Rr=~ IJfPm|hkẸ] y<صWN=¹o\KGIENDB`PK 7ΘToolbar_Messages.pngUT cOFFUxPNG  IHDR szzbKGD pHYs  tIME. q%IDATXWMH+W>f6jQ)iPPE .K㢏 -d6ۺۂtyBeGFF$OocLf‰̋LBÝ{&;;f){!DS2 ˲^1MөںR: @Q4 ft tzk@n@:AMA b @EQ#TzNpcRZ p·666]zmYB0Z 0B5d $%h066V+CP+S^E!a9 -MMMP.&-s>,˪ȭ~nM%w'*"zio$ZgX#MAī~ (`Yhc 8`477i ai~nِteYo)B4M?O 8Y#V/B7n%clskkk(|P(|1??Zn67/\EQuGTYmAANNNpee叉~?55JbVUEBOuj^U'CCCw !d/)@Dyܖ,KB,]B$ =H@JipKK˕XMӄr kzzz*ŢsPg `W)%LBAlnn\.p6MRhooOù.)d2ggg*ts cB?_[[:ɬˁv( !%b=88 LZ RN6;;I$ lV*"Ӫ]K2D"or?<<3C2>%II9іP+ S7%}kRF1Mu}o7z8ַ( 30oC3MOO8Kmc-6GSfԄ<҇XĴӑ^4t$%ڲݒO{cu#‰uO[2GN/bDB$auB&9izs1N] QÐhjBA|e]KZpm3FHBB IHv| "$IYY477d/al R,"XSHkc-'m\k@!JΡ_=]E$k 1fD&JCD@ HtAZZV5x7q 1[v6q9Kqp8t76dPdtN{n=;'#LhrS1>O',:P&Fƌř_cMUe 6SN޼y]u)}-j%.6K]-Q"pS# 7#78]Rί'nv ]$)}.@M`vW*.C\n"D.C%9OkJ]}p(Y+C/'`:j'rm97E$@$8Z^1I#WC2K&dܲ+j+JcU̟O(F{#Є!|>R} ΂/Y 5CzPbql㓒2-SYZ/2əHo?W|uHKKf̙=FN m1yl^=/&]'X5jg/T?rˁ駞F:xAvCnn6P;s,YL:21D:1 cF~9ذ!Uu$?- cmJDz]+1H_'3#w}:U5U[-:VooB4zmR))9˛oGg+oaífSxJg݆fp0 .^(rQG:(7x^~[I_{ⷧ?7;c8^Xcڼ/A\{a֜)"kLZǎضݥ10Љrziő:MӰ,놇2e\(-% D(NL.2,zyڀ%IR"#e(-fQ3f|1%%eyWBheee?1pݥn;{n@.0XLMIENDB`PK z6iT'Toolbar_Disconnect.pngUT ZFFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATXohuǿWb$MB21{#petN d)PPal2+2HvXkRRڦ)wI.mޟ_Xh@vy{!"̫ꦺp ڣ/*coPc˽\ǽ͗5JbW]]-ƭ ?k/{.>_Q"XG*6~;FgCtMӇn4WEwtth"Sρ_^ԹG_w=P.f=BtttSiR6%۶i/)KtUubƙ:*⛧ I-48 1KcڟYMM?S{aH300 JdYi%0ҥK}v՟H@oC5D"Ohnn8]rTU%˲HeiE>"bhOua$\pAR,ILbQ>'4I$|>O=;N7?}\rSSS3~\. x( dY(`Y. ,c~~P4wG+nBۺu^/Am "$ Aض A@DA S]xm A<EQa6$lF]]q~xeWD"AA$x^T*MӐd!$QPXh 0N9Σ{Y,Aggg_.;`w]9P pJŖ6]5Kd\*"2EӪbrKN璓+\5(Pbɹ`g}G ^(BIENDB`PK z62>>Toolbar_Connecting.pngUT ZFFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATX͗rGlX!ɕW9rYO!ZJWCؖ|pĉ0 JH?A;z%Iꚕv4{fzZ\g3תq{"kic:(:"qԳD jȼ"//,aL]zoEi& k0ĸYNÐ>D"vQL͌u0~oU2v]7Dw"՗{eO7'[(2/"6p$3kDϞ']N%P%I/ߋ؇D= D繳ҳZ^BĠb}%ܱN: $aƞȦ'2kAjnD U*ܭs|^2Z*1(6ڑr풼yCpvInr`z^0.R_1W]AQD Q1t9zz n:z ݈'QeQY[evuUZǸac`z k-QXquI<d 1h$ sQEb)n1GCjyEXkA0j9-HD.Dlxp|[k37EkU[ Nqwfj܊@y k>3BLjN\<;ZTZK}lY&C8z#>qr^EY:6 E,D9n۔.췠B>+8&ՄN H!SJ@E|%?&UM"=.[ղ6gu}f7L"z&IENDB`PK z6^Y>Toolbar_Connect.pngUT ZFFUxPNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATXWl~_bc %!;4`E#DL4UYُ0TDɲ4QBɤ"2Xƴ #MF ,$Q19l߷?xn e~ҫtoW__Zaa!PVVׯctt<Y!4 !0LEPim:7:znҥKYJ)f3߿;vQMH$`Zh055EQŠR199I^#''ts{7n^YY h4y<Y122D"3gPՊ˗ݎ`0P(D^䏄>}PLF5MMMo_r(NA)dFAVV$IDQDWWj0$//m+8ZNLjfVNSE)ENN$IÇ!!lBD":S1PSSC$e9{RU: lAvߏ"pEQ( Cd[7…8CCC[irN8l׆+F^uA@<f$IEpj6 |MC!^>@`D-E~}iKt;Xp~d\. FFlvsjV*Ѳf'_4Q$]J{D$t:IYY, (yxƻ8>EP ěPI[EX,FN'\.L&LNNđg2Y0(W9A!0YDRQǃ eY,^P.++#2{-ƅq`ݦO_0 7ϟ?4KJJ˲LLL:4S ]i3D?"O9M֭{RzRjxlIDATX՗Ml\Wß6`ŵj*,X ME."Q.XEYeâdF"TAB)QI*glϛawDZuÑwϽ=#]'{Ű]jfc_*g9i:"מ$Qݻw6NRDfH">Q#3ka_'u0;wdxxJ___Osu( j"5 #oSJ Jsn+ fV!"$`U%%z"C A a&[WDwJx BA-KlxRIz´ APy^ͭऌbAW@q !R[()!~ HTb9x/gi$PDJyⷊ-JI{A؍ձXq YCd(l#A<7w6VU[\\)LUA웤JP-<]ēesxM~Co #\G/{ZˡL: u( 6Pkԣ6 ˏ6488xBDj*GtؑЯ 7-MWQMLb~83<q.6D2Tﳽ%T>F4}'xs>+ zPau<;~fJr8˽yڵն"K\bg'R?|&͎FUGsێIcӧO[__y +NU7fggeak6/^|d2MNNƍw2??V]\vAƝ6J%qez{]n?Av`yy٩z<[>H666aT v5撆OH>+Z1[kN/]>wwErğOJUV{kҘTvwCۣpۡ&=;r{D'}IENDB`PK C$7%NToolbar_About.pngUT >FFUxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXkl33;ݵ_;'qpUB@^@A8"&HrATibD+h(" **=] vv zw>?D!^4#̬'$g.(hښg91k鍷-QU%֤\6틏UkW֤hm wD|N~ed~JK7UIzmwG昺}KkPܝ^%3|w]f)-*(xĀ";U"Go2 B%4ŭkDR3*@5˗imOg]^8~#Ş*a?)}11z_uYmMW"Eۉ 8qA]m .(,f=Hl#zLr331>fHO{϶%KغR}榼@R8?X2HieZQ]drblH zyTcqU6LzRt&J~6KhkRk~dIua8L0и~T>_ ΡvJJ <).k#bw3`wp%=1Boo۷ 2hBSW7o/"J 96ѓt0'yڵ={IXns4)[IŢ8.@QBs֮[-TE!Lø)r"9qw1L۶=Ջi rԱa `7\ի03xއs=H4um$[aG/@ !ccO<5==M$'m[u϶,aC ̈́G-B.5@މcә6G3RJf@(MB*B1W?G 82fYj3;,c%k~@dV a7R_,PnIENDB`PK {u2744Client_xMule.pngUT  FFUxPNG  IHDRabKGD pHYs  tIME  +6?IDAT8˕O1#)"4IɎ,,$kY쬕Oc|>B,DfR,Qcg{{9iKQ QOEW rrDQ:nf3>>|0 : 4v Cf@D"ARa20X_AA20 6 s8KgXeX,TUͦ[3i(TU+bZ Z-lf>^3`0H,t:aJH$B8hdǨ꼛xb1r``@&mǡ"IR(zZ\.I2P(fu{ T*ohYe1;(bkX*H~vx<$IXx4M ? P(D(~cWS7 IENDB`PK Hi7@~[[Client_Upload.pngUT _FFUxPNG  IHDRabKGD pHYsvv}ՂtIME '6mIDAT8˕MhߙMv7JM lYckPГVւDz+zU C{"RXQZb6j61N3tgvfvv%gޛ9!R@ӏMWfӇW2ӕ-Mg":S]^Ⱦnu -7{޵ag^<8@֔vU#tZKM6n3˿ܨDU6k)C')wd]yF{HJuf]woT;gyz1ei|񱜤dMbF1m%n%DRSw3wٛ롳8ZGWeLLvpeLIitdz#,dDhYDSe􄂒):]b0_L*1Nj,~(E #݇it]sNױnBENuN,ӑdf*mۄa 4TTUtGq!ajB`L&Q0 ,jI2.͌&yLrC&/^OtܠBm2nl,Uh'GGE<$] EQ}2B<%Tq=;%2# s "!"TTY\C%"XvTC5NYmt(b9.z HY!8ֱ.be‹@ɷ,ftm"˴:P"a[6N%- ejӼW}cC6L*6#uU@g9ۜr_?`N;l\Cilֹg3(i0R|ƯJ'zF*-_m(KuvKuVHЇ8.]!߿_SF=_5.[=7"SzhQ];Yevi>}o\8(nIENDB`PK i7ɽ!jjClient_StatusUnknown.pngUT \&FFUxPNG  IHDRabKGD pHYs  tIME (KnSIDAT8mKry?~;UaV̻hk#-ZDj1l…BZE"2)a^kb*zlys80MD/8~-c`0~@$oOLLhpX P((JV&i 0w?~?f]#L6///>aa&Zxou4M]Vh4UϏL&]rLOOvn0 lEQh4<==( uEAUU2B1.Ȳ$I(,|>,t:DUUP˲ǟ !eYQN'ݡiBTUO(E^7 \.777r9 iB 422"^Hs޲$IAϭclGGG|(h8N<~6% èZT*\]]3xX,F2l5 0*H9 }Z[[ӊ"J4Mv 'J||6 4M}ffFt\__S.vڰ,[3}Β$[$tkSRYIENDB`PK F6E//Client_Shareaza.pngUT gw4F(sAsYUl6S;,4_3]!͜p$ۺ?X@WkmpU7({:o|vn2̹لON$9hґ]A2&4H wiu,uE\͂29}r޽}҄2_CZ\+e-ןYC{×O*/zΗЗ ~.PK \7V|Client_PoorRatingOnFile.pngUT MFFUxPNG  IHDRabKGD pHYs  tIME7R7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orgln_IDAT8u_h[UƿsҕvMnЖaqYQt'Kɞ0[@(L|`*(ZdCMjј)k4I&s|d8#ӧp|c}!A x![91 Ц(/DH49G6/B}>o`'c!!JI1џli0 L&#fsR0!k!ĉo(=3J4/b Z7Ё@[$a~a~՟< 'D4MD#B0M  ;ٺCUU"H pOW7B@H UUoQKK+"VbM0{9LRyG3 ø[`s+%ؼ 4P(`s"K1LD8F>9m92B/.{m$骖tqJb՚[TQn@xVWVmﵛ{rGr&TMm} DR{[K?Iv!wFX)&Lzē[ BЫ(imBѮvC[Me{QJtZ Y>óA^PQq3jjΤQJQQ|>K6388R ÁBR `Uk:pr lf^<WNQTRB  \q)3?G)mضѣǘ cYJ P,tNy;/I|颿^oMӏְ2$64Ief__/ U?֚'Ǘ(hqA:R/#_~[;bf޷V ih*lL|鏁%`1(k@cnjEIENDB`PK 6lClient_mlDonkey.pngUT [?8 az`|r},#)qM9w[ҕ|[!tQt U s@%[կȵ[[,h5 (j5+'" :&}WǾB#Nyܞ,+P)4I87).֕/t/c@RFE)JIATjwN-tzKj%n?|(-F<)NOScFcĚ##d2~`ZE^7qijjo\w<ZCfRRĻR{'R#f&h~4(_tyu?|vLhQIENDB`PK 7wClient_InvalidRatingOnFile.pngUT SFFUxPNG  IHDRabKGD pHYs  tIME&k7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˕]HgOZ5m4FcVLcjfqkxW.CA/Pl a"ku"amltj)eMV-tή.DA9Ϲx#؇!z4MXJHbF)f,ֲK{bߢ\&^|B*)X}|7 b-jGH4MQJ*=SDak_wVVQ%zgz*t"z왳绺B ') p<~0 <LRƆ뱕QzOt:N'B)S @]p8RLo_MDo^kxDXDqq/_z$Ϯ^pW+H9܆4m=UvJ׮㬭cbvS2ɣ?0 OR^4Aoihk#މ 0a09Ƀ~l/gr<2;}>\#T[D|TUUQYYK 0շtZ2zOk[|Fvvc=p R^\h0H'O>XK{*qI3kap:p0vNM{*|5oB {;:L͛o؍غ:_[Mb ;ԴD,&Ʊ݅vvg.YZb|6j6Ixs=C_90ӧq\TC1عsG*F];Y>O&fyeo1C ?$ ~`B1t>IENDB`PK "7&ʏClient_GoodRatingOnFile.pngUT _FFUxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ukSAgX[6MG`)JtԅA|mJ;W;qhU\hT &m&޹DžKb}|g~3,l62z >F`AM`m@!} y`-L.wX;j|CjIUmu7p蜗ӲtiZ ja%-ZPۡ2S;7?C"˶Cd ߡl! j l6mL}_ր o 'HJ"9ni`a8H "uPailCJ_E(%*jK`` L@P"Fx-FmHvkDXOwֹ?\~߻l(ٞ4rV <]]ݬ^f~XoL_ϝG'}Ctvv195E%38LNNњL}T*RHau?-I|kinj<<ץmmxGqHtq,l9] Dk{ bjsq=WHR9P&,q7 thddrD\q cSRVO=zDv *"ZsWFDvZ{}@4XIENDB`PK 7>Client_Friend.pngUT hSFFUxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KHQofKA a%=ADb(Z&Z-(&*͖-M$ l!e=373{Z[kӁg913'EnK^H,bP)^ fAGIֵɲrܔc&q2xċ fb0 (c9hׇ"|f~bfIF]R30f Q: 6?Zb%`,Io3ӫ+t 1Z]lAB;OW!"J CnQ5e/d/?"L{`efñJ1x^Qw[2щW#ӑj HYm5`~UXnWWͯظ!^~y3p2 a39bI1 Ruӎp7z_,z]q( D>S;Iْ-'}1GfoAߒ"ڏS.o< 4 NJ*HyIENDB`PK 7=!Client_FairRatingOnFile.pngUT FFUxPNG  IHDRabKGD pHYs  tIME27tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8}oTU?s[B2P#Tڊ%E ( ĸTcろ #RS%qR@i 1suj'?@)R(hhh@kMEw;c= myѱos#.l;wV_|#5QxR)oOfڟz _}y)cX,B Zk0$͹ }ٹWSo~ss_<=c{RVHSSSi5/4&+˽/+y0q]wo{[;MM  ""BJ:׏֚[ٳg @R>V8!Bj++`&CSs3NgLquQ<m JJg~~S'\bqqw`M&h|:6:7o^gIfJSO&N3==E8?\ -G\\/fWo#KkDfN) $rWJy^7=TbB}OR@]A0 ]={R !B|G)ET*W3H)?TRJffqF::QASzܗHW/[!ąoqūP*-;QR6P.c!Ą2?byK k8%8F1ayK,\FqߋE>qf;ɥIENDB`PK7SJNClient_ExtendedProtocol.pngUT 7FFUx sb``p  $?ORlI. Ap品" 0kPו:0Y@!׈ԼĒ̒ TwO߀)y@<]C,N Ѻx[Xil7P[sZݳN[,\B9x=Zv&WE^SprqC IXZNel.Wv_Lgώ:T[b?)3G’ܬ3}iZQP2/3*tΪšugtsYPK j7,.k Client_ExcellentRatingOnFile.pngUT :FFUxPNG  IHDRabKGD pHYs  tIMEoiw>7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˵KQΫXFi4dDB)M… Ek"WAh,"veC:O j偳992Pvs6,Dp$4F\uh2Qŏt>Wù՟%kaeCimM*к~$~HcuK> Zcl}NgJ* ̎^T qTCu:I\'*1B m&󟑦qObUvgc8DuP?BaD(Y?Q,bldIP"%eTqpcoy1?Tah~Dcf0{!? X/U;e.,庭Mɫ(?>XXFcK8IS'RVxݳ.(ٹM@KԳY9Qw53L@ٮ=_ulIENDB`PK47Client_Encrypted.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו: ס.lkDs~nnj^ sQjbIjByfIBHFoEꗱ]xHኩd*mqIAs_ғ?1xsJhPK 7PJJClient_eMule.pngUT FFUxPNG  IHDRasBIT|dIDAT8OHq?k[lZl0b9(rDh/S3; jy6ST!,ae1'ww`)W>~ QYT_{#m.;\&B:/32}[\`hn0A eJ:/o 7 LvIENDB`PK "~7.**Client_eDonkeyHybrid.pngUT &FFUxPNG  IHDRabKGD pHYs  tIME 1xWqIDAT8mj@:iHQHqU{=*-l3)lP| |ىXwn "fs~ӥ($iy$@b3jm)2f#sȮ(,(qd!hv"}ճHsn8s8o9ކ^ ,}YmCӴKXT96;KN..v6u]cB xy WQe3?YEfv/"?,V _̏Ct \tL#D4MQՋy $a44MUUfiq8Dm8Lv8H3O۶Sӕ1xoNONOemjEtPIENDB`PKK476\^Client_CreditsYellow.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו:hlkDs~nnj^ sQjbIjByfIBHFo>Client_CommentOnly.pngUT FFUxPNG  IHDRabKGD pHYs  tIME 7);RHIDAT8˥MhA3ݣH"-)X+xEж'< "~1[M\bӍLlZx0Cmj+ ofރ a]VzxG/fw؎XM9WOJݬ;-T@YXݓ zV_LKNJ7qĉ?}MeM}'O2t3@zz}KAI{|-Mu=۶m;R>n&X^Q@dct| UsEΟ0 M ҽ \y7}7FdY~C;>Yz=iv4nK!?y%;nL&q]7\OPV<G;+H%H`YeExA,CkMVCk5Bl:ud})0oZy IENDB`PK &7rGGClient_BadGuy.pngUT ]FFUxPNG  IHDRabKGD pHYs  ~tIME #/5IDAT8ҿkq.hmBAK$v - u0*!-"8Uu%Al*RJϋ5rwsr |և U0+fj=Ϝb0MS/wT45 M^Xx)z|njk#'J KO>oSӄuRel_ ~tPpLBOAj8P3s|xu(_ur\{{i۸+%C+ա#ht -4MCp]!2_ ŰB H)R j4< JkuiYHAJOiG"ɅE>تQUEPFFlm$fJ ђI4,[v/@  ߪnNZ+>KZaIENDB`PK L$7@Client_aMule.pngUT OFFUxPNG  IHDRabKGD pHYs B(xtIMEP<IDAT8˅KHTawd*Vd> hу "EQA j2*EQp" zYB-1\959BkM¨LCޏ|]??CJ4OjϬvMЮ"{)-!.?~{| $֔(-3nƜP!A)DUG+`7 _ ;$2ݘ4)'YgF'GE٪jxe9pz{Hz+dy2Qtq ] `Z U->h*z/K(K*Hk׃~`ЂkqQ@Yb$kPoPjYE9O]^E!`EKo8(ZD41rEǴ13z]in#;=?(bFo 9mp|w#8֞oYJڷ׀x;9fic i % WW(Mqh!,-jHB4KXk_ZI !:Tsón&L:5nl66~i/wUIENDB`PK 6zǎ   Toolbar_Transfers.pngUT[ZFUxPK 17&. a Toolbar_Stats.pngUT FUxPK z6 .Toolbar_Shared.pngUTZFUxPK z6T8,  yToolbar_Search.pngUTZFUxPKz6 Toolbar_Prefs.pngUTZFUxPK 27 ;O O  -Toolbar_Network.pngUTFUxPK 7Θ 8Toolbar_Messages.pngUTcOFUxPK ش$7g& c=Toolbar_Import.pngUTXFUxPK z6iT' uEToolbar_Disconnect.pngUTZFUxPK z62>> JToolbar_Connecting.pngUTZFUxPK z6^Y> \OToolbar_Connect.pngUTZFUxPK ˩&7Xdd 4XToolbar_Blink.pngUTQFUxPK C$7%N ^Toolbar_About.pngUT>FUxPK {u2744 4gClient_xMule.pngUT FUxPK Hi7@~[[ iClient_Upload.pngUT_FUxPK 77[{TT JmClient_Unknown.pngUTzFUxPK h7TSI`` pClient_Transfer.pngUT^FUxPK i7ɽ!jj tClient_StatusUnknown.pngUT\&FUxPK F6E// >xClient_Shareaza.pngUT >Client_Friend.pngUThSFUxPK 7=! Client_FairRatingOnFile.pngUTFUxPK7SJN Client_ExtendedProtocol.pngUT7FUxPK j7,.k KClient_ExcellentRatingOnFile.pngUT:FUxPK47 HClient_Encrypted.pngUTFUxPK 7PJJ bClient_eMule.pngUTFUxPK "~7.** Client_eDonkeyHybrid.pngUT&FUxPKK476\^ dClient_CreditsYellow.pngUTFUxPK+47c_or Client_CreditsGrey.pngUTFUxPK {7W èClient_Connecting.pngUT!FUxPK # 7D5>> ȫClient_CommentOnly.pngUTFUxPK &7rGG OClient_BadGuy.pngUT]FUxPK L$7@ ڰClient_aMule.pngUTOFUxPK J4v% Client_A4AFNoNeededPartsQueueFull.pngUTCUxPK((} oaMule-2.3.1/src/skins/Makefile.am0000644000175000017470000000025511575347521015452 0ustar topiusersdist_skin_DATA = \ gnome.zip \ kde4.zip \ tango.zip \ xfce.zip \ Mac_Gray.zip \ priscilla.zip skindir = $(pkgdatadir)/skins MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/skins/tango.zip0000644000175000017470000013544010760564607015260 0ustar topiusersPK U7y__Toolbar_Transfers.pngUT gZGGUxPNG  IHDR szzsRGBbKGD pHYs  tIME  -aX/LIDATXVklUn[E!PQbA%ؠ(&+($hL4T DP (e-tn3s^+Җ!$'{w=ߜ}g.Fs^y5I3u%P\[ X?L% `܄7`q`܄aEU!QSUWo+WMiƺqCiA:=GXC ^ZtUM# %ngM̞Yxg߹7"Έ[T$hB4*M\KΦӍյ[# د C}}(4e8Pý}5Tpig) ~tFT  le%hh4n^[i8RATE2< 6EQ`S%kֲX|A-%+[|;x|e6CV(dLZĞ;Y&+ߌЅjF˲#su7mw9oOvˉŒR6NQY{CO4y1UR6.Zx]&Q%ecAIE_6ow}Q&Q.}*C5'ɓm~zoKcȟ `g_e۪?/HIeP8wپG?͘TJ5څ \Z`8p2j/86|g|j׳J}R|,ϿA7!=e Ԭ S-h5> h Ֆ}OMm"it3*ޖ#{sA4}#Mk=k8\sa ! |nS߰9p4c9s"l6BdX?l5`\JRgtU@AIE9m/-v8T]!r\s !B U]oyW6}D+s>n ?Jf]VavNj]xtN1iyW<]i7s0 `IE7?~dcKуd.ܞ97y↴d$; 遞3N!A'W93MXŅf&L~GOݙ=F Iv;`JT*铋nrSA q@`3RncUY~+FB!K[H ŮpYR',0Ƒp'XXAH\W"at.A)+ÚdbŰ#G`IX[+IENDB`PK \7=JToolbar_Stats.pngUT  FGUxPNG  IHDR szzbKGD pHYs  tIME &w&j IDATXõo\Wk3W؎ߒ4ƩBԴM"mXACU"BR@Шy@A"R 'NƉ3{f{/̸EaK[gsk; qt.'8;7'ݦG#Ə߸ .\8fϞ) !*q{VWW9q^Q_ZɅo:u484DZ?2 "1Tb9.;w?/+W|8:R߽Kµ1FxKڹzq?zsaZ/(CeD@$;5B1 **(`-jk嫟?A6yXpz:=kv=v;*DN^"!3-O`]lV׌Fv汃fY3q+R }}!Ν%LQS7Y7TX)KizfN)ƞ*[ a ᭘ꊧ9ZY-KiH F̣#ЈVv Yn, &w,s] [15)Wd J&/fΣ$4l=Q SPoZe1}{Z,;G9X"ж[N[s^g4j[7o'ef<]:'>"l*CcL+1F &e`Vg``OwѣG^_aee~N8&)!"c"@1 ۶f2ѵ:P0AM@oKKK\'J2A`({g8==EJZ.GOL&Lԝ[/:u822J0x=4;GvQW)ʈ;-㼣P(J̥3sZfhck-X+xiт$(*AHBѨI DM JdhgPJ̴t.sfuZ qM㗼Y;{wq#hInc oCih@]iMcO<& Db0n~s6uk'擐)?͡7R D1ą-)-omRn--ODJRZXĒu|:o5m?أݱ?lӦMI &Q gqcʵ|:` Q126LKK_.ܵO(R3|9 %RN%1e! Te$ьA_$ ֮9kƁK30؏hZLEڵr'-`+Vi'5G޾q)y)Nk s zہ:L$9u[4u:RS#\/?;踯ڎ )gv̒\}Up?kh.O=~ M;UX0pT?O 'N.Z*L5ᦚbI ?ByKiZTh{ XCov(Yt-7~o/hn`?ٖ,L׶x}d=n񐮇qM$keCv=X,z$G xXZ-ql*2m{pP@FgگPQZyUBETPFXm/z~:y Gv6\ v.h;|nZPZ`7#Ĥ:D 8QAc@HH A/& QA/%uRD]R=&d451ĽsK:ؾcYUO@TEi j& v<6a #,՟-nsΣTly 42W{W"{dtttfDIHq}xS-T" E(C)!8G ᯼^FavtT{_9wݿB3gf?|egoV4^Ηfsw K,8휘掠VǼB把yf|alj 't6"bD&77ЌEIENDB`PK "Z7@qaToolbar_Search.pngUT FGUxPNG  IHDR szzbKGD pHYs  tIME EIDATX͖{l[ǿG{mvbN]HhI!-Qt4Vuԍi4LHXL `cMց604+IS;q6رq}}쏵U6c?{9:{Bb4Q|ABn^B7cB" 8pСC/W^qt0|iǎD"PU 14f166QX|Z}-i3/ᜟ]MӠ:,˂8B$ ׋r!W!>l8|pXQԁ ",.:yirR%dXv@i~Cؓ{rךq+O>'Om۷?suZ-~0dr%ˑ&_ƣttC˗ҙ­]m/~{Ɔ1<<<_V[cXf?j{ >KGoLA 5{"2,fJT)}RaXj~y2gXՅt:L&OxfA(ʉnw'g4&Ȇ;¾")"(PAq ާ勩Lqb:WxF100`Z>۶-[i.?[{xUVJYDA D 0B4*nΎ5>>_q: EQ~3 \?܌J?N6] AKt9sƹe955F BQn /,/IVZUe8331ɶ>q1òxr0 tkN)8t$#0P1W:Il`c،s[>*̭JYjivT9 !ZzcHCmJaS-pŌRP)!\+XJ>sAEx܂^ 5_6 He3("!5ιH'efpp\|lpΥj caaaSKK nDV ]TW" m8R͚93YM/P(uю ,lZ6 .lkk_ZxW#B#9ˀPG;YEL4t]?,0 fffnaaF= P .0pJ(A @ gD87:}ÞFL&D"1%_ LO?vOGN'>f#]ǶH id2)/SO=u&J2Msm$#;Djљݺnత:Ѳk/:v'g߳󨫫GVk{DB_sE7޾m6Ogx,g5rvnn{Ҩ|. 8}4 4MñcǦ_IC;@gg'*$I pmR@ud28q> $j48xwj ]pU?^1=99ٕfrT*P( `rr###>ft]_4 I:;;]Tp8M$)b( n+fcr\Ǣ(*"t,CQ|HRzg=, `,nϒ{uڷoLӄi(p>~)Ξ=aO  SRD*-5H$Nxd2ٳi&A$B@A}}=z{{q\N#n(\9.#Gټys_v!8a&p,nB߿_UU0Y1;;^xR+]t"z{<;=>o[UU]g? y;uԿ[s"DQ((`:S-vvv᰻NfԔ+OUu~o6_[[ۯ{zzA>o\.|y.\W\YG$^ü^}$h4Z,cAHA-ub@E@|Eu`d99 oMzJJ^IENDB`PK @Z7aaToolbar_Prefs.pngUT GFGUxPNG  IHDR szzbKGD pHYs  tIME ;;cIDATX=Hay^kbi]Tֵ t*,(T`ٱd*R*X &*HGXܺ9C8mݽ].ƺ?_}\Ag 6z{{LerX.ii>u]?43<`jj"~aH)߻=;ɲoTE[[d W*NuC|- P]]舕NdkkJb4Mcbb!5==-(d}ojjB]*,찷766âd\^I)q!HH$/&!d2i444@nP__xTJMC# U @GcNg!ߣ:ٍ#ehh,t@+`H)Wgffet% TW } ( `R1yP3,45IENDB`PK +6!( Toolbar_Network.pngUT [EGUxPNG  IHDR szzsBIT|d WIDATX՗m\Uu̾L;vBmK(XP1y0FjLc$jHBbbB@` c1by)l_e.mnξsۺ@!<ɹ;?'{lr|}۶}0-۾@Rʐnny3A _ؿ/W|Pt.8K Be)E.3ԙ\HӴ?㾾'+n4ˌ_Zљb:v2:!DAPB㾽y# 7??2ozv4LӲd]'/v֖(+:xd@񐤫-GGN?b۞{C(?SO;Zn|+S :$!K>"lScjfTMXc1rJT"JҖATo|+| R* $zh0CruVO:IW=C޵]":(ŚϡպGSNfJ!B) Vw ;alvzeGlro\@+cDtAsHg}a|CST"Gڠ0_AJKAB)I0-berbN߲w?9iZqBq'r8\*TjB]uWH-H)!Ղ_** Dl*gs?]~fu$P&6a$'!BH|yZJeHT ?%d)LDŽh5tbP hpL)&ܜ`6TW\4Gnr=B-׮#?19]@3L E,lKqc&#IM֠8=&ǧ3Q{X,LLOOݱc|>_\xFŬGfL+qN߲eekWumC73 >Zl-h8z"i[1&}ߟT*ErN -X¬wdbvRb>53=L OiTwvڣtL&P(T}?{;w]L āb3t=v| hiŭl6;$PRs5!‹iPs$gP*Pʋt9]d.Y9ToULGIENDB`PK Y800Toolbar_Messages.pngUT GGUxPNG  IHDR szzsRGBbKGD pHYs B(xtIME qIDATXW=OA}O. J" J/QLG"U)K&m*~e Et\Dl!am  +|8C!u!8<ReYIJ*΁'OϺh|ڬufs=ٱ-˚)b)!|&j89smZ}Ьx(L 7?S(∘/NE= 8jm2LOˏ)cBJYT*!1lc,T%IHϮA0x/..=<-uݯWWWeBȋ`lZ-*I\Rʅ߾■?ҌMB!&yR<)9<(z@HBFDBE&F ?u#4,w!)G /xBPG\TR*b掩yT*Mc0-Сឯ!xe֚kYkkkR4q#ґRjoC IxJ"N~\  :|9ɯollUwV;Ϋvv~ HWSh&iUhZV{c4=yvrrO; n 3cם !\.#oEnԆ 2"dZɶ=IENDB`PK YY8|-Toolbar_Import.pngUT GƔGUxPNG  IHDR szzsRGBbKGD pHYs B(xtIME G0UIDATXL?܋"zB@VJWgeek6$] $mc iŵNؙ Җk{r9Ŀwy|y97ѣGЅRjIPU˲ZZZZ^ox<s s grr2ź[鶌(tŵkPJ1ƹ BlܸhBlܳgO$UOkd)]4^/H2***@ Pr:k0pON;CJ㡼0MСC/ 0Aee%i_J8B`6.]bhh)%mDZmxz=4*BL,  rJ&&&4MRNooG+vG:tZ(&"<6&xr6U'`Z&f8[ƶUp?ieÔޟٳ"#d@VYGL-u5x!#a&Bq!.SgKjz*mp:?Ursͤon GʣRӌ#7ƧbV(Y+>V}wEѲj}7gVL)+Ҟ͋ޣ4hfAܲ9?&nx>TJ>Ieo&n?ar|.(026`HdG\X^nO@J)/bIyY*BD9?oFfC%EyEd0`[yX3){p ~/ n >36o䩆ܜc]+/,xtS1)e ke]|ՈxSY$78K$E!MkV xǍ5,u|5T-$>wťMEO {ur3m4u!#IJ%xwoyyX_9B/C#{;=+41Msj/2::bG'N詭jJ)lFJ^}k^QԠ1L7Bsa>wCM1riwrԩSP_h3mmm➞@jll5 #ɨ=K08 4JIPnq1|o-]`6oߎsΝeYOY5:%%%7~:::ػwX$KRki a\2z!rڵ˾[asȑضqܹݻwEaAi ̙3mRa577GZJSS;;;i3KW7ݿe@O ;wb.;MtwVVbS9KЇSePQ&TYii5zN9rp.i% ;L̫t[Se0;W)Ɲ줇JwG*vtbzu.sy!n1iͣNbwI<]MnR,%dHcpӐ/*GHIENDB`PK 7Z׎Toolbar_Disconnect.pngUT oYGGUxPNG  IHDR szzsRGBbKGD pHYs  tIME 7+9^IDATXí]lwf_k{m'0R/ZRmhFC՗V*JUXrTԂ[!@B!)¸XVvk1ٝٙ}Hf5ݵđVstϹ?_wkٳB2D4MiI>H!t` !xU3@fPmebMZ ]`BbH,T*:Tf &bUxl(.?(~>Ui3%#a(?1Bt{}ۿL(._y{Dcffff{.}}}UVRuP{!4nxK\{zUQΝq>:/dKp +@hrÃ{{l'Mb+OI[cLԩ\zB8JkkkP(8'JHj. =J<.E4%D*bS[tC^f``%\rMHReLOO/ !~DeΟsq,7xyO*BFQƔK.;;7888?z(dNVhn،환-s?r-TZ:NZXXɷxa)Lt>~_4(auR߫b&tE*.FDK7WVV?[.I=+Z1JDMӼ~~7{U'[ve a455MzʯG^HYq96M žȕS,[av mf*h xS#G^Uk KF!WV[SϏ57s20 9’ik99J)V@^.%&݈$gko~8섫>Iӎ\.Q^^K,4M켎$q5 $ AQG!BzUt:hHd Hu.~z'N@i aZF݈Ñ+-5}0 tt|⫯Σc~^Ɨ_?? `KKKp8E1P@@ l^//p=PUC$:[<>*&Ngir62 !S,C$LLL`q5[|ٯi[\] y&, m6N"r Y17ZhO]@5h]aF1;; J)8KF޹Bhjj . r9AUU"1hJJ$_nG<GKKˣwaު#vr>y򤩲wA]]Á?jdn"ݻw#8|[O O4 4nȲK.eYH40>}/Rڕ3@> \iiil&`ۖYfF_5h47m6fXJQVVe|*zŤa?)ebb'[f|@g[?$/SbBkIENDB`PK 27mToolbar_Connect.pngUT YGGUxPNG  IHDR szzsRGBbKGD pHYs  tIME 9#/pIDATXýWMLGfvkC98N -4Q搊CKUT**qzR܃#EʡAm!$JBPR]kZBw۷ޛof ڵk_B~4Mc,3o84::R>yd<-HdG+^u}dpp09GPi(IΚg !>SJ`=;;;No\x޶r 09! JKB,˲\.]#GnROUF"ƘqJ)t]G8c9頻p8 EQ!0 tuu5 !>A^TaR J)!hhheY5gUI@io d/ń.pqXP: rtٶ]CapR bll ~&zmu\ιBsssX^^i0M˘CPCQkl?N._ǏɄ'p 8Y;j'܍Y__$lzEWv۾lf@Qh˲(JMsHZ(eU3x@=NRye{8һ;˲ Yfx[յ Yfe&;f{籰16w, X Kv*qС x)M?V^BOǛu"8Z[[]0*a5j%m_-0446LNNbrrҽ쫄lPBw@C8b^ǏV!RH˲lCTɃXBG$!$&Wb(D> C6ihllDXJ'Wo߾3g_(bnW(JaȲ{* t]G.tP(E~ʕj v_149gB"A)Egg'`ll8| wN?w7X̗fL& ]בfmmm `((0w缐dE*IRg$QHRl6gA-C+oHqu0f*zdm/J=>HMUU[ZZ"v8ܘ{{2̲a䝕yٳ4ҢBEޜq)g?9zX܂O:M_>VlIENDB`PK U76|2  Toolbar_Blink.pngUT hZGGUxPNG  IHDR szzsRGBbKGD pHYs B(xtIME  ./lL#IDATXWMhU̼i /ҀH).;+rJDt!)WIAƅ ąPBpѝ\VZؼ;3w9.OKB6pxw{' Mc;p}yyD SJqRJ ؛ct{pv]LE53'N;Bx8:̯r2vs\oOD s/_ К>,OnG{hMGg"b ` $S5Zs!S003 Hj%`F"'@3z NL/ %>Eb &0Y H4`RHN+K$ׂ$D6 (v4p]wȳL|Y4'ѧ^o[33313v^WVl= ZtN>9CDsa0 mmm}tVVVHXW"d'N3] GQ^[[{{~'+ SzYyG9 RBDR#8Pxyh,<8w0HG>8+_ )`,Yg:aD6"QMD%4t` Je-SXU& حb>x 3DQͽ^ݏ .ȟf_A(yvTV\ ߾>WaKHb=xn›﷩}>H'CЩ`)Nx q4Z!AOD1!p0oS+g^?[/G xUP3n?W/ηqa&-$bkIiZHoOrY/{0zIENDB`PK 47Toolbar_About.pngUT QFGUxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<+IDATX[l\/s\4v|iK 2}@j@Q}PځD }(<}F*hJMBbJDR؁4 $vs93xs t0{;V3XSRqH|uR% z D-ԁ)x ҃ Jp8UݖGe)BBpӶu#wNQ[Re񶸌Dk0W;ei  S`?,2*[x$aV*f$3=Viei:rǘxI/P'袐o yivA{GG,tx("^&%E-6IENDB`PKaUY8g^JREADMEUT GGUxURF)Ma&q\Բ9 b3J`YR_wݳk z4KRhY>t rY)+A vG0]_\/W0۳`Q*1;` :W*!Eh#;M \Q -Ȯxm͝TU5dTcQ(6$:@Wc(X"? -p(d1݁D Ȥ yޖz*5>Mf{[` S+Ӕow F~7\ g* ~j{·aJ;qvĻ P9ў1Ki fM'e"Rl|I6|Є48]؇eYmȵx޽\9K=\cl̾1z&f 3e lw߯GBt4F~Y`ji0Lߝ}|e0xnP LZ-_忒E)hղ|"Q)劈zu]-x_5M4 ^V=%H$ _:NUl6 0x,CѠnSVV ':>> ƼmSzNZa:)xp8EJ^=999aS\vޘ80223u,baa8R;99* QD4 P(B:X,+ LFp-"x<D5rLLL0338뺎㸩TT*5xi8fG$iL&d P.tO>'Jtf~~h4JR\.wM|ifsRmX%\%}IA)p{{K$,lFDh4J(X,io~!ɨ`0@Du<mx5HC몃Ԕ0 b///T*,BD׹+Sp8E"_|>t]'`N{DORu]zMpKK mC6?IENDB`PK n7dClient_Upload.pngUT FGUxPNG  IHDRabKGD pHYs  tIME 5 x!PhIDAT8ˍOALwٶnDb q D/x1&&$M?y@d`PlBH7ns^y8(>RƳBM))Kӳ=@Q&*=rH}[k=&vdƅvP{60+=P:F>/ Rђvr7kwot^}0am|mmDbЉ]twpҗHspms\xaE՚v u9BbNvT6aA #U]Kz |" |cyk)(EXex #IF|| EJpk3mu JPx*^)Bb0z_mbrX_O!%@"'0͡5* ]P9eJ 9\9weȮP#Z\"vCz΄׻cyg;YXz9@'pÁh?ȍC\;D>9>iA9#3z4IENDB`PK VM8);Client_Unknown.pngUT ½GGUxPNG  IHDRasRGBbKGD pHYs  tIME 4 5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًo6IDAT8˭?HAF6;v T9Hb#F 2ETiR])B%b遷r++wly*IW"˙|R8^ZYY18~l6h[llllE+X__7(zᷩ)#022B*ҕJzlkkkI_&|ߧ+#hXr]z BJtV`۶q}}MS׹GM`aa}j8 ]]]%WWW(~=j>ρZ q须Fa();44xN_ ! sssxGe2j$IqNOO_=T,vfEg4Y˲ ;"H| j5* nH$B2$_kڿ/e꽓/ہ\.p8$Fy{{RD\fww7pttV_h4<55ާ\.G^'HN癞ƶmzʶm-NUER\__S*xxx`yy`0 p8L(jڋ6 Je Rp8D)lb4mC+aj4 0M( 躎뼼Dp]wEM)M\):J)x||!D![XLѠZN ^!-V&I!zFi(Nu]LB,,, DJI 4MVWWuDB\^^:J˲n98>>~d2b1!&.D)E8fiioXurW!Djkknt:Ih4J0]uO4Mo!xzzh4:39kyx<><r1tPIENDB`PK F6E//Client_Shareaza.pngUT gw4F(sAsYUl6S;,4_3]!͜p$ۺ?X@WkmpU7({:o|vn2̹لON$9hґ]A2&4H wiu,uE\͂29}r޽}҄2_CZ\+e-ןYC{×O*/zΗЗ ~.PK T8iClient_PoorRatingOnFile.pngUT GGUxPNG  IHDRasRGBbKGD pHYs  tIME$Y].IDAT8˥MKTQϹ f(Q[L8Xbp*"nվOB~Aa/bMiÀt{9ŽJgq~9嘉!` $` AA"%rKcDg_G~4-`flr%"9 "G% HA'FgUq@aV٘M5b5VG9@@%Qǵ,f%{pg΢F}~~8qfu:BގJ%^î,"/$(CICSJ4J!,\լ,%^}܃* E=հ1O`3q\ߧن;.#&4EDc:7sXB&U~\!Ak\au5+$_3Yq̧7]o2.Npq8G/ i aZi&KoH/:P._isi&^,'.\Ǫ"g+4 àrȩu1 $~*IENDB`PK L,6AClient_OnQueue.pngUT NwFGUxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< L `;<jtNj|b857"j\噣G^?xJb#{$VSϨa4E8?~rf|޲܈s>Q&9et8@7*Y\2=om阝^~WsCwSph_h</BDx"?V ߾C__._ጱg<,Tph_-$ Ό8/pz{ޭcsYQ4^BCW Umx w c`ME2#rYQc푐 A7<o >ɧ;Z,t\~msl<^g,Yv,[K6t0tRiD- C_|1Q煞5n􃕔h~64t= M[GAU"bP)a4'&ʑK:JYހ._+Ѩ6vdo> ~_r@_[v\k݄+oi_j?,b֭;[}Mf:i>/ZrFyb /|5L?~FN;kT29Zr_j 2* VbW8}/Y@B'+wZGR6x 5xxIENDB`PK 6lClient_mlDonkey.pngUT [?8 az`|r},#)qM9w[ҕ|[!tQt U s@%[կȵ[[,h5 (j5+'" :&}WǾB#Nyܞ,+P)4I87).֕/t/c@RFE)JIATjwN-tzKj%n?|(-F<)NOScFcĚ##d2~`ZE^7qijjo\w<ZCfRRĻR{'R#f&h~4(_tyu?|vLhQIENDB`PK T8P&Client_InvalidRatingOnFile.pngUT GGUxPNG  IHDRasRGBbKGD pHYs  tIMEH(IDAT8˥JA_diꢴT&K.Mԍu\T MƂD%&|ER5MY9yMIPB*)^wY8kDAPR!Uxg$ 0(PJQn]л /ْEkؾ. 1*Q2M//gOTE_ fD1Z_ سh|v672?tz8WT߭P^]<(g=k0,.X[ß7Q*B4[\~XD" cΊkP* >?~DL!U fCYj䈾(h~ڤ~n{z〨x Pރ"w߉!RAHsxbSPk fb0 (c9hׇ"|f~bfIF]R30f Q: 6?Zb%`,Io3ӫ+t 1Z]lAB;OW!"J CnQ5e/d/?"L{`efñJ1x^Qw[2щW#ӑj HYm5`~UXnWWͯظ!^~y3p2 a39bI1 Ruӎp7z_,z]q( D>S;Iْ-'}1GfoAߒ"ڏS.o< 4 NJlPpIENDB`PK T8 -|Client_FairRatingOnFile.pngUT գGGUxPNG  IHDRasRGBbKGD pHYs  tIMEI+IDAT8˥NSQO酋DN C&_БML ( VG0iKOZN+01{{Km3\ȀḍTO<]r. E\., e ǧe` 떫hE f һsy$ȳ~T <)Fi4|Xk7aMLo)Z߿~ա bG  r~yӳ׆Uh'ƥW0/_ׇ mW\LT7Aq);g"9,E$o1U~^R3 F|_%hR%M ^ v65Qrgc'I؏uBaf@K{Ubwkpp &-ǨFNM X0m%*I+N>ˣ&F-iD3< )O/r~ i#$RIENDB`PK7SJNClient_ExtendedProtocol.pngUT 7FGUx sb``p  $?ORlI. Ap品" 0kPו:0Y@!׈ԼĒ̒ TwO߀)y@<]C,N Ѻx[Xil7P[sZݳN[,\B9x=Zv&WE^SprqC IXZNel.Wv_Lgώ:T[b?)3G’ܬ3}iZQP2/3*tΪšugtsYPK T88ч Client_ExcellentRatingOnFile.pngUT GGUxPNG  IHDRasRGBbKGD pHYs  tIMEJ'rIDAT8˥KlQ 5l>Z}o{.+.CIENDB`PK7acClient_Encrypted.pngUT YGGUx sb``p  $?ORAN ɼrؒ]'E8 <"Aa {+u ngjB=]C,Nh(жKGxQنi+ Zs3^4NCXEvo۔}groVeHNsVxqmٔ1{:-^_ÒheSϋ hу "EQA j2*EQp" zYB-1\959BkM¨LCޏ|]??CJ4OjϬvMЮ"{)-!.?~{| $֔(-3nƜP!A)DUG+`7 _ ;$2ݘ4)'YgF'GE٪jxe9pz{Hz+dy2Qtq ] `Z {@jQǧ/~}vҴIrFY"uMl鹞}kd`#1v9p%~s H|KQm 0>y6gKscp׏d~˲ B߼t .7<%c{ǃ##bg舘dd>SIENDB`PKK476\^Client_CreditsYellow.pngUT FGUx sb``p  $?ORlI. Ap品" 0kPו:hlkDs~nnj^ sQjbIjByfIBHFozw=\?|y_%"4"nA#ڎm~t-4:/}a9ӽkD:;@[%Bq,q$cJUf6kr.XCUZE.mD=śr M28@V|׹nL*AULTG*4D Ԧ1P\ \@I17ȴ;gsȀx݀/|zyxpG@uOHRZXXОRZ VC 0a/ zbwLIt8l,z>ϓ-e !v{^aR Z v "8=bc.| f̙\xrg\uݑ[Ra&#lח=8`^K=@Dn=|C>y' f"/t 4}IENDB`PK fc7VgZZClient_aMule.pngUT  eGGUxPNG  IHDRasRGBbKGD pHYs  tIME   dZtEXtCommentCreated with The GIMPd%nIDAT8˕ku_WɓCV&-(22/kuDOp.rAd;x!ac8wIJRJ&Nʒ5O\-M<_C~~diiܛoM,jkb=QsYl6TVI'xf@p3&*? DP\.ceݿg>$Ņ/SSӄ@|ӷ_J(czR<ϖ-8n[?~Gf.lDwo'OUCP(PL|W3^n~zr^/4wxal^(uQJI.CDX psxp,}<3;&p<<|> "d2vww *Zkɤ9༧|Zx<}\EkR # MqL4RjpCޞ@k-L&`0 Ẉ6vs>f(Yߨ?Q?Am`ggF0o1fQ&kw6e}.kG~3?;8J~h\|X,3YqޅvBʥǏ;N"Ph4۶tnܸλgϩ/~A7E)EŃܪ+'l۹9 xΦz%qQuJ+%4SIENDB`PK L,6S9%Client_A4AFNoNeededPartsQueueFull.pngUT NwFGUxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<RIDAT8]O[u?{Ni G (ƅ ĉFmqTc4@/+3X4ˮ813aCr#`,!-)=)ss;9a'޺C?|a`llD2)%D[,o9!D/hn5\=] ݟ'OH&I$܏xx{믵CA%dV/~e18N xTFEQ\PrOnϋ@񱜕Nzr`qmj:JIENDB`PK U7y__ Toolbar_Transfers.pngUTgZGUxPK \7=J Toolbar_Stats.pngUT FUxPK *?8xA.. kToolbar_Shared.pngUTPRGUxPK "Z7@qa Toolbar_Search.pngUTFUxPK @Z7aa Toolbar_Prefs.pngUTGFUxPK +6!(  #Toolbar_Network.pngUT[EUxPK Y800 f-Toolbar_Messages.pngUTGUxPK YY8|- 0Toolbar_Import.pngUTGUxPK 7Z׎ 7Toolbar_Disconnect.pngUToYGUxPK P72۵ ?Toolbar_Connecting.pngUT^ZGUxPK 27m HToolbar_Connect.pngUTYGUxPK U76|2   ~NToolbar_Blink.pngUThZGUxPK 47 RToolbar_About.pngUTQFUxPKaUY8g^J YREADMEUTGUxPK h7gaa ^Client_xMule.pngUTqeGUxPK n7d aClient_Upload.pngUTFUxPK VM8); dClient_Unknown.pngUT½GUxPK n7߀R hClient_Transfer.pngUTgFUxPK +UM8ĽEOO /kClient_StatusUnknown.pngUTAGUxPK F6E// nClient_Shareaza.pngUTrClient_SecIdent.pngUTpFUxPK T8i sClient_PoorRatingOnFile.pngUTGUxPK L,6A vClient_OnQueue.pngUTNwFUxPK 6l zClient_mlDonkey.pngUT+2pHCt Q.@XZrs<ՆE/9;V K{@l&'3Y쪲l=x_m,-lB ągpt6{E,fTT iZWP+ԋ T.* <o=@2[~\?U~l31=pP.PWt[i@x@3pN.#eKVh:C/ /S}2\`=[C}?r=(/;I D`~ ^.Bd">f ZMMfx8 qdn? x%[?A:  \J`(o\Ƀ&'unsNax ׫yդu]/AK+2!L#@S!mYZď\'=_i\L'zJ:^?歖.tRfb˶?==Bp(HP(N]e.]2c lNdb}))vUtme;Ǧ4p} 58:jg$lpG}|_^``hF !M$)MB$@Nj>'-&nlkr~tibr2TM6[N&&ͯ8|蝍%Mq@Z&Y0~'0 ae ZرX'p9[%LT LU"ɊjkWg۩r,5+˸u( ~_ sɺk:#!T1wHӹsydx](h F[F7WU.HؙLӘWơQtعa~|Z:_$%>+?ИѨ@UL,ihBIq6u12:1ߺ/D"SIU!$B&#/vH`M ߁f+}Z牐Lgx$ʓ/`볭th:`u$R].y.J=x:QCp&p֎Ώ$pxxOe:P`UHM Z[do\N}@ PYVu8 nj:"LIENDB`PK 6wToolbar_Stats.pngUT rFFUxPNG  IHDR szzbKGD pHYs  tIME83gwk=IDATX]HW3;#(ESb!R MC>奁BCD& IiRlD$-(j '!*Qjn6Fcfwfvik }eΜ{{3KXt/-xQ}1@>-]v cc=k yg & HDss3 7  ZZZ`ppSST\c]w_\Z ,ݻ>8ѣ lF /d SQ}*ܳЂZd|b/:)--왳d Y돁T|$(H0Ǒh7L]R\"[7mŲg=-/%nettA6:/u|;uo!$ocčJ\']u%ڊp n\Kȉ#|Áp(Bc|>N [~0vۣCz&qҿH4MjU|n¢/^45>77iQJph6d\XKe_|٧8:On޹;}UCQy7$7/?i^`]|ͪ]siAIu[^غbzf)IfB;Xg408]"a-M"j{Ju]/7?e5uk s8<]xQ$vmm=m3~ۭ֜77lݵf zZ 9,\ub="&g[~o)urwVreV:w-[*/&Jsä#%rș֨wA@5+mL $w 396Γj&k )=xWgD~rxSp~NޙG [Fд=D$C>'~ Jqo>cAM'X#'7 =-8M\9!bi~usicW*R?jNmIENDB`PK 6sVVToolbar_Prefs.pngUT rFFUxPNG  IHDR szzbKGD pHYs  tIME(*IDATXW[lٵ]_ŗX` X&-U /QT,CCBTp@effg3^繪2ü3z7Yv󣣣z&yY抢p]ѣG@ OJx<JT@)!$BmMR_Y  !m @Ef(ERv*rW:b؍x,0 0`p8z1 ^!``챒 !ݻ4M0t!Jmx<߭|'N~""]. )@. M|1ÀcǤx<>d6%q@:;;1 +f àR 躾 B$v@ tMc Hh " v"0G-;9f0q_%c B%x(:8pm{nŝ;w,'֫g:K)B{Ӣ(`.g{[/X!շb,&q쯊VN4 չN$S)\)nݾLJcw=m7cǟo;ljAHuM 1Tr1Sc%ȦׅB`ly%$/, A776X|qwn`uv@u"/@DR FP'O~ . xbぢ[;C{ZvvP낚_^L +ctxu2+rDmNҾuSo^ռZ]>Pj&Jvz)"EmT~_e+~hOv:([ q$RY?U0*I:wn t +=ҙ*G26KFұ1`mVjsa2sVJ!e85-|tSPe][$mÃj\n2*X9YO_T(VVf`w}~/|@/$IJ.ϔW'V[@&o޼!;=0,4yLaj̸:œ ( bE4Kpf\gv6Kb'ShjVN\'/N_3L&̚TG5IZqo.z[.}]?]]]L&6Y9 פgIENDB`PK Hj 7Toolbar_Network.pngUT wIFFUxPNG  IHDR szzbKGD pHYs  ~tIME x<1IDATXí[o\Wsu؎)MTjRڴJii T.*@ .Q%D%$D+VД8:χxuknZ%!ʹw=ݣAiށϝ- 2֘X) 08XAtaAE(k@HFNz*t@zÏ?'12<kpq5tRf,Ύ PRZS\R!ǽZcaVUA@"3-b0C } Ø 3??s$GLFrV<{]\( ; x K/A+XDq}{!e,% cڲ)mH"U8Np=0iknl#]/a lke&aBODGNSNZ*R]ahf:abJ C:-כ8^~߯$I3sJgRd~ r?QqⷚD{%":sd.\Gz3zcӧ٩q4m!*U,s}}=$ZOA6?9 N)Yk AW:%B)rH!>s{ EL0XcFcfcs9T訾6½E`AgXu 0&uZixY 5nܜE!QZҴiR)*IPYrOy# jk;{Xoe3 $m/7/VtxRJUVYc{u߱fq,e8L#DܓNN)yD):Ml7ikw3\: Y >t1"0SB^ek^o)K-k1*uj(wS{Uf3 E`3?Ȩi3r2`8@NͲߛ0K#lKIENDB`PK 7ΘToolbar_Messages.pngUT cOFFUxPNG  IHDR szzbKGD pHYs  tIME. q%IDATXWMH+W>f6jQ)iPPE .K㢏 -d6ۺۂtyBeGFF$OocLf‰̋LBÝ{&;;f){!DS2 ˲^1MөںR: @Q4 ft tzk@n@:AMA b @EQ#TzNpcRZ p·666]zmYB0Z 0B5d $%h066V+CP+S^E!a9 -MMMP.&-s>,˪ȭ~nM%w'*"zio$ZgX#MAī~ (`Yhc 8`477i ai~nِteYo)B4M?O 8Y#V/B7n%clskkk(|P(|1??Zn67/\EQuGTYmAANNNpee叉~?55JbVUEBOuj^U'CCCw !d/)@Dyܖ,KB,]B$ =H@JipKK˕XMӄr kzzz*ŢsPg `W)%LBAlnn\.p6MRhooOù.)d2ggg*ts cB?_[[:ɬˁv( !%b=88 LZ RN6;;I$ lV*"Ӫ]K2D"or?<<3C2>%II9іP+ S7%}kRF1Mu}o7z8ַ( 30oC3MOO8Kmc-6GSfԄ<҇XĴӑ^4t$%ڲݒO{cu#‰uO[2GN/bDB$auB&9izs1N] QÐhjBA|e]KZpm3FHBB IHv| "$IYY477d/al R,"XSHkc-'m\k@!JΡ_=]E$k 1fD&JCD@ HtAZZV5x7q 1[v6q9Kqp8t76dPdtN{n=;'#LhrS1>O',:P&Fƌř_cMUe 6SN޼y]u)}-j%.6K]-Q"pS# 7#78]Rί'nv ]$)}.@M`vW*.C\n"D.C%9OkJ]}p(Y+C/'`:j'rm97E$@$8Z^1I#WC2K&dܲ+j+JcU̟O(F{#Є!|>R} ΂/Y 5CzPbql㓒2-SYZ/2əHo?W|uHKKf̙=FN m1yl^=/&]'X5jg/T?rˁ駞F:xAvCnn6P;s,YL:21D:1 cF~9ذ!Uu$?- cmJDz]+1H_'3#w}:U5U[-:VooB4zmR))9˛oGg+oaífSxJg݆fp0 .^(rQG:(7x^~[I_{ⷧ?7;c8^Xcڼ/A\{a֜)"kLZǎضݥ10Љrziő:MӰ,놇2e\(-% D(NL.2,zyڀ%IR"#e(-fQ3f|1%%eyWBheee?1pݥn;{n@.0XLMIENDB`PK %6&#Toolbar_Disconnect.pngUT rFFUxPNG  IHDR szzbKGD pHYs  tIME9 ~pzIDATXŗPT?o7Xۭd]c%DG+M$ bVZ::vtlLX*c ֤TW4*"P~- 0ͼs9{y~/|;C#e> \)*I< "-҇ Io'FVe@ooodrr@E0~c q͘سvAOOWv^IBmpы訙h"Vc墩W~V+>>DG=BLt$s1T~hy*->4uHB}}L0^~q c /]Fd,Z`\.---WR^Qꉎ|ZEQzQei/>K#n cT9ŧ>Cӑ$|}}uڹH.'/[^{qOvdq)'Kѣ~Ĭx <%^^iǍ1~p'ƪZJˌa;ww/JuuuZl\ohd߇ qwvvgK$Fq_m`v\2wӤ_L`76_`ߛ/0;ZMm%Ktʸ,71 dS(,,ĉ? ݻGu!8gfVJadO1 \~!}V FhhMmm-ZÇsCv 9O(""hZˣ35=+ih}Y>K|J_/@ZZEEE:?KLm8+֯ Q%F#a!3 Ϟdnfg-O77ns?o1Rxoy/0L2goD 8F#?[N/xa$HI.N}OO[n廚0:@Dx(O$,y2ࠩ QRRJ9,Mo  ]vp8s*MbB< IÂe]|LrIQl W{9RP`b "ryHvv6eee$, V奘'O$JeCv1!aZJTbccYl]ARYYIYY& u Q2)+u_p89^Tk ԑu gR_66 AE`~ĄxBCP(<'%Z鷘 V8{67JEOOeKc[뮮nvut&FuՆA|7sF_ߝ `!UA_L$@E$  \$O!݌$ xr!u6Мit|i3َNfNR~-_]m?rpP\aPދ·Ghq ((#2ZYdtܰe`e^e*j5yz]\">DD龧rRN-7B_F$ k}g/'>< 5  j# l.|={6S!a _t5qwr|#IMck"`0@ *b#iKL=\2tn3>3ݾc;"mMe& $|gORyw`T?+ @Ҋ<'ZEuij@ԼD3+8"jlQ\Udti(2[QQcKutm+TR[x&.-K# xY$v^f}Ef1,~\hr-Ğ'hZ~%vW]C\,2qgJI$E`y 840tɲ\k5y7/|sW#XO 7ݎ1۶URS&5Ri$ŒFu :'Rn-a\8~|'Q)"bfZW$N5cftJ_t j+``_)f422bw.Ll12'(JvGNlᙞ[@8kK=!P42?/wD嘉{~"`/jgksI\.):t?LO8U@V`@QX`uĒմI*&NicAtlSTDpQ8b)U\ok:qarv?~+I슠F)XM5"eԿ; < b.|MCxU7w s n\w33}L6C:#g1fY X,syÜK.{02nub'&Z\]Skgۣ|>7IF#ˊIENDB`PK /6Z]]Toolbar_Connect.pngUT  rFFUxPNG  IHDR szzbKGD pHYs  tIME9dKIDATX[LTgrFTv]H ŭr)[VBi ՗Zc >5MLKc4!@HMC)6uBrS`B]Ty:93ϗ~ȷXDp>/`@b= }JbNCTШ^I,.ի;CDĚ'iA@R-,"Ҳ˸GFX<(jٸeL ˲̰{ۮvty `7qX6ׇ! 4j5jLHdYO\kvAΝ;Dez{{Z&&[*STVRQfR233 Y`722իW9<^C؝AXXx2TTSYUGpIbbbbZ9{,_;29륮IuM?ιsJi\\EEET*\͎m[_=kXV}v;fs<704^>7~ngΜ!**jr~]&~sc0IIIy擖Ns~6 b֤K.ѱ8G[[eeeƟHѳGqhIll, ?鹀F$!I 2,hpzL&>I|&''QTL&4 Z=7pQE Nqq1iiiZh4HQQ ?V ١A{S*aBg@T Ewwχ[Rri}`d"֮1?͛79vGO?<<̩S1x͚|h^OFUUO܌b`0t:%%%466f*Qh4{`/M||f3\~ŲVx"vmVv2gg D @AA>}@jj*(T*ٲenSSSCd>Vyy d C46c6DVV@R__OMM .uk8tpۍV}@DN~R8[ho >C$A@E ёk,2~033 BC[de=2%}||Ox8ė_Ϸ%$1::D/SSS[{ԣ.4@ |-_܉%ڗIENDB`PK ˩&7XddToolbar_Blink.pngUT QFFUxPNG  IHDR szzbKGD pHYs  tIME >lIDATX՗Ml\Wß6`ŵj*,X ME."Q.XEYeâdF"TAB)QI*glϛawDZuÑwϽ=#]'{Ű]jfc_*g9i:"מ$Qݻw6NRDfH">Q#3ka_'u0;wdxxJ___Osu( j"5 #oSJ Jsn+ fV!"$`U%%z"C A a&[WDwJx BA-KlxRIz´ APy^ͭऌbAW@q !R[()!~ HTb9x/gi$PDJyⷊ-JI{A؍ձXq YCd(l#A<7w6VU[\\)LUA웤JP-<]ēesxM~Co #\G/{ZˡL: u( 6Pkԣ6 ˏ6488xBDj*GtؑЯ 7-MWQMLb~83<q.6D2Tﳽ%T>F4}'xs>+ zPau<;~fJr8˽yڵն"K\bg'R?|&͎FUGsێIcӧO[__y +NU7fggeak6/^|d2MNNƍw2??V]\vAƝ6J%qez{]n?Av`yy٩z<[>H666aT v5撆OH>+Z1[kN/]>wwErğOJUV{kҘTvwCۣpۡ&=;r{D'}IENDB`PK C$7%NToolbar_About.pngUT >FFUxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXkl33;ݵ_;'qpUB@^@A8"&HrATibD+h(" **=] vv zw>?D!^4#̬'$g.(hښg91k鍷-QU%֤\6틏UkW֤hm wD|N~ed~JK7UIzmwG昺}KkPܝ^%3|w]f)-*(xĀ";U"Go2 B%4ŭkDR3*@5˗imOg]^8~#Ş*a?)}11z_uYmMW"Eۉ 8qA]m .(,f=Hl#zLr331>fHO{϶%KغR}榼@R8?X2HieZQ]drblH zyTcqU6LzRt&J~6KhkRk~dIua8L0и~T>_ ΡvJJ <).k#bw3`wp%=1Boo۷ 2hBSW7o/"J 96ѓt0'yڵ={IXns4)[IŢ8.@QBs֮[-TE!Lø)r"9qw1L۶=Ջi rԱa `7\ի03xއs=H4um$[aG/@ !ccO<5==M$'m[u϶,aC ̈́G-B.5@މcә6G3RJf@(MB*B1W?G 82fYj3;,c%k~@dV a7R_,PnIENDB`PK {u2744Client_xMule.pngUT  FFUxPNG  IHDRabKGD pHYs  tIME  +6?IDAT8˕O1#)"4IɎ,,$kY쬕Oc|>B,DfR,Qcg{{9iKQ QOEW rrDQ:nf3>>|0 : 4v Cf@D"ARa20X_AA20 6 s8KgXeX,TUͦ[3i(TU+bZ Z-lf>^3`0H,t:aJH$B8hdǨ꼛xb1r``@&mǡ"IR(zZ\.I2P(fu{ T*ohYe1;(bkX*H~vx<$IXx4M ? P(D(~cWS7 IENDB`PK |j7jClient_Upload.pngUT aFFUxPNG  IHDRabKGD pHYs  tIME 8l^IDAT8ˍAHͭ9jn)#YEhATԥ ``a.!tC=DPAЂC\*n f}{|tǁ` Vk. JKK|>t)+?[[[1(6%JF<kÈlr pg@g6N-,,~?$ f3v2xD Py5:v |>Q݂xU`5T]^^F4DUUu3pDӫ]*oWQj2p&U ;;;Z(W333çn^eillhta|MT&!L@/Ч67vKw 0 lX,&XLL&*Xho. \<N.Žx#ŪPQl(:uf;s+~u rڋpڍ U=\'|w~X,d`YY ۃ67s &00y5=z*5io֦JqJ@ͿiE$7E9(Pn}IENDB`PK 77[{TTClient_Unknown.pngUT zFFUxPNG  IHDRa pHYs  tIME!-No5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDAT8ˍK#g?3l5#bnx I]=_PۣBK!׀ hdLޙI}"B{x}8FZǡnB|BlۦZ1^8ALy7j4r\rW!y||xu`<Zk'_+y^ 0M0 4ec_N'''1yz8*u[[[P(.n9T*?Kҫszzzl"ycYwwwض۶ T*LMM!=c0􄔒^)5`K)_'T* tj4 ۶'Ndb)eV) D)5Xb1Y(d29w~۶azz7Q寮b!ħE&VX42j,{oof`0jjt:ql.// qii ,3,[[[h`gg!b֚GR(rssCGkRn 0Qvaa4'KQQt:((,*LQq~~N&"FqHj`loo&.B.aH*"HJ+Fzcֿ\\\T[vKIENDB`PK j7Client_Transfer.pngUT bFFUxPNG  IHDRabKGD pHYs  tIME 1BhIDAT8ˍKSa?LXM1tnmEaH M]A7$ F$+n*Ȋe^7Yðh%mlFcW|?UX_[F(~9C.#wVl (r8[,KԢKOڋI^#g{5\\]=(ʦ o[c/bs}nEhVeԈ]&],&o"7ꐪѨM4"fť$93RYj"Qe\e^9}> X,V\^<6 >X#$L|-e3d2r9 ào簲2S4ofc/$I `rT݃v1vChe$? ݙL&@4c+ "s% L%IBuvΊ^ONMWk=@ݩiAt]GA0$D1r=lǟl6K,ctt4iqe:#IJE YϴM HSװIENDB`PK i7ɽ!jjClient_StatusUnknown.pngUT \&FFUxPNG  IHDRabKGD pHYs  tIME (KnSIDAT8mKry?~;UaV̻hk#-ZDj1l…BZE"2)a^kb*zlys80MD/8~-c`0~@$oOLLhpX P((JV&i 0w?~?f]#L6///>aa&Zxou4M]Vh4UϏL&]rLOOvn0 lEQh4<==( uEAUU2B1.Ȳ$I(,|>,t:DUUP˲ǟ !eYQN'ݡiBTUO(E^7 \.777r9 iB 422"^Hs޲$IAϭclGGG|(h8N<~6% èZT*\]]3xX,F2l5 0*H9 }Z[[ӊ"J4Mv 'J||6 4M}ffFt\__S.vڰ,[3}Β$[$tkSRYIENDB`PK F6E//Client_Shareaza.pngUT gw4F(sAsYUl6S;,4_3]!͜p$ۺ?X@WkmpU7({:o|vn2̹لON$9hґ]A2&4H wiu,uE\͂29}r޽}҄2_CZ\+e-ןYC{×O*/zΗЗ ~.PK \7V|Client_PoorRatingOnFile.pngUT MFFUxPNG  IHDRabKGD pHYs  tIME7R7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orgln_IDAT8u_h[UƿsҕvMnЖaqYQt'Kɞ0[@(L|`*(ZdCMjј)k4I&s|d8#ӧp|c}!A x![91 Ц(/DH49G6/B}>o`'c!!JI1џli0 L&#fsR0!k!ĉo(=3J4/b Z7Ё@[$a~a~՟< 'D4MD#B0M  ;ٺCUU"H pOW7B@H UUoQKK+"VbM0{9LRyG3 ø[`s+%ؼ 4P(`s"K1LD8F>9m92B/.{m$骖tqJb՚[TQn@xVWVmﵛ{rGr&TMm} DR{[K?Iv!wFX)&Lzē[ BЫ(imBѮvC[Me{QJtZ Y>óA^PQq3jjΤQJQQ|>K6388R ÁBR `Uk:pr lf^<WNQTRB  \q)3?G)mضѣǘ cYJ P,tNy;/I|颿^oMӏְ2$64Ief__/ U?֚'Ǘ(hqA:R/#_~[;bf޷V ih*lL|鏁%`1(k@cnjEIENDB`PK 6lClient_mlDonkey.pngUT [?8 az`|r},#)qM9w[ҕ|[!tQt U s@%[կȵ[[,h5 (j5+'" :&}WǾB#Nyܞ,+P)4I87).֕/t/c@RFE)JIATjwN-tzKj%n?|(-F<)NOScFcĚ##d2~`ZE^7qijjo\w<ZCfRRĻR{'R#f&h~4(_tyu?|vLhQIENDB`PK 7wClient_InvalidRatingOnFile.pngUT SFFUxPNG  IHDRabKGD pHYs  tIME&k7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˕]HgOZ5m4FcVLcjfqkxW.CA/Pl a"ku"amltj)eMV-tή.DA9Ϲx#؇!z4MXJHbF)f,ֲK{bߢ\&^|B*)X}|7 b-jGH4MQJ*=SDak_wVVQ%zgz*t"z왳绺B ') p<~0 <LRƆ뱕QzOt:N'B)S @]p8RLo_MDo^kxDXDqq/_z$Ϯ^pW+H9܆4m=UvJ׮㬭cbvS2ɣ?0 OR^4Aoihk#މ 0a09Ƀ~l/gr<2;}>\#T[D|TUUQYYK 0շtZ2zOk[|Fvvc=p R^\h0H'O>XK{*qI3kap:p0vNM{*|5oB {;:L͛o؍غ:_[Mb ;ԴD,&Ʊ݅vvg.YZb|6j6Ixs=C_90ӧq\TC1عsG*F];Y>O&fyeo1C ?$ ~`B1t>IENDB`PK "7&ʏClient_GoodRatingOnFile.pngUT _FFUxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ukSAgX[6MG`)JtԅA|mJ;W;qhU\hT &m&޹DžKb}|g~3,l62z >F`AM`m@!} y`-L.wX;j|CjIUmu7p蜗ӲtiZ ja%-ZPۡ2S;7?C"˶Cd ߡl! j l6mL}_ր o 'HJ"9ni`a8H "uPailCJ_E(%*jK`` L@P"Fx-FmHvkDXOwֹ?\~߻l(ٞ4rV <]]ݬ^f~XoL_ϝG'}Ctvv195E%38LNNњL}T*RHau?-I|kinj<<ץmmxGqHtq,l9] Dk{ bjsq=WHR9P&,q7 thddrD\q cSRVO=zDv *"ZsWFDvZ{}@4XIENDB`PK 7>Client_Friend.pngUT hSFFUxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KHQofKA a%=ADb(Z&Z-(&*͖-M$ l!e=373{Z[kӁg913'EnK^H,bP)^ fAGIֵɲrܔc&q2xċ fb0 (c9hׇ"|f~bfIF]R30f Q: 6?Zb%`,Io3ӫ+t 1Z]lAB;OW!"J CnQ5e/d/?"L{`efñJ1x^Qw[2щW#ӑj HYm5`~UXnWWͯظ!^~y3p2 a39bI1 Ruӎp7z_,z]q( D>S;Iْ-'}1GfoAߒ"ڏS.o< 4 NJ*HyIENDB`PK 7=!Client_FairRatingOnFile.pngUT FFUxPNG  IHDRabKGD pHYs  tIME27tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8}oTU?s[B2P#Tڊ%E ( ĸTcろ #RS%qR@i 1suj'?@)R(hhh@kMEw;c= myѱos#.l;wV_|#5QxR)oOfڟz _}y)cX,B Zk0$͹ }ٹWSo~ss_<=c{RVHSSSi5/4&+˽/+y0q]wo{[;MM  ""BJ:׏֚[ٳg @R>V8!Bj++`&CSs3NgLquQ<m JJg~~S'\bqqw`M&h|:6:7o^gIfJSO&N3==E8?\ -G\\/fWo#KkDfN) $rWJy^7=TbB}OR@]A0 ]={R !B|G)ET*W3H)?TRJffqF::QASzܗHW/[!ąoqūP*-;QR6P.c!Ą2?byK k8%8F1ayK,\FqߋE>qf;ɥIENDB`PK7SJNClient_ExtendedProtocol.pngUT 7FFUx sb``p  $?ORlI. Ap品" 0kPו:0Y@!׈ԼĒ̒ TwO߀)y@<]C,N Ѻx[Xil7P[sZݳN[,\B9x=Zv&WE^SprqC IXZNel.Wv_Lgώ:T[b?)3G’ܬ3}iZQP2/3*tΪšugtsYPK j7,.k Client_ExcellentRatingOnFile.pngUT :FFUxPNG  IHDRabKGD pHYs  tIMEoiw>7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˵KQΫXFi4dDB)M… Ek"WAh,"veC:O j偳992Pvs6,Dp$4F\uh2Qŏt>Wù՟%kaeCimM*к~$~HcuK> Zcl}NgJ* ̎^T qTCu:I\'*1B m&󟑦qObUvgc8DuP?BaD(Y?Q,bldIP"%eTqpcoy1?Tah~Dcf0{!? X/U;e.,庭Mɫ(?>XXFcK8IS'RVxݳ.(ٹM@KԳY9Qw53L@ٮ=_ulIENDB`PK47Client_Encrypted.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו: ס.lkDs~nnj^ sQjbIjByfIBHFoEꗱ]xHኩd*mqIAs_ғ?1xsJhPK 7PJJClient_eMule.pngUT FFUxPNG  IHDRasBIT|dIDAT8OHq?k[lZl0b9(rDh/S3; jy6ST!,ae1'ww`)W>~ QYT_{#m.;\&B:/32}[\`hn0A eJ:/o 7 LvIENDB`PK "~7.**Client_eDonkeyHybrid.pngUT &FFUxPNG  IHDRabKGD pHYs  tIME 1xWqIDAT8mj@:iHQHqU{=*-l3)lP| |ىXwn "fs~ӥ($iy$@b3jm)2f#sȮ(,(qd!hv"}ճHsn8s8o9ކ^ ,}YmCӴKXT96;KN..v6u]cB xy WQe3?YEfv/"?,V _̏Ct \tL#D4MQՋy $a44MUUfiq8Dm8Lv8H3O۶Sӕ1xoNONOemjEtPIENDB`PKK476\^Client_CreditsYellow.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו:hlkDs~nnj^ sQjbIjByfIBHFo>Client_CommentOnly.pngUT FFUxPNG  IHDRabKGD pHYs  tIME 7);RHIDAT8˥MhA3ݣH"-)X+xEж'< "~1[M\bӍLlZx0Cmj+ ofރ a]VzxG/fw؎XM9WOJݬ;-T@YXݓ zV_LKNJ7qĉ?}MeM}'O2t3@zz}KAI{|-Mu=۶m;R>n&X^Q@dct| UsEΟ0 M ҽ \y7}7FdY~C;>Yz=iv4nK!?y%;nL&q]7\OPV<G;+H%H`YeExA,CkMVCk5Bl:ud})0oZy IENDB`PK &7rGGClient_BadGuy.pngUT ]FFUxPNG  IHDRabKGD pHYs  ~tIME #/5IDAT8ҿkq.hmBAK$v - u0*!-"8Uu%Al*RJϋ5rwsr |և U0+fj=Ϝb0MS/wT45 M^Xx)z|njk#'J KO>oSӄuRel_ ~tPpLBOAj8P3s|xu(_ur\{{i۸+%C+ա#ht -4MCp]!2_ ŰB H)R j4< JkuiYHAJOiG"ɅE>تQUEPFFlm$fJ ђI4,[v/@  ߪnNZ+>KZaIENDB`PK L$7@Client_aMule.pngUT OFFUxPNG  IHDRabKGD pHYs B(xtIMEP<IDAT8˅KHTawd*Vd> hу "EQA j2*EQp" zYB-1\959BkM¨LCޏ|]??CJ4OjϬvMЮ"{)-!.?~{| $֔(-3nƜP!A)DUG+`7 _ ;$2ݘ4)'YgF'GE٪jxe9pz{Hz+dy2Qtq ] `Z U->h*z/K(K*Hk׃~`ЂkqQ@Yb$kPoPjYE9O]^E!`EKo8(ZD41rEǴ13z]in#;=?(bFo 9mp|w#8֞oYJڷ׀x;9fic i % WW(Mqh!,-jHB4KXk_ZI !:Tsón&L:5nl66~i/wUIENDB`PK ݜ6=ײ Toolbar_Transfers.pngUTrFUxPK 6w ,Toolbar_Stats.pngUTrFUxPK .6 CC Toolbar_Shared.pngUTGrFUxPK Ŝ6c Toolbar_Search.pngUTrFUxPK 6sVV Toolbar_Prefs.pngUTrFUxPK Hj 7 Toolbar_Network.pngUTwIFUxPK 7Θ $Toolbar_Messages.pngUTcOFUxPK ش$7g& )Toolbar_Import.pngUTXFUxPK %6&# 1Toolbar_Disconnect.pngUTrFUxPK 64uq| 8Toolbar_Connecting.pngUTorFUxPK /6Z]] 2@Toolbar_Connect.pngUT rFUxPK ˩&7Xdd EToolbar_Blink.pngUTQFUxPK C$7%N }LToolbar_About.pngUT>FUxPK {u2744 TClient_xMule.pngUT FUxPK |j7j LWClient_Upload.pngUTaFUxPK 77[{TT aZClient_Unknown.pngUTzFUxPK j7 ]Client_Transfer.pngUTbFUxPK i7ɽ!jj aClient_StatusUnknown.pngUT\&FUxPK F6E// dClient_Shareaza.pngUT Client_Friend.pngUThSFUxPK 7=! (Client_FairRatingOnFile.pngUTFUxPK7SJN EClient_ExtendedProtocol.pngUT7FUxPK j7,.k ݈Client_ExcellentRatingOnFile.pngUT:FUxPK47 ڋClient_Encrypted.pngUTFUxPK 7PJJ Client_eMule.pngUTFUxPK "~7.** Client_eDonkeyHybrid.pngUT&FUxPKK476\^ Client_CreditsYellow.pngUTFUxPK+47c_or Client_CreditsGrey.pngUTFUxPK {7W UClient_Connecting.pngUT!FUxPK # 7D5>> ZClient_CommentOnly.pngUTFUxPK &7rGG Client_BadGuy.pngUT]FUxPK L$7@ lClient_aMule.pngUTOFUxPK J4v% Client_A4AFNoNeededPartsQueueFull.pngUTCUxPK((} aMule-2.3.1/src/skins/Mac_Gray.zip0000644000175000017470000006014611025735264015624 0ustar topiusersPKR+8Toolbar_About.pngUX TH[TH9PNG  IHDR szz pHYs  IDATXkI?jh+DQ t\U{]!ŋ]ps1u"áCcff7nPV Z+)YkKKK\|Vr{sK8@1B2jSSSloocMjŮvV،>`c :ubH@Dhpcthc$$r7l sZwhI}l8> 1(x=r3gEv|>:KKKA@EEQG{8ۥll6gggdža:mN+Ey >X+J):NOl|ÇǏwj$d:(PJy3y&Ӽ{ONOi^ӬnsƨJ%1EfggV%;@o#aFD ]Ç9y$.\ŋ^9M(TjF355Ehi4#eRN:d jvP{# وp`Dhw%8diw/Jйɥ z Z ՗i#իWszƉ0 &&&rJk-nr9QJI7?lXkգGdqq'kItgϞ1 0$ ˘k˗/5,8u澐0 qKH0IENDB`PK!>9PK ,8 __MACOSX/UX THTHPKR+8__MACOSX/._Toolbar_About.pngUX TH[THc`cg`b`MLVVP'A P€PKے+RPK]+8Toolbar_Bling.pngUX THqTHPNG  IHDR szz pHYs  IDATXMhS{cԦ1:+r"HŢ(BEH;ut'o8Ј8zPqTx( R;P'8W-EhR䜽}|T*8P #uBSຮ6)0t r\,044D*q nݺ/. RJ !֚jJ,?8.]"H,j)v]WH)WAXEy֭ׯ_#IJ,Y~=j)%066<۷oBk1 P͢&sad2D"ݻbe\'NYl֦V-0H$ŋ9< H$R|k|y޽{9{,U%R2 #kTSNH$xLʰnʍ7ضm333A_ \+hnnfttt:eYlٲ .077ǧOpV:::ꢳE{avM  E!}v"j)e炕1P;rR]l&*!6sj^7jrTGZk<mB!˱i&X,Z Gl6; sίT 6ԨG][wӧר;vuww/Za@zffxP(t,Vŏ N"ukIENDB`PKi PK]+8__MACOSX/._Toolbar_Bling.pngUX THqTHc`cg`b`MLVVP'A P€PKے+RPKi+8Toolbar_Connect.pngUX THTH=PNG  IHDR szz pHYs  tIDATXWK3G6 I*oAD?@KUz Q œxW  ^h#<3؏R "\\\`{{iZn/&&&VWWsDBJ)c,^XW,uwwW*~V[rsZ~"xqb>>> }d@.HӐRr˲86bYZs)%r\Q&"0kA&} fAk̀r`kxdY! g>rA@k 5W^5 ^#ɠlFADmgRks pRʖQRJ4z|$ * ###D&f3>F[[p¾\(' RuD8??4֐L&!PJ193ID/U/F;F+++(J7?X_==QZ͟byym"< }16!ɉWQispτd68PJ!L\.cffmhsn)G} 0Ơ n+ۋEtuuӆDQBq[u*BX$* ?ϟʖi$8礔bf›ۋ ނ1FBHmc:cRJ$IE^DD[1ERk<ڜ9fI˾3g93o3O5/@ {_lD76ǖ566o3RsoNNN?)ӧOvuuKJ۔R588lmmDlf58q" b1a"KRJ\a|bhjj:  "4ǏJ)lrxp:B))%te ?5*;Q)()p\~z捘"xذa;v`*ɈD"(۶YXRDTwwxsNdZVVFSShkkc޽ׯ0ŕ[da6R¶mlVm#8RRYYɋ/hooQ__իY\\dllw˓'Oq#mH)y-//g``V4^/mNݻqe8ϟ˗/hm5F~٦t:ܹsiZZZg,.. T$!Dmm-wҥK8룢L&b,*@ض-@!n"۷Faͽh)XZZ"sYdaa0rk¶m,RRJ,v믿ߏڵkϓNq8}k8̙3ٳi,//f!F۶4F)ѣGٸq#HQ俗6r8~8Ϟ=NgR4ԑ[%R0:: I$ JwH$ؽ{7߿'p8,4=HRDQI&JgByy9Vbnnt:iJ/^BϥKl?5˲ R eri|VI0Ǐ9s^Y@4%Q]]+wu ؾ};/_4M,REB*,t222]R)R*_4TJ,L&ihh4M?~^WG?^;fYBäR)=RD"-[hjjbyyׯvB\F/`Y~mFcc#E)HӜ:u*^zŋZT*ɐdmǃ޽{<|WL&IR*GJ),ʥd*~?144D2v2ʐR222… >7oޤI(U5u!`,cΝtvvW\! uV*++IRLOO333@0ƍ:tQt:sCg[v;s@#JmH8twws۷֯_ϑ#G8y$nwr RoH(%LTǎ̈́B!, ˺uشi>O>iJRTR!ʊ_5kPSS}B)4.Hs!P@AA(v {/۶I$ܞPap0o!ex n֠#IENDB`PK:J-(PKq+8!__MACOSX/._Toolbar_Connecting.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPKv+8Toolbar_Disconnect.pngUX THTHsPNG  IHDR szz pHYs  >IDATXWMKsG~νSl6% B \ڸ*Dmk+te +[_?@`Mrgt;׹-}@xΝ9y3gxAo'z22)m6?0\7_*bq6kl[4߮(ooo~xxT*0 AD܃Q,2j}|FCT  \Y2J66Ɏ'^YY7_jiae2ׂi4>(9_h "RoyJ0f`bP\P(B3sPl6( 2h4(#4((K38 #!033z\.GhZf jX]]phM$D)%"L&!j:,&b;;;X__GC&1l,dEfR8Sϳ,LiRdO?iB 4ŘH([Q iZl{@BQc H)<3ME )A'9'|v5 `I"ζk9K@1}S@J)v2f#J1ہ\"4[X'Ŵ9K)J)!&6"LxW1f26/jmeΆ>}+Les5"a[v6< @k@AI %p1gw08K}y@#}E~VJ]T F0 ͬap8L-(H<'t*5~sssC>p8DRR ///"r^^^8ا>`~Y^XX v fy%NC== Mq>mD~O^/a5vt:|w G vp^.RO5_?Vկ4)#vNNNpzzg}mfjץR)p:wwwggg?,{17_IENDB`PK.OƑPKv+8!__MACOSX/._Toolbar_Disconnect.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Import.pngUX THTHgPNG  IHDR szz pHYs  IDATX?lG3^ND "F)AH@$ S8B!Y BHM%"4PҤA |;ߟIe7{3I?}į6fEFNOO|/| ˗///^N|ٳ RJ!z{\.gǿtRTމ}3==]RRd2@+Jx1N<9P(F,J)8}؏,iRBmAOx=# pӛH7Rch ~6)%|)QJZϱj3Dh֚> )$uY]]ڵku1::˗.5Bc0Ơ& C0Dҁ1&.޽mƸxb'rhi;+uu^cqn.ŚR&ia!ÐVzl+RqL]vŌ4 @)ehrܻwwiA@X,rԩ8ZƝ;wػw/Jd]I0` )XaX!& S,YYYT*QhV4 jΝcjjo" Cc4 bIa(Zl6ٹs'ׯ_q1)Md20dbbW͛hyų$?v?r>|X֬6͛hMLړ],cT*p0Yk<77$BJk/ `ܕ+W}5㠔ѣR,㶭 ZrϟV(q+++&^M4΢4ˮxg".\<~۷o{n^~PGzNTm Q\81xdzgXZZul6ccc,//s-\Ek-x)%G!ˡMj cZȣG4esss֑ӧ?u7߿v fyyɓj:۱|ZK `R~IENDB`PK~lgPK+8__MACOSX/._Toolbar_Import.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Messages.pngUX THTHXPNG  IHDR szz pHYs  YIDATXOhY?eJt驋]YH!ł{̥"^a/{VOʂ EQ^4 F6m&3yI LfF!_ĵ$qV;` :a?ݹDh o/P<k׮#_=ztzjj*A "5X$LƎ.W՟YTZi?ZZ1+ A)w½{r@6JA<ϣG J-?V:1ʄFk1SNcv։p#B?Νc||Rľlt3#C:իLMM&q%^z˗/Y[[cppaFGGپ};F...yVO3)l6sNhnn5B6 i `uuՖeq:pE”䵎8H^P(P*x-{a׮],..JH݌i+5HҌn߾ݻw9rرe"/麫 y@r;fa۶m1;;?~rTk=\1`#Zse,ϟ'uޘ:ZaOc>XqbFxarěQYyb/>!j199Ϟ=ZRjf1 t<o^"b]]:u_^=iQ@^/j5v6 mBDBVc7o>vhhhj?gDҷnÇptll|>Sw?J݃t~+`/ujt)fIENDB`PKѬPK+8__MACOSX/._Toolbar_Messages.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Network.pngUX THTHPNG  IHDR szz pHYs  IDATXWoG1^釨T>((^zJ/ P@JhRhDEG#WDMD(QbkCw&I[ڑ,{>f" ox]3|`2{T0_47nw026w֭[Vտ$9/h`_zgϞ6668|ۣG.V*Cfۋ2۷/q޾}[*JEV2lܸyyܼyRRBJ ":2 !B`rޔRSSS1c 33('QP.PJ9Lal$IJ) IdAX8F&qh6uBR ֢lҥK1@`k-gsamm ϟ?GE0Ƅ`vv׮]5BJ u377F`((QH0310ƠT*(ʹPk:ւ\g'`Rgg8ա9 f&k-Š+\>㔆vr[fR٢D9wc !(cIg4L 2C{ SNrNs[FAV{f(H1]uQ/g`+|@\>b-%2PJKQLLjǀ1Fc Gylݻwt/--˗r vwwq=t:} 24՗c1إi H$Nia0 {AV )j.\PXq\ z1??7n|1a0<0x{{{qDY!Va +!*ͺ+gJ޽ EiE|?~^__h|yUY>;ʟIkpV vC%ׯSa=aggtv12" `@٥OO6@5IENDB`PKloPK+8__MACOSX/._Toolbar_Network.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Prefs.pngUX THTH@PNG  IHDR szz pHYs  IDATX[HT?kftFRNS/ >ZckEP) 4"("Zv.%Qͼfqf^>u=޳_!rR266fw@&'' JJJֵuH)5MoдY*0  >;v}:ĠiRJx<R! OJIjj*Ph4J `jj/MRRw&0<<|>&&&,17B PDa!|)))\t<ׯ_СCA<RJ˹y&^Yd Ghb@V4ce>}jV^Mbb"o߾EaG"hllͣGeeeH)Z~l:o+AJIbb"x<ٴi~!={F[[O~n7EEE0?RL~~>]]]TWWc&׮]#=="tD͉ #d qJ0WJ͂H$磸NA:J-$?~IMM% )eLh@JRB!rssz*x񂉉lL04>>~@ee%555 0zXOO֭ν{HII!/aX544 ),,$??ϟ? lꝵfA8c Xf vܹs<}@ iaO] 455QWW@YYso3qEhMF{{;_`jjǏgoNff&a&}}}477`\( ,HC'Z]יfppp.M#p%99Q:;; Bnz wae¢irrrԩS;v!ݻwmu]gÆ >|>|H}}=i m465~||L._LRRlٲ>p BYYY\p|Ͻߗom(1LŲ,SJ~o穱zwhoo.^(W\yɓرM͛7J|  ~;{d2>ߙW"_zӡCn_"UUU;d28B,_JR@GLiF*B "PYYBA9RJ$ "#Du4Mq @,RJ ÈjC :Ϟ=Q,eyfvmY6"}EI:ҰN9©SF(^)%EJy!SSSƍ, qq---r9t]/ RJI)K ۶immerr۷#d2 9}4B) Xyb1޽yb&---ܿ:zzzx!xu`6]`]ɟm @2LNNd\ebbd2ɵk׈bܹs\.WNseSut:(quĘd2ٻw/ÌFK dWuQJ5($ϳe<>|@4 BnPH9REl/1t]toߊ«P(2}"S]]M<%zEGae0T}ǡX٩Twa|>0,:/_ RSS8 "\c5 P(iڽ{7\ru1 uKIJ,588HOO 2;;[bi ,; l;w,'N`ttx̦MXv-J)[q]ǏsR* _`Yׯ_IRR4 )% ̔`Ql6i\zK.uVVZab1֬YCss3id )}{Oy<۶mi,h˲Xz5tuugnݺE[[mz+_NrB) SSShFUUi9FFF8x`m?~L__ay u1 ,ˑD0p1(o&EUrwxͶmaߏeY?D"\".!˽h.!RJڶ͞={TKK0M?DRDs!oF!DY])%HDضh4`HT)d1_|y'LRJ.ޓ ʊ )]5 r-0aww+Vl[nRdO+ wVuu6 S {}9>>7otZE W.$|{ @ǣ%IENDB`PKPK+8__MACOSX/._Toolbar_Search.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Shared.pngUX THTH-PNG  IHDR szz pHYs  IDATXKhTMuv;&Ĉ&WtF4!""J@`8 0 Kfa` H071hICBIwV,z0 8NU],M/~_QQѴu '''L&LBPRK;wBllxl@.]q=kyy99сP(~MOOepp𸝷\)K$)Fk $\!Y\\[lɓw Zk˲/R#,k}j1 ²,c(ru'@km˲pd20feY$AJ֚d2ϧ'qu[WJ֚^(ՑNZ#$ 0vc J)ypF)Rۑ1)%tV, 5nݢT*ܾ}[|R&o]__\[I czzz~ON(ܸqd2ɛ7oy,--yseC @R镉y틋9qDQLNNC}}=`\mc:?L&CUU%%%e#H022/'>Rj#GY^^9&ɰ}v?9`~~ve2,+6$ YߠqirR)n޼Imm-lP(pkP(yQ RJJJJRRPP@CCTVVRZZ1; <֚h4JYYP^^eY].B5B|x޽{,d2 w 2>>1۶Rdd28jRCTYYիW)++#G}ŋ:tx7Gf0sQ WYE6%377lx8κeYR)Rմ !=S''8Y*vB_=r.2N$6+1& p\F),,Bv`C߳I)!ccc_ y]k``ׯ_nD"ܱcm[RJv۶eYo̾Y7Xϟ?/^1~d$Ӂ.D"IC2|guxxJ9ufXދ_AsIENDB`PK1MPK+8__MACOSX/._Toolbar_Shared.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Stats.pngUX THTH'PNG  IHDR szz pHYs  IDATXWkTG|g{zȒ9iOi<I=%У()PAţ( PA ha7oНmƂ93G #_wwwJ(/7HZJ9<22S ;Grq۷@ҥK"Pke$ _&&&s*GZ|ޕRZOIM]">ݻwرcLLL|e(?+tI <33&^E`?`k!"`C*,,RE?IP*X,Z]!(FE7oD&{aJu]e Q(Zl?AׯcuuT ZZ ) ( ׭UBT*p2 DZBA-B̌fݻFT~ͤ!(Jv03?~5(1"=B__ǁR Qa3̜Rʎ0 x5ðj1P(`nnRZxXqvq !f199krq0??qۋMQmIE,fLOO+++(˖XGG ɓ'8pl>r,Ō433ӧOcjj ߿Gkk+իWJӃ>3g [ۖ1@%ΔfN188"˗/L&ittDdϞ=Õ+WC>*B d/^HR«W%\vZ!p]M59۷o1;;raϟ?8N<\.t:o "!Ȁsf{@"dy|Çq,//u|ٳg8ݮjžb'N`ddl֚r0Į]с!lnnZW,gf&ff@A q"" ¹sw^lll=~6*J$0Zf֐Rb~~fzKbf9459066;w=*PJ* !RLDte455}X-!"(ىl6 5 RhX, +Y,ddҭ+Yh(ݴ*ȝԭt@bf(s""\zsRJEDXXXXxxazeeoqpk4h0wSqWI:tЏJoݻӧOZ85b^%o-? *IENDB`PK1PK+8__MACOSX/._Toolbar_Stats.pngUX THTHc`cg`b`MLVVP'A P€PKے+RPK+8Toolbar_Transfers.pngUX THTHPPNG  IHDR szz pHYs  aIDATXWMhI^W83qĈ .I $7Őd^zX؋,ܣ(FA A(I!1dud$]UotL˲鞪WG`,E'0i)@|?117l+ 03޼y7nի4`o/\0=99Yd2RJIDvYW?^xq\.lOLL-#JZVӧ166/6|>)e6R'"'֑~ڒRX,vt0𘙅AJqH)ѷADZ[xƀ!u]^XXgPT`68pD  b֚'Ol6:{,Ν;+Wm("!޿WF}>Lcf L:cPJ*LJ)eq<}7oDTRʘ/a3Bub̲0ǏdB_6ZZRl$0smXZZ<Çɓ-ώRR*`&8GZ|J۱j|Qg3v*c{{CCC@V٪Ϝ9j 4 ,avL[Zhj4ؿ?C8v>~"2  "ɓ'IN:|>fF+QJ)N2qQ0<9 @Toolbar_About.pngUXTH[THPK ,8 @A__MACOSX/UXTHTHPKR+8ے+R @__MACOSX/._Toolbar_About.pngUXTH[THPK]+8i  @IToolbar_Bling.pngUXTHqTHPK]+8ے+R @ __MACOSX/._Toolbar_Bling.pngUXTHqTHPKi+8 @= Toolbar_Connect.pngUXTHTHPKi+8ے+R @U__MACOSX/._Toolbar_Connect.pngUXTHTHPKq+8:J-( @Toolbar_Connecting.pngUXTHTHPKq+8ے+R! @]__MACOSX/._Toolbar_Connecting.pngUXTHTHPKv+8.OƑ @Toolbar_Disconnect.pngUXTHTHPKv+8ے+R! @__MACOSX/._Toolbar_Disconnect.pngUXTHTHPK+8~lg @V Toolbar_Import.pngUXTHTHPK+8ے+R @&__MACOSX/._Toolbar_Import.pngUXTHTHPK+8Ѭ @&Toolbar_Messages.pngUXTHTHPK+8ے+R @,__MACOSX/._Toolbar_Messages.pngUXTHTHPK+8lo @-Toolbar_Network.pngUXTHTHPK+8ے+R @2__MACOSX/._Toolbar_Network.pngUXTHTHPK+8ӾkE@ @3Toolbar_Prefs.pngUXTHTHPK+8ے+R @:__MACOSX/._Toolbar_Prefs.pngUXTHTHPK+8 @.;Toolbar_Search.pngUXTHTHPK+8ے+R @BԪHѤ(AرG}gf>u0/#f9Ȳ}{nD[W(X F0c)#M`v`U~MN^u Z+3QTD!&&صg/nᛁ[N_I+UݶgԝwވIwj5#l^w>k;Y=2 3$l2']FI)([;m[(3oG[-ٸ.ֳq6 AQ P{>s<b }x'O)OLL|z29y w 6[iy˸aV޹"F[ fv԰8E vˮř8>c?x?=P;~w K1>z[e:vuvvȁPU ӷϦ_qW_vvh}KcպQ~MW+_PtOfM+ZG?^+O9?yС@BAy3>W#j>wcՇmLoO{Gb{W(8<ߜXZ /Gp9P7뿌GcUO}oZЦȰTQTO " sCԱ]+̀ڱê!| Vm\z{شvi5p:( ue?xx8.߾WԎVwyg~.ZjENtOSd[/3[+ke覛ZG=j/ۼf*z = e/UÇj3W괏^߿-oG9:?fDs>{JWmψ\=->v\s:TT{U`:\)U}]DUc):<b8:oݰcJ\o_?P;'?ȧgο*n}@)P4Wi`VALRӱ 0OQh; Dhkx(ռyy`8yۡ0PU ~[P1yor*g~jT;c7 E2*ƶ8ަ O>sa]sP5(q?aIVo`K7іzҨ3}QGէ 6$bRץ+gOˡN2v^Q Hk\8: x'5W̳u1/ X]JtU(?ԫ5ih|Z L|P+uxyѱ\iǯ J qWÏ}X!6E["K=јJ[kSM\XSoW8+fdrhL ±nRD5j :̊SiA]gB?W O#ԅ-+k5txiAB`t7C#F L7jokDԀ*gڇjc Ѿt"WL}5Egzm2ZZ'kZzq_$_܄ZkGυL[Sb:+$XWLO$A̛If:;C nrRݶh p.əi>֌$`lUg^pgw7A҅:Jji"-6",:x`P<fo>gM/+z <|b;hZ fEj7ۚxBR!sBó;ZE "PKhɁJv6chr W% C`iAhHE0!"FK|VҎC_cr58ԍu :$"py~c+ c#_QگBzxtS[?0j<{{!ґ6:s(PW4?E/{dkG!1ϱSBBZq̼m.3;1~( G{$&/ٽԛew%&vΣO.UD*.TytzCˎ7pRcP@4ѫ҈ T]4."H {f/?Yb~Q Z^#%UW^ftj u,/-/p:CC A g$YLUIԎ"jD6Դ).q'3l3v \f 2RM44VZ TxvǏ{\::VS< ϞwE$IGfz%{z~`* ~V |P.,VW4JSiU{m){z7TpPDWm$ ?>%hi\ GJ.̫fX.k04M)&'Z-ؠQ|H Px_}(Tj%0*n &ҨRa)cW22.EAR c7ЪOu)ڵF=WeZKADTL2*h-?NLke'kr-<$r9%`QEPE+]5 TŘu?&IE))Q*M\6Of9nkik?^AjSkXJ_+PI:i,Zjsԇ> UҕzlDREJ__Ezq0e|v mXP t ~5h"*))L<D&WD1a'Kmo tF3ΟQ#6*%߆%Cu!* (lT>ș8h+u!|*h*EV:Fs?[{kʟIP a+AUhU.Sʔ̧]ECL1} /湚'J?֖ {YC$HRK2 XI&4!N[LK"F˿CMLoMkdmJhVoWVr$ikF)^uI\S<0l0Y,ؾݡIVmXJ83.2?~jahb\sr“(> S5ʞҟMN4 gZ2_!4 ei ZךJlXZ*9"3 UL}֔ 12 bW,Ӯa\ _Xm0 /[d&&l3gRy{qՇqXu^J}E}fTS[ْ:j[mM0-hiM^Cx%#qՎՇ<o)ľte. Bևo7h D4ĚtMvt= *|%jE$$a_sr!(~F?ҮGT-HW 2]L90UBtjX%Y5͝-DX-YUْ\ Pnۏya07l5bv oY 6d f s쇵e4+ONjD RկvF&O͂6%ImxvA r /_j`g¢#[Cy*;9l)7iXJO&D>k$ٺ4J r=aAzʾI yl3_->}&A f5Z\}O"E`;YO_iF@QXe~%Sο'{b6qpD2T>7#iEAzXkVYI-$O}Ydt#5HM &&Cnܝ$wlL&Md|);ܫ)8`@שr3PLߎ꾤ްjF$I^Q]M/4hͲV/)ċ3}0}{M>.MHW^gTCCg/ %Cd2&uUUsNU9]S]1>8g# -b)'2bhxSpζ3SkT,;'1n^Y"gj$렦98d+N{w%_z&ee/6ve˖;8:0+[K%1F[5&VYjDwTo;>;o>rp:v^yֵjrdȟ-yEh쓀솟|Ta>|:Vfz4^ k ޙ_O$93/G#}4~?*w$kQx6:QƟO 4AT~,{cqw˯WQ~1SaIENDB`PK,ˈPK48Client_FairRatingOnFile.pngUX XHUHPNG  IHDRa pHYs  IDAT8MMhUs8I4?mBq㢔R(*bş E7܊ ;EHM-b&3q1\8ý}yP9Wyhi!i=jVże.^왓tSw\|?>/OMUIYvmlr}p%z '/ԓxB(*@i_v7/nqv3_bR6p%[Cɱ'>K`?LLLN)`xףbkeB%ӣMXwƒx,Kݺ hZU٠TϥiDA£ /iE5cIQM=c &xROD2b='C$a$ `t$|@F`pwD@BY tPk}> +K)Xs#I SL0B]T?WB|%=S3#Y]Li4^v8pӕKkkʾ鐉aAkpZN_"<;"jX{'@*[1W#o;"ߺH(/ٛSJ% j,_اTjw7gN%ljK򂢟ťW:.1G P#IENDB`PK* PK `8 __MACOSX/UX XHXHPK48&__MACOSX/._Client_FairRatingOnFile.pngUX XHUHc`cg`b`MLVVP'A P€PKے+RPK<8Client_GoodRatingOnFile.pngUX XHUHJPNG  IHDRa pHYs  IDAT8]Mhe73L:&mQ4j(UpKKU(]P\qB uBD`YTB@J4%]ILgo{N(z9sWتI Sx^c<0pl8 l(_^X_)diAEALO>?̙c{F)$snHyh}s4Q <}#o3~o8C}C-"R =dg+%2?525YL-nI͇|ȦoJ[VEvfqJfun_m뙑,o٦bU@{ RT*;W®㼟UQJc+AF̽Aop|X l:ȤKq']ϣ+<LQUq9Zf>^7wh$jv\J&_i $Št|L7DH0ZL&Xl\1iLMC؊a;ܥҨ0 Q7),vA{bU @8 ToSzPiT]Yo;=VCجbSā!.=l!+PY|3؆A3dW$`.닖W{$_K,-㵋 w6P]17_(}/AD#Idߋ4k=+,1ޥ u˽lKOl1ufo/f6Ϙ"z iTIENDB`PK0ЮOJPK<8&__MACOSX/._Client_GoodRatingOnFile.pngUX XHUHc`cg`b`MLVVP'A P€PKے+RPKA8Client_InvalidRatingOnFile.pngUX XHUHAPNG  IHDRa pHYs  IDAT8eKh]e9ml*|߮#fd=s'8jl-צhrwåh^P\D::4- V'.-I+b3#V[3L>|O+:t?,f-@4L4 @ݖo䂂`Q1U,XT@ؘ]Yo^<۴8Zrߌ_ރ&T(h i/]p]qk<, 6L%^> 1qT  X.퍿H|T}aI|D&w(momI(Jh `}P'p@s1`Ϥ? hv= @_Qլ$)M,tP Q_BTxAV PR+4'@f:v38~ xfIK;:goZ'L]gyF-//ӧ˴lc3J? r E`P|c=~Ed_|/Ż^yHs\M;; ݆px{6N?|{/^'~0} ~쇟1FM8z<|ܜEY\l|~ɓ~}uCNbf'snn9b e;󛽗_`sT@h?zc\zЏ'֛ZvEo~x}9 f\숾mQk9 UUíx>| ~s򐦘Q-fr,Uj<( pWSs5Z]gGH<ٔ d=GewkVh Mwsο<}_ m iMe ܣ%5hR}|\ ȠP=Ob Aol~>XAі'6ųo:&&v Jv~YJY} P-2^+##j!hJX*K~5A?^IGfY8"6jWY_ 7uIi$7sn?k[y>Wxh@#yeZh %lIƅS^ʟ[~k/3 w8*?,^ou;GfVf5Ff|Iv '{gur(k~+\5F=^7M3qqGO|ٙGb&A59a@ ]~apoR z@^Lf#guf❝هLZ!!툖Ȼlѳ֥QskCwKQT0@ h$i)i҈(p;BU3uiͯ3?=xFd,"Lc,fL#,b*Z2׾_-w& MIENDB`PKٸ PK:8__MACOSX/._Toolbar_About.pngUX XH VHc`cg`b`MLVVP'A P PK!-RPKV8Toolbar_Bling.pngUX XHTVH1PNG  IHDR szz pHYs  IDATXK-W]>vK"h.J@P2p ND'8 >B2 q4$BH'$&}o{O:ASRPXk_xK]3`7{_?׾rW1y}{y瀱!/<>dR~;Ƿg3/prH~3ζq1?x{˾ __PжqSK/-ϳqŷz>ޞ=lwGoVl'o>wzzZe'|u/~[\~Jx\b[R:uKGXGW?{GϏ#=IP|WbJ-OQ'Vk˯{o#G~7{O'k#hwuvJ7vn_O}+;fݵs~^L;1_h8}SVkQsHxߙ_Z~c~iquM{C.j\t=[Ā 7Å\rAg[)էm7v YF̺pzRhp RYJ\xOj|0fCNmO]m_="l# mX)SdpcT4kv)-14 &Tkr}כTjg Zu nNLn nyI% O..Owi /wع5l"]$)kZ{P.]ՄwBSM]n%#*GQ/ۉn7 o39ݤ){4rÛXp0(XBB+ Z/o]U\(vBYK9{ 1daCHG\aBEVXPje׷QAq>AfM%) ن*%GQkB *Y(Zm Շ`OEG]&gsG(w$QBڱJkd+d[XB@ԛ+j"QK\mF~;G:tB% BPXPba)D)`kM7HޔsMnwO~WL{]mok\e+)t #<жŝ3\yD;xN E %X!r %E>D.pCSݾL[MhSm}m^4>:xq!*TnE "} )x}f B@ Yz@qw¥C> =zDBńұd\%d6\arp"$@ǴsPťaZKv`AH=˹`4}ZMp8tdpSRLgL;4b:Iha1ε0P353{bI/Nc' Bh`vL[Y*,axbQ\w{B kb>r@&gx*3|!: P!Q#7Ե^ Bג^GSoLGO/xeGp3 JY%|~%I?aUmt[RY놨۵ #D̄S\N3O2b|v( ʿ@߇k~O1[nj}EiKwhyM.yr$ʋÿU4] 5#_ o?z38OAnX"T-@)NldЯ$lQJZJS #,#KuTL% yU{> ,8%xyoGGGe ('vsu͟bVbjr9~J)bJ8XxzJ__J5e K NDYO|8ڀ8Aᄝv+CAHQWSRa.GA9Si˔SOŚ (D>ӧ} x 691hT?ZБ n%i{ Z ʃEY`]Q1$Rkٓ)sשS./ۋ#ֲݍPHK1iW9>̴Q^O2a7s\vc|>:2NT:>DNv9s&a~p`3j4M}(xdQN $!wx2b]|%!rWmj nh8rº:8&E~:tX*Z}OC;obArSͣcZEA(lƁAhlZ!ƢaA !-:87/8ռ]( 0#HaQLa:fi(F`0/+ V,2c aEDZ3iFzp*~^tQ)q܉R(3 2,] ,YT&ܡ^u~}vK^9_Ӏcc( esgylmXqFzlPd*:,%A;qݚ54 $8˻|K:TDY?\o/@t8׸Ĭ4C~T*(ycxq!z~4Ϗϑ_`QjVѳL7AiCXSx^&|0ZO?rıs^t ʊp8t>}D16q'w"Lu77F#ܴvQ1RrLZ^SשV$IX>^7:0N(Rơs_6ٻᄏuuGt%L0ݪBA$ai$I7eG?|O4#jWx*C]{uSJM ,w}f9i Cû B84(OMM THl h-]Szz29W^ǻ$ h=nu%`-;8tz^8/l<& 6̟B(rəe0qhM`a՘GrC~QQ =-e _%j+N2xE=V ﬢ5o<_5Mʶ#sm.7dƌ)jzy#ElpsIENDB`PKtR* PK8__MACOSX/._Toolbar_Connect.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Connecting.pngUX XHVH 3PNG  IHDR szz pHYs   ~IDATXe]$uު1,GKNX{a@D!myI lH$FR>Y' X$CE^а;_3;=]]Uû |o>0DU @X?/G-|y~O$&\[nțK@luL E1T% >C-F!'dLXH'7 ͛{)4Ç1!*aiD峉J㶆HXN 6FlDagD)ϋ0~ǧ_gGQC{̘ oз &DDm\N >L [ú~퍫I5c vj $1U8BVj،edj*na+~(n?Ȏ=^izwz0kjU˜.*8 X]Z-&;ɣ/GcIh133CfwL bCŹ3CNJ' 1E)SKML&iHr0`GiUHm ssi+q ҟ| fDّcRU(@qX ICDQ6Le_qyUNz(l2??!vU'/û3 sySE=yܠSq$Ðw3H~sc9 =ρX0WYMe\K]rZǿ#"Ξ8q"ruӜix__]61|n6"-@wS'文ط^@tX{/| pkfff>ƆY:_'>T b4=cG}t;GbG|Zmog_|Eáv]+}JcWP 4T*1j:WVÇo{'|2j5Fv#Y]yާC?|Ry6)nqU~a x|>}:?zgϞE[Euo7N: RɴuO? b 低ukv{svvs=8T?;/o$o@:Gtv?|c2N:mllpaY1V<^0 {3gF!=\ PK8!__MACOSX/._Toolbar_Connecting.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Disconnect.pngUX XHVHB PNG  IHDR szz pHYs  IDATXl]gy?{={؎k;qm(mP 6! MHTmLӺ!IۤH ԍ@4] В 8}ر}qBS>:\>+PUW'UK;'$P@L" "Ca]^:!"X7ןy&ywf46q';A$i@-Bj50!%~uڙr}Rc"bF@z[+7jLFSOa xAyA6Hoſ{Tw"fff{*?_=]0;v#{5}ې8G1E^U[Ⓞ@Ж-Nμp5asQp?m>Nd|' @ a WsY C9Pc}0Henwܣol%@fffvjh|RG'0c;h-x[bDUb =BcFZHXc-}=~Μ9cNJqdd ۪c0rj`CTQ\ؽ2k N`RjeꛟoVVVdyyټ3x> C#0G}dHvq~Z\څd)v ZnqnDZ ‘ ?XUU|9[s#2:-d`;',8Lgz(((TIO#D-r( 7Sk4c(9;[KPd}\ qxرxDGzjzĻJPT~(n/y"BEPUܯ~9_wgZȡ,+QeꜪ*"(X{)EY EF},1l'~.|^|E,j_rw+Q[u "dels5֘j^6Tk-q͆Q2^Iԣ^ٲqa٧HI Ϸ?yZ("IV~WSd qS-Xfs}Qh4ak/P~ᯰO-^300 b\Q**p}}BUʥ"1'v300<'"E,W'' fy{x[mW@UXZS4 1 B_{ gi\x{_:sd??+HSӸLU}P,d`jj䩕7^%D{0KgПEw\C:0$xMFu< ':Gh~~u7>nu y%(_´~r/w\i˟äLWi7i/<9rDfggI4#2Z0RPe~U$x(H> i[^>Kι@LOOV,˖nuOX/nKQwHZ].vz޶yTEX򓓓*жֶouSx#m~Vwsh fny|(v XV瞓Ǐ;{/Owk}C&@C&;'_:R=@VT*R'2.}lw3Q:` ,)rNu7n l5Zr@k4vy|WT֓ܝmw;Ӌ|Jl\HtU 1= h^ |.eMUe =0ϥXοlk&pd@!&IENDB`PKG B PK8!__MACOSX/._Toolbar_Disconnect.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPKj8Toolbar_Import.pngUX XHxVHPNG  IHDR szz pHYs  IDATX_hT?L2G3&qk u]Ե'E/肋>PhȪK] JcIdfu93w-a{=G1 4&wXhY +%@{{{ץ?BH)4 !DY7,RL~05\3*98XRJh9m>@.t)hLJ)ll'#3"cdPBA  fH%FB!b< H#"3 GuoΪUO>Çټy3Ǐ`:t8_r@hBAdJrBU8dYV\ɱcǰms lܸaXz5ccc]۶II]-'||Qhvۏ@pa4ׯq={F[[D> 4I$8p˲^#n4A 7544pBΒ%KRL&3gA NWO>sL,˪; Ds@P]Ȩ3\ͨQ@4QJUɽ-eGMZ۞njXyW5KMꮚ^ P|ţG0f^sx>}ӧODGG8Nʕ+;wK(LX%  S# mLOO޲e˟:QJUU\s|zzzN޽ׯ_&h*޺u7{mRʏp5t|cǺÇouuuŋ_mOϝ;wr\ݨ@ٳ2KxiqMӄi¥K8pē'Oa###-[lf<}FGGsǎ-@ Wq?}kƯ_UӸݻwo]|oe ;.-4-6mZqo%s=*HDݻwMeπy ʷﷂ `6Il|eW;\Ep_I۽?wERIENDB`PK#TRpPKj8__MACOSX/._Toolbar_Import.pngUX XHxVHc`cg`b`MLVVP'A P PK!-RPKI8Toolbar_Messages.pngUX XH:VHdPNG  IHDR szz pHYs  MIDATX]ۺII#Lnu= BV\!5i4! @RҌ[+I!]@ݧHilq=@8y"6M"IAz~hq_c{K <26/_*/:;BL̑E298NAV\q^m k]yq"x׸5oJ䖆e/_l3SoLw֥\mǿ㍗dcfsϪioL7/7;b,YU0Yn~ղɛ.OgKb^ \Uc0:ۙ[>Q otC-ö1 5O]Af1yA:W6>W:s9SUq{݊Tm//`6Gu k?5tc런YwKQC5O1G# rY/:aA k\*:u ű\zoiN^{4VY.pG1,%;Y qzT@fP@4idՓQ1Br=U'8Dţ[ %(>  .2z:ʜpqS\4uY8ex-P<"I)DB#i{P˴`hKڏnw4y>~#(}ulK$EՁ1w ^isKϩo6 1kT"_ne4+ gC8z)@ # |wN|0G^Pƣ.~A|&G<0uiE6fOji77t9ZĤQDC1p- Y݊Gz{A/L=S_~{e 6X%P\<fV- z[W"9!/Вw]Yγ'NNi ?Nw at N^|K݄^sׅLI 'LQ=݇ypM^04z`-V $VuvQIENDB`PKx1PKI8__MACOSX/._Toolbar_Messages.pngUX XH:VHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Network.pngUX XHVH; PNG  IHDR szz pHYs  IDATXu_U??ۻv`7< *UQi QQHx%DJxS +FP 5 nH%Bc'^~o&]JWs{{+<=ܔM677r Z-{wW/\<.=}PUh.\tΜ93|)㛛666^P/pV^-pM\צٔzUUglz2& vJkv#efw޹,ϙFJQzmzwimMBg,ihܵ`DL &JHmJz~_~suuu$W^y\{;,* 5>@@n05(Ӯ[ooG Oy?ۚEP,jbLzLF;&hwTWUڭ?8w!'x jfoƷgllGCl˜%ܢ #2ÙXp#0}& {x5>/s%lviif|=Rj G@G|!_.^<󜂲W =9bgI<O`3'ىCCx[|_s> lJ13^_8X<|x@6gؕv᭿:cw,sm\xK]?uzRho/{׿Ka8xW֧µS׮-vyڲ.o,-6Ed|hO"/~ok|ޏWkt\)U^t2氿d0dxsfy"ktDsk[*ZȆww;H/}]ln?\:󄎈ck9-3@veYV՝Gk;cѰ]];?s0GG;yewPv򠻝}ewgT>Vx\a'YL|3 OYU8!W\}988K'dz5rt݅IENDB`PKbN@ ; PK8__MACOSX/._Toolbar_Network.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPK*8Toolbar_Prefs.pngUX XHVH PNG  IHDR szz pHYs  IDATX\U?_lkawe1 TBcC&` +&@Q ւB)m]cͯ7of{?ޛtVOrsg޻=>&I3֍z׍nB jF 綽S 0iu@ӣTpo*zYǘvQ׼"Fz`0 ) U"PtI<6w|<[]= >*וl0K"M5?/;wv_sdh]v,9 5x<l4$[ukuKѿ]6kiA=0~~ V9JՀU({䒇uA:@TQ׳P4pvb!(ŐS{ s@#cs鰦_TlpΛ2oD -.ȥ9?.Pa9: 6'''OMMu* 3k(RC-ޥ wD?Ӿ0Fj(:Py7ն~2 ؞Gbl,ϕ,"&HD⩃. @(%} ձ~fG!q"PCe~/qt%tߗZX?=ī"n  s=̜5ʤFNDfdLh268{n=cH([>߀nZ]OZβpGq{8iDk!&a6o(G(:=zyOW'AH0yH.}G{Rs0E rʈw0nK՞ ^ lgg(&ns|]; \>d8&W}6i] 7a6!7c}5^=9z4[܃%.gcR}ߝP W[ )Q5=OQ fП=&#QHX@jl,1 C(m4jV尟u@UaC, kvA;lh_1_.Dx}1ƔύydZAː|n((\2>p^b*I_i0 /y`{4_+  C5@O4Kuo$RaX;(vbsz9nP盿Ř$*Tb'f<]AU5B(>1a 1/)H~?o0D?""]7,Kx[wfB5xTäֹ : \XE"\?qH_^>ͯMD?iWMK꾩^'Z:RW'rC4L4M EwXsYg85uDy~{Æ}iK֝_G]_U}嶇["X"t8x&bA`/m?/|o7-sU25~id|59Tюeʭ0JAYh;iZEPgZAX c$( #Fȸj䨢J^W\+HMr#zg w~`(=`E^{_vwűm1 Ha)(`Ϟ ??Ak?Eǃ/#kUID ф6Fla 5 ^&`h& XBΙŭZڀ} :%V@@| ŲW;sĉ\(vkC2J}h8,W S^-mh'{MӨAa!a5l&䜭d^R>QwRgLX%DžeY 戥Xwus=wo8Zw[W1+~wzEwN?d#BLDzIENDB`PK=PK*8__MACOSX/._Toolbar_Prefs.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Search.pngUX XH2VHPNG  IHDR szz pHYs  IDATXŗ[l̙ٵ7^qbll'5HdH"iD)Bm)BTTRoC+VUS_P>T-7qMJSRBMhj;Y_j{׹ÎqUg;rIӗstt4H$n0T̙I$\ݹ{~buuJڒ|*|#O #@022h^dP{_s[<ӻE{{T$csUNfw  @ ,kVx{` }[٘lC%GGOSZ陿zQ/@zhK7{ӽc;y5?$W-U8Ngژ;eSoO,}Q>5X&`=& <捘 gVbM.P|I,m:E{-]q^6D.ǢPAɢF I_7bn:d2\.@c(ӊ ;8e24I^ ¨N5Z\_ BF !n@j{788s||)`N\B7W;7(4dN) Ck-"Z 5R҈@4Nu@P}*>p k8-2)LS&SdY)@#ÐP3hOkA4$1@@WM2e 2Y2 1,QhEtASa~d\Tӭ+("eꦣVT45!!4|" zVzɥWhFRy{WTQe4ni686 j+˫KbN||kɓGbr=5?Mlj,Q&mMK[D0q[Xi@W>Ѭ;ZmVXk1\RuښLAc2i=;6R\b__ s#nT&LI'ݛ7lS[ ZqL 1KcHHGx9<\uFo;P[}l_ڌ @{Am[ajlՒ02 ?v}޾c]{;vy$X &Ͼ1J@XV\ q2UZ>ox~}z#N ߸;)ۓ1-4> `<Ҫ`]m۶5ј t|nD6kf~gix?^6n}#_̼?ԉ!@| p :;;ׯ_mͦh4g=k.o'b[ڮSmpx֥>_}鿜5dJgM^(/,,Bpvii)a(@y~螝p:GHΒ)9~=ƾz:v_Hk~dZX} irUZKX / @)w0^k/:V&'ϱmO: sM\@jH%jDAXJ59Ig=7ۯ+;oS`{g3 _`5 W UA\gd-i7*,bJbf2p9nZk:7,+w`)S]]kkXK[ h)Qܥ{{ڙ>y.K~[TCTbQYv\##SxT*-Od<6`lUo9 2(V@VJ@_aZݻToK ~IENDB`PKZsPK8__MACOSX/._Toolbar_Search.pngUX XH2VHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Shared.pngUX XHVH3PNG  IHDR szz pHYs  IDATXŗ]]Ukst0b)1v I H[cB<$DBbTcD>SB1hi"ZN;tftf܏a{Û'w{Z: ݰ>EDDTyXg~W=sהWat,WMPZ3&uT-*iyǏ; ؠ.nk[vc%x0/+M VcU1.^F8 t,ॎ_WZK<,of5yNNgǍwiqx,0)WT2E>r6{A2<6ܿaf}d' ΩdRUةuLe;(w^4 gX\p[r cmf8C3gOi_3T[ne׮]ܹ89z(v{I}ӧOS*ؽ{7>s/p*tRNd\- 7m/{V0 <5=wbbz+ÒGB4}nףd(aicdzaƕx0ԴB6UL*y/|f$ 9RϠ7z78u]XbQ%pZB +Pn1!APs]Qw'^4Gms!@80fN:x#uƽ챐-00g}>`IENDB`PKD.83PK8__MACOSX/._Toolbar_Shared.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPKЕ8Toolbar_Stats.pngUX XHXVH>PNG  IHDR szz pHYs  sIDATXk]Uk}ι{g:m(my#*L|1HEC4$&H(`&E>ZJmk{{9{/?;iCrckoa|הgv $7zRq]/wȎ7nNk7#h@E *!BPTkUѠ@ ATUyf&4݇ޖIws}e`VekPUD?΂W >~_>WK.]v=\mUELאvwSeR{kV@zZm<=am'|FZ=,}酮WE P%.EDQЍ^CP̧k\I6Y)Wɦ-$q¯1n>l^ 6`nݿoJ"g17+Q5>h7532ry]F.[H͂RI 96M370di$+92>(lyuOq ǎϪNڍ֋qƈG,N|3Pt#' IP|Oa:O{p3 ƫ#4JЌ:cYcHū*(!yv.F=R9/B :RH2.<5y@$hi1+NHp`AP0Fr%?< ʊs|f#Be#F1^ZX(JRr09 fFDJ5{ef22YsGyLL Q.[c"IT@*Yx߂8uf4\(kfJ}> Ou!j>2O\GY@4uzES1`PuֈX"k@Dc#u/ b"O=s c^{:1X \ZўqVԊQ+BD B)f(b I1"lYPܼռw%*^Q(&IDqzd?K&ň+WS3jrxZhwZâSC u'{9;ıBo1Zkef YԢ|#;^M""t=VKnG$p|lyTQaXi]80 c#Fo|}1#gJqRDʺ};bAH Wr]HTzcr/4xn jח0c_iu&  b3\$(JIK%#"zN49OԷζw"鹔-kaRg,=_e|He*KiHN_c`!ǧ=:T 1A\-+6XYYSf MMFȎPIK /|t'rc̪y=;}&DI XP1$qS/44` \@[k?'۹sv^8sW=C~4g>ͽ#!+`1x$rظu1b"HoJX((wsZ. ZD{..wW%oqGc?榍!O<.Z&* ..jE?BL3P(}ay%pb6Cn ]!A˥.=zy;5U'7D%7B0KnՅCpSMlb99['FfcM FȲodIqː#BkEwD;9<h! !CD$ fLQB&0\\,=΍7vՃBxx CQ- !.a몋E8 'q+GH"6ЭA}_ ݭTd1ydsψ2^ಏ_:YZħD*[ys`elm_stP%ssO[S J (3Ii`Fzc$A+hO@dIENDB`PKE_PKЕ8__MACOSX/._Toolbar_Stats.pngUX XHXVHc`cg`b`MLVVP'A P PK!-RPK8Toolbar_Transfers.pngUX XHVHNPNG  IHDR szz pHYs  IDATXŗKoE{36VH+,kXYM,1 B"Ny83QEUu<Qn{[t绻~އ_f YѐdW903H<˓ұ(=0Ixo%+tT4gO#$UGحʯVfFh1^_2h0u!5Mk$q%ݙuۋ"Ln'fI.U?~1iّsb$ACQѬ@=!jv"!W0yo(57Dp[@"mmK:+VGe0 W-2DɆjͩΐj>L%nz*GobT5QPd3&6o}~rvj ev8 IPl%͏"b8^#|0(C/AT1  F[yQ4svko<[`f\WJQluBp:lL.]v7NOpk+Q^Ptnn"ٰ 5Rggw=cCv~h ncB꟔ H$s΂ 3ۘL*!<9n&923{R _EUU-(@Օ;dʘLk],8B4sRj !2Q}iTA\[)?^^ͦJ~by,RZθ Gft(?Nn9[6,OCm`73x4|lDF,F/)9IENDB`PK{SNPK8 __MACOSX/._Toolbar_Transfers.pngUX XHVHc`cg`b`MLVVP'A P PK!-RPK8,ˈ @Client_ExcellentRatingOnFile.pngUXXH@UHPK48*  @!Client_FairRatingOnFile.pngUXXHUHPK `8 @A__MACOSX/UXXHXHPK48ے+R& @__MACOSX/._Client_FairRatingOnFile.pngUXXHUHPK<80ЮOJ @LClient_GoodRatingOnFile.pngUXXHUHPK<8ے+R& @__MACOSX/._Client_GoodRatingOnFile.pngUXXHUHPKA8ͥFA @Client_InvalidRatingOnFile.pngUXXHUHPKA8ے+R) @% __MACOSX/._Client_InvalidRatingOnFile.pngUXXHUHPK989H4/ @ Client_PoorRatingOnFile.pngUXXHUHPK98ے+R& @D$__MACOSX/._Client_PoorRatingOnFile.pngUXXHUHPK:8ٸ  @$Toolbar_About.pngUXXH VHPK:8!-R @.__MACOSX/._Toolbar_About.pngUXXH VHPKV8\61 @8/Toolbar_Bling.pngUXXHTVHPKV8!-R @6__MACOSX/._Toolbar_Bling.pngUXXHTVHPK8tR*  @D7Toolbar_Connect.pngUXXHVHPK8!-R @hA__MACOSX/._Toolbar_Connect.pngUXXHVHPK8oX>  @AToolbar_Connecting.pngUXXHVHPK8!-R! @L__MACOSX/._Toolbar_Connecting.pngUXXHVHPK8G B  @LToolbar_Disconnect.pngUXXHVHPK8!-R! @=V__MACOSX/._Toolbar_Disconnect.pngUXXHVHPKj8#TRp @VToolbar_Import.pngUXXHxVHPKj8!-R @___MACOSX/._Toolbar_Import.pngUXXHxVHPKI8x1 @_Toolbar_Messages.pngUXXH:VHPKI8!-R @e__MACOSX/._Toolbar_Messages.pngUXXH:VHPK8bN@ ;  @fToolbar_Network.pngUXXHVHPK8!-R @o__MACOSX/._Toolbar_Network.pngUXXHVHPK*8= @-pToolbar_Prefs.pngUXXHVHPK*8!-R @wx__MACOSX/._Toolbar_Prefs.pngUXXHVHPK8Zs @xToolbar_Search.pngUXXH2VHPK8!-R @D__MACOSX/._Toolbar_Search.pngUXXH2VHPK8D.83 @́Toolbar_Shared.pngUXXHVHPK8!-R @T__MACOSX/._Toolbar_Shared.pngUXXHVHPKЕ8E_ @܊Toolbar_Stats.pngUXXHXVHPKЕ8!-R @__MACOSX/._Toolbar_Stats.pngUXXHXVHPK8{SN @xToolbar_Transfers.pngUXXHVHPK8!-R @__MACOSX/._Toolbar_Transfers.pngUXXHVHPK$$ aMule-2.3.1/src/skins/gnome.zip0000644000175000017470000013021210676261004015234 0ustar topiusersPK u755Toolbar_Transfers.pngUT KFFUxPNG  IHDR szzbKGD pHYs  tIME*z:IDATXýoEǿ3k'Ҕ6JشPҪ%EQqĉ 'q@i#qPT@*(hM'q8wvf8xmo]MH#5cϼyf6ncmygYo ??| ti䧾 MU?qx_-==S?m(nG %bTtfcVmv.OM!a!@D T`p]܊ (ڢ瞎|J~jn@H(EnթNG:[Ċ1hu|btÌɑ63 N}N֥E]`t<t B.mݲix65_t ?LgDR7̱t$ h4rG \Pz<@<\5^ej uēe"J8qɺnHnzPq+PaJ෹>XLvjw )RVmx`̀m M'/^ P{; tj=l#M GJ0"~ -2 j*e\tiaQskysx[# )6@ 4E8!<ڕg/"s{ k !vW7(z/Ul6/fLnG0vXcZ|Ac`fW q+kys .|6_~m)!-Z_8mòf L\]-gK3iNIQTHfJ)+ rd&]O/HHq APS8Lߘ!Y+] R22YpCBBQ\`fچ/ZDW/6.4J~j"ՏXs*JU0+Ko|n5LA`\x$Q4-ʛ_V \S3^jIoUfYAP[TxK~W'\.gB"6IENDB`PK n6^^Toolbar_Stats.pngUT wEFUxPNG  IHDR szzsBIT|dIDATX[l\Ws32B q]%D Mb7 \TE)H J7Q!x qqcQR7riƮJIJI휳3GUUK:skYZ{o_ 0+*H,i\G&a0|ϙ(N~+_D)"EO1=HgOc5^:؎ +LS6mgOH\N"{ض]>h8A22AC$)Rd"Po@6Pa|rǧYJ̐M֜ "Jxܣ#H!&SŜhhr᱗{oUɾj2<M^ }}ٷD+ _k(4H{b:džIӖk0u vFD4o\dǎ4M`#&7o.Xƶ Xͮqmۼ0"LNO D)ؐjǢڱ:60 gǮPJ2/⺋o41$df%iAG ͑ɹ@ذxUx#>{󸪍nI>Uнm#䔏 w5d3$Vh;oS | S4f<ѹ/pWU>J.DA28E '|vv:YgԱIJqn2+ŇD.PW2Y#G D[[Blm!+Fnsnr5[)Zwy}I wih@X?HgBgb1oğf 6ozm̋gdfn_=k&' 6@9"r&|N-JOP۶;C.s_Ud!O)2~@Fql3gβ^? +)(Wɜ ٕij(;߶z{гw/W~+o_灮Ѳ-,ӡt(`溦<{}nm!"^d:Rzbm8Ny6R`Wk<(D?Z3`D]ф0@{G?DD'd/> a$uFkk_3}zr9ADF S}Yyt:9vtDFAcv]2' @F6֓Y E R*_*4.D%MUf)ihD/3{)~7P>IENDB`PK `27'?22Toolbar_Search.pngUT FFUxPNG  IHDR szzsBIT|dIDATXklS_b'q;'v\HیP.c֮S'ƷҾMj>ôI@L6nT RlPi]K Il_7b#1ڎn_OzG9|>o-~(]|܃CÛ59A88~ƣ?]̖&#Ju:L*vdgWP"'nOI.qʘ.PWg%%(f`cXuH`ok۶u:;%D$B(=$icr:} ZM&⧓A uV!իe$I"ipsD))5VOŻd24(ݍsK9R&&GS+WwݷےӔJ%dY& kltDXCO_g,Nz]][r>yV浉W?\ttnݶI0, Z^gX1OJP)u6[zʍk^ "={^pi|YN,~T(ȵ?  Ubi4jh$5>hLD_T e.KaewY4U|l93ss9BJjBYU/(6@<@[Ǻ:OLHxyƽ?EQCRZBRJ_x&{PO_MMG*4M(wKcLR:O$@㉭>tgϞe׳Bpq4`ΝGb&*H4 mTD#9 ˅Z266Fuu5ÖnrrrΝǕH$b|>%D-6=M2 pc|TV>ĵ_q9x<4"pMK{  g͹{'$۵8@mm ז9iBȈ]؞=@O!UU  H J[[@"LMEIfijnݳʞ^}W``ǣa.^H__`˖-ɭ[(!\|O``(gΜ{v` 6ݣr͹?a):pzkq=^~PG[EsX㠤yG.!z]݉Dq9-i >\ }tP(DCzaQUUT ;UTItfiN'Pu몉ƢDcM47oꕫvkK066 _jyBR?QKO,**`(ڵzݕ1@G+H#cPS[kK$f[M(*%wE(dSK󲻻Wv n߹;>tq|^29t :`.5LnŅ>aÓ/)X)-S h lu/0WDZiij\R _:VQ~yK_<nE`W_m6%D~T *t݋n/X ɖ{M/l$ITȔXy cvY!(ʕg/v?|u*BaCoOF05%J~" RmNG~>pH/tpW?@B20pI RtVVѪ6)b#IENDB`PK ,_5? ? Toolbar_Network.pngUT FEFUxPNG  IHDR szzbKGDtIME("\TIDATX͗Y{{g/ٌM08KQ@@Y^""ey QPx,%2q,8F 6`g<=ӳw{o{dQHGURߪܾ?.\mGUDGmLج dhi3gGFc+,]m/U6%EM"FU,B3-J9[cN]VGaY)O޼ιՎm[L{-V?Q"ymډG-k(9C'cx")|u[ nT>(C=B}}qGǶ&1Ǒ~;hWcjo-1<Ѿ&n_!1r^Ҋp#Yc;X bHRu B31aڗe >λ@?V$GZ1`(Sωr"m[XR4qwYo s L;.kHwҸV$!!Gz)0 1&DHmKXi24$u@:@ut0V\Pd`%a6FhL]G*Ol\rjU& BWwXi1cGQJR(}c7Q>0\؄!MhbUTה RH>W^W"V"Ro;Ʌu$Soͩp]B0 ۮ>-s]kTLbd)BTʲeWӿLEZBXL@FΎm,9E䊭dHȰd2e%,SH5&_&^ +ɹtl `81pi9ec:Qe19.ﰾM2MEZ>^Fԙ#Ř/TQ sEb rJ͛kV^:i6U t@TJ3>ʾ~SU̸P c$lCkM,b33Cwm %q*19HRKټfwe,9R|LˢFg:mE)C}2tVsnq蔨H)M#ȓҬ/włL4A@TFgp{ڽ#{zSci a\]6Wyi`'KXn P 4b3JaI5{v, >d(R*ꠍś~W]qֆ8~LD)0~|lv%NK̵iHF$ >ew+i?}dwêflKE1.Щ-&@@A*h6M5+9rMz% pq-IgH02Ձ֠%EJQC`xr?tgxdRR}_zqFhI8u.ϼwmhw~@*['5ryIN vƦtocFP4uT@egߚoA"Nʹ7mG.GĖDhޡ^~ e1B~hNuD"-rfQ 0ǖqfgTjo꽗楇BW>}.R2[ԭ޺ M 5>p#6m(M0󘚚)^~zWo+/gL%OkpWoiyK$x# BD C?27thne2e(~+RTrų!`ʩd=?#iIENDB`PK 7ΘToolbar_Messages.pngUT cOFFUxPNG  IHDR szzbKGD pHYs  tIME. q%IDATXWMH+W>f6jQ)iPPE .K㢏 -d6ۺۂtyBeGFF$OocLf‰̋LBÝ{&;;f){!DS2 ˲^1MөںR: @Q4 ft tzk@n@:AMA b @EQ#TzNpcRZ p·666]zmYB0Z 0B5d $%h066V+CP+S^E!a9 -MMMP.&-s>,˪ȭ~nM%w'*"zio$ZgX#MAī~ (`Yhc 8`477i ai~nِteYo)B4M?O 8Y#V/B7n%clskkk(|P(|1??Zn67/\EQuGTYmAANNNpee叉~?55JbVUEBOuj^U'CCCw !d/)@Dyܖ,KB,]B$ =H@JipKK˕XMӄr kzzz*ŢsPg `W)%LBAlnn\.p6MRhooOù.)d2ggg*ts cB?_[[:ɬˁv( !%b=88 LZ RN6;;I$ lV*"Ӫ]K2D"or?<<3C2>%II9іP+ S7%}kRF1Mu}o7z8ַ( 30oC3MOO8Kmc-6GSfԄ<҇XĴӑ^4t$%ڲݒO{cu#‰uO[2GN/bDB$auB&9izs1N] QÐhjBA|e]KZpm3FHBB IHv| "$IYY477d/al R,"XSHkc-'m\k@!JΡ_=]E$k 1fD&JCD@ HtAZZV5x7q 1[v6q9Kqp8t76dPdtN{n=;'#LhrS1>O',:P&Fƌř_cMUe 6SN޼y]u)}-j%.6K]-Q"pS# 7#78]Rί'nv ]$)}.@M`vW*.C\n"D.C%9OkJ]}p(Y+C/'`:j'rm97E$@$8Z^1I#WC2K&dܲ+j+JcU̟O(F{#Є!|>R} ΂/Y 5CzPbql㓒2-SYZ/2əHo?W|uHKKf̙=FN m1yl^=/&]'X5jg/T?rˁ駞F:xAvCnn6P;s,YL:21D:1 cF~9ذ!Uu$?- cmJDz]+1H_'3#w}:U5U[-:VooB4zmR))9˛oGg+oaífSxJg݆fp0 .^(rQG:(7x^~[I_{ⷧ?7;c8^Xcڼ/A\{a֜)"kLZǎضݥ10Љrziő:MӰ,놇2e\(-% D(NL.2,zyڀ%IR"#e(-fQ3f|1%%eyWBheee?1pݥn;{n@.0XLMIENDB`PK n6UtEwwToolbar_Disconnect.pngUT wEFUxPNG  IHDR szzbKGD))&r pHYs  tIME(EIDATXMlE3%Nj4!9T@D#@(E(\(p7sdA[ᒢHPs4DO)D/*!$ "Q%(I#7(Na׮8'4;?ߛ5MTL<r(2 x|HتFH[ PJI]^;Pl>)@J&Y q7JS{3̕@ Q>y"A(tw{ ,N Esiژ9`َj0K$F8}`Γ%+drCio;EsI$.i ( & &q8[W!.J lU >}vYkkƎwp醼0KױX,Db6M#rR8Q`l,ui'fOwur4϶6`9 ޝP =g+D|;,r쩣|Յi:e1龎puSSS~-!g9dmO,%RFY;C{{/ill8@C$][wқI0XN/"`&폵?|S&Z|ϓ|r{m ց(h/gG Oկ8ҋ1ىKa\>BM>:̌0]qJx|]|~ JAfk4cc$XNյ`# yP(M](z:Mdo4q{)E8X3 6b&lDBN`p8f2Y~:Bf6K.#͡: ԅB6 ?~/S1+Py`pJ׀ɓ/apБ]Sph 5R)XՕ3g>\+vcCxk]\pf2Y-̴NL pI)U/ր9ojIENDB`PK l6ђToolbar_Connecting.pngUT EFUxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<gIDATXŗ}e?ٝٽ۽׾DѨZ`5hFCBV^B8LKCKmc4RPc!ĤPHhilKiH $"bZrw{3?fvv*<ٙy~<Uy8ţ"v֤,6YQòPu)Ť}7qjAƕQL`eWn /+]Z1hn6"4*U fDuXB)Ó~噕7x)45o ip=$?NdmDM [P}Cwm׮Y3.RŲ@,A,iwQ5F똫49Je]\Al1 gK l[l[h*&Y? S~IٰZd;0?2OԓNa.ǂee v,.Cμ͍ KػP "lk^It~) !M"n9oK#swʪO}s=難D6]1?q׮֦abeH2=A5J*&T  ,e(ʊב8ׇgi҅.zƶIc;h;"mpz@IrLbGGE@(t } g>H_>{~x\gvʶ+^9)0Z Xӓˉ+KQf$3Imڊ(C0a,-rU̕pm%Ҁ5I82τbR l|OD6/x Eb~ρͱ6&똹qg#h3k^Ժ# "yT} L0!T!,Q L# PQT0l2k1oqD_M`0F1FFi4p%!Pe0r0 ?Jȅh (2/_:HeσzU Qe44m֬[\;bz}6}L`e8i%j jLF;P h`,ǽE@\Î0X)"~ZNL }=C{ڋQp;q=Od;U^.jE1[?xoC[zomB]xc&Q*͛Py3q fdCv-^9z7B [;3~bjpyG$ynM !j]\8!|Ū50wl}<><ͥxa녡bK쾽ǙyGƱ9;~m]qW^|T X icT>1'YGb75S߫Z{|UQ(hv-^,~nWrWEtѠ|kpLRTtƳ&@o_X!/*JDO႗Y{ݲ̕#m[v+GMUkՠsD(?ۮMnvɰ96aqqit@JOQޙcl3,ѹ~'@|vSfSW Vz hFR) ehe|z&(+/Mp|RN0ZpK:!sz3=6)fsNUAy <a (- DE9 "^ 5.9VIxwp x eBt# C7 H=@pk77hĭ4_7EIENDB`PK Wr6aToolbar_Connect.pngUT ZFFUxPNG  IHDR szzsBIT|dIDATX[Lg.k\ 6d FtEZ)ЗjCVڇjH]U}jPiDJza%"LVnl15YJ~ҧst3_ȳ`mEQHW @4xڵ杝wۿxV[;vzU|ABȝދE`#EQ۷o,>\O?oih AAP-zpB0uvv6P($,@Mf__v>w70 ]AQ,ܹh{UU?{nzx9\6 [0?A[P0LАI񱮮.oaqqQ~Μ9c%0j5M,E 0 q4 MMMBOO%J]> ,ߨ*xaLMMAKK P.A!MhooGXDPe'NիWA ø~-L&fBNq=gnCQ@ڸ+!ɠX,brr0 Q1?d2?|{/ `ѩT*ikۻQT:DQD<GGG1>>x| KKK܄r_Z۝pP=f;wށrڭ$vE_ Ah!DQaeY'7o>б{=)T\֒Yt>}*$DQqD"@RP((}t:)YVp,K C TUDb ][[}>"P(vVjTlRy^Q߿= Z2qT;LoJ7Wx,p$I21 QHIRyQJ+ù9UsiXRY\tyEQQa ԛPs~5Ƅ 4O]U|~m*+ƾ`_> {uk2(%ruIENDB`PK ˩&7XddToolbar_Blink.pngUT QFFUxPNG  IHDR szzbKGD pHYs  tIME >lIDATX՗Ml\Wß6`ŵj*,X ME."Q.XEYeâdF"TAB)QI*glϛawDZuÑwϽ=#]'{Ű]jfc_*g9i:"מ$Qݻw6NRDfH">Q#3ka_'u0;wdxxJ___Osu( j"5 #oSJ Jsn+ fV!"$`U%%z"C A a&[WDwJx BA-KlxRIz´ APy^ͭऌbAW@q !R[()!~ HTb9x/gi$PDJyⷊ-JI{A؍ձXq YCd(l#A<7w6VU[\\)LUA웤JP-<]ēesxM~Co #\G/{ZˡL: u( 6Pkԣ6 ˏ6488xBDj*GtؑЯ 7-MWQMLb~83<q.6D2Tﳽ%T>F4}'xs>+ zPau<;~fJr8˽yڵն"K\bg'R?|&͎FUGsێIcӧO[__y +NU7fggeak6/^|d2MNNƍw2??V]\vAƝ6J%qez{]n?Av`yy٩z<[>H666aT v5撆OH>+Z1[kN/]>wwErğOJUV{kҘTvwCۣpۡ&=;r{D'}IENDB`PK C$7%NToolbar_About.pngUT >FFUxPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXkl33;ݵ_;'qpUB@^@A8"&HrATibD+h(" **=] vv zw>?D!^4#̬'$g.(hښg91k鍷-QU%֤\6틏UkW֤hm wD|N~ed~JK7UIzmwG昺}KkPܝ^%3|w]f)-*(xĀ";U"Go2 B%4ŭkDR3*@5˗imOg]^8~#Ş*a?)}11z_uYmMW"Eۉ 8qA]m .(,f=Hl#zLr331>fHO{϶%KغR}榼@R8?X2HieZQ]drblH zyTcqU6LzRt&J~6KhkRk~dIua8L0и~T>_ ΡvJJ <).k#bw3`wp%=1Boo۷ 2hBSW7o/"J 96ѓt0'yڵ={IXns4)[IŢ8.@QBs֮[-TE!Lø)r"9qw1L۶=Ջi rԱa `7\ի03xއs=H4um$[aG/@ !ccO<5==M$'m[u϶,aC ̈́G-B.5@މcә6G3RJf@(MB*B1W?G 82fYj3;,c%k~@dV a7R_,PnIENDB`PK {u2744Client_xMule.pngUT  FFUxPNG  IHDRabKGD pHYs  tIME  +6?IDAT8˕O1#)"4IɎ,,$kY쬕Oc|>B,DfR,Qcg{{9iKQ QOEW rrDQ:nf3>>|0 : 4v Cf@D"ARa20X_AA20 6 s8KgXeX,TUͦ[3i(TU+bZ Z-lf>^3`0H,t:aJH$B8hdǨ꼛xb1r``@&mǡ"IR(zZ\.I2P(fu{ T*ohYe1;(bkX*H~vx<$IXx4M ? P(D(~cWS7 IENDB`PK Nd7OClient_Upload.pngUT 3WFFUxPNG  IHDRabKGD pHYs  tIME "{pJIDAT8ˍkQƿ7$MK/[Cv!mHtƝ VqQDhF+N2dn&=p 5}1hosn 9ԿbY#Rh4M(*c RJ躮R{]]]%˲ ( BF1OL&iT*l~ ](,JTLNNL&q*j7p䘬fD, BamGG=ڭ6\F}@@s9#L:n-ME&%ׁ @3zH)EQ RHgA(|53:jrsME ]h%g.ygӋ6vx"t!eOQi.m7PLNuhK 1sjq#Ŵaa&Zxou4M]Vh4UϏL&]rLOOvn0 lEQh4<==( uEAUU2B1.Ȳ$I(,|>,t:DUUP˲ǟ !eYQN'ݡiBTUO(E^7 \.777r9 iB 422"^Hs޲$IAϭclGGG|(h8N<~6% èZT*\]]3xX,F2l5 0*H9 }Z[[ӊ"J4Mv 'J||6 4M}ffFt\__S.vڰ,[3}Β$[$tkSRYIENDB`PK F6E//Client_Shareaza.pngUT gw4F(sAsYUl6S;,4_3]!͜p$ۺ?X@WkmpU7({:o|vn2̹لON$9hґ]A2&4H wiu,uE\͂29}r޽}҄2_CZ\+e-ןYC{×O*/zΗЗ ~.PK \7V|Client_PoorRatingOnFile.pngUT MFFUxPNG  IHDRabKGD pHYs  tIME7R7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orgln_IDAT8u_h[UƿsҕvMnЖaqYQt'Kɞ0[@(L|`*(ZdCMjј)k4I&s|d8#ӧp|c}!A x![91 Ц(/DH49G6/B}>o`'c!!JI1џli0 L&#fsR0!k!ĉo(=3J4/b Z7Ё@[$a~a~՟< 'D4MD#B0M  ;ٺCUU"H pOW7B@H UUoQKK+"VbM0{9LRyG3 ø[`s+%ؼ 4P(`s"K1LD8F>9m92B/.{m$骖tqJb՚[TQn@xVWVmﵛ{rGr&TMm} DR{[K?Iv!wFX)&Lzē[ BЫ(imBѮvC[Me{QJtZ Y>óA^PQq3jjΤQJQQ|>K6388R ÁBR `Uk:pr lf^<WNQTRB  \q)3?G)mضѣǘ cYJ P,tNy;/I|颿^oMӏְ2$64Ief__/ U?֚'Ǘ(hqA:R/#_~[;bf޷V ih*lL|鏁%`1(k@cnjEIENDB`PK 6lClient_mlDonkey.pngUT [?8 az`|r},#)qM9w[ҕ|[!tQt U s@%[կȵ[[,h5 (j5+'" :&}WǾB#Nyܞ,+P)4I87).֕/t/c@RFE)JIATjwN-tzKj%n?|(-F<)NOScFcĚ##d2~`ZE^7qijjo\w<ZCfRRĻR{'R#f&h~4(_tyu?|vLhQIENDB`PK 7wClient_InvalidRatingOnFile.pngUT SFFUxPNG  IHDRabKGD pHYs  tIME&k7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˕]HgOZ5m4FcVLcjfqkxW.CA/Pl a"ku"amltj)eMV-tή.DA9Ϲx#؇!z4MXJHbF)f,ֲK{bߢ\&^|B*)X}|7 b-jGH4MQJ*=SDak_wVVQ%zgz*t"z왳绺B ') p<~0 <LRƆ뱕QzOt:N'B)S @]p8RLo_MDo^kxDXDqq/_z$Ϯ^pW+H9܆4m=UvJ׮㬭cbvS2ɣ?0 OR^4Aoihk#މ 0a09Ƀ~l/gr<2;}>\#T[D|TUUQYYK 0շtZ2zOk[|Fvvc=p R^\h0H'O>XK{*qI3kap:p0vNM{*|5oB {;:L͛o؍غ:_[Mb ;ԴD,&Ʊ݅vvg.YZb|6j6Ixs=C_90ӧq\TC1عsG*F];Y>O&fyeo1C ?$ ~`B1t>IENDB`PK "7&ʏClient_GoodRatingOnFile.pngUT _FFUxPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ukSAgX[6MG`)JtԅA|mJ;W;qhU\hT &m&޹DžKb}|g~3,l62z >F`AM`m@!} y`-L.wX;j|CjIUmu7p蜗ӲtiZ ja%-ZPۡ2S;7?C"˶Cd ߡl! j l6mL}_ր o 'HJ"9ni`a8H "uPailCJ_E(%*jK`` L@P"Fx-FmHvkDXOwֹ?\~߻l(ٞ4rV <]]ݬ^f~XoL_ϝG'}Ctvv195E%38LNNњL}T*RHau?-I|kinj<<ץmmxGqHtq,l9] Dk{ bjsq=WHR9P&,q7 thddrD\q cSRVO=zDv *"ZsWFDvZ{}@4XIENDB`PK 7>Client_Friend.pngUT hSFFUxPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KHQofKA a%=ADb(Z&Z-(&*͖-M$ l!e=373{Z[kӁg913'EnK^H,bP)^ fAGIֵɲrܔc&q2xċ fb0 (c9hׇ"|f~bfIF]R30f Q: 6?Zb%`,Io3ӫ+t 1Z]lAB;OW!"J CnQ5e/d/?"L{`efñJ1x^Qw[2щW#ӑj HYm5`~UXnWWͯظ!^~y3p2 a39bI1 Ruӎp7z_,z]q( D>S;Iْ-'}1GfoAߒ"ڏS.o< 4 NJ*HyIENDB`PK 7=!Client_FairRatingOnFile.pngUT FFUxPNG  IHDRabKGD pHYs  tIME27tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8}oTU?s[B2P#Tڊ%E ( ĸTcろ #RS%qR@i 1suj'?@)R(hhh@kMEw;c= myѱos#.l;wV_|#5QxR)oOfڟz _}y)cX,B Zk0$͹ }ٹWSo~ss_<=c{RVHSSSi5/4&+˽/+y0q]wo{[;MM  ""BJ:׏֚[ٳg @R>V8!Bj++`&CSs3NgLquQ<m JJg~~S'\bqqw`M&h|:6:7o^gIfJSO&N3==E8?\ -G\\/fWo#KkDfN) $rWJy^7=TbB}OR@]A0 ]={R !B|G)ET*W3H)?TRJffqF::QASzܗHW/[!ąoqūP*-;QR6P.c!Ą2?byK k8%8F1ayK,\FqߋE>qf;ɥIENDB`PK47;JNClient_ExtendedProtocol.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו: :>@!׈ԼĒ̒ TwO߀)y@<]C,N Ѻx[Xil7P[sZݳN[,\B9x=Zv&WE^SprqC IXZNel.Wv_Lgώ:T[b?)3G’ܬ3}iZQP2/3*tΪšugtsYPK j7,.k Client_ExcellentRatingOnFile.pngUT :FFUxPNG  IHDRabKGD pHYs  tIMEoiw>7tEXtCommentRyan Collier (pseudo) http://www.pseudocode.orglnIDAT8˵KQΫXFi4dDB)M… Ek"WAh,"veC:O j偳992Pvs6,Dp$4F\uh2Qŏt>Wù՟%kaeCimM*к~$~HcuK> Zcl}NgJ* ̎^T qTCu:I\'*1B m&󟑦qObUvgc8DuP?BaD(Y?Q,bldIP"%eTqpcoy1?Tah~Dcf0{!? X/U;e.,庭Mɫ(?>XXFcK8IS'RVxݳ.(ٹM@KԳY9Qw53L@ٮ=_ulIENDB`PK47Client_Encrypted.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו: ס.lkDs~nnj^ sQjbIjByfIBHFoEꗱ]xHኩd*mqIAs_ғ?1xsJhPK 7PJJClient_eMule.pngUT FFUxPNG  IHDRasBIT|dIDAT8OHq?k[lZl0b9(rDh/S3; jy6ST!,ae1'ww`)W>~ QYT_{#m.;\&B:/32}[\`hn0A eJ:/o 7 LvIENDB`PK "~7.**Client_eDonkeyHybrid.pngUT &FFUxPNG  IHDRabKGD pHYs  tIME 1xWqIDAT8mj@:iHQHqU{=*-l3)lP| |ىXwn "fs~ӥ($iy$@b3jm)2f#sȮ(,(qd!hv"}ճHsn8s8o9ކ^ ,}YmCӴKXT96;KN..v6u]cB xy WQe3?YEfv/"?,V _̏Ct \tL#D4MQՋy $a44MUUfiq8Dm8Lv8H3O۶Sӕ1xoNONOemjEtPIENDB`PKK476\^Client_CreditsYellow.pngUT FFUx sb``p  $?ORlI. Ap品" 0kPו:hlkDs~nnj^ sQjbIjByfIBHFo>Client_CommentOnly.pngUT FFUxPNG  IHDRabKGD pHYs  tIME 7);RHIDAT8˥MhA3ݣH"-)X+xEж'< "~1[M\bӍLlZx0Cmj+ ofރ a]VzxG/fw؎XM9WOJݬ;-T@YXݓ zV_LKNJ7qĉ?}MeM}'O2t3@zz}KAI{|-Mu=۶m;R>n&X^Q@dct| UsEΟ0 M ҽ \y7}7FdY~C;>Yz=iv4nK!?y%;nL&q]7\OPV<G;+H%H`YeExA,CkMVCk5Bl:ud})0oZy IENDB`PK &7rGGClient_BadGuy.pngUT ]FFUxPNG  IHDRabKGD pHYs  ~tIME #/5IDAT8ҿkq.hmBAK$v - u0*!-"8Uu%Al*RJϋ5rwsr |և U0+fj=Ϝb0MS/wT45 M^Xx)z|njk#'J KO>oSӄuRel_ ~tPpLBOAj8P3s|xu(_ur\{{i۸+%C+ա#ht -4MCp]!2_ ŰB H)R j4< JkuiYHAJOiG"ɅE>تQUEPFFlm$fJ ђI4,[v/@  ߪnNZ+>KZaIENDB`PK L$7@Client_aMule.pngUT OFFUxPNG  IHDRabKGD pHYs B(xtIMEP<IDAT8˅KHTawd*Vd> hу "EQA j2*EQp" zYB-1\959BkM¨LCޏ|]??CJ4OjϬvMЮ"{)-!.?~{| $֔(-3nƜP!A)DUG+`7 _ ;$2ݘ4)'YgF'GE٪jxe9pz{Hz+dy2Qtq ] `Z U->h*z/K(K*Hk׃~`ЂkqQ@Yb$kPoPjYE9O]^E!`EKo8(ZD41rEǴ13z]in#;=?(bFo 9mp|w#8֞oYJڷ׀x;9fic i % WW(Mqh!,-jHB4KXk_ZI !:Tsón&L:5nl66~i/wUIENDB`PK u755 Toolbar_Transfers.pngUTKFUxPK n6^^ }Toolbar_Stats.pngUTwEUxPK l6@_  Toolbar_Shared.pngUTEUxPK `27'?22 dToolbar_Search.pngUTFUxPK `27i\\ Toolbar_Prefs.pngUTFUxPK ,_5? ?  {Toolbar_Network.pngUTFEUxPK 7Θ &Toolbar_Messages.pngUTcOFUxPK ش$7g& *Toolbar_Import.pngUTXFUxPK n6UtEww 2Toolbar_Disconnect.pngUTwEUxPK l6ђ 큱7Toolbar_Connecting.pngUTEUxPK Wr6a ?Toolbar_Connect.pngUTZFUxPK ˩&7Xdd FToolbar_Blink.pngUTQFUxPK C$7%N MToolbar_About.pngUT>FUxPK {u2744 UClient_xMule.pngUT FUxPK Nd7O vXClient_Upload.pngUT3WFUxPK 77[{TT w[Client_Unknown.pngUTzFUxPK  7 MS _Client_Transfer.pngUTQFUxPK i7ɽ!jj bClient_StatusUnknown.pngUT\&FUxPK F6E// eClient_Shareaza.pngUT ƀClient_Friend.pngUThSFUxPK 7=! Client_FairRatingOnFile.pngUTFUxPK47;JN ;Client_ExtendedProtocol.pngUTFUxPK j7,.k ӉClient_ExcellentRatingOnFile.pngUT:FUxPK47 ЌClient_Encrypted.pngUTFUxPK 7PJJ Client_eMule.pngUTFUxPK "~7.** wClient_eDonkeyHybrid.pngUT&FUxPKK476\^ Client_CreditsYellow.pngUTFUxPK+47c_or Client_CreditsGrey.pngUTFUxPK {7W KClient_Connecting.pngUT!FUxPK # 7D5>> PClient_CommentOnly.pngUTFUxPK &7rGG כClient_BadGuy.pngUT]FUxPK L$7@ bClient_aMule.pngUTOFUxPK J4v% Client_A4AFNoNeededPartsQueueFull.pngUTCUxPK((} aMule-2.3.1/src/ClientCreditsList.h0000644000175000017470000000447311575347521016036 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CLIENTCREDITSLIST_H #define CLIENTCREDITSLIST_H #include "MD4Hash.h" // Needed for CMD4Hash #include class CClientCredits; class CClientCreditsList { public: CClientCreditsList(); ~CClientCreditsList(); // return signature size, 0 = Failed | use sigkey param for debug only uint8 CreateSignature(CClientCredits* pTarget, byte* pachOutput, uint8 nMaxSize, uint32 ChallengeIP, uint8 byChaIPKind, void* sigkey = NULL); bool VerifyIdent(CClientCredits* pTarget, const byte* pachSignature, uint8 nInputSize, uint32 dwForIP, uint8 byChaIPKind); CClientCredits* GetCredit(const CMD4Hash& key); void Process(); uint8 GetPubKeyLen() const {return m_nMyPublicKeyLen;} const byte* GetPublicKey() const {return m_abyMyPublicKey;} bool CryptoAvailable() const; void SaveList(); protected: void LoadList(); void InitalizeCrypting(); bool CreateKeyPair(); #ifdef _DEBUG bool Debug_CheckCrypting(); #endif private: typedef std::map ClientMap; ClientMap m_mapClients; uint32 m_nLastSaved; // A void* to avoid having to include the large CryptoPP.h file void* m_pSignkey; byte m_abyMyPublicKey[80]; uint8 m_nMyPublicKeyLen; }; #endif // CLIENTCREDITSLIST_H // File_checked_for_headers aMule-2.3.1/src/ECSpecialCoreTags.cpp0000644000175000017470000004012511635361323016204 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include // Needed for CECTag #include // Needed for special EC tag creator classes // Since there are only constructors defined here, // removing everything from non-local builds. #include "amule.h" #include "Server.h" // Needed for CServer #include "PartFile.h" // Needed for CPartFile #include "ServerConnect.h" // Needed for CServerConnect #include "updownclient.h" // Needed for CUpDownClient #include "UploadQueue.h" // Needed for CUploadQueue #include "SharedFileList.h" #include "SearchList.h" #include "Friend.h" #include "kademlia/kademlia/Kademlia.h" // used for webserver, amulecmd CEC_Server_Tag::CEC_Server_Tag(const CServer *server, EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_SERVER, EC_IPv4_t(server->GetIP(), server->GetPort())) { wxString tmpStr; uint32 tmpInt; uint8 tmpShort; switch (detail_level) { case EC_DETAIL_INC_UPDATE: // should not get here wxFAIL; break; case EC_DETAIL_UPDATE: if ((tmpInt = server->GetPing()) != 0) { AddTag(CECTag(EC_TAG_SERVER_PING, tmpInt)); } if ((tmpShort = (uint8)server->GetFailedCount()) != 0) { AddTag(CECTag(EC_TAG_SERVER_FAILED, tmpShort)); } break; case EC_DETAIL_WEB: case EC_DETAIL_FULL: if ((tmpInt = server->GetPing()) != 0) { AddTag(CECTag(EC_TAG_SERVER_PING, tmpInt)); } if ((tmpShort = (uint8)server->GetPreferences()) != SRV_PR_NORMAL) { AddTag(CECTag(EC_TAG_SERVER_PRIO, tmpShort)); } if ((tmpShort = (uint8)server->GetFailedCount()) != 0) { AddTag(CECTag(EC_TAG_SERVER_FAILED, tmpShort)); } if ((tmpShort = (server->IsStaticMember() ? 1 : 0)) != 0) { AddTag(CECTag(EC_TAG_SERVER_STATIC, tmpShort)); } if (!(tmpStr = server->GetVersion()).IsEmpty()) { AddTag(CECTag(EC_TAG_SERVER_VERSION, tmpStr)); } if (!(tmpStr = server->GetDescription()).IsEmpty()) { AddTag(CECTag(EC_TAG_SERVER_DESC, tmpStr)); } if ((tmpInt = server->GetUsers()) != 0) { AddTag(CECTag(EC_TAG_SERVER_USERS, tmpInt)); } if ((tmpInt = server->GetMaxUsers()) != 0) { AddTag(CECTag(EC_TAG_SERVER_USERS_MAX, tmpInt)); } if ((tmpInt = server->GetFiles()) != 0) { AddTag(CECTag(EC_TAG_SERVER_FILES, tmpInt)); } case EC_DETAIL_CMD: if (!(tmpStr = server->GetListName()).IsEmpty()) { AddTag(CECTag(EC_TAG_SERVER_NAME, tmpStr)); } } } // used for amulegui (EC_DETAIL_INC_UPDATE) CEC_Server_Tag::CEC_Server_Tag(const CServer *server, CValueMap *valuemap) : CECTag(EC_TAG_SERVER, server->ECID()) { AddTag(EC_TAG_SERVER_NAME, server->GetListName(), valuemap); AddTag(EC_TAG_SERVER_DESC, server->GetDescription(), valuemap); AddTag(EC_TAG_SERVER_VERSION, server->GetVersion(), valuemap); AddTag(EC_TAG_SERVER_IP, server->GetIP(), valuemap); AddTag(EC_TAG_SERVER_PORT, server->GetPort(), valuemap); AddTag(EC_TAG_SERVER_PING, server->GetPing(), valuemap); AddTag(EC_TAG_SERVER_PRIO, server->GetPreferences(), valuemap); AddTag(EC_TAG_SERVER_FAILED, server->GetFailedCount(), valuemap); AddTag(EC_TAG_SERVER_STATIC, server->IsStaticMember(), valuemap); AddTag(EC_TAG_SERVER_USERS, server->GetUsers(), valuemap); AddTag(EC_TAG_SERVER_USERS_MAX, server->GetMaxUsers(), valuemap); AddTag(EC_TAG_SERVER_FILES, server->GetFiles(), valuemap); } CEC_ConnState_Tag::CEC_ConnState_Tag(EC_DETAIL_LEVEL detail_level) : CECTag(EC_TAG_CONNSTATE, (uint8)( (theApp->IsConnectedED2K() ? 0x01 : 0x00) | (theApp->serverconnect->IsConnecting() ? 0x02 : 0x00) | (theApp->IsConnectedKad() ? 0x04 : 0x00) | (Kademlia::CKademlia::IsFirewalled() ? 0x08 : 0x00) | (Kademlia::CKademlia::IsRunning() ? 0x10 : 0x00) )) { if (theApp->IsConnectedED2K()) { if ( theApp->serverconnect->GetCurrentServer() ) { if (detail_level == EC_DETAIL_INC_UPDATE) { // Send no full server tag, just the ECID of the connected server AddTag(CECTag(EC_TAG_SERVER, theApp->serverconnect->GetCurrentServer()->ECID())); } else { AddTag(CEC_Server_Tag(theApp->serverconnect->GetCurrentServer(), detail_level)); } } AddTag(CECTag(EC_TAG_ED2K_ID, theApp->GetED2KID())); } else if (theApp->serverconnect->IsConnecting()) { AddTag(CECTag(EC_TAG_ED2K_ID, 0xffffffff)); } AddTag(CECTag(EC_TAG_CLIENT_ID, theApp->GetID())); } CEC_PartFile_Tag::CEC_PartFile_Tag(const CPartFile *file, EC_DETAIL_LEVEL detail_level, CValueMap *valuemap) : CEC_SharedFile_Tag(file, detail_level, valuemap, EC_TAG_PARTFILE) { AddTag(EC_TAG_PARTFILE_STATUS, file->GetStatus(), valuemap); AddTag(EC_TAG_PARTFILE_STOPPED, file->IsStopped(), valuemap); AddTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount(), valuemap); AddTag(EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT, file->GetNotCurrentSourcesCount(), valuemap); AddTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetTransferingSrcCount(), valuemap); AddTag(EC_TAG_PARTFILE_SOURCE_COUNT_A4AF, file->GetSrcA4AFCount(), valuemap); if ( (file->GetTransferingSrcCount() > 0) || (detail_level != EC_DETAIL_UPDATE) || valuemap) { AddTag(EC_TAG_PARTFILE_SIZE_XFER, file->GetTransferred(), valuemap); AddTag(EC_TAG_PARTFILE_SIZE_DONE, file->GetCompletedSize(), valuemap); AddTag(EC_TAG_PARTFILE_SPEED, (uint64_t)(file->GetKBpsDown()*1024), valuemap); } AddTag(EC_TAG_PARTFILE_PRIO, (file->IsAutoDownPriority() ? file->GetDownPriority() + 10 : file->GetDownPriority()), valuemap); AddTag(EC_TAG_PARTFILE_CAT, file->GetCategory(), valuemap); AddTag(EC_TAG_PARTFILE_LAST_SEEN_COMP, file->lastseencomplete, valuemap); AddTag(EC_TAG_PARTFILE_LAST_RECV, file->GetLastChangeDatetime(), valuemap); AddTag(EC_TAG_PARTFILE_DOWNLOAD_ACTIVE, file->GetDlActiveTime(), valuemap); AddTag(EC_TAG_PARTFILE_AVAILABLE_PARTS, file->GetAvailablePartCount(), valuemap); AddTag(EC_TAG_PARTFILE_LOST_CORRUPTION, file->GetLostDueToCorruption(), valuemap); AddTag(EC_TAG_PARTFILE_GAINED_COMPRESSION, file->GetGainDueToCompression(), valuemap); AddTag(EC_TAG_PARTFILE_SAVED_ICH, file->TotalPacketsSavedDueToICH(), valuemap); AddTag(EC_TAG_PARTFILE_A4AFAUTO, file->IsA4AFAuto(), valuemap); // Tag for comments CECEmptyTag sc(EC_TAG_PARTFILE_COMMENTS); FileRatingList list; file->GetRatingAndComments(list); for (FileRatingList::const_iterator it = list.begin(); it != list.end(); ++it) { // Tag children are evaluated by index, not by name sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->UserName)); sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->FileName)); sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, (uint64) it->Rating)); sc.AddTag(CECTag(EC_TAG_PARTFILE_COMMENTS, it->Comment)); } AddTag(sc, valuemap); if (detail_level == EC_DETAIL_UPDATE) { return; } AddTag(EC_TAG_PARTFILE_PARTMETID, file->GetPartMetNumber(), valuemap); // A4AF sources CECEmptyTag a4afTag(EC_TAG_PARTFILE_A4AF_SOURCES); const CKnownFile::SourceSet& a4afSources = file->GetA4AFList(); for (CKnownFile::SourceSet::const_iterator it = a4afSources.begin(); it != a4afSources.end(); it++) { a4afTag.AddTag(CECTag(EC_TAG_ECID, it->ECID())); } AddTag(a4afTag, valuemap); } CEC_SharedFile_Tag::CEC_SharedFile_Tag(const CKnownFile *file, EC_DETAIL_LEVEL detail_level, CValueMap *valuemap, ec_tagname_t name) : CECTag(name, file->ECID()) { AddTag(EC_TAG_KNOWNFILE_REQ_COUNT, file->statistic.GetRequests(), valuemap); AddTag(EC_TAG_KNOWNFILE_REQ_COUNT_ALL, file->statistic.GetAllTimeRequests(), valuemap); AddTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT, file->statistic.GetAccepts(), valuemap); AddTag(EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL, file->statistic.GetAllTimeAccepts(), valuemap); AddTag(EC_TAG_KNOWNFILE_XFERRED, file->statistic.GetTransferred(), valuemap); AddTag(EC_TAG_KNOWNFILE_XFERRED_ALL, file->statistic.GetAllTimeTransferred(), valuemap); AddTag(EC_TAG_KNOWNFILE_AICH_MASTERHASH, file->GetAICHMasterHash(), valuemap); AddTag(EC_TAG_KNOWNFILE_PRIO, (uint8)(file->IsAutoUpPriority() ? file->GetUpPriority() + 10 : file->GetUpPriority()), valuemap); AddTag(EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW, file->m_nCompleteSourcesCountLo, valuemap); AddTag(EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH, file->m_nCompleteSourcesCountHi, valuemap); AddTag(EC_TAG_KNOWNFILE_COMPLETE_SOURCES, file->m_nCompleteSourcesCount, valuemap); AddTag(EC_TAG_KNOWNFILE_ON_QUEUE, file->GetQueuedCount(), valuemap); if (detail_level == EC_DETAIL_UPDATE) { return; } AddTag(EC_TAG_PARTFILE_NAME,file->GetFileName().GetPrintable(), valuemap); AddTag(EC_TAG_PARTFILE_HASH, file->GetFileHash(), valuemap); AddTag(EC_TAG_KNOWNFILE_FILENAME, file->IsPartFile() ? wxString(CFormat(wxT("%s")) % ((CPartFile*)file)->GetPartMetFileName().RemoveExt()) : file->GetFilePath().GetPrintable(), valuemap); AddTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize(), valuemap); AddTag(EC_TAG_PARTFILE_ED2K_LINK, theApp->CreateED2kLink(file, (theApp->IsConnectedED2K() && !theApp->serverconnect->IsLowID())), valuemap); AddTag(EC_TAG_KNOWNFILE_COMMENT, file->GetFileComment(), valuemap); AddTag(EC_TAG_KNOWNFILE_RATING, file->GetFileRating(), valuemap); } CEC_UpDownClient_Tag::CEC_UpDownClient_Tag(const CUpDownClient* client, EC_DETAIL_LEVEL detail_level, CValueMap *valuemap) : CECTag(EC_TAG_CLIENT, client->ECID()) { // General AddTag(CECTag(EC_TAG_CLIENT_NAME, client->GetUserName()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_HASH, client->GetUserHash()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_ID, client->GetUserIDHybrid()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SCORE, client->GetScore()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SOFTWARE, client->GetClientSoft()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SOFT_VER_STR, client->GetSoftVerStr()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_IP, client->GetIP()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_USER_PORT, client->GetUserPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_FROM, (uint64)client->GetSourceFrom()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_IP, client->GetServerIP()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_PORT, client->GetServerPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_SERVER_NAME, client->GetServerName()), valuemap); // Transfers to Client AddTag(CECTag(EC_TAG_CLIENT_UP_SPEED, client->GetUploadDatarate()), valuemap); if (client->GetDownloadState() == DS_DOWNLOADING || valuemap) { AddTag(CECTag(EC_TAG_CLIENT_DOWN_SPEED, (double)(client->GetKBpsDown())), valuemap); } AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_SESSION, client->GetSessionUp()), valuemap); AddTag(CECTag(EC_TAG_PARTFILE_SIZE_XFER, client->GetTransferredDown()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_TOTAL, client->GetUploadedTotal()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_DOWNLOAD_TOTAL, client->GetDownloadedTotal()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_STATE, client->GetUploadState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_DOWNLOAD_STATE, client->GetDownloadState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_IDENT_STATE, (uint64) client->GetCurrentIdentState()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_EXT_PROTOCOL, client->ExtProtocolAvailable()), valuemap); // These are not needed atm. Keep them for now, maybe columns get reintroduced in client view. //AddTag(CECTag(EC_TAG_CLIENT_WAIT_TIME, client->GetWaitTime()), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_XFER_TIME, client->GetUpStartTimeDelay()), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_QUEUE_TIME, (uint64)(::GetTickCount() - client->GetWaitStartTime())), valuemap); //AddTag(CECTag(EC_TAG_CLIENT_LAST_TIME, (uint64)(::GetTickCount() - client->GetLastUpRequest())), valuemap); AddTag(CECTag(EC_TAG_CLIENT_WAITING_POSITION, client->GetUploadQueueWaitingPosition()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_REMOTE_QUEUE_RANK, client->IsRemoteQueueFull() ? (uint16)0xffff : client->GetRemoteQueueRank()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OLD_REMOTE_QUEUE_RANK, client->GetOldRemoteQueueRank()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OBFUSCATION_STATUS, client->GetObfuscationStatus()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_KAD_PORT, client->GetKadPort()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_FRIEND_SLOT, client->GetFriendSlot()), valuemap); if (detail_level == EC_DETAIL_UPDATE) { return; } const CKnownFile* file = client->GetUploadFile(); if (file) { AddTag(CECTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_FILE, file->ECID()), valuemap); } else { AddTag(CECIntTag(EC_TAG_CLIENT_UPLOAD_FILE, 0), valuemap); } const CPartFile* pfile = client->GetRequestFile(); AddTag(CECTag(EC_TAG_CLIENT_REQUEST_FILE, pfile ? pfile->ECID() : 0), valuemap); AddTag(CECTag(EC_TAG_CLIENT_REMOTE_FILENAME, client->GetClientFilename()), valuemap); if (detail_level != EC_DETAIL_INC_UPDATE) { return; } AddTag(CECTag(EC_TAG_CLIENT_DISABLE_VIEW_SHARED, client->HasDisabledSharedFiles()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_VERSION, client->GetVersion()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_MOD_VERSION, client->GetClientModString()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_OS_INFO, client->GetClientOSInfo()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_AVAILABLE_PARTS, client->GetAvailablePartCount()), valuemap); if (pfile) { const BitVector & partStatus = client->GetPartStatus(); if (partStatus.size() == pfile->GetPartCount()) { if (partStatus.AllTrue()) { // send just an empty tag for a full source AddTag(CECEmptyTag(EC_TAG_CLIENT_PART_STATUS), valuemap); } else { AddTag(CECTag(EC_TAG_CLIENT_PART_STATUS, partStatus.SizeBuffer(), partStatus.GetBuffer()), valuemap); } } AddTag(CECTag(EC_TAG_CLIENT_NEXT_REQUESTED_PART, client->GetNextRequestedPart()), valuemap); AddTag(CECTag(EC_TAG_CLIENT_LAST_DOWNLOADING_PART, client->GetLastDownloadingPart()), valuemap); } if (file) { const BitVector & upPartStatus = client->GetUpPartStatus(); if (upPartStatus.size() == file->GetPartCount()) { AddTag(CECTag(EC_TAG_CLIENT_UPLOAD_PART_STATUS, upPartStatus.SizeBuffer(), upPartStatus.GetBuffer()), valuemap); } } } // // Search reply // CEC_SearchFile_Tag::CEC_SearchFile_Tag(CSearchFile *file, EC_DETAIL_LEVEL detail_level, CValueMap *valuemap) : CECTag(EC_TAG_SEARCHFILE, file->ECID()) { AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT, file->GetSourceCount()), valuemap); AddTag(CECTag(EC_TAG_PARTFILE_SOURCE_COUNT_XFER, file->GetCompleteSourceCount()), valuemap); AddTag(CECTag(EC_TAG_PARTFILE_STATUS, (uint32)file->GetDownloadStatus()), valuemap); if (detail_level == EC_DETAIL_UPDATE) { return; } AddTag(CECTag(EC_TAG_PARTFILE_NAME, file->GetFileName().GetPrintable()), valuemap); AddTag(CECTag(EC_TAG_PARTFILE_SIZE_FULL, file->GetFileSize()), valuemap); AddTag(EC_TAG_PARTFILE_HASH, file->GetFileHash(), valuemap); if (file->GetParent()) { AddTag(EC_TAG_SEARCH_PARENT, file->GetParent()->ECID(), valuemap); } } // // Friend // CEC_Friend_Tag::CEC_Friend_Tag(const CFriend* Friend, CValueMap* valuemap) : CECTag(EC_TAG_FRIEND, Friend->ECID()) { AddTag(EC_TAG_FRIEND_NAME, Friend->GetName(), valuemap); AddTag(EC_TAG_FRIEND_HASH, Friend->GetUserHash(), valuemap); AddTag(EC_TAG_FRIEND_IP, Friend->GetIP(), valuemap); AddTag(EC_TAG_FRIEND_PORT, Friend->GetPort(), valuemap); const CClientRef& linkedClient = Friend->GetLinkedClient(); AddTag(EC_TAG_FRIEND_CLIENT, linkedClient.IsLinked() ? linkedClient.ECID() : 0, valuemap); } // File_checked_for_headers aMule-2.3.1/src/Packet.cpp0000644000175000017470000001771511575347521014213 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include // Needed for uLongf #include "Packet.h" // Interface declarations #include #include "Logger.h" // Neeed for AddDebugLogLineN #include "MemFile.h" // Needed for CMemFile #include "OtherStructs.h" // Needed for Header_Struct #include "ArchSpecific.h" // Needed for ENDIAN_* // Copy constructor CPacket::CPacket(CPacket &p) { size = p.size; opcode = p.opcode; prot = p.prot; m_bSplitted = p.m_bSplitted; m_bLastSplitted = p.m_bLastSplitted; m_bPacked = p.m_bPacked; m_bFromPF = p.m_bFromPF; memcpy(head, p.head, sizeof head); tempbuffer = NULL; if (p.completebuffer) { completebuffer = new byte[size + 10];; pBuffer = completebuffer + sizeof(Header_Struct); } else { completebuffer = NULL; if (p.pBuffer) { pBuffer = new byte[size]; } else { pBuffer = NULL; } } if (pBuffer) memcpy( pBuffer, p.pBuffer, size ); } CPacket::CPacket(uint8 protocol) { size = 0; opcode = 0; prot = protocol; m_bSplitted = false; m_bLastSplitted = false; m_bPacked = false; m_bFromPF = false; memset(head, 0, sizeof head); tempbuffer = NULL; completebuffer = NULL; pBuffer = NULL; } // only used for receiving packets CPacket::CPacket(byte* rawHeader, byte *buf) { memset(head, 0, sizeof head); Header_Struct* header = (Header_Struct*)rawHeader; size = ENDIAN_SWAP_32(header->packetlength) - 1; opcode = header->command; prot = header->eDonkeyID; m_bSplitted = false; m_bLastSplitted = false; m_bPacked = false; m_bFromPF = false; tempbuffer = NULL; completebuffer = NULL; pBuffer = buf; } CPacket::CPacket(const CMemFile& datafile, uint8 protocol, uint8 ucOpcode) { size = datafile.GetLength(); opcode = ucOpcode; prot = protocol; m_bSplitted = false; m_bLastSplitted = false; m_bPacked = false; m_bFromPF = false; memset(head, 0, sizeof head); tempbuffer = NULL; completebuffer = new byte[size + sizeof(Header_Struct)/*Why this 4?*/]; pBuffer = completebuffer + sizeof(Header_Struct); // Write contents of MemFile to buffer (while keeping original position in file) off_t position = datafile.GetPosition(); datafile.Seek(0, wxFromStart); datafile.Read(pBuffer, size); datafile.Seek(position, wxFromStart); } CPacket::CPacket(int8 in_opcode, uint32 in_size, uint8 protocol, bool bFromPF) { size = in_size; opcode = in_opcode; prot = protocol; m_bSplitted = false; m_bLastSplitted = false; m_bPacked = false; m_bFromPF = bFromPF; memset(head, 0, sizeof head); tempbuffer = NULL; if (in_size) { completebuffer = new byte[in_size + sizeof(Header_Struct) + 4 /*Why this 4?*/]; pBuffer = completebuffer + sizeof(Header_Struct); memset(completebuffer, 0, in_size + sizeof(Header_Struct) + 4 /*Why this 4?*/); } else { completebuffer = NULL; pBuffer = NULL; } } // only used for splitted packets! CPacket::CPacket(byte* pPacketPart, uint32 nSize, bool bLast, bool bFromPF) { size = nSize - sizeof(Header_Struct); opcode = 0; prot = 0; m_bSplitted = true; m_bLastSplitted = bLast; m_bPacked = false; m_bFromPF = bFromPF; memset(head, 0, sizeof head); tempbuffer = NULL; completebuffer = pPacketPart; pBuffer = NULL; } CPacket::~CPacket() { // Never deletes pBuffer when completebuffer is not NULL if (completebuffer) { delete [] completebuffer; } else if (pBuffer) { // On the other hand, if completebuffer is NULL and pBuffer is not NULL delete [] pBuffer; } if (tempbuffer) { delete [] tempbuffer; } } uint32 CPacket::GetPacketSizeFromHeader(const byte* rawHeader) { Header_Struct* header = (Header_Struct*)rawHeader; uint32 size = ENDIAN_SWAP_32(header->packetlength); if (size < 1 || size >= 0x7ffffff0u) return 0; return size - 1; } void CPacket::CopyToDataBuffer(unsigned int offset, const byte* data, unsigned int n) { wxASSERT(offset + n <= size + 1); memcpy(pBuffer + offset, data, n); } byte* CPacket::GetPacket() { if (completebuffer) { if (!m_bSplitted) { memcpy(completebuffer, GetHeader(), sizeof(Header_Struct)); } return completebuffer; } else { if (tempbuffer){ delete [] tempbuffer; tempbuffer = NULL; } tempbuffer = new byte[size + sizeof(Header_Struct) + 4 /* why this 4?*/]; memcpy(tempbuffer , GetHeader(), sizeof(Header_Struct)); memcpy(tempbuffer + sizeof(Header_Struct), pBuffer , size); return tempbuffer; } } byte* CPacket::DetachPacket() { if (completebuffer) { if (!m_bSplitted) { memcpy(completebuffer, GetHeader(), sizeof(Header_Struct)); } byte* result = completebuffer; completebuffer = pBuffer = NULL; return result; } else{ if (tempbuffer){ delete[] tempbuffer; tempbuffer = NULL; } tempbuffer = new byte[size+sizeof(Header_Struct)+4 /* Why this 4?*/]; memcpy(tempbuffer,GetHeader(),sizeof(Header_Struct)); memcpy(tempbuffer+sizeof(Header_Struct),pBuffer,size); byte* result = tempbuffer; tempbuffer = 0; return result; } } byte* CPacket::GetHeader() { wxASSERT( !m_bSplitted ); Header_Struct* header = (Header_Struct*) head; header->command = opcode; header->eDonkeyID = prot; header->packetlength = ENDIAN_SWAP_32(size + 1); return head; } byte* CPacket::GetUDPHeader() { wxASSERT( !m_bSplitted ); memset(head, 0, 6); UDP_Header_Struct* header = (UDP_Header_Struct*) head; header->eDonkeyID = prot; header->command = opcode; return head; } void CPacket::PackPacket() { wxASSERT(!m_bSplitted); uLongf newsize = size + 300; byte* output = new byte[newsize]; uint16 result = compress2(output, &newsize, pBuffer, size, Z_BEST_COMPRESSION); if (result != Z_OK || size <= newsize) { delete[] output; return; } if (prot == OP_KADEMLIAHEADER) { prot = OP_KADEMLIAPACKEDPROT; } else { prot = OP_PACKEDPROT; } memcpy(pBuffer, output, newsize); delete[] output; m_bPacked = true; size = newsize; } bool CPacket::UnPackPacket(uint32 uMaxDecompressedSize) { wxASSERT( prot == OP_PACKEDPROT || prot == OP_ED2KV2PACKEDPROT); // OP_ED2KV2PACKEDPROT is experimental aMule test code, // this should not happen yet. Leave a warining in the log. if (prot == OP_ED2KV2PACKEDPROT) { AddDebugLogLineN(logPacketErrors, wxT("Received OP_ED2KV2PACKEDPROT.")); } uint32 nNewSize = size * 10 + 300; if (nNewSize > uMaxDecompressedSize){ nNewSize = uMaxDecompressedSize; } byte* unpack = new byte[nNewSize]; uLongf unpackedsize = nNewSize; uint16 result = uncompress(unpack, &unpackedsize, pBuffer, size); if (result == Z_OK) { wxASSERT( completebuffer == NULL ); wxASSERT( pBuffer != NULL ); size = unpackedsize; delete[] pBuffer; pBuffer = unpack; prot = OP_EMULEPROT; return true; } delete[] unpack; return false; } void CPacket::Copy16ToDataBuffer(const void* data) { md4cpy(pBuffer, data); } void CPacket::CopyUInt32ToDataBuffer(uint32 data, unsigned int offset) { wxCHECK_RET(offset <= size - sizeof(uint32), wxT("Bad offset in CopyUInt32ToDataBuffer.")); PokeUInt32( pBuffer + offset, data ); } // File_checked_for_headers aMule-2.3.1/src/ScopedPtr.h0000644000175000017470000001103411575347521014340 0ustar topiusers// -*- C++ -*- // This file is part of the aMule Project. // // Copyright (c) 2006-2011 Mikkel Schubert ( xaignar@users.sourceforge.net ) // Copyright (c) 2006-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef SCOPEDPTR_H #define SCOPEDPTR_H #include "OtherFunctions.h" // Needed for DeleteContents() /** * CScopedPtr is a simple smart pointer. * * This class is a replacement for std::auto_ptr, with simpler * copying schematics, in that it doesn't allow copying or * assignment, compared to auto_ptr, which allows only one * instance to own a pointer (swapping at assignment). */ template class CScopedPtr { public: /** Constructor. Note that CScopedPtr takes ownership of the pointer. */ CScopedPtr(TYPE* ptr) : m_ptr(ptr) {} CScopedPtr() { m_ptr = new TYPE; } /** Frees the pointer owned by the instance. */ ~CScopedPtr() { delete m_ptr; } //@{ /** Deference operators. */ TYPE& operator*() const { return *m_ptr; } TYPE* operator->() const { return m_ptr; } //@} /** Returns the actual pointer value. */ TYPE* get() const { return m_ptr; } /** Sets the actual pointer to a different value. The old pointer is freed. */ void reset(TYPE* ptr = 0) { delete m_ptr; m_ptr = ptr; } /** Returns the actual pointer. The scoped-ptr will thereafter contain NULL. */ TYPE* release() { TYPE* ptr = m_ptr; m_ptr = 0; return ptr; } private: //@{ //! A scoped pointer is neither copyable, nor assignable. CScopedPtr(const CScopedPtr&); CScopedPtr& operator=(const CScopedPtr&); //@} TYPE* m_ptr; }; /** * Similar to CScopedPtr, except that an array is expected. * * @see CScopedPtr */ template class CScopedArray { public: /** Constructor. Note that CScopedArray takes ownership of the array. */ CScopedArray(TYPE* ptr) : m_ptr(ptr) {} /** Constructor, allocating nr elements. */ CScopedArray(size_t nr) { m_ptr = new TYPE[nr]; } /** Frees the array owned by this instance. */ ~CScopedArray() { delete[] m_ptr; } /** Accessor. */ TYPE& operator[](unsigned i) const { return m_ptr[i]; } /** @see CScopedPtr::get */ TYPE* get() const { return m_ptr; } /** @see CScopedPtr::reset */ void reset(TYPE* ptr = 0) { delete[] m_ptr; m_ptr = ptr; } /** free the existing array and allocate a new one with nr elements */ void reset(size_t nr) { delete[] m_ptr; m_ptr = new TYPE[nr]; } /** @see CScopedPtr::release */ TYPE* release() { TYPE* ptr = m_ptr; m_ptr = 0; return ptr; } private: //@{ //! A scoped array is neither copyable, nor assignable. CScopedArray(const CScopedArray&); CScopedArray& operator=(const CScopedArray&); //@} TYPE* m_ptr; }; /** * Similar to CScopedPtr, except that a STL container of pointers is expected * which has to be freed with DeleteContents. * * @see CScopedPtr */ template class CScopedContainer { public: /** Constructor. Note that CScopedContainer takes ownership of the array. */ CScopedContainer(STL_CONTAINER* ptr) : m_ptr(ptr) {} CScopedContainer() { m_ptr = new STL_CONTAINER; } ~CScopedContainer() { if (m_ptr) { DeleteContents(*m_ptr); delete m_ptr; } } //@{ /** Deference operators. */ STL_CONTAINER& operator*() const { return *m_ptr; } //@} /** Returns the actual pointer value. */ STL_CONTAINER* get() const { return m_ptr; } private: //@{ //! A scoped container is neither copyable, nor assignable. CScopedContainer(const CScopedContainer&); CScopedContainer& operator=(const CScopedContainer&); //@} STL_CONTAINER* m_ptr; }; #endif // SCOPEDPTR_H // File_checked_for_headers aMule-2.3.1/src/ServerList.cpp0000644000175000017470000007371511644135646015110 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include "ServerList.h" // Interface declarations. #include #include #include #include #include #include #include // Needed for wxURL #include #include "DownloadQueue.h" // Needed for CDownloadQueue #include "ServerConnect.h" // Needed for CServerConnect #include "Server.h" // Needed for CServer and SRV_PR_* #include "OtherStructs.h" // Needed for ServerMet_Struct #include "CFile.h" // Needed for CFile #include "HTTPDownload.h" // Needed for HTTPThread #include "Preferences.h" // Needed for thePrefs #include "amule.h" // Needed for theApp #include "Statistics.h" // Needed for theStats #include "Packet.h" // Neeed for CPacket #include "Logger.h" #include "ScopedPtr.h" #include #include "IPFilter.h" #include // Needed for UnpackArchive #include // Needed for CTextFile CServerList::CServerList() { m_serverpos = m_servers.end(); m_statserverpos = m_servers.end(); m_nLastED2KServerLinkCheck = ::GetTickCount(); m_initialized = false; } bool CServerList::Init() { // Load Metfile bool bRes = LoadServerMet(CPath(theApp->ConfigDir + wxT("server.met"))); // insert static servers from textfile m_staticServersConfig = theApp->ConfigDir + wxT("staticservers.dat"); LoadStaticServers(); // Send the auto-update of server.met via HTTPThread requests current_url_index = 0; if ( thePrefs::AutoServerlist()) { AutoUpdate(); } m_initialized = true; return bRes; } bool CServerList::LoadServerMet(const CPath& path) { AddLogLineN(CFormat(_("Loading server.met file: %s")) % path); bool merge = !m_servers.empty(); if (!path.FileExists()) { AddLogLineN(_("Server.met file not found!")); return false; } // Try to unpack the file, might be an archive const wxChar* mets[] = { wxT("server.met"), NULL }; // Try to unpack the file, might be an archive if (UnpackArchive(path, mets).second != EFT_Met) { AddLogLineC(CFormat(_("Failed to load server.met file '%s', unknown format encountered.")) % path); return false; } CFile servermet(path, CFile::read); if ( !servermet.IsOpened() ){ AddLogLineN(_("Failed to open server.met!") ); return false; } try { Notify_ServerFreeze(); byte version = servermet.ReadUInt8(); if (version != 0xE0 && version != MET_HEADER) { AddLogLineC(CFormat(_("Server.met file corrupt, found invalid versiontag: 0x%x, size %i")) % version % sizeof(version)); Notify_ServerThaw(); return false; } uint32 fservercount = servermet.ReadUInt32(); ServerMet_Struct sbuffer; uint32 iAddCount = 0; for ( uint32 j = 0; j < fservercount; ++j ) { sbuffer.ip = servermet.ReadUInt32(); sbuffer.port = servermet.ReadUInt16(); sbuffer.tagcount = servermet.ReadUInt32(); CServer* newserver = new CServer(&sbuffer); // Load tags for ( uint32 i = 0; i < sbuffer.tagcount; ++i ) { newserver->AddTagFromFile(&servermet); } // Server priorities are not in sorted order // High = 1, Low = 2, Normal = 0, so we have to check // in a less logical fashion. int priority = newserver->GetPreferences(); if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { newserver->SetPreference(SRV_PR_NORMAL); } // set listname for server if ( newserver->GetListName().IsEmpty() ) { newserver->SetListName(wxT("Server ") +newserver->GetAddress()); } if ( !theApp->AddServer(newserver) ) { CServer* update = GetServerByAddress(newserver->GetAddress(), newserver->GetPort()); if(update) { update->SetListName( newserver->GetListName()); if(!newserver->GetDescription().IsEmpty()) { update->SetDescription( newserver->GetDescription()); } Notify_ServerRefresh(update); } delete newserver; } else { ++iAddCount; } } Notify_ServerThaw(); if (!merge) { AddLogLineC(CFormat(wxPLURAL("%i server in server.met found", "%i servers in server.met found", fservercount)) % fservercount); } else { AddLogLineC(CFormat(wxPLURAL("%d server added", "%d servers added", iAddCount)) % iAddCount); } } catch (const CInvalidPacket& err) { AddLogLineC(_("Error: the file 'server.met' is corrupted: ") + err.what()); Notify_ServerThaw(); return false; } catch (const CSafeIOException& err) { AddLogLineC(_("IO error while reading 'server.met': ") + err.what()); Notify_ServerThaw(); return false; } return true; } bool CServerList::AddServer(CServer* in_server, bool fromUser) { if ( !in_server->GetPort() ) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: [%s:%d] does not specify a valid port.") ) % in_server->GetAddress() % in_server->GetPort() ); } return false; } else if ( !in_server->HasDynIP() && ( !IsGoodIP( in_server->GetIP(), thePrefs::FilterLanIPs() ) || ( // don't test for filtered while ipfilter is still loading, // it will be filtered when filter loading is finished theApp->ipfilter->IsReady() && theApp->ipfilter->IsFiltered(in_server->GetIP(), true)) ) ) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: The IP of [%s:%d] is filtered or invalid.") ) % in_server->GetAddress() % in_server->GetPort() ); } return false; } CServer* test_server = GetServerByAddress(in_server->GetAddress(), in_server->GetPort()); // Avoid duplicate (dynIP) servers: If the server which is to be added, is a dynIP-server // but we don't know yet it's DN, we need to search for an already available server with // that IP. if (test_server == NULL && in_server->GetIP() != 0) { test_server = GetServerByIPTCP(in_server->GetIP(), in_server->GetPort()); } if (test_server) { if ( fromUser ) { AddLogLineC(CFormat( _("Server not added: Server with matching IP:Port [%s:%d] found in list.") ) % in_server->GetAddress() % in_server->GetPort() ); } test_server->ResetFailedCount(); Notify_ServerRefresh( test_server ); return false; } theStats::AddServer(); m_servers.push_back(in_server); NotifyObservers( EventType( EventType::INSERTED, in_server ) ); if ( fromUser ) { AddLogLineC(CFormat( _("Server added: Server at [%s:%d] using the name '%s'.") ) % in_server->GetAddress() % in_server->GetPort() % in_server->GetListName() ); } return true; } void CServerList::ServerStats() { uint32 tNow = ::GetTickCount(); if (theApp->IsConnectedED2K() && m_servers.size() > 0) { CServer* ping_server = GetNextStatServer(); CServer* test = ping_server; if (!ping_server) { return; } while (ping_server->GetLastPingedTime() && (tNow - ping_server->GetLastPingedTime()) < UDPSERVSTATREASKTIME) { ping_server = GetNextStatServer(); if (ping_server == test) { return; } } if (ping_server->GetFailedCount() >= thePrefs::GetDeadserverRetries() && thePrefs::DeadServer() && !ping_server->IsStaticMember()) { RemoveServer(ping_server); return; } srand((unsigned)time(NULL)); ping_server->SetRealLastPingedTime(tNow); // this is not used to calcualte the next ping, but only to ensure a minimum delay for premature pings if (!ping_server->GetCryptPingReplyPending() && (!ping_server->GetLastPingedTime() || (tNow - ping_server->GetLastPingedTime()) >= UDPSERVSTATREASKTIME) && theApp->GetPublicIP() && thePrefs::IsServerCryptLayerUDPEnabled()) { // We try a obfsucation ping first and wait 20 seconds for an answer // if it doesn't get responsed, we don't count it as error but continue with a normal ping ping_server->SetCryptPingReplyPending(true); uint32 nPacketLen = 4 + (uint8)(rand() % 16); // max padding 16 bytes CScopedArray pRawPacket(nPacketLen); uint32 dwChallenge = (rand() << 17) | (rand() << 2) | (rand() & 0x03); if (dwChallenge == 0) { dwChallenge++; } memcpy(pRawPacket.get(), &dwChallenge, sizeof(uint32)); for (uint32 i = 4; i < nPacketLen; i++) { // fillng up the remaining bytes with random data pRawPacket[i] = (uint8)rand(); } ping_server->SetChallenge(dwChallenge); ping_server->SetLastPinged(tNow); ping_server->SetLastPingedTime((tNow - (uint32)UDPSERVSTATREASKTIME) + 20); // give it 20 seconds to respond AddDebugLogLineN(logServerUDP, CFormat(wxT(">> Sending OP__GlobServStatReq (obfuscated) to server %s:%u")) % ping_server->GetAddress() % ping_server->GetPort()); CPacket* packet = new CPacket(pRawPacket[1], nPacketLen - 2, pRawPacket[0]); packet->CopyToDataBuffer(0, pRawPacket.get() + 2, nPacketLen - 2); theStats::AddUpOverheadServer(packet->GetPacketSize()); theApp->serverconnect->SendUDPPacket(packet, ping_server, true, true /*raw packet*/, 12 /* Port offset is 12 for obfuscated encryption*/); } else if (ping_server->GetCryptPingReplyPending() || theApp->GetPublicIP() == 0 || !thePrefs::IsServerCryptLayerUDPEnabled()){ // our obfsucation ping request was not answered, so probably the server doesn'T supports obfuscation // continue with a normal request if (ping_server->GetCryptPingReplyPending() && thePrefs::IsServerCryptLayerUDPEnabled()) { AddDebugLogLineN(logServerUDP, wxT("CryptPing failed for server ") + ping_server->GetListName()); } else if (thePrefs::IsServerCryptLayerUDPEnabled()) { AddDebugLogLineN(logServerUDP, wxT("CryptPing skipped because our public IP is unknown for server ") + ping_server->GetListName()); } ping_server->SetCryptPingReplyPending(false); CPacket* packet = new CPacket(OP_GLOBSERVSTATREQ, 4, OP_EDONKEYPROT); uint32 challenge = 0x55AA0000 + (uint16)rand(); ping_server->SetChallenge(challenge); packet->CopyUInt32ToDataBuffer(challenge); ping_server->SetLastPinged(tNow); ping_server->SetLastPingedTime(tNow - (rand() % HR2S(1))); ping_server->AddFailedCount(); Notify_ServerRefresh(ping_server); theStats::AddUpOverheadServer(packet->GetPacketSize()); theApp->serverconnect->SendUDPPacket(packet, ping_server, true); } else { wxFAIL; } } } void CServerList::RemoveServer(CServer* in_server) { if (in_server == theApp->serverconnect->GetCurrentServer()) { theApp->ShowAlert(_("You are connected to the server you are trying to delete. please disconnect first."), _("Info"), wxOK); } else { CInternalList::iterator it = std::find(m_servers.begin(), m_servers.end(), in_server); if ( it != m_servers.end() ) { if (theApp->downloadqueue->GetUDPServer() == in_server) { theApp->downloadqueue->SetUDPServer( 0 ); } NotifyObservers( EventType( EventType::REMOVED, in_server ) ); if (m_serverpos == it) { ++m_serverpos; } if (m_statserverpos == it) { ++m_statserverpos; } m_servers.erase(it); theStats::DeleteServer(); Notify_ServerRemove(in_server); delete in_server; } } } void CServerList::RemoveAllServers() { NotifyObservers( EventType( EventType::CLEARED ) ); theStats::DeleteAllServers(); // no connection, safely remove all servers while ( !m_servers.empty() ) { delete m_servers.back(); m_servers.pop_back(); } m_serverpos = m_servers.end(); m_statserverpos = m_servers.end(); } void CServerList::GetStatus(uint32 &failed, uint32 &user, uint32 &file, uint32 &tuser, uint32 &tfile,float &occ) { failed = 0; user = 0; file = 0; tuser=0; tfile = 0; occ=0; uint32 maxusers=0; uint32 tuserk = 0; for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { const CServer* const curr = *it; if( curr->GetFailedCount() ) { ++failed; } else { user += curr->GetUsers(); file += curr->GetFiles(); } tuser += curr->GetUsers(); tfile += curr->GetFiles(); if (curr->GetMaxUsers()) { tuserk += curr->GetUsers(); // total users on servers with known maximum maxusers+=curr->GetMaxUsers(); } } if (maxusers>0) { occ=(float)(tuserk*100)/maxusers; } } void CServerList::GetUserFileStatus(uint32 &user, uint32 &file) { user = 0; file = 0; for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { const CServer* const curr = *it; if( !curr->GetFailedCount() ) { user += curr->GetUsers(); file += curr->GetFiles(); } } } CServerList::~CServerList() { if (thePrefs::GetNetworkED2K() && IsInitialized()) { SaveServerMet(); } while ( !m_servers.empty() ) { delete m_servers.back(); m_servers.pop_back(); } } void CServerList::LoadStaticServers() { if ( !CPath::FileExists(m_staticServersConfig) ) { return; } wxFileInputStream stream(m_staticServersConfig); wxTextInputStream f(stream); while ( !stream.Eof() ) { wxString line = f.ReadLine(); // Skip comments if ( line.GetChar(0) == '#' || line.GetChar(0) == '/') { continue; } wxStringTokenizer tokens( line, wxT(",") ); if ( tokens.CountTokens() != 3 ) { continue; } // format is host:port,priority,Name wxString addy = tokens.GetNextToken().Strip( wxString::both ); wxString prio = tokens.GetNextToken().Strip( wxString::both ); wxString name = tokens.GetNextToken().Strip( wxString::both ); wxString host = addy.BeforeFirst( wxT(':') ); wxString port = addy.AfterFirst( wxT(':') ); int priority = StrToLong( prio ); if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { priority = SRV_PR_NORMAL; } // We need a valid name for the list if ( name.IsEmpty() ) { name = addy; } // create server object and add it to the list CServer* server = new CServer( StrToLong( port ), host ); server->SetListName( name ); server->SetIsStaticMember( true ); server->SetPreference( priority ); // Try to add the server to the list if ( !theApp->AddServer( server ) ) { delete server; CServer* existing = GetServerByAddress( host, StrToULong( port ) ); if ( existing) { existing->SetListName( name ); existing->SetIsStaticMember( true ); existing->SetPreference( priority ); Notify_ServerRefresh( existing ); } } } } void CServerList::SaveStaticServers() { CTextFile file; if (!file.Open(m_staticServersConfig, CTextFile::write)) { AddLogLineN(CFormat( _("Failed to open '%s'") ) % m_staticServersConfig ); return; } for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { const CServer* server = *it; if (server->IsStaticMember()) { file.WriteLine(CFormat(wxT("%s:%u,%u,%s")) % server->GetAddress() % server->GetPort() % server->GetPreferences() % server->GetListName()); } } file.Close(); } struct ServerPriorityComparator { // Return true iff lhs should strictly appear earlier in the list than rhs. // In this case, we want higher priority servers to appear earlier. bool operator()(const CServer* lhs, const CServer* rhs) { wxASSERT ( rhs->GetPreferences() == SRV_PR_LOW || rhs->GetPreferences() == SRV_PR_NORMAL || rhs->GetPreferences() == SRV_PR_HIGH ); switch (lhs->GetPreferences()) { case SRV_PR_LOW: return false; case SRV_PR_NORMAL: return rhs->GetPreferences() == SRV_PR_LOW; case SRV_PR_HIGH: return rhs->GetPreferences() != SRV_PR_HIGH; default: wxFAIL; return false; } } }; void CServerList::Sort() { m_servers.sort(ServerPriorityComparator()); // Once the list has been sorted, it doesn't really make sense to continue // traversing the new order from the old position. Plus, there's a bug in // version of libstdc++ before gcc4 such that iterators that were equal to // end() were left dangling. m_serverpos = m_servers.begin(); m_statserverpos = m_servers.begin(); } CServer* CServerList::GetNextServer(bool bOnlyObfuscated) { while (bOnlyObfuscated && (m_serverpos != m_servers.end()) && !((*m_serverpos)->SupportsObfuscationTCP() || (*m_serverpos)->SupportsObfuscationUDP())) { wxASSERT(*m_serverpos != NULL); ++m_serverpos; } if (m_serverpos == m_servers.end()) { return 0; } else { if (*m_serverpos) { return *m_serverpos++; } else { return 0; } } } CServer* CServerList::GetNextStatServer() { if (m_statserverpos == m_servers.end()) { m_statserverpos = m_servers.begin(); } if (m_statserverpos == m_servers.end()) { return 0; } else { wxASSERT(*m_statserverpos != NULL); return *m_statserverpos++; } } CServer* CServerList::GetServerByAddress(const wxString& address, uint16 port) const { for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { CServer* const s = *it; if (port == s->GetPort() && s->GetAddress() == address) { return s; } } return NULL; } CServer* CServerList::GetServerByIP(uint32 nIP) const { for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ CServer* const s = *it; if (s->GetIP() == nIP) return s; } return NULL; } CServer* CServerList::GetServerByIPTCP(uint32 nIP, uint16 nPort) const { for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ CServer* const s = *it; if (s->GetIP() == nIP && s->GetPort() == nPort) return s; } return NULL; } CServer* CServerList::GetServerByIPUDP(uint32 nIP, uint16 nUDPPort, bool bObfuscationPorts) const { for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ CServer* const s =*it; if (s->GetIP() == nIP && (s->GetPort() == nUDPPort-4 || (bObfuscationPorts && s->GetObfuscationPortUDP() == nUDPPort) || s->GetPort() == nUDPPort - 12)) return s; } return NULL; } CServer* CServerList::GetServerByECID(uint32 ecid) const { for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ CServer* const s = *it; if (s->ECID() == ecid) { return s; } } return NULL; } void CServerList::SetStaticServer(CServer* server, bool isStatic) { server->SetIsStaticMember(isStatic); Notify_ServerRefresh(server); SaveStaticServers(); } void CServerList::SetServerPrio(CServer* server, uint32 prio) { server->SetPreference(prio); Notify_ServerRefresh(server); } bool CServerList::SaveServerMet() { CPath curservermet = CPath(theApp->ConfigDir + wxT("server.met")); CFile servermet(curservermet, CFile::write_safe); if (!servermet.IsOpened()) { AddLogLineN(_("Failed to save server.met!")); return false; } try { servermet.WriteUInt8(0xE0); servermet.WriteUInt32( m_servers.size() ); for ( CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { const CServer* const server = *it; uint16 tagcount = 12; if (!server->GetListName().IsEmpty()) { ++tagcount; } if (!server->GetDynIP().IsEmpty()) { ++tagcount; } if (!server->GetDescription().IsEmpty()) { ++tagcount; } if (server->GetConnPort() != server->GetPort()) { ++tagcount; } // For unicoded name, description, and dynip if ( !server->GetListName().IsEmpty() ) { ++tagcount; } if ( !server->GetDynIP().IsEmpty() ) { ++tagcount; } if ( !server->GetDescription().IsEmpty() ) { ++tagcount; } if (!server->GetVersion().IsEmpty()) { ++tagcount; } if (server->GetServerKeyUDP(true)) { ++tagcount; } if (server->GetServerKeyUDPIP()) { ++tagcount; } if (server->GetObfuscationPortTCP()) { ++tagcount; } if (server->GetObfuscationPortUDP()) { ++tagcount; } servermet.WriteUInt32(server->GetIP()); servermet.WriteUInt16(server->GetPort()); servermet.WriteUInt32(tagcount); if ( !server->GetListName().IsEmpty() ) { // This is BOM to keep eMule compatibility CTagString( ST_SERVERNAME, server->GetListName()).WriteTagToFile( &servermet, utf8strOptBOM); CTagString( ST_SERVERNAME, server->GetListName()).WriteTagToFile( &servermet ); } if ( !server->GetDynIP().IsEmpty() ) { // This is BOM to keep eMule compatibility CTagString( ST_DYNIP, server->GetDynIP()).WriteTagToFile( &servermet, utf8strOptBOM ); CTagString( ST_DYNIP, server->GetDynIP()).WriteTagToFile( &servermet ); } if ( !server->GetDescription().IsEmpty() ) { // This is BOM to keep eMule compatibility CTagString( ST_DESCRIPTION, server->GetDescription()).WriteTagToFile( &servermet, utf8strOptBOM ); CTagString( ST_DESCRIPTION, server->GetDescription()).WriteTagToFile( &servermet ); } if ( server->GetConnPort() != server->GetPort() ) { CTagString( ST_AUXPORTSLIST, server->GetAuxPortsList() ).WriteTagToFile( &servermet ); } CTagInt32( ST_FAIL, server->GetFailedCount() ).WriteTagToFile( &servermet ); CTagInt32( ST_PREFERENCE, server->GetPreferences() ).WriteTagToFile( &servermet ); CTagInt32( wxT("users"), server->GetUsers() ).WriteTagToFile( &servermet ); CTagInt32( wxT("files"), server->GetFiles() ).WriteTagToFile( &servermet ); CTagInt32( ST_PING, server->GetPing() ).WriteTagToFile( &servermet ); CTagInt32( ST_LASTPING, server->GetLastPingedTime()).WriteTagToFile( &servermet ); CTagInt32( ST_MAXUSERS, server->GetMaxUsers() ).WriteTagToFile( &servermet ); CTagInt32( ST_SOFTFILES, server->GetSoftFiles() ).WriteTagToFile( &servermet ); CTagInt32( ST_HARDFILES, server->GetHardFiles() ).WriteTagToFile( &servermet ); if (!server->GetVersion().IsEmpty()){ CTagString( ST_VERSION, server->GetVersion() ).WriteTagToFile( &servermet, utf8strOptBOM ); CTagString( ST_VERSION, server->GetVersion() ).WriteTagToFile( &servermet ); } CTagInt32( ST_UDPFLAGS, server->GetUDPFlags() ).WriteTagToFile( &servermet ); CTagInt32( ST_LOWIDUSERS, server->GetLowIDUsers() ).WriteTagToFile( &servermet ); if (server->GetServerKeyUDP(true)) { CTagInt32(ST_UDPKEY, server->GetServerKeyUDP(true)).WriteTagToFile( &servermet ); } if (server->GetServerKeyUDPIP()) { CTagInt32(ST_UDPKEYIP, server->GetServerKeyUDPIP()).WriteTagToFile( &servermet ); } if (server->GetObfuscationPortTCP()) { CTagInt16(ST_TCPPORTOBFUSCATION, server->GetObfuscationPortTCP()).WriteTagToFile( &servermet ); } if (server->GetObfuscationPortUDP()) { CTagInt16(ST_UDPPORTOBFUSCATION, server->GetObfuscationPortUDP()).WriteTagToFile( &servermet ); } } // Now server.met.new is ready to be closed and renamed to server.met. // But first rename existing server.met to server.met.bak (replacing old .bak file). const CPath oldservermet = CPath(theApp->ConfigDir + wxT("server.met.bak")); if (curservermet.FileExists()) { CPath::RenameFile(curservermet, oldservermet, true); } servermet.Close(); } catch (const CIOFailureException& e) { AddLogLineC(wxT("IO failure while writing 'server.met': ") + e.what()); return false; } return true; } void CServerList::RemoveDeadServers() { if ( thePrefs::DeadServer() ) { for ( CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ) { CServer* server = *it++; if ( server->GetFailedCount() > thePrefs::GetDeadserverRetries() && !server->IsStaticMember()) { RemoveServer(server); } } } } void CServerList::UpdateServerMetFromURL(const wxString& strURL) { if (strURL.Find(wxT("://")) == -1) { AddLogLineC(_("Invalid URL")); return; } m_URLUpdate = strURL; wxString strTempFilename(theApp->ConfigDir + wxT("server.met.download")); CHTTPDownloadThread *downloader = new CHTTPDownloadThread(strURL, strTempFilename, theApp->ConfigDir + wxT("server.met"), HTTP_ServerMet, false, false); downloader->Create(); downloader->Run(); } void CServerList::DownloadFinished(uint32 result) { if(result == HTTP_Success) { const CPath tempFilename = CPath(theApp->ConfigDir + wxT("server.met.download")); // curl succeeded. proceed with server.met loading LoadServerMet(tempFilename); SaveServerMet(); // So, file is loaded and merged, and also saved CPath::RemoveFile(tempFilename); AddLogLineN(CFormat(_("Finished downloading the server list from %s")) % m_URLUpdate); } else if (result == HTTP_Skipped) { AddLogLineN(CFormat(_("Skipped download of %s, because requested file is not newer.")) % wxT("server.met")); } else { AddLogLineC(CFormat(_("Failed to download %s from %s")) % wxT("server.met") % m_URLUpdate); } } void CServerList::AutoUpdate() { uint8 url_count = theApp->glob_prefs->adresses_list.GetCount(); if (!url_count) { AddLogLineC(_("No server list address entry in 'addresses.dat' found. Please paste a valid server list address into this file in order to auto-update your server list")); return; } // Do current URL. Callback function will take care of the others. while ( current_url_index < url_count ) { wxString URI = theApp->glob_prefs->adresses_list[current_url_index]; // We use wxURL to validate the URI if ( wxURL( URI ).GetError() == wxURL_NOERR ) { // Ok, got a valid URI m_URLUpdate = URI; wxString strTempFilename = theApp->ConfigDir + wxT("server_auto.met"); AddLogLineC(CFormat( _("Start downloading server list from %s")) % URI); CHTTPDownloadThread *downloader = new CHTTPDownloadThread( URI, strTempFilename, theApp->ConfigDir + wxT("server.met"), HTTP_ServerMetAuto, false, false); downloader->Create(); downloader->Run(); return; } else { AddLogLineC(CFormat( _("WARNING: invalid URL specified for auto-updating of servers: %s") ) % URI); } current_url_index++; } AddLogLineC(_("No valid server.met auto-download url on addresses.dat")); } void CServerList::AutoDownloadFinished(uint32 result) { if (result == HTTP_Success) { CPath tempFilename = CPath(theApp->ConfigDir + wxT("server_auto.met")); // curl succeeded. proceed with server.met loading LoadServerMet(tempFilename); SaveServerMet(); // So, file is loaded and merged, and also saved CPath::RemoveFile(tempFilename); } else { AddLogLineC(CFormat(_("Failed to download the server list from %s") ) % m_URLUpdate); } ++current_url_index; if (current_url_index < theApp->glob_prefs->adresses_list.GetCount()) { // Next! AutoUpdate(); } } void CServerList::ObserverAdded( ObserverType* o ) { CObservableQueue::ObserverAdded( o ); EventType::ValueList ilist; ilist.reserve( m_servers.size() ); ilist.assign( m_servers.begin(), m_servers.end() ); NotifyObservers( EventType( EventType::INITIAL, &ilist ), o ); } uint32 CServerList::GetAvgFile() const { //Since there is no real way to know how many files are in the kad network, //I figure to try to use the ED2K network stats to find how many files the //average user shares.. uint32 totaluser = 0; uint32 totalfile = 0; for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it){ const CServer* const curr = *it; //If this server has reported Users/Files and doesn't limit it's files too much //use this in the calculation.. if( curr->GetUsers() && curr->GetFiles() && curr->GetSoftFiles() > 1000 ) { totaluser += curr->GetUsers(); totalfile += curr->GetFiles(); } } //If the user count is a little low, don't send back a average.. //I added 50 to the count as many servers do not allow a large amount of files to be shared.. //Therefore the estimate here will be lower then the actual. //I would love to add a way for the client to send some statistics back so we could see the real //values here.. if ( totaluser > 500000 ) { return (totalfile/totaluser)+50; } else { return 0; } } std::vector CServerList::CopySnapshot() const { std::vector result; result.reserve(m_servers.size()); result.assign(m_servers.begin(), m_servers.end()); return result; } void CServerList::FilterServers() { CInternalList::iterator it = m_servers.begin(); while (it != m_servers.end()) { CServer* server = *it++; if (server->HasDynIP()) { continue; } if (theApp->ipfilter->IsFiltered(server->GetIP(), true)) { if (server == theApp->serverconnect->GetCurrentServer()) { AddLogLineC(_("Local server is filtered by the IPFilters, reconnecting to a different server!")); theApp->serverconnect->Disconnect(); RemoveServer(server); theApp->serverconnect->ConnectToAnyServer(); } else { RemoveServer(server); } } } } void CServerList::CheckForExpiredUDPKeys() { if (!thePrefs::IsServerCryptLayerUDPEnabled()) { return; } uint32 cKeysTotal = 0; uint32 cKeysExpired = 0; uint32 cPingDelayed = 0; const uint32 dwIP = theApp->GetPublicIP(); const uint32 tNow = ::GetTickCount(); wxASSERT( dwIP != 0 ); for (CInternalList::const_iterator it = m_servers.begin(); it != m_servers.end(); ++it) { CServer* pServer = *it; if (pServer->SupportsObfuscationUDP() && pServer->GetServerKeyUDP(true) != 0 && pServer->GetServerKeyUDPIP() != dwIP){ cKeysTotal++; cKeysExpired++; if (tNow - pServer->GetRealLastPingedTime() < UDPSERVSTATMINREASKTIME){ cPingDelayed++; // next ping: Now + (MinimumDelay - already elapsed time) pServer->SetLastPingedTime((tNow - (uint32)UDPSERVSTATREASKTIME) + (UDPSERVSTATMINREASKTIME - (tNow - pServer->GetRealLastPingedTime()))); } else { pServer->SetLastPingedTime(0); } } else if (pServer->SupportsObfuscationUDP() && pServer->GetServerKeyUDP(false) != 0) { cKeysTotal++; } } } // File_checked_for_headers aMule-2.3.1/src/Statistics.cpp0000644000175000017470000012136011575347521015126 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // Copyright (c) 2005-2011 Dévai Tamás ( gonosztopi@amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "Statistics.h" // Interface declarations #include #include // Needed for CECTag #ifndef CLIENT_GUI #ifndef AMULE_DAEMON #include // Needed for CFormat #endif #include "CFile.h" // Needed for CFile access #include // Needed for JoinPaths #include // Needed for wxConfig #include "DataToText.h" // Needed for GetSoftName() #include "Preferences.h" // Needed for thePrefs #include "ListenSocket.h" // (tree, GetAverageConnections) #include "ServerList.h" // Needed for CServerList (tree) #include // Needed for std::floor #include "updownclient.h" // Needed for CUpDownClient #else #include "GetTickCount.h" // Needed for GetTickCount64() #include "Preferences.h" #include // Needed for CRemoteConnect #endif #include "amule.h" // Needed for theApp #include #ifdef __BSD__ // glibc -> bsd libc #define round rint #else #define round(x) floor(x+0.5) #endif /* __BSD__ */ #ifndef CLIENT_GUI /*----- CPreciseRateCounter -----*/ void CPreciseRateCounter::CalculateRate(uint64_t now) { wxMutexLocker lock(m_mutex); m_total += m_tmp_sum; m_byte_history.push_back(m_tmp_sum); m_tick_history.push_back(now); m_tmp_sum = 0; uint64_t timespan = now - m_tick_history.front(); // Checking maximal timespan, but make sure not to remove // the extra node in m_tick_history. while (timespan > m_timespan && m_byte_history.size() > 0) { m_total -= m_byte_history.front(); m_byte_history.pop_front(); m_tick_history.pop_front(); timespan = now - m_tick_history.front(); } // Count rate/average if (m_count_average) { if (m_byte_history.size() > 0) { m_rate = m_total / (double)m_byte_history.size(); } } else { if (timespan > 0) { m_rate = m_total / (timespan / 1000.0); } } if (m_rate > m_max_rate) { m_max_rate = m_rate; } } /*----- CStatTreeItemRateCounter -----*/ #ifndef AMULE_DAEMON wxString CStatTreeItemRateCounter::GetDisplayString() const { return CFormat(wxGetTranslation(m_label)) % CastItoSpeed(m_show_maxrate ? (uint32)m_max_rate : (uint32)m_rate); } #endif void CStatTreeItemRateCounter::AddECValues(CECTag* tag) const { CECTag value(EC_TAG_STAT_NODE_VALUE, m_show_maxrate ? (uint32)m_max_rate : (uint32)m_rate); value.AddTag(CECTag(EC_TAG_STAT_VALUE_TYPE, (uint8)EC_VALUE_SPEED)); tag->AddTag(value); } /*----- CStatTreeItemPeakConnections -----*/ #ifndef AMULE_DAEMON wxString CStatTreeItemPeakConnections::GetDisplayString() const { return CFormat(wxGetTranslation(m_label)) % theStats::GetPeakConnections(); } #endif void CStatTreeItemPeakConnections::AddECValues(CECTag* tag) const { tag->AddTag(CECTag(EC_TAG_STAT_NODE_VALUE, (uint64)theStats::GetPeakConnections())); } /*----- CStatistics -----*/ // Static variables // Rate counters CPreciseRateCounter* CStatistics::s_upOverheadRate; CPreciseRateCounter* CStatistics::s_downOverheadRate; CStatTreeItemRateCounter* CStatistics::s_uploadrate; CStatTreeItemRateCounter* CStatistics::s_downloadrate; #else /* CLIENT_GUI */ uint64 CStatistics::s_start_time; uint64 CStatistics::s_statData[sdTotalItems]; #endif /* !CLIENT_GUI / CLIENT_GUI */ // Tree root CStatTreeItemBase* CStatistics::s_statTree; #ifndef CLIENT_GUI // Uptime CStatTreeItemTimer* CStatistics::s_uptime; // Upload CStatTreeItemUlDlCounter* CStatistics::s_sessionUpload; CStatTreeItemPacketTotals* CStatistics::s_totalUpOverhead; CStatTreeItemPackets* CStatistics::s_fileReqUpOverhead; CStatTreeItemPackets* CStatistics::s_sourceXchgUpOverhead; CStatTreeItemPackets* CStatistics::s_serverUpOverhead; CStatTreeItemPackets* CStatistics::s_kadUpOverhead; CStatTreeItemCounter* CStatistics::s_cryptUpOverhead; CStatTreeItemNativeCounter* CStatistics::s_activeUploads; CStatTreeItemNativeCounter* CStatistics::s_waitingUploads; CStatTreeItemCounter* CStatistics::s_totalSuccUploads; CStatTreeItemCounter* CStatistics::s_totalFailedUploads; CStatTreeItemCounter* CStatistics::s_totalUploadTime; // Download CStatTreeItemUlDlCounter* CStatistics::s_sessionDownload; CStatTreeItemPacketTotals* CStatistics::s_totalDownOverhead; CStatTreeItemPackets* CStatistics::s_fileReqDownOverhead; CStatTreeItemPackets* CStatistics::s_sourceXchgDownOverhead; CStatTreeItemPackets* CStatistics::s_serverDownOverhead; CStatTreeItemPackets* CStatistics::s_kadDownOverhead; CStatTreeItemCounter* CStatistics::s_cryptDownOverhead; CStatTreeItemNativeCounter* CStatistics::s_foundSources; CStatTreeItemNativeCounter* CStatistics::s_activeDownloads; // Connection CStatTreeItemReconnects* CStatistics::s_reconnects; CStatTreeItemTimer* CStatistics::s_sinceFirstTransfer; CStatTreeItemTimer* CStatistics::s_sinceConnected; CStatTreeItemCounterMax* CStatistics::s_activeConnections; CStatTreeItemMaxConnLimitReached* CStatistics::s_limitReached; CStatTreeItemSimple* CStatistics::s_avgConnections; // Clients CStatTreeItemHiddenCounter* CStatistics::s_clients; CStatTreeItemCounter* CStatistics::s_unknown; //CStatTreeItem CStatistics::s_lowID; //CStatTreeItem CStatistics::s_secIdentOnOff; #ifdef __DEBUG__ CStatTreeItemNativeCounter* CStatistics::s_hasSocket; #endif CStatTreeItemNativeCounter* CStatistics::s_filtered; CStatTreeItemNativeCounter* CStatistics::s_banned; // Servers CStatTreeItemSimple* CStatistics::s_workingServers; CStatTreeItemSimple* CStatistics::s_failedServers; CStatTreeItemNativeCounter* CStatistics::s_totalServers; CStatTreeItemNativeCounter* CStatistics::s_deletedServers; CStatTreeItemNativeCounter* CStatistics::s_filteredServers; CStatTreeItemSimple* CStatistics::s_usersOnWorking; CStatTreeItemSimple* CStatistics::s_filesOnWorking; CStatTreeItemSimple* CStatistics::s_totalUsers; CStatTreeItemSimple* CStatistics::s_totalFiles; CStatTreeItemSimple* CStatistics::s_serverOccupation; // Shared files CStatTreeItemCounter* CStatistics::s_numberOfShared; CStatTreeItemCounter* CStatistics::s_sizeOfShare; // Kad uint64_t CStatistics::s_kadNodesTotal; uint16_t CStatistics::s_kadNodesCur; // Totals uint64_t CStatistics::s_totalSent; uint64_t CStatistics::s_totalReceived; bool CStatistics::s_statsNeedSave; CStatistics::CStatistics() : m_graphRunningAvgDown(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true), m_graphRunningAvgUp(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true), m_graphRunningAvgKad(thePrefs::GetStatsAverageMinutes() * 60 * 1000, true) { uint64 start_time = GetTickCount64(); // Init graphs average_minutes = thePrefs::GetStatsAverageMinutes(); HR hr = {0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0}; hrInit = hr; nHistRanges = 7; // =ceil(log(max_update_delay)/log(2)) nPointsPerRange = GetPointsPerRange(); bitsHistClockMask = (1 << (nHistRanges-1)) - 1; aposRecycle = new listPOS[nHistRanges]; listPOS *ppos = aposRecycle+nHistRanges-1; for (int i=nHistRanges; i>0; --i) { // permanently allocated history list listHR.push_back(hr); *ppos-- = --listHR.end(); for (int j=nPointsPerRange; j>1; --j) listHR.push_back(hr); } // Init rate counters outside the tree s_upOverheadRate = new CPreciseRateCounter(5000); s_downOverheadRate = new CPreciseRateCounter(5000); // Init Tree InitStatsTree(); s_uptime->SetStartTime(start_time); // Load saved statistics Load(); s_statsNeedSave = false; } CStatistics::~CStatistics() { // clearing listHR frees the memory occupied by the nodes listHR.clear(); delete [] aposRecycle; delete s_statTree; // delete items not in the tree delete s_totalUploadTime; // delete rate counters outside the tree delete s_upOverheadRate; delete s_downOverheadRate; } uint64_t ReadUInt64FromCfg(wxConfigBase* cfg, const wxString& key) { wxString buffer; cfg->Read(key, &buffer, wxT("0")); uint64 tmp = 0; for (unsigned int i = 0; i < buffer.Length(); ++i) { if ((buffer[i] >= wxChar('0')) &&(buffer[i] <= wxChar('9'))) { tmp = tmp * 10 + (buffer[i] - wxChar('0')); } else { tmp = 0; break; } } return tmp; } void CStatistics::Load() { CFile f; s_totalSent = 0; s_totalReceived = 0; if (f.Open(JoinPaths(theApp->ConfigDir, wxT("statistics.dat")))) { uint8_t version = f.ReadUInt8(); if (version == 0) { s_totalSent = f.ReadUInt64(); s_totalReceived = f.ReadUInt64(); } } // Load old values from config bool cfgChanged = false; wxConfigBase* cfg = wxConfigBase::Get(); if (cfg->HasEntry(wxT("/Statistics/TotalUploadedBytes"))) { s_totalSent += ReadUInt64FromCfg(cfg, wxT("/Statistics/TotalUploadedBytes")); cfg->DeleteEntry(wxT("/Statistics/TotalUploadedBytes")); cfgChanged = true; } if (cfg->HasEntry(wxT("/Statistics/TotalDownloadedBytes"))) { s_totalReceived += ReadUInt64FromCfg(cfg, wxT("/Statistics/TotalDownloadedBytes")); cfg->DeleteEntry(wxT("/Statistics/TotalDownloadedBytes")); cfgChanged = true; } if (cfgChanged) { cfg->Flush(); s_statsNeedSave = s_totalSent > 0 || s_totalReceived > 0; Save(); } } void CStatistics::Save() { if (s_statsNeedSave) { CFile f; if (f.Open(JoinPaths(theApp->ConfigDir, wxT("statistics.dat")), CFile::write)) { f.WriteUInt8(0); /* version */ f.WriteUInt64(s_totalSent); f.WriteUInt64(s_totalReceived); } s_statsNeedSave = false; } } void CStatistics::CalculateRates() { uint64_t now = GetTickCount64(); s_downOverheadRate->CalculateRate(now); s_upOverheadRate->CalculateRate(now); s_downloadrate->CalculateRate(now); s_uploadrate->CalculateRate(now); } /* ------------------------------- GRAPHS ---------------------------- */ /* History List The basic idea here is that we want to keep as much history as we can without paying a high price in terms of memory space. Because we keep the history for display purposes, we can take advantage of the fact that when the period shown in the graphs is long then each pixel represents a long period. So as the most recent history we keep one window full of points at a resolution of 1 second, the next window full at 2 seconds, the next at 4 seconds and so on, up to the maximum desired. This way there is always at least one sample point per pixel for any update delay set by the user, and the memory required grows with the *log* of the total time period covered. The history is kept in a doubly-linked list, with the most recent snapshot at the tail. The number of nodes in the list is fixed, and there are no calls to RemoveHead() and AddTail() which would add overhead and contribute to memory fragmentation. Instead, every second when a new point gets recorded, one of the existing nodes is recycled; it is disjoined from its present place, put at the tail of the list, and then gets filled with new data. [Emilio Sandoz] This unfortunately does not work with stl classes, as none of them supports moving a node to another place, so we have to erase and re-add nodes. */ void CStatistics::RecordHistory() { // First we query and compute some values, then we store them in the history list // A few comments about the use of double and float in computations: // Even on a hi-res screen our graphs will have 10 bits of resolution at most, // so the 24 bits resolution of a float on 32 bit Intel processors is more than // enough for all displayed values. Rate computations however, and especially // running average computations, use differences (delta bytes/ delta time), and // for long uptimes the difference between two timestamps can lose too much // accuracy because the large mantissa causes less significant bits to be dropped // (same for the difference between two cumulative byte counts). [We don't store // these values as integers because they will be used in floating point calculations, // and we want to perform the conversion only once). Therefore timestamps and // Kbyte counts are stored in the history as doubles, while computed values use // float (to save space and execution time). /* Store values; first determine the node to be recycled (using the bits in iClock) oldest records ----------------- listHR ------------------ youngest records O-[Range 2^n sec]-O- ... -O-[Range 4 sec]-O-[Range 2 sec]-O-[Range 1 sec]-O | | | | > every 2 secs -^ | | ... | >--------------- every 4 secs -^ | | >------------------------ recycle every 8 secs -^ | | ... | >-the node at this position is recycled every 2^n secs -^ >-------------------(ditto for the oldest node at the head of the list) --^ ^ ^ aposRecycle[nHistRanges-1] ... aposRecycle[0] Tail */ listPOS *ppos; static int iClock; int iClockPrev = iClock++; int bits = (iClockPrev^iClock) & iClock; // identify the highest changed bit if (bits <= bitsHistClockMask) { ppos = aposRecycle; while ((bits /= 2) != 0) // count to the highest bit that was just toggled to 1 ++ppos; // recycle one node and jump over the next to move it to the next higher range listHR.push_back(**ppos); *ppos = ++listHR.erase(*ppos); } else { ppos = aposRecycle+nHistRanges-1; // recycle the node at the head; there is no higher range to move nodes into listHR.push_back(**ppos); *ppos = listHR.erase(*ppos); } // now save the latest data point in this node listPOS phr = --listHR.end(); phr->kBytesSent = GetSessionSentBytes() / 1024.0; phr->kBytesReceived = GetSessionReceivedBytes() / 1024.0; phr->kBpsUpCur = GetUploadRate() / 1024.0; phr->kBpsDownCur = GetDownloadRate() / 1024.0; phr->cntUploads = GetActiveUploadsCount(); phr->cntConnections = GetActiveConnections(); phr->cntDownloads = GetDownloadingSources(); phr->sTimestamp = GetUptimeMillis() / 1000.0; s_kadNodesTotal += s_kadNodesCur; phr->kadNodesTotal = s_kadNodesTotal; phr->kadNodesCur = s_kadNodesCur; } unsigned CStatistics::GetHistory( // Assemble arrays of sample points for a graph unsigned cntPoints, // number of sample points to assemble double sStep, // time difference between sample points double sFinal, // latest allowed timestamp const std::vector &ppf,// an array of pointers to arrays of floats for the result StatsGraphType which_graph) // the graph which will receive the points { if (sStep==0.0 || cntPoints==0) { return(0); } float *pf1 = ppf[0]; float *pf2 = ppf[1]; float *pf3 = ppf[2]; unsigned cntFilled = 0; listRPOS pos = listHR.rbegin(); // start of list should be an integer multiple of the sampling period for samples // to be consistent when the graphs are resized horizontally double sTarget; if (sFinal >= 0.0) { sTarget = sFinal; } else { sTarget = sStep==1.0 ? pos->sTimestamp : std::floor(pos->sTimestamp/sStep) * sStep; } HR **ahr = NULL, **pphr = NULL; bool bRateGraph = (which_graph != GRAPH_CONN); // rate graph or connections graph? if (bRateGraph) { ahr = new HR* [cntPoints]; pphr = ahr; } while (pos != listHR.rend()) { if (pos->sTimestamp > sTarget) { ++pos; continue; } if (bRateGraph) { // assemble an array of pointers for ComputeAverages *pphr++ = &(*pos); } else { // or build the arrays if possible *pf1++ = (float)pos->cntUploads; *pf2++ = (float)pos->cntConnections; *pf3++ = (float)pos->cntDownloads; } if (++cntFilled == cntPoints) { // enough points break; } if (pos->sTimestamp == 0.0) { // reached beginning of uptime break; } if ((sTarget -= sStep) <= 0.0) { // don't overshoot the beginning if (bRateGraph) { *pphr++ = &hrInit; } else { *pf1++ = *pf2++ = *pf3++ = 0.0; } ++cntFilled; break; } } if (bRateGraph) { if (cntFilled > 0) { ComputeAverages(pphr, pos, cntFilled, sStep, ppf, which_graph); } delete[] ahr; } return cntFilled; } unsigned CStatistics::GetHistoryForWeb( // Assemble arrays of sample points for the webserver unsigned cntPoints, // maximum number of sample points to assemble double sStep, // time difference between sample points double *sStart, // earliest allowed timestamp uint32 **graphData) // a pointer to a pointer that will point to the graph data array { if (*sStart < 0.0) { *sStart = 0.0; } if (sStep==0.0 || cntPoints==0) return(0); unsigned cntFilled = 0; listRPOS pos = listHR.rbegin(); double LastTimeStamp = pos->sTimestamp; double sTarget = LastTimeStamp; HR **pphr = new HR *[cntPoints]; while (pos != listHR.rend()) { if (pos->sTimestamp > sTarget) { ++pos; // find next history record continue; } pphr[cntFilled] = &(*pos); if (++cntFilled == cntPoints) // enough points break; if (pos->sTimestamp <= *sStart) // reached beginning of requested time break; if ((sTarget -= sStep) <= 0.0) { // don't overshoot the beginning pphr[cntFilled++] = NULL; break; } } if (cntFilled) { *graphData = new uint32 [4 * cntFilled]; if (*graphData) { for (unsigned int i = 0; i < cntFilled; i++) { HR *phr = pphr[cntFilled - i - 1]; if (phr) { (*graphData)[4 * i ] = ENDIAN_HTONL((uint32)(phr->kBpsDownCur * 1024.0)); (*graphData)[4 * i + 1] = ENDIAN_HTONL((uint32)(phr->kBpsUpCur * 1024.0)); (*graphData)[4 * i + 2] = ENDIAN_HTONL((uint32)phr->cntConnections); (*graphData)[4 * i + 3] = ENDIAN_HTONL((uint32)phr->kadNodesCur); } else { (*graphData)[4 * i] = (*graphData)[4 * i + 1] = 0; (*graphData)[4 * i + 2] = (*graphData)[4 * i + 3] = 0; } } } } else { *graphData = NULL; } delete [] pphr; *sStart = LastTimeStamp; return cntFilled; } void CStatistics::ComputeAverages( HR **pphr, // pointer to (end of) array of assembled history records listRPOS pos, // position in history list from which to backtrack unsigned cntFilled, // number of points in the sample data double sStep, // time difference between two samples const std::vector &ppf,// an array of pointers to arrays of floats with sample data StatsGraphType which_graph) // the graph which will receive the points { double sTarget, kValueRun; uint64 avgTime = average_minutes * 60; unsigned nBtPoints = (unsigned)(avgTime / sStep); CPreciseRateCounter* runningAvg = NULL; switch (which_graph) { case GRAPH_DOWN: runningAvg = &m_graphRunningAvgDown; break; case GRAPH_UP: runningAvg = &m_graphRunningAvgUp; break; case GRAPH_KAD: runningAvg = &m_graphRunningAvgKad; break; default: wxCHECK_RET(false, wxT("ComputeAverages called with unsupported graph type.")); } runningAvg->m_timespan = avgTime * 1000; runningAvg->m_tick_history.clear(); runningAvg->m_byte_history.clear(); runningAvg->m_total = 0; runningAvg->m_tmp_sum = 0; if (pos == listHR.rend()) { sTarget = 0.0; } else { sTarget = std::max(0.0, pos->sTimestamp - sStep); } while (nBtPoints--) { while (pos != listHR.rend() && pos->sTimestamp > sTarget) ++pos; // find next history record if (pos != listHR.rend()) { runningAvg->m_tick_history.push_front((uint64)(pos->sTimestamp * 1000.0)); uint32 value = 0; switch (which_graph) { case GRAPH_DOWN: value = (uint32)(pos->kBpsDownCur * 1024.0); break; case GRAPH_UP: value = (uint32)(pos->kBpsUpCur * 1024.0); break; case GRAPH_KAD: value = (uint32)(pos->kadNodesCur * 1024.0); break; default: wxCHECK_RET(false, wxT("ComputeAverages called with unsupported graph type.")); } runningAvg->m_byte_history.push_front(value); runningAvg->m_total += value; } else { break; } if ((sTarget -= sStep) < 0.0) { break; } }; // now compute averages in returned arrays, starting with the earliest values float *pf1 = ppf[0] + cntFilled - 1; // holds session avg float *pf2 = ppf[1] + cntFilled - 1; // holds running avg float *pf3 = ppf[2] + cntFilled - 1; // holds current rate for (int cnt=cntFilled; cnt>0; cnt--, pf1--, pf2--, pf3--) { HR *phr = *(--pphr); if (which_graph == GRAPH_DOWN) { kValueRun = phr->kBytesReceived; *pf3 = phr->kBpsDownCur; } else if (which_graph == GRAPH_UP) { kValueRun = phr->kBytesSent; *pf3 = phr->kBpsUpCur; } else { kValueRun = phr->kadNodesTotal; *pf3 = phr->kadNodesCur; } *pf1 = kValueRun / phr->sTimestamp; (*runningAvg) += (uint32)(*pf3 * 1024.0); runningAvg->CalculateRate((uint64)(phr->sTimestamp * 1000.0)); *pf2 = (float)(runningAvg->GetRate() / 1024.0); } } GraphUpdateInfo CStatistics::GetPointsForUpdate() { GraphUpdateInfo update; listPOS phr = --listHR.end(); update.timestamp = (double) phr->sTimestamp; m_graphRunningAvgDown += (uint32)(phr->kBpsDownCur * 1024.0); m_graphRunningAvgUp += (uint32)(phr->kBpsUpCur * 1024.0); // Note: kadNodesCur is multiplied by 1024 since the value is done // in other places, so we simply follow suit here to avoid trouble. m_graphRunningAvgKad += (uint32)(phr->kadNodesCur * 1024.0); m_graphRunningAvgDown.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); m_graphRunningAvgUp.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); m_graphRunningAvgKad.CalculateRate((uint64)(phr->sTimestamp * 1000.0)); update.downloads[0] = phr->kBytesReceived / phr->sTimestamp; update.downloads[1] = m_graphRunningAvgDown.GetRate() / 1024.0; update.downloads[2] = phr->kBpsDownCur; update.uploads[0] = phr->kBytesSent / phr->sTimestamp; update.uploads[1] = m_graphRunningAvgUp.GetRate() / 1024.0; update.uploads[2] = phr->kBpsUpCur; update.connections[0] = (float)phr->cntUploads; update.connections[1] = (float)phr->cntConnections; update.connections[2] = (float)phr->cntDownloads; update.kadnodes[0] = phr->kadNodesTotal / phr->sTimestamp; update.kadnodes[1] = m_graphRunningAvgKad.GetRate() / 1024.0; update.kadnodes[2] = phr->kadNodesCur; return update; } /* ------------------------------- TREE ---------------------------- */ void CStatistics::InitStatsTree() { s_statTree = new CStatTreeItemBase(wxTRANSLATE("Statistics")); CStatTreeItemBase* tmpRoot1; CStatTreeItemBase* tmpRoot2; s_uptime = (CStatTreeItemTimer*)s_statTree->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Uptime: %s"))); tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Transfer"), stSortChildren)); tmpRoot2 = tmpRoot1->AddChild(new CStatTreeItemBase(wxTRANSLATE("Uploads")), 2); s_sessionUpload = (CStatTreeItemUlDlCounter*)tmpRoot2->AddChild(new CStatTreeItemUlDlCounter(wxTRANSLATE("Uploaded Data (Session (Total)): %s"), theStats::GetTotalSentBytes, stSortChildren | stSortByValue)); // Children will be added on-the-fly s_totalUpOverhead = (CStatTreeItemPacketTotals*)tmpRoot2->AddChild(new CStatTreeItemPacketTotals(wxTRANSLATE("Total Overhead (Packets): %s"))); s_fileReqUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("File Request Overhead (Packets): %s"))); s_totalUpOverhead->AddPacketCounter(s_fileReqUpOverhead); s_sourceXchgUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Source Exchange Overhead (Packets): %s"))); s_totalUpOverhead->AddPacketCounter(s_sourceXchgUpOverhead); s_serverUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Server Overhead (Packets): %s"))); s_totalUpOverhead->AddPacketCounter(s_serverUpOverhead); s_kadUpOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Kad Overhead (Packets): %s"))); s_totalUpOverhead->AddPacketCounter(s_kadUpOverhead); s_cryptUpOverhead = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Crypt overhead (UDP): %s"))); s_cryptUpOverhead->SetDisplayMode(dmBytes); s_activeUploads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Active Uploads: %s"))); s_waitingUploads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Waiting Uploads: %s"))); s_totalSuccUploads = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total successful upload sessions: %s"))); s_totalFailedUploads = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total failed upload sessions: %s"))); s_totalUploadTime = new CStatTreeItemCounter(wxEmptyString); tmpRoot2->AddChild(new CStatTreeItemAverage(wxTRANSLATE("Average upload time: %s"), s_totalUploadTime, s_totalSuccUploads, dmTime)); tmpRoot2 = tmpRoot1->AddChild(new CStatTreeItemBase(wxTRANSLATE("Downloads")), 1); s_sessionDownload = (CStatTreeItemUlDlCounter*)tmpRoot2->AddChild(new CStatTreeItemUlDlCounter(wxTRANSLATE("Downloaded Data (Session (Total)): %s"), theStats::GetTotalReceivedBytes, stSortChildren | stSortByValue)); // Children will be added on-the-fly s_totalDownOverhead = (CStatTreeItemPacketTotals*)tmpRoot2->AddChild(new CStatTreeItemPacketTotals(wxTRANSLATE("Total Overhead (Packets): %s"))); s_fileReqDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("File Request Overhead (Packets): %s"))); s_totalDownOverhead->AddPacketCounter(s_fileReqDownOverhead); s_sourceXchgDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Source Exchange Overhead (Packets): %s"))); s_totalDownOverhead->AddPacketCounter(s_sourceXchgDownOverhead); s_serverDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Server Overhead (Packets): %s"))); s_totalDownOverhead->AddPacketCounter(s_serverDownOverhead); s_kadDownOverhead = (CStatTreeItemPackets*)tmpRoot2->AddChild(new CStatTreeItemPackets(wxTRANSLATE("Kad Overhead (Packets): %s"))); s_totalDownOverhead->AddPacketCounter(s_kadDownOverhead); s_cryptDownOverhead = (CStatTreeItemCounter*)tmpRoot2->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Crypt overhead (UDP): %s"))); s_cryptDownOverhead->SetDisplayMode(dmBytes); s_foundSources = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Found Sources: %s"), stSortChildren | stSortByValue)); s_activeDownloads = (CStatTreeItemNativeCounter*)tmpRoot2->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Active Downloads (chunks): %s"))); tmpRoot1->AddChild(new CStatTreeItemRatio(wxTRANSLATE("Session UL:DL Ratio (Total): %s"), s_sessionUpload, s_sessionDownload, theStats::GetTotalSentBytes, theStats::GetTotalReceivedBytes), 3); tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Connection"))); tmpRoot1->AddChild(new CStatTreeItemAverageSpeed(wxTRANSLATE("Average download rate (Session): %s"), s_sessionDownload, s_uptime)); tmpRoot1->AddChild(new CStatTreeItemAverageSpeed(wxTRANSLATE("Average upload rate (Session): %s"), s_sessionUpload, s_uptime)); s_downloadrate = (CStatTreeItemRateCounter*)tmpRoot1->AddChild(new CStatTreeItemRateCounter(wxTRANSLATE("Max download rate (Session): %s"), true, 30000)); s_uploadrate = (CStatTreeItemRateCounter*)tmpRoot1->AddChild(new CStatTreeItemRateCounter(wxTRANSLATE("Max upload rate (Session): %s"), true, 30000)); s_reconnects = (CStatTreeItemReconnects*)tmpRoot1->AddChild(new CStatTreeItemReconnects(wxTRANSLATE("Reconnects: %i"))); s_sinceFirstTransfer = (CStatTreeItemTimer*)tmpRoot1->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Time Since First Transfer: %s"), stHideIfZero)); s_sinceConnected = (CStatTreeItemTimer*)tmpRoot1->AddChild(new CStatTreeItemTimer(wxTRANSLATE("Connected To Server Since: %s"))); s_activeConnections = (CStatTreeItemCounterMax*)tmpRoot1->AddChild(new CStatTreeItemCounterMax(wxTRANSLATE("Active Connections (estimate): %i"))); s_limitReached = (CStatTreeItemMaxConnLimitReached*)tmpRoot1->AddChild(new CStatTreeItemMaxConnLimitReached(wxTRANSLATE("Max Connection Limit Reached: %s"))); s_avgConnections = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Average Connections (estimate): %g"))); s_avgConnections->SetValue(0.0); tmpRoot1->AddChild(new CStatTreeItemPeakConnections(wxTRANSLATE("Peak Connections (estimate): %i"))); s_clients = (CStatTreeItemHiddenCounter*)s_statTree->AddChild(new CStatTreeItemHiddenCounter(wxTRANSLATE("Clients"), stSortChildren | stSortByValue)); s_unknown = (CStatTreeItemCounter*)s_clients->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Unknown: %s")), 6); //s_lowID = (CStatTreeItem*)s_clients->AddChild(new CStatTreeItem(wxTRANSLATE("LowID: %u (%.2f%% Total %.2f%% Known)")), 5); //s_secIdentOnOff = (CStatTreeItem*)s_clients->AddChild(new CStatTreeItem(wxTRANSLATE("SecIdent On/Off: %u (%.2f%%) : %u (%.2f%%)")), 4); #ifdef __DEBUG__ s_hasSocket = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxT("HasSocket: %s")), 3); #endif s_filtered = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Filtered: %s")), 2); s_banned = (CStatTreeItemNativeCounter*)s_clients->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Banned: %s")), 1); s_clients->AddChild(new CStatTreeItemTotalClients(wxTRANSLATE("Total: %i Known: %i"), s_clients, s_unknown), 0x80000000); // TODO: Use counters? tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Servers"))); s_workingServers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Working Servers: %i"))); s_failedServers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Failed Servers: %i"))); s_totalServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Total: %s"))); s_deletedServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Deleted Servers: %s"))); s_filteredServers = (CStatTreeItemNativeCounter*)tmpRoot1->AddChild(new CStatTreeItemNativeCounter(wxTRANSLATE("Filtered Servers: %s"))); s_usersOnWorking = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Users on Working Servers: %llu"))); s_filesOnWorking = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Files on Working Servers: %llu"))); s_totalUsers = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Total Users: %llu"))); s_totalFiles = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Total Files: %llu"))); s_serverOccupation = (CStatTreeItemSimple*)tmpRoot1->AddChild(new CStatTreeItemSimple(wxTRANSLATE("Server Occupation: %.2f%%"))); s_serverOccupation->SetValue(0.0); tmpRoot1 = s_statTree->AddChild(new CStatTreeItemBase(wxTRANSLATE("Shared Files"))); s_numberOfShared = (CStatTreeItemCounter*)tmpRoot1->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Number of Shared Files: %s"))); s_sizeOfShare = (CStatTreeItemCounter*)tmpRoot1->AddChild(new CStatTreeItemCounter(wxTRANSLATE("Total size of Shared Files: %s"))); s_sizeOfShare->SetDisplayMode(dmBytes); tmpRoot1->AddChild(new CStatTreeItemAverage(wxTRANSLATE("Average file size: %s"), s_sizeOfShare, s_numberOfShared, dmBytes)); } void CStatistics::UpdateStatsTree() { // get sort orders right s_sessionUpload->ReSortChildren(); s_sessionDownload->ReSortChildren(); s_clients->ReSortChildren(); s_foundSources->ReSortChildren(); // TODO: sort OS_Info subtrees. s_avgConnections->SetValue(theApp->listensocket->GetAverageConnections()); // get serverstats // TODO: make these realtime, too uint32 servfail; uint32 servuser; uint32 servfile; uint32 servtuser; uint32 servtfile; float servocc; theApp->serverlist->GetStatus(servfail, servuser, servfile, servtuser, servtfile, servocc); s_workingServers->SetValue((uint64)((*s_totalServers)-servfail)); s_failedServers->SetValue((uint64)servfail); s_usersOnWorking->SetValue((uint64)servuser); s_filesOnWorking->SetValue((uint64)servfile); s_totalUsers->SetValue((uint64)servtuser); s_totalFiles->SetValue((uint64)servtfile); s_serverOccupation->SetValue(servocc); } void CStatistics::AddSourceOrigin(unsigned origin) { CStatTreeItemNativeCounter* counter = (CStatTreeItemNativeCounter*)s_foundSources->GetChildById(0x0100 + origin); if (counter) { ++(*counter); } else { counter = new CStatTreeItemNativeCounter(OriginToText(origin) + wxT(": %s"), stHideIfZero | stShowPercent); ++(*counter); s_foundSources->AddChild(counter, 0x0100 + origin); } } void CStatistics::RemoveSourceOrigin(unsigned origin) { CStatTreeItemNativeCounter* counter = (CStatTreeItemNativeCounter*)s_foundSources->GetChildById(0x0100 + origin); wxASSERT(counter); --(*counter); } uint32 GetSoftID(uint8 SoftType) { // prevent appearing multiple tree entries with the same name // this should be kept in sync with GetSoftName(). switch (SoftType) { case SO_OLDEMULE: return 0x0100 + SO_EMULE; case SO_NEW_SHAREAZA: case SO_NEW2_SHAREAZA: return 0x0100 + SO_SHAREAZA; case SO_NEW2_MLDONKEY: return 0x0100 + SO_NEW_MLDONKEY; default: return 0x0100 + SoftType; } } void CStatistics::AddDownloadFromSoft(uint8 SoftType, uint32 bytes) { AddReceivedBytes(bytes); uint32 id = GetSoftID(SoftType); if (s_sessionDownload->HasChildWithId(id)) { (*((CStatTreeItemCounter*)s_sessionDownload->GetChildById(id))) += bytes; } else { CStatTreeItemCounter* tmp = new CStatTreeItemCounter(GetSoftName(SoftType) + wxT(": %s")); tmp->SetDisplayMode(dmBytes); (*tmp) += bytes; s_sessionDownload->AddChild(tmp, id); } } void CStatistics::AddUploadToSoft(uint8 SoftType, uint32 bytes) { uint32 id = GetSoftID(SoftType); if (s_sessionUpload->HasChildWithId(id)) { (*((CStatTreeItemCounter*)s_sessionUpload->GetChildById(id))) += bytes; } else { CStatTreeItemCounter* tmp = new CStatTreeItemCounter(GetSoftName(SoftType) + wxT(": %s")); tmp->SetDisplayMode(dmBytes); (*tmp) += bytes; s_sessionUpload->AddChild(tmp, id); } } inline bool SupportsOSInfo(unsigned clientSoft) { return (clientSoft == SO_AMULE) || (clientSoft == SO_HYDRANODE) || (clientSoft == SO_NEW2_MLDONKEY); } // Do some random black magic to strings to get a relatively unique number for them. uint32 GetIdFromString(const wxString& str) { uint32 id = 0; for (unsigned i = 0; i < str.Length(); ++i) { unsigned old_id = id; id += (uint32)str.GetChar(i); id <<= 2; id ^= old_id; id -= old_id; } return (((id >> 1) + id) | 0x00000100) & 0x7fffffff; } void CStatistics::AddKnownClient(CUpDownClient *pClient) { ++(*s_clients); uint32 clientSoft = pClient->GetClientSoft(); uint32 id = GetSoftID(clientSoft); CStatTreeItemCounter *client; if (s_clients->HasChildWithId(id)) { client = (CStatTreeItemCounter*)s_clients->GetChildById(id); ++(*client); } else { uint32 flags = stSortChildren | stShowPercent | stHideIfZero; if (!SupportsOSInfo(clientSoft)) { flags |= stCapChildren; } client = new CStatTreeItemCounter(GetSoftName(clientSoft) + wxT(": %s"), flags); ++(*client); s_clients->AddChild(client, id); if (SupportsOSInfo(clientSoft)) { client->AddChild(new CStatTreeItemBase(wxTRANSLATE("Version"), stSortChildren | stCapChildren), 2); client->AddChild(new CStatTreeItemBase(wxTRANSLATE("Operating System"), stSortChildren | stSortByValue), 1); } } CStatTreeItemBase *versionRoot = SupportsOSInfo(clientSoft) ? client->GetChildById(2) : client; uint32 clientVersion = pClient->GetVersion(); if (versionRoot->HasChildWithId(clientVersion)) { CStatTreeItemCounter *version = (CStatTreeItemCounter*)versionRoot->GetChildById(clientVersion); ++(*version); } else { const wxString& versionStr = pClient->GetVersionString(); CStatTreeItemCounter *version = new CStatTreeItemCounter((versionStr.IsEmpty() ? wxString(wxTRANSLATE("Unknown")) : versionStr) + wxT(": %s"), stShowPercent | stHideIfZero); ++(*version); versionRoot->AddChild(version, clientVersion, SupportsOSInfo(clientSoft)); } if (SupportsOSInfo(clientSoft)) { const wxString& OSInfo = pClient->GetClientOSInfo(); uint32 OS_ID = OSInfo.IsEmpty() ? 0 : GetIdFromString(OSInfo); CStatTreeItemBase* OSRoot = client->GetChildById(1); CStatTreeItemCounter* OSNode = (CStatTreeItemCounter*)OSRoot->GetChildById(OS_ID); if (OSNode) { ++(*OSNode); } else { OSNode = new CStatTreeItemCounter((OS_ID ? OSInfo : wxString(wxTRANSLATE("Not Received"))) + wxT(": %s"), stShowPercent | stHideIfZero); ++(*OSNode); OSRoot->AddChild(OSNode, OS_ID, true); } } } void CStatistics::RemoveKnownClient(uint32 clientSoft, uint32 clientVersion, const wxString& OSInfo) { --(*s_clients); uint32 id = GetSoftID(clientSoft); CStatTreeItemCounter *client = (CStatTreeItemCounter*)s_clients->GetChildById(id); wxASSERT(client); --(*client); CStatTreeItemBase *versionRoot = SupportsOSInfo(clientSoft) ? client->GetChildById(2) : client; CStatTreeItemCounter *version = (CStatTreeItemCounter*)versionRoot->GetChildById(clientVersion); wxASSERT(version); --(*version); if (SupportsOSInfo(clientSoft)) { uint32 OS_ID = OSInfo.IsEmpty() ? 0 : GetIdFromString(OSInfo); CStatTreeItemCounter* OSNode = (CStatTreeItemCounter*)client->GetChildById(1)->GetChildById(OS_ID); wxASSERT(OSNode); --(*OSNode); } } #else /* CLIENT_GUI */ CStatistics::CStatistics(CRemoteConnect &conn) : m_conn(conn) { s_start_time = GetTickCount64(); // Init Tree s_statTree = new CStatTreeItemBase(_("Statistics"), 0); // Clear stat data container for (int i = 0; i < sdTotalItems; ++i) { s_statData[i] = 0; } } CStatistics::~CStatistics() { delete s_statTree; } void CStatistics::UpdateStats(const CECPacket* stats) { s_statData[sdUpload] = stats->GetTagByNameSafe(EC_TAG_STATS_UL_SPEED)->GetInt(); s_statData[sdUpOverhead] = stats->GetTagByNameSafe(EC_TAG_STATS_UP_OVERHEAD)->GetInt(); s_statData[sdDownload] = stats->GetTagByNameSafe(EC_TAG_STATS_DL_SPEED)->GetInt(); s_statData[sdDownOverhead] = stats->GetTagByNameSafe(EC_TAG_STATS_DOWN_OVERHEAD)->GetInt(); s_statData[sdWaitingClients] = stats->GetTagByNameSafe(EC_TAG_STATS_UL_QUEUE_LEN)->GetInt(); s_statData[sdBannedClients] = stats->GetTagByNameSafe(EC_TAG_STATS_BANNED_COUNT)->GetInt(); s_statData[sdED2KUsers] = stats->GetTagByNameSafe(EC_TAG_STATS_ED2K_USERS)->GetInt(); s_statData[sdKadUsers] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_USERS)->GetInt(); s_statData[sdED2KFiles] = stats->GetTagByNameSafe(EC_TAG_STATS_ED2K_FILES)->GetInt(); s_statData[sdKadFiles] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_FILES)->GetInt(); s_statData[sdKadFirewalledUDP] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_FIREWALLED_UDP)->GetInt(); s_statData[sdKadIndexedSources] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_INDEXED_SOURCES)->GetInt(); s_statData[sdKadIndexedKeywords] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_INDEXED_KEYWORDS)->GetInt(); s_statData[sdKadIndexedNotes] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_INDEXED_NOTES)->GetInt(); s_statData[sdKadIndexedLoad] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_INDEXED_LOAD)->GetInt(); s_statData[sdKadIPAdress] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_IP_ADRESS)->GetInt(); s_statData[sdBuddyStatus] = stats->GetTagByNameSafe(EC_TAG_STATS_BUDDY_STATUS)->GetInt(); s_statData[sdBuddyIP] = stats->GetTagByNameSafe(EC_TAG_STATS_BUDDY_IP)->GetInt(); s_statData[sdBuddyPort] = stats->GetTagByNameSafe(EC_TAG_STATS_BUDDY_PORT)->GetInt(); s_statData[sdKadInLanMode] = stats->GetTagByNameSafe(EC_TAG_STATS_KAD_IN_LAN_MODE)->GetInt(); s_statData[sdTotalSentBytes] = stats->GetTagByNameSafe(EC_TAG_STATS_TOTAL_SENT_BYTES)->GetInt(); s_statData[sdTotalReceivedBytes] = stats->GetTagByNameSafe(EC_TAG_STATS_TOTAL_RECEIVED_BYTES)->GetInt(); s_statData[sdSharedFileCount] = stats->GetTagByNameSafe(EC_TAG_STATS_SHARED_FILE_COUNT)->GetInt(); const CECTag * LoggerTag = stats->GetTagByName(EC_TAG_STATS_LOGGER_MESSAGE); if (LoggerTag) { for (CECTag::const_iterator it = LoggerTag->begin(); it != LoggerTag->end(); it++) { theApp->AddRemoteLogLine(it->GetStringData()); } } } void CStatistics::UpdateStatsTree() { } void CStatistics::RebuildStatTreeRemote(const CECTag * tag) { delete s_statTree; s_statTree = new CStatTreeItemBase(tag); } uint64 CStatistics::GetUptimeMillis() { return GetTickCount64() - s_start_time; } uint64 CStatistics::GetUptimeSeconds() { return (GetTickCount64() - s_start_time) / 1000; } #endif /* !CLIENT_GUI */ // File_checked_for_headers aMule-2.3.1/src/DataToText.cpp0000644000175000017470000001155511575347521015021 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "KnownFile.h" // Needed by PriorityToStr #include "Constants.h" // Needed by DownloadStateToStr and GetSoftName #define __need_convstatus // Only the conversion status enum is needed #include "PartFileConvert.h" // Needed by GetConversionState #include wxString PriorityToStr( int priority, bool isAuto ) { if ( isAuto ) { switch ( priority ) { case PR_LOW: return _("Auto [Lo]"); case PR_NORMAL: return _("Auto [No]"); case PR_HIGH: return _("Auto [Hi]"); } } else { switch ( priority ) { case PR_VERYLOW: return _("Very low"); case PR_LOW: return _("Low"); case PR_NORMAL: return _("Normal"); case PR_HIGH: return _("High"); case PR_VERYHIGH: return _("Very High"); case PR_POWERSHARE: return _("Release"); } } wxFAIL; return _("Unknown"); } wxString DownloadStateToStr( int state, bool queueFull ) { switch ( state ) { case DS_CONNECTING: return _("Connecting"); case DS_CONNECTED: return _("Asking"); case DS_WAITCALLBACK: return _("Connecting via server"); case DS_ONQUEUE: return ( queueFull ? _("Queue Full") : _("On Queue") ); case DS_DOWNLOADING: return _("Downloading"); case DS_REQHASHSET: return _("Receiving hashset"); case DS_NONEEDEDPARTS: return _("No needed parts"); case DS_LOWTOLOWIP: return _("Cannot connect LowID to LowID"); case DS_TOOMANYCONNS: return _("Too many connections"); case DS_NONE: return _("Unknown"); case DS_WAITCALLBACKKAD: return _("Connecting via Kad"); case DS_TOOMANYCONNSKAD: return _("Too many Kad connections"); case DS_BANNED: return _("Banned"); case DS_ERROR: return _("Connection Error"); case DS_REMOTEQUEUEFULL: return _("Remote Queue Full"); } wxFAIL; return _("Unknown"); } const wxString GetSoftName(unsigned int software_ident) { switch (software_ident) { case SO_OLDEMULE: case SO_EMULE: return wxT("eMule"); case SO_CDONKEY: return wxT("cDonkey"); case SO_LXMULE: return wxT("(l/x)Mule"); case SO_AMULE: return wxT("aMule"); case SO_SHAREAZA: case SO_NEW_SHAREAZA: case SO_NEW2_SHAREAZA: return wxT("Shareaza"); case SO_EMULEPLUS: return wxT("eMule+"); case SO_HYDRANODE: return wxT("HydraNode"); case SO_MLDONKEY: return wxTRANSLATE("Old MLDonkey"); case SO_NEW_MLDONKEY: case SO_NEW2_MLDONKEY: return wxTRANSLATE("New MLDonkey"); case SO_LPHANT: return wxT("lphant"); case SO_EDONKEYHYBRID: return wxT("eDonkeyHybrid"); case SO_EDONKEY: return wxT("eDonkey"); case SO_UNKNOWN: return wxTRANSLATE("Unknown"); case SO_COMPAT_UNK: return wxTRANSLATE("eMule Compatible"); default: return wxEmptyString; } } wxString OriginToText(unsigned int source_from) { switch ((ESourceFrom)source_from) { case SF_LOCAL_SERVER: return wxTRANSLATE("Local Server"); case SF_REMOTE_SERVER: return wxTRANSLATE("Remote Server"); case SF_KADEMLIA: return wxTRANSLATE("Kad"); case SF_SOURCE_EXCHANGE: return wxTRANSLATE("Source Exchange"); case SF_PASSIVE: return wxTRANSLATE("Passive"); case SF_LINK: return wxTRANSLATE("Link"); case SF_SOURCE_SEEDS: return wxTRANSLATE("Source Seeds"); case SF_SEARCH_RESULT: return wxTRANSLATE("Search Result"); case SF_NONE: default: return wxTRANSLATE("Unknown"); } } wxString GetConversionState(unsigned int state) { switch (state) { case CONV_OK : return _("Completed"); case CONV_INPROGRESS : return _("In progress"); case CONV_OUTOFDISKSPACE : return _("ERROR: Out of diskspace"); case CONV_PARTMETNOTFOUND : return _("ERROR: Partmet not found"); case CONV_IOERROR : return _("ERROR: IO error!"); case CONV_FAILED : return _("ERROR: Failed!"); case CONV_QUEUE : return _("Queued"); case CONV_ALREADYEXISTS : return _("Already downloading"); case CONV_BADFORMAT : return _("Unknown or bad tempfile format."); default: return wxT("?"); } } // File_checked_for_headers aMule-2.3.1/src/TextClient.cpp0000644000175000017470000011311611575347521015057 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifdef HAVE_CONFIG_H #include "config.h" // Needed for VERSION #endif #include #include "TextClient.h" #ifndef __WXMSW__ #include // Do_not_auto_remove #endif //------------------------------------------------------------------- //------------------------------------------------------------------- #include #include #include // Needed for CFormat #include "OtherFunctions.h" #include "KnownFile.h" // Needed for Priority Levels #include "DataToText.cpp" // Needed for PriorityToStr #define APP_INIT_SIZE_X 640 #define APP_INIT_SIZE_Y 480 #define theApp (*((CamulecmdApp*)wxTheApp)) //------------------------------------------------------------------- enum { CMD_ID_STATUS, CMD_ID_RESUME, CMD_ID_PAUSE, CMD_ID_PRIORITY_LOW, CMD_ID_PRIORITY_NORMAL, CMD_ID_PRIORITY_HIGH, CMD_ID_PRIORITY_AUTO, CMD_ID_CANCEL, CMD_ID_CONNECT, CMD_ID_CONNECT_ED2K, CMD_ID_CONNECT_KAD, CMD_ID_DISCONNECT, CMD_ID_DISCONNECT_ED2K, CMD_ID_DISCONNECT_KAD, CMD_ID_RELOAD_SHARED, CMD_ID_RELOAD_IPFILTER_LOCAL, CMD_ID_RELOAD_IPFILTER_NET, CMD_ID_SET_IPFILTER_ON, CMD_ID_SET_IPFILTER_OFF, CMD_ID_SET_IPFILTER_CLIENTS_ON, CMD_ID_SET_IPFILTER_CLIENTS_OFF, CMD_ID_SET_IPFILTER_SERVERS_ON, CMD_ID_SET_IPFILTER_SERVERS_OFF, CMD_ID_SET_IPFILTER_LEVEL, CMD_ID_GET_IPFILTER, CMD_ID_GET_IPFILTER_STATE, CMD_ID_GET_IPFILTER_STATE_CLIENTS, CMD_ID_GET_IPFILTER_STATE_SERVERS, CMD_ID_GET_IPFILTER_LEVEL, CMD_ID_SHOW_UL, CMD_ID_SHOW_DL, CMD_ID_SHOW_LOG, CMD_ID_SHOW_SERVERS, CMD_ID_SHOW_SHARED, CMD_ID_RESET_LOG, CMD_ID_SHUTDOWN, CMD_ID_ADDLINK, CMD_ID_SET_BWLIMIT_UP, CMD_ID_SET_BWLIMIT_DOWN, CMD_ID_GET_BWLIMITS, CMD_ID_STATTREE, CMD_ID_SEARCH, CMD_ID_SEARCH_GLOBAL, CMD_ID_SEARCH_LOCAL, CMD_ID_SEARCH_KAD, CMD_ID_SEARCH_RESULTS, CMD_ID_SEARCH_PROGRESS, CMD_ID_DOWNLOAD, // IDs for deprecated commands CMD_ID_SET_IPFILTER }; // method to create a SearchFile SearchFile::SearchFile(CEC_SearchFile_Tag *tag) { nHash = tag->FileHash(); sHash = nHash.Encode(); sFileName = tag->FileName(); lFileSize = tag->SizeFull(); lSourceCount = tag->SourceCount(); bPresent = tag->AlreadyHave(); } //------------------------------------------------------------------- IMPLEMENT_APP (CamulecmdApp) //------------------------------------------------------------------- void CamulecmdApp::OnInitCmdLine(wxCmdLineParser& parser) { CaMuleExternalConnector::OnInitCmdLine(parser, "amulecmd"); parser.AddOption(wxT("c"), wxT("command"), _("Execute and exit."), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); } bool CamulecmdApp::OnCmdLineParsed(wxCmdLineParser& parser) { m_HasCmdOnCmdLine = parser.Found(wxT("command"), &m_CmdString); if (m_CmdString.Lower().StartsWith(wxT("help"))) { OnInitCommandSet(); printf("%s %s\n", m_appname, (const char *)unicode2char(GetMuleVersion())); Parse_Command(m_CmdString); exit(0); } m_interactive = !m_HasCmdOnCmdLine; return CaMuleExternalConnector::OnCmdLineParsed(parser); } void CamulecmdApp::TextShell(const wxString& prompt) { if (m_HasCmdOnCmdLine) Parse_Command(m_CmdString); else CaMuleExternalConnector::TextShell(prompt); } int CamulecmdApp::ProcessCommand(int CmdId) { wxString args = GetCmdArgs(); CECPacket *request = 0; std::list request_list; int tmp_int = 0; EC_SEARCH_TYPE search_type = EC_SEARCH_KAD; // Implementation of the deprecated command 'SetIPFilter'. if (CmdId == CMD_ID_SET_IPFILTER) { if ( ! args.IsEmpty() ) { if (args.IsSameAs(wxT("ON"), false)) { CmdId = CMD_ID_SET_IPFILTER_ON; } else if (args.IsSameAs(wxT("OFF"), false)) { CmdId = CMD_ID_SET_IPFILTER_OFF; } else { return CMD_ERR_INVALID_ARG; } } else { CmdId = CMD_ID_GET_IPFILTER_STATE; } } switch (CmdId) { case CMD_ID_STATUS: request_list.push_back(new CECPacket(EC_OP_STAT_REQ, EC_DETAIL_CMD)); break; case CMD_ID_SHUTDOWN: request_list.push_back(new CECPacket(EC_OP_SHUTDOWN)); break; case CMD_ID_CONNECT: if ( !args.IsEmpty() ) { unsigned int ip[4]; unsigned int port; // Not much we can do against this unicode2char. int result = sscanf(unicode2char(args), "%d.%d.%d.%d:%d", &ip[0], &ip[1], &ip[2], &ip[3], &port); if (result != 5) { // Try to resolve DNS -- good for dynamic IP servers wxString serverName(args.BeforeFirst(wxT(':'))); long lPort; bool ok = args.AfterFirst(wxT(':')).ToLong(&lPort); port = (unsigned int)lPort; wxIPV4address a; a.Hostname(serverName); a.Service(port); result = sscanf(unicode2char(a.IPAddress()), "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]); if (serverName.IsEmpty() || !ok || (result != 4)) { Show(_("Invalid IP format. Use xxx.xxx.xxx.xxx:xxxx\n")); return 0; } } EC_IPv4_t addr; addr.m_ip[0] = ip[0]; addr.m_ip[1] = ip[1]; addr.m_ip[2] = ip[2]; addr.m_ip[3] = ip[3]; addr.m_port = port; request = new CECPacket(EC_OP_SERVER_CONNECT); request->AddTag(CECTag(EC_TAG_SERVER, addr)); request_list.push_back(request); } else { request_list.push_back(new CECPacket(EC_OP_CONNECT)); } break; case CMD_ID_CONNECT_ED2K: request_list.push_back(new CECPacket(EC_OP_SERVER_CONNECT)); break; case CMD_ID_CONNECT_KAD: request_list.push_back(new CECPacket(EC_OP_KAD_START)); break; case CMD_ID_DISCONNECT: request_list.push_back(new CECPacket(EC_OP_DISCONNECT)); break; case CMD_ID_DISCONNECT_ED2K: request_list.push_back(new CECPacket(EC_OP_SERVER_DISCONNECT)); break; case CMD_ID_DISCONNECT_KAD: request_list.push_back(new CECPacket(EC_OP_KAD_STOP)); break; case CMD_ID_RELOAD_SHARED: request_list.push_back(new CECPacket(EC_OP_SHAREDFILES_RELOAD)); break; case CMD_ID_RELOAD_IPFILTER_LOCAL: request_list.push_back(new CECPacket(EC_OP_IPFILTER_RELOAD)); break; case CMD_ID_RELOAD_IPFILTER_NET: request = new CECPacket(EC_OP_IPFILTER_UPDATE); request->AddTag(EC_TAG_STRING, args); request_list.push_back(request); break; case CMD_ID_SET_IPFILTER_ON: case CMD_ID_SET_IPFILTER_CLIENTS_ON: case CMD_ID_SET_IPFILTER_SERVERS_ON: tmp_int = 1; case CMD_ID_SET_IPFILTER_OFF: case CMD_ID_SET_IPFILTER_CLIENTS_OFF: case CMD_ID_SET_IPFILTER_SERVERS_OFF: { if (CmdId == CMD_ID_SET_IPFILTER_CLIENTS_ON || CmdId == CMD_ID_SET_IPFILTER_CLIENTS_OFF) { CmdId = CMD_ID_GET_IPFILTER_STATE_CLIENTS; } else if (CmdId == CMD_ID_SET_IPFILTER_SERVERS_ON || CmdId == CMD_ID_SET_IPFILTER_SERVERS_OFF) { CmdId = CMD_ID_GET_IPFILTER_STATE_SERVERS; } else { CmdId = CMD_ID_GET_IPFILTER_STATE; } request = new CECPacket(EC_OP_SET_PREFERENCES); CECEmptyTag prefs(EC_TAG_PREFS_SECURITY); if (CmdId != CMD_ID_GET_IPFILTER_STATE_SERVERS) { prefs.AddTag(CECTag(EC_TAG_IPFILTER_CLIENTS, (uint8)tmp_int)); } if (CmdId != CMD_ID_GET_IPFILTER_STATE_CLIENTS) { prefs.AddTag(CECTag(EC_TAG_IPFILTER_SERVERS, (uint8)tmp_int)); } request->AddTag(prefs); request_list.push_back(request); } case CMD_ID_GET_IPFILTER: case CMD_ID_GET_IPFILTER_STATE: case CMD_ID_GET_IPFILTER_STATE_CLIENTS: case CMD_ID_GET_IPFILTER_STATE_SERVERS: request = new CECPacket(EC_OP_GET_PREFERENCES); request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_SECURITY)); request_list.push_back(request); break; case CMD_ID_SET_IPFILTER_LEVEL: if (!args.IsEmpty()) // This 'if' must stay as long as we support the deprecated 'IPLevel' command. { unsigned long int level = 0; if (args.ToULong(&level) == true && level < 256) { request = new CECPacket(EC_OP_SET_PREFERENCES); CECEmptyTag prefs(EC_TAG_PREFS_SECURITY); prefs.AddTag(CECTag(EC_TAG_IPFILTER_LEVEL, (uint8)level)); request->AddTag(prefs); request_list.push_back(request); } else { return CMD_ERR_INVALID_ARG; } } CmdId = CMD_ID_GET_IPFILTER_LEVEL; case CMD_ID_GET_IPFILTER_LEVEL: request = new CECPacket(EC_OP_GET_PREFERENCES); request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_SECURITY)); request_list.push_back(request); break; case CMD_ID_PAUSE: case CMD_ID_CANCEL: case CMD_ID_RESUME: { if ( args.IsEmpty() ) { Show(_("This command requires an argument. Valid arguments: 'all', filename, or a number.\n")); return 0; } else { wxStringTokenizer argsTokenizer(args); wxString token; CMD4Hash hash; // Grab the entire dl queue right away CECPacket request_all(EC_OP_GET_DLOAD_QUEUE, EC_DETAIL_CMD); const CECPacket *reply_all = SendRecvMsg_v2(&request_all); if (reply_all) { switch(CmdId) { case CMD_ID_PAUSE: request = new CECPacket(EC_OP_PARTFILE_PAUSE); break; case CMD_ID_CANCEL: request = new CECPacket(EC_OP_PARTFILE_DELETE); break; case CMD_ID_RESUME: request = new CECPacket(EC_OP_PARTFILE_RESUME); break; default: wxFAIL; } // We loop through all the arguments while(argsTokenizer.HasMoreTokens()) { token=argsTokenizer.GetNextToken(); // If the user requested all, then we select all files and exit the loop // since there is little point to add anything more to "everything" if( token == wxT("all") ) { for (CECPacket::const_iterator it = reply_all->begin(); it != reply_all->end(); it++) { CEC_PartFile_Tag *tag = (CEC_PartFile_Tag *) & *it; request->AddTag(CECTag(EC_TAG_PARTFILE, tag->FileHash())); } break; } else if ( hash.Decode(token.Trim(false).Trim(true)) ) { if ( !hash.IsEmpty() ) { Show(_("Processing by hash: "+token+wxT("\n"))); request->AddTag(CECTag(EC_TAG_PARTFILE, hash)); } } else { // Go through the dl queue and look at each filename for (CECPacket::const_iterator it = reply_all->begin(); it != reply_all->end(); it++) { CEC_PartFile_Tag *tag = (CEC_PartFile_Tag *) & *it; wxString partmetname = tag->PartMetName(); // We check for filename, XXX.pat.met, XXX.part, XXX if( tag->FileName() == token || partmetname == token || partmetname.Truncate(partmetname.Len()-4) == token || partmetname.Truncate(partmetname.Len()-5) == token) { Show(_("Processing by filename: "+token+wxT("\n"))); request->AddTag(CECTag(EC_TAG_PARTFILE, tag->FileHash())); } } } // End of filename check else } // End of argument token loop request_list.push_back(request); delete reply_all; } // End of dl queue processing } // end of command processing break; } case CMD_ID_PRIORITY_LOW: case CMD_ID_PRIORITY_NORMAL: case CMD_ID_PRIORITY_HIGH: case CMD_ID_PRIORITY_AUTO: if ( args.IsEmpty() ) { Show(_("This command requires an argument. Valid arguments: a file hash.\n")); return 0; } else { CMD4Hash hash; if (hash.Decode(args.Trim(false).Trim(true))) { if (!hash.IsEmpty()) { request = new CECPacket(EC_OP_PARTFILE_PRIO_SET); CECTag hashtag(EC_TAG_PARTFILE, hash); switch(CmdId) { case CMD_ID_PRIORITY_LOW: hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_LOW)); break; case CMD_ID_PRIORITY_NORMAL: hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_NORMAL)); break; case CMD_ID_PRIORITY_HIGH: hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_HIGH)); break; case CMD_ID_PRIORITY_AUTO: hashtag.AddTag(CECTag(EC_TAG_PARTFILE_PRIO, (uint8)PR_AUTO)); break; default: wxFAIL; } request->AddTag(hashtag); request_list.push_back(request); } else { Show(_("Not a valid number\n")); return 0; } } else { Show(_("Not a valid hash (length should be exactly 32 chars)\n")); return 0; } } break; case CMD_ID_SHOW_UL: request_list.push_back(new CECPacket(EC_OP_GET_ULOAD_QUEUE)); break; case CMD_ID_SHOW_DL: request_list.push_back(new CECPacket(EC_OP_GET_DLOAD_QUEUE)); break; case CMD_ID_SHOW_LOG: request_list.push_back(new CECPacket(EC_OP_GET_LOG)); break; case CMD_ID_SHOW_SERVERS: request_list.push_back(new CECPacket(EC_OP_GET_SERVER_LIST, EC_DETAIL_CMD)); break; case CMD_ID_RESET_LOG: request_list.push_back(new CECPacket(EC_OP_RESET_LOG)); break; case CMD_ID_ADDLINK: if (args.StartsWith(wxT("ed2k://"))) { //aMule doesn't like AICH links without |/| in front of h= if (args.Find(wxT("|h=")) > -1 && args.Find(wxT("|/|h=")) == -1) { args.Replace(wxT("|h="),wxT("|/|h=")); } // repair links where | is replaced with %7C (Firefox) if (args.StartsWith(wxT("ed2k://%7C"))) { args.Replace(wxT("%7C"),wxT("|")); } } request = new CECPacket(EC_OP_ADD_LINK); request->AddTag(CECTag(EC_TAG_STRING, args)); request_list.push_back(request); break; case CMD_ID_SET_BWLIMIT_UP: tmp_int = EC_TAG_CONN_MAX_UL - EC_TAG_CONN_MAX_DL; case CMD_ID_SET_BWLIMIT_DOWN: tmp_int += EC_TAG_CONN_MAX_DL; { unsigned long int limit; if (args.ToULong(&limit)) { request = new CECPacket(EC_OP_SET_PREFERENCES); CECEmptyTag prefs(EC_TAG_PREFS_CONNECTIONS); prefs.AddTag(CECTag(tmp_int, (uint16)limit)); request->AddTag(prefs); request_list.push_back(request); } else { return CMD_ERR_INVALID_ARG; } } case CMD_ID_GET_BWLIMITS: request = new CECPacket(EC_OP_GET_PREFERENCES); request->AddTag(CECTag(EC_TAG_SELECT_PREFS, (uint32)EC_PREFS_CONNECTIONS)); request_list.push_back(request); break; case CMD_ID_STATTREE: request = new CECPacket(EC_OP_GET_STATSTREE); if (!args.IsEmpty()) { unsigned long int max_versions; if (args.ToULong(&max_versions)) { if (max_versions < 256) { request->AddTag(CECTag(EC_TAG_STATTREE_CAPPING, (uint8)max_versions)); } else { delete request; return CMD_ERR_INVALID_ARG; } } else { delete request; return CMD_ERR_INVALID_ARG; } } request_list.push_back(request); break; case CMD_ID_SEARCH_GLOBAL: search_type = EC_SEARCH_GLOBAL; case CMD_ID_SEARCH_LOCAL: if (search_type != EC_SEARCH_GLOBAL){ search_type = EC_SEARCH_LOCAL; } case CMD_ID_SEARCH_KAD: if (search_type != EC_SEARCH_GLOBAL && search_type != EC_SEARCH_LOCAL){ search_type = EC_SEARCH_KAD; } if (!args.IsEmpty()) { wxString search = args; wxString type; wxString extention; uint32 avail = 0; uint32 min_size = 0; uint32 max_size = 0; request = new CECPacket(EC_OP_SEARCH_START); request->AddTag(CEC_Search_Tag (search, search_type, type, extention, avail, min_size, max_size)); request_list.push_back(request); } break; case CMD_ID_SEARCH: printf("No search type defined.\nType 'help search' to get more help.\n"); break; case CMD_ID_SEARCH_RESULTS: request_list.push_back(new CECPacket(EC_OP_SEARCH_RESULTS, EC_DETAIL_FULL)); break; case CMD_ID_SEARCH_PROGRESS: request_list.push_back(new CECPacket(EC_OP_SEARCH_PROGRESS)); break; case CMD_ID_DOWNLOAD: if (!args.IsEmpty()) { unsigned long int id = 0; if (args.ToULong(&id) == true && id < m_Results_map.size()) { SearchFile* file = m_Results_map[id]; printf("Download File: %lu %s\n", id, (const char*)unicode2char(file->sFileName)); request = new CECPacket(EC_OP_DOWNLOAD_SEARCH_RESULT); // get with id the hash and category=0 uint32 category = 0; CECTag hashtag(EC_TAG_PARTFILE, file->nHash); hashtag.AddTag(CECTag(EC_TAG_PARTFILE_CAT, category)); request->AddTag(hashtag); request_list.push_back(request); } else { return CMD_ERR_INVALID_ARG; } } break; default: return CMD_ERR_PROCESS_CMD; } m_last_cmd_id = CmdId; if ( ! request_list.empty() ) { std::list::iterator it = request_list.begin(); while ( it != request_list.end() ) { CECPacket *curr = *it++; if (curr->GetOpCode() == EC_OP_SHUTDOWN) { SendPacket(curr); delete curr; return CMD_ID_QUIT; } const CECPacket *reply = SendRecvMsg_v2(curr); delete curr; if ( reply ) { Process_Answer_v2(reply); delete reply; } } request_list.resize(0); } return CMD_OK; } /* * Method to show the results in the console */ void CamulecmdApp::ShowResults(CResultMap results_map) { unsigned int name_max = 80; unsigned int mb_max = 5; unsigned int nr_max = 5; unsigned long int id = 0; wxString output, name, sources, mb , kb; printf("Nr. Filename: Size(MB): Sources: \n"); printf("-----------------------------------------------------------------------------------------------------------\n"); for( std::map::iterator iter = results_map.begin(); iter != results_map.end(); iter++ ) { id = (*iter).first; SearchFile* file = (*iter).second; output.Printf(wxT("%i. "), id); output = output.SubString(0, nr_max).Append(file->sFileName).Append(' ', name_max); mb.Printf(wxT(" %d"), file->lFileSize/1024/1024); kb.Printf(wxT(".%d"), file->lFileSize/1024%1024); output = output.SubString(0, nr_max + name_max + mb_max - mb.Length() ).Append(mb).Append(kb); printf("%s %ld\n",(const char*)unicode2char(output), file->lSourceCount ); } } // Formats a statistics (sub)tree to text wxString StatTree2Text(CEC_StatTree_Node_Tag *tree, int depth) { if (!tree) { return wxEmptyString; } wxString result = wxString(wxChar(' '), depth) + tree->GetDisplayString() + wxT("\n"); for (CECTag::const_iterator it = tree->begin(); it != tree->end(); it++) { CEC_StatTree_Node_Tag *tmp = (CEC_StatTree_Node_Tag*) & *it; if (tmp->GetTagName() == EC_TAG_STATTREE_NODE) { result += StatTree2Text(tmp, depth + 1); } } return result; } /* * Format EC packet into text form for output to console */ void CamulecmdApp::Process_Answer_v2(const CECPacket *response) { wxString s; wxString msgFailedUnknown(_("Request failed with an unknown error.")); wxASSERT(response); switch (response->GetOpCode()) { case EC_OP_NOOP: s << _("Operation was successful."); break; case EC_OP_FAILED: { const CECTag *tag = response->GetFirstTagSafe(); if (tag->IsString()) { s << CFormat(_("Request failed with the following error: %s")) % wxGetTranslation(tag->GetStringData()); } else { s << msgFailedUnknown; } } break; case EC_OP_SET_PREFERENCES: { const CECTag *tab = response->GetTagByNameSafe(EC_TAG_PREFS_SECURITY); const CECTag *ipfilterLevel = tab->GetTagByName(EC_TAG_IPFILTER_LEVEL); if (ipfilterLevel) { if (m_last_cmd_id == CMD_ID_GET_IPFILTER || m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE || m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE_CLIENTS) { s += CFormat(_("IP filtering for clients is %s.\n")) % ((tab->GetTagByName(EC_TAG_IPFILTER_CLIENTS) == NULL) ? _("OFF") : _("ON")); } if (m_last_cmd_id == CMD_ID_GET_IPFILTER || m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE || m_last_cmd_id == CMD_ID_GET_IPFILTER_STATE_SERVERS) { s += CFormat(_("IP filtering for servers is %s.\n")) % ((tab->GetTagByName(EC_TAG_IPFILTER_SERVERS) == NULL) ? _("OFF") : _("ON")); } if (m_last_cmd_id == CMD_ID_GET_IPFILTER || m_last_cmd_id == CMD_ID_GET_IPFILTER_LEVEL) { s << CFormat(_("Current IPFilter Level is %d.\n")) % ipfilterLevel->GetInt(); } } tab = response->GetTagByNameSafe(EC_TAG_PREFS_CONNECTIONS); const CECTag *connMaxUL = tab->GetTagByName(EC_TAG_CONN_MAX_UL); const CECTag *connMaxDL = tab->GetTagByName(EC_TAG_CONN_MAX_DL); if (connMaxUL && connMaxDL) { s << CFormat(_("Bandwidth limits: Up: %u kB/s, Down: %u kB/s.\n")) % connMaxUL->GetInt() % connMaxDL->GetInt(); } } break; case EC_OP_STRINGS: for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { const CECTag &tag = *it; s << tag.GetStringData() << wxT("\n"); } break; case EC_OP_STATS: { CEC_ConnState_Tag *connState = (CEC_ConnState_Tag*)response->GetTagByName(EC_TAG_CONNSTATE); if (connState) { s << _("eD2k") << wxT(": "); if (connState->IsConnectedED2K()) { CECTag *server = connState->GetTagByName(EC_TAG_SERVER); CECTag *serverName = server ? server->GetTagByName(EC_TAG_SERVER_NAME) : NULL; if (server && serverName) { s << CFormat(_("Connected to %s %s %s")) % serverName->GetStringData() % server->GetIPv4Data().StringIP() % (connState->HasLowID() ? _("with LowID") : _("with HighID")); } } else if (connState->IsConnectingED2K()) { s << _("Now connecting"); } else { s << _("Not connected"); } s << wxT('\n') << _("Kad") << wxT(": "); if (connState->IsKadRunning()) { if (connState->IsConnectedKademlia()) { s << _("Connected") << wxT(" ("); if (connState->IsKadFirewalled()) { s << _("firewalled"); } else { s << _("ok"); } s << wxT(')'); } else { s << _("Not connected"); } } else { s << _("Not running"); } s << wxT('\n'); } const CECTag *tmpTag; if ((tmpTag = response->GetTagByName(EC_TAG_STATS_DL_SPEED)) != 0) { s << CFormat(_("\nDownload:\t%s")) % CastItoSpeed(tmpTag->GetInt()); } if ((tmpTag = response->GetTagByName(EC_TAG_STATS_UL_SPEED)) != 0) { s << CFormat(_("\nUpload:\t%s")) % CastItoSpeed(tmpTag->GetInt()); } if ((tmpTag = response->GetTagByName(EC_TAG_STATS_UL_QUEUE_LEN)) != 0) { s << CFormat(_("\nClients in queue:\t%d\n")) % tmpTag->GetInt(); } if ((tmpTag = response->GetTagByName(EC_TAG_STATS_TOTAL_SRC_COUNT)) != 0) { s << CFormat(_("\nTotal sources:\t%d\n")) % tmpTag->GetInt(); } break; } case EC_OP_DLOAD_QUEUE: for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { CEC_PartFile_Tag *tag = (CEC_PartFile_Tag *) & *it; uint64 filesize, donesize; filesize = tag->SizeFull(); donesize = tag->SizeDone(); s << tag->FileHashString() << wxT(" ") << tag->FileName() << (CFormat(wxT("\n\t [%.1f%%] %4i/%4i ")) % ((float)donesize / ((float)filesize)*100.0) % ((int)tag->SourceCount() - (int)tag->SourceNotCurrCount()) % (int)tag->SourceCount()) << ((int)tag->SourceCountA4AF() ? wxString(CFormat(wxT("+%2.2i ")) % (int)tag->SourceCountA4AF()) : wxString(wxT(" "))) << ((int)tag->SourceXferCount() ? wxString(CFormat(wxT("(%2.2i) - ")) % (int)tag->SourceXferCount()) : wxString(wxT(" - "))) << tag->GetFileStatusString(); s << wxT(" - ") << tag->PartMetName(); if (tag->DownPrio() < 10) { s << wxT(" - ") << PriorityToStr((int)tag->DownPrio(), 0); } else { s << wxT(" - ") << PriorityToStr((tag->DownPrio() - 10), 1); } if ( tag->SourceXferCount() > 0) { s << wxT(" - ") + CastItoSpeed(tag->Speed()); } s << wxT("\n"); } break; case EC_OP_ULOAD_QUEUE: for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { const CECTag *tag = & *it; const CECTag *clientName = tag->GetTagByName(EC_TAG_CLIENT_NAME); const CECTag *partfileName = tag->GetTagByName(EC_TAG_PARTFILE_NAME); const CECTag *partfileSizeXfer = tag->GetTagByName(EC_TAG_PARTFILE_SIZE_XFER); const CECTag *partfileSpeed = tag->GetTagByName(EC_TAG_CLIENT_UP_SPEED); if (clientName && partfileName && partfileSizeXfer && partfileSpeed) { s << wxT("\n") << CFormat(wxT("%10u ")) % tag->GetInt() << clientName->GetStringData() << wxT(" ") << partfileName->GetStringData() << wxT(" ") << CastItoXBytes(partfileSizeXfer->GetInt()) << wxT(" ") << CastItoSpeed(partfileSpeed->GetInt()); } } break; case EC_OP_LOG: for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { const CECTag &tag = *it; s << tag.GetStringData() << wxT("\n"); } break; case EC_OP_SERVER_LIST: for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { const CECTag &tag = *it; const CECTag *serverName = tag.GetTagByName(EC_TAG_SERVER_NAME); if (serverName) { wxString ip = tag.GetIPv4Data().StringIP(); ip.Append(' ', 24 - ip.Length()); s << ip << serverName->GetStringData() << wxT("\n"); } } break; case EC_OP_STATSTREE: s << StatTree2Text((CEC_StatTree_Node_Tag*)response->GetTagByName(EC_TAG_STATTREE_NODE), 0); break; case EC_OP_SEARCH_RESULTS: { int i = 0; m_Results_map.clear(); s += CFormat(_("Number of search results: %i\n")) % response->GetTagCount(); for (CECPacket::const_iterator it = response->begin(); it != response->end(); it++) { CEC_SearchFile_Tag *tag = (CEC_SearchFile_Tag *) & *it; //printf("Tag FileName: %s \n",(const char*)unicode2char(tag->FileName())); m_Results_map[i++] = new SearchFile(tag); } ShowResults(m_Results_map); break; } case EC_OP_SEARCH_PROGRESS: { const CECTag *tab = response->GetTagByNameSafe(EC_TAG_SEARCH_STATUS); uint32 progress = tab->GetInt(); if (progress <= 100) { s += CFormat(_("Search progress: %u %% \n")) % progress; } else { s += _("Search progress not available"); } break; } default: s += CFormat(_("Received an unknown reply from the server, OpCode = %#x.")) % response->GetOpCode(); } Process_Answer(s); } void CamulecmdApp::OnInitCommandSet() { CCommandTree *tmp; CCommandTree *tmp2; CCommandTree *tmp3; CaMuleExternalConnector::OnInitCommandSet(); m_commands.AddCommand(wxT("Status"), CMD_ID_STATUS, wxTRANSLATE("Show short status information."), wxTRANSLATE("Show connection status, current up/download speeds, etc.\n"), CMD_PARAM_NEVER); m_commands.AddCommand(wxT("Statistics"), CMD_ID_STATTREE, wxTRANSLATE("Show full statistics tree."), wxTRANSLATE("Optionally, a number in the range 0-255 can be passed as an argument to this\ncommand, which tells how many entries of the client version subtrees should be\nshown. Passing 0 or omitting it means 'unlimited'.\n\nExample: 'statistics 5' will show only the top 5 versions for each client type.\n")); m_commands.AddCommand(wxT("Shutdown"), CMD_ID_SHUTDOWN, wxTRANSLATE("Shut down aMule."), wxTRANSLATE("Shut down the remote running core (amule/amuled).\nThis will also shut down the text client, since it is unusable without a\nrunning core.\n"), CMD_PARAM_NEVER); tmp = m_commands.AddCommand(wxT("Reload"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Reload the given object."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("Shared"), CMD_ID_RELOAD_SHARED, wxTRANSLATE("Reload shared files list."), wxEmptyString, CMD_PARAM_NEVER); tmp2 = tmp->AddCommand(wxT("IPFilter"), CMD_ID_RELOAD_IPFILTER_LOCAL, wxTRANSLATE("Reload IP filtering table."), wxEmptyString, CMD_PARAM_OPTIONAL); tmp2->AddCommand(wxT("File"), CMD_ID_RELOAD_IPFILTER_LOCAL, wxTRANSLATE("Reload current IP filtering table."), wxEmptyString, CMD_PARAM_NEVER); tmp2->AddCommand(wxT("Net"), CMD_ID_RELOAD_IPFILTER_NET, wxTRANSLATE("Update IP filtering table from URL."), wxTRANSLATE("If URL is omitted the URL from the preferences is used."), CMD_PARAM_OPTIONAL); tmp = m_commands.AddCommand(wxT("Connect"), CMD_ID_CONNECT, wxTRANSLATE("Connect to the network."), wxTRANSLATE("This will connect to all networks that are enabled in Preferences.\nYou may also optionally specify a server address in IP:Port form, to connect to\nthat server only. The IP must be a dotted decimal IPv4 address,\nor a resolvable DNS name."), CMD_PARAM_OPTIONAL); tmp->AddCommand(wxT("ED2K"), CMD_ID_CONNECT_ED2K, wxTRANSLATE("Connect to eD2k only."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("Kad"), CMD_ID_CONNECT_KAD, wxTRANSLATE("Connect to Kad only."), wxEmptyString, CMD_PARAM_NEVER); tmp = m_commands.AddCommand(wxT("Disconnect"), CMD_ID_DISCONNECT, wxTRANSLATE("Disconnect from the network."), wxTRANSLATE("This will disconnect from all networks that are currently connected.\n"), CMD_PARAM_NEVER); tmp->AddCommand(wxT("ED2K"), CMD_ID_DISCONNECT_ED2K, wxTRANSLATE("Disconnect from eD2k only."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("Kad"), CMD_ID_DISCONNECT_KAD, wxTRANSLATE("Disconnect from Kad only."), wxEmptyString, CMD_PARAM_NEVER); m_commands.AddCommand(wxT("Add"), CMD_ID_ADDLINK, wxTRANSLATE("Add an eD2k or magnet link to core."), wxTRANSLATE("The eD2k link to be added can be:\n*) a file link (ed2k://|file|...), it will be added to the download queue,\n*) a server link (ed2k://|server|...), it will be added to the server list,\n*) or a serverlist link, in which case all servers in the list will be added to the\n server list.\n\nThe magnet link must contain the eD2k hash and file length.\n"), CMD_PARAM_ALWAYS); tmp = m_commands.AddCommand(wxT("Set"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set a preference value."), wxEmptyString, CMD_PARAM_NEVER); tmp2 = tmp->AddCommand(wxT("IPFilter"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set IP filtering preferences."), wxEmptyString, CMD_PARAM_NEVER); tmp2->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_ON, wxTRANSLATE("Turn IP filtering on for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); tmp2->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_OFF, wxTRANSLATE("Turn IP filtering off for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); tmp3 = tmp2->AddCommand(wxT("Clients"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Enable/Disable IP filtering for clients."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_CLIENTS_ON, wxTRANSLATE("Turn IP filtering on for clients."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_CLIENTS_OFF, wxTRANSLATE("Turn IP filtering off for clients."), wxEmptyString, CMD_PARAM_NEVER); tmp3 = tmp2->AddCommand(wxT("Servers"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Enable/Disable IP filtering for servers."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("On"), CMD_ID_SET_IPFILTER_SERVERS_ON, wxTRANSLATE("Turn IP filtering on for servers."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("Off"), CMD_ID_SET_IPFILTER_SERVERS_OFF, wxTRANSLATE("Turn IP filtering off for servers."), wxEmptyString, CMD_PARAM_NEVER); tmp2->AddCommand(wxT("Level"), CMD_ID_SET_IPFILTER_LEVEL, wxTRANSLATE("Select IP filtering level."), wxTRANSLATE("Valid filtering levels are in the range 0-255, and it's default (initial)\nvalue is 127.\n"), CMD_PARAM_ALWAYS); tmp2 = tmp->AddCommand(wxT("BwLimit"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set bandwidth limits."), wxTRANSLATE("The value given to these commands has to be in kilobytes/sec.\n"), CMD_PARAM_NEVER); tmp2->AddCommand(wxT("Up"), CMD_ID_SET_BWLIMIT_UP, wxTRANSLATE("Set upload bandwidth limit."), wxT("The given value must be in kilobytes/sec.\n"), CMD_PARAM_ALWAYS); tmp2->AddCommand(wxT("Down"), CMD_ID_SET_BWLIMIT_DOWN, wxTRANSLATE("Set download bandwidth limit."), wxT("The given value must be in kilobytes/sec.\n"), CMD_PARAM_ALWAYS); tmp = m_commands.AddCommand(wxT("Get"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Get and display a preference value."), wxEmptyString, CMD_PARAM_NEVER); tmp2 = tmp->AddCommand(wxT("IPFilter"), CMD_ID_GET_IPFILTER, wxTRANSLATE("Get IP filtering preferences."), wxEmptyString, CMD_PARAM_NEVER); tmp3 = tmp2->AddCommand(wxT("State"), CMD_ID_GET_IPFILTER_STATE, wxTRANSLATE("Get IP filtering state for both clients and servers."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("Clients"), CMD_ID_GET_IPFILTER_STATE_CLIENTS, wxTRANSLATE("Get IP filtering state for clients only."), wxEmptyString, CMD_PARAM_NEVER); tmp3->AddCommand(wxT("Servers"), CMD_ID_GET_IPFILTER_STATE_SERVERS, wxTRANSLATE("Get IP filtering state for servers only."), wxEmptyString, CMD_PARAM_NEVER); tmp2->AddCommand(wxT("Level"), CMD_ID_GET_IPFILTER_LEVEL, wxTRANSLATE("Get IP filtering level."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("BwLimits"), CMD_ID_GET_BWLIMITS, wxTRANSLATE("Get bandwidth limits."), wxEmptyString, CMD_PARAM_NEVER); tmp = m_commands.AddCommand(wxT("Search"), CMD_ID_SEARCH, wxTRANSLATE("Execute a search."), wxTRANSLATE("A search type has to be specified by giving the type:\n GLOBAL\n LOCAL\n KAD\nExample: 'search kad file' will execute a kad search for \"file\".\n"), CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("global"), CMD_ID_SEARCH_GLOBAL, wxTRANSLATE("Execute a global search."), wxEmptyString, CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("local"), CMD_ID_SEARCH_LOCAL, wxTRANSLATE("Execute a local search"), wxEmptyString, CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("kad"), CMD_ID_SEARCH_KAD, wxTRANSLATE("Execute a kad search"), wxEmptyString, CMD_PARAM_ALWAYS); m_commands.AddCommand(wxT("Results"), CMD_ID_SEARCH_RESULTS, wxTRANSLATE("Show the results of the last search."), wxTRANSLATE("Return the results of the previous search.\n"), CMD_PARAM_NEVER); m_commands.AddCommand(wxT("Progress"), CMD_ID_SEARCH_PROGRESS, wxTRANSLATE("Show the progress of a search."), wxTRANSLATE("Show the progress of a search.\n"), CMD_PARAM_NEVER); m_commands.AddCommand(wxT("Download"), CMD_ID_DOWNLOAD, wxTRANSLATE("Start downloading a file"), wxTRANSLATE("The number of a file from the last search has to be given.\nExample: 'download 12' will start to download the file with the number 12 of the previous search.\n"), CMD_PARAM_ALWAYS); // // TODO: These commands below need implementation and/or rewrite! // m_commands.AddCommand(wxT("Pause"), CMD_ID_PAUSE, wxTRANSLATE("Pause download."), wxEmptyString, CMD_PARAM_ALWAYS); m_commands.AddCommand(wxT("Resume"), CMD_ID_RESUME, wxTRANSLATE("Resume download."), wxEmptyString, CMD_PARAM_ALWAYS); m_commands.AddCommand(wxT("Cancel"), CMD_ID_CANCEL, wxTRANSLATE("Cancel download."), wxEmptyString, CMD_PARAM_ALWAYS); tmp = m_commands.AddCommand(wxT("Priority"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Set download priority."), wxTRANSLATE("Set priority of a download to Low, Normal, High or Auto.\n"), CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("Low"), CMD_ID_PRIORITY_LOW, wxTRANSLATE("Set priority to low."), wxEmptyString, CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("Normal"), CMD_ID_PRIORITY_NORMAL, wxTRANSLATE("Set priority to normal."), wxEmptyString, CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("High"), CMD_ID_PRIORITY_HIGH, wxTRANSLATE("Set priority to high."), wxEmptyString, CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("Auto"), CMD_ID_PRIORITY_AUTO, wxTRANSLATE("Set priority to auto."), wxEmptyString, CMD_PARAM_ALWAYS); tmp = m_commands.AddCommand(wxT("Show"), CMD_ERR_INCOMPLETE, wxTRANSLATE("Show queues/lists."), wxTRANSLATE("Show upload/download queue, server list or shared files list.\n"), CMD_PARAM_ALWAYS); tmp->AddCommand(wxT("UL"), CMD_ID_SHOW_UL, wxTRANSLATE("Show upload queue."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("DL"), CMD_ID_SHOW_DL, wxTRANSLATE("Show download queue."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("Log"), CMD_ID_SHOW_LOG, wxTRANSLATE("Show log."), wxEmptyString, CMD_PARAM_NEVER); tmp->AddCommand(wxT("Servers"), CMD_ID_SHOW_SERVERS, wxTRANSLATE("Show servers list."), wxEmptyString, CMD_PARAM_NEVER); // tmp->AddCommand(wxT("Shared"), CMD_ID_SHOW_SHARED, wxTRANSLATE("Show shared files list."), wxEmptyString, CMD_PARAM_NEVER); m_commands.AddCommand(wxT("Reset"), CMD_ID_RESET_LOG, wxTRANSLATE("Reset log."), wxEmptyString, CMD_PARAM_NEVER); // // Deprecated commands, kept for backwards compatibility only. // #define DEPRECATED(OLDCMD, ID, NEWCMD, PARAM) \ m_commands.AddCommand(wxT(OLDCMD), CMD_ID_##ID | CMD_DEPRECATED, CFormat(wxTRANSLATE("Deprecated command, use '%s' instead.")) % wxT(NEWCMD), \ CFormat(wxTRANSLATE("This is a deprecated command, and may be removed in the future.\nUse '%s' instead.\n")) % wxT(NEWCMD), CMD_PARAM_##PARAM) DEPRECATED("Stats", STATUS, "Status", NEVER); DEPRECATED("SetIPFilter", SET_IPFILTER, "Set IPFilter", OPTIONAL); DEPRECATED("GetIPLevel", GET_IPFILTER_LEVEL, "Get IPFilter Level", NEVER); DEPRECATED("SetIPLevel", SET_IPFILTER_LEVEL, "Set IPFilter Level", ALWAYS); DEPRECATED("IPLevel", SET_IPFILTER_LEVEL, "Get/Set IPFilter Level", OPTIONAL); DEPRECATED("Servers", SHOW_SERVERS, "Show Servers", NEVER); DEPRECATED("GetBWLimits", GET_BWLIMITS, "Get BwLimits", NEVER); DEPRECATED("SetUpBWLimit", SET_BWLIMIT_UP, "Set BwLimit Up", ALWAYS); DEPRECATED("SetDownBWLimit", SET_BWLIMIT_DOWN, "Set BwLimit Down", ALWAYS); } int CamulecmdApp::OnRun() { ConnectAndRun(wxT("aMulecmd"), wxT(VERSION)); return 0; } // Dummy functions for EC logging bool ECLogIsEnabled() { return false; } void DoECLogLine(const wxString &) { } // File_checked_for_headers aMule-2.3.1/src/UserEvents.h0000644000175000017470000001315311575347521014544 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2006-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef USEREVENTS_H #define USEREVENTS_H #include // Needed for wxTRANSLATE #ifdef _MSC_VER #define ATTR(x) #else #define ATTR(x) __attribute__((x)) #endif /* Each event will use 5 IDs: - the panel that shows the prefs for this event - the 'Core command enabled' checkbox - the 'Core command' textctrl - the 'GUI command enabled' checkbox - the 'GUI command' textctrl */ #define USEREVENTS_IDS_PER_EVENT 5 const int USEREVENTS_FIRST_ID = 11500; /* Some safe GUI ID to start from */ /** * Macro listing all the events. * * This huge macro is expanded 5 times in the sources, each time producing * different code. If we decide to get rid of the macro either because of coding style * decision, or someone finds a compiler that doesn't support this big macro, we * have to maintain these five places in sync. They are: * - one in PrefsUnifiedDlg.cpp (EVENT_LIST, PrefsUnifiedDlg::PrefsUnifiedDlg()) * - one in this header (CUserEvents::EventType) * - two in UserEvents.cpp (static struct EventList[]; CUserEvent::ExecuteCommand()) */ #define USEREVENTS_EVENTLIST() \ USEREVENTS_EVENT(DownloadCompleted, wxTRANSLATE("Download completed"), \ USEREVENTS_REPLACE_VAR( \ wxT("FILE"), \ wxTRANSLATE("The full path to the file."), \ ((CPartFile*)object)->GetFullName().GetRaw() ) \ USEREVENTS_REPLACE_VAR( \ wxT("NAME"), \ wxTRANSLATE("The name of the file without path component."), \ ((CPartFile*)object)->GetFileName().GetRaw() ) \ USEREVENTS_REPLACE_VAR( \ wxT("HASH"), \ wxTRANSLATE("The eD2k hash of the file."), \ ((CPartFile*)object)->GetFileHash().Encode() ) \ USEREVENTS_REPLACE_VAR( \ wxT("SIZE"), \ wxTRANSLATE("The size of the file in bytes."), \ (wxString)(CFormat(wxT("%llu")) % ((CPartFile*)object)->GetFileSize()) ) \ USEREVENTS_REPLACE_VAR( \ wxT("DLACTIVETIME"), \ wxTRANSLATE("Cumulative download activity time."), \ CastSecondsToHM(((CPartFile*)object)->GetDlActiveTime()) ) \ ) \ USEREVENTS_EVENT( \ NewChatSession, \ wxTRANSLATE("New chat session started"), \ USEREVENTS_REPLACE_VAR( \ wxT("SENDER"), \ wxTRANSLATE("Message sender."), \ *((wxString*)object) ) \ ) \ USEREVENTS_EVENT( \ OutOfDiskSpace, \ wxTRANSLATE("Out of space"), \ USEREVENTS_REPLACE_VAR( \ wxT("PARTITION"), \ wxTRANSLATE("Disk partition."), \ wxString((wxChar*)object) ) \ ) \ USEREVENTS_EVENT( \ ErrorOnCompletion, \ wxTRANSLATE("Error on completion"), \ USEREVENTS_REPLACE_VAR( \ wxT("FILE"), \ wxTRANSLATE("The full path to the file."), \ ((CPartFile*)object)->GetFullName().GetRaw() ) \ ) #define USEREVENTS_EVENT(ID, NAME, VARS) ID, /** * Class to handle userspace events. * * These events that we publish to the user and let him * specify a command to be run when one of these events occur. */ class CUserEvents { friend class CPreferences; public: //! Event list enum EventType { USEREVENTS_EVENTLIST() /* This macro expands to the following list of user event types: DownloadCompleted, NewChatSession, OutOfDiskSpace, ErrorOnCompletion */ }; /** * Process a user event. * * Notes on the 'object' argument: this should be a pointer to * an object instance, from which all of the replacement texts * can be generated. * * Unfortunately this approach does not provide any type-safety, * a list of string pairs (key, replacement) would be the best. * However, this would need either expanding the macro at all of * the places where CUserEvents::ProcessEvent is called from, or * creating lists of parameters for each event, etc = more lists * to keep in sync manually. */ static void ProcessEvent(enum EventType event, const void* object); /** * Returns the number of defined user events. */ static unsigned int GetCount() ATTR(__const__); /** * Returs the human-readable name of the event. */ static const wxString& GetDisplayName(enum EventType event) ATTR(__pure__); /** * Checks whether the core command is enabled. */ static bool IsCoreCommandEnabled(enum EventType event) ATTR(__pure__); /** * Checks whether the GUI command is enabled. */ static bool IsGUICommandEnabled(enum EventType event) ATTR(__pure__); private: // functions for CPreferences static const wxString& GetKey(const unsigned int event) ATTR(__pure__); static bool& GetCoreEnableVar(const unsigned int event) ATTR(__pure__); static wxString& GetCoreCommandVar(const unsigned int event) ATTR(__pure__); static bool& GetGUIEnableVar(const unsigned int event) ATTR(__pure__); static wxString& GetGUICommandVar(const unsigned int event) ATTR(__pure__); }; #undef USEREVENTS_EVENT #endif /* USEREVENTS_H */ aMule-2.3.1/src/KadDlg.h0000644000175000017470000000361011575347521013564 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2004-2011 Angel Vidal (Kry) ( kry@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef KADDLG_H #define KADDLG_H #include // Needed for wxPanel class COScopeCtrl; class wxListEvent; class wxCommandEvent; class wxMouseEvent; typedef struct UpdateInfo GraphUpdateInfo; class CKadDlg : public wxPanel { public: CKadDlg(wxWindow* pParent); ~CKadDlg() {}; void Init(); void SetUpdatePeriod(int step); void SetGraphColors(); void UpdateGraph(const GraphUpdateInfo& update); private: COScopeCtrl* m_kad_scope; // Event handlers void OnBnClickedBootstrapClient(wxCommandEvent& evt); void OnBnClickedBootstrapKnown(wxCommandEvent& evt); void OnBnClickedDisconnectKad(wxCommandEvent& evt); void OnBnClickedUpdateNodeList(wxCommandEvent& evt); void OnFieldsChange(wxCommandEvent& evt); DECLARE_EVENT_TABLE() }; #endif // KADDLG_H // File_checked_for_headers aMule-2.3.1/src/SHAHashSet.cpp0000644000175000017470000010421411655042033014653 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include "SHAHashSet.h" #include "amule.h" #include "MemFile.h" #include "Preferences.h" #include "SHA.h" #include "updownclient.h" #include "DownloadQueue.h" #include "PartFile.h" #include "Logger.h" #include // for this version the limits are set very high, they might be lowered later // to make a hash trustworthy, at least 10 unique Ips (255.255.128.0) must have sent it // and if we have received more than one hash for the file, one hash has to be sent by more than 95% of all unique IPs #define MINUNIQUEIPS_TOTRUST 10 // how many unique IPs have to send us a hash to make it trustworthy #define MINPERCENTAGE_TOTRUST 92 // how many percentage of clients have to send the same hash to make it trustworthy CAICHRequestedDataList CAICHHashSet::m_liRequestedData; ///////////////////////////////////////////////////////////////////////////////////////// ///CAICHHash wxString CAICHHash::GetString() const { return EncodeBase32(m_abyBuffer, HASHSIZE); } void CAICHHash::Read(CFileDataIO* file) { file->Read(m_abyBuffer,HASHSIZE); } void CAICHHash::Write(CFileDataIO* file) const { file->Write(m_abyBuffer,HASHSIZE); } unsigned int CAICHHash::DecodeBase32(const wxString &base32) { return ::DecodeBase32(base32, HASHSIZE, m_abyBuffer); } ///////////////////////////////////////////////////////////////////////////////////////// ///CAICHHashTree CAICHHashTree::CAICHHashTree(uint64 nDataSize, bool bLeftBranch, uint64 nBaseSize) { m_nDataSize = nDataSize; m_nBaseSize = nBaseSize; m_bIsLeftBranch = bLeftBranch; m_pLeftTree = NULL; m_pRightTree = NULL; m_bHashValid = false; } CAICHHashTree::~CAICHHashTree() { delete m_pLeftTree; delete m_pRightTree; } // recursive CAICHHashTree* CAICHHashTree::FindHash(uint64 nStartPos, uint64 nSize, uint8* nLevel) { (*nLevel)++; wxCHECK(*nLevel <= 22, NULL); wxCHECK(nStartPos + nSize <= m_nDataSize, NULL); wxCHECK(nSize <= m_nDataSize, NULL); if (nStartPos == 0 && nSize == m_nDataSize) { // this is the searched hash return this; } else if (m_nDataSize <= m_nBaseSize) { // sanity // this is already the last level, cant go deeper wxFAIL; return NULL; } else { uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); uint64 nLeft = (((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; uint64 nRight = m_nDataSize - nLeft; if (nStartPos < nLeft) { if (nStartPos + nSize > nLeft) { // sanity wxFAIL; return NULL; } if (m_pLeftTree == NULL) { m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); } return m_pLeftTree->FindHash(nStartPos, nSize, nLevel); } else { nStartPos -= nLeft; if (nStartPos + nSize > nRight) { // sanity wxFAIL; return NULL; } if (m_pRightTree == NULL) { m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pRightTree->m_nDataSize == nRight ); } return m_pRightTree->FindHash(nStartPos, nSize, nLevel); } } } // recursive // calculates missing hash from the existing ones // overwrites existing hashs // fails if no hash is found for any branch bool CAICHHashTree::ReCalculateHash(CAICHHashAlgo* hashalg, bool bDontReplace) { if (m_pLeftTree && m_pRightTree) { if ( !m_pLeftTree->ReCalculateHash(hashalg, bDontReplace) || !m_pRightTree->ReCalculateHash(hashalg, bDontReplace) ) { return false; } if (bDontReplace && m_bHashValid) { return true; } if (m_pRightTree->m_bHashValid && m_pLeftTree->m_bHashValid) { hashalg->Reset(); hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE); hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE); hashalg->Finish(m_Hash); m_bHashValid = true; return true; } else { return m_bHashValid; } } else if (m_pLeftTree == NULL && m_pRightTree == NULL) { return true; } else { AddDebugLogLineN(logSHAHashSet, wxT("ReCalculateHash failed - Hashtree incomplete")); return false; } } bool CAICHHashTree::VerifyHashTree(CAICHHashAlgo* hashalg, bool bDeleteBadTrees) { if (!m_bHashValid) { wxFAIL; if (bDeleteBadTrees) { if (m_pLeftTree) { delete m_pLeftTree; m_pLeftTree = NULL; } if (m_pRightTree) { delete m_pRightTree; m_pRightTree = NULL; } } AddDebugLogLineN(logSHAHashSet, wxT("VerifyHashTree - No masterhash available")); return false; } // calculated missing hashs without overwriting anything if (m_pLeftTree && !m_pLeftTree->m_bHashValid) { m_pLeftTree->ReCalculateHash(hashalg, true); } if (m_pRightTree && !m_pRightTree->m_bHashValid) { m_pRightTree->ReCalculateHash(hashalg, true); } if ((m_pRightTree && m_pRightTree->m_bHashValid) ^ (m_pLeftTree && m_pLeftTree->m_bHashValid)) { // one branch can never be verified if (bDeleteBadTrees) { if (m_pLeftTree) { delete m_pLeftTree; m_pLeftTree = NULL; } if (m_pRightTree) { delete m_pRightTree; m_pRightTree = NULL; } } AddDebugLogLineN(logSHAHashSet, wxT("VerifyHashSet failed - Hashtree incomplete")); return false; } if ((m_pRightTree && m_pRightTree->m_bHashValid) && (m_pLeftTree && m_pLeftTree->m_bHashValid)) { // check verify the hashs of both child nodes against my hash CAICHHash CmpHash; hashalg->Reset(); hashalg->Add(m_pLeftTree->m_Hash.GetRawHash(), HASHSIZE); hashalg->Add(m_pRightTree->m_Hash.GetRawHash(), HASHSIZE); hashalg->Finish(CmpHash); if (m_Hash != CmpHash) { if (bDeleteBadTrees) { if (m_pLeftTree) { delete m_pLeftTree; m_pLeftTree = NULL; } if (m_pRightTree) { delete m_pRightTree; m_pRightTree = NULL; } } return false; } return m_pLeftTree->VerifyHashTree(hashalg, bDeleteBadTrees) && m_pRightTree->VerifyHashTree(hashalg, bDeleteBadTrees); } else { // last hash in branch - nothing below to verify return true; } } void CAICHHashTree::SetBlockHash(uint64 nSize, uint64 nStartPos, CAICHHashAlgo* pHashAlg) { wxASSERT ( nSize <= EMBLOCKSIZE ); CAICHHashTree* pToInsert = FindHash(nStartPos, nSize); if (pToInsert == NULL) { // sanity wxFAIL; AddDebugLogLineN(logSHAHashSet, wxT("Critical Error: Failed to Insert SHA-HashBlock, FindHash() failed!")); return; } //sanity if (pToInsert->m_nBaseSize != EMBLOCKSIZE || pToInsert->m_nDataSize != nSize) { wxFAIL; AddDebugLogLineN(logSHAHashSet, wxT("Critical Error: Logical error on values in SetBlockHashFromData")); return; } pHashAlg->Finish(pToInsert->m_Hash); pToInsert->m_bHashValid = true; } bool CAICHHashTree::CreatePartRecoveryData(uint64 nStartPos, uint64 nSize, CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent) { wxCHECK(nStartPos + nSize <= m_nDataSize, false); wxCHECK(nSize <= m_nDataSize, false); if (nStartPos == 0 && nSize == m_nDataSize) { // this is the searched part, now write all blocks of this part // hashident for this level will be adjsuted by WriteLowestLevelHash return WriteLowestLevelHashs(fileDataOut, wHashIdent, false, b32BitIdent); } else if (m_nDataSize <= m_nBaseSize) { // sanity // this is already the last level, cant go deeper wxFAIL; return false; } else { wHashIdent <<= 1; wHashIdent |= (m_bIsLeftBranch) ? 1: 0; uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; uint64 nRight = m_nDataSize - nLeft; if (m_pLeftTree == NULL || m_pRightTree == NULL) { wxFAIL; return false; } if (nStartPos < nLeft) { if (nStartPos + nSize > nLeft || !m_pRightTree->m_bHashValid) { // sanity wxFAIL; return false; } m_pRightTree->WriteHash(fileDataOut, wHashIdent, b32BitIdent); return m_pLeftTree->CreatePartRecoveryData(nStartPos, nSize, fileDataOut, wHashIdent, b32BitIdent); } else { nStartPos -= nLeft; if (nStartPos + nSize > nRight || !m_pLeftTree->m_bHashValid) { // sanity wxFAIL; return false; } m_pLeftTree->WriteHash(fileDataOut, wHashIdent, b32BitIdent); return m_pRightTree->CreatePartRecoveryData(nStartPos, nSize, fileDataOut, wHashIdent, b32BitIdent); } } } void CAICHHashTree::WriteHash(CFileDataIO* fileDataOut, uint32 wHashIdent, bool b32BitIdent) const { wxASSERT( m_bHashValid ); wHashIdent <<= 1; wHashIdent |= (m_bIsLeftBranch) ? 1: 0; if (!b32BitIdent) { wxASSERT( wHashIdent <= 0xFFFF ); fileDataOut->WriteUInt16((uint16)wHashIdent); } else { fileDataOut->WriteUInt32(wHashIdent); } m_Hash.Write(fileDataOut); } // write lowest level hashs into file, ordered from left to right optional without identifier bool CAICHHashTree::WriteLowestLevelHashs(CFileDataIO* fileDataOut, uint32 wHashIdent, bool bNoIdent, bool b32BitIdent) const { wHashIdent <<= 1; wHashIdent |= (m_bIsLeftBranch) ? 1: 0; if (m_pLeftTree == NULL && m_pRightTree == NULL) { if (m_nDataSize <= m_nBaseSize && m_bHashValid ) { if (!bNoIdent && !b32BitIdent) { wxASSERT( wHashIdent <= 0xFFFF ); fileDataOut->WriteUInt16((uint16)wHashIdent); } else if (!bNoIdent && b32BitIdent) { fileDataOut->WriteUInt32(wHashIdent); } m_Hash.Write(fileDataOut); return true; } else { wxFAIL; return false; } } else if (m_pLeftTree == NULL || m_pRightTree == NULL) { wxFAIL; return false; } else { return m_pLeftTree->WriteLowestLevelHashs(fileDataOut, wHashIdent, bNoIdent, b32BitIdent) && m_pRightTree->WriteLowestLevelHashs(fileDataOut, wHashIdent, bNoIdent, b32BitIdent); } } // recover all low level hashs from given data. hashs are assumed to be ordered in left to right - no identifier used bool CAICHHashTree::LoadLowestLevelHashs(CFileDataIO* fileInput) { if (m_nDataSize <= m_nBaseSize) { // sanity // lowest level, read hash m_Hash.Read(fileInput); m_bHashValid = true; return true; } else { uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; uint64 nRight = m_nDataSize - nLeft; if (m_pLeftTree == NULL) { m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); } if (m_pRightTree == NULL) { m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pRightTree->m_nDataSize == nRight ); } return m_pLeftTree->LoadLowestLevelHashs(fileInput) && m_pRightTree->LoadLowestLevelHashs(fileInput); } } // write the hash, specified by wHashIdent, with Data from fileInput. bool CAICHHashTree::SetHash(CFileDataIO* fileInput, uint32 wHashIdent, sint8 nLevel, bool bAllowOverwrite) { if (nLevel == (-1)) { // first call, check how many level we need to go uint8 i = 0; for (; i != 32 && (wHashIdent & 0x80000000) == 0; ++i) { wHashIdent <<= 1; } if (i > 31) { AddDebugLogLineN(logSHAHashSet, wxT("CAICHHashTree::SetHash - found invalid HashIdent (0)")); return false; } else { nLevel = 31 - i; } } if (nLevel == 0) { // this is the searched hash if (m_bHashValid && !bAllowOverwrite) { // not allowed to overwrite this hash, however move the filepointer by reading a hash CAICHHash(file); return true; } m_Hash.Read(fileInput); m_bHashValid = true; return true; } else if (m_nDataSize <= m_nBaseSize) { // sanity // this is already the last level, cant go deeper wxFAIL; return false; } else { // adjust ident to point the path to the next node wHashIdent <<= 1; nLevel--; uint64 nBlocks = m_nDataSize / m_nBaseSize + ((m_nDataSize % m_nBaseSize != 0 )? 1:0); uint64 nLeft = ( ((m_bIsLeftBranch) ? nBlocks+1:nBlocks) / 2)* m_nBaseSize; uint64 nRight = m_nDataSize - nLeft; if ((wHashIdent & 0x80000000) > 0) { if (m_pLeftTree == NULL) { m_pLeftTree = new CAICHHashTree(nLeft, true, (nLeft <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pLeftTree->m_nDataSize == nLeft ); } return m_pLeftTree->SetHash(fileInput, wHashIdent, nLevel); } else { if (m_pRightTree == NULL) { m_pRightTree = new CAICHHashTree(nRight, false, (nRight <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE); } else { wxASSERT( m_pRightTree->m_nDataSize == nRight ); } return m_pRightTree->SetHash(fileInput, wHashIdent, nLevel); } } } ///////////////////////////////////////////////////////////////////////////////////////// ///CAICHUntrustedHash bool CAICHUntrustedHash::AddSigningIP(uint32 dwIP) { dwIP &= 0x00F0FFFF; // we use only the 20 most significant bytes for unique IPs return m_adwIpsSigning.insert(dwIP).second; } ///////////////////////////////////////////////////////////////////////////////////////// ///CAICHHashSet CAICHHashSet::CAICHHashSet(CKnownFile* pOwner) : m_pHashTree(0, true, PARTSIZE) { m_eStatus = AICH_EMPTY; m_pOwner = pOwner; } CAICHHashSet::~CAICHHashSet(void) { FreeHashSet(); } bool CAICHHashSet::CreatePartRecoveryData(uint64 nPartStartPos, CFileDataIO* fileDataOut, bool bDbgDontLoad) { wxASSERT( m_pOwner ); if (m_pOwner->IsPartFile() || m_eStatus != AICH_HASHSETCOMPLETE) { wxFAIL; return false; } if (m_pHashTree.m_nDataSize <= EMBLOCKSIZE) { wxFAIL; return false; } if (!bDbgDontLoad) { if (!LoadHashSet()) { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Created RecoveryData error: failed to load hashset. File: %s")) % m_pOwner->GetFileName()); SetStatus(AICH_ERROR); return false; } } bool bResult; uint8 nLevel = 0; uint32 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); m_pHashTree.FindHash(nPartStartPos, nPartSize,&nLevel); uint16 nHashsToWrite = (nLevel-1) + nPartSize/EMBLOCKSIZE + ((nPartSize % EMBLOCKSIZE != 0 )? 1:0); const bool bUse32BitIdentifier = m_pOwner->IsLargeFile(); if (bUse32BitIdentifier) { fileDataOut->WriteUInt16(0); // no 16bit hashs to write } fileDataOut->WriteUInt16(nHashsToWrite); uint64 nCheckFilePos = fileDataOut->GetPosition(); if (m_pHashTree.CreatePartRecoveryData(nPartStartPos, nPartSize, fileDataOut, 0, bUse32BitIdentifier)) { if (nHashsToWrite*(HASHSIZE+(bUse32BitIdentifier? 4u:2u)) != fileDataOut->GetPosition() - nCheckFilePos) { wxFAIL; AddDebugLogLineN( logSHAHashSet, CFormat(wxT("Created RecoveryData has wrong length. File: %s")) % m_pOwner->GetFileName() ); bResult = false; SetStatus(AICH_ERROR); } else { bResult = true; } } else { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Failed to create RecoveryData for '%s'")) % m_pOwner->GetFileName()); bResult = false; SetStatus(AICH_ERROR); } if (!bUse32BitIdentifier) { fileDataOut->WriteUInt16(0); // no 32bit hashs to write } if (!bDbgDontLoad) { FreeHashSet(); } return bResult; } bool CAICHHashSet::ReadRecoveryData(uint64 nPartStartPos, CMemFile* fileDataIn) { if (/*eMule TODO !m_pOwner->IsPartFile() ||*/ !(m_eStatus == AICH_VERIFIED || m_eStatus == AICH_TRUSTED) ) { wxFAIL; return false; } /* V2 AICH Hash Packet: 16bit-hashs-to-read ()[count1] AICH hashs 32bit-hashs-to-read ()[count2] AICH hashs */ // at this time we check the recoverydata for the correct ammounts of hashs only // all hash are then taken into the tree, depending on there hashidentifier (except the masterhash) uint8 nLevel = 0; uint32 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); m_pHashTree.FindHash(nPartStartPos, nPartSize,&nLevel); uint16 nHashsToRead = (nLevel-1) + nPartSize/EMBLOCKSIZE + ((nPartSize % EMBLOCKSIZE != 0 )? 1:0); // read hashs with 16 bit identifier uint16 nHashsAvailable = fileDataIn->ReadUInt16(); if (fileDataIn->GetLength()-fileDataIn->GetPosition() < nHashsToRead*(HASHSIZE+2u) || (nHashsToRead != nHashsAvailable && nHashsAvailable != 0)) { // this check is redunant, CSafememfile would catch such an error too AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Failed to read RecoveryData for '%s' - Received datasize/amounts of hashs was invalid")) % m_pOwner->GetFileName()); return false; } for (uint32 i = 0; i != nHashsAvailable; i++) { uint16 wHashIdent = fileDataIn->ReadUInt16(); if (wHashIdent == 1 /*never allow masterhash to be overwritten*/ || !m_pHashTree.SetHash(fileDataIn, wHashIdent,(-1), false)) { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Failed to read RecoveryData for '%s' - Error when trying to read hash into tree")) % m_pOwner->GetFileName()); VerifyHashTree(true); // remove invalid hashes which we have already written return false; } } // read hashs with 32bit identifier if (nHashsAvailable == 0 && fileDataIn->GetLength() - fileDataIn->GetPosition() >= 2) { nHashsAvailable = fileDataIn->ReadUInt16(); if (fileDataIn->GetLength()-fileDataIn->GetPosition() < nHashsToRead*(HASHSIZE+4u) || (nHashsToRead != nHashsAvailable && nHashsAvailable != 0)) { // this check is redunant, CSafememfile would catch such an error too // TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Received datasize/amounts of hashs was invalid (2)"), m_pOwner->GetFileName() ); return false; } // TODO: DEBUG_ONLY( theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("read RecoveryData for %s - Received packet with %u 32bit hash identifiers)"), m_pOwner->GetFileName(), nHashsAvailable ) ); for (uint32 i = 0; i != nHashsToRead; i++) { uint32 wHashIdent = fileDataIn->ReadUInt32(); if (wHashIdent == 1 /*never allow masterhash to be overwritten*/ || wHashIdent > 0x400000 || !m_pHashTree.SetHash(fileDataIn, wHashIdent,(-1), false)) { // TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Error when trying to read hash into tree (2)"), m_pOwner->GetFileName() ); VerifyHashTree(true); // remove invalid hashes which we have already written return false; } } } if (nHashsAvailable == 0) { // TODO: theApp->QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Failed to read RecoveryData for %s - Packet didn't contained any hashs"), m_pOwner->GetFileName() ); return false; } if (VerifyHashTree(true)) { // some final check if all hashs we wanted are there for (uint32 nPartPos = 0; nPartPos < nPartSize; nPartPos += EMBLOCKSIZE) { CAICHHashTree* phtToCheck = m_pHashTree.FindHash(nPartStartPos+nPartPos, min(EMBLOCKSIZE, nPartSize-nPartPos)); if (phtToCheck == NULL || !phtToCheck->m_bHashValid) { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Failed to read RecoveryData for '%s' - Error while verifying presence of all lowest level hashes")) % m_pOwner->GetFileName()); return false; } } // all done return true; } else { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Failed to read RecoveryData for '%s' - Verifying received hashtree failed")) % m_pOwner->GetFileName()); return false; } } // this function is only allowed to be called right after successfully calculating the hashset (!) // will delete the hashset, after saving to free the memory bool CAICHHashSet::SaveHashSet() { if (m_eStatus != AICH_HASHSETCOMPLETE) { wxFAIL; return false; } if ( !m_pHashTree.m_bHashValid || m_pHashTree.m_nDataSize != m_pOwner->GetFileSize()) { wxFAIL; return false; } try { const wxString fullpath = theApp->ConfigDir + KNOWN2_MET_FILENAME; const bool exists = wxFile::Exists(fullpath); CFile file(fullpath, exists ? CFile::read_write : CFile::write); if (!file.IsOpened()) { AddDebugLogLineC(logSHAHashSet, wxT("Failed to save HashSet: opening met file failed!")); return false; } uint64 nExistingSize = file.GetLength(); if (nExistingSize) { uint8 header = file.ReadUInt8(); if (header != KNOWN2_MET_VERSION) { AddDebugLogLineC(logSHAHashSet, wxT("Saving failed: Current file is not a met-file!")); return false; } AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Met file is version 0x%2.2x.")) % header); } else { file.WriteUInt8(KNOWN2_MET_VERSION); // Update the recorded size, in order for the sanity check below to work. nExistingSize += 1; } // first we check if the hashset we want to write is already stored CAICHHash CurrentHash; while (file.GetPosition() < nExistingSize) { CurrentHash.Read(&file); if (m_pHashTree.m_Hash == CurrentHash) { // this hashset if already available, no need to save it again return true; } uint32 nHashCount = file.ReadUInt32(); if (file.GetPosition() + nHashCount*HASHSIZE > nExistingSize) { AddDebugLogLineC(logSHAHashSet, wxT("Saving failed: File contains fewer entries than specified!")); return false; } // skip the rest of this hashset file.Seek(nHashCount*HASHSIZE, wxFromCurrent); } // write hashset m_pHashTree.m_Hash.Write(&file); uint32 nHashCount = (PARTSIZE/EMBLOCKSIZE + ((PARTSIZE % EMBLOCKSIZE != 0)? 1 : 0)) * (m_pHashTree.m_nDataSize/PARTSIZE); if (m_pHashTree.m_nDataSize % PARTSIZE != 0) { nHashCount += (m_pHashTree.m_nDataSize % PARTSIZE)/EMBLOCKSIZE + (((m_pHashTree.m_nDataSize % PARTSIZE) % EMBLOCKSIZE != 0)? 1 : 0); } file.WriteUInt32(nHashCount); if (!m_pHashTree.WriteLowestLevelHashs(&file, 0, true, true)) { // thats bad... really file.SetLength(nExistingSize); AddDebugLogLineC(logSHAHashSet, wxT("Failed to save HashSet: WriteLowestLevelHashs() failed!")); return false; } if (file.GetLength() != nExistingSize + (nHashCount+1)*HASHSIZE + 4) { // thats even worse file.SetLength(nExistingSize); AddDebugLogLineC(logSHAHashSet, wxT("Failed to save HashSet: Calculated and real size of hashset differ!")); return false; } AddDebugLogLineN(logSHAHashSet, CFormat(wxT("Successfully saved eMuleAC Hashset, %u Hashs + 1 Masterhash written")) % nHashCount); } catch (const CSafeIOException& e) { AddDebugLogLineC(logSHAHashSet, wxT("IO error while saving AICH HashSet: ") + e.what()); return false; } FreeHashSet(); return true; } bool CAICHHashSet::LoadHashSet() { if (m_eStatus != AICH_HASHSETCOMPLETE) { wxFAIL; return false; } if ( !m_pHashTree.m_bHashValid || m_pHashTree.m_nDataSize != m_pOwner->GetFileSize() || m_pHashTree.m_nDataSize == 0) { wxFAIL; return false; } wxString fullpath = theApp->ConfigDir + KNOWN2_MET_FILENAME; CFile file(fullpath, CFile::read); if (!file.IsOpened()) { if (wxFileExists(fullpath)) { wxString strError(wxT("Failed to load ") KNOWN2_MET_FILENAME wxT(" file")); AddDebugLogLineC(logSHAHashSet, strError); } return false; } try { uint8 header = file.ReadUInt8(); if (header != KNOWN2_MET_VERSION) { AddDebugLogLineC(logSHAHashSet, wxT("Loading failed: Current file is not a met-file!")); return false; } CAICHHash CurrentHash; uint64 nExistingSize = file.GetLength(); uint32 nHashCount; while (file.GetPosition() < nExistingSize) { CurrentHash.Read(&file); if (m_pHashTree.m_Hash == CurrentHash) { // found Hashset uint32 nExpectedCount = (PARTSIZE/EMBLOCKSIZE + ((PARTSIZE % EMBLOCKSIZE != 0)? 1 : 0)) * (m_pHashTree.m_nDataSize/PARTSIZE); if (m_pHashTree.m_nDataSize % PARTSIZE != 0) { nExpectedCount += (m_pHashTree.m_nDataSize % PARTSIZE)/EMBLOCKSIZE + (((m_pHashTree.m_nDataSize % PARTSIZE) % EMBLOCKSIZE != 0)? 1 : 0); } nHashCount = file.ReadUInt32(); if (nHashCount != nExpectedCount) { AddDebugLogLineC(logSHAHashSet, wxT("Failed to load HashSet: Available Hashs and expected hashcount differ!")); return false; } if (!m_pHashTree.LoadLowestLevelHashs(&file)) { AddDebugLogLineC(logSHAHashSet, wxT("Failed to load HashSet: LoadLowestLevelHashs failed!")); return false; } if (!ReCalculateHash(false)) { AddDebugLogLineC(logSHAHashSet, wxT("Failed to load HashSet: Calculating loaded hashs failed!")); return false; } if (CurrentHash != m_pHashTree.m_Hash) { AddDebugLogLineC(logSHAHashSet, wxT("Failed to load HashSet: Calculated Masterhash differs from given Masterhash - hashset corrupt!")); return false; } return true; } nHashCount = file.ReadUInt32(); if (file.GetPosition() + nHashCount*HASHSIZE > nExistingSize) { AddDebugLogLineC(logSHAHashSet, wxT("Saving failed: File contains fewer entries than specified!")); return false; } // skip the rest of this hashset file.Seek(nHashCount*HASHSIZE, wxFromCurrent); } AddDebugLogLineC(logSHAHashSet, wxT("Failed to load HashSet: HashSet not found!")); } catch (const CSafeIOException& e) { AddDebugLogLineC(logSHAHashSet, wxT("IO error while loading AICH HashSet: ") + e.what()); } return false; } // delete the hashset except the masterhash (we dont keep aich hashsets in memory to save ressources) void CAICHHashSet::FreeHashSet() { if (m_pHashTree.m_pLeftTree) { delete m_pHashTree.m_pLeftTree; m_pHashTree.m_pLeftTree = NULL; } if (m_pHashTree.m_pRightTree) { delete m_pHashTree.m_pRightTree; m_pHashTree.m_pRightTree = NULL; } } void CAICHHashSet::SetMasterHash(const CAICHHash& Hash, EAICHStatus eNewStatus) { m_pHashTree.m_Hash = Hash; m_pHashTree.m_bHashValid = true; SetStatus(eNewStatus); } CAICHHashAlgo* CAICHHashSet::GetNewHashAlgo() { return new CSHA(); } bool CAICHHashSet::ReCalculateHash(bool bDontReplace) { CAICHHashAlgo* hashalg = GetNewHashAlgo(); bool bResult = m_pHashTree.ReCalculateHash(hashalg, bDontReplace); delete hashalg; return bResult; } bool CAICHHashSet::VerifyHashTree(bool bDeleteBadTrees) { CAICHHashAlgo* hashalg = GetNewHashAlgo(); bool bResult = m_pHashTree.VerifyHashTree(hashalg, bDeleteBadTrees); delete hashalg; return bResult; } void CAICHHashSet::SetFileSize(uint64 nSize) { m_pHashTree.m_nDataSize = nSize; m_pHashTree.m_nBaseSize = (nSize <= PARTSIZE) ? EMBLOCKSIZE : PARTSIZE; } void CAICHHashSet::UntrustedHashReceived(const CAICHHash& Hash, uint32 dwFromIP) { switch(GetStatus()) { case AICH_EMPTY: case AICH_UNTRUSTED: case AICH_TRUSTED: break; default: return; } bool bFound = false; bool bAdded = false; for (uint32 i = 0; i < m_aUntrustedHashs.size(); ++i) { if (m_aUntrustedHashs[i].m_Hash == Hash) { bAdded = m_aUntrustedHashs[i].AddSigningIP(dwFromIP); bFound = true; break; } } if (!bFound) { bAdded = true; CAICHUntrustedHash uhToAdd; uhToAdd.m_Hash = Hash; uhToAdd.AddSigningIP(dwFromIP); m_aUntrustedHashs.push_back(uhToAdd); } uint32 nSigningIPsTotal = 0; // unique clients who send us a hash int nMostTrustedPos = (-1); // the hash which most clients send us uint32 nMostTrustedIPs = 0; for (uint32 i = 0; i < (uint32)m_aUntrustedHashs.size(); ++i) { nSigningIPsTotal += m_aUntrustedHashs[i].m_adwIpsSigning.size(); if ((uint32)m_aUntrustedHashs[i].m_adwIpsSigning.size() > nMostTrustedIPs) { nMostTrustedIPs = m_aUntrustedHashs[i].m_adwIpsSigning.size(); nMostTrustedPos = i; } } if (nMostTrustedPos == (-1) || nSigningIPsTotal == 0) { wxFAIL; return; } // the check if we trust any hash if ( thePrefs::IsTrustingEveryHash() || (nMostTrustedIPs >= MINUNIQUEIPS_TOTRUST && (100 * nMostTrustedIPs)/nSigningIPsTotal >= MINPERCENTAGE_TOTRUST)) { //trusted AddDebugLogLineN(logSHAHashSet, CFormat(wxT("AICH Hash received (%sadded), We have now %u hash(es) from %u unique IP(s). ") wxT("We trust the Hash %s from %u client(s) (%u%%). File: %s")) % (bAdded ? wxT("") : wxT("not ")) % m_aUntrustedHashs.size() % nSigningIPsTotal % m_aUntrustedHashs[nMostTrustedPos].m_Hash.GetString() % nMostTrustedIPs % ((100 * nMostTrustedIPs) / nSigningIPsTotal) % m_pOwner->GetFileName()); SetStatus(AICH_TRUSTED); if (!HasValidMasterHash() || GetMasterHash() != m_aUntrustedHashs[nMostTrustedPos].m_Hash) { SetMasterHash(m_aUntrustedHashs[nMostTrustedPos].m_Hash, AICH_TRUSTED); FreeHashSet(); } } else { // untrusted AddDebugLogLineN(logSHAHashSet, CFormat(wxT("AICH Hash received (%sadded), We have now %u hash(es) from %u unique IP(s). ") wxT("Best Hash %s from %u clients (%u%%) - but we don't trust it yet. File: %s")) % (bAdded ? wxT(""): wxT("not ")) % m_aUntrustedHashs.size() % nSigningIPsTotal % m_aUntrustedHashs[nMostTrustedPos].m_Hash.GetString() % nMostTrustedIPs % ((100 * nMostTrustedIPs) / nSigningIPsTotal) % m_pOwner->GetFileName()); SetStatus(AICH_UNTRUSTED); if (!HasValidMasterHash() || GetMasterHash() != m_aUntrustedHashs[nMostTrustedPos].m_Hash) { SetMasterHash(m_aUntrustedHashs[nMostTrustedPos].m_Hash, AICH_UNTRUSTED); FreeHashSet(); } } if (bAdded) {} // get rid of unused variable warning } void CAICHHashSet::ClientAICHRequestFailed(CUpDownClient* pClient) { pClient->SetReqFileAICHHash(NULL); CAICHRequestedData data = GetAICHReqDetails(pClient); RemoveClientAICHRequest(pClient); if (data.m_pClient.GetClient() != pClient) { return; } if( theApp->downloadqueue->IsPartFile(data.m_pPartFile)) { AddDebugLogLineN(logSHAHashSet, CFormat(wxT("AICH Request failed, Trying to ask another client (File: '%s', Part: %u, Client '%s'")) % data.m_pPartFile->GetFileName() % data.m_nPart % pClient->GetClientFullInfo()); data.m_pPartFile->RequestAICHRecovery(data.m_nPart); } } void CAICHHashSet::RemoveClientAICHRequest(const CUpDownClient* pClient) { for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { if (it->m_pClient.GetClient() == pClient) { m_liRequestedData.erase(it); return; } } wxFAIL; } bool CAICHHashSet::IsClientRequestPending(const CPartFile* pForFile, uint16 nPart) { for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { if (it->m_pPartFile == pForFile && it->m_nPart == nPart) { return true; } } return false; } CAICHRequestedData CAICHHashSet::GetAICHReqDetails(const CUpDownClient* pClient) { for (CAICHRequestedDataList::iterator it = m_liRequestedData.begin();it != m_liRequestedData.end(); ++it) { if (it->m_pClient.GetClient() == pClient) { return *(it); } } wxFAIL; CAICHRequestedData empty; return empty; } bool CAICHHashSet::IsPartDataAvailable(uint64 nPartStartPos) { if (!(m_eStatus == AICH_VERIFIED || m_eStatus == AICH_TRUSTED || m_eStatus == AICH_HASHSETCOMPLETE) ) { wxFAIL; return false; } uint64 nPartSize = min(PARTSIZE, m_pOwner->GetFileSize()-nPartStartPos); for (uint64 nPartPos = 0; nPartPos < nPartSize; nPartPos += EMBLOCKSIZE) { CAICHHashTree* phtToCheck = m_pHashTree.FindHash(nPartStartPos+nPartPos, min(EMBLOCKSIZE, nPartSize-nPartPos)); if (phtToCheck == NULL || !phtToCheck->m_bHashValid) { return false; } } return true; } // VC++ defines Assert as ASSERT. VC++ also defines VERIFY MACRO, which is the equivalent of ASSERT but also works in Released builds. #define VERIFY(x) wxASSERT(x) void CAICHHashSet::DbgTest() { #ifdef _DEBUG //define TESTSIZE 4294567295 uint8 maxLevel = 0; uint32 cHash = 1; uint8 curLevel = 0; //uint32 cParts = 0; maxLevel = 0; /* CAICHHashTree* pTest = new CAICHHashTree(TESTSIZE, true, 9728000); for (uint64 i = 0; i+9728000 < TESTSIZE; i += 9728000) { CAICHHashTree* pTest2 = new CAICHHashTree(9728000, true, EMBLOCKSIZE); pTest->ReplaceHashTree(i, 9728000, &pTest2); cParts++; } CAICHHashTree* pTest2 = new CAICHHashTree(TESTSIZE-i, true, EMBLOCKSIZE); pTest->ReplaceHashTree(i, (TESTSIZE-i), &pTest2); cParts++; */ #define TESTSIZE m_pHashTree.m_nDataSize if (m_pHashTree.m_nDataSize <= EMBLOCKSIZE) { return; } CAICHHashSet TestHashSet(m_pOwner); TestHashSet.SetFileSize(m_pOwner->GetFileSize()); TestHashSet.SetMasterHash(GetMasterHash(), AICH_VERIFIED); CMemFile file; uint64 i; for (i = 0; i+9728000 < TESTSIZE; i += 9728000) { VERIFY( CreatePartRecoveryData(i, &file) ); /*uint32 nRandomCorruption = (rand() * rand()) % (file.GetLength()-4); file.Seek(nRandomCorruption, CFile::begin); file.Write(&nRandomCorruption, 4);*/ file.Seek(0,wxFromStart); VERIFY( TestHashSet.ReadRecoveryData(i, &file) ); file.Seek(0,wxFromStart); TestHashSet.FreeHashSet(); uint32 j; for (j = 0; j+EMBLOCKSIZE < 9728000; j += EMBLOCKSIZE) { VERIFY( m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel) ); //TRACE(wxT("%u - %s\r\n"), cHash, m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel)->m_Hash.GetString()); maxLevel = max(curLevel, maxLevel); curLevel = 0; cHash++; } VERIFY( m_pHashTree.FindHash(i+j, 9728000-j, &curLevel) ); //TRACE(wxT("%u - %s\r\n"), cHash, m_pHashTree.FindHash(i+j, 9728000-j, &curLevel)->m_Hash.GetString()); maxLevel = max(curLevel, maxLevel); curLevel = 0; cHash++; } VERIFY( CreatePartRecoveryData(i, &file) ); file.Seek(0,wxFromStart); VERIFY( TestHashSet.ReadRecoveryData(i, &file) ); file.Seek(0,wxFromStart); TestHashSet.FreeHashSet(); for (uint64 j = 0; j+EMBLOCKSIZE < TESTSIZE-i; j += EMBLOCKSIZE) { VERIFY( m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel) ); //TRACE(wxT("%u - %s\r\n"), cHash,m_pHashTree.FindHash(i+j, EMBLOCKSIZE, &curLevel)->m_Hash.GetString()); maxLevel = max(curLevel, maxLevel); curLevel = 0; cHash++; } //VERIFY( m_pHashTree.FindHash(i+j, (TESTSIZE-i)-j, &curLevel) ); //TRACE(wxT("%u - %s\r\n"), cHash,m_pHashTree.FindHash(i+j, (TESTSIZE-i)-j, &curLevel)->m_Hash.GetString()); maxLevel = max(curLevel, maxLevel); #endif } // File_checked_for_headers aMule-2.3.1/src/CaptchaDialog.h0000644000175000017470000000443511575347521015127 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CAPTCHADIALOG_H #define CAPTCHADIALOG_H #include // Needed for wxDialog #include "Types.h" /** * The ClientDetailDialog class is responsible for showing the info about a client. * * It shows all releavant data about the client: ip, port, hash, name, client * type and version, uploading/downloading data, credits, server... etc * * It's wxDialog, modal, with return value always '0'. * */ class CCaptchaDialog : public wxDialog { public: /** * Constructor. * * @param parent The window that created the dialog. * @param client The client whose details we're showing. */ CCaptchaDialog(wxWindow*parent, const wxImage& captchaImage, uint64 id); /** * Destructor. */ virtual ~CCaptchaDialog(); protected: /** * Creates all the data objects in the dialog, filling them accordingly. * * Called when the dialog object is created. */ virtual bool OnInitDialog(); /** * Ends the dialog, calling EndModal with return value 0 * * @param evt The close event, unused right now */ void OnBnClose(wxCommandEvent& evt); DECLARE_EVENT_TABLE() private: wxSizer * captchaDlg( wxWindow *parent ); class wxBitmap * m_captchaBitmap; class wxTextCtrl * m_TextCtrl; uint64 m_id; }; #endif // CAPTCHADIALOG_H // File_checked_for_headers aMule-2.3.1/src/GenericClientListCtrl.h0000644000175000017470000001730211575347521016635 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef GENERICCLIENTLISTCTRL_H #define GENERICCLIENTLISTCTRL_H #include // Needed for std::multimap #include // Needed for std::vector #include #include "Types.h" // Needed for uint8 #include "Constants.h" // Needed for DownloadItemType #include "MuleListCtrl.h" // Needed for CMuleListCtrl #include "amuleDlg.h" // Needed for CamuleDlg::DialogType class CPartFile; class CClientRef; class wxBitmap; class wxRect; class wxDC; struct ClientCtrlItem_Struct; enum GenericColumnEnum { ColumnUserName = 0, ColumnUserDownloaded, ColumnUserUploaded, ColumnUserSpeedDown, ColumnUserSpeedUp, ColumnUserProgress, ColumnUserAvailable, ColumnUserVersion, ColumnUserQueueRankLocal, ColumnUserQueueRankRemote, ColumnUserOrigin, ColumnUserFileNameDownload, ColumnUserFileNameUpload, ColumnUserFileNameDownloadRemote, ColumnUserSharedFiles, ColumnInvalid }; struct CGenericClientListCtrlColumn { GenericColumnEnum cid; wxString title; int width; }; struct GenericColumnInfo { GenericColumnInfo(int n, CGenericClientListCtrlColumn* col) : n_columns(n), columns(col) { }; int n_columns; CGenericClientListCtrlColumn* columns; }; typedef std::vector CKnownFileVector; /** * This class is responsible for representing clients in a generic way. */ class CGenericClientListCtrl : public CMuleListCtrl { public: /** * Constructor. * * @see CMuleListCtrl::CMuleListCtrl for documentation of parameters. */ CGenericClientListCtrl( const wxString& tablename, wxWindow *parent, wxWindowID winid, const wxPoint &pos, const wxSize &size, long style, const wxValidator& validator, const wxString &name); /** * Destructor. */ virtual ~CGenericClientListCtrl(); /** * Initializes the control. We need a 2-stage initialization so the derived class members can be called. */ void InitColumnData(); /** * Adds a source belonging to the specified file. * * @param owner The owner of this specific source-entry, must be a valid pointer. * @param source The client object to be added, must be a valid pointer. * @param type If the source is a current source, or a A4AF source. * * Please note that the specified client will only be added to the list if it's * owner is shown, otherwise the source will simply be ignored. * Duplicates wont be added. */ void AddSource( CKnownFile* owner, const CClientRef& source, SourceItemType type ); /** * Removes a source from the list. * * @param source ID of the source to be removed. * @param owner Either a specific file, or NULL to remove the source from all files. */ void RemoveSource( uint32 source, const CKnownFile* owner ); /** * Shows the clients of specific files. * * @param file A valid, sorted vector of files whose clients will be shown. * * WARNING: The received vector *MUST* be odered with std::sort. * */ void ShowSources( const CKnownFileVector& files ); /** * Updates the state of the specified item, possibly causing a redrawing. * * @param toupdate ID of the client to be updated. * @param type If the source is a current source, or a A4AF source. * */ void UpdateItem(uint32 toupdate, SourceItemType type); void SetShowing( bool status ) { m_showing = status; } bool GetShowing() const { return m_showing; } protected: // The columns with their attributes; MUST be defined by the derived class. GenericColumnInfo m_columndata; static int wxCALLBACK SortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); private: /** * * Must be overriden by the derived class and return the dialog where this list is. * @see CamuleDlg::DialogType * */ virtual CamuleDlg::DialogType GetParentDialog() = 0; /** * Updates the displayed number representing the amount of clients currently shown. */ void ShowSourcesCount( int diff ); /** * Overloaded function needed for custom drawing of items. */ virtual void OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted ); /** * Draws a client item. */ void DrawClientItem( wxDC* dc, int nColumn, const wxRect& rect, ClientCtrlItem_Struct* item, int iTextOffset, int iBitmapOffset, int iBitmapXSize ) const; /** * Draws the download status (chunk) bar for a client. */ void DrawSourceStatusBar( const CClientRef& source, wxDC* dc, const wxRect& rect, bool bFlat) const; /** * Draaws the file parts bar for a client. */ void DrawStatusBar( const CClientRef& client, wxDC* dc, const wxRect& rect1 ) const; /** * @see CMuleListCtrl::GetTTSText * Just a dummy */ virtual wxString GetTTSText(unsigned) const { return wxEmptyString; } /** * Set "show sources" or "show peers" flag in Known File */ virtual void SetShowSources(CKnownFile *, bool) const = 0; /** * Translate the CID to a unique string for saving column sizes * @see CMuleListCtrl::InsertColumn */ wxString TranslateCIDToName(GenericColumnEnum cid); static int Compare( const CClientRef& client1, const CClientRef& client2, long lParamColumnSort); // Event-handlers for clients. void OnSwapSource( wxCommandEvent& event ); void OnViewFiles( wxCommandEvent& event ); void OnAddFriend( wxCommandEvent& event ); void OnSetFriendslot( wxCommandEvent& event ); void OnSendMessage( wxCommandEvent& event ); void OnViewClientInfo( wxCommandEvent& event ); // Misc event-handlers void OnItemActivated( wxListEvent& event ); void OnMouseRightClick( wxListEvent& event ); void OnMouseMiddleClick( wxListEvent& event ); void OnKeyPressed( wxKeyEvent& event ); //! The type of list used to store items on the listctrl. We use the unique ECID as key. typedef std::multimap ListItems; //! Shortcut to the pair-type used on the list. typedef ListItems::value_type ListItemsPair; //! This pair is used when searching for equal-ranges. typedef std::pair< ListItems::iterator, ListItems::iterator > ListIteratorPair; //! This list contains everything shown on the list. Sources are only to //! be found on this list if they are being displayed ListItems m_ListItems; //! Pointer to the current menu object, used to avoid multiple menus. wxMenu* m_menu; //! Cached brush object. wxBrush m_hilightBrush; //! Cached brush object. wxBrush m_hilightUnfocusBrush; //! The number of displayed sources int m_clientcount; //! The files being shown, if any. CKnownFileVector m_knownfiles; DECLARE_EVENT_TABLE() bool m_showing; void RawAddSource(CKnownFile* owner, CClientRef source, SourceItemType type); void RawRemoveSource( ListItems::iterator& it ); virtual bool IsShowingDownloadSources() const = 0; }; #endif // File_checked_for_headers aMule-2.3.1/src/PartFileConvertDlg.h0000644000175000017470000000373311575347521016142 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef PARTFILECONVERTDLG_H #define PARTFILECONVERTDLG_H #include #include #include struct ConvertInfo; class CPartFileConvertDlg : public wxDialog { public: CPartFileConvertDlg(wxWindow *parent); static void ShowGUI(wxWindow *parent); static void UpdateProgress(float percent, wxString text = wxEmptyString, wxString header = wxEmptyString); static void UpdateJobInfo(ConvertInfo& info); static void RemoveJobInfo(unsigned id); static void ClearInfo(); static void CloseGUI(); protected: wxGauge* m_pb_current; wxListCtrl* m_joblist; void OnAddFolder(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnCloseButton(wxCommandEvent& event); void RetrySel(wxCommandEvent& event); void RemoveSel(wxCommandEvent& event); DECLARE_EVENT_TABLE() static CPartFileConvertDlg* s_convertgui; }; #endif /* PARTFILECONVERTDLG_H */ aMule-2.3.1/src/IPFilterScanner.cpp0000644000175000017470000015354111575347521015772 0ustar topiusers#line 2 "IPFilterScanner.cpp" #line 4 "IPFilterScanner.cpp" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer yyip_create_buffer #define yy_delete_buffer yyip_delete_buffer #define yy_flex_debug yyip_flex_debug #define yy_init_buffer yyip_init_buffer #define yy_flush_buffer yyip_flush_buffer #define yy_load_buffer_state yyip_load_buffer_state #define yy_switch_to_buffer yyip_switch_to_buffer #define yyin yyipin #define yyleng yyipleng #define yylex yyiplex #define yylineno yyiplineno #define yyout yyipout #define yyrestart yyiprestart #define yytext yyiptext #define yywrap yyipwrap #define yyalloc yyipalloc #define yyrealloc yyiprealloc #define yyfree yyipfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyiprestart(yyipin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyipleng; extern FILE *yyipin, *yyipout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yyiptext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yyiptext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyiprestart()), so that the user can continue scanning by * just pointing yyipin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yyiptext is formed. */ static char yy_hold_char; static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ yy_size_t yyipleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yyipwrap()'s to do buffer switches * instead of setting up a fresh yyipin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyiprestart (FILE *input_file ); void yyip_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yyip_create_buffer (FILE *file,int size ); void yyip_delete_buffer (YY_BUFFER_STATE b ); void yyip_flush_buffer (YY_BUFFER_STATE b ); void yyippush_buffer_state (YY_BUFFER_STATE new_buffer ); void yyippop_buffer_state (void ); static void yyipensure_buffer_stack (void ); static void yyip_load_buffer_state (void ); static void yyip_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yyip_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yyip_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yyip_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yyip_scan_bytes (yyconst char *bytes,yy_size_t len ); void *yyipalloc (yy_size_t ); void *yyiprealloc (void *,yy_size_t ); void yyipfree (void * ); #define yy_new_buffer yyip_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyipensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yyip_create_buffer(yyipin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyipensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yyip_create_buffer(yyipin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yyipwrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyipin = (FILE *) 0, *yyipout = (FILE *) 0; typedef int yy_state_type; extern int yyiplineno; int yyiplineno = 1; extern char *yyiptext; #define yytext_ptr yyiptext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yyiptext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyipleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 6 #define YY_END_OF_BUFFER 7 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[169] = { 0, 0, 0, 7, 6, 6, 4, 5, 5, 2, 5, 5, 0, 4, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 3, 0, 2, 2, 0, 0, 0, 3, 3, 2, 2, 0, 1, 0, 3, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[10] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[173] = { 0, 0, 3, 231, 232, 11, 232, 221, 14, 220, 17, 25, 0, 232, 219, 0, 0, 218, 0, 217, 33, 36, 217, 0, 38, 0, 45, 47, 216, 215, 211, 54, 210, 209, 208, 56, 207, 58, 198, 60, 197, 196, 195, 194, 191, 189, 188, 62, 187, 64, 180, 71, 179, 178, 177, 176, 172, 171, 78, 170, 85, 169, 92, 165, 0, 94, 164, 163, 101, 162, 161, 108, 158, 157, 155, 0, 110, 154, 0, 112, 151, 114, 150, 149, 148, 147, 144, 143, 142, 116, 141, 118, 140, 120, 137, 136, 135, 134, 133, 130, 129, 122, 127, 124, 126, 131, 107, 106, 105, 104, 103, 100, 138, 99, 145, 98, 152, 97, 0, 159, 96, 91, 89, 88, 87, 84, 81, 81, 80, 77, 75, 166, 75, 0, 174, 181, 74, 183, 73, 70, 68, 185, 67, 66, 53, 192, 52, 51, 199, 50, 0, 201, 49, 43, 42, 203, 41, 40, 32, 205, 31, 30, 29, 212, 28, 24, 23, 22, 232, 220, 28, 27, 0 } ; static yyconst flex_int16_t yy_def[173] = { 0, 169, 168, 168, 168, 168, 168, 170, 168, 171, 170, 170, 5, 168, 170, 11, 8, 171, 10, 171, 171, 10, 10, 11, 10, 20, 20, 10, 10, 21, 24, 20, 26, 21, 27, 27, 24, 26, 26, 24, 27, 21, 35, 31, 37, 21, 39, 39, 35, 37, 37, 21, 39, 21, 47, 31, 49, 51, 21, 51, 51, 47, 31, 49, 58, 47, 51, 60, 58, 60, 62, 31, 62, 21, 65, 68, 65, 60, 71, 31, 62, 65, 65, 21, 76, 31, 79, 21, 81, 81, 76, 79, 79, 76, 81, 21, 89, 31, 91, 21, 93, 93, 89, 91, 91, 21, 93, 21, 101, 31, 103, 105, 21, 105, 21, 101, 31, 103, 112, 112, 105, 114, 114, 116, 116, 119, 172, 119, 114, 116, 172, 172, 119, 131, 131, 131, 134, 134, 134, 135, 137, 137, 137, 135, 141, 135, 141, 145, 135, 145, 148, 135, 145, 135, 151, 151, 151, 135, 155, 155, 155, 135, 159, 135, 159, 163, 163, 163, 0, 168, 168, 168, 168 } ; static yyconst flex_int16_t yy_nxt[242] = { 0, 130, 5, 6, 7, 8, 6, 9, 7, 7, 7, 10, 11, 12, 13, 14, 16, 13, 17, 14, 14, 14, 18, 15, 21, 22, 15, 23, 19, 14, 130, 167, 130, 24, 15, 25, 130, 164, 163, 130, 160, 26, 20, 14, 27, 29, 30, 19, 159, 130, 156, 155, 31, 32, 33, 34, 19, 130, 152, 130, 130, 146, 37, 41, 42, 43, 44, 45, 46, 53, 54, 55, 56, 57, 145, 130, 142, 58, 141, 59, 64, 130, 138, 14, 131, 19, 65, 67, 14, 132, 131, 68, 14, 69, 70, 129, 19, 128, 71, 14, 72, 73, 74, 75, 14, 19, 14, 120, 14, 76, 78, 117, 116, 115, 114, 14, 79, 83, 84, 85, 86, 87, 88, 95, 96, 97, 98, 99, 100, 107, 108, 109, 110, 111, 19, 14, 112, 106, 105, 113, 118, 104, 103, 102, 101, 14, 119, 121, 19, 14, 94, 93, 92, 122, 123, 91, 90, 89, 14, 19, 124, 125, 14, 82, 126, 81, 80, 127, 133, 19, 77, 14, 14, 19, 134, 131, 130, 14, 66, 14, 63, 135, 136, 130, 62, 61, 60, 14, 19, 137, 139, 140, 143, 144, 147, 14, 52, 51, 148, 50, 149, 150, 49, 48, 47, 14, 19, 151, 153, 154, 157, 158, 161, 162, 165, 14, 40, 39, 38, 36, 166, 4, 4, 35, 14, 28, 20, 20, 15, 20, 15, 168, 3, 168, 168, 168, 168, 168, 168, 168, 168, 168 } ; static yyconst flex_int16_t yy_chk[242] = { 0, 172, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 11, 171, 170, 167, 166, 165, 11, 11, 20, 164, 162, 161, 160, 158, 20, 20, 21, 21, 24, 24, 26, 157, 156, 154, 153, 26, 26, 27, 27, 31, 152, 149, 147, 146, 144, 31, 35, 35, 37, 37, 39, 39, 47, 47, 49, 49, 51, 143, 142, 140, 51, 139, 51, 58, 138, 136, 132, 130, 129, 58, 60, 128, 127, 126, 60, 125, 60, 62, 124, 123, 122, 62, 121, 62, 65, 65, 68, 120, 117, 115, 113, 111, 68, 71, 110, 109, 108, 107, 106, 71, 76, 76, 79, 79, 81, 81, 89, 89, 91, 91, 93, 93, 101, 101, 103, 103, 105, 104, 102, 105, 100, 99, 105, 112, 98, 97, 96, 95, 94, 112, 114, 92, 90, 88, 87, 86, 114, 116, 85, 84, 83, 82, 80, 116, 119, 77, 74, 119, 73, 72, 119, 131, 70, 69, 67, 66, 63, 131, 131, 134, 61, 59, 57, 56, 134, 134, 135, 55, 54, 53, 52, 50, 135, 137, 137, 141, 141, 145, 48, 46, 45, 145, 44, 145, 148, 43, 42, 41, 40, 38, 148, 151, 151, 155, 155, 159, 159, 163, 36, 34, 33, 32, 30, 163, 169, 169, 29, 28, 22, 19, 17, 14, 9, 7, 3, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yyip_flex_debug; int yyip_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yyiptext; #line 1 "./IPFilterScanner.l" #line 2 "./IPFilterScanner.l" // // This file is part of the aMule Project. // // Copyright (c) 2009-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2009-2011 Stu Redman ( sturedman@amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // // // Read IP filters // // These have a silly "grammar". For example: // 1.2.3.4-1.2.3.5,100,Duh:2.3.4.5-2.3.4.6 // Now - which format is it, and what range should it take? // // So just use the lexer to read the file and assure the line format. // The actual IP reading is done with the ScanIP() function. // #include #include "Types.h" #include "Logger.h" #define IPFS_EXTERN #include "IPFilterScanner.h" #include #include #ifdef _MSC_VER #define isatty(DUMMY) 0 #define YY_NO_UNISTD_H #pragma warning(disable:4003) #endif #define YY_NEVER_INTERACTIVE 1 // When we get here the IP has been lexed nicely, // so we can blaze through without any checks. // The total lexing time is more than twice as fast // with this than when using sscanf. static bool ScanIP(const char * buf, uint32 & ip) { while (*buf < '0') { buf++; // skip whitespace } ip = 0; int a = 0; for (int i = 0; i < 4; buf++) { if (*buf < '0' || *buf > '9') { // finished a number, check it and add to the ip if (a > 255) { return false; } ip = (ip << 8) | a; a = 0; i++; } else { // build number a = a * 10 + *buf - '0'; } } return true; } static bool ScanInt(const char * buf, uint32 & a) { while (*buf < '0') { buf++; // skip whitespace } a = 0; while (*buf >= '0' && *buf <= '9') { a = a * 10 + *buf - '0'; if (a > 255) { return false; } buf++; } return true; } #line 674 "IPFilterScanner.cpp" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yyiplex_destroy (void ); int yyipget_debug (void ); void yyipset_debug (int debug_flag ); YY_EXTRA_TYPE yyipget_extra (void ); void yyipset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyipget_in (void ); void yyipset_in (FILE * in_str ); FILE *yyipget_out (void ); void yyipset_out (FILE * out_str ); yy_size_t yyipget_leng (void ); char *yyipget_text (void ); int yyipget_lineno (void ); void yyipset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yyipwrap (void ); #else extern int yyipwrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO fwrite( yyiptext, yyipleng, 1, yyipout ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ yy_size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyipin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyipin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyipin))==0 && ferror(yyipin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyipin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yyiplex (void); #define YY_DECL int yyiplex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yyiptext and yyipleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyipleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yyiptext[yyipleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 106 "./IPFilterScanner.l" #line 862 "IPFilterScanner.cpp" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyipin ) yyipin = stdin; if ( ! yyipout ) yyipout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyipensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yyip_create_buffer(yyipin,YY_BUF_SIZE ); } yyip_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yyiptext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 169 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 232 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 108 "./IPFilterScanner.l" { /* PeerGuardian filter line - , , */ char * ip1 = yyiptext; char * ip2 = strchr(ip1 + 7, '-') + 1; char * acc = strchr(ip2 + 7, ',') + 1; char * dsc = strchr(acc + 1, ',') + 1; if (!ScanIP(ip1, IPStart) || !ScanIP(ip2, IPEnd) || !ScanInt(acc, IPLevel)) { yyip_Bad++; } else { IPDescription = dsc; return 1; } } YY_BREAK case 2: YY_RULE_SETUP #line 125 "./IPFilterScanner.l" { /* Comment */ } YY_BREAK case 3: YY_RULE_SETUP #line 129 "./IPFilterScanner.l" { /* AntiP2P filter line : - */ char * ip1 = strrchr(yyiptext, ':'); *ip1++ = 0; // remove : and terminate comment char * ip2 = strchr(ip1 + 7, '-') + 1; if (!ScanIP(ip1, IPStart) || !ScanIP(ip2, IPEnd)) { yyip_Bad++; } else { IPLevel = 0; IPDescription = yyiptext; return 1; } } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 145 "./IPFilterScanner.l" { yyip_Line++; } YY_BREAK case 5: YY_RULE_SETUP #line 149 "./IPFilterScanner.l" { /* Bad line */ yyip_Bad++; AddDebugLogLineN(logIPFilter, CFormat(wxT("error in line %d: %s")) % yyip_Line % wxString(char2unicode(yyiptext))); } YY_BREAK case 6: YY_RULE_SETUP #line 155 "./IPFilterScanner.l" ECHO; YY_BREAK #line 1014 "IPFilterScanner.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyipin at a new source and called * yyiplex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyipin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yyipwrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yyiptext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yyiplex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyiprealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyiprestart(yyipin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyiprealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 169 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 169 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 168); return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yyiptext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyiprestart(yyipin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yyipwrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yyiptext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyiprestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyipensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yyip_create_buffer(yyipin,YY_BUF_SIZE ); } yyip_init_buffer(YY_CURRENT_BUFFER,input_file ); yyip_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyip_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yyippop_buffer_state(); * yyippush_buffer_state(new_buffer); */ yyipensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yyip_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yyipwrap()) processing, but the only time this flag * is looked at is after yyipwrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yyip_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyipin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyip_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyipalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yyip_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyipalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yyip_create_buffer()" ); b->yy_is_our_buffer = 1; yyip_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yyip_create_buffer() * */ void yyip_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyipfree((void *) b->yy_ch_buf ); yyipfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyiprestart() or at EOF. */ static void yyip_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yyip_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yyip_init_buffer was _probably_ * called from yyiprestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyip_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yyip_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyippush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyipensure_buffer_stack(); /* This block is copied from yyip_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yyip_switch_to_buffer. */ yyip_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyippop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yyip_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yyip_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyipensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyipalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyipensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyiprealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyipensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yyip_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyipalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yyip_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yyip_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yyiplex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yyip_scan_bytes() instead. */ YY_BUFFER_STATE yyip_scan_string (yyconst char * yystr ) { return yyip_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yyiplex() will * scan from a @e copy of @a bytes. * @param bytes the byte buffer to scan * @param len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yyip_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n, i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyipalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yyip_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yyip_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yyip_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yyiptext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yyiptext[yyipleng] = (yy_hold_char); \ (yy_c_buf_p) = yyiptext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyipleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyipget_lineno (void) { return yyiplineno; } /** Get the input stream. * */ FILE *yyipget_in (void) { return yyipin; } /** Get the output stream. * */ FILE *yyipget_out (void) { return yyipout; } /** Get the length of the current token. * */ yy_size_t yyipget_leng (void) { return yyipleng; } /** Get the current token. * */ char *yyipget_text (void) { return yyiptext; } /** Set the current line number. * @param line_number * */ void yyipset_lineno (int line_number ) { yyiplineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yyip_switch_to_buffer */ void yyipset_in (FILE * in_str ) { yyipin = in_str ; } void yyipset_out (FILE * out_str ) { yyipout = out_str ; } int yyipget_debug (void) { return yyip_flex_debug; } void yyipset_debug (int bdebug ) { yyip_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yyiplex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyipin = stdin; yyipout = stdout; #else yyipin = (FILE *) 0; yyipout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yyiplex_init() */ return 0; } /* yyiplex_destroy is for both reentrant and non-reentrant scanners. */ int yyiplex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yyip_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yyippop_buffer_state(); } /* Destroy the stack itself. */ yyipfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yyiplex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyipalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyiprealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyipfree (void * ptr ) { free( (char *) ptr ); /* see yyiprealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 155 "./IPFilterScanner.l" aMule-2.3.1/src/ClientDetailDialog.h0000644000175000017470000000460611575347521016125 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CLIENTDETAILDIALOG_H #define CLIENTDETAILDIALOG_H #include // Needed for wxDialog #include "ClientRef.h" // Needed for CClientRef /** * The ClientDetailDialog class is responsible for showing the info about a client. * * It shows all releavant data about the client: ip, port, hash, name, client * type and version, uploading/downloading data, credits, server... etc * * It's wxDialog, modal, with return value always '0'. * */ class CClientDetailDialog : public wxDialog { public: /** * Constructor. * * @param parent The window that created the dialog. * @param client The client whose details we're showing. */ CClientDetailDialog(wxWindow*parent, const CClientRef& client); /** * Destructor. * * Does nothing currently. */ virtual ~CClientDetailDialog(); protected: /** * Creates all the data objects in the dialog, filling them accordingly. * * Called when the dialog object is created. */ virtual bool OnInitDialog(); /** * Ends the dialog, calling EndModal with return value 0 * * @param evt The close event, unused right now */ void OnBnClose(wxCommandEvent& evt); DECLARE_EVENT_TABLE() private: //! The client whose data is drawn CClientRef m_client; }; #endif // CLIENTDETAILDIALOG_H // File_checked_for_headers aMule-2.3.1/src/GenericClientListCtrl.cpp0000644000175000017470000012150311575347521017167 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "GenericClientListCtrl.h" #include #include #include // Needed for CFormat #include "amule.h" // Needed for theApp #include "amuleDlg.h" // Needed for CamuleDlg #include "BarShader.h" // Needed for CBarShader #include "BitVector.h" #include "ClientDetailDialog.h" // Needed for CClientDetailDialog #include "ChatWnd.h" // Needed for CChatWnd #include "CommentDialogLst.h" // Needed for CCommentDialogLst #include "DataToText.h" // Needed for PriorityToStr #include "FileDetailDialog.h" // Needed for CFileDetailDialog #include "GetTickCount.h" // Needed for GetTickCount #include "GuiEvents.h" // Needed for CoreNotify_* #ifdef ENABLE_IP2COUNTRY #include "IP2Country.h" // Needed for IP2Country #endif #include "Logger.h" #include "muuli_wdr.h" // Needed for ID_DLOADLIST #include "PartFile.h" // Needed for CPartFile #include "Preferences.h" #include "SharedFileList.h" // Needed for CSharedFileList #include "TerminationProcess.h" // Needed for CTerminationProcess #include "ClientRef.h" // Needed for CClientRef #include "FriendList.h" struct ClientCtrlItem_Struct { ClientCtrlItem_Struct() : dwUpdated(0), status(NULL), m_owner(NULL), m_type(UNAVAILABLE_SOURCE) { } ~ClientCtrlItem_Struct() { delete status; } SourceItemType GetType() const { return m_type; } CKnownFile* GetOwner() const { return m_owner; } CClientRef& GetSource() { return m_sourceValue; } void SetContents(CKnownFile* owner, const CClientRef& source, SourceItemType type) { m_owner = owner; m_sourceValue = source; m_type = type; } void SetType(SourceItemType type) { m_type = type; } uint32 dwUpdated; wxBitmap* status; private: CKnownFile* m_owner; CClientRef m_sourceValue; SourceItemType m_type; }; #define m_ImageList theApp->amuledlg->m_imagelist BEGIN_EVENT_TABLE(CGenericClientListCtrl, CMuleListCtrl) EVT_LIST_ITEM_ACTIVATED(wxID_ANY, CGenericClientListCtrl::OnItemActivated) EVT_LIST_ITEM_RIGHT_CLICK(wxID_ANY, CGenericClientListCtrl::OnMouseRightClick) EVT_LIST_ITEM_MIDDLE_CLICK(wxID_ANY, CGenericClientListCtrl::OnMouseMiddleClick) EVT_CHAR( CGenericClientListCtrl::OnKeyPressed ) EVT_MENU( MP_CHANGE2FILE, CGenericClientListCtrl::OnSwapSource ) EVT_MENU( MP_SHOWLIST, CGenericClientListCtrl::OnViewFiles ) EVT_MENU( MP_ADDFRIEND, CGenericClientListCtrl::OnAddFriend ) EVT_MENU( MP_FRIENDSLOT, CGenericClientListCtrl::OnSetFriendslot ) EVT_MENU( MP_SENDMESSAGE, CGenericClientListCtrl::OnSendMessage ) EVT_MENU( MP_DETAIL, CGenericClientListCtrl::OnViewClientInfo ) END_EVENT_TABLE() //! This listtype is used when gathering the selected items. typedef std::list ItemList; CGenericClientListCtrl::CGenericClientListCtrl( const wxString& tablename, wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) : CMuleListCtrl( parent, winid, pos, size, style | wxLC_OWNERDRAW | wxLC_VRULES | wxLC_HRULES, validator, name ), m_columndata(0, NULL) { // Setting the sorter function must be done in the derived class, to use the translation function correctly. // SetSortFunc( SortProc ); // Set the table-name (for loading and saving preferences). SetTableName( tablename ); m_menu = NULL; m_showing = false; m_hilightBrush = CMuleColour(wxSYS_COLOUR_HIGHLIGHT).Blend(125).GetBrush(); m_hilightUnfocusBrush = CMuleColour(wxSYS_COLOUR_BTNSHADOW).Blend(125).GetBrush(); m_clientcount = 0; } wxString CGenericClientListCtrl::TranslateCIDToName(GenericColumnEnum cid) { wxString name; switch (cid) { case ColumnUserName: name = wxT("N"); break; case ColumnUserDownloaded: name = wxT("D"); break; case ColumnUserUploaded: name = wxT("U"); break; case ColumnUserSpeedDown: name = wxT("S"); break; case ColumnUserSpeedUp: name = wxT("s"); break; case ColumnUserProgress: name = wxT("P"); break; case ColumnUserAvailable: name = wxT("A"); break; case ColumnUserVersion: name = wxT("V"); break; case ColumnUserQueueRankLocal: name = wxT("Q"); break; case ColumnUserQueueRankRemote: name = wxT("q"); break; case ColumnUserOrigin: name = wxT("O"); break; case ColumnUserFileNameDownload: name = wxT("F"); break; case ColumnUserFileNameUpload: name = wxT("f"); break; case ColumnUserFileNameDownloadRemote: name = wxT("R"); break; case ColumnUserSharedFiles: name = wxT("m"); break; case ColumnInvalid: default: wxFAIL; break; } return name; } void CGenericClientListCtrl::InitColumnData() { if (!m_columndata.n_columns) { throw wxString(wxT("CRITICAL: Initialization of the column data lacks subclass information")); } for (int i = 0; i < m_columndata.n_columns; ++i) { InsertColumn( i, wxGetTranslation(m_columndata.columns[i].title), wxLIST_FORMAT_LEFT, m_columndata.columns[i].width, TranslateCIDToName(m_columndata.columns[i].cid)); } LoadSettings(); } CGenericClientListCtrl::~CGenericClientListCtrl() { while ( !m_ListItems.empty() ) { delete m_ListItems.begin()->second; m_ListItems.erase( m_ListItems.begin() ); } } void CGenericClientListCtrl::RawAddSource(CKnownFile* owner, CClientRef source, SourceItemType type) { ClientCtrlItem_Struct* newitem = new ClientCtrlItem_Struct; newitem->SetContents(owner, source, type); m_ListItems.insert( ListItemsPair(source.ECID(), newitem) ); long item = InsertItem( GetItemCount(), wxEmptyString ); SetItemPtrData( item, reinterpret_cast(newitem) ); SetItemBackgroundColour( item, GetBackgroundColour() ); } void CGenericClientListCtrl::AddSource(CKnownFile* owner, const CClientRef& source, SourceItemType type) { wxCHECK_RET(owner, wxT("NULL owner in CGenericClientListCtrl::AddSource")); wxCHECK_RET(source.IsLinked(), wxT("Unlinked source in CGenericClientListCtrl::AddSource")); // Update the other instances of this source bool bFound = false; ListIteratorPair rangeIt = m_ListItems.equal_range(source.ECID()); for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ++it ) { ClientCtrlItem_Struct* cur_item = it->second; // Check if this source has been already added to this file => to be sure if ( cur_item->GetOwner() == owner ) { // Update this instance with its new setting if ((type == A4AF_SOURCE) && cur_item->GetSource().GetRequestFile() && std::binary_search(m_knownfiles.begin(), m_knownfiles.end(), cur_item->GetSource().GetRequestFile())) { cur_item->SetContents(owner, source, AVAILABLE_SOURCE); } else { cur_item->SetContents(owner, source, type); } cur_item->dwUpdated = 0; bFound = true; } else if ( type == AVAILABLE_SOURCE ) { // The state 'Available' is exclusive cur_item->SetContents(cur_item->GetOwner(), source, A4AF_SOURCE); cur_item->dwUpdated = 0; } } if ( bFound ) { return; } if ( std::binary_search(m_knownfiles.begin(), m_knownfiles.end(), owner) ) { RawAddSource(owner, source, type); ShowSourcesCount( 1 ); } } void CGenericClientListCtrl::RawRemoveSource( ListItems::iterator& it) { ClientCtrlItem_Struct* item = it->second; long index = FindItem( -1, reinterpret_cast(item) ); if ( index > -1 ) { DeleteItem( index ); } delete item; // Remove it from the m_ListItems m_ListItems.erase( it ); } void CGenericClientListCtrl::RemoveSource(uint32 source, const CKnownFile* owner) { // A NULL owner means remove it no matter what. wxCHECK_RET(source, wxT("NULL source in CGenericClientListCtrl::RemoveSource")); // Retrieve all entries matching the source ListIteratorPair rangeIt = m_ListItems.equal_range(source); int removedItems = 0; for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; /* no ++, it happens later */) { ListItems::iterator tmp = it++; if ( owner == NULL || owner == tmp->second->GetOwner() ) { RawRemoveSource(tmp); ++removedItems; } } ShowSourcesCount((-1) * removedItems); } void CGenericClientListCtrl::UpdateItem(uint32 toupdate, SourceItemType type) { // Retrieve all entries matching the source ListIteratorPair rangeIt = m_ListItems.equal_range( toupdate ); if ( rangeIt.first != rangeIt.second ) { // Visible lines, default to all because not all platforms // support the GetVisibleLines function long first = 0, last = GetItemCount(); #ifndef __WXMSW__ // Get visible lines if we need them GetVisibleLines( &first, &last ); #endif for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ++it ) { ClientCtrlItem_Struct* item = it->second; long index = FindItem( -1, reinterpret_cast(item) ); if ((type == A4AF_SOURCE) && item->GetSource().GetRequestFile() && std::binary_search(m_knownfiles.begin(), m_knownfiles.end(), item->GetSource().GetRequestFile())) { item->SetType(AVAILABLE_SOURCE); } else { item->SetType(type); } item->dwUpdated = 0; // Only update visible lines if ( index >= first && index <= last) { RefreshItem( index ); } } } } void CGenericClientListCtrl::ShowSources( const CKnownFileVector& files ) { Freeze(); // The stored vector is sorted, as is the received one, so we can use binary_search for (unsigned i = 0; i < m_knownfiles.size(); ++i) { // Files that are not in the new list must have show set to false. if (!std::binary_search(files.begin(), files.end(), m_knownfiles[i])) { SetShowSources(m_knownfiles[i], false); } } // This will call again SetShowSources in files that were in both vectors. Right now // that function is just a inline setter, so any way to prevent it would be wasteful, // but this must be reviewed if that fact changes. for (unsigned i = 0; i < files.size(); ++i) { SetShowSources(files[i], true); } // We must cleanup sources that are not in the received files. int itemDiff = 0; for (ListItems::iterator it = m_ListItems.begin(); it != m_ListItems.end(); /* no ++, it happens later */) { ListItems::iterator tmp = it++; ClientCtrlItem_Struct* item = tmp->second; if (!std::binary_search(files.begin(), files.end(), item->GetOwner())) { // Remove it from the m_ListItems RawRemoveSource(tmp); --itemDiff; } } for (unsigned i = 0; i < files.size(); ++i) { // Only those that weren't showing already if (!std::binary_search(m_knownfiles.begin(), m_knownfiles.end(), files[i])) { CKnownFile* file = files[i]; wxASSERT_MSG(file, wxT("NULL file in CGenericClientListCtrl::ShowSources")); if (file) { CKnownFile::SourceSet::const_iterator it; if (IsShowingDownloadSources()) { const CKnownFile::SourceSet& normSources = (dynamic_cast( file ))->GetSourceList(); const CKnownFile::SourceSet& a4afSources = (dynamic_cast( file ))->GetA4AFList(); // Adding normal sources for ( it = normSources.begin(); it != normSources.end(); ++it ) { switch (it->GetDownloadState()) { case DS_DOWNLOADING: case DS_ONQUEUE: RawAddSource( file, *it, AVAILABLE_SOURCE ); ++itemDiff; break; default: // Any other state RawAddSource( file, *it, UNAVAILABLE_SOURCE ); ++itemDiff; } } // Adding A4AF sources for ( it = a4afSources.begin(); it != a4afSources.end(); ++it ) { // Only add if the A4AF file is not in the shown list. if (!std::binary_search(files.begin(), files.end(), it->GetRequestFile())) { RawAddSource( file, *it, A4AF_SOURCE ); ++itemDiff; } } } else { // Known file const CKnownFile::SourceSet& sources = file->m_ClientUploadList; for ( it = sources.begin(); it != sources.end(); ++it ) { switch (it->GetUploadState()) { case US_UPLOADING: case US_ONUPLOADQUEUE: RawAddSource( file, *it, AVAILABLE_SOURCE ); ++itemDiff; break; default: // Any other state RawAddSource( file, *it, UNAVAILABLE_SOURCE ); ++itemDiff; } } } } } } m_knownfiles = files; ShowSourcesCount( itemDiff ); SortList(); Thaw(); } /** * Helper-function: This function is used to gather selected items. * * @param list A pointer to the list to gather items from. * @return A list containing the selected items of the choosen types. */ ItemList GetSelectedItems( CGenericClientListCtrl* list ) { ItemList results; long index = list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); while ( index > -1 ) { ClientCtrlItem_Struct* item = (ClientCtrlItem_Struct*)list->GetItemData( index ); results.push_back( item ); index = list->GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } return results; } void CGenericClientListCtrl::OnSwapSource( wxCommandEvent& WXUNUSED(event) ) { ItemList sources = ::GetSelectedItems( this ); for ( ItemList::iterator it = sources.begin(); it != sources.end(); ++it ) { CKnownFile * kf = (*it)->GetOwner(); if (!kf->IsPartFile()) { wxFAIL_MSG(wxT("File is not a partfile when swapping sources")); continue; } (*it)->GetSource().SwapToAnotherFile( true, false, false, dynamic_cast(kf)); } } void CGenericClientListCtrl::OnViewFiles( wxCommandEvent& WXUNUSED(event) ) { ItemList sources = ::GetSelectedItems( this ); if ( sources.size() == 1 ) { sources.front()->GetSource().RequestSharedFileList(); } } void CGenericClientListCtrl::OnAddFriend( wxCommandEvent& WXUNUSED(event) ) { ItemList sources = ::GetSelectedItems( this ); for ( ItemList::iterator it = sources.begin(); it != sources.end(); ++it ) { CClientRef &client = (*it)->GetSource(); if (client.IsFriend()) { theApp->friendlist->RemoveFriend(client.GetFriend()); } else { theApp->friendlist->AddFriend(client); } } } void CGenericClientListCtrl::OnSetFriendslot(wxCommandEvent& evt) { ItemList sources = ::GetSelectedItems( this ); ItemList::iterator it = sources.begin(); if (it != sources.end()) { CClientRef &client = (*it)->GetSource(); theApp->friendlist->SetFriendSlot(client.GetFriend(), evt.IsChecked()); it++; } if (it != sources.end()) { wxMessageBox(_("You are not allowed to set more than one friendslot.\n Only one slot was assigned."), _("Multiple selection"), wxOK | wxICON_ERROR, this); } } void CGenericClientListCtrl::OnSendMessage( wxCommandEvent& WXUNUSED(event) ) { ItemList sources = ::GetSelectedItems( this ); if ( sources.size() == 1 ) { CClientRef & source = (sources.front())->GetSource(); // These values are cached, since calling wxGetTextFromUser will // start an event-loop, in which the client may be deleted. wxString userName = source.GetUserName(); uint64 userID = GUI_ID(source.GetIP(), source.GetUserPort()); wxString message = ::wxGetTextFromUser(_("Send message to user"), _("Message to send:")); if ( !message.IsEmpty() ) { theApp->amuledlg->m_chatwnd->SendMessage(message, userName, userID); } } } void CGenericClientListCtrl::OnViewClientInfo( wxCommandEvent& WXUNUSED(event) ) { ItemList sources = ::GetSelectedItems( this ); if ( sources.size() == 1 ) { CClientDetailDialog( this, sources.front()->GetSource() ).ShowModal(); } } void CGenericClientListCtrl::OnItemActivated( wxListEvent& evt ) { CClientDetailDialog( this, ((ClientCtrlItem_Struct*)GetItemData( evt.GetIndex()))->GetSource() ).ShowModal(); } void CGenericClientListCtrl::OnMouseRightClick(wxListEvent& evt) { long index = CheckSelection(evt); if (index < 0) { return; } delete m_menu; m_menu = NULL; ClientCtrlItem_Struct* item = (ClientCtrlItem_Struct*)GetItemData( index ); CClientRef& client = item->GetSource(); m_menu = new wxMenu(wxT("Clients")); m_menu->Append(MP_DETAIL, _("Show &Details")); m_menu->Append(MP_ADDFRIEND, client.IsFriend() ? _("Remove from friends") : _("Add to Friends")); m_menu->AppendCheckItem(MP_FRIENDSLOT, _("Establish Friend Slot")); if (client.IsFriend()) { m_menu->Enable(MP_FRIENDSLOT, true); m_menu->Check(MP_FRIENDSLOT, client.GetFriendSlot()); } else { m_menu->Enable(MP_FRIENDSLOT, false); } m_menu->Append(MP_SHOWLIST, _("View Files")); m_menu->Append(MP_SENDMESSAGE, _("Send message")); m_menu->Append(MP_CHANGE2FILE, _("Swap to this file")); // Only enable the Swap option for A4AF sources m_menu->Enable(MP_CHANGE2FILE, (item->GetType() == A4AF_SOURCE)); // We need a valid IP if we are to message the client m_menu->Enable(MP_SENDMESSAGE, (client.GetIP() != 0)); m_menu->Enable(MP_SHOWLIST, !client.HasDisabledSharedFiles()); PopupMenu(m_menu, evt.GetPoint()); delete m_menu; m_menu = NULL; } void CGenericClientListCtrl::OnMouseMiddleClick(wxListEvent& evt) { // Check if clicked item is selected. If not, unselect all and select it. long index = CheckSelection(evt); if ( index < 0 ) { return; } CClientDetailDialog(this, ((ClientCtrlItem_Struct*)GetItemData( index ))->GetSource()).ShowModal(); } void CGenericClientListCtrl::OnKeyPressed( wxKeyEvent& event ) { // No actions right now. //switch (event.GetKeyCode()) { // default: event.Skip(); //} } void CGenericClientListCtrl::OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted) { // Don't do any drawing if there's nobody to see it. if ( !theApp->amuledlg->IsDialogVisible( GetParentDialog() ) ) { return; } ClientCtrlItem_Struct* content = (ClientCtrlItem_Struct *)GetItemData(item); // Define text-color and background // and the border of the drawn area if (highlighted) { CMuleColour colour; if (GetFocus()) { dc->SetBackground(m_hilightBrush); colour = m_hilightBrush.GetColour(); } else { dc->SetBackground(m_hilightUnfocusBrush); colour = m_hilightUnfocusBrush.GetColour(); } dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); dc->SetPen( colour.Blend(65).GetPen() ); } else { dc->SetBackground(*(wxTheBrushList->FindOrCreateBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX), wxSOLID))); dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); dc->SetPen(*wxTRANSPARENT_PEN); } dc->SetBrush( dc->GetBackground() ); dc->DrawRectangle( rectHL.x, rectHL.y, rectHL.width, rectHL.height ); dc->SetPen(*wxTRANSPARENT_PEN); // Various constant values we use const int iTextOffset = (( rect.GetHeight() - dc->GetCharHeight() ) / 2) + 1 /* Fixes rounding in the centering math, much easier than floor() */; const int iOffset = 2; wxASSERT(m_ImageList.GetImageCount() > 0); int imageListBitmapYOffset = 0; int imageListBitmapXSize = 0; if (m_ImageList.GetSize(0, imageListBitmapXSize, imageListBitmapYOffset)) { imageListBitmapXSize += 2; // Padding. imageListBitmapYOffset = ((rect.GetHeight() - imageListBitmapYOffset) / 2) + 1 /* Fixes rounding like above */; } else { wxFAIL; } wxRect cur_rec( iOffset, rect.y, 0, rect.height ); for (int i = 0; i < GetColumnCount(); ++i) { int columnwidth = GetColumnWidth(i); if (columnwidth > 2*iOffset) { // Make a copy of the current rectangle so we can apply specific tweaks wxRect target_rec = cur_rec; target_rec.width = columnwidth - 2*iOffset; GenericColumnEnum cid = m_columndata.columns[i].cid; // Draw the item DrawClientItem(dc, cid, target_rec, content, iTextOffset, imageListBitmapYOffset, imageListBitmapXSize); } // Increment to the next column cur_rec.x += columnwidth; } } void CGenericClientListCtrl::DrawClientItem(wxDC* dc, int nColumn, const wxRect& rect, ClientCtrlItem_Struct* item, int iTextOffset, int iBitmapOffset, int iBitmapXSize ) const { wxDCClipper clipper( *dc, rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); wxString buffer; const CClientRef& client = item->GetSource(); switch (nColumn) { // Client name + various icons case ColumnUserName: { // Point will get shifted per drawing. wxPoint point( rect.GetX(), rect.GetY() ); uint8 image = Client_Grey_Smiley; if (item->GetType() != A4AF_SOURCE) { switch (client.GetDownloadState()) { case DS_CONNECTING: case DS_CONNECTED: case DS_WAITCALLBACK: case DS_TOOMANYCONNS: image = Client_Red_Smiley; break; case DS_ONQUEUE: if (client.IsRemoteQueueFull()) { image = Client_Grey_Smiley; } else { image = Client_Yellow_Smiley; } break; case DS_DOWNLOADING: case DS_REQHASHSET: image = Client_Green_Smiley; break; case DS_NONEEDEDPARTS: case DS_LOWTOLOWIP: image = Client_Grey_Smiley; // Redundant break; default: // DS_NONE i.e. image = Client_White_Smiley; } } else { // Default (Client_Grey_Smiley) } m_ImageList.Draw(image, *dc, point.x, point.y + iBitmapOffset, wxIMAGELIST_DRAW_TRANSPARENT); // Next point.x += iBitmapXSize; uint8 clientImage = Client_Unknown; if ( client.IsFriend() ) { clientImage = Client_Friend_Smiley; } else { switch ( client.GetClientSoft() ) { case SO_AMULE: clientImage = Client_aMule_Smiley; break; case SO_MLDONKEY: case SO_NEW_MLDONKEY: case SO_NEW2_MLDONKEY: clientImage = Client_mlDonkey_Smiley; break; case SO_EDONKEY: case SO_EDONKEYHYBRID: clientImage = Client_eDonkeyHybrid_Smiley; break; case SO_EMULE: clientImage = Client_eMule_Smiley; break; case SO_LPHANT: clientImage = Client_lphant_Smiley; break; case SO_SHAREAZA: case SO_NEW_SHAREAZA: case SO_NEW2_SHAREAZA: clientImage = Client_Shareaza_Smiley; break; case SO_LXMULE: clientImage = Client_xMule_Smiley; break; default: // cDonkey, Compatible, Unknown // No icon for those yet. // Using the eMule one + '?' // Which is a faillback to the default (Client_Unknown) break; } } int realY = point.y + iBitmapOffset; m_ImageList.Draw(clientImage, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT); if (client.GetScoreRatio() > 1) { // Has credits, draw the gold star m_ImageList.Draw(Client_CreditsYellow_Smiley, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT ); } else if ( !client.ExtProtocolAvailable() ) { // No Ext protocol -> Draw the '-' m_ImageList.Draw(Client_ExtendedProtocol_Smiley, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT); } if (client.IsIdentified()) { // the 'v' m_ImageList.Draw(Client_SecIdent_Smiley, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT); } else if (client.IsBadGuy()) { // the 'X' m_ImageList.Draw(Client_BadGuy_Smiley, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT); } if (client.GetObfuscationStatus() == OBST_ENABLED) { // the "¿" except it's a key m_ImageList.Draw(Client_Encryption_Smiley, *dc, point.x, realY, wxIMAGELIST_DRAW_TRANSPARENT); } // Next point.x += iBitmapXSize; wxString userName; #ifdef ENABLE_IP2COUNTRY if (theApp->amuledlg->m_IP2Country->IsEnabled() && thePrefs::IsGeoIPEnabled()) { // Draw the flag. Size can't be precached. const CountryData& countrydata = theApp->amuledlg->m_IP2Country->GetCountryData(client.GetFullIP()); realY = point.y + (rect.GetHeight() - countrydata.Flag.GetHeight())/2 + 1 /* floor() */; dc->DrawBitmap(countrydata.Flag, point.x, realY, true); userName << countrydata.Name; userName << wxT(" - "); point.x += countrydata.Flag.GetWidth() + 2 /*Padding*/; } #endif // ENABLE_IP2COUNTRY if (client.GetUserName().IsEmpty()) { userName << wxT("?"); } else { userName << client.GetUserName(); } dc->DrawText(userName, point.x, rect.GetY() + iTextOffset); } break; case ColumnUserDownloaded: if (item->GetType() != A4AF_SOURCE && client.GetTransferredDown()) { buffer = CastItoXBytes(client.GetTransferredDown()); dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); } break; case ColumnUserUploaded: if (item->GetType() != A4AF_SOURCE && client.GetTransferredUp()) { buffer = CastItoXBytes(client.GetTransferredUp()); dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); } break; case ColumnUserSpeedDown: if (item->GetType() != A4AF_SOURCE && client.GetKBpsDown() > 0.001) { buffer = CFormat(_("%.1f kB/s")) % client.GetKBpsDown(); dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); } break; case ColumnUserSpeedUp: // Datarate is in bytes. if (item->GetType() != A4AF_SOURCE && client.GetUploadDatarate() > 1024) { buffer = CFormat(_("%.1f kB/s")) % (client.GetUploadDatarate() / 1024.0); dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); } break; case ColumnUserProgress: if ( thePrefs::ShowProgBar() ) { int iWidth = rect.GetWidth() - 2; int iHeight = rect.GetHeight() - 2; // don't draw Text beyond the bar dc->SetClippingRegion(rect.GetX(), rect.GetY() + 1, iWidth, iHeight); if ( item->GetType() != A4AF_SOURCE ) { uint32 dwTicks = GetTickCount(); wxMemoryDC cdcStatus; if ( item->dwUpdated < dwTicks || !item->status || iWidth != item->status->GetWidth() ) { if (item->status == NULL) { item->status = new wxBitmap(iWidth, iHeight); } else if ( item->status->GetWidth() != iWidth ) { // Only recreate if size has changed item->status->Create(iWidth, iHeight); } cdcStatus.SelectObject(*(item->status)); if ( thePrefs::UseFlatBar() ) { DrawSourceStatusBar( client, &cdcStatus, wxRect(0, 0, iWidth, iHeight), true); } else { DrawSourceStatusBar( client, &cdcStatus, wxRect(1, 1, iWidth - 2, iHeight - 2), false); // Draw black border cdcStatus.SetPen( *wxBLACK_PEN ); cdcStatus.SetBrush( *wxTRANSPARENT_BRUSH ); cdcStatus.DrawRectangle( 0, 0, iWidth, iHeight ); } // Plus ten seconds item->dwUpdated = dwTicks + 10000; } else { cdcStatus.SelectObject(*(item->status)); } dc->Blit(rect.GetX(), rect.GetY() + 1, iWidth, iHeight, &cdcStatus, 0, 0); } else { wxString a4af; CPartFile* p = client.GetRequestFile(); if (p) { a4af = p->GetFileName().GetPrintable(); } else { a4af = wxT("?"); } buffer = CFormat(wxT("%s: %s")) % _("A4AF") % a4af; int midx = (2*rect.GetX() + rect.GetWidth()) >> 1; int midy = (2*rect.GetY() + rect.GetHeight()) >> 1; wxCoord txtwidth, txtheight; dc->GetTextExtent(buffer, &txtwidth, &txtheight); dc->SetTextForeground(*wxBLACK); dc->DrawText(buffer, wxMax(rect.GetX() + 2, midx - (txtwidth >> 1)), midy - (txtheight >> 1)); // Draw black border dc->SetPen( *wxBLACK_PEN ); dc->SetBrush( *wxTRANSPARENT_BRUSH ); dc->DrawRectangle( rect.GetX(), rect.GetY() + 1, iWidth, iHeight ); } } break; case ColumnUserAvailable: { if ( client.GetUpPartCount() ) { DrawStatusBar( client, dc, rect ); } break; } case ColumnUserVersion: { dc->DrawText(client.GetClientVerString(), rect.GetX(), rect.GetY() + iTextOffset); break; } case ColumnUserQueueRankRemote: { sint16 qrDiff = 0; wxColour savedColour = dc->GetTextForeground(); // We only show the queue rank for sources actually queued for that file if ( item->GetType() != A4AF_SOURCE && client.GetDownloadState() == DS_ONQUEUE ) { if (client.IsRemoteQueueFull()) { buffer = _("Queue Full"); } else { uint16 rank = client.GetRemoteQueueRank(); if (rank) { qrDiff = rank - client.GetOldRemoteQueueRank(); if (qrDiff == rank) { qrDiff = 0; } if ( qrDiff < 0 ) { dc->SetTextForeground(*wxBLUE); } if ( qrDiff > 0 ) { dc->SetTextForeground(*wxRED); } buffer = CFormat(_("On Queue: %u (%i)")) % rank % qrDiff; } else { buffer = _("On Queue"); } } } else { if (item->GetType() != A4AF_SOURCE) { buffer = DownloadStateToStr( client.GetDownloadState(), client.IsRemoteQueueFull() ); } else { buffer = _("Asked for another file"); if ( client.GetRequestFile() && client.GetRequestFile()->GetFileName().IsOk()) { buffer += CFormat(wxT(" (%s)")) % client.GetRequestFile()->GetFileName(); } } } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); if (qrDiff) { dc->SetTextForeground(savedColour); } break; } case ColumnUserQueueRankLocal: if (item->GetType() != A4AF_SOURCE) { if (client.GetUploadState() == US_ONUPLOADQUEUE ) { uint16 nRank = client.GetUploadQueueWaitingPosition(); if (nRank == 0) { buffer = _("Waiting for upload slot"); } else { buffer = CFormat(_("On Queue: %u")) % nRank; } } else if (client.GetUploadState() == US_UPLOADING) { buffer = _("Uploading"); } else { buffer = _("None"); } } else { buffer = _("Asked for another file"); } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); break; // Source comes from? case ColumnUserOrigin: { buffer = wxGetTranslation(OriginToText(client.GetSourceFrom())); dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); break; } // Local file name to identify on multi select case ColumnUserFileNameDownload: { const CPartFile * pf = client.GetRequestFile(); if (pf) { buffer = pf->GetFileName().GetPrintable(); } else { buffer = _("Unknown"); buffer = wxT("[") + buffer + wxT("]"); } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); break; } case ColumnUserFileNameUpload: { const CKnownFile * kf = client.GetUploadFile(); if (kf) { buffer = kf->GetFileName().GetPrintable(); } else { buffer = _("Unknown"); buffer = wxT("[") + buffer + wxT("]"); } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); break; } case ColumnUserFileNameDownloadRemote: { bool nameMissmatch = false; wxColour savedColour = dc->GetTextForeground(); if (client.GetClientFilename().IsEmpty() || item->GetType() == A4AF_SOURCE) { buffer = _("Unknown"); buffer = wxT("[") + buffer + wxT("]"); } else { buffer = client.GetClientFilename(); const CPartFile * pf = client.GetRequestFile(); if (pf && (pf->GetFileName().GetPrintable().CmpNoCase(buffer) != 0)) { nameMissmatch = true; dc->SetTextForeground(*wxRED); } } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); if (nameMissmatch) { dc->SetTextForeground(savedColour); } break; } case ColumnUserSharedFiles: { if(client.HasDisabledSharedFiles()) { buffer = _("No"); } else { buffer = _("Yes"); } dc->DrawText(buffer, rect.GetX(), rect.GetY() + iTextOffset); break; } } } int CGenericClientListCtrl::SortProc(wxUIntPtr param1, wxUIntPtr param2, long sortData) { ClientCtrlItem_Struct* item1 = (ClientCtrlItem_Struct*)param1; ClientCtrlItem_Struct* item2 = (ClientCtrlItem_Struct*)param2; int sortMod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; sortData &= CMuleListCtrl::COLUMN_MASK; int comp = 0; // Two sources, some different possibilites // Avilable sources first, if we have both an // available and an unavailable comp = ( item2->GetType() - item1->GetType() ); if (comp) { // unavailable and available. The order is fixed regardless of sort-order. return comp; } else { comp = Compare(item1->GetSource(), item2->GetSource(), sortData); } // We modify the result so that it matches with ascending or decending return sortMod * comp; } int CGenericClientListCtrl::Compare( const CClientRef& client1, const CClientRef& client2, long lParamSort) { switch (lParamSort) { // Sort by name case ColumnUserName: return CmpAny( client1.GetUserName(), client2.GetUserName() ); // Sort by transferred in the following fields case ColumnUserDownloaded: return CmpAny( client1.GetTransferredDown(), client2.GetTransferredDown() ); // Sort by transferred in the following fields case ColumnUserUploaded: return CmpAny( client1.GetTransferredUp(), client2.GetTransferredUp() ); // Sort by speed case ColumnUserSpeedDown: return CmpAny( client1.GetKBpsDown(), client2.GetKBpsDown() ); // Sort by speed case ColumnUserSpeedUp: return CmpAny( client1.GetUploadDatarate(), client2.GetUploadDatarate() ); // Sort by parts offered case ColumnUserProgress: return CmpAny( client1.GetAvailablePartCount(), client2.GetAvailablePartCount() ); // Sort by client version case ColumnUserVersion: { int cmp = client1.GetSoftStr().Cmp(client2.GetSoftStr()); if (cmp == 0) { cmp = CmpAny(client1.GetVersion(), client2.GetVersion()); } if (cmp == 0) { cmp = client1.GetClientModString().Cmp(client2.GetClientModString()); } return cmp; } // Sort by Queue-Rank case ColumnUserQueueRankRemote: { // This will sort by download state: Downloading, OnQueue, Connecting ... // However, Asked For Another will always be placed last, due to // sorting in SortProc if ( client1.GetDownloadState() != client2.GetDownloadState() ) { return client1.GetDownloadState() - client2.GetDownloadState(); } // Placing items on queue before items on full queues if ( client1.IsRemoteQueueFull() ) { if ( client2.IsRemoteQueueFull() ) { return 0; } else { return 1; } } else if ( client2.IsRemoteQueueFull() ) { return -1; } else { if ( client1.GetRemoteQueueRank() ) { if ( client2.GetRemoteQueueRank() ) { return CmpAny( client1.GetRemoteQueueRank(), client2.GetRemoteQueueRank() ); } else { return -1; } } else { if ( client2.GetRemoteQueueRank() ) { return 1; } else { return 0; } } } } // Sort by Queue-Rank case ColumnUserQueueRankLocal: { // This will sort by download state: Downloading, OnQueue, Connecting ... // However, Asked For Another will always be placed last, due to // sorting in SortProc if ( client1.GetUploadState() != client2.GetUploadState() ) { return client1.GetUploadState() - client2.GetUploadState(); } uint16 rank1 = client1.GetUploadQueueWaitingPosition(); uint16 rank2 = client2.GetUploadQueueWaitingPosition(); // Placing items on queue before items on full queues if ( !rank1 ) { if ( !rank2 ) { return 0; } else { return 1; } } else if ( !rank2 ) { return -1; } else { if ( rank1 ) { if ( rank2 ) { return CmpAny( rank1, rank2 ); } else { return -1; } } else { if ( rank2 ) { return 1; } else { return 0; } } } } // Source of source ;) case ColumnUserOrigin: return CmpAny(client1.GetSourceFrom(), client2.GetSourceFrom()); // Sort by local filename (download) case ColumnUserFileNameDownload: { wxString buffer1, buffer2; const CPartFile * pf1 = client1.GetRequestFile(); if (pf1) { buffer1 = pf1->GetFileName().GetPrintable(); } const CPartFile * pf2 = client2.GetRequestFile(); if (pf2) { buffer2 = pf2->GetFileName().GetPrintable(); } return CmpAny(buffer1, buffer2); } // Sort by local filename (upload) case ColumnUserFileNameUpload: { wxString buffer1, buffer2; const CKnownFile * kf1 = client1.GetUploadFile(); if (kf1) { buffer1 = kf1->GetFileName().GetPrintable(); } const CKnownFile * kf2 = client2.GetUploadFile(); if (kf2) { buffer2 = kf2->GetFileName().GetPrintable(); } return CmpAny(buffer1, buffer2); } case ColumnUserFileNameDownloadRemote: { return CmpAny(client1.GetClientFilename(), client2.GetClientFilename()); } case ColumnUserSharedFiles: { return CmpAny(client1.HasDisabledSharedFiles(), client2.HasDisabledSharedFiles()); } default: return 0; } } void CGenericClientListCtrl::ShowSourcesCount( int diff ) { m_clientcount += diff; wxStaticText* label = CastByID( ID_CLIENTCOUNT, GetParent(), wxStaticText ); if (label) { label->SetLabel(CFormat(wxT("%i")) % m_clientcount); label->GetParent()->Layout(); } } static const CMuleColour crBoth(0, 192, 0); static const CMuleColour crFlatBoth(0, 150, 0); static const CMuleColour crNeither(240, 240, 240); static const CMuleColour crFlatNeither(224, 224, 224); static const CMuleColour crClientOnly(104, 104, 104); static const CMuleColour crFlatClientOnly(0, 0, 0); static const CMuleColour crPending(255, 208, 0); static const CMuleColour crNextPending(255, 255, 100); void CGenericClientListCtrl::DrawSourceStatusBar( const CClientRef& source, wxDC* dc, const wxRect& rect, bool bFlat) const { static CBarShader s_StatusBar(16); CPartFile* reqfile = source.GetRequestFile(); s_StatusBar.SetHeight(rect.height); s_StatusBar.SetWidth(rect.width); s_StatusBar.Set3dDepth( thePrefs::Get3DDepth() ); const BitVector& partStatus = source.GetPartStatus(); if (reqfile && reqfile->GetPartCount() == partStatus.size()) { s_StatusBar.SetFileSize(reqfile->GetFileSize()); uint16 lastDownloadingPart = source.GetDownloadState() == DS_DOWNLOADING ? source.GetLastDownloadingPart() : 0xffff; uint16 nextRequestedPart = source.GetNextRequestedPart(); for ( uint16 i = 0; i < partStatus.size(); i++ ) { uint64 uStart = PARTSIZE * i; uint64 uEnd = uStart + reqfile->GetPartSize(i) - 1; CMuleColour colour; if (!partStatus.get(i)) { // client does not have this part // light grey colour = bFlat ? crFlatNeither : crNeither; } else if ( reqfile->IsComplete(i)) { // completed part // green colour = bFlat ? crFlatBoth : crBoth; } else if (lastDownloadingPart == i) { // downloading part // yellow colour = crPending; } else if (nextRequestedPart == i) { // requested part // light yellow colour = crNextPending; } else { // client has this part, we need it // black colour = bFlat ? crFlatClientOnly : crClientOnly; } if ( source.GetRequestFile()->IsStopped() ) { colour.Blend(50); } s_StatusBar.FillRange(uStart, uEnd, colour); } } else { s_StatusBar.SetFileSize(1); s_StatusBar.FillRange(0, 1, bFlat ? crFlatNeither : crNeither); } s_StatusBar.Draw(dc, rect.x, rect.y, bFlat); } static const CMuleColour crUnavailable(240, 240, 240); static const CMuleColour crFlatUnavailable(224, 224, 224); static const CMuleColour crAvailable(104, 104, 104); static const CMuleColour crFlatAvailable(0, 0, 0); void CGenericClientListCtrl::DrawStatusBar( const CClientRef& client, wxDC* dc, const wxRect& rect1 ) const { wxRect rect = rect1; rect.y += 1; rect.height -= 2; wxPen old_pen = dc->GetPen(); wxBrush old_brush = dc->GetBrush(); bool bFlat = thePrefs::UseFlatBar(); wxRect barRect = rect; if (!bFlat) { // round bar has a black border, the bar itself is 1 pixel less on each border barRect.x ++; barRect.y ++; barRect.height -= 2; barRect.width -= 2; } static CBarShader s_StatusBar(16); uint32 partCount = client.GetUpPartCount(); // Seems the partfile in the client object is not necessarily valid when bar is drawn for the first time. // Keep it simple and make all parts same size. s_StatusBar.SetFileSize(partCount * PARTSIZE); s_StatusBar.SetHeight(barRect.height); s_StatusBar.SetWidth(barRect.width); s_StatusBar.Set3dDepth( thePrefs::Get3DDepth() ); uint64 uEnd = 0; for ( uint64 i = 0; i < partCount; i++ ) { uint64 uStart = PARTSIZE * i; uEnd = uStart + PARTSIZE - 1; s_StatusBar.FillRange(uStart, uEnd, client.IsUpPartAvailable(i) ? (bFlat ? crFlatAvailable : crAvailable) : (bFlat ? crFlatUnavailable : crUnavailable)); } // fill the rest (if partStatus is empty) s_StatusBar.FillRange(uEnd + 1, partCount * PARTSIZE - 1, bFlat ? crFlatUnavailable : crUnavailable); s_StatusBar.Draw(dc, barRect.x, barRect.y, bFlat); if (!bFlat) { // Draw black border dc->SetPen( *wxBLACK_PEN ); dc->SetBrush( *wxTRANSPARENT_BRUSH ); dc->DrawRectangle(rect); } dc->SetPen( old_pen ); dc->SetBrush( old_brush ); } // File_checked_for_headers aMule-2.3.1/src/MuleThread.h0000644000175000017470000000375411575347521014501 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef MULETHREAD_H #define MULETHREAD_H #include class CMuleThread : public wxThread { public: //! @see wxThread::wxThread CMuleThread(wxThreadKind kind = wxTHREAD_DETACHED) : wxThread(kind), m_stop(false) {} /** * Stops the thread. * * For detached threads, this function is equivalent * to Delete, but is also useable for joinable threads, * where Delete should not be used, due to crashes * experienced in that case. In the case of joinable * threads, Wait is called rather than Delete. * * @see wxThread::Delete */ void Stop() { m_stop = true; if (IsDetached()) { Delete(); } else { Wait(); } } //! Returns true if Delete or Stop has been called. virtual bool TestDestroy() { // m_stop is checked last, because some functionality is // dependant upon wxThread::TestDestroy() being called, // for instance Pause(). return wxThread::TestDestroy() || m_stop; } private: //! Is set if Stop is called. bool m_stop; }; #endif aMule-2.3.1/src/muuli_wdr.h0000644000175000017470000003677411644001300014441 0ustar topiusers//------------------------------------------------------------------------------ // Header generated by wxDesigner from file: muuli.wdr // Do not modify this file, all changes will be lost! //------------------------------------------------------------------------------ #ifndef __WDR_muuli_H__ #define __WDR_muuli_H__ #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma interface "muuli_wdr.h" #endif // Include wxWidgets' headers #ifndef WX_PRECOMP #include #endif #include #include #include #include #include #include #include #include #include #include #include // Declare window functions extern wxSizer *s_dlgcnt; extern wxSizer *contentSizer; extern wxSizer *s_fed2klh; #define ID_BUTTON_FAST 10000 wxSizer *muleDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_SRV_SPLITTER 10001 wxSizer *serverListDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *s_searchsizer; #define IDC_SEARCHNAME 10002 #define ID_SEARCHTYPE 10003 #define IDC_EXTENDEDSEARCHCHECK 10004 #define IDC_FILTERCHECK 10005 extern wxSizer *s_extendedsizer; #define IDC_TypeSearch 10006 #define ID_AUTOCATASSIGN 10007 #define IDC_EDITSEARCHEXTENSION 10008 #define IDC_SPINSEARCHMIN 10009 #define IDC_SEARCHMINSIZE 10010 #define IDC_SPINSEARCHMAX 10011 #define IDC_SEARCHMAXSIZE 10012 #define IDC_SPINSEARCHAVAIBILITY 10013 extern wxSizer *s_filtersizer; #define ID_FILTER_TEXT 10014 #define ID_FILTER 10015 #define ID_FILTER_INVERT 10016 #define ID_FILTER_KNOWN 10017 #define IDC_STARTS 10018 #define IDC_SEARCHMORE 10019 #define IDC_CANCELS 10020 #define IDC_SDOWNLOAD 10021 #define IDC_SEARCH_RESET 10022 #define IDC_CLEAR_RESULTS 10023 #define ID_NOTEBOOK 10024 #define ID_SEARCHPROGRESS 10025 wxSizer *searchDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_BTNCLRCOMPL 10026 #define ID_CATEGORIES 10027 #define ID_DLOADLIST 10028 wxSizer *transferTopPane( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *s_clientlistHeader; #define ID_CLIENTTOGGLE 10029 #define ID_CLIENTCOUNT 10030 #define ID_CLIENTLIST 10031 wxSizer *transferBottomPane( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_MESSAGESPLATTER 10032 wxSizer *messagePage( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_FNAME 10033 #define IDC_METFILE 10034 #define IDC_FHASH 10035 #define IDC_FSIZE 10036 #define IDC_PFSTATUS 10037 #define IDC_LASTSEENCOMPL 10038 #define IDC_SOURCECOUNT 10039 #define IDC_SOURCECOUNT2 10040 #define IDC_PARTCOUNT 10041 #define IDC_PARTAVAILABLE 10042 #define IDC_DATARATE 10043 #define IDC_DLACTIVETIME 10044 #define IDC_TRANSFERRED 10045 #define IDC_COMPLSIZE 10046 #define IDC_PROCCOMPL 10047 #define IDC_FD_STATS1 10048 #define IDC_FD_STATS2 10049 #define IDC_FD_STATS3 10050 #define IDC_LISTCTRLFILENAMES 10051 #define IDC_TAKEOVER 10052 #define IDC_CMTBT 10053 #define IDC_BUTTONSTRIP 10054 #define IDC_FILENAME 10055 #define IDC_NEXTFILE 10056 #define IDC_PREVFILE 10057 #define IDC_APPLY 10058 #define IDC_APPLY_AND_CLOSE 10059 #define ID_CLOSEWNDFD 5100 wxSizer *fileDetails( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_CMT_TEXT 10060 #define IDC_FC_CLEAR 10061 #define IDC_RATELIST 10062 #define IDCOK 10063 #define IDCCANCEL 10064 wxSizer *commentDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_LST 10065 #define IDC_CMSTATUS 10066 #define IDCREF 10067 wxSizer *commentLstDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_ANIMATE 10068 #define ID_HTTPDOWNLOADPROGRESS 10069 #define IDC_DOWNLOADSIZE 10070 #define ID_HTTPCANCEL 5101 wxSizer *downloadDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_IPADDRESS 10071 #define ID_IPORT 10072 #define ID_USERNAME 10073 #define ID_USERHASH 10074 #define ID_ADDFRIEND 10075 #define ID_CLOSEDLG 10076 wxSizer *addFriendDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_SHARESSPLATTER 10077 wxSizer *sharedfilesDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_DLOADSCOPE 10078 #define IDC_C0 10079 #define IDC_C0_3 10080 #define IDC_C0_2 10081 #define ID_ULOADSCOPE 10082 #define IDC_C1 10083 #define IDC_C1_3 10084 #define IDC_C1_2 10085 #define ID_OTHERS 10086 #define IDC_S3 10087 #define IDC_S0 10088 #define ID_ACTIVEC 10089 #define IDC_S1 10090 wxSizer *statsDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_DNAME 10091 #define ID_DHASH 10092 #define ID_DSOFT 10093 #define ID_DVERSION 10094 #define ID_DIP 10095 #define ID_DID 10096 #define ID_DSIP 10097 #define ID_DSNAME 10098 #define IDT_OBFUSCATION 10099 #define IDT_KAD 10100 #define ID_DDOWNLOADING 10101 #define ID_DAVDR 10102 #define ID_DAVUR 10103 #define ID_DDOWN 10104 #define ID_DDUP 10105 #define ID_DDOWNTOTAL 10106 #define ID_DUPTOTAL 10107 #define ID_DRATIO 10108 #define IDC_CDIDENT 10109 #define ID_QUEUERANK 10110 #define ID_DSCORE 10111 #define ID_CLOSEWND 10112 wxSizer *clientDetails( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_NICK 10113 #define IDC_LANGUAGE 10114 #define IDC_NEWVERSION 10115 #define IDC_STARTMIN 10116 #define IDC_EXIT 10117 #define IDC_MACHIDEONCLOSE 10118 #define IDC_ENABLETRAYICON 10119 #define IDC_MINTRAY 10120 #define IDC_TOOLTIPDELAY 10121 #define IDC_BROWSERSELF 10122 #define IDC_SELBROWSER 10123 #define IDC_BROWSERTABS 10124 #define IDC_VIDEOPLAYER 10125 #define IDC_BROWSEV 10126 #define IDC_PREVIEW_NOTE 10127 wxSizer *PreferencesGeneralTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_MAXDOWN 10128 #define IDC_MAXUP 10129 #define IDC_SLOTALLOC 10130 #define IDC_PORT 10131 #define ID_TEXT_CLIENT_UDP_PORT 10132 #define IDC_UDPENABLE 10133 #define IDC_UDPPORT 10134 #define IDC_UPNP_ENABLED 10135 #define IDC_UPNPTCPPORTTEXT 10136 #define IDC_UPNPTCPPORT 10137 #define IDC_ADDRESS 10138 #define ID_TEXT 10139 #define IDC_MAXSOURCEPERFILE 10140 #define IDC_MAXCON 10141 #define IDC_NETWORKKAD 10142 #define IDC_NETWORKED2K 10143 #define IDC_AUTOCONNECT 10144 #define IDC_RECONN 10145 wxSizer *PreferencesConnectionTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_REMOVEDEAD 10146 #define IDC_SERVERRETRIES 10147 #define IDC_AUTOSERVER 10148 #define IDC_EDITADR 10149 #define IDC_UPDATESERVERCONNECT 10150 #define IDC_UPDATESERVERCLIENT 10151 #define IDC_SCORE 10152 #define IDC_SMARTIDCHECK 10153 #define IDC_SAFESERVERCONNECT 10154 #define IDC_AUTOCONNECTSTATICONLY 10155 #define IDC_MANUALSERVERHIGHPRIO 10156 wxSizer *PreferencesServerTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_ICH 10157 #define IDC_AICHTRUST 10158 #define IDC_ADDNEWFILESPAUSED 10159 #define IDC_DAP 10160 #define IDC_PREVIEWPRIO 10161 #define IDC_STARTNEXTFILE 10162 #define IDC_STARTNEXTFILE_SAME 10163 #define IDC_STARTNEXTFILE_ALPHA 10164 #define IDC_ALLOCFULLFILE 10165 #define IDC_CHECKDISKSPACE 10166 #define IDC_MINDISKSPACE 10167 #define IDC_SRCSEEDS 10168 #define IDC_UAP 10169 wxSizer *PreferencesFilesTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_INCFILES 10170 #define IDC_SELINCDIR 10171 #define IDC_TEMPFILES 10172 #define IDC_SELTEMPDIR 10173 #define IDC_SHARESELECTOR 10174 #define IDC_SHAREHIDDENFILES 10175 wxSizer *PreferencesDirectoriesTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_SLIDERINFO 10176 #define IDC_SLIDER 10177 #define IDC_SLIDERINFO3 10178 #define IDC_SLIDER3 10179 #define IDC_SLIDERINFO4 10180 #define IDC_SLIDER4 10181 #define IDC_DOWNLOAD_CAP 10182 #define IDC_UPLOAD_CAP 10183 #define IDC_COLORSELECTOR 10184 #define IDC_COLOR_BUTTON 10185 #define IDC_SLIDERINFO2 10186 #define IDC_SLIDER2 10187 #define IDC_CLIENTVERSIONS 10188 wxSizer *PreferencesStatisticsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_AMULE_TWEAKS_WARNING 10189 #define IDC_MAXCON5SEC 10190 #define IDC_FILEBUFFERSIZE_STATIC 10191 #define IDC_FILEBUFFERSIZE 10192 #define IDC_QUEUESIZE_STATIC 10193 #define IDC_QUEUESIZE 10194 #define IDC_SERVERKEEPALIVE_LABEL 10195 #define IDC_SERVERKEEPALIVE 10196 #define IDC_PREVENT_SLEEP 10197 wxSizer *PreferencesaMuleTweaksTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_SKIN 10198 #define IDC_FED2KLH 10199 #define IDC_EXTCATINFO 10200 #define IDC_SHOWVERSIONONTITLE 10201 #define IDC_SHOWRATEONTITLE 10202 #define IDC_RATESBEFORETITLE 10203 #define IDC_RATESAFTERTITLE 10204 #define IDC_SHOWOVERHEAD 10205 #define IDC_VERTTOOLBAR 10206 #define IDC_SHOW_COUNTRY_FLAGS 10207 #define IDC_PERCENT 10208 #define IDC_PROGBAR 10209 #define IDC_3DDEPTH 10210 #define IDC_AUTOSORT 10211 wxSizer *PreferencesGuiTweaksTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_EXT_CONN_ACCEPT 10212 #define IDC_EXT_CONN_IP 10213 #define IDC_EXT_CONN_TCP_PORT 10214 #define IDC_UPNP_EC_ENABLED 10215 #define IDC_EXT_CONN_PASSWD 10216 #define IDC_ENABLE_WEB 10217 #define IDC_WEBTEMPLATE 10218 #define IDC_WEB_PASSWD 10219 #define IDC_ENABLE_WEB_LOW 10220 #define IDC_WEB_PASSWD_LOW 10221 #define IDC_WEB_PORT 10222 #define IDC_UPNP_WEBSERVER_ENABLED 10223 #define IDC_WEBUPNPTCPPORTTEXT 10224 #define IDC_WEBUPNPTCPPORT 10225 #define IDC_WEB_REFRESH_TIMEOUT 10226 #define IDC_WEB_GZIP 10227 wxSizer *PreferencesRemoteControlsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *prefs_sizer; #define ID_PREFSLISTCTRL 10228 #define ID_PREFS_OK_TOP 10229 #define ID_PREFS_CANCEL_TOP 10230 wxSizer *preferencesDlgTop( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_TITLE 10231 #define IDC_COMMENT 10232 #define IDC_INCOMING 10233 #define IDC_BROWSE 10234 #define IDC_PRIOCOMBO 10235 #define ID_BOX_CATCOLOR 10236 #define IDC_CATCOLOR 10237 wxSizer *CategoriesEditWindow( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_DOWNLOADSSPLATTER 10238 wxSizer *transferDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_SERVERINFO 10239 #define ID_BTN_RESET_SERVER 10240 wxSizer *ServerInfoLog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_LOGVIEW 10241 #define ID_BTN_RESET 10242 wxSizer *aMuleLog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_UPDATELIST 10243 #define IDC_SERVERLISTURL 10244 #define IDC_SERVERNAME 10245 #define IDC_IPADDRESS 10246 #define IDC_SPORT 10247 #define ID_ADDTOLIST 10248 #define IDC_ED2KDISCONNECT 10249 #define ID_SERVERLIST 10250 wxSizer *serverListDlgUp( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_SRVLOG_NOTEBOOK 10251 wxSizer *serverListDlgDown( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_UPDATEKADLIST 10252 #define IDC_NODESLISTURL 10253 #define ID_KADSCOPE 10254 #define ID_NODE_IP1 10255 #define ID_NODE_IP2 10256 #define ID_NODE_IP3 10257 #define ID_NODE_IP4 10258 #define ID_NODE_PORT 10259 #define ID_NODECONNECT 10260 #define ID_KNOWNNODECONNECT 10261 #define ID_KADDISCONNECT 10262 wxSizer *KadDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_ED2KINFO 10263 wxSizer *ED2K_Info( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_SECIDENT 10264 #define IDC_SUPPORT_PO 10265 #define IDC_ENABLE_PO_OUTGOING 10266 #define IDC_ENFORCE_PO_INCOMING 10267 #define IDC_SEESHARES 10268 #define IDC_IPFCLIENTS 10269 #define IDC_IPFSERVERS 10270 #define IDC_IPFRELOAD 10271 #define IDC_IPFILTERURL 10272 #define IDC_IPFILTERUPDATE 10273 #define IDC_AUTOIPFILTER 10274 #define ID_IPFILTERLEVEL 10275 #define IDC_FILTERLAN 10276 #define IDC_PARANOID 10277 #define IDC_IPFILTERSYS 10278 wxSizer *PreferencesSecurityTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_ONLINESIG 10279 #define IDC_OSUPDATE 10280 #define IDC_OSDIR 10281 #define IDC_SELOSDIR 10282 wxSizer *PreferencesOnlineSigTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_MSGFILTER 10283 #define IDC_MSGFILTER_ALL 10284 #define IDC_MSGFILTER_NONFRIENDS 10285 #define IDC_MSGFILTER_NONSECURE 10286 #define IDC_MSGFILTER_WORD 10287 #define IDC_MSGWORD 10288 #define IDC_MSGLOG 10289 #define IDC_FILTERCOMMENTS 10290 #define IDC_COMMENTWORD 10291 wxSizer *PreferencesFilteringTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_PROXY_AUTO_SERVER_CONNECT_WITHOUT_PROXY 10292 #define ID_PROXY_ENABLE_PASSWORD 10293 #define ID_PROXY_USER 10294 #define ID_PROXY_PASSWORD 10295 #define ID_PROXY_ENABLE_PROXY 10296 #define ID_PROXY_TYPE 10297 #define ID_PROXY_NAME 10298 #define ID_PROXY_PORT 10299 wxSizer *PreferencesProxyTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_REMOTE_HOST 10300 #define ID_REMOTE_PORT 10301 #define ID_EC_LOGIN 10302 #define ID_EC_PASSWD 10303 #define ID_EC_SAVE 10304 wxSizer *CoreConnect( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_VERBOSEDEBUG 10305 #define ID_DEBUGCATS 10306 wxSizer *PreferencesDebug( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *IDC_CURJOB; #define IDC_CONV_PB_LABEL 10307 #define IDC_CONV_PROZENT 10308 #define IDC_CONV_PB_CURRENT 10309 #define IDC_JOBLIST 10310 #define IDC_ADDITEM 10311 #define IDC_RETRY 10312 #define IDC_CONVREMOVE 10313 wxSizer *convertDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_KADINFO 10314 wxSizer *Kad_Info( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *m_networknotebooksizer; #define ID_NETNOTEBOOK 10315 wxSizer *NetDialog( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *IDC_PREFS_EVENTS_PAGE; #define IDC_EVENTLIST 10316 wxSizer *PreferencesEventsTab( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); extern wxSizer *s_sharedfilespeerHeader; #define ID_SHAREDCLIENTTOGGLE 10317 #define IDC_SREQUESTED 10318 #define IDC_SACCEPTED 10319 #define IDC_STRANSFERRED 10320 #define ID_LINE 10321 #define ID_SHAREDCLIENTLIST 10322 wxSizer *sharedfilesBottomDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_SHOW_CLIENTS_MODE 10323 #define ID_BTNRELSHARED 10324 #define ID_SHFILELIST 10325 wxSizer *sharedfilesTopDlg( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define ID_FRIENDLIST 10326 wxSizer *messagePageFriends( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); #define IDC_CHATSELECTOR 10327 #define IDC_CMESSAGE 10328 #define IDC_CSEND 10329 #define IDC_CCLOSE 10330 wxSizer *messagePageMessages( wxWindow *parent, bool call_fit = TRUE, bool set_sizer = TRUE ); // Declare menubar functions // Declare toolbar functions #define ID_BUTTONCONNECT 10331 #define ID_BUTTONNETWORKS 10332 #define ID_BUTTONSEARCH 10333 #define ID_BUTTONDOWNLOADS 10334 #define ID_BUTTONSHARED 10335 #define ID_BUTTONMESSAGES 10336 #define ID_BUTTONSTATISTICS 10337 #define ID_BUTTONNEWPREFERENCES 10338 #define ID_BUTTONIMPORT 10339 #define ID_ABOUT 10340 void muleToolbar( wxToolBar *parent ); // Declare bitmap functions wxBitmap clientImages( size_t index ); wxBitmap dlStatusImages( size_t index ); wxBitmap connImages( size_t index ); wxBitmap moreImages( size_t index ); wxBitmap amuleSpecial( size_t index ); wxBitmap connButImg( size_t index ); wxBitmap amuleDlgImages( size_t index ); #endif // End of generated file aMule-2.3.1/src/AsyncDNS.cpp0000644000175000017470000000435611575347521014423 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "AsyncDNS.h" // Interface declaration #include "InternalEvents.h" // Needed for wxEVT_* #include "NetworkFunctions.h" // Needed for StringHosttoUint32 #include "Logger.h" CAsyncDNS::CAsyncDNS(const wxChar* ipName, DnsSolveType type, wxEvtHandler* handler, void* socket) : wxThread(wxTHREAD_DETACHED) { m_type = type; m_ipName = ipName; m_socket = socket; m_handler = handler; } wxThread::ExitCode CAsyncDNS::Entry() { uint32 result = StringHosttoUint32(m_ipName); uint32 event_id = 0; void* event_data = NULL; switch (m_type) { case DNS_UDP: event_id = wxEVT_CORE_UDP_DNS_DONE; event_data = m_socket; break; case DNS_SOURCE: event_id = wxEVT_CORE_SOURCE_DNS_DONE; event_data = NULL; break; case DNS_SERVER_CONNECT: event_id = wxEVT_CORE_SERVER_DNS_DONE; event_data = m_socket; break; default: AddLogLineN(wxT("WRONG TYPE ID ON ASYNC DNS SOLVING!!!")); } if (event_id) { CMuleInternalEvent evt(event_id); evt.SetExtraLong(result); evt.SetClientData(event_data); wxPostEvent(m_handler,evt); } return NULL; } // File_checked_for_headers aMule-2.3.1/src/OScopeCtrl.h0000644000175000017470000000745511575347521014466 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef OSCOPECTRL_H #define OSCOPECTRL_H #ifndef NULL #define NULL 0 #endif #include #include // Needed for wxControl #include // Needed for wxTimer #include #include #include #include "Constants.h" // Needed for StatsGraphType class wxMemoryDC; ///////////////////////////////////////////////////////////////////////////// // COScopeCtrl window class COScopeCtrl : public wxControl { friend class CStatisticsDlg; public: COScopeCtrl(int NTrends, int nDecimals, StatsGraphType type, wxWindow* parent = NULL); ~COScopeCtrl(); void SetRange(float dLower, float dUpper, unsigned iTrend = 0); void SetRanges(float dLower, float dUpper); void SetYUnits(const wxString& string, const wxString& YMin = wxEmptyString, const wxString& YMax = wxEmptyString); void SetBackgroundColor(const wxColour& color); void SetGridColor(const wxColour& color); void SetPlotColor(const wxColour& color, unsigned iTrend = 0); float GetUpperLimit() { return pdsTrends[0].fUpperLimit; } void Reset(double sNewPeriod); void Stop(); void RecreateGraph(bool bRefresh=true); void RecreateGrid(); void AppendPoints(double sTimestamp, const std::vector &apf); void DelayPoints() { nDelayedPoints++; } StatsGraphType graph_type; public: unsigned nTrends; unsigned nXGrids; unsigned nYGrids; unsigned nShiftPixels; // amount to shift with each new point unsigned nYDecimals; wxString strXUnits; wxString strYUnits, strYMin, strYMax; wxColour m_bgColour; wxColour m_gridColour; typedef struct PlotDataStruct { wxColour crPlot; // data plot color wxPen penPlot; unsigned yPrev; float fPrev; float fLowerLimit; // lower bounds float fUpperLimit; // upper bounds float fVertScale; } PlotData_t ; protected: DECLARE_EVENT_TABLE() PlotData_t *pdsTrends; wxRect m_rectClient; wxRect m_rectPlot; wxBrush brushBack; wxBitmap m_bmapGrid; wxBitmap m_bmapPlot; void InvalidateGraph() { InvalidateCtrl(true, false); } void InvalidateGrid() { InvalidateCtrl(false, true); } private: bool bRecreateGrid, bRecreateGraph, bRecreateAll, bStopped; int nDelayedPoints; double sLastTimestamp; double sLastPeriod; wxTimer timerRedraw; bool m_onPaint; void OnTimer(wxTimerEvent& evt); void OnPaint(wxPaintEvent& evt); void OnSize(wxSizeEvent& evt); void ShiftGraph(unsigned cntPoints); void PlotHistory(unsigned cntPoints, bool bShiftGraph, bool bRefresh); void DrawPoints(const std::vector &apf, unsigned cntPoints); unsigned GetPlotY(float fPlot, PlotData_t* ppds); void InvalidateCtrl(bool bInvalidateGraph = true, bool bInvalidateGrid = true); }; #endif // OSCOPECTRL_H // File_checked_for_headers aMule-2.3.1/src/StatTree.h0000644000175000017470000006231711575347521014202 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2005-2011 Dévai Tamás ( gonosztopi@amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef STATTREE_H #define STATTREE_H /** * @file StatTree.h * * Interface to stat tree nodes. * * This file defines various classes representing * statistics tree nodes. */ #ifndef CLIENT_GUI # define VIRTUAL virtual #else # define VIRTUAL #endif #include // Needed for std::list #include // Needed for wxString #include // Needed for wxMutex #include "Types.h" #ifndef CLIENT_GUI #include // Needed for wxDateTime #include "GetTickCount.h" // Needed for GetTickCount64() /** * Stat tree flags */ enum EStatTreeFlags { stNone = 0, ///< Nothing. Really. stSortChildren = 1, ///< Childrens are sorted descending by their ID. stShowPercent = 2, /*!< Shows percentage compared to parent. * Counters only, whose parent is also counter! (khmm...) */ stHideIfZero = 4, ///< Hides item (and children) if value is zero. stSortByValue = 8, /*!< Together with stSortChildren, sorts children by their value. * WARNING! This assumes that value-sorted children are * counters! * Sort-by-value works only on children with ID between 0x00000100-0x7fffffff. * @note CStatTreeItemBase::ReSortChildren() must be called to get sort order right. */ stCapChildren = 16 ///< Caps children list. /*!< Shows only top n children, where n is set by CStatisticsDlg::FillTree() to thePrefs::GetMaxClientVersions(). * The list itself is not changed, only visibility is ignored on items * outside the top n visible. * * On an EC request, visibility range can be set with the EC_TAG_STATTREE_CAPPING tag. */ }; enum EValueType { vtUnknown, vtString, vtInteger, vtFloat }; /** * Display modes for Simple and Counter items */ enum EDisplayMode { dmDefault, ///< Default display mode. dmTime, ///< Treat integer value as time in seconds. dmBytes ///< Treat integer value as bytes count. }; #endif /* !CLIENT_GUI */ class CStatTreeItemBase; typedef std::list::iterator StatTreeItemIterator; class CECTag; uint32_t NewStatTreeItemId(); /** * Base tree item class */ class CStatTreeItemBase { public: #ifndef CLIENT_GUI /** * Creates an item with a constant label. * * @param label Visible text for the item. * @param flags Flags to use. */ CStatTreeItemBase(const wxString &label, unsigned flags = stNone) : m_label(label), m_parent(NULL), m_flags(flags), m_id(0), m_uniqueid(NewStatTreeItemId()) {} #else /** * Creates an item with a constant label. * * @param label Visible text for the item. */ CStatTreeItemBase(const wxString &label, uint32_t uniqueid) : m_label(label), m_uniqueid(uniqueid) {} /** * Creates an item (and the whole subtree) from an EC tag. * * @param tag EC tag containing a stat subtree. */ CStatTreeItemBase(const CECTag *tag); #endif /** * Deletes all children. */ VIRTUAL ~CStatTreeItemBase(); #ifndef CLIENT_GUI /** * Adds a new child node. * * @param child child to add. * @param id an optional ID for the new item. * @param skipOneLevel activates a trick to let the code work for aMule OSInfo and Version trees. * * @return the newly added item. */ CStatTreeItemBase *AddChild( CStatTreeItemBase* child, uint32_t id = 0, bool skipOneLevel = false); #endif /** * Check for children. * * @return true if this node has children, false otherwise. */ bool HasChildren() { wxMutexLocker lock(m_lock); return !m_children.empty(); } /** * Check for visible children. * * @return true if this node has children and at least one of them is visible. */ bool HasVisibleChildren(); #ifndef CLIENT_GUI /** * Check for a given child. * * @return true if this node has a child with the given ID. */ bool HasChildWithId(uint32_t id); /** * Access a specific child. * * @return the child with the given ID, or NULL if not found. */ CStatTreeItemBase *GetChildById(uint32_t id); /** * Get the first visible child. * * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited) * * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList(). */ StatTreeItemIterator GetFirstVisibleChild(uint32_t max_children); /** * Get the next visible child. */ void GetNextVisibleChild(StatTreeItemIterator& it); #else /* CLIENT_GUI */ /** * Get the first visible child. * * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList(). * * @note On a remote list every item is visible. */ StatTreeItemIterator GetFirstVisibleChild() { return m_children.begin(); } /** * Get the next visible child. * * @note On a remote list every item is visible. */ void GetNextVisibleChild(StatTreeItemIterator& it) { ++it; } #endif /* !CLIENT_GUI / CLIENT_GUI */ /** * Check if we are past the end of child list. */ bool IsAtEndOfList(StatTreeItemIterator& it) { return it == m_children.end(); } #ifndef CLIENT_GUI /** * Resorts children for the stSortByValue flag. */ void ReSortChildren() { wxMutexLocker lock(m_lock); m_children.sort(ValueSort); } #endif #ifndef AMULE_DAEMON #ifndef CLIENT_GUI /** * Returns a string that will be displayed on the GUI tree. */ virtual wxString GetDisplayString() const; #else /** * Returns the associated text (GUI item label). */ const wxString& GetDisplayString() const { return m_label; } #endif /* !CLIENT_GUI / CLIENT_GUI */ /** * Returns the mutex used to lock the child list of this node. * * This function is used by CStatisticsDlg to be able to lock the * core tree while updating the GUI tree. */ wxMutex& GetLock() { return m_lock; } /** * Returns the unique ID of this node. */ uint32_t GetUniqueId() const { return m_uniqueid; } #endif /* !AMULE_DAEMON */ /** * Check whether this node is visible. */ VIRTUAL bool IsVisible() const { return true; } #ifndef CLIENT_GUI /** * Create an EC tag from this node (and children). * * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited) * * @return A EC tag containing this node and all its children. */ virtual CECTag *CreateECTag(uint32_t max_children); #endif protected: #ifndef CLIENT_GUI /** * Add values to the EC tag being generated. * * Should have a real implementation in children which have some value. * The given parameter is the tag to which values should be added. */ virtual void AddECValues(CECTag*) const {} #endif //! Unformatted and untranslated label of the node. Note: On remote gui it is already formatted and translated. const wxString m_label; #ifndef CLIENT_GUI //! Parent of this node. CStatTreeItemBase *m_parent; //! Flags for the node. unsigned m_flags; #endif private: #ifndef CLIENT_GUI //! Function used when sorting children by value. static bool ValueSort(const CStatTreeItemBase* a, const CStatTreeItemBase* b); //! ID of this node. uint32_t m_id; //! Counter to keep track of displayed visible items // (needed for the stCapChildren flag) uint32_t m_visible_counter; #endif //! Unique ID of this node. uint32_t m_uniqueid; //! Children of this node. std::list m_children; //! Lock to protect list from simultanous access. wxMutex m_lock; }; // // Anything below is only for core. // #ifndef CLIENT_GUI /** * Simple tree item. * * This tree item has one value and nothing speciality. :) * The value might be an arbitrary integer or floating point type, * or a wxString string. * * The item is able to display value in different formats, see SetDisplayMode(). * * @note that you have to specify the right format code on 'label', i.e.: * %s for string and integers with displayMode dmTime or dmBytes, * %u or similar for integers, and * %f or similar for floating point types. * * @note You have to call SetValue() after creation for non-integer values, otherwise * you'll get undesired results. */ class CStatTreeItemSimple : public CStatTreeItemBase { public: /** * Constructor. * * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemSimple( const wxString &label, unsigned flags = stNone, enum EDisplayMode displaymode = dmDefault) : CStatTreeItemBase(label, flags), m_valuetype(vtUnknown), m_displaymode(displaymode) { SetValue((uint64_t)0); } /** * Sets the desired display mode of value. */ void SetDisplayMode(enum EDisplayMode mode) { m_displaymode = mode; } /** * Sets an integer type value. * * @param value the value to be set. */ void SetValue(uint64_t value) { m_valuetype = vtInteger; m_intvalue = value; } /** * Sets a floating point type value. * * @param value the value to be set. */ void SetValue(double value) { m_valuetype = vtFloat; m_floatvalue = value; } /** * Sets a string type value. * * @param value the value to be set. */ void SetValue(const wxString& value) { m_valuetype = vtString; m_stringvalue = value; } #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif /** * @see CStatTreeItemBase::IsVisible() */ virtual bool IsVisible() const; protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Type of the value. enum EValueType m_valuetype; //! Display mode of the value. enum EDisplayMode m_displaymode; //! Union to save space. union { uint64_t m_intvalue; ///< Integer value. double m_floatvalue; ///< Floating point value. }; wxString m_stringvalue; ///< String value. }; /** * Counter-type tree item template. * * Able to show percentage compared to parent, hide itself * when value is zero, and nice functions for changing the value. * stShowPercent and stHideIfZero flags take effect only on * this node. */ template class CStatTreeItemCounterTmpl : public CStatTreeItemBase { public: /** * Constructor. * * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemCounterTmpl( const wxString &label, unsigned flags = stNone) : CStatTreeItemBase(label, flags), m_value(0), m_displaymode(dmDefault) {} /** * Retrieve counter value. */ _Tp GetValue() const { return m_value; } /** * Retrieve counter value. */ operator _Tp() const { return m_value; } /** * Set counter to given value. */ void SetValue(_Tp value) { m_value = value; } /** * Set counter to given value. */ void operator=(_Tp value) { m_value = value; } /** * Increase value by 1. */ void operator++() { ++m_value; } /** * Decrease value by 1. */ void operator--() { --m_value; } /** * Increase value by given amount. */ void operator+=(_Tp value) { m_value += value; } /** * Decrease value by given amount. */ void operator-=(_Tp value) { m_value -= value; } /** * Sets the desired display mode of value. */ void SetDisplayMode(enum EDisplayMode mode) { m_displaymode = mode; } #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif /** * @see CStatTreeItemBase::IsVisible() */ virtual bool IsVisible() const { return (m_flags & stHideIfZero) ? (m_value != 0) : true; } protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Actual value of the counter. _Tp m_value; //! Display mode of the value. enum EDisplayMode m_displaymode; }; typedef CStatTreeItemCounterTmpl CStatTreeItemCounter; typedef CStatTreeItemCounterTmpl CStatTreeItemNativeCounter; /** * A counter, which does not display its value :P */ class CStatTreeItemHiddenCounter : public CStatTreeItemCounter { public: /** * Constructor. * * @see CStatTreeItemCounter::CStatTreeItemCounter */ CStatTreeItemHiddenCounter( const wxString &label, unsigned flags = stNone) : CStatTreeItemCounter(label, flags) {} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const { return CStatTreeItemBase::GetDisplayString(); } #endif /** * @see CStatTreeItemBase::IsVisible() */ virtual bool IsVisible() const { return true; } protected: //! Do nothing here. virtual void AddECValues(CECTag*) const {} }; /** * Item for the session/total upload/download counter */ class CStatTreeItemUlDlCounter : public CStatTreeItemCounter { public: /** * @param label format text for item. * @param totalfunc function that will return the totals. */ CStatTreeItemUlDlCounter( const wxString &label, uint64_t (*totalfunc)(), unsigned flags = stNone) : CStatTreeItemCounter(label, flags), m_totalfunc(totalfunc) {} #ifndef AMULE_DAEMON /** * @see CStatTreeBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! A function whose return value is the total (without current) value. uint64_t (*m_totalfunc)(); }; /** * Counter-like tree item which remembers its max value. * * Used for active connections counter, to be able to get peak connections. */ class CStatTreeItemCounterMax : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemCounterMax(const wxString &label) : CStatTreeItemBase(label), m_value(0), m_max_value(0) {} /** * Increase value */ void operator++() { if (++m_value > m_max_value) { m_max_value = m_value; } } /** * Decrease value */ void operator--() { --m_value; } /** * Retrieve actual value */ uint32_t GetValue() { return m_value; } /** * Retrieve max value */ uint32_t GetMaxValue() { return m_max_value; } #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Actual value of the counter. uint32_t m_value; //! Maximal value the counter has ever reached. uint32_t m_max_value; }; /** * Tree item for counting packets */ class CStatTreeItemPackets : public CStatTreeItemBase { friend class CStatTreeItemPacketTotals; public: /** * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemPackets(const wxString &label) : CStatTreeItemBase(label, stNone), m_packets(0), m_bytes(0) {} /** * Add a packet of size 'size'. */ void operator+=(long size) { ++m_packets; m_bytes += size; } #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Total number of packets. uint32_t m_packets; //! Total bytes in the packets. uint64_t m_bytes; }; /** * Tree item for counting totals on packet counters. * * This item sums up a number of packet counters, plus adds its own values. */ class CStatTreeItemPacketTotals : public CStatTreeItemPackets { public: /** * @see CStatTreeItemPackets::CStatTreeItemPackets */ CStatTreeItemPacketTotals(const wxString &label) : CStatTreeItemPackets(label) {} /** * Adds a packet counter, whose values should be counted in the totals. */ void AddPacketCounter(CStatTreeItemPackets* counter) { m_counters.push_back(counter); } #ifndef AMULE_DAEMON /** * @see CStatTreeItemPackets::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! List of packet counters to sum. std::vector m_counters; }; /** * Tree item for timer type nodes. */ class CStatTreeItemTimer : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemTimer( const wxString &label, unsigned flags = stNone) : CStatTreeItemBase(label, flags), m_value(0) {} /** * Sets timer start time (and thus starts timer). */ void SetStartTime(uint64_t value) { m_value = value; } /** * Starts the timer if it's not running. */ void StartTimer() { if (!m_value) m_value = GetTickCount64(); } /** * Stops the timer. */ void StopTimer() { m_value = 0; } /** * Check whether the timer is running. */ bool IsRunning() const { return m_value != 0; } /** * Reset timer unconditionally. */ void ResetTimer() { m_value = GetTickCount64(); } /** * Get timer value. */ uint64_t GetTimerValue() const { return m_value ? GetTickCount64() - m_value : 0; } /** * Get timer value (in ticks). */ operator uint64_t() const { return m_value ? GetTickCount64() - m_value : 0; } /** * Get elapsed time in seconds. */ uint64_t GetTimerSeconds() const { return m_value ? (GetTickCount64() - m_value) / 1000 : 0; } /** * Get start time of the timer. */ uint64_t GetTimerStart() const { return m_value; } #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif /** * @see CStatTreeItemBase::IsVisible() */ virtual bool IsVisible() const { return (m_flags & stHideIfZero) ? m_value != 0 : true; } protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Tick count value when timer was started. uint64_t m_value; }; /** * Tree item for shared files average size. * * Average is counted as dividend / divisor, if divisor is non-zero. */ class CStatTreeItemAverage : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase * * @param dividend What to divide. * @param divisor Divide by what. */ CStatTreeItemAverage( const wxString &label, const CStatTreeItemCounter *dividend, const CStatTreeItemCounter *divisor, enum EDisplayMode displaymode) : CStatTreeItemBase(label, stNone), m_dividend(dividend), m_divisor(divisor), m_displaymode(displaymode) {} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif /** * @see CStatTreeItemBase::IsVisible() */ virtual bool IsVisible() const { return (*m_divisor) != 0; } protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! What to divide. const CStatTreeItemCounter *m_dividend; //! Divide by what. const CStatTreeItemCounter *m_divisor; //! Display mode. enum EDisplayMode m_displaymode; }; /** * Tree item for average up/down speed. */ class CStatTreeItemAverageSpeed : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase * * @param counter Session up/down counter. * @param timer Session uptime timer. */ CStatTreeItemAverageSpeed( const wxString &label, const CStatTreeItemUlDlCounter *counter, const CStatTreeItemTimer *timer) : CStatTreeItemBase(label, stNone), m_counter(counter), m_timer(timer) {} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Session sent/received bytes counter. const CStatTreeItemUlDlCounter *m_counter; //! Session uptime. const CStatTreeItemTimer *m_timer; }; /** * Tree item for displaying ratio between two counters. * * Ratio is counted as counter1:counter2. */ class CStatTreeItemRatio : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase * * @param cnt1 First counter to use. * @param cnt2 Second counter to use. */ CStatTreeItemRatio( const wxString &label, const CStatTreeItemCounter *cnt1, const CStatTreeItemCounter* cnt2, uint64_t (*totalfunc1)() = NULL, uint64_t (*totalfunc2)() = NULL) : CStatTreeItemBase(label, stNone), m_counter1(cnt1), m_counter2(cnt2), m_totalfunc1(totalfunc1), m_totalfunc2(totalfunc2){} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! First counter. const CStatTreeItemCounter *m_counter1; //! Second counter. const CStatTreeItemCounter *m_counter2; //! A function for each whose return value is the total (without current) value. uint64_t (*m_totalfunc1)(); uint64_t (*m_totalfunc2)(); private: //! Formatted String for display or EC wxString GetString() const; }; /** * Special counter for reconnects. */ class CStatTreeItemReconnects : public CStatTreeItemNativeCounter { public: /** * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemReconnects(const wxString &label) : CStatTreeItemNativeCounter(label, stNone) {} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; }; /** * Special item for Max Connection Limit Reached */ class CStatTreeItemMaxConnLimitReached : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase */ CStatTreeItemMaxConnLimitReached(const wxString &label) : CStatTreeItemBase(label), m_count(0) {} /** * Increase counter and save time. */ void operator++() { ++m_count; m_time.SetToCurrent(); } #ifndef AMULE_DAEMON /** * Returns a string to be displayed on GUI. * * For m_count == 0 it will display "Never", * for other values it will display the counter value and the * date & time of the event. */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Number of times max conn limit reached. uint32_t m_count; //! Last time when max conn limit reached. wxDateTime m_time; }; /** * Special item for total client count */ class CStatTreeItemTotalClients : public CStatTreeItemBase { public: /** * @see CStatTreeItemBase::CStatTreeItemBase * * @param known Counter that counts known clients. * @param unknown Counter that counts unknown clients. */ CStatTreeItemTotalClients( const wxString &label, const CStatTreeItemCounter *known, const CStatTreeItemCounter *unknown) : CStatTreeItemBase(label), m_known(known), m_unknown(unknown) {} #ifndef AMULE_DAEMON /** * @see CStatTreeItemBase::GetDisplayString() */ virtual wxString GetDisplayString() const; #endif protected: /** * Add values to EC tag being generated. * * @param tag The tag to which values should be added. * * @see CStatTreeItemBase::AddECValues */ virtual void AddECValues(CECTag *tag) const; //! Counter counting known clients. const CStatTreeItemCounter *m_known; //! Counter counting unknown clients. const CStatTreeItemCounter *m_unknown; }; #endif /* !CLIENT_GUI */ #endif /* STATTREE_H */ // File_checked_for_headers aMule-2.3.1/src/ChatWnd.h0000644000175000017470000000565411575347521014000 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef CHATWND_H #define CHATWND_H #include // Needed for wxPanel #include // Needed for wxNotebookEvent #include "Types.h" class CFriend; class CChatSelector; class CFriendListCtrl; class CMD4Hash; class CChatWnd : public wxPanel { public: CChatWnd(wxWindow* pParent = NULL); ~CChatWnd() {}; void StartSession(CFriend* friend_client, bool setfocus = true); void UpdateFriend(CFriend* toupdate); void RemoveFriend(CFriend* todel); void ProcessMessage(uint64 sender, const wxString& message); void ConnectionResult(bool success, const wxString& message, uint64 id); void SendMessage(const wxString& message, const wxString& client_name = wxEmptyString, uint64 to_id = 0); bool IsIdValid(uint64 id); void ShowCaptchaResult(uint64 id, bool ok); void EndSession(uint64 id); protected: /** * Event-handler for displaying the chat-popup menu. */ void OnNMRclickChatTab(wxMouseEvent& evt); /** * Event-handler fo the Close item on the popup-menu. */ void OnPopupClose(wxCommandEvent& evt); /** * Event-handler fo the CloseAll item on the popup-menu. */ void OnPopupCloseAll(wxCommandEvent& evt); /** * Event-handler fo the CloseOthers item on the popup-menu. */ void OnPopupCloseOthers(wxCommandEvent& evt); /** * Event-handler fo the AddFriend item on the popup-menu. */ void OnAddFriend(wxCommandEvent& evt); void OnBnClickedCsend(wxCommandEvent& evt); void OnBnClickedCclose(wxCommandEvent& evt); void OnAllPagesClosed(wxNotebookEvent& evt); void CheckNewButtonsState(); DECLARE_EVENT_TABLE() //! Variable used to ensure that the popup menu doesn't get displayed twice. wxMenu* m_menu; //! Pointer to the control serving as the friend list CFriendListCtrl* friendlistctrl; //! Pointer to the chat tabs. CChatSelector* chatselector; }; #endif // File_checked_for_headers aMule-2.3.1/src/SourceListCtrl.h0000644000175000017470000000424511575347521015364 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef SOURCELISTCTRL_H #define SOURCELISTCTRL_H #include "GenericClientListCtrl.h" // Needed for CGenericClientListCtrl /** * This class is responsible for representing the sources for a file. */ class CSourceListCtrl : public CGenericClientListCtrl { public: /** * Constructor. * * @see CGenericClientListCtrl::CGenericClientListCtrl for documentation of parameters. */ CSourceListCtrl( wxWindow *parent, wxWindowID winid = -1, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxLC_ICON, const wxValidator& validator = wxDefaultValidator, const wxString &name = wxT("sourcelistctrl") ); /** * Destructor. */ virtual ~CSourceListCtrl(); private: virtual CamuleDlg::DialogType GetParentDialog() { return CamuleDlg::DT_TRANSFER_WND; } virtual void SetShowSources(CKnownFile * f, bool b) const; static int wxCALLBACK SourceSortProc(wxUIntPtr item1, wxUIntPtr item2, long sortData); bool IsShowingDownloadSources() const { return true; } DECLARE_EVENT_TABLE() }; #endif // File_checked_for_headers aMule-2.3.1/src/PrefsUnifiedDlg.h0000644000175000017470000000734511575347521015461 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Original author: Emilio Sandoz // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef __PrefsUnifiedDlg_H__ #define __PrefsUnifiedDlg_H__ #include // Needed for wxDialog class Cfg_Base; class CDirectoryTreeCtrl; class wxWindow; class wxChoice; class wxButton; class wxPanel; class wxListCtrl; class wxCommandEvent; class wxListEvent; class wxSpinEvent; class wxScrollEvent; class wxInitDialogEvent; /** * This class represents a dialog used to display preferences. */ class PrefsUnifiedDlg : public wxDialog { public: /** * Constructor. * * @param parent The parent window. * * This constructor is a much more simple version of the wxDialog one, * which only needs to know the parent of the dialog. Please note that * it is private so that we can ensure that only one dialog has been * created at one time. */ PrefsUnifiedDlg(wxWindow* parent); /** * Updates the widgets with the values of the preference-variables. */ bool TransferFromWindow(); /** * Updates the prefernce-variables with the values of the widgets. */ bool TransferToWindow(); protected: /** * Helper functions which checks if a Cfg has has changed. */ bool CfgChanged(int id); /** * Helper functions which returns the Cfg assosiated with the specified id. */ Cfg_Base* GetCfg(int id); //! Pointer to the shared-files list CDirectoryTreeCtrl* m_ShareSelector; //! Pointer to the color-selector wxChoice* m_choiceColor; //! Pointer to the color-selection button wxButton* m_buttonColor; //! Pointer to the currently shown preference-page wxPanel* m_CurrentPanel; //! hide/show server tab int m_IndexServerTab; bool m_ServerTabVisible; wxPanel* m_ServerWidget; wxListCtrl* m_PrefsIcons; void EnableServerTab(bool enable); void OnOk(wxCommandEvent &event); void OnCancel(wxCommandEvent &event); void OnClose(wxCloseEvent &event); void OnButtonBrowseApplication(wxCommandEvent &event); void OnButtonDir(wxCommandEvent& event); void OnButtonEditAddr(wxCommandEvent& event); void OnButtonColorChange(wxCommandEvent &event); void OnButtonIPFilterReload(wxCommandEvent &event); void OnButtonIPFilterUpdate(wxCommandEvent &event); void OnColorCategorySelected(wxCommandEvent &event); void OnCheckBoxChange(wxCommandEvent &event); void OnPrefsPageChange(wxListEvent& event); void OnToolTipDelayChange(wxSpinEvent& event); void OnScrollBarChange( wxScrollEvent& event ); void OnRateLimitChanged( wxSpinEvent& event ); void OnTCPClientPortChange(wxSpinEvent& event); void OnUserEventSelected(wxListEvent& event); void OnLanguageChoice(wxCommandEvent &event); void CreateEventPanels(const int idx, const wxString& vars, wxWindow* parent); void OnInitDialog( wxInitDialogEvent& evt ); DECLARE_EVENT_TABLE() }; #endif // File_checked_for_headers aMule-2.3.1/src/HTTPDownload.cpp0000644000175000017470000003340711575347521015247 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Timo Kujala ( tiku@users.sourceforge.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include #include "HTTPDownload.h" // Interface declarations #include // Needed for unicode2char #include "OtherFunctions.h" // Needed for CastChild #include "Logger.h" // Needed for AddLogLine* #include // Needed for CFormat #include "InternalEvents.h" // Needed for CMuleInternalEvent #include "Preferences.h" #include "ScopedPtr.h" #include // Needed for wxFileName #ifndef AMULE_DAEMON #include "inetdownload.h" // Needed for inetDownload #include "muuli_wdr.h" // Needed for ID_CANCEL: Let it here or will fail on win32 #include "MuleGifCtrl.h" typedef wxGauge wxGaugeControl; DECLARE_LOCAL_EVENT_TYPE(wxEVT_HTTP_PROGRESS, wxANY_ID) DECLARE_LOCAL_EVENT_TYPE(wxEVT_HTTP_SHUTDOWN, wxANY_ID) class CHTTPDownloadDialog : public wxDialog { public: CHTTPDownloadDialog(CHTTPDownloadThread* thread) : wxDialog(wxTheApp->GetTopWindow(), -1, _("Downloading..."), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxSYSTEM_MENU) { downloadDlg(this, true)->Show(this, true); m_progressbar = CastChild(ID_HTTPDOWNLOADPROGRESS, wxGaugeControl); m_progressbar->SetRange(100); m_ani = CastChild(ID_ANIMATE, MuleGifCtrl); m_ani->LoadData((const char*)inetDownload, sizeof(inetDownload)); m_ani->Start(); m_thread = thread; } ~CHTTPDownloadDialog() { StopThread(); } void UpdateGauge(int total, int current) { CFormat label( wxT("( %s / %s )") ); label % CastItoXBytes(current); if (total > 0) { label % CastItoXBytes(total); } else { label % _("Unknown"); } CastChild(IDC_DOWNLOADSIZE, wxStaticText)->SetLabel(label.GetString()); if (total && (total != m_progressbar->GetRange())) { m_progressbar->SetRange(total); } if (current && (current <= total)) { m_progressbar->SetValue(current); } Layout(); } private: void StopThread() { if (m_thread) { m_thread->Stop(); delete m_thread; m_thread = NULL; } } void OnBtnCancel(wxCommandEvent& WXUNUSED(evt)) { AddLogLineN(_("HTTP download cancelled")); Show(false); StopThread(); } void OnProgress(CMuleInternalEvent& evt) { UpdateGauge(evt.GetExtraLong(), evt.GetInt()); } void OnShutdown(CMuleInternalEvent& WXUNUSED(evt)) { Show(false); Destroy(); } CMuleThread* m_thread; MuleGifCtrl* m_ani; wxGaugeControl* m_progressbar; DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(CHTTPDownloadDialog, wxDialog) EVT_BUTTON(ID_HTTPCANCEL, CHTTPDownloadDialog::OnBtnCancel) EVT_MULE_INTERNAL(wxEVT_HTTP_PROGRESS, -1, CHTTPDownloadDialog::OnProgress) EVT_MULE_INTERNAL(wxEVT_HTTP_SHUTDOWN, -1, CHTTPDownloadDialog::OnShutdown) END_EVENT_TABLE() DEFINE_LOCAL_EVENT_TYPE(wxEVT_HTTP_PROGRESS) DEFINE_LOCAL_EVENT_TYPE(wxEVT_HTTP_SHUTDOWN) #endif CHTTPDownloadThread::CHTTPDownloadThread(const wxString& url, const wxString& filename, const wxString& oldfilename, HTTP_Download_File file_id, bool showDialog, bool checkDownloadNewer) #ifdef AMULE_DAEMON : CMuleThread(wxTHREAD_DETACHED), #else : CMuleThread(showDialog ? wxTHREAD_JOINABLE : wxTHREAD_DETACHED), #endif m_url(url), m_tempfile(filename), m_result(-1), m_file_id(file_id), m_companion(NULL) { if (showDialog) { #ifndef AMULE_DAEMON CHTTPDownloadDialog* dialog = new CHTTPDownloadDialog(this); dialog->Show(true); m_companion = dialog; #endif } // Get the date on which the original file was last modified // Only if it's the same URL we used for the last download and if the file exists. if (checkDownloadNewer && thePrefs::GetLastHTTPDownloadURL(file_id) == url) { wxFileName origFile = wxFileName(oldfilename); if (origFile.FileExists()) { AddDebugLogLineN(logHTTP, CFormat(wxT("URL %s matches and file %s exists, only download if newer")) % url % oldfilename); m_lastmodified = origFile.GetModificationTime(); } } wxMutexLocker lock(s_allThreadsMutex); s_allThreads.insert(this); } // Format the given date to a RFC-2616 compliant HTTP date // Example: Thu, 14 Jan 2010 15:40:23 GMT wxString CHTTPDownloadThread::FormatDateHTTP(const wxDateTime& date) { static const wxChar* s_months[] = { wxT("Jan"), wxT("Feb"), wxT("Mar"), wxT("Apr"), wxT("May"), wxT("Jun"), wxT("Jul"), wxT("Aug"), wxT("Sep"), wxT("Oct"), wxT("Nov"), wxT("Dec") }; static const wxChar* s_dow[] = { wxT("Sun"), wxT("Mon"), wxT("Tue"), wxT("Wed"), wxT("Thu"), wxT("Fri"), wxT("Sat") }; return CFormat(wxT("%s, %02d %s %d %02d:%02d:%02d GMT")) % s_dow[date.GetWeekDay(wxDateTime::UTC)] % date.GetDay(wxDateTime::UTC) % s_months[date.GetMonth(wxDateTime::UTC)] % date.GetYear(wxDateTime::UTC) % date.GetHour(wxDateTime::UTC) % date.GetMinute(wxDateTime::UTC) % date.GetSecond(wxDateTime::UTC); } CMuleThread::ExitCode CHTTPDownloadThread::Entry() { if (TestDestroy()) { return NULL; } wxHTTP* url_handler = NULL; AddDebugLogLineN(logHTTP, wxT("HTTP download thread started")); const CProxyData* proxy_data = thePrefs::GetProxyData(); bool use_proxy = proxy_data != NULL && proxy_data->m_proxyEnable; try { wxFFileOutputStream outfile(m_tempfile); if (!outfile.Ok()) { throw wxString(CFormat(_("Unable to create destination file %s for download!")) % m_tempfile); } if (m_url.IsEmpty()) { // Nowhere to download from! throw wxString(_("The URL to download can't be empty")); } url_handler = new wxHTTP; url_handler->SetProxyMode(use_proxy); // Build a conditional get request if the last modified date of the file being updated is known if (m_lastmodified.IsValid()) { // Set a flag in the HTTP header that we only download if the file is newer. // see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 AddDebugLogLineN(logHTTP, wxT("If-Modified-Since: ") + FormatDateHTTP(m_lastmodified)); url_handler->SetHeader(wxT("If-Modified-Since"), FormatDateHTTP(m_lastmodified)); } CScopedPtr url_read_stream(GetInputStream(url_handler, m_url, use_proxy)); if (!url_read_stream.get()) { if (m_response == 304) { m_result = HTTP_Skipped; AddDebugLogLineN(logHTTP, wxT("Skipped download because requested file is not newer.")); throw wxString(wxEmptyString); } else { m_result = HTTP_Error; throw wxString(CFormat(_("The URL %s returned: %i - Error (%i)!")) % m_url % m_response % m_error); } } int download_size = url_read_stream->GetSize(); if (download_size == -1) { AddDebugLogLineN(logHTTP, wxT("Download size not received, downloading until connection is closed")); } else { AddDebugLogLineN(logHTTP, CFormat(wxT("Download size: %i")) % download_size); } // Here is our read buffer // Still, I'm sure 4092 is probably a better size. // MP: Most people can download at least at 32kb/s from http... const unsigned MAX_HTTP_READ = 32768; char buffer[MAX_HTTP_READ]; int current_read = 0; int total_read = 0; do { url_read_stream->Read(buffer, MAX_HTTP_READ); current_read = url_read_stream->LastRead(); if (current_read) { total_read += current_read; outfile.Write(buffer,current_read); int current_write = outfile.LastWrite(); if (current_read != current_write) { throw wxString(_("Critical error while writing downloaded file")); } else if (m_companion) { #ifndef AMULE_DAEMON CMuleInternalEvent evt(wxEVT_HTTP_PROGRESS); evt.SetInt(total_read); evt.SetExtraLong(download_size); wxPostEvent(m_companion, evt); #endif } } } while (current_read && !TestDestroy()); if (current_read == 0) { if (download_size == -1) { // Download was probably succesful. AddLogLineN(CFormat(_("Downloaded %d bytes")) % total_read); m_result = HTTP_Success; } else if (total_read != download_size) { m_result = HTTP_Error; throw wxString(CFormat(_("Expected %d bytes, but downloaded %d bytes")) % download_size % total_read); } else { // Download was succesful. m_result = HTTP_Success; } } } catch (const wxString& error) { if (wxFileExists(m_tempfile)) { wxRemoveFile(m_tempfile); } if (!error.IsEmpty()) { AddLogLineC(error); } } if (m_result == HTTP_Success) { thePrefs::SetLastHTTPDownloadURL(m_file_id, m_url); } if (url_handler) { url_handler->Destroy(); } AddDebugLogLineN(logHTTP, wxT("HTTP download thread ended")); return 0; } void CHTTPDownloadThread::OnExit() { #ifndef AMULE_DAEMON if (m_companion) { CMuleInternalEvent termEvent(wxEVT_HTTP_SHUTDOWN); wxPostEvent(m_companion, termEvent); } #endif // Notice the app that the file finished download CMuleInternalEvent evt(wxEVT_CORE_FINISHED_HTTP_DOWNLOAD); evt.SetInt((int)m_file_id); evt.SetExtraLong((long)m_result); wxPostEvent(wxTheApp, evt); wxMutexLocker lock(s_allThreadsMutex); s_allThreads.erase(this); } //! This function's purpose is to handle redirections in a proper way. wxInputStream* CHTTPDownloadThread::GetInputStream(wxHTTP * & url_handler, const wxString& location, bool proxy) { if (TestDestroy()) { return NULL; } if (!location.StartsWith(wxT("http://"))) { // This is not a http url throw wxString(_("Invalid URL for HTTP download or HTTP redirection (did you forget 'http://' ?)")); } // Get the host // Remove the "http://" wxString host = location.Right(location.Len() - 7); // strlen("http://") -> 7 // I belive this is a bug... // Sometimes "Location" header looks like this: // "http://www.whatever.com:8080http://www.whatever.com/downloads/something.zip" // So let's clean it... int bad_url_pos = host.Find(wxT("http://")); wxString location_url; if (bad_url_pos != -1) { // Malformed Location field on header (bug above?) location_url = host.Mid(bad_url_pos); host = host.Left(bad_url_pos); // After the first '/' non-http-related, it's the location part of the URL location_url = location_url.Right(location_url.Len() - 7).AfterFirst(wxT('/')); } else { // Regular Location field // After the first '/', it's the location part of the URL location_url = host.AfterFirst(wxT('/')); // The host is everything till the first "/" host = host.BeforeFirst(wxT('/')); } // Build the cleaned url now wxString url = wxT("http://") + host + wxT("/") + location_url; int port = 80; if (host.Find(wxT(':')) != -1) { // This http url has a port port = wxAtoi(host.AfterFirst(wxT(':'))); host = host.BeforeFirst(wxT(':')); } wxIPV4address addr; addr.Hostname(host); addr.Service(port); if (!url_handler->Connect(addr, true)) { throw wxString(_("Unable to connect to HTTP download server")); } wxInputStream* url_read_stream = url_handler->GetInputStream(url); /* store the HTTP response code */ m_response = url_handler->GetResponse(); /* store the HTTP error code */ m_error = url_handler->GetError(); AddDebugLogLineN(logHTTP, CFormat(wxT("Host: %s:%i\n")) % host % port); AddDebugLogLineN(logHTTP, CFormat(wxT("URL: %s\n")) % url); AddDebugLogLineN(logHTTP, CFormat(wxT("Response: %i (Error: %i)")) % m_response % m_error); if (!m_response) { AddDebugLogLineC(logHTTP, wxT("WARNING: Void response on stream creation")); // WTF? Why does this happen? // This is probably produced by an already existing connection, because // the input stream is created nevertheless. However, data is not the same. delete url_read_stream; throw wxString(_("Invalid response from HTTP download server")); } if (m_response == 301 // Moved permanently || m_response == 302 // Moved temporarily // What about 300 (multiple choices)? Do we have to handle it? ) { // We have to remove the current stream. delete url_read_stream; wxString new_location = url_handler->GetHeader(wxT("Location")); url_handler->Destroy(); if (!new_location.IsEmpty()) { url_handler = new wxHTTP; url_handler->SetProxyMode(proxy); if (m_lastmodified.IsValid()) { // Set a flag in the HTTP header that we only download if the file is newer. // see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 url_handler->SetHeader(wxT("If-Modified-Since"), FormatDateHTTP(m_lastmodified)); } url_read_stream = GetInputStream(url_handler, new_location, proxy); } else { AddDebugLogLineC(logHTTP, wxT("ERROR: Redirection code received with no URL")); url_handler = NULL; url_read_stream = NULL; } } else if (m_response == 304) { // "Not Modified" delete url_read_stream; url_handler->Destroy(); url_read_stream = NULL; url_handler = NULL; } return url_read_stream; } void CHTTPDownloadThread::StopAll() { ThreadSet allThreads; { wxMutexLocker lock(s_allThreadsMutex); std::swap(allThreads, s_allThreads); } for (ThreadSet::iterator it = allThreads.begin(); it != allThreads.end(); it++) { (*it)->Stop(); } } CHTTPDownloadThread::ThreadSet CHTTPDownloadThread::s_allThreads; wxMutex CHTTPDownloadThread::s_allThreadsMutex; // File_checked_for_headers aMule-2.3.1/src/utils/0000755000175000017470000000000011657306262013423 5ustar topiusersaMule-2.3.1/src/utils/wxCas/0000755000175000017470000000000011657306263014511 5ustar topiusersaMule-2.3.1/src/utils/wxCas/wxcas.xpm0000644000175000017470000001231511575347521016367 0ustar topiusers/* XPM */ static const char *wxcas_xpm[] = { /* columns rows colors chars-per-pixel */ "32 32 190 2", " c None", ". c #182139", "X c #182152", "o c #18314a", "O c #10395a", "+ c #083963", "@ c #212942", "# c #21395a", "$ c #313142", "% c #31394a", "& c #39394a", "* c #39397b", "= c #08425a", "- c #00426b", "; c #004273", ": c #00526b", "> c #08526b", ", c #00637b", "< c #7b4200", "1 c #424252", "2 c #4a4a5a", "3 c #4a4a63", "4 c #525263", "5 c #5a5a6b", "6 c #52527b", "7 c gray42", "8 c #636373", "9 c gray45", "0 c #005294", "q c #085aad", "w c #00738c", "e c #006bad", "r c #006bb5", "t c #0073a5", "y c #007ba5", "u c #0073bd", "i c #007bc6", "p c #6b739c", "a c #0094bd", "s c #008cce", "d c #009cc6", "f c #0094d6", "g c #009cd6", "h c #0894d6", "j c #089cde", "k c #1894ce", "l c #00a5ce", "z c #00a5d6", "x c #00a5de", "c c #18a5de", "v c #00ade7", "b c #00b5e7", "n c #00b5ef", "m c #00bdef", "M c #08b5e7", "N c #00bdf7", "B c #10ade7", "V c #18b5e7", "C c #2194c6", "Z c #219cd6", "A c #21adde", "S c #31adde", "D c #21b5e7", "F c #29b5e7", "G c #39ade7", "H c #39bdef", "J c #00c6f7", "K c #42adde", "L c #4abde7", "P c #73bdd6", "I c #4ac6ef", "U c #4ad6f7", "Y c #5ac6ef", "T c #5ad6f7", "R c #63ceef", "E c #6bd6f7", "W c #73ceef", "Q c #73d6f7", "! c #8c4a00", "~ c #9c5200", "^ c #9c7339", "/ c #a55a00", "( c #ad5a00", ") c #a56300", "_ c #ad6300", "` c #ad6308", "' c #ad6b08", "] c #a56b18", "[ c #ad6b18", "{ c #ad7318", "} c #b56300", "| c #b56b00", " . c #bd6b00", ".. c #b56b10", "X. c #b57300", "o. c #bd7300", "O. c #bd7310", "+. c #ad7b39", "@. c #b57b29", "#. c #bd7b31", "$. c #c66b00", "%. c #c67300", "&. c #ce7300", "*. c #c67b18", "=. c #ce7b10", "-. c #d67b00", ";. c #bd8429", ":. c #b58442", ">. c #bd8c42", ",. c #ad946b", "<. c #b58c63", "1. c #b59c7b", "2. c #bd9c73", "3. c #bd9c7b", "4. c #bda57b", "5. c #c68418", "6. c #d68400", "7. c #de8400", "8. c #de8c08", "9. c #d68c18", "0. c #de8c18", "q. c #de9418", "w. c #c68421", "e. c #de8c21", "r. c #de9429", "t. c #d69431", "y. c #d69439", "u. c #de9c39", "i. c #e78c08", "p. c #e78c18", "a. c #e79418", "s. c #f79c08", "d. c #e79c21", "f. c #e79c29", "g. c #f7a518", "h. c #ffa510", "j. c #ffad18", "k. c #e7a539", "l. c #f7a521", "z. c #ffad21", "x. c #f7a531", "c. c #f7ad31", "v. c #ffb531", "b. c #ffb539", "n. c #c6944a", "m. c #ce944a", "M. c #de9c42", "N. c #c6a57b", "B. c #cead73", "V. c #cead7b", "C. c #e7ad4a", "Z. c #f7b542", "A. c #ffb542", "S. c #ffbd4a", "D. c #f7bd52", "F. c #ffbd52", "G. c #ffbd5a", "H. c #e7b573", "J. c #efbd73", "K. c #f7bd63", "L. c #ffc65a", "P. c #f7c66b", "I. c #ffc663", "U. c #ffc66b", "Y. c #ffc673", "T. c #ffce7b", "R. c #8cceef", "E. c #84def7", "W. c #94deef", "Q. c #94d6f7", "!. c #8ce7ff", "~. c #94e7ff", "^. c #9cefff", "/. c #a5e7ff", "(. c #a5efff", "). c #ade7ff", "_. c #b5efff", "`. c #d6bda5", "'. c #d6c6ad", "]. c #d6c6b5", "[. c #deceb5", "{. c #ffce84", "}. c #ffd68c", "|. c #ffd694", " X c #e7d6bd", ".X c #ffdea5", "XX c #e7dece", "oX c #efe7de", "OX c #ffe7c6", "+X c None", /* pixels */ "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X9 2 +X", "+X+X+X+X+X+X+X+X+X+X+X+X+X+XR _.U % # @ X X + O o = . +X", "+X+X+X+X+X+X+X+X+X: : . . o K _.E q w t r y y r y r e r r . O +X", "+X+X+X+X. O + = : : w w t i W _.E y r r y y y r r e e r r . O +X", "+X+X+X4 * y r r y r r r y u E._.Q r y Z _.i y e e e e e r . $ +X", "+X+X+X4 * y r r y r r y r s /._.Q.y y E _.s r e e e e r r . $ +X", "+X+X+X4 * r r r y y y r y h )._.Q.r r Q._.j r e e e e r r . % +X", "+X+X+X4 - y y r r r r r y S (._.!.i r W._.A r e e e r r r . 1 +X", "+X+X+X4 - y y r r h s r r S _.Y _.i u ~._.K u r r r u u u . 1 +X", "+X+X+X4 - y y r u _.Y r r Y _.Y _.u a _./.R u i i u u i u . 2 +X", "+X+X+X4 - y r r a _.(.u r E _.I _.a h _.W.E.a i u u i i u . 3 +X", "+X+X+X4 * y y r j _._.j u E._.K _.a c _.T _.j i i u i s a . 4 +X", "+X+X+X5 * y y u L _._.G a _._.H _.s G _.F _.D s k j c D S J E Q ", "+X+X+X4 - y r u W _.!.T j _.S S _.j H _.V _.F Y W./._._._.(.+X+X", "+X+X+X5 ; u i k _.P Y W.D _.A G _.M P _.M _.Y _.R F H C v > 6 +X", "+X+X+XJ C K Y Q _.A H (.P _.c G _.C R Q g _._._.A f g g f o 4 +X", "+X+X XV.w.[ E.:.| N.c /.E._.k D _.D _.Y g T _.).M d f g f o 4 +X", "W W O.I.F.b.n.8.s.i./ ^.(.W.g D _.H _.U d U _.^.v f f x l o 4 +X", "+X+X) F.A.v.l.z.h.h.) `.'.T f A _.U _.F f F _.E v l v x x o 4 +X", "m.y...Z.A.c.r.f.l.h.o.6.6.`.f Z _.P _.D x Z _.U v v v v v o 4 +X", "H.}.I.G.u.` ._ ' q.h.h.s.6.'.C _.T _.B x b _.B v x x B b O 4 +X", "Y.T.U.I.) .&.&.$./ q.h.s.6.3.C _.Q._.M B B b b b b b B b O 4 +X", "-.e.U.I.:.[.[.2.] ( { j.i./ <.B _.~._.b b b b B v m m A m O 4 +X", ">._ K.Y.;.oX+X+XoX! ] z.g.s._ B _.~._.n b m A m m m m N n O 4 +X", "B.M.OX{.P.>.4.].].< r.v.z.g.X.m _.).Q.m A m m N N J J J E O 4 +X", "-.a..X}.P.P.C.t.t.k.S.x.9.a.@.N _._.T N N N J n E n E n n . 4 +X", "%.7.p.*.5.|.Y.I.L.G.L.G.| ~ '.z Q _.I 0 , ; o X . . % & 2 8 +X", "`.%.#.`.` .X|.T.D.x.{.{.e.,.. ; P _.E 7 +X+X+X+X+X+X+X+X+X+X+X+X", "+X'.+XXX_ d.K.J.@.-.0.=.} 1.+X+XR._.+Xp +X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X4.%.7.7.| '.+.&./ ^ +X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X+X3.+./ +.+X+X1.].+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X" }; aMule-2.3.1/src/utils/wxCas/src/0000755000175000017470000000000011657306264015301 5ustar topiusersaMule-2.3.1/src/utils/wxCas/src/linuxmon.cpp0000644000175000017470000000553211575347521017663 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: LinuxMon Class /// /// Purpose: Monitor Linux system by reading /proc file system /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "linuxmon.h" #include #include // Constants const wxFileName LinuxMon::UPTIME_FILE ( wxT( "/proc/uptime" ) ); const wxFileName LinuxMon::LOADAVG_FILE ( wxT( "/proc/loadavg" ) ); // Constructors LinuxMon::LinuxMon () { Refresh (); } // Destructor LinuxMon::~LinuxMon () {} // Refresh void LinuxMon::Refresh () { wxFileInputStream upInput ( UPTIME_FILE.GetFullPath () ); wxFileInputStream loadInput ( LOADAVG_FILE.GetFullPath () ); wxTextInputStream upText ( upInput ); wxTextInputStream loadText ( loadInput ); loadText >> m_sysLoad_1; loadText >> m_sysLoad_5; loadText >> m_sysLoad_15; double uptime; upText >> uptime; wxInt32 day, hour, min, sec; day = ( wxInt32 ) ( uptime / 86400 ); hour = ( wxInt32 ) ( ( uptime - day * 86400 ) / 3600 ); min = ( wxInt32 ) ( ( uptime - day * 86400 - hour * 3600 ) / 60 ); sec = ( wxInt32 ) ( uptime - day * 86400 - hour * 3600 - min * 60 ); m_uptime = m_uptime.Format ( _( "%i day(s) %i hour(s) %i min %i s" ), day, hour, min, sec ); } // Accessors wxString LinuxMon::GetUptime () const { return m_uptime; } wxString LinuxMon::GetSysLoad_1 () const { return m_sysLoad_1; } wxString LinuxMon::GetSysLoad_5 () const { return m_sysLoad_5; } wxString LinuxMon::GetSysLoad_15 () const { return m_sysLoad_15; } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcaspix.cpp0000644000175000017470000061065511575347521017670 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasPix Class /// /// Purpose: wxCas main frame /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wxcaspix.h" wxBitmap WxCasPix::getPixmap( const wxString& name ) { if ( name == wxT( "about" ) ) { wxBitmap bitmap( m_about_xpm ); return bitmap; } else if ( name == wxT( "prefs" ) ) { wxBitmap bitmap( m_prefs_xpm ); return bitmap; } else if ( name == wxT( "print" ) ) { wxBitmap bitmap( m_print_xpm ); return bitmap; } else if ( name == wxT( "refresh" ) ) { wxBitmap bitmap( m_refresh_xpm ); return bitmap; } else if ( name == wxT( "save" ) ) { wxBitmap bitmap( m_save_xpm ); return bitmap; } else if ( name == wxT( "stat" ) ) { wxBitmap bitmap( m_stat_xpm ); return bitmap; } else if ( name == wxT( "stop" ) ) { wxBitmap bitmap( m_stop_xpm ); return bitmap; #ifndef __WXMSW__ } else if ( name == wxT( "wxcas" ) ) { wxBitmap bitmap( m_wxcas_xpm ); return bitmap; #endif } else { return wxNullBitmap; } } const char * WxCasPix::m_about_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 179 2", " c None", ". c #0c0b0a", "X c #32373e", "o c #3f3330", "O c #002e66", "+ c #00306a", "@ c #003573", "# c #003778", "$ c #00397c", "% c #5a2d12", "& c #45312a", "* c #642909", "= c #682b09", "- c #6f310d", "; c #74360f", ": c #7a3b12", "> c #7c4d2d", ", c #48494c", "< c #7e5e50", "1 c #675b63", "2 c #696c6f", "3 c #003c84", "4 c #003f89", "5 c #00408b", "6 c #0a4083", "7 c #014499", "8 c #114d9c", "9 c #18529c", "0 c #054eb0", "q c #0d51a5", "w c #1558a7", "e c #1857b1", "r c #1b65ae", "t c #23558d", "y c #245f9f", "u c #34659b", "i c #276bb8", "p c #3f6ea2", "a c #0657c6", "s c #1462d2", "d c #256cd0", "f c #2774c4", "g c #2d70cd", "h c #2f76d7", "j c #2171e8", "k c #357fe6", "l c #3b95db", "z c #2f82f0", "x c #3a80e6", "c c #3a85e8", "v c #3e89ed", "b c #3684f1", "n c #5185bf", "m c #4182c7", "M c #4997d8", "N c #4289ec", "B c #4389f2", "V c #4490f2", "C c #4e94f2", "Z c #5a9df3", "A c #54afed", "S c #5ba4e1", "D c #71a6da", "F c #63a3f6", "G c #67a9f8", "H c #6ca9f7", "J c #6daaf8", "K c #79aee9", "L c #75b8ee", "P c #76b1f7", "I c #77b2f9", "U c #75bcf3", "Y c #7bb4f9", "T c #7fbdf9", "R c #74c2fa", "E c #7dc6fa", "W c #833f14", "Q c #bf2b4a", "! c #8f4b1b", "~ c #954f1d", "^ c #97511e", "/ c #9c5622", "( c #a45b24", ") c #a25d29", "_ c #a7602a", "` c #ad6227", "' c #ad6228", "] c #b6692b", "[ c #b86b2c", "{ c #b67038", "} c #bd7031", "| c #867069", " . c #ac4c6f", ".. c #b14062", "X. c #b14a6c", "o. c #c73351", "O. c #ca3f5c", "+. c #c0712f", "@. c #c67530", "#. c #c37a31", "$. c #c07a3c", "%. c #ca7b38", "&. c #cc5773", "*. c #c7627f", "=. c #a35d82", "-. c #b67698", ";. c #ce6d87", ":. c #b68b67", ">. c #cd8838", ",. c #e49c3f", "<. c #ce8240", "1. c #cf874a", "2. c #d38c4d", "3. c #d89c47", "4. c #d69658", "5. c #d99b62", "6. c #dca25c", "7. c #daa16c", "8. c #e0ae7d", "9. c #838186", "0. c #9a9794", "q. c #8192af", "w. c #ac98bb", "e. c #b58fb1", "r. c #a0a09f", "t. c #b4b4b0", "y. c #92b2d8", "u. c #83baf9", "i. c #8abffb", "p. c #abb3db", "a. c #b5afd1", "s. c #b4b7da", "d. c #83c9fb", "f. c #8bc3fc", "g. c #9bc4e8", "h. c #93c4fb", "j. c #95ccfb", "k. c #9dccfc", "l. c #9cd1fb", "z. c #a0cefd", "x. c #a4d1fe", "c. c #afd5f3", "v. c #abd5fd", "b. c #b7cdee", "n. c #b7d4f5", "m. c #b4d9f7", "M. c #b4dbfe", "N. c #b9defe", "B. c #bde1fe", "V. c #d487a0", "C. c #d49db4", "Z. c #d1b28b", "A. c #d1a7be", "S. c #e4b785", "D. c #d0b4cb", "F. c #d1bad0", "G. c #e2bdcd", "H. c #edcfa7", "J. c #cac8c2", "K. c #d4cdc2", "L. c #dfdbd6", "P. c #cad3ea", "I. c #c4e4ff", "U. c #c9e7ff", "Y. c #cae8ff", "T. c #d3ecfe", "R. c #dbf0ff", "E. c #e2c9d9", "W. c #e2d4e2", "Q. c #f6e7da", "!. c #e7e7e5", "~. c #e2e1ef", "^. c #e3f3ff", "/. c #eaf6ff", "(. c #eef8ff", "). c #f1f1ef", "_. c #f2f9ff", "`. c #fdfdfe", "'. c None", /* pixels */ "'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.", "'.'.'.'.'.'.'.'.'.'.'.4 3 3 $ $ $ $ $ $ $ '.'.'.'.'.'.'.'.'.'.'.", "'.'.'.'.'.'.'.'.3 3 3 w l A R d.d.d.U D y # @ @ '.'.'.'.'.'.'.'.", "'.'.'.'.'.'.4 4 r M U j.l.B.N.B.B.N.B.m.c.g.D u @ @ '.'.'.'.'.'.", "'.'.'.'.4 4 f M d.N.T./.`.`.`.`.`.`.`.`.`.(.T.B.y.p @ + '.'.'.'.", "'.'.'.4 w l R M.T.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.R.I.y.t + '.'.'.", "'.'.4 i l R M.`.`.`._.^.^.W.W.W.W.W.^.^.^._._.`.`.T.B.g.p + '.'.", "'.4 r l E B.`.(.^.^.^.^.^.E.G.G.G.E.^.^.^.^.^.^._.`.R.M.D t + '.", "'.5 m R N.`.^.T.T.T.T.T.T.A.C.C.C.F.R.R.R.R.R.^.^.^.`.T.z.n + '.", "5 i S M./._.T.T.T.T.T.T.T.A.V.V.V.D.T.R.T.T.T.T.R.^././.M.K 9 + ", "4 m d.N._.T.T.T.Y.Y.Y.Y.Y.A.;.;.;.D.Y.Y.Y.Y.Y.Y.T.Y.^._.M.i.i O ", "4 S j.N._.U.I.U.Y.Y.Y.Y.Y.F.&.&.&.P.Y.Y.Y.Y.Y.Y.Y.T.Y._.v.u.m + ", "4 L k.M.(.I.I.I.Y.Y.Y.Y.U.P.O.O.O.Y.U.U.U.U.U.I.I.I.I./.v.P c O ", "4 S x.v.Y.B.B.I.I.I.I.I.I.I.*.o.*.Y.I.U.I.I.I.I.I.I.N.Y.i.F k O ", "4 n k.x.B.M.M.N.B.B.B.B.B.B.-.Q -.B.B.B.B.B.I.I.N.I.I.B.Y C d O ", "4 y D x.M.N.N.N.M.< * * * B.a.e.a.B.B.B.B.N.N.B.N.N.N.x.H N 8 + ", "'.3 l * * * B.< ; { 6.: | N.n.e.b.N.M.B.N.N.N.B.B.N.N.i.Z h O '.", "'.# * 2.* k.* [ S.5.) ; y.a..... .s.M.M.N.N.N.N.B.v.h.Z v 8 O '.", "'.* @.] * ; H.S.7.>.; | v.e. . . .a.M.B.N.N.N.M.v.h.Z B g O '.'.", "'.* ] ; <.8.4.2.) % =.z.z.a.=.=.-.s.x.v.N.N.N.v.j.C k g 9 + '.'.", "* * ! <.2.>.' * 1 D K h.f.f.p.w.p.f.h.x.M.v.M.T F N i 8 O '.'.'.", "'.* ~ [ ` ` : / * i c F G H H H H H I f.x.v.u.C N e 3 + '.'.'.'.", "* * ( [ @.% 8.H.{ * @ 8 s j b b b B F I f.i.C k w O + '.'.'.'.'.", "'.* [ } @.7._.L.. ! = & X X @ + @ 7 a F u.F j w + '.'.'.'.'.'.'.", "* - @.<.@.2.Q.0.X ) Z.L.).t.X '.'.+ 7 s Z b w + '.'.'.'.'.'.'.'.", "* ~ 2.6.4.%.1.4.%.%.Z.2 . `.t.X '.'.+ a b a O '.'.'.'.'.'.'.'.'.", "* ` 2.H.8.2.%.] ) $.t.t.r.).!.X '.'.+ a s + '.'.'.'.'.'.'.'.'.'.", "* ~ <.5.7.2.%.[ ` { K.!.`.).).X '.'.+ 0 + '.'.'.'.'.'.'.'.'.'.'.", "* - ] <.>.3.@.[ ( :.J.L.!.).!.X '.'.O + '.'.'.'.'.'.'.'.'.'.'.'.", "* : * ) ( ( ( / > r.J.2 J.L.9.X '.'.+ '.'.'.'.'.'.'.'.'.'.'.'.'.", "- ! / W = * % & X 2 0.t., X X '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.", "- ! #.,.<.' * '.'.X X X X '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'." }; const char * WxCasPix::m_prefs_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 100 2", " c None", ". c #9A5600", "+ c #945300", "@ c #904F00", "# c #8B4C00", "$ c #DC9124", "% c #FFC463", "& c #FBB648", "* c #B66A01", "= c #E3900B", "- c #C17101", "; c #8F5000", "> c #C47A14", ", c #F4B54F", "' c #FFCA72", ") c #FEBB4B", "! c #FFB63C", "~ c #EFAE45", "{ c #EC950C", "] c #F59D0B", "^ c #FBA10D", "/ c #BF7204", "( c #824800", "_ c #9D5800", ": c #F1AF49", "< c #FFC15C", "[ c #FFC055", "} c #F1AB3A", "| c #FFB233", "1 c #FCA512", "2 c #F39C1C", "3 c #E39321", "4 c #FFB02B", "5 c #FFAF28", "6 c #FFAC22", "7 c #FEAA1B", "8 c #DF8C0B", "9 c #7A4400", "0 c #FFB027", "a c #FEA816", "b c #CE8009", "c c #6E3D00", "d c #E49929", "e c #FFB843", "f c #D48006", "g c #FFC86E", "h c #D9871D", "i c #B96400", "j c #F4AD43", "k c #DE9B30", "l c #E79107", "m c #FFE5BC", "n c #FFD897", "o c #FFD082", "p c #FFBE53", "q c #C98B31", "r c #B1751B", "s c #E38D09", "t c #D19036", "u c #FFD899", "v c #FABD5B", "w c #AB7326", "x c #D97E00", "y c #D47900", "z c #CB7300", "A c #AC6300", "B c #BA7C1F", "C c #FFE0AC", "D c #FEC669", "E c #B36400", "F c #DD8000", "G c #EC8F0A", "H c #754100", "I c #FEC770", "J c #FFCD7A", "K c #C36B00", "L c #A45B00", "M c #B67B29", "N c #A85D00", "O c #FFD38B", "P c #DAA14A", "Q c #B26D0C", "R c #B98131", "S c #703F00", "T c #C38322", "U c #FFF3DF", "V c #FFFFFF", "W c #DEA751", "X c #A7650D", "Y c #FFDBA1", "Z c #E18E1D", "` c #EA9A24", " . c #F2A52D", ".. c #E1901D", "+. c #D07B0B", "@. c #E3952B", "#. c #D98414", "$. c #FFE3B3", "%. c #E88903", "&. c #9B600D", " ", " . + + + @ @ # ", " . . . $ % & + + * = - # ; ", " . > , ' % ) ! ~ + ; { ] ^ { / # ( ", " _ : < % [ ! } | ~ ; = 1 1 ] ] 2 = # ", " . 3 [ [ ) ! ! 4 5 / 6 7 1 ] ^ ] 8 9 ", " . . [ [ ! ! | | 4 0 6 6 a 1 ^ ^ b c ( 9 ", " . _ . ; 9 d [ e ! ! | | 4 5 6 6 a a 1 / c ( * f 9 ", " _ } g } h i j ) ) e ! } k k k } 6 7 a 1 { * l ^ ^ 8 9 ", " _ m n o o % p p ) ) q ; ; ; # # r k 7 7 a ^ ^ ^ ] ] s 9 ", " . t m u o % v < [ p w ; * x y z A ; ; B 7 a 1 1 ^ ^ ^ ] f 9 ", " . u C o o D % v < q # E z x F x y z E + B 7 a 1 ^ ^ ^ ] G H ", " . I u o o D D % < _ * z x x F F x z z i ( B 7 a 1 ^ ^ ] z 9 ", ". F F 2 & J g D % % _ ; # # # ( 9 _ E K i _ ( } a a ^ { E # H ", ". F F y K 2 J J D % _ 9 9 _ E L 9 k 7 7 = E # ( H ", ". + K y K L G J g D M _ H _ L 9 k 6 7 1 ^ { f E H ", " + + K N 2 O J D P . c _ c k 6 6 7 1 ] ] ] H ", " + Q m u o J ' R _ c # c } 0 6 6 a a ] ] S ", " + T o U u n J J g R ( 9 c c B | | | 5 7 a a ^ H ", " + x 2 O V m u O J J ' W w 9 9 H 9 c c X ! | | | | | | 6 a S ", " + x F F 2 Y U u u o J g D D } k k k k } [ [ [ ! Z 3 ` . .^ S ", " + F F F F 2 Y C ) ..J o g D % % v [ [ [ ) [ [ p Z _ E K y c ", " + * x F F F 2 ..i + .u o J D % < < [ [ [ [ [ % j K + _ i S ", " @ F F F F z i 9 + 3 C u o J ' % D D % % % % % O 3 K c c ", " # F F z # # ( +.m u u O J ' I [ .I o O O o e @.c ", " # E # 9 +.O m m u u O ' +.x { [ m Y v #.E c ", " # ( y l ) o m m $.O i F F %. .Z z i i H ", " ( . x F F x G 2 B 9 9 z F F i i i i L c ", " ( A F F F F F F &.9 H x F K i i + c ", " ( - F F F F F F 9 H F z N c c ", " 9 9 9 A / z y H c H c ", " 9 9 9 H " }; const char * WxCasPix::m_print_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 152 2", " c None", ". c #0c0b0a", "X c #32373e", "o c #303941", "O c #1f4d2a", "+ c #2c6c3b", "@ c #36414a", "# c #39434d", "$ c #3c4752", "% c #346246", "& c #5d2d0e", "* c #642909", "= c #6e310c", "- c #7f3e13", "; c #723c44", ": c #414041", "> c #414d58", ", c #43505b", "< c #475460", "1 c #485663", "2 c #4b5865", "3 c #4e5c6a", "4 c #505a65", "5 c #555f6a", "6 c #52606e", "7 c #5b646d", "8 c #566675", "9 c #576877", "0 c #586876", "q c #5b6b7b", "w c #6b6c6f", "e c #606f7d", "r c #62717d", "t c #727476", "y c #5e6f80", "u c #5e7080", "i c #637382", "p c #647788", "a c #657889", "s c #687784", "d c #6a7986", "f c #6d7c8b", "g c #6b7e91", "h c #747b82", "j c #727f8a", "k c #21a72c", "l c #378346", "z c #15c61d", "x c green", "c c #33e23a", "v c #429c55", "b c #47a55d", "n c #41ff41", "m c #6d8295", "M c #74828f", "N c #758491", "B c #708498", "V c #7b8792", "C c #7e8c99", "Z c #7fb79a", "A c #76c493", "S c #79c697", "D c #813f12", "F c #a1282d", "G c #804017", "H c #86451b", "J c #8e4a1a", "K c #954f1d", "L c #9a531e", "P c #a65d24", "I c #ab6228", "U c #b4682c", "Y c #bc6e2d", "T c #bf7732", "R c #a4734c", "E c red", "W c #c1742d", "Q c #c77835", "! c #ca4f55", "~ c #ce8240", "^ c #c18c57", "/ c #cc914e", "( c #d28a4a", ") c #d69556", "_ c #d99a5c", "` c #dfaa6e", "' c #deaa7d", "] c #878f98", "[ c #86929e", "{ c #8b939c", "} c #90979f", "| c #8694a1", " . c #8a96a1", ".. c #8d98a4", "X. c #939ba2", "o. c #939ea9", "O. c #86ae9e", "+. c #88bda3", "@. c #96a2ae", "#. c #9aa3ad", "$. c #97a4b0", "%. c #9aa6b2", "&. c #9ca9b4", "*. c #97b3af", "=. c #a0a09f", "-. c #a0a7ae", ";. c #a7a8a4", ":. c #a2abb4", ">. c #a3aeb8", ",. c #a8aeb4", "<. c #a6b1bc", "1. c #aab1b7", "2. c #abb3bb", "3. c #b2b8bd", "4. c #aab5c1", "5. c #acb8c4", "6. c #b3bbc3", "7. c #b1bdc8", "8. c #8dcea7", "9. c #8ecfa9", "0. c #a2c3b9", "q. c #b7c0ca", "w. c #bac3cc", "e. c #bdc7d1", "r. c #bec8d2", "t. c #c3aa90", "y. c #dfae85", "u. c #e9c38f", "i. c #e6d2ba", "p. c #f2dcaf", "a. c #c5c5c1", "s. c #c1c7cd", "d. c #c2cad3", "f. c #c9ced3", "g. c #ccd1d6", "h. c #cdd4da", "j. c #d2d7dc", "k. c #d2d9df", "l. c #d8dbdf", "z. c #d4dbe1", "x. c #dadee3", "c. c #d8e0e7", "v. c #dfe4e8", "b. c #e5e5e2", "n. c #e3e6ea", "m. c #e7eaee", "M. c #ececea", "N. c #eceff2", "B. c #edf0f3", "V. c #f0f2f5", "C. c white", "Z. c None", /* pixels */ "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.3 3 3 2 2 2 Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", "Z.Z.Z.Z.Z.Z.Z.Z.8 8 0 0 e r r 0 8 , , , > > Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.", "Z.Z.Z.Z.Z.8 8 8 r s s s s r r r r r r r 0 3 , $ , # # Z.Z.Z.Z.Z.", "Z.Z.8 8 8 r s s s s s s s s s s s s r r r r e e r r # Z.Z.Z.Z.Z.", "8 8 i d f f f f f f f d s s s s s s s s s s s s q i # Z.Z.Z.Z.Z.", "8 5.%.| C j f f f f j f f f f f d s s s s s e 9 a m # Z.Z.Z.Z.Z.", "8 r.c.c.z.w.>. .M f f f f f f f f f f s e 9 9 u m m # Z.Z.Z.Z.Z.", "8 r.N.C.V.m.x.k.d.q.%.| N i f d d d q 8 8 8 y m m m o Z.Z.Z.Z.Z.", "8 r.C.C.C.m.l.k.h.r.w.7.5.q f r C | 8 8 8 9 g B m m o Z.Z.Z.Z.Z.", "8 w.N.C.N.m.l.k.k.d.w.7.5.6 f 6 7.&.6 8 8 a m m m m o Z.Z.Z.Z.Z.", "8 7.n.C.m.m.z.k.k.r.w.7.5.3 M 3 z.&.3 8 y g g g B p o Z.Z.Z.Z.Z.", "8 4.x.N.v.v.k.z.h.r.w.5.5.2 M 2 k.%.2 9 a g g g f 8 o Z.Z.Z.Z.Z.", "8 4.x.j <.v.z.z.h.r.w.5.4.1 j 1 h.%.< y a a a g q 9 o Z.Z.Z.Z.Z.", "8 4.x.N.s.r X.k.<.d.q.5.<.1 N 1 r.%.< y p u a y 8 u o Z.Z.Z.Z.Z.", "8 <.x.5 X.n.2.4 [ r.7.4.<., N > 7.$.> y u u u * q m o Z.Z.Z.Z.Z.", "8 >.x.V.3.5 X.j.<.w.7.4.<., j , 4.@.> q q r * * a m X Z.Z.Z.Z.Z.", "8 >.x.$ o.x.2.4 { s.5.<.&., j , 4.@., 0 0 * * G g * * * * * * * ", "8 :.v.M.3.> X.j.,.w.5.,.*.% b + 0.o., 0 0 * Y - * p.u.` ~ I * Z.", "8 &.l.> } x.2.$ { q.5.<.+.+ v + 9.o.> 8 * G P * p.` ) Y * * Z.Z.", "8 &.x.N.3.$ X.g.:.w.2.,.S + c k 9.o., 8 * J ~ ` ) K * * Z.Z.Z.Z.", "8 $.x.$ X.x.2.$ ] 6.<.:.A + n z 9...> 8 * Q Y P H * o Z.Z.Z.Z.Z.", "0 @.x.m.3.$ } g.:.6.2.:.A + x z 9..., * * Y Y & ' R G * Z.Z.Z.Z.", "5 o.x.$ X.l.3.# ] 7.2.&.Z + l O 8. ., 8 * Q Y y.C.. R I X X X Z.", "6 o.l.n.2.> } f.-.6.,.&.O.% b + 0. ., * * ( _ _ M.: T / i.C.a.X ", "3 ..l.$ X.l.1.# ] 6.<.#.@.> ! ; 2. ., 8 * ` p.` _ U T ^ w . C.X ", "3 ] 7.l.l.> } f.-.6.<.#.o.> E F 2. ., * = _ ` ` ( U P t.a.=.M.X ", "3 s o.7.f.f.j.> ] 6.,.#.o.> E F <. .> * = P ( ( Q I P t.b.b.b.X ", "Z.3 8 r h 1.s.f.s.6.>.#.o., 7 o <.{ , * D * * * * * t =.;.;.X Z.", "Z.Z.Z.1 1 < i C :.,.-.#.#., r , 2..., * J I P - * Z.X X X X Z.Z.", "Z.Z.Z.Z.Z.Z.> > $ $ , 7 h , r > V M # * J W W L * Z.Z.Z.Z.Z.Z.Z.", "Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.# @ @ X o o X o o Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z." }; const char * WxCasPix::m_refresh_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 117 2", " c None", ". c #1c203a", "X c #1e2252", "o c #1e3249", "O c #143959", "+ c #0c3c62", "@ c #242840", "# c #213d5c", "$ c #353541", "% c #34394c", "& c #383e4f", "* c #3d3e78", "= c #0d4758", "- c #04406c", "; c #044777", ": c #01556d", "> c #09566b", ", c #056078", "< c #444451", "1 c #4a4a5d", "2 c #4c4c61", "3 c #515161", "4 c #5c5c6d", "5 c #53537e", "6 c #5f5f70", "7 c #636365", "8 c gray42", "9 c #636377", "0 c #727272", "q c #3e3e8f", "w c #014f85", "e c #01528a", "r c #025691", "t c #0a5fae", "y c #016495", "u c #01649b", "i c #01708d", "p c #0168af", "a c #016bb4", "s c #0175a2", "d c #017ca4", "f c #0173ba", "g c #127bb3", "h c #017bc0", "j c #6c7698", "k c #018bb9", "l c #0192bc", "z c #0589ca", "x c #019ac5", "c c #0192d2", "v c #0299d7", "b c #019bd9", "n c #0e94d2", "m c #089bd8", "M c #1b91cd", "N c #1898d2", "B c #01a3cf", "V c #00a5d5", "C c #02a1dd", "Z c #1aa4db", "A c #01a5e0", "S c #01aae4", "D c #01aee8", "F c #0daee5", "G c #01b1e2", "H c #01b3eb", "J c #02b8ef", "K c #0cb0e7", "L c #09b4eb", "P c #01bcf2", "I c #10aae1", "U c #1eabe0", "Y c #12b3e9", "T c #19b3e7", "R c #2597c5", "E c #2398d1", "W c #27abdf", "Q c #36a8db", "! c #21b3e7", "~ c #23b7e9", "^ c #2fb2e3", "/ c #2dbaea", "( c #38afe0", ") c #39bbe8", "_ c #01c1f5", "` c #01c3f8", "' c #45aedb", "] c #48bae5", "[ c #77bed4", "{ c #4bc5ed", "} c #4bd0f5", "| c #59c6ec", " . c #5fd6f7", ".. c #78c0d4", "X. c #65c9ec", "o. c #6dcef0", "O. c #6bd4f4", "+. c #75cfef", "@. c #77d5f4", "#. c #8dcdec", "$. c #85daf6", "%. c #96d8e9", "&. c #93d3f3", "*. c #97ddf1", "=. c #84e2fb", "-. c #8be3fb", ";. c #8de8fe", ":. c #92e4fb", ">. c #92e8fd", ",. c #9ceafe", "<. c #a0e7fc", "1. c #a6ecfe", "2. c #a8e3f8", "3. c #abebfd", "4. c #b7edfc", "5. c #b9f0fe", "6. c None", /* pixels */ "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.0 1 6.", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.X.5.} % # @ X X + O o = . 6.", "6.6.6.6.6.6.6.6.6.: : . . o ' 5.O.t i s a d d a d a p a a . O 6.", "6.6.6.6.. O + = : : i i s h o.5.O.d a a d d d a a p p a a . O 6.", "6.6.6.3 * d a a d a a a d f $.5.@.a d E 5.h d p p p p p a . $ 6.", "6.6.6.3 * d a a d a a d a z <.5.&.d d O.5.z a p p p p a a . $ 6.", "6.6.6.3 * a a a d d d a d n 3.5.&.a a &.5.m a p p p p a a . % 6.", "6.6.6.3 - d d a a a a a d Q 1.5.-.h a *.5.W a p p p a a a . < 6.", "6.6.6.3 - d d a a n z a a ^ 5.| 5.h f :.5.' f a a a f f f . < 6.", "6.6.6.3 - d d a f 5.| a a | 5.| 5.f l 5.2.X.f h h f f h f . 1 6.", "6.6.6.3 - d a a l 5.1.f a O.5.{ 5.l n 5.*.$.l h f f h h f . 2 6.", "6.6.6.3 * d d a m 5.5.m f =.5.' 5.l Z 5. .5.m h h f h z l . 3 6.", "6.6.6.4 * d d f ] 4.5.( l 5.5.) 5.z ( 5./ 5.! z M m Z ! ^ ` O.@.", "6.6.6.3 - d a f +.5.;. .m 5.^ ^ 5.m ) 5.T 5./ | *.<.5.5.5.1.6.6.", "6.6.6.4 ; f h N 5.[ | %.~ 5.W ( 5.L ..5.L 5.| 5.X./ ) R S > 5 6.", "6.6.6.` R ' | @.5.W ) 1.[ 5.Z ( 5.R X.@.v 5.5.5.W c b b c o 3 6.", "6.6.1.1.5.5.$.O.{ z Z 2.=.5.N ! 5.~ 5.| b .5.3.L x c b c o 3 6.", "o.o.J _ g N M c l l v ,.1.%.b ! 5.) 5.} x } 5.,.S c c C B o 3 6.", "6.6.6.3 w z z z z z b =.5. .c U 5.} 5./ c / 5.O.S B D A A o 3 6.", "6.6.6.4 q z b b c c c [ 5.[ c E 5.[ 5.~ C E 5.} S S S S S o 3 6.", "6.6.6.3 : c b c x x c / 5.) C R 5. .5.Y A H 5.Y S A A K H O 3 6.", "6.6.6.3 e v b c c c c R 5.L A R 5.&.5.L F F H H H H H K H O 3 6.", "6.6.6.3 t c C B B B D D 5.S F I 5.>.5.H H H H K G P P U P O 3 6.", "6.6.6.7 i B A D A S S S S S A I 5.:.5.J H P U P P P P _ J O 3 6.", "6.6.6.5 r S S F F D K H H K H P 5.3.&.P U P P _ _ ` ` ` O.O 3 6.", "6.6.6.3 u A A H H H H H K P P _ 5.5. ._ _ _ ` J O.J O.J J . 3 6.", "6.6.6.6 u H H H G P P P G G Z V @.5.{ r , ; o X . . % & 1 9 6.", "6.6.6.6 y P H x k a r : ; o . ; ..5.O.8 6.6.6.6.6.6.6.6.6.6.6.6.", "6.6.6.6.. . X < 7 0 6.6.6.6.6.6.#.5.6.j 6.6.6.6.6.6.6.6.6.6.6.6.", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6." }; const char * WxCasPix::m_save_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 134 2", " c None", ". c #093d5c", "X c #2d440a", "o c #344f0c", "O c #36520c", "+ c #3c5b0d", "@ c #0b446b", "# c #0b4771", "$ c #0c4c79", "% c #6d0000", "& c #770303", "* c #7c0405", "= c #41630e", "- c #45690f", "; c #476b10", ": c #486d10", "> c #4b7310", ", c #527c12", "< c #094e84", "1 c #0e568d", "2 c #075090", "3 c #0b5fa0", "4 c #135fa1", "5 c #12619e", "6 c #126aae", "7 c #1370b8", "8 c #317abd", "9 c #1479c6", "0 c #568313", "q c #598714", "w c #5c8c14", "e c #5f9115", "r c #629516", "t c #679c17", "y c #689e17", "u c #6ba217", "i c #6ba318", "p c #71ab19", "a c #76b41a", "s c #78b61a", "d c #7cbd1b", "f c #7fc11c", "g c #248ad6", "h c #3191d9", "j c #3b95d4", "k c #2b9bea", "l c #369ce6", "z c #44a9f3", "x c #57b4f9", "c c #5bb6f8", "v c #6baaec", "b c #65b9f8", "n c #6fbef9", "m c #79afe9", "M c #75b8f3", "N c #77c0f6", "B c #73c1fd", "V c #880506", "C c #8a0609", "Z c #920609", "A c #92080a", "S c #990405", "D c #9b0a0d", "F c #a20a0d", "G c #a40d10", "H c #b50f13", "J c #bc1318", "K c #cb161c", "L c #d31820", "P c #c62d31", "I c #cd3035", "U c #d53f3a", "Y c #e21d26", "T c #ea212a", "R c #f2232d", "E c #f44b53", "W c #f5585f", "Q c #f5656c", "! c #f56d61", "~ c #f66b71", "^ c #f57076", "/ c #81c41c", "( c #85cb1d", ") c #88cf1e", "_ c #8cd41f", "` c #8fd91f", "' c #95e025", "] c #98e12b", "[ c #9be231", "{ c #9fe33a", "} c #a2e43f", "| c #a3e441", " . c #a7e54b", ".. c #ace754", "X. c #aee759", "o. c #b0e85b", "O. c #b5e967", "+. c #b6ea69", "@. c #b8ea6c", "#. c #bbeb73", "$. c #beec7a", "%. c #8dc7fa", "&. c #99cef9", "*. c #afd9fd", "=. c #b5daf9", "-. c #f7878c", ";. c #f88d91", ":. c #f89296", ">. c #f8a3a6", ",. c #c5ee87", "<. c #c6ee8a", "1. c #c8ef8e", "2. c #ccf095", "3. c #cff19d", "4. c #d3f2a4", "5. c #d6f3ab", "6. c #d8f4af", "7. c #daf4b4", "8. c #dff6bd", "9. c #c5e3fb", "0. c #d4eafd", "q. c #fbced0", "w. c #fbd4d5", "e. c #e3f7c6", "r. c #e6f8cb", "t. c #e9f9d2", "y. c #edfad9", "u. c #fde9ea", "i. c #f1fbe3", "p. c #f5fcea", "a. c #f3faff", "s. c #f8fdf1", "d. c white", "f. c None", /* pixels */ "f.f.f.f.f.f.f.2 . f.f.f.f.f.f.f.* V Z Z F F H H f.f.f.f.f.f.f.f.", "f.f.f.f.f.f.2 M 4 . f.f.f.f.f.& A D G J L L Y K H H f.f.f.f.f.f.", "f.f.f.f.f.2 m *.B 4 . f.f.f.% % % % * C G Y Y Y T K H f.f.f.f.f.", "f.f.f.f.2 m 0.9.N x 4 . f.f.f.f.f.f.f.* Z H Y R R R H f.f.f.f.f.", "f.f.f.2 m a.a.0.n l h 4 . f.f.f.f.f.f.% V D R E ^ -.U H f.f.f.f.", "f.f.2 2 2 2 %.0.b g . . . . = + + + + % V S R W -.>.! H f.f.f.f.", "f.f.f.f.f.2 v =.c 9 . > p p p p p p p % V F R W -.w.! H - X X f.", "f.f.f.f.f.2 8 &.z 9 . e i p p p p p p % & F R W -.w.! H 0 e > X ", "f.f.f.f.f.= 2 j k 7 . w t y u u i % % % & F R Q -.d.! H 0 u w X ", "f.f.f.f.f.+ 2 3 6 5 1 . . . . w y % V P I I R ~ ;.d.! H H H H O ", "f.f.f.f.f.+ e 2 < $ # @ . . q r r r % V R W Q ~ :.u.d.d.! H > X ", "f.f.f.f.f.+ > > > > > > 0 r e e e e e % V R Q -.:.q.u.! H > e X ", "f.X X X X X X X X X X + = = > > > > > > % V R :.:.w.! H : w w X ", "+ r ] X.o.o.{ [ _ r = X X X X X X X X + > % V R >.! H - 0 0 0 X ", "+ ] 4.r.p.s.s.s.i.r.5.2.#.X.{ { ' s = X - > % V ! H = 0 0 0 0 X ", "+ f 5.r.r.r.r.t.t.y.p.s.s.s.i.r.7.1.) X O = > % V = > , , , , X ", "f.+ o.4.4.4.4.5.6.8.e.e.e.e.e.e.e.7.,.t X O = - = - - : > > > X ", "f.+ s 1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.$.a X X X X X = - : > > X ", "f.f.+ } #.#.#.#.#.#.#.#.#.#.#.#.#.#.1.3.,.#.#...' w X = - > > X ", "f.f.+ u o.o.o.o.o.o.o.o.o.o.o.o.o.o.@.1.3.r.y.y.6.<.r X = : > X ", "f.f.f.+ ` } } } } | | | | | | | | | ...+.O.+.O.+.+.' X = - : X ", "f.f.f.+ r ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] X + = - X ", "f.f.f.f.O d ' ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ' e X = - X ", "f.f.f.f.O w _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ f X = = X ", "f.f.f.f.f.O a _ ) ) ) ) ) ) ( ) ( ( ( ( ( ( ( ( ( ( ( _ X O = X ", "f.f.f.f.f.O 0 ( _ ) ) ) ) ) ( ( ( ( ( ( ( ( ( ( ( ( ( ) > X = X ", "f.f.f.f.f.f.O p ) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ d X = X ", "f.f.f.f.f.f.O > a _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ X O X ", "f.f.f.f.f.f.f.O , i d ( _ _ _ ` _ _ _ _ _ _ _ _ _ _ _ _ _ 0 X X ", "f.f.f.f.f.f.f.f.o o o o o o o > t p d ( ( ) _ _ _ _ _ _ _ i X X ", "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.: : o O o X X X : e p d / ( w X f.", "f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.= X X X X X X f.f." }; const char * WxCasPix::m_stat_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "630 120 256 2", " c #000000", ". c #090A0A", "X c #151618", "o c #0A1513", "O c #151729", "+ c #0D2E1A", "@ c #183836", "# c #142F2A", "$ c #271434", "% c #3A3B3B", "& c #262C2F", "* c #2E2013", "= c #16354A", "- c #32184D", "; c #263946", ": c #303152", "> c #33356A", ", c #232566", "< c #184638", "1 c #164C2D", "2 c #1A6935", "3 c #325C2C", "4 c #36513A", "5 c #2E4E37", "6 c #3D641D", "7 c #346629", "8 c #2A6F33", "9 c #1E4B19", "0 c #194846", "q c #155649", "w c #135953", "e c #0F4E56", "r c #104770", "t c #176746", "y c #186754", "u c #1A7657", "i c #0E7549", "p c #1B6667", "a c #264647", "s c #265857", "d c #374648", "f c #384655", "g c #2C5150", "h c #394877", "j c #385976", "k c #30536B", "l c #266859", "z c #24775A", "x c #296E4A", "c c #296765", "v c #287765", "b c #396768", "n c #3A6575", "m c #397369", "M c #306F75", "N c #533533", "B c #733112", "V c #72352A", "C c #59221A", "Z c #4D1972", "A c #5A3958", "S c #4D344F", "D c #4E3470", "F c #66355A", "G c #762A49", "H c #772954", "J c #6E324F", "K c #6D366D", "L c #52195A", "P c #4E4337", "I c #75493A", "U c #6E4934", "Y c #615719", "T c #454444", "R c #575559", "E c #514853", "W c #484678", "Q c #44577A", "! c #574766", "~ c #584775", "^ c #54546B", "/ c #565473", "( c #484C68", ") c #4B6B71", "_ c #6A4A4B", "` c #634878", "' c #6C4870", "] c #717274", "[ c #586D50", "{ c #3A3787", "} c #3D1797", "| c #394A84", " . c #385384", ".. c #334B93", "X. c #3650A2", "o. c #34708B", "O. c #22699F", "+. c #1B76C4", "@. c #4D178A", "#. c #4D328D", "$. c #5A37A3", "%. c #721990", "&. c #7C14A7", "*. c #71318E", "=. c #6C31AC", "-. c #773ACB", ";. c #484688", ":. c #474995", ">. c #495497", ",. c #574987", "<. c #594895", "1. c #545687", "2. c #4C558A", "3. c #564CA8", "4. c #486D88", "5. c #4A6FB0", "6. c #654887", "7. c #674B97", "8. c #675289", "9. c #695795", "0. c #794687", "q. c #775194", "w. c #6C4CAB", "e. c #736D8F", "r. c #6C67B1", "t. c #536FCE", "y. c #6D4AC8", "u. c #6C6CCE", "i. c #707AE2", "p. c #5769D1", "a. c #248339", "s. c #239C32", "d. c #078146", "f. c #278451", "g. c #2D826D", "h. c #2EA45F", "j. c #63A433", "k. c #708676", "l. c #5DA25A", "z. c #43FC3F", "x. c #77C236", "c. c #50C41F", "v. c #55D455", "b. c #368789", "n. c #388FB2", "m. c #14A0A6", "M. c #39A6D2", "N. c #2B97CC", "B. c #0ACFEF", "V. c #788788", "C. c #558CA8", "Z. c #4B93CC", "A. c #44A1D1", "S. c #47A4E5", "D. c #7091E6", "F. c #73ABE4", "G. c #6B99D4", "H. c #4CD8B2", "J. c #96173B", "K. c #8A3B17", "L. c #923330", "P. c #A61C3A", "I. c #B9273C", "U. c #AC3038", "Y. c #A6251A", "T. c #971949", "R. c #86244B", "E. c #89385A", "W. c #983A5A", "Q. c #8F2D50", "!. c #973A65", "~. c #893872", "^. c #A11547", "/. c #AE2E49", "(. c #A93A67", "). c #B03970", "_. c #954715", "`. c #914510", "'. c #904930", "]. c #976431", "[. c #AB4E12", "{. c #A94A2A", "}. c #B74B2A", "|. c #B5512C", " X c #AD6E36", ".X c #A37209", "XX c #91474B", "oX c #86467C", "OX c #924470", "+X c #AC4C54", "@X c #B84875", "#X c #B0456C", "$X c #B37846", "%X c #916F59", "&X c #CA3230", "*X c #E03027", "=X c #C8334D", "-X c #C93C77", ";X c #C85332", ":X c #DA6F2C", ">X c #C94F47", ",X c #C44477", " | ..................r r { ....{ r p O.p p p p ..r p ............r ......r | > r > r > r .. .| 2.| | ;.| | | Q h Q 2.h | #.{ #.{ { { { { > #.{ > #.} #.#.<.<.:.$.:.#.$.$.#.#.#.#.$.} $.} } } } } } } } @.} } @.} @.} #.#.} @.} @.@.} } { > @.Z Z Z } Z } Z } @.@.} } &.@.} @.@.@.} &.} &.@.@.%.@.@.@.Z Z Z @.Z Z Z Z @.@.Z Z Z @.Z Z Z Z Z Z Z Z Z Z Z Z Z Z L - L Z L - Z Z L Z - L Z Z #.Z *.#.D *.#.K @.Z #.K @.K #.*.@.Z @.Z @.Z @.Z Z @.%.Z Z %.@.=.$.@.=.$.$.$.=.} -.&.=.} -.-.&.} =.$.=.=.=.=.$.$.$.$.=.=.=.=.y.3.-.p.w.y.r.w.y.y.y.w.y.y.w.y.y.-.y.-.y.-.-.-.-.-.-.=.-.-.$.=.-.-.-.-.y.y.-.y.pX-.y.y.y.y.y.y.sXpXpXpXpXpXpXpXpXwXpXpXpXpXpXr.sXsXfXsXpXfXfXsXsXsXdXpXwXpXdXdXdXwXwXdXdXdXdXwXdXdXdXwX", "H H ~.^.~.T.T.(.).#X).7X).).).).~.).).~.).~.(.Q.Q.!.Q.~.~.Q.!.4XeX~.(.(.).^.(.!.(.!.!.~.(.~.!.~.(.!.(.!.(.K ~.~.~.~.oXK 4X' ~.0.~.*.eXK K eXeXoXoX4X~.eXeXK 4X' ~.oX' 4X~.eX4X' eXeXK oXoXrX' ' K ' K ' eX0.' 0.' eXtXq.0.' K ' ' oX' ~.0.%XoXrXrXoXoXrXOXrXrXuXrXOXrXOXoXoXoXoXrXrXoXoXoXoXq.tXrXrXrXrXoXrXrXrXrXrXrXoX~.' ~.oX~.K ~.~.K ~.H K K K H ~.K H K Z K ' 4XoX0.eXK K ' 4XeXK K oX4XoXeX~.oX*.*.K K *.*.K K *.6.*.*.0.6.*.*.6.D *.~ *.` *.~ *.*.~ 6.D K *.*.K ` *.*.K K K 6.<.6.6.,.1.,.6.D ~ *.~ ~ *.~ *.~ D ~ #.W W W W D W D ;.;.D W ;.W ;.W W W W W W Q k k h j h h h h h h h | h | ........{ ..{ ........r ..r ....p r p O.p p o.M ..O.......O...O...r . .| h r > ..> h > h | | | | .M Q W h 2. .W Q 2.#.{ { #.#.{ { #.} { { #.#.{ #.<.<.$.<.#.$.:.#.<.:.#.$.{ { $.$.{ } } } } } } } @.@.} } @.} @.} @.} #.#.} } #.@.@.} @.} } Z } @.@.} Z } &.&.} } &.} &.@.@.@.} @.@.@.@.@.@.%.@.@.Z @.Z Z @.@.Z Z Z Z @.Z @.Z @.Z @.Z @.Z @.Z Z Z Z Z L L Z , Z Z Z Z - > Z Z Z Z D D D D Z D Z Z *.D *.*.@.*.D @.Z Z *.K @.Z %.Z %.%.Z Z %.@.@.$.$.$.$.=.$.$.$.$.=.} =.&.-.=.} &.-.=.$.=.$.=.=.=.$.=.=.3.p.y.=.=.y.r.y.p.y.y.p.3.y.y.3.y.w.w.-.-.y.-.=.-.y.y.-.=.-.-.-.-.-.-.-.-.=.-.-.-.y.0Xy.y.y.-.u.y.pX-.pXpXpXpXpXpXpXpXpXpX-.pXpXyXpXpXsXsXsXsXsXfXsXsXfXdXsXpXdXpXpXdXdXfXdXdXdXdXwXdXdXgXdXdXdX", ").7X~.2X7X^.!.7X).7X).7X~.~.).).).~.).T.).).).!.~.Q.Q.Q.W.~.~.eXeXuX~.).).(.!.(.(.!.(.!.(.!.(.!.~.!.).!.(.K K ~.~.eX' ~.' ~.0.~.oX4X~.eXoX~.oXeXeX7X' ~.~.oXK oX~.*.*.' 0.oX~.0.oXeXeXeXeX0.' 0.' K ' ' 4X' eX' ' q.tXq.0.q.' ' oX' oXoXoXoXoXoXoXoXrXrXoXrXoX%XrXoXrX%X%XrXoXoXoXoXoX%XoXrXq.rXrXtXrXrXrXrXrXrXrXrXtXrXoXeX~.oXoX4XeXK K K ~.K K H K K K K H K ~.4X~.eXtX0.*.oX' oX' 4XK eXK eXeX0.oXK *.*.*.6.K D K *.*.*.0.*.*.0.0.*.*.~ D *.*.K ,.,.~ *.6.*.*.K K *.K ' *.K D K ` 6.8.~ ` ,.,.,.~ *.D ,.D ,.,.D ,.D W W D #.#.W ,.;.W W ;.D D ;.W D W W D ;.W k k h ( k Q k j h h h h .| h | .............. .k r ....{ ..{ .. .p p p o.c n c o............... . ...O. .r r > h r h h k h ;.;.j m m m h Q h | Q Q ;.X.$...X.#.{ { { > #.{ { > <.<.,.<.<.<.#.{ $.#.:.$.$.{ $.$.{ } #.$.} } } $.} @.@.@.} } $.@.@.@.} } @.@.#.@.{ } { , @.{ Z } @.> } @.@.@.} } &.&.} } &.@.@.@.@.@.&.&.@.@.@.@.@.Z Z @.Z @.@.Z @.@.Z @.Z @.Z @.Z Z Z Z Z @.Z Z Z Z Z Z Z Z Z Z L Z - L > Z Z Z Z Z Z #.#.D @.@.Z #.Z Z #.#.Z D %.*.@.@.@.@.Z Z @.%.Z Z %.Z %.@.$.%.#.#.$.$.$.$.$.$.$.-.-.&.} =.-.$.=.$.=.$.=.$.=.$.$.$.} p.p.p.$.3.y.p.r.p.y.p.y.y.u.r.y.w.y.y.w.-.-.y.=.y.-.-.y.-.-.-.y.y.-.-.-.-.=.y.-.-.-.y.y.pX-.y.y.y.u.-.sXpXpXpX-.pXpXpXpXpXsXpXpXpXpXpXsXsXfXsXpXsXfXdXsXfXsXfXpXdXdXpXdXdXdXwXdXdXdXwXfXdXdXdXdX", "(.T.).^.!.~.).).#X7X).).).).).~.).).).7X7XT.).~.R.~.!.!.~.eX~.eXeXOXrXOX(.(.^.).T.(.!.!.~.(.~.~.(.!.~.!.!.~.~.~.~.' 4XK ~.eXoXeX0.0.0.eXoXoX4XeXeX' *.oXK oX*.~.oX~.oX~.*.oXoX~.K eXeXeX0.*.' K 0.` *.eX' 0.0.eXq.tXtXq.q.rXrX0.' oX' oXoXoXoXoXrXoXrXOXoXrXrXtXrXrXrXoXrXrXoXrXoXrXrXrXoXtXrXq.q.rXq.rXoXrXq.rXq.tXtXeXeXtXtX4XoXeXK ~.~.K K K ~.K K K K K H K ' eXeXoX0.0.' eX~.*.' oXoXeXeX~.oX~.oXeXK 6.*.*.0.#.*.7.7.*.*.7.7.*.*.6.0.*.6.~ ~ 6.*.~ 6.` ,.~ ` *.*.K *.*.K K K K ~ ` ` 6.` 6.6.,.1.~ 6.D ,.D D ,.D 6.D ,.;.~ W ,.D W ~ #.W ;.;.D W W D W W W W h ( h h j j j j h | j h h h | h ............r r | k ..| ..r ....r p O.p M c c c ................r O. .r .o. .r r > h k j n .M m M ) m b 2.;.Q Q .j #.{ { #...#.> { { { D #.<.<.:.$.#.#.<.$.$.#.$.$.#.#.#.} { } $.#.} @.$.} } } @.} } } } @.@.@.$.} $.@.@.} @.} @.@.@.@.@.} #.@.@.@.} @.@.@.} &.} } &.} @.@.@.@.@.@.@.@.%.@.@.Z %.@.Z @.@.Z @.@.Z Z Z { @.Z Z Z @.@.@.Z Z Z Z @.Z Z Z Z - Z Z Z Z Z Z Z > L L - Z Z K Z #.D *.D K #.*.*.D *.#.*.Z K @.K %.Z %.Z %.@.%.Z @.Z @.#.#.$.$.$.$.$.$.$.$.$.&.} =.=.} } -.$.=.$.y.=.y.$.=.=.y.y.p.p.p.p.p.p.y.y.y.r.w.y.r.y.y.y.y.w.w.-.y.-.-.-.-.y.$.-.y.y.=.y.y.$.y.=.-.-.-.-.-.-.-.-.-.-.y.u.u.pX-.pXi.pXpXpXpXpXpXpXpXpXpXpXpXy.aXfXsXsXsXsXfXsXsXpXsXsXfXdXdXdXdXdXdXdXdXdXdXdXdXdXdXwXdXdX", ").2X~.).).).7X7X).).7X~.).).).!.~.).).^.7X).~.T.!.W.!.oXeXeXuXoXoX4XOXeX~.(.(.(.).~.!.~.(.!.(.(.).!.!.~.(.~.eXeXeX~.' eX*.0.tX*.eX' eXeXK eX*.oXeX' 0.' eX4XoX~.~.' 4XoXeX~.eX~.eXeXeX0.' ' ' 0.' 0.0.oXeX0.0.tXq.tXtXtXiXtXtXrXeXeXeXoXoXoXrXrXoXoXrXoXrXrXrXrXoXrXrXrXiXoXoXoXrXoXoXoXrXrXrXtXtXq.q.tXrXrXrXe.q.tXq.rX4XtXq.tXeXeXK ~.K ~.K *.K K K K H K K 4XeXeXeXeXeX0.eX' eX0.' 4X0.oXeXeXoXeXoX4X0.*.6.*.*.*.7.*.0.*.0.*.*.*.0.*.q.*.*.6.~ ~ ~ *.6.6.6.~ Q #.*.*.*.6.D K *.K K ,.6.~ ` 6.1.~ ,.,.D 6.D ,.,.D ,.D D W ;.W W ~ D ;.W W W D D ;.W W ;.W Q W h h h k j n c j j | h | h h ..h r ..........r r r j .k r | ....p p p o.k M c j e O.............r ..k r O. .p O. .h k .j M n m m n m m m ) b Q Q j Q Q ..{ #...#.#.> #.{ { > <.<.:.<.#.<.<.$.#.{ $.#.#.$.{ #.#.} #.#.} $.} @.} } } @.} @.@.@.} @.} @.#.} #.@.@.@.@.@.@.@.} @.@.@.@.@.@.Z { @.@.} @.&.&.} &.&.@.@.@.{ Z @.@.@.%.@.@.Z @.@.@.Z @.Z @.Z Z @.{ @.> @.Z @.Z @.Z @.Z Z Z } Z Z , Z Z Z Z Z Z D Z Z > > - L Z D Z *.D @.K Z *.D D *.#.#.K @.@.@.Z @.Z Z @.@.%.Z Z Z %.#.#.#.$.$.$.X.$.:.$.$.$.} =.=.=.-.=.=.$.=.$.$.=.$.$.-.$.$.p.p.p.p.y.p.r.p.w.p.y.p.y.p.y.w.y.y.y.w.-.w.y.y.-.-.-.y.-.y.-.y.X.y.y.$.y.-.$.-.-.-.-.-.-.-.-.i.i.i.p.-.pXpXpXi.pXpXpXpX-.pXsXi.pXpXdXsXsXsXpXsXfXpXsXsXfXsXdXfXsXdXfXdXwXdXdXdXdXdXdXdXdXdXdXdXdX", ").^.).).T.7X).).(.L.V ).).~.(.(.^.).(.(.(.).).).~.eXeXuXeXrXoX4XuXeXoXoX7X(.(.!.~.).(.!.(.!.~.(.~.(.OX).!.eXeX~.4X' K eXeXeX0.eX0.4X0.0.4XtXeXeX*.6.*.6.0.K K 0.~.oX' 4X' 4X' 0.0.eX0.' ' 0.0.' 0.0.' 0.0.rXtXq.yXq.tXiXtXrXrXtXrXrX' oXoXoXOXrXoXiXoXrXrXOX@XrXrXOX@XrXoXoXrXoXoXoXrX' rXtXq.tXq.tXtXtXtXq.rXtXiXtXtXrXtXtXyXtXtXyXtX*.*.K K 4XK K 4XK K K 4X' ~.eX*.eXq.0.0.rX' eXoX0.' eXeXK ' oXoX' 0.*.7.6.6.0.0.6.8.7.q.8.q.0.*.0.q.*.` *.*.*.6.` D 6.*.| .W ~ 6.K K *.K K D ` 6.` 6.` 6.6.,.,.,.,.D ,.D D ~ D ,.,.,.D ,.W #.,.;.W ,.;.D | D W W W h Q h j j k n M j j n j j | | k j p .p ......r r h j ..k r .| p r j p r p j k b n c p ..........O...O.....O.r . . .j . .j .n n m M m M m ) g.m Q j Q Q W :.$.{ #.#...{ #.> ;.<.<.<.,.<.<.$.#.:.$.$.$.$.{ } $.} #.#.} #.X.} #.$.} $.@.} @.} $.@.@.@.@.@.@.@.@.@.} #.@.{ } { Z { @.@.@.{ > } Z Z } &.} } } } @.} @.@.@.{ > @.@.} %.@.@.@.@.@.@.@.@.} Z } } Z Z } } @.#.Z @.Z @.Z @.Z } Z Z Z Z Z Z Z Z > L - - - - D ~ D Z Z D Z #.#.D #.D @.*.*.Z %.D D @.Z %.Z %.Z %.Z %.Z %.@.;.#.{ $.:.:.$.#.{ #.$.#.$.=.=.$.=.=.=.$.y.y.=.=.$.=.-.$.$.p.p.p.p.p.r.u.u.u.p.u.w.y.r.y.w.r.y.w.y.y.w.y.-.-.y.-.3.-.-.$.-.y.y.y.y.y.y.y.-.=.-.-.-.-.-.y.i.i.D.i.i.pXi.pXpXpXpXpXpXpXsXpXi.sXi.i.sXsXdXsXsXfXsXsXdXfXfXfXsXsXsXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXfX", ").).).~.).7X7X).V B V (.7X!.!.(.7X).).(.).7X^.).uXeXoXeXoXeXrXoXeXOX~.eXeXOX).).(.(.~.~.~.(.~.!.(.OX(.!.!.uXeXeX0.eX0.4X0.eXeX0.eX0.0.4X0.' eXeX0.' 0.*.0.0.eX~.*.oXeXK 4X' eXeX0.eX' 4X*.eX0.0.0.0.0.q.q.tXtXe.tXiXtXtXtXtXtXtXrXtXrXrXrXrXoXrXrXrXoXoXrXoXiXoXOXiXrXoXoXoXq.rXrXoXiXrXtXtXtXrXrXtXtXq.tXyXtXtXtXtXrXeXyXq.yXtX0.yXtXyXtXyXtXq.4X0.K 0.K oX' 4X4X' ' 0.0.' eX0.eXeX0.oXeXeXeXeX4XoXoXoXeX0.0.0.0.7.6.q.7.0.0.8.8.' / ' 6.` ` ` ~ ~ ~ 6.*.,.W j .;.Q ;.,.*.K *.*.K ,.6.6.` 6.~ ` 6.,.1.,.~ D 6.#.~ #.W W W W / / ;.W D ;.#.W W W W | W j h | W j k n j k j M k p M k p .k M k k ......M .k .r .k k c c c p .M j n n n c n c ......O...r .... ... . . .O.k M M .j M M m M m m M m m m m ) Q Q Q .2.{ :.:.:.:.;.;.>.<.<.<.<.,.:.$.$.$.#.$.$.{ :.$.#.#.} { { { #.} } #.#.#.@.@.@.} } @.@.$.@.@.@.@.#.@.@.#.} > @.D @.D @.@.@.#.#.} > } { @.@.} } @.&.} } @.@.> { { > { @.@.@.%.@.@.@.@.Z @.} @.@.} } Z @.@.Z @.Z @.#.@.Z Z } Z Z Z Z Z Z Z Z > Z - - Z K 9.AXAX9.L D Z D D D Z Z #.#.K D *.Z *.*.Z Z %.@.Z Z @.Z Z %.%.@.#.:.:.3.:.>.#.#.{ ' %X#.$.=.=.=.$.$.=.-.$.$.=.$.$.$.-.y.3.p.X.p.p.p.u.u.p.u.r.r.p.p.y.y.u.y.r.y.w.y.y.y.y.y.-.y.-.-.-.-.y.p.y.y.$.y.-.-.-.-.-.-.-.-.i.i.S.i.i.i.i.i.-.-.pXpXpXpXpXpXpXi.sXD.i.AXsXsXsXsXsXfXsXsXsXpXsXsXdXdXsXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXfX", "^.2X).OX).).(.C C B L.W.B C B B C C C C ~.).7X4XuXeXeXuXeXuXeXoXoXoXuXeXOXoX~.#X~.).(.(.).!.(.!.!.(.!.(.!.~.eXeXeXeX0.' eX0.0.0.0.0.0.0.0.eX4X' *.0.0.K 6.` 0.*.~.' 4X~.eXeXK eXeX' 0.' 0.' ' 0.' 0.rXe.q.tXtXtXtXyXiXtXtXiXtXtXrXrXrXrXrXrXrXoXiXOXiX@XrXrXoXrXrXoXrXrXoXiXrXrXrXoXe.rXq.e.tXq.q.tXq.iXq.iXw.e.e.q.tXyXyXtXyXq.yXyXq.yXyXyXyXtXeX*.4X0.eX*.eX' ' 0.4X0.0.0.] 0.0.eXrX0.eX0.0.eXoXeXeXoXoX0.*.7.7.8.0.7.0.8.6.q.8./ / / ^ ^ ^ ^ / / ^ ^ ^ / / / W / W / Q ~ ,.K ` K K ,.` 6.` 6.6.` ~ ,.,.~ #.~ W W ~ ~ W ;.W Q W W ~ ;.W ~ W W h W W j W W Q h j n c M p v c M M c M k p .k . .p . .r r j r | k p c c l l c M k b c c b n c p ..............r O. ...p O. .M . .M M M M n m M n m m ) m m m n Q Q Q j :.:...X.:...:.<.<.<.<.;.<.<.:.#.:.#.#.#.$.} #.} :.$.{ #.} } #.{ } } { $.@.} @.$.@.@.@.{ D D #.> #.D #.#.#.#.@.D } { @.@.} } #.@.@.{ @.@.%.} &.} @.@.@.> > > > { > > @.@.@.@.@.@.@.@.@.Z @.@.@.> } > } } Z @.Z @.Z @.@.Z @.Z Z , Z Z , Z Z - - D e.AXFXGXZ.Q , > #.#.Z D *.*.D Z @.D Z #.K Z #.Z Z Z Z %.Z %.Z Z Z #.:.<.:.:.#.:.{ D ,.%X%X:.$.} $.$.=.$.$.$.$.$.$.$.-.3.$.$.p.p.p.p.y.p.r.u.p.y.p.p.p.p.r.p.w.p.y.y.p.p.y.y.-.y.y.y.-.$.-.y.p.y.y.y.p.y.$.y.$.-.+.-.-.-.i.t.i.i.t.i.D.i.i.sXpXpXpXpXsXpXpXi.i.i.sXi.i.sXi.sXsXsXpXsXsXsXsXsXsXsXdXfXdXdXdXfXdXdXdXdXdXdXdXdXdXfXfX", "gX).7X).).OX(.B ]._.B I JXJXbXbX1X|.B Q.).).7X~.eXeXOXrXeXeXeXOX~.eXOXoXOXOX~.!.!.(.!.(.!.).(.!.!.!.(.OX#X' eXeX0.0.yX0.0.eX*.eX0.0.0.0.0.0.0.*.0.' 0.0.K *.6.` ' ~.0.' 4X0.' eX' eX0.0.eX' eX' 0.q.q.e.tXtXtXtXq.yXtXtXtXiXuXtXrXrXrXrXrXrXoXiXOXrXrXrX@XrXoXiXrXrXrXrXrXrXtXrXrXq.iXq.tXtXq.q.iXtXq.iXyXr.iXe.yXq.yXyXyXyXtXtXyXtXq.yXyXyXeXyXyXeX4X0.0.4X0.0.eX0.0.0.0.' 0.0.rX0.0.eX0.eX0.0.0.eXoXoXeXeX0.0.8.7.0.8.8.0.8.8.0./ ] ^ ^ / ' ^ / ^ ^ ^ ' / ^ ^ ^ ' ^ ^ ^ ] / ~ #.K ` 6.6.6.` 6.` ` ` ,.,.W W W #.W W W W W Q W W Q ,.W W W W W h j Q W j h Q h j p v M v p M c p c p M k . .p r k . . .p .r n c p c l s b ( b j n b j c b k j .................. . . . . . .M .M n n n M m m M ) m m ) m m ) Q j Q j 2. .2.| :.;.<.<.<.:.<.<.<.:.<.#.<.#.$.$.} #.#.} $.} #.#.} } #.@.{ } { } { #.#.> W D > W #.D > D #.D { @.#.@.{ { Z #.Z #.#.} #.{ #.Z { @.@.@.@.@.@.@.Z > > > > > > > { Z @.@.@.@.@.@.@.@.@.@.@.} Z @.Z @.@.@.@.@.Z Z @.@.@.Z Z Z Z Z Z , L - D BXFXZXZ.+.5.h L Z D D D Z #.Z D #.D K K #.#.Z Z Z @.Z %.Z %.Z %.Z #.:.:.#.:.#.:.{ > W %X$XXXW ;.$.$.=.$.$.$.$.3.$.$.$.3.3.$.p.p.p.p.y.p.y.p.p.p.u.p.r.y.y.p.r.p.3.p.u.y.y.u.u.y.y.-.y.-.y.y.y.y.y.p.y.y.y.y.$.y.y.t.t.p.i.i.i.p.i.t.D.i.S.i.i.i.pXpXi.y.y.sXi.i.D.sXi.i.D.sXaXaXi.pXsXsXsXsXpXsXaXfXfXfXsXdXdXdXdXdXdXdXdXdXdXdXfXiX", "7X).7X).#XE.B B _.K. XJXbXvXvX_.B C (.~.4XoXuXeXeXuXoX4XuXoXeXuXoXeXuX4XrXoXuXOX!.~.!.!.!.!.!.(.!.(.!.(.!.4XeX0.eXeX0.eX0.0.tX0.0.4X0.q.0.0.0.0.*.0.0.` 0.6.0.0.6.0.eX0.oX0.eX0.eX' 0.eX0.0.0.q.8.tXrXq.r.tXiXtXtXiXyXiXyXiXyXiXrXiXuXrXrXoXrXuXrXrXoXoXrXrXOXoXtXtXrXq.rXrXrXrXrXtXq.tXq.q.tXiXq.q.q.q.e.yXq.tXr.iXq.yXyXyXyXyXyXyXyXyXyXq.4XyX4XeX0.eX*.' ' *.*.0.*.0.0.0.0.' 0.0.0.q.0.eX0.4XeXoXoX0.0.0.7.*.7.0.7.0.0.9.q.8.8.^ ^ ^ / ^ ^ ^ ^ ^ ^ ^ ^ ^ / / ^ ^ ^ ^ ^ ^ ` ~ ` ,.` ~ ` ' 6.` ` 8.6.~ ,.;.,.W / W 2./ W / ,.W / W W W ,.;.W j j j k Q W j j Q j v v v v M v M M M n j M p j .c c M r r .p k c c c c c l b b ( b b b b n b b M c n j p j p O.M .p O.p O.n k .n n b M b b M n m n m b m m m m n ;.Q Q h . . .n .o.2.<.,.<.<.;.,.<.<.#.#.#.{ $.$...{ } #.} { #.X.{ { { { > #.> D > D D #.D D D D #.{ D #.Z > D #.Z @.#.@.#.#.} D } @.} } @., Z } @.Z @., , Z , > > > > { > , @.@.@.@.@.@.@.@.@.} @.@.@.@.} } Z @.Z @.@.} @.} Z Z , , Z Z , Z - D BXDXZ.+.+.N.5.: - > > Z D D D *.Z Z K @.Z Z K @.Z Z Z Z Z Z Z Z Z Z ;.:.;.:.:.;.{ > D ' ].kX].W D $.#.$.$.=.$.$.<.3.w.3.3.3.y.p.X.X.p.X.p.p.3.p.w.3.p.r.p.5.3.p.y.p.y.r.p.r.y.y.y.p.r.y.y.y.y.3.y.y.y.y.$.y.y.-.-.y.t.t.p.p.i.i.i.i.i.i.i.i.p.i.p.u.pX-.sXi.D.aXsXsXi.sXsXsXi.D.aXaXAXsXsXsXsXsXsXaXaXaXsXsXdXsXdXdXdXdXdXdXdXdXdXaXfX", ").).).).7XE.B `.:XvXbXvX`.B B V !.(.).uXeXrXuXeXeXeXuXuXOXrXeXuXOXuXeXOXOX~.eXeXuX~.!.!.~.#XOX!.!.!.!.!.!.eX0.0.q.0.0.tX0.0.tX*.7.0.*.0.0.0.6.0.0.0.K *.K 6.6.6.6.0.0.' ' ' 4XeX0.' 0.' 0.0.0.' q.q.tXe.yXe.yXiXyXtXiXyXuXyXyXiXtXrXOXrXuXiXoXrX@XrXoXrXrXrXiXrXrXe.rXe.q.rXe.rXtXq.tXq.tXiXq.tXq.tXyXe.iXq.e.yXq.iXtXyXyXq.yXyXyXq.yXyXyXq.4Xw.w.yX*.*.*.0.0.4X0.0.0.0.0.' 0.0.0.0.0.0.0.0.' eXeX*.7.*.*.7.0.7.0.0.0.7.0.8.8.e.8./ ' ^ ' ^ / ^ ' / ^ ^ ] / ^ / ^ / / / ^ ^ / ~ ~ 6.*.~ ` 6.` 6.6.` ` ` ,./ ;.W Q W W W W 2./ W ;.Q Q W W j j j j j b k j Q Q h j c v v v p M p M c M p p .j k k p r .p j c c k p k p c b b ( b b f b b b b b j b c c b m c b b M c m c b b m m c m b M m m b m m m m ) m m ) b ) j Q j 2. . .4.n M m m 2.<.1.,.,.:.;.<.:.:.$.$.#.$.{ $.#.{ ..} X.{ { { ..| #.{ #.> W ( h > D D ;.W D #.D Z D #.@.Z #.#.@.#.@.{ @.#.#.{ @.> Z } , , Z , - , , , , , > , { > > r { > @.Z > } @.Z } Z @.@.@.@.} Z @.@.@.@.Z } Z Z Z , Z Z Z - Z - L r.ZX+.+.t.Z.D.G.L > D Z D Z D D D Z D @.Z D D Z D Z Z Z Z Z Z Z Z Z #.#.:.:.;.h | | > / %X$XvX%Xh ;.@.$.*.$.$.$.3.$.3.3.3.3.$.3.p.3.p.3.3.p.3.5.3.r.r.5.3.3.3.3.3.5.3.r.p.3.p.p.p.p.p.5.p.y.y.y.y.3.3.y.y.y.$.y.-.y.-.p.t.S.t.t.t.i.p.i.t.i.i.p.i.p.u.y.u.y.pXi.i.i.i.sXAXi.D.i.sXi.aXaXi.aXpXsXaXaXsXsXsXaXAXdXsXdXdXdXdXdXdXdXdXdXfXfX", "7X7X).7X).XXB :X X X].B B OX7X#X).uXeXuXuXOXeXuXuX~.oXoXuXOXoX4XeXuX~.oXOXuXOXOXOXOX~.!.!.~.!.!.!.(.!.(.(.eX0.0.0.*.q.0.tX0.0.q.7.0.q.q.*.q.0.0.6.0.6.0.0.0.8.0.6.0.tXq.eXeX0.' 0.4XrX' 0.0.0.8.q.iXq.q.e.yXe.tXiXyXiXtXiXyXiXuXuXiXiXrXoXoXoXiXiXrXuXrXrXtXrXrXtXrXtXrXrXrXtXrXtXtXtXq.q.q.tXq.tXw.iXtX9.9.yXe.r.r.yXyXyXtXyXyXyXyXyXyXyXyXq.4XyXyXeXeXeX*.0.0.*.0.0.0.6.0.0.q.0.q.0.0.q.0.7.w.7.7.0.7.q.*.7.0.7.7.8.0.0.9.6.' 8.' / / / ^ ^ / ^ ^ ^ ' ^ ^ / ^ / ^ / ^ / ^ ~ 6.~ ` ` 6.~ ` 6.` ` ` 8.` ` W Q 2./ ;./ W W / ;.Q W Q W Q Q j Q j j j j b b j b h M M v v v v v M M c n p M k k p c c p . .p k k c c c s b ( b b ( b b b k b b b c b n b b M c b m c m c b m m ) m m m m m ) m [ m m m ) m m m m m n n Q 4.Q . .n M m m M n 2.2.2.<.1.2.#.#.#.#.{ $.{ $.{ } } $.{ #.{ #.{ { | { D > W h h W h D D > D D D > #.#.#.D #.#.Z #.@.{ } #.{ } @.{ } > Z , - O o O . . . O = , > , > > > > > Z } Z > Z , @.@.@.@.@.@.@.@.@.} Z @.@.Z } @.Z Z Z - , Z - - ~ G.+.Z.Z.S.F.ZXe.- - > D D D D Z D D Z D D Z Z K Z Z Z Z Z Z Z Z Z Z W ;.;.h ;.#.D > ( _ ].vX X' > > #.$.#.$.$.<.<.3.3.3.3.3.3.p.X.p.p.X.3.3.3.3.3.>.3.>.>.<.>.>.>.3.X.3.3.5.3.t.5.p.p.t.t.t.p.p.p.p.p.y.p.y.y.y.y.y.y.t.i.t.S.i.p.S.D.i.i.i.i.i.p.p.p.u.pXu.i.i.i.D.sXD.aXi.i.sXi.aXi.u.aXi.i.AXaXaXaXaXaXaXsXsXdXAXdXKXdXdXdXdXdXdXaXfX", ").).).7XC B B .X:XY {.bX$XL.B G tXuXuXeXeXuXeXoXuXrXoX4XeXuXeXeXuXeXeXeXeXOXoXeXeXoX!.~.OX~.OXOXOX).(.!.(.eXtX0.0.tX0.0.q.0.0.q.0.7.0.q.*.q.7.*.0.0.*.6.6.0.8.0.q.rXrXrX0.' 4X' 0.eX0.0.0.0.e.0.q.e.yXe.q.iXe.tXtXtXiXyXfXuXiXtXtXiXuXtXrXrXuXuXrXrXrXe.e.tXe.tXtXrXrXq.tXrXrXtXq.iXq.q.yXtXq.iXr.tXtX9.8.1.9.q.yXtXyXyXyXyXyXyXyXyXyXtXyX4Xq.yXq.5Xq.0.tX*.tX*.*.tX0.0.0.6.0.q.0.q.7.q.7.q.w.7.7.*.q.7.7.*.*.q.8.7.6.9.8.0.8.q.8./ / ` ^ / ' ! / ! ^ / ^ ^ / / / ^ / ^ ^ / ~ ,.6.,.~ 6.` ` ,.6.~ ` ` / 8./ Q / ;.Q Q / W ;.W W ( Q ) b j j Q k b k b n j b k j c M v v v v v v c c M p n k p k k p c k k p c c c l s c l b ) b b b R b b b k b b b b n b c m M b m c m b m [ b m ) m m m m b b m ) m m m ) m b n ) n Q Q j 2.n M M m M M m M 2.2.2.2.2.>.#.$.#.$.{ #.#.#.#.} { } X.{ { { ..{ { { D h W h ( ( h j h D D D #.D { D D #.@.@.#.Z #.#.} #.@.{ } > Z , $ . . . . . . O , : , > > > > | > { { > > { { Z } @.@.@.@.Z } Z } Z @.Z Z Z Z Z Z - Z - L 5.N.N.S.G.ZXDXGX! - S Z D Z Z Z D D Z D Z Z D D Z Z Z - Z Z Z Z Z Z Z #.h ;.#.h W h > ! ].$XvX XR f > #.$.$.#.$.>.3.>.3.3.>.3.p.X.p.X.p.$.3.X.X.3.;.,.;.2.q.] e.iX` 8.2.:.>.3.3.5.p.5.p.5.p.p.t.t.t.t.t.t.+.p.+.p.p.p.t.i.t.p.i.p.p.i.t.S.p.p.t.t.5.t.r.2.y.u.i.i.aXi.aXD.aXi.aXu.u.pXu.aXaXu.aXaXaXaXD.sXsXsXsXAXsXsXsXdXsXfXdXdXfXfXfXfX", ").7X).7XOXXXB X:XvXJXIXuX%X].U % & ; K uXuXuXeXeXOXoXeXrXeXuXeXeXeXrXuXtXtXrXtXtXtXtXeX~.oXtX4XeXq.0.tXeXeXeX0.0.0.q.tX*.q.q.7.7.0.q.0.q.7.7.q.6.6.6.0.8.7.0.8.0.rXrX' 9.q.' 0.' eX0.0.0.9.0.e.e.tXe.q.q.w.tXr.yXiXyXiXtXiXtXtXiXtXtXuXOXrXrXrXrXtXtXtXtXtXtXtXe.tXtXrXrXrXq.tXtXq.q.tXq.iXtXq.q.iXq.<.8.8.<.9.r.yXyXyXq.yXyXyXyXyXq.yXyXyX4Xq.yXq.4X4X*.tX*.tXeX0.q.*.0.0.q.7.9.9.7.7.7.w.7.9.7.7.*.0.0.q.8.7.6.0.0.8.6.8.8.8.8.' / / ` / ^ ~ ! ! ! ( ^ / / ^ / ^ ^ / ^ ^ ~ ~ 6.K 6.` ` 6.` / / 8.` / / ` ,./ ;./ W ;.W / ( k Q n ) n ) j j b n n b n b b b b v M v p p v v M M v c M c c M c c c c l s p w c c s l l c l k b b b b b b b b s b b b m b n b b m b ) m m m m m m m ) x m m m m b m ) m m m ) b b b b n Q Q j M M m m m m m g.) Q 2.Q 2.2.#.:.#.#.{ $.{ ..#.{ { { #.#.{ { { { { { h h D ( > h k h k k W D D D #.{ @.D #.#.@.#.{ { #.{ { @.> Z , - . . . & & . , : , > > > { { , , > > , , , > , , { Z } Z @.Z @.Z @.Z , Z - , Z - - ( +.Z.G.F.ZXDXGXNX- - , : D > D D Z > L D D D L D L A A L L - Z Z L Z D W #.W | D > > : _ ].vXvX].R > h j o. .>.>.>.3.>.>.5.>.5.X.p.3.3.3.X.3.X.:...8.rX%XkXbXbXcX:X:X:X>X%X1.2.X.3.3.p.3.p.5.p.t.t.t.t.5.t.5.t.p.p.p.p.t.t.t.S.S.t.S.t.i.p.t.p.t.t.r.^ P ^ u.u.u.u.i.i.u.D.i.aXi.aXu.u.u.r.aXu.u.aXi.aXsXsXsXsXsXsXsXsXAXsXsXfXKXdXaXfXaXG.", "7X7X).).B C B vXvXbXHXKXS XvXbXUXPXKX] uX~.uXOXuXoXoXuXuXeXeXuXuXeXrXeXuXtXtXeXeXeXeXeX4XoXeX4X4XtX*.0.eXeXq.0.0.tX0.*.q.q.7.q.7.7.7.q.7.q.7.7.6.6.6.~ 6.q.8.q.0.0.q.' 0.8.q.0.' 0.0.0.q.q.q.q.yXe.r.q.iXq.r.q.iXtXtXuXiXiXyXfXrXe.rXuXrXrXrXrXtXiXq.yXtXtXe.tXtXtXrXtXe.q.0.q.q.tXtXtXtXq.tXq.yX9.8.8.8.8.9.8.q.yXyXyXyXyXyXyXyXyXyXyXtX*.*.yXyX4XyXyXq.4XyXyX*.yXq.0.8.9.7.q.q.w.w.7.q.7.7.w.7.7.*.7.7.6.8.6.8.0.6.6.8.8.8.8.0./ ' / / ~ ^ ` ^ ~ ^ / / / ^ ^ ~ ^ ^ / / / ~ W ~ *.` ~ 6.` ` 8.` 8.` 8.8.` 1.W W W / W Q Q ( ) ) b j b b n j n c b b b b b b c v p M v v v v p M p c M c c l c c l p s c l s s y l c l l l c ) b ( b b R b b b b k b b b b b b m b m m m m m m m l m m m ) [ m m m m b b b b b j ) j ) n Q n m m m M M M g.m m m 4.4.2.2.$.#.$.#.$.| u c k k | { { { { { { ..{ D h D h h h ( D W k f j k D #.D D Z @.#.@.#.#.{ #.} #.} @.{ , , . . . . . E ^ * O = , > > > > > > { > , > > { , , > > , , , Z } Z Z } , Z , Z Z - , - >.Z.F.F.ZXDXGXAXE - L : L Z Z D D L > D Z Z D D Z L E U _ A - - - L D > W h ;.> > > > E '. XbX$X%Xf r j .. .>.5.>.X.5.>.X.>.X.5.y.y.X.p.X.X.3.#.#.%XkXvXMXcXbXcXcX:X:X:X*X:X;XOX1.>.>.5.3.5.5.p.t.5.t.5.5.5.p.t.+.p.p.p.p.t.t.t.p.t.S.i.t.t.t.p.X.e._ N ^ 5.5.p.u.u.u.u.u.u.u.u.u.aXr.iX' 9.r.r.u.aXaXi.aXaXsXsXi.sXsXAXsXsXsXfXdXdXfXD.S.S.", ").).).uXOXXXB bXJXHXbXcX X XvX%XR * UX] uXeXuXuXeXuXeXuXeXuXeXrXeXtXuXrXeXeX0.eXq.0.tXq.eXeXeX0.q.eXtX4X0.eXeXeX0.0.0.q.w.q.7.w.7.7.0.w.7.q.7.q.6.6.6.6.6.9.8.8.8.9.0.9.9.8.9.9.rX0.0.e.q.9.e.e.e.yXtXiXq.e.tXe.w.iXiXyXtXtXuXiXe.rXrXiXuXrXiXq.tXtXiXyXe.e.tXtXq.iXtXrX0.0.q.q.q.q.iXq.yXe.tXq.9.9.8.<.<.8.,.9.q.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXw.w.4XyX0.tXyXtXyXq.7.9.7.7.w.7.9.7.q.w.9.7.7.w.7.7.8.6.7.7.0.7.6.6.8.8.8.` 8.9./ ^ / ` ! / ^ ~ ^ / Q / ( / / / ^ / ^ / ^ / ~ ~ ~ ` 6.` 8./ / / / / / / Q Q Q 1.Q 2./ Q j b n b b ) b ) m n n c b c b b b c v u g.v v v v v v v v v c v v p v c c s c s c c l s c l v c l l l b b b ( b k b ) s b b M c b b M b b m ) x b m m m [ b m b m m b ) m ) m ) m m b b b b n n Q j m M M M ) m M g.m g.M Q ;.;.:.#.{ #.#.h u p y u y p p p .r { r ..h D h W D h h h ( h k ( j k h D #.#.#.Z Z #.#.{ #.#.{ @.{ @., - . . . & & . $ , , > > > > > r > > , , > > r > , r , , Z - Z - Z - - Z - , - Z - C.F.ZXZXZXGXGX/ - - - , > : : Z > Z D Z D D L > D L > U U U _ L - L > > > > D h > h > _ ].1XbX].I f r r r o.>.4.>.>.>.>.>.>.3.3.X.X.3.X.3.3.X.{ / 1XvXcXcXMXcXcXcX:X:X:X:X;X;X;X+X:.>.X.3.3.5.3.5.5.5.5.5.+.X.+.p.p.p.p.t.t.i.t.i.t.p.p.t.t.+.5.' XXL.S 2.>.5.r.5.y.r.u.u.r.u.u.r.r.u.e._ S e.r.r.aXu.aXaXD.i.D.D.D.sXsXsXAXfXsXfXAXAXF.F.G.", ").uXOX#XB B B vXbXbXbXcX X|.kXHXHXCXUX] OXuXuXeXuXeXeXuXuXeXuXeXrXeXeXeXeXeXeXq.eX0.rXq.q.eX4XtXtX0.0.tX4XeXeXtXeX0.0.q.w.q.q.w.7.w.q.7.7.7.6.7.7.,.6.,.6.6.8.7.,.9.q.9.9.q.9.9.9.q.q.rX9.9.9.9.9.9.q.e.q.e.iXq.q.r.tXtXtXiXq.r.q.rXe.rXtXq.e.tXiXq.yXiXq.iXtXq.tXtXtXq.q.0.q.rXq.rXq.tXtXq.e.7.7.1.8.,.9.8.8.<.q.5XyXyXyXyXyXyXyXyX4Xw.yX4XyXq.4Xw.yX4XyXyXyXyXyXyXq.7.q.q.9.w.q.w.9.9.9.w.9.7.7.1.1.9.8.6.6.8.8.7.6.8.8.8.` 8.8./ ^ / ^ / / ~ / ^ ^ Q / ^ / ^ ( / ^ / ^ ~ ~ ~ ~ / ~ ~ ` / 8./ 8./ / W W ;.W 2./ W Q 2.Q n n b b b ) b m m n b b m c b b c m z z g.v v v v v p v v M c v p l c c l l l l c c l l l z l l c l c b b ( b ( b b ( b b b b b b b b b b m b m m l m ) b b x ) m m m m m ) b ) m b b b b ) b n ) Q M m M m m m M g.v g.g.m ;.Q ;.$.} { $.k u u i p y p y i y p y p w k k f h h D W ( h W k h h k k k h D @.#.@.{ #.#.{ #.} { #.> , $ . . . . . O - = > > > > > r > > > > , > > , > , > , : - - - - - - , - - - - - 4.G.AXAXGXGX/ $ $ - , - : - L : L Z S D D Z Z L Z : - U V '.U U L : : > > s > r h , ( ]. XvXvX]._ s r r .X.>.>.>.>.>.X.>.3.3.X.5.3.3.X.3.:.:.;.#XcXcXcXcXbXcXcX:X:X:X:X*X:X*X*X{.W W ;.;...>.>.5.5.5.O.5.o.5.5.X.5.5.t.p.p.t.t.t.i.Z.t.p.5.5.oX/.L.N ( h 2. .3.>.>.5.w.5.r.r.u.r.3.>.r.OXC S e.r.u.aXi.i.D.D.i.D.AXi.sXZXi.dXdXD.F.F.F.D.F.", "7X@XuXrXC B B ].1XvX1X X.X|.kXKXUXIXUX] uXuXuXuX@X7XuXrXoXuXuXeXtXeXeXeXeXeXeXq.0.rX0.eXeXtXeXeX*.0.4X*.q.eX0.eXyX0.q.w.7.7.7.7.7.7.7.7.7.7.7.6.6.6.,.6.6.7.8.8.6.9.7.9.9.9.9.9.9.9.e.q.9.9.>.9.9.9.r.9.r.q.q.r.e.q.iXiXyXq.w.q.q.e.e.tXiXq.tXr.q.tXtXe.tXq.tXtXe.tXq.q.q.0.q.' 0.q.q.iXtXq.q.9.8.,.9.8.,.,.9.8.7.q.yXyXyXyXyXyXyXyXyXyXyXyXyX5XtXyXyXyXq.yXyXyXyX0.w.7.7.7.9.q.9.w.w.q.q.7.9.8.1.9.1.1.7.8.7.e.7.8.8.8.] 8.8.8.8./ ^ ^ ^ ^ ~ ( / ^ ^ ^ ( / ( Q / ^ / ^ ^ ^ ~ ~ ,.` 6./ / / / ` / ~ Q ;.Q Q Q / 2.Q Q n n Q m m n m b b m ) m b c m m c b v v v z f.f.v v v v v p v c v v v v v z v v v c l l c l c l c l l z l l b b ) b b b b b b k b b b b c b b b m ) x m ) m m m [ l m b m b b m ) c b n b ) n j b j b Q m m M M v g.g.g.g.g.g.M M .Q #.#.#.{ p u i p i p y p p y i p p w s s c k k s k k f k ( ( k j ( k k f > #.#.#.#.#.{ #.#.#.} Z , O . . . . . . = : > , > > > > > > r > > > r , , , , = - - - : ( f S : - - - - - > VXGXGXKX' - & ; E : E D : : - : - > Z S : D Z D L : : U Y U U _ _ : : > > > > , s _ ]. XbX1X].R = r 2. .4. .>.>.>.>.>.X.>.X.3.3.X.3.3.:.:.| > %XvXvXbXMXMXcXvXcX:X:X*X:X*X[.*XE.f ] l.) Q | | :...X.o.o.X.o.X.o.5.5.5.5.t.t.t.S.t.t.t.5.5.] }.&XL.C S W 1./ A S S ( / 2.9.>.3.>.>.3.9.] V * ! 9.t.u.G.D.i.D.D.i.aXAXi.sXD.D.ZXD.D.D.D.F.S.", "#XuXOX@XC B B B B B B C B _ NXCXCXCXS ' uXuXuXuXuXuXuXuXuXeX*.' 0.eX0.eXeXeXq.eX0.eXeXq.0.q.rX*.0.4X*.tX*.tXeXq.eX0.9.7.7.q.7.q.q.7.7.7.7.6.7.6.6.,.6.,.6.7.8.7.8.8.9.9.9.8.9.9.9.9.9.e.9.9.9.9.9.9.9.9.9.e.9.e.q.e.r.q.r.q.r.q.q.r.q.iXr.iXr.q.r.iXq.tXiXtXq.iXrXtXrXq.' rX0.0.0.0.q.tXtX9.8.<.8.,.,.9.9.8.8.9.9.8.7.9.q.yXyXyXyXyXyXyXyX4Xq.yXyXyXyX5X5Xq.yXw.yXq.w.q.w.q.7.w.w.9.9.9.9.1.1.1.<.8.8.8.1.8.8.1.1.8.8.8.8.8.8.8.8./ ) ^ ^ ^ / ^ Q / ( ~ / / / / / / ^ / / / ~ / / / / ` / 8./ / W Q W Q Q W Q W W Q n .n 4.n b m b m m b m ) M b c v b v v v v g.g.z g.g.p v v v c c v v v v v p v l c l l p l l c l l c l l l l l s ) b b b b b b b b b b b l b x b b b b x x m b b m b [ m m m b ) l l ) ) n j n b Q b Q n n m m g.g.m g.g.g.g.M v M n Q #.#.$.} u i u i p i u i i p p p p p p s b s s s g k k b k k ( h h k k h > { } > { { #.@.#.} { @., O . X O . X & & & . . $ : , : r > r > > , f > , , = : , , , = : S ( ( D ~ D W ( D - - $ $ NXGXe.( T ( / ;.#.{ > h W ! : - - D - Z : L > L - : : U V U U ].I R d : = : , > = _ ].vXbX$X].( r j ;. . .o.>.:.>.>.>.:.3.X.3.X.:.:.>.:.:.;.W 1XvXcXcXmXcXcXcX:X:X:X:X:X;X*X[.F > [ j.j.[ / W k h k j j Q j .4.k.l.e.X.p.t.t.p.p.t.t.5.>.+X*XU.V C - E V L.L.B N * * & : Q <.2.2.>.;.' Q.* & 1.r.u.G.i.D.i.D.sXD.i.i.D.D.F.D.D.D.F.D.G.S.", "uXOX#XOXB B _..X[.`.B V uXS ; % % : oXuXuXOXuX@XuXoXeX~.K ' *.eXeXeXeXeXeX0.eXeXrX0.eXtXeXq.eX0.0.0.tX0.4X0.eXeXeXw.7.w.7.7.7.7.7.7.q.7.7.7.7.7.7.7.6.6.6.6.,.8.7.8.9.q.9.q.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.q.r.9.e.tXr.q.q.r.q.9.q.yXe.tXiXiXq.q.tXq.q.tXq.q.q.q.q.q.' q.0.8.rXq.q.q.9.,.8.,.9.8.7.1.7.7.9.9.7.9.9.7.9.9.w.q.yX5Xq.yXyXyXyXyXyXyXyXyXyXyX4X4Xw.4Xw.9.9.9.q.q.9.<.1.2.1.1.1.) 1.1.1./ 1.1.8.e./ 7.8.8.1.8.8.q.1.^ ^ Q ^ ^ ( Q ( / Q / / ( / ( / / / ^ ^ / ,.8.8.` / ` / / j Q j j Q j Q Q Q Q n n 2.n j n ) ) n ) b ) ) m ) m c b m v z m z z f.z f.g.g.v u z c v y y l y p l u u v l u z l l l l c l l l l c l l b R b b ( b ( b b b b l b b l l b b m ) m m b m m m m b m b [ b b l b b n ) n n j ) n n n M g.g.v g.g.g.m g.g.p p M j | #.{ { u u u p y i y i y i y y w p y s g l s k b k k s k ( k h j ( k f > > { #.{ Z > { #.#.} , Z . . NXCX5 . X NXVXKXS . . . = = : > > , > r > r > > r > > , , = = : W | >.G.AXAXAXG.5.{ > ( : : S ! ^ 1.2.5.t.G.AXAXF.t.5.{ | ~ : - - > L > L > D ; - % P V Y U ].$X_ f : = : = = [ XvXbX XXXf k h .X.2.:. .:.>...>.X.3.:.>.3.:.3.:.:.{ > ~ :XcXvXcXmXbXcX:X:X:X*X:X*X*X*X;XA S j.6 j.j.j.l.l.) ) ) ] k.l.l.x.c.j.1.5.p.p.t.t.p.t.t.3.6.}.*XY.C V V B U.B B C * N C * * O - W W W ~ _ L.C X f 3.r.i.i.D.D.aXD.D.sXD.D.F.D.D.D.F.D.F.D.D.", "OX@XuXuXC B _. X X].K.B ).7X7XuXuXuXuXtX7XuXuXuXOX4X4X~.*.' K 0.0.eXeX~.OX0.eX0.q.eXeXq.tX0.q.tX0.eXeX*.4Xq.*.eXq.7.w.7.7.7.7.w.7.7.7.7.7.6.7.7.8.,.6.6.6.8.6.7.8.8.9.9.q.9.9.9.9.9.9.9.9.9.9.9.e.9.9.9.9.9.9.e.9.9.9.e.9.9.r.r.q.q.r.q.q.iXiXw.e.yXr.iXq.q.q.0.e.rX0.0.q.' 0.rXrXq.rX0.8.1.9.1.8.8.<.8.9.,.9.1.9.8.9.7.w.9.9.q.*.6.*.0.q.4XyXyXyXyXyXyXyXyX4XyXyXyXq.w.8.1.] 1./ 2.Q ) / 1.) 1.1./ 1.1.] 1.1.8.1.Q 1.9.8.8.8.8.8./ ^ ^ Q ^ ^ Q Q ( Q / ( ( / / / ^ / ( / / / ` ` ` ` ` / Q j Q j Q ) j j Q Q Q n o.j Q n n n m b ) m m m ) m m m m b l v v v v f.g.g.u d.v g.u z p z c l u z l z l u l l l z l l l l c c l c m l l z c ) b ( b b b b b b b s b g b b b ) x b b l m ) g.m [ b ) m m l b s ) b b j j ) b n n j c g.g.g.g.g.g.g.g.g.p p v c M h #.{ ..i u y u i i i y y p i y i y y l s s g b k f g f k h h k h k k f > > > { { { { > } > > > Z o N KXVXVX. . ] IXNXVXKX. O , , : , > > r > , : r : , , = = ; / h G.GXLXIXIXIXIXLXIXGXG.{ > W W .5.G.GXLXLXLXFXFXFXDXDXF.n.X.:.: - - D Z D L D : : ; N N C Y '.].kX] & = ; = = P XbXbX+XI a r h | .. . . . .2.>.:.:.>.:.:.:.:.3.X.;.#.h %X:XvXcXMXMXcXcXcX:X:X:X:X;X*X*X{.: [ j.j.j.j.j.x.x.x.x.lXlXzXx.x.x.v.l.;.X.5.t.t.t.t.t.t.>.' ;X&XK.L.U.U.I.&XY.&XU.C C C C C X X % ! R V {.L.* . ; 1.u.u.D.i.D.D.sXD.D.S.D.F.S.F.AXD.D.F.F.D.", "uXuXuXOXuXOX@XuX@XuX~.~.~.7XuX4X7XuXuXtXuXuXuX4XuXeXK eX~.4X*.0.0.0.OXW.W.OXeXeX0.eX0.eX0.eXeX0.eX*.eXyXeXtXeXq.9.w.w.9.7.w.7.9.7.w.q.7.7.7.8.7.7.<.,.,.,.6.,.6.1.9.8.8.9.8.9.8.9.9.1.9.1.9.e.r.9.9.9.r.9.9.r.4.9.e.r.9.9.<.9.q.q.r.q.r.q.r.q.iXiXe.tXq.q.q.q.0.0.q.q.rXq.0.0.q.q.0.8.8.,.8.8.,.,.9.,.9.8.7.9.7.7.9.9.9.9.9.9.7.,.*.7.6.*.7.0.w.4XyXyXyXyXyXyXyXyX) ) ) ) ] ) 4.1.Q 2.1.1.1.1.1.1.1.1.] 1.8.8.) n n n 8.8.7.8.8.8.1.Q ^ ) ( ( Q j h Q ^ / / W / / / ~ ^ / / / 8.` ` / Q j n n Q j Q Q ( Q Q ) n n ) ) n ) n n n m m m m m m m ) ) b l y g.f.v v u u f.f.v g.g.u v u z u p z p u p z u v u l p z v z l l l l l l l b l b l ( b b ( b ( b b b l b b l x b b b m m v x x m m m b m ) b b s c b b Q b n j Q M v v g.f.v f.m f.m m g.g.g.g.p p u p { } .i u i i i i i i i i i y i i u s l s s b g b b k k ( W j k f k h k > h #.{ { { { > r e e , o ] % R VX* X NXCXX [ KX& O = : > , , > : > > > : , = - = : h <.DXLXIXIXIXIXIXIXIXIXIXIXLXZXG.G.AXLXIXLXLXLXLXLXLXFXFXFXDXDXZ.O.9.: : L : L L - : - - : N N C U '.$XHX_ = T E a U XbXvX X[ = r r 2.2. . .2. .;...:.:.3.:.:.:.:.:.#.;.> D $XvXcXvXMXcXvXvX:X:X:X*X*X*X[.;XI ; [ Y j.j.j.j.c.x.x.lXlXlXlXx.x.x.c.[ h X.X.5.t.t.t.t.+.5.' =X&XY./.$X$XI.&X{.U.I.L.C C C C C C V {.I.&X&XV * X % 1.5.D.i.D.sXi.D.D.D.D.S.D.D.S.D.D.D.ZXD.G.", "OXuXuXuXuXuXuX7X7XK Q.~.~.~.uX7XuX4XtXuXuXuXeXuXuX4XK 4X~.4XeX~.eX4XW.W.W.W.OXeXeX0.eXeXeX0.eX0.4X' eX*.tX*.q.9.9.w.9.w.7.9.7.7.q.7.7.7.7.7.7.7.7.8.<.6.7.8.8.,.8.7.9.9.e.9.8.9.9.9.9.1.9.9.9.9.9.9.e.9.9.e.e.r.e.9.9.<.<.<.,.<.w.9.r.q.w.q.e.r.w.q.e.' 8.q.q.0.0.q.q.q.rXq.' rXrXq.` 8.8.8.,.8.8.,.8.9.,.9.9.9.9.7.9.7.w.9.9.,.6.6.6.*.7.*.*.q.*.w.yX4XyXyXyXw.q./ / ] ] ) ] Q 2.4.1.1.1.1.1./ ] 1.1.1./ 1.) o. .n n 2.8.8.8.` 8./ / ^ ( ) ( h Q k j ^ Q / / ^ / ( ^ ~ ^ / ~ ` ` / j j j n k j Q Q n Q Q b n ) n ) M n n M n m m m m [ m m m m m m t l y f.z f.g.f.u g.g.d.p u z p z p z u u p p l l p p z p z z z l l l l l l l m l l l b ) b b b b b b b b b b b b l l b b v z z m m m m b [ b b g b s b n b b n l l f.g.g.f.v g.g.g.g.v g.g.g.p p u f.u u | { p i i i d.d.d.i i i i i y y i t l l g b g s b g k k ( ( h k k h f h k g { { { > h w y w e 0 o ) % X [ Y C l.%X. . KXP O = = = > k , k = r , = , , = : Q :.GXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXLXLXLXIXLXLXFXFXFXFXFXDXDXF.+.5.( L : > L Z > : : - ; ; N N Y V ].bXHX% E _ 4 U XbXvX].R = r r k . . . . . .:.#.:...#.:.:.:.:.| #.h ' vX:XcXcXMXMXcXcXcX:X:X*X:X*X*X&XN a j.j.Y j.j.x.x.x.x.lXlXzXx.x.x.j.j.) r X.5.5.t.t.5.t.X.X.) {.Y.}.HXUXkX'.vXJXbXL.&XK.B J.B C B &X*X&X&XL.C X X ; 5.t.Z.D.i.D.D.D.D.D.F.D.D.S.D.F.D.D.D.F.S.", "uXuX@XuXuXuXuX(.~., r , r r r 4X= O uX7X7XuXuXuXuX~.~.4XK eX~.4XK W.+XW.W.W.!.OXeX0.0.q.q.eXeX~.oXeXeXeX*.eXw.w.3.7.w.7.7.9.w.7.w.7.q.7.7.8.7.<.7.7.6.,.6.,.6.,.6.8.1.9.8.8.9.9.e.9.9.9.9.9.9.9.9.e.9.9.9.9.9.9.9.<.,.<.9.<.7.<.<.9.7.7.q.e.q.q.q.e.q.8.8.` 8.e.q.0.rX0.rX0.q.0.' 8.8.1.8.,.8.,.,.8.8.,.9.9.<.7.9.9.9.9.9.9.7.*.*.6.6.! *.0.7.*.q.*.w.w.q.5X4XyXq.8.] ) 1.] ) / Q 2.Q 1.) 1.1.1.1.1.1./ 1.Q 2.Q n .n n ) 8.8.8.8.` Q Q Q ( j j k Q h Q ( / ( / / / ( ^ ^ / / ~ Q c k j k n n b b n b Q j b n n M M n n ) M n n m m m m m m m ) m x s y y y u f.g.u f.v u g.p u z z u u v l v u z u l z l u z l y p l l l l m l l l l l l l l ) b ( b R b b g b b l b c b x z v m z z z b m b b l q x x l x t q t y f.g.g.p f.g.g.f.v f.g.g.m g.p g.d.g.d.u u k { y i d.d.d.d.d.i i i i i i i i t l g b g g b f l s k g g k ( j f h f f s > { > f w p y w e e + R kX* jXxXxXjXjX* U KXO . . O = = > = = > , > : s , = = ; Q { GXLXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXLXIXIXLXLXLXLXLXFXFXFXFXDXDXDXG.Z.e.- - : - : L - : : ; - ; S % C Y U %XbX_ N N V U U %XvX]._ a = r r . . .;.| .| :.:.:.:.:.:.;.:.#.| h OX:XcXvXMXcXcXcX:X:X:X:X:X;X;X;XU.: P Y j.j.j.j.x.c.x.x.x.lXzXzXx.x.x.j.b .X.5.5.5.5.5.5.5...2.L.J.bXJXJX}.vXJXJXJX%XU.&XK.B J.Y.C Y.&XY.B C O X * ( 5.u.t.D.D.D.D.D.D.S.D.S.F.F.S.S.D.D.S.S.S.", "OX@XuXuXrX7X!.r = O.N.H.h.N.O.= q e O tX7XuX7XuXuX4X~.~.4X*.~.4XW.W.W.(.W.W.W.E.OX0.eXeXoXoX~.eXoXK ' 4XeXeX7.w.9.w.w.9.w.7.7.w.7.7.w.9.7.7.7.7.8.7.6.<.<.6.6.8.<.,.8.9.9.8.9.8.9.9.8.9.>.e.9.e.r.e.9.r.e.9.9.1.1.7.<.9.<.<.<.9.8.<.<.<.7.q.9.q.q.9.' q.8.q.8.8.q.0.0.q.' rX0.0.` 8.7.1.8.,.8.,.8.1.8.8.8.8.7.9.9.q.w.9.9.w.6.,.,.` ! ' ! *.0.q.*.*.7.q.q.=.yXtXq.8.) ] ] ) 1.] / 2.2./ 1.Q 1.1.1.1.1.) 2.Q o.Q Q n n n j 1.8.8.9./ Q ( ^ j Q k Q h Q j ( ^ ^ Q Q ^ ^ Q ^ / Q j k k k k k b n n b n n b b b k n n ) M M n M n m b m m m m ) m ) z l y s y x y z d.z z u u u u g.u p g.u u u p p z u l u p u y l y c l l l c l c c l l l l l l b b b ) b b ) b s b k l b l i y v m z z v x b m ) g g x l s t y l i d.g.g.d.g.d.g.v u g.f.g.v g.v u g.d.g.u u p c c d.d.d.d.d.d.d.d.d.2 d.i i i y u l b g g b g b b g f g b g g ( ( k k f k g s s p p p y w w e o . kXcXxXxXnXmXmXmXcXjX. . . o O = a > > : > e : = = = = W #.G.LXIXIXIXIXIXIXIXIXIXIXLXLXLXIXLXLXLXLXLXLXFXLXFXFXFXDXFXDXDXDXF.G.AX] $ : : = : a : > : : : : & P & C Y `.U N V U ].].$XkX].$X_ ; r r k r h | j h .| | :.;.:.:.;.:.{ h r k %XcXvXcXMXmXcXcX:X:X*X*X:X*X;X*XV & [ 6 j.j.j.jXc.x.x.lXlXlXlXx.x.l.c.l.h . .5.5.5.+.5.5.O.X.Q V +XJXJXJX{.HXJXJXJXCXP.*XY.B C J.C C B C * * O X % Q 5.Z.i.D.D.D.D.D.D.S.F.D.F.S.G.F.S.F.S.S.S.", "OXOX@XuX#X~.r v H.m.B.M.m...r f.= z.s.O uXuXuX7XuXeXK 4X~.~.~.W.W.W.W.W.W.!.W.W.W.!.oXK K *.eX~.4XeXeXeX0.eX4X0.w.3.9.3.3.9.9.7.7.7.7.7.9.7.7.7.7.6.,.8.8.6.<.6.8.6.8.9.8.e.9.e.9.9.e.1.e.9.9.9.9.9.9.e.9.9.9.<.<.<.7.<.9.,.<.7.<.<.8.<.8.e.q.q.q.e.q.8.] 6.' 8.8.8.0.0.0.q.0.` 8.,.8.8.,.8.,.8.8.6.,.8.,.8.8.9.9.9.9.9.9.9.0.` ~ ! ! ! ' ' 7.*.7.0.*.*.*.q.yX=.=.q.e./ 1.] / ) ) 2.2.2.1.1.1.) 1.Q 2.Q n Q Q Q Q o.4.j .n ,.8.8./ ( j j ( k Q k j j ( j ( ^ ^ ^ ^ ^ ^ ^ j c k c c k p c k k j b Q j n b b b b m n n ) M ) M ) m ) ) b m m m l x t l t l t l y u z f.g.g.u v u u u u u u u v u z p u z u l p z y c l l l l l z l x m l l l z l R b b ( b g b b b b b l y y i u x z m l z m m c t x l x t t i u g.u g.i d.g.g.g.g.g.g.v g.g.g.f.f.d.g.d.u i y c p d.d.d.d.d.d.d.d.a.d.d.f.i t i i y s s b g g g l g f b g s x g g g x s g s s y p y y p w w 0 + C jXxXxXxXmXmXnXnXnXxX* o = : , = = r > = 0 = r = : ,.X.FXLXIXIXIXIXIXIXLXIXLXIXLXLXLXLXLXLXLXLXLXLXFXFXFXFXFXDXZXDXDXZXF.GXVX^ = ; : ; > : : a a g 0 < @ 5 % & N N U Y ].].]. X$XbX%X].R = = = r r r | | | .h | ;.| #.{ | { ..| > h 1X:XcXMXcXbXcX:X:X:X:X:X*X:X*X&XP % j.[ j.j.j.c.x.x.x.lXlXlXzXx.x.x.j.[ j .o.X.X.X.X.5.5.X. .j XXkXHXJXbX$XJXJXJXJXHXL.&XY.Y.Y.C C C * * X X X & 2.5.5.C.G.Z.A.S.D.A.S.G.G.S.S.G.F.D.D.S.S.F.S.", "OXOX#X7X~.r n IXm.B.B.v.+.r z.e z.z.z.O 8XuX7X4X~.~.*.~.~.~.~.W.W.!.W.W.W.OXW.OX!.!.!.oX4XoXoXoXoXeXeX0.4X' 0.eX4Xq.9.w.9.7.w.7.7.7.7.7.7.7.7.7.7.6.7.8.<.8.,.8.6.,.6.8.8.q.9.8.9.9.9.9.9.9.e.9.9.9.e.9.<.<.<.<.<.9.7.<.<.9.,.<.,.7.7.8.9.q.e.9.q.9.8.8.8.8.8.8.q.8.8.' ' 0.` ,.,.8.,.8.8.~ 6.6.1.,.8.8.8.8.8.8.8.9.q.r.9.8.` ` ! ! ! ' ' ! *.7.*.7.q.*.6.*.*.w.w.q.) 8.) / ) / ) / Q 1.2./ 1.1./ Q Q Q Q j ) o.Q n n j n n Q 8.8.8.Q ( ( b b k ( k Q k k j Q ^ ^ ( ^ ( k k c k j k k k k s k j n b b b b b b b b n n n ) M ) n m m m m m ) b l l y y t x y y x l t u u g.u v u g.p v u g.u u u u y v p u l u y c y l s s s l l l z l l l l l y u b ) b b ( b b b c p i t y i y z z z z z z b t s l z l i u u f.g.i u g.v u g.g.f.v g.g.g.M g.d.g.d.d.p u t t t 2 d.d.d.d.d.d.d.d.d.d.i d.u i u u l s g s b b g g s g f b g l b l g s x l l y p y y c y i < < + C jXxXnXxXmXnXnXcXcXcX* . . . O = = , r = e 0 0 = = = Q > G.FXLXIXIXIXIXIXLXLXLXLXLXLXLXLXLXLXFXLXFXLXFXFXFXFXFXDXDXDXDXZXZXDXGX] ; & ; : a a a a a a a a < < @ % * N U Y ].].]. X X X X X X_ = r = r r r k j h h j h #.h | | | ..| h h ] :XvXcXcXMXcXbXcX:X:X:X*X:X*X;XU.4 P Y j.6 j.j.x.c.x.lXlXlXzXlXx.x.x.j.) k ..o.5.5.o.5.5.O.o. .k XXCXR kX+X%XkXJXJXJXHXY.*X&XB C C * * X X X X & Q 5.5.t.Z.G.Z.D.Z.A.A.A.Z.A.A.Z.Z.A.S.A.G.G.S.S.", "+XOXOX!.~.r SXh.B.B.B.m.+.r z.s.z.z.a.O 4X' ~.K K ~.~.K ~.!.W.W.W.W.W.!.!.E.!.!.OXE.!.E.~.eX*.oXoXK 4XeXeXeXeXeX0.0.q.w.w.7.9.3.w.7.7.7.7.7.7.7.<.<.7.,.8.6.7.6.6.6.8.' 9.8.e.9.9.9.e.9.9.9.9.9.e.9.>.7.9.9.<.9.7.7.,.7.7.<.,.8.,.9.8.9.8.9.q.9.9.9.q.8.q.8.0.8.' 6.8.8.' 8.` 8.7.1.8.,.8.8.8./ 6.6./ 8.<.,.8.8.8.8.9.9.8.` ' / ' ' ! ! ! ! 6.0.7.0.*.7.6.*.0.K *.*.] ) ^ ] / ) / ) 2.Q 1.1./ 4.Q 4.Q 4.2.4.Q Q .n 2.j n .n 4.8.` b ( n ( ( b ) k k j ( j j ( ^ ^ k b b k k c k p c k c k c j b n b b m b b j n m ) m M ) m m ) ) m ) ) ) t t t l t l y y u y y u y u u u f.v d.u u g.p u u g.z u y u u u p u y y y l l l y s l l l l l l y y y u k b ( b b b c u i w y y y y y z z x z z l l q x u y u u f.u d.g.u d.u g.i u v f.g.v g.g.u g.d.g.d.i t 5 x t 2 d.d.d.d.2 a.d.f.d.i d.i d.u i i u s b b f s k b s f b f g g g g x s s s y y l t y w y w e e + . `.jXxXxXjXxXjXcXjXkXX . E & O = = = a = 0 0 0 = @ = 1.{ ZXLXIXIXIXIXLXIXLXLXLXLXLXLXLXLXFXLXLXFXFXFXFXFXDXFXDXDXDXDXZXF.DXKXV.< @ ; ; ; a ; a a a a 0 a a < @ d 4 V '.]. X$X XvXvX X XvX X%Xa = = r e r r : h h h h h ;.h h h h r h k @X:XcXvXvX1X%X+X%X$X$X:X:X:X*X&XL.& [ j.[ j.j.j.j.lXx.lXlXlXlXlXx.c.v.l.k k o.X.o.X.X.X.O.X.X.j ^ '.P * %XC %X4 kXJXJXCXV *XY.Y.J.C X . X X * : Q 4.5.Z.t.Z.Z.S.Z.A.Z.A.Z.A.Z.A.A.A.A.A.A.S.S.A.G.", "!.~.~.~.r O.h.B.B.H.B.B.N.{ z.z.z.z.O # H H K H H K H ~.~.W.W.W.W.!.W.W.W.OXE.!.!.~.E.OX~.OXK eX4X0.oXoXeX~.eXeXeX0.eXeX7.w.7.7.9.7.7.7.7.7.7.9.7.,.<.8.8.,.6.6.6.6.6.' 8.9.e.9.9.e.e.9.1.9.e.9.9.6.6.6.<.7.9.7.8.7.<.,.,.6.6.,.7.<.,.9.0.9.8.q.q.8.8.8.' 8.8.' ' 8.6.` ` ` 8.,.8.,.8.8.6.,.8.,.8.~ ~ 6.6.8.8.8.e.8.` / / ` ! K ! ! ! ! ' ! ! *.0.*.7.*.6.*.6.6.` ` / ) / ) ) / ) / 1.2.Q 1.2.Q Q Q n ) Q 4.n Q 4.j j 4.Q j .M 1./ j Q ( b ( ( ( b b ( b j k ( ( b j k k c k M c p k c c k p c c b b b b b b b n ) b n m ) ) m m ) m ) m x l y l t l y x y y x u x x y u z v f.g.u u g.u u u p p u u u u u y l y p l l l l l q l x l z l u y u y y c b b b R l i i p i i w y i y y z z u l u q y u y p i u d.v d.p g.u u d.u u v g.g.g.f.v d.d.g.d.t t g t t t d.d.d.d.d.d.d.d.i d.i f.i i f.i i u x s g ( l g s g ( f g g g g s g t s x 2 x 2 2 y w i w q 1 + o CX.XjXcXcXjXcXjXHXKXP T ] . . = = = = 0 0 0 = = @ a ;.X.DXLXLXIXLXLXLXLXLXLXLXLXLXLXFXLXFXFXFXFXFXFXDXDXFXZXZXDXDXF.F.F.DXNX; @ @ ; f a ; a a a g a a g a < < @ T U ].]. X X:XvXvXvXvX1X1X XE = = e , e r 0 k h h h h h k h k > k k > %X1X%X_ % @ & # @ & & 3 I X;X&X_ ; [ j.6 j.j.j.x.x.x.lXlXlXlXlXx.j.j.[ f p ..o.X.o.X. .O.O.| h _ C X . N * & * U JXJXbXL.&X&XY.C C X X o X ( 4.4.5.Z.Z.G.t.G.A.G.A.A.Z.Z.A.Z.A.A.A.A.A.Z.A.G.F.S.", "!.7XT.Q., O.m.m.B.M.B.IXH.O.z.z.s.s.O O H L H Z K H K ~.Q.!.W.W.W.W.!.W.W.E.!.OX!.!.!.!.!.!.OX4XoX~.oXoXeXeXeXeXeXeX0.4X4Xq.7.w.9.w.9.7.7.7.7.<.7.7.7.6.7.6.6.` 6.6.6.0.' q.q.9.9.9.9.9.9.e.9.6.0.6.0.6.6.` 6.7.<.7.,.~ ~ 6.1.6.7.9.9.q.q.9.0.e.8.8.q.8.9.8.8.q.8.8.' 8.` ,.6.8.,.8.8.,.6.8.~ 8.,.8.8.8.8.8.6.8.8.` ` ` ' ` ~ ' ! ' ! ' ! _ ! ` 6.6.0.*.*.6.*.` ~ ! ! ^ ^ / ^ ^ / ) ) 1.1.Q Q Q 4. .2.Q Q Q Q Q Q Q Q n n o.n .) 1.b ( b ( j b b ( k b ( b j b k b b k k k p k j k j c k c j c c b ) m n ) m b m b m ) n m m m ) m ) ) l y t s y l t y l u y u y u u i u u u u g.u u u d.u u u u u u p u p y y y y y l y l s l s g l l l y y y y y u c b b c y p y w w w y y w y i y z x u u y y p i i y i u d.i g.d.g.g.g.u g.u u z g.g.g.u f.u y t t x t t x d.d.d.d.d.d.d.d.d.i d.d.d.u u i u u z l l g g b b g g g f s g g x x x x t x t 4 2 w i q q 1 < o X VXVX X.X.X.XkXVXUXIXVX. . X O # = 0 0 0 = 0 @ @ k | 5.FXLXLXLXLXLXLXLXFXLXFXLXFXFXFXFXFXFXFXDXFXDXFXDXDXDXDXZXF.G.F.ZXGXR & & @ @ = ; ; a ; ; 0 a 0 0 5 < < @ P ].].$XvX$XvXvXvXvXJXPXUXkXT = = r e r r , = k h > | k h k k k > > ; f : ; ; ( e.4.5.e.4.b d & % _ ].S ; [ [ j.j.j.c.x.x.x.lXlXlXlXx.x.x.j.[ r k ..o.o.X.o.....k h ' |.Y.C * V C . . [ JXJX#XU.*X*XY.B C X X o % Q >.5.C.t.Z.G.Z.Z.A.A.A.n.A.A.A.A.n.Z.Z.n.A.Z.S.S.S.A.", "T.7X~.!.r O.{ ....r # v.c.r z.z.z.z.t O L T.R.Z ~.H ~.Q.W.W.W.W.W.!.W.!.!.W.!.!.!.!.~.!.~.OXOX~.~.oXeX4X~.eXeX4X4XoXoX4XeXeX0.q.3.7.7.3.w.7.7.7.7.8.6.7.6.6.6.6.6.6.6.` ' 0.9.9.9.9.e.e.9./ K 6.0.6.0.0.0.' K ' 7.~ D D 8.6.,.8.8.6.9.q.q.8.9.8.8.0.8.0.' 8.8.' 8.` ` ` ` 6.8.1.8.8.1.6.,./ 8.~ ` 8.6.` 8.8.8./ 8.8.` 6.` / ! ! ' ' ! ! ' ' ! _ *.*.6.6.6.` ! ( ^ ! ^ ( ^ ^ ^ ) / / / Q Q Q 4.Q Q Q 2.Q Q Q n j Q n j j n j j n n j b k ( k b R f b b ( b ( b ( k ( b k b c c k j p c k k c j c j c m b b n ) n n ) m m ) m m ) m ) m l l t l y x l y u y y u x u y u y u u z z g.g.d.g.p g.u u u u u u u z y y y p y y s l y l s l q g l u y y u y y u c y y y y w y w w i i w t y y u y z u x u y i y i u i d.d.u d.p u u u u z v g.u v u d.y w t t t q t t t d.d.d.s.d.d.d.d.d.d.i i i i i i u x l l m g g b s ( k g x g x x x t t t x t 2 t t 2 w q q < # T UXKXVXCXbXHXKXUXPXPXPXE . o @ @ < = 0 < 0 @ @ Q { t.FXLXLXLXLXLXLXLXFXLXFXFXFXFXFXFXFXFXDXFXDXDXZXDXDXZXZXF.F.F.S.F.BX@ # @ @ @ ; ; ; a ; 0 a 0 < 5 q 1 1 @ T ].bXPXUXbXvXvXvXbXPXPXPXJXR = = ; = r s = = a k h > h > k > r k = : b / C.AXGXDXZXAXG.G.u.5.) f d ; @ R j.j.6 j.j.x.c.lXx.lXlXlXlXx.x.j.j.Q s k p o.o. ... .j h k |.*X&XY.Y.Y.C . o kXJXJX'.&X*XU.Y.C C X X . & ;.5.t.t.G.G.Z.A.A.Z.A.A.A.C.A.A.n.A.A.Z.A.A.S.S.S.A.S.", "~.~.~.~.r s.SXz.z.z.O m.d.r O O O O O O H H ~.T.~.K W.W.W.W.W.W.W.W.!.W.!.!.E.~.!.~.OXE.!.!.W.E.OX~.~.eXeXoXoXoXoXoXeXeXeX4XtX0.q.7.w.9.<.9.7.7.8.7.7.6.6.0.` 0.6.6.6.` oX' 8.e.e.9.9.9.~ K K ` 0.0.0.0.*.' E.E.F ~ ~ ~ / 8.8.8.6.6.] ' ] ' 0.' ' e.8.8.9.8.8.8.` 8.` ` ~ ` ~ 8.,.,.6.,.6.,.~ 6.~ ~ ~ ` ~ ` ` ~ / ` ` ] ` ' ! ! ! ! ' ! ! ! ! ! ` 0.*.6.` ! ! ~ ! ! ^ ! ! ! E ^ ^ ) ) / 1.Q 2.Q Q Q Q j n Q j j n .n n j n n j n n b ( b k k k ( b g ( b k b b b s b k b k c k c k c c c c c c c c c b ) m ) b b ) m ) m ) ) ) ) z z y l t t l y t y x x u y u x u u u y u u u i u g.u g.d.g.u v u u v u y p y y y y t s t x s y y x t w y y u y y y y y y y y y w w y w e w y w y y y u y u y u u y i y y u u i g.d.d.u d.g.u g.u u g.z i x t t t t t 2 t t t d.d.d.d.d.d.2 d.i d.f.i u f.u u i u x s x l l g g g x t t 8 t t 2 8 t t 2 q x 2 t 5 i q < # o o VXIXUXKXVXKXKXUXPXPXPXPXKXX . o # @ @ 0 < 1 # 1 Q { Z.FXLXLXLXLXFXFXFXFXFXFXFXFXFXDXDXDXDXDXDXDXDXDXZXZXZXD.F.D.G.F.F.) # & @ = @ @ ; ; f d ; 0 5 0 < < < < # R kXPXPXPXUXbXbXvXJXPXPXPXPX%X= = r = e r r 0 ; = h k h h h f h f > 4.r.AXDXGXKXDXAXAXG.G.Z.5.r.4.1.f = d j.j.j.j.j.x.x.lXlXlXlXlXlXx.x.v.[ k k j . . . .) Q r f ' ;X*XY.&X*X&XY.* * JXJX%XV ;X&XY.Y.B * * X o % 4.5.t.Z.Z.Z.Z.A.A.C.A.A.A.A.A.A.A.A.A.S.S.A.A.A.S.A.A.", "T.).T.2X, ..z.z.z.z.O N.N.m.O.O.} ..r O L H H ~.H !.!.Q.W.W.W.W.W.!.W.!.!.!.~.~.!.!.!.!.!.E.!.!.OX~.OXoX~.eX~.oX*.oX4XeX0.eXeX4XtX0.7.7.9.7.7.7.7.8.8.7.' 0.` 0.6.6.6.6.oXK ` 9.e.9.0.' K D K ! K 0.oX' ~.XXK E._ F ~ ` 8.8.8.8.8.' ] ' ' ' ' ` ' 8.8.` 8.8.6.` ` 8.` ` ` ~ ` ~ 6.,.6.~ ,./ 6.6.~ ~ ~ ~ ` K ~ ~ ~ ` ` ` ! ! ! ` ! ' K ! ! ! ! ! E 6.6.! ( ! ! ( ! ! ^ ! ! ! ( A ! ( ^ Q Q Q 2.n Q Q j Q j Q j b j Q Q n j n j n j j o.k k k ( b g g b k b b k b s b s b b k s c k c c c c c c c c c b b ) m b m ) b m ) ) m ) m z l l s l t t l l y x y u x u y u u u u u u u u f.p u g.g.u g.u u u u u u y y w y w y w y y l s t l t s w q w y y y y y y y y w w y w w w i y y w p w i i y p u i y w i i w i i t q i i u i u u u v u v i t t 2 q t t t t t i 2 d.d.d.d.d.d.d.2 i f.d.i i u i u u y x l t y t i t t t t t 2 t t g 2 2 t x t t 5 2 < 2 0 @ o ^ PXPXPXUXKXUXPXPXPXPXPXPXPXP . . O # < < < < 1 < j ..t.DXFXFXLXFXFXFXFXFXFXFXFXDXDXDXDXDXDXDXZXZXZXZXF.F.ZXF.F.F.S.G.G.f # @ ; @ & ; @ ; a a < < g 1 a < < 1 # R kXPXPXPXPXJXvXbXUXKXUXPXPXCXN = = = r r e ; ; = g > h k > > f : a 5.G.AXAXGXAXGXAXG.G.G.C.5.5.>...( @ 0 R [ j.j.j.x.x.lXlXlXzXlXlXx.j.j.) k c j M j k b k.kX[ g _ *X*XY.*X*X&XP.C V |.U.Y.Y.Y.Y.Y.C C $ X . X S 5.5.Z.Z.Z.Z.A.Z.A.n.A.A.n.A.A.M.S.S.S.M.S.Z.M.Z.N.S.Z.", "~.~.Q.!.= r z.z.s.z.# DXUXh.O.+.+.X., = ~.R.R.R.Q.!.Q.(.W.W.W.!.!.Q.!.!.!.!.E.!.E.W.+X!.!.!.OX!.!.~.~.oX~.~.eX~.oXeXeXeX4XtXyXeXeXeX~.' w.7.7.7.7.7.7.` 0.*.' 6.0.6.` 6.' ' ' 0.q.' 0.0.' K A K K 0.' ' H K XXJ OXH F 6.8.` ' 8.8.' ' ' ] ' ' ' ' / ` ' ` ' ' 8.` ` ` ` ` ` ~ ~ ! 6.,.6.6.~ ~ ~ ` 6.~ ~ ! ` ! ` K ! ~ ! K ! A ! ! ! ! ' ' ' F ! _ ! ! ^ ! R ( ! ~ ! ( ^ ! ( ( ! ! ( ^ ^ Q 2.j 2.4.j Q j j Q j Q j n n .n j j n M j j M b k k k k b s b s b b s l b l s l c b c k c k c j c j c l m l c b ) ) m m ) ) m ) m l l l l t t l y l t y y u u y y u u y x u u u u v u u u u d.d.v d.v u u u u y y y y y t y y y w q y q t q y w w e q y y y w w t w w y w w w w w w y y w y w w p y i i i i i w i t e q q t i i i i u i i u u w t t q 2 t t t t t t d.d.d.d.d.d.d.d.d.d.d.i d.d.d.i u u u u 2 t 2 t 2 t 2 2 t 2 t 2 t 2 t t 2 g 2 2 q 5 2 1 < + o KXPXPXPXPXPXPXPXPXPXPXPXPXPXe.. . . . # # < < @ # @ Q X.Z.DXFXFXFXFXFXFXDXDXFXDXDXDXDXDXDXDXDXZXZXZXD.F.ZXF.F.F.F.G.G.Z.C.f # @ @ ; @ ; @ @ ; 0 < 5 < < 5 < < < # R kXPXPXJXCXPXbXbXHX$ ] PXPXVX( # = = = e r = ; a = k h > k e > : k Z.G.AXAXGXGXAXAXG.G.G.t.5.3.:.#.: ; [ E T _ l.j.j.j.lXlXlXlXlXj.k.[ f f r r k k k s s m zXbXR _ ;X*X&XY.Y.U.B C P.Y.U.*X*X*X&XY.B C * X . * Q 5.5.5.Z.Z.A.A.n.A.A.A.A.A.A.S.S.S.S.S.S.M.S.S.M.A.N.S.", "~.~.~.~.r a.z.z.2 z.+ zXz.s.c.h.+.X.= R.H H R.~.W.W.W.W.W.!.!.W.Q.!.Q.!.~.E.E.!.!.!.W.!.!.OXE.E.~.OXOX~.~.~.eXeX*.eXuXeXeXeXeXeXtX~.OXOX~.8.7.7.7.7.0.0.' 0.0.6.` 6.6.6.~.0.' oX0.' ' *.K F K F K ' K OXE.K K H XXF XX' ` ' 8.9.] oX' ] ' ' ' ` ' ' ~ ` K F J K ` ` ` ` ~ ` K K ~ ! ` ~ ~ 6.~ 6.~ ~ ` ~ ! ! ` ` ' ` ` ! ! ! F ! ! ! ' ! ! _ ! _ ! ! ( ! E ( ( ! ( ! ( ! E ( ( ( ( A ( ( ) 2.2.Q Q Q j Q j j j Q Q n n n .M j n .n j M j b k b k s b s b k l b c c b l b s l c c c c c b c c c c l l s l ) b ) ) b b ) b g l s l t t l t l y z x u y x u x x u u u u u u u u u u g.u u u u u d.g.u u u w y w y w y t w q q w s s t t w w e w w w w w w w w w w w y w w w y w w w y y w w i y i w i i t q < q q q 5 q i u u i u i i t t t t q i t t t t t t x d.d.d.d.d.d.d.d.d.d.i d.i i f.i i i y 2 t q i i 2 t t 2 t 2 i t t t 8 t 2 2 t 2 2 2 1 1 + . N UXPXPXPXPXPXPXPXPXPXPXPXPXIXVX. o # 1 1 1 # # Q { Z.ZXFXFXFXFXFXFXZXDXDXDXDXDXZXZXF.F.ZXZXZXF.ZXZXZXZXF.F.F.S.G.Z.Z.E # & ; @ @ @ ; @ < 5 < 5 < 2 5 1 < 1 # R kXPXPXR * KXvX$XbXCXJXPXPXHXkX; = = = e = 0 0 0 0 0 k k , > f = n C.G.AXGXGXAXAXF.AXG.G.C.5.3.:.W ; [ jX$X[ T 5 4 U [ [ l.R R R g f [ g s k k k r r ] [ s l.kXkX[ +XU.Y.J.Y.Y.L.U.*X*X*X*X*XY.I.Y.C C X X X 5 Q o.n.Z.n.A.A.A.A.A.A.A.A.S.S.S.S.S.S.S.S.S.S.N.Z.S.Z.A.", "T.).~.T.O.1 z.w o s.O s.s.s.s.u +...O ~.R.~.~.T.(.W.W.W.W.W.Q.W.!.!.E.Q.E.E.E.E.!.!.!.!.!.E.!.!.E.!.~.~.oX~.~.eXOXuXrX4XtX4XtXyX4X~.E.OX~.OX' 7.7.6.' *.' 0.' *.' 6.6.6.' oXoXeXeXK ' 0.' K F K F K E.H K E.E._ J E.K J ' 8.8.' ` ' ' oX' ' ' ' ! ' ' ! F F F F K A ` ` ' ! ! ~ ! K ! ~ 6.~ 6.~ ~ ` ~ K K ~ ! K ! ` ! K ~ ! ! ' F ' ! ! ' ! R F ! E E E ( ! ! ! ! ( ! ( A ( A ! ! ( ! ^ Q Q 4.Q 2.Q Q j Q n 2.n j Q Q j j n j j M n j j n k s s g b s b b s c s s l b s l s b c v c c c c c c c l b l b s ) ) m ) ) b x t s g l t l l q l t t s y y u y u u u z u u u u u u u u u u g.u u u u g.u d.u p w w w w y w y q e 0 0 q q q g w w e w e w w w w w w e i w y w w y w w y y w y y w w i i i w e q q q q q 0 q q y i i i i t t t t t t 2 i t t t t t 2 i d.d.d.d.d.d.d.d.d.i d.d.d.2 i d.i i i t 2 2 t 2 q 2 q t 2 t t 2 t 2 t 2 t 2 < 5 2 < 1 # R KXUXPXPXIXUXPXPXPXPXUXKXKXKXKX& . . o # # < # # b ..Z.ZXZXDXFXDXFXDXZXZXF.ZXF.F.ZXF.ZXZXF.ZXF.ZXZXF.ZXF.ZXZXF.F.G.Z.Z.) # @ @ @ @ @ @ @ 5 < < < < 0 < < 1 1 < T %XUXPXKXVXJXHXVXKXUXUXPXPXUXKX] @ = = r = a 0 0 s 0 0 > k = : : 5.G.G.AXGXGXDXAXAXG.C.C.5.5.>.:.~ ; jXjXvXvXjX%XT 5 # @ @ d P x jXjXcX%Xg r s k p c kXbXl.T g kXk.( XXV K.U.*X*X&X*X*X*XY.Y.B Y.V C * o . & Q O.5.n.n.H.A.A.A.A.A.A.n.A.A.S.S.S.S.S.S.S.M.Z.S.N.N.Z.N.", "7X~.~.T...0 2 # ..O O M s.s.p O.r O K ~.W.W.W.W.W.W.W.W.W.(.W.W.!.Q.Q.E.E.E.E.!.W.OX!.!.!.!.!.E.E.E.E.~.OXoXOXOXrXOXuX4XtXeX0.eXoX~.OXOXOXK OX' 6.' 4X' 0.0.' ' *.6.6.6.` oXOX' oX' K K F K F F H ' H K XXH _ E.H _ E.E.E.' ' ' ' ] ' ] ' ' ' ! ` ` K K F F F F F A ~ ~ ! D D ! K A A ! ` ~ ~ ~ ~ ` ! ~ ~ ! ` ! ~ ` ! ! ! ` ! ! ! ! F ! _ ! R ! _ E ! ! ! ( E ( ! ( ! ! ! A ( ( A ( ( ( Q ^ Q Q j 2.Q n Q 2.n Q Q n Q j n n j n n j n j j n k s b s s b s l l c b l s b l c b l b v c c c c c c l c l g l l m ) m x 5 g x s s t l y t l x y t t t l u z x u u u u u u u u u u u d.u u g.u u u d.i y i w i q q q q w i e e q q 0 q q w e e w w w e w w w w w w w w w w p w p y w w y i w y y w q q q q 2 q t q q q < q t i i i t t t t t t t t t t 2 t t t x u d.d.d.d.d.d.d.a.d.d.d.d.f.i d.i 2 2 t 2 t 2 q 2 i 2 q 2 q t t t 2 q 2 t 2 t 5 2 2 1 1 o . ] UXPXPXPXPXIXPXPXPXPXPXUXKXKXKXVX. * X . + # # # # k ..n.ZXZXDXZXZXF.F.F.ZXZXF.F.ZXF.ZXF.ZXZXZXZXZXZXZXZXZXZXZXF.F.F.S.N.V.& & @ @ @ a @ 5 5 5 < q 5 5 1 1 @ @ # T CXJXPXPXUXUXKXKXKXKXKXKXKXKXUXVX( @ = = e e a 0 0 s 0 a f > ; a C.G.AXAXGXGXAXAXG.G.G.Z.5.3.>.#.f 5 jXjXjXcXcXnXjXmXlXcXMXvXMXnXnXnXnX[ s g k k a a ( kXcXjX[ kXkX< g E J B P.&X&X&X*XY.C * C B C * X o O f O.n.n.n.N.A.A.n.A.A.A.n.A.A.A.S.S.S.S.S.M.S.S.N.S.Z.M.Z.S.", "~.T.(.~.K O = e O , +.+.O.O.r = , R.!.T.W.W.W.W.W.W.W.W.W.Q.W.W.Q.E.E.E.E.!.E.(.(.W.(.!.OXW.!.E.!.E.W.XXOXuXOXOXrXuXtXeXeXtXtX~.!.~.~.E.OX!.' OXoX' ' oXeXK 0.6.6.' 6.6.6.!.XX!.OXE.F F F ' F K XXK XXE.K E.E.K K XXE.K J H K ' H K _ OXoX' ` ' ' ` A F F F F F F K K A ' A ! K D ! A ! D K ` ~ ` D ~ K ! D ! K K ! A ` F A ! F ! ! ! _ A ! ! E E ! ! E ( ( ! ! ( E E ! ! ( ( A ( A ^ ( ^ ( Q Q Q Q 2.n Q n 2.j j Q j j j j M j n j j M n j n c s b b c c c b s b s l b b s l c l c z b c c c v l l g x d 4 g b d 4 g 5 s s l t q l s t q l s y t t y t y z u u u u z u f.u u f.u u u i i p y y w i w q e q e i w w w e e 0 e e q 0 e e e e e w w w e w w w w w w w w w w w w y w w w w w w i 1 q q q q q < < q q q q < w i t t t t q i q i t t t t t t t z d.d.s.2 d.d.d.d.2 d.d.2 d.i i i i i i 2 i 2 2 2 t 2 t 2 t 2 2 2 2 t 2 2 2 5 2 2 1 1 1 # . o o & KXPXPXPXPXPXPXPXPXPXPXPXPXPXIXKXUX] X X . o # @ + # s X.+.F.F.F.D.F.F.ZXF.ZXF.ZXZXF.DXZXZXZXZXZXZXZXZXZXZXZXZXZXF.F.F.G.A.Z.E # < & @ < < 1 < < 1 1 1 1 @ 1 1 1 + R VXUXIXUXKXVXKXUXUXUXIXIXKXVX[ VXNX= = = = = 0 0 0 0 0 0 ; = @ j r.G.AXGXGXGXDXAXG.G.Z.r.r.>.>.#.@ R jXcXcXxXxXnXnXnXnXmXMXMXmXnXnXnXcXP s s r b ( g 0 1 [ zXMXmX[ @ @ ; ( E V B L.K.C C C Y.J.J.N * X & k .o.5.n.n.Z.M.A.A.H.A.A.A.A.A.n.S.S.S.S.S.S.S.S.M.S.S.S.S.S.", ").T.7X~.!.T.O O L = O = = = = L T.~.Q.W.W.W.W.W.W.W./.W./.W.W.W.!.Q.E.E.E.E.!.!.W.!.!.!.!.!.OXW.W.+XXX+X+XOXOXuXrXtXuXtXtXtX~.).!.OXOX!.OX' ' OX' oXoXK ' ' oX' ' OXOXXXE.XXOXE.OXXXJ F J K E.' K H ' E.K E.J _ K J J E.XXH K F ' ' J ' _ ' ' ' ! K F F F F K A F A A A A K F ! A K ! D ! A ~ ` ! D ` ! K ' K ! ~ ! A ! ! ! ! ! ! ! E E E R F R ! R F E ! E ( A ! A ( ( ( A ( A E ( ( ( ( ^ ( 2.2.j Q Q 2.Q n Q Q n 4.j j j j j c j M k M .n n b s b b b b l l l b s s l s c b v v g x g 4 4 4 4 4 g 8 4 4 4 5 5 5 g a x s y s l t s t l t l s t t q t t y u u u f.u f.u u u u u i u i y i i y y y e q e i q q q i e 0 0 e q q e 0 e e e e e e e w w w w w w w w w w p w w w w p w w w w q q q 1 q q q < q q q < q q 0 q i t t t t t t t 2 q 2 t t t t i f.d.d.s.d.d.d.d.d.d.2 a.d.2 d.f.a.2 f.2 2 i t t 2 t t t 2 t 2 2 2 2 2 2 t t < 2 1 1 1 1 + * . CXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXUXKXX . X o . + 1 1 9 2 O.O.D.S.G.F.F.ZXF.ZXZXF.ZXZXDXDXZXZXDXZXZXZXZXZXZXZXZXZXZXZXZXF.F.A.A.V.& # @ < 5 5 < 5 1 5 1 5 5 < < @ # + [ KXKXKXVXVXVXKXKXKXKXKXKXHXBXT kXKX) @ @ 0 0 0 0 a 0 0 a @ @ @ 1.Z.AXAXDXGXAXAXAXG.G.C.5.5.>.{ > # Y cXjXcXjXxXnXnXnXnXmXMXMXmXnXnXnXjXd = s s kXMXkXq a g kXmXmXkX_ +X+X_ f S S C B J.J.J.J.C G N $ X ( M O.o.n.n.n.A.n.A.A.A.A.n.A.H.A.A.N.S.S.S.S.S.S.S.S.S.S.S.S.S.", "~.!.~.T.!.~.~.R.R.H R.H L R.H R.!.Q.(.(.Q.(.W.W.W.W.!.W.(.W.(.W.W.(.(.E.~.E.(.W.!.+X!.+X!.+XW.XX+XW.+X+X+X+XOXeXuXeXtX4X4X!.!.~.).~.~.OX!.OXE.~.!.OXOX!.!.!.!.!.W.OXE.E.XXE.OXE.XXOXH E.J H J J H ' H K XXE.K E.E.E._ K E._ XXH E.J ' H ' J F ! F F F F F F K F A K F K A ! ! D ! A D A A A A D ! ' D ! ! ! D ! K A ! ! K ! A ` ! E F ! F ! E E F E ! E A ( E ( ( ( ( A ! ( A ( ! R ( ^ ( R ( ( Q 2.2.Q j Q 2.n j 2.j j j n c k n k j j j M j n k c s s s s s b c s c c s b s s 4 5 3 5 3 5 3 g 4 g 5 4 4 g g 5 g g 4 x g t l t q l l t t s t t w s q q q t q y u u u u u u u u u u y p y u y y i w i q q q q q q q q e q 0 e < 0 w e e e e e e e e e e e w w w w w w w w w w w e w w w q i q t i q q q t q q < q q < q < i t i i t t t t t i t t t 2 i x x d.d.2 d.d.d.d.d.d.d.d.f.d.2 d.2 d.8 i 2 2 8 2 2 2 2 2 t 2 2 q 2 5 t 2 5 2 2 2 5 1 1 1 o . X % IXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXE & & O . + + 1 + 1 4.+.N.t.S.G.F.F.ZXF.DXZXDXZXZXZXZXDXZXZXZXZXZXZXDXZXZXZXZXZXZXZXF.F.F.A.[ # # < 1 < < 1 g 1 < < < 1 1 1 @ # k.KXCXVXCXVXVXVXCXVXCXVXVXVXk.E e.KXVXd @ < 0 0 a < 0 < a @ 5 @ 5.C.G.AXGXGXDXAXG.G.G.t.5.5.>.;.f & jXjXcXjXnXnXnXnXnXmXmXMXMXnXnXnXnX[ a a e w y kXcXzXkXcXmXjXjXMX|.;X}.V E = : A C B C C C V V C * * h p o.O.n.n.A.n.A.n.n.A.A.A.A.n.n.A.N.S.S.S.S.S.S.M.S.S.S.S.S.S.", "T.~.~.T.~.!.!.!.~.H E.H G H H H !.!.(.W.W.W.W.W.W.W.W.(.W.W.W.W.W.(.W.!.W.W.+X!.W.!.W.W.XX!.W.+X+X+XW.W.+X+X+XOXrX4XtXtXOX!.!.OX~.OX!.!.OXW.#XW.+X!.!.!.OXW.W.E.W.W.!.~.XXXXE.~.E.~.E.E.E.K E.K XXE.K H K K XX_ E.OX_ H H XXK E.E._ K _ ' F F K F F F F F K F F A K A K D ! D A S A A A ! D A A F K ! D K ! D D ! ! ! A ! A ! ! F F F E E E ! _ A E ! ! E ! ! E E ( A ( ! A ( ( ( ( R ( ( R ( ( 2.j 2.Q Q Q Q Q Q j j j k b j b j b j j j j n n n j c s s s s s s c c 4 5 4 5 5 5 5 P 3 5 3 5 4 4 x 5 5 4 x 4 x g d 5 g s t l q l t t l t l t q q t g t q s q t t q w i u u u u u i y u y y y y w w q w i e q q q q e q e q 0 e e e e e e e e e e e e e e w w e w w w w w e w w w e e < q i 2 q q q 2 e 1 q q 2 q q < q < i i q 2 q q i t q i t t t 2 u z x d.d.d.d.d.d.a.d.d.d.2 d.d.2 f.d.2 d.d.2 8 8 8 8 2 8 8 2 2 < 2 < 2 t 2 < 2 2 1 < 1 1 # . * . CXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXNX. . X . . . + 9 1 1 X.O.+.N.G.F.F.ZXZXZXZXZXDXDXZXDXDXZXDXDXDXDXDXDXZXDXDXDXDXDXDXZXZXF.F.S.C.T # 9 1 1 < 1 < 1 @ 1 1 < 1 # # 4 VXCX_ NXVXVXCXVXCXVXVXVXVXCX] E CXKXKX] @ @ 0 @ < 0 0 < < @ & g 5.G.AXZXGXDXAXAXG.G.t.C.5.3.3.{ & 4 jXvXcXcXxXxXnXnXnXmXmXMXmXnXnXnXnX[ a a e g e k [ kXbXlXj.g [ kX{.&XL.C R = @ S L.U.Y.I.&XY.&XY.C * f k o.n.+.n.n.Z.n.A.H.A.n.A.A.A.n.A.A.M.S.S.S.S.S.S.S.S.S.S.S.M.", "~.(.~.!.(.~.T.!.R.R.P 5 N H H R.T.!.T.!.(.W./.W.(.W.W.W./.W.(.W./.Q.(.W.W.(.W.W.+XW.#XW.!.XX+XW.W.XX+X+XXX+X+X+XOXtXuXOX#X(.(.(.(.).(.(.!.OXW.OXW.OXW.!.OXE.OX!.OXE.XXE.E.~.E.OXXXE.E.E.E.E.J E.K E.OXXXXXH F H K H E._ K XX_ E.E.H E.K J F ' F F F K F F F F D K A F A F F A A A D A A A A A L A A A ` ! ! ' A F A A A D ! A A ! E ! ! ! F A E ! ! _ E ! A ( E ( A ( ! A ( ( A R ( ( E ( ( ( ( Q 2.Q Q 2.Q Q Q Q Q ( Q ( k j k j b b k b n j n j f T f f f f f b b c 5 4 5 4 5 4 3 5 5 5 5 5 4 4 g g g 5 a d t 5 t g g g s t l t s s t s t l q q s q q q q q y t < < < i u u u u u u u u i i y w w w q w q q q i e e 0 0 q e q 0 e e r e e r e e e e p e e e w w e e e e w e e e e e e q q q t q q w 1 q q q q q 0 < q q q i 2 t i i 2 t 2 2 t t t x z z z i f.2 a.d.d.2 d.d.d.d.i a.i d.8 a.i 8 a.2 8 2 2 8 8 8 3 2 2 2 2 2 2 2 < < 2 1 2 1 1 + o X O UXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXKX . X . 9 + + + b +.+.Z.Z.F.ZXZXZXZXZXDXDXDXDXDXDXDXDXDXDXDXDXZXDXDXDXDXDXDXDXDXDXDXZXF.Z.5.R @ # 1 1 @ 5 5 @ 1 1 1 # 1 # [ KXCXE ] CXVXVXCXVXVXVXCXCXVXE ] KXKXKXNX5 # @ < < 0 < < = @ @ Q Z.G.AXFXGXDXAXAXG.G.G.Z.r.>.:.h # [ jXcXjXcXnXnXnXnXnXmXMXMXmXnXnXnXjXx 0 g s s f e s g b g ; @ < XXU.Y.G C T T E _ I.*X*X*X*X&X*X}.V * f k O.o.5.5.n.n.n.N.n.n.A.A.n.A.H.A.A.Z.S.S.S.S.S.S.S.S.S.M.S.S.", ").~.7X~.T.~.!.Q.~.E k.] [ P R.R.Q.!.!.(.W.W.W.W.W./.W./.(.W./.+X(.W.(.W.#XW.W.(.!.W.!.!.W.W.W.XXW.+XW.+X+X+X+X+X+XuX#X+X#X!.!.!.(.(.(.OX!.W.XX!.OXW.W.OXW.W.W.W.XXOXOXE.OXE.E.XXOXE.E.OXE.E.K E.XXH H ' J OX' H H K K E.E.J E.' E.H E._ ' J F F F F F F F A F F K A K A ! F K A A A A D A A A F F A A F D K F A S A D A A A A F F F E A E A ! A E E E ! E ! E ! ! ( A ( ( ! A ( ( E ( E R ( E ( ( Q 2.Q Q Q Q ( ( ( ( f ( ( ( b j k j b j j j k d S d f d f d d f g f 4 5 5 4 4 5 4 5 3 3 5 5 d 5 g g x g 5 g 4 g g g 5 g q x t l x q g g s s q q q 2 g q q s q w 0 < e < e w u u u u u u u y y q e w e w q i q q q 0 e q e e < q e e e e e e e e e e e e p e w e e e e p e e e e e e e q 2 t q 2 q q t q q q q < < q q q < t t t q i t t t i q t 2 x z z z z z d.x f.f.x 8 8 i d.a.2 f.2 d.8 8 8 8 8 8 8 2 2 7 8 2 1 2 2 1 1 2 2 2 < 2 1 1 1 # o X . R PXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXUX. . X + + 1 + g 5.+.Z.G.F.ZXZXZXDXFXDXDXDXDXDXDXDXDXDXDXZXDXDXDXDXFXDXDXFXDXFXDXDXDXDXZXN.O.4.a @ 1 < 5 1 1 1 1 # 1 + + NXKXVX[ E NXCXVXVXCXVXVXCXVXBXR VXVXKXKXCX& # @ < @ < @ < 0 # % 4.G.AXDXKXFXAXAXAXAXC.C.r.5.>.#.f & ].jXcXcXxXjXnXnXnXmXmXMXMXmXnXnXnXkXa 0 0 g r s e s e g a g = d {.*X;XL.$ % & N V Y.&X*X*X*X*X&XP.V * & b k O.n.n.n.Z.Z.n.n.A.A.A.A.A.n.A.N.n.A.S.S.S.S.S.S.S.S.S.N.N.", "T.!.T.(.~.!.!.W.T l.SXSXl.x 5 ).(.W.(.!.(.Q.W.(.W.W.W.(.W.W.(.W.Q.(.W.W.+XW.+X(.W.W.XXW.+XW.W.+X+XW.+X+X+X+X+X+X+X+X#X+X+X(.(.(.OX).(.#X+X+X!.!.W.!.+X!.!.OXOXW.E.E.E.XXE.!.E.E.E.E.E.H E.E.E.E.K E.E.E.E.OXH E.XXE._ H K XXJ H E._ E.K _ F F F K F F F F K F F A A A A A A ! A A D F D A A A J L F A A A A K D A A A A A A A A ! A E A F ! E ! ! E ! E ! E ! ( ( E ( A A E ! ( R ( R F E S ( S E Q Q Q Q ( D ( E ! ( E ( ! ( k b ( j j j j E d d S S d d : d d : ; % 4 5 4 5 5 4 5 4 5 4 4 5 4 x g 4 4 g x g g g g g g 4 g g g t g s x t x s t q 0 q q q t q t q < 0 < @ < 0 q t u u u u y i q e q e q q q e q q q 0 q e q q e e e e e r e e e e e e e e e e e e e e e e e e e e e e q 0 e q q q q t q 2 q q q t q q < q < q i 2 i t t t t i 2 2 t z z x f.x z i x x x f.f.x x x a.x x 8 8 8 8 7 8 8 8 2 8 8 2 3 1 1 2 2 2 2 q 5 2 2 1 5 1 9 o X . CXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . . X . . + + + + 9 C.+.+.S.F.F.ZXDXDXZXFXFXDXFXFXFXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXDXDXDXZXZX+.O.) 1 # 1 1 1 # 1 1 1 # # & CXKXKXCXR ] CXCXCXCXCXCXCXCXiXNXVXKXHXKXCX@ # # # 1 @ @ @ < # E 5.G.G.AXAXAXAXBXG.G.G.t.5.>.:.| : % jXjXjXjXcXxXnXnXnXmXmXMXmXnXnXnXnX[ = a 0 e k s c s s s w s s g XX&X&XB N S $ C U.&X*XY.Y.U.U.L.V N X X E k o.O.5.n.5.n.n.n.Z.n.A.n.A.A.A.A.Z.A.S.S.S.S.S.S.S.S.S.S.S.", "7X!.T.~.E.!.E.x l.SXSXv.l.j.a.3 !.(.(.(.(.(.W./.W.W./.(.W.(.W.W.(./.W.W.W.(.+XW.W.W.XXW.W.W.XX+X+XW.+XXXXX+X+X+X#X+X+X#X+X#X#XOXOX+XXXXXXXOXXXOXW.OXW.W.OXW.W.OXE.E.XXE.OXXXE.E.E.E.E.OXE.E.K ~.E.E.E.E.OXH J _ ' J _ E.K E.H XXE.H XXJ K F F F K F F F F K F F A D F F A A A A A A D A D A F L J L J S F F A F K A A A A A S A ! A E A E ! E ! ! E ! ! E ! E ! ( A ( E ( ( R ( E ! E V V J A : S ( k S S : ! E A ( S ( E ( ( h b j j ( k E T ; S T S : ; ; ; S d ; d 4 5 4 5 5 5 4 4 5 5 4 5 g g 4 x g g g g g g g 4 4 4 P 4 4 4 g g x g x w s q g q q t q q q 0 @ < < 0 < e < < 0 t u i u t q q e e q q w q q q q e q 0 e e q e e r e e e e e e e r e e e e e e e e e e e e e e e e < 0 0 q q q q q q q 2 q 1 q q q < q q q 2 2 i i q t t 2 t 2 z z x z f.u x x f.f.x x x f.x x x 8 8 7 8 8 7 8 7 8 8 2 2 8 2 2 2 1 1 < 2 5 2 2 1 5 1 9 1 + . & KXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . . o o + + + + g.Z.N.S.F.ZXZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXDXFXFXFXDXZ.O.j # 1 + # 9 # 9 # + + + & VXKXKXKXNXR NXCXCXCXBXCXCXCXkXCXVXVXVXVXCX5 @ # + & + # 1 # # b C.G.e.4.^ : f f : NXNXe.] ] NXk.e.V.%Xk.%XV.k.JXnXnXnXmXmXMXmXnXnXnXcX[ = 0 s r g s s s s p s w w a ( I V B N & & C }.*X*X*X}.J.B C V N X X f j .O.n.5.n.n.5.n.n.A.n.A.n.A.A.A.A.A.A.S.S.S.S.S.S.M.S.S.S.", "~.!.~.).!.OX[ l.SXSXzXh.h.v.l.[ 5 E.).#X#X#X(.W.(.W.W.W.W.(./.(.W.W.W.W.W.+XW.W.W.XX/.W.W.W.+XW.XX#X#X+X+X+X+X+X+X+X+X+X+X#XXX+XXXXX+X%XXX+X!.XXOXW.XX!.W.W.OXE.OXE.!.XXE.E.E.!.E.E.E.E.E.E.E.E.E.E.E.K E.' J E.J E.E.F E.J ' XX' E.XXK H F H F F F H F F F F F A K A A A ! K D A A A A A A L J S J S F F F F A A K K A A A A A A A F A A A A E E ! ! E ( ! ( ( E ( ! D A ( ! E ! E G G J J J S ( D f S d S S E S S ( E ( f ( ( ( ( ( k E S S S : N : N S : % ; % ; % % 4 5 4 4 4 g 5 5 g 4 4 4 g g g g g x 4 g 3 4 4 4 4 4 4 4 4 4 t g 8 g g t q q q q q q q q < 0 0 q < q q < q 5 a < q u g 0 q e q e q q q e w q q q 0 q q q e e r = r e e r r e e e e r e e e r = e e = e e < 2 5 < < q 0 5 q q q 2 q q q t q q 0 q q < < 2 t 2 2 t 2 t q 2 t x z z z x z z u x x x x 8 8 8 7 8 7 7 7 7 7 7 7 7 7 7 8 8 3 3 3 1 1 5 t 2 2 2 2 2 2 1 1 1 + . 4 . UXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXPX* X . . + + + 9 + g AXZ.S.F.F.DXDXFXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXn.5.< # + 1 # < a < 1 < 5 # P CXKXVXVXVXCX] NXNXNXBXiXNXNXNXCXVXVXVXVX%X%XI [ ] [ R R d < # ) 2.( ; & # @ O @ @ ) & kXnXxXnXmXMXMXmXnXnXnXjX% @ 0 0 s s k w s p s s s s w a ^ _ Q.J.* * B *X*X;X*X*XP.V C V * * o d M O.o.O.+.n.n.n.n.A.A.n.Z.n.A.n.n.A.n.A.S.S.S.S.S.S.S.B.S.S.", "~.).(.!._ [ l.CXSXl.3 5 x [ l.V.] 5 E.#X).#X(.#X/.W.(.W./.W.(.W.W.W.W.Q.W.W.W.XXW.W.W.W.+XW.W.+XW.+X+X+X+X+X+X+X+X+X+X+XXX].XXXX+XXXXX+XXXXX!.OX!.!.W.OXW.W.!.E.E.E.E.E.OXE.E.E.E.OXE.E.E.E.E.E.E.E.E.E.E.E.J K _ XXH XX_ E.J H K XXH F H F F H H F F F F L F F A A A A K ! A F A A K A A F J L L L J F F H F H F K F F F F A A A A A ! E S A A E ( ( E ! E E ( ! ( ! E ! ( R R E J G G G J G G S ( S ( S S S S ( S S ( f E ( f ( k f S S d d S S : T S S & % ; % ; ; % 5 4 g 5 5 4 4 4 5 4 5 5 x g 4 g 3 4 4 P P 4 4 P P 4 4 [ 4 4 4 x g g s x g q g q g a a 0 a 0 0 < 0 0 0 < < 0 0 5 < a < q q e e q q w q i q w q e e q q e e e e e r e e e e e e e e e e e e e e = e e e e 0 3 7 3 7 5 < 0 q q q q q t 1 q < q < 2 2 t 5 q 2 2 2 2 q 2 2 2 t 2 2 i x u f.x x x x x 7 8 7 7 7 7 7 7 7 8 8 7 7 7 7 8 7 2 2 3 3 2 8 8 8 2 1 q 1 1 1 9 # 1 + * . IXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXPXPXPXPXIXX . X o 9 9 1 + 1 BXS.S.F.ZXDXDXFXFXFXFXFXFXFXFXFXFXFXFXFXFXLXLXFXFXFXFXFXFXFXFXFXFXFXFXZX+.C.< 1 + 1 1 d k.%X%X%X%X X].HXVXVXVXVXVXNXNXNXNXNXNXNXiXNXNXVXVXVXCX X XvXvXvXNXNXNX] a @ ; @ # # # # @ # @ @ g.* bXjXjXxXmXMXMXnXnXnXxX[ a = 0 s s e c s s s k w s s s 0 0 f g E N V I.*X*X;X&XY.L.N C N * X X a p o.n.o.n.n.n.n.A.n.n.A.A.H.A.n.A.A.Z.N.S.S.B.S.S.S.S.S.M.S.", ").!.).S [ [ 8 7 5 % NXVX] 5 4 g 5 P 5 (.#X(.#X#X#X(.(.W.W.(.W./.(.#X!.XXXXW.G L.W.W.W.W.W.XXW.W.W.+X+X+X+X+X+X+X+X+XXX+X+XXX+X+XXX+X+XXX+X+XXX+X+X!.XXW.W.OXW.XXW.E.E.E.E.W.E.E.E.E.E.OXE.E.E.E.E.K E.E.E.~._ E.E.K ' H E.K XXK J E.H F F H F F H H H F H F F F F F A A A A A A K A K A A G L J J J F H L J F F F F F L F A F A F A E A F A A A A E ! ! ! ( ! ! ( A ! ( E E R ! J V J G J V J G J S S S S : S S E D E D E ( ( ( k ( E E S S S S N S N N N S & ; % % ; @ 5 4 5 4 4 g g 5 d 5 d 4 4 4 4 P 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 2 g s g q 5 a 0 a a a < a q 5 0 q < < 0 0 < q < q 0 q q e q < q q q q q q q e < e e < e e e r e e r e r e e r e e r e e e e e r e e e 3 8 3 3 3 3 7 3 1 q 5 0 < q q q t q q q 0 < 5 2 2 i i 2 2 2 2 2 2 2 2 2 2 2 u x 8 8 8 7 7 7 7 8 7 8 7 8 7 7 7 7 8 8 7 7 7 2 3 2 7 8 x 2 5 5 2 2 2 1 1 1 1 # o * Y * * UXPXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXPXPXKX. X . X X + . + + 1 9 9 1 ) DXS.F.F.DXDXFXFXFXFXFXFXFXLXFXFXLXFXFXFXFXFXFXFXLXFXLXFXLXFXFXFXFXFXF.t.BX# 1 1 # # [ CXCXBXkXbXvXvXvXHXVXVXVXCXCXiXkX%XNX] NXV.%XNXVXVXkX X X:X1XvXvX1XCXCXNXT # @ @ # # @ @ @ @ 0 < V.# zXjXjXlXcXMXmXnXnXnXxX[ @ 0 0 k s w s s e p s e s w s s s 0 = = S V U.Y.*X&XL.V C N $ * O X o f k o.o.n.O.b.n.n.n.n.n.n.n.n.A.A.A.n.Z.N.S.S.S.S.S.S.S.M.S.S.", ").).!.(.(.).~.(.P CXIXUXVX] N (.#X).).#X(.#X(.(.(.(.(.+X(.(.W.(.OX+X#X+X!.XXQ.V V G E.XXXX+XW.+XXX+X+X+X+X+X+X%X%X+XXXXX+X].XX%X%XXX+XXXXX+XOXOXXXOXW.W.OXXX!.W.OXE.E.E.E.W.E.E.OXE.E.E.E.E.K E.E.E.E.E.~.E.E._ _ K ' J F XXK XXE.H J F F H J H F H H F H F H F H L F F S F F F A K A A L H L H H F H F F H F J F L F F F A F A E A F A A S J S F S ! ( E ( E ! A ( A ! R R R J J G J G G J J N J S S S S N S S S A A ( S E E E S E E S S T S N - N S - N N N & & ; % % 5 5 % 5 4 4 4 4 4 4 4 4 4 4 P 4 4 4 P 4 4 4 4 T 7 T 4 4 P 4 4 4 4 4 s g g 5 g a 0 g a < < a 5 0 < a a < 0 0 < q 0 0 0 < ; 0 0 0 0 0 0 a q 0 0 0 0 q 0 0 e q 0 q 0 e e e r e e e r r e e r e = e e e e e 3 3 3 3 3 3 3 7 3 3 7 5 < 0 < q q 2 t q q 5 5 2 < 2 2 2 2 2 2 2 2 2 2 2 2 8 7 7 7 8 7 7 7 7 3 8 7 7 8 7 8 7 7 8 7 8 7 7 8 8 8 4 8 8 8 8 5 2 < 2 1 1 1 1 9 + 9 cXxXxXC [ IXPXPXPXPXPXUXPXPXPXPXPXPXPXPXPXPXPXJXbXbX* . % X o + 9 9 1 1 < BXF.F.F.DXDXFXFXFXFXFXFXFXLXFXFXFXFXFXFXFXLXFXFXFXFXFXFXFXFXFXLXFXFXN.DX) + 1 + 1 @ ] CXVXkX XvXvXvX:XkXVXVXCXVXCXiXk.%XV.NXkXe.V.V.CXkX].]. X:XvXvXvX$XVXCX%Xg # @ # @ @ @ # @ < < q V.* kX.XjXjXjXmXmXnXnXnXjXd < 0 0 w s s s e s e s s s s s e s : e = ; N C L.L.V R.C N $ * * X X X R p o.o.n.b.n.n.n.n.n.H.n.n.n.A.n.n.A.A.n.A.S.S.S.S.S.S.S.S.S.", "(.#X#X(.(.(.(.).P k.CXVXV.^ 4 #X#X#X#X#X#X(.(.#X(.).(./.(./.W.(.#X(.OXOXOXW.W.E.'.J E.Q.W.W.W.+XXXW.XX#X+X#X#X+X+X+XXX+XXX+XXX+X+XXXXX+XXX+XXX+XXXW.OX!.W.W.E.#X#X!.XXE.E.E.W.E.E.E.E.W.~.E.E.E.E.K ~.E.E.~.E.H E.XXH XXE.J E.H E.F F H F H H F H K J F H J H H H H F F L F D F F A F D T.H G L F J L H L F F L F J F F F F A F F F J G A L A A A A A E ( ! ! ! ! ( ( ! ( R _ G V G V J V L G J J G J S S S S S S S S A S ( A S A S S T S S S S N N N % N S - N N ; % : % 5 5 5 g d 4 4 4 P 4 P 4 P 4 4 d 4 4 4 4 T 4 4 P x 4 4 g 4 4 d d 4 4 l s a a q a < a a 0 a 0 0 q < < a 5 0 0 0 0 < a 0 0 0 0 0 0 0 0 @ 0 0 0 ; 0 = 0 0 = < 0 = 0 0 = 0 e e e e e e r e e e r e e e e 0 5 2 3 3 3 3 5 3 3 3 7 7 7 3 3 5 < q q < 2 t < q < i i 2 2 2 2 2 2 2 8 7 3 7 7 7 7 7 7 8 3 8 7 8 8 7 8 7 7 7 8 7 7 7 8 7 3 8 8 8 8 2 3 2 3 2 2 2 2 1 1 9 + 9 Y xXxXxXxX* R UXPXPXPXPXIXIXPXPXPXPXPXPXPXPXPXPXMXnXnX* . o .Xj.+ 9 1 1 + 1 k.AXF.F.F.DXFXFXFXFXLXFXLXFXLXFXLXLXFXLXFXLXFXLXFXLXFXFXLXFXFXFXLXF.F.AX1 1 # 1 # # ^ %XVXCXvXvXvXvX X X XkXCXVXCXNX%Xk.iXiXk.%XkX%X$X X]. X1XcXvXvX1XHXVXVX] d @ 0 @ @ @ @ < = < e < k.# kXY Y jXjXjXnXjXjXjX[ < 0 g a e s s s s s w s s s w s w p e r ; f V C N N C C C N & + * + o & b r o.o.b.b.O.b.n.n.n.n.n.n.Z.A.A.A.Z.n.A.A.A.S.S.S.S.S.S.S.S.", "#X@X).] 8 3 x 7 3 g [ l.[ 7 9 1 5 d % ).(.#X)./.>X(.#X/.(.W./.(.#X#X#X#XOXXXXXE.J Q.XXQ.W.W.XXXX+XXX+X+X+X#X+X+X+X@X+X+XXX+XXXXX+XXXXX+X+XXXXX+X!.OXW.W.!.XXOX@X@X%XOXXXE.E.E.E.XXE.E.E.E.E.E.E.E.E.E.E.K E._ E.E.J E.K K Q.E.G F H H F H F H H H H J H F H H H G L T.L J F F F K A A K H G L H F J H L H F F F F F F A A A F A G L G L G G J S A A A A ! ( E ( A ! ! ^ R E G G J V J G G N N G N S N L S S S S S S S S S S A A S A S S N S N N N N L N - S N N : % % % 5 & % 5 4 g 4 P 4 P 4 4 4 P 4 4 4 d x P 4 4 g 4 g d 7 4 4 d x P d 4 P ; 5 a a a a 0 a < a < < a a 0 < < < 0 < a 0 0 a 0 0 0 0 ; 0 ; 0 0 0 ; 0 0 = 0 0 0 0 0 0 0 ; 0 a < q q 0 e e e e e r e r e r r e q 3 5 3 3 3 3 3 3 3 3 3 3 3 3 8 3 3 3 q q q < 1 5 < 2 2 2 2 2 2 2 7 7 7 7 3 8 8 7 7 8 7 7 8 8 7 7 8 3 7 7 7 8 [ 8 8 7 8 7 3 8 3 8 8 8 2 8 2 8 2 2 1 1 Y Y Y .XcXxXxXxXxXcX. & KXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXbXxXcXX C nXxX+ + 1 1 + 1 1 V.DXF.ZXDXDXFXFXFXFXFXFXFXLXLXFXFXLXFXFXFXFXLXFXFXLXFXFXFXFXLXDXA.GXV.# # 1 # 1 # [ VXVXHX$XvXvXvXjX X X].]. X%X%X%XkXkXkX$X$X$X X X X X]. XvXvXvXbXCXVXVXNX@ @ # @ < 0 0 0 q < q 1 k.# V.6 Y Y ].j.[ [ g < @ 0 0 e g s a g 0 s s 0 s w k 0 p c c p s = E /.Y.V C * * $ X * C * * & X ( k o.b.O.n.n.b.n.n.n.n.n.n.H.n.A.n.H.A.A.n.M.A.S.S.S.S.S.S.M.", ").).).).OX[ k.SXl.l.7 2 8 8 j.l.[ d _ ).(.).#X#X).(.(.).(.(.+X#XOX#X#X#X@X#XXXQ.XXXXQ.W.XX+X+X+X+X+X+X%X+X%X+X+X%X#X+X@X+X%X+X+X#XXX+XXXXX+XXXXX#XW.XX!.OXOX@X@X@X@X#XOXXXE.W.E.E.W.E.E.E.E.E.XXE.E.E.K XXJ H E.E.' _ G E.E.E.K K F H F K H F F F H H H H H H J G G G G R.R.H F A A A H T.T.G G J L F H L H H F F F F F L J L H H G H V G L G G F A A D A A ( A ( E R R E G G G G G G J G J J J J J G N S N S S S S S J A A S S S S J N S S $ N L N N N N N L N N N & ; % 5 % % & d 4 4 4 4 4 4 4 4 4 4 d 4 4 4 d 8 P d 4 4 d d 4 4 4 4 % 4 4 ; % = 0 a a a a a a < a a 5 0 a 0 a a < 0 0 0 0 < 0 = 0 0 0 0 0 0 0 0 0 0 0 a ; 0 0 ; 0 0 0 0 0 0 q 0 0 < 0 0 e e e e e e e e = q 5 2 3 5 2 3 3 3 3 3 3 3 3 3 3 3 3 7 3 7 3 3 5 2 < 1 2 2 2 7 9 2 3 8 7 8 7 7 7 7 7 7 8 3 7 7 8 7 7 8 7 8 8 7 8 7 7 8 3 8 7 7 8 8 2 8 a.8 2 2 5 1 1 Y cXxXxXxXxXxXxXxXxXnX.X X VXPXPXPXPXPXPXPXPXPXPXPXPXPXUXbXnXxXY . . . C jXxXjX+ + 9 9 1 9 x VXLXFXFXGXLXFXGXFXLXLXLXLXFXLXLXLXFXLXLXLXFXFXLXLXFXLXLXLXLXLXFXGXUX) + + 1 1 + + T VXCXCXBXkXvXvXvX X XU ].]. X X X]. X X$X$XvXvX X$X X X:XvXvXvXNXNXCXCXNX& # # < # # @ < 0 1 < q m BXV.V.V.V.V.CX& k.o X * # # # + # < = < a 0 0 s w e s 0 s s a s w s s p w w k ; E >X*X;XJ.C * * C N ].lXY * X d p p p o.O.b.n.O.b.n.n.n.n.n.n.n.A.n.A.n.A.A.S.S.S.S.B.S.S.S.", "-X@X).).#XXX[ l.SXSXzXh.l.v.l.[ 4 XX).>X h k h h s s a f e 0 e s 0 e 0 e w w q q q e q e w w w w i w w y w y p t q < < q < x s x l b x b x l m x x 5 x 3 3 6 6 6 3 6 6 6 6 7 6 6 6 6 6 7 7 a.6 6 7 3 7 7 7 7 8 8 c m M g.4.m M M m v z f.z 8 8 2 2 2 2 9 2 8 s.8 a.a.a.s.2 2 2 9 a.2 2 2 2 9 2 R NX+ # 9 9 < # NX k.. . o . o o k. V.+ # + + X X V. k.. o o + + 9 V.. k.1 + 1 5 # 5 a < d 5 < a < 5 @ @ @ ; @ < V.X V.& # # & @ @ < < @ @ 5 # < < a < < 0 < < k.& e.o o + O @ & @ = = g f = g ; e k e = e : e e f s s : k ] 5 V.c c k p M M M M o.o.o.o.o.o.o.5.t.5.t.Z.t.Z.Z.5.Z.Z.Z.Z.", "gXgXgXgXgX@Xf.l.SXSXv.l.v.l.l.a.4 OX,XhXhXX@X#X@X@X#X@X#X).-X-X=X/.I.I.I.I.I.I.^.).Q.^././.=XI.I./././././././././.^.T.T.^.T.^.J.J.T.Q.J.T.T.P.T.^.T.^.T.^.^.^.^.^.^.^.^.T.^.^.^.J.P.J.^.P.J.P.J.J.J.J.J.J.G J.J.J.G T.W.L.L.G Q.R.Q.R.R.R.R.Q.R.R.R.R.R.H G G H H G H H J G G L G H G H G H G H H J H T S P _ E P P _ S T E J _ S A A S J A J F F F F S d T T f T S : S E S E : d f d d d f E f E f f f f ( f T d d d d d d d d : : f f f h > h k k h k h r h h > s a g a s e s w s e q q q w e q q q i w w i w w w w w y p u l < < q 0 y l c b l l l x b x l x b x g 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7 7 6 6 6 7 a.6 j.7 6 7 7 8 x M 4.M M M M M m v m m z z f.i a.2 2 8 s.2 a.a.s.2 2 a.9 a.2 2 2 2 9 2 2 9 2 2 ] k.9 + + # & 9 NX k.o o o o X + k. k.+ + + + + O V. k.o o + # + 1 V.. k.& # # @ @ @ @ < < @ < < 5 < a ; @ a % a V.X V.# # # @ # @ < < < @ @ @ a @ a a a 0 < 0 ) & k.. O O # & @ ; g = = = ; : = g s ; s s a k k : f r g s ) % V.0 s p k p o.o.b.b.b.b.o.O.n.5.5.t.Z.Z.t.Z.t.t.Z.Z.t.n.Z.", "gXgXgXgXgXgX).3 v.SXSXv.v.l.8 5 @XhX,XhX S S D S f D d f d f T f d T f f f f E f f f d d ; ; d d f f f f f f h h f k k > k k h > k h r a k k s = s s s s s e q q q q q w i w w w w w y p p p y y p p w q l c l c c c c c c l c x l l m x c g 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7 6 6 7 6 7 7 7 f.m 4.M g.M m M m v v m v v x z x x 8 a.2 2 2 a.a.a.a.a.a.2 2 s.9 s.2 9 2 9 2 9 2 R V.+ + + + 9 1 NX k.. o + + + + NX NX+ + + X # O V. k.o o o + 1 # k.. NX+ O # & & 1 @ 5 5 5 < 5 < g 5 a a ; ; ; V.X . kX+ O + # @ @ < @ 0 @ 5 @ < a @ a < ; a 0 ] # %XO X # & @ ; ; ; a : = a s a e = = k : k k g e > s r f e.5 NX= 0 s p M o.b.o.b.m.b.n.o.5.5.n.Z.t.t.Z.Z.t.t.Z.5.Z.Z.t.", "gXgXgXgXgXgXgXgX[ l.SXSXl.f.P S f f f f f f f T f f f T ( f d d g f f f f f f h f > h k h > h r h h k h h h h k s k g s e s e e s w q q w w q e w w w y w y w e p p p y p v v c l c l c v c c v c v v m v z l x m b l g x t 4 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 6 7 f.o.g.M 4.M m M v M m v v m m f.f.f.i f.a.a.s.a.a.a.a.2 8 s.2 s.9 9 2 s.2 2 9 2 a.] k.o X + # 1 1 NX iX. o o + + + NX k.o X + # O # NX k.. + + + + 1 V.. ] X + O # @ 5 5 a < g a a 5 a < 5 ; @ @ ; k.X e.+ o # # # < a < < @ @ 5 @ a < ; 0 a < 0 V.& e.o o O O & & ; ; = s s = : f e k : f e > 0 s > e k s s 4.% e.@ = a s M M b.b.b.n.n.5.5.5.5.t.Z.Z.Z.Z.t.Z.Z.Z.t.Z.Z.5.", "gXgXgXgXgXgXhXgXgXP l.l.8 4 X s b V.e.e.V.V.V.C.BXNXV.e.NXV.e.k.kXV.e.V.] e.V.k.V.V.e.V.NX] ] V.C.V.C.G.C.n.b.n.5.5.5.Z.t.Z.Z.Z.t.t.Z.t.Z.t.Z.Z.t.", "gXgXgXgXgXgXgXgXgXgX_ d J -X-X S D S S > S ( : D f f D > ( f f E : ( d T f f f f f f f f f f f f f > h h > h h h h | j | | .;.c k c k s c p s c p y w w i w w i w w q w w w p p p p p p p c p c p c v c v c v v v v v v v v v v z c b s l s x l l l t q g t t 8 8 6 6 6 6 6 6 6 6 6 6 z o.4.g.m M 4.m o.b.4.g.M v v g.v f.f.f.f.f.f.s.a.a.s.2 2 a.2 2 s.9 8 k.* # & & & NX1 1 1 + + X o o o o o o o o o o o o o . o k. e.o + o + # 1 NX k.o X X # # @ NX k.o o O O O @ NX ] o o + + + # V.. k.o X # & & a @ @ g a 5 < < g @ ; @ ; ; a e.X ] o O + # @ < < 0 5 5 < < a a a g ; a ; d ] & ] o o + & @ ; ; : 0 k ; = s : : = : f s a 4.R & & & & & BXa k 0 = # O # O O + O # O O + # O # + # E ^ & & X & & E V.o.X.4.5.5.o.t.Z.Z.t.Z.Z.Z.Z.t.Z.Z.t.t.5.", "gXgXgXgX7XgXgXgXgX-X-X-X-XgX S > D > S D S > E > ( S f f ( f > h f f f f f f f f f f > k f h k k h h h h | h | Q .;.k c k b c s k p y p w w w w i e w y y w i e p p p e p p p p p v c v p c v v v c c v v v v v v v v g.v c c s p l l l l s g q g x f.h.f.f.f.8 7 6 6 6 7 7 M M m M M m o.g.4.b.b.o.M M M M v M g.f.f.z x a.a.a.a.a.a.a.2 2 a.s.8 ] iX1 1 + 1 + + + + o o o o o o o X o o o o o k. kXo o + + @ & NX V.o o X # & # CX NXo o O # & @ NX k.o o o X # # NX. %XO o X # & @ a 5 a 5 g a a g @ ; = ; ; a e.X V.o o O # @ a < < q a a a a @ d a a a ; ; ] & V.O o O # & ; ; s : = f : : a k k : k a k 1.% NXr = ; = # # O # # O O # O # O # # # # @ k T & V. .o.o.5.5.5.Z.i.S.t.t.Z.Z.t.Z.Z.Z.G.Z.5.", "gXgXgXgXgXgXgXgX-XgX_ 5 _ X E : ( > S f > S > > , k h > k f f > f f f h k > h k h h j h h | | h | j k c k s k w O.O.p w q w i w w y w w y w w e p p p p p p M M v p p v c v M c v v v M v v v v v v z z v c p c c l u z g q q s f.f.d.f.f.f.f.f.f.z 8 7 ) g.4.o.4.b.o.b.4.b.o.g.4.b.b.g.M v m m g.f.f.f.f.i a.a.2 a.2 s.2 2 9 x R k.1 1 # + + + + o + + + + X + + X + O + + o NX k.. o X * @ 9 NX e.o o + & @ 1 NX %XO o O O # # NX k.o o + O # # V.. V.o o X # # & @ @ a < a 5 5 @ ; ; ; @ ; @ V.X ] o o X # # < a < g < < 5 < @ 0 a @ d a ; V.& %XO o O O # ; ; ; ; > ; f r : g f = > a f 4.% iX0 a = = = # @ = # = @ @ @ = = = = = = 0 ( T & C. . . .o.O.5.t.Z.t.Z.Z.i.t.S.Z.t.t.Z.5.Z.", "hXgX).-XgX-XgX).-XR k.] [ _ -XhXgX-X-XgXgX-XgXgX-XgXgXgXX+X-X).@X#X#X-X > D D > S f D f > f > > > > > > k h h h j h k k k f r .h .| | | . ...| | | h .j k j p k p O.O.p i w i e w i w y y y w p p p p p p p p v p M p v c v v v v c v v v v v v u v v v v v c p p c k c p s k k k c j j f.f.f.d.f.z f.u v b.o.b.4.b.o.b.4.b.b.o.m 4.b.M M v g.4.b.b.g.f.f.a.f.f.a.a.a.a.a.a.a.2 a.[ ] # 1 1 + # + 1 # + + # + # # + # # # O & + NX k.o o + # @ < NX e.o X X & @ @ NX iXo X X # @ & NX e.o X X X & & V.. e.o X X O @ @ @ ; < < 5 0 ; a ; ; ; ; ; ; V.X k.X X + # @ a a < g g < a a a a a ; f d a V.& e.o o O & ; = : : g : = , g = : , e > : k 4.% k.@ = ; = ; = = = = = 0 = e 0 0 0 e e : = / T & e.> k .o.X.Z.Z.t.Z.Z.i.Z.S.t.i.Z.Z.t.Z.t.", "hXgXgX-X).gXgXgX[ l.SXSXl.8 P -XX).#X-X-XX-X=X=X=X=X=XI.I.I.=XI.I.=XI.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U./.P.U.P.I.I.U./.I.I.I./././.P./.^./.T.P.T.T.^./.T.^.Q.T.T.^./.P.^.U.P.P.P.P.P.P.J.P.P.J.P.J.J.J.L.G J.J.G Q.Q.Q.Q.Q.W.T.Q.T.Q.T.Q.Q.R.Q.T.Q.Q.Q.G H H H H R.H R.H H H H H H H E.H E.H H H H H H K K H F ' K K F F F A A A F F F F _ K F K A E S ( D f S > D S > D D D S S E : > f h f ( f > : > S > h > j h k j h h h h h .| | | | | | . .| | | | | .j n c c c p O.p O.y w w w w w y w p w e p p p p p p y p v M p v v p v M v v v v v v v v v g.v g.z z v v . . .| j j h | . .j j .f.f.f.g.f.u v g.b.4.o.b.o.o.b.5.4.o.4.b.b.b.b.4.m M v g.g.g.m g.f.f.f.8 a.2 a.a.2 2 a.8 x ] ] + + + # 1 # 1 1 1 # < 1 < # & 1 & @ @ @ & NX e.o o + + # @ NX kXo X + & & @ BX k.X O & & & ; NX e.o X X O & 5 NX. k.o o # & @ % @ % ; < g a @ a ; ; a ; a ; V.X e.o o O & & < a g q x 0 g a a a d a a d ; e.& k.X X O & = ; ; f a > : : : > f f : f k f 4.% V.@ = @ = 0 0 g k s k k s k k k k k > s k / T & 4.= k h .o.5.5.Z.Z.i.Z.Z.t.Z.Z.Z.t.Z.Z.t.", "-X-XX(.=X@XX#X-X=X).)./.#X#X#X).>XX S S > > S ( > D > ( S > ( > : : > : > f h > h h j h h .h .| .| ..j .| ..| ... .| | .| p j p k p p O.p O.w w w w y w i p w p p p r p p p y z p p v M v p v v c v v v v v v v v v v v f.v f.v p . .h | . . .h . .j h .v g.f.f.f.g.v b.o.b.o.o.b.o.4.b.b.o.b.M M b.) g.b.M g.b.b.g.g.g.g.f.a.f.d.a.a.2 a.2 8 2 8 ] k.+ + + # 1 1 1 < < < < < < < @ < < & @ % @ NX kXo X + & & 5 NX e.o + O # @ @ NX . kXo X O & - ; NX %Xo o X O # & V.. e.o X X # & @ ; a < < a a d @ ; ; ; ; a ; V.X k.o o O # @ ; 0 5 g g 0 g 5 a 5 g ; d ; ; e.& kXo o O & ; ; : f : f > k : > : k : > : f e.% e.# # @ @ a g s p k M c c j n M p k r k h 4.T % ) - = k .X.5.5.n.5.Z.t.S.Z.i.Z.t.t.D.Z.Z.", "X#X#X@X).-X).X>X;X>X=X>XX S > > f > f ( : : D : : : : > > > k j h h j h .h .| . . .| ... .| ...h | | ..j M .p k O.p O.p w i w i w p p w y p w p p p p p p p p v p v p v z v v v v v v m v v v f.v v v v . . . . . . .h h . .| j j j .v f.d.g.u f.g.4.b.4.5.b.4.b.b.o.b.4.4.b.4.b.o.M g.M b.b.b.b.g.b.g.f.d.f.a.8 a.8 2 s.a.8 x R ] o + + + @ 1 < q < 5 q 5 g < 5 d a a 0 a a NX k.o X + & 1 < NX . kXo X + & & @ V.V.NXiXNXk.e./ o X O # & ; NX V.o X o O # & V.. k.o X + & & @ 5 g a a a ; ; a @ a ; ; ; a V.X e.o o # # O = ; < w q 5 a a g a : ; f : ; ] & e.O O O O & ; ; ; a > a > > : f > : > , : 8.% NX^ ) / ) C.e.C.V.C.C.V.C.C.C.C.e.e.C.e.C.BXT & ] = = e j X.4.5.5.5.t.5.5.Z.t.t.S.Z.Z.i.Z.", "hX-X-XgX+X[ l.zXV.l.3 5 x [ l.V.[ d XX,XgXgXgXgXgXgXgXgXgXgXgXgXgX-XgXgXhXhXgXhXhXhX,XX>X>X>X*X=X;X=X=X=X=XX f ( D D E > > > D D S > h S f : : > : - , - > r > h h j h h .| h .| | . .| .| .. .| ..h | | | j k k p o.p O.p O.w w w w w w y w p p p w p p O.p p p p p v v v v z v v z v v v v v v v v p v M p .. .k . . . .j .h .| | j j h n f.f.g.f.g.o.b.o.b.4.b.o.b.o.b.4.o.o.b.b.4.o.M ) g.b.b.h.b.b.g.g.b.f.f.f.a.a.a.2 a.8 x ) [ ] o + + 1 1 < g 5 5 q x 1 g g g f g a g d 5 NX kXo o + 9 & & NX V.o X # # @ ; d ; & & $ O O X X & O & : : NX NX. X O O & & V.. NXo X O & @ & 0 d a a ; a ; a @ a ; a ; ; V.X ] X X O O # ; @ ; f s q a d % : f ; f ; : V.& %XO O + @ = ; f f f , s > > : f f > > : > ] % & & % % & % & % & % & % % & % % & % & % & % . & ^ & ; > h o.o.5.5.5.n.5.5.5.5.5.5.t.Z.Z.D.", "gXhXX*X>X>X:X;X;X;X;X=X > ( > > > > > : : : : = , > > k h h h | r | ..| ..... ... . . ... .2.| | | | j p .p p O.p O.p i i w i i w p w w w p p p p p p p p u v p p v p z v v m v z v v m v v b j o. . . .M O. .k .. . . .h .j j | .;.j v f.f.g.M b.o.5.o.b.o.b.b.4.4.b.b.4.4.4.o.) 4.o.b.b.b.b.b.b.g.b.g.m f.a.a.a.a.a.a.i z ) R . ] o + # # 1 < w 2 g t a g g g g f d a f a g NX e.o o # # @ 5 NX ] X X O & & ; ; ; ; ; & O O O X O & & % % CX ] o X + O & # NX. ] o X + # & @ @ a @ : ; a a g ; = a : g s V.X e.o o O @ $ = ; = ; : = d : : : f : : d f e.& e.o O O & $ ; f ; > f : : > > > > f D > > e.% & ^ O = e h ..5.5.5.5.5.5.Z.n.5.5.5.5.O.5.5.", "XX>X>X>X>X;X;X;X=X;X;X&X=X ( > > : > : : > : , : : : k > > > r h r .h | | | .. .| .r ... .| | | .| | .| M .O.p o.p O.O.p u p p p p p p p p p p p p p o.p p v v v v v v v g.z v v v v v c 2.>.>. . . .p p . . . . . . . .j .| h .| ..p p M v b.b.5.b.o.b.o.o.o.b.o.4.g.b.4.4.M M M b.g.g.b.b.b.b.b.g.4.g.g.f.a.a.a.8 z l c m [ . ] + O + 9 < < g 2 g g g g f f g g g f g a a BX* & & & * & V.o X # & & a NX& * & & & * NXo X + & @ % % ; % & & O & & O & & & : @ NX& * & & & * e.o X O # & & NX& & & * & * NXo X O O @ @ ; a ; f a a ; a ; a f ; a = V.: $ * & & * V.o o O O = = - = : = - : - : - : ; : : ; e.P * & & & * NX. . O # # = ; : f > > > k k > > : > : > 4.R O & & & * & X O & & O & * & * & * & O O & & O & * X & & * & * * & E ^ = = e h .5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", "gXgXX).X>X*X;X>X>X*X;X*X;X>X;X>X&X=X;X=X>X=X=X=X=X=X>X*X D : , : : : : : , > h > h > h | | r | | r h r | ...| ... .| | | | | ;.2. .M p O.o.O.o.o.O.O.o.o.O.O.p O.O.O.o.O.O.o.o.o.o.v u g.p v u z v v v v f.v v .>.2.:.>...p j .. . . . . ...k . .| j ;. .j | | j M .o.o.o.b.o.b.o.b.4.b.o.4.b.4.4.b.4.o.) o.b.b.b.b.g.b.b.b.b.g.g.b.M d.a.a.f.m v v ) [ ] o o # # < 5 s q x l g f g g g f g g g f d BX; % % % % ; k.X X O # @ < CX% % % % % % V.X O # & & ; : ; ; : % & & & & % & ; d : CX% % % % N ; NXo X X O & = NXS 5 N ; % % e.o o # # & @ = @ @ @ ; = a a ; a a ; g f V.E 4 % d N ; e.O o O O $ ; = : : : ; : : > : f : f f f e.[ d % 5 N ; iX. o o O - - : k f : k > : : > > > ( > f e.] % % 5 N ; % 4 N % % N % 4 4 : % % % 5 N % N % % 4 P % P : d N ; % R / # - > h o.o.5.n.5.n.5.5.Z.5.5.5.o.5.5.5.", "gXX>X@XhXuXhXhXhXhXhX,X=X-X/.(.).(.=X=X-X#X-X).>XX>X>X>X>X>X>X>X>X=X>X;X;X>X*X>X&X;X;X*X*X;X}.;X;X=X>X=X=X > : : : : : : : , k > > > h > | | r h | h r h | | | .. ...| | ..| .| .,.2.2.o.o.O.O.p o.M o.v p o.o.O.o.o.O.o.O.o.o.O.O.o.o.v v v v v v z z v v v n >.>.>.2.>.>.:. .o. . .p . . . . . . .h . .h | j .j n o.o.o.o.o.o.b.o.o.b.o.4.b.4.4.o.4.4.M n g.b.g.b.b.h.b.b.b.b.b.b.g.M g.f.f.M g.v v g.] ] X X # @ < q x g g k l g g f f b f k f g g BXP d P S T T iXo O O @ @ a NXT T T T T T e.X X O & ; % d : d T ; & ; : % : % d d ; BXT T T T T S NX. X # & ; ; BXT T T T T T NXo + O # # # & ; = ; g g a a ; 0 ; ; : ; V.R T d T d S V.o o O & $ = = = : , - : : : : : f f : d V.R S S P d N NX. o O $ ; : : > : > g > > f h > f W > > e.] N S P T T T T S 4 T T P S S P T d S P d T T T d T T d P T d N P d ] ) O = > j X.5.5.5.5.C.n.Z.5.5.5.5.4.5.5.5.", "gXX>X;X;X:XvX>X>X@X@XhXuXX(.-X).-XXX>X+X;X;X=X>X:XX;X;X;X;X;X;X;X;X;X;X}.;X;X;X;X;X;X=X>X*X>X=X&X=X&X/.I.&XU.;X;X}.&X}.}.}.}.|.&X=X&XI.U.U.U.I.P.U.L.P.P.U.J.L.J.J.L.Y.L.Y.P.I./.I.I.=X&XI.I.&XI.I.&XI.I.I.I.+X/.I./.}./.&X/.U.U.U.U.U.U.U./.L.P.P.P.U./.U.U.Q.L./.L.U.L.L.W.'.XXQ.XXQ.'.W.'.Q.W.'.'.Q.Q.Q.'.Q.Q._ V Q._ I I I I '.[ [ U _ U _ _ _ S F F K K K K K F ' K ' ' R R R R R _ K E.K K K F F _ K K ' K ( ( D ( k D ( ( ( ( ( ( ( ( h h ( D : : > > : : , : , f > > r h > h h | | | | ...| h .| .. . . . . .| | ;.;.;.1.1.Q o.M o.o.p O.b.O.O.p o.o.o.o.o.o.o.o.o.o.o.o.o.v v v g.g.v g.f.v M 4.>.>.>.2.>.:.>.2. . .o.p .. . . . . . . . . . .2.| | | .n o.o.4.b.4.b.4.b.5.o.b.b.4.o.b.b.4.o.4.M b.b.b.b.b.b.b.l.b.b.b.g.4.b.m g.M g.v v m ) R . ] X + O # < 5 g g b g ( g b g g g g g f g g CX% % % % 4 d e.X O $ - & : NX% % % % % % NXX X & & ; ; f d ; : ; : d ; ; S ; : d : CX% % % d 4 ; NXo X X O & & NXT d % % % % kXo o X # & ; & ; = f ; a f g a f ; a a : V.E 4 % % % % NXo . O O = $ : = : : : > : : S : : f : : e.R 4 % % 4 ; iXo X O & ; : > D ( > D D > h D > h h > k e.^ % % % % % % % % % % % % ; % % % % % ; % % % % % S % % % : N ; % : [ ^ O : r h .o.5.5.t.5.5.5.5.5.n.5.5.5.5.O.", "X;X:X1X;X;X>X1X1X>X>X>X>X=X=X-X=X)./.>X#X>X+X>X+X>X;X X;X X;X X>X*XX:X>X;X*X;X;X;X;X;X;X*X;X;X;X;X;X;X;X;X>X;X*X=X/.&X&X&X}.;X}.&X;XU.|.}.}.}.;X}.}.&X&XI.;XI.I.U.U.L.U.P.Y.P.L.L.K.L.L.J.L.U.I.I.I.=X&X/./.&X&X/.&X&XI.I.&XI.I.&XU././.&XU./.+XU.U./.U.I.U.U.U././.L.U././.L.L.L.'.L.'.L.'.Q.W.Q.U.W./.XX'.XXW.Q.Q.Q.L.Q.Q.V Q._ '.L._ Q.'.I _ I I I I [ U [ [ U U [ _ ' ' ' K ' K ' K K ' K ' R R R R ' R _ ' ' K F F F ' K H ' F k D ( ( D ( h h h ( h > ( h ( Q h > > > : > > h : : : > > > h > h h > h h | | | .. .....j .| ... .| | ;.| | ;.2.2.2.;.o.o.o.O.v o.p o.o.o.o.O.o.O.M o.O.O.o.o.o.o.o.f.v v f.g.M n o.>.>.>.9.>.>.2.2. . .>.2.r . . . . . .r . . .;.| j ;. .j .n o.b.o.o.o.b.4.o.4.o.4.o.4.b.o.4.4.o.4.b.b.b.h.b.b.b.b.b.b.k.o.g.b.b.) 4.4.n ) Q ) 4.] ] X O # & a g g f f f b g k f s s g k g g f BXT S d T T T kXo O & & : : BXT T T T d N k.X O O & ; ; : f : : T : E T : d f f f d BXT T d T d N NX. O O # ; ; NXT T T T T P V.o O O O & = ; ; @ a f a a k ) ) ] ) ) ) BXR T T 4 T P iXo O O # $ = : : : : : > : : : > f f : f e.R E T d S P NXX o O $ : S D > ( h D h D D D > #.W D > e.] 4 d T T d NXNXNXNXNXNXiXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXBXNXBXBX( = = > k O.5.O.n.5.5.5.t.n.5.5.5.5.X.4.5.", "gXgXX1X>X>X>X|.>X>X>X>X+X>X+X+X>X>X>X+X;X+X>X|.;X;X|.>X>X:X>X;X>X;X;X>X;X;X=X;X;X;X;X;X;X*X;X;X;X;X;X&X;X;X*X&X&X&XI.;XI.U.;X}.;X}.;X;X}.}.|.|.}.U.U.U.I.}.I.Y.U.Y.U.P.L.Y.J.J.L.L.J.L.U.U./.I././.&X/.I.I.I./.I.&X/.I.I./.U.>X&X/./.I.U.&XI.U.U./.{./.{./.{.{./.U.XXU.U.L./.XXL.XXXX'.'.L.XXXXL.XXQ.W.Q.W.'.XXQ._ E.XXXX'.XXXX_ XXI I I '.I I I I I U _ U R _ [ U _ H ' ' K ' K ' K H ' _ R [ _ R R ' R R R ' K J ' F H ' H K ( k h W ( D ( ( D ( W ( ( ( ( ( f > > > h ( h h > : > h > r > r > > r r | | | | . ...| .. ...| .. . .;. .;.| 2.2.2.2.2.2.o.o.o.o.o.o.O.p o.o.M o.o.o.o.o.M o.O.o.o.o.v g.v v o.O. .>.>.>.>.>.2.:.>.>.2.>.>. . .M j . . . . . . . .j .;.j | | ;.n o.4.o.5.b.o.o.b.4.4.b.4.4.4.4.4.M ) 4.4.b.b.b.b.b.b.b.b.b.b.b.4.b.4.4.b.) 4.) ) Q ) ] X X X X X NXO + # @ a g g b g b f k b g BXBXCXCXCXCXBXVX4 4 T T T d e.O O O = - : BXP ; T d T 4 iXX O O & ; : E f : E f T f ( f f E S f f BXT T N T P 4 iXX X O & & ; NXT T d T d d V.o O O & @ = ; ; ; = f a k V.%X] ] ] ] ] ] T T T S S 4 kXo o O $ & = : : : : : D : S : : : f : a e.R 4 S P T d NXo O O $ : : > > D D h D D D W D D ;.D ;.e.] S N d d P NXo O O O O O O $ O $ $ $ O O O $ O O O $ O $ = # O O O O & - = > k .5.5.5.n.5.5.n.5.5.5.5.5.5.5.5.", "X1X+X$X@X@X@X;X;X;X;X;X>X>X;X>X1X+X;X>X;X>X>X>X>X+X;X+X>X>X>X$X>X>X X;X|.$X;X>X=X>X>X;X;X;X&X*X>X;X;X;X>X*X;X;X*X;X}.;X;X;X&X*X;X;X&X&X&XU.;XU.;X}.}.U.;X}.}.}.;X}.}.|.}.}.U.&X}./.&XU.U.L.P.Y.J.V J.K.L.L.L.U./.U.U./.U.I.I.&XI.&XI.I.I./.&X&XI.I.U.I./.U.=XU./.U./.U.}./././.{./.U./.U.{./.U.L././.'.XX'.L.XX'.Q./.W.XXQ.'.Q.XX'.Q.XXQ.XXG XXI XX_ I XXI XX'.I I I I I I I I [ I [ P [ _ _ ' ' K ' ' K K K ' ' R R R R R ! R ! _ ! _ _ F K ' K ' H ! ( h h k ( h W W h h W k W ( W h h > h h h h W ;.W : = h > > r r > > r h h | .| :.:. . ... . ... .| ;. .| ;. .;.2.2.2.2.2.2. .M o.o.M o.O.M o.o.o.o.o.o.o.o.o.o.o.o.o.o.v o.O.O.4.>.3.>.>.>.>.>.>. .2.2.>.>. ... .j .| | ;. .2.h . .h ;. .j | . .o.2.4.2.4.5.o.4.b.4.o.4.4.4.4.4.2.2.2.2.2.4.b.b.b.b.b.b.b.b.b.b.4.4.) 4.b.) 4.) 4.4.NXT T T S T CX+ O # ; g g g b g b b g ) f CXE T T T E T E T T E T T T e.o O $ $ : : BXE T T T T T V.o O O & : S f ( E f : ( E E f f E f d f CXT E T T T T iXo X O & & ; NXE T T E T E NXo X O O & @ ; : a ; a g g V.^ T T E T E T T T E T T T iXo o O = $ : : , > : S S > f > : : : f ( V.[ E T T T T NXo O O = - > D ( ( > D D > ;.;.D D ;.D W e.] T T T T T iXX X O O O O $ $ O $ $ O $ $ $ O = O = = O O - @ $ $ = = = : = k .o.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.", "hXhXX@X+X>X#X1X>X;X:X;X1X1X;X1X>X>X>X;X>X;X+X;X+X>X>X>X/.>X;X>X|.;X+X|.;X;X|.;X;X;X;X;X;X;X>X>X;X;X>X;X>X&X;X;X;X;X;X;X;X&X}.;X;X;X;X;X&X}.}.}.U.}.;X&X}.}.;XU.}.&X}.}.}.{.|.{.U.U.&X}.&XU.L.Y.U.L.K.J.Y.B J.L.U.U././.U.U./.U.+XU.I.U./.I.I.&XI./.&XI./.&XU.I./.I.}.U.U.U.U./.}././.{./.XXU.'./.U.U.L.'.XX'.'.XX'.'.'.Q.L.W.Q.W.XXQ.Q.XXQ.'._ '.I XXV XX_ I I I _ _ I I I I I I I U U I _ _ _ _ ' ' ' K E.' ' ' ' _ R R R R _ R _ R R R ! R R ' F F F K K ( ( W ( W ( W ( ( ( ( ( ( h ( ( > h h D k > h > h > > > r > k > > h h h h .| | .| .... .:... .| :.;.;.2.;.;.2.2.2.>.2.2.4.4.o.M M o.o.M M o.M o.o.M o.o.o.o.M o.o.X.o.O.O.o.>.>.>.>.>.>.1.>.2.>.>.:. . .>.2.>.1.2.;.;.2.2.;.2. . .2.2. .;.| j ;.n ) 4.) 4.) 4.4.o.4.o.4.4.4.4.>.>.4.4.1.2.2.1.1.4.b.b.b.b.g.b.k.b.V.b.b.b.) 4.4.4.) ) NX% P 4 % 4 NXX X # & d g f f b ( g k b g CX; ; N % 4 5 N ; N % 4 N d V.O O O = : S BX% % % T N 4 iXX O $ ; : : : f f ( f ( f f f ( f f ( d BXN ; d 5 : 5 NXX o # & ; ; NXd 4 % % N ; e.o X X O & ; : g : h a a f V.E % % 4 % % % N : 5 N % % V.o O O O = : = a f : > ( : : : > S f > : e.R % P : 4 N NXO O O $ : : ( > D W ( W D ;.D D ;.W ;.~ r.] % T % d N NXO O O $ $ $ - , $ - , - - , - - - - : , : , , , , : , : , > > | .X.5.5.5.5.5.5.5.5.n.5.5.5.5.5.5.", "X$X+X1X>X+X>X1X>X1X;X>X;X;X>X1X>X>X>X;X>X;X;X>X;X=X>X>X>X>X+X;X>X>X;X|.|.|.>X|.|.;X;X|.;X;X>X;X;X&X;X;X&X;X;X*X;X*X;X;X;X;X*X;X[.;X}.}.}.}.}.[.U.U.}.;X}.U.}.;X;X}.{.|.{.{.|.|.|.}.U.;XU.U.U.Y.L.L.L.L.L.L.L.U.U.U./.U.U./.{.{./.U.{./.U.U.I.U.&X&XI.&X/.+XU.I.U.+XI.=XU.+XI./.}.}.+XU./.U.+X/.U.U.XX/.L.'.Q.XXL.'.Q.'.Q.XXL.'.W.Q.XXXXQ.'.XXXX'.Q.I E.'.'.I I I I I XXI I I [ I I I I _ [ _ _ _ K ! _ F _ F A F _ R R R R R R R R ! R E _ R ' _ _ ' ' H K k ( h h ( h h h ( ( h W h ( W > h D h h h h h h h k : h > k > h k h > > ..| ;.| | . . ... . ...2.,.1.1.1.1.1.2.2.2.2.2.Q 2.n o.4.o.o.o.M o.M o.o.o.M v o.o.M o.o.X.o.o.O.X.>.3.>.>.>.>.>.>.>.>. .2.2.>.2.,.<.,.<.2.2.;.;.Q ;.| .Q .h .| j ;. .W Q ) 2.1.4.4.4.4.4.4.4.4.4.1.4.4.>.1.>.9.2.1.1.>.1.9.8.9.b.b.g.b.b.o.V.4.b.) 4.4.4.q.NXT T S P T CXO # # @ a g b g b b s b b b CXT T T T T T T T T T T T T NXX O & - : > BXT T T T T T NXX O O - ; : > : : f f T f f R ( f f E f BXT T T T T S V.o X O & ; ; BXE T P T d d NXo O O @ = = ; : : f a s f V.^ T T T T T T T T T T T T NX. O O $ $ : ; f ( ( : D : D : f : ( S f V.[ T T T T d iX. O O & : f D W D D h D h W ;.D W #.W ;.e.] d T T ; T NX$ O $ $ - - - - , , , , Z > D Z Z Z Z , > > > > > > > > > h | .X. .>.5.5.5.5.Z.5.5.5.n.5.5.5.5.5.", "X+X>X@X+X>X1X@X+X;X:X;X:X;X1X;X>X>X>X1X;X>X>X>X>X=X;X>X>X|.;X>X+X;X+X;X X;X;X X|.|.;X;X;X;X;X;X>X*X;X;X>X;X;X*X;X;X;X&X;X;X}.;X[.}.;X[.}.}.}.}.{.}.}.}.}.}.}.;X}.}.|.}.{.|.}.|.{.|.}.&X&XU.}.U.L.L.Y.L.L.L.L.P.P.U./.L./.U.U.U././.{./.{./.{.{.U.+X&XU.&X/.U.=X+X&X&X/./.}.U.U./././.U.U.{.{./.{.XXU.XXU.U.{.'.'.XXXX'.I '.W.XXQ.XX'.Q.XX'.J I XX_ _ '.I _ _ I _ '.I I I I I U ].U I I I I U _ P [ _ _ E _ F E _ E R R R R _ R R _ E R E R ! R _ ! ! ' _ K F h h h ( h h ( h h h W h ( k h h h h h h h h h h h h > > r > h h > h r h | | . .| | >.X. ...X.2.,.2.1.1.;.,.2.1.;.>.2.>.2.2.4. .Q n o.o.o.M o.M b.M o.o.b.o.O.O.O.o.O.O.4.>.>.>.>.9.>.>.1.>.>.>.>.:.2.<.<.<.1.<.2.:.,.;.;.;.| ;.| 2.h j ;.;. .| h W k Q 1.1.) / 1.Q 1.4.4.4.>.>.4.1.1.>.1.4.9.1.>.2.9.1.9.7.b.b.b.b.b.g.g.C.4.b.4.4.) OXNXN ; % % d NXX O & ; g g b g b ( R k ( s CX4 4 N ; % ; N ; 5 % % ; N e.o O $ ; ; : BX% ; N 4 % % e.X O $ $ : : f D h ( ( ( ^ ( ( R ( ( ( ( CXP % % % N 4 NXo O # & ; a NXP d ; N 4 N NXo X O # - ; ; g > f k f f V.E % % P ; % ; N 4 N ; % : NXo O O = = , f f ( ( ( W : ( : : > : : : e.R S % % % % NXX O O $ : > > > ;.> D W W #.D | #.W W ,.e.^ N % % % N NX$ O $ - - , > Z > @.Z D #.@.#.@.@.*.@.#.#.> | #.| | { ;...:.:.3.>.>.X.4.5.5.5.5.5.5.5.5.5.5.5.5.5.", "X-XgXX>X+X$X>X+X+X>X;X;X:X X;X;X>X>X1X>X;X;X;X>X;X>X>X>X=X;X>X;X+X;X+X>X|.|.:X|.|.|. X|.;X;X;X;X;X;X=X;X;X;X>X;X;X;X;X}.}.[. X[.}.|.}.[.|.}.}.}.}.}.}.}.}.}.;X}.|.|.{.{.{.|.{.|.|.{.{.}.}.;XU.&XI.Y.{.U.L.L.L.L.L.U.U.U./.'.U./.U.XX{.XXU.U.+X/.{./.'.{.XXU././././.=XU.}././.I.}././.{././././.XX{.XX/.'.+XU.W.'.L.XX'._ I XX'.Q.L.XXXXI XX_ XXI V XX_ XX_ '.'.'.I I I I I I I U I I U ].U I I [ U _ _ T _ ! _ A _ R R R R R ^ R E E R E E R R R R R R R E k h h h ( ( k W h ( h ( h h h ( > h h h h h h | h h h h > > > r > h | h > h | | | | . .:.o.X.X.2.,.<.2.,.<.2.2.1.2.2.:.2.>.>.4.2. .2.Q 4.M o.M o.o.M b.o.o. .X.O.o.X.o.O.>.>.>.3.>.>.>.>.>.2.>.2.<.<.<.<.7.1.<.<.<.<.<.:.2.;.;.2.2.h 2.2.;.Q | h W | W W ( Q Q 1./ 1.1.1.>.1.4.2.4.2.2.4.1.2.9.4.<.1.>.9.<.9.<.1.1.b.b.b.b.g.C.) 4.4.) 0.7XNXd N d % % NXO O & @ a s b b b b b s b c BX5 : N % 4 % 5 % N % d % P iXX O & : : S BXN d 4 P ; N iXo O $ & : > > : D f ( E ( f ( f f ( d > CXS 4 T % N 4 NXo X O & ; ; NXT T % % % % iX. O O O @ ; : : : D f f f V.E % % 4 N % % % % d 4 N ; NX. o O $ = : f f k ( : D > ( ( > S : > > e.R % % 4 4 N NXO X O $ : > D D h ;.W ;.D D ;.W ;.#.~ ;.e.] ; 4 S % % NX$ O - - > > { { #.#.#.#.$.#.=.*.*.=.=.*.=.=.<.3.3.X.3.:.3.3.3.=.3.>.>.5.>.5.>.>.5.5.5.5.5.5.5.5.t.", ">XX+X@X>X+X+X>X$X>X:X;X;X;X;X;X;X;X>X>X;X1X;X;X;X;X;X;X>X>X;X>X|.;X>X X|.|.|.|.|.|.;X|.|.;X;X;X>X;X;X&X;X;X;X;X;X{.[.[.[.|.|.[.|.|.[.}.}.}.}.}.}.}.}.}.}.}.}.|.{.{.{.{.|.{.|.{.|.|.}.|.}.&X}.U.;XU.L.L.L._.L.L.L.L./.U.U.U./.{.U.U.U.U.U.{.'.{.XX/.{./.{.{.{.'.'.{././.I.U.=XI.+X/.}././.{.{.{././.XX/.+X'././.'.'.XX'.'.'.XXXX'.XX_ L._ '._ '._ XX_ V I '._ I _ I I I I _ I I I _ I I [ I I I I _ _ _ _ E _ E E E R R R _ [ R R R E E E R R R R ( R E R R ( ( ( ( k h h h h h h h h ( h h h > > h h W h h h h | ;.h r h h h | r | | h . .| | . . ... .2.1.1.,.2.1.2.,.2.;.2.2.>.2.>. .2.n 4.4.n o.o.M o.M M M M o.O.O.O.O.5.O.>.>.3.1.>.>.>.>.>.>.>.>.>.7.7.7.<.<.<.,.,.<.<.<.1.<.<.2.;.;. .;.;.| h | W .| h h h Q h W 1.1.Q 1.) 2.1.1.1.2.2.1.>.>.1.>.1.1.1.2.9.8.<.1.1.8.8.4.b.b.C.b.b.b.4.e.~.uXCX] ] ] ] ] VXX X & ; : f b b n b b b b c CXk.] ] ] ] ] ] T E T E T E k.X O & ; : > BXE T T T T E e.O O & - : : > D h ( ( b ( f E R ( T ( f CXE T T T T P iXo + & & ; a V.CXBXCXCXCXBXNX4 T T ( ^ ^ ^ / ) 8./ 2.1.BXCXCXBXBXNXCXVXR E T E E E iXX O O $ = f f f ^ S D ( : ! 8.8.e.e./ / BX] E E T E T CX: : T ! / 8.1.> D > W W ;.;.h D ;.;.~ #.r.VXCXBXCXBXCXCXS ( ! ` ,.7.3.r.w.w.r.r.r.yXyXyXfXyXyXpXyX-.=.3.3.3.3.3.3.=.-.-.-.>.5.5.5.3.5.5.3.3.5.5.5.5.5.5.t.", "XX>X+X+X>X+X>X$X;X;X:X;X;X;X;X;X>X;X X;X;X;X1X:X X;X;X;X=X;X}.;X|.}.|.|.|.|.|.|.|.|.;X}.;X;X;X;X;X;X;X&X[.[.{.[.|.|.[.|.[.|.|.|.|.[.[.}.}.}.}.}.U.}.}.}.|.{.+X{.|.{.{.|.{.}.|.{.|.{.|.}.I.;XU.}.L.L.L.L.'.'.L.L.L.U./.L././.U.'.U.{./.{./.U.XX'.XX{.XXXX{.+X'.].{./.;X>XU./.U.U.U./.+X+XU././.'.'.'.XXU.L.'.'.'.'._ Q.I '.I XXI XXXX_ '.'._ Q.'.'.XXI '.I I I _ I I I I I I [ ].U I I I I I I I U _ E R _ E _ R R [ E _ R E R R E E R R R R R g R R E ( k k ( k W ( h h ( h W h ( W h h h h ( h W h W h h h h h h h h h h r h | h .| .| h | .......2.1.1.1.,.1.1.2.2.:.,.>.2.>.>.2.>.o.n 4.n 4.o.) M M M o.o.X.O.X.X.O.O.>.9.>.>.>.9.>.>.>.>.>.>.:.>.<.7.$.7.<.<.<.<.7.1.<.,.2.:.<.;.2.;.W ;.W ;.h | W h h j D ( W W / 1.1.1.1.2./ Q 1.8.1.2.4.1.1.>.9.2.1.<.1.1.<.1.8.1.1.1.1.1.b.b.4.4.b.eX7X~.iXuXiX%XoX' ] CXBXNXCXCXBXCXCXCXCXVXCXCXCXBXV.V.] / ] ^ VX: N T T P d V.O O & ; : W BXd % T S d P V.O O = - : : f > > ( ( ( ( ( f ) E f ( ( BXP d d d d T iXo X # & a a f g a & $ $ O ] NXe.] ] k.e.%Xk.iX] k.k.] BX, : - $ O O ] E 4 d d 4 N NXX O $ @ = f f f D W > W D BXNX] ] ] ] ] ] E d S 5 S T ] ] ] ] ] ] ] VXD D h W ;.W ;.;.;.;.#.#.~ ,.D D D - - $ ! CXk.] %XV.] kXkX] %XV.] e.] ] NXe.e.k.e.KX=.=.-.3.y.3.y.-.-.-.-.-.3.>.>.5.5.3.5.3.3.5.p.3.5.5.5.t.", "#X@X@X>XX/.C.H.B.B.B.v.h.g.k B ].+X>X+X$X+X>X$X>X;X;X1X;X:X;X;X1X;X:X;X|.;X;X|.|.;X|.|.|.|.;X|.|.}.|.|.|. X|.|.|.;X|.;X|.;X&X}.;X&X>X;X>X;X{.[.].[.[. X[.|.[._.[.{.|.|.}.}.}.}.}.}.}.;X}.Y.{.{.{.|.{.|.{.|.{.{.|.{.|.|.[.;XU.&X;XU.L.L.K.L.L.L.V L.L.L./.{.'.U.U.U.+X'./.'.{.{./.{.XX{.{.XX{.'.XX'.I./.I./.I.>XU.+XU.U./.{.+X'.+X/.XXXX'.XXQ.I XXI '.'.I U U I _ '._ '._ Q.'._ I _ _ I _ I V I I I _ U I I I ].[ I U _ U I _ U I U U _ _ _ _ _ R R R R R R R E R E E [ R b R R R R R R ( ( ( h ( k ( h k h h h h h h h f > h h h h | h | W h h | | h h h | | | h .h | .| | :.>... .,.1.1.,.2.2.:.2.,.2.2.>.2.2.>.2.>.>.>.Q n Q o.4.o.M o.o.O...O.X.O.O.O.X.>.>.>.3.>.>.>.>.>.:.2.>. .>.<.7.7.<.<.<.<.<.,.<.7.<.1.<.2.,.;.;.;.h ;.h ;.W | ;.| h W D ~ W 2./ 1./ 4.1.1.~ ,.,.<.1.1.9.>.1.>.1.9.>.9.9.<.9.1.1.4.1.e.1.1.e.4.b.e.7X7X).7XK K F L $ N NXS T ; T T % S T T ; d T T BXg f : - $ $ NXP 4 S 4 d T ] X O - : : > BXP d % T T d NXX O $ : : D D D ( R ( R ^ ^ ^ ( ( ( ( E BXd N N d S d NXX O $ & ; a d f d - : & O ] T d P P d T ; 4 P S T T T BX: = - = O O ] R d N N d d iX. $ - - - E h D ( D ( ~ > iXR P T T T P T 4 N 4 N d % N % T T T T T BXh > > #.D | #.W ;.;.,.,.,.#.#.~ > > : & ! ] T S d d : T ; : T d P T T % d P N ; N VX=.=.=.-.w.y.-.-.-.y.pX-.-.9.5.3.3.5.>.5.3.3.3.3.3.3.5.5.", "X+X;X}.;X:X;X|.|.:X;X;X;X;X X;X;X;X|.;X|.;X;X|.|.|.|.|.|.}.|.|.|.|. X|.;X|.|.;X;X|.|.}.U.;X&X;X;X}.[.{.[.{.[. X[.|._.L.K.'.{.}.}.}.}.}.}.}.U.>X}.{.{.{.+X|.{.{.|.{.{.|.{.{.|.|.|.}.I.;X&XU.L.K.L.L.{.L.L.L.K.L.L.XX{./.'.U.{./.'.+XU.'./.'.{.XX{.XX{.XX'.XXXXU.I./././.=X/./.+X/./././.XX/.U.XXXX'._ '._ I _ '.[ U [ U _ XX'._ XXI '._ XXV '._ V _ _ I _ I I I I _ [ I I I I I U I _ I U I I [ %X_ _ R _ R R R R R R E R R R R R b R R R R R f ( ( ( h ( k ( ( h h h h k h h h h h h > h h W h h h W .h | h h .| h | | | | . .:...:. ...:.,.1.1.,.1.2.,.2.2.;.2.2.>.>.>.>.>. .X.4.o.Q o.n o.o.X.o.O. .O.X.+.X.X.X.X.>.>.>.>.>.>.3.>.5.1.;.:.>.>.<.7.<.,.<.7.<.<.7.<.,.<.,.2.:.:.2.1.;.W | W | h ;.j | W D D ( W ,.1.2.1.1.W / ;.,.,.,.1.8.1.1.1.>.7.1.<.<.9.1.1.1.1.4.1.4.8.1.,.1.rX7X).~.~.~.K H L - S NX% N d N % % % % % % N ; P BXg : : S & $ NX; N % % d % ] O O & : : D BXN : 5 N % % NXO O $ : > > D D ( R ( ^ ^ ( ^ ( ^ ( ^ ( BXN : 5 N % % kXo O O & : f d f : : - & & e.T % % : N 5 % % % % % % % BX- = $ = = O e.E 4 % % N % iXX $ $ - L Z K D ! D W ~ D NXR T N % % % d N ; % 4 N ; % % % % N ; % CX: > > D W ;.;.:.;.;.,.#.#.;.#.~ D > : : ' ] % % % % N 4 % % N 5 % ; N % N 5 : N 5 BX$.*.=.=.-.-.-.-.-.-.-.-.-.-.p.5.3.5.3.3.5.3.3.3.3.3.3.3.", "#XX}.{.k B.B.B.H.SXm.N.v = I jX`.|.;X}.}.}.}.;X;X;X:X;X;X X:X;X;X;X;X[.:X;X|.;X|.;X[.|.;X[.;X}.|.}.|. X|.|.;X}.;X;X|.}.|.}.}.;X;X}.}.;X}.].[.].[.{.[.{.{.K.K.K.K.K.K.[.;X}.}.}.}.}.}.}.|.{.{.{.{.{.|.{.{.|.{.|.|.{.|.{.|.|.}.U.'.L.K.'.L.'.L.L.L.L.L.'.L.U.XX/.'.XX'./.'.'.{.XX{.{.XXXX'.'.{.XX'.'.W./.}.}./.U.}.U.U.}.U.{.{.XX'.XXXX'.XX'._ '.'.'._ '.U I U I '.XXI I I _ '._ I _ '._ '.V I V U I I I I I I I I [ I ].[ I I U I I I I _ R R R [ R R R R E R T R R [ R R R R R b R E j k ( k h h h h h h h h h h h h h h W h h W h | | W W h .h | h | | | | .h h ..:.>.:. ...2.1.,.1.,.2.<.2.2.,.;.:.,.,.;.2.:.:.2.>.>. .Q 4.n .....O.X.X.O.X.X.X.X.X.X.X.>.>.3.>.>.>.>.>.>.>.;.;.:.| $.7.$.7.<.<.<.<.$.,.<.2.<.2.,.,.;.;.;.;.h 2.;.W h ;.;.h ( D D W W / Q / 1./ / W ,.,.,.8.1.<.<.1.2.9.9.<.1.7.9.1.e.1.1.1.1.,.~ ,.' 7X7X7X7XeX4X~.K F L F NXN T d T T d T T T T T T E NX: S - $ : - BXT T T T T T NXO & & : > W BXd T T T T P e.X O $ ; : : > W ( ^ ( ) ( ( ) ( ( ( / ( VXT T T T d P iXX O O $ : : a > S S : - $ NXE T T T T T T T T T T T T BX& - & $ $ $ e.R T T T P d iXO $ $ - Z Z Z %.@.*.D D ( r.[ T d T d T T T T T T d N T T T T d N 4 BX- : > > > D ;.,.,.,.,.$.,.,.,.#.D D > > 8.] T P T T d T T S T T T T T T T T T T S BX#.#.#.=.=.-.-.-.-.y.-.y.-.-.p.3.3.5.5.5.3.p.p.3.p.3.3.p.", "X+X}.[.].@ z N.B.N.h.N.O.r %XvXkX_.U.}.&X[.}.;X;X:X:X;X;X X;X;X;X|.;X:X|.|.:X[.[.;X|.;X|.}.;X|.|.;X|.|.|.|.|.|.;X|.|.|.;X|.}.;X}.}.}.;X}.{.[.[.[.].[.].{._.K.L.`.K.K.K.'.K.U.}.}.}.;XU.&X}.{.{.{.{.+X{.|.}.{.+X|.|.|.|.{.|.{.{.'.L.L.{.L.'.L.L.'.L.L.'.L.'.U.L.W.{.U./.'.U.{.U.{.W.{.'.{.'.XX+X'.XXXXXX/.+XI.U.U./.}.+X&X+XW.XX/.XX{.XX'._ _ '.'._ I _ ]._ U I I _ _ I I XXI XX'._ V _ V _ _ I I I U '.I _ '.I I '.I I I I I I [ I I I I I _ [ R ' R R R E E E R [ ( R R R R R R R R ( ( k h h h Q k h k h h h h h h h h h W h ( h h W h W | | | W h .| .| r > r > >.>.| :...:.1.,.2.,.2.<.2.;.;.,.2.;.,.:.;.,.;.;.;.2...X.o.o.X.X.o.X.X.X.X.X.X.X.X.X.X.o.X.5.>.>.>.>.>.>.>.>.>.:.;.;.| | 7.7.<.<.<.<.<.<.<.,.<.<.:.:.,./ ;.;.Q ;.W ;.h ;.| Q ;.~ W ~ W W D W W W ~ ~ ~ ,.,.,.<.<.,.<.8.<.1.7.1.1.9.<.1.1.1.1.Q / W ,.1.7X#X7X~.eX4X4X~.K K F K NXT T T T T T T T T T T T E iXS - S S : S BXN T T T T T e.X $ $ : > f BXT T T T T T iXo $ & : S ( ( ( / Q ^ ^ ^ ^ ) ^ ( ! ( / BXT T T T T T NXX O $ & S S L S D D : L : NXE T T T T T T T S 4 T T T NX$ $ - - - - e.R T T T d T NXX $ - - Z Z Z %.Z @.*.Z *.iXR T T T N T T N d T T S 4 T T T T T T P BX: - : > D ;.;.;.:.#.,.7.<.<.<.;.;.#.W D q.] T T T T T T T T T T 4 S T T T T T T T BXZ Z #.#.$.=.-.y.-.y.y.-.-.-.-.5.5.3.3.3.3.p.3.3.p.3.3.r.", "+XXU.=XU./././.U.{.U.'.W.'.XX_ ].XXI _ '._ '.I I I U I I _ I _ '.I I _ I I XX_ '.XXU V _ U [ I I [ I I [ I I I I I I I I I I I I _ _ [ R R R R _ R R R R [ R b R b R ( R R ^ R b ( ( ( k h h h h h h h h k h h h h W h h h | Q | h Q W | | | | h { ..{ { ....:.;.:.2.,.,.1.,.1.2.2.,.2.,.;.,.:.2.,.;.:.,.;.;.;.>.;.:.....X.X.X.O.X.O.X...X.+.X.X.X.X.X.X.>.>.5.>.>.>.3.>.>.:.;.#.;.$.7.6.7.<.<.3.<.<.:.<.,.<.1.;.;.;.2.;.;.W ;.;.;.W W ~ ~ D ! W ~ ~ D ( W W W ,.~ ,.1.6.,.1.8.1.,.7.1.7.<.<.9.1.4.1.~ D ~ ( ~ K 7X7X7X7XuX7XeXeX4X~.K ~.] X . o X . X . X o X . o X NX$ % - : : S BXo o . X o X NXO $ % : S ( BXX o . X o o NXO $ & : : > D Q ^ R ) ) ^ / ^ ( ^ ^ ~ ( CXo o . X o o iXX O $ % - : S D A S : D : NXX X o . X X . X X . X X . iX$ $ $ $ - : iX& . . X o X rXO $ $ L L Z @.@.*.@.*.%.*.aX% X o o X X o X X . X X o . o X o o X . e.O & : > > ;.;.;.,.7.#.7.<.<.<.<.<.<.;.#.iXT o o o X o X o o X . . X X o . X . X X NX- - Z @.$.-.-.-.y.-.y.y.y.-.0X3.3.5.p.X.y.X.r.3.3.r.p.w.", ">X}.[.[.[.vXbXbXvXbXkXbXvXvX].].bX].`.}.}.U.}.}.;X;X;X:X;X;X:X;X;X;X;X;X;X;X:X|.;X|.;X;X|.|.|.|.}.|.|.}.|.|.|.|.;X|.|.;X|.}.|.}.}.}.|.}.}.;X{.{.{.].[._.[.{._.K.K.K.K.K.K.'.K._.[.{._.L.}.}.;X}.}.{.{.{.{.{.}.|.|.{.{.{.|.{.{.|.|.{.{.'.L.L.L.K.'.L.'.L.L.'.Q.'.'.L.'.'.{.L.'.U.'.XX'.'.XX'.'.'.'.'.XXXXI XXXXI /.+XU.>X/.}.+X/.W.{.XXXXXX'._ I _ I _ '.'._ '.I [ I U _ _ '._ _ I _ I I I I I _ _ I I I I I I [ [ ].U U [ I I I I I I [ '.I I I I _ R R R R R _ R R [ R R [ ) R R E R R ( R R ( ( R ( R E ( ( h k h h h h W h W W h h h W h | h | Q ;.| h | { { ..r { | | :.>.| | 1.1.1.,.2.1.,.1.;.2.;.,.;.,.;.,.<.;.;.;.;.;.:.:...:.:.X.{ } X.X.X.+...X.X.X.X.>.X.X.X.>.>.>.>.>.>.3.>.>.3.:.| h ,.7.7.<.7.<.<.<.<.<.:.<.<.;.,.;.;.;.,.,.,.~ ,.,.~ ,.~ W ~ ,.W ~ ~ D D D ~ W ,.6.,.6.6.,.,.<.<.<.8.9.<.<.9.<.1.1.8.0.D D D ( 7X7X7X7XuXeX4XeX4X4X7X~.eX%X$ & & & * & & & X * * O & e.& $ : S D D BX& # & & X & NXO $ $ : > W BX* & O & O O NXO O $ : : ( D ( ^ ^ ) ^ ^ ) ^ ^ ^ ( ! ~ BXO * # O O * iXX $ & N - L Z D D D D D : iX% O & * # & * * & $ * O * iXO $ - - $ , iX% O & * & * V.O $ $ - Z K @.K *.%.#.@.*.iXS & O * $ * O * & & * O * & & * & & X & NXO $ , : > #.2.;.<.6.7.#.<.$.<.<.<.<.<.<.r.R * & & & * * * # * # * & & & X & O # O NX- , > } $.=.-.y.-.y.-.y.p.-.-.-.3.y.$.y.$.y.$.p.3.3.3.y.", "[.[.*X}. XHXHXbXbXbXbXvXvX X].Y $XY `.U.;X}.}.}.}. X;X;X X;X;X;X;X:X X;X|.;X[.;X;X|.|.|.|.|.|.|.|.|.{.|.}.;X|.|.|.|.;X|.}.|.{.}.|.}.}.}.}.;X{.{._.[.].[._.]._.U K.K.'.K.K.K.K.L.L.[.{.{.Y.{.Y.{.U.|.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.|.{.{.L._.L.'.L.'.L.'.'.L.L.'.L.XX'./.XX'.XX'.'.'.XX'.'.'.+X'.XX'.XX'.XXI I XX'./.I.U./.I.U./.XXQ.XX'.I I I XXI ].'._ _ I I XX].I I I I I I I _ I V _ I I _ V V V _ I _ I I I I I U I ].I I [ I [ I I _ I _ I _ ] R R _ R _ ] _ R ^ R R R R R R R R ( R ( ( R R ^ R ( ( ( ( E ^ ^ ( ( W ( ( h ( h W h h h W Q h h h > | h | h { | { ....2.:.:.,.1.<.,.2.,.:.2.,.2.1.;.,.2.:.,.;.;.;.;.#.;.;.:.| :...| ..X.X.X.X...} X.X.O.X.X.X.5.X.X.X.X.3.>.3.>.>.>.>.>.>.;.#.<.3.$.<.<.<.<.<.<.<.<.<.:.<.,.,.7.<.6.,.,.,.6.,.,.D W D ~ ~ ~ ,.D W W W ~ D 6.,.,.#.,.6.6.*.,.8.<.1.1.9.1.7.4.8.0.*.0.: A K 7X7XOX7X~.7XeX7XeXoXeX4XtXBXiXiXiXrX%X' ] ' ] ] ' ' ] S $ $ S L D ` q.iXiXiX] ] ] T $ $ : : f W e.BXe.e.] ] ] S O - ; : > D W / ^ Q ^ ) ^ / / / ~ / ~ ! e.NXiXiX] ] ] S X $ $ - L L Z K Z D D S D 6.iXiXe.] ] R ' ^ ' ^ _ ' ] S $ $ - L L : ~ e.iXq.e.e./ S $ $ - L Z Z Z *.@.*.%.%.$.=.iXiXiXiXe.8.] / ' ' ' ^ ] ' R ] ^ ' ! ] E $ = : , > W ;.;.<.$.7.7.7.<.w.<.7.<.<.<.9.fXfXiXtXtXq.8.` 8.] 8.] ` / 8.' ] ] 8.' W - - Z D $.$.y.-.y.-.p.-.-.-.=.-.-.3.$.y.y.y.y.-.y.y.-.y.", "[.&X}.[.[.`.].].].].].'.].]. X_.B ].`.}.U.[.}.[.}.:X|.;X;X;X;X X X;X:X;X:X[.;X|.|.;X:X|.|.;X|.|.|.|.|.|.|.|.|. X|.|.|.;X}.|.|.{.}.}.}.;X}.|.{._.{._.[._._._._.K.K.'.K.K.'.K.K.K.L.{.{.{.{.{.Y.{.}.}.}.{.{.{.{.{.XX{.{.{.{.{.{.{.{.{.|.{.'.'.{.L.'.L.'.L.L.'.'.'.L.'.'.'.'.Q.'.XXXXXX'.'.XXXX'.'.'.XXXX_ XX'.XXXX'.XX}.I.&X/./.{.'.XX_ I ]._ _ I I I _ XXI I '._ I I [ I I _ I _ I I XXI I J I I _ V _ U U ].U I [ I [ I U _ U I I I I I I U I _ [ R R _ [ R R R ' R R R R b R R R R R E R R R R ^ R ^ R ( R ^ ( ! ( ! ^ ^ ~ ( ~ ! ( D W W h h | W > h | | h | { ..{ | ..:.2.:.:.:.,.1.1.,.2.,.,.2.2.;.;.;.;.,.;.;.:.;.;.;.#.| ..;.......{ X.X.X...X.....} X.X.X.X.X.>.X.4.X.>.>.X.>.3.>.3.>.>.:.:.3.<.7.<.<.<.$.3.<.<.<.<.<.$.<.6.<.6.6.6.,.,.,.,.D ,.~ ~ W #.~ ~ ~ ~ D ~ #.` ~ ~ ,.,.,.,.6.*.6.<.8.9.<.7.<.<.6.eX*.0.0.K D ).7X7X7XuX7XtX7XtX7XeX7XeX~.4XK ~.H L $ $ * $ * $ $ * & $ $ - - D D K ,.K D S : - $ $ $ - : S ( W W W D D ; & $ $ $ & - S > W ~ / / / / / / Q ~ / / / ~ ~ ! ! D S - $ $ $ $ $ - L L H %.Z K K Z K D D S - - - $ $ $ X O $ $ X $ $ $ $ - L Z Z D D Z D - - $ $ $ - - L Z @.*.#.%.#.%.%.*.%.*.@.Z - - $ $ $ $ $ $ O X $ X X X O $ O O O $ - : h ;.;.>.7.$.7.$.7.7.7.7.w.$.w.7.=.&.&.%.@.Z - - - $ - $ - $ $ $ - $ $ $ - - - - Z #.$.$.p.-.-.p.-.-.y.-.0X0Xy.-.y.$.-.$.-.y.y.-.-.y.", "[.[.}.[.}._.$X$XjX].'.].$XjX X].]._.K.[.[.}.}.Y.}.;X:X|.:X;X:X;X;X;X|.;X;X;X|.;X;X[.|.[.|..X|.|.|.|.{.|.|.|.[.[. X|.|.|.[.[.{.|.{.}.}.}.}.{._.{._._.].[.{._.K.K.K.K.K.K.K.K.K.K.'._.Y.[.{.{.{.}.L.L.B {.+X'.{.{.{.{.{.{.{.{.{.|.{.|.{.{.{.L.L.'.L.'.L.I L.L.'.L.'.'.I '.'.'.'.'.'.'.'.XX'.{.XX].'.XXXX'._ _ XXI _ XXQ./.&X+XI.XX_ _ _ I [ I I I I _ I I XXI _ XX].I I I I _ '.I I J I _ XX_ V J I _ U U U [ I [ I I I _ U I _ I I I [ XXI _ [ [ R R R ^ _ _ ' R R _ R _ R R R R R g R R E ( R ( R ( ( R ! ( ^ ^ ( ( E ~ ( ! ~ ! ! W W W h D h > h { { | > { | > { > { { ;.;.;.,.;.;.1.,.2.,.,.2.,.;.,.;.;.;.,.:.;.;.#.:.| ;.;.:...:.....$.X.X.X.X.} ......X.X.X.X.X.X.5.X.>.X.>.3.>.>.>.>.>.:.:.<.3.3.w.<.$.3.7.<.$.3.$.$.3.<.<.<.6.7.6.6.6.6.~ ,.6.~ ,.~ ~ *.6.,.,.~ ,.6.~ #.,.6.,.6.6.6.6.<.,.6.<.,.7.1.8.7.*.*.*.*.*.eX4X7X7X~.7X~.7X7XtX7XtXuXeX4XeX4X~.*.H G L L L - $ $ $ $ $ - N S S A D ~ *.,.D D S : - - $ ; : f W ~ ;.W ! D : : - & & - : : D W D K ,.` / ) / 8.K ~ K ~ ~ ~ ~ ! D D S S $ N $ $ - : L Z Z ~.Z %.K %.Z D D > L - $ $ $ $ $ $ $ $ $ $ $ $ L L Z K Z Z Z L - - - - $ - - Z D D *.%.*.$.*.#.*.*.%.%.Z Z L - - $ $ $ $ $ $ $ $ $ $ O $ - & = = : > > 2.:.<.*.q.=.5Xw.5Xw.5Xw.5X5X=.0X0X5X%.%.Z Z L L - - - - - , - - - , - - - Z , > #.$.w.} -.-.-.y.y.y.y.=.-.-.-.y.-.y.-.-.-.y.-.y.-.", "}.[.}.[.[._.vXkXvXB ]. X$X$X X].].`.K.}.[.U.U.[.;X;X:X|.;X;X;X:X:X|.;X;X;X;X:X}.:X|.|.|.|.|.|.|.|.|.[.|.|.{.].].[..X|.{._.[.].[.{.}.|.}.}.[._._.B B {.]._.`.`.K.K.'.K.K.'.K.K.U K.'.U.{.Y._.K.V B B V _.{.{.].{.{.{.{.XX{.+X{.{.{.{.{.}.{.L.'.'._.L.L.'.L.L.'.I '.'.I '.'.I '.V I L.V I U U U U U U U N V P N I U _ L.XX/./.{._ XX_ _ I _ I I [ _ ]._ _ I _ _ V _ I I I U I I _ U U J I U _ _ U N N U U [ ].U U I I I I I I I '.I [ _ I _ _ R R R R _ R R R ' R R _ R R ' _ [ R R E R E R ( R R R ! E ( ^ ( ^ ( ^ E ( ! ! ! ~ ^ ~ ! ~ W ;.> W > > | ;.{ | { h { ..{ { { | 2.:.,.#.;.;.,.2.,.2.,.~ #.~ ;.W ;.;.;.,.#.#.;.;.;...| | :...X.X.X.X.} ..X.} ..{ ..X.X.3.X.X.X.>.X.>.>.:.>.3.:.<.$.<.<.7.3.3.7.7.$.7.$.w.<.7.$.3.3.3.$.3.6.6.6.,.6.*.6.6.~ ~ ,.~ ~ *.~ ,.6.~ #.` ,.6.~ ,.6.6.,.6.,.6.6.#.7.<.7.7.*.7.*.*.*.4X*.4X).4X7X7X~.~.4XtX4XtXuX4XtXuX4XeX~.K K H L L L L N L L - L - S L D K D *.6.6.#.D D S : L S - D D W W / / W ( > : - : & : : D D ! D ` K K 6.6./ ` K *.~ K D D D ~ D S : - - : S S L L Z Z K Z %.K %.K K D D D L L - - - $ $ - - - - - L L L L Z Z K %.Z Z > Z - - - - L Z Z *.#.*.*.$.$.*.*.%.%.%.Z Z Z L - - L - - - - - - $ - - - - - , : D D D $.=.2X5XyX5X5Xw.yX5Xw.5X=.yX0X0X3X5X&.=.%.Z Z Z Z L L Z , Z , Z > , { > > > @.#.$.$.$.y.-.y.y.y.y.y.y.-.-.-.-.-.-.-.-.-.y.-.-.-.-.", "[.*X[.}.|.{.bXbXkX].`.].$X1X X]._.`.K.}.[.[.[.{.;X:X;X:X:X|.;X|.|.:X;X X;X|.[.;X|.|.|.|.|.|.|.|.[.|.{.|.|.{.[.{.{.|.]._.[.]._._._._.{.[.}._._._.B B _.[._.`.K.`.`.K._.V K.K.K.K.K._._.{._.'.B B B C U '.{.{.{.{.{.{.{.{.{.'.{.{.{.{.{.'.{.'.L.L.L.'.L.'.V U I U I V U V U U U I U I I U V U V V N N U N N N N U P U J '.'./.XX_ XX_ I _ I XX'.I '._ _ '._ '.'._ _ I XX_ _ I I I _ U U U U U U I U N P U I [ U [ U [ I [ [ U I [ I I I I I _ R R _ R [ ' _ R R _ R _ ' _ ' R R _ ( R ( R E E R ^ R R ( E ( ^ ^ ^ ! ~ ( ~ ~ ^ ! ~ ! ~ ! D ;.W > > ;.> > | > | > | > { | { ,.;.#.,.;.;.:.;.;.,.;./ 1.;.;.;.#.W W #.;.;.:.;.{ :...;.{ ....:.X.} X.X.........X.X.3.X.X.X.>.>.X.>.X.X.:.3.<.<.<.3.<.$.$.3.<.3.3.7.3.<.$.$.7.3.$.$.<.3.$.3.6.6.6.6.,.6.6.6.,.,.6.*.,.6.*.6.6.,.6.~ ` #.,.,.,.6.6.6.6.7.0.*.*.*.7.*.7.*.*.*.4X' 4X).7X~.7X7X7XuX7XuX4X4XtX7XeX4XeX4X~.4XK K K L F L H Z A L K D K D 6.*.6.6.6.6.6.D D S L L L L K D ~ ,.1.~ ~ D S > : S D D D ~ ~ ` ` *.6.*.K *.6.*.*.D ,.*.K *.D K K Z S L S L L Z L K K %.%.K *.Z %.Z K Z D Z L L - L - L L L L L L L L Z Z %.%.%.K %.Z Z D L Z L D Z D *.*.*.$.*.*.%.*.=.%.=.=.*.%.Z Z Z Z L L Z Z L L L L - : L Z Z Z Z Z Z %.%.=.5X5X5X5X5Xw.5Xw.5X5XyXw.0X9X0X0X&.&.&.%.%.Z #.#.#.@.#.#.#.#.#.} } #.@.#.$.$.$.$.y.y.y.y.y.y.y.y.y.-.-.-.-.-.-.-.-.-.-.y.-.-.-.", "[.}.}.}.}.[.bXbXbX$X X].vXkX X]._.`.{.[.K.K.Y.|.|.;X|.|.[.;X:X X|.|.;X[.|.;X;X|.|.|.|._.[.|.[.|.|.[.[.|.[.|.{._.[.].[.[.[.[.`.`._.`._._._._._._.`.V _._._.`.K.K.K.K.`.`.K.K.K.K.K.V K.'._.B '.'.'._._._._.{.{.{.{.].{.{.{.{.{.{.{.{.{._.L.'.'.L.L.L.V V V I V '.U '.V '.V '.V V U V V U U V U P N Y N U Y N N U U P I _ '._ _ _ _ _ _ XXI _ _ I I _ '._ _ _ I I I _ '.V U _ U _ U _ U U _ _ U P U U P _ U I ].[ ]._ I U _ _ _ _ I I XX_ [ _ _ R R R ' R R R R ' R ' R _ _ _ R ' R R R ( ^ R R E E R E ^ ( ~ ( ^ ~ ~ ~ ~ ( ~ ~ ! ~ ^ ~ ( W > ;.| | { | { { { | { > ..{ { ,.;.,.;.<.;.;.#.:.;.,.;.;.,.;.W W W D ;.#.W { | #.;.;.....X.X.X.X.} X.{ } X...{ } ..X.$.>.3.:.X.:.<.$.*.$.,.<.<.<.<.<.<.<.<.3.3.=.w.$.$.<.w.$.3.7.$.3.$.3.$.3.$.6.,.6.,.6.,.6.6.6.6.*.,.*.~ *.6.*.~ ,.,.6.,.6.,.*.,.*.*.4X=.=.0.*.7.7.*.K *.*.4X7X7X7X7XuX7X~.7XtX7X7XeX4X4XuXtXeXeX4X~.K 4XK K K ~.K K *.K *.K *.` 7.7.7.0.*.0.*.~ D K Z K K #.K %.*.*.*.6.~ W ! D D D D D D ~ 6.K 6.` K *.*.K *.*.*.K ~ K #.K K D K K Z K L L Z K Z %.Z %.%.K %.%.K @.Z K Z D D Z Z L L L Z L Z L L Z Z Z Z K Z %.Z %.%.K Z D D Z D Z K #.*.$.=.*.q.*.*.%.=.%.%.%.%.%.%.%.Z @.*.Z Z Z Z D D Z Z @.K #.%.Z *.Z %.*.2X5XyX5X5X5X5X5XyX5X5XpX5X0X9X0X0X5X5X5X5X&.&.=.$.$.$.$.$.$.$.$.} $.$.$.$.$.$.$.y.y.y.y.y.y.y.y.y.y.0X-.-.-.-.-.-.-.-.-.-.-.-.-.", ";X[.[.*X[.{.JXbXbX X].$XkXvXjX'.B `.[.Y.[.}.[.[.:X[.|.|.|.{.;X;X:X|.;X:X:X[.|.;X|.;X X[.{.|.{.|.[.{.{.[.{.{.[.[._.[._._._.[._..X_.[._._._._._._._._._..X`._.`.U `._.K._.`.K.'.K.K._.K.K.'.K._._._._.'._._.'.{.{.{.{.{.{.{.{.{.{.{.L.L.'.{.L.L.K.V '.I V U V I U U '.U U I U U U I U U U V U V U V N N N N P N N N N _ '.XX'._ _ _ I _ I _ U _ _ U S _ I XXI I _ _ I _ _ _ U _ U _ U _ U U U U _ U I [ I U [ U I R R _ [ _ _ _ _ _ [ _ R ^ ' ! R R R [ R R R _ R _ ] _ ' [ ' ' _ _ R R E ! ( R ! ^ ! ! ^ / ~ ! ~ ~ W ! ~ ~ ~ ! ~ ~ ~ ! ~ W W > h > ;.> | h h { | { | { | ,.,.;.:.;.;.;.;.;.#.| ;.W ;.;.;.W D h #.h #.;.#.| { ;.{ } X.X.X.X.X.X.X.......{ ....{ X.X.:.<.*.$.$.6.$.$.$.<.<.<.$.<.3.<.$.<.<.7.<.<.w.3.$.7.$.3.3.w.$.$.3.$.3.<.7.<.6.,.6.6.*.*.~ *.6.6.6.,.6.6.,.,.6.~ ,.,.6.*.=.=.*.*.*.*.=.=.q.*.*.*.4X*.7X7X7X).7X7X~.4X7X7XtXtX7XuXeXtX4X4XeX4X4X~.4X4X4X2X4X2X4X4X2X*.*.0.*.*.q.*.*.7.6.7.*.*.*.K %.K *.*.*.*.*.*.*.*.*.#.W D D ~ #.6.,.6.6.6.*.*.0.` *.K K *.*.*.K *.K *.K *.D K Z K D Z K K K *.K *.%.K *.*.K Z *.%.K Z D L Z Z Z Z 2X2XZ 2XZ K %.%.%.2X%.2X%.%.%.%.%.D *.*.#.%.*.=.*.*.*.=.=.=.=.&.=.=.%.=.*.%.%.*.%.%.%.%.*.Z #.*.%.%.&.&.%.%.%.%.%.=.5X=.5X5X5X5XfX5XpX5XpX5X5X0X0X0X0X0X0X0X5X5X5X5X5X=.=.=.3.$.y.$.$.y.$.$.w.y.$.y.y.y.y.-.p.y.-.p.-.y.y.-.-.-.-.-.-.-.-.-.-.-.-.-.wX", "[.*X[.}.}.[.kX X].].].].].].`._._.`.[.[.[.[.[.[.|.:X|.;X:X{.|.;X:X[.;X X;X}.;X;X|.|.|.[.[.}.}.|.{.[.[.[.[.[.[._.[._..X`.[.`.`.`.`..X`.[._._._._._._.`._._.K.`.`._._.`.`.`._.'.K.`.K.'.'._._._.'._.'._._.'._.{.{.{.{.{.'.{.{.'.{.'.{.'.U.L.L.L.L.L.K.'.V V U V '.I U '.I I V U V V V U I U V U N N P U N N Y P U _ P P N _ V _ U _ _ J U _ U R U _ N _ _ _ I '._ V _ I XX_ _ I _ U U _ I U _ _ P _ U I I [ I [ I _ R ' _ _ R R _ _ _ R ' ! ' R ^ ' R R R ' ' R _ ' R R R ' _ _ ' ' E ( ! ! R ! R R ! ( ~ ! ^ ! ~ ~ ~ ( ~ ~ ~ ~ ! ! ~ ! ( ~ > h h > | > | | | { | r { ..W ,.;.,.;.;.;.;.;.;.#.W #.,.W ;.W D W { h #.| | #.{ | { ..X.X.X.} X.X...X...........{ X.X.{ $.*.$.<.$.6.7.*.7.<.<.$.3.$.7.3.$.3.3.7.$.$.7.<.3.$.3.w.3.$.3.3.$.3.3.7.,.6.,.,.6.~ *.,.*.6.6.*.~ 6.*.6.*.6.,.6.6.*.=.=.2X*.4X=.4X4X*.7.=.*.*.*.4X4X7X7X).7X7X7XuX4X~.7XeX7XtXyX4XtX4XuX7X4XeX7X4X4X5X4X4XyX5X4X4X4Xq.tX*.q.tXyX0.*.0.4Xw.*.*.4X*.*.K %.*.*.*.*.*.*.*.*.K D #.~ *.6.6.0.*.q.*.0.4X*.*.4X*.4X*.*.*.*.*.%.*.*.K *.%.%.K 2X*.2XK %.K *.%.*.*.*.*.*.*.K %.%.Z %.%.%.Z %.%.2XZ 2XZ *.%.%.%.%.%.%.&.&.%.%.%.*.*.#.*.$.*.*.=.q.=.=.*.5X&.&.=.5X=.&.=.=.4X=.&.*.=.%.=.*.=.%.=.&.=.&.=.&.=.&.=.3X3X5X5X5XyX0X5XyX5XyX5XyXpX0XwX0X0X0X0X0X5X0X8XpX8Xw.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.p.-.-.-.pXwX-.-.-.-.-.wX-.-.-.-.-.-.-.", ";X[.*X[.[.}.&X}.|.|.Y.;XU.[.}.U.}.[.[.K.[.[.[.}.|.;X:X|.{.|.{.:X X|.;X|.|.[.;X;X;X[.|._.`.K._.[._.[.K.K.K.[._.[.`.`.B `.`.`.`.B `.`.`.`.K.K.B _._.`._.B V `.`._.B B B V K.B `.K._.V K._.V V _._.'.`.].B B '.].{.{.{.{.{.{.{.U.{.{.L.L.L.'.L.'.U I U V U U '.U U I V U V I I U I U U U V V U N U N N N N N N N N _ N _ N J _ _ _ _ _ _ _ _ _ P _ P _ _ I _ _ J I _ I _ _ U J J U J _ U _ _ I I U U _ [ U [ U I I _ ' _ R ' _ _ _ _ ' R ^ R ' ! ' ! ! ' R [ R ' R _ R ' _ R R ' _ ! A ! ! ! E R ^ R ! ~ ^ ! ~ W / ~ ( ~ ~ ~ ! ~ W ! ~ ~ ~ ~ W h #.| { | { > { { { { { { | ,.,.;.;.<.3.>.<.<.;.;.;.#.;.;.D W #.;.#.;.#.{ ;.#.> #...} X.X.X.X.} X.X.} ....} { X.X.#.X.X.<.#.*.7.$.#.<.#.$.$.<.<.$.<.<.<.$.7.3.3.w.$.$.w.<.$.$.3.3.$.$.3.w.$.0.7.6.6.6.6.6.6.6.` ~ *.6.6.*.6.*.0.*.*.*.3X5X2X2X*.5X=.*.=.=.*.=.0.7.2X*.*.4X7X7X7X7X~.7X4X7X7X4XtXtX7X7XuX7XuX4XtX4X7XyX7X8XuX5X7X8XuX5X5X4X5XyXyX4X=.q.4XyXyXq.4X4X4X4X2X2X*.*.4X4X%.4X4X=.4X4X4XK Z Z *.*.*.0.0.*.*.*.*.*.4X4X*.%.4X*.*.*.*.4X4X2X*.4X*.K *.K %.*.*.%.2X4X%.2XK *.*.%.*.%.%.%.K %.K *.%.*.*.%.2X2X2X%.*.*.%.%.*.&.*.%.&.&.2X%.=.=.*.*.=.*.=.0.=.=.=.5X=.=.5X&.5X=.5X&.=.5X=.&.5X5X&.&.&.=.3X=.0X&.&.=.&.&.&.&.=.5X5X0XyX8X0X0XpX8XfX0X5X0X0X9X0X8XwX0X0X0X8X0X6Xy.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.-.0XwXwXwXwXwXwXwX-.wX-.-.wX-.-.-.-.wX-.-.-.", "[.}.[.;X;X[.;X}.|.L.}.}.}.Y.[.[.[.[.[.Y.[.[.[.`.[.|.:X;X X{.|.:X:X|.;X;X|.[.}.[.[.K._.`.[.Y.[.K.[.K.[.`._.`.[.`.B `.`.`.`.`.`.`.`.B `.B `.`.`.K._.B B `.`.B `.B _.Y `.B `.B B `.`.B K._._.B B _.`.B B '.'.U _.{.+X{.{.{.{.{.{.{.'.L.L.L.L.V V _.V '.U V '.V U K.U '.'.V U U V U V U V U V U V N U N Y N N Y N U U N U U U _ _ _ J U _ _ _ _ _ _ _ _ I I '._ I _ XX_ _ _ I J _ _ V _ _ N U _ U _ _ N _ _ I [ I [ R _ ' _ _ _ _ _ _ ! ' R ! ! R ! ! R ' ! ' R R _ _ ' _ ! _ ' _ ! ! D ! ! ! ! R ! ! ! ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ! ~ ! ~ ! ~ W > W | > { h h { r | { | { ,.,.,.;.,.3.>.>.3.>.3.<.>.>.<.:.:.;.;.;.:.;.| #.{ :.{ ..:.X.X...X.#.X.X.} X.{ X...X.#.X.} X.X...#.$.#.*.$.$.#.$.6.7.$.<.w.3.$.$.<.<.$.w.3.$.w.w.$.3.$.w.3.$.3.$.0.q.*.q.0.*.*.0.6.6.6.,.6.6.6.6.*.6.*.2X5X3X2X2X5X*.5X5X*.4X=.*.=.*.*.w.4X2X7X7X7X4X7X7X7X7X7X7X~.4XuX7XtXuXyX7XyXyX7XuX5X7X8XuX5XuX8XyX8XuX8XyX5XyX*.yXyX5Xq.4XyX5X4X4X2X4X4X~.K 4X*.4X*.*.2X2X*.=.4X*.K K %.*.2X4X7.7.*.4X*.4X%.*.2X4X*.*.*.*.*.%.2X4X&.%.%.*.2X2X2X*.%.4X*.2X%.%.*.4X*.4X*.%.2X4X%.%.%.%.%.%.2X2X%.2X%.*.%.%.*.5X%.2X&.*.&.%.2X%.4X=.w.7.7.*.q.w.7.=.&.=.=.5X=.=.=.0X=.5X5X3X&.-.&.5X=.&.-.3X-.5X0X3X0X0X3X&.&.0X5X5XyX5X8X5X0X8XfXyX0X5X0X0X0X0XwX0X0XwX0X0XwX0X8XpXy.y.y.y.y.y.y.-.-.y.p.y.-.0X-.9X9XwXwXwXwXwXwXwXwXwX-.-.-.-.-.pX-.-.-.-.-.-.-.", "}.}.;X[.[.;X[.;X{.}.[.}.[.[.[.[.[.K.[.[.[.[.[.[.[.[.[.[.[._.[.|.|.|.:X[.[._.[.[.[.K.[.`.`.[.[.K._.K.K.K.K.K._.[.`.`.`.`.`.`.`.`.`.B `.B `.B `.B `.B `.`.`.B K.K.`._._.B `.B V `._.B K.K.'.K.K.K.`.U '.`._.Y '.'.{.{.{.{.{.'.'.L.L.L.K.V V '.V V U V V U V U I I I I U I I K.U I U U V U U U N Y N P N N N N N P N _ J P P _ _ J _ _ _ J _ _ P _ _ N _ J _ _ J _ I _ V _ _ _ _ N _ _ J U J J _ U U _ U _ I _ I _ _ ! _ R R _ R ' ^ R ! ' ! R ' ' R ' R ' ^ ^ _ ' R R ' _ R ' ' ~ D ! D ! ' ! ! ! ! ! ! ~ ~ ~ ~ / ~ ! ~ ~ ~ / ~ ^ ! ~ ~ ~ ~ W ;.{ | ;.h | { | { { h #.h ,.,.;.,.<.1.>.<.>.>.<.>.:.:.:.,.:.:.;.:.;.;.#.| #.:.>.>.:.X.X.} X.X.} X.:.#.X.X.} } X...X...{ X.<.6.$.,.,.$.7.$.<.$.<.3.$.$.w.<.$.3.3.$.3.<.$.3.3.$.3.$.$.3.3.*.0.*.q.*.4X0.4X*.4X4X*.0.*.*.6.*.6.*.3X3X2X5X5X2X=.5X5X*.2X=.4Xw.4X*.w.*.2X2X7X7X7X7X7X7X7X7X7X7X7X7X7XtX7XtX7X4XuX7X7XyX7XyX7X5XuX8X5X8X8X5X8XyX8X5X4X4X4XyX5Xw.5Xw.4X2X4X4X%.2X%.%.2X2X4X4X*.*.4X4X4X2X@.Z *.*.5X2X4X4X2X4X4X*.4X2X4X%.4X*.*.2X4X%.4X%.4X2X4X2X*.2X*.2X4X%.2X2X4X2X2X2X%.%.%.%.%.%.%.*.*.%.%.*.2X=.%.2X%.=.2X*.2X=.2X*.&.2X2X&.5X&.&.&.&.=.=.w.=.=.4X5X5X5X3X&.5X5X5X&.5X5X&.-.3X3X0X5X3X3X-.5X&.0X&.-.9X9X&.&.9X3X5X0X5X5X8XfX8XyX5X0XyX0X0X0XwX0X0X6X0X6X0X6X0X0X0X0Xy.y.y.y.y.y.-.-.-.9X-.wX9XwXwXwXwXwXwXwXwXwXwXwXwXwXwXpX-.-.wX-.-.-.-.-.-.-.-.", "[.;X[.;X[.:X[.[.[.[.[.[.[.[.[.[.[.[.[.K.[.[..X[.[.`.[.[.[.`.[.{.|.|.|.[.[.`.[.[.`.`.[.K.[.[.[.K.`.K.`.`.[.`.[.`.`.`.`.[.`.B B .X`.B `.B `.`.K.`.`.B `.`.`.Y `.`.`.`.`.B _.B `.`.B B `.'.`.B K.U '.B U _._.U Y '.'.{.{.{.{.'.V L.L.K.V V V '.V V '.V U V Y U U U U V U U V U U U V I U V V U N P N P N N V P P N I N _ N N _ _ _ _ _ _ J _ _ S E _ N S _ I _ _ _ _ _ _ _ _ J _ J _ J _ N _ J J J J _ _ U U _ _ _ ' _ R _ R _ _ ' ' ' ! _ R ! ! ! ! R R ' ! ! _ ' ' R ' R ! _ ! D ` K ~ ~ ~ D ' ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ~ ~ ~ ~ ~ ~ ~ ~ ~ W h ;.h | | { h W D ;.W #.~ ;.~ ;.;.>.3.>.<.>.>.>.<.:.<.:.;.{ :.:.;.:.#.| ;.:.>.>.:.{ X.X...{ X.X.#.X.:.{ X.$...X...} X.:.#.7.#.7.$.<.$.#.#.7.7.<.3.<.$.3.$.<.3.w.$.$.3.w.$.3.$.$.3.$.q.q.*.q.0.4X*.K 4XeX4X0.4X4X*.eX4X*.0.*.4X3X3X3X2X5X5X2X=.4X=.*.=.=.*.*.4X2X2X2X7X2X7X4X7X7X7X7X7X7X7X7XtXuX7XuX4XyX7X8X7X8XtX8X8XuXtX8X8X7X5X8X8X5X8X8X4X5X5X5XyX5Xw.4X2X2X2X2X2X2X2X2X7X2X7X2X4X4X2X4X4X=.*.Z *.5X5X3X8X2X2X2X7X2X4X2X2X*.2X4X4X*.5X2X4X2X2X2X=.4X2X4X2X4X2X2X4X2X2X2X2X2X2XK %.2XZ %.%.Z 2X2X%.%.&.*.&.4X*.4X%.&.&.*.&.=.2X2X&.5X&.&.&.&.&.&.=.w.w.=.=.5X3X5X-.=.0X5X-.5X0X0X5X0X5X&.0X-.9X&.-.-.9X0X-.9X9X9X9X&.9X9X9X5X5X5XyX0X8XfX5X5X8X0X0X0X9X0X0X0X0X0X0XdX8X0X6X5Xy.-.-.&.0X0X0XwX0XwX0XwX9XwXwXqXwXqXwXqXqXwXwXwXwXwXwXwX0X-.-.-.0X-.-.-.-.-.-.", "[.[.*X[.[.[.*X[.Y.[.Y.Y.[.[.Y.`.Y.[.[.[.[.[.[.[.[.[.`.[.[._.`._..X|. X[.[.`.K.K.[.Y.[.K.K.K.K.[.K.[.Y.K.K.`.[.`.B `.`.`.`.`.B B `.`.`.`.`.B B `.`.B `.`.`.B `.`.B B B B `._.V B K.B K.B B V V `.Y U `.].].B '._.U {.{.{.L.L.K.L.V L.L.V B U V I U V B N V U U V U U U '.'.U I V U V U U U U N N V N N Y P N N U U _ N _ _ _ _ _ _ _ _ _ _ _ _ U _ _ U A A U U J N _ J _ _ P N _ J U J _ N _ U J U N J _ _ _ _ _ R R _ ' ' _ ^ R R R ' ! ! ' ' _ R ' ' R R ' ' _ _ F _ ' ! ' ~ ! D ! D ! ! ~ ` ! ` ~ ! ~ ~ / ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ^ ~ ( D | > h D ;.;.~ ,.W #.~ D W W #.#.;.>.<.<.>.>.<.:.<.:.;.:.:.:.#.{ :.:.#.:.{ :.>.:.X.{ { X.} X.} X.X.#.X.X.{ } X.{ X.X.#.*.$.*.<.6.#.$.7.7.$.#.$.$.<.3.<.3.$.3.$.$.3.3.$.$.3.$.3.3.3.w.*.0.0.*.4X4X0.4X*.4X*.4X*.*.4X4X4X4X4X4X4X3X5X8X3X3X2X3X4X2X=.4X4X4X2X2X2X2X2X7X7X7X7X7X7X7X7X7X7X7X8X4X7X4XtX7XyX4XuXuXyX8X7XuXyX5X8X5XuX5X8X8XuX7X8X8X7X4X*.yX4XyX4X*.2X~.2X4X2X~.~.2X2X2X2X5X2X4X5X5X4X5X4XK 2X3X5X8X3X2X8X2X2X2X2X2X4X4X2X4X=.4X2X2X5X4X=.2X4X5X4X5X%.2X8X2X2X2X2X8X2X2X5X3X2X2X2X2X%.2X2X2X2X5X%.5X&.2X=.%.&.*.5X&.5X&.2X2X3X2X2X3X&.3X3X3X3X3X=.5X3X-.=.&.3X3X&.3X3X&.&.&.=.&.&.&.&.&.9X3X3X&.&.&.9X9X9X9X-.9X&.9X0X0X6X8X0X8XfX5X0X5XfX0X0XwX0X0XqX0X0X8X0X6X0X0X0XwX0X-.9X0XwXwX0X0XwX0XwX0XwX0XwXwXqXwXqXqXqXqXwXwXwXqXdXpX-.0X-.-.-.wX-.pX-.pX-.", "[.[.[.:X[.[.[.[.[.[.[.[.[.[.[.Y.[.[.[.[.[.[.[.[.[.[.[.[.]._._._.].[.[.[.K.[.Y.K.K.Y.K.[.K.[.[.`.[.[.[.K.K.`.`.`.`.`.`.`.`.`.B `.Y `.`.`.`.`.`.`.`.`.`.`.`._.`.`._.K.Y B B K.K.B B K.B _.K.K.`.V _._.Y _.`.U '.U Y {._.'.'.U K.L.V L.V V V B V V V U U V V Y U V U V N Y B U V I V U V U U V N V P N P N N N U N N _ U N _ _ _ _ _ _ _ _ _ _ _ _ A _ _ _ _ _ _ _ _ _ _ A _ J U _ U _ U J J J J N J J J U _ _ _ _ _ ! ! _ _ ! _ ! _ ! R ! _ ! _ ! ! _ ! ' R ' ' _ F ' ! ' ' ! ~ D ! K ~ ` ~ K ~ K ` D ~ ! ~ ~ ~ ~ ~ ( ^ ~ ~ ~ ~ ( ~ ~ ~ ~ ~ ~ W W W W ~ W ~ ~ W W W ~ ;.W W #.W #.<.>.<.:.<.:.<.;.:.;.:.;...#.:.{ ;.| :.#.:.X.>.:.X.{ X.X.X.{ { X.X.#.} X.X...} X.X.*.<.,.6.#.$.6.,.#.,.*.$.$.#.$.$.3.$.3.3.3.<.w.w.3.3.$.3.y.$.*.0.*.tX*.*.yX*.4X*.4X*.4XK *.4X4X*.4X4X4X4X4X2X5X3X2X3X5X2X2X4X4X2X2X2X2X2X2X2X7X7X7X7X7X2X7X7X7X7X8X7X7X4XtX7XtXuX4X7X4X7X7XtX8X7X8XuXyX8XuX8X7X4X8X8X8X8X8X8X2XK %.2X4X2X~.2X~.2X4X2X2X~.2X2X8X2X8X5X4X4X8X8X8X&.5X8X6X8X3X8X3X2X8X2X2X2X2X4X4X4X5X=.4X2X4X2X2X4X5X2X2X2X2X2X2X3X2X2X3X2X3X3X2X3X2X2X2X2X2X3X2X2X&.2X&.&.3X&.*.2X2X2X2X2X2X3X&.3X3X3X3X&.3X3X&.3X&.&.5X5X3X3X9X5X0X-.3X&.&.=.&.&.%.%.&.%.&.&.&.&.&.%.&.&.&.9X9X9X9X-.9X9X9X3X0X5X5X5X8X8X5X8X0X0X9X0X0X0X9X9X0XwX0X0X0X0X8X0X0X0X3X3X0XwXwXwX0XwXwXwX0X9XwXqXqXqXqXqXqXqXqXqXqXwX-.-.0X-.-.-.-.-.-.-.-.-.0X", "[.:X[.*X[.:X[.:X*X[.*X[.[.[.[.[.[.:X[.[.[..X[.[..X[..X[.[.[._._._._._.[.[.`.`.[.[.[.`.[.[.`.Y.`.[.`.[.`.[.[.[.`.`.`.`.`..XB `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._._.B Y `.K.`._.K.'._._.K._._.`.U '._.U `.Y U Y '.U '.U `.I K.L.K.V '.V V V V V B B U U V U P P V U V P U N Y U I V U U N P P N Y N N N Y N N P J U N T _ E _ _ _ _ _ _ _ J _ _ N J _ A N _ _ _ J U _ J _ _ J J J N _ _ V _ A N _ J J N J _ _ _ _ R _ ' R ' R ~ R ' ! ! ! ! ' ! ' ! ! ! R ' ' ' ' K ! K D K ~ D ` ! D ~ K ~ ! ~ ' ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ^ ~ ~ ~ ~ ~ W W ( W W W #.W ,.W W ~ #.;.D ;.W 2.:.>.2.>.:.:.:.;.#.;.#.#.;...#.#...#...:.:.:.X.{ X.{ X.X.X.X.} { X.X.{ ..X.X.{ $.#.<.$.$.<.*.#.*.#.#.#.#.<.7.$.$.<.<.$.$.$.3.$.$.3.$.3.$.3.$.7.*.tX*.tXyX4X*.0.K K 4XK 4X4X4X0.4X4X*.4X4X4X4X3X5X2X3X2X5X3X3X2X&.2X2X2X4X2X2X7X8X7X7X8X7X7X8X7X7X7X7X7X7XuX4X7X4XtXuX4XyXtX8XuXtX8X8X8XyX8X8X5X5X7X8X5X8X7X8X8X2XK K 2X%.2X2X~.~.2X7X2X2X2X8X2X8X8X2X8X5X7X8X8X6X6X6X8X6X6X8X2X8X2X8X2X8X4X2X4X4X4X2X5X5X5X5X5X5X2X2X2X5X5X3X5X8X5X8X2X3X8X8X3X8X3X3X2X2X3X3X2X3X&.2X3X2X2X3X2X2X2X2X3X2X3X3X3X3X3X3X3X3X3X3X3X&.3X&.9X5X&.&.&.0X&.3X0X&.0X&.&.&.&.&.&.&.&.&.&.%.@.%.&.9X9X9X9X9X9X9X9X0X0X0X9XwX8XfX5XyX8XfX5X0X0X0XqX0X0X0X0X0X8X8XwX0X0X0X0X0X0X5X9XwXwX0XwXwX0X9XwXqXqXwXwXqXqXqXqXqXqXqXqX0X9X0X9X0X9X0X5X-.0X0X-.wX-.", "[.*X[.:X[.[.:X[..X[.[.[.[.[.[.[.[.[.:X[.[.[.[..X[..X[.[.[.[._._._.]._._.`.`.[.`.`.[.`.[.`.Y.`.[.`.K.[.[.`.[.K.[.[.[.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._.`.`.`.`._.`.B B B `.`.B K.K.`.K.K.`.K.'.'.K.`.`.'.Y U ].Y `.'._.U ].U _.U U U U V V V V V Y U V V Y U Y N U V P U N N Y N Y N P N V U N P N N U N N V P N N U N _ V _ _ _ _ _ E _ J _ _ _ P _ _ U A N S _ _ _ _ _ _ _ J J U _ N J V _ J J U J J V J S _ U _ ! ' R R ' _ R ! ' ! ' ! _ ! ! ! ! R ! ! F ! F F F ' ' K ,.K #.K ~ D D ~ K ~ ' ` ' ! ~ ~ D ` ! ! ~ ~ ~ / ~ ^ ~ ~ ~ ~ / ~ ! ~ ~ W W W W W W W ;.W ,.~ W #.#.W D ;.:.:.,.<.:.<.:.<.:.;.;.#.;.#.| { #...#.#.:.:.:.X.} X.{ X.{ X.$...X.{ X.X.X.{ ;.#.#.,.,.#.#.*.#.,.#.#.*.#.#.$.$.$.$.:.$.3.$.3.3.$.$.3.$.3.3.=.q.=.q.*.*.0.4X4X0.*.~.%.K 4X4X*.K 4X4X4X4X4X4X2X4X2X5X3X3X3X3X2X3X3X4X2X2X5X2X2X2X2X2X2X7X7X7X7X7X7X7X7X7X7X7X4X7XtX7XtX7XyX7X4X8X5XuX8XyX8X4X8X4X8X8X7X8X8X8X4X8X8X8X~.2X2X2X4X2X2X2X2X7X2X2X7X8X8X8X8X8X2X8X8X8X6X6X6X6X6X6X8X3X8X2X8X2X8X3X2X2X8X5X5X4X5X3X8X5X8X3X5X8X2X3X8X3X3X2X3X3X8X8X3X8X3X3X3X6X2X6X3X3X3X3X&.2X3X5X2X3X2X2X2X3X2X3X3X3X3X3X3X3X3X6X3X3X3X3X3X9X&.9X&.&.&.&.&.9X&.&.9X&.&.&.&.&.&.&.&.&.@.&.&.-.9X9X9X9X9X9X9X9X9X9X9X9XwX0X6X5X5X0XyX5X0XwX9X0X0X9X0X5X5X0X0X5X0X0X5X0X5X3X3X5X3XwXqX0X9XqX0XwX9X9XqXwXqXqXqXqXqXqXqXqXqXqX9X9X6X9X6X3X0X9X9X0X0X0X-.", "[.[.[.[.*X[.[.[.[.:X[.[.[.[.[.[.[..X[..X[..X[.[.[.[.[..X.X[._.[.[._.[._.Y.[.K.Y.[.`.[.`.[.[.[.`.[.[.[.`.[.`.[.K.`.`.`.[.[.`.`.`.`.[.[.`..X`..X`.`.`.`..X`.`._._.`.B `.`.`.`.`.`.K._.`.K._.K.K._.'.Y `.'._.'.'.U U U '.Y '.Y '.Y V Y Y V U V V V B V N V U V U V Y V N Y N P V N C Y N Y P N V N N N Y N P N N Y N _ _ _ _ _ E _ _ _ E _ U E _ _ J A _ _ _ _ P J _ P J U _ _ _ A _ J _ P U J J U J _ _ J _ _ _ _ _ _ _ ' ! R ' ! ! ! ! ! ' ! ! _ ' ' ! ' E ! S A ! K ! K D D ~ ~ D ` ~ ~ K ! D ' D ' ~ K ! ~ ~ ` ~ ~ / ~ ~ ~ ~ ~ / ~ ~ ! ~ / ~ ~ W / ( W / W ~ ,.W W W ;.W #.#.;.,.:.:.:.;.:.;.:.:.;.{ ;.{ ;.#.{ ..{ { X.:.X.:.{ X.{ X.{ X.{ } X.X.} X.{ ..:.#.#.*.*.#.,.,.#.#.#.,.*.,.#.#.#.:.<.$.$.$.$.3.$.3.$.3.$.3.$.7.7.*.7.=.0.yX4X*.eXq.4XK *.4X*.4X4X4X4X4X*.4X%.4X*.4X4X3X3X3X5X8X5X2X2X2X2X2X2X2X8X2X8X2X8X3X7X8X7X2X7X7X7X8X7X7X7XtX4X4X4XuX7X4XuXyXuX8XyX8X7X8X4X8X7X8X5X4X8X8X8X8X8X8X2X2X2X2X4X2X4X2X2X2X8X2X2X3X8X8X8X8X8X2X8X6X6X6X6X6X6X6X3X6X3X6X2X8X2X3X3X~.2X2X5X5X8X8X3X8X5X8X2X8X3X3X8X8X8X8X8X6X3X3X6X3X8X8X6X2X6X6X3X6X3X3X3X5X3X3X3X3X3X3X2X3X3X3X3X3X3X3X3X3X3X3X9X9X3X3X3X3X9X3X&.&.&.&.&.&.0X9X&.&.&.&.&.&.&.&.&.&.&.&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9XwX0X8X0X8XfX0X0X0X0X0X0X0X6X5X5X5X3X3X5X3X&.&.3X3X2XqXwXwX9X0XwX9X9XwX9XqXqXqXqXqXqXqXqXqXqXqXqX9X6X6X9X&.0X0X-.0X-.0X0X", ":X[.[.:X[.:X[.[.[.[.[.*X[.[.[.[.[.:X[.[.[.[.[.[.[.[._.[.[.{.[.{.[._.[.[.[.`.`.[.Y.`.[.Y.K.`.[.Y.[.Y.[.`.[.[.[.`.Y `.`.[.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`._.`.`.`.`.`._.`.`.`.K.`.K._.`.K.K._._.`.'.U `.`.Y '.Y '.Y U U U '.Y U Y B Y V U V V C V Y V U U V U N U P N N V Y C P N Y N N V N Y N N P N N N P N P N _ N _ _ _ _ _ _ _ E _ _ _ _ J P _ _ N P J _ J _ J _ J N _ J U V _ J J A J J J V J J J J U _ _ R _ ! _ _ ' _ ! _ ' ! R ! _ ! ! _ ! ! _ ! A S A K ! D K *.~ ~ D *.~ K *.,.` ~ ~ ~ ~ ! ~ K ! ~ ! ' ~ W ~ ~ ~ ~ ' ~ ~ ~ ~ ~ ~ ! / ~ W W ( W W / W W ;.#.W W #.;.W ,.:.<.:.:.;.:.;.#.:.#.> #.| ;.{ ..#.{ #.X.:.:.X.{ X.{ X.X.X.X.........X.{ #.#.K ;.#.*.#.,.#.6.#.#.#.,.#.*.,.<.$.<.$.$.3.3.$.$.3.$.3.$.w.*.w.7.*.0.*.tX*.0.4X4X*.K *.K *.*.4X4X*.K 4X4X4X4X4X*.4X2X3X3X2X2X3X2X3X2X2X2X2X2X2X8X2X2X8X3X8X2X7X7X7X8X7X7X7X7X4XuXuXuX4XyX7XtX4X7X8X7X8X8X7X7X8X8X2X4X8X4X8X7X4X8X8X8X8X2X2X2X2X2X2X2X8X8X2X7X6X8X6X8X8X8X8X8X8X6X6X6X6X6X6X6X6X8X2X2X6X2X8X2X2X2XZ Z 2X3X8X8X6X5X8X8X3X8X3X3X8X3X8X8X6X8X6X3X8X6X6X6X8X3X6X6X3X6X3X5X3X3X3X3X3X3X3X3X3X3X3X3X6X6X3X3X3X6X6X9X6X3X6X3X9X3X9X&.&.&.&.&.&.&.&.&.&.9X-.&.&.9X&.9X&.&.&.&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X8X5X0X8X8XfX0X9X0X0X0X5X0X5X5X&.&.5X5X5X3X5X&.&.3XqX9X3XqX6X9X3XqX3XqXqXqXqXqXqXqXqXqXqX6X6X6X9X6X9X3X6X=.0X-.9X0XpX", "[.[.[.[.[.[.:X:X[.:X[..X[.[..X.X.X[..X[..X[..X[._..X[.[..X[..X_._.[._.[.K.[.[.`.`.[.`.[.[.[.`.[.`.[.`.[.`.[.[.`.`.`.B B `.[.`..X.X`.`.`.`.`.[.`.`._.`._._.`.`.`.`.`.`.B `.`._.Y `.`.'.K._._._.K._._.Y '.'._.Y '.U '.U `.`.U U U U U N Y B Y N Y B N V Y U U V Y N Y V Y P N N Y P N C P P N N N P V P N N U N N U N N _ E _ _ _ _ _ _ _ _ E _ E _ _ _ A _ _ T _ _ J E _ _ J _ _ _ J U J J U P J J _ J N _ E _ _ _ ' R ! ! ! K ! ' ! ' F ! ' ! ' ' ! ! ! A E J ! ! K ~ D ~ D *.D ~ D #.~ D ` K ~ ! K ! ` ` ! ` ' D ! ! ~ ~ ~ ~ _ ~ ~ ~ / ~ ~ ~ ~ W W / ~ W W W W W #.W ;.;.W #.;.:.;.;.;.;.<.,.:.;.;.:.:.> #.| #.#.{ X...:.X.:...X.:.X.X.{ } ..X.X.{ X.:.#.#.#.#.6.$.6.#.#.#.,.*.,.*.#.*.#.#.*.#.$.3.$.3.$.$.3.$.3.$.3.0.=.7.7.*.*.w.*.yX*.yX*.4X*.K 4XK ~.*.4X4X4X4X~.2X4X*.4X4X4X8X3X3X3X5X3X2X5X2X2X3X2X2X2X2X2X2X8X2X8X3X8X8X7X8X7X8X8XeXtX4X7XtX7X4X7X4X4XuX5XuX5X5X8X4X8X7X4X8X8X4X8X8X8X8X8X8X6X7X4X8X2X7X2X2X2X7X8X8X8X6X8X8X6X6X8X6XqX6X6X6X6X6X6X6X2X6X8X2X8X2X8X2X2XZ %.K Z 2X6X8X6X6X6X6X8X8X8X6X6X6X6X8X6X6X6X6X6X0X6X3X3X6X6X6X6X3X3X5X6X3X3X3X3X3X3X6X3X3X6X3X3X3X9XqX6X9X9X9X9X9X9X3X9X&.3X&.&.&.&.&.&.&.&.&.&.&.9X&.&.9X&.9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9XqX9XqX9XqXwXwXwX0X5X5X5X8X0X0X&.0X5X&.0X5X5X5X&.&.&.&.%.&.2XqXqX6X9X6X6X3X9X3X9XqXqXqX6X6XqX6XqXqX6X6X6X6X6XqX6X6X3X9X0X0X0X0X" }; const char * WxCasPix::m_stop_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 79 1", " c None", ". c #6c0000", "X c #770000", "o c #6e5900", "O c #755f00", "+ c #7c6400", "@ c #83130b", "# c #981513", "$ c #a71c19", "% c #b52521", "& c #846b00", "* c #897000", "= c #907400", "- c #977a00", "; c #9c7e00", ": c #927c12", "> c #cd312c", ", c #d03e39", "< c #d44b47", "1 c #d75854", "2 c #da6561", "3 c #dc6f6b", "4 c #a48400", "5 c #b18e00", "6 c #b59200", "7 c #b49b00", "8 c #bd9700", "9 c #bb9a00", "0 c #bb9e12", "q c #cc9c00", "w c #c3a000", "e c #c6ac00", "r c #c6ae0c", "t c #c9a000", "y c #c9a800", "u c #d1a400", "i c #d3ab00", "p c #d8ad00", "a c #ddaf1a", "s c #d3b100", "d c #d3b800", "f c #d9b400", "g c #ddb800", "h c #e1bb00", "j c #e5bb18", "k c #e5bc20", "l c #dbc31a", "z c #e8c600", "x c #ecc800", "c c #e8ce18", "v c #efd30d", "b c #f5d400", "n c #f7d804", "m c #fadc00", "M c #f4db38", "N c #fce220", "B c #fce430", "V c #fde748", "C c #fde852", "Z c #f7e465", "A c #fce960", "S c #fdeb6a", "D c #fded71", "F c #fdee78", "G c #e59492", "H c #fdee81", "J c #fdef8b", "K c #fdf08f", "L c #fdf193", "P c #fdf198", "I c #fef3a3", "U c #fdf3ae", "Y c #fef5b3", "T c #fef6be", "R c #fdf6c3", "E c #fffbe2", "W c #fffef4", "Q c white", "! c None", /* pixels */ "!!!!!!!!!!!!!!!!!!!*&&&&!!!!!!!!", "!!!!!!!!!!!!!!;4;-=qqqq;+!!!!!!!", "!!!!!!!!!444448tuuyuuuqq;O!!!!!!", "!!!!!!!!4qiiiiuuuuuuuuuqu;o!!!!!", "!!!!!!!!4giippiuuiuuuuuuqq;o!!!!", "!!!!!!!!4gfiuiiiuuuuphxnmm9o!!!!", "!!!!!!!4qghfpuifhMHUUPPCm7O!!!!!", "!!!!!!!4ihhhxZTEERYUJHZm7O!!!!!!", "!!!!!!!4ggzgnWWRYPHHHSm7o!!!!!!!", "!!!!!!4wggzgSWYIHHHHCm7o!!!!!!!!", "!!!!!!4igggxTYPHHHFSBro!!!!!!!!!", "!!!!!!4fgggnTPHHHDCVdo!!!!!!!!!!", "!!!!!4wdfggAYHHHDACco=o!!!!!!!!!", "!!!!!4ifggxPLHFSAAMo*46o!!!!!!!!", "!!!!49idfgbYLFCAAA:oOooo!!!!!!!!", "!!!!4wiiidNKDCSAVVVBl7o!!!!!!!!!", "!!!!!4wiizAFSCVVVVVv7o=o!!!!!!!!", "!!!!!!4wibACVVVVVVmro=46o!!!!!!!", "!!!!!!!4wnVVVVVVVBl*oooooo!!!!!!", "!!!!!!!!4444440HBBBBBBmb7o!!!!!!", "!!!!!!!!!!4g94CEFBBBmmb7o!!!!!!!", "!!!!!!!!!!494SQFBBmk@@@@!!!!!!!!", "!!!!!!!!!!!-mTFBmma@$>>$@!!!!!!!", "!!!!!!!!!!*mFCmmmj@1GG31>X!!!!!!", "!!!!!!!!!!*****9m@$GQG3Q<$X!!!!!", "!!!!!!!!!!!!*8*bb@>GGQQ2<>.!!!!!", "!!!!!!!!!!!!*5*bb@>33QQ1<>.!!!!!", "!!!!!!!!!!!!!*ybx@$1Q21Q,#.!!!!!", "!!!!!!!!!!!!!*ix&!@><<<,%.!!!!!!", "!!!!!!!!!!!!!*d*!!!X$>>#.!!!!!!!", "!!!!!!!!!!!!!**!!!!!X...!!!!!!!!", "!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!!!" }; #ifndef __WXMSW__ const char * WxCasPix::m_wxcas_xpm[] = { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 190 2", " c None", ". c #182139", "X c #182152", "o c #18314a", "O c #10395a", "+ c #083963", "@ c #212942", "# c #21395a", "$ c #313142", "% c #31394a", "& c #39394a", "* c #39397b", "= c #08425a", "- c #00426b", "; c #004273", ": c #00526b", "> c #08526b", ", c #00637b", "< c #7b4200", "1 c #424252", "2 c #4a4a5a", "3 c #4a4a63", "4 c #525263", "5 c #5a5a6b", "6 c #52527b", "7 c gray42", "8 c #636373", "9 c gray45", "0 c #005294", "q c #085aad", "w c #00738c", "e c #006bad", "r c #006bb5", "t c #0073a5", "y c #007ba5", "u c #0073bd", "i c #007bc6", "p c #6b739c", "a c #0094bd", "s c #008cce", "d c #009cc6", "f c #0094d6", "g c #009cd6", "h c #0894d6", "j c #089cde", "k c #1894ce", "l c #00a5ce", "z c #00a5d6", "x c #00a5de", "c c #18a5de", "v c #00ade7", "b c #00b5e7", "n c #00b5ef", "m c #00bdef", "M c #08b5e7", "N c #00bdf7", "B c #10ade7", "V c #18b5e7", "C c #2194c6", "Z c #219cd6", "A c #21adde", "S c #31adde", "D c #21b5e7", "F c #29b5e7", "G c #39ade7", "H c #39bdef", "J c #00c6f7", "K c #42adde", "L c #4abde7", "P c #73bdd6", "I c #4ac6ef", "U c #4ad6f7", "Y c #5ac6ef", "T c #5ad6f7", "R c #63ceef", "E c #6bd6f7", "W c #73ceef", "Q c #73d6f7", "! c #8c4a00", "~ c #9c5200", "^ c #9c7339", "/ c #a55a00", "( c #ad5a00", ") c #a56300", "_ c #ad6300", "` c #ad6308", "' c #ad6b08", "] c #a56b18", "[ c #ad6b18", "{ c #ad7318", "} c #b56300", "| c #b56b00", " . c #bd6b00", ".. c #b56b10", "X. c #b57300", "o. c #bd7300", "O. c #bd7310", "+. c #ad7b39", "@. c #b57b29", "#. c #bd7b31", "$. c #c66b00", "%. c #c67300", "&. c #ce7300", "*. c #c67b18", "=. c #ce7b10", "-. c #d67b00", ";. c #bd8429", ":. c #b58442", ">. c #bd8c42", ",. c #ad946b", "<. c #b58c63", "1. c #b59c7b", "2. c #bd9c73", "3. c #bd9c7b", "4. c #bda57b", "5. c #c68418", "6. c #d68400", "7. c #de8400", "8. c #de8c08", "9. c #d68c18", "0. c #de8c18", "q. c #de9418", "w. c #c68421", "e. c #de8c21", "r. c #de9429", "t. c #d69431", "y. c #d69439", "u. c #de9c39", "i. c #e78c08", "p. c #e78c18", "a. c #e79418", "s. c #f79c08", "d. c #e79c21", "f. c #e79c29", "g. c #f7a518", "h. c #ffa510", "j. c #ffad18", "k. c #e7a539", "l. c #f7a521", "z. c #ffad21", "x. c #f7a531", "c. c #f7ad31", "v. c #ffb531", "b. c #ffb539", "n. c #c6944a", "m. c #ce944a", "M. c #de9c42", "N. c #c6a57b", "B. c #cead73", "V. c #cead7b", "C. c #e7ad4a", "Z. c #f7b542", "A. c #ffb542", "S. c #ffbd4a", "D. c #f7bd52", "F. c #ffbd52", "G. c #ffbd5a", "H. c #e7b573", "J. c #efbd73", "K. c #f7bd63", "L. c #ffc65a", "P. c #f7c66b", "I. c #ffc663", "U. c #ffc66b", "Y. c #ffc673", "T. c #ffce7b", "R. c #8cceef", "E. c #84def7", "W. c #94deef", "Q. c #94d6f7", "!. c #8ce7ff", "~. c #94e7ff", "^. c #9cefff", "/. c #a5e7ff", "(. c #a5efff", "). c #ade7ff", "_. c #b5efff", "`. c #d6bda5", "'. c #d6c6ad", "]. c #d6c6b5", "[. c #deceb5", "{. c #ffce84", "}. c #ffd68c", "|. c #ffd694", " X c #e7d6bd", ".X c #ffdea5", "XX c #e7dece", "oX c #efe7de", "OX c #ffe7c6", "+X c None", /* pixels */ "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X+X+X+X+X+X+X+X+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X9 2 +X", "+X+X+X+X+X+X+X+X+X+X+X+X+X+XR _.U % # @ X X + O o = . +X", "+X+X+X+X+X+X+X+X+X: : . . o K _.E q w t r y y r y r e r r . O +X", "+X+X+X+X. O + = : : w w t i W _.E y r r y y y r r e e r r . O +X", "+X+X+X4 * y r r y r r r y u E._.Q r y Z _.i y e e e e e r . $ +X", "+X+X+X4 * y r r y r r y r s /._.Q.y y E _.s r e e e e r r . $ +X", "+X+X+X4 * r r r y y y r y h )._.Q.r r Q._.j r e e e e r r . % +X", "+X+X+X4 - y y r r r r r y S (._.!.i r W._.A r e e e r r r . 1 +X", "+X+X+X4 - y y r r h s r r S _.Y _.i u ~._.K u r r r u u u . 1 +X", "+X+X+X4 - y y r u _.Y r r Y _.Y _.u a _./.R u i i u u i u . 2 +X", "+X+X+X4 - y r r a _.(.u r E _.I _.a h _.W.E.a i u u i i u . 3 +X", "+X+X+X4 * y y r j _._.j u E._.K _.a c _.T _.j i i u i s a . 4 +X", "+X+X+X5 * y y u L _._.G a _._.H _.s G _.F _.D s k j c D S J E Q ", "+X+X+X4 - y r u W _.!.T j _.S S _.j H _.V _.F Y W./._._._.(.+X+X", "+X+X+X5 ; u i k _.P Y W.D _.A G _.M P _.M _.Y _.R F H C v > 6 +X", "+X+X+XJ C K Y Q _.A H (.P _.c G _.C R Q g _._._.A f g g f o 4 +X", "+X+X XV.w.[ E.:.| N.c /.E._.k D _.D _.Y g T _.).M d f g f o 4 +X", "W W O.I.F.b.n.8.s.i./ ^.(.W.g D _.H _.U d U _.^.v f f x l o 4 +X", "+X+X) F.A.v.l.z.h.h.) `.'.T f A _.U _.F f F _.E v l v x x o 4 +X", "m.y...Z.A.c.r.f.l.h.o.6.6.`.f Z _.P _.D x Z _.U v v v v v o 4 +X", "H.}.I.G.u.` ._ ' q.h.h.s.6.'.C _.T _.B x b _.B v x x B b O 4 +X", "Y.T.U.I.) .&.&.$./ q.h.s.6.3.C _.Q._.M B B b b b b b B b O 4 +X", "-.e.U.I.:.[.[.2.] ( { j.i./ <.B _.~._.b b b b B v m m A m O 4 +X", ">._ K.Y.;.oX+X+XoX! ] z.g.s._ B _.~._.n b m A m m m m N n O 4 +X", "B.M.OX{.P.>.4.].].< r.v.z.g.X.m _.).Q.m A m m N N J J J E O 4 +X", "-.a..X}.P.P.C.t.t.k.S.x.9.a.@.N _._.T N N N J n E n E n n . 4 +X", "%.7.p.*.5.|.Y.I.L.G.L.G.| ~ '.z Q _.I 0 , ; o X . . % & 2 8 +X", "`.%.#.`.` .X|.T.D.x.{.{.e.,.. ; P _.E 7 +X+X+X+X+X+X+X+X+X+X+X+X", "+X'.+XXX_ d.K.J.@.-.0.=.} 1.+X+XR._.+Xp +X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X4.%.7.7.| '.+.&./ ^ +X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X", "+X+X+X+X3.+./ +.+X+X1.].+X+X+X+X+X_.+X+X+X+X+X+X+X+X+X+X+X+X+X+X" }; #endif /* !__WXMSW__ */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/onlinesig.cpp0000644000175000017470000001665711575347521020013 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: OnLineSig Class /// /// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "onlinesig.h" #include #include // Constructor OnLineSig::OnLineSig ( const wxFileName& file, const double absoluteMaxDL, const wxDateTime absoluteMaxDlDate ) { m_amulesig = file; m_sessionMaxDL = 0.0; m_sessionMaxDLDate = wxDateTime::Now(); m_absoluteMaxDL = absoluteMaxDL; m_absoluteMaxDlDate = absoluteMaxDlDate; m_isSessionMaxDlReseted = false; m_isAbsoluteMaxDlReseted = false; Refresh (); } // Destructor OnLineSig::~OnLineSig () {} // Accessors void OnLineSig::SetAmuleSig ( const wxFileName& file ) { m_amulesig = file; Refresh (); } void OnLineSig::Refresh () { wxFile file; if ( file.Open(m_amulesig.GetFullPath ()) ) { wxFileInputStream input ( file ); wxTextInputStream text ( input ); text.SetStringSeparators ( wxT( "\n" ) ); text >> m_amuleState; text >> m_serverName; text >> m_serverIP; text >> m_serverPort; text >> m_connexionID; text >> m_kadInfo; text >> m_DLRate; text >> m_ULRate; text >> m_queue; text >> m_sharedFiles; text >> m_user; text >> m_totalDL; text >> m_totalUL; text >> m_version; text >> m_sessionDL; text >> m_sessionUL; text >> m_runTimeS; double dl; m_DLRate.ToDouble ( &dl ); if ( dl > m_sessionMaxDL || m_isSessionMaxDlReseted ) { m_sessionMaxDL = dl; m_sessionMaxDLDate = wxDateTime::Now(); m_isSessionMaxDlChanged = true; m_isSessionMaxDlReseted = false; } else { m_isSessionMaxDlChanged = false; } if ( dl > m_absoluteMaxDL || m_isAbsoluteMaxDlReseted ) { m_absoluteMaxDL = dl; m_absoluteMaxDlDate = wxDateTime::Now(); m_isAbsoluteMaxDlChanged = true; m_isAbsoluteMaxDlReseted = false; } else { m_isAbsoluteMaxDlChanged = false; } } file.Close(); } int OnLineSig::GetAmuleState() const { if ( m_amuleState >= 0 && m_amuleState <= 2 ) { return ( m_amuleState ); } else { return ( -1 ); } } int OnLineSig::GetKadState() const { if ( m_kadInfo >= 0 && m_kadInfo <= 2 ) { return ( m_kadInfo ); } else { return ( -1 ); } } wxString OnLineSig::GetServerName () const { return m_serverName; } wxString OnLineSig::GetServerIP () const { return m_serverIP; } wxString OnLineSig::GetServerPort () const { return m_serverPort; } wxString OnLineSig::GetConnexionID () const { return m_connexionID; } wxString OnLineSig::GetULRate () const { return m_ULRate; } wxString OnLineSig::GetDLRate () const { return m_DLRate; } wxString OnLineSig::GetQueue () const { return m_queue; } wxString OnLineSig::GetSharedFiles () const { return m_sharedFiles; } wxString OnLineSig::GetUser () const { return m_user; } wxString OnLineSig::GetTotalUL () const { return m_totalUL; } wxString OnLineSig::GetTotalDL () const { return m_totalDL; } wxString OnLineSig::GetVersion () const { return m_version; } wxString OnLineSig::GetSessionUL () const { return m_sessionUL; } wxString OnLineSig::GetSessionDL () const { return m_sessionDL; } //only used to check if aMule is running or not int OnLineSig::GetUpStatus () const { return m_runTimeS; } wxString OnLineSig::GetRunTime () { unsigned int seconds = m_runTimeS; unsigned int days = PullCount( &seconds, 86400 ); unsigned int hours = PullCount( &seconds, 3600 ); unsigned int minutes = PullCount( &seconds, 60 ); if ( days > 0 ) { return ( wxString::Format ( _( "%02uD %02uh %02umin %02us" ), days, hours, minutes, seconds ) ); } else if ( hours > 0 ) { return ( wxString::Format ( _( "%02uh %02umin %02us" ), hours, minutes, seconds ) ); } else if ( minutes > 0 ) { return ( wxString::Format ( _( "%02umin %02us" ), minutes, seconds ) ); } else { return ( wxString::Format ( _( "%02us" ), seconds ) ); } } wxString OnLineSig::GetConvertedTotalUL () { return ( BytesConvertion ( m_totalUL ) ); } wxString OnLineSig::GetConvertedTotalDL () { return ( BytesConvertion ( m_totalDL ) ); } wxString OnLineSig::GetConvertedSessionUL () { return ( BytesConvertion ( m_sessionUL ) ); } wxString OnLineSig::GetConvertedSessionDL () { return ( BytesConvertion ( m_sessionDL ) ); } wxString OnLineSig::GetConnexionIDType () const { if ( m_connexionID == wxT( "H" ) ) { return ( wxString ( _( "HighID" ) ) ); } else if ( m_connexionID == wxT( "L" ) ) { return ( wxString ( _( "LowID" ) ) ); } else { return ( wxString ( _( "Not Connected" ) ) ); } } double OnLineSig::GetSessionMaxDL () const { return ( m_sessionMaxDL ); } wxDateTime OnLineSig::GetSessionMaxDlDate () const { return ( m_sessionMaxDLDate ); } void OnLineSig::ResetSessionMaxDL () { m_sessionMaxDL = 0.0; m_sessionMaxDLDate = wxDateTime::Now(); m_isSessionMaxDlReseted = true; } bool OnLineSig::IsSessionMaxDlChanged() const { return ( m_isSessionMaxDlChanged ); } double OnLineSig::GetAbsoluteMaxDL () const { return ( m_absoluteMaxDL ); } wxDateTime OnLineSig::GetAbsoluteMaxDlDate () const { return ( m_absoluteMaxDlDate ); } void OnLineSig::ResetAbsoluteMaxDL () { m_absoluteMaxDL = 0.0; m_absoluteMaxDlDate = wxDateTime::Now(); m_isAbsoluteMaxDlReseted = true; } bool OnLineSig::IsAbsoluteMaxDlChanged() const { return ( m_isAbsoluteMaxDlChanged ); } // Private use wxString OnLineSig::BytesConvertion ( const wxString & bytes ) { double d_bytes; wxString c_bytes; bytes.ToDouble ( &d_bytes ); int i = 0; while ( d_bytes > 1024 ) { d_bytes /= 1024; i++; } switch ( i ) { case 0: c_bytes = wxString::Format ( _( "%.0f B" ), d_bytes ); break; case 1: c_bytes = wxString::Format ( _( "%.2f KB" ), d_bytes ); break; case 2: c_bytes = wxString::Format ( _( "%.2f MB" ), d_bytes ); break; case 3: c_bytes = wxString::Format ( _( "%.2f GB" ), d_bytes ); break; default: c_bytes = wxString::Format ( _( "%.2f TB" ), d_bytes ); break; } return c_bytes; } unsigned int OnLineSig::PullCount ( unsigned int *runtime, const unsigned int count ) { unsigned int answer = *runtime / count; *runtime -= answer * count; return answer; } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcascte.h0000644000175000017470000001075311575347521017301 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasCte Structure /// /// Purpose: Store constants used in wxCas application /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCASCTE_H #define _WXCASCTE_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif /// Constants used in wxCas struct WxCasCte { /// Name of amulesig.dat file static const wxString AMULESIG_FILENAME; /// Name of the generated statistics image static const wxString AMULESIG_IMG_NAME; /// Refresh rate minimum limit static const wxUint32 MIN_REFRESH_RATE; /// Refresh rate maximum limit static const wxUint32 MAX_REFRESH_RATE; /// FTP update rate minimum limit static const wxUint32 MIN_FTP_RATE; /// FTP update rate maximum limit static const wxUint32 MAX_FTP_RATE; // Key config names /// Configuration key for amulesig.dat file's directory static const wxString AMULESIG_PATH_KEY; /// Configuration key for refresh rate static const wxString REFRESH_RATE_KEY; /// Configuration key for enabling autogenation of statistics image static const wxString ENABLE_AUTOSTATIMG_KEY; /// Configuration key for auto saving statistics image directory static const wxString AUTOSTATIMG_DIR_KEY; /// Configuration key for auto saving statistics image type static const wxString AUTOSTATIMG_TYPE_KEY; /// Configuration key for enabling FTP auto update static const wxString ENABLE_FTP_UPDATE_KEY; /// Configuration key for FTP update rate static const wxString FTP_UPDATE_RATE_KEY; /// Configuration key for FTP URL static const wxString FTP_URL_KEY; /// Configuration key for FTP path static const wxString FTP_PATH_KEY; /// Configuration key for FTP login username static const wxString FTP_USER_KEY; /// Configuration key for FTP login password static const wxString FTP_PASSWD_KEY; /// Configuration key storing maximum DL rate during previous wxCas runs static const wxString ABSOLUTE_MAX_DL_KEY; /// Configuration key storing maximum DL rate date during previous wxCas runs static const wxString ABSOLUTE_MAX_DL_DATE_KEY; // Default config parameters /// Configuration default amulesig.dat file's directory static const wxString DEFAULT_AMULESIG_PATH; /// Configuration default for refresh rate static const wxUint32 DEFAULT_REFRESH_RATE; /// Configuration default for enabling autogenation of statistics image static const bool DEFAULT_AUTOSTATIMG_ISENABLED; /// Configuration default for auto saving statistics image directory static const wxString DEFAULT_AUTOSTATIMG_PATH; /// Configuration default for auto saving statistics image type static const wxString DEFAULT_AUTOSTATIMG_TYPE; /// Configuration default for enabling FTP auto update static const bool DEFAULT_FTP_UPDATE_ISENABLED; /// Configuration default for FTP update rate static const wxUint32 DEFAULT_FTP_UPDATE_RATE; /// Configuration default for FTP URL static const wxString DEFAULT_FTP_URL; /// Configuration default for FTP path static const wxString DEFAULT_FTP_PATH; /// Configuration default for FTP login username static const wxString DEFAULT_FTP_USER; /// Configuration default for FTP login password static const wxString DEFAULT_FTP_PASSWD; }; wxString GetDefaultAmulesigPath(); #endif /* _WXCASCTE_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcascte.cpp0000644000175000017470000001227211575347521017632 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasCte Structure /// /// Purpose: Store constants used in wxCas application /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation #ifdef __BORLANDC__ #pragma hdrstop #endif #include #ifdef __WXMAC__ #include // Do_not_auto_remove #if wxCHECK_VERSION(2, 9, 0) #include // Do_not_auto_remove #else #include // Do_not_auto_remove #endif #include // Do_not_auto_remove #elif defined(__WXMSW__) #include // Do_not_auto_remove #include // Do_not_auto_remove #include #endif #include "wxcascte.h" const wxString WxCasCte::AMULESIG_FILENAME ( wxT( "amulesig.dat" ) ); const wxString WxCasCte::AMULESIG_IMG_NAME ( wxT( "aMule-online-sign" ) ); // Refresh rate limits const wxUint32 WxCasCte::MIN_REFRESH_RATE = 1; const wxUint32 WxCasCte::MAX_REFRESH_RATE = 3600; // FTP update limits const wxUint32 WxCasCte::MIN_FTP_RATE = 1; const wxUint32 WxCasCte::MAX_FTP_RATE = 1440; // Key config names const wxString WxCasCte::AMULESIG_PATH_KEY ( wxT( "OSDirectory" ) ); const wxString WxCasCte::REFRESH_RATE_KEY ( wxT( "RefreshRate" ) ); const wxString WxCasCte::ENABLE_AUTOSTATIMG_KEY ( wxT( "EnableAutoStatImg" ) ); const wxString WxCasCte::AUTOSTATIMG_DIR_KEY ( wxT( "StatImgDirectory" ) ); const wxString WxCasCte::AUTOSTATIMG_TYPE_KEY ( wxT( "StatImgType" ) ); const wxString WxCasCte::ENABLE_FTP_UPDATE_KEY( wxT( "EnableFtpUpdate" ) ); const wxString WxCasCte::FTP_UPDATE_RATE_KEY ( wxT( "FtpUpdateRate" ) ); const wxString WxCasCte::FTP_URL_KEY ( wxT( "FtpUrl" ) ); const wxString WxCasCte::FTP_PATH_KEY ( wxT( "FtpPath" ) ); const wxString WxCasCte::FTP_USER_KEY ( wxT( "FtpUser" ) ); const wxString WxCasCte::FTP_PASSWD_KEY ( wxT( "FtpPasswd" ) ); const wxString WxCasCte::ABSOLUTE_MAX_DL_KEY ( wxT( "AbsoluteMaxDL" ) ); const wxString WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY ( wxT( "AbsoluteMaxDlDate" ) ); // Default config parameters const wxString WxCasCte::DEFAULT_AMULESIG_PATH ( GetDefaultAmulesigPath() ); const wxUint32 WxCasCte::DEFAULT_REFRESH_RATE = 5; const bool WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED = FALSE; const wxString WxCasCte::DEFAULT_AUTOSTATIMG_PATH ( wxFileName::GetHomeDir () ); const wxString WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ( wxT( "PNG" ) ); const bool WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED = FALSE; const wxUint32 WxCasCte::DEFAULT_FTP_UPDATE_RATE = 10; const wxString WxCasCte::DEFAULT_FTP_URL( wxT( "ftp.myftp.cx" ) ); const wxString WxCasCte::DEFAULT_FTP_PATH( wxT( "/pub/myamuledir" ) ); const wxString WxCasCte::DEFAULT_FTP_USER( wxT( "anonymous" ) ); const wxString WxCasCte::DEFAULT_FTP_PASSWD( wxT( "whiterabit@here" ) ); wxString GetDefaultAmulesigPath() { wxString strDir; #ifdef __WXMAC__ FSRef fsRef; if (FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fsRef) == noErr) { CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); CFStringRef cfString = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); CFRelease(urlRef) ; #if wxCHECK_VERSION(2, 9, 0) strDir = wxCFStringRef(cfString).AsString(wxLocale::GetSystemEncoding()) + wxFileName::GetPathSeparator() + wxT("aMule"); #else strDir = wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()) + wxFileName::GetPathSeparator() + wxT("aMule"); #endif } #elif defined(__WXMSW__) LPITEMIDLIST pidl; HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); if (SUCCEEDED(hr)) { if (!SHGetPathFromIDList(pidl, wxStringBuffer(strDir, MAX_PATH))) { strDir = wxEmptyString; } else { strDir = strDir + wxFileName::GetPathSeparator() + wxT("aMule"); } } if (pidl) { LPMALLOC pMalloc; SHGetMalloc(&pMalloc); if (pMalloc) { pMalloc->Free(pidl); pMalloc->Release(); } } #else strDir = wxFileName::GetHomeDir() + wxFileName::GetPathSeparator() + wxT(".aMule"); #endif return strDir; } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/Makefile.am0000644000175000017470000000213011575347521017331 0ustar topiusersAM_CPPFLAGS = $(MULECPPFLAGS) $(WX_CPPFLAGS) AM_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) AM_LDFLAGS = $(MULELDFLAGS) bin_PROGRAMS = wxcas wxcas_SOURCES = onlinesig.cpp \ linuxmon.cpp \ wxcas.cpp \ wxcasprint.cpp \ wxcasframe.cpp \ wxcasprefs.cpp \ wxcascte.cpp \ wxcaspix.cpp noinst_HEADERS = onlinesig.h \ linuxmon.h \ wxcas.h \ wxcasprint.h \ wxcasframe.h \ wxcasprefs.h \ wxcascte.h \ wxcaspix.h wxcas_LDADD = $(WX_LIBS) # Resources if NEED_RC SUFFIXES = .rc wxcas_LDADD += wxcasrc.$(OBJEXT) wxcasrc.$(OBJEXT): $(srcdir)/../wxcas.rc wxcas-version.rc cat $^ | \ ( \ abs_builddir=`pwd` ; \ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ cd $( "$@" CLEANFILES = *-version.rc endif MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/wxCas/src/wxcasframe.h0000644000175000017470000001127411575347521017617 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasFrame Class /// /// Purpose: wxCas main frame /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCASFRAME_H #define _WXCASFRAME_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include "onlinesig.h" #ifdef __LINUX__ // System monitoring on Linux #include "linuxmon.h" #endif /// Main wxCas Frame class WxCasFrame: public wxFrame { private: wxToolBar *m_toolbar; wxBitmap m_toolBarBitmaps[ 6 ]; wxBoxSizer *m_frameVBox; wxBoxSizer *m_mainPanelVBox; wxPanel *m_mainPanel; wxStaticLine *m_staticLine; #ifdef __WXMSW__ wxStaticLine *m_BottomStaticLine; #endif wxStaticBox *m_sigPanelSBox; wxStaticBoxSizer *m_sigPanelSBoxSizer; wxStaticBox *m_monPanelSBox; wxStaticBoxSizer *m_monPanelSBoxSizer; wxStaticBox *m_hitPanelSBox; wxStaticBoxSizer *m_hitPanelSBoxSizer; wxStaticBox *m_absHitPanelSBox; wxStaticBoxSizer *m_absHitPanelSBoxSizer; wxStaticText *m_statLine_1; wxStaticText *m_statLine_2; wxStaticText *m_statLine_3; wxStaticText *m_statLine_4; wxStaticText *m_statLine_5; wxStaticText *m_statLine_6; wxStaticText *m_statLine_7; wxStaticText *m_absHitLine; wxButton *m_absHitButton; wxStaticText *m_hitLine; wxButton *m_hitButton; wxTimer * m_refresh_timer; wxTimer * m_ftp_update_timer; OnLineSig *m_aMuleSig; unsigned int m_maxLineCount; #ifdef __LINUX__ // System monitoring on Linux wxStaticText *m_sysLine_1; wxStaticText *m_sysLine_2; LinuxMon *m_sysMonitor; #endif enum { ID_BAR_REFRESH = 1000, ID_BAR_SAVE, ID_BAR_PRINT, ID_BAR_PREFS, ID_BAR_ABOUT, ID_REFRESH_TIMER, ID_FTP_UPDATE_TIMER, ID_HIT_BUTTON, ID_ABS_HIT_BUTTON }; // Get maximum of 2 uint unsigned int GetMaxUInt( const unsigned int a, const unsigned int b ) { return ( ( a ) > ( b ) ? ( a ) : ( b ) ); } // Constructing Stat_lines wxString MakeStatLine_1() const; wxString MakeStatLine_2() const; wxString MakeStatLine_3() const; wxString MakeStatLine_4() const; wxString MakeStatLine_5() const; wxString MakeStatLine_6() const; wxString MakeStatLine_7() const; // Constructing Hits_lines wxString MakeHitsLine_1() const; wxString MakeHitsLine_2() const; #ifdef __LINUX__ // System monitoring on Linux // Constructing Sys_lines wxString MakeSysLine_1() const; wxString MakeSysLine_2() const; #endif protected: bool UpdateStatsPanel (); void UpdateAll ( bool forceFitting = FALSE ); void SaveAbsoluteHits(); void OnBarRefresh ( wxCommandEvent & event ); void OnBarAbout ( wxCommandEvent & event ); void OnBarSave ( wxCommandEvent & event ); void OnBarPrint ( wxCommandEvent & event ); void OnBarPrefs ( wxCommandEvent & event ); void OnRefreshTimer ( wxTimerEvent & event ); void OnFtpUpdateTimer ( wxTimerEvent & event ); void OnHitButton ( wxCommandEvent & event ); void OnAbsHitButton ( wxCommandEvent & event ); DECLARE_EVENT_TABLE () public: /// Constructor WxCasFrame ( const wxString& title ); /// Destructor ~WxCasFrame (); /// Get Online statistics image wxImage *GetStatImage () const; /// Refresh timer period changing bool ChangeRefreshPeriod( const int newPeriod ); /// Refresh timer period changing bool ChangeFtpUpdatePeriod( const int newPeriod ); /// Set amulesig.dat file void SetAmuleSigFile( const wxFileName& file ); }; #endif /* _WXCASFRAME_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/onlinesig.h0000644000175000017470000001164511575347521017450 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: OnLineSig Class /// /// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _ONLINESIG_H #define _ONLINESIG_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include /// amulesig.dat file monitoring class OnLineSig { private: double m_sessionMaxDL; wxDateTime m_sessionMaxDLDate; bool m_isSessionMaxDlChanged; bool m_isSessionMaxDlReseted; double m_absoluteMaxDL; wxDateTime m_absoluteMaxDlDate; bool m_isAbsoluteMaxDlChanged; bool m_isAbsoluteMaxDlReseted; int m_amuleState; wxString m_serverName; wxString m_serverIP; wxString m_serverPort; wxString m_connexionID; int m_kadInfo; wxString m_ULRate; wxString m_DLRate; wxString m_queue; wxString m_sharedFiles; wxString m_user; wxString m_totalUL; wxString m_totalDL; wxString m_version; wxString m_sessionUL; wxString m_sessionDL; unsigned int m_runTimeS; wxFileName m_amulesig; wxString BytesConvertion ( const wxString& bytes ); unsigned int PullCount ( unsigned int *runtime, const unsigned int count ); public: /// Constructor OnLineSig ( const wxFileName& file, const double absoluteMaxDL = 0.0, const wxDateTime absoluteMaxDlDate = wxDateTime::Now() ); /// Destructor ~OnLineSig (); /// Set amulesig.dat file name and path void SetAmuleSig ( const wxFileName& file ); /// Refresh stored informations void Refresh (); /// Return TRUE if aMule is running int GetAmuleState () const; /// Return kad stat int GetKadState () const; /// Get server name wxString GetServerName () const; /// Get server IP wxString GetServerIP () const; /// Get server Port wxString GetServerPort () const; /// Get server connexion ID: H or L wxString GetConnexionID () const; /// Get Upload rate wxString GetULRate () const; /// Get Download rate wxString GetDLRate () const; /// Get number of clients in queue wxString GetQueue () const; /// Get number of shared files wxString GetSharedFiles () const; /// Get user name wxString GetUser () const; /// Get total Upload wxString GetTotalUL () const; /// Get total Download wxString GetTotalDL () const; /// Get aMule version wxString GetVersion () const; /// Get session Upload wxString GetSessionUL () const; /// Get session Download wxString GetSessionDL () const; /// Getrunnin Status int GetUpStatus () const; /// Get aMule runtime wxString GetRunTime (); /// Get total Upload in the best representative unit wxString GetConvertedTotalUL (); /// Get total Download in the best representative unit wxString GetConvertedTotalDL (); /// Get session Upload in the best representative unit wxString GetConvertedSessionUL (); /// Get session Download in the best representative unit wxString GetConvertedSessionDL (); /// Get server connexion ID: LowID or HighID wxString GetConnexionIDType () const; /// Get max Download rate since wxCas is running double GetSessionMaxDL () const; /// Get max Download date since wxCas is running wxDateTime GetSessionMaxDlDate () const; /// Has the Max session DL rate been beated since last refresh bool IsSessionMaxDlChanged() const; /// Reset absolute max Download rate and date void ResetSessionMaxDL (); /// Get absolute max Download rate double GetAbsoluteMaxDL () const; /// Get absolute max Download date wxDateTime GetAbsoluteMaxDlDate () const; /// Has the absolute Max session DL rate been beated since last refresh bool IsAbsoluteMaxDlChanged() const; /// Reset absolute max Download rate void ResetAbsoluteMaxDL (); }; #endif /* _ONLINESIG_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcas.h0000644000175000017470000000366611575347521016612 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCas Class /// /// Purpose: wxCas application class /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCAS_H #define _WXCAS_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wxcasframe.h" /// Application class WxCas: public wxApp { private: WxCasFrame * m_frame; protected: wxLocale m_locale; // Used to tell wxCas to use aMule catalog public: /// Application initialisation virtual bool OnInit (); /// Cleaning on exit virtual int OnExit(); /// Get application main frame WxCasFrame *GetMainFrame () const; }; DECLARE_APP ( WxCas ) #endif /* _WXCAS_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcasprefs.h0000644000175000017470000000711311575347521017641 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasPrefs Class /// /// Purpose: Display user preferences dialog and manage configuration storage system /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCASPREFS_H #define _WXCASPREFS_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include /// Preference Dialog class WxCasPrefs: public wxDialog { private: wxBoxSizer * m_mainVBox; wxStaticBox *m_osPathSBox; wxStaticBoxSizer *m_osPathSBoxSizer; wxTextCtrl *m_osPathTextCtrl; wxButton *m_osPathBrowseButton; wxStaticBox *m_refreshSBox; wxStaticBoxSizer *m_refreshSBoxSizer; wxSpinCtrl *m_refreshSpinButton; wxStaticText *m_refreshStaticText; wxStaticBox *m_autoStatImgSBox; wxStaticBoxSizer *m_autoStatImgSBoxSizer; wxCheckBox *m_autoStatImgCheck; wxBoxSizer *m_autoStatImgHBoxSizer; wxTextCtrl *m_autoStatImgTextCtrl; wxButton *m_autoStatImgButton; wxComboBox *m_autoStatImgCombo; wxStaticBox *m_ftpUpdateSBox; wxStaticBoxSizer *m_ftpUpdateSBoxSizer; wxSpinCtrl *m_ftpUpdateSpinButton; wxStaticText *m_ftpUpdateStaticText; wxBoxSizer *m_ftpRateHBoxSizer; wxCheckBox *m_ftpUpdateCheck; wxGridSizer *m_ftpUpdateGridSizer; wxTextCtrl *m_ftpUrlTextCtrl; wxStaticText *m_ftpUrlStaticText; wxTextCtrl *m_ftpPathTextCtrl; wxStaticText *m_ftpPathStaticText; wxTextCtrl *m_ftpUserTextCtrl; wxStaticText *m_ftpUserStaticText; wxTextCtrl *m_ftpPasswdTextCtrl; wxStaticText *m_ftpPasswdStaticText; wxStaticLine *m_staticLine; wxBoxSizer *m_buttonHBox; wxButton *m_validateButton; wxButton *m_cancelButton; void EnableAutoStatImgCtrls( bool state ); void EnableFtpUpdateCtrls( bool state ); enum { ID_OSPATH_BROWSE_BUTTON = 100, ID_AUTOSTATIMG_CHECK, ID_AUTOSTATIMG_COMBO, ID_AUTOSTATIMG_BROWSE_BUTTON, ID_FTP_UPDATE_CHECK, ID_VALIDATE_BUTTON }; protected: void OnOSPathBrowseButton ( wxCommandEvent & event ); void OnValidateButton ( wxCommandEvent & event ); void OnAutoStatImgBrowseButton ( wxCommandEvent & event ); void OnAutoStatImgCheck ( wxCommandEvent & event ); void OnFtpUpdateCheck ( wxCommandEvent & event ); DECLARE_EVENT_TABLE () public: /// Constructor WxCasPrefs ( wxWindow * parent ); /// Destructor ~WxCasPrefs (); }; #endif /* _WXCASPREFS_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcaspix.h0000644000175000017470000000376111575347521017327 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: WxCasPix Class /// /// Purpose: Monitor aMule Online Statistics by reading amulesig.dat file /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCASPIX_H #define _WXCASPIX_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif class WxCasPix { private: static const char *m_about_xpm[]; static const char *m_prefs_xpm[]; static const char *m_print_xpm[]; static const char *m_refresh_xpm[]; static const char *m_save_xpm[]; static const char *m_stat_xpm[]; static const char *m_stop_xpm[]; #ifndef __WXMSW__ static const char *m_wxcas_xpm[]; #endif public: static wxBitmap getPixmap( const wxString& name ); }; #endif /* _WXCASPIX_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcasprint.cpp0000644000175000017470000000644111575347521020214 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasPrint Class /// /// Purpose: Manage statistics image printing /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "wxcas.h" #include "wxcasframe.h" #include "wxcasprint.h" // Constructor WxCasPrint::WxCasPrint ( const wxString& title ) : wxPrintout ( title ) {} // Destructor WxCasPrint::~WxCasPrint () {} bool WxCasPrint::OnPrintPage ( int page ) { wxDC * dc = GetDC (); if ( dc ) { if ( page == 1 ) { DrawPageOne ( dc ); } dc->SetDeviceOrigin ( 0, 0 ); dc->SetUserScale ( 1.0, 1.0 ); return TRUE; } else { return FALSE; } } bool WxCasPrint::OnBeginDocument ( int startPage, int endPage ) { if ( !wxPrintout::OnBeginDocument ( startPage, endPage ) ) { return FALSE; } else { return TRUE; } } void WxCasPrint::GetPageInfo ( int *minPage, int *maxPage, int *selPageFrom, int *selPageTo ) { *minPage = 1; *maxPage = 1; *selPageFrom = 1; *selPageTo = 1; } bool WxCasPrint::HasPage ( int pageNum ) { return ( pageNum == 1 ); } void WxCasPrint::DrawPageOne ( wxDC * dc ) { wxInt32 dc_w, dc_h; // Get the size of the DC in pixels dc->GetSize ( &dc_w, &dc_h ); // Get the size of the image in pixels wxImage *statImage = wxGetApp ().GetMainFrame () ->GetStatImage (); wxUint32 marginX = 50; wxUint32 marginY = 50; wxUint32 sizeX = statImage->GetWidth () + 2 * marginX; wxUint32 sizeY = statImage->GetHeight () + 2 * marginY; // Calculate a suitable scaling factor float scale = wxMin ( ( float ) ( dc_w ) / sizeX, ( float ) ( dc_h ) / sizeY ); // Calculate the position on the DC for centring the graphic float posX = marginX + ( dc_w - sizeX * scale ) / 2.0; float posY = marginY + ( dc_h - sizeY * scale ) / 2.0; // Set the scale and origin dc->SetUserScale ( scale, scale ); dc->SetDeviceOrigin ( ( wxCoord ) posX, ( wxCoord ) posY ); // Draw image dc->DrawBitmap ( wxBitmap( *statImage ), 0, 0, FALSE ); } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcasprint.h0000644000175000017470000000401711575347521017656 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasPrint Class /// /// Purpose: Manage statistics image printing /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _WXCASPRINT_H #define _WXCASPRINT_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include /// Statistic image printing class WxCasPrint: public wxPrintout { public: /// Constructor WxCasPrint ( const wxString& title ); ///Destructor ~WxCasPrint (); bool OnPrintPage ( int page ); bool HasPage ( int page ); bool OnBeginDocument ( int startPage, int endPage ); void GetPageInfo ( int *minPage, int *maxPage, int *selPageFrom, int *selPageTo ); void DrawPageOne ( wxDC * dc ); }; #endif /* _WXCASPRINT_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcas.cpp0000644000175000017470000000513711575347521017140 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCas Class /// /// Purpose: wxCas application class /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifdef HAVE_CONFIG_H #include "config.h" // Needed for PACKAGE #else #define PACKAGE "amule" #endif #if !wxUSE_PRINTING_ARCHITECTURE #error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile wxCas. #endif #include #include "wxcas.h" // Application implementation IMPLEMENT_APP ( WxCas ) bool WxCas::OnInit () { // Used to tell wxCas to use aMule catalog m_locale.Init(); m_locale.AddCatalog( wxT( PACKAGE ) ); #if wxUSE_LIBPNG wxImage::AddHandler ( new wxPNGHandler ); #endif #if wxUSE_LIBJPEG wxImage::AddHandler ( new wxJPEGHandler ); #endif #ifdef __WXMSW__ SetPrintMode ( wxPRINT_WINDOWS ); #else SetPrintMode ( wxPRINT_POSTSCRIPT ); #endif // Prefs wxConfigBase::Get(); // Main Frame m_frame = new WxCasFrame ( _( "wxCas, aMule Online Statistics" ) ); // Show all m_frame->Show ( TRUE ); SetTopWindow ( m_frame ); return true; } int WxCas::OnExit() { delete wxConfigBase::Set( ( wxConfigBase * ) NULL ); return 0; } WxCasFrame * WxCas::GetMainFrame () const { return m_frame; } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/wxcasprefs.cpp0000644000175000017470000004147311575347521020203 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: wxCasPrefs Class /// /// Purpose: Display user preferences dialog and manage configuration storage system /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "wxcasprefs.h" #include "wxcascte.h" #include "wxcasframe.h" // Constructor WxCasPrefs::WxCasPrefs ( wxWindow * parent ) : wxDialog ( parent, -1, wxString ( _ ( "Preferences" ) ) ) { // Prefs wxConfigBase * prefs = wxConfigBase::Get(); // Main vertical Sizer m_mainVBox = new wxBoxSizer ( wxVERTICAL ); // OS Path m_osPathSBox = new wxStaticBox ( this, -1, _( "Directory containing amulesig.dat file" ) ); m_osPathSBoxSizer = new wxStaticBoxSizer ( m_osPathSBox, wxHORIZONTAL ); m_osPathTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); m_osPathBrowseButton = new wxButton ( this, ID_OSPATH_BROWSE_BUTTON, wxString ( _( "Browse" ) ) ); wxString str; prefs->Read ( WxCasCte::AMULESIG_PATH_KEY, &str, WxCasCte::DEFAULT_AMULESIG_PATH ); // Text extent wxInt32 charExtent, y; m_osPathTextCtrl->GetTextExtent ( wxT( "8" ), &charExtent, &y ); m_osPathTextCtrl->SetSize ( wxSize ( charExtent * ( str.Length () + 1 ), -1 ) ); m_osPathTextCtrl->SetValue ( str ); m_osPathTextCtrl-> SetToolTip ( _ ( "Enter here the directory where your amulesig.dat file is" ) ); m_osPathSBoxSizer->Add ( m_osPathTextCtrl, 1, wxALL | wxALIGN_CENTER, 5 ); m_osPathSBoxSizer->Add ( m_osPathBrowseButton, 0, wxALL | wxALIGN_CENTER, 5 ); m_mainVBox->Add ( m_osPathSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 10 ); // Refresh rate m_refreshSBox = new wxStaticBox ( this, -1, wxEmptyString ); m_refreshSBoxSizer = new wxStaticBoxSizer ( m_refreshSBox, wxHORIZONTAL ); m_refreshSpinButton = new wxSpinCtrl ( this, -1 ); m_refreshSpinButton->SetRange ( WxCasCte::MIN_REFRESH_RATE, WxCasCte::MAX_REFRESH_RATE ); m_refreshSpinButton->SetValue ( prefs-> Read ( WxCasCte::REFRESH_RATE_KEY, WxCasCte::DEFAULT_REFRESH_RATE ) ); m_refreshStaticText = new wxStaticText ( this, -1, _( "Refresh rate interval in seconds" ), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); m_refreshSBoxSizer->Add ( m_refreshSpinButton, 0, wxALL | wxALIGN_CENTER, 5 ); m_refreshSBoxSizer->Add ( m_refreshStaticText, 1, wxALL | wxALIGN_CENTER, 5 ); m_mainVBox->Add ( m_refreshSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 10 ); // Auto generate stat image m_autoStatImgSBox = new wxStaticBox ( this, -1, wxEmptyString ); m_autoStatImgSBoxSizer = new wxStaticBoxSizer ( m_autoStatImgSBox, wxVERTICAL ); m_autoStatImgCheck = new wxCheckBox ( this, ID_AUTOSTATIMG_CHECK, _ ( "Generate a stat image at every refresh event" ) ); m_autoStatImgSBoxSizer->Add ( m_autoStatImgCheck, 0, wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); m_autoStatImgHBoxSizer = new wxBoxSizer ( wxHORIZONTAL ); wxString strs[] = { wxT ( "PNG" ), wxT ( "JPG" ), wxT ( "BMP" ) }; m_autoStatImgCombo = new wxComboBox ( this, ID_AUTOSTATIMG_COMBO, prefs-> Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ), wxDefaultPosition, wxDefaultSize, 3, strs, wxCB_DROPDOWN | wxCB_READONLY ); m_autoStatImgTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); m_autoStatImgTextCtrl->SetValue ( prefs-> Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_PATH ) ); m_autoStatImgTextCtrl-> SetToolTip ( _ ( "Enter here the directory where you want to generate the statistic image" ) ); m_autoStatImgButton = new wxButton ( this, ID_AUTOSTATIMG_BROWSE_BUTTON, wxString ( _( "Browse" ) ) ); m_autoStatImgHBoxSizer->Add ( m_autoStatImgCombo, 0, wxALIGN_CENTER | wxALL, 5 ); m_autoStatImgHBoxSizer->Add ( m_autoStatImgTextCtrl, 1, wxALIGN_CENTER | wxALL, 5 ); m_autoStatImgHBoxSizer->Add ( m_autoStatImgButton, 0, wxALIGN_CENTER | wxALL, 5 ); m_autoStatImgSBoxSizer->Add ( m_autoStatImgHBoxSizer, 0, wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); m_mainVBox->Add ( m_autoStatImgSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 5 ); // Auto FTP update stat image m_ftpUpdateSBox = new wxStaticBox ( this, -1, wxEmptyString ); m_ftpUpdateSBoxSizer = new wxStaticBoxSizer ( m_ftpUpdateSBox, wxVERTICAL ); // Check m_ftpUpdateCheck = new wxCheckBox ( this, ID_FTP_UPDATE_CHECK, _ ( "Upload periodicaly your stat image to FTP server" ) ); m_ftpUpdateSBoxSizer->Add ( m_ftpUpdateCheck, 0, wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); // Grid size m_ftpUpdateGridSizer = new wxGridSizer( 2 ); // FTP Static text m_ftpUrlStaticText = new wxStaticText ( this, -1, _( "FTP Url" ) ); m_ftpUpdateGridSizer->Add ( m_ftpUrlStaticText, 1, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); m_ftpPathStaticText = new wxStaticText ( this, -1, _( "FTP Path" ) ); m_ftpUpdateGridSizer->Add ( m_ftpPathStaticText, 1, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); // Url m_ftpUrlTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); m_ftpUrlTextCtrl->SetValue ( prefs-> Read ( WxCasCte::FTP_URL_KEY, WxCasCte::DEFAULT_FTP_URL ) ); m_ftpUrlTextCtrl-> SetToolTip ( _ ( "Enter here the URL of your FTP server" ) ); m_ftpUpdateGridSizer->Add ( m_ftpUrlTextCtrl, 1, wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); // Path m_ftpPathTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); m_ftpPathTextCtrl->SetValue ( prefs-> Read ( WxCasCte::FTP_PATH_KEY, WxCasCte::DEFAULT_FTP_PATH ) ); m_ftpPathTextCtrl-> SetToolTip ( _ ( "Enter here the directory where putting your stat image on FTP server" ) ); m_ftpUpdateGridSizer->Add ( m_ftpPathTextCtrl, 1, wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); // Login Static text m_ftpUserStaticText = new wxStaticText ( this, -1, _( "User" ) ); m_ftpUpdateGridSizer->Add ( m_ftpUserStaticText, 1, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); m_ftpPasswdStaticText = new wxStaticText ( this, -1, _( "Password" ) ); m_ftpUpdateGridSizer->Add ( m_ftpPasswdStaticText, 1, wxALIGN_LEFT | wxALIGN_BOTTOM | wxALL, 5 ); // User m_ftpUserTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString ); m_ftpUserTextCtrl->SetValue ( prefs-> Read ( WxCasCte::FTP_USER_KEY, WxCasCte::DEFAULT_FTP_USER ) ); m_ftpUserTextCtrl-> SetToolTip ( _ ( "Enter here the User name to log into your FTP server" ) ); m_ftpUpdateGridSizer->Add ( m_ftpUserTextCtrl, 1, wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); // Passwd m_ftpPasswdTextCtrl = new wxTextCtrl ( this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); m_ftpPasswdTextCtrl->SetValue ( prefs-> Read ( WxCasCte::FTP_PASSWD_KEY, WxCasCte::DEFAULT_FTP_PASSWD ) ); m_ftpPasswdTextCtrl-> SetToolTip ( _ ( "Enter here the User password to log into your FTP server" ) ); m_ftpUpdateGridSizer->Add ( m_ftpPasswdTextCtrl, 1, wxGROW | wxALIGN_LEFT | wxALIGN_TOP | wxALL, 5 ); // Add to static sizer m_ftpUpdateSBoxSizer->Add ( m_ftpUpdateGridSizer, 1, wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); // Upload rate m_ftpRateHBoxSizer = new wxBoxSizer( wxHORIZONTAL ); m_ftpUpdateSpinButton = new wxSpinCtrl ( this, -1 ); m_ftpUpdateSpinButton->SetRange ( WxCasCte::MIN_FTP_RATE, WxCasCte::MAX_FTP_RATE ); m_ftpUpdateSpinButton->SetValue ( prefs-> Read ( WxCasCte::FTP_UPDATE_RATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_RATE ) ); m_ftpUpdateStaticText = new wxStaticText ( this, -1, _( "FTP update rate interval in minutes" ), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE ); m_ftpRateHBoxSizer->Add ( m_ftpUpdateSpinButton, 0, wxALL | wxALIGN_CENTER, 5 ); m_ftpRateHBoxSizer->Add ( m_ftpUpdateStaticText, 1, wxALL | wxALIGN_CENTER, 5 ); m_ftpUpdateSBoxSizer->Add ( m_ftpRateHBoxSizer, 0, wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5 ); // Add to main sizer m_mainVBox->Add ( m_ftpUpdateSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 5 ); // Mask auto stat img disabled controls if (prefs->Read( WxCasCte::ENABLE_AUTOSTATIMG_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) ) { m_autoStatImgCheck->SetValue( TRUE ); } else { m_autoStatImgCheck->SetValue ( FALSE ); EnableAutoStatImgCtrls( FALSE ); m_ftpUpdateCheck->Enable ( FALSE ); EnableFtpUpdateCtrls( FALSE ); } // Mask Ftp update disabled controls if (prefs->Read( WxCasCte::ENABLE_FTP_UPDATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED ) ) { m_ftpUpdateCheck->SetValue( TRUE ); } else { m_ftpUpdateCheck->SetValue ( FALSE ); EnableFtpUpdateCtrls( FALSE ); } // Separator line m_staticLine = new wxStaticLine ( this, -1 ); m_mainVBox->Add ( m_staticLine, 0, wxGROW | wxALIGN_CENTER | wxALL ); // Button bar m_buttonHBox = new wxBoxSizer ( wxHORIZONTAL ); m_validateButton = new wxButton ( this, ID_VALIDATE_BUTTON, wxString ( _( "Validate" ) ) ); m_cancelButton = new wxButton ( this, wxID_CANCEL, wxString ( _( "Cancel" ) ) ); m_buttonHBox->Add ( m_validateButton, 0, wxALIGN_CENTER | wxALL, 5 ); m_buttonHBox->Add ( m_cancelButton, 0, wxALIGN_CENTER | wxALL, 5 ); m_mainVBox->Add ( m_buttonHBox, 0, wxALIGN_CENTER | wxALL, 10 ); // Layout SetAutoLayout ( TRUE ); SetSizerAndFit ( m_mainVBox ); m_validateButton->SetFocus (); m_validateButton->SetDefault (); } // Destructor WxCasPrefs::~WxCasPrefs () {} // Events table BEGIN_EVENT_TABLE ( WxCasPrefs, wxDialog ) EVT_BUTTON ( ID_OSPATH_BROWSE_BUTTON, WxCasPrefs::OnOSPathBrowseButton ) EVT_BUTTON ( ID_AUTOSTATIMG_BROWSE_BUTTON, WxCasPrefs::OnAutoStatImgBrowseButton ) EVT_BUTTON ( ID_VALIDATE_BUTTON, WxCasPrefs::OnValidateButton ) EVT_CHECKBOX ( ID_AUTOSTATIMG_CHECK, WxCasPrefs::OnAutoStatImgCheck ) EVT_CHECKBOX ( ID_FTP_UPDATE_CHECK, WxCasPrefs::OnFtpUpdateCheck ) END_EVENT_TABLE () // Browse for OS Path void WxCasPrefs::OnOSPathBrowseButton ( wxCommandEvent& WXUNUSED( event ) ) { const wxString &dir = wxDirSelector(_ ("Folder containing your signature file"), WxCasCte::DEFAULT_AMULESIG_PATH, wxDD_DEFAULT_STYLE, wxDefaultPosition, this); if ( !dir.empty () ) { m_osPathTextCtrl->SetValue ( dir ); } } // Browse for stat image Path void WxCasPrefs::OnAutoStatImgBrowseButton ( wxCommandEvent& WXUNUSED( event ) ) { const wxString & dir = wxDirSelector( _("Folder where generating the statistic image"), WxCasCte::DEFAULT_AUTOSTATIMG_PATH, wxDD_DEFAULT_STYLE, wxDefaultPosition, this); if ( !dir.empty () ) { m_autoStatImgTextCtrl->SetValue ( dir ); } } // Auto Generate Stat Image Check Button void WxCasPrefs::OnAutoStatImgCheck ( wxCommandEvent& WXUNUSED( event ) ) { if ( m_autoStatImgCheck->GetValue () ) { EnableAutoStatImgCtrls( TRUE ); m_ftpUpdateCheck->Enable ( TRUE ); if ( m_ftpUpdateCheck->GetValue () ) { EnableFtpUpdateCtrls( TRUE ); } } else { EnableAutoStatImgCtrls( FALSE ); m_ftpUpdateCheck->Enable ( FALSE ); EnableFtpUpdateCtrls( FALSE ); } } // Ftp update Check Button void WxCasPrefs::OnFtpUpdateCheck ( wxCommandEvent& WXUNUSED( event ) ) { if ( m_ftpUpdateCheck->GetValue () ) { EnableFtpUpdateCtrls( TRUE ); } else { EnableFtpUpdateCtrls( FALSE ); } } // Validate Prefs void WxCasPrefs::OnValidateButton ( wxCommandEvent& WXUNUSED( event ) ) { // Prefs wxConfigBase * prefs = wxConfigBase::Get(); // Write amulesig dir if ( prefs->Read ( WxCasCte::AMULESIG_PATH_KEY, WxCasCte::DEFAULT_AMULESIG_PATH ) != m_osPathTextCtrl->GetValue () ) { // Reload amulesig.dat wxFileName amulesig( m_osPathTextCtrl->GetValue (), WxCasCte::AMULESIG_FILENAME ); ( ( WxCasFrame* ) GetParent() ) ->SetAmuleSigFile( amulesig ); prefs->Write ( WxCasCte::AMULESIG_PATH_KEY, m_osPathTextCtrl->GetValue () ); } // Restart timer if refresh interval has changed if ( prefs->Read ( WxCasCte::REFRESH_RATE_KEY, WxCasCte::DEFAULT_REFRESH_RATE ) != m_refreshSpinButton->GetValue () ) { ( ( WxCasFrame* ) GetParent() ) ->ChangeRefreshPeriod( 1000 * m_refreshSpinButton->GetValue () ); // Write refresh interval prefs->Write ( WxCasCte::REFRESH_RATE_KEY, m_refreshSpinButton->GetValue () ); } // Write auto stat img state prefs->Write ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, m_autoStatImgCheck->GetValue () ); // If auto stat img is enabled if ( m_autoStatImgCheck->GetValue () ) { prefs->Write ( WxCasCte::AUTOSTATIMG_DIR_KEY, m_autoStatImgTextCtrl->GetValue () ); prefs->Write ( WxCasCte::AUTOSTATIMG_TYPE_KEY, m_autoStatImgCombo->GetValue () ); // Write Ftp update state prefs->Write ( WxCasCte::ENABLE_FTP_UPDATE_KEY, m_ftpUpdateCheck->GetValue () ); // If Ftp update is enabled if ( m_ftpUpdateCheck->GetValue () ) { // Restart timer if update interval has changed if ( prefs->Read ( WxCasCte::FTP_UPDATE_RATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_RATE ) != m_ftpUpdateSpinButton->GetValue () ) { ( ( WxCasFrame* ) GetParent() ) ->ChangeFtpUpdatePeriod( 60000 * m_refreshSpinButton->GetValue () ); prefs->Write ( WxCasCte::FTP_UPDATE_RATE_KEY, m_ftpUpdateSpinButton->GetValue () ); } // Write Ftp parameters prefs->Write ( WxCasCte::FTP_URL_KEY, m_ftpUrlTextCtrl->GetValue () ); prefs->Write ( WxCasCte::FTP_PATH_KEY, m_ftpPathTextCtrl->GetValue () ); prefs->Write ( WxCasCte::FTP_USER_KEY, m_ftpUserTextCtrl->GetValue () ); prefs->Write ( WxCasCte::FTP_PASSWD_KEY, m_ftpPasswdTextCtrl->GetValue () ); } } // Force config writing prefs->Flush(); // Close window this->EndModal ( this->GetReturnCode () ); } // Enable/Disable auto img ctrls void WxCasPrefs::EnableAutoStatImgCtrls( bool state ) { m_autoStatImgTextCtrl->Enable ( state ); m_autoStatImgButton->Enable ( state ); m_autoStatImgCombo->Enable ( state ); } // Enable/Disable Ftp update ctrls void WxCasPrefs::EnableFtpUpdateCtrls( bool state ) { m_ftpUpdateSpinButton->Enable ( state ); m_ftpUpdateStaticText->Enable ( state ); m_ftpUrlTextCtrl->Enable ( state ); m_ftpUrlStaticText->Enable ( state ); m_ftpPathTextCtrl->Enable ( state ); m_ftpPathStaticText->Enable ( state ); m_ftpUserTextCtrl->Enable ( state ); m_ftpUserStaticText->Enable ( state ); m_ftpPasswdTextCtrl->Enable ( state ); m_ftpPasswdStaticText->Enable ( state ); } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/linuxmon.h0000644000175000017470000000430611575347521017326 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: LinuxMon Class /// /// Purpose: Monitor Linux system by reading /proc file system /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _LINUXMON_H #define _LINUXMON_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include /// Linux Monitoring class LinuxMon { private: wxString m_uptime; wxString m_sysLoad_1; wxString m_sysLoad_5; wxString m_sysLoad_15; static const wxFileName UPTIME_FILE; static const wxFileName LOADAVG_FILE; public: /// Constructor LinuxMon (); /// Destructor ~LinuxMon (); /// Refresh stored informations void Refresh (); /// Get system uptime wxString GetUptime () const; /// Get 1min average CPU load wxString GetSysLoad_1 () const; /// Get 5min averag CPU load wxString GetSysLoad_5 () const; /// Get 15min averag CPU load wxString GetSysLoad_15 () const; }; #endif /* _LINUXMON_H */ // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/src/Makefile.in0000644000175000017470000005207611657306264017360 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = wxcas$(EXEEXT) @NEED_RC_TRUE@am__append_1 = wxcasrc.$(OBJEXT) subdir = src/utils/wxCas/src DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_wxcas_OBJECTS = onlinesig.$(OBJEXT) linuxmon.$(OBJEXT) \ wxcas.$(OBJEXT) wxcasprint.$(OBJEXT) wxcasframe.$(OBJEXT) \ wxcasprefs.$(OBJEXT) wxcascte.$(OBJEXT) wxcaspix.$(OBJEXT) wxcas_OBJECTS = $(am_wxcas_OBJECTS) am__DEPENDENCIES_1 = wxcas_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(wxcas_SOURCES) DIST_SOURCES = $(wxcas_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = $(MULECPPFLAGS) $(WX_CPPFLAGS) AM_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) AM_LDFLAGS = $(MULELDFLAGS) wxcas_SOURCES = onlinesig.cpp \ linuxmon.cpp \ wxcas.cpp \ wxcasprint.cpp \ wxcasframe.cpp \ wxcasprefs.cpp \ wxcascte.cpp \ wxcaspix.cpp noinst_HEADERS = onlinesig.h \ linuxmon.h \ wxcas.h \ wxcasprint.h \ wxcasframe.h \ wxcasprefs.h \ wxcascte.h \ wxcaspix.h wxcas_LDADD = $(WX_LIBS) $(am__append_1) # Resources @NEED_RC_TRUE@SUFFIXES = .rc @NEED_RC_TRUE@CLEANFILES = *-version.rc MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .rc .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/wxCas/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/wxCas/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ 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)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) wxcas$(EXEEXT): $(wxcas_OBJECTS) $(wxcas_DEPENDENCIES) @rm -f wxcas$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(wxcas_OBJECTS) $(wxcas_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linuxmon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/onlinesig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcascte.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcasframe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcaspix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcasprefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wxcasprint.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags 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 uninstall \ uninstall-am uninstall-binPROGRAMS @NEED_RC_TRUE@wxcasrc.$(OBJEXT): $(srcdir)/../wxcas.rc wxcas-version.rc @NEED_RC_TRUE@ cat $^ | \ @NEED_RC_TRUE@ ( \ @NEED_RC_TRUE@ abs_builddir=`pwd` ; \ @NEED_RC_TRUE@ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ @NEED_RC_TRUE@ cd $( "$@" # 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: aMule-2.3.1/src/utils/wxCas/src/wxcasframe.cpp0000644000175000017470000010276111575347521020154 0ustar topiusers//////////////////////////////////////////////////////////////////////////////// /// Name: wxCasFrame Class /// /// Purpose: wxCas main frame /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Derived from CAS by Pedro de Oliveira /// /// Pixmaps from aMule http://www.amule.org /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include #include "wxcasframe.h" #include "wxcasprint.h" #include "wxcasprefs.h" #include "wxcascte.h" #include "wxcaspix.h" // Constructor WxCasFrame::WxCasFrame ( const wxString & title ) : wxFrame ( ( wxFrame * ) NULL, -1, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE ) { // Give it an icon #ifdef __WXMSW__ wxIcon icon(wxT("wxcas")); #else wxIcon icon; icon.CopyFromBitmap( WxCasPix::getPixmap( wxT( "wxcas" ) ) ); #endif SetIcon ( icon ); // Prefs wxConfigBase * prefs = wxConfigBase::Get(); m_maxLineCount = 0; // Check if we have a previous DL max hit double absoluteMaxDL = ( double ) ( prefs->Read ( WxCasCte::ABSOLUTE_MAX_DL_KEY, 0L ) ) / 1024.0; // Stored in bytes wxDateTime absoluteMaxDlDate( ( time_t ) ( prefs->Read ( WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY, ( long ) ( wxDateTime::Now().GetTicks() ) ) ) ); // Stored in Ticks // Add Online Sig file m_aMuleSig = new OnLineSig ( wxFileName( prefs-> Read ( WxCasCte::AMULESIG_PATH_KEY, WxCasCte::DEFAULT_AMULESIG_PATH ), WxCasCte::AMULESIG_FILENAME ), absoluteMaxDL, absoluteMaxDlDate ); //Save absolute hit if we reach it during constructing if ( m_aMuleSig->IsSessionMaxDlChanged() ) { SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux m_sysMonitor = new LinuxMon (); #endif // Status Bar CreateStatusBar (); SetStatusText ( _( "Welcome!" ) ); // Frame Vertical sizer m_frameVBox = new wxBoxSizer ( wxVERTICAL ); // Add Main panel to frame (needed by win32 for padding sub panels) m_mainPanel = new wxPanel ( this, -1 ); // Main Panel Vertical Sizer m_mainPanelVBox = new wxBoxSizer ( wxVERTICAL ); // Main Panel static line m_staticLine = new wxStaticLine ( m_mainPanel, -1 ); #ifdef __WXMSW__ m_BottomStaticLine = new wxStaticLine ( m_mainPanel, -1 ); #endif // Statistics Static Vertical Box Sizer m_sigPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "aMule" ) ); m_sigPanelSBoxSizer = new wxStaticBoxSizer ( m_sigPanelSBox, wxVERTICAL ); // Hit Static Horizontal Box Sizer m_hitPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "Maximum DL rate since wxCas is running" ) ); m_hitPanelSBoxSizer = new wxStaticBoxSizer ( m_hitPanelSBox, wxHORIZONTAL ); // Hit Static Horizontal Box Sizer m_absHitPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "Absolute Maximum DL rate during wxCas previous runs" ) ); m_absHitPanelSBoxSizer = new wxStaticBoxSizer ( m_absHitPanelSBox, wxHORIZONTAL ); // Statistic labels m_statLine_1 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_1() ); m_statLine_2 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_2() ); m_statLine_3 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_3() ); m_statLine_4 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_4() ); m_statLine_5 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_5() ); m_statLine_6 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_6() ); m_statLine_7 = new wxStaticText ( m_mainPanel, -1, MakeStatLine_7() ); m_hitLine = new wxStaticText ( m_mainPanel, -1, MakeHitsLine_1() ); m_hitButton = new wxButton ( m_mainPanel, ID_HIT_BUTTON, wxString ( _( "Reset" ) ) ); m_absHitLine = new wxStaticText ( m_mainPanel, -1, MakeHitsLine_2() ); m_absHitButton = new wxButton ( m_mainPanel, ID_ABS_HIT_BUTTON, wxString ( _( "Reset" ) ) ); #ifdef __LINUX__ // System monitoring on Linux // Monitoring Static Vertical Box Sizer m_monPanelSBox = new wxStaticBox ( m_mainPanel, -1, _( "System" ) ); m_monPanelSBoxSizer = new wxStaticBoxSizer ( m_monPanelSBox, wxVERTICAL ); m_sysLine_1 = new wxStaticText ( m_mainPanel, -1, MakeSysLine_1() ); m_sysLine_2 = new wxStaticText ( m_mainPanel, -1, MakeSysLine_2() ); #endif // Statistic Panel Layout m_sigPanelSBoxSizer->Add ( m_statLine_1, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_2, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_3, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_4, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_5, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_6, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_sigPanelSBoxSizer->Add ( m_statLine_7, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_hitPanelSBoxSizer->Add ( m_hitLine, 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxGROW, 5 ); m_hitPanelSBoxSizer->Add ( m_hitButton, 0, wxALL | wxALIGN_RIGHT, 5 ); m_absHitPanelSBoxSizer->Add ( m_absHitLine, 0, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxGROW, 5 ); m_absHitPanelSBoxSizer->Add ( m_absHitButton, 0, wxALL | wxALIGN_RIGHT, 5 ); #ifdef __LINUX__ // System monitoring on Linux m_monPanelSBoxSizer->Add ( m_sysLine_1, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); m_monPanelSBoxSizer->Add ( m_sysLine_2, 0, wxALL | wxALIGN_CENTER | wxGROW, 5 ); #endif // Main panel Layout m_mainPanelVBox->Add ( m_staticLine, 0, wxALL | wxALIGN_CENTER | wxGROW ); m_mainPanelVBox->Add ( m_sigPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); #ifdef __LINUX__ // System monitoring on Linux m_mainPanelVBox->Add ( m_monPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); #endif m_mainPanelVBox->Add ( m_hitPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); m_mainPanelVBox->Add ( m_absHitPanelSBoxSizer, 0, wxALL | wxALIGN_CENTER | wxGROW, 10 ); #ifdef __WXMSW__ m_mainPanelVBox->Add ( m_BottomStaticLine, 0, wxALL | wxALIGN_CENTER | wxGROW ); #endif // Toolbar Pixmaps m_toolBarBitmaps[ 0 ] = WxCasPix::getPixmap( wxT( "refresh" ) ); m_toolBarBitmaps[ 1 ] = WxCasPix::getPixmap( wxT( "save" ) ); m_toolBarBitmaps[ 2 ] = WxCasPix::getPixmap( wxT( "print" ) ); m_toolBarBitmaps[ 3 ] = WxCasPix::getPixmap( wxT( "about" ) ); m_toolBarBitmaps[ 4 ] = WxCasPix::getPixmap( wxT( "stop" ) ); m_toolBarBitmaps[ 5 ] = WxCasPix::getPixmap( wxT( "prefs" ) ); // Constructing toolbar m_toolbar = new wxToolBar ( this, -1, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL | wxTB_FLAT ); m_toolbar->SetToolBitmapSize ( wxSize ( 32, 32 ) ); m_toolbar->SetMargins ( 2, 2 ); m_toolbar->AddTool ( ID_BAR_REFRESH, wxT( "Refresh" ), m_toolBarBitmaps[ 0 ], _( "Stop Auto Refresh" ) ); m_toolbar->AddSeparator (); m_toolbar->AddTool ( ID_BAR_SAVE, wxT( "Save" ), m_toolBarBitmaps[ 1 ], _( "Save Online Statistics image" ) ); m_toolbar->AddTool ( ID_BAR_PRINT, wxT( "Print" ), m_toolBarBitmaps[ 2 ], _( "Print Online Statistics image" ) ); m_toolbar->AddTool ( ID_BAR_PREFS, wxT( "Prefs" ), m_toolBarBitmaps[ 5 ], _( "Preferences setting" ) ); m_toolbar->AddSeparator (); m_toolbar->AddTool ( ID_BAR_ABOUT, wxT( "About" ), m_toolBarBitmaps[ 3 ], _( "About wxCas" ) ); m_toolbar->Realize (); SetToolBar ( m_toolbar ); // Panel Layout m_mainPanel->SetAutoLayout( true ); m_mainPanel->SetSizer ( m_mainPanelVBox ); // Frame Layout m_frameVBox->Add ( m_mainPanel, 1, wxALL | wxGROW ); SetAutoLayout ( TRUE ); SetSizerAndFit ( m_frameVBox ); // Add refresh timer m_refresh_timer = new wxTimer ( this, ID_REFRESH_TIMER ); m_refresh_timer->Start ( 1000 * prefs->Read ( WxCasCte::REFRESH_RATE_KEY, WxCasCte::DEFAULT_REFRESH_RATE ) ); // s to ms // Add FTP update timer m_ftp_update_timer = new wxTimer ( this, ID_FTP_UPDATE_TIMER ); m_ftp_update_timer->Start ( 60000 * prefs->Read ( WxCasCte::FTP_UPDATE_RATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_RATE ) ); // min to ms } // Destructor WxCasFrame::~WxCasFrame () { delete m_aMuleSig; #ifdef __LINUX__ // System monitoring on Linux delete m_sysMonitor; #endif } // Events table BEGIN_EVENT_TABLE ( WxCasFrame, wxFrame ) EVT_TOOL ( ID_BAR_REFRESH, WxCasFrame::OnBarRefresh ) EVT_TOOL ( ID_BAR_SAVE, WxCasFrame::OnBarSave ) EVT_TOOL ( ID_BAR_PRINT, WxCasFrame::OnBarPrint ) EVT_TOOL ( ID_BAR_PREFS, WxCasFrame::OnBarPrefs ) EVT_TOOL ( ID_BAR_ABOUT, WxCasFrame::OnBarAbout ) EVT_TIMER ( ID_REFRESH_TIMER, WxCasFrame::OnRefreshTimer ) EVT_TIMER ( ID_FTP_UPDATE_TIMER, WxCasFrame::OnFtpUpdateTimer ) EVT_BUTTON ( ID_HIT_BUTTON, WxCasFrame::OnHitButton ) EVT_BUTTON ( ID_ABS_HIT_BUTTON, WxCasFrame::OnAbsHitButton ) END_EVENT_TABLE () // Get Stat Bitmap wxImage * WxCasFrame::GetStatImage () const { wxBitmap statBitmap = WxCasPix::getPixmap( wxT( "stat" ) ); wxMemoryDC memdc; memdc.SelectObject ( statBitmap ); #ifdef __WXMSW__ memdc. SetFont ( wxFont ( 6, wxSWISS, wxNORMAL, wxBOLD ) ); #else memdc. SetFont ( wxFont ( 8, wxSWISS, wxNORMAL, wxBOLD ) ); #endif memdc. SetTextForeground ( *wxWHITE ); memdc. DrawText ( m_statLine_1->GetLabel (), 25, 0 ); memdc. DrawText ( m_statLine_2->GetLabel (), 25, 17 ); memdc. DrawText ( m_statLine_3->GetLabel (), 25, 34 ); memdc. DrawText ( m_statLine_4->GetLabel (), 25, 51 ); memdc. DrawText ( m_statLine_5->GetLabel (), 25, 68 ); memdc. DrawText ( m_statLine_6->GetLabel (), 25, 85 ); memdc. DrawText ( m_statLine_7->GetLabel (), 25, 102 ); memdc. SelectObject ( wxNullBitmap ); wxImage * statImage = new wxImage ( statBitmap.ConvertToImage() ); return ( statImage ); } // Refresh button void WxCasFrame::OnBarRefresh ( wxCommandEvent& WXUNUSED( event ) ) { if ( m_refresh_timer->IsRunning () ) { m_refresh_timer->Stop (); m_ftp_update_timer->Stop (); m_toolbar->DeleteTool ( ID_BAR_REFRESH ); m_toolbar->InsertTool ( 0, ID_BAR_REFRESH, wxT( "Refresh" ), m_toolBarBitmaps[ 4 ], wxNullBitmap, wxITEM_NORMAL, _( "Start Auto Refresh" ) ); m_toolbar->Realize (); SetStatusText ( _( "Auto Refresh stopped" ) ); } else { m_refresh_timer->Start (); m_ftp_update_timer->Start (); m_toolbar->DeleteTool ( ID_BAR_REFRESH ); m_toolbar->InsertTool ( 0, ID_BAR_REFRESH, wxT( "Refresh" ), m_toolBarBitmaps[ 0 ], wxNullBitmap, wxITEM_NORMAL, _( "Stop Auto Refresh" ) ); m_toolbar->Realize (); SetStatusText ( _( "Auto Refresh started" ) ); } } // Save button void WxCasFrame::OnBarSave ( wxCommandEvent& WXUNUSED( event ) ) { wxImage * statImage = GetStatImage (); wxFileDialog selectSaveFile(this, _( "Save Statistics Image" ), wxFileName::GetHomeDir (), WxCasCte::AMULESIG_IMG_NAME, wxT("PNG (*.png)|*.png|JPEG (*.jpg)|*.jpg|BMP (*.bmp)|*.bmp"), wxFD_SAVE); selectSaveFile.ShowModal(); wxString saveFileName(selectSaveFile.GetPath()); if ( !saveFileName.empty () ) { // static list of allowed types, update if you change extensions above const wxString ext[3] = { wxT(".png"), wxT(".jpg"), wxT(".bmp") }; const wxString fileType = ext[selectSaveFile.GetFilterIndex()]; bool isValidFileType = false; for(int i=0;i<3;++i) { if(ext[i] == saveFileName.Right(4)) { isValidFileType = true; break; } } if (!isValidFileType) { saveFileName += fileType; } // wx will display a message if saving fails, file type is taken from extension statImage->SaveFile( saveFileName ); } delete statImage; } // Print button void WxCasFrame::OnBarPrint ( wxCommandEvent& WXUNUSED( event ) ) { wxPrinter printer; WxCasPrint printout ( _( "aMule Online Statistics" ) ); if ( !printer.Print ( this, &printout, TRUE ) ) { if ( wxPrinter::GetLastError () == wxPRINTER_ERROR ) { wxMessageBox ( _ ( "There was a problem printing.\nPerhaps your current printer is not set correctly?" ), _( "Printing" ), wxOK ); } } } // Prefs button void WxCasFrame::OnBarPrefs ( wxCommandEvent& WXUNUSED( event ) ) { WxCasPrefs dlg ( this ); dlg.ShowModal (); } // About button void WxCasFrame::OnBarAbout ( wxCommandEvent& WXUNUSED( event ) ) { wxMessageBox ( _ ( "wxCas, aMule OnLine Signature Statistics\n\n(c) 2004 ThePolish \n\nBased on CAS by Pedro de Oliveira \n\nDistributed under GPL" ), _( "About wxCas" ), wxOK | wxCENTRE | wxICON_INFORMATION ); } // Refresh timer void WxCasFrame::OnRefreshTimer ( wxTimerEvent& WXUNUSED( event ) ) { // Prefs wxConfigBase * prefs = wxConfigBase::Get(); UpdateAll (); // Generate stat image if asked in config if (prefs->Read( WxCasCte::ENABLE_AUTOSTATIMG_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) ) { wxImage * statImage = GetStatImage (); wxFileName fileName ( prefs-> Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_PATH ), WxCasCte::AMULESIG_IMG_NAME, prefs-> Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ). Lower () ); if ( !statImage->SaveFile ( fileName.GetFullPath () ) ) { wxLogError ( wxT( "No handler for this file type. File was not saved" ) ); } delete statImage; } } // Ftp update timer void WxCasFrame::OnFtpUpdateTimer ( wxTimerEvent& WXUNUSED( event ) ) { // Prefs wxConfigBase * prefs = wxConfigBase::Get(); // Image must be autogenerated to be uploaded if ( prefs->Read ( WxCasCte::ENABLE_AUTOSTATIMG_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_ISENABLED ) && prefs->Read ( WxCasCte::ENABLE_FTP_UPDATE_KEY, WxCasCte::DEFAULT_FTP_UPDATE_ISENABLED ) ) { // Get image file wxFileName fileName ( prefs-> Read ( WxCasCte::AUTOSTATIMG_DIR_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_PATH ), WxCasCte::AMULESIG_IMG_NAME, prefs-> Read ( WxCasCte::AUTOSTATIMG_TYPE_KEY, WxCasCte::DEFAULT_AUTOSTATIMG_TYPE ). Lower () ); // If img doenst exist, return if ( ! fileName.FileExists( fileName.GetFullPath () ) ) { wxLogError( wxT( "Image file " ) + fileName.GetFullPath () + wxT( " doesn't exist" ) ); return ; } // Connect to ftp wxFTP ftp; ftp.SetUser( prefs->Read ( WxCasCte::FTP_USER_KEY, WxCasCte::DEFAULT_FTP_USER ) ); ftp.SetPassword( prefs->Read ( WxCasCte::FTP_PASSWD_KEY, WxCasCte::DEFAULT_FTP_PASSWD ) ); if ( ! ftp.Connect( prefs->Read ( WxCasCte::FTP_URL_KEY, WxCasCte::DEFAULT_FTP_URL ) ) ) { wxLogError( wxT( "Cannot connect to FTP server " ) + prefs->Read ( WxCasCte::FTP_URL_KEY, WxCasCte::DEFAULT_FTP_URL ) ); return ; } // Chdir if ( ! ftp.ChDir( prefs->Read ( WxCasCte::FTP_PATH_KEY, WxCasCte::DEFAULT_FTP_PATH ) ) ) { wxLogError( wxT( "Cannot chdir to " ) + prefs->Read ( WxCasCte::FTP_PATH_KEY, WxCasCte::DEFAULT_FTP_PATH ) ); ftp.Close(); return ; } // Upload image ftp.SetBinary(); wxFileInputStream in( fileName.GetFullPath () ); if ( in.Ok() ) { wxOutputStream * out = ftp.GetOutputStream( fileName.GetFullName () ); if ( out ) { out->Write( in ); delete out; } else { wxLogError( wxT( "Cannot open FTP upload stream" ) ); } } else { wxLogError( wxT( "Cannot open file stream to read image file" ) ); } // Close connexion ftp.Close(); } } // Reset wxcas session hit void WxCasFrame::OnHitButton ( wxCommandEvent& WXUNUSED( event ) ) { m_aMuleSig->ResetSessionMaxDL(); UpdateStatsPanel (); } // Reset wxcas absolute hit void WxCasFrame::OnAbsHitButton ( wxCommandEvent& WXUNUSED( event ) ) { m_aMuleSig->ResetAbsoluteMaxDL(); SaveAbsoluteHits(); UpdateStatsPanel (); } // Update all panels and frame, call Fit if needed void WxCasFrame::UpdateAll ( bool forceFitting ) { bool needFit = UpdateStatsPanel (); if ( needFit || forceFitting ) { // Fit stats pannel m_mainPanel->Fit(); // Fit main frame SetClientSize( m_mainPanel->GetSize() ); } } // Update stat panel bool WxCasFrame::UpdateStatsPanel () { // Set labels m_aMuleSig->Refresh (); #ifdef __LINUX__ // System monitoring on Linux m_sysMonitor->Refresh (); #endif wxString newline; wxString status; unsigned int newMaxLineCount = 0; Freeze (); // Stat line 1 newline = MakeStatLine_1(); m_statLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // aMule is stopped //if ( m_aMuleSig->GetRunTime () == 0 // aMule is not running if ( m_aMuleSig->GetUpStatus () == 0) { status = _( "Oh Oh, aMule is not running..." ); newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // aMule is running, ed2k and kad are connected else if ( (m_aMuleSig->GetAmuleState () == 1 ) && (m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2)) { // Stat line 2 newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 3 newline = MakeStatLine_3(); m_statLine_3->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 4 newline = MakeStatLine_4(); m_statLine_4->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 5 newline = MakeStatLine_5(); m_statLine_5->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 6 newline = MakeStatLine_6(); m_statLine_6->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 7 newline = MakeStatLine_7(); m_statLine_7->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Hits line 1 if ( m_aMuleSig->IsSessionMaxDlChanged() ) { newline = MakeHitsLine_1(); m_hitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // Hits line 2 if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { newline = MakeHitsLine_2(); m_absHitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Save new records SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux newline = MakeSysLine_1(); m_sysLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); newline = MakeSysLine_2(); m_sysLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); #endif status = _( "aMule is running" ); } // aMule is running, ed2k is off, but kad connected else if ( (m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2 )) { // Stat line 2 newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 3 newline = MakeStatLine_3(); m_statLine_3->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 4 newline = MakeStatLine_4(); m_statLine_4->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 5 newline = MakeStatLine_5(); m_statLine_5->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 6 newline = MakeStatLine_6(); m_statLine_6->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 7 newline = MakeStatLine_7(); m_statLine_7->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Hits line 1 if ( m_aMuleSig->IsSessionMaxDlChanged() ) { newline = MakeHitsLine_1(); m_hitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // Hits line 2 if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { newline = MakeHitsLine_2(); m_absHitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Save new records SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux newline = MakeSysLine_1(); m_sysLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); newline = MakeSysLine_2(); m_sysLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); #endif status = _( "aMule is running" ); } else if ( (m_aMuleSig->GetAmuleState () == 1) && (m_aMuleSig->GetKadState () == 0)) { // Stat line 2 newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 3 newline = MakeStatLine_3(); m_statLine_3->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 4 newline = MakeStatLine_4(); m_statLine_4->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 5 newline = MakeStatLine_5(); m_statLine_5->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 6 newline = MakeStatLine_6(); m_statLine_6->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 7 newline = MakeStatLine_7(); m_statLine_7->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Hits line 1 if ( m_aMuleSig->IsSessionMaxDlChanged() ) { newline = MakeHitsLine_1(); m_hitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // Hits line 2 if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { newline = MakeHitsLine_2(); m_absHitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Save new records SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux newline = MakeSysLine_1(); m_sysLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); newline = MakeSysLine_2(); m_sysLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); #endif status = _( "aMule is running" ); } //both disconnected else if ( (m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState () == 0)) { // Stat line 2 newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 3 newline = MakeStatLine_3(); m_statLine_3->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 4 newline = MakeStatLine_4(); m_statLine_4->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 5 newline = MakeStatLine_5(); m_statLine_5->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 6 newline = MakeStatLine_6(); m_statLine_6->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 7 newline = MakeStatLine_7(); m_statLine_7->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Hits line 1 if ( m_aMuleSig->IsSessionMaxDlChanged() ) { newline = MakeHitsLine_1(); m_hitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // Hits line 2 if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { newline = MakeHitsLine_2(); m_absHitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Save new records SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux newline = MakeSysLine_1(); m_sysLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); newline = MakeSysLine_2(); m_sysLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); #endif status = _( "aMule is running, but disconnected" ); } // aMule is connecting else if ( m_aMuleSig->GetAmuleState () == 2 ) { // Stat line 2 newline = MakeStatLine_2(); m_statLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 3 newline = MakeStatLine_3(); m_statLine_3->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 4 newline = MakeStatLine_4(); m_statLine_4->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 5 newline = MakeStatLine_5(); m_statLine_5->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 6 newline = MakeStatLine_6(); m_statLine_6->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Stat line 7 newline = MakeStatLine_7(); m_statLine_7->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Hits line 1 if ( m_aMuleSig->IsSessionMaxDlChanged() ) { newline = MakeHitsLine_1(); m_hitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); } // Hits line 2 if ( m_aMuleSig->IsAbsoluteMaxDlChanged() ) { newline = MakeHitsLine_2(); m_absHitLine->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); // Save new records SaveAbsoluteHits(); } #ifdef __LINUX__ // System monitoring on Linux newline = MakeSysLine_1(); m_sysLine_1->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); newline = MakeSysLine_2(); m_sysLine_2->SetLabel ( newline ); newMaxLineCount = GetMaxUInt( newline.Length (), newMaxLineCount ); #endif status = _( "aMule is connecting..." ); } // aMule status is unknown else { status = _( "Oh Oh, aMule status is unknown..." ); } Thaw (); // Set status bar SetStatusText ( status ); // Resize only if needed if ( m_maxLineCount != newMaxLineCount ) { m_maxLineCount = newMaxLineCount; return ( TRUE ); } else { return ( FALSE ); } } // Refresh period changing bool WxCasFrame::ChangeRefreshPeriod( const int newPeriod ) { // As the user can stop it, we must let it in the same state // it was before changing period bool wasRunning = FALSE; if ( m_refresh_timer->IsRunning() ) { wasRunning = TRUE; } bool ok = m_refresh_timer->Start( newPeriod ); if ( ! wasRunning ) { m_refresh_timer->Stop(); } return ( ok ); } // Ftp update period changing bool WxCasFrame::ChangeFtpUpdatePeriod( const int newPeriod ) { // As the user can stop it, we must let it in the same state // it was before changing period bool wasRunning = FALSE; if ( m_ftp_update_timer->IsRunning() ) { wasRunning = TRUE; } bool ok = m_ftp_update_timer->Start( newPeriod ); if ( ! wasRunning ) { m_ftp_update_timer->Stop(); } return ( ok ); } // Set amulesig.dat file void WxCasFrame::SetAmuleSigFile( const wxFileName& file ) { m_aMuleSig->SetAmuleSig ( file ); } wxString WxCasFrame::MakeStatLine_1() const { wxString newline; if ( m_aMuleSig->GetAmuleState () == 1 || m_aMuleSig->GetKadState () == 1 || m_aMuleSig->GetKadState () == 2 ) { newline = _( "aMule " ) + m_aMuleSig->GetVersion () + _( " has been running for " ) + m_aMuleSig->GetRunTime (); } else if ( m_aMuleSig->GetUpStatus () == 0 ) { newline = _( "aMule " ) + m_aMuleSig->GetVersion () + _( " is stopped !" ); } else if ( m_aMuleSig->GetAmuleState () == 0 && m_aMuleSig->GetKadState () == 0 ) { newline = _( "aMule " ) + m_aMuleSig->GetVersion () + _( " is not connected !" ); } else if ( m_aMuleSig->GetAmuleState () == 2 ) { newline = _( "aMule " ) + m_aMuleSig->GetVersion () + _( " is connecting..." ); } else { newline = _( "aMule " ) + m_aMuleSig->GetVersion () + _( " is doing something strange, check it !" ); } return ( newline ); } wxString WxCasFrame::MakeStatLine_2() const { wxString notTooLongName ( m_aMuleSig->GetServerName () ); if ( notTooLongName.Length() > 32 ) { notTooLongName = notTooLongName.Left( 32 ) + wxT( "..." ); } if ((m_aMuleSig->GetAmuleState () == 0) && (m_aMuleSig->GetKadState() == 0)){ wxString newline = m_aMuleSig->GetUser () + _( " is not connected !" ); return ( newline ); } if (m_aMuleSig->GetAmuleState () == 0) { wxString newline = m_aMuleSig->GetUser () + _( " is connected to " ) + _( " Kad: " ); if(m_aMuleSig->GetKadState() == 2) { newline += _( "ok" ); } else if (m_aMuleSig->GetKadState() == 1) { newline += _( "firewalled" ); } else { newline += _( "off" ); } return ( newline ); } else { wxString newline = m_aMuleSig->GetUser () + _( " is on " ) + notTooLongName + wxT( " [" ) + m_aMuleSig->GetServerIP () + wxT( ":" ) + m_aMuleSig->GetServerPort () + wxT( "]" ) + _( " with " ) + m_aMuleSig->GetConnexionIDType () + wxT( " |" ) + _( " Kad: " ); if(m_aMuleSig->GetKadState() == 2) { newline += _( "ok" ); } else if (m_aMuleSig->GetKadState() == 1) { newline += _( "firewalled" ); } else { newline += _( "off" ); } return ( newline ); } } wxString WxCasFrame::MakeStatLine_3() const { wxString newline = _( "Total Download: " ) + m_aMuleSig->GetConvertedTotalDL () + _( ", Upload: " ) + m_aMuleSig->GetConvertedTotalUL (); return ( newline ); } wxString WxCasFrame::MakeStatLine_4() const { wxString newline = _( "Session Download: " ) + m_aMuleSig->GetConvertedSessionDL () + _( ", Upload: " ) + m_aMuleSig->GetConvertedSessionUL (); return ( newline ); } wxString WxCasFrame::MakeStatLine_5() const { wxString newline = _( "Download: " ) + m_aMuleSig->GetDLRate () + _( " kB/s, Upload: " ) + m_aMuleSig->GetULRate () + _( " kB/s" ); return ( newline ); } wxString WxCasFrame::MakeStatLine_6() const { wxString newline = _( "Sharing: " ) + m_aMuleSig->GetSharedFiles () + _( " file(s), Clients on queue: " ) + m_aMuleSig->GetQueue (); return ( newline ); } wxString WxCasFrame::MakeStatLine_7() const { wxDateTime now = wxDateTime::Now(); wxString newline = _( "Time: " ) + now.Format( wxDefaultDateTimeFormat , wxDateTime::Local ); return ( newline ); } wxString WxCasFrame::MakeHitsLine_1() const { wxString newline = wxString::Format ( _( "%.2f kB/s" ), m_aMuleSig->GetSessionMaxDL () ) + _( " on " ) + m_aMuleSig->GetSessionMaxDlDate().Format( wxT( "%c" ) ); return ( newline ); } wxString WxCasFrame::MakeHitsLine_2() const { wxString newline = wxString::Format ( _( "%.2f kB/s" ), m_aMuleSig->GetAbsoluteMaxDL() ) + _( " on " ) + m_aMuleSig->GetAbsoluteMaxDlDate().Format( wxT( "%c" ) ); return ( newline ); } #ifdef __LINUX__ // System monitoring on Linux wxString WxCasFrame::MakeSysLine_1() const { wxString newline = _( "System Load Average (1-5-15 min): " ) + m_sysMonitor->GetSysLoad_1 () + wxT( " " ) + m_sysMonitor->GetSysLoad_5 () + wxT( " " ) + m_sysMonitor->GetSysLoad_15 (); return ( newline ); } wxString WxCasFrame::MakeSysLine_2() const { wxString newline = _( "System uptime: " ) + m_sysMonitor->GetUptime (); return ( newline ); } #endif void WxCasFrame::SaveAbsoluteHits() { wxConfigBase * prefs = wxConfigBase::Get(); prefs->Write( WxCasCte::ABSOLUTE_MAX_DL_KEY, ( long ) ( 1024.0 * m_aMuleSig->GetAbsoluteMaxDL() ) ); prefs->Write( WxCasCte::ABSOLUTE_MAX_DL_DATE_KEY, ( long ) ( m_aMuleSig->GetAbsoluteMaxDlDate().GetTicks() ) ); prefs->Flush(); } // File_checked_for_headers aMule-2.3.1/src/utils/wxCas/wxcas.desktop0000644000175000017470000000045211644077302017225 0ustar topiusers[Desktop Entry] Name=wxCas Exec=wxcas Icon=wxcas Terminal=false Type=Application Categories=Network;P2P; Comment=aMule online statistics Comment[de]=aMule-Onlinestatistik Comment[fr]=Statistiques d'aMule en ligne Comment[hu]=aMule online statisztikák Comment[tr]=Çevrim içi aMule istatistikleri aMule-2.3.1/src/utils/wxCas/Makefile.am0000644000175000017470000000032411575347521016545 0ustar topiusersSUBDIRS = src docs EXTRA_DIST = wxcas.rc wxcas.ico dist_icon_DATA = wxcas.xpm icondir = $(datadir)/pixmaps dist_util_DATA = wxcas.desktop utildir = $(datadir)/applications MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/wxCas/docs/0000755000175000017470000000000011657306263015441 5ustar topiusersaMule-2.3.1/src/utils/wxCas/docs/wxcas.de.10000644000175000017470000000247711653631431017243 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "November 2011" wxCas "aMule Hilfsprogramme" .als B_untranslated B .SH NAME wxcas \- wx c aMule statistics .SH SYNTAX .B_untranslated wxcas .SH BESCHREIBUNG \fBwxcas\fP is a program for displaying the contents of your online signature file in a nice wx Window on your Desktop. For this to work, you must enable the "Online Signature" option in aMule's preferences. Based on Pedro de Oliveira's \fBcas\fP(1). \fBwxcas\fP was written by ThePolish Dieses Programm hat keine Parameter. .SH "FEHLER MELDEN" Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns weder Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder. .SH COPYRIGHT aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License .SH "SIEHE AUCH" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH VERFASSER Diese manpage wurde geschrieben von Vollstrecker Diese manpage wurde übersetzt von Vollstrecker aMule-2.3.1/src/utils/wxCas/docs/wxcas.hu.10000644000175000017470000000251511656343533017266 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "2011. november" wxCas "aMule segédprogramok" .als B_untranslated B .SH NÉV wxcas \- wx c aMule statisztikák .SH ÁTTEKINTÉS .B_untranslated wxcas .SH LEÍRÁS A \fBwxcas\fP az aMule online\-aláírás fájljának tartalmát jeleníti meg grafikusan. Ahhoz, hogy ez működjön, engedélyezni kell az \(BqOnline aláírás\(rq opciót az aMule beállításaiban. Készült a Pedro de Oliveira írta \fBcas\fP(1) alapján. A \fBwxcas\fP\-t ThePolish írta. A program nem vár semmilyen paramétert. .SH "HIBÁK JELENTÉSE" A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fP), vagy a hibakövetőben (\fIhttp://bugs.amule.org/\fP) jelentsék. Hibákról kérjük ne írjanak levelet (e\-mail\-t) se a levelezési listára, se közvetlenül valamelyik fejlesztőnek. .SH COPYRIGHT Az aMule és az összes hozzá tartozó segédprogram a GNU General Public License védelme alatt áll. .SH "LÁSD MÉG" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH SZERZŐ Ezt a kézikönyv lapot Vollstrecker írta. .SH MAGYAR FORDÍTÁS Dévai Tamás aMule-2.3.1/src/utils/wxCas/docs/wxcas.10000644000175000017470000000175111653631431016646 0ustar topiusers.TH WXCAS 1 "November 2011" "wxCas" "aMule utilities" .als B_untranslated B .SH NAME wxcas \- wx c aMule statistics .SH SYNOPSIS .B_untranslated wxcas .SH DESCRIPTION \fBwxcas\fR is a program for displaying the contents of your online signature file in a nice wx Window on your Desktop. For this to work, you must enable the "Online Signature" option in aMule's preferences. Based on Pedro de Oliveira's \fBcas\fR(1). \fBwxcas\fR was written by ThePolish This app doesn't take any arguments. .SH REPORTING BUGS Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. .SH COPYRIGHT aMule and all of its related utilities are distributed under the GNU General Public License. .SH SEE ALSO .B_untranslated amule\fR(1), \fBcas\fR(1) .SH AUTHOR This manpage was written by Vollstrecker aMule-2.3.1/src/utils/wxCas/docs/Makefile.am0000644000175000017470000000033111641025331017455 0ustar topiusersSELECTED_MANPAGES = $(WXCAS_MANPAGES) EXTRA_DIST = wxcas.1 wxcas.de.1 wxcas.es.1 wxcas.fr.1 wxcas.hu.1 wxcas.it.1 wxcas.ru.1 wxcas.tr.1 include $(top_srcdir)/automake/manpages.am MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/wxCas/docs/wxcas.es.10000644000175000017470000000242011653631431017246 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "November 2011" wxCas "aMule utilidades" .als B_untranslated B .SH NOMBRE wxcas \- wx c estadísticas de aMule .SH SINOPSIS .B_untranslated wxcas .SH DESCRIPCIÓN \fBwxcas\fP is a program for displaying the contents of your online signature file in a nice wx Window on your Desktop. For this to work, you must enable the "Online Signature" option in aMule's preferences. Based on Pedro de Oliveira's \fBcas\fP(1). \fBwxcas\fP was written by ThePolish Esta apli no tiene ningún argumento. .SH "INFORMANDO ERRORES" Por favor informa de fallos ya sea en nuestro foro (\fIhttp://forum.amule.org/\fP), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fP). Por favor no informe de fallos por correo, ni en nuestras listas, ni directamente al correo de algun miembro del equipo. .SH COPYRIGHT aMule y todas las demás utilidades relacionadas son distribuidas bajo la GNU General Public License. .SH "VEASE TAMBIEN" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH AUTOR Esta página de manualfue escrita por Vollstrecker aMule-2.3.1/src/utils/wxCas/docs/wxcas.fr.10000644000175000017470000000245711657217366017273 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "Novembre 2011" wxCas "Outils d'aMule" .als B_untranslated B .SH NOM wxcas \- wx c aMule statistics .SH SYNOPSIS .B_untranslated wxcas .SH DESCRIPTION \fBwxcas\fP est un programme permettant d'afficher le contenu de votre fichier de signature en ligne dans une belle fenêtre wx sur votre bureau. Pour que cela fonctionne, vous devez activer l'option "Online Signature" dans les préférences d'aMule. Basé sur \fBcas\fP(1) de Pedro de Oliveira. \fBwxcas\fP a été écrit par ThePolish Cette application ne prend pas d'arguments. .SH "RAPPORTER DES BOGUES" Veuillez rapporter les bogues sur notre forum (\fIhttp://forum.amule.org/\fP), ou sur notre bugtracker (\fIhttp://bugs.amule.org/\fP). Veuillez ne pas rapporter les bogues par e\-mail, sur notre liste de diffusion ou directement à n'importe quel membre de l'équipe. .SH COPYRIGHT aMule et tout ses outils sont distribués sous la licence GNU General Public License. .SH "VOIR AUSSI" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH AUTEUR Cette manpage a été écrite par Vollstrecker aMule-2.3.1/src/utils/wxCas/docs/wxcas.tr.10000644000175000017470000000252311657220745017276 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "Kasım 2011" wxCas "aMule yardımcı araçları" .als B_untranslated B .SH İSİM wxcas \- wx c aMule istatistikleri .SH KULLANIM .B_untranslated wxcas .SH AÇIKLAMA \fBwxcas\fP çevrimiçi imzanızın içeriklerini güzel bir wx penceresinde görüntüler. Bunun çalışması için aMule'ün ayarlarında "Çevrim İçi İmza" seçeneğini etkinleştirmeniz gerekmektedir. Pedro de Oliveira'nın \fBcas\fP(1) programına dayalıdır. \fBwxcas\fP ThePolish tarafından yazılmıştır Bu uygulama hiçbir argüman almaz. .SH GERİBİLDİRİM Hataları bildirmek için forumumuzu (\fIhttp://forum.amule.org/\fP) ya da hata takipçimizi (\fIhttp://bugs.amule.org/\fP) kullanınız. Hataları bildirmek için e\-mail ve e\-mail listemizi kullanmamanızı ve geliştiricilerden birine doğrudan bildirmemenizi rica ederiz. .SH "TELİF HAKKI" aMule ve ilgili tüm yardımcı araçları GNU Genel Kamu Lisansı çerçevesinde dağıtılmaktadır. .SH "İLGİLİ BELGELER" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH YAZAN Bu kılavuz sayfası Vollstrecker tarafından yazılmıştır. aMule-2.3.1/src/utils/wxCas/docs/Makefile.in0000644000175000017470000003654211657306263017520 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/automake/manpages.am subdir = src/utils/wxCas/docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SELECTED_MANPAGES = $(WXCAS_MANPAGES) EXTRA_DIST = wxcas.1 wxcas.de.1 wxcas.es.1 wxcas.fr.1 wxcas.hu.1 wxcas.it.1 wxcas.ru.1 wxcas.tr.1 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.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/utils/wxCas/docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/wxCas/docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook 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 uninstall uninstall-am uninstall-hook install-data-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done uninstall-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/wxCas/docs/wxcas.it.10000644000175000017470000000254211655447554017275 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "Novembre 2011" wxCas "Utilità di aMule" .als B_untranslated B .SH NOME wxcas \- statistiche wx c di aMule .SH SINTASSI .B_untranslated wxcas .SH DESCRIZIONE \fBwxcas\fP è un programma per visualizzare i contenuti del file di firma online in una bella finestra wx sul tuo schermo. Per il funzionamento, devi abilitare l'opzione "firma online" nelle preferenze di aMule. Basato su \fBcas\fP(1) di Pedro de Oliveira. \fBwxcas\fP è stato scritto da ThePolish Questa applicazione non accetta parametri. .SH "SEGNALARE I BUG" Per favore segnalare i bug nel nostro forum (\fIhttp://forum.amule.org/\fP) o nel nostro bugtracker (\fIhttp://bugs.amule.org/\fP). Per favore non segnalare i bug via posta elettronica, né nella nostra mailing list né direttamente a qualunque membro del gruppo. .SH COPYRIGHT aMule e tutti i programmi di utilità correlati sono distribuiti in accordo alla GNU General Public License. .SH "VEDI ANCHE" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH AUTORE Questa pagina del manuale è stata scritta da Vollstrecker .SH TRADUZIONE ITALIANA Stefano Corti aMule-2.3.1/src/utils/wxCas/docs/wxcas.ru.10000644000175000017470000000353511653631431017275 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH WXCAS 1 "November 2011" wxCas "утилиты aMule" .als B_untranslated B .SH ИМЯ wxcas \- wx c\-статистика aMule .SH ОБЗОР .B_untranslated wxcas .SH ОПИСАНИЕ \fBwxcas\fP \- программа для отображения содержимого файла вашей онлайн\-подписи aMule в приятном wx Window окне на вашем рабочем столе. Чтобы это работало, вы должны включить опцию "Онлайн подпись" в настройках aMule. Основана на программе \fBcas\fP(1) написанной Pedro de Oliveira. \fBwxcas\fP была написана ThePolish Утилита не принимает параметров. .SH "СООБЩЕНИЕ ОБ ОШИБКАХ" Пожалуйста, сообщайте об ошибках либо на нашем форуме (\fIhttp://forum.amule.org/\fP), либо в багтрекере (\fIhttp://bugs.amule.org/\fP). Пожалуйста, не сообщайте об ошбках по электронной почте, по нашим спискам рассылки, или напрямую участникам. .SH "АВТОРСКИЕ ПРАВА" aMule и все прилагающиеся инструменты распространаются под Открытым Лицензионным Соглашением GNU (GNU GPL). .SH "СМ. ТАКЖЕ" .B_untranslated amule\fR(1), \fBcas\fR(1) .SH АВТОРЫ Автор страницы помощи: Vollstrecker , перевод: Radist Morse aMule-2.3.1/src/utils/wxCas/wxcas.rc0000644000175000017470000000006611575347521016167 0ustar topiuserswxcas ICON "wxcas.ico" #include "wx/msw/wx.rc" aMule-2.3.1/src/utils/wxCas/wxcas.ico0000644000175000017470000002464610077755510016344 0ustar topiusershF   V00( @neH!  YW8sHZV*>* ZC%YbuLfǦ7unx\ $ !d1o}q_ݹeXlnY"[}`cvg WgoX-.\gXUyɅ1dwyT.a1lL҅CЌk̈́y^ {MRI֐׃E4KLs*ъ֍ڢ Ԏאb*'=u%X8mτҋו% 6Y"@ zxψ#6OV[@v{ƒ#6(l~rIYRz̡ #2qwb?)`\!˖ԨX:{*+,>y^tww Jb /em[F6 oeEuvwxyz{|}~efghijklmnopqrXYZ[\]^_`abcdIJKLMNOPQRSTUV:;<=>?@ABCDEF,-./012345678 !"#$%&'() ?( @   #("+&#1,)91-?52E85G97H94K9.O5$Q2U3\7 `:e@jDpIwP |U Y ]`abemquwzzxuqligffghkmnoprtvwy{~ƃȅˈ΍ҒՖ֘؜۟ ܡ ޣ  "(,/24ٰ5֬5Ө4У3̟2Ǚ/ē.-/~4s8e;YBPF|LKrJNlJRhMVhP]gUbeYgc^l_bt[g|UlJm8n0p'n li f e_\_effgijn rz !'/3:@CGMQU[fpx~~zvtrprru{ùɻνҾ~ֽsܾkhgc^[\bcaaccdhow}|}ƆoĆbG01$$p##otzi][[[[]^[ w{|~i^PXWYY[[[%wl^VYfXYYYZY$wi_UVWVUXXT[$wn_RSUVWWWUY$wjMNRRQRZ#wIIPJRUUUY"wIMHTRMQQT!w⋥JRI^RLJNU"w}~YHPbJUMKLL!wKOa^_MOgINKKLKx(<>QPP_Ub^h*;7IOOc_STq).3a0fP`SIFGJMOIq).4M_7eNKFB?BFMv*:8Fk7cgG0E??CC@u *.3CCv */28BE<4Ih76:99>>Bt*.29888,ih77433::>tr';9./122Ck7c73333:?q*<<.:;17Bj+cc74333:?$((+)23.5k1Cj-24333?# ,,0Ci<<-./:<::=A m!$'&*(%)!"$pyϿ/!;( @ {9{Z9{{{sk9{sZ9sc!cs){{{c{Όsks1{c{R1!k9!sBֽskkkks{ƔscZZZZkR֥sJR{csBJ1R!9!9!J91J99ZJJscc{kkJ119J1){Zkk9!cRRsBkB{ֵB{)1!s֔ޭ!kZ9cRRBccs)Jk!cޭ!Z9cRR{!kcB޵skZsZcޭ!Z9cRRs{kccksskZ{Ɣ!֔Z9cRRscZ9ckck֭Ɣ!ZޥޥޥZ9cRRJ9kBB1))!s֥֔֜!ֽs!ޥ֜!JJ1cRRcRB1!!c֭Z֔ޭ!J)֔)kΥޥޥJ1cRRssscR9JZޔ֜!9JƜJ֔֔ޥΥJ1cRR{!kބBk{ޥބΔ!!Z֜ZƜ֔֜֔J1cRRƔ!ޭBZsޭ!9ֽsޥ9Ɣ!cs֜ޭ!֔֜֜֔J1cRRkZZsBs{ΔֽsZޔ!ޭ!9ֽsZc)9Ɣ!kR{RRcRRkB{kssZޜޭ1ޭ1ޜ9)ZޔkZZ{99{{sJ99Ό9)!ΌΔޜޥ!ޭ1kscRR{99{{kޜޜsބޭBﵽޥZޜ{{s{Ό9!cRRcRRkB{kk諒skkJﵽ֔ޔބ{ss{{s9!cJJcRRkB{{ksZkkZZﵽscs{{ss{s9!ZJJcRRkB{{kk֔Όkkޭ1Z{sޭBskkksss9!RBBcRRkB{{kkkkk{ޭ1{kޔޭ!kkkkkkk9!RBBcRR{99kkk{{{k{֔֔kk֔ޜkkkkkkk9!J91cRR{99{kk{kk{kΌ֔{{kΌkkkkkkk9!B11cRR{99{kk{kkk{sބsk{֜!{{kkkkkk9!B119!Z9c9ZBkRkRsss{sk{kk{{{kkkkkk9!Z9kRkR9!9!J1ޭBkZssk{{k{kkkk9!Z9cJJ91Z9!B)!R!R!c9Z9J1ZB9!sssZJJϿ/!;(0` sssZJJcJJ91Z9!B)!R!c9Z9J1ZB9!kRޭBkZssk{k{sxcRR{99sބs~֜!B11uΌ֔y֔ޜkBޭ1ޔޭ!RBBZJcJJޥZkZZJ99)!ΔsBֽsƔ!kR{RR֜֔{!kBk{ƜscR9JZޥΥcB1!!J9kB1))ssZ9ckcks{ksk{{!skZscBc)JsBk{B{sJ19J1){s{ZR֥R{cJ99scc1{Rkkkk!s{c{Όsk9{9s[[Pff~~[Pff~~[fvveeett|BCCeeett|BCC{{TrrPPff55B q88@@q88@@llacc)&&00@@@@ v{cYvvy3zz00 v{cYvvy3zz00 }}TOOZZ[y3zzzzzzyFF0 {{|}}T__u~~~[xxdYYoE&Dyyyzzzzzzzzyzz {{|}}T__u~~~[xxdYYoE&Dyyyzzzzzzzzyzz ppqTTrsstuuvwwxdddYYoffE8y]]zyFF]]]yzz gghiij``kllmbbdnnoooeJJ!C>]]!FFFFFFFF gghiij``kllmbbdnnoooeJJ!C>]]!FFFFFFFF __U``abbcddd__eff8JJ0=JJ=FF^FF]]] SSTUUVWWXYYZ[[\--/II><RR\FFJJJ]^^ SSTUUVWWXYYZ[[\--/II><RR\FFJJJ]^^ KKLMMNOPPQ77%??>>2II8)DDRJJIJJ @EE220<<-CC77;EII00JIIIJJ @EE220<<-CC77;EII00JIIIJJ 9BB?C22/>>00;DCCDD22=<>$??*77>,,@***47788**$44***47788**$44++44--54((//4466++222244%%++222244%%++($$,2311++,--../011++,--../011''())&&&*#$%%&&$""#$%%&&$"" !""        ?ppaMule-2.3.1/src/utils/wxCas/Makefile.in0000644000175000017470000005706511657306263016573 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/utils/wxCas DIST_COMMON = $(dist_icon_DATA) $(dist_util_DATA) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)" DATA = $(dist_icon_DATA) $(dist_util_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src docs EXTRA_DIST = wxcas.rc wxcas.ico dist_icon_DATA = wxcas.xpm icondir = $(datadir)/pixmaps dist_util_DATA = wxcas.desktop utildir = $(datadir)/applications MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/wxCas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/wxCas/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_iconDATA: $(dist_icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(MKDIR_P) "$(DESTDIR)$(icondir)" @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-dist_iconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icondir)" && rm -f $$files install-dist_utilDATA: $(dist_util_DATA) @$(NORMAL_INSTALL) test -z "$(utildir)" || $(MKDIR_P) "$(DESTDIR)$(utildir)" @list='$(dist_util_DATA)'; test -n "$(utildir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(utildir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(utildir)" || exit $$?; \ done uninstall-dist_utilDATA: @$(NORMAL_UNINSTALL) @list='$(dist_util_DATA)'; test -n "$(utildir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(utildir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(utildir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -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-dist_iconDATA install-dist_utilDATA 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 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: uninstall-dist_iconDATA uninstall-dist_utilDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dist_iconDATA \ install-dist_utilDATA 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-recursive uninstall uninstall-am \ uninstall-dist_iconDATA uninstall-dist_utilDATA # 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: aMule-2.3.1/src/utils/patches/0000755000175000017470000000000011657306231015046 5ustar topiusersaMule-2.3.1/src/utils/patches/cryptopp/0000755000175000017470000000000011657306231016726 5ustar topiusersaMule-2.3.1/src/utils/patches/cryptopp/mac_build.patch0000644000175000017470000000136711575347521021703 0ustar topiusersdiff -u GNUmakefile-orig GNUmakefile --- GNUmakefile-orig 2010-08-09 14:22:42.000000000 -0500 +++ GNUmakefile 2010-12-19 15:14:28.000000000 -0600 @@ -1,4 +1,4 @@ -CXXFLAGS = -DNDEBUG -g -O2 +CXXFLAGS += -DNDEBUG -g -O2 #CXXFLAGS = -g # -fPIC is supported. Please report any breakage of -fPIC as a bug. # CXXFLAGS += -fPIC @@ -35,7 +35,7 @@ ifneq ($(GCC42_OR_LATER),0) ifeq ($(UNAME),Darwin) -CXXFLAGS += -arch x86_64 -arch i386 +#CXXFLAGS += -arch x86_64 -arch i386 else CXXFLAGS += -march=native endif @@ -87,7 +87,7 @@ ifeq ($(UNAME),Darwin) AR = libtool ARFLAGS = -static -o -CXX = c++ +#CXX = c++ IS_GCC2 = $(shell $(CXX) -v 2>&1 | $(EGREP) -c gcc-932) ifeq ($(IS_GCC2),1) CXXFLAGS += -fno-coalesce-templates -fno-coalesce-static-vtables aMule-2.3.1/src/utils/patches/wxWidgets/0000755000175000017470000000000011657306231017033 5ustar topiusersaMule-2.3.1/src/utils/Makefile.am0000644000175000017470000000113411575347521015460 0ustar topiusersif CAS OPT_CAS = cas endif if WXCAS OPT_WXCAS = wxCas endif if ALC OPT_ALC = aLinkCreator endif if ALCC OPT_ALC = aLinkCreator endif if XAS OPT_XAS = xas endif if PLASMAMULE OPT_PLASMAMULE = plasmamule endif if FILEVIEW OPT_FILEVIEW = fileview endif SUBDIRS = $(OPT_FILEVIEW) $(OPT_XAS) $(OPT_CAS) $(OPT_WXCAS) $(OPT_ALC) ${OPT_PLASMAMULE} DIST_SUBDIRS = fileview xas cas wxCas aLinkCreator plasmamule MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = mkFileSum.c EXTRA__DIST__SUBDIRS = amps scripts include $(top_srcdir)/automake/dist-hook.am DISTCLEANFILES = scripts/denoiser.sed aMule-2.3.1/src/utils/aLinkCreator/0000755000175000017470000000000011657306262016001 5ustar topiusersaMule-2.3.1/src/utils/aLinkCreator/src/0000755000175000017470000000000011657306262016570 5ustar topiusersaMule-2.3.1/src/utils/aLinkCreator/src/alcframe.h0000644000175000017470000001146511575347521020524 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: AlcFrame Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _ALCFRAME_H #define _ALCFRAME_H // For compilers that support precompilation, includes "wx/wx.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include // Compute and display md4sum or not //#define WANT_MD4SUM 1 /// Main Alc Frame class AlcFrame:public wxFrame { private: wxToolBar *m_toolbar; wxBitmap m_toolBarBitmaps[4]; wxBoxSizer *m_frameVBox; wxPanel *m_mainPanel; wxBoxSizer *m_mainPanelVBox; wxStaticLine *m_staticLine; wxStaticBox *m_inputSBox; wxStaticBoxSizer* m_inputSBoxSizer; wxFlexGridSizer *m_inputFlexSizer; wxStaticText *m_inputFileStaticText; wxTextCtrl *m_inputFileTextCtrl; wxButton *m_inputFileBrowseButton ; wxStaticText *m_inputAddStaticText; wxTextCtrl *m_inputAddTextCtrl; wxButton *m_inputAddButton ; wxListBox *m_inputUrlListBox; wxBoxSizer *m_buttonUrlVBox; wxButton *m_removeButton; wxButton *m_clearButton; wxCheckBox *m_parthashesCheck; wxProgressDialog *m_progressBar; bool m_goAhead; #ifdef WANT_MD4SUM wxStaticBox *m_md4HashSBox; wxStaticBoxSizer* m_md4HashSBoxSizer; wxTextCtrl *m_md4HashTextCtrl; #endif wxStaticBox *m_e2kHashSBox; wxStaticBoxSizer* m_e2kHashSBoxSizer; wxTextCtrl *m_e2kHashTextCtrl; wxStaticBox *m_ed2kSBox; wxStaticBoxSizer* m_ed2kSBoxSizer; wxTextCtrl *m_ed2kTextCtrl; wxBoxSizer* m_buttonHBox; wxButton *m_copyButton; wxButton *m_startButton; wxButton *m_saveButton; wxButton *m_closeButton; enum { ID_BAR_OPEN = 1000, ID_BAR_SAVEAS, ID_BAR_COPY, ID_BAR_ABOUT, ID_START_BUTTON, ID_SAVEAS_BUTTON, ID_COPY_BUTTON, ID_EXIT_BUTTON, ID_BROWSE_BUTTON, ID_ADD_BUTTON, ID_REMOVE_BUTTON, ID_CLEAR_BUTTON, ID_PARTHASHES_CHECK }; /// Set File to hash in wxTextCtrl void SetFileToHash(); /// Save computed Ed2k link to file void SaveEd2kLinkToFile(); /// Copy Ed2k link to clip board void CopyEd2kLinkToClipBoard(); protected: /// Toolbar Open button void OnBarOpen (wxCommandEvent & event); /// Toolbar Save As button void OnBarSaveAs (wxCommandEvent & event); /// Toolbar Copy button void OnBarCopy(wxCommandEvent & event); /// Toolbar About button void OnBarAbout (wxCommandEvent & event); /// Close Button void OnCloseButton (wxCommandEvent & event); /// Save As button void OnSaveAsButton(wxCommandEvent & event); /// Copy button void OnCopyButton(wxCommandEvent & event); /// Compute Hashes on Start Button void OnStartButton (wxCommandEvent & event); /// Browse button to select file to hash void OnBrowseButton (wxCommandEvent & event); /// Add an URL to the URL list box void OnAddUrlButton (wxCommandEvent & event); /// Remove the selected URL from the URL list box void OnRemoveUrlButton (wxCommandEvent & event); /// Clear the URL list box void OnClearUrlButton (wxCommandEvent & event); DECLARE_EVENT_TABLE () public: /// Constructor AlcFrame (const wxString& title); /// Destructor ~AlcFrame (); // Hook function for external update of the progress bar static bool Hook(int percent); }; #endif /* _ALCFRAME_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/md4.cpp0000644000175000017470000002572111575347521017771 0ustar topiusers//////////////////////////////////////////////////////////////////////////////// /// Name: MD4 Class /// /// Purpose: aMule ed2k link creator /// /// Last modified by: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// Copyright (c) 2004-2011 Alo Sarv ( madcat_@users.sourceforge.net ) /// /// Copyright (c) 2002-2011 Michael Buesch /// Email: mbuesch@freenet.de /// /// The algorithm is due to Ron Rivest. This code is based on code /// written by Colin Plumb in 1993. /// /// This code implements the MD4 message-digest algorithm. /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "md4.h" #include "bithelp.h" /// BIG ENDIAN byte reversing #if wxBYTE_ORDER == wxBIG_ENDIAN // Note: this code is harmless on little-endian machines. void MD4::byteReverse(unsigned char *buf, unsigned longs) { uint32_t t; do { t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(uint32_t *) buf = t; buf += 4; } while (--longs); } #else #define byteReverse(buf, len) do { } while (0) #endif /// Start MD4 accumulation. /// Set bit count to 0 and buffer to mysteriousinitialization constants. void MD4::MD4Init(struct MD4Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /// Update context to reflect the concatenation of another buffer full of bytes. void MD4::MD4Update(struct MD4Context *ctx, unsigned char const *buf, size_t len) { register uint32_t t; // Update bitcount t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++; // Carry from low to high ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; // Bytes already in shsInfo->data // Handle any leading odd-sized chunks if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = 64 - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); byteReverse(ctx->in, 16); MD4Transform(ctx->buf, (uint32_t *) ctx->in); buf += t; len -= t; } // Process data in 64-byte chunks while (len >= 64) { memcpy(ctx->in, buf, 64); byteReverse(ctx->in, 16); MD4Transform(ctx->buf, (uint32_t *) ctx->in); buf += 64; len -= 64; } //Handle any remaining bytes of data. memcpy(ctx->in, buf, len); } /// Final wrapup - pad to 64-byte boundary with the bit pattern /// 1 0* (64-bit count of bits processed, MSB-first) void MD4::MD4Final(struct MD4Context *ctx, unsigned char* digest) { unsigned int count; unsigned char *p; // Compute number of bytes mod 64 count = (ctx->bits[0] >> 3) & 0x3F; // Set the first char of padding to 0x80. //This is safe since there is always at least one byte free p = ctx->in + count; *p++ = 0x80; // Bytes of padding needed to make 64 bytes count = 64 - 1 - count; // Pad out to 56 mod 64 if (count < 8) { // Two lots of padding: Pad the first block to 64 bytes memset(p, 0, count); byteReverse(ctx->in, 16); MD4Transform(ctx->buf, (uint32_t *) ctx->in); // Now fill the next block with 56 bytes memset(ctx->in, 0, 56); } else { // Pad block to 56 bytes memset(p, 0, count - 8); } byteReverse(ctx->in, 14); // Append length in bits and transform ((uint32_t *) ctx->in)[14] = ctx->bits[0]; ((uint32_t *) ctx->in)[15] = ctx->bits[1]; MD4Transform(ctx->buf, (uint32_t *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); if (digest!=NULL) { memcpy(digest, ctx->buf, 16); } memset(ctx, 0, sizeof(ctx)); // In case it's sensitive } /// The three core functions #define MD4_F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define MD4_G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) #define MD4__H(x, y, z) ((x) ^ (y) ^ (z)) #define MD4_FF(a, b, c, d, x, s) { \ (a) += MD4_F ((b), (c), (d)) + (x); \ (a) = rol ((a), (s)); \ } #define MD4_GG(a, b, c, d, x, s) { \ (a) += MD4_G ((b), (c), (d)) + (x) + (uint32_t)0x5a827999; \ (a) = rol ((a), (s)); \ } #define MD4_HH(a, b, c, d, x, s) { \ (a) += MD4__H ((b), (c), (d)) + (x) + (uint32_t)0x6ed9eba1; \ (a) = rol ((a), (s)); \ } /// The core of the MD4 algorithm void MD4::MD4Transform(uint32_t buf[4], uint32_t const in[16]) { register uint32_t a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD4_FF(a, b, c, d, in[0], 3); /* 1 */ MD4_FF(d, a, b, c, in[1], 7); /* 2 */ MD4_FF(c, d, a, b, in[2], 11); /* 3 */ MD4_FF(b, c, d, a, in[3], 19); /* 4 */ MD4_FF(a, b, c, d, in[4], 3); /* 5 */ MD4_FF(d, a, b, c, in[5], 7); /* 6 */ MD4_FF(c, d, a, b, in[6], 11); /* 7 */ MD4_FF(b, c, d, a, in[7], 19); /* 8 */ MD4_FF(a, b, c, d, in[8], 3); /* 9 */ MD4_FF(d, a, b, c, in[9], 7); /* 10 */ MD4_FF(c, d, a, b, in[10], 11); /* 11 */ MD4_FF(b, c, d, a, in[11], 19); /* 12 */ MD4_FF(a, b, c, d, in[12], 3); /* 13 */ MD4_FF(d, a, b, c, in[13], 7); /* 14 */ MD4_FF(c, d, a, b, in[14], 11); /* 15 */ MD4_FF(b, c, d, a, in[15], 19); /* 16 */ MD4_GG(a, b, c, d, in[0], 3); /* 17 */ MD4_GG(d, a, b, c, in[4], 5); /* 18 */ MD4_GG(c, d, a, b, in[8], 9); /* 19 */ MD4_GG(b, c, d, a, in[12], 13); /* 20 */ MD4_GG(a, b, c, d, in[1], 3); /* 21 */ MD4_GG(d, a, b, c, in[5], 5); /* 22 */ MD4_GG(c, d, a, b, in[9], 9); /* 23 */ MD4_GG(b, c, d, a, in[13], 13); /* 24 */ MD4_GG(a, b, c, d, in[2], 3); /* 25 */ MD4_GG(d, a, b, c, in[6], 5); /* 26 */ MD4_GG(c, d, a, b, in[10], 9); /* 27 */ MD4_GG(b, c, d, a, in[14], 13); /* 28 */ MD4_GG(a, b, c, d, in[3], 3); /* 29 */ MD4_GG(d, a, b, c, in[7], 5); /* 30 */ MD4_GG(c, d, a, b, in[11], 9); /* 31 */ MD4_GG(b, c, d, a, in[15], 13); /* 32 */ MD4_HH(a, b, c, d, in[0], 3); /* 33 */ MD4_HH(d, a, b, c, in[8], 9); /* 34 */ MD4_HH(c, d, a, b, in[4], 11); /* 35 */ MD4_HH(b, c, d, a, in[12], 15); /* 36 */ MD4_HH(a, b, c, d, in[2], 3); /* 37 */ MD4_HH(d, a, b, c, in[10], 9); /* 38 */ MD4_HH(c, d, a, b, in[6], 11); /* 39 */ MD4_HH(b, c, d, a, in[14], 15); /* 40 */ MD4_HH(a, b, c, d, in[1], 3); /* 41 */ MD4_HH(d, a, b, c, in[9], 9); /* 42 */ MD4_HH(c, d, a, b, in[5], 11); /* 43 */ MD4_HH(b, c, d, a, in[13], 15); /* 44 */ MD4_HH(a, b, c, d, in[3], 3); /* 45 */ MD4_HH(d, a, b, c, in[11], 9); /* 46 */ MD4_HH(c, d, a, b, in[7], 11); /* 47 */ MD4_HH(b, c, d, a, in[15], 15); /* 48 */ buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } /// Algorithm verification bool MD4::selfTest() { wxString test1(wxEmptyString); wxString test1_md(wxT("31D6CFE0D16AE931B73C59D7E0C089C0")); wxString test2(wxT("a")); wxString test2_md(wxT("BDE52CB31DE33E46245E05FBDBD6FB24")); wxString test3(wxT("abc")); wxString test3_md(wxT("A448017AAF21D8525FC10AE87AA6729D")); wxString test4(wxT("message digest")); wxString test4_md(wxT("D9130A8164549FE818874806E1C7014B")); wxString test5(wxT("abcdefghijklmnopqrstuvwxyz")); wxString test5_md(wxT("D79E1C308AA5BBCDEEA8ED63DF412DA9")); wxString test6(wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")); wxString test6_md(wxT("043F8582F241DB351CE627E153E7F0E4")); wxString test7(wxT("12345678901234567890123456789012345678901234567890123456789012345678901234567890")); wxString test7_md(wxT("E33B4DDC9C38F2199C3E7B164FCC0536")); MD4 md4; if (md4.calcMd4FromString(test1) != test1_md) return false; if (md4.calcMd4FromString(test2) != test2_md) return false; if (md4.calcMd4FromString(test3) != test3_md) return false; if (md4.calcMd4FromString(test4) != test4_md) return false; if (md4.calcMd4FromString(test5) != test5_md) return false; if (md4.calcMd4FromString(test6) != test6_md) return false; if (md4.calcMd4FromString(test7) != test7_md) return false; return true; } /// Get Md4 hash from a string wxString MD4::calcMd4FromString(const wxString &buf) { MD4Context hdc; unsigned char ret[MD4_HASHLEN_BYTE]; MD4Init(&hdc); MD4Update(&hdc, (const unsigned char*)buf.c_str(), buf.length()); MD4Final(&hdc, ret); return charToHex((const char*)ret, MD4_HASHLEN_BYTE); } /// Get Md4 hash from a file wxString MD4::calcMd4FromFile(const wxString &filename, MD4Hook hook) { unsigned int bufSize; unsigned char ret[MD4_HASHLEN_BYTE]; MD4Context hdc; // Open file and let wxFFile destructor close the file // Closing it explicitly may crash on Win32 ... wxFFile file(filename, wxS("rbS")); if (! file.IsOpened()) { return wxEmptyString; } else { bufSize = calcBufSize(file.Length()); char *buf = new char[bufSize]; bool keep_going = true; size_t read = 0; size_t totalread = 0; bool goAhead = true; MD4Init(&hdc); while (!file.Eof() && keep_going) { if (hook) { goAhead = hook( (int)((double)(100.0 * totalread) / file.Length())); } if (goAhead) { read = file.Read(buf, bufSize); MD4Update(&hdc, reinterpret_cast(buf), read ); totalread += read; } else { return (_("Cancelled !")); } } MD4Final(&hdc, ret); delete [] buf; return charToHex(reinterpret_cast(ret), MD4_HASHLEN_BYTE); } } /// Convert hash to hexa string wxString MD4::charToHex(const char *buf, size_t len) { size_t i; wxString hexString; for (i = 0; i < len; ++i) { hexString += wxString::Format(wxS("%02x"), 0xFF & *(buf + i)); } // Reduce memory usage hexString.Shrink(); return (hexString); } /// Compute Md4 buffsize size_t MD4::calcBufSize(size_t filesize) { if (filesize < 100000) { filesize = 100000; } else if (filesize > 200000) { filesize = 200000; } return (filesize); } // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alcpix.h0000644000175000017470000000367511575347521020236 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: AlcPix Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _ALCPIX_H #define _ALCPIX_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif // Switch between themes (select just one of them) //#define WANT_KDE_THEME 1 class AlcPix { private: static const char *m_about_xpm[]; #ifndef __WXMSW__ static const char *m_alc_xpm[]; #endif static const char *m_copy_xpm[]; static const char *m_open_xpm[]; static const char *m_saveas_xpm[]; public: static wxBitmap getPixmap(const wxString& name); }; #endif /* _ALCPIX_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/Makefile.am0000644000175000017470000000310311575347521020623 0ustar topiusersAM_LDFLAGS = $(MULELDFLAGS) bin_PROGRAMS = if ALC bin_PROGRAMS += alc endif if ALCC bin_PROGRAMS += alcc endif alc_SOURCES = alc.cpp \ alcframe.cpp \ ed2khash.cpp \ alcpix.cpp \ md4.cpp noinst_HEADERS = alc.h \ alcc.h \ alcframe.h \ ed2khash.h \ alcpix.h \ md4.h \ bithelp.h alc_CPPFLAGS = $(MULECPPFLAGS) $(WX_CPPFLAGS) alc_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) alc_LDADD = $(WX_LIBS) alcc_SOURCES = alcc.cpp \ ed2khash.cpp \ md4.cpp alcc_CPPFLAGS = $(MULECPPFLAGS) $(WXBASE_CPPFLAGS) alcc_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) alcc_LDADD = $(WXBASE_LIBS) # Resources if NEED_RC SUFFIXES = .rc .rc.$(OBJEXT): $(RC) $(MULERCFLAGS) -I$(top_srcdir) $(RCFLAGS) -O COFF -i "$<" -o "$@" nodist_alcc_SOURCES = alcc-version.rc alc_LDADD += alcrc.$(OBJEXT) alcrc.$(OBJEXT): $(srcdir)/../alc.rc alc-version.rc cat $^ | \ ( \ abs_builddir=`pwd` ; \ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ cd $( "$@" alcc-version.rc: $(top_builddir)/version.rc @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Link Creator, Console"/' \ -e 's/VER_INTERNALNAME_STR/"alcc"/' \ -e 's/VER_ORIGINALFILENAME_STR/"alcc$(EXEEXT)"/' "$<" > "$@" CLEANFILES = *-version.rc endif MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/aLinkCreator/src/md4.h0000644000175000017470000000631711575347521017436 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: MD4 Class /// /// Purpose: aMule ed2k link creator /// /// Last modified by: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// Copyright (c) 2004-2011 Alo Sarv ( madcat_@users.sourceforge.net ) /// /// Copyright (c) 2002-2011 Michael Buesch /// Email: mbuesch@freenet.de /// /// The algorithm is due to Ron Rivest. This code is based on code /// written by Colin Plumb in 1993. /// /// This code implements the MD4 message-digest algorithm. /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _MD4_H #define _MD4_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "../../../Types.h" // needed for uint32_t // Use wxString implementation or not //#define WANT_STRING_IMPLEMENTATION 1 // Hook for external progress bar typedef bool (*MD4Hook)(int percent); const unsigned int MD4_HASHLEN_BYTE = 128 / 8; const unsigned int BUFSIZE = 64*1024; const unsigned int PARTSIZE = 9500*1024; class MD4 { private: protected: struct MD4Context { uint32_t buf[4]; uint32_t bits[2]; unsigned char in[64]; }; void MD4Init(struct MD4Context *context); void MD4Update(struct MD4Context *context, unsigned char const *buf, size_t len); void MD4Final(struct MD4Context *context, unsigned char *digest); void MD4Transform(uint32_t buf[4], uint32_t const in[16]); wxString charToHex(const char *buf, size_t len); size_t calcBufSize(size_t filesize); // Needed to reverse byte order on BIG ENDIAN machines #if wxBYTE_ORDER == wxBIG_ENDIAN void byteReverse(unsigned char *buf, unsigned longs); #endif public: /// Constructor MD4() {} /// Destructor virtual ~MD4() {} /// Algorithm verification static bool selfTest(); /// Get Md4 hash from a string wxString calcMd4FromString(const wxString &buf); /// Get Md4 hash from a file wxString calcMd4FromFile(const wxString &filename, MD4Hook hook); }; #endif /* _MD4_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/bithelp.h0000644000175000017470000000303311575347521020371 0ustar topiusers/* bithelp.h - Some bit manipulation helpers * Copyright (c) 1999-2011 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser general Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * Libgcrypt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef G10_BITHELP_H #define G10_BITHELP_H /**************** * Rotate the 32 bit unsigned integer X by N bits left/right */ #if defined(__GNUC__) && defined(__i386__) static inline uint32_t rol(uint32_t x, int n) { __asm__("roll %%cl,%0" :"=r" (x) :"0" (x),"c" (n)); return x; } #else #define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) #endif #if defined(__GNUC__) && defined(__i386__) static inline uint32_t ror(uint32_t x, int n) { __asm__("rorl %%cl,%0" :"=r" (x) :"0" (x),"c" (n)); return x; } #else #define ror(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) ) #endif #endif /*G10_BITHELP_H*/ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alcframe.cpp0000644000175000017470000004573111575347521021062 0ustar topiusers//////////////////////////////////////////////////////////////////////////////// /// Name: AlcFrame Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// Pixmaps from: /// http://jimmac.musichall.cz/ikony.php3 /// http://www.everaldo.com /// http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// the Free Software Foundation; either version 2 of the License, or /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include #include #include #include #include #include #include #include #ifdef __WXMSW__ #include #include #elif defined(__WXMAC__) #include #if wxCHECK_VERSION(2, 9, 0) #include // Do_not_auto_remove #else #include #endif #include #endif #include "md4.h" #include "ed2khash.h" #include "alcframe.h" #include "alcpix.h" #include "alc.h" /// Constructor AlcFrame::AlcFrame (const wxString & title): wxFrame ((wxFrame *) NULL, -1, title) { // Give it an icon #ifdef __WXMSW__ wxIcon icon(wxT("alc")); #else wxIcon icon; icon.CopyFromBitmap(AlcPix::getPixmap(wxT("alc"))); #endif SetIcon (icon); // Status Bar CreateStatusBar (); SetStatusText (_("Welcome!")); // Unused dialog for now m_progressBar = NULL; // Frame Vertical sizer m_frameVBox = new wxBoxSizer (wxVERTICAL); // Add Main panel to frame (needed by win32 for padding sub panels) m_mainPanel = new wxPanel (this, -1); // Main Panel Vertical Sizer m_mainPanelVBox = new wxBoxSizer (wxVERTICAL); // Main Panel static line m_staticLine = new wxStaticLine (m_mainPanel, -1); m_mainPanelVBox->Add (m_staticLine, 0, wxALL | wxGROW); // Input Parameters m_inputSBox = new wxStaticBox (m_mainPanel, -1, _("Input parameters")); m_inputSBoxSizer = new wxStaticBoxSizer (m_inputSBox, wxHORIZONTAL); // Input Grid m_inputFlexSizer = new wxFlexGridSizer (6, 2, 5, 10); // Left col is growable m_inputFlexSizer->AddGrowableCol (0); // Static texts m_inputFileStaticText=new wxStaticText(m_mainPanel, -1, _("File to Hash"), wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); m_inputAddStaticText=new wxStaticText(m_mainPanel, -1, _("Add Optional URLs for this file"), wxDefaultPosition,wxDefaultSize,wxALIGN_CENTRE); // Text ctrls m_inputFileTextCtrl = new wxTextCtrl (m_mainPanel,-1,wxEmptyString, wxDefaultPosition, wxSize(300,-1)); m_inputFileTextCtrl-> SetToolTip (_ ("Enter here the file you want to compute the eD2k link")); m_inputAddTextCtrl = new wxTextCtrl (m_mainPanel,-1,wxEmptyString, wxDefaultPosition, wxSize(300,-1)); m_inputAddTextCtrl-> SetToolTip (_ ("Enter here the URL you want to add to the eD2k link: Add / at the end to let aLinkCreator append the current file name")); // List box m_inputUrlListBox = new wxListBox(m_mainPanel, -1, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE | wxLB_NEEDED_SB | wxLB_HSCROLL); // Buttons m_inputFileBrowseButton = new wxButton (m_mainPanel, ID_BROWSE_BUTTON, wxString (_("Browse"))); m_inputAddButton = new wxButton (m_mainPanel, ID_ADD_BUTTON, wxString (_("Add"))); // Button bar m_buttonUrlVBox = new wxBoxSizer (wxVERTICAL); m_removeButton = new wxButton (m_mainPanel, ID_REMOVE_BUTTON, wxString (_("Remove"))); m_clearButton = new wxButton (m_mainPanel, ID_CLEAR_BUTTON, wxString (_("Clear"))); m_buttonUrlVBox->Add (m_removeButton, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 5); m_buttonUrlVBox->Add (m_clearButton, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 5); // Check button m_parthashesCheck = new wxCheckBox (m_mainPanel, ID_PARTHASHES_CHECK, _ ("Create link with part-hashes")); m_parthashesCheck->SetValue(false); m_parthashesCheck-> SetToolTip (_ ("Help to spread new and rare files faster, at the cost of an increased link size")); // Add to sizers m_inputFlexSizer->Add (m_inputFileStaticText, 1, wxGROW | wxALIGN_BOTTOM | wxTOP, 10); m_inputFlexSizer->Add (1,1); m_inputFlexSizer->Add (m_inputFileTextCtrl, 1, wxGROW | wxALIGN_TOP , 0); m_inputFlexSizer->Add (m_inputFileBrowseButton, 0, wxGROW | wxALIGN_TOP , 0); m_inputFlexSizer->Add (m_inputAddStaticText, 1, wxGROW | wxALIGN_BOTTOM | wxTOP, 10); m_inputFlexSizer->Add (1,1); m_inputFlexSizer->Add (m_inputAddTextCtrl, 1, wxGROW | wxALIGN_TOP , 0); m_inputFlexSizer->Add (m_inputAddButton, 0, wxGROW | wxALIGN_TOP , 0); m_inputFlexSizer->Add (m_inputUrlListBox, 0, wxGROW | wxALIGN_CENTER , 0); m_inputFlexSizer->Add (m_buttonUrlVBox, 0, wxGROW | wxALIGN_CENTER , 0); m_inputFlexSizer->Add (m_parthashesCheck, 0, wxGROW | wxALIGN_CENTER | wxTOP, 10); m_inputFlexSizer->Add (1,1); m_inputSBoxSizer->Add (m_inputFlexSizer, 1, wxGROW | wxALIGN_CENTER | wxALL, 10); m_mainPanelVBox->Add (m_inputSBoxSizer, 0, wxGROW | wxALIGN_CENTER | wxALL, 10); #ifdef WANT_MD4SUM // MD4 Hash Vertical Box Sizer m_md4HashSBox = new wxStaticBox (m_mainPanel, -1, _("MD4 File Hash")); m_md4HashSBoxSizer = new wxStaticBoxSizer (m_md4HashSBox, wxHORIZONTAL); // MD4 Hash results m_md4HashTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); m_md4HashSBoxSizer->Add (m_md4HashTextCtrl, 1, wxALL | wxALIGN_CENTER, 5); m_mainPanelVBox->Add( m_md4HashSBoxSizer, 0, wxALL | wxGROW, 10 ); #endif // Hash Vertical Box Sizer m_e2kHashSBox = new wxStaticBox (m_mainPanel, -1, _("eD2k File Hash")); m_e2kHashSBoxSizer = new wxStaticBoxSizer (m_e2kHashSBox, wxHORIZONTAL); // Hash results m_e2kHashTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); m_e2kHashSBoxSizer->Add (m_e2kHashTextCtrl, 1, wxALL | wxALIGN_CENTER, 5); m_mainPanelVBox->Add( m_e2kHashSBoxSizer, 0, wxALL | wxGROW, 10 ); // Ed2k Vertical Box Sizer m_ed2kSBox = new wxStaticBox (m_mainPanel, -1, _("eD2k link")); m_ed2kSBoxSizer = new wxStaticBoxSizer (m_ed2kSBox, wxVERTICAL); // Ed2k results m_ed2kTextCtrl = new wxTextCtrl( m_mainPanel, -1, wxEmptyString, wxDefaultPosition, wxSize(-1,60), wxTE_MULTILINE|wxTE_READONLY|wxVSCROLL ); m_ed2kSBoxSizer->Add (m_ed2kTextCtrl, 1, wxALL | wxGROW, 5); m_mainPanelVBox->Add( m_ed2kSBoxSizer, 1, wxALL | wxGROW, 10 ); // Button bar m_buttonHBox = new wxBoxSizer (wxHORIZONTAL); m_startButton = new wxButton (m_mainPanel, ID_START_BUTTON, wxString (_("Start"))); m_saveButton = new wxButton (m_mainPanel, ID_SAVEAS_BUTTON, wxString (_("Save"))); m_copyButton = new wxButton (m_mainPanel, ID_COPY_BUTTON, wxString (_("Copy to clipboard"))); m_closeButton = new wxButton (m_mainPanel, ID_EXIT_BUTTON, wxString (_("Exit"))); m_buttonHBox->Add (m_copyButton, 0, wxALIGN_LEFT | wxALL, 5); m_buttonHBox->Add(1,1,1); m_buttonHBox->Add (m_startButton, 0, wxALIGN_RIGHT | wxALL, 5); m_buttonHBox->Add (m_saveButton, 0, wxALIGN_RIGHT | wxALL, 5); m_buttonHBox->Add (m_closeButton, 0, wxALIGN_RIGHT | wxALL, 5); m_mainPanelVBox->Add (m_buttonHBox, 0, wxALL | wxGROW, 5); // Toolbar Pixmaps m_toolBarBitmaps[0] = AlcPix::getPixmap(wxT("open")); m_toolBarBitmaps[1] = AlcPix::getPixmap(wxT("copy")); m_toolBarBitmaps[2] = AlcPix::getPixmap(wxT("saveas")); m_toolBarBitmaps[3] = AlcPix::getPixmap(wxT("about")); // Constructing toolbar m_toolbar = new wxToolBar (this, -1, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL | wxTB_FLAT); m_toolbar->SetToolBitmapSize (wxSize (32, 32)); m_toolbar->SetMargins (2, 2); m_toolbar->AddTool (ID_BAR_OPEN, _("Open"), m_toolBarBitmaps[0], _("Open a file to compute its eD2k link")); m_toolbar->AddTool (ID_BAR_COPY, _("Copy"), m_toolBarBitmaps[1], _("Copy computed eD2k link to clipboard")); m_toolbar->AddTool (ID_BAR_SAVEAS, _("Save as"), m_toolBarBitmaps[2], _("Save computed eD2k link to file")); m_toolbar->AddSeparator (); m_toolbar->AddTool (ID_BAR_ABOUT, _("About"), m_toolBarBitmaps[3], _("About aLinkCreator")); m_toolbar->Realize (); SetToolBar (m_toolbar); // Main panel Layout m_mainPanel->SetAutoLayout(true); m_mainPanel->SetSizerAndFit (m_mainPanelVBox); // Frame Layout m_frameVBox->Add (m_mainPanel, 1, wxALL | wxGROW, 0); SetAutoLayout (true); SetSizerAndFit (m_frameVBox); m_startButton->SetFocus(); } /// Destructor AlcFrame::~AlcFrame () {} /// Events table BEGIN_EVENT_TABLE (AlcFrame, wxFrame) EVT_TOOL (ID_BAR_OPEN, AlcFrame::OnBarOpen) EVT_TOOL (ID_BAR_SAVEAS, AlcFrame::OnBarSaveAs) EVT_TOOL (ID_BAR_COPY, AlcFrame::OnBarCopy) EVT_TOOL (ID_BAR_ABOUT, AlcFrame::OnBarAbout) EVT_BUTTON (ID_START_BUTTON, AlcFrame::OnStartButton) EVT_BUTTON (ID_EXIT_BUTTON, AlcFrame::OnCloseButton) EVT_BUTTON (ID_SAVEAS_BUTTON, AlcFrame::OnSaveAsButton) EVT_BUTTON (ID_COPY_BUTTON, AlcFrame::OnCopyButton) EVT_BUTTON (ID_BROWSE_BUTTON, AlcFrame::OnBrowseButton) EVT_BUTTON (ID_ADD_BUTTON, AlcFrame::OnAddUrlButton) EVT_BUTTON (ID_REMOVE_BUTTON, AlcFrame::OnRemoveUrlButton) EVT_BUTTON (ID_CLEAR_BUTTON, AlcFrame::OnClearUrlButton) END_EVENT_TABLE () /// Toolbar Open button void AlcFrame::OnBarOpen (wxCommandEvent & WXUNUSED(event)) { SetFileToHash(); } /// Browse button to select file to hash void AlcFrame::OnBrowseButton (wxCommandEvent & WXUNUSED(event)) { SetFileToHash(); } /// Set File to hash in wxTextCtrl void AlcFrame::SetFileToHash() { #ifdef __WXMSW__ wxString browseroot; LPITEMIDLIST pidl; HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl); if (SUCCEEDED(hr)) { if (!SHGetPathFromIDList(pidl, wxStringBuffer(browseroot, MAX_PATH))) { browseroot = wxFileName::GetHomeDir(); } } else { browseroot = wxFileName::GetHomeDir(); } if (pidl) { LPMALLOC pMalloc; SHGetMalloc(&pMalloc); if (pMalloc) { pMalloc->Free(pidl); pMalloc->Release(); } } #elif defined(__WXMAC__) FSRef fsRef; wxString browseroot; if (FSFindFolder(kUserDomain, kDocumentsFolderType, kCreateFolder, &fsRef) == noErr) { CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); CFStringRef cfString = CFURLCopyFileSystemPath(urlRef, kCFURLPOSIXPathStyle); CFRelease(urlRef) ; #if wxCHECK_VERSION(2, 9, 0) browseroot = wxCFStringRef(cfString).AsString(wxLocale::GetSystemEncoding()); #else browseroot = wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding()); #endif } else { browseroot = wxFileName::GetHomeDir(); } #else wxString browseroot = wxFileName::GetHomeDir(); #endif const wxString & filename = wxFileSelector (_("Select the file you want to compute the eD2k link"), browseroot, wxEmptyString, wxEmptyString, wxT("*.*"), wxFD_OPEN | wxFD_FILE_MUST_EXIST, this); if (!filename.empty ()) { m_inputFileTextCtrl->SetValue(filename); } } /// Toolbar Save As button void AlcFrame::OnBarSaveAs (wxCommandEvent & WXUNUSED(event)) { SaveEd2kLinkToFile(); } /// Save As button void AlcFrame::OnSaveAsButton(wxCommandEvent & WXUNUSED(event)) { SaveEd2kLinkToFile(); } /// Copy Ed2k link to clip board void AlcFrame::CopyEd2kLinkToClipBoard() { wxString link = m_ed2kTextCtrl->GetValue(); if (!link.IsEmpty()) { wxClipboardLocker clipLocker; if ( !clipLocker ) { wxLogError(_("Can't open the clipboard")); return; } wxTheClipboard->AddData(new wxTextDataObject(link)); } else { SetStatusText (_("Nothing to copy for now !")); } } /// Copy button void AlcFrame::OnCopyButton(wxCommandEvent & WXUNUSED(event)) { CopyEd2kLinkToClipBoard(); } /// Toolbar Copy button void AlcFrame::OnBarCopy(wxCommandEvent & WXUNUSED(event)) { CopyEd2kLinkToClipBoard(); } /// Save computed Ed2k link to file void AlcFrame::SaveEd2kLinkToFile() { wxString link(m_ed2kTextCtrl->GetValue()); if (!link.IsEmpty()) { const wxString & filename = wxFileSelector (_("Select the file to your computed eD2k link"), wxFileName::GetHomeDir(),wxT("my_ed2k_link"), wxT("txt"), wxT("*.txt"), wxFD_SAVE, this); if (!filename.empty ()) { // Open file and let wxFile destructor close the file // Closing it explicitly may crash on Win32 ... wxFile file(filename,wxFile::write_append); if (! file.IsOpened()) { SetStatusText (_("Unable to open ") + filename); return; } file.Write(link + wxTextFile::GetEOL()); } else { SetStatusText (_("Please, enter a non empty file name")); } } else { SetStatusText (_("Nothing to save for now !")); } } /// Toolbar About button void AlcFrame::OnBarAbout (wxCommandEvent & WXUNUSED(event)) { wxMessageBox (_ ("aLinkCreator, the aMule eD2k link creator\n\n(c) 2004 ThePolish \n\nPixmaps from http://www.everaldo.com and http://www.icomania.com\nand http://jimmac.musichall.cz/ikony.php3\n\nDistributed under GPL"), _("About aLinkCreator"), wxOK | wxCENTRE | wxICON_INFORMATION); } /// Close Button void AlcFrame::OnCloseButton (wxCommandEvent & WXUNUSED(event)) { Close (false); } /// Hook into MD4/ED2K routine bool AlcFrame::Hook(int percent) { // Update progress bar bool goAhead = ::wxGetApp().GetMainFrame()->m_progressBar->Update(percent); if (!goAhead) { // Destroying progressbar: no merci for croissants ! ::wxGetApp().GetMainFrame()->m_progressBar->Destroy(); // Now, be paranoid delete ::wxGetApp().GetMainFrame()->m_progressBar; ::wxGetApp().GetMainFrame()->m_progressBar = NULL; } return (goAhead); } /// Compute Hashes on Start Button void AlcFrame::OnStartButton (wxCommandEvent & WXUNUSED(event)) { size_t i; wxString filename = m_inputFileTextCtrl->GetValue(); if (!filename.empty ()) { // Initialize computation m_goAhead=true; // Chrono wxStopWatch chrono; // wxFileName needed for base name wxFileName fileToHash(filename); // Set waiting msg m_e2kHashTextCtrl->SetValue(_("Hashing...")); m_ed2kTextCtrl->SetValue(_("Hashing...")); #ifdef WANT_MD4SUM // Create MD4 progress bar dialog m_progressBar=new wxProgressDialog (_("aLinkCreator is working for you"), _("Computing MD4 Hash..."), 100, this, wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_REMAINING_TIME); m_md4HashTextCtrl->SetValue(_("Hashing...")); // Md4 hash MD4 md4; m_md4HashTextCtrl->SetValue(md4.calcMd4FromFile(filename,Hook)); // Deleting MD4 progress bar dialog delete m_progressBar; m_progressBar=NULL; #endif // Create ED2K progress bar dialog m_progressBar=new wxProgressDialog (_("aLinkCreator is working for you"), _("Computing eD2k Hashes..."), 100, this, wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_REMAINING_TIME); // Compute ed2k Hash Ed2kHash hash; // Test the return value to see if was aborted. if (hash.SetED2KHashFromFile(filename, Hook)) { wxArrayString ed2kHash (hash.GetED2KHash()); // Get URLs wxArrayString arrayOfUrls; wxString url; for (i=0;i < m_inputUrlListBox->GetCount();++i) { url=m_inputUrlListBox->GetString(i); if (url.Right(1) == wxT("/")) { url += fileToHash.GetFullName(); } arrayOfUrls.Add(wxURI(url).BuildURI()); } arrayOfUrls.Shrink(); // Reduce memory usage // Ed2k hash m_e2kHashTextCtrl->SetValue(ed2kHash.Last()); // Ed2k link m_ed2kTextCtrl->SetValue(hash.GetED2KLink(m_parthashesCheck->IsChecked(), &arrayOfUrls)); } else { // Set cancelled msg m_e2kHashTextCtrl->SetValue(_("Cancelled !")); m_ed2kTextCtrl->SetValue(_("Cancelled !")); } // Deleting progress bar dialog delete m_progressBar; m_progressBar=NULL; // Set status text SetStatusText (wxString::Format(_("Done in %.2f s"), chrono.Time()*.001)); } else { // Set status text SetStatusText (_("Please, enter a non empty file name")); } } /// Add an URL to the URL list box void AlcFrame::OnAddUrlButton (wxCommandEvent & WXUNUSED(event)) { wxString url(m_inputAddTextCtrl->GetValue()); if (!url.IsEmpty()) { // Check if the URL already exist in list size_t i; bool UrlNotExists = true; for (i=0;i < m_inputUrlListBox->GetCount();++i) { if (url == m_inputUrlListBox->GetString(i)) { UrlNotExists =false; break; } } // Add only a not already existant URL if (UrlNotExists) { m_inputUrlListBox->Append(wxURI(url).BuildURI()); m_inputAddTextCtrl->SetValue(wxEmptyString); } else { wxLogError(_("You have already added this URL !")); } } else { SetStatusText (_("Please, enter a non empty URL")); } } /// Remove the selected URL from the URL list box void AlcFrame::OnRemoveUrlButton (wxCommandEvent & WXUNUSED(event)) { m_inputUrlListBox->Delete(m_inputUrlListBox->GetSelection()); } /// Clear the URL list box void AlcFrame::OnClearUrlButton (wxCommandEvent & WXUNUSED(event)) { m_inputUrlListBox->Clear(); } // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/ed2khash.h0000644000175000017470000000450411575347521020437 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: Ed2kHash Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _ED2KHASH_H #define _ED2KHASH_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include "md4.h" class Ed2kHash:public MD4 { private: wxArrayString m_ed2kArrayOfHashes; wxString m_filename; uint64_t m_fileSize; protected: /// Strip all non-alphanumeric characters of a filename string wxString CleanFilename(const wxString& filename); public: /// Constructor Ed2kHash (); /// Destructor ~Ed2kHash (); /// Set Ed2k hash from a file bool SetED2KHashFromFile(const wxFileName& filename, MD4Hook hook); /// Set Ed2k hash from a file bool SetED2KHashFromFile(const wxString& filename, MD4Hook hook); /// Get Ed2k Array of hashes wxArrayString GetED2KHash(); /// Get Ed2k link wxString GetED2KLink(const bool addPartHashes=false, const wxArrayString* arrayOfUrls = NULL); }; #endif /* _ED2KHASH_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/Makefile.in0000644000175000017470000011014011657306262020632 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) @ALC_TRUE@am__append_1 = alc @ALCC_TRUE@am__append_2 = alcc @NEED_RC_TRUE@am__append_3 = alcrc.$(OBJEXT) subdir = src/utils/aLinkCreator/src DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @ALC_TRUE@am__EXEEXT_1 = alc$(EXEEXT) @ALCC_TRUE@am__EXEEXT_2 = alcc$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_alc_OBJECTS = alc-alc.$(OBJEXT) alc-alcframe.$(OBJEXT) \ alc-ed2khash.$(OBJEXT) alc-alcpix.$(OBJEXT) alc-md4.$(OBJEXT) alc_OBJECTS = $(am_alc_OBJECTS) am__DEPENDENCIES_1 = alc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_3) alc_LINK = $(CXXLD) $(alc_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ am_alcc_OBJECTS = alcc-alcc.$(OBJEXT) alcc-ed2khash.$(OBJEXT) \ alcc-md4.$(OBJEXT) @NEED_RC_TRUE@nodist_alcc_OBJECTS = alcc-version.$(OBJEXT) alcc_OBJECTS = $(am_alcc_OBJECTS) $(nodist_alcc_OBJECTS) alcc_DEPENDENCIES = $(am__DEPENDENCIES_1) alcc_LINK = $(CXXLD) $(alcc_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(alc_SOURCES) $(alcc_SOURCES) $(nodist_alcc_SOURCES) DIST_SOURCES = $(alc_SOURCES) $(alcc_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_LDFLAGS = $(MULELDFLAGS) alc_SOURCES = alc.cpp \ alcframe.cpp \ ed2khash.cpp \ alcpix.cpp \ md4.cpp noinst_HEADERS = alc.h \ alcc.h \ alcframe.h \ ed2khash.h \ alcpix.h \ md4.h \ bithelp.h alc_CPPFLAGS = $(MULECPPFLAGS) $(WX_CPPFLAGS) alc_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) alc_LDADD = $(WX_LIBS) $(am__append_3) alcc_SOURCES = alcc.cpp \ ed2khash.cpp \ md4.cpp alcc_CPPFLAGS = $(MULECPPFLAGS) $(WXBASE_CPPFLAGS) alcc_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) alcc_LDADD = $(WXBASE_LIBS) # Resources @NEED_RC_TRUE@SUFFIXES = .rc @NEED_RC_TRUE@nodist_alcc_SOURCES = alcc-version.rc @NEED_RC_TRUE@CLEANFILES = *-version.rc MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .rc .$(OBJEXT) .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/aLinkCreator/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/aLinkCreator/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ 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)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) alc$(EXEEXT): $(alc_OBJECTS) $(alc_DEPENDENCIES) @rm -f alc$(EXEEXT) $(AM_V_CXXLD)$(alc_LINK) $(alc_OBJECTS) $(alc_LDADD) $(LIBS) alcc$(EXEEXT): $(alcc_OBJECTS) $(alcc_DEPENDENCIES) @rm -f alcc$(EXEEXT) $(AM_V_CXXLD)$(alcc_LINK) $(alcc_OBJECTS) $(alcc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alcframe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-alcpix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-ed2khash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alc-md4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-alcc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-ed2khash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alcc-md4.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` alc-alc.o: alc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alc.o -MD -MP -MF $(DEPDIR)/alc-alc.Tpo -c -o alc-alc.o `test -f 'alc.cpp' || echo '$(srcdir)/'`alc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alc.Tpo $(DEPDIR)/alc-alc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alc.cpp' object='alc-alc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alc.o `test -f 'alc.cpp' || echo '$(srcdir)/'`alc.cpp alc-alc.obj: alc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alc.obj -MD -MP -MF $(DEPDIR)/alc-alc.Tpo -c -o alc-alc.obj `if test -f 'alc.cpp'; then $(CYGPATH_W) 'alc.cpp'; else $(CYGPATH_W) '$(srcdir)/alc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alc.Tpo $(DEPDIR)/alc-alc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alc.cpp' object='alc-alc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alc.obj `if test -f 'alc.cpp'; then $(CYGPATH_W) 'alc.cpp'; else $(CYGPATH_W) '$(srcdir)/alc.cpp'; fi` alc-alcframe.o: alcframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcframe.o -MD -MP -MF $(DEPDIR)/alc-alcframe.Tpo -c -o alc-alcframe.o `test -f 'alcframe.cpp' || echo '$(srcdir)/'`alcframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alcframe.Tpo $(DEPDIR)/alc-alcframe.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcframe.cpp' object='alc-alcframe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcframe.o `test -f 'alcframe.cpp' || echo '$(srcdir)/'`alcframe.cpp alc-alcframe.obj: alcframe.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcframe.obj -MD -MP -MF $(DEPDIR)/alc-alcframe.Tpo -c -o alc-alcframe.obj `if test -f 'alcframe.cpp'; then $(CYGPATH_W) 'alcframe.cpp'; else $(CYGPATH_W) '$(srcdir)/alcframe.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alcframe.Tpo $(DEPDIR)/alc-alcframe.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcframe.cpp' object='alc-alcframe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcframe.obj `if test -f 'alcframe.cpp'; then $(CYGPATH_W) 'alcframe.cpp'; else $(CYGPATH_W) '$(srcdir)/alcframe.cpp'; fi` alc-ed2khash.o: ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-ed2khash.o -MD -MP -MF $(DEPDIR)/alc-ed2khash.Tpo -c -o alc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-ed2khash.Tpo $(DEPDIR)/alc-ed2khash.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alc-ed2khash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp alc-ed2khash.obj: ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-ed2khash.obj -MD -MP -MF $(DEPDIR)/alc-ed2khash.Tpo -c -o alc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-ed2khash.Tpo $(DEPDIR)/alc-ed2khash.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alc-ed2khash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` alc-alcpix.o: alcpix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcpix.o -MD -MP -MF $(DEPDIR)/alc-alcpix.Tpo -c -o alc-alcpix.o `test -f 'alcpix.cpp' || echo '$(srcdir)/'`alcpix.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alcpix.Tpo $(DEPDIR)/alc-alcpix.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcpix.cpp' object='alc-alcpix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcpix.o `test -f 'alcpix.cpp' || echo '$(srcdir)/'`alcpix.cpp alc-alcpix.obj: alcpix.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-alcpix.obj -MD -MP -MF $(DEPDIR)/alc-alcpix.Tpo -c -o alc-alcpix.obj `if test -f 'alcpix.cpp'; then $(CYGPATH_W) 'alcpix.cpp'; else $(CYGPATH_W) '$(srcdir)/alcpix.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-alcpix.Tpo $(DEPDIR)/alc-alcpix.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcpix.cpp' object='alc-alcpix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-alcpix.obj `if test -f 'alcpix.cpp'; then $(CYGPATH_W) 'alcpix.cpp'; else $(CYGPATH_W) '$(srcdir)/alcpix.cpp'; fi` alc-md4.o: md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-md4.o -MD -MP -MF $(DEPDIR)/alc-md4.Tpo -c -o alc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-md4.Tpo $(DEPDIR)/alc-md4.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alc-md4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp alc-md4.obj: md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -MT alc-md4.obj -MD -MP -MF $(DEPDIR)/alc-md4.Tpo -c -o alc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alc-md4.Tpo $(DEPDIR)/alc-md4.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alc-md4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alc_CPPFLAGS) $(CPPFLAGS) $(alc_CXXFLAGS) $(CXXFLAGS) -c -o alc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` alcc-alcc.o: alcc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-alcc.o -MD -MP -MF $(DEPDIR)/alcc-alcc.Tpo -c -o alcc-alcc.o `test -f 'alcc.cpp' || echo '$(srcdir)/'`alcc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-alcc.Tpo $(DEPDIR)/alcc-alcc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcc.cpp' object='alcc-alcc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-alcc.o `test -f 'alcc.cpp' || echo '$(srcdir)/'`alcc.cpp alcc-alcc.obj: alcc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-alcc.obj -MD -MP -MF $(DEPDIR)/alcc-alcc.Tpo -c -o alcc-alcc.obj `if test -f 'alcc.cpp'; then $(CYGPATH_W) 'alcc.cpp'; else $(CYGPATH_W) '$(srcdir)/alcc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-alcc.Tpo $(DEPDIR)/alcc-alcc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='alcc.cpp' object='alcc-alcc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-alcc.obj `if test -f 'alcc.cpp'; then $(CYGPATH_W) 'alcc.cpp'; else $(CYGPATH_W) '$(srcdir)/alcc.cpp'; fi` alcc-ed2khash.o: ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-ed2khash.o -MD -MP -MF $(DEPDIR)/alcc-ed2khash.Tpo -c -o alcc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-ed2khash.Tpo $(DEPDIR)/alcc-ed2khash.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alcc-ed2khash.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-ed2khash.o `test -f 'ed2khash.cpp' || echo '$(srcdir)/'`ed2khash.cpp alcc-ed2khash.obj: ed2khash.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-ed2khash.obj -MD -MP -MF $(DEPDIR)/alcc-ed2khash.Tpo -c -o alcc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-ed2khash.Tpo $(DEPDIR)/alcc-ed2khash.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ed2khash.cpp' object='alcc-ed2khash.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-ed2khash.obj `if test -f 'ed2khash.cpp'; then $(CYGPATH_W) 'ed2khash.cpp'; else $(CYGPATH_W) '$(srcdir)/ed2khash.cpp'; fi` alcc-md4.o: md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-md4.o -MD -MP -MF $(DEPDIR)/alcc-md4.Tpo -c -o alcc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-md4.Tpo $(DEPDIR)/alcc-md4.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alcc-md4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-md4.o `test -f 'md4.cpp' || echo '$(srcdir)/'`md4.cpp alcc-md4.obj: md4.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -MT alcc-md4.obj -MD -MP -MF $(DEPDIR)/alcc-md4.Tpo -c -o alcc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/alcc-md4.Tpo $(DEPDIR)/alcc-md4.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='md4.cpp' object='alcc-md4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(alcc_CPPFLAGS) $(CPPFLAGS) $(alcc_CXXFLAGS) $(CXXFLAGS) -c -o alcc-md4.obj `if test -f 'md4.cpp'; then $(CYGPATH_W) 'md4.cpp'; else $(CYGPATH_W) '$(srcdir)/md4.cpp'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags 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 uninstall \ uninstall-am uninstall-binPROGRAMS @NEED_RC_TRUE@.rc.$(OBJEXT): @NEED_RC_TRUE@ $(RC) $(MULERCFLAGS) -I$(top_srcdir) $(RCFLAGS) -O COFF -i "$<" -o "$@" @NEED_RC_TRUE@alcrc.$(OBJEXT): $(srcdir)/../alc.rc alc-version.rc @NEED_RC_TRUE@ cat $^ | \ @NEED_RC_TRUE@ ( \ @NEED_RC_TRUE@ abs_builddir=`pwd` ; \ @NEED_RC_TRUE@ abs_top_srcdir=`cd $(top_srcdir) ; pwd` ; \ @NEED_RC_TRUE@ cd $( "$@" @NEED_RC_TRUE@alcc-version.rc: $(top_builddir)/version.rc @NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"aMule Link Creator, Console"/' \ @NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"alcc"/' \ @NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"alcc$(EXEEXT)"/' "$<" > "$@" # 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: aMule-2.3.1/src/utils/aLinkCreator/src/alc.cpp0000644000175000017470000000377211575347521020046 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: Alc Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifdef HAVE_CONFIG_H #include "config.h" // Needed for PACKAGE #else #define PACKAGE "amule" #endif #include "alc.h" // Application implementation IMPLEMENT_APP (alc) bool alc::OnInit () { // Used to tell alc to use aMule catalog m_locale.Init(); m_locale.AddCatalog(wxT(PACKAGE)); m_alcFrame = new AlcFrame (_("aLinkCreator, the aMule eD2k link creator")); m_alcFrame->Show (true); SetTopWindow (m_alcFrame); return true; } AlcFrame *alc::GetMainFrame() { return (m_alcFrame); } // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alcc.cpp0000644000175000017470000000774611575347521020216 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: Main wxBase App /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #ifdef HAVE_CONFIG_H #include "config.h" // Needed for PACKAGE #else #define PACKAGE "amule" #endif #include "alcc.h" #include "ed2khash.h" // Application implementation IMPLEMENT_APP (alcc) /// Running Alcc int alcc::OnRun () { // Used to tell alcc to use aMule catalog m_locale.Init(); m_locale.AddCatalog(wxT(PACKAGE)); wxLog::DontCreateOnDemand(); wxLogStderr * stderrLog = new wxLogStderr; wxLogStderr * stdoutLog = new wxLogStderr(stdout); delete wxLog::SetActiveTarget(stderrLog); // Log on Stderr #if wxCHECK_VERSION(2, 9, 0) wxLog::SetTimestamp(""); // Disable timestamp on messages #else wxLog::SetTimestamp(NULL); // Disable timestamp on messages #endif Ed2kHash hash; size_t i; for (i=0;i<(m_filesToHash.GetCount());++i) { if (wxFileExists(m_filesToHash[i])) { if (m_flagVerbose) { wxLogMessage(_("Processing file number %u: %s"),i+1,m_filesToHash[i].c_str()); if (m_flagPartHashes) { wxLogMessage(_("You have asked for part hashes (Only used for files > 9.5 MB)")); } } if (hash.SetED2KHashFromFile(m_filesToHash[i], NULL)) { // Print the link to stdout wxLog::SetActiveTarget(stdoutLog); wxLogMessage(wxT("%s"), hash.GetED2KLink(m_flagPartHashes).c_str()); // Everything else goes to stderr wxLog::SetActiveTarget(stderrLog); } } else { if (m_flagVerbose) { wxLogMessage(_("%s ---> Non existant file !\n"),m_filesToHash[i].c_str()); } } } return 0; } // On exit int alcc::OnExit() { delete wxLog::SetActiveTarget(NULL); return 0; } /// Parse command line void alcc::OnInitCmdLine(wxCmdLineParser& cmdline) { cmdline.AddSwitch(wxT("h"), wxT("help"), wxT("show this help message"), wxCMD_LINE_OPTION_HELP); cmdline.AddSwitch(wxT("v"), wxT("verbose"), wxT("be verbose")); cmdline.AddSwitch(wxT("p"), wxT("parthashes"), wxT("add part-hashes to ed2k link")); cmdline.AddParam(wxT("input files"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE); } /// Command line preocessing bool alcc::OnCmdLineParsed(wxCmdLineParser& cmdline) { wxFileName filename; size_t i; m_flagVerbose = cmdline.Found(wxT("v")); m_flagPartHashes = cmdline.Found(wxT("p")); m_filesToHash.Clear(); for (i = 0; i < cmdline.GetParamCount(); ++i) { filename.Assign(cmdline.GetParam(i)); m_filesToHash.Add(filename.GetFullPath()); } m_filesToHash.Shrink(); return true; } // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alc.h0000644000175000017470000000351211575347521017503 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: Alc Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _ALC_H #define _ALC_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "alcframe.h" /// Application class alc:public wxApp { private: AlcFrame *m_alcFrame; protected: wxLocale m_locale; // Used to tell wxCas to use aMule catalog public: virtual bool OnInit (); AlcFrame *GetMainFrame(); }; DECLARE_APP (alc) #endif /* _ALC_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/ed2khash.cpp0000644000175000017470000001671211575347521020776 0ustar topiusers//////////////////////////////////////////////////////////////////////////////// /// Name: Ed2kHash Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include #include #include "ed2khash.h" // efe, sorry for that, i have not enough time to do the right thing now, but // please, create a file called like unicodestuff.h and put this. Include in // alcc.c and here. And remove this stupid comment :) //----------------------------------------------------------------------------- // efe, this can be put in a separete include file, if you want to reuse static wxCSConv aMuleConv(wxS("iso8859-1")); #ifdef wxUSE_UNICODE #define unicode2char(x) (const char*) aMuleConv.cWX2MB(x) #define char2unicode(x) aMuleConv.cMB2WX(x) #else #define unicode2char(x) x.c_str() #define char2unicode(x) x #endif //----------------------------------------------------------------------------- /// Constructor Ed2kHash::Ed2kHash():MD4() { m_ed2kArrayOfHashes.Clear(); m_filename.Clear(); m_fileSize=0; } /// Destructor Ed2kHash::~Ed2kHash() {} /// Set Ed2k hash from a file // returns false if aborted bool Ed2kHash::SetED2KHashFromFile(const wxFileName& filename, MD4Hook hook) { // Open file and let wxFFile destructor close the file // Closing it explicitly may crash on Win32 ... wxFFile file(filename.GetFullPath(), wxT("rbS")); if (! file.IsOpened()) { wxLogError (_("Unable to open %s"),unicode2char(filename.GetFullPath())); return (false); } else { unsigned char ret[MD4_HASHLEN_BYTE]; MD4Context hdc; size_t read; size_t partcount; size_t dataread; wxFileOffset totalread; char *buf = new char[BUFSIZE]; bool goAhead = true; #ifdef WANT_STRING_IMPLEMENTATION wxString tmpHash(wxEmptyString); #else unsigned char* tmpCharHash = NULL; #endif // Clear Ed2k Hash m_ed2kArrayOfHashes.Clear(); // Processing each block totalread=0; partcount = 0; while (!file.Eof()) { dataread = 0; MD4Init(&hdc); while (dataread < PARTSIZE && !file.Eof()) { if (hook) { goAhead = hook((int)((double)(100.0 * totalread) / file.Length())); } if (goAhead) { if ((dataread + BUFSIZE) > PARTSIZE) { read = file.Read(buf, PARTSIZE - dataread); } else { read = file.Read(buf, BUFSIZE); } dataread += read; totalread += read; MD4Update(&hdc, reinterpret_cast(buf), read); } else { return (false); } } MD4Final(&hdc, ret); // Add part-hash m_ed2kArrayOfHashes.Add(charToHex(reinterpret_cast(ret), MD4_HASHLEN_BYTE)); partcount++; #ifdef WANT_STRING_IMPLEMENTATION // MD4_HASHLEN_BYTE is ABSOLUTLY needed as we dont want NULL // character to be interpreted as the end of the parthash string #if wxUSE_UNICODE tmpHash += wxString(reinterpret_cast(ret),MD4_HASHLEN_BYTE); #else tmpHash += wxString(reinterpret_cast(ret),MD4_HASHLEN_BYTE); #endif #else tmpCharHash = (unsigned char*)realloc(tmpCharHash, sizeof(unsigned char) * (MD4_HASHLEN_BYTE * partcount)); memcpy ( tmpCharHash + MD4_HASHLEN_BYTE * (partcount - 1), ret, MD4_HASHLEN_BYTE ); #endif } delete [] buf; // hash == hash of concatenned parthashes if (partcount > 1) { wxString finalHash; #ifdef WANT_STRING_IMPLEMENTATION finalHash=calcMd4FromString(tmpHash); #else MD4Init(&hdc); MD4Update(&hdc, tmpCharHash, MD4_HASHLEN_BYTE * partcount); MD4Final(&hdc, ret); finalHash = charToHex(reinterpret_cast(ret), MD4_HASHLEN_BYTE); #endif m_ed2kArrayOfHashes.Add(finalHash); } #ifndef WANT_STRING_IMPLEMENTATION free(tmpCharHash); tmpCharHash=NULL; #endif m_ed2kArrayOfHashes.Shrink(); // Set members m_fileSize = file.Length(); m_filename = filename.GetFullName(); return true; } } /// Set Ed2k hash from a file bool Ed2kHash::SetED2KHashFromFile(const wxString& filename, MD4Hook hook) { return SetED2KHashFromFile(wxFileName(filename), hook); } #if wxCHECK_VERSION(2, 9, 0) #define WXLONGLONGFMTSPEC wxT(wxLongLongFmtSpec) #else #define WXLONGLONGFMTSPEC wxLongLongFmtSpec #endif /// Get Ed2k link wxString Ed2kHash::GetED2KLink(const bool addPartHashes, const wxArrayString* arrayOfUrls) { // Constructing ed2k basic link wxString ed2kLink = wxT("ed2k://|file|") + CleanFilename(m_filename) + wxString::Format(wxT("|%") WXLONGLONGFMTSPEC wxT("u|"), m_fileSize) + m_ed2kArrayOfHashes.Last() + wxT("|"); // Add optional URLs if ( arrayOfUrls && !arrayOfUrls->IsEmpty()) { size_t i; for ( i = 0; i < arrayOfUrls->GetCount(); i++ ) { ed2kLink += wxT("s=") + (*arrayOfUrls)[i] + wxT("|"); } } // Add Optional part-hashes if (addPartHashes && m_ed2kArrayOfHashes.GetCount()>1) { ed2kLink += wxT("p="); size_t i; for (i=0;i<(m_ed2kArrayOfHashes.GetCount()-1);++i) { ed2kLink += m_ed2kArrayOfHashes[i] + wxT(":"); } ed2kLink.RemoveLast(); // Remove last : ed2kLink += wxT("|"); } // Add last slash ed2kLink += wxT("/"); return ed2kLink; } /// Strip all non-alphanumeric characters of a filename string wxString Ed2kHash::CleanFilename(const wxString& filename) { wxString name(filename); wxRegEx toStrip(wxT("[^[:alnum:]_.-]")); toStrip.Replace(&name, wxT("_")); return (name); } /// Get Ed2k Array of hashes wxArrayString Ed2kHash::GetED2KHash() { return (m_ed2kArrayOfHashes); } // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alcpix.cpp0000644000175000017470000020700711575347521020564 0ustar topiusers////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// Name: AlcPix Class /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// Pixmaps from http://jimmac.musichall.cz/ikony.php3 | http://www.everaldo.com | http://www.icomania.com /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "alcpix.h" wxBitmap AlcPix::getPixmap(const wxString& name) { if (name == wxT("about")) { wxBitmap bitmap(m_about_xpm); return bitmap; } #ifndef __WXMSW__ else if (name == wxT("alc")) { wxBitmap bitmap(m_alc_xpm); return bitmap; } #endif else if (name == wxT("copy")) { wxBitmap bitmap(m_copy_xpm); return bitmap; } else if (name == wxT("open")) { wxBitmap bitmap(m_open_xpm); return bitmap; } else if (name == wxT("saveas")) { wxBitmap bitmap(m_saveas_xpm); return bitmap; } else { return wxNullBitmap; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// Several themes follow. Switch them by CPP macro in alcpix.h /// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef WANT_KDE_THEME const char * AlcPix::m_about_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 251 2", " c black", ". c #890000", "X c #8A0000", "o c #8B0000", "O c #8C0000", "+ c #8D0000", "@ c #8E0000", "# c #8F0000", "$ c #900000", "% c #910000", "& c #920000", "* c #930000", "= c #940000", "- c #950000", "; c #960000", ": c #970000", "> c #980000", ", c #990000", "< c #9A0000", "1 c #9B0000", "2 c #9B0202", "3 c #9C0000", "4 c #9D0000", "5 c #9E0000", "6 c #9F0000", "7 c #9B0909", "8 c #9C0B0B", "9 c #A00000", "0 c #A20000", "q c #A30000", "w c #A40000", "e c #A50000", "r c #A60000", "t c #A70000", "y c #A80000", "u c #A90000", "i c #AA0000", "p c #AB0000", "a c #AC0000", "s c #AD0000", "d c #AE0000", "f c #AF0000", "g c #A90B0B", "h c #AD0909", "j c #B00000", "k c #B10000", "l c #B20000", "z c #B30000", "x c #B40000", "c c #B50000", "v c #B60000", "b c #B70000", "n c #B80000", "m c #B90000", "M c #BA0000", "N c #BB0000", "B c #BB0202", "V c #BC0000", "C c #BD0000", "Z c #BE0000", "A c #BF0000", "S c #C00000", "D c #C10000", "F c #C20000", "G c #C30000", "H c #C40000", "J c #C50000", "K c #C60000", "L c #C70000", "P c #C60F0F", "I c #C80000", "U c #C90000", "Y c #CA0000", "T c #CB0000", "R c #CC0000", "E c #CD0000", "W c #CC0B0B", "Q c #D20000", "! c #D50000", "~ c #D60000", "^ c #D70000", "/ c #D50505", "( c #D20E0E", ") c #D70F0F", "_ c #D80000", "` c #D90000", "' c #DD0000", "] c #D51111", "[ c #D21818", "{ c #D41A1A", "} c #DC1D1D", "| c #C02626", " . c #C62020", ".. c #C72626", "X. c #CF3E3E", "o. c #D22020", "O. c #D42121", "+. c #D92222", "@. c #D92323", "#. c #DA2626", "$. c #DE2121", "%. c #D53030", "&. c #DB3030", "*. c #DD3C3C", "=. c #DF3C3C", "-. c #E10000", ";. c #E20000", ":. c #E30000", ">. c #E30505", ",. c #E40000", "<. c #E30D0D", "1. c #EA0101", "2. c #EA0404", "3. c #E01A1A", "4. c #EC1919", "5. c #F20000", "6. c #F30707", "7. c #F40000", "8. c #F70000", "9. c #F50808", "0. c #F50D0D", "q. c #F80000", "w. c #FA0101", "e. c #FB0000", "r. c #FC0000", "t. c #FD0000", "y. c #FD0101", "u. c #FE0000", "i. c #FE0101", "p. c #FF0202", "a. c #FF0808", "s. c #FE0E0E", "d. c #FF0F0F", "f. c #F41010", "g. c #FF1414", "h. c #FF1818", "j. c #E52020", "k. c #EB2F2F", "l. c #EB3E3E", "z. c #F42020", "x. c #F72E2E", "c. c #FF2020", "v. c #FF2222", "b. c #F82F2F", "n. c #FF2B2B", "m. c #FF2D2D", "M. c #F23030", "N. c #F43030", "B. c #F63030", "V. c #F73232", "C. c #F53E3E", "Z. c #F93030", "A. c #FF3434", "S. c #FF3737", "D. c #F83838", "F. c #DA4B4B", "G. c #D45252", "H. c #DA5252", "J. c #EB4848", "K. c #EC4848", "L. c #F64545", "P. c #FF4343", "I. c #FF4646", "U. c #FB4848", "Y. c #FF4E4E", "T. c #F75858", "R. c #FB5656", "E. c #FF5050", "W. c #FE5252", "Q. c #FF5858", "!. c #FF5A5A", "~. c #EB6F6F", "^. c #F56C6C", "/. c #FA6262", "(. c #FF6060", "). c #FF6666", "_. c #FF6767", "`. c #F96F6F", "'. c #FA6C6C", "]. c #FF6969", "[. c #FF6C6C", "{. c #F97676", "}. c #FF7272", "|. c #FF7676", " X c #FD7A7A", ".X c #FF7B7B", "XX c #FF7E7E", "oX c #D98181", "OX c #E48383", "+X c #E58383", "@X c #E88B8B", "#X c #E88C8C", "$X c #E99292", "%X c #EB9090", "&X c #EE9393", "*X c #ED9C9C", "=X c #F58282", "-X c #FA8181", ";X c #FF8080", ":X c #FF8B8B", ">X c #FD8D8D", ",X c #FF8C8C", ".a.a.a.a.a.a.a.a.a.h..X).a.a.a.a.a.a.a.a.a.a./ # X JXJX", "JXJXf v B g.g.g.g.g.g.g.g.g.[ OXOXx.g.g.g.g.g.g.g.g.g.< # X JXJX", "JXJXJXf f ] c.c.c.c.c.h.h.4.kXHXHXSXm.c.h.c.c.c.c.h.P X X JXJXJX", "JXJXJXJXp f 3.n.m.n.n.m.m.j.HXHXHXHX(.m.m.m.n.m.m.{ X X JXJXJXJX", "JXJXJXJXp p i $.S.A.A.S.A.M.GXHXHXHXW.A.A.S.A.A.O.X X X JXJXJXJX", "JXJXJXJXJXi i e o.P.P.P.I.P.).cXmXXXP.P.I.P.P. .X X X JXJXJXJXJX", "JXJXJXJXJXJXe e q h &.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.%.7 X X X JXJXJXJXJXJX", "JXJXJXJXJXJXJXJXq q 4 g | l.K.Q.Q.K.*.| 8 # X X JXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJX4 4 < < < * * % % % # # X X JXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJX* < * * % # # # JXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX" }; #ifndef __WXMSW__ const char * AlcPix::m_alc_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 142 2", " c #000000", ". c #0C0B00", "X c #0B0B0B", "o c #131313", "O c #121318", "+ c #1A1A1A", "@ c #2D1A00", "# c #292100", "$ c #29251E", "% c #222222", "& c #292929", "* c #323232", "= c #36383B", "- c #393836", "; c #3E3E3E", ": c #5F3F06", "> c #534400", ", c #594400", "< c #584A00", "1 c #6F4700", "2 c #604418", "3 c #7F6F00", "4 c gray26", "5 c #4A4A4A", "6 c #4D4D58", "7 c #505052", "8 c #5A5A5A", "9 c #5B5C63", "0 c #786448", "q c #646464", "w c #696B6F", "e c #747474", "r c #77797D", "t c #7C7C7C", "y c #7C7D82", "u c #995B0A", "i c #9A7700", "p c #8D682E", "a c #AA7900", "s c #9B7F4C", "d c #867C6A", "f c #817D7A", "g c #9A8B00", "h c #A38002", "j c #AC8800", "k c #A59200", "l c #BE8D2D", "z c #B5A200", "x c #97876C", "c c #958873", "v c #9F9079", "b c #B3B272", "n c #BFB97D", "m c #D59700", "M c #C5B500", "N c #E4AA14", "B c #FBB904", "V c #E9AB38", "C c #FCBC20", "Z c #D1AB66", "A c #F0B355", "S c #E0B96A", "D c #D6C500", "F c #D9C300", "G c #DED100", "H c #E4D700", "J c #EDDE00", "K c #F1C500", "L c #FFC604", "P c #FCC90B", "I c #FFD600", "U c #FFDB00", "Y c #FFD81D", "T c #FFCF2A", "R c #FFD32C", "E c #FFD433", "W c #FFD23A", "Q c #F0E500", "! c #FEE300", "~ c #FFE800", "^ c #FDE114", "/ c #FFF000", "( c #FEFB01", ") c #FDFC28", "_ c #FFD541", "` c #FFD64A", "' c #E0E046", "] c #858585", "[ c #83868D", "{ c #86888C", "} c #8B8B8B", "| c #8A8C91", " . c #8E9197", ".. c #939393", "X. c #9B9B9B", "o. c #9D9EA0", "O. c #9FA1A6", "+. c #AB9B82", "@. c #AAA297", "#. c #B6A588", "$. c #BBAC94", "%. c #A3A3A3", "&. c #ABABAB", "*. c #B2B2B2", "=. c #BABABA", "-. c #BCBEC0", ";. c #BFC1C4", ":. c #CBBCA4", ">. c #C6C6A3", ",. c #D9C8AE", "<. c #D8D9BA", "1. c #EBDB9F", "2. c #F9D78E", "3. c #F3D598", "4. c #FDD790", "5. c #FBDE9E", "6. c #EDDEBE", "7. c #FFEAAB", "8. c #F7EAB4", "9. c #FEE6B1", "0. c #FFEBB2", "q. c #FFF1B2", "w. c #C3C3C3", "e. c #C5C5C9", "r. c #CCCCCC", "t. c #CDCFD3", "y. c #D0D0C0", "u. c #D4D4D3", "i. c #D2D2D8", "p. c #DBDBDB", "a. c #EEDFD0", "s. c #EDE7DD", "d. c #FCFBD4", "f. c #FEF8D9", "g. c #E3E3E3", "h. c #E7E9ED", "j. c #EAEAEA", "k. c #E8EBF3", "l. c #F2F2F2", "z. c #F0F1F8", "x. c #FDFDFD", "c. c None", /* pixels */ "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c. X o + o c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c. $ q X.=.r.w.w.&.t * c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.X q w.p.r.=.=.=.w.=.w.=.t + c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c. X t j.x.x.x.u.%.%.X.%.&.&.&...% c.c.c.c.c.c.c.", "c.c.c.c.c.c.c. 7 p.x.x.x.x.x.w.} =.g.x.l.u.%.e X c.c.c.c.c.c.", "c.c.c.c.c.c. o } x.x.x.x.l.=.%.*.x.x.x.x.l.r.] * c.c.c.c.c.c.", "c.c.c.c.c. & X.x.x.x.l.r.e & } ..x.x.j.p.u.} ; c.c.c.c.c.", "c.c.c.c.c. % t x.x.l.g.r.9 6 y } x.j.p.r.w.t * c.c.c.c.c.", "c.c.c.c. o 4 p.x.g.p.y.>.b n f.s.p.t.e.%.5 + c.c.c.c.", "c.c.c.c. + q p.p.e.' ( ( U L A r.*.] 4 % c.c.c.c.", "c.c.c.c. ; r.i.<.) / I C s.h.%.& X c.c.c.c.", "c.c.c.c. X %.x.x.x.d.^ P a.h.g.s.*.& c.c.c.", "c.c. X *.x.x.x.x.x.8.1.k.s.p.u.p.*.% X c.c.c.", "c. X X X X ] x.x.x.x.x.x.k.h.g.i.u.r.w.e...o X X X c.", " o o o o X 4 l.x.x.x.x.x.j.j.g.p.u.r.w.=.=.=.8 X o X ", " X X o o + X X.x.x.x.x.x.l.j.g.p.u.r.e.w.=.*.*...o X X ", " + * h.x.x.x.l.l.j.g.p.t.r.e.w.=.*.&.%.%.5 + ", "c.c.c.c. o e x.x.x.x.l.j.s.p.u.r.w.-.=.*.&.%.%.@.e % c.c.c.c.", "c.c.c.c. o &.x.x.x.l.h.g.p.u.r.y.=.=.*.&.%.%.X...[ % c.c.c.c.", "c.c.c.c. X r.x.x.l.j.s.a.i.t.e.;.=.*.&.&.O.....} } + c.c.c.c.", "c.c.c.c.c.X s.x.l.j.g.p.u.r.e.;.*.*.&.%.O.X.....} } + c.c.c.c.", "c.c.c.c.c.X p.x.h.g.p.i.r.e.-.=.*.&.&.@.......} } 8 c.c.c.c.c.", "c.c.c.c.c.c.6 h.s.p.u.r.e.-.=.*.&.%.o.X.....] ] t o c.c.c.c.c.", "c.c.c.c.c.c.c.9 t.r.;.;.-.=.*.&.%.o.X...{ ] r w O c.c.c.c.c.c.", "c.c.c.c.c.c.u 2 #.,.:.$.@.o.O.X.X.| [ f c v $.v 0 p : c.c.c.c.c.", "c.c.c.c.1 V 4.0.0.0.9.9.3.Z x | } t s S 5.7.7.q.q.7.2.l @ c.c.c.", "c.c.c. m E ` _ _ _ W _ ` T N } .d B R E E E E E E W Y a c.c.", "c.c.c. i U U U ~ U ~ U U U a - = $ j U ~ ~ ~ ~ ~ ~ U K , c.c.", "c.c.c.c. > k D J Q J F k < c. > g M G H D z 3 # c.c.c.", "c.c.c.c.c.c. . . . . c.c.c.c.c.c. . . c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c." }; #endif /* !__WXMSW__ */ const char * AlcPix::m_copy_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 71 1", " c black", ". c #9A99A3", "X c #A1A2B5", "o c #ACACB0", "O c #AEAEB1", "+ c #AFAFB2", "@ c #ACADBE", "# c #ADAFBE", "$ c #B1B0B3", "% c #B2B1B3", "& c #B3B2B4", "* c #B3B3B6", "= c #B4B4B6", "- c #B6B6B7", "; c #B7B7B7", ": c #B2B3C3", "> c #C0BEC3", ", c #C4C3D1", "< c #DBDADF", "1 c #D3D3E3", "2 c #D4D3E3", "3 c #D6D6E4", "4 c #D8D7E6", "5 c #D9D8E7", "6 c #DCDBE0", "7 c #DCDCE1", "8 c #DEDEE2", "9 c #DCDAE8", "0 c #DDDCE9", "q c #DEDDE9", "w c #DFDEEA", "e c #E0DFE4", "r c #E1DFEC", "t c #E1E0E5", "y c #E2E1E5", "u c #E2E1E7", "i c #E4E2E5", "p c #E5E4E6", "a c #E2E1ED", "s c #E3E2ED", "d c #E4E2E8", "f c #E4E3EE", "g c #E5E5E8", "h c #E6E4EF", "j c #E7E6EF", "k c #E8E6E9", "l c #EAEAEA", "z c #E8E7F1", "x c #E9E8F2", "c c #EAE9F3", "v c #ECEAF3", "b c #EEEDF3", "n c #EDECF4", "m c #EEEDF6", "M c #EFEEF6", "N c #F1EFF7", "B c #F2F1F7", "V c #F3F2F8", "C c #F4F3F9", "Z c #F6F4FA", "A c #F6F6FA", "S c #F7F6FA", "D c #F8F7FC", "F c #F9F8FD", "G c #FAF9FD", "H c #FCFAFE", "J c #FDFCFF", "K c #FEFDFF", "L c #FEFEFF", "P c gray100", "I c None", /* pixels */ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII", "I555555555555XIIIIIIIIIIIIIIIIII", "I5PPPPPPPPPP5bXIIIIIIIIIIIIIIIII", "I5PPPPPGZBmM5b@XIIIIIIIIIIIIIIII", "I4PPPPPDZZBM4c0#XIIIIIIIIIIIIIII", "I4PPPPPHHZBM5Pms:XIIIIIIIIIIIIII", "I4PPPPPHHZZMXXXXXX IIIIIIIIIIIII", "I4PPPPPPHDVMMc021X IIIIIIIIIIIII", "I4PPPPPHGDZVba423X.,55555XIIIIII", "I4PPPPPPPDZmh0044X-lPPPP5mXIIIII", "I5PPPPPHGZmzsrr0aX*iZBmm5v#XIIII", "I5PPPPHDGVvjssarhX*iSZBM5b4#XIII", "I5PPPPPDBmzzjjjshX*iGZBM5PMs:XII", "I5PPPPDVmmmcczjjjX-iHSZMXXXXXX I", "I5PPPGVVBmmbczzjcX*pHZVmmz011X I", "I5PPHZVZBmMbMczjcX=pHGZBma423X I", "I4PPGAZVNNMMbczzmX*iPGZmh0055X I", "I4PPGZZZVVMMmcmzmX-pGZmzaa00aX I", "I4PPDAZVVNMMbczzbX%yGBbjhssasX I", "I4PPAZZVNNMMbczzcX*eBmzzhhhshX I", "I4PPZZZVCMMcmzzhbX% c #05389B", ", c #0026A4", "< c #0023AD", "1 c #0029A3", "2 c #002BAA", "3 c #0025B2", "4 c #012AB6", "5 c #032CB8", "6 c #082AB1", "7 c #0033A4", "8 c #0034AA", "9 c #083AAA", "0 c #0632BE", "q c #003DB1", "w c #1038BC", "e c #002EC0", "r c #053AC7", "t c #073CC9", "y c #0936C0", "u c #083FCC", "i c #133EC2", "p c #0344A6", "a c #0D43AE", "s c #0043B7", "d c #0044B8", "f c #064DBB", "g c #0B47B6", "h c #0D4DBA", "j c #0851BE", "k c #1442AC", "l c #1349A4", "z c #1253BF", "x c #1D58BF", "c c #2C4C98", "v c #2F56B0", "b c #2A58B5", "n c #2C5BB8", "m c #305EBA", "M c #3362BE", "N c #0840CD", "B c #0745D3", "V c #0946D4", "C c #094DDB", "Z c #0752C1", "A c #0B54C1", "S c #0950DF", "D c #1A44C3", "F c #1D4CCB", "G c #134CD4", "H c #1D4FD3", "J c #1358C2", "K c #1E53D4", "L c #1F5ADC", "P c #1F65C9", "I c #1C66DF", "U c #1F62E2", "Y c #2758D4", "T c #215ADD", "R c #2361C4", "E c #2366CA", "W c #2A63C2", "Q c #2B6ACB", "! c #2B65DF", "~ c #316FCD", "^ c #3867C2", "/ c #3B6CC5", "( c #3C6FC8", ") c #3472CE", "_ c #3C73CC", "` c #3E79D1", "' c #2262E3", "] c #2865E0", "[ c #2B6CE9", "{ c #316DE3", "} c #306FEA", "| c #386FE0", " . c #3877EC", ".. c #3C7AEA", "X. c #4D5B98", "o. c #596190", "O. c #5C6BAE", "+. c #536FB8", "@. c #606AA4", "#. c #6D77AC", "$. c #757EB3", "%. c #4074CB", "&. c #4379CE", "*. c #447CD1", "=. c #4A7FD4", "-. c #427DED", ";. c #3D80D8", ":. c #7C85B3", ">. c #7F85B8", ",. c #7A8ABE", "<. c #4780D3", "1. c #4A80D3", "2. c #5282D5", "3. c #5389D6", "4. c #518DDB", "5. c #5D8EDC", "6. c #5892DD", "7. c #4582F0", "8. c #4C87F1", "9. c #4D96FA", "0. c #568FE7", "q. c #588DED", "w. c #518DF2", "e. c #5D98E0", "r. c #5F9CEF", "t. c #5590F3", "y. c #509EFF", "u. c #5C96F3", "i. c #55A1FF", "p. c #5BA5FF", "a. c #6391DB", "s. c #7193D4", "d. c #769EDD", "f. c #7899D8", "g. c #639CF5", "h. c #689CF2", "j. c #64AAFF", "k. c #6CA3F6", "l. c #6BAEFF", "z. c #73ACE9", "x. c #70A6F7", "c. c #76A8F5", "v. c #74ABF9", "b. c #7AAAF0", "n. c #7AAFFA", "m. c #7CB4F3", "M. c #79B9FF", "N. c #868BB7", "B. c #848CBA", "V. c #9198AA", "C. c #9FA2AC", "Z. c #A2A4AE", "A. c #A4A8B0", "S. c #ABADB6", "D. c #B3B5BE", "F. c #838CC0", "G. c #8C94C0", "H. c #919BC3", "J. c #979FC9", "K. c #989FC7", "L. c #99A0C4", "P. c #9CA2C8", "I. c #9CAFD4", "U. c #9FB2D6", "Y. c #84AEE2", "T. c #85B7F3", "R. c #81B5FA", "E. c #82B8F3", "W. c #86BCFE", "Q. c #89BDFC", "!. c #A2A9CD", "~. c #A8ADCD", "^. c #ACB3D4", "/. c #B5B5CA", "(. c #BABDC4", "). c #BBBBCD", "_. c #BEBED1", "`. c #B9BEDD", "'. c #86C2FF", "]. c #8DC2FF", "[. c #92C3FD", "{. c #96CBFF", "}. c #99C7F2", "|. c #9CCCFE", " X c #A0C0EC", ".X c #A3C5F2", "XX c #ABCAF3", "oX c #A4D3FD", "OX c #A4DBFF", "+X c #AAD6FB", "@X c #AEDBFF", "#X c #BCCBEB", "$X c #B4CEF2", "%X c #B3D2F3", "&X c #B5D9FF", "*X c #BAD6F5", "=X c #BFDAF3", "-X c #BADDFF", ";X c #ADE1FF", ":X c #B5E4FF", ">X c #BAE4FE", ",X c #BCE9FF", ".2XMXMXMXnXnXcXlXkXjXjXMXF.c # NXNXNX", "NX<.vXiXiXuX,X,X:XU.P.kXMXMXMXnXnXnXnXlXkXkXjXlXaXO.: NXNXNX", "NX*.vXiXiXuX,X%XH.6XMXMXMXMXMXMXnXnXlXlXkXkXjXjXMX^.X. NXNXNX", "NX*.vXiXiXtXU.!.nXMXMXMXMXMXnXnXnXnXlXlXkX#Xs.s.s.f.v > 7 8 7 7 ", "NX*.xXiXiX>XL.MXMXMXMXMXMXMXnXMXnXnXnXnX#Xh _ a.5.5.6.1.1.2.g ; ", "NX*.xXiXiXuXU.6XMXMXMXMXMXMXMXMXnXnXnXaXW =.&XQ.W.Q.[.n.r.0.q # ", "NX` fXiXiXuX6.m <.<.*.*.&.&.&._ _ _ ( F <.-Xj.y.i.y.y.i.U 3 8 ", "NX_ dXiXiX@XZ XX#X8X8X=X*X%X$XXXXXXX XXX-Xl.i.y.y.y.p.{ 5 2 ; ", "NX` dXiXiXz.) mXaXcXmXxXdXiX>X&XoX{.W.M.l.p.y.y.9...i 3 * 2 # ", "NX_ sXiXiXE XmXdX7XvXfXsXtX@X[.M.h.t.7. .{ ! Y i 5 3 & & 2 X ", "NX) sXiXoXZ vXvXxXrX=XsX@XQ.R.x.g.w...} ' T H y 0 e * & < ; ", "NX~ iXiX6.3.MXxXdX,X}.|.{.Q.n.k.u.8...[ ' G r u t e * & 2 = ", "NX) uXiXE XmXdX,XOX{.T.Q.W.c.g.t.7. .U V B V u t e * & 2 O ", "NXQ tX+XJ cXsX>X;XOX{.E.E.R.v.g.w.7.U C S C V u t e * < 1 ", "NXQ tX4.a.sXyXtX>X@XoX{.b.R.c.h.q.| ] U L K F D D w 6 < = ", "NXQ ,XJ $XMXMXMXMXMXnXnXlXhXhXgXwXqX9X9X4X4X1X_.)././.9 + NX", "NXQ m.z MXMXMXMXMXMXMXnXbXkXhXgXwXqX9X9X4X4X4X1X_.).H., . NX", "NXE ;.d.MXMXMXMXMXMXMXnXbXkXhXhXgXwXqX9X4X4X4X1X_.).+.- NX", "NXE j pXMXMXMXMXMXMXMXnXnXbXbXhXgXwXqX9X9X4X4X1X1X).k @ NXNX", "NXs R MXMXMXMXMXMXMXMXMXbXhXgX5X5X3X c #072764", ", c #202254", "< c #232359", "1 c #212F58", "2 c #2A2B5B", "3 c #262954", "4 c #23315A", "5 c #2B325D", "6 c #2F2F64", "7 c #2B3862", "8 c #203C74", "9 c #323B65", "0 c #3E3E70", "q c #3A426B", "w c #33416A", "e c #304B7E", "r c #3A4771", "t c #284479", "y c #42456E", "u c #444C74", "i c #444776", "p c #48567D", "a c #485178", "s c #51537D", "d c #54587E", "f c #4D5C82", "g c #595C83", "h c #555884", "j c #536186", "k c #5A648B", "l c #5B698E", "z c #5A6388", "x c #5E6C90", "c c #526893", "v c #666788", "b c #6B6D94", "n c #616E93", "m c #6C728E", "M c #637194", "N c #65759A", "B c #697699", "V c #6C799B", "C c #6D7193", "Z c #73738D", "A c #74749A", "S c #7C7C93", "D c #7A7B9E", "F c #737799", "G c #6B7EA3", "H c #7D7DA2", "J c #76809F", "K c #7484A4", "L c #7B87A7", "P c #BB4400", "I c #AE6139", "U c #9A6047", "Y c #8F786E", "T c #996C6A", "R c #9C7971", "E c #AB6749", "W c #A6745E", "Q c #B46946", "! c #A77D72", "~ c #B47A61", "^ c #C15414", "/ c #C16C39", "( c #C1703A", ") c #D5742B", "_ c #E67A1C", "` c #E67F27", "' c #C47E52", "] c #C67545", "[ c #AB8876", "{ c #B9A176", "} c #DD8032", "| c #DFA93D", " . c #EC9A00", ".. c #EC9100", "X. c #EE8521", "o. c #FF9A2C", "O. c #FF9F34", "+. c #F79834", "@. c #FFA81F", "#. c #FFBD02", "$. c #FFB908", "%. c #F5BD01", "&. c #FFB719", "*. c #FFBE18", "=. c #F6BD1F", "-. c #FFA321", ";. c #FFA73D", ":. c #FFB12C", ">. c #F8BA36", ",. c #D78853", "<. c #DD9A6E", "1. c #DDB145", "2. c #E6984E", "3. c #FBA444", "4. c #FFB14E", "5. c #FDB058", "6. c #FFB75A", "7. c #EAAE6E", "8. c #EEB472", "9. c #FFBD68", "0. c #F0B86E", "q. c #F7C701", "w. c #FFCA04", "e. c #FFC10D", "r. c #FBC414", "t. c #FFC51B", "y. c #FFDD0F", "u. c #F9D30E", "i. c #FFD314", "p. c #FFC723", "a. c #FFC629", "s. c #FFC92A", "d. c #FFCC33", "f. c #FFCD3A", "g. c #FFD927", "h. c #FDDC3A", "j. c #FEE302", "k. c #FFEB01", "l. c #FFEC0B", "z. c #FFE818", "x. c #FCE117", "c. c #FFED2F", "v. c #FEE828", "b. c #FFF03D", "n. c #FCC545", "m. c #FFCC5C", "M. c #FDD345", "N. c #FDD24D", "B. c #FFD95C", "V. c #FFD556", "C. c #F5C262", "Z. c #FFC16F", "A. c #F7C56B", "S. c #F7CA7F", "D. c #FFC779", "F. c #FFDB68", "G. c #FFD766", "H. c #FFDD71", "J. c #FFD87B", "K. c #FFE651", "L. c #FFF147", "P. c #FFF25F", "I. c #FFF255", "U. c #FFEB68", "Y. c #FFE26D", "T. c #FFE07B", "R. c #FFF46E", "E. c #FFF27B", "W. c #86869B", "Q. c #9A878B", "!. c #8383A4", "~. c #808EAC", "^. c #8A8AA4", "/. c #8C8CAA", "(. c #8494B2", "). c #8B99B6", "_. c #8D97B2", "`. c #9293AD", "'. c #9898A9", "]. c #9595B2", "[. c #949AB4", "{. c #9A9AB4", "}. c #95A2BC", "|. c #9BA5BD", " X c #A68A8E", ".X c #AA9F8B", "XX c #B69897", "oX c #B89E97", "OX c #B29493", "+X c #A0A0AF", "@X c #A3A3B3", "#X c #A2A2BA", "$X c #A8A8BE", "%X c #AAAAB6", "&X c #B9AAB2", "*X c #9F9FC0", "=X c #99A7C0", "-X c #9DAAC2", ";X c #A2AEC5", ":X c #ACACC2", ">X c #A8A8C8", ",X c #A4A4C4", " 8 t e IXIXIXIXIXGX%.k.w.e.$.o._ Q.L & YXYXYXYXYXYX", "#XAXVXNXIXIX: c N K IXIXIXIXIXC.j.j.r.$.@.o.I ).H * YXYXYXYXYXYX", "#XAXNXvXIXIX; G L (.IXIXIXIXPXr.l.i.r.*.o.X.[ (.C * YXYXYXYXYXYX", "{.AXvXcXIXIXe (.}..3.) HXB M g & YXYXYXYXYXYX", "/.NXqXqXZXZXVXVXVXVXNXNXcX>.b.h.f.f.4.;.~ |.M x d # YXYXYXYXYXYX", "/.nXqX5X5X5X2X1X;X;X-X|.{ h.L.M.M.n.6.) m M l l a # YXYXYXYXYXYX", "!.cX5X5X3X2X1XX,X,X{. X[ W T H H H H D A A b ^.4 1 $ O YXYXYXYXYXYX", "a ).V B MXbXxX6X6XXXI ! ].].]././.!.!.^./.`.1 - % . YXYXYXYXYXYX", "i _.B M vXbXxXxXxX&XOX$X#X@X@X{./.`.`.`././.- - o . YXYXYXYXYXYX", "0 !.g d %X%X+X+X'.'.'.^./.^.W.W.W.S S S Z Z o o X . YXYXYXYXYXYX", "YX6 < & 2 < 2 < < < < < < < * , , * * * * * . . . YXYXYXYXYXYXYX", "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX", "YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX" }; #else // Default DeltaHF theme const char * AlcPix::m_about_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 291 2", " c None", ". c #0C0C0C", "+ c #0A0A0A", "@ c #090909", "# c #222222", "$ c #9A9A9A", "% c #A2A2A2", "& c #9B9B9B", "* c #959595", "= c #858585", "- c #5C5C5C", "; c #2B2B2B", "> c #7D7D7D", ", c #969696", "' c #878787", ") c #989898", "! c #8B8B8B", "~ c #777777", "{ c #292929", "] c #4F4F4F", "^ c #A8A8A8", "/ c #8F8F8F", "( c #6A6A6A", "_ c #212121", ": c #161616", "< c #6E6E6E", "[ c #898989", "} c #888888", "| c #414141", "1 c #353535", "2 c #2F2F2F", "3 c #5A5A5A", "4 c #8C8C8C", "5 c #555555", "6 c #AFAFAF", "7 c #838383", "8 c #3E3E3E", "9 c #505050", "0 c #A1A1A1", "a c #7E7E7E", "b c #454545", "c c #585958", "d c #A9A9A9", "e c #3C3C3C", "f c #CAD7CA", "g c #DFE8DF", "h c #808780", "i c #979797", "j c #404440", "k c #242D24", "l c #C8D5C8", "m c #D5DED5", "n c #B0B9B0", "o c #788378", "p c #2B362B", "q c #A4A4A4", "r c #A0A0A0", "s c #3D433D", "t c #768576", "u c #576657", "v c #374237", "w c #C9D6C9", "x c #E0E9E0", "y c #B4BDB4", "z c #465546", "A c #344334", "B c #2E3A2E", "C c #2B322B", "D c #3D413D", "E c #5B635B", "F c #819081", "G c #96A996", "H c #7F907F", "I c #6C796C", "J c #516051", "K c #2C372C", "L c #C6D5C6", "M c #D7E0D7", "N c #B3BCB3", "O c #798479", "P c #374637", "Q c #364536", "R c #354435", "S c #334233", "T c #384738", "U c #485948", "V c #9BAE9B", "W c #9EB19E", "X c #94A794", "Y c #889D88", "Z c #7F947F", "` c #7A897A", " . c #6B7A6B", ".. c #596859", "+. c #374437", "@. c #B0BBB0", "#. c #ABB6AB", "$. c #C7D0C7", "%. c #939E93", "&. c #576457", "*. c #3D4C3D", "=. c #3C4B3C", "-. c #3B4A3B", ";. c #2F3A2F", ">. c #A7A7A7", ",. c #556255", "'. c #8CA18C", "). c #829582", "!. c #758A75", "~. c #687D68", "{. c #6F826F", "]. c #728372", "^. c #606F60", "/. c #212A21", "(. c #A6B9A6", "_. c #B1BEB1", ":. c #808B80", "<. c #5B685B", "[. c #4E5D4E", "}. c #4B5C4B", "|. c #4D5E4D", "1. c #4C5C4C", "2. c #313D31", "3. c #9F9F9F", "4. c #B8B8B8", "5. c #7C917C", "6. c #6F846F", "7. c #637863", "8. c #5E735E", "9. c #708370", "0. c #8C9D8C", "a. c #323D32", "b. c #ACBDAC", "c. c #D8E1D8", "d. c #D9E2D9", "e. c #CBD6CB", "f. c #AAB7AA", "g. c #717E71", "h. c #5D6C5D", "i. c #576857", "j. c #566756", "k. c #404D40", "l. c #1F251F", "m. c #2D332D", "n. c #2E342E", "o. c #3D483D", "p. c #6C816C", "q. c #778A77", "r. c #889988", "s. c #657665", "t. c #A9BEA9", "u. c #D5E0D5", "v. c #E1E8E1", "w. c #E3EAE3", "x. c #DBE4DB", "y. c #D2DDD2", "z. c #C1D0C1", "A. c #9DAC9D", "B. c #738473", "C. c #5F705F", "D. c #5B6C5B", "E. c #697E69", "F. c #667B66", "G. c #758875", "H. c #90A190", "I. c #7A8B7A", "J. c #697A69", "K. c #586758", "L. c #232C23", "M. c #A0B5A0", "N. c #E2E9E2", "O. c #DCE5DC", "P. c #D4DFD4", "Q. c #BFD0BF", "R. c #B2C3B2", "S. c #9BAC9B", "T. c #6A796A", "U. c #5C6D5C", "V. c #607560", "W. c #7D907D", "X. c #92A592", "Y. c #889B88", "Z. c #6A7D6A", "`. c #677867", " + c #637463", ".+ c #5E6E5E", "++ c #5B6A5B", "@+ c #283328", "#+ c #AFBCAF", "$+ c #D0DBD0", "%+ c #BBCCBB", "&+ c #B7C8B7", "*+ c #495649", "=+ c #ABBAAB", "-+ c #8B9E8B", ";+ c #7A8F7A", ">+ c #718471", ",+ c #667766", "'+ c #647564", ")+ c #617261", "!+ c #3B483B", "~+ c #1E251E", "{+ c #B2BFB2", "]+ c #C3CEC3", "^+ c #C3D0C3", "/+ c #BDCEBD", "(+ c #B5C6B5", "_+ c #AABBAA", ":+ c #3D4A3D", "<+ c #627162", "[+ c #525D52", "}+ c #8B9A8B", "|+ c #788B78", "1+ c #768976", "2+ c #6B7E6B", "3+ c #384538", "4+ c #141B15", "5+ c #485548", "6+ c #95A295", "7+ c #ACBBAC", "8+ c #AFC0AF", "9+ c #9CAB9C", "0+ c #354035", "a+ c #505D50", "b+ c #728572", "c+ c #4F5E4F", "d+ c #444D44", "e+ c #869386", "f+ c #394639", "g+ c #192019", "h+ c #333E33", "i+ c #5F6E5F", "j+ c #334033", "k+ c #4B584B", "l+ c #8C9B8C", "m+ c #343F34", "n+ c #4A554A", "o+ c #4D5C4D", "p+ c #505F50", "q+ c #495249", "r+ c #818E81", "s+ c #3F4D3E", "t+ c #394439", "u+ c #3F4C3F", "v+ c #6C7F6C", "w+ c #798C79", "x+ c #516251", "y+ c #3F463F", "z+ c #3C493C", "A+ c #414E41", "B+ c #768574", "C+ c #889D86", "D+ c #819681", "E+ c #6D806D", "F+ c #657865", "G+ c #809580", "H+ c #556655", "I+ c #546354", "J+ c #4B5A4B", "K+ c #465346", "L+ c #3E4B3E", "M+ c #4D5A4D", "N+ c #566354", "O+ c #7C8C79", "P+ c #819580", "Q+ c #859C85", "R+ c #5A6B5A", "S+ c #526152", "T+ c #4C5B4C", "U+ c #485748", "V+ c #434E43", "W+ c #333C33", "X+ c #5D6D5C", "Y+ c #7B8B78", "Z+ c #7E937E", "`+ c #8AA18A", " @ c #5D6E5D", ".@ c #536453", "+@ c #536253", "@@ c #3A473A", "#@ c #556354", "$@ c #778877", "%@ c #869C85", "&@ c #91A891", "*@ c #607160", "=@ c #566556", "-@ c #3B463B", ";@ c #5A6A59", ">@ c #859782", ",@ c #5C6B5C", "'@ c #415041", " ", " ", " ", " . + @ @ ", " # $ % & * = - ; ", " + > , ' $ ) ! = ~ { ", " ] ^ / ( _ : < [ } | ", " : 1 2 : 3 4 [ | ", " 5 6 7 7 8 ", " 9 0 a 4 b ", " c d a > e ", " f g h $ $ i j k ", " l m n o p q r 6 s t u v ", " w x y o z A B C D E F G H I J K ", " L M N O P Q R S T U V W V X Y Z ` ...+. ", " @.#.$.%.&.*.=.*.*.-.;.r >.6 ,.'.).!.~.{.].^.v /. ", " (._.:.<.[.}.|.1.2.3.r 4.C 5.6.7.8.9.0.a. ", " b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.8.q.r.H s.h./. ", " t.u.v.w.x.y.z.A.B.C.D.D.E.7.F.G.H.I.J.s.h.K...L. ", " M.f u.v.N.O.P.L Q.R.S.T.U.V.W.X.Y.{.Z.`. +.+++C.s.@+ ", " h.#+P.M u.$+L Q.%+&+b.*+=+-+;+q.>+Z.`.,+'+)+!+~+ ", " h.{+]+^+z./+(+_+:+<+[+}+|+1+>+2+,+,+3+4+ ", " v 5+6+7+8+9+0+a+b+c+d+e+>+2+ +f+g+h+ ", " I i+j+k+l+m+n+C.b+o+p+q+r+s+g+t+u+:+ ", " H 1+v+C.j+5+..s.w+x+J *+y+a.z+!+A+A+ ", " B+C+D+E+F+s. +J.G+H+I+J+K+u+L+u+5+M+ ", " N+O+P+;+1+b+{.Q+R+j.S+T+U+T+V+W+ ", " X+Y+D+Z Z+`+ @D.j..@+@@@ ", " #@$@%@&@ @*@=@-@ ", " ;@>@,@'@ ", " ", " " }; #ifndef __WXMSW__ const char * AlcPix::m_alc_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 142 2", " c #000000", ". c #0C0B00", "X c #0B0B0B", "o c #131313", "O c #121318", "+ c #1A1A1A", "@ c #2D1A00", "# c #292100", "$ c #29251E", "% c #222222", "& c #292929", "* c #323232", "= c #36383B", "- c #393836", "; c #3E3E3E", ": c #5F3F06", "> c #534400", ", c #594400", "< c #584A00", "1 c #6F4700", "2 c #604418", "3 c #7F6F00", "4 c gray26", "5 c #4A4A4A", "6 c #4D4D58", "7 c #505052", "8 c #5A5A5A", "9 c #5B5C63", "0 c #786448", "q c #646464", "w c #696B6F", "e c #747474", "r c #77797D", "t c #7C7C7C", "y c #7C7D82", "u c #995B0A", "i c #9A7700", "p c #8D682E", "a c #AA7900", "s c #9B7F4C", "d c #867C6A", "f c #817D7A", "g c #9A8B00", "h c #A38002", "j c #AC8800", "k c #A59200", "l c #BE8D2D", "z c #B5A200", "x c #97876C", "c c #958873", "v c #9F9079", "b c #B3B272", "n c #BFB97D", "m c #D59700", "M c #C5B500", "N c #E4AA14", "B c #FBB904", "V c #E9AB38", "C c #FCBC20", "Z c #D1AB66", "A c #F0B355", "S c #E0B96A", "D c #D6C500", "F c #D9C300", "G c #DED100", "H c #E4D700", "J c #EDDE00", "K c #F1C500", "L c #FFC604", "P c #FCC90B", "I c #FFD600", "U c #FFDB00", "Y c #FFD81D", "T c #FFCF2A", "R c #FFD32C", "E c #FFD433", "W c #FFD23A", "Q c #F0E500", "! c #FEE300", "~ c #FFE800", "^ c #FDE114", "/ c #FFF000", "( c #FEFB01", ") c #FDFC28", "_ c #FFD541", "` c #FFD64A", "' c #E0E046", "] c #858585", "[ c #83868D", "{ c #86888C", "} c #8B8B8B", "| c #8A8C91", " . c #8E9197", ".. c #939393", "X. c #9B9B9B", "o. c #9D9EA0", "O. c #9FA1A6", "+. c #AB9B82", "@. c #AAA297", "#. c #B6A588", "$. c #BBAC94", "%. c #A3A3A3", "&. c #ABABAB", "*. c #B2B2B2", "=. c #BABABA", "-. c #BCBEC0", ";. c #BFC1C4", ":. c #CBBCA4", ">. c #C6C6A3", ",. c #D9C8AE", "<. c #D8D9BA", "1. c #EBDB9F", "2. c #F9D78E", "3. c #F3D598", "4. c #FDD790", "5. c #FBDE9E", "6. c #EDDEBE", "7. c #FFEAAB", "8. c #F7EAB4", "9. c #FEE6B1", "0. c #FFEBB2", "q. c #FFF1B2", "w. c #C3C3C3", "e. c #C5C5C9", "r. c #CCCCCC", "t. c #CDCFD3", "y. c #D0D0C0", "u. c #D4D4D3", "i. c #D2D2D8", "p. c #DBDBDB", "a. c #EEDFD0", "s. c #EDE7DD", "d. c #FCFBD4", "f. c #FEF8D9", "g. c #E3E3E3", "h. c #E7E9ED", "j. c #EAEAEA", "k. c #E8EBF3", "l. c #F2F2F2", "z. c #F0F1F8", "x. c #FDFDFD", "c. c None", /* pixels */ "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c. X o + o c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c. $ q X.=.r.w.w.&.t * c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.X q w.p.r.=.=.=.w.=.w.=.t + c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c. X t j.x.x.x.u.%.%.X.%.&.&.&...% c.c.c.c.c.c.c.", "c.c.c.c.c.c.c. 7 p.x.x.x.x.x.w.} =.g.x.l.u.%.e X c.c.c.c.c.c.", "c.c.c.c.c.c. o } x.x.x.x.l.=.%.*.x.x.x.x.l.r.] * c.c.c.c.c.c.", "c.c.c.c.c. & X.x.x.x.l.r.e & } ..x.x.j.p.u.} ; c.c.c.c.c.", "c.c.c.c.c. % t x.x.l.g.r.9 6 y } x.j.p.r.w.t * c.c.c.c.c.", "c.c.c.c. o 4 p.x.g.p.y.>.b n f.s.p.t.e.%.5 + c.c.c.c.", "c.c.c.c. + q p.p.e.' ( ( U L A r.*.] 4 % c.c.c.c.", "c.c.c.c. ; r.i.<.) / I C s.h.%.& X c.c.c.c.", "c.c.c.c. X %.x.x.x.d.^ P a.h.g.s.*.& c.c.c.", "c.c. X *.x.x.x.x.x.8.1.k.s.p.u.p.*.% X c.c.c.", "c. X X X X ] x.x.x.x.x.x.k.h.g.i.u.r.w.e...o X X X c.", " o o o o X 4 l.x.x.x.x.x.j.j.g.p.u.r.w.=.=.=.8 X o X ", " X X o o + X X.x.x.x.x.x.l.j.g.p.u.r.e.w.=.*.*...o X X ", " + * h.x.x.x.l.l.j.g.p.t.r.e.w.=.*.&.%.%.5 + ", "c.c.c.c. o e x.x.x.x.l.j.s.p.u.r.w.-.=.*.&.%.%.@.e % c.c.c.c.", "c.c.c.c. o &.x.x.x.l.h.g.p.u.r.y.=.=.*.&.%.%.X...[ % c.c.c.c.", "c.c.c.c. X r.x.x.l.j.s.a.i.t.e.;.=.*.&.&.O.....} } + c.c.c.c.", "c.c.c.c.c.X s.x.l.j.g.p.u.r.e.;.*.*.&.%.O.X.....} } + c.c.c.c.", "c.c.c.c.c.X p.x.h.g.p.i.r.e.-.=.*.&.&.@.......} } 8 c.c.c.c.c.", "c.c.c.c.c.c.6 h.s.p.u.r.e.-.=.*.&.%.o.X.....] ] t o c.c.c.c.c.", "c.c.c.c.c.c.c.9 t.r.;.;.-.=.*.&.%.o.X...{ ] r w O c.c.c.c.c.c.", "c.c.c.c.c.c.u 2 #.,.:.$.@.o.O.X.X.| [ f c v $.v 0 p : c.c.c.c.c.", "c.c.c.c.1 V 4.0.0.0.9.9.3.Z x | } t s S 5.7.7.q.q.7.2.l @ c.c.c.", "c.c.c. m E ` _ _ _ W _ ` T N } .d B R E E E E E E W Y a c.c.", "c.c.c. i U U U ~ U ~ U U U a - = $ j U ~ ~ ~ ~ ~ ~ U K , c.c.", "c.c.c.c. > k D J Q J F k < c. > g M G H D z 3 # c.c.c.", "c.c.c.c.c.c. . . . . c.c.c.c.c.c. . . c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c." }; #endif /* !__WXMSW__ */ const char * AlcPix::m_copy_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 258 2", " c None", ". c #F8F1E4", "+ c #EAD097", "@ c #9F8753", "# c #CE920B", "$ c #865F07", "% c #F1E2C0", "& c #F9F5EF", "* c #583E04", "= c #634504", "- c #E0BD6D", "; c #785505", "> c #CAD7CA", ", c #C8D5C8", "' c #D5DED5", ") c #B0B9B0", "! c #788378", "~ c #768576", "{ c #576657", "] c #374237", "^ c #C9D6C9", "/ c #E0E9E0", "( c #B4BDB4", "_ c #465546", ": c #344334", "< c #394839", "[ c #9FB29F", "} c #96A996", "| c #7F907F", "1 c #6C796C", "2 c #516051", "3 c #2C372C", "4 c #C6D5C6", "5 c #D7E0D7", "6 c #B3BCB3", "7 c #798479", "8 c #374637", "9 c #364536", "0 c #324132", "a c #475847", "b c #80682F", "c c #A2AD97", "d c #A89478", "e c #9A896F", "f c #89967F", "g c #7F947F", "h c #7A897A", "i c #6B7A6B", "j c #596859", "k c #374437", "l c #B0BBB0", "m c #ABB6AB", "n c #C7D0C7", "o c #939E93", "p c #576457", "q c #3D4C3D", "r c #3C4B3C", "s c #3A493A", "t c #344040", "u c #3C3D74", "v c #3E4A4B", "w c #8F917B", "x c #BC7A57", "y c #D7683F", "z c #BB4E21", "A c #935834", "B c #7A7F67", "C c #687D68", "D c #6F826F", "E c #728372", "F c #606F60", "G c #212A21", "H c #A6B9A6", "I c #B1BEB1", "J c #808B80", "K c #5B685B", "L c #4D5C4D", "M c #3E4B4F", "N c #28295F", "O c #272372", "P c #363070", "Q c #272551", "R c #7F4B35", "S c #D06E47", "T c #EE8C6A", "U c #CF592E", "V c #9D3508", "W c #864F2B", "X c #5E735E", "Y c #708370", "Z c #8C9D8C", "` c #323D32", " . c #ACBDAC", ".. c #D8E1D8", "+. c #D9E2D9", "@. c #CBD6CB", "#. c #AAB7AA", "$. c #5D6771", "%. c #2A2D63", "&. c #171264", "*. c #1F1A5E", "=. c #1D1A45", "-. c #181631", ";. c #62260D", ">. c #A0512F", ",. c #D06D3F", "'. c #B64D1C", "). c #8B451F", "!. c #836E53", "~. c #889988", "{. c #657665", "]. c #5D6C5D", "^. c #A9BEA9", "/. c #D5E0D5", "(. c #E1E8E1", "_. c #E3EAE3", ":. c #DBE4DB", "<. c #D2DDD2", "[. c #C1D0C1", "}. c #9DAC9D", "|. c #58636F", "1. c #323463", "2. c #1D1A46", "3. c #110E24", "4. c #32190C", "5. c #4F220B", "6. c #7F4D2A", "7. c #7F7157", "8. c #90A190", "9. c #7A8B7A", "0. c #697A69", "a. c #586758", "b. c #232C23", "c. c #A0B5A0", "d. c #E2E9E2", "e. c #DCE5DC", "f. c #D4DFD4", "g. c #BFD0BF", "h. c #B2C3B2", "i. c #94A499", "j. c #515A67", "k. c #2D2F48", "l. c #3A392E", "m. c #6E6A56", "n. c #919E8A", "o. c #889B88", "p. c #6A7D6A", "q. c #677867", "r. c #637463", "s. c #5E6E5E", "t. c #5B6A5B", "u. c #5F705F", "v. c #283328", "w. c #AFBCAF", "x. c #D0DBD0", "y. c #BBCCBB", "z. c #B7C8B7", "A. c #495649", "B. c #ABBAAB", "C. c #8B9E8B", "D. c #7A8F7A", "E. c #778A77", "F. c #718471", "G. c #667766", "H. c #647564", "I. c #617261", "J. c #3B483B", "K. c #1E251E", "L. c #B2BFB2", "M. c #C3CEC3", "N. c #C3D0C3", "O. c #BDCEBD", "P. c #B5C6B5", "Q. c #AABBAA", "R. c #3D4A3D", "S. c #627162", "T. c #525D52", "U. c #8B9A8B", "V. c #788B78", "W. c #768976", "X. c #6B7E6B", "Y. c #384538", "Z. c #141B15", "`. c #485548", " + c #95A295", ".+ c #ACBBAC", "++ c #AFC0AF", "@+ c #9CAB9C", "#+ c #354035", "$+ c #505D50", "%+ c #728572", "&+ c #4F5E4F", "*+ c #444D44", "=+ c #869386", "-+ c #394639", ";+ c #192019", ">+ c #333E33", ",+ c #5F6E5F", "'+ c #334033", ")+ c #4B584B", "!+ c #8C9B8C", "~+ c #343F34", "{+ c #4A554A", "]+ c #505F50", "^+ c #495249", "/+ c #818E81", "(+ c #3F4D3E", "_+ c #394439", ":+ c #3F4C3F", "<+ c #6C7F6C", "[+ c #798C79", "}+ c #516251", "|+ c #3F463F", "1+ c #3C493C", "2+ c #414E41", "3+ c #768574", "4+ c #889D86", "5+ c #819681", "6+ c #6D806D", "7+ c #657865", "8+ c #809580", "9+ c #556655", "0+ c #546354", "a+ c #4B5A4B", "b+ c #465346", "c+ c #3E4B3E", "d+ c #4D5A4D", "e+ c #566354", "f+ c #7C8C79", "g+ c #819580", "h+ c #859C85", "i+ c #5A6B5A", "j+ c #566756", "k+ c #526152", "l+ c #4C5B4C", "m+ c #485748", "n+ c #434E43", "o+ c #333C33", "p+ c #5D6D5C", "q+ c #7B8B78", "r+ c #7E937E", "s+ c #8AA18A", "t+ c #5D6E5D", "u+ c #5B6C5B", "v+ c #536453", "w+ c #536253", "x+ c #3A473A", "y+ c #556354", "z+ c #778877", "A+ c #869C85", "B+ c #91A891", "C+ c #607160", "D+ c #566556", "E+ c #3B463B", "F+ c #5A6A59", "G+ c #859782", "H+ c #5C6B5C", "I+ c #415041", " ", " ", " ", " . + + + @ ", " + # # # $ ", " + # # # $ ", " + # # # $ ", " + # # # $ ", " + # # # $ ", " % + + & # # # * $ $ = ", " - # # # # # # # ; ", " > - # # # # # ; ", " , ' ) ! - # # # ; ~ { ] ", " ^ / ( ! _ : < - # ; [ } | 1 2 3 ", " 4 5 6 7 8 9 : 0 8 a b c d e f g h i j k ", " l m n o p q r r s t u v w x y z A B C D E F ] G ", " H I J K L M N O P Q R S T U V W X Y Z ` ", " ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.| {.].G ", " ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.{.].a.j b. ", " c.> /.(.d.e.f.4 g.h.i.j.k.l.m.n.o.D p.q.r.s.t.u.{.v. ", " ].w.f.5 /.x.4 g.y.z. .A.B.C.D.E.F.p.q.G.H.I.J.K. ", " ].L.M.N.[.O.P.Q.R.S.T.U.V.W.F.X.G.G.Y.Z. ", " ] `. +.+++@+#+$+%+&+*+=+F.X.r.-+;+>+ ", " 1 ,+'+)+!+~+{+u.%+L ]+^+/+(+;+_+:+R. ", " | W.<+u.'+`.j {.[+}+2 A.|+` 1+J.2+2+ ", " 3+4+5+6+7+{.r.0.8+9+0+a+b+:+c+:+`.d+ ", " e+f+g+D.W.%+D h+i+j+k+l+m+l+n+o+ ", " p+q+5+g r+s+t+u+j+v+w+x+ ", " y+z+A+B+t+C+D+E+ ", " F+G+H+I+ ", " ", " " }; const char * AlcPix::m_open_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 258 2", " c None", ". c #CAADA4", "+ c #B08476", "@ c #884631", "# c #6E3827", "$ c #3D1F15", "% c #522A1D", "& c #5F3122", "* c #B2887A", "= c #B68E81", "- c #CAD7CA", "; c #DFE8DF", "> c #2A352A", ", c #C8D5C8", "' c #D5DED5", ") c #B0B9B0", "! c #788378", "~ c #768576", "{ c #576657", "] c #374237", "^ c #C9D6C9", "/ c #E0E9E0", "( c #B4BDB4", "_ c #465546", ": c #344334", "< c #8A6559", "[ c #3E1F15", "} c #96A996", "| c #7F907F", "1 c #6C796C", "2 c #516051", "3 c #2C372C", "4 c #C6D5C6", "5 c #D7E0D7", "6 c #B3BCB3", "7 c #798479", "8 c #374637", "9 c #364536", "0 c #324132", "a c #475847", "b c #9AAD9A", "c c #A2AD97", "d c #A89478", "e c #9A896F", "f c #89967F", "g c #7F947F", "h c #7A897A", "i c #6B7A6B", "j c #596859", "k c #374437", "l c #B0BBB0", "m c #ABB6AB", "n c #C7D0C7", "o c #939E93", "p c #576457", "q c #3D4C3D", "r c #3C4B3C", "s c #3A493A", "t c #344040", "u c #3C3D74", "v c #3E4A4B", "w c #8F917B", "x c #BC7A57", "y c #D7683F", "z c #BB4E21", "A c #935834", "B c #7A7F67", "C c #687D68", "D c #6F826F", "E c #728372", "F c #606F60", "G c #212A21", "H c #A6B9A6", "I c #B1BEB1", "J c #808B80", "K c #5B685B", "L c #4D5C4D", "M c #3E4B4F", "N c #28295F", "O c #272372", "P c #363070", "Q c #272551", "R c #7F4B35", "S c #D06E47", "T c #EE8C6A", "U c #CF592E", "V c #9D3508", "W c #864F2B", "X c #5E735E", "Y c #708370", "Z c #8C9D8C", "` c #323D32", " . c #ACBDAC", ".. c #D8E1D8", "+. c #D9E2D9", "@. c #CBD6CB", "#. c #AAB7AA", "$. c #5D6771", "%. c #2A2D63", "&. c #171264", "*. c #1F1A5E", "=. c #1D1A45", "-. c #181631", ";. c #62260D", ">. c #A0512F", ",. c #D06D3F", "'. c #B64D1C", "). c #8B451F", "!. c #836E53", "~. c #889988", "{. c #657665", "]. c #5D6C5D", "^. c #A9BEA9", "/. c #D5E0D5", "(. c #E1E8E1", "_. c #E3EAE3", ":. c #DBE4DB", "<. c #D2DDD2", "[. c #C1D0C1", "}. c #9DAC9D", "|. c #58636F", "1. c #323463", "2. c #1D1A46", "3. c #110E24", "4. c #32190C", "5. c #4F220B", "6. c #7F4D2A", "7. c #7F7157", "8. c #90A190", "9. c #7A8B7A", "0. c #697A69", "a. c #586758", "b. c #232C23", "c. c #A0B5A0", "d. c #E2E9E2", "e. c #DCE5DC", "f. c #D4DFD4", "g. c #BFD0BF", "h. c #B2C3B2", "i. c #94A499", "j. c #515A67", "k. c #2D2F48", "l. c #3A392E", "m. c #6E6A56", "n. c #919E8A", "o. c #889B88", "p. c #6A7D6A", "q. c #677867", "r. c #637463", "s. c #5E6E5E", "t. c #5B6A5B", "u. c #5F705F", "v. c #283328", "w. c #AFBCAF", "x. c #D0DBD0", "y. c #BBCCBB", "z. c #B7C8B7", "A. c #495649", "B. c #ABBAAB", "C. c #8B9E8B", "D. c #7A8F7A", "E. c #778A77", "F. c #718471", "G. c #667766", "H. c #647564", "I. c #617261", "J. c #3B483B", "K. c #1E251E", "L. c #B2BFB2", "M. c #C3CEC3", "N. c #C3D0C3", "O. c #BDCEBD", "P. c #B5C6B5", "Q. c #AABBAA", "R. c #3D4A3D", "S. c #627162", "T. c #525D52", "U. c #8B9A8B", "V. c #788B78", "W. c #768976", "X. c #6B7E6B", "Y. c #384538", "Z. c #141B15", "`. c #485548", " + c #95A295", ".+ c #ACBBAC", "++ c #AFC0AF", "@+ c #9CAB9C", "#+ c #354035", "$+ c #505D50", "%+ c #728572", "&+ c #4F5E4F", "*+ c #444D44", "=+ c #869386", "-+ c #394639", ";+ c #192019", ">+ c #333E33", ",+ c #5F6E5F", "'+ c #334033", ")+ c #4B584B", "!+ c #8C9B8C", "~+ c #343F34", "{+ c #4A554A", "]+ c #505F50", "^+ c #495249", "/+ c #818E81", "(+ c #3F4D3E", "_+ c #394439", ":+ c #3F4C3F", "<+ c #6C7F6C", "[+ c #798C79", "}+ c #516251", "|+ c #3F463F", "1+ c #3C493C", "2+ c #414E41", "3+ c #768574", "4+ c #889D86", "5+ c #819681", "6+ c #6D806D", "7+ c #657865", "8+ c #809580", "9+ c #556655", "0+ c #546354", "a+ c #4B5A4B", "b+ c #465346", "c+ c #3E4B3E", "d+ c #4D5A4D", "e+ c #566354", "f+ c #7C8C79", "g+ c #819580", "h+ c #859C85", "i+ c #5A6B5A", "j+ c #566756", "k+ c #526152", "l+ c #4C5B4C", "m+ c #485748", "n+ c #434E43", "o+ c #333C33", "p+ c #5D6D5C", "q+ c #7B8B78", "r+ c #7E937E", "s+ c #8AA18A", "t+ c #5D6E5D", "u+ c #5B6C5B", "v+ c #536453", "w+ c #536253", "x+ c #3A473A", "y+ c #556354", "z+ c #778877", "A+ c #869C85", "B+ c #91A891", "C+ c #607160", "D+ c #566556", "E+ c #3B463B", "F+ c #5A6A59", "G+ c #859782", "H+ c #5C6B5C", "I+ c #415041", " ", " ", " . ", " + @ # ", " + @ @ @ # ", " + @ @ @ @ @ # ", " + @ @ @ @ @ @ @ # ", " + @ @ @ @ @ @ $ % % & ", " * @ @ @ % ", " = @ @ @ % ", " = @ @ @ % ", " - ; = @ @ @ % > ", " , ' ) ! = @ @ @ % ~ { ] ", " ^ / ( ! _ : < % % % [ } | 1 2 3 ", " 4 5 6 7 8 9 : 0 8 a b c d e f g h i j k ", " l m n o p q r r s t u v w x y z A B C D E F ] G ", " H I J K L M N O P Q R S T U V W X Y Z ` ", " ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.| {.].G ", " ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.{.].a.j b. ", " c.- /.(.d.e.f.4 g.h.i.j.k.l.m.n.o.D p.q.r.s.t.u.{.v. ", " ].w.f.5 /.x.4 g.y.z. .A.B.C.D.E.F.p.q.G.H.I.J.K. ", " ].L.M.N.[.O.P.Q.R.S.T.U.V.W.F.X.G.G.Y.Z. ", " ] `. +.+++@+#+$+%+&+*+=+F.X.r.-+;+>+ ", " 1 ,+'+)+!+~+{+u.%+L ]+^+/+(+;+_+:+R. ", " | W.<+u.'+`.j {.[+}+2 A.|+` 1+J.2+2+ ", " 3+4+5+6+7+{.r.0.8+9+0+a+b+:+c+:+`.d+ ", " e+f+g+D.W.%+D h+i+j+k+l+m+l+n+o+ ", " p+q+5+g r+s+t+u+j+v+w+x+ ", " y+z+A+B+t+C+D+E+ ", " F+G+H+I+ ", " ", " " }; const char * AlcPix::m_saveas_xpm[]= { /* XPM */ /* columns rows colors chars-per-pixel */ "32 32 251 2", " c None", ". c #DFE3DE", "+ c #92A28D", "@ c #97A692", "# c #5D6A59", "$ c #5D7555", "% c #3B4A36", "& c #9BAA96", "* c #B0BCAC", "= c #9CAB97", "- c #A8B5A4", "; c #C9D1C8", "> c #303E2D", ", c #374633", "' c #788C71", ") c #40503A", "! c #CAD7CA", "~ c #C8D5C8", "{ c #D5DED5", "] c #B0B9B0", "^ c #788378", "/ c #768576", "( c #576657", "_ c #374237", ": c #C9D6C9", "< c #E0E9E0", "[ c #B4BDB4", "} c #465546", "| c #344334", "1 c #394839", "2 c #9FB29F", "3 c #96A996", "4 c #7F907F", "5 c #6C796C", "6 c #516051", "7 c #2C372C", "8 c #C6D5C6", "9 c #D7E0D7", "0 c #B3BCB3", "a c #798479", "b c #374637", "c c #364536", "d c #354435", "e c #334233", "f c #384738", "g c #485948", "h c #444F40", "i c #9EB19E", "j c #9BAE9B", "k c #94A794", "l c #889D88", "m c #7F947F", "n c #7A897A", "o c #6B7A6B", "p c #596859", "q c #374437", "r c #B0BBB0", "s c #ABB6AB", "t c #C7D0C7", "u c #939E93", "v c #576457", "w c #3D4C3D", "x c #3C4B3C", "y c #3B4A3B", "z c #3E4D3E", "A c #91A691", "B c #8CA18C", "C c #829582", "D c #758A75", "E c #687D68", "F c #6F826F", "G c #728372", "H c #606F60", "I c #212A21", "J c #A6B9A6", "K c #B1BEB1", "L c #808B80", "M c #5B685B", "N c #4E5D4E", "O c #4B5C4B", "P c #4D5E4D", "Q c #4C5C4C", "R c #4A5B4A", "S c #4E5F4E", "T c #839883", "U c #849984", "V c #819681", "W c #7C917C", "X c #6F846F", "Y c #637863", "Z c #5E735E", "` c #708370", " . c #8C9D8C", ".. c #323D32", "+. c #ACBDAC", "@. c #D8E1D8", "#. c #D9E2D9", "$. c #CBD6CB", "%. c #AAB7AA", "&. c #717E71", "*. c #5D6C5D", "=. c #576857", "-. c #566756", ";. c #546554", ">. c #788D78", ",. c #778C77", "'. c #728772", "). c #6C816C", "!. c #778A77", "~. c #889988", "{. c #657665", "]. c #A9BEA9", "^. c #D5E0D5", "/. c #E1E8E1", "(. c #E3EAE3", "_. c #DBE4DB", ":. c #D2DDD2", "<. c #C1D0C1", "[. c #9DAC9D", "}. c #738473", "|. c #5F705F", "1. c #5B6C5B", "2. c #697E69", "3. c #667B66", "4. c #758875", "5. c #90A190", "6. c #7A8B7A", "7. c #697A69", "8. c #586758", "9. c #232C23", "0. c #A0B5A0", "a. c #E2E9E2", "b. c #DCE5DC", "c. c #D4DFD4", "d. c #BFD0BF", "e. c #B2C3B2", "f. c #9BAC9B", "g. c #6A796A", "h. c #5C6D5C", "i. c #607560", "j. c #7D907D", "k. c #92A592", "l. c #889B88", "m. c #6A7D6A", "n. c #677867", "o. c #637463", "p. c #5E6E5E", "q. c #5B6A5B", "r. c #283328", "s. c #AFBCAF", "t. c #D0DBD0", "u. c #BBCCBB", "v. c #B7C8B7", "w. c #495649", "x. c #ABBAAB", "y. c #8B9E8B", "z. c #7A8F7A", "A. c #718471", "B. c #667766", "C. c #647564", "D. c #617261", "E. c #3B483B", "F. c #1E251E", "G. c #B2BFB2", "H. c #C3CEC3", "I. c #C3D0C3", "J. c #BDCEBD", "K. c #B5C6B5", "L. c #AABBAA", "M. c #3D4A3D", "N. c #627162", "O. c #525D52", "P. c #8B9A8B", "Q. c #788B78", "R. c #768976", "S. c #6B7E6B", "T. c #384538", "U. c #141B15", "V. c #485548", "W. c #95A295", "X. c #ACBBAC", "Y. c #AFC0AF", "Z. c #9CAB9C", "`. c #354035", " + c #505D50", ".+ c #728572", "++ c #4F5E4F", "@+ c #444D44", "#+ c #869386", "$+ c #394639", "%+ c #192019", "&+ c #333E33", "*+ c #5F6E5F", "=+ c #334033", "-+ c #4B584B", ";+ c #8C9B8C", ">+ c #343F34", ",+ c #4A554A", "'+ c #4D5C4D", ")+ c #505F50", "!+ c #495249", "~+ c #818E81", "{+ c #3F4D3E", "]+ c #394439", "^+ c #3F4C3F", "/+ c #6C7F6C", "(+ c #798C79", "_+ c #516251", ":+ c #3F463F", "<+ c #3C493C", "[+ c #414E41", "}+ c #768574", "|+ c #889D86", "1+ c #6D806D", "2+ c #657865", "3+ c #809580", "4+ c #556655", "5+ c #546354", "6+ c #4B5A4B", "7+ c #465346", "8+ c #3E4B3E", "9+ c #4D5A4D", "0+ c #566354", "a+ c #7C8C79", "b+ c #819580", "c+ c #859C85", "d+ c #5A6B5A", "e+ c #526152", "f+ c #4C5B4C", "g+ c #485748", "h+ c #434E43", "i+ c #333C33", "j+ c #5D6D5C", "k+ c #7B8B78", "l+ c #7E937E", "m+ c #8AA18A", "n+ c #5D6E5D", "o+ c #536453", "p+ c #536253", "q+ c #3A473A", "r+ c #556354", "s+ c #778877", "t+ c #869C85", "u+ c #91A891", "v+ c #607160", "w+ c #566556", "x+ c #3B463B", "y+ c #5A6A59", "z+ c #859782", "A+ c #5C6B5C", "B+ c #415041", " ", " ", " ", " . + @ @ # ", " @ $ $ $ % ", " @ $ $ $ % ", " @ $ $ $ % ", " @ $ $ $ % ", " & $ $ $ % ", " * = - ; $ $ $ > % % , ", " ' $ $ $ $ $ $ $ ) ", " ! ' $ $ $ $ $ ) ", " ~ { ] ^ ' $ $ $ ) / ( _ ", " : < [ ^ } | 1 ' $ ) 2 3 4 5 6 7 ", " 8 9 0 a b c d e f g h i j k l m n o p q ", " r s t u v w x w w y z g A k A B C D E F G H _ I ", " J K L M N O P Q R S T U V W X Y Z ` ... ", " +.@.#.$.%.&.*.=.-.;.;.>.,.'.).Z !.~.4 {.*.I ", " ].^./.(._.:.<.[.}.|.1.1.2.Y 3.4.5.6.7.{.*.8.p 9. ", " 0.! ^./.a.b.c.8 d.e.f.g.h.i.j.k.l.F m.n.o.p.q.|.{.r. ", " *.s.c.9 ^.t.8 d.u.v.+.w.x.y.z.!.A.m.n.B.C.D.E.F. ", " *.G.H.I.<.J.K.L.M.N.O.P.Q.R.A.S.B.B.T.U. ", " _ V.W.X.Y.Z.`. +.+++@+#+A.S.o.$+%+&+ ", " 5 *+=+-+;+>+,+|..+'+)+!+~+{+%+]+^+M. ", " 4 R./+|.=+V.p {.(+_+6 w.:+..<+E.[+[+ ", " }+|+V 1+2+{.o.7.3+4+5+6+7+^+8+^+V.9+ ", " 0+a+b+z.R..+F c+d+-.e+f+g+f+h+i+ ", " j+k+V m l+m+n+1.-.o+p+q+ ", " r+s+t+u+n+v+w+x+ ", " y+z+A+B+ ", " ", " " }; #endif // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/src/alcc.h0000644000175000017470000000455211575347521017653 0ustar topiusers//////////////////////////////////////////////////////////////////////////////// /// Name: Main wxBase App /// /// Purpose: aMule ed2k link creator /// /// Author: ThePolish /// /// Copyright (c) 2004-2011 ThePolish ( thepolish@vipmail.ru ) /// /// This program is free software; you can redistribute it and/or modify /// it under the terms of the GNU General Public License as published by /// the Free Software Foundation; either version 2 of the License, or /// (at your option) any later version. /// /// This program is distributed in the hope that it will be useful, /// but WITHOUT ANY WARRANTY; without even the implied warranty of /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /// GNU General Public License for more details. /// /// You should have received a copy of the GNU General Public License /// along with this program; if not, write to the /// Free Software Foundation, Inc., /// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA //////////////////////////////////////////////////////////////////////////////// #ifndef _ALCC_H #define _ALCC_H #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include //----------------------------------------------------------------------------- // This can be put in a separete include file #include static wxCSConv aMuleConv(wxT("iso8859-1")); #ifdef wxUSE_UNICODE #define unicode2char(x) (const char*) aMuleConv.cWX2MB(x) #define char2unicode(x) aMuleConv.cMB2WX(x) #else #define unicode2char(x) x.c_str() #define char2unicode(x) x #endif //----------------------------------------------------------------------------- // Application class alcc : public wxAppConsole { private: bool m_flagVerbose ; bool m_flagPartHashes; wxArrayString m_filesToHash; /// Parse command line virtual void OnInitCmdLine(wxCmdLineParser& cmdline); /// Command line preocessing virtual bool OnCmdLineParsed(wxCmdLineParser& cmdline); protected: wxLocale m_locale; // Used to tell wxCas to use aMule catalog public: /// Application virtual int OnRun (); /// Cleaning on exit virtual int OnExit(); }; DECLARE_APP(alcc) #endif /* _ALCC_H */ // File_checked_for_headers aMule-2.3.1/src/utils/aLinkCreator/Makefile.am0000644000175000017470000000033111575347521020034 0ustar topiusersSUBDIRS = src docs EXTRA_DIST = alc.rc alc.ico if ALC dist_icon_DATA = alc.xpm icondir = $(datadir)/pixmaps dist_util_DATA = alc.desktop utildir = $(datadir)/applications endif MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/aLinkCreator/docs/0000755000175000017470000000000011657306262016731 5ustar topiusersaMule-2.3.1/src/utils/aLinkCreator/docs/alc.es.10000644000175000017470000000207711653631431020161 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "November 2011" aLinkCreator "aMule utilidades" .als B_untranslated B .SH NOMBRE aLinkCreator \- el creador de enlaces eD2k de aMule .SH SINOPSIS .B_untranslated alc .SH DESCRIPCIÓN \fBalc\fP is a graphical utility to create an eD2k link to any file on your computer. Esta apli no tiene ningún argumento. .SH "INFORMANDO ERRORES" Por favor informa de fallos ya sea en nuestro foro (\fIhttp://forum.amule.org/\fP), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fP). Por favor no informe de fallos por correo, ni en nuestras listas, ni directamente al correo de algun miembro del equipo. .SH COPYRIGHT aMule y todas las demás utilidades relacionadas son distribuidas bajo la GNU General Public License. .SH "VEASE TAMBIEN" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH AUTOR Esta página de manualfue escrita por Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.es.10000644000175000017470000000320011653631431020311 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "November 2011" "Calculador de enlaces eD2k de aMule" "aMule utilidades" .als B_untranslated B .als RB_untranslated RB .SH NOMBRE alcc \- calculador de enlaces eD2k basado en texto para aMule .SH SINOPSIS .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH DESCRIPCIÓN Compute the eD2k links of all the input files given in the \fI\fP (There can be one or more files). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Compute and add part hashes to the computed eD2k links. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Imprime una breve descripción de uso. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Modo Extendido \- muestra también los pasos de cálculo. .SH "INFORMANDO ERRORES" Por favor informa de fallos ya sea en nuestro foro (\fIhttp://forum.amule.org/\fP), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fP). Por favor no informe de fallos por correo, ni en nuestras listas, ni directamente al correo de algun miembro del equipo. .SH COPYRIGHT aMule y todas las demás utilidades relacionadas son distribuidas bajo la GNU General Public License. .SH "VEASE TAMBIEN" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH AUTOR Esta página de manualfue escrita por Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.fr.10000644000175000017470000000321711657217366020334 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "Novembre 2011" "aMule eD2k links calculator" "Outils d'aMule" .als B_untranslated B .als RB_untranslated RB .SH NOM alcc \- calculateur de lien eD2k pour aMule .SH SYNOPSIS .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH DESCRIPTION Calcule les liens eD2k de tous les fichiers d'entrée précisé dans la \fI\fP (Il peut y un seul fichier ou plusieurs). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Calcule et ajoute les parties de hachages aux liens eD2k calculés. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Afficher une court description d'utilisation. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Mode bavard \- affiche aussi les étapes de calculs. .SH "RAPPORTER DES BOGUES" Veuillez rapporter les bogues sur notre forum (\fIhttp://forum.amule.org/\fP), ou sur notre bugtracker (\fIhttp://bugs.amule.org/\fP). Veuillez ne pas rapporter les bogues par e\-mail, sur notre liste de diffusion ou directement à n'importe quel membre de l'équipe. .SH COPYRIGHT aMule et tout ses outils sont distribués sous la licence GNU General Public License. .SH "VOIR AUSSI" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH AUTEUR Cette manpage a été écrite par Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/Makefile.am0000644000175000017470000000047511641025331020757 0ustar topiusersSELECTED_MANPAGES = $(ALC_MANPAGES) $(ALCC_MANPAGES) EXTRA_DIST = \ alc.1 alcc.1 \ alc.de.1 alcc.de.1 \ alc.es.1 alcc.es.1 \ alc.fr.1 alcc.fr.1 \ alc.hu.1 alcc.hu.1 \ alc.it.1 alcc.it.1 \ alc.ru.1 alcc.ru.1 \ alc.tr.1 alcc.tr.1 include $(top_srcdir)/automake/manpages.am MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.it.10000644000175000017470000000334511655447554020345 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "Novembre 2011" "Calcolatore di collegamenti eD2k di aMule" "Utilità di aMule" .als B_untranslated B .als RB_untranslated RB .SH NOME alcc \- Generatore di collegamenti eD2k in formato testo per aMule .SH SINTASSI .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH DESCRIZIONE Genera i collegamenti eD2k di tutti i file in ingresso forniti in \fI\fP (Ci possono essere uno o più file). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Genera e include gli hash delle singole parti al collegamento eD2k. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Visualizza una breve descrizione dell'utilizzo. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Dettagliato \- mostra anche i passaggi di calcolo. .SH "SEGNALARE I BUG" Per favore segnalare i bug nel nostro forum (\fIhttp://forum.amule.org/\fP) o nel nostro bugtracker (\fIhttp://bugs.amule.org/\fP). Per favore non segnalare i bug via posta elettronica, né nella nostra mailing list né direttamente a qualunque membro del gruppo. .SH COPYRIGHT aMule e tutti i programmi di utilità correlati sono distribuiti in accordo alla GNU General Public License. .SH "VEDI ANCHE" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH AUTORE Questa pagina del manuale è stata scritta da Vollstrecker .SH TRADUZIONE ITALIANA Stefano Corti aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.de.10000644000175000017470000000325411653631431020303 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "November 2011" "aMule eD2k Verweis Ersteller" "aMule Hilfsprogramme" .als B_untranslated B .als RB_untranslated RB .SH NAME alcc \- textbasierter eD2k Verweis Ersteller für aMule .SH SYNTAX .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH BESCHREIBUNG Berechne die eD2k Verweise aller Eingabedateien aus \fI\fP (eine oder mehrere Dateien). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Berechne Teilprüfsummen und füge sie dem berechneten eD2k Verweis hinzu. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Gibt eine kurze Nutzungsbeschreibung aus. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Sei gesprächig \- Zeige auch die Rechenschritte an. .SH "FEHLER MELDEN" Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns weder Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder. .SH COPYRIGHT aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License .SH "SIEHE AUCH" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH VERFASSER Diese manpage wurde geschrieben von Vollstrecker Diese manpage wurde übersetzt von Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alc.10000644000175000017470000000142711653631431017551 0ustar topiusers.TH ALC 1 "November 2011" "aLinkCreator" "aMule utilities" .als B_untranslated B .SH NAME aLinkCreator \- the aMule eD2k link creator .SH SYNOPSIS .B_untranslated alc .SH DESCRIPTION \fBalc\fR is a graphical utility to create an eD2k link to any file on your computer. This app doesn't take any arguments. .SH REPORTING BUGS Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. .SH COPYRIGHT aMule and all of its related utilities are distributed under the GNU General Public License. .SH SEE ALSO .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH AUTHOR This manpage was written by Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.hu.10000644000175000017470000000332511656343533020334 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "2011. november" "aMule eD2k hivatkozás készítő" "aMule segédprogramok" .als B_untranslated B .als RB_untranslated RB .SH NÉV alcc \- szöveges eD2k hivatkozás készítő az aMule\-hez .SH ÁTTEKINTÉS .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH LEÍRÁS A parancssorban megadott fájl(ok)hoz számítja ki az eD2k hivatkozás(oka)t. Egyszerre több fájl is megadható. .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Rész\-hash\-ek számítása és hozzáadása a készített eD2k hivatkozáshoz. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Egy rövid használati leírást jelenít meg. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Bőbeszédű mód \- a számítási lépéseket is megjeleníti. .SH "HIBÁK JELENTÉSE" A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fP), vagy a hibakövetőben (\fIhttp://bugs.amule.org/\fP) jelentsék. Hibákról kérjük ne írjanak levelet (e\-mail\-t) se a levelezési listára, se közvetlenül valamelyik fejlesztőnek. .SH COPYRIGHT Az aMule és az összes hozzá tartozó segédprogram a GNU General Public License védelme alatt áll. .SH "LÁSD MÉG" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH SZERZŐ Ezt a kézikönyv lapot Vollstrecker írta. .SH MAGYAR FORDÍTÁS Dévai Tamás aMule-2.3.1/src/utils/aLinkCreator/docs/alc.hu.10000644000175000017470000000216011656343533020165 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "2011. november" aLinkCreator "aMule segédprogramok" .als B_untranslated B .SH NÉV aLinkCreator \- az aMule eD2k hivatkozás készítő .SH ÁTTEKINTÉS .B_untranslated alc .SH LEÍRÁS Az \fBalc\fP egy grafikus segédprogram eD2k hivatkozások létrehozásához A program nem vár semmilyen paramétert. .SH "HIBÁK JELENTÉSE" A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fP), vagy a hibakövetőben (\fIhttp://bugs.amule.org/\fP) jelentsék. Hibákról kérjük ne írjanak levelet (e\-mail\-t) se a levelezési listára, se közvetlenül valamelyik fejlesztőnek. .SH COPYRIGHT Az aMule és az összes hozzá tartozó segédprogram a GNU General Public License védelme alatt áll. .SH "LÁSD MÉG" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH SZERZŐ Ezt a kézikönyv lapot Vollstrecker írta. .SH MAGYAR FORDÍTÁS Dévai Tamás aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.10000644000175000017470000000246411653631431017716 0ustar topiusers.TH ALCC "1" "November 2011" "aMule eD2k links calculator" "aMule utilities" .als B_untranslated B .als RB_untranslated RB .SH NAME alcc \- text based eD2k links calculator for aMule .SH SYNOPSIS .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] .I .B_untranslated alcc .RB_untranslated [ \-h ] .SH DESCRIPTION Compute the eD2k links of all the input files given in the \fI\fR (There can be one or more files). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Compute and add part hashes to the computed eD2k links. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Prints a short usage description. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Be verbose \- show also calculation steps. .SH REPORTING BUGS Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. .SH COPYRIGHT aMule and all of its related utilities are distributed under the GNU General Public License. .SH SEE ALSO .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH AUTHOR This manpage was written by Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alc.ru.10000644000175000017470000000300611653631431020171 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "November 2011" aLinkCreator "утилиты aMule" .als B_untranslated B .SH ИМЯ aLinkCreator \- создатель eD2k\-ссылок aMule .SH ОБЗОР .B_untranslated alc .SH ОПИСАНИЕ \fBalc\fP \- графическая утилита, которая создает eD2k\-ссылку для любого файла на вашем компьютере. Утилита не принимает параметров. .SH "СООБЩЕНИЕ ОБ ОШИБКАХ" Пожалуйста, сообщайте об ошибках либо на нашем форуме (\fIhttp://forum.amule.org/\fP), либо в багтрекере (\fIhttp://bugs.amule.org/\fP). Пожалуйста, не сообщайте об ошбках по электронной почте, по нашим спискам рассылки, или напрямую участникам. .SH "АВТОРСКИЕ ПРАВА" aMule и все прилагающиеся инструменты распространаются под Открытым Лицензионным Соглашением GNU (GNU GPL). .SH "СМ. ТАКЖЕ" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH АВТОРЫ Автор страницы помощи: Vollstrecker , перевод: Radist Morse aMule-2.3.1/src/utils/aLinkCreator/docs/alc.tr.10000644000175000017470000000221011657220745020172 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "Kasım 2011" aLinkCreator "aMule yardımcı araçları" .als B_untranslated B .SH İSİM aLinkCreator \- aMule eD2k bağlantı yaratıcısı .SH KULLANIM .B_untranslated alc .SH AÇIKLAMA \fBalc\fP bilgisayarınızdaki herhangi bir dosya için eD2k bağlantısı yaratabilen grafik arayüzlü bir araçtır. Bu uygulama hiçbir argüman almaz. .SH GERİBİLDİRİM Hataları bildirmek için forumumuzu (\fIhttp://forum.amule.org/\fP) ya da hata takipçimizi (\fIhttp://bugs.amule.org/\fP) kullanınız. Hataları bildirmek için e\-mail ve e\-mail listemizi kullanmamanızı ve geliştiricilerden birine doğrudan bildirmemenizi rica ederiz. .SH "TELİF HAKKI" aMule ve ilgili tüm yardımcı araçları GNU Genel Kamu Lisansı çerçevesinde dağıtılmaktadır. .SH "İLGİLİ BELGELER" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH YAZAN Bu kılavuz sayfası Vollstrecker tarafından yazılmıştır. aMule-2.3.1/src/utils/aLinkCreator/docs/Makefile.in0000644000175000017470000003673411657306262021013 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/automake/manpages.am subdir = src/utils/aLinkCreator/docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SELECTED_MANPAGES = $(ALC_MANPAGES) $(ALCC_MANPAGES) EXTRA_DIST = \ alc.1 alcc.1 \ alc.de.1 alcc.de.1 \ alc.es.1 alcc.es.1 \ alc.fr.1 alcc.fr.1 \ alc.hu.1 alcc.hu.1 \ alc.it.1 alcc.it.1 \ alc.ru.1 alcc.ru.1 \ alc.tr.1 alcc.tr.1 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.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/utils/aLinkCreator/docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/aLinkCreator/docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook 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 uninstall uninstall-am uninstall-hook install-data-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done uninstall-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/aLinkCreator/docs/alc.de.10000644000175000017470000000216211653631431020135 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "November 2011" aLinkCreator "aMule Hilfsprogramme" .als B_untranslated B .SH NAME ed2k \- aMule eD2k Verweis parser .SH SYNTAX .B_untranslated alc .SH BESCHREIBUNG \fBalc\fP ist ein graphisches Werkzeug zum erstellen von eD2k Links für Dateien auf deinem Computer. Dieses Programm hat keine Parameter. .SH "FEHLER MELDEN" Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns weder Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder. .SH COPYRIGHT aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License .SH "SIEHE AUCH" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH VERFASSER Diese manpage wurde geschrieben von Vollstrecker Diese manpage wurde übersetzt von Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alc.it.10000644000175000017470000000223311655447554020175 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "Novembre 2011" aLinkCreator "Utilità di aMule" .als B_untranslated B .SH NOME aLinkCreator \- generatore di collegamenti eD2k di aMule .SH SINTASSI .B_untranslated alc .SH DESCRIZIONE \fBalc\fP è una utilità grafica per creare un collegamento eD2k da ogni file sul vostro computer. Questa applicazione non accetta parametri. .SH "SEGNALARE I BUG" Per favore segnalare i bug nel nostro forum (\fIhttp://forum.amule.org/\fP) o nel nostro bugtracker (\fIhttp://bugs.amule.org/\fP). Per favore non segnalare i bug via posta elettronica, né nella nostra mailing list né direttamente a qualunque membro del gruppo. .SH COPYRIGHT aMule e tutti i programmi di utilità correlati sono distribuiti in accordo alla GNU General Public License. .SH "VEDI ANCHE" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH AUTORE Questa pagina del manuale è stata scritta da Vollstrecker .SH TRADUZIONE ITALIANA Stefano Corti aMule-2.3.1/src/utils/aLinkCreator/docs/alc.fr.10000644000175000017470000000211611657217366020166 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALC 1 "Novembre 2011" aLinkCreator "Outils d'aMule" .als B_untranslated B .SH NOM aLinkCreator \- le créateur de liens eD2k d'aMule .SH SYNOPSIS .B_untranslated alc .SH DESCRIPTION \fBalc\fP est un utilitaire graphique pour créer un lien eD2k pour n'importe quel fichier sur votre ordinateur. Cette application ne prend pas d'arguments. .SH "RAPPORTER DES BOGUES" Veuillez rapporter les bogues sur notre forum (\fIhttp://forum.amule.org/\fP), ou sur notre bugtracker (\fIhttp://bugs.amule.org/\fP). Veuillez ne pas rapporter les bogues par e\-mail, sur notre liste de diffusion ou directement à n'importe quel membre de l'équipe. .SH COPYRIGHT aMule et tout ses outils sont distribués sous la licence GNU General Public License. .SH "VOIR AUSSI" .B_untranslated alcc\fR(1), \fBamule\fR(1) .SH AUTEUR Cette manpage a été écrite par Vollstrecker aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.tr.10000644000175000017470000000332511657220745020345 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "Kasım 2011" "aMule eD2k bağlantı hesaplayıcısı" "aMule yardımcı araçları" .als B_untranslated B .als RB_untranslated RB .SH İSİM alcc \- aMule için metin temelli eD2k bağlantı hesaplayıcısı .SH KULLANIM .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH AÇIKLAMA \fI\fPnde girilen tüm dosyaların eD2k bağlantılarını hesaplar (bir ya da birden fazla dosya olabilir) .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Bölümler için hash değerlerini hesaplar ve eD2k bağlantılarına ekler. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Kısa bir kullanım açıklaması görüntüler. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Geveze olur \- hesap adımlarını da gösterir. .SH GERİBİLDİRİM Hataları bildirmek için forumumuzu (\fIhttp://forum.amule.org/\fP) ya da hata takipçimizi (\fIhttp://bugs.amule.org/\fP) kullanınız. Hataları bildirmek için e\-mail ve e\-mail listemizi kullanmamanızı ve geliştiricilerden birine doğrudan bildirmemenizi rica ederiz. .SH "TELİF HAKKI" aMule ve ilgili tüm yardımcı araçları GNU Genel Kamu Lisansı çerçevesinde dağıtılmaktadır. .SH "İLGİLİ BELGELER" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH YAZAN Bu kılavuz sayfası Vollstrecker tarafından yazılmıştır. aMule-2.3.1/src/utils/aLinkCreator/docs/alcc.ru.10000644000175000017470000000432711653631431020343 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ALCC 1 "November 2011" "aMule калькулятор eD2k\-ссылок" "утилиты aMule" .als B_untranslated B .als RB_untranslated RB .SH ИМЯ alcc \- текстовый калькулятор eD2k\-ссылок для aMule .SH ОБЗОР .B_untranslated alcc .RB_untranslated [ \-p ] .RB_untranslated [ \-v ] \fI<список_файлов>\fP .B_untranslated alcc .RB_untranslated [ \-h ] .SH ОПИСАНИЕ Вычисляет eD2k\-ссылки для всех файлов указанных в \fI<списке_файлов>\fP (Может быть один или более файлов). .TP .B_untranslated [ \-p\fR, \fB\-\-parthashes ]\fR Вычисляет и добавляет частичные хэши к вычисленным eD2k\-ссылкам. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Выводит короткую помощь по использованию. .TP .B_untranslated [ \-v\fR, \fB\-\-verbose ]\fR Показать подробности \- показывает также шаги вычислений. .SH "СООБЩЕНИЕ ОБ ОШИБКАХ" Пожалуйста, сообщайте об ошибках либо на нашем форуме (\fIhttp://forum.amule.org/\fP), либо в багтрекере (\fIhttp://bugs.amule.org/\fP). Пожалуйста, не сообщайте об ошбках по электронной почте, по нашим спискам рассылки, или напрямую участникам. .SH "АВТОРСКИЕ ПРАВА" aMule и все прилагающиеся инструменты распространаются под Открытым Лицензионным Соглашением GNU (GNU GPL). .SH "СМ. ТАКЖЕ" .B_untranslated alc\fR(1), \fBamuled\fR(1), \fBamulecmd\fR(1), \fBamuleweb\fR(1), \fBcas\fR(1), \fBed2k\fR(1), \fBwxcas\fR(1), \fBxas\fR(1) .SH АВТОРЫ Автор страницы помощи: Vollstrecker , перевод: Radist Morse aMule-2.3.1/src/utils/aLinkCreator/alc.rc0000644000175000017470000000006211575347521017066 0ustar topiusersalc ICON "alc.ico" #include "wx/msw/wx.rc" aMule-2.3.1/src/utils/aLinkCreator/alc.desktop0000644000175000017470000000046511644077302020134 0ustar topiusers[Desktop Entry] Name=aLinkCreator Exec=alc Icon=alc Terminal=false Type=Application Categories=Network;P2P; Comment=aMule ed2k link creator Comment[de]=ed2k-Linkersteller Comment[fr]=Créateur de liens ed2k d'aMule Comment[hu]=ed2k hivatkozás készítő Comment[tr]=aMule için ed2k bağlantı yaratıcısı aMule-2.3.1/src/utils/aLinkCreator/alc.ico0000644000175000017470000001635610264706213017240 0ustar topiusersh6 00F( @+++SSSqrrhii\[[\ZZedd )))LKKWUUSRI;<<*MoqrKIImlliiieee<<<&A PPPkllFEE[[[777USS~}}PONbbbayz{|}~xlmnopqrstuvw xabcdefg h ij k[\ ]^ _`ST UV WXYZKL MNOPQRDE FGHIJ<=> ?@ABC456789:;./ 0 123$%&'()* +,- !"# ( @ʦf3f3̙f3fffff3ff333f3333f3ff3f3̙f3fffff3ff333f3333f3f3̙̙̙f̙3̙̙̙f3fffff3ff333f3333f3fffff3fffffff3fff̙ffff3fffffffffff3ffff3f3f3ff3f33f3ffffff3ff333f3333333f33333̙33f3333f3f3f3ff33f3f3333333f3333333333f3333f3f3̙f3ffffff3f333f3333f3wUD"wUD"UUUwwwwwwDDD"""wUD"gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg&gg& g& ggggggggggggggggggggggggggggggggggg#????(0` wwwUUU"""fDDD                                 ???????aMule-2.3.1/src/utils/aLinkCreator/alc.xpm0000644000175000017470000000272611575347521017277 0ustar topiusers/* XPM */ static const char *alc[] = { /* columns rows colors chars-per-pixel */ "32 32 17 1", " c black", ". c gray60", "X c gray80", "o c gray100", "O c #FFCCCC", "+ c gray20", "@ c gray40", "# c #FF6699", "$ c #FF9999", "% c black", "& c black", "* c black", "= c black", "- c black", "; c black", ": c black", "> c None", /* pixels */ ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", ">>>>>>>>>>>>>>>>>>......>>>>>>>>", ">>>>>>>>>>>>>>>...@@@@@@@>>>>>>>", ">>>>>>>>>>>>>.@@@@++++++>>>>>>>>", ">>>>>>>>>>>>@@++++.......>>>>>>>", ">>>>>>>.....++....XXXXXXX..>>>>>", ">>>>....XXXX..XXXXooooooooX.>>>>", ">>>..XXXXoOXXXoooooooooXXX.>>>>>", ">>..XOX XO......XXXXXX...>>>>>>", ">#$XoX@ +X..>>>>......>>>>>>>>>", ">#$...XOooOX..>>>>>>>>>>>>>>>>>>", ">#.OOO.XOoOX..>>>>>>>>>>>>>>>>>>", ">.XooX.XOOX.X..>>>>>>>>>>>>>>>>>", ">>.XX.XOOX..XX..>>>>>>>>>>>>>>>>", ">>>..XXXXX.XOOX...>>>>>>>>>>>>>>", ">>>>>.....XOooOX.....>>>>>>>>>>>", ">>>>>>..XXOooooOXX.....>>>>>>>>>", ">>>>>..XOOooooooOOXXX...>>>>>>>>", ">>>>..XOoooooooOO...XXX..>>>>>>>", ">>>>..XOooooooO..XXX..OX..>>>>>>", ">>>>..XOoooooO.XXOOOXX.X..>>>>>>", ">>>>..XOooooO.XOOoooOOX.X..>>>>>", ">>>>>..XOoooO.XOooooooOXX..>>>>>", ">>>>>+..XOooO.XOoooooooOOX..>>>>", ">>>>>+..XOooO.XOoooooooOOX..>>>>", ">>>>>++.XOOOOX.XOoooOooOX..XXX>>", ">>>>>++.XO...X.XXOooXXOOX.XOOOX>", ">>>>++..X..X.....XXOX.OOX.XOoOX>", ">>>++.XoX.XoooooooooOX.X..XOOOX>", ">>>++.Xo..X.OOOOOOOOOX....>XXX>>", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" }; aMule-2.3.1/src/utils/aLinkCreator/Makefile.in0000644000175000017470000005730411657306262020057 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/utils/aLinkCreator DIST_COMMON = $(am__dist_icon_DATA_DIST) $(am__dist_util_DATA_DIST) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__dist_icon_DATA_DIST = alc.xpm am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)" am__dist_util_DATA_DIST = alc.desktop DATA = $(dist_icon_DATA) $(dist_util_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src docs EXTRA_DIST = alc.rc alc.ico @ALC_TRUE@dist_icon_DATA = alc.xpm @ALC_TRUE@icondir = $(datadir)/pixmaps @ALC_TRUE@dist_util_DATA = alc.desktop @ALC_TRUE@utildir = $(datadir)/applications MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/aLinkCreator/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/aLinkCreator/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_iconDATA: $(dist_icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(MKDIR_P) "$(DESTDIR)$(icondir)" @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-dist_iconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icondir)" && rm -f $$files install-dist_utilDATA: $(dist_util_DATA) @$(NORMAL_INSTALL) test -z "$(utildir)" || $(MKDIR_P) "$(DESTDIR)$(utildir)" @list='$(dist_util_DATA)'; test -n "$(utildir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(utildir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(utildir)" || exit $$?; \ done uninstall-dist_utilDATA: @$(NORMAL_UNINSTALL) @list='$(dist_util_DATA)'; test -n "$(utildir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(utildir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(utildir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(icondir)" "$(DESTDIR)$(utildir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -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-dist_iconDATA install-dist_utilDATA 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 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: uninstall-dist_iconDATA uninstall-dist_utilDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dist_iconDATA \ install-dist_utilDATA 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-recursive uninstall uninstall-am \ uninstall-dist_iconDATA uninstall-dist_utilDATA # 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: aMule-2.3.1/src/utils/scripts/0000755000175000017470000000000011657306231015106 5ustar topiusersaMule-2.3.1/src/utils/scripts/linkcvs0000755000175000017470000001331711575347521016520 0ustar topiusers#!/bin/bash # This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # Copyright (c) 2004-2011 Jacobo Vilella (Jacobo221) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # ################################################################### # # # linkcvs will link the whole cvs tree to the given path # # allowing keeping several compilations from a single cvs tree # # # # Warning: This script overwrites old files in target_path # # # ################################################################### # # # Script valid as of 4rd June 2004 aMule CVS # # Suggestions go to Jacobo221 at @amule dot .org # # # ################################################################### # # # This code is distributed under terms of the GPL License # # http://www.gnu.org/copyleft/gpl.html # # # ################################################################### # # # EXEC is a list of the files which will be called as scripts # # EXEC_NUMBER is the amount of EXEC files in the list # # EXEC_PREFIX is the command to prefix the call of the EXEC # # EXEC_POSTFIX is the command to postfix the call of the EXEC # # COPY is a list of files which will be copies, not linked # # Priviledge order (max to min): EXEC, COPY, CVS # # # ################################################################### EXEC_NUMBER=0 # The follwing four lines were needed for aMule versions previous to 2.0.0 # EXEC_NUMBER=1 # EXEC=("autogen.sh") # EXEC_PREFIX=("original=\`readlink src/SharedFileList.h\` && cp -d --remove-destination \"\$original\" src/ && ") # EXEC_POSTFIX=("ln -sf \"\$original\" src/SharedFileList.h") COPY="" if [ $# -ne 2 ]; then echo "`basename $0`: invalid number of arguments" echo "Try \``basename $0` '" exit 1 elif [ ! -e "$1" ]; then echo "`basename $0`: $1 doesn't exist!" exit 2 elif [ ! -d "${1}/CVS" ]; then echo "`basename $0`: $1 isn't a CVS tree!" exit 3 elif [ ! -e "${1}/CVS/Entries" ]; then echo "`basename $0`: $1 has no Entries file!" exit 4 fi SOURCE="$1" TARGET="$2" if [ "`echo \"$SOURCE\" | cut -c 1`" != "/" ] && [ "`echo \"$SOURCE\" | cut -c 1`" != "~" ]; then SOURCE="`pwd`/$SOURCE" fi if [ "`echo \"$TARGET\" | cut -c 1`" != "/" ] && [ "`echo \"$TARGET\" | cut -c 1`" != "~" ]; then TARGET="`pwd`/$TARGET" fi cvs_rec() { local FILES=`cat "${SOURCE}/$1"/CVS/Entries | cut -f 2 -d "/" -s` # Alternative option would be to place `grep "^D/"` and `grep "^"` for file in $FILES; do if [ -d "${SOURCE}/${1}/$file" ]; then mkdir -p "${TARGET}/${1}/$file" cvs_rec "${1}/$file" else target="${TARGET}/${subfile/$SOURCE}/${1}" if [ ! -e "${SOURCE}/${1}/$file" ]; then echo "${SOURCE}/${1}/$file not found!" else ln -sf "${SOURCE}/${1}/$file" "$target" fi fi done } if [ ! -e "$TARGET" ]; then echo -n "$TARGET doesn't exist. Should I create it? [y/n]" read -s -n 1 opt if [ $opt = Y -o $opt = y ]; then echo " Copying..." mkdir -p "$TARGET" else echo "`basename $0`: target_path invalid" exit 5 fi fi cvs_rec "" for file in $COPY; do mkdir -p "${TARGET}/`dirname $file`" for subfile in ${SOURCE}/$file; do if [ ! -e "$subfile" ]; then echo "$subfile not found!" else # -d --remove-destination is esential for links handling cp -d --remove-destination "$subfile" "${TARGET}/${subfile/$SOURCE}" fi done done i=0 while [ "$i" -lt "$EXEC_NUMBER" ]; do mkdir -p "${TARGET}/`dirname $file`" for subfile in "${SOURCE}"/${EXEC[$i]}; do if [ ! -e "$subfile" ]; then echo "$subfile not found!" else target="${TARGET}/${subfile/$SOURCE}" rm -f "$target" # Necessary in case $target is a link echo ${EXEC_PREFIX[$i]} > "$target" echo -n "$subfile && " >> "$target" echo ${EXEC_POSTFIX[$i]} >> "$target" chmod a+x "$target" fi done i=`expr $i + 1` done aMule-2.3.1/src/utils/scripts/id2ip0000755000175000017470000000454411575347521016060 0ustar topiusers#!/usr/bin/awk -f # This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # Copyright (c) 2004-2011 xmb ( http://xmb.ath.cx ) # Copyright (c) 2004-2011 Jacobo Vilella (Jacobo221) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # ########################################## # # # Convert eD2k HighID numbers to IPs # # # ########################################## # # # Original code: xmb # # Further code improvements: Jacobo221 # # # # Contact: IRC @ irc.freenode.net/#awk # # jacobo221 at @amule dot org # # # ########################################## # # # This code is distributed under terms # # of the GPL license # # http://www.gnu.org/copyleft/gpl.html # # # ########################################## # # # Usage: id2ip.awk ID <...> # # # ########################################## BEGIN { if (ARGC == 1) { printf "Usage: id2ip.awk ID <...>\n" exit } while (num = ARGV[++i]) { if (ARGV[i] < 16777216) { printf "%s -> LowID\n",ARGV[i] } else if (ARGV[i] > 256*256*256*256) { printf "%s -> Invalid IP\n",ARGV[i] } else { m = 256 * 256 * 256 for (c = 0; m > 0; c++ ) { IP[c] = int(num / m) num -= IP[c] * m m /= 256 } printf "%s -> %d.%d.%d.%d\n", ARGV[i], IP[3], IP[2], IP[1], IP[0] } } } aMule-2.3.1/src/utils/scripts/make_store0000755000175000017470000000042411575347521017173 0ustar topiusers### make_store stores the compilation and warning messages on different files ### compilation_messages and warning_messages ### Of course, error go on warning messages... so you can't see the error happening. #!/bin/sh make 1>compilation_messages 2>warning_messages aMule-2.3.1/src/utils/scripts/kadnodescreate.pl0000755000175000017470000000727711575347521020445 0ustar topiusers#!/usr/bin/perl # ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA use File::Copy; use warnings; use strict; my $exit_with_help; if (!($ARGV[0])) { print "You must specify at least one ip.\n"; $exit_with_help = "true"; } if ($exit_with_help) { die "Usage: kadnodescreate.pl [hash:ip:TCPport:UDPport:type]+\n"; } print "Creating nodes.dat...\n"; #Open the new file open(MET," > nodes.dat"); binmode MET; my $contactcount = $#ARGV + 1; print "\tContacts: " . $contactcount . "\n"; print MET &int32_string($contactcount); my $contact; my $hash; my $ip; my $tcpport; my $udpport; my $type; my $contactnumber = 0; foreach $contact (@ARGV) { $contactnumber++; if ($contact =~ /^(.*):(.*):(.*):(.*):(.*)$/) { $hash = &check_hash($1); if ($hash == 0) { die "Malformed hash, can't continue: " . $1 . "\n"; } $ip = &check_ip($2); if ($ip == 0) { die "Malformed ip, can't continue: " . $2 . "\n"; } my $tcpport = &check_port($3); if ($tcpport == 0) { die "Malformed tcp port, can't continue: " . $3 . "\n"; } $udpport = &check_port($4); if ($udpport == 0) { die "Malformed udp port, can't continue: " . $4 . "\n"; } $type = &check_type($5); if ($type == 9) { die "Malformed contact type, can't continue: " . $5 . "\n"; } print "\t\tAdding Contact " . $contactnumber . ":\n"; print "\t\t\tHash : " . $1 . "\n"; print "\t\t\tIP : " . $ip . "\n"; print "\t\t\tTCPPort : " . $tcpport . "\n"; print "\t\t\tUDPPort : " . $udpport . "\n"; print "\t\t\tType : " . $type . "\n"; print MET &hash_string($1) . &int32_string($ip) . &int16_string($tcpport) . &int16_string($udpport) . &byte_string($type); } else { die "Malformed contact line, can't continue: " . $contact . "\n"; } } print "Closing nodes.dat\n\n"; close(MET); # Functions sub check_ip { my $ipresult = 0; if ($_[0] =~ /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/) { $ipresult = ($1*16777216) + ($2*65536) + ($3*256) + $4; } $ipresult; } sub check_port { my $portresult = 0; if ($_[0] =~ /^([0-9]{1,5})$/) { if ($1 < 65535) { $portresult = $1; } } $portresult; } sub check_type { my $typeresult = -1; if ($_[0] =~ /^([0-9])$/) { $typeresult = $1; } $typeresult; } sub check_hash { my $hashresult = 0; if ($_[0] =~ /^([A-Z]|[0-9]|[a-z]){32}$/) { $hashresult = 1; } $hashresult; } #Hex write functions sub byte_string { sprintf("%c",$_[0]); } sub int16_string { &byte_string($_[0] % 256) . &byte_string($_[0] / 256); } sub int32_string { &int16_string($_[0] % 65536) . &int16_string($_[0] / 65536); } sub int64_string { &int32_string($_[0] % 4294967296) . &int32_string($_[0] / 4294967296); } sub hash_string { my $i = 0; my $final_string = ""; while ($i < 32) { $final_string = $final_string . &byte_string(hex(substr($_[0],$i,2))); $i += 2; } $final_string; } aMule-2.3.1/src/utils/scripts/check_defines.pl0000755000175000017470000000572511575347521020237 0ustar topiusers#!/usr/bin/perl # ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Stu Redman ( sturedman@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # # To speed up compilation we compile some files used in amule, amuled, amulegui # into libs which we link to the apps. # This concept can only work if the files (or their includes) don't use # preprocessor macros used to tell these projects apart. # # This script checks for usage of these macros. # It has to be run from the src dir after running configure to build the deps. # use warnings; use strict; use Cwd; die 'run from src dir after making dependencies' unless -f '.deps/amule-amule.Po'; my %checkedFiles; # key: path value: 0: ok 1: has AMULE_DAEMON 2: has CLIENT_GUI sub checkDeps($$); my @deps; # libmuleappcommon @deps = glob('.deps/libmuleappcommon*.Po'); checkDeps(1,1); # libmuleappcore (ignore CLIENT_GUI usage) @deps = glob('.deps/libmuleappcore*.Po'); checkDeps(1,0); # libmuleappgui (ignore AMULE_DAEMON usage) @deps = glob('.deps/libmuleappgui*.Po'); checkDeps(0,1); # libcommon chdir 'libs/common'; @deps = glob('.deps/*.Po'); checkDeps(1,1); # libec chdir '../ec/cpp'; @deps = glob('.deps/*.Po'); checkDeps(1,1); sub checkDeps($$) { my $checkAMULE_DAEMON = shift; my $checkCLIENT_GUI = shift; printf("check %d dependencies in %s\n", scalar @deps, getcwd()); foreach (@deps) { open(DEP, $_) or die "can't open $_ : $!"; my @lines = ; close DEP; my $line = join(' ', @lines); $line =~ tr/:\\/ /; my @files = split(/\s+/, $line); my $obj = shift @files; my %currentFiles; foreach my $file (@files) { next if $file =~ m-^/usr/-; # skip system and wx includes next if $file =~ m-/wx/-; next if $currentFiles{$file}; $currentFiles{$file} = 1; my $status = $checkedFiles{$file}; unless (defined $status) { $status = 0; open(SRC, $file) or die "can't open $file : $!"; while () { $status |= 1 if /^\s*\#.+AMULE_DAEMON/; $status |= 2 if /^\s*\#.+CLIENT_GUI/; } close SRC; $checkedFiles{$file} = $status; } print "$obj: AMULE_DAEMON used in $file\n" if $checkAMULE_DAEMON && ($status & 1); print "$obj: CLIENT_GUI used in $file\n" if $checkCLIENT_GUI && ($status & 2); } } } aMule-2.3.1/src/utils/scripts/wikify_latest_changelog0000755000175000017470000000342711543632432021726 0ustar topiusers#!/bin/bash ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # Wikifies lastest changelog entry. No sanity checking. Must be run from sources root folder. if test x"`ls docs/Changelog`" = x""; then echo "This script must be run on aMule base directory." else CHANGELOG="Changelog-`grep -h -E 'Version [0-9]\.[0-9]+\.[0-9]+.*' docs/Changelog | head -n 1 | cut -d ' ' -f 2`" head -n `grep -hn -E '(\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-)+' docs/Changelog | cut -d ':' -f 1 | head -1` docs/Changelog > $CHANGELOG sed -i -r "s/\t([A-Z,a-z].+):$/'''\1:'''/g" $CHANGELOG sed -i -r "s/^(Version .+)$/=== \1 ===/g" $CHANGELOG sed -i -r "s/^----------$//g" $CHANGELOG sed -i -r "s/^([0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?)$/''\1''/g" $CHANGELOG sed -i -r "s/\t+(\*? .+)$/\1/g" $CHANGELOG while test x"`grep -E '^\s+.+$' $CHANGELOG`" != x""; do sed -i -r "N s/^(\*?.*)\n\s+([^\*]+)$/\1 \2/g " $CHANGELOG; done echo "$CHANGELOG created." fi aMule-2.3.1/src/utils/scripts/logfilter0000755000175000017470000000322311575347521017031 0ustar topiusers#!/usr/bin/python # # This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # # Usage: # svn log ... | logfilter [ [ ...]] import sys line = sys.stdin.readline() while line: if not line.strip().startswith("-"): foundNick = False for user in sys.argv[1:]: if user == line.lower().split()[2]: foundNick = True break if foundNick: print ("-" * 72) print line.strip() # Check for -q if line.count("|") > 2: lineCount = int(line.split("|")[-1].split()[0]) line = sys.stdin.readline() if foundNick: print line.rstrip() if line.strip() == "Changed paths:": line = sys.stdin.readline() while line.strip(): if foundNick: print line.rstrip() line = sys.stdin.readline() if foundNick: print for i in range(lineCount): line = sys.stdin.readline() if foundNick: print line.rstrip() line = sys.stdin.readline() aMule-2.3.1/src/utils/scripts/version_bumper0000755000175000017470000000643411543632432020101 0ustar topiusers#!/bin/sh ################################################## # aMule Version Info Bumper # ################################################## ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA if test x"$1" = x""; then echo "aMule Version Info Bumper v0.2" echo "Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org )" echo "Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )" echo -e "Usage:" echo -e "\tversion_bumper [old_version] new_version" echo -e "Examples:" echo -e "\tUpdates version 2.1.0 info to 2.1.1 -> version_bumper 2.1.0 2.1.1" echo -e "\tUpdates current version to 2.1.1 \(autodetect old version\) -> version_bumper 2.1.1" echo " - This script is buggy and can kill your dog. Be careful. -" else if test x"`ls configure.in`" = x""; then echo "This script must be run on aMule base directory." else OLD_VERSION=$1 NEW_VERSION=$2 if test x"$NEW_VERSION" = x""; then NEW_VERSION=$OLD_VERSION OLD_VERSION=`grep "PROJECT_NUMBER" docs/Doxyfile | grep "=" | sed -r "s/\s+/ /g" | cut -d " " -f 3` echo "Autodetected old version: $OLD_VERSION" fi if test x"`echo "$OLD_VERSION" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+"`" != x"$OLD_VERSION"; then echo "Specified old version ($OLD_VERSION) does not conform to a.b.c form." else if test x"`echo "$NEW_VERSION" | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+"`" != x"$NEW_VERSION"; then echo "Specified new version ($NEW_VERSION) does not conform to a.b.c form." else echo "Bumping from $OLD_VERSION to $NEW_VERSION" #Command: sed -i "s/$OLD_VERSION/$NEW_VERSION/g" aMule.app/Contents/Info.plist configure.in src/include/common/ClientVersion.h docs/Doxyfile aMule.spec po/*.po sed -i -r "s/VERSION_MJR\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 1`/VERSION_MJR\t\t`echo $NEW_VERSION | cut -d "." -f 1`/g" src/include/common/ClientVersion.h sed -i -r "s/VERSION_MIN\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 2`/VERSION_MIN\t\t`echo $NEW_VERSION | cut -d "." -f 2`/g" src/include/common/ClientVersion.h sed -i -r "s/VERSION_UPDATE\s+(0x0)?`echo $OLD_VERSION | cut -d "." -f 3`/VERSION_UPDATE\t\t`echo $NEW_VERSION | cut -d "." -f 3`/g" src/include/common/ClientVersion.h if test x"`grep -E "^#define __SVN__$" src/include/common/ClientVersion.h`" != x""; then echo "WARNING! ClientVersion.h still defines version as SVN. Please comment the line \"#define __SVN__\" before releasing." fi fi fi fi fi aMule-2.3.1/src/utils/scripts/year_bumper0000755000175000017470000000343511575347521017361 0ustar topiusers#!/bin/sh -eu ## This file is part of the aMule Project ## ## Copyright (c) 2011 Dévai Tamás ( gonosztopi@amule.org ) ## Copyright (c) 2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # Usage: # year_bumper [oldyear [newyear]] # # oldyear defaults to the year found in configure.in # newyear defaults to the current year if [ ! -f ./configure.in ]; then echo "This script must be run from the source root directory!" exit 1 fi if [ $# -ge 1 ]; then oldyear="$1" else oldyear=`sed -e 's/# Copyright (c) 2003-\([0-9]\{4\}\).*/\1/;t;d' ./configure.in` fi if [ $# -ge 2 ]; then newyear="$2" else newyear=`date "+%Y"` fi echo "Bumping from ${oldyear} to ${newyear}..." if [ "$newyear" = "$oldyear" ]; then echo "Nothing to do." exit fi find '.' \ '(' \ -name '.svn' -o \ -name '.hg' -o \ -name '.git' -o \ -name '*.wdr' \ ')' -prune -o \ -type f -print | \ while read f; do if file "$f" | grep -q text ; then if grep -q "$oldyear" "$f" ; then echo $f sed -i -e "/Copyright/{s/-${oldyear}/-${newyear}/g;s/${oldyear}/${oldyear}-${newyear}/g;}" "$f" fi fi done aMule-2.3.1/src/utils/scripts/MacOSX/0000755000175000017470000000000011657306231016200 5ustar topiusersaMule-2.3.1/src/utils/scripts/MacOSX/defs-global.sh0000755000175000017470000000552311644164062020723 0ustar topiusers# Global definitions for MacOSX builds # (c) 2011 Angel Vidal ( kry@amule.org ) # Public domain. Use at your own risk. . defs-functions.sh # Wouldn't I love to have bash4 on MacOSX (case fallthrough) pn "-- Begin global def section --" SVN_REPOSITORY=$1 if [ -z $SVN_REPOSITORY ]; then AMULE_FOLDER=`cd ${SCRIPTDIR}/../../../../; pwd` if [ -f "${AMULE_FOLDER}/src/amule.cpp" ]; then pc $GREEN "\tSVN repository has not been specified, using detected local sources at \"${AMULE_FOLDER}\"" else pc $RED "\tSVN repository has not been specified, and no local sources found at \"${AMULE_FOLDER}\".\n\tPlease specify your aMule source folder by setting the AMULE_FOLDER variable, or call the script with the SVN repository of your choice as a first parameter, or \"public\" to download from our public SVN repository." exit fi fi if [ -z "$BUILD_FOLDER" ]; then if [ -z $SVN_REPOSITORY ]; then BUILD_FOLDER="$AMULE_FOLDER/build/" mkdir $BUILD_FOLDER 2>/dev/null else BUILD_FOLDER=`pwd` fi pc $BLUE "\tAutomatically setting build folder to ${BUILD_FOLDER} - set BUILD_FOLDER to your preferred folder to change this setting." else pc $GREEN "\tSetting build folder to $BUILD_FOLDER" fi ROOT_FOLDER=`cd $BUILD_FOLDER; pwd` if [ -z $AMULE_FOLDER ]; then AMULE_FOLDER="${ROOT_FOLDER}/amule-dev" fi pc $GREEN "\tBuild root absolute path is $ROOT_FOLDER" if [ "$SDKNUMBER" == "" ]; then pc $BLUE "\tAutomatically setting SDK to 10.4u (tiger with i386 and ppc, gcc 4.0) - set SDKNUMBER to your preferred SDK if you want to target it (10.5, 10.6, 10.7) or \"default\" for the default SDK." SDKNUMBER=10.4 fi case "$SDKNUMBER" in "10.4") SDKRELEASE=10.4u CCVERSION="-4.0" ;; "10.5"|"10.6"|"10.7") SDKRELEASE=$SDKNUMBER ;; default) ;; *) pc $RED "Valid SDKNUMBER values are 10.4, 10.5, 10.6, 10.7 and default." exit ;; esac pc $GREEN "\tUsing $SDKNUMBER SDK" if [ "$SDKNUMBER" != "default" ]; then SDK="-isysroot /Developer/SDKs/MacOSX${SDKRELEASE}.sdk -mmacosx-version-min=$SDKNUMBER" else SDKNUMBER="" fi if [ "$UNIVERSAL" == "" ]; then pc $BLUE "\tAutomatically enabling universal (i386, ppc) build. Set UNIVERSAL=NO to build just for the current architecture." UNIVERSAL="YES" fi case "$UNIVERSAL" in "NO"|"no") pc $GREEN "\tDisabling universal build" ARCHCPPFLAGS="$BUILDARCHS" ARCHCONFIGFLAGS="" ;; "YES"|"yes") pc $GREEN "\tUsing universal build (i386, pcc)" ARCHCPPFLAGS="-arch i386 -arch ppc" ARCHCONFIGFLAGS="--enable-universal_binary" CCVERSION="-4.0" ;; *) pc $RED "Only the values \"NO\" and \"YES\" are valid for UNIVERSAL" exit ;; esac if [ "$STDOUT_FILE" == "" ]; then STDOUT_FILE=${ROOT_FOLDER}/build_output fi if [ "$ERROR_FILE" == "" ]; then ERROR_FILE=${ROOT_FOLDER}/error_output fi pc $GREEN "\tErrors will be redirected to $ERROR_FILE, normal build output to $STDOUT_FILE" pn "-- End global def section --" aMule-2.3.1/src/utils/scripts/MacOSX/defs-wx.sh0000755000175000017470000001005511563661440020117 0ustar topiusers# Definitions for MacOSX compilation of wxWidgets. # (c) 2011 Angel Vidal ( kry@amule.org ) # Public domain. Use at your own risk. . defs-functions.sh pn "-- Begin wxWidgets def section --" if [ "$WXVERSION" == "" ]; then pc $BLUE "\tAutomatically setting wxWidgets version to 2.8.x - set WXVERSION to your desired version (accepted values are 2.8 and svn right now) if you want to use a different one." WXVERSION=2.8 fi case "$WXVERSION" in "2.8") WXSVNROOT="branches/WX_2_8_BRANCH" WXFOLDER="wxWidgets-2.8" AUTOPORT=carbon ;; "svn"|"SVN") WXSVNROOT="trunk/" WXFOLDER="wxWidgets" AUTOPORT=cocoa ;; *) pc $RED "Valid WXVERSION values are 2.8 and svn." exit ;; esac pc $GREEN "\tUsing wxWidgets $WXVERSION" if [ "$WXPORT" = "" ]; then pc $BLUE "\tAutomatically selecting the $AUTOPORT port for wxWidgets $WXVERSION - set WXPORT to your desired port (accepted values are carbon and cocoa right now) if you want to use a different one." WXPORT=$AUTOPORT fi case "$WXPORT" in COCOA|cocoa) if [ "$WXVERSION" == "2.8" ]; then pc $RED "The $WXWIDGETS port on wxWidgets $WXVERSION is unusable for this application. Please select a different port, or a different wxWidgets version." exit fi PORTFLAGS="--with-cocoa" ;; CARBON|carbon) PORTFLAGS="--with-carbon" ;; *) pc $RED "Valid WXPORT values are cocoa and carbon." exit ;; esac pc $GREEN "\tUsing wxWidgets $WXPORT port." if [ "$SLIMWX" == "" ]; then pc $BLUE "\tAutomatically selecting full wx compilation. Set SLIMWX to YES to compile only parts used by the application, which can result in a smaller binary (but can fail if the script hasn't been updated after adding new class usage)" SLIMWX=NO fi case "$SLIMWX" in YES|yes) pc $GREEN "\tUsing minimal wxWidgets compilation." SLIM_WX_FLAGS="--without-odbc --without-expat --without-libtiff --without-libjpg \ --without-libmspack --without-sdl --without-gnomeprint --without-gnomevfs --without-opengl \ --without-dmalloc --without-themes --disable-sdltest --disable-gtktest \ --disable-pnm --disable-iff --disable-tga --disable-pcx \ --disable-dragimage --disable-metafiles --disable-joystick \ --disable-splines --disable-miniframe --disable-wizarddlg \ --disable-tipdlg --disable-numberdlg --disable-finddlg --disable-choicedlg \ --disable-popupwin --disable-tipwindow --disable-toolbook \ --disable-treebook --disable-tabdialog--disable-searchctrl \ --disable-odcombobox --disable-listbook --disable-hyperlink \ --disable-dataviewctrl --disable-grid --enable-fontpicker \ --disable-display --disable-datepick --disable-collpane --disable-choicebook \ --disable-caret --disable-calendar --disable-bmpcombobox --disable-animatectrl \ --disable-metafile --disable-postscript --disable-graphics_ctx --disable-richtext \ --disable-webkit --disable-mdidoc --disable-mdi --disable-aui \ --disable-htmlhelp --disable-html --disable-mshtmlhelp --disable-help --disable-variant \ --disable-printfposparam --disable-gstreamer8 --disable-mediactrl \ --disable-tarstream --disable-mslu --disable-ole \ --disable-dynamicloader --disable-dynlib --disable-dialupman --disable-apple_ieee \ --disable-palette --disable-compat26 --disable-docview --disable-aboutdlg" ;; NO|no) pc $GREEN "\tUsing full wxWidgets compilation." SLIM_WX_FLAGS="" ;; *) pc $RED "Valid SLIMWX values are YES and NO." exit ;; esac EXTRA_WXFLAGS="$PORTFLAGS $SLIMWXFLAGS --with-libpng --with-regex --enable-gif --enable-accesibility --enable-progressdlg \ --enable-textdlg --enable-busyinfo --enable-fontdlg --enable-filedlg --enable-coldlg \ --enable-treectrl --enable-slider --enable-listbox --enable-gauge --enable-filepicker \ --enable-dirpicker --enable-colourpicker --enable-checklst --enable-printarch \ --enable-protocol --enable-protocol-http --enable-protocol-ftp --enable-protocol-file \ --enable-sound --enable-unicode --enable-stopwatch --enable-snglinst --enable-ipc \ --enable-sockets --enable-protocols --enable-ftp --enable-config --with-zlib --enable-textfile \ --enable-textbuf --enable-url --enable-datetime --enable-http --enable-fileproto" pn "-- End wxWidgets def section --" aMule-2.3.1/src/utils/scripts/MacOSX/application_packager.sh0000755000175000017470000001004311575347521022703 0ustar topiusers#!/bin/bash ################################################## # aMule.app bundle creator. # ################################################## ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( http://www.amule-project.net ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA SRC_FOLDER=$1 if [ -z $SRC_FOLDER ]; then SRC_FOLDER="./" fi echo "" echo -n "Step 1: Cleaning bundle... " rm aMule.app/Contents/Frameworks/libwx_* aMule.app/Contents/MacOS/* 1> /dev/null 2> /dev/null rm -r aMule.app/Contents/Resources/webserver 1> /dev/null 2> /dev/null rm -r aMule.app/Contents/SharedSupport 1> /dev/null 2> /dev/null echo "Done" echo "" echo -n "Step 2: Copying aMule to app bundle... " cp ${SRC_FOLDER}/src/amule aMule.app/Contents/MacOS/ cp ${SRC_FOLDER}/src/webserver/src/amuleweb aMule.app/Contents/MacOS/ cp ${SRC_FOLDER}/src/ed2k aMule.app/Contents/MacOS/ cp ${SRC_FOLDER}/src/amulecmd aMule.app/Contents/MacOS/ cp ${SRC_FOLDER}/platforms/MacOSX/aMule-Xcode/amule.icns aMule.app/Contents/Resources/ cp -R ${SRC_FOLDER}/src/webserver aMule.app/Contents/Resources find aMule.app/Contents/Resources/webserver \( -name .svn -o -name "Makefile*" -o -name src \) -print0 | xargs -0 rm -rf echo "Done" echo "" echo -n "Step 3: Installing translations to app bundle... " orig_dir=`pwd` pushd ${SRC_FOLDER}/po make install datadir=$orig_dir/aMule.app/Contents/SharedSupport 1> /dev/null 2> /dev/null popd echo "Done" echo "" echo "Step 4: Copying libs to Framework" echo " wxWidgets..." # wxWidgets libs to frameworks for i in $( otool -L aMule.app/Contents/MacOS/amule \ aMule.app/Contents/MacOS/amuleweb \ aMule.app/Contents/MacOS/ed2k \ aMule.app/Contents/MacOS/amulecmd \ | sort -u | grep libwx_ | cut -d " " -f 1 ); do cp $i aMule.app/Contents/Frameworks; done echo "Libs copy done." echo "" echo "Step 5: Update libs info" #then install_name_tool on them to fix the path on the shared lib pushd aMule.app/Contents/ for i in $( ls Frameworks | grep -v CVS); do echo " Updating $i" #update library id install_name_tool -id @executable_path/../Frameworks/$i Frameworks/$i #update library links for j in $( otool -L Frameworks/$i | grep libwx_ | cut -d " " -f 1 ); do install_name_tool -change \ $j @executable_path/../Frameworks/`echo $j | rev | cut -d "/" -f 1 | rev` \ Frameworks/$i 1> /dev/null 2> /dev/null done echo " Updating aMule lib info for $i" #update amule executable install_name_tool -change \ `otool -L MacOS/amule | grep $i | cut -d " " -f 1` \ @executable_path/../Frameworks/$i MacOS/amule 1> /dev/null 2> /dev/null install_name_tool -change \ `otool -L MacOS/amuleweb | grep $i | cut -d " " -f 1` \ @executable_path/../Frameworks/$i MacOS/amuleweb 1> /dev/null 2> /dev/null install_name_tool -change \ `otool -L MacOS/ed2k | grep $i | cut -d " " -f 1` \ @executable_path/../Frameworks/$i MacOS/ed2k 1> /dev/null 2> /dev/null install_name_tool -change \ `otool -L MacOS/amulecmd | grep $i | cut -d " " -f 1` \ @executable_path/../Frameworks/$i MacOS/amulecmd 1> /dev/null 2> /dev/null done echo "Libs info updated, aMule.app is ready to package." echo "" popd echo -n "Creating aMule.zip... " zip -9 -r aMule.zip aMule.app/ > /dev/null zip -9 -j ${SRC_FOLDER}/docs/README.Mac.txt ${SRC_FOLDER}/docs/COPYING > /dev/null echo "Done" echo "" aMule-2.3.1/src/utils/scripts/MacOSX/full_build.sh0000755000175000017470000003346411644157721020676 0ustar topiusers#!/bin/bash ################################################## # aMule.app bundle creator. # ################################################## ## This file is part of the aMule Project ## ## Copyright (c) 2011 Angel Vidal ( kry@amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA SCRIPTDIR=`dirname "$0"` SCRIPTNAME=`basename "$0"` ## Get full path SCRIPTDIR=`cd $SCRIPTDIR; pwd` PATH="$SCRIPTDIR:$PATH" . defs-global.sh $1 . defs-wx.sh . defs-functions.sh echo "Start" > $STDOUT_FILE echo "Start" > $ERROR_FILE REPEATSCRIPT=${ROOT_FOLDER}/repeat.sh if [ -f $REPEATSCRIPT ]; then chmod 600 $REPEATSCRIPT fi echo "Save configuration commandline to ${REPEATSCRIPT} - execute that script to repeat this compilation with the same options." echo "#!/bin/bash" > $REPEATSCRIPT echo "echo \"Starting repeat, moving away current repeat.sh\"" >> $REPEATSCRIPT echo "rm -rf \${0}.old 2>/dev/null; mv \$0 \${0}.old" >> $REPEATSCRIPT if [ x"$SDKNUMBER" == x"" ]; then SDKSTRING="default" else SDKSTRING=$SDKNUMBER fi echo "BUILDARCHS=\"${BUILDARCHS}\" SDKNUMBER=\"${SDKSTRING}\" UNIVERSAL=\"${UNIVERSAL}\" WXVERSION=\"${WXVERSION}\" WXPORT=\"${WXPORT}\" SLIMWX=\"${SLIMWX}\" BUILD_FOLDER=\"${BUILD_FOLDER}\" $0" >> $REPEATSCRIPT echo "echo \"Repeat finished\"" >> $REPEATSCRIPT chmod 500 $REPEATSCRIPT echo "Starting build..." echo -e "\tGetting aMule sources..." #Get aMule first, because it may contain patches if [ -d $AMULE_FOLDER/ ]; then if [ -d ${AMULE_FOLDER}/.svn/ ]; then echo -e "\t\tSources already exist, updating." pushd $AMULE_FOLDER/ >> $STDOUT_FILE svn up >> $STDOUT_FILE popd >> $STDOUT_FILE else echo -e "\t\taMule sources at \"" $AMULE_FOLDER "\" are not from SVN checkout, so not updating." fi else echo -e "\tFirst checkout." if [ "$SVN_REPOSITORY" == "public" ]; then SVN_REPOSITORY=http://amule.googlecode.com/svn/trunk/ echo -e "\tUsing public SVN repository at ${SVN_REPOSITORY}." else echo -e "\tUsing provided SVN repository at ${SVN_REPOSITORY}." fi svn co $SVN_REPOSITORY $AMULE_FOLDER >> $STDOUT_FILE if [ ! -d $AMULE_FOLDER/ ]; then echo "ERROR: aMule sources could not be retrieved. Review your settings." exit fi fi pushd $ROOT_FOLDER >> $STDOUT_FILE echo -e "\tDone" echo -e "\tGetting wxWidgets sources..." if [ -d ${WXFOLDER} ]; then pushd ${WXFOLDER} >> $STDOUT_FILE svn up >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE else echo -e "\tFirst checkout." svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/${WXSVNROOT} ${WXFOLDER} >> $STDOUT_FILE 2>> $ERROR_FILE pushd ${WXFOLDER} >> $STDOUT_FILE echo -e "\tApplying patches." for i in $AMULE_FOLDER/src/utils/patches/wxWidgets/*.patch; do echo -e "\t\tAppying \"$i\"" patch -p0 < $i >> $STDOUT_FILE 2>> $ERROR_FILE done popd >> $STDOUT_FILE fi echo -e "\tDone" echo -e "\tConfiguring wxWidgets..." pushd ${WXFOLDER} > $STDOUT_FILE if [ "$SDKNUMBER" == "" ]; then WX_SDK_FLAGS="" else WX_SDK_FLAGS="--with-macosx-sdk=/Developer/SDKs/MacOSX${SDKRELEASE}.sdk \ --with-macosx-version-min=$SDKNUMBER" fi if [ -e amulewxcompilation ]; then echo -e "\t\twxWidgets is already configured" else make clean >> $STDOUT_FILE 2>/dev/null ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \ CFLAGS="$CFLAGS $ARCHCPPFLAGS" CXXFLAGS="$CXXFLAGS $ARCHCPPFLAGS" CPPFLAGS="$CPPFLAGS $ARCHCPPFLAGS" \ LDFLAGS="$LDFLAGS $ARCHCPPFLAGS" \ OBJCFLAGS="$OBJCFLAGS $ARCHCPPFLAGS" OBJCXXFLAGS="$OBJCXXFLAGS $ARCHCPPFLAGS" \ --enable-debug --disable-shared \ $EXTRA_WXFLAGS \ $ARCHCONFIGFLAGS \ $WX_SDK_FLAGS >> $STDOUT_FILE 2>> $ERROR_FILE touch amulewxcompilation >> $STDOUT_FILE echo -e "\t\tConfigured." fi echo -e "\t\tDone" echo -e "\tCompiling wxWidgets..." make >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\tDone" popd >> $STDOUT_FILE CRYPTOPP_FOLDER="cryptopp-source" CRYPTOPP_FOLDER_INST="cryptopp" CRYPTOPP_URL=`curl -sS http://www.cryptopp.com/ | grep -oE "http://.*/cryptopp/cryptopp[0-9]+\.zip" | sort -r | head -1` echo -e "\tGetting cryptopp sources..." if [ -d $CRYPTOPP_FOLDER_INST ]; then echo -e "\t\t$CRYPTOPP_FOLDER_INST already exists, skipping (delete and rerun script to get new sources)" else mkdir $CRYPTOPP_FOLDER mkdir $CRYPTOPP_FOLDER_INST curl -L -o cryptopp.zip $CRYPTOPP_URL >> $STDOUT_FILE 2>> $ERROR_FILE unzip cryptopp.zip -d $CRYPTOPP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE pushd $CRYPTOPP_FOLDER >> $STDOUT_FILE #./configure for i in $AMULE_FOLDER/src/utils/patches/cryptopp/*.patch; do echo -e "\t\tAppying \"$i\"" patch -p0 < $i >> $STDOUT_FILE 2>> $ERROR_FILE done #cp ../GNUMakefile . echo -e "\t\tCompiling cryptopp..." CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \ CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" make > $STDOUT_FILE 2> $ERROR_FILE PREFIX=${ROOT_FOLDER}/$CRYPTOPP_FOLDER_INST make install >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE rm cryptopp.zip >> $STDOUT_FILE 2>> $ERROR_FILE rm -rf $CRYPTOPP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE fi echo -e "\tDone" # Gettext echo -e "\tGetting gettext sources..." GETTEXT_FOLDER="gettext-source" GETTEXT_FOLDER_INST="gettext-inst" GETTEXT_URL=`curl -sS http://www.gnu.org/software/gettext/ | grep -m 1 -oE "http://[^\"]+/gettext-([0-9]+\.)+tar.gz" | head -1` if [ -d $GETTEXT_FOLDER_INST ]; then echo -e "\t\t$GETTEXT_FOLDER_INST already exists, skipping" else mkdir $GETTEXT_FOLDER mkdir $GETTEXT_FOLDER_INST curl -L -o gettext.tar.gz $GETTEXT_URL >> $STDOUT_FILE 2>> $ERROR_FILE pushd $GETTEXT_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\t\tCompiling gettext..." tar --strip-components 1 -zxf ../gettext.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \ CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" \ --disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$GETTEXT_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE make >> $STDOUT_FILE 2>> $ERROR_FILE make install >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE 2>> $ERROR_FILE rm gettext.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE rm -rf $GETTEXT_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE fi echo -e "\tDone." #libupnp echo -e "\tGetting libupnp sources..." LIBUPNP_FOLDER="libupnp-source" LIBUPNP_FOLDER_INST="libupnp-inst" LIBUPNP_URL=`curl -sS http://sourceforge.net/projects/pupnp/files/ | grep -m 1 -ioE "http://sourceforge.net/[^\"]+/libupnp-([0-9]+\.)+tar.bz2/download" | head -1` if [ -d $LIBUPNP_FOLDER_INST ]; then echo -e "\t\t$LIBUPNP_FOLDER_INST already exists, skipping" else mkdir $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE mkdir $LIBUPNP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE curl -L -o libupnp.tar.bz2 $LIBUPNP_URL >> $STDOUT_FILE 2>> $ERROR_FILE pushd $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\t\tCompiling libupnp..." tar --strip-components 1 -jxf ../libupnp.tar.bz2 >> $STDOUT_FILE 2>> $ERROR_FILE ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \ CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \ --disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$LIBUPNP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE make >> $STDOUT_FILE 2>> $ERROR_FILE make install >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE 2>> $ERROR_FILE rm libupnp.tar.bz2 >> $STDOUT_FILE 2>> $ERROR_FILE rm -rf $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE fi echo -e "\tDone." #geoip echo -e "\tGetting GeoIP sources..." LIBGEOIP_FOLDER="libgeoip-source" LIBGEOIP_FOLDER_INST="libgeoip-inst" LIBGEOIP_URL="http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz" if [ -d $LIBGEOIP_FOLDER_INST ]; then echo -e "\t\t$LIBGEOIP_FOLDER_INST already exists, skipping" else mkdir $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE mkdir $LIBGEOIP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE curl -L -o libgeoip.tar.gz $LIBGEOIP_URL >> $STDOUT_FILE 2>> $ERROR_FILE pushd $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\t\tCompiling GeoIP..." tar --strip-components 2 -zxf ../libgeoip.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \ CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \ --disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$LIBGEOIP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE make >> $STDOUT_FILE 2>> $ERROR_FILE make install >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE 2>> $ERROR_FILE rm libgeoip.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE rm -rf $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE fi echo -e "\tDone." #pkg-config echo -e "\tGetting pkg-config sources..." PKGCFG_FOLDER="pkgcfg-source" PKGCFG_FOLDER_INST="pkgcfg-inst" # pkgconfig introduced a dependency on glib to build on 0.26, and I refuse to build the whole glib for this. # On top of it, glib uses pkgconfig to configure itself... #PKGCFG_FILE=`curl -sS http://pkgconfig.freedesktop.org/releases/ | grep -ioE "pkg-config-([0-9]+\.)+tar.gz" | uniq | sort -r | head -1` #PKGCFG_URL="http://pkgconfig.freedesktop.org/releases/${PKGCFG_FILE}" PKGCFG_URL="http://pkgconfig.freedesktop.org/releases/pkg-config-0.25.tar.gz" if [ -f $PKGCFG_FOLDER_INST/bin/pkg-config ]; then echo -e "\t\t$PKGCFG_FOLDER_INST already exists, skipping" else mkdir $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE mkdir $PKGCFG_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE curl -L -o pkgcfg.tar.gz $PKGCFG_URL >> $STDOUT_FILE 2>> $ERROR_FILE pushd $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\t\tCompiling pkg-config..." tar --strip-components 1 -zxf ../pkgcfg.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \ CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \ --disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$PKGCFG_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE make >> $STDOUT_FILE 2>> $ERROR_FILE make install >> $STDOUT_FILE 2>> $ERROR_FILE popd >> $STDOUT_FILE 2>> $ERROR_FILE if [ -f $PKGCFG_FOLDER_INST/bin/pkg-config ]; then rm -f pkgcfg.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE rm -rf $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE else echo -e " ERROR: check output $STDOUT_FILE and $ERROR_FILE for details. " fi fi echo -e "\tDone." # aMule echo -e "\tFINALLY compiling aMule..." pushd $AMULE_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE if [ -f configure ]; then echo -e "\t\tConfigure already exists" else PATH="${PATH}:${ROOT_FOLDER}/${GETTEXT_FOLDER_INST}/bin" ./autogen.sh >> $STDOUT_FILE 2>> $ERROR_FILE fi if [ -d intl/ ]; then echo -e "\t\tGood: intl folder already exists." else mkdir intl >> $STDOUT_FILE 2>> $ERROR_FILE touch intl/Makefile.in >> $STDOUT_FILE 2>> $ERROR_FILE echo "all:" > intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE echo "clean:" >> intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE echo "" >> intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE fi if [ ! -f src/amule ]; then MULECLEAN=YES fi rm -rf ${ROOT_FOLDER}/amule-inst/ mkdir -p ${ROOT_FOLDER}/amule-inst/ if [ "$MULECLEAN" == "YES" ]; then echo -e "\t\tRunning configure" PATH="${PATH}:${ROOT_FOLDER}/${GETTEXT_FOLDER_INST}/bin/:${ROOT_FOLDER}/${PKGCFG_FOLDER_INST}/bin/" \ ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \ CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" \ --enable-nls --disable-dependency-tracking --enable-ccache \ --with-wxdir=${ROOT_FOLDER}/${WXFOLDER}/ \ --with-crypto-prefix=${ROOT_FOLDER}/$CRYPTOPP_FOLDER_INST \ --with-libintl-prefix=${ROOT_FOLDER}/${GETTEXT_FOLDER_INST} \ --with-libupnp-prefix=${ROOT_FOLDER}/${LIBUPNP_FOLDER_INST} \ --with-geoip-static --with-geoip-headers=${ROOT_FOLDER}/${LIBGEOIP_FOLDER_INST}/include --with-geoip-lib=${ROOT_FOLDER}/${LIBGEOIP_FOLDER_INST}/lib/ \ --disable-cas --disable-webserver --disable-amulecmd --disable-amule-gui --disable-wxcas --disable-alc --disable-alcc --disable-amule-daemon \ --prefix=${ROOT_FOLDER}/amule-inst/ >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\t\tCleaning compilation" make clean >> $STDOUT_FILE 2>> $ERROR_FILE fi echo -e "\t\tCompiling aMule" make >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\tDone." echo -e "\t\tFaking install" make install >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "\tDone." popd >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "Getting application bundle and packaging" rm -rf aMule.app aMule.zip >> $STDOUT_FILE 2>> $ERROR_FILE cp -R ${AMULE_FOLDER}/aMule.app . >> $STDOUT_FILE 2>> $ERROR_FILE find aMule.app \( -name .svn -o -name "Makefile*" -o -name src \) -print0 | xargs -0 rm -rf >> $STDOUT_FILE 2>> $ERROR_FILE echo -e "Copying i18n files..." cp -r amule-inst/share/locale aMule.app/Contents/SharedSupport/ echo -e "Done." . application_packager.sh ${AMULE_FOLDER}/ >> $STDOUT_FILE 2>> $ERROR_FILE if [ ! -f aMule.zip ]; then echo "ERROR: aMule.zip was not created. Please review the output files" else echo "All Done" fi # Pop root folder. popd >> $STDOUT_FILE aMule-2.3.1/src/utils/scripts/MacOSX/defs-functions.sh0000755000175000017470000000043011554465065021472 0ustar topiusers# Some helper functions for scripts. # (c) 2011 Angel Vidal ( kry@amule.org )) # Public domain. Use at your own risk. RED="\033[1;31m" BLUE="\033[0;34m" GREEN="\033[0;36m" NONE="\033[0m" function pn { echo -e $@ } function pc { echo -en $1 shift pn $@ echo -en $NONE } aMule-2.3.1/src/utils/scripts/sanity0000755000175000017470000005231111575347521016353 0ustar topiusers#!/usr/bin/ruby # This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # # This function returns true if a file is filtered # and shound't be included in the sanity testing. def IsFiltered(filename) (["./config.h", "./configWIN32.h"].index(filename) != nil) or (filename =~ /^.\/intl\//) or (filename =~ /CryptoPP/) end # This class represents lines of code, with line-number and text # It is used to store the source-files once they have been read # and afterwards to store the lines returned by the filters. class Line def initialize( number, text ) @number = number @text = text end attr_reader :number attr_reader :text end class Result def initialize( type, file, line = nil ) @type = type @file = file @line = line end def file_name @file.slice( /[^\/]+$/ ) end def file_path @file.slice( /^.*\// ) end attr_reader :type attr_reader :file attr_reader :line end # Base class for Sanity Checkers # # This class represents the basic sanity-check, which returns all # files as positive results, regardless of the contents. class SanityCheck def initialize @name = "None" @title = nil @type = "None" @desc = "None" @results = Array.new end attr_reader :name attr_reader :type attr_reader :desc def title if @title then @title else @name end end def results @results end # This function will be called for each file, with the argument "file" as the # name of the file and the argument "lines" being an array of Line objects for # each line of the file. # def parse_file(file, lines) raise "Missing parse_file() implementation for Filter: #{@name}" end private def add_results( file, lines = [nil] ) lines.each do |line| @results << Result.new( self, file, line ) end end end class CompareAgainstEmptyString < SanityCheck def initialize super @name = "CmpEmptyString" @title = "Comparing With Empty String" @type = "Good Practice" @desc = "Comparisons with empty strings, such as wxT(\"\"), wxEmptyString and " @desc += "_(\"\") should be avoided since they force the creation of a temporary " @desc += "string object. The proper method is to use the IsEmpty() member-function " @desc += "of wxString." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /[!=]=\s*(wxEmptyString|wxT\(""\)|_\(""\))/ or line.text =~ /(wxEmptyString|wxT\(""\)|_\(""\))\s*[!=]=/ end add_results( file, results ) end end class AssignmentToEmptyString < SanityCheck def initialize super @name = "EmptyStringAssignment" @title = "Assigning The Empty String" @type = "Good Practice" @desc = "Assigning an empty string such as wxT(\"\"), wxEmptyString and _(\"\") " @desc += "to a wxString should be avoided, since it forces the creation of a " @desc += "temporary object which is assigned to the string. The proper way to " @desc += "clear a string is to use the Clear() member-function of wxString." end def parse_file(file, lines) if file =~ /\.cpp$/ results = lines.select do |line| line.text =~ /[^=!]=\s*(wxEmptyString|wxT\(""\)|_\(""\))/ end add_results( file, results ) end end end class NoIfNDef < SanityCheck def initialize super @name = "NoIfNDef" @title = "No #ifndef in headerfile" @type = "Good Practice" @desc = "All header files should contain a #ifndef ____. The purpose is to ensure " @desc += "that the header can't be included twice, which would introduce a number of problems." end def parse_file(file, lines) if file =~ /\.h$/ then if not lines.find { |x| x.text =~ /^#ifndef.*_H/ } then add_results( file ) end end end end class ThisDeference < SanityCheck def initialize super @name = "ThisDeference" @title = "Dereference of \"this\"" @type = "Good Practice" @desc = "In all but the case of templates, using \"this->\" is unnecessary and " @desc += "only decreases the readability of the code." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /\bthis->/ end add_results( file, results ) end end class Assert < SanityCheck def initialize super @name = "Assert" @type = "Consistency" @desc = "wxASSERT()s should be used rather than normal assert()s " @desc += "for the sake of consistency." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /assert\s*\(/ end add_results( file, results ) end end class WxFailUsage < SanityCheck def initialize super @name = "WxFailUsagesy" @title = "Always failing wxASSERT()" @type = "Good Practice" @desc = "Use wxFAIL instead of an always failing wxASSERT()." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /\bwxASSERT\s*\(\s*(0|false)\s*\)/ or line.text =~ /\bwxASSERT_MSG\s*\(\s*(0|false)\s*,/ end add_results( file, results ) end end class PassByValue < SanityCheck def initialize super @name = "PassByValue" @title = "Pass By Value" @type = "Good Practice" @desc = "Passing objects by value means an extra overhead for large datatypes. " @desc += "Therefore these should always be passed by const reference when possible. " @desc += "Non-const references should only be used for functions where the function is " @desc += "supposed to change the actual value of the argument and return another or no value." end def parse_file(file, lines) results = Array.new # Only handle header files if file =~ /\.h$/ # Items that should not be passed by value items = [ "wxString", "wxRect", "wxPoint", "CMD4Hash", "CPath" ] lines.each do |line| # Try to identify function definitions if line.text =~ /^\s*(virtual|static|inline|)\s*\w+\s+\w+\s*\(.*\)/ # Split by arguments if line.text =~ /\(.*\)\s*\{/ args = line.text.match(/\(.*\)\s*\{/)[0] else args = line.text.match(/\(.*\)/)[0] end args.split(",").each do |str| items.each do |item| if str =~ /#{item}\s*[^\s\&\*\(]/ results.push( line ) end end end end end end add_results( file, results ) end end class CStr < SanityCheck def initialize super @name = "CStr" @title = "C_Str or GetData" @type = "Unicoding" @desc = "Checks for usage of c_str() or GetData(). Using c_str will often result in " @desc += "problems on Unicoded builds and should therefore be avoided. " @desc += "Please note that the GetData check isn't that precise, because many other " @desc += "classes have GetData members, so it does some crude filtering." end def parse_file(file, lines) results = lines.select do |line| if line.text =~ /c_str\(\)/ and line.text !~ /char2unicode\(/ true else line.text =~ /GetData\(\)/ and line.text =~ /(wxT\(|wxString|_\()/ end end add_results( file, results ) end end class IfNotDefined < SanityCheck def initialize super @name = "IfDefined" @title = "#if (!)defined" @type = "Consistency" @desc = "Use #ifndef or #ifdef instead for reasons of simplicity." end def parse_file(file, lines) results = lines.select do |line| if line.text =~ /^#if.*[\!]?defined\(/ not line.text =~ /(\&\&|\|\|)/ end end add_results( file, results ) end end class GPLLicense < SanityCheck def initialize super @name = "MissingGPL" @title = "Missing GPL License" @type = "License" @desc = "All header files should contain the proper GPL blorb." end def parse_file(file, lines) if file =~ /\.h$/ if lines.find { |x| x.text =~ /This (program|library) is free software;/ } == nil add_results( file ) end end end end class Copyright < SanityCheck def initialize super @name = "MissingCopyright" @title = "Missing Copyright Notice" @type = "License" @desc = "All files should contain the proper Copyright notice." end def parse_file(file, lines) if file =~ /\.h$/ found = lines.select do |line| line.text =~ /Copyright\s*\([cC]\)\s*[-\d,]+ aMule (Project|Team)/ end if found.empty? then add_results( file ) end end end end class PartOfAmule < SanityCheck def initialize super @name = "aMuleNotice" @title = "Missing aMule notice" @type = "License" @desc = "All files should contain a notice that they are part of the aMule project." end def parse_file(file, lines) if file =~ /\.h$/ found = lines.select do |line| line.text =~ /This file is part of the aMule Project/ or line.text =~ /This file is part of aMule/ end if found.empty? then add_results( file ) end end end end class MissingBody < SanityCheck def initialize super @name = "MissingBody" @title = "Missing Body in Loop" @type = "Garbage" @desc = "This check looks for loops without any body. For example \"while(true);\" " @desc += "In most cases this is a sign of either useless code or bugs. Only in a few " @desc += "cases is it valid code, and in those it can often be represented clearer " @desc += "in other ways." end def parse_file(file, lines) results = lines.select do |line| if line.text =~ /^[^}]*while\s*\(.*\)\s*;/ or line.text =~ /^\s*for\s*\(.*\)\s*;[^\)]*$/ # Avoid returning "for" spanning multiple lines # TODO A better way to count instances line.text.split("(").size == line.text.split(")").size else false end end add_results( file, results ) end end class Translation < SanityCheck def initialize super @name = "Translation" @type = "Consistency" @desc = "Calls to AddLogLine should translate the message, whereas " @desc += "calls to AddDebugLogLine shouldn't. This is because the user " @desc += "is meant to see normal log lines, whereas the the debug-lines " @desc += "are only meant for the developers and I don't know about you, but " @desc += "I don't plan on learning every language we choose to translate " @desc += "aMule to. :P" end def parse_file(file, lines) results = lines.select do |line| if line.text =~ /\"/ line.text =~ /AddLogLine.?.?\(.*wxT\(/ or line.text =~ /AddDebugLogLine.?\(.*_\(/ else false end end add_results( file, results ) end end class IfZero < SanityCheck def initialize super @name = "PreIfConstant" @title = "#if 0-9" @type = "Garbage" @desc = "Disabled code should be removed as soon as possible. If you wish to disable code " @desc += "for only a short period, then please add a comment before the #if. Code with #if [1-9] " @desc += "should be left, but the #ifs removed unless there is a pressing need for them." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /#if\s+[0-9]/ end add_results( file, results ) end end class InlinedIfTrue < SanityCheck def initialize super @name = "InlinedIf" @title = "Inlined If true/false" @type = "Garbage" @desc = "Using variations of (x ? true : false) or (x ? false : true) is just plain stupid." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /\?\s*(true|false)\s*:\s*(true|false)/i end add_results( file, results ) end end class LoopOnConstant < SanityCheck def initialize super @name = "LoopingOnConstant" @title = "Looping On Constant" @type = "Garbage" @desc = "This checks detects loops that evaluate constant values " @desc += "(true,false,0..) or \"for\" loops with no conditionals. all " @desc += "are often a sign of poor code and in most cases can be avoided " @desc += "or replaced with more elegant code." end def parse_file(file, lines) results = lines.select do |line| line.text =~ /while\s*\(\s*([0-9]+|true|false)\s*\)/i or line.text =~ /for\s*\([^;]*;\s*;[^;]*\)/ end add_results( file, results ) end end class MissingImplementation < SanityCheck def initialize super @name = "MissingImplementation" @title = "Missing Function Implementation" @type = "Garbage" @desc = "Forgetting to remove a function-definition after having removed it " @desc += "from the .cpp file only leads to cluttered header files. The only " @desc += "case where non-implemented functions should be used is when it is " @desc += "necessary to prevent usage of for instance assignment between " @desc += "instances of a class." @declarations = Array.new @definitions = Array.new end def results @definitions.each do |definition| @declarations.delete_if do |pair| pair.first == definition end end return @declarations.map do |pair| Result.new( self, pair.last.first, pair.last.last ) end end def parse_file(file, lines) if file =~ /\.h$/ then level = 0 tree = Array.new lines.each do |line| level += line.text.count( "{" ) - line.text.count( "}" ) tree.delete_if do |struct| struct.first > level end if line.text !~ /^\s*\/\// and line.text !~ /^\s*#/ and line.text !~ /typedef/ then if line.text =~ /^\s*(class|struct)\s+/ and line.text.count( ";" ) == 0 then cur_level = level; if line.text.count( "{" ) == 0 then cur_level += 1 end name = line.text.scan( /^\s*(class|struct)\s+([^\:{;]+)/ ) if name != [] then name = name.first.last.strip else name = "Unknown at line " + line.number.to_s + " in " + file end tree << [ cur_level, name ] elsif line.text =~ /;\s*$/ and line.text.count( "{" ) == 0 then # No pure virtual functions and no return(blah) calls (which otherwise can fit the requirements) if line.text !~ /=\s*0\s*;\s*$/ and line.text !~ /return/ then re = /^\s*(virtual\s+|static\s+|inline\s+|)\w+(\s+[\*\&]?|[\*\&]\s+)(\w+)\(/.match( line.text ) if re and level > 0 and tree.last then @declarations << [ tree.last.last + "::" + re[ re.length - 1 ], [ file, line ] ] end end end end end else lines.each do |line| if line.text =~ /\b\w+::\w+\s*\([^;]+$/ @definitions << line.text.scan( /\b(\w+::\w+)\s*\([^;]+$/ ).first.first end end end end end # List of enabled filters filterList = Array.new filterList.push CompareAgainstEmptyString.new filterList.push AssignmentToEmptyString.new filterList.push NoIfNDef.new filterList.push ThisDeference.new filterList.push Assert.new filterList.push PassByValue.new filterList.push CStr.new filterList.push IfNotDefined.new filterList.push GPLLicense.new filterList.push Copyright.new filterList.push PartOfAmule.new filterList.push MissingBody.new filterList.push Translation.new filterList.push IfZero.new filterList.push InlinedIfTrue.new filterList.push LoopOnConstant.new filterList.push MissingImplementation.new filterList.push WxFailUsage.new # Sort enabled filters by type and name. The reason why this is done here is # because it's much easier than manually resorting every time I add a filter # or change the name or type of an existing filter. filterList.sort! do |x,y| cmp = x.type <=> y.type if cmp == 0 then x.title <=> y.title else cmp end end def parse_files( path, filters ) filters = filters.dup require "find" Find.find( path ) do |filename| if filename =~ /\.(cpp|h)$/ and not IsFiltered(filename) then File.open(filename, "r") do |aFile| # Read lines and add line-numbers lines = Array.new aFile.each_line do |line| lines.push( Line.new( aFile.lineno, line ) ) end lines.freeze # Check the file against each filter filters.each do |filter| # Process the file with this filter filter.parse_file( filename, lines ) end end end end results = Array.new filters.each do |filter| results += filter.results end results end # Helper-function def get_val( key, list ) if not list.last or list.last.first != key then list << [ key, Array.new ] end list.last.last end def create_result_tree( path, filters ) # Gather the results results = parse_files( path, filters ) # Sort the results by the following sequence of variables: Path -> File -> Filter -> Line results.sort! do |a, b| if (a.file_path <=> b.file_path) == 0 then if (a.file_name <=> b.file_name) == 0 then if (a.type.title <=> b.type.title) == 0 then a.line.number <=> b.line.number else a.type.title <=> b.type.title end else a.file_name <=> b.file_name end else a.file_path <=> b.file_path end end # Create a tree of results: [ Path, [ File, [ Filter, [ Line ] ] ] ] result_tree = Array.new results.each do |result| get_val( result.type, get_val( result.file_name, get_val( result.file_path, result_tree ) ) ) << result end result_tree end def create_filter_tree( filters ) # Change the filterList to a tree: [ Type, [ Filter ] ] filter_tree = Array.new filters.each do |filter| get_val( filter.type, filter_tree ) << filter end filter_tree end # Converts a number to a string and pads with zeros so that length becomes at least 5 def PadNum( number ) num = number.to_s if ( num.size < 5 ) ( "0" * ( 5 - num.size ) ) + num else num end end # Helper-function that escapes some chars to HTML codes def HTMLEsc( str ) str.gsub!( /\&/, "&" ) str.gsub!( /\"/, """ ) str.gsub!( //, ">" ) str.gsub!( /\n/, "
" ) str.gsub( /\t/, " " ) end # Fugly output code goes here # ... Abandon hope, yee who read past here # TODO Enable use of templates. # TODO Abandon hope. def OutputHTML( filters, results ) text = "

Filters

" # List the filters filters.each do |filterType| text += "
#{filterType.first}
" filterType.last.each do |filter| text += "
#{filter.title}
#{HTMLEsc(filter.desc)}

" end text += "
" end text += "

Directories

Results

" results.each do |dir| text += "

#{dir.first}

" dir.last.each do |file| text += "

#{file.first}

    " file.last.each do |filter| text += "
  • #{filter.first.title}
      " filter.last.each do |result| if result.line then text += "
    • #{PadNum(result.line.number)}: #{HTMLEsc(result.line.text.strip)}
    • " end end text += "
  • " end text += "
" end text += "

" end text += " " return text; end # Columnizing, using the http://www.rubygarden.org/ruby?UsingTestUnit example because I'm lazy # TODO Rewrite it to better support newlines and stuff def Columnize( text, width, indent ) return indent + text.scan(/(.{1,#{width}})(?: |$)/).join("\n#{indent}") end # Fugly output code also goes here, this is a bit more sparse than the HTML stuff def OutputTEXT( filters, results ) # List the filters text = "Filters\n" filters.each do |filterType| text += "\t* #{filterType.first}\n" filterType.last.each do |filter| text += "\t\t- #{filter.title}\n" text += Columnize( filter.desc, 80, "\t\t\t" ) + "\n\n" end end # List the directories text += "\n\nDirectories\n" results.each do |dir| text += "\t#{dir.first}\n" end text += "\n\nResults\n" # To avoid bad readability, I only use fullpaths here instead of sections per dir results.each do |dir| dir.last.each do |file| text += "\t#{dir.first}#{file.first}\n" file.last.each do |filter| text += "\t\t* #{filter.first.title}\n" filter.last.each do |result| if result.line then text += "\t\t\t#{PadNum(result.line.number)}: #{result.line.text.strip}\n" end end end text += "\n" end end return text; end #TODO Improved parameter-handling, add = for the outputing to a file ARGV.each do |param| case param when "--text" then puts OutputTEXT( create_filter_tree( filterList ), create_result_tree( ".", filterList ) ) when "--html" then puts OutputHTML( create_filter_tree( filterList ), create_result_tree( ".", filterList ) ) end end aMule-2.3.1/src/utils/scripts/stats.pl0000755000175000017470000000616611575347521016623 0ustar topiusers#!/usr/bin/perl # Copyright 2003-2005 Nathan Walp # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 50 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Taken from the Gaim project, modified by Angel Vidal (Kry) for the aMule project. use POSIX qw(strftime); my $PACKAGE="aMule"; my $DOMAIN="amule"; use Locale::Language; $lang{gl} = "Galician (Galiza)"; $lang{en_AU} = "English (Australian)"; $lang{en_CA} = "English (Canadian)"; $lang{en_GB} = "English (British)"; $lang{en_US} = "English (USA)"; $lang{es_MX} = "Spanish (Mexico)"; $lang{et_EE} = "Estonian (Estonia)"; $lang{it_CH} = "Italian (Switzerland)"; $lang{ko_KR} = "Korean (Korea)"; $lang{my_MM} = "Burmese (Myanmar)"; $lang{pt_BR} = "Portuguese (Brazilian)"; $lang{pt_PT} = "Portuguese (Portugal)"; $lang{'sr@Latn'} = "Serbian (Latin)"; $lang{zh_CN} = "Chinese (Simplified)"; $lang{zh_TW} = "Chinese (Traditional)"; opendir(DIR, ".") || die "can't open directory: $!"; @pos = grep { /\.po$/ && -f } readdir(DIR); foreach (@pos) { s/\.po$//; }; closedir DIR; @pos = sort @pos; $now = `date`; system("intltool-update --pot > /dev/null"); $_ = `msgfmt --statistics $DOMAIN.pot -o /dev/null 2>&1`; die "unable to get total: $!" unless (/(\d+) untranslated messages/); $total = $1; $generated = strftime "%Y-%m-%d %H:%M:%S", gmtime; $stats_generated = `date`; chomp($stats_generated); print "\n"; print "\n"; print "\n"; foreach $index (0 .. $#pos) { $trans = $fuzz = $untrans = 0; $po = $pos[$index]; print STDERR "$po..." if($ARGV[0] eq '-v'); system("msgmerge $po.po $DOMAIN.pot -o $po.new 2>$po.po.warnings"); $_ = `msgfmt --statistics $po.new -o /dev/null 2>&1`; chomp; if(/(\d+) translated message/) { $trans = $1; } if(/(\d+) fuzzy translation/) { $fuzz = $1; } if(/(\d+) untranslated message/) { $untrans = $1; } unlink("$po.new"); $warnings = `cat $po.po.warnings | grep -v done | wc -l | cut -d" " -f 1`; chop($warnings); unlink("$po.po.warnings") if $warnings eq "0"; $name = ""; $name = $lang{$po}; $name = code2language($po) unless $name ne ""; $name = "???" unless $name ne ""; print "\n" unless $po eq "en_GB"; print STDERR "done ($untrans untranslated strings).\n" if($ARGV[0] eq '-v'); } print "\n"; aMule-2.3.1/src/utils/scripts/mldonkey_importer.pl0000755000175000017470000002165011575347521021223 0ustar topiusers#!/usr/bin/perl # ## This file is part of the aMule Project ## ## Copyright (c) 2004-2011 Angel Vidal ( kry@amule.org ) ## Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # Gimme a break, is my first perl app... (Kry) use File::Copy; use warnings; use strict; my $exit_with_help; if (!($ARGV[0])) { print "You must specify the mldonkey config folder (usually ~/.mldonkey).\n"; $exit_with_help = "true"; } if (!($ARGV[1])) { print "You must specify the aMule temp folder for output.\n"; $exit_with_help = "true"; } if ($exit_with_help) { die "Usage: importer2.pl mldonkey_config_folder amule_temp_folder.\n"; } my $input_folder = $ARGV[0]; my $output_folder = $ARGV[1]; open(TEST,">" . $output_folder . "/test_file") or die "Unable to write to destination folder! Error: $!\n"; close(TEST); unlink($output_folder . "/test_file"); open(INFO, $input_folder . "/files.ini") or die "Cannot open input file" . $input_folder . "/files.ini for reading: $!"; # Open the file my $line="no"; while ($line !~ /^\s*files\s*=\s*\[\s*$/) { $line = ; if (!($line)) { die $input_folder . "/files.ini seems not to be a mldonkey files.ini\n"; } chop $line; } #We're at the start of the downloading files section. # Read info for each file. my $number = 1; while ($line && ($line !~ /^.*};\].*$/)) { print "Reading info for file $number\n"; &read_file_info; print "End reading\n\n"; $number++; } close(INFO); sub read_file_info { $line = ; my @md4_list = (); my @gap_list = (); my $file_size = 0; my $file_name = ""; my $part_file = ""; my $md4_hash = ""; my $done = "false"; while (($line) && ($line !~ /^\s*}.*/) && ($done ne "true")) { chop $line; if ($line =~ /.*file_network\s*=\s*(.*)$/) { print "Network is $1\n"; if ($1 ne "Donkey") { print "Cannot import non-ed2k part file, skipping\n"; while (($line) && ($line !~ /^\s*}.*/)) { $line = ; $done = "true"; } } } if ($line =~ /^\s*file_size\s*=\s*(\d+)\s*$/) { $file_size = $1; print "File size: $file_size\n"; } if ($line =~ /^\s*file_swarmer\s*=\s*\"(.*)\"\s*$/) { $part_file = $1; print "Part file to import: $part_file\n"; } if ($line =~ /^\s*file_md4\s*=\s*\"?(([A-Z]|[0-9])+)\"?\s*$/) { $md4_hash = $1; print "File hash: $md4_hash\n"; } if ($line =~ /^\s*file_filename\s*=\s*\"(.*)\"\s*$/) { $file_name = $1; print "File name: $file_name\n"; } if ($line =~ /^\s*file_md4s\s*=\s*\[\s*$/) { # Read the MD4 list my $result = ""; do { my $md4_line = ; if ($md4_line =~ /^\s*\"?(([A-Z]|[0-9])+)\"?;\]?\s*$/) { push(@md4_list,$1); if ($md4_line =~ /^.*;\].*$/) { $result = "done"; } } else { print "Malformed md4 hash line $md4_line"; @md4_list = (); $result = "error"; } } while (!($result)); if ($result eq "done") { print "MD4 list: @md4_list\n"; } } if ($line =~ /^\s*file_present_chunks\s*=\s*\[\s*$/) { # Read the gaps list my $result = ""; my @ml_gaps = (); do { my $gaps_line = ; if ($gaps_line =~ /^\s*\((\d+),\s*(\d+)\)(;|])\s*$/) { push(@ml_gaps,$1); push(@ml_gaps,$2); if ($gaps_line =~ /^.*\)\].*$/) { $result = "done"; } } else { print "Malformed gaps line $gaps_line"; $result = "error"; } } while (!($result)); if ($result eq "done") { # Process mldonkey gaps to aMule gaps print "ML Gaps list: @ml_gaps\n"; @gap_list = &convert_gap_format($file_size,@ml_gaps); print "aMule Gaps list: @gap_list\n"; } } if ($done ne "true") { $line = ; } } if ($done eq "true") { print "File import result: false\n"; } else { if ($file_name && $file_size && $md4_hash && $part_file) { if (!(@md4_list)) { print "WARNING: File has no md4 hashes list, imported file will have 0 bytes downloaded\n"; } my $first_free_number = &get_first_free_number; my $met_file = $output_folder . sprintf("/%03d.part.met",$first_free_number); &create_met_file($met_file,$file_name,$file_size,$md4_hash,@md4_list,"---",@gap_list); print "File $met_file imported successfully.\n"; my $from = $input_folder . "/" . $part_file; my $destination = $output_folder . sprintf("/%03d.part",$first_free_number); copy($from, $destination) or die "CRITICAL: File $from cannot be copied to $destination. Error: $!\n"; } else { print "Not enough info to import file, sorry.\n"; } } $line; } sub create_met_file { print "Parameters: @_\n"; #Open the new file open(MET," > $_[0]"); binmode MET; my $large_file = ""; # Met file version (1 byte) if ($_[2] < 4290048000) { # Not large file $large_file = "no"; printf MET &byte_string(0xe0); } else { $large_file = "yes"; printf MET &byte_string(0xe2); } # File modification time. 0 to force aMule rehash. (4 bytes) print MET &int32_string(0); # MD4 hash (16 bytes) print MET &hash_string($_[3]); #Calculate number of MD4 hashes my @md4_hashlist = (); my $i = 4; while ($_[$i] ne "---") { push (@md4_hashlist,$_[$i]); $i++; } $i++; my @gaps_list = (); while ($_[$i]) { push(@gaps_list,$_[$i]); $i++; } print "Write aMule gap list: @gaps_list\n"; my $md4_hashsize = @md4_hashlist; print "MD4 hashlist size $md4_hashsize\n"; #Number of MD4 hashes (2 bytes) print MET &int16_string($md4_hashsize); #Write MD4 hashes (16 bytes * number of hashes) my $md4_parthash = ""; foreach $md4_parthash (@md4_hashlist) { print MET &hash_string($md4_parthash); } #Number of tags (4 bytes) my $tags_number = 2; # Fixed tags (Name + Size) $tags_number = $tags_number + @gaps_list; print MET &int32_string($tags_number); #Name tag (x bytes) print MET &tag_string(2,0,0x01,$_[1]); # Tagtype string, id FT_FILENAME, value #Size tag (x bytes) if ($large_file eq "yes") { print MET &tag_string(0x0b,0,0x02,$_[2]); # Tagtype UINT64, id FT_FILESIZE, value } else { print MET &tag_string(3,0,0x02,$_[2]); # Tagtype UINT32, id FT_FILESIZE, value } my $t = 0; my $tag_type; if ($large_file eq "yes") { $tag_type = 0x0b; } else { $tag_type = 0x03; } while (@gaps_list[$t*2]) { my $gap_start = @gaps_list[$t*2]; my $gap_end = @gaps_list[$t*2+1]; print "Gap $t start $gap_start end $gap_end\n"; print MET &tag_string($tag_type,1,sprintf("%c%d",0x09,$t),$gap_start); print MET &tag_string($tag_type,1,sprintf("%c%d",0x0a,$t),$gap_end); $t++; } close(MET); } sub byte_string { sprintf("%c",$_[0]); } sub int16_string { &byte_string($_[0] % 256) . &byte_string($_[0] / 256); } sub int32_string { &int16_string($_[0] % 65536) . &int16_string($_[0] / 65536); } sub int64_string { &int32_string($_[0] % 4294967296) . &int32_string($_[0] / 4294967296); } sub hash_string { my $i = 0; my $final_string = ""; while ($i < 32) { $final_string = $final_string . &byte_string(hex(substr($_[0],$i,2))); $i += 2; } $final_string; } sub tag_string { # ONLY STRINGS AND UINT32/64 SUPPORTED my $final_string = ""; # Tag type $final_string = $final_string . &byte_string($_[0]); if ($_[1] == 0) { # Byte ID tag $final_string = $final_string . &int16_string(1); $final_string = $final_string . &byte_string($_[2]); } else { # String ID tag $final_string = $final_string . &int16_string(length $_[2]) . $_[2]; } if ($_[0] == 2) { $final_string = $final_string . &int16_string(length $_[3]) . $_[3]; } else { if ($_[0] == 3) { # UINT32 $final_string = $final_string . &int32_string($_[3]); } else { if ($_[0] == 0x0b) { # UINT64 $final_string = $final_string . &int64_string($_[3]); } } } $final_string; } sub convert_gap_format { my $total_size = $_[0]; my @converted_gaps = (); my $n = 1; if ($_[1] != 0) { push(@converted_gaps,0); push(@converted_gaps,$_[1]); } $n++; while ($_[$n+1]) { push(@converted_gaps,$_[$n]); push(@converted_gaps,$_[$n+1]); $n += 2; } if ($_[$n] != $total_size) { push(@converted_gaps,$_[$n]); push(@converted_gaps,$total_size); } @converted_gaps; } sub get_first_free_number { my $n = 1; my $result = 0; while (!$result && !($n>999)) { open(TEST, " <" . $output_folder . sprintf("/%03d.part.met",$n)) or $result=$n; close(TEST); $n++; } $result; } aMule-2.3.1/src/utils/scripts/denoiser.rules0000644000175000017470000001770311543632432020001 0ustar topiusers# This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # Copyright (c) 2006-2011 Dévai Tamás ( gonosztopi@amule.org ) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # # The sed script is tested with GNU sed versions 3.02, 4.1.2 # The generated Makefiles are tested with GNU make versions 3.79.1, 3.80 # Denoising levels: # # 0 - do nothing, handled outside the scope of this script. # # 1 - only strip Makefiles from comments and empty lines, this should # theoretically speed up 'make', although not as much that you could # notice it. # # 2 - leave directory change messages from make, but silence normal # command printing. No echo denoising at this level. # # 3 - silence all messages from make, and partial echo denoising. # # 4 - full denoising: # * silence all messages from make # * full echo denoising # * compiler warning suppression # Syntax of this file: # # This file gets preprocessed, all comments and empty lines removed. The # preprocessor understands '#if ', '#else' and '#endif' commands, as long # as they start on the first character on the line. No whitespace is # allowed before the commands. Note that the space character after #if is # part of the command, if it is replaced by a tab then it won't make a # command anymore! # # #if truth testing: # # #if currently understands only one keyword: 'level', followed by a number # - the current denoising level. There may be any arbitrary characters # between the keyword and the value - i.e. 'levels 2,3' will also match # when 'level 3' matches. # # #if preprocessor commands may be nested for at least 4000 levels deep :-) # # The preprocessor script can be found at the end of this file. # ----- now the code ----- # suppress messages from make #if levels 3,4 1 i\ MAKEFLAGS=-s --no-print-directory #endif #if level 2 1 i\ MAKEFLAGS=-w -s #endif #if levels 2,3,4 :0 #endif # delete comments /^#/ d # delete empty lines /^[ ]*$/ d # take precedence over automake's silent rules feature #if levels 2,3,4 /^AM_V_[A-Za-z]\+[ ]*=/ d /^am__v_[A-Za-z]\+_0\?[ ]*=/ d /^AM_DEFAULT_VERBOSITY[ ]*=/ d #endif # rewrite compiler flags #if level 4 /=/ { /^[^=]*[^R]CFLAGS/ b 8 /^[^=]*CPPFLAGS/ b 8 /^[^=]*CXXFLAGS/ b 8 b 9 :8 # save -Wl, -Wa, and -Wp, flags, they're for linker, assember and preprocessor respectively s/ -Wl,/ -%l,/g s/ -Wa,/ -%a,/g s/ -Wp,/ -%p,/g # delete all -W flags / -W/ s/ -W[^ ]*//g # restore -Wl, -Wa, and -Wp, flags s/ -%l,/ -Wl,/g s/ -%a,/ -Wa,/g s/ -%p,/ -Wp,/g # insert -w flag into MULECFLAGS and MULECXXFLAGS if it isn't already in /^MULEC\(XX\)\?FLAGS/! b 9 / -w/! s/=/= -w/ :9 } #endif # rewrite rules #if levels 2,3,4 # all rules contain ':' and start at the very beginning of the line /^[^ ].*:/ { # no rules contain '=', so just skip these lines /=/ b # save rule target in secondary buffer h s/\([^:][^:]*\):.*/\1/ x # skip continuation lines :1 /\\$/ { n b 1 } # process rule commands :2 n :3 # delete comments inside rules /^#/ { s/.*// N s/\n//g b 3 } # if the current line is empty or not anymore a command, parse as usual /^$/ b 0 /^[^ ]/ b 0 # get rid of the last pieces of automake's silent rules feature s/^ $(AM_V_[A-Za-z]\+)/ / x /^\n/ b 5 # skipping install-strip target, since it will trigger the echo-denoiser, # and would silence the whole installation, which is absolutely not wanted /^install-strip$/ { s/.*// x b 0 } # do some output based on rule target /\.o$/ { i\ echo "Compiling $(/ { g s/[^\n]*// x s/\n.*// b 6 } g s/[^\n]*// x s/\n.*// s/\(.*echo[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/ :6 } #endif (levels 3,4) # mkinstalldirs will also echo its job, sink its output too /$(mkinstalldirs)/ { G h s/\($(mkinstalldirs)[^;][^;]*\).*/\1/ # do not redirect if it's already redirected />/ { g s/[^\n]*// x s/\n.*// b 7 } g s/[^\n]*// x s/\n.*// s/\(.*$(mkinstalldirs)[^;][^;]*\)\(.*\)/\1>\/dev\/null\2/ :7 } #if level 4 # the above applies to msgfmt, but here it's enough to remove the '--statistics' flag /$(GMSGFMT)/ s/--statistics// # msgmerge needs a --silent flag s/$(MSGMERGE)/\0 --silent/ s/$(MSGMERGE_UPDATE)/\0 --silent/ #endif # the following two ruleset must be the last two in this block and in this order! #if levels 3,4 # uninstallation /^[ ]*rm -f[^;]*$(DESTDIR)/ { x /uninstall/ { H g s/.*rm -f[^;]*$(DESTDIR)\([^;" ][^;" ]*\).*/ echo "Uninstalling \1"; \\/ P g s/[^\n]*// x s/\n.*// # skip checking for install: 1) trivially false 2) uninstall would match /install/ b 2 } x } # installation /^[ ]*$([^)]*INSTALL/ { x /install/ { H g s/.*$(DESTDIR)\([^;" ][^;" ]*\).*/ echo "Installing \1"; \\/ s/$(modulesdir)$$dir/$(modulesdir)/ P g s/[^\n]*// x s/\n.*// b 2 } x } #endif (levels 3,4) b 2 } #endif (levels 2,3,4) # ---- the preprocessor ---- ## default processing mode is 'true' #1 { # x # s/.*/1/ # x #} # ## delete empty lines #/^[ ]*$/ d; # ## look for "#if " #/^#if / { # /level.*$level/ { # x # s/^/1/ # x # b0 # } # x # s/^/0/ # x # :0 # d #} # ## process "#else" #/^#else/ { # x # /^1/ { # s/1/0/ # b1 # } # s/0/1/ # :1 # x # d #} # ## check for "#endif" #/^#endif/ { # x # s/.// # x # d #} # ## delete comments #/^[ ]*#/ d # ## process code lines according to #if/#else/#endif #x #/^1/ { # x # b #} #x #d aMule-2.3.1/src/utils/cas/0000755000175000017470000000000011657306263014172 5ustar topiusersaMule-2.3.1/src/utils/cas/stat.png0000644000175000017470000042512311062302214015640 0ustar topiusersPNG  IHDRvxsRGBbKGD pHYs   IDATxڜٯ$~Y19=׮U:>w|m7}ݍRj! ^O//-!ЀPKiUujŠ̘̌cwV萶"VFD-ӗ@J@H`K_2S>~4fڽPj|->%p% eN<b}(h/J&2Ro?yu1%oϪv)z c6J#eYpQfhDoo9Ζ\ۭ=筒@̐@!o,7BapUeGE .s1.TWJlv npq(>V;V})Z7OR}{,wm no9.޺f1fkkHvZ -{k!9NZ^kWD)6j]>-UNs%`Y q)cacdyۿa1HdZL11ig01Fy 0͛4K?5YLɶDL-!m1CL|Ys Fz^{☑CkG-#t Fmo06[y?o,Kg3ަ8 6rS7(_R^mGE]A U=:fy]ˬKN:79G'c.\W:Uח<結NN6'G{o.SDyTe'PYEtk?Njlwڌfu{]ONW<~@2l$VaӨ}vfzy:.uԿN󐧗~Je^RCs62-QA)mo6 i#rnKSܖ;"'B#zP< 욭gitqf8&fcvM@ԉmRS[Nz i¥p|B4 8M[̃k|KEWX "Y]$V1Ibo;鱴,L$qH2w""e4G[}uAX uNk;ZRC3%E}da e7})Qzym$u$^>#%Yu̯4g~4xuס,٦cyDۧ͝$qpMM=l'tٴECWx~DG6ihcZBˏ BCX/P> u;w;h۹_!y|ő:A˞/5J5 pJ Հ${(x<\.vaO_"dT/lp:R:KbJgI9N)l 9R= PڪS?\Bk鳪3W"KLmT&6>pzQ:tto74m:Jqd1Rȋ j4z1L={&Q"Ն{ :QAl;%V;[?Je<-]BMZ* EL" R SDjnfP\V/R_= RNLVB8J;b6- 3zwnݡ|0YXĘĘp711&^^k @.Wsi-׋GT9Ub~[eVkEb^eQX ={Sׯ"?uxO=% Rbz0i4DED1C4$e W!!_!s0i]= o.<Ƌ+!ϷitN =Pnx!cq d,.3K,vl؅^"5O^igEtʟHZ,9v36"z^ﯓ؅^W>+gC7xg&miy  d'wb'[HxwA)nf*,+,S ~=h*x=V,ɳkQ[2b2K*:bR^>tZ[9gA6Tk.W0SHMҟl9L7qˤ냪uޜ5[[fZݶ,Gڂp#-=xKv|aia tIq.!j Y]v~GOH4tbSgo#Klg%,itiq @jHtP(EI]^C^K:"FpVdICT'1oV*;Mj5R4zKY\4zЯU=ޜ4BIM]d&SYˠY>:ln堂GnrR}KgDJpԝR=PvKiddj,l%a/}5tPi/O(zp_1Z)"w.w xT,MIG*V,fP5}}E?="5O)&1+2yAW2)sL83QxV Ϫt1ɘe7(e  Jzilc, XhXͭ#\o]etdsoY[̽sClϻ(e\KhS?G]4)ՠ>vjGaHG0씝ިgh^~F<@EWh^|`ac,vP.$^\ XQ`u`c seɈi 6G7rGL?vk+ݚi'5ܙ! ovf팪m;s/-cz.!Ϟ֔MF=tWiuJƆP Sh.V=5b{2-\=6&e7]`q__ N8`!0N*usN؍ O'\0?Q%nYG PbSjZk<o3AQM%(3;չAuvhq$-P#im@Elǰ x?OZCܻWZ?5йR+2v/>s>&B`3:K ƾXk&̀Gtvc_I68m;eJv^?ZmWmT0֪rmN0Wn7Iq&u淄WC]ذK۶}jn!UGf6zuy_?OS3v>oR][Q~מrTm+[h{n}Y}~ֶ6߸~vĝ][}[Cϰl/vtN-ڣsvjv[ިgE\ ^\TۮYWU{=/ 1-gorU5FDy}g4zU[b-=?; +nAb7>lF8P?-uFWu;ߵbִl`7.|/L6ǖ,@raޟJ-YŔ63Th>ɎtXU\] FӺao$2߬[A]K[4W?7aI``I1z3elf8";Gu莔GSu[f_|yW oodjnq?̕[AǼ?lY)CBݱvLO*{U?|x=^ P ]p,.1󰵰:ٌ:>@iKRjxS7{/EuYAeP78_bՀEkoYCG_هk[[V05| aC@Kyh'9?*Zt+6p5xރk t}?^{aqta߮k{}WPw\ ިgPWUprP {kz3ۨ uknEty=F61z0/O{b#s؈ÃWh~i3n*6b@}Q;M{`4zUy/#hZǟMPw:Ρ97>ԧ(pkx:Y%&|{غ_4=SXuהg4~WV|ez 'Zho hs Y=sܹ92vgm8JZ|,J QVlh7pI"eՊ5sқT90+2ZnNn"؟ˬ,EY(w&gImvJ'mdgwlq_ҟq_"-R#['Bc\&EtV\ƚ6Z)v)>2ȿI+R_><dBfz,>Ũ.g~˯)70r~1!]+=D2Q,R2:y]vQ}F76딣\(ڲ(AonLGx7~xx&7TRUro -ˏ(ՠcEK$,3]b/8]~b!G+5l$R1MI"m(dգqW[3U$0OJ!V8D`%6'+AEӹD;#hM /I̎5Ämc@p8?v2gZ036F+=.ȋ ۈ& =EN;%!zC3j.`@mWiC[])v҉-93:wڤ-v>t;fd*8j>ʂ5\ 1iΧVڡEu^MZ0?Qxqw.Y w`52XtAkofy(hC}uI@sZଽQQ۱9'6NlY8^ҙ ?*Z%{ī!_+@Ԓڪ'+Vr w3E맜Lr}:ۄmZIڒT:{f73g >O$]Ys+:o Sz^`2Q]Lcwl2s%Mu| |eI!rNJD`GҠIL CQuF t9]ՠ5tn [[]]P^t qTpӱqjDXd 7!z6'ub[0vgnHJ%lϻCaba;', ק9նRihc&N+[+wHHVvVvAo@v0ܐtȤ9[CL$R-9](35JjVtKD,2f;8 d[vu+lфnG\ql)(yAe(d;cǫmcgL Y1oe ޳B$#D h-K:J+sF2gT ,P❘L9{Li9FR!gftiPxHeN78m aL M1>ႢQ H\g]*+j~>{/nW$5Y{&b})U}MdDd*:Ŝ_/|R`wux&hI8#mt dܱN܈1넎u ܇dfVBϲ]w/,e|rkJr=%: /D 1'ܨ IDATC^*>^C?᭘=ux^%Sf<6cqY!ֱ,L< (c:_ov1Uw#blDuDxh^L]Sw̽9OhUհPq[A9c:fVJOSepuòUPNX ظӼV[ỉu&oP}T?x/ :qK4O>WP,r?9GyRIx$5MiJҵXZ*LSI=WR+EIǧokYzf"!?%b|+[2̿/|9_ߠaO8:)sLcJFY 2Ra ;Bc7 _Y4"a#$-"$wqIiVLtK ]֥bnNu3t+TgPLѥE0.>'&Ƴ|U_/pReĮU;Sz4]Z_71?-kH>2eN\x7 \,0>`"kneG~1~51>95Xۮ`5ЯswZ'#dT D2=E.ikU'0"cLb4%3f H1͒f)FcN6Uh4Rps~eќ㣯nܭA/KDsb Y:1 w%$1*v.fdS:{ hzjIQC]k`I̙%`4u&JM!#0FImu|6b kڙ% Ol{6_MT{5nz+D)6:t\,1E%2D IeC\'MtN/h$C5)[w%EmfOcF weNl= =:rCԐ@^)Ivr8¢n'N9h`c'UjIiԘ/37 tP^l>3AzuZ{KE]^t Z{AX+vk BFGS)F~+ E.A6@C qpcGQs>"%j(p%5~uJQr@R3oz=R,a7j>=UZ gĊ/VLRVG{-=wܝ?|5l>٬btB`ќW oP)1Ӻ=w?vH@"#ۘP %.Wt{[JD&ߜ]pԜH͙$ ƽ)axGTC n4b+S,w0lYֆ7lq^3<ܮAox]m5'Pk['?_m@>4f z]zL8G{Uyi8rWy2ć]ׅ]%GSx;ʭN|FuBz^^ٙɼ9 :?cu4f /˙~kVr=w_Olc%>RMUԼbdu+J]^Ʉ)LSA/1E!*pIbvfo}C/Q+n뇸++n6j=Ep3]eX> {_rޘq(:C;dug/];vʭZ󐄫!LF++]Qog)>\MjCc֕јݮUrodǙeg2t7PDg Rn[A9p{<ݽc^䴿 -t+.e)3}qX`/ nF`wi2qsLѕn}[Ž<$YVi}R Rk1BҨ#C KbW!db.;L*b BDQ>d;Y %1LԏX2a,Z):p@K Xv\,,֪I uPHW٥a(_/X1y[AuHt郅;RqtK K!K*̜a%ZnBn,Iv=  9ÌzC3nq.: SH BP5[ . 'E}\b y-|gVT-AՒ jfy#YUKt%T:`*DZNpב R'Tr _әh $ǘظyHG}Wo?=3,i&s!n 1x:"-؅Q>"{X4 bwLi}W+-C1*VzQ+P01svs K Ig6ۇ4ZKiYvɥ>ȸU*$FbA`(I _,vC&a++Uɘc;G:SI'/k "%sos"Ťd,JaWK&hP6f42ƽ7~pJ*Ȼ.˥V_'-jn x25V߭-򭡃p1[[IxJv* N,2"C#fND$&4m>BD`!Аe7i61q$r^tkӜ6d&IMS5Id=%ITfϜ$*FIdBMU:bn̲9k+KEgjDnW\)VE W74~fNε>Y)#j{^Xř5vEҀ%$VaL&ݑM91wN[$\01p='?el}Ao^EY3E@*s"D+yJZ/-0S% UuN0td) !#I1S[v-%»Հku“Vd3' %âL?k,Vue+&){>8!5Q,hjWCs~yHqB87\ [87]۬&vuvnk:j;٥d|xM?ƷQE5C#ٽycY{k'_ qU6Tձ^ݞ| tC485]'wrZO-Z3&_yDx2hOxrNNQUn1}`=A1Ŝ_ !)ٓOݜϞ'zc`(̳;Jìo 3=z} ve AxKJq_"}p#}\0lٺ8azipRݼzhqjC=ѷ3:[y׊[ujtB!c|vl(kໞL 1/wO4obڱJkTr҄iҭC8XmwD`a†4xo_ʞ=Iپ?@=tKݲ(^s+ݗgx/r_9d w ]5heV&Qݔk#3 ʀa˾DO ]40W9"]Ac`vaLbAZ1=YAp0k֜xhYJ_08;'}{ۑ(̕["% w[7Õ:Z^/ihDu9W ϛ5ȉӒ3n }!*tF LE;#mgEJPŝ &eorD =sא-,6EDat`={\N/;L>^0OY.u,L鱻4IVK:Sz}}xiCVq+ɗO' yS3[eRˈEg  z`!uQM8T5ح!o]  2$ l&b:&" $jgb[XR&,>>$ITKN)mKtΦ%cfaJx!KؐN)Mdj+Vʌep0:Պ1RebKo>zZW" 7ؒHgbKL!hy ӽvh2ţmf""1cBAtSdVГWyZ)EDϽ)֜ [b9k&!З YH).⌎2)Tޫhj$yDM0[fXO֘!Kq9&*6o<|:Pʠ}{E3dl :sx]t*л {%~y^{jus:A~V:Ay gY^H~NJyR󄤬'/w-)~aqW*^=V1eWl)=CeckP''C@Yi.A RNT'izü=NX-b1_:$GK.,>ZcocY~gV{WuWwO gHqe;DEX H" @/ FK (@IVl8JdDJ"99rf8ګz|8;=U@{{yf{{ልy[;[o4F'+v~Xr`-ߛiwsͲ蕥;ˆ❌.#ҬqRo=S)y{pזf[}e&K7MA|*E uc*#K*Jhl5ӧ4x(f>:6jtƥ#0MV2칓YKxӤ12 uӃՠ[`>z-Iײe4A"n.CsfnZIQԋsFlɔ.28iPuvn)̖&+;3w`*ʆGq7vԟY&p"O#'ܹM$xw5bfp|l}e7ǘՃ1Y+/8=TT>L[jNy=MHGhF-J˸5796x 8V:^q nŝ*Lc5;, o:/ފ[DtĠcnR}u!EջS>g,yYt.o{Ͷ[ٖ@kx?WOΤ :TQ>oVܫxeO>ݧ;F ayYՋ؞Rދ<9{MTГ/uύ ncn4nP1u)n@ڟ 8&')nԮo%7+v+f{G6y͒Ʉxq$Y:i].;9 Qk <ϰtXLϥ]V}M[kMG3B7UnF+i")%RBYPTYLbpD( 4uy- ݲ\u-da2y uA s'V֨9UVŒBWZJSmJ{ 6'˚ VK ^҈|⡌⨄E12JOP4\'s#%v ) .,1K;#}$ E4i.HcuGE*Y6#:fF]:C|x< Q%n7ZwaHd=1k%8hne< Vsbxb1%y}`a6o;ߐo/nJ'monMbwSX.Goa&c[3vO~ݵu:dLc.ƭ貽2]Q>sc^H sE-ݰk߻eTҭdN3#R| H(-ȭ9E7\{^C̬TJZI%+Z!% L%~ uJ&s7[v79C.;c$aZyD("S_G6'#-L\Jg3en3eBF8 Su=ќFL:ޏ>gAC@e)) q{7Ɍ gqe$udZnݧ>h.?ş\m:yp7>ݽ&R.NFKkl ʰn]CڂPx}&ZmqKj֊ p~\7*xPKb;gwA IDAT]d_l^ſy_Pve5al' _='{82%q#&{⌣;l=a=Cw!\\VvM.K6v#nI6)d+Ocg5ߏ+nz{8|_ %/_ڠ&}7P Du׫'!̚!rzZ$Si:RK'#SޫV]bLSЍn;rKƈ̇lxm~\;"ꯐ& :ףpD#nźb/mIߥ'>к~b0.V\5 :^Һ_Q}MK"M1f{weM"yڥk;gYKn\Bz>Lɶ.vʆ:vm]kȈkj(ޜ.Ȝ>X!uo_hs=󿙖޽&oiYy\g>拳<: \^Mrһ! o6qk qkR>wI^:g(U|L[W]׮UG-xJR\[-{/6z{/2מfwW]ӎ{? {ZK(>;9|;dzcko-!ʃ-(ZBw{{uKzw{ Q_8ݖ]ݗϯtcg(ߚs:?;=-aO>?g? ߞ?{BH 5}w}&傻eLFTe~:Q5jFsBxeP-4e4K+$D,$c gLnm#4Xsɋ1yS\"nvˆ&IL蹐4lS9íؗGtdJ%@3L.2V,qS)k gu tTj#UBLH0eY gu; < o\8LK&n.4C/֫Ɣ5](O#µeRntV(k`4X[dZFv}K(MdaQJr!uqBmIUPe1%af5C ~Fc7a#( 5L[ g.[a(VKNkTzB "Lk|%VP I5[Yìmj#b;B(c և)Wk:ie [:eFDG5T=Ø_ ܄LVB6sOo-r10d=}d<Ǵ,ڸ*zl$=GQ#x+nbeed 9yc3Ճ,1y>M'~z{e;4擻6&V5:.3w^soȇgŘ: IA|\bF 7K%r5G*%*iuP5-nTJ~m&Ҍc/4JkI5҈ )U:w2(Q)T>zB/'\Eװ[J;_x{_~W6_k^t>5w2c\{ ߖEw؏~UfeLX,ajHj,޹yںe:i"7䐤(ϧ6\]$. ͅ" *k]bsSW:%4.J ʫHbzo˴9.>bB4XCBQɽ{\ذ~\,Ç1MȨ}NP=v-KLg"ڞCpr$aOwY ?rHs ]͘ Ո'70, ˺ށz}Ee tcl* :0ȴ 6YLW+ MpLP5*"rWoĜ܅RgP&upIn" f#" s-C*SnhܢpX1? [Wu[~]**eŮ4M,Ebsim"BMD4̜5)RA&qPځ-WES#MHDĔ򺬹uugR'ݬ){AB bW#3G9uЩ}&uRH)Z7췻4Z!WL'Wx} }єbbĝVȄYܔ]י6oa'U6BO7a5ZAp((2H{ZZt$Ǹ(`Q5 rXp&O* )Yb2&flklk%]89[fԊN%F)V`3#qT֢r cGeC\ug'MZa, Ԍ4g_28tg 'mu)+RYp1|ʓ <' f*s5U^B?.[ETzaH`tšm|Ɉ'ؐ K3nǮ5"oΘqĦ,R o4yM uLzvRlJ^rrQGs%ySu !1fgF9:GE2I)^Yq3㸌3:#vn ]#BC1K&ՄQ;'r7ǷHKI#NQCS nՔah`u--[{dLȏCؕ2`r;It Fn%M Ҹia+_ko֦g={ ?  !HV㔗/{X:{ܦBge7XNKn.O+PG8>~~Aӓ7x\gJ[Ucp$I+f1="~X* x(|-R-K}q7ʛbe܄7"ٖ &II5=OlԾYeNR} \%_d)RfmV]䕃&rM^9]5$DUNIk ! H=yhF*7SLn5q54!{nfT`fHLUt6 C&\p-mSx7ԸToa8 I.`fEK#) tQٚaXK1']fJB(oÆ V%^*O^g :{8)&2ӈ粕hQBnhx+Q)K'mR6EJCLrOS$KeAƊSb-]s,>:Quyϗ'DyQU;Hf]*v$Pg"܊"MH9jD-﫤tMW3JY ["j}jJ*qUJ4oD#HDSJB QYT <#6hے\; 8C$oyUGtKz'N?-M(ȏ ֊lE*&S,͠M0O[vhB!Nf;.M4"Z:!:`*Ea*AJ 2Cj@e#Gnd bwlZHXbDcx]P%k̺JzL*Zz*:cVtT@(S -2fݪxqt61RF|q3#$(q>;\tvO\Lˢ4,6232Δ;lR+ CjE] t IROAՌh+<<6J'<D^hݦ3?c֐x^-V8!pk8p{;@F[1b[ u I#҉;&lYNػ?6f" 8|&z#^QacI9nkKkw<6Fs~Y9,3 -?K&<_C>\7eXK9ګF39rF|܆tc)ǎ#2%Axlšl"Ua8=~2)d2R)1(oD2rL|LT)d?Zf _LՏS mCoJk>X4jn# ӓ$" itW~yC?H|U[+͐/mƕ9c/legF}h:yѱay;zHUf\K(vƕʼn_yJ@)3z\4saI^2UD$>!T唺u%%Ek$C'e&_R+5A3h#./Dob'?~="ۘ:-%ݐ<dz% Y9Cf&JF[Q 1vHu k?$'cKZb})'߾+G>/{4HIr&3X"cMSCjAKf]rp ʍ|f 8_Pejt\|b6e~Aa\R)n$ (&={u7ou ,.=*|@6V-ŝN'SLToL(w* _z4"2^ ٌwʷ87"3w?|>Gow nv3$H@5=E{W&3tm&Sz,qu^l\YmSi7P 0+23Ǡ,.ˮ+rn)NHF#RafUd7hNW PFÅ1CZԉ9A`zCcb7g&?2@ }>"Z%6[$fw3Pž<"c3-ӯkJÐtCfw)f0$*d4eפr1u]ʛm:&B|$Nȳ9V3r3syisjO2e۔%ʂTncDJ,ը&X##ƪ()gqN%8}ֈhSB o12R1mZ0ORADW4Eْ̳r+"2"բ̫U-˴ W z"daTT ITiLe "/wf鑅%f5șf%UKd&^-k,țeMavYN7k#>fpb5,hE@X5vm(Xu"!DJ<Xn=EhTQv80OHn!f᜙+"cWaյc=w>#R fzEګ5gV( cRhJʨㅹF`~ 1 jGxe+t$/ɌF~c [亁& ?Ѣ7w$< \+f2"AZ9ؤ32!;r&SǎQ<[>_n 9yr" q7v.'d 69AN.fQ;2~[ҝboI떷B20ђ;N5ьBIդX)žWCl[9=Fnz pc_Ê\|v|TzZf-KCpVKĭ}F3ƎĖzXj$LX9Ӹy,w[YFNc273Km3n[n+r/'͋+()6}I*ir#3>@pa3Ŝ4Uˈp`6j1wOH2Kr@˕4c~D/{6wO w9re[L?A?\96 m];<+3J1S%aM8߻ǵ~A<⵲qMT_'qT6J~f3UqJ% ΧVf1y@0>~|-K'o`?n]aR~"/2ڗrEϣ}rL/h>WT6&xeV|+ظWc~+|+UYş>^Z1W3޽`#9 k+$LtLϿͧcfәl'1tBR13"ĐFrD9 PJێPŁкۏ"4i"SiEԕNX+*k⵳o=[,"L}Wwt>{ y^q]VC-HTfD*gFa?V/VM [RII*IP7+ |#*0ڛrMj$v`isSfH׈zCĢj|M6+ QZ%WJ=r bdZZmboLdwvLK)ߓYd./Jdž5\zŒ^0 З8sḛ\:#d*P7dW8 PՈi\rENY,oC).J SB8eo^QϰZX뗨HՐzQv݋f٪gqD*Gvl%"'-&EL`L? Iϰ[r4M4UYN'Typ̝sІ;;H%͠kKE^Nfo &^5 ,9Je34 2峦\֖bUtpEmg!c M^mYJ kT9k6 [%kcͱQuy`) .NM!X򜮽֊brVKk~bp5-1+(1yij]ԢD#԰5PT`jL7n^Լ㬍):0 mb$]s8_6Щf%^q3DM5%+TU,dHj4^rUt|B)S5׈י"$6J֙) ;6VGǻ{ow.1 Wx| 0s4~&_]߇gӟ7~m#Q<*BU.[BuN:KQKٿ|m53|J}H[? /0?>O|;sm ?r{dErA%*6;T::''?Yʏg?ɇQs?p՗x^1>f"MqvpOT[g1+3a;R? m"%OEwx{T>_ yЄ5_~Y-f '&BA:E9'URL,yMZ7U0C8lhx. ޤkvіaoҺY/=v> ڮ`Zyg/C/{GvqMt׶E ^).E@?b=; L[]/6{K&[z-m0 9BaC(SgW.ZT֙3Яή\K(+Y3: ..KLh@xB7W]`Z[[R15/R 󭠻qNԡ*D5Jʃ ,,.EȨ;d8ۊ8wszϝ@g+.hݥzxWV[ K' bͥtZN\wŚK9%bM4n!沰nDz`TVcf(S nEݒ]! h$$A>(c}͋y7ҝ0 %FcT]j]$vGV%8>JM(JAVl2DC6jQFVT8P#͐F銆zՖby+u8;9ʕBc~we&*Šy+ dhM̰̊B4H+mt"ci ~zyO7O ,D1&zI/AI%5fB"eSL;(݌p Z*b!лq'ȈfPwH҄>&ce2Q̰0me-.KөGL^- Qu_blh6AxUs^[^%U#8ͬW1w$u`ITFiәZ)V3=ӓ]VB_mLܛp;B:s='s2cpj:0.&'0)0I3 t!)Zc&!BQMiemī(C}wc7"%-O S__wd~>}į? q|ßweFLJN).I%ۙ I!!I `ySSxSAgwfUeoGt%F@HB @@a ^5a^{a6G8±55cHAH0}ά}{쪮'|Nr7}y \aտm5u>L<sWgٟ~?zGD]Yx5uQ35je;w=[F:#6dC{1{P]PQRƸ֡ȝւĝl%Ї72̭w>:vK] i{NQ|>~}g{o &_oqzcqFSw 2N+lnh/~~2]-b$rD|I f1F+By^06oxdrUH]ԙ{5ً3u\1O.x==ZN{e5N^{kvz uUeE(x+BG'-*=HqՖ7HZ`(2moܱ{g̉/3>3Q 5o8thװy8v thv,2S)g<+:yv䧼9IڠA3%#TE6E@O.ԭ-]S_ nέ'hfr  d1AK-4ɋE]_&R#=݁*`C"ϺcEEӰe+Xzm B5Je8IaHR͵tI4Õs/ 1fxjд?a]p3ιff X7pZg:sPx#} q!xl^+ hPWYp-s$(Ah#gРnjxڜBpZÖ9YQZ6w]rB0(4zUʜ֘(+ՂtP6wφ5/&%P&h:oՔD4<&5a4MTC㦼xlDi=/oVJd ,VBvB/kTMF=3śU;TŸ7IH6S]q.rXUke#]&#{=%`TC#Qz*-Uyr&$;Kٚ{$ VDs4v/X zNnHrC%[QXv0`"Z5CӬMe9fs jDuYNwv"8iQ;cAC'Nto~[D1ڇ\*A[_x/xȍ΀h+S֭5o'|Ƀ=>AcF.f2\Y=lwG[\-m?ϴy&LciKZ=gx_kPŲ5j7rlD-/"ev Y, (Bz; >ݍyb]|/=6=|W` nL74&Eʑ_^dt("k<>øG{1102tr] 9>>ENn`:g;u SpnV#i^T0hָC +]P++R3&d\8SwqFWߤw];7+Sc& YLrK_2:Ѿb9.}ꗸ-vyGy?4/x ?NvVWS~+TԼŎ2h#t- z < I*)hZJ"j$ҏfu!I'=i[*"JZcZrUXaʜvew:nyyMt9TY&1RYwN*5aOêp֚͡02 39v+K}9IY]SeY`YDR{Ot Pj=X"*ef-#!,?Aw6Ia~D`(]喭nDemGt\RL͊]PH _#Ȱva k-k5Pǥ ^m 1dij$F{1fU]s^0W3]vUvԭnzc*54J H[d~Rz)a#L.szZt*)lWuTyW .ᠥq3yDn֜ 1R!ffqsEYTUg PP˘;&YޜbO!34sT2G4܄ba0Ml tIsh{)U*yF,Z fe2̣fVJ0[P8:;c8ip7 ͜t2!Lq2Z|dԑ ԉ|IH0A&|$ys!)6>b7+G-:tlrǬc=i*P*KQQdA`&ٽקm eeV+Nd>H,6^%9ο.>2}&_;G{ mN}Y{7CǴZܚ#ckӘ?@Ħr\țDSA]V ؍ rZ( 5(Ӣ{5Xc68?ҹ4++"/K_z78<rR'ވ6<Õ*|Z+ˣc6'N.4౎=!-xN8P85zk nm.) .R9 ' {c'J؝V<ӓsC#*Jת\;iVytYYw-TFbS$QcjlQI8C]VpSޠs^WsϨ׫[45R?Bζ]%Ȉi0y&[q`szN}1|3WC]i[-]XA^V<`O?5h]ڂQ_'gxqR;0A~<;mk˾>j? ,;A4/rCo%Dji,9IN7$-OUP^-8SR?+ύ~5qV2C׋* &ٌjZ~8\!1wk n8k#!HDm&>ar8bV@Xfפ!k ndì6dwN&^ OÒO@I1Ji夥j*~ Uj'M_\ {u7!RT#B T#ڢ<i-E5M3$*i[*,n:E>obmBUxBC[z؍Sp%YSDl0AAXyLh I@TI)q*$Kk`D؏~L#aKjU |Xb@gXGO`?X^xr^A0*R1D_w.&ٶIbY;T {)K|[hOk3?dH=7UBgl%#|!99"UvWK> MZYJQ?! #n6-y uVEoYv?Ccs_iWˑ2aBaTW=yjm}ZT0s`rٌ8'J|ơ%>ӆ{F[Dy5%O9׮94#ӝ$NTD\@++nlEeUңY˓&oF5fz { 鐹g0Z z1m.N+w+.#\NNHٚ&i3a< P@b䟅e&dʗ.J*8n;FuQ7Ns 6zu6}ޠ۷ | C|Wa0Xt,JE\T89Kϻ$oyy]3 A1Gsd[B1GPnn9nŽ:A16xS9>vyN>Q|D(sCʘšҳ2>7䚹^sC9zhК$m4*EEQoz2tt&2?̯/?xW~k !W}Yx~";EAsv OVm.WMxUMDܰr|69^R0⵮1W W PUR#oW_wc|XAg7oU;,ox|YrhbXʬ^*sᙰ $5I =I޲!1w8pq8=9QGlbsDVa@6`"U^^^ \gAE 5EPz3a7ܛbj\Y´ T:*Ču춰ܭn5,]V+O igY8 WnDTi A>ݣHdyTNݱ *S-N:%l];ٞqMYBeLW *L^,0a56I %nܒT@` ^Bw3^D2ܵ\LH[l@/]62nlEHwA';a&GWH<$.TLQmY^adc+\nִ)[W+sTN'UqiKdZVn.'Oޙv ,g9aRUɮouǼ "tHVg|ˤPdJ} 7aܔ7ظZj?o1Z 1By7bT*5qA5wgft̷VIUPs̅ʨ6)WNnQY6l]Q|!QHTpǴ}M*Px\{uкP`1rs m/Dp'^~sn?Org+ڣ/_+_&W񯁩lsB Caط #Q-2 8:ʗ X*L,Syu.r66;:{k.؅k|qV;@e8B'z.&2h2D|Bi]Vzç^ߚ冽 {@r`_<-Gg "ޫhߜw:Iյ/P3o0P3Vd*ʽu0< ~_ ^s|7߽U~8w|U>ݚx{h7'餜;]\x{z>c.L/=:WpVMOPݟc,W+z%fI7gӟߢ`'G 8Ęy g~,u1k? jRj}x) 4%]b9AM_0ԭqkԦR@GSU&KF>fHt#OBlBQ/^`d !3 ;vI쓙L%>juZ^XWUD6p)# nYE*H hc.GKi1 %aa&m/"M§q. 4zP?Ry:%CH3!/ì.( Ɓ(x vSy<']1GDLTcHplEgT) ':>M91mdv>& Ü.1} ;UA:'E4Hr (Mq9qL=Vq6liDzqFEisXYf59$gDw$a\BEl*^.I2DD,P{ ZuĆOiĖ`DH,֬eEG*5v[-mM^`刦V*]X6E3ck)!,GI Ju2:IdYVȾB4Uvi(gC[P3lB5fܢhw @"c%c`T381aX먦 p} r K-cz[P5E1+9&FT!t{n {eE01N]R1வ_: *a^~da+necWaX-Q6ܧ09 fEI?A,,#>hĢvsbcwX]vra0/PD-T-C6 o+LjlQK>헾wnc9>]K/}$a/SrFG*2E;>VbiUQuɣB/ƏsIQ_oIyܺ ׿9~8E$4'%frL `\N|ج*y6.(;:f4nZ5ŭk-cD ?5ӳ]b^KOCy\+ȌuWr͆Ɵ<~{¿C+3>sMd(Jxw -ǽ[x.0I%v;6--xlrobZGQwk.AC!„Mnݸ͟MKXuİ{m=?Pd)h YcUN"1 _Bs?N٧Qj&Du7L7LU`IrS`.7U 7^KIkaySV~j]mG(rlm[яnnqd5;p09*Λtcxن˶MeC*eWuAj>6F=j5(O.Z\yM|Cy^k1Z ^&eSaƕ*vS\EeԈͨRYnR{89"jUB'/!o.H((CfJĔ3 &F62$uX+= a"Ibʹ[ڍj+*80mU6(R˜r*L1 mô@C^+K(ZOBlTawl>Vd$:TOGw)3Rq"ymi#JP~sHbVbvP\[㦼yǨ=ħ[3MƄH#téb m<2:1qVY YuSV"UJaTu!y]~Fc$O]u_/+_ei+D6slMA%㌶`g\8ɬIz>!SDԈP:??cⷸs|GsҩǾIsc.:[hw<{ fIeT,Bm=uj7C,s=۽5WѬ5ȭ|q1bqeXl;NS4bX__=$'64b"Ɓ)I4~&V&r\>p]{k\l:و?;G׏9ZuƥRIkީ1wjA2{ۯJeQ6D\msь;QF >G.??GΓ]~\Ayils_[mFjNOr G9Yz6}d=D7C A{`/'.b~zÐL5;}~ǟ[ƽO-<.d4aFc;(aJ׮D(Զ#{=j )<#7UFZVTYwh5`a-ga3y>DTY~QסfiЛHb@N)dکʵ˝+͈ffH(DR2%-չT uc+b/^2-:3mȼQ*QUjX3Wp',*jiub88F=}mb^=S(?UۭΝ` <3+/=xJӓuUxڭ1Q']`-^ o:9Lj%3!5jN_nWׯœ+/9Ј\ettbfe*d̨6A6;4._̅s8O\ů_2v#%#PaM„<֗:OXϿ[[@V굂UqRpXv-^@՗?Hk'ǬyǸY̛(JGߌ8:Pjt:˓лyDE+x?tl?/ۤ߅?oGd^Fnwr&ѭs}輦V烪VqSQ/\~L55 oZؕy>Ӡel. .OT{IDB9n>~V^sR29 U~B[& J/[_>ȭ-*[?u}΋{×9g~5\L-Z1FZcd8lȋDWIJ[]/)"Q-v!g(q@):A %d` 2;qezgՆLBە'A"^QBZaӀs)rդIsi2G&-N'MxH3/vmQZh(xB+Ii[-[vMGC-dn.bYe'M;,!OI #d i]ҜM$}2P2FfY#7Qeb!PZFiHM$s%eH7-.JeE澜X6Y;9ԫJXTjj%ʼnrW A$؊^B)*iܨ(1TbBbR[w>QVp ,I8>P: IDAT O3Ͳhs+jU=/!cϲ VU^_Vl33t9291VȊ= [Н 䁅i TST_iij a)Uyx5d,1-')6#F'&'__TnOΘ*aɛBHy~= v{8!ۘ ܐU.\M!LC.#uN>9 =?bdńy=d[yA"Gt̀pNY##'hh3P#`yP ۲ O-.>OOJyق/?wK:Lxx!iT%|u$Z03yVqw9̲arQ)j:xvtuxmCuf3=:>g|ڻp.myVNP֯2xM pwV[CKR_eK1E SAzA*70hqZ-,sv(P F,m;ewEC`:ɳ`'h˔$$rS]k&&);JKH&}bX  9MpEȼ7C%ĶKMԴҺFzP剝 (r$2]!|S*&`+66M˔IM8cHP 9.:$J7mbI=Ǔw9cqZzN8ϩŒZ;QUYVt(JӹE]EڭXLy<߫©qN!F$F:ݑry4m&qfPV^Weka~nrVTwL"b0g,AÚEw0#m.Y6rbHl`+GBLX4W4hJ]bR9fb;cE^&KWܮo7yKYelgM]Eˬ_`66sBL(f 4X(6G\ .+\W{hocvhUli^ :L"J'O*F;zeGvD$ 4i,&oxd ^XeևݰD ]_Cy'20 J|md1k%/xn^FW%_<(Lu NZ,^-[/;j kQ ?w{9udj3j^Qz4fZtq Y{Feٵ5'd]O_KFXAC_A:9[x|_*'ؘd0 LbĊYd(1)mO\`ַ#T-b%KŪL[܅ސXYV|yv!Ma،Gul':3$R'$U<;ƪt GF_t#L)mbTd%Jowu">i*H$D." u#T&iS&Gfzs I3,"R{Ya]>bf)%hϪ*I !!I:' hœHMǓ/rtI5 q3'ʒk}ŴK !" V,%b~J|ƉKU*f94+VBT]HL./XdB7H2_.l"y^#.Oֵi"5V}Z1ŴY>%seZHdSUz,qium±;"`Z ]_,*!XDgȵVe!aUp@^ʸSb!'5kJ5\Roq;֔1X5LX}4"<׭K=YZ'cbT%ɪ,]95dA$R ŦXAlFH(:9B*&\;Ella`րrMW}j6E#=oAqFn4e9-I t !NZ}Pg1NTNλcZ;U{Ebm2CFOª9YjF"ڒh#K4AyGwdiO<,?s?XV{ c?EC~7~c[Z ;C"K=C~cpZnCwur3tkf4ae/z 5|Pr%[t҈yZ|ޘV,*n"R7"LQ$9Rb)HD ßW'}|KzU K.d:H ~:pꈦ򕔽 پzn1lOե5'jܰo*,#!u°^^%杦iLoi\V<Sk_^F^]cK5iE2O~z9 EmԦeorqMyݫƜ<]{|PA{%`+)&J_ V ᅥ]cRla.0Ɏ4rYbdx]=\`o +Nho},_?gַ{o*|ˆg8q_o"A=o.!toӹlhN_uYV5h ~4#ʯkPWj4v~lX9N°ٶ$Ysc10cg}AH.ȒS4!K$Ē4)bإ-0D|uEM9sGOHԅF cvb!uKp\' G3&z2X U5{}T^ͩ}N$lU7(2F"4l`.\p7bE*nrfV7p!XПL a)<÷5p"05+dUl]`۾%h UmI6‚$tiVRHnL[[h2YJht&stM,E3-?ںm1m pKTDڙN%IYv#|ey6ژ0Vtb D#pZ D"B ZpN HPy1u>Q8g&3(?3>CV8!x ,pBV$)A)=,O^lq.^|,29^@KJ5._O=;GTfI|/~ջbіs.akfw^90ΟN #8k2[|֕Sj3xwѝ!Za& ?schpf׆|D+& s9PضR=Ai6AZD+^V /x9M ge~;+[a{ͮKk3v tA˃M_Y@cްc_]R|  $%0O}oS>)BaJ!G@@:!*-G(iJl\jR=[@cMYxAސ 7O1$Y )VnM\ S^e]b@;\ub_r:BVxW|BbigHӜ$ZcT&'$'%$-A}; 2=ĩ娠4#O(42gUQAܙn]I2Til~$ 1|<‰MjGf0QFqLa&ںX5KE&uV`[Wں HiN=bKR \ ]tQ+ '1V:@|"V$6$E+_:N+C&EqvFخVbX! Jӗ NKvk755R%@mZUUH QcڄR\fPQ:&2Y-6 RB᜼3VqҲ WUae>]D }A1MFbKÎ܊5h{;)ƸoxqZL0KX "!@8-)R2S%8YPrw.P\m3륖άpC4|icREᡨ ZwL@!gB"2C(>iª@DU^Gh BɺKWTj= *Pfb}= (B)Zu[bv1PC_iV >I>C(ںB(~³~xBBo$qX!ʶ*+kY»z*8"N 8 ǭvMgc;2hudӇUIuk~lL]jC,c )Kv:/Ȼvf8Ʈd.ڦ.*0" #NOˆVrF%UNHDQ0gԓZt_S.8Fg*^NZ_}FR.ۯ"C>qFX.eLuq] ! sUÀ(ˮ+PW ު7'*ge#r)D+Ayg2gmљQ:I&h( ^SVUnͤhZ6t[D*p"UL]_reT=[lcsrd@FX`"YbQ×ȑNFc'Z !%UCd?I=pA" 'v gIC0YSTNL}UT !։Q^>6|V] )F❱٣cMXKF%hmoDu gJEZ, $MRDQT7'."+n {Wx+5<_=v,•p@[O.E#}3h[FDSwgZEhoǏ(ZvȆX1un6f:ū03; /ژi MuRTe;aU~-lIcVͱt*_2Oݼ0;Qj1Wo\%/~ ǩ*òmD,kV0J&v[Cc[ `eL5vsOZīu*鞚 IDATlÝ[qy?E4&Qeg$` 3BROxtΪ1Zx⳼ekxt|2ޠn0m6]鱜s.oy ;YPz s8I$(ܘaHSv>S5la3v6Lbfɳ׳?u?z! /1Ԡu@GPOu/|`U#^n7c&Cxm`}Hͽ.čexvP9Onu¯ORZ]EUYnή4 {tqTF'7Tn:nME/{03'`˓=6Uʿ郟$E<C ߟC91Q^%9~upG[lrJ ;Bn<{3|ݢHg۩FkU6J !D݌n$%sN#r0S=.hueO }\YucQGVW%= <)Ev44]`gPh:V`[=%aQ:'K;K'$BiSl>}4 )t:fd7,ufA*6 )([S.Nru`L r2Y(!.*m$ZPgH]^H,TP^u^{t-p`f^K%X݀(uISP̒kvej3a;Jrmc2@i4ORm%nAcI$%sܪ:g@tt7cYnhB #З,k]l) jB.0+2 Z`-$m.q3Ʈg,?s^:Ү:k"Y10a&r5NF 5uZ(- LZv('15?˜0 Ł1*dY'tԈL\'Uej[,Ĥ3kZBZvP̲[FHcFO׎3!.|eZ\FhN2UPԄ<3Ȯ'~Raqbb's<"[Z*5^ er.l;e>#o+0fDG9yGJ%bdPMkDݰWF#Tt52N`Ʋcpɲ1ģՁɠyJdl}^_qV8Ai*b8]}<% b͛M8e;k#Mh\|T)I8`),?8}n&[_3 Ip+Y;_ŹHּHz0]bVRF59SK@qGc{ i+6qzߋ%xc{9}9JzU]jig;e5l(d*ٻs Ek\%$?c΃;W\QN`ƉLvt'z'# Yեf.tCzG2Z YXrpz:8ķe֜ds˿wY58C!$kl!ZfyH:wq켗^++=n#5Puݰ=h6;ͷ \7͝,ASuN!rgR୍!J g2/ü|!CUh6Vl"7"x\iy7X!Ir,$QUO8C¼Gϖ|aS_w>dyEJ`aH1s~$Tu'|(SZPV./swbZSa92C?=~ou1_w3>i\9auk,'Gd[^+<ssv- }A83Ե2'΂e2{8]r˭>Iz:Zݺ$An\'nQ!/iK=^QzF{bջzjK4:cUhOzmf,iMy@S3F6>NR?f4- uS-3C9 /'% ٪)dZAC^>Cwh:3bUR' @)7vMBO,w;2{C.͇] ̮qXtѾb^0]$<;kgf;oypѪq*ulox Ħ &@ 65m@s!Msn@873 qe؎Q\19ؚk7$]tٕjʲiL tQ;+m]_h2IZEj'U[#خFP7G46V/*̡TiMm4e'­Շaȇ`0{D.8 = d zRR+%Q$QkwZeD.Ӯy9c;57핻%_HYx|{i01%>$ѣ YeYm(ɜмL?Hx/WW|mrt1L:ꈣ"5ta|o+?) :R!Ñ'v;q/7tv6۝neX;[zwV*  huq#} sW9 /y;o*MaSoc].mw#n=SpßavZcnURUn=֝1*mvʦ;sb[tB ' =]kѧ~|;qug7o^uҸ_vN1N>{fѝn+xqU?i^z?zVv}8椌Jpc(>sctLvӢq{EW/$,4. {L"fJGߣތ8Z|^e9)NB84DI$㊩ BS4hs q~쒤G\T$jiFKJ&c! & $v؍Hv+4/>vƋ}Ƙ,b,b1Y=UZ/YD]SoұfDCs(3Dcvp#/ӱfj3ZaTm+Kl&>I0skn=>XLLftD&7Cto8{2E 813u{Fh)YUL_Q2"1ad2MgZ3CF6(t#u," T* L xz7&LFdC֌]$+=Tr҅Q5F0OʮeHFdD !kz+EI0%2B1;L0(1LLET:4*m :B.JMN9uw%;\uhY֭ˮEa5n%Vo%-rP1Q*Ue}@ hv0c.JoxU)vm\Ȟ}*ӄhyDa%cg.1*JGsMEs6YM痟_VY1$/>SD0-i. oɋ6Ѷ\FxcPi5r0h+Ǣf1,dH mݚ3<=e&:L F⍑5sLKh#JyZipT!?-+v>nQgz*UbV=͟0ɏC%;ءQmAa]1q}oV$X3:qTѦ^s'~\1xƲxsf,yn?v1ŀ= RT#@Զ*./ÊӃ!MFG(ocHs`u]-?ϼtpttMnT.\=c.Ei#ifr޻Cѿ$ᦅCfvXtJ{7?ٺ5SzɃ[7[(n82bi⺥N- F"MH '.$Ҥ\EfZT&Wo ab֊]-S)<,ZSwV#7+wҭp V/G*8+lM\Y]\j*X"NX4+PWVUlՆ8=>P(1حJԟlҬpj)%ekhqYulg-7g>[C2wf׬I lשJk{རt7/f΃~xdf]]߸g.~%䱵vǿ(z *_RLŜ_x7s~dQuuXn0L:yCܹsVuDw2ڹE V,JPP &tU-7I=U._e|q,Qܡk|<y>{J{u KT7'v̺ {譗5wʭ6RQDM-݂G\!c3id\p byo &o%ڡLDQϱTNxa@y" LE0y|ߛj5*,"h4bK085${^x6H?.Ul*BBu! 4ŲmN ܲEr=o0p3K3#.o8n^O ZX|qj(^QV[F'ANKj9d/ȧ>v Ić[nn6v*7O|"K/ڕf%\l*'iou"`NU7m1 v@Pf=3*`Ik&]9dndomKxQMdI4{MDS$rUeb1(d0D X<@0>~Ds4aawpA$yޓQw\`,@,N DTd[bPA3A!YaT6)+w Q'=VJL`ܥj])W2[)-έ=SQze\0*j'{K1vOk'ý$=PFg @nRMgnVL:V0-| /VWצ;h D5xnࠍc>M+*vL=ʆ;T)mCS {[8N\ԼLUT`rd:."kvem&z)K-ГN/}8p()Mߧ 5yE)CN%F!8O%C") o x#Xǚn{D'qD {Cr|2T0"4 YcMu$ҷDnnBNMl}{ 7΂* IDAT=PFxMQ6-}00^"F6&\6:xtmv&U"`cưF dZT7 &"QLR^ȫUxV1{0DxJI2X)c #b77~ϟZEeQA+୐hTf Ҡb퓬 Xk"mb.XԻe׬.1'wbcxgB ᗚUS<44{~²}9zo.+ Y?WYXVFeӻ6Ap;R#V6g+{<4WΙt0X@吴Ce :G"qIks YUg -ǁoo^tDUj~QCŰ,0]{Ty , {qmڲŶW 0Dpug/ z9*ˁ.Kp Ƒp!ճFڍSWSݨ!xc6qt4=u ecp;u3 wܔʱC0:G^` *ȁ,S}De]`H4O@Ӳ5K@oI`.zMgL`o6$[`B-C,]V}xcioe"N[cK(%UxP헥<Te n 1vh\Iy(54U#Fv bdρE ~o%BEԳx|;ٴ Aê(bArBAIK/rOUϙ n]3jE~3@ZtY0 b'S@Ytl xz#3^i8sI49ZsNsP4(`<46e3ൎBkd'P8=u$ί}/GG;VVn*@|/fd_=X*Q ǍkMZ7`{F#vꎷ ,=x $$n&ܷRJԵ._:'YF%T< 3&2rR.Z!g[ ʻM+nB|>ǟGpޭpe,+]>;p:L uPךSˠn11J*+hJut~-TE_ pfaAz>Tj "6,Nc™QlT[6UfqC{SЋѐ=g6H1Jz-}+ȞS˦3ˠ9#$W#ZGOJlb(\hP6)ܹ{~0^!Y?lk6inHI1R%0Tĩ/*A/0BRKyYje5cTTq<>>_Zf'XZu|vCe\=r;$qcp 3u)ABc?X`2JvMʡnLSs#EW|}s yj>~9W8r4ܗݵ۝r7a.#OJ4ꚏ(3JTg5&4$;dTR:>Wb |ge$7Lj[WI'/3=_]\}6 q)bŖ8 he@'֢4y]x҈r[<r4vAitfކ)LMV=^Tr;wMAS..7C%[U ic.έ$Ksp~N}ե^7V>Y :h'٣<@L8U@bz0인os&Y_om7~m\=ٟ_\y@yy2<9 LC7Xd;]pu[o{/b|Й)f}~u5}C0o}n!KHח;ae٧1G9o,&|qr͸X]Fe8OvDE] TN#GBA> 3b"oޤ{yy>5lW=w y;`mzɛl-;W_O ䷂W߼1?ch_ݾΈ[}vzbk}7l!<+ÝB2-f!OU[T EƁHipЧ" G+ }=ڙF-]YR(K bP.N>CpE\ByH!Й-CK2 /̔s7_8eÍ::;*roa9)P=N p3,x*O~٧jz2]ńF#ژI!vNˬ-[KR+M| *3m0)C_LS PG!5KAP/':ygRk=|ӷ.Q;HO]b}ƥnLD-l"IFnCШ!gm"BLD4@ :ހI¾hg, ;)몆=o zDfWO b%WDJ*񰇼yFaaz"֯3糛b%"yMMñb ?.#/-/^ga?sw}#?zOrZAɡγuꟛ>781 BƪbWJC%n }qy\,30 vCqP'Ωu!WQ0%~Q.~Ct0zPl܍%á" <, 5(oWRC'd9.f*?(IЧ26tc_PMCS(_V*[ԯ#j2I*zҠOm?ȣ(/{զټr%Ac6T`Ǫuv\iq{ޥeT[&K#a{pkPy²DK?=[gvPUcVQp/Rg~߬b(/Ee/[VUc܆ڱ/'﮻?H˄tOTg?;Q~ g>$akhvҨi1ϖR,wvҽ/iMKãL}z={lOZszQdYpuhovΣT6|afUi籲ʪ y^Z _})Vgy /޻7{NLUȪÜVP-1KVP&{XFCF8,+*h DqƩנ,g1:9n}yB=\''bT8QkyuiCr?f8,)V5qYB ,YWu*BL:vz4v ],1Х]L_:rRU=s\):591tCE"\3%p]Z&G (a@Cru;P1iprE|tfԍEĦYt VTt[E(s*a5#e3u} )I IJ"c9e]iy =NѰFAR nR,L),;>%Ibj%"bޓ!~R"8+/RbN|b;ƭZȮv"$ #܅R'k쵋lX,*"LU;{B1/.ZM4qnA`A改<-`Xe(t\2BG#&Q(! BU/jh@?NoQ$pxxPцؑ hS;G7 + !9VGb'Dir%r;!fh@B+ySu.V\RLt2E 2AIGQ(| V3q +" ȫb& Dhݛ\ݷ(X0_`V}F1N@|Eո,ͪy(&4_Γ).]Y,s5f;='|C?>ŗn2c?^_+Cd< 8CCˬ.|ڛ4J%nVq;q+EyN88/{_r,Rg\S7 qSXnQ|[Zie>$͡"~_:#2~a^\g0V\osm>du5N+i *g:xv*M~ad8qrp8մݬЉ߲b79>w|nnk6ޭ[>ë.Xa~81(*lS#LίbING RgC&B]Au$ӂf=d_y݆7Y\\!y]~CqN yHrN vM/͐~>K|EOxro'a<ý}lP}1'5/G_wyxh׈XӳhzHkN˪JT3D$4\ d,hJ`,"Qq.Q^EW&9%%lCjWaM$K]eEYC:o"lLٲ.H!o2yև,Oqb`Ye\FD8 jÏr< B%d~#,r aE!kBGńe ,K?ӯq,po 9M8/%Wn0nBII\XVUTx_'D%C}wӛ_sat*}բjG(5lxL\~Oi2A4Iɳ{8DvUTMDUh# ZҾIp 岐߃pT4B܇.X7c V+(X9d.ͧ!Xe[m&i6-,:x6P7NΰDTQD'ӂΆ;;, ;bG91_ B!/lZNt|!-t%}'/[6t}nCԓfE3f[dXdqx!ۨ_>]]x/'܆; >i(cĪrbZz,ԭDJY8e#ِ8e# Q<ax\$ M倧K ]Y؍9 ]Wi=O)| ,..C*r'%nѻo#l Gj?hr':H@L;RLی}c> *ןvz&ay@(S)인swq,40Y焟xέ//+$$: _6~Q9 Zm8KgG{_xeNH:D˥TiSywM&# EJ8\=?m񲳑(Ot_i,"=}DE,xvݺƇW1w|:}Jw]_m=B0҇X gTQ`0M.E!nBA wtDZhBBR4] 2?4(`2N˭4h7Z2iQ" WO" bkQ\ܠ0Id?:fa^1y\Cw#D}sc.S|.O)~& !Ꮦ4,A/䝦ɖH9_bP3/ !Q(KDBpNF1.2g1*%3AX`Y܏ٿJB˓Tdo0ռYn)MW"X 82g/p+v3ӗB<3ЗACvS-y7l10)tz, ~,LT?%ZdH0V{YhW#Ҵ׹hF\X\k.H1bSbU7PY=%#wT7*5ZBfKaqug*bE*G?w!s]aJ5IP('ej ~s/"ȁ.=?-!W;cZrqp P$׷xɛo=zOJ׿)<َQEQ~ \,>swrJe;Unϼ9*LRCnnTZ!#,]]g~eC~S/TR#¥Tx[#NSy&! LԤ?L/, fYRO>gGT&g.MzHhUH<+ĦO9v$)2O^2ar,Te =Bߦ.-]OWM 8ژ$BVWS6 \Gh}&sRfN#`v..wYGY+7Qc.=3fyYcapCI|;y =p࿬|aDž,n#Mf':k%Fa*v [%2BS^"+8ظ e#0&gw @`Zm|-q͸KD["x׫/=KFų]e7Hc`qt6TF6HkӲ'Ù:v"es84D$jF} Cz,k }LҬI Ӱ뼇MB2}`1T ,t}F%H;/ "s_=qpoTfNՐ{GnT/>~Z?W>jiv_m%q*A^De8uaa3`6[r]N9UxjpgsP*9V5znk mvu޴QҺRaq bo?YY犝\]֑y+%y]jWi?rVD/oiuDŽ#E4$EKE7.PE0.t1́n,&Ӟ"8͘S(.rM{OR,0Ksܣ4o⹗GLwZy{j`8".՘G󠐟}{եќQ~եKc-ց`of-HAʘf۝n5a>66܆6~V\cؤHw5FFGKOT&X {}Gm൝c~_G_`b8wrv\MݏG!#+uMls>Jt^[yc\#Z'AWz RGM >ų\Xoj|vȡtp[z;i˄'<)^+ 8rZxoC{.VH[ݠjm$2c UL@%fR rxũb(&._ (d&ILtpO+t`1JX8?kkZȡ hh5-I_jUp"1c? }+C)ћ~&,KĚi=9!Oːx)B4=%jfSS1Ҥ $k.AĪw)q'Qa;L ʹ#eՋ\敛@5-˒*2eI瑈v|ލZɛ];sUp 2+b۵9=>o%'Tle<vJPZ^)R܏.ۻ; Rk2ap,y-/ jx [im\<x_Oϕ,QQt=qfLT1HAZcp58 !ZD`>QM5i"r,ЭQObFMxF[+#LF=dpw&AǓ AOU0JbLm2ʽvP',^",^kPHBJQHBqZbP >]I)2RX0We>]_&ɳhȾ\\XB,* R@PXќ*H x!Bt!ix+i27g6>%wA4f"o5AH(Hyx Y(cE'O!UF!9ȧA5{e돱%,QjHA@-("UNpJ9]v^6S-P}U̲>LòN)k|}c|372ij8WWQ |m[VBBMZߛ{ݢrfY~u #U%%Si5b.?r2O_cm}W_!ȼ7iG#-[V){<(l4y Uﴩ-drX)D~5xSݷ| 5[7vX_B#ZO`"HuNXʿu7}60L 5`#\A[U6mAQ3Ewv^ud?y0]'#b٘^s"9q;H=sIl' Q b "J0Sy!Crg=Jfs{]R;d[Q|LįeԜx 9bסᯩ{-"՘-wRgc[aqB ODĥUpmӜdLpum⧻қ_./&OxHtiN5ǵskYF2rV`ChTEV%“(J z@>Jn>72}1 48#+R.oy精vUPC! ~+n}:G)yTTYTᜯOz>Ͻ}.!h=O6ۡճɋ&N٢ ]a\g>RPGކ ;K[LOuJ_1PG\}C>/Mzv&E) csRmqi Zta/V&nFs%]jѕHP=̒1H؁w;Pѣ6ng6zY"^`/TDUݤ~㩷-_;M>ΑHӬws8>ՇJF&lx99r<u7}|/r{sxK_tjrueoTΑCyi_Gt=7E4 PX/?=cPw洨:3,ErH85'K@W,RR%,ć:3v"nܬ UZBFfraJ#[eu.Gp*HQW 6NbIV|Rj D dX=&P87sƯ=t+n*J$B{(~D 1܄ 29D0>~uQ(~Lɒe@Y(04 g4Fӻ"Ua" &%P<bc꣄m* 7; Qw[m|/-ury'&3Q';|R2d)w vmXZ T v.YeP!Y/D4Ο"!;_٘ ԰t Нw2dgf>mG>d<+ZeS,ڜ`,,v@j>x IDATȧ>1,QTF^ys.a)h,6#Evy (of0+} K[`c#)衏To.tLZ-av%҇8;o!,-3Ӷz %nk",ex5.ؕ ;͵s Q%+6K la)]BO ƙmpSR.bYA43|!u~ZVg(G㎎}AÈ(dc KATf:,/FV\P!xˇ> }( #MpfMŸQ= c"YK/C3H; ,T% w` W94XttY]Dud r8a%qK9"5@O#Vo7 斈:g,) 8.aF^ρ䑬-8x|S5pj}|AEX*̪usձ&?]f2fKɃ\g8}'Iٵb/8O~wpGws0 vMfo}R[ZDʖ,q~_UO(3P5H4k|k~E/aUWu.>W?7OOaen-?wmhg kJ _|ܗ]z~B{(p9]F4)Jl /r9 AUXʔX^.QtkKG+_4C YЉ^챛^ (6| _jOS_qװ$"Et#BCgyﻕc]Z䑟PUdk1"8!7@]S0Y(OcT.6ŷ`ܼӠw-l  Cmˋ&%DζnK)F-h~ݽ]R "}t>oTIwwߢоCSS4/Im+,˙wov$XlNK qve>"cx+zql\I2EW2z Y n/v:g7/Gl>+Ap-ADnۅd /MYWhvAV.x %,XUFmMVCxTZ !NjS N\i.'Q.\p@ɇ>QN;`n2ui fCJS!*9}I$$&.1<˃G'jwݨ~>ĵs f-`^Kڀ)6U;C{%߷Y<4Siz(oȝՆ4<{UD"Ê#1sLe0>RUKiTjRkoȽ;[]ܪ n|t EzsȓD}?OhL%Xi4l&6Ybz2~AiD vbyb܉T"2U[ QF ~ S -$t]"Jd-%]wƀgdz9ך>btd vC{v"nK;$et1 d3P'؃os 3 fhS@^ i+8: ͸X kw;,̹B*N2tEL `{'7"ivJp{w涹U5%*sOž'Ga}*R=؛&1쌯Y]n,"_н4㯎p͂=vڙ; e2*ByC@Y*dXZ)Q>,N37x 󇼛% 5X|uEbPx9*198n񱏼E%Պ8XKH{sPZ8QyM=wԙtuոw=tKuk07Ԅ2Rc~~~cD.VaO(QeY}'}~=s\NUqvX-+&+2 N+>~nLG-s˶ vyYUx. T^N%BT"l7?yoN/ϼS߳YMԹ/2 ](Ŋ?#Fیؤe ]2B \Y Ĥ8Ⱥw/q T~ bÞc h#Ap:bjyYh VZ+ٔml \f.K:c<}| a叴E72&5Ft dMTrR*UCy:٠:h`G"[cZ`Nqm~oQ1 ;ت@}2 XËËR_|Dz' ֿՔȵ(CL{H/hS'r(NbhsR i_O s,-EX+᛻sͰhO1erhtqLȐG\,@@|,C5 ^ z"ǽ\3!bD"i0CGvQʺj4w`!P%E2OXlzHx_, +S)pB6dg]Uda*&;wb (QKdY(k'C܏uu5#^֙PGFHH>4T WY^c;vċVO[*ž/}$ u{g>s>)\>æT5 º5}\ 1TDQqiuL˄.1|V,bPd/ߤ!򘊄)nwj@3;B;LۇҜ{=L]diX Km#FN\;-L`DrUAc-L&{WJяͯRUT k^+ΦLڙYb,ό<}c#_kGO7>_c%FabpBgi!8zc`RJR- 4zf ? 8#C=CQV_.1P)2rDsڻ+Kt711(Qq2iKqyO{ssogUZ,Mu,4.d. qljJ*_q  Fp z-'y1PÌRpȪj(ʐ\*Pu'DJ}3F?PҪ )N=!dLvVuGoQB<uۥ疀, n᜵8´/;1Iai|c[H9BGljy_XzW2T3 ~E;CM}vKᄦSwm ,݄2A6H DGSP7eP,xcAd#Fg e#jn9uqP&1@φTMX=ࠚF=;f՝M̂^.SWƅ{vT + ejIvq\d~^e=G6jIYAat*"mHd Hȸ&bOLA0籓<-s6>NÆ`s,JF /}`st#]Wl;~4p*' ƗǴ+"<2:!~sjX>w@~!Ǣt::W>Ӎh-܏s? \*WuϗxhK9K1ͼɐpמs~o(+;*@H4XM9c|! {c`gd2k}C[%.)1ha!.gheJ*pohD)Pc^s3w#K洞* ŠVBҋ\_Vזy0߭g)1% &'&~ HIiwJ*'AMV"".6D2b\9Ɉ9Zj$d<܏ݽY{#o,{3|Aʗ|==&pm'yv_DZ$GM pň ŊCF_eGQVҢ#XHi mP4B\E`-Z3 pULF3J(#72m،Ȫ{L.?9؇Jܱܲ%M8^͛(X FR9&6uڣ#: a(>G.~b6㢊ހRE{' h6E;ΐ[:9b쟥%$͊/\dܒYp7 𺃳+{jF*ۄK'nԽө[v)zq7K\UyzWP6"ْ$vN)s5sI%d6ْ$|Yb,؆Y Zȸ#OP5""㎎] _Fu{'eP*30L"U 5{̙dL4sY=Ӎqp̮y(q"G x#_F4q޹)PBTTO8v< /DS0k:p&50M9Oѭc,Y$OٜҰ}+H%&zovF9*,D=v튧gϜglԥݟJa{֬ g'ݙ_%ޭuIc-k1>/z ͙/G.}A( y{,{;@n4 {F ЫFqUir"޼Hv0I?%hѼIm7b1/i> 3LgXS@w3 l4ۿwm8K| ղ<[n^*H?ljfUtMvJi1Dq b`s/*F 1o NVc\n1Ju͂d{ d]R^= ;.pwjh owtq[wR-L@u.oY)^Y-;.q{.)HWC ryU]U VB)`H7S@7 1ς'A3σ:ŘET'\覠m6lbE캤:6~1L8>nrϹs%@E yTl}1At|e+El '/+e 40Y.a~?4_8rx%p~hnFKC??}o&=gM|չXnptpHӻ돤߽(/1.E~}؏ؕśA\muoJ\<}?c;ÉGaepo phSJ ,k1khʐ}b)m KtM@r !9nLB@] i"{-Ψ.鋠; Y7ô ww1( X4FИk[ [t*9"K[b^z(K< =j/S=htPtq Xj66i_%XQ2_=O)aVnK\Pdxcs ^'/06LሎH)( L?) \ܥ'@e\`N{U T1 o\f,F1?3?D_8B!N^f3ͱBT/#|2 "?s?o>d JQ 2+ѽ|r)D0 /ovޟ9?k=jc 4LAao Ĉp?w>C ۿ3V-jb&RyX^9ZS:Ev`f F@ >=}^FhK!-IQkb]M?m~yъyuK.הl6%:\z3↘9k_O;{+dÇ)0G}>Z\k,rϹC8wy>s?P{;R).%p/oUkZK>1#9EhIGAA {3@ne}q"9Fbn Ƒ*,$m*8UɚE%*WIUe)eEY;͐Go>E4y]m9fjzI3Pv-?,-ǰv:aDM](d.}.2yWQhg99,qF,+3K)+7͂d9hW73XGfNlR딅K/; 0(a8m$(4;;-.[,Xm!Wev<_WAԁeÐh4e"sʓ)Kq~@²hr d-t^!!@_A[3ѻv1-(DvP]z EjN4q0,X0qdYxjwp*&2l s|̥+)yiZlb]XnuK͘6d>A+8L\b 'fI0)S˳Sz#e.zѴDȲcY6 Sgq*#< {In|ABxee/LY=I帋uT.Ǚq l5&sWġ2@8N#PN9Mc/IwJw2'E5yv3f'a=~;h5nAa`k?{e_ mV'mɐ-[Պ{&ޅ1d5<z0х2I7gOUA6 /evr>V+"]<!Q~pIj MLaJ` DQ1H/>nLJԳd1*P k+,1Sr5BkȘUCT@|?Η9=9'"F $Iu<ؚ^L;G1; xR͛\/21,.;M L8s<` ꒸ɽ= GwBe {+GesWhpG7oxO?}wG*Eîh||?.[Sfk)8ӣex97M %\8#o\)'1KEidIϼ|A ؼY-9.bEs2"Y%;]7&.gA,M@LoVf>9P<)|ѼItG]je_pg/fruu!L&za]pbPx!7sLڰ2lw;dXZKZ @5y.z=qrxNKwf8z-e֋Y06 uK)rnYInOM_C9P^#OERqv]F]q3qP5bc mB2r<#XyL.Zt9̜<{a 0$1+&VϰK+v)uD;.ANHe|D9W@WMn_!79a,e/~Wfed]R:;v,V<%.ada@Dol2 ^o Xu Dq(RTfA%t ;7g$m݃tUxjۥ]{K>++3|SOME5TjtJ 3w,L^R.w=W$:wũit%Mi5N5xv'FdIUdC_^ݘ)yqn<(_dÊ3,bmee$ᯞ_UKSJ)DVf%.vScX'~g? ?2G'>B7>\[;͌M5  ǴFJ+ E0cYST+[ww͛F?L Жg^r"GSQ/uɃi!i < =JV0 Rk7%.ammH(*ûc.\+hMFHKEWL̝a(L&Մ(G'^DzM*u 3&J:]5h UUp~+frՖꢏ5us}j˧{"zD*|LN;y\bȪ,MD|v*r,T1XbJYq4@e5r)>Z|!_,reΑdc$mK!2!Cڹ9.9f;o]TQ*ihjP,Ųf- x`}@Oۣ!}:VSfTsqc7[^]͸6/4!}Ai@N0 LAIoD,&R;xKa"Tф"~@!YZ w0w||@s$%o3͆ %/ɹ)1$y s!yzoES\D?)#AV#/Y8Z.EG2Xitڣx}:f,Xl* l* ا峐V2Vڼd;aow?Б9 EdaVE\ ,~g5o=1'/{j`P>η4Տc w<K̗6t cGS6<yy)owRsA\䫛wUSj?H]c_]HY,ޯ3̮tvJ$Ĉ9 !2#6|Ib' A`#` ߢ 882"eeIwefNtd~)XdUÿO/3g4Xd7ټ<󾆨)):ށ:fFCLxKx eLp3R駲Fo{,ߖAZ&9'qbT"5}s9/RkA-) X Ϧݝ3ݱUoZ7չVl,1%J3R7Zݟ*۶au3b1#a^ [bSl"@g܎+ջm› `rc\ %1EcXdM tr)s*r)D=<ӎN(pqsZzR};v}(KBocC&g6 ]T?- aK|)@n<B#R /CW CLՔ"A. Hl۰7lp;Q0>(gXry(1 1iYF[ <7+z2{nrw-TkEu^\5H[4^sP'_?}Il1›&_*ĺyrqԞUo)xJ+AjO0\=)nB]zWZP ;e0yp)RдzѾq댶}k-Y#lx݄}NKöM%RԹ!R#J^u%a4ic\>|e0Bi X UIzΈs˜L&/Askڽ'; j /&m=ֆDžgrhZH}"ekkհL%ߢ9?0y[=dV\+Wt4Ĝ%sV}x_}\i ܶ2'߫/8'>E}ʽh#(k/ +_;1v:nZ*j v?T0ٰrY@vqz̭ 'H QH: |DE{-Dx!h)u8 c\~ -2L pfNmp/QOyrv$ٽƳ!W-lW;!lNs9(dqcBV^_- 2zdFHJDizwjiu?,y[rŁT؝@in[mo0Zoa# @ퟑ \rlKP*:q"?"6Z*p{(!89ͣ<@|v q b2ǭ9)\iFmZpǎ!xQvsVCfZ3!y@N'iIix5v;Ju<&Y%Gxt޶a}-%ֶvnnQ)(o'5m5&ȉ65*.cUjLt`|ò@߬|"л {޿rY~wWk 'G~K˯urh$h+hJMMX1C6so]=nlۆiV`ZDPwZ?B}AjkHF "hwZrռx1J;`v|N,bkGp7 #َ(ɻ,?{)l~ۿ^ J72jQa "Ҏ?_c+v뒙-a GFw1{kcz過vб&JHJT-WصOE;`N&PD*0jCQ6!".'sw_|eK˞';2IXYWbB t`)SKڳ;23_6Kf&tg/) NJKX* ߦ1{*KDOMzayK{E}F~<ӝZ^Lgޮ$5U* T_H=ԵRZS+ܮpDCV; ]vM..bOU$jsn][-E*4lmzEگV,IiࢢS xgKݭVh ր[s1pIy-o޶2'/ݲ(k÷cU0w޿Pq&^ۅxR䢎,AV-CIT|zqt N5Wtl ReUAխ&Up7Xy_Bd }H]~Am$.aS4s 4]0)YUpɎE&ΊcW-F$wZjA>揫>Z[jD~Öjg89ƈZ'7X}4kAE CR9J6$M.n_JŃhOrsMg}>N0@v+C.)}s]Ҫ+owy "'k[.iFz95UqF7b&Z˝V'oZv֮|0KR1FLz a:t-u [J]#JN*v1bf)&Shħf!3a2 S`hY#cdzKܫ,☱63:k|ǺHs*1}(/*'Y[B-{;/7K_\JP;Fn{?;,=>|?beHBXz}.. IDAT>{/n/ԝ ^n;_Oǟ5RoZ½;;g&uE+P.m˖hAT/JnolP+7AG!1Z<@X~r/2T[_ /LDj`}aL4R PO|d 3^ xφ˒KgQ*d$-5M#HVp{ h֍ 0Lu@2aC a/ةc؝7>Z|L&LժAw'aK(u(ןH~,S<."X3b5xW)\̲h}2l pme\ƺJ]P_ D2F=ϯ\e~W>'psb3ھO|Y*\?-{ohzi1}a5S{լvV0E;H.oq#uTbҪdL\OT}"1aQ(I[C2J>Ī RX]ݯ,.0 '"׎4xŀkɿPĤ$DiLA7=/NuL+3 Fd,nIuM:{̯sCA-;'`rݺo-:s3* p+k"ܩI(9y|X-]ߩ OyNY3Pϧ/UvU{bΧ&O˓O)EhX9J%l_9M*Jun{iSTnku· `.ѵx\%S@]Ej0yeFFJj[Ed]h$߈,٦+ZI ^yrr]mM. ,Nژ3 gVQezB nƛlu}\,Sk)_)ƻ',2I+bH۾ `z][cwG#]p/-$_X$Mz$klsw Nkz^a V,^L%bڊ%a !K:*{%W>8^#N m.bNrHݢUc7sqxђe5,*\3T*i͙;*ыKKŝkS&b͔_WtmDÝ TF– U2#_Zݴf/ CfFL}ey%ؒuJ$oˇ$2\mjKW'C;6q|Okz^eVg1@a#RoX ^UE=7M[P>Cװėw@5z܁ayxi*$ }[dy(x1bɺ7m%CwA k[;jۿl  &C2<1±(cn'+٩"LZFg[Sl:7_,ڊ ʏ\C#5O%xsUQnuq\^ 괵odϯ|̾H׭zh_ x73;~'R@dALJe{#/['S3u[H) MDGрZBKZ%SuT%NmJEս.u lz[ٻS6 媀ruQJ=l U,t ѾcY--ژZ5CVc7-M']lynRvjFPwVp`Y1cOQV;*H`bbSںEWȊrKFJZuz۶lr`:M" =1i"wѲܪcJjuy.\-;/Yꬆeg5,\ey>d5,\X1FQ0gn;0i=e1⦄EOOHJ\$/R 0 #N7=YK^۵u7ȢIزu)wtmL ,gKunBԹ|r׆ʇLs_#ƪ P󋬼"ZgwT&%#^+d5q!;@Sj\Or;u:_Yv ضVJN*v@՘E?Q52T+;^fڼ*CFx"gOLT+ʢ}@׿2P@Xv+9E'vRQV]lh+ eQpC3֕ L5zN|nX!Pc#YKw'hۻ=1#1FYrHk/1\y ݅Yz$<*_rؒ1ڱL请rԖoM/K|%=_zGu[*Wm*gCr@jښJ5"O'_d(Ư'>B_Eruf-S }J۶w|}G-M8 EZ ^QZDۋhlvhD+'=\l`M>D[Bv˒kEk WeS[7s~Xx Ϥ}zmpĵ.ZJTP}u%M۾m0:]Q'uL[)PEjScJ[7lX ;+fd˒fEHZ)ۤㆄ($cn)sZ)KvM C xv}vJ"ƺmKNHĂ[\$IfY}{2'U.aRqT\*}*}EȎԮMP.yCE}wX {K B3-QOZTj܌;#nbgr u !ڜD\O]Fٱ_o7b"ah߮ftLt[ dC 7`{ȾԪzQ"U=[*i`8ai!=ISCuym%3 XC y&դx;%>l*Qj{mzIR{7Rol?95w[QFYdSO ܴC ^썿h**mb$(1fqY)A_,J S&dDLW}(X;pw'%_SH5DIrk)uZ{:JwTy1q"mOB;F#1v,T1s5~K].XTЊkY Nx+6'rv VkfzǭN*$EpJ_Tԯ<}B)q!fe.K=èrE`i"ovQ2EsJ3~0WcFȽR'iumo4 Lx8Gj/m/߲VonGGi?QJ: 6/JS}vUnPK2U2ѷ}VKxisjP)uRV NJڲzdkǚ=̓oA]p:S9NMpJ $j&1T5{.պm%R]ܪ36_9&i dO0Z]'v`.Rė_t-kn͑J\p -}Q8f?KN+]ܺ$ru:ykaDIxB;;*\tMi!oK( l=Oa<@bQ| P/ nbJ6 LD6j®yҨwTb"ĶYŴ∙kl֡AlE$4KqtDrQ@d'-KC灇2-QLWN(\mI+J*@x# z5HRa89VeŪbUBӺ;]-]}bF'+KfNlwࢨ79= ^[M'1(kM6=30!kb.<iϾxY1~҈wxL1U1GDZ2U99i?wx,Lb!xєmL ^t-FmH0?1~D˽?ͳUώo 27յ,:f:y E\̩/e((-jB/[Y^Ў?˚P}TA9k ugh `J|ݴ\?*,Jym_گZk#[--]6)FAt.<#31m 0nڱBn2\lW+I{,%=P,s9jT*} K|!h3ԽZ Lj]-ȮM،cI xۃ |ie/V0<[Z8 /RōҨY}ޚn!NmHnUĹT6O".R}^\)\\Ht=uMI廻q7v`ZJ ;!Hn.G*YDBY5Ɵ)LD/.!kGB7":(u-Kk48HڱV}B[yjScWBrے~niIVTc2"(\j{ n.L|W: 5H}Ͳ6o/h-ͯr;s*Dud;wk9ЮW3uM&{I X ZuLLhkz85UvmD:;TOuD`0dt3կI@۶TZJHVe3L,qtCKA {EpI)yL3LkQ]%.6=#T cm0 ȣ)i)g]4fv=ЭeXJ4ߡqqu~*Oճ͉@}E5 u.-9ѵ+THӥo}{=ῳ{~˽_} O19:~) 6w)oXߤ2NmZ3^ #5y@81`5M#͞R*5+(2A3z6{yo) 4JFM o,? ۽"TwsiL.ooϾ탽*!B.4R 터_c:%YfSJH3 6G3Fc-+ekz{-f}Kɺa7MFV$ptNp:UtE\Nbnsh],kG)( a sQ[oYiFwBP*}C>$-$Ee'Y}Ctr$^wO(E,gPQnXꈩž={i/Ä,H]2Brܧ})Cνsy6 kDIlpJ`Z(v^P17#/l.rT\%tS 8hpQיT>'պ՝ںUc͔h<<b$veC-(?NV^$aɏ$ԭ1TVeZ@{hoximdS6\əg+$n6BUح^CoƎ-y\`$:=5b C]US.|# )[:; s_[c2akh!#e;|NnS($Cˢ=_!0FD`L$"I8\ߧH^&XU-t^k,"ÃSSoYFY6lOapԜXTm4 xSF%r5זªzsVq3cC"r< ?vZ6Cv]t27f̧@YA>buQ:d{v ?98fGŮW-EPԲd{W-؃u;_J}Hh|@h|mM3&SdmJSlϲGb LEK)4Uې^-L) }e.zCʺLm-z􂽘z$蹓:=wzL)^:Owwh^2~!@jƼ~jpߚNqݵD)W TpI}>J'^@}7L1mmG :G;]/~F/<tMeL2yͤJmO$,s ϙmYYxF5}ͅu8 %}J`Wd"c86XTGіPRTvPР/nZ3_5+J5!cjƒw}ZyJ,ߥ_y% \ -JKN-Z1d-8g#SP/nد%+DMjX7Pо?L4V0y[ vhBZ!/IBeZprtL'KFb2 !@g$) Gq$qbSPi*N]O 1|{J/T::M9xqt8ҖuK=pFi%P{R;DǓau%QTSh< {bLaڎK:s\;V,sxoD-RS1ZHOSTv] ^TQtuHG:&oBY̖tsU}w[h;?vE6AM!02T -O|^(kƀ1#_8܂::L5y%r)Xh('{cJ? OFJ.#,/4Cҷw3Jٴ\3.i gp[^ho}~|!fZUV ࿽@@?&Vƈ|4Ǹ_;ᗿ8>< އ x'y|ov;؄#)r)6~%# !F*ЖMN 3:`_A3<8 gNKNb݄N .iѓ?f4t.; ]s].ӷT5yRnjVǬ6{uO-49Z,1͆)T Eߏ@3Q3 Yަ*^)ukYje ]:d9x4аYVd)NAH*pqg:6 IDATQBEohY@k2DPsZRNOxżA]19MA]cxN<7{%P" kYC-pۧ-VY")-UN\Ŕe81LkdFSt;SQg7M߭1,z4shͣ МZtzpŘ +' Č1%Xxꂾ}[\s?.h_@m-(3I^܄ 7"dewɭ:P_Fna*7c3q?q}C y1UC'n!HB(UZ@ x<YNAEW: O҉i$c[ߋ^a\coݘYx*_6lؖ9 0-@%m ?ytV $qjtUڰQ[*%(umRGu, -T^Wcwռ0ph0Tjsc&!.n&L{"Eza:ڗhX'Dt:&M3ye7[RNȗUK{mO|YΊ͔(kǢn0cO(wq>#^c5]eϥ^}KԒ}oXۿnv]Nk<7ʝrҠAِy>'1-E+Qf_w_d>|_~mnHa[ j3\(["LZ"Q}^N_iyK Hg/B/L_K?rmueЌKN .XpA] Mn<7P7 x.ey ./Svku}ۗPWpC` %Q[ *5C;Y7g4 u饘JZ[uU s`c1m aoT;U:)z9McUk\&ԽZx)Tv88I`eM^| e4 #!/Yr~UjߔIB V4>&ކ%>Zx89ҪQ$z:@nOg%tOcLhy˔8( z.=%n:uLnY#gf1+,RO L^p0L!L޵eԉmS֠uP_1^ xx*à7&L񉴪EX_0aX#5aVaٜEs'#+]y\/5db\s@x$m;v\/ \\\ i Vmqk2C,NuD u*^w<<.my+f 0(1mQ3GE&N![wJ RfKn^c_scL 盔TxcQE 76|^hソm؈mTooQo(k#Y|6rylQӅwa($ҧV(p ҧ F)'͕иX Cmpe7<,]50f_ڱhD=i끰WH'Me5,oNHC>lqt=.uW~C=S@󾽎j)}k.ۛ24TCr#d3D0nqhrl㛳P}v / ߹wS{B?zBvj(F; '&@L' v=l).*Я9ȇ-{hְ؀\&u4p^X*YuLPÑdgh, K&n#֪!KuZwҨ=rt,0'vUBXyPԽ}3>- Ng+3{Sȋ=h4_(.ާWkFYcY֬9Cżq*XO+@c>v~eajXAWǨcoH!Z"3_5w3-QaN(t9nm퓫X_pkL>^c?s֣X鶴0تSɝċ$?bw,DwBz2R\<,ƲNڱc:zV4,$/=($,S(%ʉۇg.f +Rv$m^< A>r4KAKd=Yi"C<s0TfHڇR免>HVW*TWWtb{tQm6]7৵ /ak!aav-ifzd暔Re*F[9~I4gv;  A AXߣneM` jp֘R1+,Bgߦ\tkB t̖(7f|T*ruXU֜Zq]YQ^()+6&%_~$Њ?ܳ/QJuh<ߊ]։xu׏S2֜ǾD<1^ĭ8A`gvP"\JJ̗H ^l9;em<矽N1Aj1ǟk|n}DG|4|A/9P?-'Q(J'Hq]C|ҟxBNݵ_A0g=z)*}H"d&|fz2ASkbDT[(i\<8BY4\ڏL΃2꩏%8V^B%!dHEOi"ڌ+yȩr VL\׀P:E`Wegh%C;-ml3O`vza  G2\ %c.;eO^a_]ڼu{*'~_ a H*u(KԽ>Cn 1VqF<Pg$B%O ǎ6maH2' 6$3;R1!k%6㬖Ltԅ\׵Q$Ehms 2H(E: < u0-(s:[0 >ZGƎbGjKo?XQ[zY1tTYW ss۟/oYTK(yw8Kv\%+jBndy0 2~YkzLRaP>6vo{_!#| 7ddm8X0ȑ>ܩ TÓ>HsR<]sYkXv]{kYeԅPt=MtIn,$ipR"0xKy=aVtǃ?7IY-@2z HbGSOr6qT!19?[Xg,37yTB7M<'cNxe쬪譖0W)e scmoLd$E5vA8=J5I-&Yx$eF + hRTұS5 ;3U(w@܊:M3_@>W66Jd[+nY$9]DyNloI$A$(m2?2oV(x&KXhUb.A4(m&yYWd)&$`Jp!Jᒅb1Qu*k&$&0Qu5 {=Og/|//~/q ?Ǘ~x/?3-=:6f̾.~K.=Kwy_`8?f̈́U \(=;!XmIM#܂ ϒlKS6ޥ$лBM! uM.GK;ouv’׹o7 w;C?kʹoHa+́őX6M8vZKɚ.ځ5s9P7Rѳ:4bBOH ^ .8pqRA6Uښʚ\~ʩ*EaPJ4SH n2>ŢW9Nhr;`ݚ!%:}LmҮ³MLCiq,we;ZI: LG#xf"f HeKY@v=C0\K3 Q'SԪ;)h_R/<. ff,ʶ%hH@]TL ?,CX>HpQv~@1qhި+yLF*Zr Ih.Tg{F/2Omm[jv,x${E#Ȣ/aG3]cTv 1ԝlaUjK6rMkC)=G1LT+w5dJf$n/wl+hv]7QH >~ޱG-yh= D]i:;1Qu֜c J(vd{zfdZ4 (vmmqr?+e[;u[s4{XSy . kE'R-'nS˘9O9:9{z2b&7'Cm_@Ëp"(CaCzE}X vlڋ!OЯy|[>zN>ghcd힣g9:nɎ+UΗ8PAιVo>?b_M5/ ;5vv5|4O~=~Wa#PԜ[7O^Rp%/9h/I]ҟ#"p*4\=yBՏT/P#5GxF7u%~pCgse5VF㑜 b؁by A[ /J$@p8 "+ HEH3h6}g!yHVK>:q X,UbSy?'pz w K;E5is\OfRk[hchCfRRBJ{'Nڌ/kf_a_h~"}sV-p0llqQETgN.}EV:[ٖd1Ycpc1 vv8Ft-dv %)}ot$sn.K/*Jptk=2SZӲ8G h˲>VaRgWU!|qSm 7kǴEĸnt^<Ԕ V)T:fSMƳ[2: uNSVl6qGF7POAh:Vg݉}eҍTyPSk/ΘSVpNQJN3l: ]n?QENw(#_c'Lua4 mnYzev}z| o+ѦJ{Q9 y̼-yrNBmLgO K[vS# g .6珟y-x_z̀gN=*: 焵UhoJ?|<CyT&^~%YsH.lĈW N2xyebHSVC%~k,mɄE' nҎ%X|];/>ĭXp-\ nRi; 7BY'ppPONLܖȓ)"y -Ӽe`]s+ă)iܹrJFR뺢kd=sn aOe1cČ~#M?9S3G\#3C ;281wJԱZ-21{ Ŧc?Vj*ؔnrЌPtqj@  %i6YB3/F _m]O Ӿ!4b\.2-՟^ уf>Weo_|֜vʯY'`\7nx-CwC]_g}c|/_'Ӈn9IK,ygfF0"zO@oSTwn(;4D<[Wh\mjmy7z<0һ<5  Aދ݌tqR7ɝm`v{7^׊V?򜳩gyg&. N`vdvJ@.,t'Gb3fg @gvhYս9-DJ.eUUe$ܱhgК}-Jj3gsta%clrvEu̮[8fUtMGhN Eo[k) >Y܄<#EJr#|Px'r)~ɫv jC~[Ƴ[6@K>a鐺<jW&du}JV{A0m0Ϥ0Ba&c<* w +ˮ+:- ϳFVtw=T!+b9.rb+̝O`X.Ta;@ ͟6oюNI6_2' _yht멘Q*89s!;*<\#2tܬGx#L M ;=Xn2#_.W Gǧ,A+STqik`==F=:hsCqGb;$2v<fa4mCT{@:PXfX*b~wVBmQj#@oz.Q`ZVF?i'Kگn|hig{)߬>8h6sqO_'AAnR6&?« ?kş~OC~1:A''@[.w/9#Uy|!:aTnz3]1iG> #oОhsZcj0Cg!p8Cq'WNey@Nz(ɊzZ[=(߼ 2v2D2h>fٳiMR6K2f5K`-]k0&QjY&>hptp6kz5moO8l(JZg 3PjC{6icNO Qn}@ IDATyrtA:s{,VYh@*vʣ;uaBnl3KO``5)E72 HpȔ9h يc_t< lLuM{ #Eit]\r[1 wox](}e.*Ȧ[e,$s:@2pSLcY`kZ݂OIn3V 1f)!E=BD`|zBE=p>X/r#Ef6;FH)VlL|=U@-zڻ7%]*N^pzo+Z]laؤ9GxG$:XȨ("S~gݶɛĚ k43,)I3CƊ)Bv.nqs.'ku0pA#:dkT>X}&>S?eFJҤa+-Ef7@[gKoҎÈ* "f w%ٹňD+e7f;t}`gjt?eFtoʚVaf~1.=U§7h=zߕ X2Ѡ憅̄5.:Du}.YS߳R+ۺAڃ @vt{}vt*b/KM$Q"(^ 6F*V#"J?NOTѳ"[;ُ3|1o`C49nO4V|}:"g[z3Jmm^5󁻛*ٽM;1utq&N%ܩ~NyBj3whQ%6nIfIfM|.NX}b#tD)tWjcMqvK0HY?:G6}AnJ(ݚ_&Kc?pDw2eUC$0YVZ7鐕&KNwr4Z׵`t~Z_\%7Nb%ĀpW ^a P|Xj)?kaK-HwkLnN=ri1k i' 4޸C[RUb2Fec699D6{_N- 6 9Sݥ?ff'8I8ywͅ2HHP&A4>f٭3욹Ji7ʑD8!{hbje,˽U`Mt(͓m|wjǗ%ׁ( ΖW:/a1aPd&Kl̀) NDO9`U Ǝ1Ef+/j Z'Uq*QߍAr}'o֯X+u$3 DԼ NM-0t -Er))D20VNS$]J;FWz>W>mEIu%DmI&iud.s).޾X] p~-mr6RL];Qrx]>s,O~z]<$s7zC9jW: wU[ع46h?pGs~ :ͩw-;licq6{BlwL/@]0K-0s}Gr2voq x4RJ\0JO1KS…2B\耺^e McU:Yqb,T _[&ГcHö"d>0)Ha'Y*iEE4>VӅD,3Yd%j:z jO0:8WUfNON_u2ŎA$~1_:Y6CJ.izrBj U p58[sMSn(v+ n${Uh ɞn|ݤ2U%.)\7.zE9 ޼D,JKq,QZdqЫp2Sӟ3z٢g %ޥi(?HZt;G辛57ʕ*(9oNi/Ҽ t5Vo݈S0mg ,V/ }=],~B5ݳ%Iq eUHf\6SWKkKFĴdp:8{J{q:՝P'7iU&gF>19@\ բn?p9y2j3hp˶B$Q~)^&^6qi2&u&5E_#VicG;K>j|Z{|-_Y]p@ Q0t(fi/l Njv|K8fh7kw*wܭ~_G72:]2n` ?LbIP'#.ٰ+w V[ V˱s#2/[/&֮ATbl7EUhA8Oog/u{~cmM礧= 2ҝN[]8 t7.=CwSKvt4S"ch+:YZ,*fXFXS6b G'sng${&h',, }EybhsJZ;C%qK5_;6Ppzuԕp S/>%o^ZʹGm ӆHjN/w& Tbq.P%A[V&,o'XZ Gp#zN=]&.0]eĦ굕Y".HAdz:KZnynպk1M>ːq3>jAiG։LQ983v1w`~iihPE —%Xìm*S2vEw:c+q?WDuaq4BQ~HhPbW*㵘j^껊R1spZ@sX$\&'N 8+up*zC[KgKKD(_'vsm)qh%!O@݋9yYYV{!<:eX#gBN):izm o+͝nIdQ"UyqC'ޮa:[;`>Swx_^L\swIf0kơbt b+:YeeyWB'LjeRrp%8z=;'ݨ׵N$۬WtS|e?㢲}PPlGkpDUu<&2`Nwr܅ZǪ+?Pm1߻nz[1ͩ|s_y7[J'Kr+w$KuucDa+yŒBmU}P fiJl*NFC mDs'J8N8=CzN?գDfB#|+h{fN>?2"n8!"w:pP՞sc,}PuI,ltW9fǐ2)@503Ϊ8]E%> QVS+.P;UG;{P/ٺK{J. ` ]ZK]eIVR'v{ݏ<- ʕx*V_4s'l+J2s\3܅Lk`d,Qֶ╭Xeiդ/yԱSԗ&`TF|TZ9YfN2%pLB?S$ZU) 6Y}=w5x{ V}i~{_iǢ/鄣p _ˍ^:5Ri%2FQ6y`.s;/d܄so[M4fၻȼT+<w@vJBaez OmqyZ]qw܁_ +X;_.n 6N]%c'ɈApDYG BmA-ë4QDUָI(ij sױQoڧ4pj[Bc* C)m\Ur:F'ĉ 3tK tyv hȼֺqN~ƑSs S%gxfy xbjbj58mk͠G)a3N]*o10=@3C0llz00 u!N(sA}1XZp,}_.3??98LV]zF~yyf5u99#"^9SdTblm~"g9% ^dɺ)V[[C1th6,;Yxi${̝ _0&S\.? <.~Dv$RS,yMaf5|'5 @sR^WBf5?_A;wW"?{'U!aMI 1 ,|d;+Yu ')4Qu'udNutd/FȚȴL&t^?#=g̢XY,FeYWtN8 7".%_/QVo39ɨcn, QN; 3Go= Dw0T8"#L?0cK5t;l+k-]l$kx 4;}:}'TS|LDwBR7^M9eEڵWݗ`c`W<49}?7>'B9$< -CV2rk1h{7g.p9=x޷e~Ϙ/_9(r$;<`Y|fq&'\pp]pOk4d:&+ဣ$/ת]7jg! Ӷ,B;`$37󃺴&ZvzVhU]SDU)f׽ )][M+ƅayDI;VU=V GۯZ1 u ]zO(DJu!n<kݩ҅-cw[ ZcUJ?pPC7|j218YEl6҆|$]\(p']&ΘJy1sa/.+9rL35Sd ;9-[sM+G/*./揌Y7EvkNڒ,j6y~z&HhQ+c+*2W[Yo1?b}mTX(`,DO\Fjy(?}R;h^_*_gKXXSbU-Ju,1V@^l:-B>q [iT..)+Ğ_sdeTT{haTy'ï؉7]UKƯ"8!i21:U?Ac3bE _oJ;;VGt_E-Xmf,q3M@{Le]um##ʗX{ܴHis?]p,)"Do~E3}w~_7/ONXR!Qҿު 5sqY+x1ľS#nrgp1(GlB2vIMƣ,KƁ{N798(vX(}ˢK}ˉntWt0NzG׵guj[*HݝuC] aC:z7­#"'/ZuV Zc-^e?n_/UYU] GlK#ܫ6| liIt|ڨpE0$\[g&ŬrK-T 1 nx_t{T ܸtcS0@ :h$é0tTEr,ˌ2U(N3vBj.)=n,Ti'{*P˸zCtnEx9%a7OJPr*ӄd$+13g! gm TIs_j&At%ni|LL%u`G3D)We:2dLI֬lQ]l&`_NG/;fɞ)NF:LpA(! IDATiHϠ'ܥ{]nyI}}SɞAޚ;DF_ SUa$ԃoظg`)o]5K: Gi "WK\JWQW~ϿMrbݷ;;޳ą9(ߦpLk-yb'$@Q,KX.琅=#ǗB 'rdĦM]"2  >[jZQ<g]HiI.S p!vU߿#B}#|Zd+WTfڬ)9H%ܘkz}8h~]) nq SPP-8t9 YeM CvgT۲y>j+m~sVZiFkCQˢ`,W\tο@(Bn ghz~HtuK^h(uy:Z5Vw'X.Io7|Xqԉ=ؓ?YV8DŽf޲~Ͼ,WWX}NYzsԉcO@0wj%/~]ߢxg MŦgQԺH(5au/J+&+S>ϭcVEadSU>ɜIM?S wvjJ8X\j}z9E}y6k~c>gdH (pN8J}WEN{|i$HOlj_Ko)Xhm,`j4>'to~4s$kVsZS',]qk4e^^Xep%-O6rΙy4uGQ_HOǬckSM{1oYCVM[F!K >1w揑ڞظ:BNs[USmƸIӬk)׵xn?U]Sն4:UIkm$suuIk\)#E} կQX %P&']*}d= wp>v|bQ̪)6ѾK/^z_vMuj}z7=xc%dIr9:X@I*JĂQXĉBhuzJ0v@j[<7쥠~zn-er7D{%q {AR橥*fe5uXL413y2cC|](c$'莸9Nw*!JYZsC'J[Kpz~|kd`NmU^+T6et昺.UXP-!4D*!#7FjüiM{roww<\+wY;05EEUYVkx3x?v Ʈ%ޥU0,.w8g!5苯kz&O+?[`mX]$U86P~\s -q㐧bξT:QFDJ zXX%ءe7>sQU K&cwG|VZ:2{F DjeZ ]Zi3[WB2/e$[%*JЖk6c-[458**0v7B{enWt9Pe T). W?sh ]['&昚z-KG `}icf}uZ1KX m+4LIwOq_T&0z;JB;J"7hku1`^e `nh6C;QhZ78{WZJbvBiMVt@xB:`bdHF b-ɨ`${5[/IGto}ibhN7?oh[DKkoG' 6{hKCrpڤ ʻXOM~ɲ]XGmۏ9MvyMs\ CyYp29*3qlKSޛ'l i*V]q6_urijn/:>%iղxWJ;?&mɇ:4<ԏ:&'}In'pd?:_LzC64:N/$?^1KPQ脹_+$-펧`F7޻Y z[ImpozNBzݧq,>;9Ɠg 0p~dҚeŴIP'_K-]t _2P]*sZy9ݵ2ݜdn "%F"D*N<ګ -^ŖIUb8dkM64Y6$-~; i1*N eKMm25U'`͞舲/iӥb㽳_@C2FA|oeTcyA: H;fM$Pe! f1gOj4Q£uKiTI<4Df K\ ΩWrwLBs "%Q9F|@G$G L|@BĎ ?cGԉ?#We~"*7ZM鿪:Աx^W­(P5i.eJv_yN@˩:J7 mZ d2=:-GΣr Wߑ+pj|ZGX@'a(*`LxGɏN #=3wvÿGaST<yG|fB/߇<:N:MDG f=q9{SJ*Fۂ h hZG?_h I%*U=dcA ~{* 0y k}eCvH"D8>x|eg$ \/U\U[mZ:ngB^V;V=*sǓ 39vl<e<~ǿ 2Džas'SOo|U_;5?;ىpgG?]?G5ל?.kGKX}JwHP / J0y_uy .o Hp2c (, (.ϖ;,sZDr9_탽~ߐ9%}u_U5X;R$n/4'Ɖ.v(IHe]})^f!@-K'IrPfl<ӾZnlߚ_ǻW i0?.5 ؾY|e9TsVIeJ}* !{Y2%ccX%h8 b)qt3J؂%Y9*Ҧ30t. 1V) F:'eT<4o0y9/bk"[G:N@цid&"z$ZQ2@1jRIa?sN62l4Rn~jQ_UjL M ̀k|S0M q9o&   khAa/a)ų_7mo4od\mпxMv?l- W2}\WGnqQR5?\1y-e*dR_R)"aL-Sۆd$7AR朼Kdκ|ۿHusts#yv?cx@ks":KoP7m}lc"['vtg1vW:⽳:0:5ˇbmJk2Kω8=+}e9>rw>?,q5'-eJEۥ<NKEPZinNLl7f8b)Ċ?EXC&ŐŷQMZ~&>*D7Q${\";V6G&wǒo3y6x@/QV3KBLKls?-.pX3YR)6ۈd"Y;}n.V]g5j YqJi%%JEw98IhX vL#3>[ 5z'{_ O[0s>9Qt&[ ~e{M`y)|9YurJ̠~LkW5w*sI|'31QH2v <9qDQtiVKTDL~C|4ft%gǢ-RyOq_swJVN4SJp|&L{Ui(<^$x|P 2y_.^k)oTż}<SH;I&*=)M~%N%'1';mY-Q*s Lnc)ۃE`2Pkc]v}1{spyyjxGݬZJ rw{q~]Ϝ_|Y?}U4HBewN_d X NMo0)[ =땎m/<27[&'1ӘBv?J^vb,^Պd,ry.~<\cghOD?~$MhZ1+R qLobl/Do:`J6~KP/(5 a~3$c5zw=Rt]UdSu)_0N;WJ ݵ,ʫ>uv IDATXT,)kwY%g'KbN^~4a=Ѣ𾅥%`MͿ;~Ҙ1|ƺ-ĆBl_82tʓ=E.&;f%J K GRǬ# mQlbyb%Y "8ǻ?,Ć@4_Xԏh &XQ+|sE}`m-8ޮi):f=`.SgemJA( ICS04%H0tl(&% *qQ9 -p4fkhA)тvֿz\ ;M)!I"Ґ!A*0 _u2f΀\>߿6J 4DĮB PH,Q`4_dz巘S ":8AQ?wy!ADCPjX]Z b*%NViu([ ؗXGlLbA=bؼ4m~a:Qn9i+'5rrAAiRHj A"\^c.^ j=FIu5F^-HÄ<#YD2d٠ NPwԊ Z_+3UR֎.)&Q_ײ+UJʄa%K lc*"fC X k?Z5L"lMIv't©5IHwڸaDh$ Jp) &V?`9])۵[S<~t2ع erR]j7]&sJsqIt~@RUÅ2#$JAŴDq/D~.C݅-%8\F5}ѽ>]Cq4vy8GtD٣TNBd+޻ 58)P*DC@mH 1dQL 9jsI8cSqlUCʝ*֡T{j[6? "oN)?Ԧ9]t,6"LACqYȗ9wMV0UZ7ֲ_guQ!{E掵[A(r\#lWba7 Q!E(quPYJ`*KVR_WZP*qaWđƩ"TDDrէmf}3𲓒b)|/ټӘAD"vu w'%؊'9}$;u|B2HFkl-eܩ/Is'ɊxwBXO}>b+;uV$BcH,]K؋DjP'uw3& y0w)d FdoLEek7re|sBE[Xcu($3 "_ND8&;~ܕ(RJ!d?(cBJݎ Rk %010"WGLgIi&kMlqb9=O yiLNL`7W(L.F0٨{2I|Ds-Ub6i#S vv,e !reS=+ܪV.%R4C\^^L dV_y\[Ee2A_Ghjwj>*D_GS 醑uaYDD28rvW5zDs.5ɠ]FV gD^~RN;W0*cQ>.Uiωf ӈ s6]̜ 'Oy/Rj;_JY6g.LLv u1#(YbkGEPeҴKC 9S(RBr2uDM;B2Oë>)fdr37Pl"nRs<[s|twM^GG,Om6@x-pdW(Y0L6/zoφ8qGʐ?_[~2/ ?]c_rhRՠ1#{IDA.dp^,Ȭes95ww$Kq}naW*CȜs9u[Ie\nq6jEˤgARo$Ml'äI\vDnc.wdͯy WuOOq|gnG!ۆuT76,϶?OyQv~JwmnB #~W,X4˥\͙<6KJƉ'd{T⥄{a4.Xʯ Nd˱2rkS':k.HwM(JFJՂAvZqyuvZkԊTAYJ[חS]]߬1fת<&>~֚ʩ;e&}c/ʩZ* I^R6~sۙ,+Cs4N`tIp/(tO|JTΕOJ>8(C=_Uץ[8#Ry]mS5 @6"Jv7hѥRl9=Orӡ&Ft=ͮ'.h%{Lʳy]ӓ wu9|W7vIuE7A{}v[R}?/7ási'! wO%S彿|}FrW8c;'g%۵Yh >_]S︅Pb~JiG+]_Γ:y+eA/ҤON #ݥ2S"G,wQQe+6(g5;-U.$i‰&z\ufkAb/q9Ohuj'!% m1%T擏lE]1{} e<˲yPK(O'l-{Y9(&I V49t5ŘYxDڕJ҄8@B*O% xڬ3N;g2eemF#~c)"?dްJjg\ΉUVRlgMj уK!Gi )YrkzE-%K(U I)2% 6xD(AXc`JTV1X!h  VQX6pPX!RXZ,M6|+`Ca2ŜIC$d O*OJU49`O' ݾg >V\ Έ Pk*}]ΉTQ6!ܦXkE0/ Iݙa 궮>Yfk( ڦ1ucMkE邸EowRfnתy!q-66Fɰ3˗qOQB$o&81EN"MlYFˎQOEr&h+f\= DuE;t>šxTÔ&#FZE)((ZփZ!bcV2Bbou0b։Fq!>ÖKSw1g`^*Ut'"؅@.Wޖcd) eO;nVFII\ը&f '1[b?6Q\N,"[͐BOgΙ0HȎ(,'i«芩:TЄ72câRN(?©h%%m]TC@=ޠ LJV20 >:B)1Y9;5)-&7TW8]j'1Y*J/PV^%+j'b38$UVh<im_(#n*"SR)r٩~{`,4|\,}$)c:ef]fZʧlbϥ$,8GtPY6U-NٽFڵsͲʄ9Wl:eNBw+ Y MmKh:Ƈ|%_;_4F|+pL4EgD|Юx}謖 H6oDa;gFœ_HJ=yN~%0+,I/s0x:`FEVZxvWwzj>c^T0Jnvd޸~J}C z=rJf.7A[&}sDԙ:Ƈڇ@ݚ;(yLU7DƉ _i=3Cp])vu ҅'xNQ9ri8ρ&±'Y;鈅7~{[~L/F^{[ca0i ZZQ#ˉJ,XSԛ}cE,G-N?odY=s57>3w}A]k1 FF2x;b[L o߄dO'Gl|잷g`LE&<`n@Г扞9ΩIVt}E3ls̝4 ,/|\d C\$g(jiRԢ,}/RP*r3J~ƢG0P-zƼo+g^9{oHiד/zqlCDNٻ]Lb;L5H2mŦdH.7Jqg]A͏0l=Gs|ݭt$pk"9e<~EG͏ ZؗM^ ?&ebW[>hg謨 IC9\p3vrӛj%,nHY5ITNcEDze1 lmS(KٿJ?\ : F&?iX&Ѩ"TVKM%]p$iv B"J Xt'F*z:=y˥֜R*'Ozm]*J?Q5 ŏ6,-Ϊ/FdRG$Ad)=RD%37ۑ=˸ʙbfچEs?/;3ɦ cJ-[f?|c9m,J׬Qd`SA6HDL,Y`t<]q~ -R${V %Z&VXӄ]YKS,etxFVJk7W4NHwbAufeRÎ3`Xpp䡈5&s]Z;.ݬ^2#1vy"As=MXٺ6.Y)ߙCZSPێ)(.q*za>rq]  ZpVo3pY( Rgw*ɹ{S)j4y?e|괧M:}IZ] 6&FqAQ( McWk(~B:E ElL4kFĮvmPY CMV%bf @<]*s"(^̺2jn*RrkN c)HS9餸Kϝ nwZ1GOϨxx9E%eee?iY )W7 ZߙKT13cuޡd0> ej& dP.$;w=ֹ?m1{J?_ v?q^EKFv Zf9P lݎ,ٗ~Zuqj+Y2|:t1}?⬑|{ %Kaޯ`ĉِKfNiӗuwl`] Ƕm&!zd\sI?Y Y=ǃzːx2;|zkWbtTu/CG\ƿNu`[gNcK/P3HJ.+x)fa\R?G4i: ~+uy>N:TVU6-*p=loĭɐM.r]] S^x:R$*0JY$3:XM"J׉뜸[ (bKTGdnG e+l}@q<#zyǔ4cڌ!LW)gJ 3SŇW"b\Q/o/$ibU #VyUJVH #\}D>Rl%{~<ݛ#ʅ%[&܎BKdqtU~Ld)h#_squ9{W݆j/ni IDATmVx>TUBlLd{ jpfsZR@}T%Yug ?hkXJٵarzbÐ=8M ; Q&Jd "K)Qq(x(8IK3TY疭Af28pP.7Z>3qӣ؋X53ʾǍuBd&Tӯ脟@w$+n_mp>\sXc1<1u+v]wYEj50XǔIDF$m)^Y3"wT"j۔U|9]aFQLVy) +g./8[-P)cF W4h:ɞx!:[s4R**eJ5.ks7vs|-P(g,lyy{ŚzRX ?hݩ\&.VlNsvԎKq_\]m6nX$3N f&؍Y=a[U]TQџy,l0Zc( 5Xm)ɖZIGΣGT!$.q4c&8!"!R\T&閈\oebAm2" j`8-h[\XfHĜ(R X)[Y\QA}2$zK_CQg^vZqo;n_m~;^\1;{qc|-2){6|7PÀq5Nַ? oo*?E I2(Xƿ;ZoM ~+q 7RQ-Jx&E{!d}9ts0xDwn?/V丨|q]`Z dؼ˗)܎je3Q_ʴ2X)Cy].Ri#8(КXuAQ[4?S9KD>^/.VgseW3HჹcZUtn@et)2zd~_;8fρW\+W?)>F">~r)͔U6ģ6X ,`m| a*]eG)E`-`xdlY41f7TW[4śEaUtQ#qKY%c*۴oUw ,7O ڷCɰٜ]@OL fXm,q]* *bc"VG3RŒ& mI5ge|<@6n; '^[b-1ǻ6tߐ){-]*ԕ0,&% Isknɳw)RU{^{fwv666Ž})6`wzJRDQ/ Lg`$H?dR ڬiPlh ;=ga]Ȥ|3=Z{Ε=Tє ]|SęocK?Uxǵ *3Pcp?嚘ւaw~=6fkc6(+렻 }Cښq|wYPV B9*5D|>q*@ o,{ƜJvOx4#n]E>cfM})={1C-g6FSʐ흋؞N8*u&6I: 95&,=xIBб5[Sio='Uxg +K+IHuio`a :d[-U oߛmt0J+%t+ˍz!:NhYe#5#=#QV~kd6l77ٱZ ɁH0O!n=lر%Y_gfo5f^Me' N "0t}s OBfE֖EDMě4X=}T(鄄ߗg7wqӏy [/)0x1LO5av_-u "D,o7*ߏT`!"IJ}>-7u~d08c%!3EϔG\+הݑꏮ5alsPsOEoi HRx=8+9 zßuNfk`YIav#Y=a|Z6m\Slp<><M4[LӬ<;;ŴUhlӘg*slb&k% }m?ϛ*(xT;yٶ!D O1f=dJΉIֲ*Qx J.J-=c[ ɸ0?`&.Mi"Q\i6CSi*7wCYPls4gLgf> Jpsw2tg3K=|S<!x@ NB.3.g o=e+9i`S'xC]g]0߾'k% tܣo_qso%<8h|h9o kX~ZS\(mZ$\6 nd_mC-Nm$Aevze]XyDSKӉ1 (, 7~~[ dvYk;Mg)_+nTN Y6 =Nmu2g ^RM0  ۨ3nkḮƫ)ء|Ůص-gvx .pU6nW_HfgLK{lgq쇄m oavl QG:J/P L]`%ؖx6 w4~Gl&%DuxkWUtkgBYqØ2 ,eYм3lP0-:}2&V'ձ~EѧGCX]ŬNp_ ]ƫBpP H8)>@%.*hiȺ(uÑeV=3uҸ<|'YN{ +!̪R}OjF;c65]گJfF U+^V: [,e`:V .)t,bc8|qJmZ%v:4]&2؅N#bniqAEM/:M?܍2cV5fИO:vI?єKTJd7^bxUxMsTji>\qԕJeufm,1 }dRbe:vJ,LxI"6p=5զK9q =ʏٚ*$to% 6b4_-MfqC]y@GšhIQ55U$Kj)Z~3GXolUfY߽G!SR9}Gx)VDWZIRvn[R7u3%xu$A "j)c킟ڎΥJHo^5RSG}9ddWDK,A],/ N3פ.r%tr^Bfz'%b]weU>>_;ƋBC'g݄_-`e>\() BN]Mֳ/o3y3uNW=צd̑H50>NKB1y.4wCTJ+tv`Fdζtv+'7H-^Ƙ:~1.yQH5ԚI7{.:~,uWb]vyP'"a=Z@yNN"$$$S(rOdn'k||#ߓ{7 xOybIʻs,?׾>cO13[U>*3E

N CZ}IN5J2v}Y-TY78~Lg{nVe.3&ͿO9J@!/->p_rPQ(˜9D&]fEdcEIbdYv=*ՄP͌Zx"Jyw{uuْe0k,+JOgpZ-Yu/ :5(c'6Ž<~~|vF+8?V>1Ru#u9}%w:3{x %| RYaZQz9wy$_%DV캎6PZ|L;Ԍ2qO߱d_b^JaئJ6g]Yf!r( Psy'E)7?&f4Tm@ ,1f= ZʒrD*bX1ȫ~5H`8V-p{g'd߭MT} YU/Mnyvi_f"c5n{z'TfNq+uWqlsJǏ[ IDATKO٬<`ieק%|9VZ,؟,(s[sN&k]dYv^qeҟ*>->-yK">u6MX>,LR(J{ x^Wen%[U+c Eﶿ[yw^2qϾgVx*d sMj6s m|&uuGGw}6V%[WS> Z;5bZv"5B/uJ L͜euOy=]خɩ |~baYh~"75bz1ጝjEm]~L3MN/(8_ʹwV㐱Q&Z BgUZ,˶G0seh$iheϡ`liWO^Wxi!Em9Pqd_6(i'tw5B^mrL߱]bN6#u%ח+̥b4]Y'eE!;BXn Ezx%W`Y%Pd^){%ss+,B^`j$^bLirxW$e% kl %mbF@ttkGtǪQYɮٕXhChj%SGLTcFͮ+Ƽ6:[w%8%[M3d(|? .v焵Lb`#Nxr7^vYnݖ34Iyqɱe4_$c;IxT4ʘF +@:/rlIpI oIV Aq3-螵Uû31w )zAs4axɼ>kT۷x~ ۯe\TW]6/uuȗ{Nz(+)U*U_6mSNexLkp3?-F#쒔7T7DLٳ Olھ (;fa(!Sh|[~T6#QXa#l޳/)ι1Kݟk6G/_js\m.˹BG'ekZǎ-fNI k.sw BC@~U`o% 6fgc$UtåPUJ׳1-h 2}\ђ:>FKzߠif]QX65QhN}/!(4IENDB`aMule-2.3.1/src/utils/cas/graphics.c0000644000175000017470000000515211575347521016142 0ustar topiusers/* * Name: Graphics functions * * Purpose: All the functions that are used to create the Online Signature Image * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifdef __GD__ #include #include #include "functions.h" #include "configfile.h" #include "graphics.h" /* * this is the funcion that writes the text to the image. * almost everything is taken from libgd examples */ int createimage(CONF *config, char *lines[IMG_TEXTLINES], char *path_for_picture) { FILE *in, *out; char *path; gdImagePtr im; int white, i; int brect[8]; if ( (in = fopen(config->font, "r")) == NULL) { perror("font not found\ncheck casrc\n"); return 0; } fclose(in); if ( (in = fopen(config->source, "rb")) == NULL) { perror("source_image not found\ncheck casrc\n"); return 0; } im = gdImageCreateFromPng(in); if( NULL == im) { perror("Error loading source image (not a valid png image file?).\n"); return 0; } white = gdImageColorResolve(im, 255, 255, 255); for (i = 0; i < IMG_TEXTLINES; i++) { if (config->enabled[i] == 1) { gdImageStringFT(im, &brect[0], white, config->font, config->size, 0.0, config->x[i], config->y[i], lines[i]); } } if (config->img_type==0) { path = get_amule_path("aMule-online-sign.png", 0, path_for_picture); } else { path = get_amule_path("aMule-online-sign.jpg", 0, path_for_picture); } if (path == NULL && config->img_type==0) { perror("could not get PNG path\n"); return 0; } else if (path == NULL) { perror("could not get JPG path\n"); return 0; } out = fopen(path, "w"); free(path); if (config->img_type==0) { gdImagePng(im, out); } else { gdImageJpeg(im, out, -1); } fclose(out); printf("Online Signature picture created.\n"); gdImageDestroy(im); return 1; } #endif aMule-2.3.1/src/utils/cas/Makefile.am0000644000175000017470000000201111575347521016221 0ustar topiusersEXTRA_DIST = README SUBDIRS = docs bin_PROGRAMS = cas dist_cas_DATA = tmp.html stat.png casdir = $(datadir)/cas cas_SOURCES = cas.c \ configfile.c \ functions.c \ graphics.c \ html.c \ lines.c noinst_HEADERS = configfile.h \ functions.h \ graphics.h \ html.h \ lines.h \ version.h cas_CPPFLAGS = $(MULECPPFLAGS) $(CAS_DEFS) cas_CFLAGS = $(MULECFLAGS) $(GDLIB_CFLAGS) cas_LDFLAGS = $(MULELDFLAGS) $(GDLIB_LDFLAGS) cas_LDADD= $(GDLIB_LIBS) if NEED_CORESERVICES cas_LDFLAGS += -framework CoreServices endif # Resources if NEED_RC SUFFIXES = .rc .rc.$(OBJEXT): $(RC) $(MULERCFLAGS) -I$(top_srcdir) $(RCFLAGS) -O COFF -i "$<" -o "$@" nodist_cas_SOURCES = cas-version.rc cas-version.rc: $(top_builddir)/version.rc @sed -e 's/VER_FILEDESCRIPTION_STR/"C aMule Statistics"/' \ -e 's/VER_INTERNALNAME_STR/"cas"/' \ -e 's/VER_ORIGINALFILENAME_STR/"cas$(EXEEXT)"/' "$<" > "$@" CLEANFILES = *-version.rc endif MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/cas/docs/0000755000175000017470000000000011657306263015122 5ustar topiusersaMule-2.3.1/src/utils/cas/docs/cas.tr.10000644000175000017470000000430411657220745016377 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "Kasım 2011" "cas v0.8" "aMule yardımcı araçları" .als B_untranslated B .als RB_untranslated RB .SH İSİM cas \- c aMule istatistikleri .SH KULLANIM .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH AÇIKLAMA \fBcas\fP çevrimiçi aMule imza dosyanızı konsolda (insanların okuyabileceği bir şekilde) görüntülemeye yarayan bir programdır. Bunun çalışması için aMule'ün ayarlarında "Çevrim İçi İmza" seçeneğini etkinleştirmeniz gerekmektedir. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Çevrimiçi imza resmini yazar. Yazılacağı konumu belirtmek için İsteğinize bağlı olarak bu seçeneğe \fI=\fP ekleyebilirsiniz. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR Resim ve istatistikleri bir HTML sayfasına yazar. Yazılacağı konumu belirtmek için İsteğinize bağlı olarak bu seçeneğe \fI=\fP ekleyebilirsiniz. .TP \fB[ \-c\fP \fI\fP, \fB\-\-config\-dir\fP=\fI\fP \fB]\fP Yapılandırmayı home yerine \fI\fPdan oku .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Kısa bir kullanım açıklaması görüntüler. .P Hiçbir seçenek belirtilmediği zaman çevrimiçi imzayı standart çıktıda yazar. \fBcas\fP Pedro de Oliveira tarafından yazılmıştır .SH DOSYALAR ~/.aMule/casrc .br stat.png .br tmp.html .SH GERİBİLDİRİM Hataları bildirmek için forumumuzu (\fIhttp://forum.amule.org/\fP) ya da hata takipçimizi (\fIhttp://bugs.amule.org/\fP) kullanınız. Hataları bildirmek için e\-mail ve e\-mail listemizi kullanmamanızı ve geliştiricilerden birine doğrudan bildirmemenizi rica ederiz. .SH "TELİF HAKKI" aMule ve ilgili tüm yardımcı araçları GNU Genel Kamu Lisansı çerçevesinde dağıtılmaktadır. .SH "İLGİLİ BELGELER" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH YAZAN Bu kılavuz sayfası Vollstrecker tarafından yazılmıştır. aMule-2.3.1/src/utils/cas/docs/cas.ru.10000644000175000017470000000553311653631431016377 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "November 2011" "cas v0.8" "утилиты aMule" .als B_untranslated B .als RB_untranslated RB .SH ИМЯ cas \- c\-статистика aMule .SH ОБЗОР .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI<путь>\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH ОПИСАНИЕ \fBcas\fP \- программа для отображения содержимого файла вашей онлайн\-подписи aMule на консоль (в читаемой форме). Чтобы это работало, вы должны включить опцию "Онлайн подпись" в настройках aMule. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Записывает картинку с онлайн\-подписью. Вы можете дополнительно указать \fI=<ПУТЬ>\fP, куда она будет сохранена. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR HTML страница со статистикой и картинкой. Вы можете дополнительно указать \fI=<ПУТЬ>\fP, куда она будет сохранена. .TP \fB[ \-c\fP \fI<путь>\fP, \fB\-\-config\-dir\fP=\fI<путь>\fP \fB]\fP Прочитать конфигурацию из места, указанного в \fI<пути>\fP, вместо домашнего каталога .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Выводит короткую помощь по использованию. .P Без опций программа выведет данные о подписи в стандартный вывод. \fBcas\fP был написан Pedro de Oliveira .SH ФАЙЛЫ ~/.aMule/casrc .br stat.png .br tmp.html .SH "СООБЩЕНИЕ ОБ ОШИБКАХ" Пожалуйста, сообщайте об ошибках либо на нашем форуме (\fIhttp://forum.amule.org/\fP), либо в багтрекере (\fIhttp://bugs.amule.org/\fP). Пожалуйста, не сообщайте об ошбках по электронной почте, по нашим спискам рассылки, или напрямую участникам. .SH "АВТОРСКИЕ ПРАВА" aMule и все прилагающиеся инструменты распространаются под Открытым Лицензионным Соглашением GNU (GNU GPL). .SH "СМ. ТАКЖЕ" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH АВТОРЫ Автор страницы помощи: Vollstrecker , перевод: Radist Morse aMule-2.3.1/src/utils/cas/docs/Makefile.am0000644000175000017470000000030711641025331017141 0ustar topiusersSELECTED_MANPAGES = $(CAS_MANPAGES) EXTRA_DIST = cas.1 cas.de.1 cas.es.1 cas.fr.1 cas.hu.1 cas.it.1 cas.ru.1 cas.tr.1 include $(top_srcdir)/automake/manpages.am MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/cas/docs/cas.10000644000175000017470000000337711653631431015756 0ustar topiusers.TH CAS 1 "November 2011" "cas v0.8" "aMule utilities" .als B_untranslated B .als RB_untranslated RB .SH NAME cas \- c aMule statistics .SH SYNOPSIS .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] .RB [ \-c " " \fI ] .B_untranslated cas .RB_untranslated [ \-h ] .SH DESCRIPTION \fBcas\fR is a program for displaying the contents of your aMule online signature file to console (in a human readable form). For this to work, you must enable the "Online Signature" option in aMule's preferences. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Writes the online signature picture. You can optionally append \fI=\fR to this option, to specify the location it should be written to. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR HTML page with stats and picture. You can optionally append \fI=\fR to this option, to specify the location it should be written to. .TP \fB[ \-c\fR \fI\fR, \fB\-\-config\-dir\fR=\fI\fR \fB]\fR Read config from \fI\fR instead of home .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Prints a short usage description. .P Without any options, it prints online signature data to stdout. \fBcas\fR was written by Pedro de Oliveira .SH FILES ~/.aMule/casrc .br stat.png .br tmp.html .SH REPORTING BUGS Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. .SH COPYRIGHT aMule and all of its related utilities are distributed under the GNU General Public License. .SH SEE ALSO .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH AUTHOR This manpage was written by Vollstrecker aMule-2.3.1/src/utils/cas/docs/cas.hu.10000644000175000017470000000420011656343533016361 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "2011. november" "cas v0.8" "aMule segédprogramok" .als B_untranslated B .als RB_untranslated RB .SH NÉV cas \- c aMule statisztikák .SH ÁTTEKINTÉS .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI<útvonal>\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH LEÍRÁS A \fBcas\fP program az aMule online\-aláírás fájljának tartalmát jeleníti meg a képernyőn. Ahhoz, hogy ez működjön, engedélyezni kell az \(BqOnline aláírás\(rq opciót az aMule beállításaiban. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Az online\-aláírás képet generálja. Lehetséges \fI=\fP hozzácsatolásával megmondani, hová írja. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR Egy HTML oldalt generál, statisztikával és képpel. Lehetséges \fI=\fP hozzácsatolásával megmondani, hová írja. .TP \fB[ \-c\fP \fI<útvonal>\fP, \fB\-\-config\-dir\fP=\fI<útvonal>\fP \fB]\fP A beállításokat az \fI<útvonal>\fP\-ból olvassa az alapértelmezett helyett. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Egy rövid használati leírást jelenít meg. .P Paraméterek nélkül az online\-aláírás adatokat a szabvány kimenetre írja. A \fBcas\fP\-t Pedro de Oliveira írta. .SH FÁJLOK ~/.aMule/casrc .br stat.png .br tmp.html .SH "HIBÁK JELENTÉSE" A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fP), vagy a hibakövetőben (\fIhttp://bugs.amule.org/\fP) jelentsék. Hibákról kérjük ne írjanak levelet (e\-mail\-t) se a levelezési listára, se közvetlenül valamelyik fejlesztőnek. .SH COPYRIGHT Az aMule és az összes hozzá tartozó segédprogram a GNU General Public License védelme alatt áll. .SH "LÁSD MÉG" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH SZERZŐ Ezt a kézikönyv lapot Vollstrecker írta. .SH MAGYAR FORDÍTÁS Dévai Tamás aMule-2.3.1/src/utils/cas/docs/cas.it.10000644000175000017470000000430611655447554016377 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "Novembre 2011" "cas v0.8" "Utilità di aMule" .als B_untranslated B .als RB_untranslated RB .SH NOME cas \- statistiche c di aMule .SH SINTASSI .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH DESCRIZIONE \fBcas\fP è un programma per visualizzare i contenuti del file di firma generato da aMule in console (in forma leggibile dalle persone). Per il funzionamento, devi abilitare l'opzione "firma online" nelle preferenze di aMule. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Genera il disegno per la firma. Si può anche aggiungere \fI=\fP a questa opzione per specificare il luogo dove deve essere scritta. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR Pagina HTML con le statistiche e il disegno. Si può anche aggiungere \fI=\fP a questa opzione per specificare il luogo dove deve essere scritta. .TP \fB[ \-c\fP \fI\fP, \fB\-\-config\-dir\fP=\fI\fP \fB]\fP Legge la configurazione dal \fI\fP invece che dalla directory dell'utente. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Visualizza una breve descrizione dell'utilizzo. .P Senza opzioni, scrive i dati della firma nello stdout. \fBcas\fP è stato scritto da Pedro de Oliveira .SH FILE ~/.aMule/casrc .br stat.png .br tmp.html .SH "SEGNALARE I BUG" Per favore segnalare i bug nel nostro forum (\fIhttp://forum.amule.org/\fP) o nel nostro bugtracker (\fIhttp://bugs.amule.org/\fP). Per favore non segnalare i bug via posta elettronica, né nella nostra mailing list né direttamente a qualunque membro del gruppo. .SH COPYRIGHT aMule e tutti i programmi di utilità correlati sono distribuiti in accordo alla GNU General Public License. .SH "VEDI ANCHE" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH AUTORE Questa pagina del manuale è stata scritta da Vollstrecker .SH TRADUZIONE ITALIANA Stefano Corti aMule-2.3.1/src/utils/cas/docs/Makefile.in0000644000175000017470000003651211657306263017176 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/automake/manpages.am subdir = src/utils/cas/docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SELECTED_MANPAGES = $(CAS_MANPAGES) EXTRA_DIST = cas.1 cas.de.1 cas.es.1 cas.fr.1 cas.hu.1 cas.it.1 cas.ru.1 cas.tr.1 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/manpages.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/utils/cas/docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/cas/docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -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: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook 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 uninstall uninstall-am uninstall-hook install-data-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/$$locale/man1 ; \ if test -f $(srcdir)/$$file; then name=$(srcdir)/$$file; \ else name=$$file; fi; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done uninstall-hook: @test -z "`echo $(SELECTED_MANPAGES)`" || \ for file in $(SELECTED_MANPAGES); do \ lang=`echo $$file | sed -e 's/^[^.]*\.//'`; \ if test $$lang = 1; then \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/man1/$$inst ; \ else \ locale=`echo $$lang | sed -e 's/\..*//'` ; \ inst=`echo $$file | sed -e "s/\.$${locale}\.1//" -e '$(transform)'`.1 ; \ rm -f $(DESTDIR)$(mandir)/$$locale/man1/$$inst ; \ fi; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/cas/docs/cas.fr.10000644000175000017470000000431011657217366016363 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "Novembre 2011" "cas v0.8" "Outils d'aMule" .als B_untranslated B .als RB_untranslated RB .SH NOM cas \- c aMule statistics .SH SYNOPSIS .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH DESCRIPTION \fBcas\fP est un programme pour afficher le contenu de votre fichier de signature aMule en ligne sur la console (sous une forme lisible par l'homme). Pour que cela fonctionne, vous devez activer l'option "Online Signature" dans les préférences d'aMule. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Écrit l'image de la signature en ligne. Vous pouvez éventuellement ajouter \fI=\fP à cette option, pour spécifier l'emplacement où elle doit être écrite. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR Page HTML avec des statistiques et l'image. Vous pouvez éventuellement ajouter \fI=\fP à cette option, pour spécifier l'emplacement où elle doit être écrite. .TP \fB[ \-c\fP \fI\fP, \fB\-\-config\-dir\fP=\fI\fP \fB]\fP Utiliser le fichier de config \fI\fP à la place de celui par défaut .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Afficher une court description d'utilisation. .P Sans aucune option, elle affiche des données de signature en ligne sur la sortie standard. \fBcas\fP a été écrit par Pedro de Oliveira .SH FICHIERS ~/.aMule/casrc .br stat.png .br tmp.html .SH "RAPPORTER DES BOGUES" Veuillez rapporter les bogues sur notre forum (\fIhttp://forum.amule.org/\fP), ou sur notre bugtracker (\fIhttp://bugs.amule.org/\fP). Veuillez ne pas rapporter les bogues par e\-mail, sur notre liste de diffusion ou directement à n'importe quel membre de l'équipe. .SH COPYRIGHT aMule et tout ses outils sont distribués sous la licence GNU General Public License. .SH "VOIR AUSSI" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH AUTEUR Cette manpage a été écrite par Vollstrecker aMule-2.3.1/src/utils/cas/docs/cas.es.10000644000175000017470000000407411653631431016357 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "November 2011" "cas v0.8" "aMule utilidades" .als B_untranslated B .als RB_untranslated RB .SH NOMBRE cas \- c estadisticas de aMule .SH SINOPSIS .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH DESCRIPCIÓN \fBcas\fP is a program for displaying the contents of your aMule online signature file to console (in a human readable form). For this to work, you must enable the "Online Signature" option in aMule's preferences. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Writes the online signature picture. You can optionally append \fI=\fP to this option, to specify the location it should be written to. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR HTML page with stats and picture. You can optionally append \fI=\fP to this option, to specify the location it should be written to. .TP \fB[ \-c\fP \fI\fP, \fB\-\-config\-dir\fP=\fI\fP \fB]\fP Leer configuración desde \fI\fP en lugar de home .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Imprime una breve descripción de uso. .P Without any options, it prints online signature data to stdout. \fBcas\fP was written by Pedro de Oliveira .SH ARCHIVOS ~/.aMule/casrc .br stat.png .br tmp.html .SH "INFORMANDO ERRORES" Por favor informa de fallos ya sea en nuestro foro (\fIhttp://forum.amule.org/\fP), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fP). Por favor no informe de fallos por correo, ni en nuestras listas, ni directamente al correo de algun miembro del equipo. .SH COPYRIGHT aMule y todas las demás utilidades relacionadas son distribuidas bajo la GNU General Public License. .SH "VEASE TAMBIEN" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH AUTOR Esta página de manualfue escrita por Vollstrecker aMule-2.3.1/src/utils/cas/docs/cas.de.10000644000175000017470000000420011653631431016327 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CAS 1 "November 2011" "cas v0.8" "aMule Hilfsprogramme" .als B_untranslated B .als RB_untranslated RB .SH NAME cas \- c aMule statistics .SH SYNTAX .B_untranslated cas .RB_untranslated [ \-o ] .RB_untranslated [ \-p ] [\fB\-c\fP \fI\fP] .B_untranslated cas .RB_untranslated [ \-h ] .SH BESCHREIBUNG \fBcas\fP is a program for displaying the contents of your aMule online signature file to console (in a human readable form). For this to work, you must enable the "Online Signature" option in aMule's preferences. .TP .B_untranslated [ \-o\fR, \fB\-\-picture\fR, \fB\-P ]\fR Erstellt das Bild der Online Signatur. Optional kannst du \fI=\fP an diese Option anhängen, um anzugeben wohin es geschrieben werden soll. .TP .B_untranslated [ \-p\fR, \fB\-\-html\fR, \fB\-H ]\fR HTML Seite mit Statistiken und Bild. Optional kannst du \fI=\fP an diese Option anhängen, um anzugeben wohin es geschrieben werden soll. .TP \fB[ \-c\fP \fI\fP, \fB\-\-config\-dir\fP=\fI\fP \fB]\fP Liest die Konfiguration anstelle des Home. .TP .B_untranslated [ \-h\fR, \fB\-\-help ]\fR Gibt eine kurze Nutzungsbeschreibung aus. .P Ohne Optionen schreibt es die Online Signatur auf die Standardausgabe. \fBcas\fP wurde geschrieben von Pedro de Oliveira .SH DATEIEN ~/.aMule/casrc .br stat.png .br tmp.html .SH "FEHLER MELDEN" Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns weder Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder. .SH COPYRIGHT aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License .SH "SIEHE AUCH" .B_untranslated amule\fR(1), \fBwxcas\fR(1) .SH VERFASSER Diese manpage wurde geschrieben von Vollstrecker Diese manpage wurde übersetzt von Vollstrecker aMule-2.3.1/src/utils/cas/lines.h0000644000175000017470000000173611575347521015465 0ustar topiusers/* * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_LINES_H #define CAS_LINES_H void CreateLine(char *lines[], int line, const char *format, ...); void AppendToLine(char *lines[], int line, const char *text); #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/functions.c0000644000175000017470000001745511575347521016363 0ustar topiusers/* * Name: Shared functions * * Purpose: Functions that are used various times in cas * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include /* XXX This needs to be replaced so that we use * autoconf to detect the target OS -- As of now * it should compile fine in other non UNIX-like * platforms, at the expense of only being sure * that UNIX-specific code will be compiled if * using GCC (which defines those __unix__ macros) * autoconf defines should be in place to test for * functions like getpwuid() in UNIX-like systems * instead of doing this... */ #ifdef __APPLE__ #include #define CAS_DIR_SEPARATOR "/" #elif defined(__WIN32__) #define COBJMACROS #include #include #include #define CAS_DIR_SEPARATOR "\\" #else #define CAS_DIR_SEPARATOR "/" #if defined(unix) || defined(__unix__) || defined(__unix) #include #include #include #define CAS_UNIX #endif #endif /* try (hard) to get correct path for aMule signature * !! it's caller's responsibility to free return value */ char *get_path(const char *file) { char *ret; /* caller should free return value */ static char *saved_home = NULL; static size_t home_len = 0; if (saved_home == NULL) { #ifdef __APPLE__ char home[PATH_MAX]; home[0] = '\0'; FSRef fsRef; if (FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fsRef) == noErr) { CFURLRef urlRef = CFURLCreateFromFSRef(NULL, &fsRef); if (urlRef != NULL) { if (CFURLGetFileSystemRepresentation(urlRef, true, home, sizeof(home))) { strcat(home, CAS_DIR_SEPARATOR "aMule"); } CFRelease(urlRef) ; } } #elif defined(__WIN32__) LPITEMIDLIST pidl; char home[MAX_PATH]; home[0] = '\0'; HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); if (SUCCEEDED(hr)) { if (SHGetPathFromIDList(pidl, home)) { strcat(home, CAS_DIR_SEPARATOR "aMule"); } } if (pidl) { LPMALLOC pMalloc; SHGetMalloc(&pMalloc); if (pMalloc) { IMalloc_Free(pMalloc, pidl); IMalloc_Release(pMalloc); } } #else char *home; /* get home directory */ if ( (home = getenv("HOME")) == NULL) { #ifndef CAS_UNIX return NULL; #else /* if $HOME is not available try user database */ uid_t uid; struct passwd *pwd; uid = getuid(); pwd = getpwuid(uid); endpwent(); /* XXX * Section 6.5.14 of ANSI C specs (grab C99 at http://www.nirvani.net/docs/ansi_c.pdf) * states this: * "Unlike the bitwise | operator, the || operator _guarantees_ left-to-right * evaluation; there is a sequence point after the evaluation of the first * operand. If the first operand compares unequal to 0, the second operand * _is not evaluated_." * * I'm going to revert it and wait until Jacobo or whoever changed it * screams loudly, tries to kill me, and explains why this has to be * this way. Maybe pre-ansi compilers? Doubtful. * * - Unleashed */ if (pwd == NULL || pwd->pw_dir == NULL) return NULL; home = pwd->pw_dir; #endif /* CAS_UNIX */ } strcat(home, CAS_DIR_SEPARATOR ".aMule"); #endif /* !__APPLE__ && !__WIN32__ */ /* save the result for future calls */ home_len = strlen(home); if ( (saved_home = strdup(home)) == NULL) return NULL; } /* get full path space */ /* Unleashed - Guys... you broke this and it was OK * "+ 2" means "plus '/' and '\0'" */ ret = malloc((home_len + strlen(file) + 2) * sizeof(char)); if (ret == NULL) return NULL; strcpy(ret, saved_home); ret[home_len] = CAS_DIR_SEPARATOR[0]; ret[home_len+1] = '\0'; strcat(ret, file); /* the string is guaranteed to be null-terminated * so no need to do this... * ret[total_len] = '\0'; */ return ret; } char *get_amule_path(const char *file, int force_directory, const char *cmdline_path) { char *path; if (!cmdline_path) { return get_path(file); } if ((path = malloc(strlen(cmdline_path) + strlen(file) + 2)) == NULL) { return NULL; } strcpy(path, cmdline_path); if (force_directory) { if (path[strlen(path) - 1] != CAS_DIR_SEPARATOR[0]) { strcat(path, CAS_DIR_SEPARATOR); } strcat(path, file); } else { if (path[strlen(path) - 1] == CAS_DIR_SEPARATOR[0]) { strcat(path, file); } } return path; } /* * this function is used to convert bytes to any other unit * nicer to the eye. * * return "Bad format" if could not convert string */ char *convbytes(char *input) { char *units[] = { "Bytes", "KB", "MB", "GB", "TB", "PB" }; char *endptr; static char output[50]; float bytes; unsigned int i = 0; /* do proper conversion and check for errors */ errno = 0; bytes = (float) strtod(input, &endptr); /* check bad string conversion or value out of range */ if (*endptr != '\0' || errno == ERANGE) return "Bad format"; /* this loop converts bytes and sets i to the appropriate * index in 'units' array * note: sizeof(units) / sizeof(char*) is the number of * elements in 'units' array */ for (; i < (sizeof(units) / sizeof(char *)) - 1; i++) { if (bytes < 1024) break; bytes /= 1024; } snprintf(output, 50, "%.2f %s", bytes, units[i]); return output; } void replace(char *tmpl, const char *search, const char *to_replace) { char *dest = NULL; char *retStr = NULL; int befLen,srchLen,repLen,totLen; /* returning the 'tmpl' if 'search' is NULL */ if (NULL == tmpl || NULL == search) /* || NULL == to_replace) */ { return; } while (1) { /* if 'search' is found in 'tmpl' */ retStr = strstr(tmpl, search); if (NULL == retStr) { return; } totLen = strlen(tmpl); befLen = (int)(retStr - tmpl); srchLen = strlen(search); repLen = strlen(to_replace); /* dynamic buffer creation... */ dest = (char*)malloc(totLen + 1 + repLen - srchLen); if (NULL == dest) return; /* copy the before buffer */ strncpy(dest, tmpl, befLen); /* copy the replace string */ memcpy((dest+befLen), to_replace, repLen); /* strcat(dest, to_replace); */ /* copy the after buffer */ memcpy((dest+befLen+repLen), &tmpl[befLen + srchLen], strlen(&tmpl[befLen + srchLen])); /*strcat(dest, &tmpl[befLen + repLen]); */ /* now replace the template string with the resulting and search it again */ strcpy(tmpl, dest); /* we need this, because we're modifying the 'tmpl' instead of creating a new one (so we need to update the position of the null char) */ tmpl[totLen - srchLen + repLen] = '\0'; /* clean up... */ free(dest); } } char *timeconv(char *input) { int count = atoi(input); static char ret[50]; if (count < 0) snprintf (ret,50,"?"); else if (count < 60) snprintf (ret,50,"%02i %s", count, "secs" ); else if (count < 3600) snprintf (ret,50,"%i:%02i %s", count/60, (count % 60), "mins" ); else if (count < 86400) snprintf (ret,50,"%i:%02i %s", count/3600, (count % 3600)/60, "h" ); else snprintf (ret,50,"%i %s %02i %s", count/86400, "D" , (count % 86400) / 3600, "h" ); return (ret); } aMule-2.3.1/src/utils/cas/graphics.h0000644000175000017470000000227511575347521016152 0ustar topiusers/* * Name: Graphics functions * * Purpose: All the functions that are used to create the Online Signature Image * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_GRAPHICS_H #define CAS_GRAPHICS_H int createimage(CONF *config, char *lines[IMG_TEXTLINES], char *path_for_picture); #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/html.h0000644000175000017470000000225511575347521015314 0ustar topiusers/* * Name: HTML creation functions * * Purpose: Create a nice HTML page with all the statistics * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_HTML_H #define CAS_HTML_H int create_html(char *stats[20], char *lines[6], char template[120], char *path_for_html); #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/Makefile.in0000644000175000017470000011422011657306263016237 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = cas$(EXEEXT) @NEED_CORESERVICES_TRUE@am__append_1 = -framework CoreServices subdir = src/utils/cas DIST_COMMON = README $(dist_cas_DATA) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(casdir)" PROGRAMS = $(bin_PROGRAMS) am_cas_OBJECTS = cas-cas.$(OBJEXT) cas-configfile.$(OBJEXT) \ cas-functions.$(OBJEXT) cas-graphics.$(OBJEXT) \ cas-html.$(OBJEXT) cas-lines.$(OBJEXT) @NEED_RC_TRUE@nodist_cas_OBJECTS = cas-version.$(OBJEXT) cas_OBJECTS = $(am_cas_OBJECTS) $(nodist_cas_OBJECTS) am__DEPENDENCIES_1 = cas_DEPENDENCIES = $(am__DEPENDENCIES_1) cas_LINK = $(CCLD) $(cas_CFLAGS) $(CFLAGS) $(cas_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(cas_SOURCES) $(nodist_cas_SOURCES) DIST_SOURCES = $(cas_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' DATA = $(dist_cas_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README SUBDIRS = docs dist_cas_DATA = tmp.html stat.png casdir = $(datadir)/cas cas_SOURCES = cas.c \ configfile.c \ functions.c \ graphics.c \ html.c \ lines.c noinst_HEADERS = configfile.h \ functions.h \ graphics.h \ html.h \ lines.h \ version.h cas_CPPFLAGS = $(MULECPPFLAGS) $(CAS_DEFS) cas_CFLAGS = $(MULECFLAGS) $(GDLIB_CFLAGS) cas_LDFLAGS = $(MULELDFLAGS) $(GDLIB_LDFLAGS) $(am__append_1) cas_LDADD = $(GDLIB_LIBS) # Resources @NEED_RC_TRUE@SUFFIXES = .rc @NEED_RC_TRUE@nodist_cas_SOURCES = cas-version.rc @NEED_RC_TRUE@CLEANFILES = *-version.rc MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: .SUFFIXES: .rc .$(OBJEXT) .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/cas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/cas/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ 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)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) cas$(EXEEXT): $(cas_OBJECTS) $(cas_DEPENDENCIES) @rm -f cas$(EXEEXT) $(AM_V_CCLD)$(cas_LINK) $(cas_OBJECTS) $(cas_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-cas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-configfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-functions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-graphics.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-html.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cas-lines.Po@am__quote@ .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 @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(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 @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` cas-cas.o: cas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-cas.o -MD -MP -MF $(DEPDIR)/cas-cas.Tpo -c -o cas-cas.o `test -f 'cas.c' || echo '$(srcdir)/'`cas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-cas.Tpo $(DEPDIR)/cas-cas.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cas.c' object='cas-cas.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-cas.o `test -f 'cas.c' || echo '$(srcdir)/'`cas.c cas-cas.obj: cas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-cas.obj -MD -MP -MF $(DEPDIR)/cas-cas.Tpo -c -o cas-cas.obj `if test -f 'cas.c'; then $(CYGPATH_W) 'cas.c'; else $(CYGPATH_W) '$(srcdir)/cas.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-cas.Tpo $(DEPDIR)/cas-cas.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cas.c' object='cas-cas.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-cas.obj `if test -f 'cas.c'; then $(CYGPATH_W) 'cas.c'; else $(CYGPATH_W) '$(srcdir)/cas.c'; fi` cas-configfile.o: configfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-configfile.o -MD -MP -MF $(DEPDIR)/cas-configfile.Tpo -c -o cas-configfile.o `test -f 'configfile.c' || echo '$(srcdir)/'`configfile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-configfile.Tpo $(DEPDIR)/cas-configfile.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='configfile.c' object='cas-configfile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-configfile.o `test -f 'configfile.c' || echo '$(srcdir)/'`configfile.c cas-configfile.obj: configfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-configfile.obj -MD -MP -MF $(DEPDIR)/cas-configfile.Tpo -c -o cas-configfile.obj `if test -f 'configfile.c'; then $(CYGPATH_W) 'configfile.c'; else $(CYGPATH_W) '$(srcdir)/configfile.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-configfile.Tpo $(DEPDIR)/cas-configfile.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='configfile.c' object='cas-configfile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-configfile.obj `if test -f 'configfile.c'; then $(CYGPATH_W) 'configfile.c'; else $(CYGPATH_W) '$(srcdir)/configfile.c'; fi` cas-functions.o: functions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-functions.o -MD -MP -MF $(DEPDIR)/cas-functions.Tpo -c -o cas-functions.o `test -f 'functions.c' || echo '$(srcdir)/'`functions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-functions.Tpo $(DEPDIR)/cas-functions.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='functions.c' object='cas-functions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-functions.o `test -f 'functions.c' || echo '$(srcdir)/'`functions.c cas-functions.obj: functions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-functions.obj -MD -MP -MF $(DEPDIR)/cas-functions.Tpo -c -o cas-functions.obj `if test -f 'functions.c'; then $(CYGPATH_W) 'functions.c'; else $(CYGPATH_W) '$(srcdir)/functions.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-functions.Tpo $(DEPDIR)/cas-functions.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='functions.c' object='cas-functions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-functions.obj `if test -f 'functions.c'; then $(CYGPATH_W) 'functions.c'; else $(CYGPATH_W) '$(srcdir)/functions.c'; fi` cas-graphics.o: graphics.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-graphics.o -MD -MP -MF $(DEPDIR)/cas-graphics.Tpo -c -o cas-graphics.o `test -f 'graphics.c' || echo '$(srcdir)/'`graphics.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-graphics.Tpo $(DEPDIR)/cas-graphics.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='graphics.c' object='cas-graphics.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-graphics.o `test -f 'graphics.c' || echo '$(srcdir)/'`graphics.c cas-graphics.obj: graphics.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-graphics.obj -MD -MP -MF $(DEPDIR)/cas-graphics.Tpo -c -o cas-graphics.obj `if test -f 'graphics.c'; then $(CYGPATH_W) 'graphics.c'; else $(CYGPATH_W) '$(srcdir)/graphics.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-graphics.Tpo $(DEPDIR)/cas-graphics.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='graphics.c' object='cas-graphics.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-graphics.obj `if test -f 'graphics.c'; then $(CYGPATH_W) 'graphics.c'; else $(CYGPATH_W) '$(srcdir)/graphics.c'; fi` cas-html.o: html.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-html.o -MD -MP -MF $(DEPDIR)/cas-html.Tpo -c -o cas-html.o `test -f 'html.c' || echo '$(srcdir)/'`html.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-html.Tpo $(DEPDIR)/cas-html.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='html.c' object='cas-html.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-html.o `test -f 'html.c' || echo '$(srcdir)/'`html.c cas-html.obj: html.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-html.obj -MD -MP -MF $(DEPDIR)/cas-html.Tpo -c -o cas-html.obj `if test -f 'html.c'; then $(CYGPATH_W) 'html.c'; else $(CYGPATH_W) '$(srcdir)/html.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-html.Tpo $(DEPDIR)/cas-html.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='html.c' object='cas-html.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-html.obj `if test -f 'html.c'; then $(CYGPATH_W) 'html.c'; else $(CYGPATH_W) '$(srcdir)/html.c'; fi` cas-lines.o: lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-lines.o -MD -MP -MF $(DEPDIR)/cas-lines.Tpo -c -o cas-lines.o `test -f 'lines.c' || echo '$(srcdir)/'`lines.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-lines.Tpo $(DEPDIR)/cas-lines.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lines.c' object='cas-lines.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-lines.o `test -f 'lines.c' || echo '$(srcdir)/'`lines.c cas-lines.obj: lines.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -MT cas-lines.obj -MD -MP -MF $(DEPDIR)/cas-lines.Tpo -c -o cas-lines.obj `if test -f 'lines.c'; then $(CYGPATH_W) 'lines.c'; else $(CYGPATH_W) '$(srcdir)/lines.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cas-lines.Tpo $(DEPDIR)/cas-lines.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lines.c' object='cas-lines.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cas_CPPFLAGS) $(CPPFLAGS) $(cas_CFLAGS) $(CFLAGS) -c -o cas-lines.obj `if test -f 'lines.c'; then $(CYGPATH_W) 'lines.c'; else $(CYGPATH_W) '$(srcdir)/lines.c'; fi` install-dist_casDATA: $(dist_cas_DATA) @$(NORMAL_INSTALL) test -z "$(casdir)" || $(MKDIR_P) "$(DESTDIR)$(casdir)" @list='$(dist_cas_DATA)'; test -n "$(casdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(casdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(casdir)" || exit $$?; \ done uninstall-dist_casDATA: @$(NORMAL_UNINSTALL) @list='$(dist_cas_DATA)'; test -n "$(casdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(casdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(casdir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(casdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_casDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_casDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags ctags-recursive 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-dist_casDATA 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-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-dist_casDATA @NEED_RC_TRUE@.rc.$(OBJEXT): @NEED_RC_TRUE@ $(RC) $(MULERCFLAGS) -I$(top_srcdir) $(RCFLAGS) -O COFF -i "$<" -o "$@" @NEED_RC_TRUE@cas-version.rc: $(top_builddir)/version.rc @NEED_RC_TRUE@ @sed -e 's/VER_FILEDESCRIPTION_STR/"C aMule Statistics"/' \ @NEED_RC_TRUE@ -e 's/VER_INTERNALNAME_STR/"cas"/' \ @NEED_RC_TRUE@ -e 's/VER_ORIGINALFILENAME_STR/"cas$(EXEEXT)"/' "$<" > "$@" # 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: aMule-2.3.1/src/utils/cas/configfile.h0000644000175000017470000000257711575347521016464 0ustar topiusers/* * Name: Config file functions * * Purpose: Read info from casrc ou create one if it doesnt exist * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_CONFIGFILE_H #define CAS_CONFIGFILE_H #define IMG_TEXTLINES 7 typedef struct { char font[120]; char source[120]; char template[120]; int x[IMG_TEXTLINES]; int y[IMG_TEXTLINES]; int enabled[IMG_TEXTLINES]; float size; int img_type; // 0 = PNG, else = JPG } CONF; int writeconfig(void); int readconfig(CONF *config); #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/cas.c0000644000175000017470000002467011575347521015116 0ustar topiusers/* * Name: Main cas file * * Purpose: aMule Statistics * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include #include "version.h" #include "configfile.h" #include "functions.h" #include "graphics.h" #include "html.h" #include "lines.h" #ifdef HAVE_CONFIG_H #include "config.h" // For HAVE_GETOPT_LONG #endif #ifndef HAVE_GETOPT_LONG /* Code from getopt_long.h - getopt_long() for systems that lack it Copyright (c) 2001-2011 Arthur de Jong, GPL 2 and later */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 struct option { const char *name; int has_arg; int *flag; int val; }; int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); #endif /* * History: * * ????.??.?? - falso: creation of cas. * ????.??.?? - Jacobo221: Detect connecting state * ????.??.?? - falso: HTML page generation * 2004.08.27 - GonoszTopi: New line handling routines, to cope with lines * longer than 80 characters. Fixes buffer overflow. * 2005.12.10 - fulgas: added kad info support * 2005,12,16 - stefanero: fixed Kad related stuff and some other things */ static struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "html", optional_argument, NULL, 'p' }, { "picture", optional_argument, NULL, 'o' }, { "config-dir", required_argument, NULL, 'c' }, { NULL, 0, NULL, 0 } }; void usage(char *myname) { printf (" ___ _ _ ___ c aMule statistics\n" " /'___) /'_` )/',__) by Pedro de Oliveira\n" "( (___ ( (_| |\\__, \\ \n" "`\\____)`\\__,_)(____/ Version %s\n\n" "Usage: %s [OPTION]\n" "If run without any option prints stats to stdout\n\n" "OPTIONS:\n" #ifdef __GD__ "-o, --picture, -P\tWrites the online signature picture\n" #endif "-p, --html, -H\t\tHTML Page with stats and picture\n" "-c, --config-dir\tSpecifies a config-dir different from home\n" "-h, --help\t\tThis help you're reading\n", CAS_VERSION, myname); } #ifndef HAVE_GETOPT_LONG /* Code from getopt_long.c - getopt_long() for systems that lack it Copyright (c) 2001-2011 Arthur de Jong, GPL 2 and later Slightly edited for the sake of clarity by Gaznevada */ int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex) { int i; int length; if ( (optind > 0) && (optind < argc) && (strncmp(argv[optind],"--",2) == 0) && (argv[optind][2] != '\0') ) { for (i = 0; longopts[i].name != NULL; i++) { length = strlen(longopts[i].name); if (strncmp(argv[optind]+2,longopts[i].name,length) == 0) { if ( (longopts[i].has_arg == no_argument) && (argv[optind][2+length] == '\0') ) { optind++; return longopts[i].val; } else if ( (longopts[i].has_arg == required_argument) && (argv[optind][2+length] == '=') ) { optarg=argv[optind]+3+length; optind++; return longopts[i].val; } else if ( (longopts[i].has_arg == required_argument) && (argv[optind][2+length] == '\0') ) { optarg=argv[optind+1]; optind+=2; return longopts[i].val; } else if ( (longopts[i].has_arg == optional_argument) && (argv[optind][2+length] == '=') ) { optarg=argv[optind]+3+length; optind++; return longopts[i].val; } else if ( (longopts[i].has_arg==optional_argument) && (argv[optind][2+length] == '\0') ) { optind++; return longopts[i].val; } } } } return getopt(argc,argv,optstring); } #endif // HAVE_GETOPT_LONG int main(int argc, char *argv[]) { /* Declaration of variables */ FILE *amulesig; int use_out_pic = 0; int use_page = 0; char *config_path=NULL; char *path; char *stats[20]; char *lines[IMG_TEXTLINES]; long lSize; char * buffer; int i; int c; int errflag = 0; char *path_for_picture=NULL; char *path_for_html=NULL; CONF config; time_t lt; struct tm *ltp; char arr[20]; while ((c = getopt_long (argc, argv, "c:P:H:hpo", long_options, NULL)) != -1) switch (c) { case 'c': config_path=optarg; break; case 'h': usage(argv[0]); exit(0); case 'H': case 'p': use_page=1; if (optarg != NULL) { path_for_html = optarg; } break; case 'P': case 'o': use_out_pic=1; if (optarg != NULL) { path_for_picture = optarg; } break; case '?': errflag++; } if (errflag) { usage(argv[0]); exit (2); } /* get amulesig path */ path = get_amule_path("amulesig.dat", 1, config_path); if (path == NULL) { perror("Unable to get aMule settings path\n"); exit(1); } /* open the file and if not exists exit with an error */ if ((amulesig = fopen(path, "r")) == NULL) { fprintf(stderr, "Unable to open file %s\nCheck if you have amule online signature enabled.\n", path); exit(2); } /* i believe this shouldnt be here. The freq of update could be higher than 60 seconds. And it doesn't mean that the amule is not running. */ /* else { struct stat s_file; if ( stat(path, &s_file) == 0 ) { time_t t_now = time(0); if ( (t_now - s_file.st_mtime) > 60 ) { perror("aMule online signature last updated more then 60 sec ago\n"); perror("Check that your aMule is running\n"); } } }*/ free(path); /* initialize all the strings with nothing */ for (i = 0; i <= 19; i++) stats[i] = 0; /* start reading the stuff from amulesign to the stats array */ // obtain file size. fseek (amulesig , 0 , SEEK_END); lSize = ftell (amulesig); if (0 == lSize) { perror("aMule signature file is 0 Byte, exiting.\n"); exit(2); } rewind (amulesig); buffer = (char*) malloc (lSize); if (buffer == NULL) { perror("Could not create buffer\n"); exit (2); } if (fread(buffer,1,lSize,amulesig)){} // // prevent GCC warning fclose(amulesig); stats[0] = strtok (buffer,"\n"); for (i=1;i<17;i++) { stats[i] = strtok (NULL,"\n"); if (NULL == stats[i]) { perror("Too few fields in aMule signature file, exiting.\n"); exit(2); } } // local time stored as stats[17] lt = time(NULL); ltp = localtime(<); strftime(arr, 20, "%b %d %Y, %H:%M", ltp); // if amule isn't running say that and exit else print out the stuff // if amule uptime is 0, then its not running... if (strncmp(stats[16],"0",1) == 0 ) { perror("aMule is not running\n"); exit(3); } if (strncmp(stats[0],"2",1) == 0) CreateLine(lines, 0 ,"aMule %s is connecting\n", stats[13]); else CreateLine(lines, 0, "aMule %s has been running for %s\n", stats[13], timeconv(stats[16])); if (strncmp(stats[0],"0",1) == 0 && strncmp(stats[5],"0",1) == 0) CreateLine(lines, 1, "%s is not connected ", stats[10]); else if (strncmp(stats[0],"0",1) == 0 && strncmp(stats[5],"0",1) != 0) CreateLine(lines, 1, "%s is connected to ", stats[10]); else CreateLine(lines, 1, "%s is connected to %s [%s:%s] with ", stats[10], stats[1], stats[2], stats[3]); if (strncmp(stats[5],"2",1) == 0) { if (strncmp(stats[4],"H",1) == 0) AppendToLine(lines, 1, "HighID | Kad: ok \n"); else if (strncmp(stats[4],"L",1) == 0) AppendToLine(lines, 1, "LowID | Kad: ok \n"); else AppendToLine(lines, 1, "Kad: ok \n"); } else if (strncmp(stats[5],"1",1) == 0) { if (strncmp(stats[4],"H",1) == 0) AppendToLine(lines, 1, "HighID | Kad: firewalled \n"); else if (strncmp(stats[4],"L",1) == 0) AppendToLine(lines, 1, "LowID | Kad: firewalled \n"); else AppendToLine(lines, 1, "Kad: firewalled \n"); } else { if (strncmp(stats[4],"H",1) == 0) AppendToLine(lines, 1, "HighID | Kad: off \n"); else if (strncmp(stats[4],"L",1) == 0) AppendToLine(lines, 1, "LowID | Kad: off \n"); else AppendToLine(lines, 1, "but running\n"); } stats[11] = strdup(convbytes(stats[11])); stats[12] = strdup(convbytes(stats[12])); CreateLine(lines, 2, "Total Download: %s, Upload: %s\n",stats[11] , stats[12]); stats[15] = strdup(convbytes(stats[15])); stats[14] = strdup(convbytes(stats[14])); CreateLine(lines, 3, "Session Download: %s, Upload: %s\n",stats[14], stats[15]); CreateLine(lines, 4, "Download: %s kB/s, Upload: %s kB/s\n", stats[6], stats[7]); CreateLine(lines, 5, "Sharing: %s file(s), Clients on queue: %s\n", stats[9] , stats[8]); CreateLine(lines, 6, "Time: %s\n", arr); #ifdef __GD__ if (use_out_pic == 1) { if (!readconfig(&config)) { perror("Could not read config file\n"); exit(4); } if (!createimage(&config, lines, path_for_picture)) { perror("Could not create image!\n"); exit(5); } exit(0); } #endif if (use_page == 1) { if (!readconfig(&config)) { perror("Could not read config file\n"); exit(4); } if (!create_html(stats,lines,config.template, path_for_html)) { perror("Could not create the HTML Page.\n"); } #ifdef __GD__ if (!createimage(&config, lines, path_for_picture)) { perror("Could not create image!\n"); exit(5); } #endif exit(0); } for (i = 0; i <= 6; i++) { printf("%s", lines[i]); free(lines[i]); } free(buffer); exit(0); } aMule-2.3.1/src/utils/cas/version.h0000644000175000017470000000207011575347521016030 0ustar topiusers/* * Name: cas version * * Purpose: Just used to define cas version * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_VERSION #define CAS_VERSION "0.8" #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/README0000644000175000017470000000107211575347521015053 0ustar topiusersC AMULE STATS This is a little app that i've been doing cause i really didnt liked aStats. I was too slow, so i tried to do a little remake of it in c just to learn a bit more of c and do a nice app too. feel free to contact me at falso@rdk.homeip.net --- Nice things to do if you have the time and want to contribute: * Put an end to lines[] madness * Get the mule to formally define onlinesig format and use that to access the fields, not meaningless offsets (needs a patch against/rewrite of amule[d].cpp:OnlineSig() at this time) * Clean up confusing codeaMule-2.3.1/src/utils/cas/html.c0000644000175000017470000000635311575347521015312 0ustar topiusers/* * Name: HTML creation functions * * Purpose: Create a nice HTML page with all the statistics * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include #include #include #include "html.h" #include "functions.h" #include "version.h" int create_html(char *stats[20], char *lines[6], char template[120], char *path_for_html) { /* Strings */ char *path = NULL; char version[25], upload[25], download[25]; char *search[] = {"#VERSION#", "#CLIENT#", "#NICK#", "#UPLOADRATE#" , "#DOWNLOADRATE#" , "#QUEUE#" , "#NUMSHARE#" , "#SESSIONUP#" , "#SESSIONDOWN#" , "#TOTALUP#", "#TOTALDOWN#" , "#SERVER#" , "#IP#", "#PORT#" }; snprintf(version, 25, "cas %s", CAS_VERSION); snprintf(upload, 25, "%s kB/s", stats[7]); snprintf(download, 25, "%s kB/s", stats[6]); char *repl[] = { version , lines[0] , stats[10] , upload , download , stats[8] , stats[9] , stats[15] , stats[14] , stats[12] , stats[11] , stats[1] , stats[2] , stats[3] }; /* get some memory to read the template into */ int fdTmpl; if ((fdTmpl = open(template, O_RDONLY)) < 0) { printf("\n\n%s\n",template); perror("Could not open file"); exit (43); } struct stat sb; if (fstat(fdTmpl, &sb) < 0) { perror("Could not stat file"); exit(43); } close(fdTmpl); /* 2 times the size of the template should be enough */ /* st_size is defined as off_t, but size_t seems more reasonable */ size_t size = sb.st_size*2; char *mem = calloc(size, 1); if (NULL == mem) { perror("Could not calloc\n"); exit(44); } /* read the template into the memory */ size_t len = 0; int ler; FILE *fTmpl = fopen(template,"r"); while ((ler=fgetc(fTmpl)) != EOF && len+1 < size) { mem[len++] = ler; } fclose(fTmpl); /* printf ("HTML: %s\n", mem); */ int t; for (t=0; t<=13; t++) { /* replace the special tags */ replace(mem, search[t], repl[t]); } /* printf("FINAL: %s\n",mem); */ path = get_amule_path("aMule-online-sign.html", 0, path_for_html); if (NULL == path) { perror("could not get the HTML path\n"); free(mem); return 0; } FILE *fHTML = NULL; if ((fHTML = fopen(path, "w")) == NULL) { perror("Unable to create file\n"); free(path); free(mem); exit(44); } free(path); fprintf(fHTML, "%s", mem); fclose(fHTML); free(mem); printf("HTML file created.\n"); return 1; } aMule-2.3.1/src/utils/cas/tmp.html0000644000175000017470000002172611575347521015671 0ustar topiusers Info Page (generated by #VERSION#)

aMule Statistics Info Page generated by #VERSION#
General
Client
#CLIENT#
Nick
#NICK#
Upload Rate
#UPLOADRATE#
Download Rate
#DOWNLOADRATE#
Queue
#QUEUE#
Shared Files #NUMSHARE#
Session Upload #SESSIONUP#
Session Download #SESSIONDOWN#
Total Upload #TOTALUP#
Total Download #TOTALDOWN#

Server
Server Name
#SERVER#
Server Addres
#IP#:#PORT#
ED2K Link
ed2k://|server|#IP#|#PORT#|/

Signature (Background Graphic by uberpenguin)
IMAGE
(the design was taken from Blacklotus Online Sig)
aMule-2.3.1/src/utils/cas/functions.h0000644000175000017470000000251311575347521016355 0ustar topiusers/* * Name: Shared functions * * Purpose: Functions that are used various times in cas * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef CAS_FUNCTIONS_H #define CAS_FUNCTIONS_H char *get_path(const char *file); char *get_amule_path(const char *file, int force_directory, const char *cmdline_path); char *convbytes(char *input); char *timeconv(char *input); void replace(char *tmpl, const char *search, const char *replace); #endif /* // File_checked_for_headers */ aMule-2.3.1/src/utils/cas/lines.c0000644000175000017470000000374011575347521015455 0ustar topiusers/* * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include #include "lines.h" void CreateLine(char *lines[], int line, const char *format, ...) { /* Guess we need no more than 80 bytes. */ int n, size = 100; char *p; va_list ap; if ((p = malloc(size)) == NULL) { lines[line] = NULL; return; } while (1) { /* Try to print in the allocated space. */ va_start(ap, format); n = vsnprintf(p, size, format, ap); va_end(ap); /* If that worked, set the line. */ if (n > -1 && n < size) { lines[line] = p; return; } /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */ size = n+1; /* precisely what is needed */ else /* glibc 2.0 */ size *= 2; /* twice the old size */ if ((p = realloc(p, size)) == NULL) { lines[line] = NULL; return; } } } void AppendToLine(char *lines[], int line, const char *text) { /* Are we trying to append to an empty line? */ if (lines[line] == NULL) CreateLine(lines, line, text); else { /* Calculate the new required size... */ int size = strlen(lines[line]) + strlen(text) + 1; if ((lines[line] = realloc(lines[line], size)) == NULL) return; /* ... and append the new text. */ strcat(lines[line], text); } } aMule-2.3.1/src/utils/cas/configfile.c0000644000175000017470000000730711575347521016453 0ustar topiusers/* * Name: Config file functions * * Purpose: Read info from casrc ou create one if it doesnt exist * * Author: Pedro de Oliveira * * Copyright (c) 2004-2011 Pedro de Oliveira ( falso@rdk.homeip-net ) * * This file is part of aMule. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #include #include "configfile.h" #include "functions.h" int writeconfig(void) { FILE *config; char *path; unsigned int i; char *def[] = { "# cas config file\n", "#\n", "# font - full path to a ttf font\n", "# font_size - size the font\n", "# source_image - image where the text will be writen\n", "# *_line - x,y,[1/0] enabled or disabled\n\n", "font /usr/share/fonts/corefonts/times.ttf\n", "font_size 10.5\n", "source_image /usr/share/cas/stat.png\n", "first_line 23,17,1\n", "second_line 23,34,1\n", "third_line 23,51,1\n", "fourth_line 23,68,1\n", "fifth_line 23,85,1\n", "sixth_line 23,102,1\n", "seventh_line 23,119,1\n", "template /usr/share/cas/tmp.html\n" "img_type 0\n" }; path = get_path("casrc"); if (path == NULL) return 0; if ( (config = fopen(path, "w")) == NULL) return 0; for (i = 0; i < sizeof(def) / sizeof(char *); i++) fprintf(config, "%s", def[i]); fclose(config); printf("%s created, please edit it and then rerun cas\n", path); free(path); return 1; } /* Jacobo221 - [ToDo] There should be a check for corrupt config files! */ int readconfig(CONF *config) { char buffer[120], option[15], *path; FILE *conf; int i = 0; char lines[IMG_TEXTLINES][13] = { "first_line", "second_line", "third_line", "fourth_line", "fifth_line", "sixth_line", "seventh_line" }; path = get_path("casrc"); if (path == NULL) { return 0; } if ((conf = fopen(path, "r")) == NULL) { printf("Unable to open %s. Creating it.\n", path); free(path); if (!writeconfig()) { perror("readconfig: unable to create initial config file\n"); } return 0; } free(path); buffer[0] = 0; while (!feof(conf)) { // Jacobo221 - [ToDo] Only first char per line is comment... if (fgets (buffer,120,conf)) { if (buffer[0] != '#') { /* Only two fileds per line */ sscanf(buffer, "%s %*s", option); fflush (stdout); // Jacobo221 - [ToDo] So lines can't be swapped... if (strcmp(option, "font") == 0) { sscanf(buffer, "%*s %s", config->font); } if (strcmp(option, "font_size") == 0) { sscanf(buffer, "%*s %f", &config->size); } if (strcmp(option, "source_image") == 0) { sscanf(buffer, "%*s %s", config->source); } if (strcmp(option, "template") == 0) { sscanf(buffer, "%*s %s", config->template); } if (strcmp(option, "img_type") == 0) { sscanf(buffer, "%*s %d", &config->img_type); } for (i = 0; i < IMG_TEXTLINES; i++) { if (strcmp(option, lines[i]) == 0) { sscanf(buffer, "%*s %d,%d,%d", &config->x[i], &config->y[i], &config->enabled[i]); } } } } } fclose(conf); return 1; } aMule-2.3.1/src/utils/amps/0000755000175000017470000000000011657306230014356 5ustar topiusersaMule-2.3.1/src/utils/amps/CHANGELOG0000644000175000017470000000420710351702345015570 0ustar topiusersAMPS Changelog version 0.7.6 - fulgas: added Kad info to amps version 0.7.5 ------------- - Fixed parsing of ps output to take into account other processes with 'amule' in the process name. (thanks GonoszTopi) version 0.7.4 ------------- - Translation updates version 0.7.3 ------------- - Fixed minor bug in the language parsing version 0.7.2 ------------- - Added new 'connecting' connection status. - Catalan and Spanish translations updated by Jacobo221 - Dutch translation updated by Supersnail - French translation updated by thepolish and efe - Hungarian translation updated by biger - Basque translation updated by piarres - Portuguese Brazilian translation added by IgoR version 0.7.1 ------------- - Added setting to allow easy changing of the text color used in the signature image. (you're welcome deltaHF) - Fixed BSD support (thanks to Stevil for the help) version 0.7 ----------- - Removed the requirement of register_globals being set in your php.ini (yay!) version 0.6 ----------- - Added support for writing the signature image in PNG, JPEG, and GIF format (assuming the GD installation supports these). Default is now PNG. - Modified error images to use the same font as the signature image. - Made language selection non case-sensative. version 0.5 ----------- - Minor updates to allow AMPS to work with the signature file format used in the current amule CVS (I developed AMPS with an older stable version). - Basque translation added by piarres version 0.4 ----------- - Improved multilingual support - Polish translation added by Ogon - Dutch translation added by Supersnail - Hungarian translation added by biger - Catalan translation added by pukyxd - Portuguese translation added by rommel - Italian translation added by GhePeU and ilbuio - French translation added by thepolish version 0.3 ----------- - Added drop-down list box that allows language selection version 0.2 ----------- - First public release - Multilanguage support - German translation added by Citroklar - Spanish translation added by Jacobo221 - Finnish translation added by Nikerabbit version 0.1 ----------- - Initial unreleased testing version aMule-2.3.1/src/utils/amps/langs/0000755000175000017470000000000011657306230015462 5ustar topiusersaMule-2.3.1/src/utils/amps/langs/hu.inc0000644000175000017470000000504610351702345016573 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/fi.inc0000644000175000017470000000457710351702345016565 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/it.inc0000644000175000017470000000450110351702345016566 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/es.inc0000644000175000017470000000467310351702345016573 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/en.inc0000644000175000017470000000555010351702345016561 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/eu.inc0000644000175000017470000000470110351702345016565 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/de.inc0000644000175000017470000000464310351702345016551 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/ca.inc0000644000175000017470000000475510351702345016550 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/pt_BR.inc0000644000175000017470000000546010351702345017165 0ustar topiusers * thanks fly out to: CapEnt ;) ** * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // if you are translating this file, please replace all special characters with // html unicode entities (&#nnn;). It's not always necessary, but ensures that // there are minimal problems displaying the text in all browsers. $text["dayabbr"] = "d"; $text["hourabbr"] = "h"; $text["minabbr"] = "m"; $text["secabbr"] = "s"; $text["runtimemsg"] = "em execução por"; // execuo $text["norunmsg"] = "não está ativo"; // est $text["connmsg"] = "conectando"; $text["highidmsg"] = "está online (HiGH iD)"; // est $text["lowidmsg"] = "está online (LOW iD)"; // est $text["offrunmsg"] = "está offline"; // est $text["amulerun"] = "(aMule rodando)"; $text["amulenorun"] = "(aMule parado)"; $text["sharedfiles"] = "Shared files"; // try to keep these next three short, otherwise the signature // image will look messy $text["na"] = "N/A"; $text["rx"] = "RX"; $text["tx"] = "TX"; $text["queuedclients"] = "Clientes na espera"; $text["transrate"] = "kB/s"; $text["gigabytes"] = "GB"; $text["client"] = "Cliente"; $text["status"] = "Status"; $text["nick"] = "Nick"; $text["localtime"] = "Hora local"; $text["rxspeed"] = "RX speed"; $text["txspeed"] = "TX speed"; $text["rxtotal"] = "RX total"; $text["txtotal"] = "TX total"; $text["osversion"] = "Verso de OS"; $text["hostuptime"] = "uptime host"; $text["servername"] = "Nome do servidor"; $text["serveraddr"] = "servidor.endereço:porta"; // endereo $text["ed2klink"] = "Link ED2K"; $text["general"] = "General"; $text["server"] = "Servidor"; $text["signature"] = "Assinatura"; $text["connecting"] = "Conectando"; $text["online"] = "Online"; $text["offline"] = "Offline"; $text["language"] = "Lingua"; $text["submit"] = "Enviar"; $text["sigfileerr"] = "Erro ao abrir o arquivo de assinatura"; $text["baseimgerr"] = "Não foi encontrado a imagem da base"; // No $text["iconerr"] = "Não foi encontrado icones"; // No ?> aMule-2.3.1/src/utils/amps/langs/fr.inc0000644000175000017470000000504610351702345016566 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/pl.inc0000644000175000017470000000460110351702345016566 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/pt.inc0000644000175000017470000000534710351702345016606 0ustar topiusers aMule-2.3.1/src/utils/amps/langs/nl.inc0000644000175000017470000000444310351702345016570 0ustar topiusers aMule-2.3.1/src/utils/amps/TODO0000644000175000017470000000073410351702345015047 0ustar topiusersAMPS Todo - FEATURE [DONE]: Change image output to PNG or add an option to select type (version 0.6) - FIXME [DONE]: Fix the incorrect display of special characters in the signature image. (version 0.4) - FEATURE/FIXME: Improve multilingual support by allowing formatable strings via printf() - FEATURE: Improve 'theme' support beyond the simple CSS file. - FIXME [DONE]: Change passing of sig_image variable so using register_globals is not necessary. (version 0.7) aMule-2.3.1/src/utils/amps/COPYING0000644000175000017470000006131410351702345015413 0ustar topiusers GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! aMule-2.3.1/src/utils/amps/index.php0000644000175000017470000005754111575347521016221 0ustar topiusersfalse, "psuptime"=>"", "connected"=>"0", "servername"=>"", "serverip"=>"0.0.0.0", "highlowid"=>"", "rxspeed"=> "0.0", "txspeed"=>"0.0", "queuedclients"=>"0", "sharedfiles"=>"0", "nick"=>"", "rxtotal"=>"0.0", "txtotal"=>"0.0", "muleversion"=>"0.0.0" ); // make sure gd and freetype are loaded; we need them for the signature image if (!extension_loaded("gd")) { echo "gd extension missing"; exit(); } if (!in_array("imagettftext", get_extension_funcs("gd"))) { echo "FreeType extensions missing from gd"; exit(); } // lang can come from two places; as an argument to the script (i.e. // index.php?lang=xx or as an HTTP POST variable. The latter takes prescedence // over the former. if (isset($_GET["lang"])) $lang = $_GET["lang"]; if (isset($_POST["lang"])) $lang = $_POST["lang"]; if (isset($lang)) { $temp = @fopen("./langs/".$lang.".inc", "r"); if (!$temp) { $lang = strtolower($lang); $temp = @fopen("./langs/".$lang.".inc", "r"); } if (!$temp) { require("./langs/en.inc"); } else { require("./langs/".$lang.".inc"); fclose($temp); } } else { $lang = "en"; require("./langs/en.inc"); } // if the variable $sig_image is set, only output the signature image if (isset($_GET["sig_image"])) { $ret = get_stats(); if (!$ret) output_error_img($text["sigfileerr"]." (".AMULESIGDAT. ")"); else output_sig_image(); exit(); } /** * Retrieves the statistics, of course! First checks to see if the process is * actually running. If not, the function returns true without attempting to * read the aMule signature file. If the process IS running, the function reads * the appropriate data from the aMule signiture file, stores them in the * associative array $values and returns true on success, and false if there * is a failure reading the signature file. */ function get_stats() { global $values, $text; // the ps command should output something like 1-05:23:45, in // days-hours:minutes:seconds format. // alternative ps command; doesn't work on *BSD! // $values["psuptime"] = trim(exec("ps --no-header -C amule -o etime")); $values["psuptime"] = trim(exec("ps ax -o etime,comm --no-header | ". "awk '/amule$/ {print $1}' | head -n 1")); if (!$values["psuptime"]) { $values["running"] = false; return true; } else { $values["running"] = true; // Uncomment to test etime parser... // $values["psuptime"] = "3442-12:34:55"; if (strlen($values["psuptime"]) >= 5) $uptimestr = substr($values["psuptime"], -5, 2). $text["minabbr"]." ".substr($values["psuptime"], -2).$text["secabbr"]; if (strlen($values["psuptime"]) >= 8) $uptimestr = substr($values["psuptime"], -8, 2). $text["hourabbr"]." ".$uptimestr; if (strlen($values["psuptime"]) >= 10) $uptimestr = substr($values["psuptime"], 0, strlen( $values["psuptime"]) - 9).$text["dayabbr"]." ". $uptimestr; $values["psuptime"] = $uptimestr; $sigfile = @fopen(AMULESIGDAT, "r"); if (!$sigfile) return false; else { $values["connected"] = trim(fgets($sigfile)); $values["servername"] = trim(fgets($sigfile)); $values["serverip"] = trim(fgets($sigfile)); $values["serverport"] = trim(fgets($sigfile)); $values["highlowid"] = trim(fgets($sigfile)); $values["kad"] = trim(fgets($sigfile)); $values["rxspeed"] = trim(fgets($sigfile)); $values["txspeed"] = trim(fgets($sigfile)); $values["queuedclients"] = trim(fgets($sigfile)); $values["sharedfiles"] = trim(fgets($sigfile)); $values["nick"] = trim(fgets($sigfile)); $values["rxtotal"] = trim(fgets($sigfile)); $values["txtotal"] = trim(fgets($sigfile)); $values["muleversion"] = trim(fgets($sigfile)); fclose($sigfile); return true; } } } /** * This function creates the signiture image and writes out in JPEG format (may * change this to PNG or add an option for image time in the future). The * function assumes get_stats() has already been called and will use whatever * values are in the $values array. */ function output_sig_image() { global $values, $text; // open the base image for writing on. If unsuccessful, exit with an // error image. $finalimg = @imagecreatefrompng(IMAGEPATH."/".CLEANSIGIMG); if (!$finalimg) { output_error_img($text["baseimgerr"]); exit(); } // open up all the icons $runningimg = @imagecreatefrompng(IMAGEPATH."/".RUNNINGIMG); $sharedfilesimg = @imagecreatefrompng(IMAGEPATH."/".SHAREDFILESIMG); $serverimg = @imagecreatefrompng(IMAGEPATH."/".SERVERIMG); $queueimg = @imagecreatefrompng(IMAGEPATH."/".QUEUEIMG); $timegenimg = @imagecreatefrompng(IMAGEPATH."/".TIMEGENIMG); if($values["kad"] == "2") { if ($values["highlowid"] == "H" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADON); else if ($values["highlowid"] == "L" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADON); else $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADON); } else if ($values["kad"] == "1") { if ($values["highlowid"] == "H" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADFW); else if ($values["highlowid"] == "L" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADFW); else $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADFW); } else { if ($values["highlowid"] == "H" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".HIGHIDIMGKADOFF); else if ($values["highlowid"] == "L" && $values["connected"] == "1") $idimg = @imagecreatefrompng(IMAGEPATH."/".LOWIDIMGKADOFF); else $idimg = @imagecreatefrompng(IMAGEPATH."/".NOCONNIMGKADOFF); } if (($values["rxspeed"] == "0.0" && $values["txspeed"] == "0.0") || !$values["running"]) $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX0TX0IMG); else if ($values["rxspeed"] == "0.0" && $values["txspeed"] != "0.0") $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX0TX1IMG); else if ($values["rxspeed"] != "0.0" && $values["txspeed"] == "0.0") $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX1TX0IMG); else if ($values["rxspeed"] != "0.0" && $values["txspeed"] != "0.0") $speedimg = @imagecreatefrompng(IMAGEPATH."/".RX1TX1IMG); // check to make sure all the icons were successfully opened. If not, // output an image containing the appropriate error message and exit // the script here. if (! ($runningimg && $sharedfilesimg && $serverimg && $queueimg && $timegenimg && $idimg && $speedimg)) { output_error_img($text["iconerr"]); exit(); } // place the icons onto the base image imagecopy($finalimg, $runningimg, 5, 5, 0, 0, imagesx($runningimg) - 1, imagesy($runningimg) - 1); imagecopy($finalimg, $sharedfilesimg, 249, 71, 0, 0, imagesy($sharedfilesimg) - 1, imagesy($sharedfilesimg) - 1); imagecopy($finalimg, $idimg, 5, 27, 0, 0, imagesx($idimg) - 1, imagesy($idimg) - 1); imagecopy($finalimg, $serverimg, 5, 49, 0, 0, imagesx($serverimg) - 1, imagesy($serverimg) - 1); imagecopy($finalimg, $speedimg, 5, 71, 0, 0, imagesx($speedimg) - 1, imagesy($speedimg) - 1); imagecopy($finalimg, $queueimg, 249, 93, 0, 0, imagesx($queueimg) - 1, imagesy($queueimg) - 1); imagecopy($finalimg, $timegenimg, 5, 93, 0, 0, imagesx($timegenimg) - 1, imagesy($timegenimg) - 1); // allocate white for the text color sscanf(IMAGETEXTCOLOR, "%2x%2x%2x", $red, $green, $blue); $fgcolor = imagecolorallocate($finalimg, $red, $green, $blue); // aMule version and process status if ($values["running"]) imagettftext($finalimg, FONTSIZE, 0, 26, 19, $fgcolor, FONTFILE, "aMule ".$values["muleversion"]. " ".$text["runtimemsg"]." ".$values["psuptime"]); else imagettftext($finalimg, FONTSIZE, 0, 26, 19, $fgcolor, FONTFILE, "aMule ".$text["norunmsg"]); // connection status and nickname if($values["kad"] == "2") { if ($values["running"] && $values["connected"] == "2") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, "aMule ".$text["connmsg"]." ".$text["kadonmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] == "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["highidmsg"]." ".$text["kadonmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] != "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["lowidmsg"]." ".$text["kadonmsg"]); else if ($values["running"] && $values["connected"] == "0") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["offrunmsg"]." ". $text["amulenorun"]." ".$text["kadonmsg"]); else imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $text["offline"]." ".$text["amulenorun"]); } else if($values["kad"] == "1") { if ($values["running"] && $values["connected"] == "2") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, "aMule ".$text["connmsg"]." ".$text["kadfwmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] == "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["highidmsg"]." ".$text["kadfwmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] != "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["lowidmsg"]." ".$text["kadfwmsg"]); else if ($values["running"] && $values["connected"] == "0") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["offrunmsg"]." ". $text["amulenorun"]." ".$text["kadfwmsg"]); else imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $text["offline"]." ".$text["amulenorun"]); } else { if ($values["running"] && $values["connected"] == "2") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, "aMule ".$text["connmsg"]." ".$text["kadoffmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] == "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["highidmsg"]." ".$text["kadoffmsg"]); else if ($values["running"] && $values["connected"] != "0" && $values["highlowid"] != "H") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["lowidmsg"]." ".$text["kadoffmsg"]); else if ($values["running"] && $values["connected"] == "0") imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $values["nick"]." ".$text["offrunmsg"]." ". $text["amulenorun"]." ".$text["kadoffmsg"]); else imagettftext($finalimg, FONTSIZE, 0, 25, 41, $fgcolor, FONTFILE, $text["offline"]." ".$text["amulenorun"]); } // shared files if ($values["running"] && $values["connected"] == "1") imagettftext($finalimg, FONTSIZE, 0, 270, 85, $fgcolor, FONTFILE, $text["sharedfiles"].": ". $values["sharedfiles"]); else imagettftext($finalimg, FONTSIZE, 0, 270, 85, $fgcolor, FONTFILE, $text["sharedfiles"].": ".$text["na"]); // server name, ip, port if ($values["running"] && $values["connected"] == "1") imagettftext($finalimg, FONTSIZE, 0, 25, 63, $fgcolor, FONTFILE, $values["servername"]." (".$values["serverip"].":". $values["serverport"].")"); else imagettftext($finalimg, FONTSIZE, 0, 25, 63, $fgcolor, FONTFILE, $text["na"]); // RX & TX if ($values["running"]) imagettftext($finalimg, FONTSIZE, 0, 25, 85, $fgcolor, FONTFILE, $text["rx"].": ".$values["rxspeed"].$text["transrate"]. " | ".$text["tx"].": ".$values["txspeed"]. $text["transrate"]); else imagettftext($finalimg, FONTSIZE, 0, 25, 85, $fgcolor, FONTFILE, $text["rx"].": ".$text["na"]." | ".$text["tx"].": ". $text["na"]); // queued clients if ($values["running"]) imagettftext($finalimg, FONTSIZE, 0, 270, 107, $fgcolor, FONTFILE, $text["queuedclients"].": ". $values["queuedclients"]); else imagettftext($finalimg, FONTSIZE, 0, 270, 107, $fgcolor, FONTFILE, $text["queuedclients"].": ".$text["na"]); // RFC 2822 Datestamp imagettftext($finalimg, FONTSIZE, 0, 25, 107, $fgcolor, FONTFILE, date("r")); // outputs the signature image based on the value of IMAGETYPE. The case // for png and default are the same; in other words, PNG is the default // image output type. Note that your installation of GD has to support // the type of image you are outputting here. switch (IMAGETYPE) { case "jpg": case "jpeg": { header("Content-type: image/jpeg"); imagejpeg($finalimg, "", 100); } case "gif": { header("Content-type: image/gif"); imagegif($finalimg); } case "png": default: { header("Content-type: image/png"); imagepng($finalimg); } } } /** * This function outputs a simple image containing an error message specified * by the only parameter, $err_message. The image is black text and border on * a white background. */ function output_error_img($err_message) { // determine the size of the text string and add to it the amount of // padding specified earlier. $fontdims = imagettfbbox(FONTSIZE, 0, FONTFILE, $err_message); $min_x = min($fontdims[0], $fontdims[2], $fontdims[4], $fontdims[6]); $max_x = max($fontdims[0], $fontdims[2], $fontdims[4], $fontdims[6]); $min_y = min($fontdims[1], $fontdims[3], $fontdims[5], $fontdims[7]); $max_y = max($fontdims[1], $fontdims[3], $fontdims[5], $fontdims[7]); $width = ($max_x - $min_x) + (2 * ERRFONTPADDING); $height = ($max_y - $min_y) + (2 * ERRFONTPADDING); $img = @imagecreate($width, $height); $bgcolor = imagecolorallocate($img, 255, 255, 255); $fgcolor = imagecolorallocate($img, 0, 0, 0); imagesetthickness($img, 2); // draw the border imagerectangle($img, 1, 1, $width - 2, $height - 2, $fgcolor); // print the text imagettftext($img, FONTSIZE, 0, ERRFONTPADDING, ERRFONTPADDING + 0.5 * $height, $fgcolor, FONTFILE, $err_message); header("Content-type: image/jpeg"); imagejpeg($img, "", 100); } /** * Writes the non-dynamic leading part of the HTML that makes up the statistics * page. Right now this is just a stub for future theme support. */ function write_header() { ?> AMPS - AMule PHP Statistics

Generated by AMPS version
http://www.amule-project.net/
<uberpenguin at hotpop dot com> ".$text["na"]. "\n\t\t\t\t\n"; $titlecolstart = "\t\t\t\t\n\t\t\t\t\t"; $titlecolend = "\n"; $datacolstart = "\t\t\t\t\t"; $datacolend = "\n\t\t\t\t\n"; $sectiontablestart = "\t\n\t\t". "\n\t\t\t\n\t\t\n"; $sectionend = "\t\t\t
"; $sectiontablenext = "
\n\t\t\t\n\t\t\n\t". "\n\t

\n"; $innertable = "\t\t\n\t\t\t". "\n"; $organizetable = "\t\t\t\n"; // title echo "\t
\n\t\t\n\t\t\t". "\n\t\t\n\t". "

AMPS - ". "AMule PHP Statistics

\n\t

\n"; // first section echo $sectiontablestart.$text["general"].$sectiontablenext; echo $innertable; echo $organizetable; // client info echo $titlecolstart.$text["client"].$titlecolend; if ($values["running"]) echo $datacolstart."aMule ".$values["muleversion"]." ". $text["runtimemsg"]." ".$values["psuptime"].$datacolend; else echo $datacolstart."aMule ".$text["norunmsg"].$datacolend; // ed2kstatus echo $titlecolstart.$text["ed2kstatus"].$titlecolend; if ($values["connected"] == "2") echo $datacolstart.$text["connecting"]; else if ($values["connected"] == "1") echo $datacolstart.$text["online"]; else echo $datacolstart.$text["offline"]; if (!$values["running"]) echo " ".$text["amulenorun"].$datacolend; else echo $datacolend; // kadstatus echo $titlecolstart.$text["kadstatus"].$titlecolend; if ($values["kad"] == "2") echo $datacolstart.$text["kadon"]; else if ($values["kad"] == "1") echo $datacolstart.$text["kadfw"]; else echo $datacolstart.$text["kadoff"]; if (!$values["running"]) echo " ".$text["amulenorun"].$datacolend; else echo $datacolend; // nick echo $titlecolstart.$text["nick"].$titlecolend; if ($values["running"]) echo $datacolstart.$values["nick"].$datacolend; else echo $nastring; // RFC 2282 datestamp echo $titlecolstart.$text["localtime"].$titlecolend; echo $datacolstart.date("r").$datacolend; // RX speed echo $titlecolstart.$text["rxspeed"].$titlecolend; if ($values["running"]) echo $datacolstart.$values["rxspeed"].$text["transrate"]. $datacolend; else echo $nastring; // TX speed echo $titlecolstart.$text["txspeed"].$titlecolend; if ($values["running"]) echo $datacolstart.$values["txspeed"].$text["transrate"]. $datacolend; else echo $nastring; // queued clients echo $titlecolstart.$text["queuedclients"].$titlecolend; if ($values["running"]) echo $datacolstart.$values["queuedclients"].$datacolend; else echo $nastring; // TX total echo $titlecolstart.$text["txtotal"].$titlecolend; if ($values["running"]) echo $datacolstart.round($values["txtotal"] / 1073741824, 2). $text["gigabytes"].$datacolend; else echo $nastring; // RX total echo $titlecolstart.$text["rxtotal"].$titlecolend; if ($values["running"]) echo $datacolstart.round($values["rxtotal"] / 1073741824, 2). $text["gigabytes"].$datacolend; else echo $nastring; // shared files echo $titlecolstart.$text["sharedfiles"].$titlecolend; if ($values["running"] && $values["connected"] == "1") echo $datacolstart.$values["sharedfiles"].$datacolend; else echo $nastring; // OS identification echo $titlecolstart.$text["osversion"].$titlecolend; echo $datacolstart.exec("uname -sr").$datacolend; // uptime echo $titlecolstart.$text["hostuptime"].$titlecolend; echo $datacolstart.exec("uptime").$datacolend; // break into next section echo $sectionend; echo $sectiontablestart.$text["server"].$sectiontablenext; echo $innertable; echo $organizetable; // server name echo $titlecolstart.$text["servername"].$titlecolend; if ($values["running"] && $values["connected"] == "1") echo $datacolstart.$values["servername"].$datacolend; else echo $nastring; // server IP:port echo $titlecolstart.$text["serveraddr"].$titlecolend; if ($values["running"] && $values["connected"] == "1") echo $datacolstart.$values["serverip"].":". $values["serverport"].$datacolend; else echo $nastring; // ED2K link echo $titlecolstart.$text["ed2klink"].$titlecolend; if ($values["running"] && $values["connected"] == "1") echo $datacolstart."ed2k://".$values["servername"]."|". $values["serverip"]."|".$values["serverport"]. "|/".$datacolend; else echo $nastring; // break into next section echo $sectionend; echo $sectiontablestart.$text["signature"].$sectiontablenext; echo $innertable; echo $organizetable; // signature image global $lang; echo "\t\t\t\t\"\"\n"; // language selection echo $sectionend; echo $sectiontablestart; echo "\n\t\t\t\t

\n\t\t\t\t\t". $text["language"].":  \n\t\t\t\t\t  \n\t\t\t\t
\n"; echo "\t\t\t\n\t\t\n\t"; } write_footer(); ?> aMule-2.3.1/src/utils/amps/SETTINGS0000644000175000017470000000630710351702345015544 0ustar topiusersAMPS settings: documentation for the constants defined in AMPS General ------- VERSION : Version number of AMPS AMULESIGDAT : Path of the aMule signature file. This must correspond with the path specified in the Tweaks settings tab in aMule. You must be sure that the user that PHP scripts run as (apache in many default installations) has sufficient privileges to read this file. If the file is outside the webserver's DocumentRoot, the safe_mode option in your php.ini MUST be set to Off. Default is /tmp/amulesig.dat IMAGEPATH : Path (absolute or relative) where all the images AMPS uses are looked for. Default is ./images IMAGETYPE : Type of image to output for error images and the signature image. Valid types are jpg, gif, and png. Note that your installation of GD must support the image type specified here. Default is png Icon settings NOTE: All icons are assumed to be PNG. This will probably not change. ------------- CLEANSIGIMG : Image used as the base image for the signature. Default is baseimg.png RUNNINGIMG : Icon placed beside the process status information in the signature. Default is running.png RX0TX0IMG : Transmission status icon used when both RX and TX traffic are zero. Default is rx0tx0.png RX0TX1IMG : Transmission status icon used when RX traffic is zero and TX traffic is nonzero. Default is rx0tx1.png RX1TX0IMG : Transmission status icon used when RX traffic is nonzero and TX traffic is zero. Default is rx1tx0.png RX1TX1IMG : Transmission status icon used when both RX and TX traffic are nonzero. Default is rx1tx1.png HIGHIDIMG : Connection status image used when user is connected with high ID. Default is conn_highid.png LOWIDIMG : Connection status image used when user is connected with low ID. Default is conn_lowid.png NOCONNIMG : Connection status image used when user is not connected to a server. Default is noconn.png TIMEGENIMG : Icon placed next to timestamp. Default is clock.png SERVERIMG : Icon placed next to the server info. Default is serverbox.png SHAREDFILESIMG : Icon placed next to the number of shared files. Default is files.png QUEUEIMG : Icon placed to the queue status information. Font information: NOTE: AMPS uses TrueType fonts. This may be changed to support PS type 1 or other font types if there is sufficient demand for it. ----------------- ERRFONTPADDING : Number of pixels to pad around the text in error message images (hopefully you'll never see these images). Default is 5 FONTSIZE : Font size (in points) to use on the signature image. You will need to adjust this if you use a font other than the default one provided with AMPS. Default is 10 FONTFILE : Path and filename of the font to use for the error and signature image. Right now this must be a valid TrueType font that can be read by the user that the PHP script is run as. Make sure this is a *good* font that supports most of the European special characters used in the various translations. If you modify this from the default, make sure to adjust FONTSIZE accordingly. Default is ./LucidaSansRegular.ttf IMAGETEXTCOLOR : Hex triplet that defines what color text to use in the signature image. Default is ffffff (white) aMule-2.3.1/src/utils/amps/images/0000755000175000017470000000000011657306230015623 5ustar topiusersaMule-2.3.1/src/utils/amps/images/serverbox.png0000644000175000017470000000131210351466234020346 0ustar topiusersPNG  IHDRabKGD pHYs  ~tIME; 58WIDATx}_HSQ?[k.ls^4\aYIJDkIOJ$!zVefi)L詧(e!ANsL[v3U7ՑUg_N$ȱ >euNW*s`-0H()$Q b(cfhtRkDDB &mgܦG5mǔg@dhળ>KgX A5R#IEBdbbdZe%VjaEVl&*FH( ٥9TUom2JD}m 8Qn/a9.kYZ 3}yO_x'F/ffU&ZXZ5CwsMLxglĿlN.-IENDB`aMule-2.3.1/src/utils/amps/images/conn_highid_kad_off.png0000644000175000017470000000156410351466234022262 0ustar topiusersPNG  IHDR(-SgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE7n)C%Jz5I|,a쭸[wdAkz-590֙&]Z@Z'/ODIENDB`aMule-2.3.1/src/utils/amps/images/running.png0000644000175000017470000000141510351466234020013 0ustar topiusersPNG  IHDRabKGD pHYs  d_tIME 4IDATx=hqݥ1_55VbĂBQQ)E ⢛8K... ~TӦQ)K"IӤmzkr`ՠ{?ZTuܭSR p`lmTBx9oʂf0*:2zlR:I~*Tj42 e1`]TDKw/NRLsSSJsDZW4hokf{zǯ4p}8;Af\*mN:Y6^orTuXq"ZAxrg G9On*j ~l9ֿ%־Az !"73&3Z~@Y!I4x~$ŤBhxV\K&s01t ]g::B8]*eBa`Y; NTcUDTuXJ鼎iYʵmY@ɔJ?`nna@PdIOGU"3H:[bvNh-c~Z󉒠g2ry맑zOFCgIENDB`aMule-2.3.1/src/utils/amps/images/rx0tx0.png0000644000175000017470000000130310351466234017474 0ustar topiusersPNG  IHDRabKGD pHYs  tIMEjjPIDATxIHq_,.F#2VRD )ָ59dYQa:I/Q̩SI nj\rilf>)4|n/<tlOX nhpraSn 37A4ȭqsAb; Wq`PQ> g}8bKg*nwQ l% ā$`X-tHK,oN݆DTRm ޸PJ$c!Z-L}@mU27؇ΪA]!`6ZP ڮewwP>w9f~.V`뜥\j*FF|ЫGllmE/S4SJ(󨊊Yc%ݖArJ2s_ Nb1HU6@,BcM[l`O.! aL2pv *"Hʯ&xsJ2# /sˆ{-c8 0|KH;t9(8_ 2a6M +&NhQ"ۓgGbbZ?p%IENDB`aMule-2.3.1/src/utils/amps/images/conn_highid_kad_on.png0000644000175000017470000000143710351466234022123 0ustar topiusersPNG  IHDRabKGD pHYs  tIMEdIDATxmOHTQett4"+ "E6 @E.*ZT"(ZQ")a?)57q}-ԧ9߽ڣ:B]3N @i*GY^R n^o_~MSXwS>J/ר0VPG4L[*;}zllPx N]0Jb')#܀||`C\r?בEJҹh a̽2rϹ$AYNbA|؅%o q0h+sd/L3+#m90G z~V `͘wRVMx95ޅ.`<DG=5e4Ū(GixU|Y5U b2lϦ~ I2N4` y *")LT1c lX `eS l&kj2r[5ֵS ɔ N8Ru$&aƒH ~ņ # 2gH"^sm^Xuqh6̾yD1.c'ciҝzj 3J%aa9_H:'],MOa*ҝvJd(3g IENDB`aMule-2.3.1/src/utils/amps/images/rx0tx1.png0000644000175000017470000000136010351466234017500 0ustar topiusersPNG  IHDRabKGD pHYs  tIME5}IDATxOSqgg-PCR'DԠUPQ5¨QXi\҅yaF8ۖ@}ܠHgu V.p]syܣ=3y4`Meukc`gk;+O@/:GтR޽zK⊦c&PLV#wo0<# x.,:X*2cebUQ1k*Ig6OXL6JrtȁN\u*+n#Lbc`(n dRwj9כwX#@jQ6<tx݀|rԓĀ2U۹')?V_)_m :AxrQhJB@thQVo(Voi ?UIENDB`aMule-2.3.1/src/utils/amps/images/noconn_kad_fw.png0000644000175000017470000000157110351466234021143 0ustar topiusersPNG  IHDR(-SgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE7n%J)C_V\i9YS𼆋_TpRw XJ:"Tt-,]]&qS*Օ.YUY0ڮ:b&02x?Φ!ď ,˵Ŀ9Ksn6IENDB`aMule-2.3.1/src/utils/amps/images/rx1tx1.png0000644000175000017470000000145010351466234017501 0ustar topiusersPNG  IHDRabKGD pHYs  #utIME'kIDATx}oe - HU뚴nI[K׸O1̓ƨT5۪EZ X000&vw{vo^_LǾ]1-mcz6LesłۯC;}]3d,I XԽxhik#ݽP.IAwbF^hS1%8- +1J dtB>yvڈw|@]Ibw8h[ѱ(^zO2@͡Tfԟe'X 0r!,& FUQ1?@ov+C{)4̺Wy6<ybiV/fd09B8w*4.b]ձirp5(hL$ƙI9qMXJ"T@8|y.hm9DgOSLGHE\~kZV|FJLGhvoO=zVupsg;:J:G_9DJu*iԱrmÏށ\N,[# D#>˂ч;*Ρ(*|d+7_(Zh^c @;䜖 C2c2#3Ola90{wXꈿʹǩS{sK~c6o Ύ+ی#~g#5|!$IENDB`aMule-2.3.1/src/utils/amps/images/conn_lowid_kad_on.png0000644000175000017470000000145610351466234022006 0ustar topiusersPNG  IHDR(-SgAMA7tEXtSoftwareAdobe ImageReadyqe<SPLTE7n)C%JH[B2xZ@k2Gw+ub VS&qF@:߸a%RV|NYŕjy뻋R5+jG_2dD|  [7RbAP[ͦ$.{BTL&0xp|hL"ַ{׈4ɾ"B{uuо8 nKI@JIENDB`aMule-2.3.1/src/utils/amps/images/baseimage_old.png0000644000175000017470000040407310351466234021115 0ustar topiusersPNG  IHDRvxbKGD pHYs  ~tIMEk IDATx|Kt˒%ߗy{n-jRI@Z !F?~sH=1BA1@H tW>{eFSQ/32b?͖-[EՇL{^=|{eS I"A$@@듭";b'A|~k[u>_?~# RUȢ g|g^ `FŒ0Bp9 'ȿ^+f ˞t_A A#Z~F:A.V ,/t5o@IHOћ^K[@@K$żNuwBҋYaF$I I@7C׻| x>aY/YLia飞/ Fvxw/X]{PHLeĴƉ)G?x!(=\Ev@A@շ -ۇ94[ B @J+/S_ &c:ϵ[׺0|zB`Ho޹3Z_Fo-N7?"B,d"|BvX:6nE0P @_(eߖX  % 'رg&[=D HBz+*3Es/!Q m9[@?:{`= -+ h|.+won6fi b[(TF(D), 8>HdO{L $ F3ҜfOӋȉ;6H2j)@'՞ FLV, 3(?Y aH E!H5Z]-ԘhmE q^;m}>mK 1RB1C@C kХ J< #yć5#V^.`uOGy#)Ome|1Oc`qEiOHom;Pxb^OL3] 3k h4~ Lf3GqG)Oͫii5!!gn!|*Ә#~B&-+j#O*MG{y>p fiTKA_Wih+K1 ecrN R D+ 9<¤15DIw"H@4 "v3'J>;RY=K8g};|$2̢rxd4Hv[pP۴ܢ޸/B`awTl38Z9PϨUg !R 4Bbʢ"XdQz,2V 8wJuayfLAhf=|leu{؅G8ξ{MOӫe*M'd{Zʲ#\ɘ0=]NqO9uҪ}'p\|N=-<nR%]ow;(߼_7c0ߨۛ1 xz.IyL z82Q2]3Q/wĢ$Z%VJ?,Kn/`tNwؔtʩ}[gW7`S?zyXj 0/변 ,d(uC#Rr"UdNj_ V@0fw (#]~9~HvĕHo!GI^U5+s7pkCH6 3Mx^J7V"en%'s1WҋTY RW qaJىY]M{8 OQ=3q/I g<W{+y7' :`6&aW0=-=9} iF (m\pSp- H$MҘNJ5.,x?? Ihk:?Ӻ5;=k(FJ2n#Ro%.sRL4OY'vgK &~zxWf_sb#.EI0f#H]WFQ pw%\ӻ0-@/I,Ì1[rA)쪣 澗 +㔻fgU$և}tGRD?l\ LS`v }Ӟ -<7U.F;0ZVD1w :3v ,;`^U)I^պu? pq)oҭVnzX@cbOW_fskH4OwP,c78T3Yqv/aFn}_A#5p4%FP]=~}pz-ӫ/:h/}f03]fVѝz7Xa Hi_"Y4'?oy6\@ܹ7A3WKu9̄bYne.:=BAD.i',[#aU^*݌ēAnbl0 a";h708 V V-[ =G$}@7H`3 BZYIi]a 9=KnRV3/i]Q󜃽~\ndQ%+U!Pa7W@' ^lF J?$^O2BoA'pAW'dd%Bn`K*!Kh#dQk߀dx\O;loɱ~@'ŵ7m f:cFv'0姭F8fi3& 6hIBFyҥq-on;n]tϖw50N"9oH,fw0C lQݦHrN(-2n!i":hxa禌+yKyO>/-!1o/p RXrB]xzpBBxK2^|W̃K$olރ$-fuTRCҋ1Ŏz Jhfv{ x3.|2%Ln8i %m̋ԚY9z3 r=`[!%"pwSjzpڽ~-+,F뚶{0^ jYz"glCA-h(\^+}.1&@/,u/^0H0M2F}=]s7} >ՙ}5N,IcBp.6ܗj#_&#}J" R5˱clg ҨcM8@AIN^38 g9(%6*4tt:aS9)Qp[y٬L?+^wf6dB((1=X.@Q`?@~,8|l?ܒq&1u/P':ℍ]?s5sVlSo/mԢmź]+ ] wDݻb0d t0%Ɣ/5 K{bvff؊+"0&=z~+*Bd(ݑi4~u.ĥk32Ws-: g FD_byNm f"be̪t DjRȰ:徏T3+F+ؑ4S7%FWbB?Vm뮏(! yeR ex 29 09rz+S)4}W? -3ō55 t"MB%wm>qc̓}m0Mf}paIst۰wlc+őz@LkmRDc!JɫH3".5|HJp]ob @ E* EWv82b-(;D8>X6#Vmk=~3Gـ9/Ww}1%_6ay+N (8,ףUf"Y+oԍ<'a@K)F> ؈ۤR=}gSK=J\8J-?ө pyo%uE";jqTy`I9 *YmRTmqL$l3}im`ID-|Y{CME DԖjpU ̶B I9+Gv8 ,,l {uUI&x'ҷz,^_^C+VkncSrDQp8]L 3yAd)64kM:X_J4jUޒkdZ&kr2{oʁTXF-_RDL =Ǥifт%j=[2R %$*mЫ틤 P zjNIDchITU%6Vx@-e [߀ѽ#  J#Ui{9g[&{ UK#k܂ ЍC߂+[ ! N9|0m6d 7db0X鰠,$ZlIcAip*8ϓ7w?š6D>[=:o]|׃F!" "Q>t ,6) V!b R d@ 4 cEU'^Ͽ'X/׿8?φ\a7@@_86hTg[~oo>谄$fI˨K}EgK~;__U [/(#gЬ Q wB/%\䏅\mr_Z(`d {NS ., ;˜,܆ x#K&0!;LxK\tNoV\& kg0ݮcZ'.B" S\R LDۉ[,#o<&{ \`SsL ޳ P0H&&mO-:irjuhPaۖFju~fI" 2xASI");0q _@"g PYd GC "No+ R,ݖ%3/}tA\*Rul-ӘLۗt`V̦h+R_r,4učmRtPyw nZ9ѬsuV\ov-micx`D,ՖUw,jf.6ՂXYuX5ɑ_E$`=Θon2?|@+; `[`Y{OD(#^a7k_=Am<)xEcI,T \A$o0"]?̙1|3"E7,~7n*B/QO!PW~"n 0m5ഌ+$MoAQڥxf^a?bW D|[·a+ͩgV,!^"N n'J[cGhv'.}.(OkP]\OYVQ IDATmP&z,: +PτPmT&I* Kn&#@[JE@שFԡe:7lCd$>?sW|O,,".շťK'k4~ЕO9b<21yǪ5\qᓙO?_O+ǿ[2٭#sn[,>\wsчC"l5غB/ͼ%աRZ;I}g_?~Z -RxarO]DTXclTzz| ,pN -@+.)v :Bb=|Qw@6 b>K9>7g?SXΗ 3c'~/n-@぀ 8b[2k?AeqJaBl[Ze Ggbi  AޝLBb$ ቌc& 7mͰq"  ū/32/UкhkB/u*=E0 ֥!_qJ^XmC7f<  ׇhCφMh?nZ GHщlo{bl>ϼBmr].Ҧ0ZX ƁhٔCMCuoȋMkhnp<$s؁YԖW1S{-H!!5|ك1,zJ0RA0z}%̕'qS%ːQa܋PLZ,߻ }jj9oWp%vZ3 Zg۠9D_EޯΆEa݅J^sʂ[O< %"`@3n UCjes,A"Gi>baAWB[$N[K sw P0=.&WX(߽p;%n\ ~J~u1,'Ah¬A v (9iTlKۿsO_J?<"9g2`͗ |5HN`Ǯ]PF0t?ACkYo-ȒxA:O+~|+NK\/xk7kDBLl7(EG/>?O准_ o>Sd[GXdI|e ]{lN>&8!Q#N?Of-{֣GC'{[o~W~z~t^aO;D>{2 K,,E{;``8"欮/ҰˤGY= B2 k%sO ,;qcᆊcixDɛG 8%1گJ<8íUhgCXjR;k7HVd팱I?tx^-`{p\TaBԠ7 $q OӤn 3{܂fm/63eW;Ώ;+l7v)ztzUFÕzXl4BGͬa *0!\At z.|iԊ$]$τrf4D(⮹촴ugǼ4v 36X|ɶ-7^ TE 4yL7ppHyv9oG7s0y5 &J+iֹʲժ+5HlYXT:z/"o($ow[DIp tܼdJ.4͐'` OzPJwdHi %:E9OxeA7EvMݗ]fm@LC=?l QlO"Sf p+ nBU t0CeCZBNIsnXgl#WLd:]X0,~}7 &":t5>O{Sǝo.yp X Dsy|6ŠdjHdUv`ۃP"lʌYZlt䅔(/8m'eB=W\7wuu.Z:4vƎwE EnA9KsYM~=?*C< xA;\o6XD=-ڊ\w tQ1}7^.#H+P:[y w-_O CJn1/-4M7&cbnXO;%Kِc$ŠNlkH.y|϶Mnh@j,Ӄc8&[:@| ;5ljonBlf62WM~Z*셶6CH"+g},˼\_+ܽ/ kTlGiptVڂ۪gfsX!I8EJZrJҪy4(B̖KSUCa;7"{} 8F {1.#L )Xp;t7sNH%fALoJT΂|bȠl):i,/_xyu)A,@W#muX#Bu!]C s#`v2_*b po:⠯/E|ޒ ,SYUfE/n He$ٓQm* rc *wgT. f[ ֻcQ!/.elS+>kz#`mYPb^.ȃq$`qj]br.`.G{;w|338P 5||x[. u>n6Mn N߈"QH^W{'_%G_'~oNgИ-tOȔ&.܃"{@[ŶET\T P@Jb5E?3V1p$ۨ  BaA ,wӫ $k!ITsER]&{aVͬ0s*aTd!{xւM\k7 }% X 9ҹ5um7tT]U۶Aϔ@iFntt ޹.[3!rH V#n\=n4+ G@8/}پ;G?V!?M|w{=4 ! o]۔Xh[{6YZU&M+<(7rh@1 ~[f]z@^sZzw5Z8s|chqB@b_k?Lhyj@uiizfq=GDLܟv؟vynu uuFq:&!"V6hq% Ì}^~Eh`0v3R g22{>!m\}>Z~BܛKߐg=;޼O{~˿7?Һ,B_dBq}1.?K#¼Iݍd}eDZ :>,-j0KpP S"3Y'3´3'T,Z rwl 3Q 2.„jذhW&aj5Dtth~{}9 ձ.461G~JjmbKu9"1: ;Yk>U"{;J1 c\D1fbf&>n%*TKnԭ6%nl]MsMbyuZO':A53X0,k|r۝(}$B,&}@ɘA6m}Xv&efXECd xk]1PzLdƩxt[%YrV읙[]yrf89$%[eAha10AH~`BoӰe 2ɀlԈ_ru_瑙{G?<nսܹ3bEĊ>9)DGZ[YNN%l-}`Ni%rM6`&SoۘP1Lu [2}5A=[d$#κDJdݯ:L1l[V,H:A'◛7BĢvAfI"P1#dwfM$F z/-CJ{H\hau@Q-ЄlX 9[, ˛'eK@d~RS@02AG.6Z]I.ãW Qn1???Zqywi`']F$/JC@R x@j iah[w_yξ;PY\qz:ЦRYdT-!iۤ;ٗ<lpyg<9y.> 4`APJ0`ݜ+kn[-V -{81E6KYZF >3* ("1\"enPdPO88z/,<8]ŋ}nqPh(2pEdiCa=+\8PK6Rx)>gKx x2T'RLn  1@˙0-#5ܮwcچ cg2LRCbDhV0ck`";rā7X= x(R,Y65{H1U >#mR@TGdJ1W59IJDx[QTAwhNqr @ JqP -jA tŁh 1R'psEʸ\ </]:0TI,` v`axPP6*LKv82P߆UѡmS]$"CP#0tJQ:mPm![@Mb̝^l4ևo;ǒUPoNdlhR&bZеk"l(!ܙ؞pqVZMdk&r,F*' ɑ[YۂnR(,_0B!D0 xyuyw87;ۣ &7)iLX)yue8U6G-ѕ9T>!h LymtѡRMus9+ǐ8D `>4V4l}l3Z̭RV F6oQȍ/0H05j*Y-9);âè䐪Meh!4[n{_X= "(i1jEm4$}ݷ_iڄ>!o~0kKX* blh1}pNJ\ YZ.XhQeq{]X(ߔ{x^>kqhqK/,$|Cg%Y ujRAqh8{X#__%h ܠGq527SS=yNw1^ v}7֯>zÑ&75BD jaI(AfJn )mat˳e;kypznj{f_u?aGF!BAXI)&q\fMFzv .XD/jvT>Myk^e  yo8\b+_rH 0P0ָk&UG:dD"u44 #R9diNwZ WѦFa{t;]|K$Qsِ:WCro e<MYaXgJg\QO)g{Jrm{=LqHBg8iܮ7Bw2F/Dy:f+v`%*O$x;g 0 Y*ĕfC 1x,7#.Itrq?K*m%H Qb`"MY꨸{=ɂ [$ QVNJGneH5b* 0VU|l)HhN !ZOz%8GxV[YtT6$:ۮvǒU>r 16I iVٿA;66íi\MH;ZA8*0pIWXfi,˃k"V^W>,S&hVtyDwo/7;G_aiBB9B,.Eh5;@RVy"gx2\צs[ IDAT9Jgx_#F <2/@:0:61($SF3\^@p+"J,RXYJZFe*bih}SqGVr dPf6&th\I-[~%BjK V8d- S zz̍^S0e XaHuAҤTي\'k T٨%H&%Z- `"2/ųp`tX:*U~[j@B`C* g&7`85W|>rwEț_7ؠ8ˉ~Z`dQwf'MݍE[ u͍V5g0_>8q&2qʲ5yhRN>ĉ kphͳ- )yHItrg>DƜͮ;2V!u,bbRghFA&MR$jyy$so0KL)"4 I8RknbNbcWYs UVpJ!M` L>7'n]0Gk a T^%^Cn9$tExAöD6'Uܥ;yLo£;F+q?<^p uU=gfU}s+SDRy*ZMY1S<8MIB.xjӍ0h4퀧>ŝwX)9\Uڮوkhb4ދ7 IA?|ukjO=]40XB2M3vY78x.\>޾''/åkȬZ\ mt:td|Ǒmt-x &{_87/pq=Ą 7/oLA%ˊ"(ZDBh(Z_R=o}У9($GEfJXy"aL.6ga;/̱n?FzƗABSA`iRTPOK \q̈́e7x.? ou2.a m H$2PzlՇu^nw#6o"YukoԳk1Ȓ۶M0%bk4  +p7x/rf!!HDQ~q.w)~WojaBXGbmn).[ K2bƒp$ֲ] htY&2pk0oY2M)FkP< ,%2 I`i2,Ͷ.Nj#;$:uߥ4PmOB,RDbJ$D..y \B=bV>{Zf[ %/G"RqѱƶqF$׆fV42-Niup#V1c%klbDM{"ٝZ ~okS$PIPxy. [O|xtnT}։ 44R#*l_.eafL\Lks C0-NiC.6GF= EdRM/~%҉)SV;T9(5PDŸsGvij[UTIpBL#DZuH[b-0 #{S:CջtT5;/ VȒ}B0Ն2daaТsAS> :!0f 8!fnSϣ.c jUs$!vp+ sPLut+S:SeB=4Q&یw~)k 7˾Y\\ri7O .2Gn7>2j@ Fz:óWoى~xnU8Ey3|swR?cd%ěcw|nL0#Ta)Ն*DPhi^97rȎu ٕk[]@RAC[o'K`w_Ɂ( G H@dD`I2n0*.>npb/wN~N>#E<7,jLQGujLaޢ!ʌBPMY=H "(Ӑ鶳KF; +{(aVxFgin,"Eh0G@#N~dD 6bMM-Z%|95Ɨ=*#<`w." v14%:n4 ɡC -4o}ovHj\v">_>@m&`?9r4Pʦ%sGQ>|PZ1n.zQH89@hhB:=D1t9B֙FF%P+݂dF wQ%9٨PLp-cAc*N95(%? 0WDfVqè}">4rX dgV L`<3hb\/-m{ 5BXșYO`vv1` nܛ3(. ]qZǥsg>:`\Ob5fEnow7`$B ښ]98>hHd(vc`*P7 T B)EPczxN`XA, Hp-g_짧VBlCK&R.c'wm>l D ~T[R3ZCMZ{*,1k66uh|rx@inxʤ7 "I PK7q%Q6fkf\[uɺ:?^4gv4Zw G>7q\}6~'GD?[3,hC& Z^wwqv MN{G3;vdhuMGgv\68;vGyomrspG #d,Y}2hZP4?n=sk+.h6ó+Coíp)OjwW/?x> ڸm%84<+ =l\Fa;@CD cW&h|θA5_F[%<å[\Gs?㱷cXzJYm26r|_=9~k8:$pxa3ksIZ"T7$>h9}W;Q4 ߭ R4q'DGBdBK@i\ލ.3v7ʞjצټ\0tM#Y큥,ӄ]'}^I2i}d2?lK Kc0^+J}fNЖ~u( hHq"SXXjE|= c(&ŐڢQFWK LrtX+_E颞IӤq17%Rg1U@m w&>Dߒ-.e_gt!'5}7Oz-E.V HvښK&@BIysCԲD426p v=`FD'l5eSk3/>F8 h.6:;͠a$[f?ADu4R/ڜ2ǡzD0 :3 $uVebsb2ؒ4!Ѝ!G-@\2Rx}fYue~qh(GtNte+8aE$F&shl,kW߹]]n܏t{z2| ۍ*GbjB ={ '05>CcP5:5[.k[JS8-EҖLw<-Su@Zdyp'w!)7戝` x1ַkq'xoㅋ;ow7|ߋfơE@%}r)8XSʪ0e[mpEhuʋ 6Mt)x*>?nr} Ҷ4Ӽsomyr.\ vGlJ~OxLP7$B=,"2:ȚjUGhl=gW22k)l'+`JV'h^yGGlz'K~K~hW[$t]F&W4 X/_Dh/a^<. Z(6\I DVtߵVR@!|Lst 4z(vAB\.gcƞNx`I|ƥQnL/1J01{1 0 6N1ڮP O5`ă7J0@)od:a"p&8%fw IACÀQD &V[ox Ɨe, w?<7U2MXs`Xh?RmR%25Q9ώ_Bs:^+qvBߏo/l7w/`ܻ8^ho1}]/n?AM S>ER*w{՝5)x7OP!Sm14X`2FUlŇ7%҃A M9Wn:C$L3T#-^ȸ `[\t. 3 6+|lYnxFM|>^S`Mhچ4gk+klcA~y!ȢOV yؽO^>Mx Rs#?|.OܮZ\4'pMxto>;⓭y= KY41ɓkX3|!0m2},!zϋ8M"stl//[lZ3cl`t]٠y2E9#ۼr)@P,!RbݯX޽]!JVT=T\9hDwK3{@wzZH2@$ X'rT+.G4áz< uvc!7Bs1\ΙG|yy@ waY2gxB(ܲ(9 @wOuܚ72MX7sBpCa@aѡZ6pi&xUSFQv Hm<:vǔM"#wS~Ĕ;InċquϛR8sʪIh}upʧ׵ \z ش7s2TCso[}u_v=ۚۯ<*0z1sA͹Ddz~> *O9 x9J_.«vĽa/Co +?=umX6a`S >)&gf&7?ԽB@ s:EIPJ]2j؞ 0b 2k5{kQIr-Jp5p"cw奵2vW}C c`Vvp;AEu(rN;_ꈟɟOO}9c[2efU{dIb eVy1oZ_ / _2^xVQAVOF3t#=}'q ԈRB~wO'??$bW- B`fيNR7b]c8?5'q[;Dd(c-;ީb%a$DDG4V%iڜ.l $-H)mM< 9Z%l3zEw`,jrܣ9׆ZhBPJ[L8ef#LGFOR*p9e<%xyy{wƸBqW:| ;O/|p䕧ϬxҠyf1]-j6 R,nEKJcdEbU{ 9"' ؁ ,Cnnj%-g ŔnK:S@ \2ࣥd" dū=npP^l /x3N\ 7Ά=%,Md)L N W M6wmbGRs&5֪nWFӌ/kN@7;CMЬ˶͋P:ȶEpLyu0ƹ>#e-84=te޾RVp9JTΗMzcfD6c' Ĝky"x_ؽ69?hS^;1,bxJ!#e[O+XK4xByUy0)T=Є¡CWIA[ątCb xb0y2%˶y mku φrdZJ(ɫKpv([@)U46geO`qK xS/!k.+YߠX5/,e;]϶{ #vݮ$\=j F3N{_l˝&whm oYJM׀2=/-QPI1y^npݾ̓J`|߇ٟ믿|+x啗no~s?s1 z-G2Z)[za,Z!\g1+B/_kh"ТXSaQe'߸3??zK," P'Ԁ̰/\N)71 IDATeV2|Ǿ_\GT )B:M WkE ⓧқ;SS,ۀ.o i5cfcxga \?Lx[1RT0ʈ "PI i@4`6X7O/e؆@,:&'+ٺʯ3eX-@/p΀,F@" 5!sjD  $-B #?>ǘ#w ;4biftPaL1j"<3NO"i7F\q\'xK/W|U{N u6Xp"1jn)mpLeX&a%ŋ2b# c$գXmk!+[lon9399"lR:jTH+M9;DA[e mK7z!/5dq|& o۳ߖE@Ld9>YHz5dbP܀9`",rVĽP$<4òoϐсak>l*+}6À66:oH!:H? ث36q v Rjneg̤5:h #p:NEަARJcwcd 2m$%Lx&Wpڮg[Uσi}( NSX}rOߞN5k( v懀Fv,ɴ/1s׃oVKR6h~w(N1@9謃)ʛ>L"ay{%DB\JÓxEsxY#pwvCgeM6Wקe|AgP݄g 7D[b(^?|rmr Y `'] ݮ?CD:6Rwt΋t.w(Fwb6Azu5؛Փ]7Z)5ۏs4[@,{2 YnS`;H{iAd>v{ט;qsۓ 8&[=߃ ~_x gȩMl%l=~WΝ;: ZY9ѵF 8[C3͏oE'@#e!&}aL){Ks +L\[Id%ܠVG?Ɠ\p}>}7>-!dw:W-m"DO}??~G͈s/djr$Pw2FQdvcip˾0bJ;LQ| #SH %SgK#AÄ+JlGh\F Bʰnتlö<Ykn%v:})#Sᒑ|!Qׯ??)޹>[_' WK\Z |cxjFǦvޣKOܵ5@@1SXQlbBFL{uDZC ߹DF>46׷[N8eʶhN2l7XQIX:LE`pc]N"D0eYa7v(]gwqսz,G{cY6.ˣl>5JL39}*=gEL>$04%|`|1739.BU$4pr=9oo4!i1C٧"beJvitw*L8]uN҆6>c{uYq>_`8JfDwK.yҮW VHp,iUOwnZx'&(Jm< fTR Vыzvbp 02/ѥqI|˘i.|@R0}o1a 6hVf(3Tpa4 dס*|^jvȝCW4C9>>? ٩OuIh_ޠ),e~ѦGԦ( ^S@>e 2[K~T5&usϖ܋=”\;,V-Щaf~e&8yOgo) d[ >[ &V]C` H0Ⱦì^~Cx1K'QE!P4,Zs&4M432 )10hl K|p~]Jf  55Lǫhxݠk]k_xԳ7>F>ŝNH_y囸9&we38H"܁dJqՕu4c=7zH[غ_uuſjq[ų/d#HjKh-)ٓ*_ź̲9V E)偪tnpxb͛C9e*Yta߿(8`5),,RaP 6ĶE4]&L F #%G2ǐ2#Ow|w_/Ζ[KyoWL%C o zEk_pt=`9wu-n~ |p`@p\C#9B,B q=C 3셥%8Λm(k4M.]# cgdkRm_فך5{&.'H[EJkEmi-!AB!yٯܶ_wEO?W~F.<K--|gxN# .%޳on2zWHT\EƓր(MFMž ><`ECBϕqyt'PRgƂJWQ@VbrYƮy["AJ񫾆w2|ʯwqo&.B5hq x۝C@4k1y!Rui?)5\`BєI%7 x3݌fAgE9VhZe& D4$Oۨ! #dz7+VL {\ `K%{ 0/`]h%}YK3/c0)$OK(dvw2&N^. @,8 Z9_ŀ-:,aȨFC^"u@:,S;''3#h۶  hOQI\yoJ|ܖIx`(HjN3 lX* 5^42M,0?k9Ҥ\lX2$R*AN ں"p$EF5^ ;8n2hENTuo}REмH$ o<-X̘).{ 33h"ry+Yث6"bc"8m7 L7uf'Mz6>Ͼ8&vؚg P!fdsZ$O/(1ʤ^ .h\pNeZ&);\t]9;slHn0oprX=GﻷPw AY<@2 ۼ ɛG'"ţ- ]8YF,m n=׾" 71ܵ^7szp@Gb6d|=mT6RvT|*[5 h!k"Jԅ".VHMV%]Y 5neDh5 >]-).l3|tx n~ dݰEcw Hdiu_rxXd9l6`۬EbAcu#`//r6'# -s$, M֍)vר RL}IA$^2jtbǀ_KƭOv:}@ýe]8ej|rŋ БtX%7`wMo ޠ塋#dža5 x1W-f`?d@ (aǫiȆph`4D$[C|" KQqi֝Q02@WhsuMbMued8p y ή5^dbYE&PATcc{Uչ!l鰪ӥη=r: pZ.t' Eql!j|&$KLCP$fGi9Ym NJ(M9 oszʟ_cMرTݟ]b` UuShh;^:q'#]走\D#Qh-铀(Sxksa$=l6,%ش{> T\*3Yk@vu2>RD"ANY!0KMw٫XSS45NubfEF/fyMpp(X,˦m@3_noe mH8p*b K10?iCkTp$ '048Ucd=Y% De@YX̚48_ <>ty/_׾jQBn2TBJZ=T ˜0$sl| S'6kto:DnCyN\"gL}@ k*k4J `7|G`X;Owȣ1%+:O69KmCj^!JӦ|%93 [ި-LڇSv0Dƀsy48!rR֗%AqzoM5^A/o^wi/m$JQ'"Bd41-J7ёMAfK8( nY+&E2Ux6 J+ ł^t&P7>Ih,EcƬ4cWŅtxYl,*6(sq]2[/iX뼻αQC}7'94^"|gwhC0?=M7ҕ~RsХSK[蔥*GYoYX mC\ͦKwn1pâ X'1kXaVf5ARcǛwKq g.:.5Q[쭈8PLfijqZ7E$|)poh6>z+JoC CeYt0ݬbז\p"Yۊޯibº_}|&~׿[?,~<.?3 j3!@ bŀ> (mlܝ;7"6sEi,`(^{Txcd8գNcD^4l٬ &K 3-'w[-wj`^_HGQЪPcú+ *[²P@oE ~SPO/P-Qz֓zh,Z%VueRɊрTBO#0Td!l7efYXhcjbvH U@ "qqy&Ÿ1.la"<1­'``bQaf@{r]ӓYS ? 1Ib#H9ŘMWzÎ[}:;񬔒2ɧ{VײYJYbQC@UM٭::珟 \w,16ˣH:jK缲: IDAT IzMX[)gk>"#TFb{ !Lp.P825XBe}^ywwH_ ) .yQ|,:J5*(qNSj#<ɾi z;_p{f(BELGBڞmH;đwx% ]j&Kqhk^h-DBgVnlѴ \V Y 9\%F4!ʨYp:7ع<\ESE1Ľ~^WsḒۣE+rԊ2XR֐k 3RLpF2QFq^=CC}?~o=\~ ?%K4//nᓟ;V+|?y]lٵm`mEDf;-']~qx bQCڎLC!T}q[O]\`9ophhYD"D*Q{"q#17?cAsc6ƶ`t8D5L@k~kK潀oǗ;lD `ϻ|s kO!vKhB4!c.{ER[.IVI(;5Cc!m^Pve17yNSK:˵ZlK?Em:܍N_#2c3F{qt2$Ьġ7 qq(clu-"imzLc \v(ۍnV( ^%D*D0kՍl]N ;*bw>.,COc'Pv9\M>v-/%9.y~ 2|{[:4i 3\7X@c:Ob{U_,n[IM .3Ӵ\ 7؍Nd4 p8M|Ls:i{Z6{\h[\Kenܘ]ެk K~ZU @a;8l;,ͥ!DT֋(}(T񔣈Db"8$g<jg%T8w .5s_G 1qZEeb-:ª:<~/ړgTc#5pOζoCpC/fQv+#&XZo3 UAm J=W\>~7Fн^'=G.Śo, 0GAEU 1(U>׋Ma2YO6E[FNTr$!U(*4Xf Z4Bc\&mv'`N:`6M(ArVS! NiN@Ox[f6 m %]4/cYL{>Hya?x԰DϹS4h]I(8g[)6 KNABb8d a-ߗ(!dj:,îp&<!^̅mʘ#[ Is43Lj@u)aVZhjmKa*,9˝4r[AV Cg~2GMY{8W_Z:xyn,С"=0xjh(uvp 2r \>=g>i;X&nz/x!?0}t~Oks؊xK"Hb!* ; \qrr ! rvuвKT =s#V P{)x#]3\ s~CTB`;Z!=Ѡ Yƣd:B"f Kԟk/o{--\AT|.  1 %tڊαJz[4ˠ3d-G^~Ї^ɍ\n M:l=|ӟۧarݯ7.KË5?Cqg ڜ4 &8~/:p1E[zPjr؁)Cmоy/|pc~c^nZe!w=֗V cV18"`LR0`Uڣc6CiDBEz`0%lJ* ,hs^1rܦ0i90Wl]}6 j32 EDg.0[6vOOhu2S«n5#S~/+PhQJGlDG[UO)%+Pb_v:1,,l >}+GXF)YD\VK+~ټݯMN3'1$s\xstr<ܶ]܈A[P :?Σ1AfԈ=/5}#Q@tthq*gI}@/ntθJޙ]bYJiw!<<=S8.pٞ("' ˳ CvM¬8D]8~)Ng^BQD^W7jjQM( (xC Wyd43TmY\#CSvڽJj<I%wMBU/Aθvt{ 7U֯QzKno#k*ZN~~A@S\5X'alA5lOX[ ,R ',q_8P~WSؙ:mBJamy1pi>+;HL0(4@+SOP@smf8^o&SB }0؎S Zy0uq3°?8YPݟ7S/o⥗^@X;?0ؙ5~qI-lʁNlD~]ܸ-Nᮈ&a]s%ӃVu nFcVA%eg)^qN<"<8@ZU&>tGWNؕ4mS+E+@ d*1##J[Vg-ll6%x ({OT F| KA݌ہMCF_d."*ZHʗ# ԕS.ZF PEQV}2]mljP=꙾#E u~eޥȡ3Grmof(]N! gU'O|ĨOdlaJˎ@mgKN:4 RCGhtm uug2jM/ x[p;?M=77s]8vM^1?"]H7_J'lSś3>YwL5"U4*\O7?"2U g+wv2h쯵JP%|0`Vb}r~~g}76y]lB2D\J!},@Q"k|eLHg:;F*#Y ]~13*'ya,*1M%}i zP,1rWW*(c\!)Lt74htl7j#W<B͹= @U Ro{:;@#Y*1S!ȃlM;%x}>ߞmIІ谫;iٔC ]My6۫pl ˪rDaP̳;>>Iji@RԲ.ܲ$( #tٚ%7&xUJaKd=eFb4mD*W9B6B>-7&n:*K+aB4VWP^.UO tYNPc2r=yѧ:{.%\zJ*- ՠ D@k+3=KQ K v$uO|/“W]HI(4W>яZv݀ݻ>  Hɱ&r-jZb)t[3J/W'akG$a+'ẖ̂<8@͊DdO3 :Ћ3`!FC[EH9 [X!g4#Ş4=Y#h8.XY//gguI`ZSPL9mtִքV&dGKC~pp5 )Ņ<4@sΖalX )nQZXVv,Y ħJ:b&\,{gaFC`I%:M(7~2n¬x?&!\_Xeڣm T̑Ж쑡`oTHUZdȼ  .yHTf*?{m|h'`+[vr-4,Td5%K-.7q3P \Q]ptkwKhׯ_Ǜo ! 1` <~|j8 )sΝ;xVk{_S²?9⢋H͋cIȊ 4&ѣ*PʑR0Jbh xqhDq:48::.UӜ.lD9DG (T#scgV>xј=}zG?~1No,Wn`:>ye\v&p-N4j1gd}h-9KY~< ϶f@!z6Ʈ/NU[tb1baƯ<;1oH 8^ہw?~ȿzоwW8b6и;f?~컸G"DFh%Sח̧_4){<9̨ Vl5,>.8}=R3/ qp/x}!!%GkwC,F(L%3~u[g 8 ;1xAXtVt5L&{ d#,xSp^M9AS5;5.a4إTc*t]̅*ٍ\Z!XK@ɪҀE:הЙ>1{m^ۣmpNZaǡn, Yj{.R<=! {23+ߦU B#8Z?jNb\}kB;sM E=ޟA9ǥsg2#rflnh9Y7".Hi*+ڝM6i'4"3)ɔ0Q$J8Ud>8`!)E y3J눡ԺC-Bc#4$^ePB: -wm}^ۮ^@:{MU, GfE??e$.ޟrE~{>“'g!߼ k=sLf)j6E2n"6]xx&,lb`ԳFKDhL`ڨF0hgV >'ڿj%U Y9&!. ֛5И ΕX\*ϽǸGO_| N}$Ĉ'xtz6(C?ӟ_|{@q7+6af!)!"H1b>ٯ8qPDd_Ǽ7C[&}]IT)`n "6cQhN€ܹ6=SWPifܛ;ܾkUAPľ~~_>vܫ8:vWՑ_?8Mc|֎ȗ4x6 8ӌS¿qp}l3D4G?#gW^h'?o[$*6Śm[7RGlw6 NA)!X\QApEaFj_,۔Tt3}O3!|:tr=oyi8 5F{fy$~IcPZ0".^jTNq 5d!Rϝ[e  2š7;_e%>%&DJӕboh!>E*s  Is&a}ZZ^cw"&) ̪^-m+DIP-5eP-hnz熭 !΁ZLnKI11tgiA-ZݢXWi0hZ2DqWCJMxA'%N7[WR0w2kt.Ĥ8$"0$1oc?JsJa>fttn|9檅 ս4. Ɉl,TLIhh_;B)5 |"k2rޥUqóЦ 8>!ou}'߸[] r=4qݼv'S}S3ϸ+7_DBĩN}ƪ_ńo?笝õtͰKwi.6Z>ݡsh̬٦ks H)K oSW5`q-fȞInH 0oAwX.Cf̭iXLں1Y14Tq 8&m\򤑒}[$*[0BtYpT6f:AKDV`&Y֙la]ٶ##д9OC7KE0 BT` f0R2K`|f`F4ؙFkvc銊U4>vXE /}-),QL U.9TP5/Otyct[O`L4^R?4hMlBN`unJ UWI24%Y]#^㰏-i8Mο'4Ԍ)ܓD/:)2}⚂Z\}V}!%%D[4 3t(%š;Ӓ]\! lԘq[x~+|㯕PEm {M?# pvvQof*BbqH_XDŽ�"8\ WZzVVj ޙ(X@j*% 7|ohsӠ {LYZ\lC~!׫5i@J-?!qt fW wǧД r~#X.Wo㋿}~¤1(NbPAeh|MV}C\MDC+UNw4v *OxxEg 終 \ .@iQR`+x5w90Cȿ)?{{ac~s:# _Մ`<' _e/n+XD'c X r§, 1=pBrZ:0Fp0T5SA (̪2(&"!8iV1ah_cX CNϋ$q;vK/iFnE(IOxZYwNKh9I3!Ab҉I\_iPMZ68O ,N%4=!6R[3ˬ&23$+[J5*B\?4^{]S :jw?)]1Gسup9OP0D&gaӢ.tHd!RHMA75-y:¬S:?A6٨Qf4M1hR8 &\B1s N 2NTJKK`\ގF-|L!a7˨rbГb8/l3CXd2('VpR4 )" )HدRKڼ؞-%l,ww 7ԮqJiƤVj1gR׵*Q|7AZ#hP!=hZ`>ZΡs2YV;Oƒیx+O+)ui^RSJڛl9mQk!S-TmfAa5 jVcܾ_=9$ 4oHqSM"URܴ8(䜴܋+PPC9:v-I7fn"AcKZ׮ڢrlj |HcDr2\ _`dJ$Jաψb31b$%k> <.;h>. RgRL %i;C\@7:\od3| JE'b$YuOarZYF1B-G}H##f%sw(c>$ ѵ;l7T1E { NfR!~mK.0],D1<,G]!tEr2 ie;x~ \w} ۏFndb&ASA :ѡpz`$~'p}q=X@.ecdK]]ѕ:#1㿓al6-Nc>s iι#/bJ2lSЋܻOg|;D >_~X~C?QlOx8d|[QR%>zO/)A% IDATBrh!F6i@ 9X{@NPle+{Hbׂ`WQ0mS/ǭL K)F;~J9uic(3\yœw5Z5Ĭ22+pμhiAb&y3XҦM U"@jՏה"Ӥ];I +̸B=di>'w<62O0 & bK;ȐV&$ 3M*vTD-C43PW^{Eg9]D@U/:5E8C(r@\r9+HntMiWa9x^[7Yc֍4E04175#W<=Ր(c՘I&o% L 0ӣ2^:pXPRifcւHG.z}VPFN?CUnhfCd3o{Ednn3ov6/&kTbeIGT^25e(t+ a)&TEdeRra .}96kMTսp{q3ZCXp*MB)P)lh=܍"[i ̎Sݫotw^;] ` a&g030Qꄌ5iH4s\,`Ć=HZbعR^c=ٕVac (K7g NoxYbY.h(0iN6t\*wO*TUabrM@]̛{h69_۷vX-R/Yz;;b pMma0b QIY]Yqw' 9wDX8sU*klَCVW(_q SP>~"VÏ_lxB8AR5"i"=6Ol XkpKb>ǵk޻u&[V'{>3?Ug1M[B@۴XXƋhG}][uSU ƌtH!BcD  RK⓸ ĥ hP=Sy=Z墫J b9Rl(M*%Ơ8?Z1{ 6C=[y50t80+7_£G7ŒTxMMn4:5!*yq*U6 K %3MHG K7_zcB0 9 1&<$7Li4Ow(*CSryϋSXFj.F(HX٢R@JoR "Q1?)`yz 10apJMMKeߢU8Q)a/ HW P ^ֿ=Յ0dO:!RdUdcp˭QDB:n)t)# mY^g/Vg;jFҾs"jN$n˅>&Dd)LI=xSprh3?+ɫ!C-;ͺ&{P68Ag:vH}WZ7/)U>xG6"ao7?;-zTM.xa%,Yd_nmw<ߒaj@$0MtTIćbhLbjD$`JBjzەfrm: WhjK\kLv 6HUY DFiuɇS< m~:-cGJ8ffiP*9U` G2"sFri᝿2.`X&ࠉ ,ܦn! "\ ֵR%23FCUk"fW/V )$OU;A%mT]5 *7*w&IY^ei"/rY(4uറ'شB =-'+%ho189 8Xa9c5|gT)6+A:=F.]rt~O^l,[wr.6c_*U&T$xIIǪU,[`-I}Ε!ۑQla*-LOt睫hF?뫟D6ࣳn!W.Q'8wm{q@*D@ՌNx57IZYi: C39j46lsY$?,j3(14 ,r&p15E~@5j9{bD˛( 5}cP ZG`,{:Y4VQ0g\u+߲מ Egq{& dN#RÝ5""UQ0*k %SCݻ1.V+* cNPhcaza+/>+xGmWB3Í785جW6|0cRs޺ȁ͇CaG?x|C;{] RJw~鋼s$= 'guΟ` k  3xN߀x |uPUݰaT$_xXf=tpxfoň]J3}ƞ3eP(Tȍ8Ǻg: &PP\mBQNh E-}v7@ 最 8sGH) [Ήֹ,;z'@꽃!D6ST6[ Cد=T2 8Kh*,Œ^RWYuejI K2`.Xj:ЛkEs6, )xfhriߙ> */2Q1nIS[L/(I@חBh F移108{Kr 1% )PJ0 ӎB2l=UMȽS'`U?i@5>kT !-ʭY0s⳵T Ϝ-40+sm.,-$!u䉛-bEJHʓ 1A1&hi73f41܆ptbus@B 8Ƽ|& ) ~gE^3C1Vr { hAkpPIHP'f9,K!;l,)lj*& ;s7y130`j:2r!mWeB]/}Yo0 ܻUg9IK 2C-`hfeowGM?:d .#k,T6ۥy~M7Y/0OlZO$wa7ęeQ*[gV!~E烂1 ex%%ZC^'zq||;@8fV5·U^V= :ʸ kB8WE-i?_S \a1`@`0!u9>:rDJ]‹>ob1O:RlhNH9@į~}|xћ嵭5]8 ln~??hϾ_Cy"3!0CtԐ3ûކ!C3y(Bs̀÷W+g=W'n|f?#pU &Qa0\{>5a`wCf?dl2P̡`~:"Fp 4?s;O,a@ֶ덎UPhĵzջ&?~sU?Zm F{ j&q4[I,,e5B"Z )41$S 3sڎ{ǝL t,K ")r|pB,bg.(l# ha X,Lt%V8>"FG{3!4u4as;awS{7x6AoI7-~k}Ûzn-RA"R",[Nl$5֐0,'@ˉ$qɈBd+A H  bMD)&RLvPU眽ʇOUݔsЯoݺUg_5Dlk|BbKĽKnL(&35Ys.$(.׀:)(""%MIQو~{,بиC{N!sy }.qܲ1~fվA*q͓ })m/_Qu,LϞ#*؅ "| SHC`}DOדv.6ciQwof;>!]揖5}qHQBC܈ٸL: wVM;jMܓ*`7p N(kE5Z*RDYn6I'UuD \H3xSMkBl xUd "DF1q( r,8l=ZXFOrF5ٕmg6Dzz<^ 6 ^.VG@͑in}esv-"֡Xb!Ӥq=.(.Q>NQ]Vm2]J&im=ronٕt}8l6 Tc4Nh& ݌ٰb-ժ^uT@&XDwC(i"%]{Dc] b=7[0sҠ]UqrQlyJI-L$MA4 |9[^_&9;{[7WgVoG//%G\\\\.躎rK/%D6%_>InE^ENf { hN",Y96uU>hTgFym3|. e.B~+Ċ365pHw}m{w6r{iu| 3zf$--Rؤ*"1x؍^BM׽f`+7Njl/5lxv^m}=9>DQKd){V̽B . f}ML#:gw㜛AHRm2x<*' ▦ϴn}t/X]C"gjKYiev<.})~g0#3)n;D {RTܼ6J$w3[W/}fzFCD@{bØ-uY֠NB6V# RcnhU~A)TZ:nRK0zB8ppK˸X1/v;kș`քm%D<;AkE$B貴6{ܲBDvn9v@uV)/ ĕ!hg$1ϸLjzeΈ!Nl%9ċqHXjv8~c/эӵA]IMq\l T ʞEl7PsIJwHY[ *I,aUWETf^eB#zUy:q|6,VKjMb˻8^a(9e*t)-sFJȩDk'J;ŕ,^e̼%,,2hŢDEN'zvX ,%?F&8a2gc1fSy:DuT;+߲`މcغ_p/q/U<rn w H=L?myWywvw"Zb xr!d˹x|JA4/\+GU5QSr!O򁧝ozx_?rk#_c_dy<3 MK4LOmnyrw h QP//%s 3 ZZPVx*W~$744bnBˢ뉪4]}?2I_g?EdTCfF\nKL !]psfQic^Kӛ\ كJS%*4&fN邸ebUl8rk,.66\eK1'][xI0Rn'BJ  !9wW&.yak;ֲGHxp_qÀҋe'9*{w0$Z Ύ󒰄gpRQvN>i/bS#QqTRBt>mxyJ&zzuR:c 3/S!̼* IDATV_qھ],Oy1'q$.%y w%ViITXѧ];,0TJhT~HŇ9V2g;]axw0{_px󖲓gQghҎ2s~+-Uw7pT}t2Q-\AѽݾK\nX;g A2*2%7sA7NWfѦqSvuvWm4-keiKV3%Tq+[W6>/];Hmx%qq.}nasTFĊE'ɁђYrxmu),DJIF=x.P 6F6&dr5~~o?G;u?SO=;v-_POq,q(/<`3[W|[ ^n.+qr :HJP<< EqVab#WWe⅛E )cQArjėLpeGyp/}K|ccsy|4ebT#!{wѧpc"a")YDF/ӿN\?)Z!j,Lo'Lz_.}8i}Ԉt!0NLf_;Y-o8|7_G1!9X6^4Q#N rX\%Ȱ&` !h"_7_r/X :c$-WfLC3i`z/%Ħ4ێW|D5RduE=A]A XW-I'*tvT>GcUߩ?3CĽDiNȖ̇d(.ڸCސtUV4ܽLYNL9\z eߙgIl\P쀮hNG"HBՋ{ ff;L]fj_oYa1Seg|}(wb5y40yvs jm[.Yul,F5Ȏ#bGxխ 7DB܌SYMN j 8 (ܝ_֣ۍ.~u.PMè޴i)3*jYshtvyڷj, I2z/ng@];Wzgq#% [DO江&tIsŐle^4W&mjGd ^6l_Fvk_~! |"H:6^οtR>-wOeK7O> Ow|#QN>{ϔqڱ̒Kc_ww[ߘg[bnѳ4Mۿ C lg%$GZPb+rVP}NR'Vwp4 1Aʣo[1s٤WX2m__sdk1 ˖.dl%q0s!""eh%pv F1z9.~iێfƠRR/6hpє!зǰ:.֑/IK{S.Ǹy/U^?phWA)gBӸh`*'U]X_]ќ7Ém:Zy֊߼2^>;,6t0 zɽa{)@BhvKxCzZ9FiE.TM!Z'KO vAezэwJΚv&A'Ϲ\ʥ,Ex$)/^+ U,E50~`Ē 0 9X-*ocs6E\,eK]46x35mYQ.vn_\BmЙpn4W;K h e9j'-Q/3NC#DǕ>y低#P<. 6?.ηp÷@[?hؐ<5a'usϿiH?~3 EG$xl%q@cTltmC!B4K-e$B> mJL MЎ}ק,%u|# {k>?0*g7khZSw -$wQQ5JɊi[HZ I6E|Q=ꡅ5&H,BVJLV|rFn;AECE6F cy9]D]]RAnm\ݬ:b< W=Grj^ݐ](نFyrR22(LJx 6-7e8See\jƆϊm\T%qhD*$ۑbUQ/7%]<4M@I- _Vy7t;B!zVJIpks 31LnZdY@Oz&8O]'yo7/,%@և2hUJ@arcJtƋ4m/[F^Vlͫ4ɓt: )s9vu >{n4%]{;!{ιH{yE&EDm73PD*]H5d2^Wo d?3Jz2o<_-~IVe6q6u$8lq¶؜{*he\υ<{V&]Sd-LWAQi>)4TMI?8H?+ŭεe\1԰xOܹpޢOR1|o,/_oR2bqnɍ\nd%g ݏ9=.|ѝvՉ>us曮 ~׷( h)d*SJ \R5V'!XY b268FJɸb; |K_=D][\s!`!HE9J"M4 DhSfʞږ{y|իW6 W^}a1+B%adյ>^ fG/pqeٞ_0w?Mfu|kĥ+Do Ml.5TEqU,ۜg=W3=9)4e37rSy#_ זϦK\OċϟF/^ҋܼ8giƭiӸY 1(;Mʪi7Z)bߏPu3Q@| eTx ۇ/3R$Ln6 `UEFuR]#uaY҉ N:;w=HXF%g[/c%󃈗(s4cno{Wա1fOg$1X7 !G^ 8JP1;oW*IȝRE]>Y?{ ⮒Yp/Hށ89s2R]3#o"V\\ ƢivjڳRe:͏7֦4Vk&/&3V"4v 0bC\V 8 dFݿ;W?#|C;;r5AD!p6Fw LwnREe?=k?םL(6x!ҿձ^9hCW=aѓEPB9;jB6bMX j% NNydr@N/WH[ x7Fj<yn:=iTiȢ 4U@X*#Na҄;xB7Dدc'F&Vբ*-~y~9'39K(NBDi[ns6Ҁ(ڵ.HBt Ll0Lp#W@Jhb$.>&0)1o߾{_}Iޣ2_%tŦ1~Op7K׸uvC#)*ؘ!g#Ulj ɼO6\h[-+OQ(RbxǞ㰨1F! kHԺ[ .V:@w䣳z"Mk2)M4 sl5ҋFmJ/c#'Z9Z_y];+Ãu^bM+׮2۫rOt"xn{&^ub$Yâe%lk 'X-6^w%"TO+K̓䡛|"xbC^7˰yBf*`ENP]6ٻ.qƌ`apWlVKEۉ@\\~wNIFM!5KvV!A2k]lt=բ\thrhOϮhw/29SfFv^jIFqqT/Ϟ67cm6M uAbԕJqpC]ݦLӕM)Q..Wsd2kVNc,މ"FfiUߥ͠c?EqB aJAJ3h)h A= 5 "DfwQhKi3U<)bN(]W;?׆$˕L1X}Z\jzdm9qhyby~!3fhBtq^#SʼCcFXϸ0gqkJڶ]l %6!@B)Zav%i=gyq(v-&ӔmRiT 7aG9` *jO i^D+p3a\C$6lE]5ІblQr`C K)޺TՑ<%gMUD\=y46p8*']ðR&4paJlWl?#WY.Rq &UG\Lݴi4њkA"@zQ6q(W$b* HݔA_ y})Tzbq9 bېP ^P?XAB}.ĆxeˢFHɷ4}Elg#M&Xke*^;\|9 SERvZ1ۛ猟 /6Ͽ=_s78q78>=c>w#ٔ͘Y#bI{C>k/qvHÈ\z9e!n7n;I Kڦa<'N+eқ2W4!@hءMW{Y"V>{x[9Q#ØqqK $ .:9۪\[YoCS"6-4DJF*S-UPDJu4Bi;ȳX,si'Ir㚓j4tM4mdQU.4!v)'BlŃVKۙeR3s>\@zxE6Ἅmam8)Z p?{>ȖθQw aCvVI EbcSe.!#Y9&fM][;DOC`` uEX3\[WB.|U}Hl|jk4eFF AI,X.)Dti%K WJ"|ZG90auesSKDAP^"E'UzC/5mpEvuԕzoMa;E h&GJvF7F0+N IDAT)F,@p@lɵrg9qE eE%.i<{x׾˾a/y/qquh\$bpփ7Tg<}d| *# ˆNyރY5tkŢUo W^O=qwEq;x`DC@Z9ebiLI,Ms|vTiB$Q9c6v2I.eݺlrDeEUqRE39kf)%u/vc>hpf3r;d:Y?2]7Xc7'hJH'T+ŧDzsUփ0N>M)TډlCV=(-"!澫CK)e2;6WyMe*v"r$M]#tgEA2UMC828x0'5rYld#xD$2@@KFY|ox SNTQh3{`x[:z9ΦB?"h=>lZMEx:Ep!^񜜤8bAF.D5M9>Ԍ.ydaBhqf{Gڮ!A`2)e WQm:'g&Jhq8jpлhcQ}Y;xe_9w/Y3 uf\y*i;_Pv;RS"EafY{ZdV>5كGmAV9{e=X5pM:%fҿCv%{>jH͑E=WEW_< bo=Qٟ8??W<'Rܤ aW_w~74%No_Y_W'eƞ"}{^s]~l-mɉ&}>O| L.۷;y;B,#H  }':Ub68*xd82VJ%9$t΋תli_(NjID6Ӯ\--5/>\.zsjŔu=4$Ocj.L(mWBjqΒnnS"L>JOcptt,i-INIfv( }U$7S]mZhY}{k? LKgkK#>FR[O?Ng=}]t|ɲX2L<srݿ'mX蚣 *KZQLDBͰ ;..߁jG\1Ѝ#V))G/Eskc`@99xbM$%%fmio 2}b: X7RDF|CDw\GZĂր Mh%h#nUP7QPf#nܐEHKtɕԇ= xihM}[[ .۟=SQ${Γ zDwi9 -se0Mq`4l@ óɼ/3۫xCvԣ!SPIRBxRڸԎE 3@(uꕪDy_]@!Tg[6Y3ZxB-@Ҫ☬䤁i6j\GdZ1 M/5j҇rv+țT3#tG 4{18rqqk'> ~g'B# RBEΜ_?uooL*<99Qk~9BSJ^{tqud<;9>:,Ӆ^gnNu޼A1MP"T'*LTRdX.dƔR&+s|bT5܍q*1cj -kDٸ}QT}/aGVk-KQo'OF $~q,S.**M$Ӕ:61pqqiyDB[i9Y.Xv-077Od;mX.p1>خϹx c=b\v7>>.$ԟ|)C.!ސ?ZuӛNnKSF|ח9Eоc'Wq$Ҕ:Dsccε>eJ9\s577|Ò!I\> 'ӄi(HP4ZCֶ&5oAvԯ̂?|P;Ӱ*{yMu7|~ mD$%!PN`4*lQ#8­ S/@ Tܼj32lA-RP?*SRJRU.՚,V0?XO3rɶKqllՠ:<2;hÏiwޮY~W'#k2[dT͡jyY0-Ďk[\do*t{ |QouxՋDX'5%f຀̳޾PPI`^ݑ;o]th=VdK=~~/uVȦC H^?7ܿ?yxһg= ,6 U7ă_g^~rrSb 1D Bnٶ"lRA1vlePй#KD\!傹8 " 4 zi;c69y)oG/CB`jMʶRE TԞ'K(D"CPt-SfK%rʼ*fd(ӔUiB{oO?e+wb?_+Н^c>>y{Ov1lG_?|O{=d w1iDŽ'~k^| \=#^7K~lvwy9e]NG'΄Io6Zvn DkiD`p8ms9s'oﶧb`ar wE1Bm ;ɳQ "6#ac2yZ7t@( Ё՛q{eەX2bSt&=i ;rBs,Qtp{“&K]>JZ +ksq-U;(ﵳsqQy@aȈ>a+ǐԎd8tjh0jHUx!psHtwK"ϡ?"z$nmBc0`Y(\难ꥢoD;x &G0ϬMX{ߺ~%L)TIH"[%7ɐkɜO`I&GMcdu+׬' ۍh2A%(UUwg3EcXjЂXf0@%EJXlěN 'n bt@OϜzg[oz9y8yr\]9zTO?47N1:}DkaO>? TW )C~3pGP/K:ϼ5lOGpίc.A %ZP 1;]AJ7@ 1NdRZC2aUՈTשH%3"Ok^D6v;)% twv; P\ iݘ> 8~n: 9ͮ! gzƀy=sE*P4"b)%gOK'$J{7ʗ~=8?׿lw/o/z0ޫƄ y\7N/8lq◪ak_ix\_G_^3?~ U'ET-'Cq[=})I_j[ u_q<#}YP|S>\W7@!ѧB?ɩՃ$%#ZFyT' w/t(o cٙ8-S}Rʒœnd<XtJ?xQa@3tHLuD?{yďj@U0ZX){TqrgQ?o!ZOxa8 q甸_qztco Ps)+fM9>zCǰ1ީkǓǎ~17}} Q.1z8(CD;bq|zsXJ+ x r|_GkεZh$ KB%)AXH0W"m,5ƫnJ<[S]5PJVl^Qקx;l; ;ĵ3R-nܼԡ_͓壯}575쿖IPc6bN4A)&,9j½#fa>Ò`6g>A8kȳ zd Q_70Ya,X@AXBtĸ9n-8unxPKsP&lcF)fV(JN+Bk֏v=_=\XH˯ݽ'.k8P"BP gC%# 汁$!JS|MxGDȎQ[[ n8\#6(T.`TS9 J\ f-Yh+ܱɉoBLIr?Ӣ ՛;MHqwb JdB$ 7o[;pvP̈"HN2]V ;F}ݯi5퉫!ktb[=\R0̠u.Cmb6exի=]9]O]szB`U70r^kEou bvEv(. ~z/?| /=^ ^2p=d[GO ~oq쵦i9B`ʙ╧e9Y[oRP70 wmNx5=NGǑjϜs=ϙS`ɐrι XӧOC\1 CM-  ـlʂdq_>{긷+DEu5丙2. g\!:uN DP!SěݏƀG]D%ϰ\ڜ\@.ŸCwCtdE5D@XkBKc.ഋpQ<3=/~WO~orq)Ŭ@DityΡ. UM*F~ڽG>}8+5.BtB :nϫѽ֜'XH+خSk!KK+V~E|plD4GRR)ARSזm@tWS7UymZس 9ONŀi#̽{SKrM](e ܡ%t^xWN˵m+UJH+fjUj´E#JokG#Ji6^Z!5gb]AW;T9ꍕc~ĥx^wf~`DƋx|G3Lx{_0q=g&bt;s=B:L(f̸ 6"H;d܉"(xO}s }9A痗1T[768b]5 %>+Ńb.!x*\Djr̜YTza Ē3A~罇[_W #xu?gK]| C!^a$ =EF1ى{O A! ]20^ ;:+|U2|5ϾnO'דHNfDOzKFp;ʃXf-q4swS9Sq-^taesԣe[\h-9 ,Je%XȰ`#zKfxW&ڗ0/Kso:@WfUbĸhz\ՇxxT9^O0{ݕV]6unҸLTAz$vw$v'DfD B+<;.+ZNn1h ]G]fΌ6P'R T=,[/Q߈ DĪ2 `\' I7 *:2L"TDF3uVlϿJ |[YMΖ2svs\&K0I5ҀMEVGV2<A"+]O"E"kᡝn&n"48!jar0[!UIxc:].DjHy4`@;i !w]F~?,l@*Q0#㧹cS ~u³1lTmX(@ (Lϼ}U'Pd+6#+-&EIl`dCRVh'5pwYpVjHmtWbv<= RhJ7f5%ԛN0.-E͉޵Z4&mDk)FhZ5|+t=@t*Iс1=xjmҮ\aA@ԃTY ͬ!j44z|J!miZt ^s0 |]?$VYa$2 [* *ZJ^mQcެU VJש! Iպ.!"\2tAhd D0PIU]\,7m%.X]RO̽"p'q@GFx[Z Z#-)ɀΆ/FR|v) 3@gBk{HXl w1I Z)( "+Mi h FR ?9EsJnCp7\j~RAcF5`dt}`?1bkUgsۿ]fn7w=Ÿ5G:mGD!?G+1UO| `9JN\[·~_x|xpoo|OcDpw9LAZ 9>Nz4fg EHrJz++?503(z\kulBa̧qoo?ɓC̞.D Ҭ0XK;L ] <#?J["Uu؞`UX49 '.޹stJ }82S$VF0xp}Ʌ%/#vSɞ̑E(_wLaZ5>b7x_GT\NWNS^w.<5Nܸ|t\d+UU `NP`qsX+}'l5Ypp1xH+Eu!beb 8Fqh"\c6],D|"T6*qvň3.ip.`rW=z, /pgTR 5yJJ*Լ@-(M "2_M$nV)G>9: Rg|56Nnx+F{_9;)f-pZ4})_WL#:Tʼn-z!D(1fśmuݿBpz8jlHMxsVbUmd՛'@ŠS9Z8]HK9LXwK lbdFF{wzyjm9V@ld; 7+7W-ճYm-iNAY!~dRцʚ*%EB]2FbA#Hu\/bEYY?X}@5fV=菞FQζ]|鴾wG02iV2!R: a.*+Ǿ`@=T!Bkj5TDg;a//Z~?/㷿m߅Tz_ ':T%*__6;ѿ }$AS /=Ӌ#- G1opǏ}/?{)g VY6C1-#Dw=qZ0@ a;Պ)}xlK8AZ툳uϼMsHk TF {tZUuzZP B($ڻ*Ur\γԘv\&:N Xg#]h7s8ģ{ OkcCWۃ_KKq7R<@u2/ sLSAPKgH&Bj%[謹=WQt:gZf7UhAu-2EZmFz J[4Wn]Ot[ܕP{=Ou'!m7_V\uvְìUpd+Ҽ"tt<}0A':Ib]E?cer{EH;\ˁ2g,9n9Z?8a"'nt?.psD}a?S0  e8M03mwP"ql{gcK)80猜{ua.&)p6':\41X8gzu`vqAvCc< 42 U%T0kf05?W77bSnq+w_쀵A 9Ì=B4cbeЩЂQQ@ea62_A (B8:k!&3A(˖914loUe5 qkh[ˎ|PXJ&U=8uι@i01l!J] f[Q% eYj<\?)Kq<~27߂wNJ~Px5Xgetܟ (hcuZFzRMjY:0ⰛGih1whӦ ty$W,>^II8rpe62n g`ƙ c'Бٯ-#ץ-@z'&913рn|p>}ZH}@!S+*.HHμ@͝mrۃ`JtM*yMvj?zӳ0e1]ێX7+c}dJ.UӸb=jVo#TRGa0i PbaЩII6,,\",.z^y d DwCNД](dҽx٢GA6`b9iKy?ԫ#'Ain7/eQu޴@:6sP %?*l bw20s zϨ yJ<G;2eJm5/clvtQ(cU*%h$)=O<ĉfBT$f iyyDww|O`s=.!9]#3`Q)!ukTgo8EQ\tC424 -/./Z73TpǮSr,FCx"G9T7>큛-N\,W ,9 6;T1pn3?R0_CC۪[dY!!@4v] [~: 1d:c/.e_iJ‰u bIJG&!<",E>PHj `3r\ uPDqL{5 jY";4LpB_^rXrxW][Հ\xVJB(Uw`I OP_l+8UǓ3KؒN0}hjXc B$NY H7yHdMt4ui*fXBZ=J0{ {xjDUx[Pt gСD!0!.<tb>ʥ@ua(7\na/#:*,lK(FdEQ9?:s4έM<~V/v t'n}wTrlo*jЫ ÀY4p/xcsccbyNs](V ק([qqv&`*#4Dh͠*TR*[Bdm76sgZD Ovi璁@ 5cuf3bv$+R֫,*h t""(fLGdUB -Ԓbhv[q8<{d BR)c'R KK0go]q5` e;WH/]yUfW#g} `FىqoV&TM."r_[s/{Ifjמּgy!Hnó-b&"ۉquplEN˒o|t%:ttnjEgeO+hF.Ncbz>m->멏|_m ;-KpZׄDj!>5]/@w+x:ʭ.b=Gw:JP0R*F~9Q3 -kzemqUŝqFX+ a·]ӻ/|ޯ鰻KRB+ F8cu"gFf$*>;=z!x=ob %0iX2d_v[C;-,]o8*'E@ @PNa=Sw~w nEUΤrΖ(J{sK%Uli?#Oe_E4 ޼`HPhtҩx,8; "`n(Ok#t)Ș=tCX bd«6f.v% 庂ts!`n 9%'rF6s.D3x)ǎiN褣CQyUPUiCChejG%R]2CXiBuKWASJ ,gO6[fKyB"tL._ϊp#);u o%rpgq8pz`u<| ˶Fxvgxiĸ7U\fobSPM4#Md g&(JmVEH&o{:躞" e*v keR-aAxh}M񛩠6g/io|dǵׄ,o5@$VVlҭaj<ƛ0ouIČMPDaT-ਏ:B&u:`gz6@JXQ%JHa9YCFD܇LBaT 𚆊 IDATX[Bj{rgT:&CN+\^ie@CϷӺ{gy_Kkr}gwuZA]KT+OuyB;@}7hY&digDuo@U֡/T41I3JםG?jV}ԻV,؇`G @aZ!JrUlA@΂BeISӝp9ӗ(_w/@EXrdj.]SN$ }?t*#!r B}Yq6\_9, _W33@m]k-+Aapgyq :z- ]&+C˃KMܭcVj|K7 ]N*ߞrAh!?l]I6Ue) %=C'OusJVR t^I/!UjQdR:+O 'P&a"twqOiNJ!5.&Uou)@*5 bS6܌c]TZ C3y]7Ͻ^mv4Z J.u;$(B1"):ݞָ =r1i4XS; BX>d!_8 US~,CE 1z0!@bt2^cPBHm$}+BNWTsp8ٗz.6K$w5%4JKsWo _ơ p͇motniFJ3׿d BKѳž͊P͓G}̑ ݦ2_m]O5"|KnD=nFw\nuy]aq +\# *= u!mz-K1Xk}dVݪ{߽{`l A7h`%KѤ@,^BXzx}nUݪsk9hX{̛naVUWX"F9L31ʖ<rocU 'jRm[uG~Q&t39*xIK}=4=x7XrLwYbh|m?w}z{\hށn47⶚ߡe dN#-xG}Dz;$1ʞBp(F^]ԘF0h$w!{PԷZ{c>p6x^fCl}ۿJ4,Sʽ}j,MhGyx!(üTȕ';r,M9LhN0j7FCܾ]%{ż=e7<ί o|N#&X1{N1.B(V0ŲHB 0| t՚ sm "(Hw椓ؚh738ˊV0&"˿;R:luk j`@о}?7?~HÖPK//ضOW 3{H9|&u2c+4ç^K*3V/:$e_ 9dº`=[OOZ)=Tp3l@6&\@l4mJSƮᔠ<,2V·O/YMcY˭d'z$Z+,}lXCX Rw{ZTbP Wk_Hcuҏ<ſ?s Pl}|$O~o}>W|uTy8?ow8u)Pħ78]NPx Rn"\t#7(E MTQxV[vfsrLB4;w/[hKDw=+{o㥱ʉ#Yw^ݳխ,=\P6<_ݷCs 9ɜ{oRAhǪZm,(tbT;Eƈ܇P{e6GRrմ*RaxKalOV|@݇\5$w}HrB^wu慗_thE8PHX$YrN_s2>]@ 3$\v=Xwm>GTO0Ԟ9Zd`̴2I 1|9T_ t<_΅ެ91v(X.GiMn^fI<0!׋Md8+9`bCj̎n4Tū،AОA3Tᄅ[2erf-fl9~OfVxSēk-=~-uy}ME9HbbAbŎ6FN@#v0/iW8[ʘд@*q/̧y#㊿wG|xG?mahUۻ3yA_{95b4I=h?]ǼwZK@e!<+:O S !am ~],ϪVyfA'^ٶ SХpa7]kgƶݤᄧ`x<6I8<<`M_GG߅Q:?nK_P m;>c%Ȋ@D_??n o?XA^ 'H'ad$Jm^[A`h"5 }xׇղr%,u{s= ')6ͬP8.yni^o/Yԯ#mn[Hd2 ёv96HdwyHEiY+LT6 %^O5.$lpCnEoY|ћ42JYȸp5Ҽbh=N˅LUK\b곡k@{L6XIg@TuhށPXaZ]#$"G'df i*D ]W'^go@lf0oP /Y<0AlKjΛ\`|Ҭ0O#vnJ7oIJ,XnUꄶm3ZOӽ e(c8̇; :f׮;&wNMHD-^lLJYq.-͙ǦoZ|Fpe^6ɟGӻްNFRthR݂ aB >?i/vꕀ^O'v#1HþhB_7O/_Oǯ$@+2Xiҙ?̊aڒ d=@yŀ~miOm~v@tlKzDah#ei/Ym{g?W>"4DGt0Ԡh꽫_L`[~ b. |%˹o<_P'@p UCG>R`+ċ&j+jc {*36.E5Kb+]5`D4R%)q }%dd -όgiJ P0rv5hi`?>[ VqC=ZT`YL`aA0z8Чyn?VJX. nOC ?:޾}ʌf^ wЧ{JG r9cz8!5o//gXp,2O{6p :'xۍ}ڶmĶG фw/ha>!i&3d#Q|FpD-g;w Pad0zrwF/^ s;~QO)ım}Ae>*bב8j_$th0`GoXN.*$URCtG4`֣5~g۾.ذ&vbbҘCq}Y Y aYJ4!@[ulDՁS}:JX2ibw dߘw}{ږe)a>>octR?W0oNhcP40EvmO$߫G-6OSah T:LRCΤ#(&D#]JqI+GF%rT["KJc$N3,2#RacQi\4UT܊UN>([4 Ԡe@m]טp-&Pfuqvd{8+b:So+l;3@ Eڶ?yy-WZ5M3Hp3ttX_. t>Yvy  t8J$!u1̐OaUHxaY`wrxHRxCaó.7<5SHa^'ERp(enrNCBP W>y%p͸ܥ=)b7?o}#bͼ\X_jv]cGH ܲk]֔@*CSN2 Bi, Npu=WV^iFVvt*fՉFlaFX&F7AF^c *3(@ov6vؾ538m0Hp d>z9jP~ Wn#BNGGhfv`tOoT,Bgn*q#6X 3v:e7Py9n7l* /YRf_܆Z)@7 M/}4aSo30;M'NGS7ۡRoQ~;Jsf:^(5jJ:Uȑ p\G5B-#|/ohw⟜02v{}Fr}U2Ss$ʽY^k`6ڰvL3JC!fI?RQ.(@3 Ktɺ%JӄedoMTڶX"8٦z$`c)5im`W>:b{O4`dVurg4v"v,q8@H7w& _ph<OX_ZV`G=TVVn!inۜStDS5yjP,MK/=I,9@-p@_^*lZp vB([2cG&N;yF=#饠%]BM||zy;F_ N_a:!ǫ܃d{  w w>}:+ )2ꆦ OSWtU)p.4&'7p !7Bk)8λOZL7, KepdYVIR17,?V B{;| (-QL)MF> .mfKg‘w}:rC L {Q ݊g-)'D Ck#: 7Qb!i("X9my '}CXR7/7KD \ &#x)V5%{Wv-KRJnE-$FQ*\@^;@p} p9?N`& $rdn0?6Wk:m0vH!4t8&Bv<]qBf" 탎ugÔyyf"iNel N/%zZm"f|I9U0c) >v^RMhL|fcF P,On4R~x'Ⱦ#=dr8e9ܴ])Ök_B7iBo=~?݆",uF+ңAV`-˃F?:2t9Z(c#k^8M&wǶd/@>} TY,LyZ,CCugky%~ص[H"ˬ.ǎ-X/a|B'Rp#>zoKaC ,N-bA"*mi;b,X/F &_>*E\mkmKzS!7Z~e~ZQcm,A[52i,r hUV{fFcK`P`ԤᡗL[BeH$ ornHRK|h8fWvpT;SG$1 Unu| ,dO,1v֡ u%*aeh =8R\1ලMTQWn[q} @Z\6RİPbt1=USkBѴU*4Dre^"5$3b.e՜iմ{H[D6Y4 ^ݡ IDATu^695Dy{%0"KB>8FZ'[DT]3]w2zQidL8oC]!Pɶ({ n,lK,+_uu|IiM~lu|q7^8" DpҦy" m3E)"2t-zLX/ h7G)&I3*|HRa:bEUp`n;G?vL2:ۧk=GT@z{-13S&ukXh|}LWa1j'1FȲ,MՎ hذRv4t+,ՁHI/q!_[Ϛq}`ZϢcj>YX$[[yTgü@m-U*z똧JIQO/^?k5 xHG=ĝo/a ?Ha`O'ٷm}(,ޡo!Q|zc*# :5+:Z'@ tXg, SJhy&?C u Fi__*-9^u %NF8@2v ˡOsb[ݺ}Rzb+˦fz~CcFPd燉W #7iLx!^9ںr~^b9==ϲC<8Nfnr$FUi>uwZӨw-EnEk4є4-'>7S`ed"E&,K.D#yjuWDy*//9z ڐ f7QtGmi ,+:װ;oBO͛?lg;x'_}Co+o+/T\7~9@=#.'+G7/FZm%kZIyfAIBbHq iף> 2r.u[MEyoAC G*^5V }MPw"N-L}6>?Dϐ Ѓ5$ 1o\h?})]|^׮hW!e ƭ (Xϙ2) &1 M?vm3a*A\֣";`k^@BTD?pسPQDĩT1yLҁ[uN{5w vA1j.X%NDl$S42eBb /PjvgriooTjbhaG=#DeNv A[H]lGã!bS c*6;B[W_bYm^|NKB .nHFt,喝(Цg1h/!VB[QdՌqgY}0lni<2[scgrCvzwy9Ϗh*?Ay֐wD@]| [ڇ 5o@}k/yj5 :IrvLg@X7P"<o >FwF{6 N;ExTۚ:AC@-6n%PA!3[W@>G@hC_5`r,F'i:m4to:A Y$Z, ~"gF'_KӚ5ƾH9\PʄR ztx-(VWxY#夶'N.^&,.GpCTҾ-(*xq|ZOvhB 4MѲvq)N-Y}@!Z{_z ?hzwy@B@0&;d$NbjmzΡ6E̵*m$+w3(_>۲ëK;? &Bu#}LYZr[ wa+ aqLxp7:B\3=` #ktNX͋i~lͩP\]s 9KvAmޣwl8!RiPK5Ǩ3$3Gznܩ./We Pi9B}w:i2U ɋ:b*Xqynt7ؐ]kK2{T{A7p)Wںk[\H {џ7EbS l~ % xǐS&_K묲auDۢ= ,s6mD&ub3MuPOGEf'7? -/42?jW'3 7:G 1dv"*A\UƂ@!YhL\G3g8^^!(}N^!0#n 2OC-a{}U~MC-gLKRoJ}YJ%9ս7 %7UKȄ(! CDPP${'InnjB<6N3`(E[? ~h03jrwR$-nXk[kfQvD1M8( >kŲ.==kf͊>j<6sa:RycsovH) ~~vi<$#"q~z:мv Dv;Q<+Nv9T*0w63^Tk2w_Uv!pMj5Eʒ^! 7@ݾ@w.v5 ؞)s9[qo`7;6%/ؾz7ew, 9:nK;i"2A??mkDtUzPĄ}2Cwe.vwu&NqJfgSd!jU$nf}1ߙAa_ KHM6Jvჯ?x]1j?z6.4eY "Ru]70-Vn ӺMmby\kwpB0ҸK74ܡf|J ANW!hӲk 5:(!'Fܩ"H6UlۋOP5-8%+4O/z ]bQXWW/c~֝͏2:BQ|}gFvqlMGm(xo P޷) ^IJ: WN%h__}ffnT~:YVA,L_YR* S&+]+Tk =2WkADPPXӟ5)c5.$}u{;sKPYTnFz`sgH4SU?>twfB zVsOӏ;$r0^JC!\сmG28%=P~򓟠|$![ hNj „z, pxv^{BI)u[SfXg7}eI$iS/&kF|WԽy|XR5Õn1Aч# $a~{1Hp2-^nQ6&AƮMmط65<&紴xA zѿF@(MNvL'C٘F>>lC jv봋t 0,iubI%jshq_:NeYoP[mQ$ئU:g?)3 hmDM6@cFTQxk]HWՄb"XN?)pzpyv4d`dOh'Yڬ7:S1] Hjh'1JEaWw_ ;M!;WՂfS`V-_I+u[>}BV*D'yj_ެ.l8>z(Jmb*V0ZqaWҫfiU|*G'vPF4lG|y|^؞F`BD_2RTi;xS4q]btGPk Ŗ \GLu*?Za֍N 4j@Աq!x9,NtӵTEՏ/"9FGls9`+?AiW;DiRǥ$*w@nW߁;>X팳8d6_EoR#bom R_#pʢ +2 .kGҥ!a.61oȬ!4'tKihf;FN,la)։V^ K)p <܀XlZ'FtLsmi>0'~o^ "=DR<&?<߮^X:v)PmXנiS*c>h2Bc1waX.֗< U)g%˭5z^QJq4G`sxx(Ept.!`j&DR=:C!t@4}4aYUOޘ_;J=E T󪈿[)Ɓf+ҶUmW}!,} ehR[їy IpSoAro(ChoFV/ȾEY~X_<>=!g 7HZy)϶M kYou t,<#wuҦD  Ê~d'D&WseLqހS}ݬfU:"Etޚu8hIy16m ya~U|$w_8ۡy`q =|BZ8ӫ\6 0dVFHxSE2G_ @Ц.tbՒ[UvZݦ˩&/zSRtyt#n{kw`+/_jxu.wՊvɗhG1Í(0*1 p `.0+Ch:V@.R܃,"7C={EdP 4㶩 wdzG.!T'n ٗZbѷ~v 2Yto_Ϳ({kWV_2_P@C\d +hRža#e켹7'A {+ _`{x~qDZ4K},SK @z:7XPHZMH&6GY}Թ7(_&si2:BT.e2dfF. ;.GQ!VT~ey1Z{s=v `p #EP$^y72BB<,Kmر?n{ϏךsØs}έVĪ:{{5~co|2g#ܠY1M3j)!<"f䄾^#)@-5Ng=v#-")%2ټ;hHPx\HI$;` ,˳}|h)c]=ݽ]b׬'/PHkx:5c)ńZ1O$3HTՕH uΕLH'/˳skY]ns<كʹ0f"ϙnM=ʊ\ 47g;1!2A7iI"YEYKPdgt$ L6^Mmn:-dA]D&2InsujbbI/E'<aڶ{uS7MhX䱷)A+$!~#^ʽ|D^x+n{r!$5$Ayﯔif%L=ZAqxW[[YAkofhZ҅X `.%0ʉ6^lGwꂼI7?Lb-pgc Ȃs:6|~St΍RNW'^՝j}%wi2ΏFEbo^1mDPEy1u 1$@s% TJh)mS7:EtԓmE$S|p-8&I)`N":i;`")炢~-- HRc3ݷ}"Oozhʫ L>l1牴| eGI2]}rRrՇc@ǫ|~-mB.3 E-"r>^]ܷa제yĖ)GCVQ2]e-6ikJl f /HJDT\\L< R& a. BDOkl{T ݑyyF*Hxut=D}R\JnNDmY|qѪ2'1xW$+zSS,r/5PU:GՌj1a&oc^P{6ŀCVB 8Ǵ"ڜ2!`SvZOi}20M܍j:_r2iZ P?ϑ8;"G$[~w+o=dI2KitotA KG@]1tO}yP^ս>c`3@jKdǎ6ܶ"nhRTNXV 9dzfmlқN:xV?"8DvdE|4PhKo-QNj/GQŌŦIVW:Rڿ|?po%އ @&dm.>*@]*4e!T'EH{yn7FqA"Zl#.^% ^>V-="Nk/=B1N4qҪ{ R\,l+ "BCp-:-*+=bGjަ89㜁#zw(pqPNquxǍ7N^ZH4D?1)ӽRV|XQpBߗ "QTEm/K%<]]O]w!+fI !H@1.TZ0^3׀mjm^q5XyuBs .'8DyclÂҫr.wws7+hu*ݍ>9X t>ro XV"2_'%SD57YhP D'zH"Cd_P9Ǧ3l S}rs~a@~x$/bC3|B}zSSO5ȃsl_ϞYR,y)!M 9:Èymok.ipPuVv:O@>z[$C~+'23Q4_;fq ̽7jN6ЁFE8Ia85 >GT0,(nO;lO@|Ać#ƹ|twh91\9+7H"*о9ɤ RJ"Ыt3ut7Fr,aa)FpyOV4S =`k*Ц(m'd,P1{t=s:ctXv]# ;uEb%p777h-tNmsz;i>uqX#1<3m-' 10,CW/CsaxԄDvۋq٭P\N_ky޵sx+7.\G(րo~}zaJEB,#JZq:L4XQp; H+)UṘÎvaWw9F)oN~dsu<g[ExެX^4 ἓN}S '싪-`RA3uz}hHmOI|s[ Ekrs)^,s0x ѝ`mb{Y}nAw{LH8d X[Bn+p\!Z^]{6\i]luA]. G 6HxxMt/n8 B?^{EKK)PNb$qH2CLV4lg9__u NٳYR O<. BՄvy '[ ٱ1kJl''L%*H98v*QSUStTb]3nVh%DXھb3NlI9f¼q:`+M"{ Ӕ!iomˀ5D 4=lOiJF9R e-{߃ z*2tF .z`BmG!477.<( :+OB?}V}=v'j.؀^ 9^ԃc|//qJI&7nԉ 4.l(bGs'r B)\ADߧ Pn>1l!< λ%)q#4fitiXg6§>\{-Udaptf0'SϷ~ Qh)sO%*1rc6Gt<|>݁`W'8#|?0v\EI=w@k+ASL輾ughg}.礑H+{'#NGw0> nhɬDFx;~zt$ DR%},xQ"~qE9*!{7!:Tؾ?{d,}Kiwq@󚷎szڌsI;YΣޖ'C$*ZD^J`Fuj!BJfs)ZhD^Lz8 4౵uLt,~=r d.|_ƷJkm$5^Npl]q<ūɨpH}W]9f݈c2Id#BXhmuAm )i: S'=vÛJުjY 呥TO|]ߩNS"ciA#Rd޼3EZVZCīxkkCQ-Ik`NX-@eB j#)Xւi LFށ;< _k$cJ;h5ʧtIg+DI3܀ds ⣅-V1\5Rev=g@YⲶuiB䓦$8TKL`8ޤ{l;T|ABa g1Cc?̟/u-c3w`i؁BpWA z9zB8xvǢUV#=e^osv¹6vu՛l\88NR17m8"7mkEz Y(1=@zYY1M7BO"a0TG{i0vʾAWA:U7I߹KN~fUaQd !?sgK _zZCy%9s8,&ճW2O{l^YH>Zcjl pJ1M Mȷt'|UgIiѶGQk1`\n';aB *zձ!7sȦ t:XXxMļ5BR\㗓ܪI8_k 4{-fT$Ѽ%o pFD;}PO[{3 +WX'D^G\1 tejzY#[m1BtXRe@#C DfJR}Fʨ_2P[qDve[ru~O c|lfiATz#x䣄T/lx>;ږǛ7Yn@v]%$[$O:j}ֻ$$ G ln 9eZf D[>c׿93 oqv  z5b֭ljw`-kjxqq`+4ֶtZ#|%ݴWl+a{3/IA)kVA=f8DM\c;mmH`6c=Nkti:{Dz)HL4Q+GyuI@򤷘gPPt@%0.rHcdxu¢=> ۛ"?{һjlxs:l<}vw>.^}=v|:* 5 ?}yLKƦfܭ׆L8}C0_«ëH#}17)i!x;G{|r*}2qU%<0E^ ĂEq҂48Fgg[+GUߑjJiŹn;v7`׶ @,z+(WY5s 9s]|m%BA:Stp^\ٶ&Vxo-<3*4F:@ٹ0Czր RfQcA,֏5!_0( Z@4BuP[J8G_ـ&n(m2݂jhNd! ik[iJWkGvuY)91TC1LQů[X|'x.yk_"JB--ڦ3|GaU8FbIо;L xXow#txD֢<"UxOݕhnI5)D'X5R|@9`ޡ*07G<<66 'Hwans޻jF*yR75HR\K,e1*fnoo/SSLL;0̈kǗ&zoYkCJi&x_C=^?;spXIiÇ:buH_J2D(AO9.@ h3{w{to~!9]pJ>(3T&jd2T ( U_ެVr'.x]`zi? @UXޕʜ˵vswxd T3lmQ2:^ xվ>~tt@F!*p{^l=@ ?$&uj+\NBMҪ_N'ہ`{R@ך™"K3Ŧ)bGqpn˥~>'䧑FZgC|LQ\=}Pg~ חz{rGP2}$ -tP) S P'ǟO}]=vE֫(A(햲&$a t N#f_)65 ޝ`0wo~`f4Y=O #p@T /Fl5t7a9 3bf[f|[<.aJH6 )">g}8?~ٰ?OqG?fՑ4[Y<18uExݿ}vqyK>7~%&H頻t7O"C;Z4B[bF»iCcr IDAT<F 2c+snթYTR+QfmDܡK2f2;H#[ed>}şQDO)[yȆA.0b-mr7Yy d8ԈԲJX^} z߲nn)eӛ#'.Hu]|ԓ3 KRfխ;r ;sWwfM+uC U.dSk9p͹4jLZ' HVF1>#}x5}W;;r-rt=? ~W~ryο_y]P+/h]MqoˆH`^%A\%dNj52%:#۳Z<`!l 9qj8sޮtBOn2iM$Q4y*ɐlQگڳ|GJF֛j{Š ꌫk :C'h(5Y"ϣZ0yiՉbk=!G)pU[jBjr =W̲o _(p8NA9^ (qԛ|w)մSsn@_^;~t܅խf!78&YNp D>1zw_l[o{R i܂o",FxZs㊅2Z½.H9L (7'ñ8W;;I`Cb"ɫ&ZLYݗXBONq6^FkiBAЂ*C}ݔt r$"6NOx#:e2s ګ EGz*TΰO0q<{^AJ7D\fCX[wn).VË&XZWj6$'j߀},>WɅիYf.V"ik+Z[Ïdn~aV 4f{**`) ?12˕nS"C~<ɵ-sxg~PgɜҌﱺ!5rDҰW H}3CUV4Am[I7.AbPU8VO9[#T@UH y|y.II$3˂)0U3&cikBj̑e>}Xl ן]cic6¨{ҫu}h09D8A(Jm15}jĜv[:^,mśzaB_F&8bS'?hݟ|}ˈ.X= yo pB8<}P_Ӽ9@_pLQﲃ\V0g&K>m':%{N.u6|:^=#(*8<9?}|s"%MBrVG!ӗ-Mm\JP UU)ARv u3ZW:ҝi6e"Gq7zkIW7`FxX -f3I?<(?y@|ԍ!g[ML&䫆A9 ~XDv۬17E:HЍ"CY=@ab\qg^hؠ}$EgX-wӫgjo̬p)hA6o/Ë+⮋@ 9HWZP$HH<`[YT^~ݏ:kleyv{i"hDv"^+(W{_)TuL'h6F[yW_|9}n;+bnC,)8%k#+> Ge`=M˝{Zۚv[| RT+=d&W`О0f0ҷev 1yqPIq|11 @EBm)+޼PJsSZ걃}Ǯ8+ѐNvsi(lr|6٩19nT x^4uvS6x>4_| ZyRP*iqKgu :_(]҈$rI˂\9>ysQB׍یN)G! iYCKrh :pΪ 5$swv޻8~ǷxŰ9& g0m+jU͇{*܌!DrE'omrT?a̦C28xMc֠I ΋""̬S{hNl~HB[)^|D?se>msV=-+j9ꄸ F %uM"ԏTOM fDii鍘U[WitųWrǫ7l rCSwS+U$9@JnO$)zC%`CMe7Mbz~wOwo0ϻ[Ԝ<>>4 owRTdgLi~뿎+pC3rC Y2g?SDW P(v"Orom˿sJ9^]e]{%I#1s#"[~L Dr Z胠! } VPȝWU{33"܏{Dfu>2#=#EҘ3ec 7ǟ^@՟uNp%D满f iDY*\H0I{+Xȧ5 "1 '?q/^rQn e:dǘGPLC`V/}x>@:S$ >4D ͊Q۟44r) *R: /~d6 눤ƊVmѯ #k0WɎ׬V3pt6K,~!ӕ{}퇳V-~ZLBV*bfYjfZ*ԐyFhë&Dy%&yQ&^pHө )n#A!'$6 x.BUhLn8KnDiԫA#ZG KlecBP)~"Mew7 xEzA4uEG7c[X/iv4ͨ(~{dO +ГpW䴆cpYwVR>&*d"ִ"RWoS|>2u7n-f\ƳBbe3ۀe1If @(E Y1vJ2ӵde:뽊 Pn+2ɎuUJ+/`/֛PM+sþ[*p!u(JBDеM1X9 Ӌ$9=%Ar:Po|p?_>4-a)[5b.n-)k@2kC^4Ɗ΂ q=7OᑚM-[a榟6V CɗR!VXu]eE 5V׿C_Ρf{:؋/*Pe&|rf^0 c8HR%Z˗/,w~ϭ[JlB@Jߛސ$^|~P 3Gֺ"EpsMETLpH$6>! %TxיR 5cŊ 4~tp Co>.$ 2RHa2%yg/O5tyW.-hdh!>!³&  0뢬ގ " U:n`NZBuHægitfU< f.,&M6CLB"!Y[ 2-"HN4; 3G2USn MmW;"УH|u 9lTka$T=]*E%V-JŖpJI1S׵UjC`7oZ8fhH Re4 _^r6cfolQ4UZC C/&l=-8.Mm:{<_0%9kM& V95Xܑ+k\FsnR,͢[Rm;6[4UI)zdkw7$EQiAވ`= %6trqdOUw@BALc9 ǩ6MUBl䕆8oє}*Ru_Jz' -{-|HVYAc6'e)V;( (,O4Z:Tp^1 T565J '7W;LKpk| ڳQ4pNCs ;x9}?>oop6b׾{"miט ܍x1GKx`l}"jK-iӻᲾɧKf Ft;l VRRmR!r=_{?TX:|{&og<`aElvl CB~ `f? H۵@2}ZzcQiQvvQR0Cb}5Ǎa/Y)K "bW>cc?ie` CKf(n7@Iu>R|nC5V 0 ǩ"!UR%XjZ'. 1fG肊2 dؾ< ~ 1"+joVk]]DY%&8{W< @+SMP&%ҬβF2OQ(a037Ykǜ$,'jZ]>>xkͅ4hOOnۯv||3C_~ry~-|;nந PҞ=hMjg9v>Ӽ ΗBObPA<"/0<9<OW_|y#;>oYbQVPM6qw)pd2;:8KyF)F1 J>0 3'Kw|*_㹼%QFہ%iBDKƚ,ZYynm %RlNH@EjA!_?xe|]>׻*_c;]V~{^ޫaڵ%H`髖4RQkIg$l ?1;Qׄtu.`obQ!1ߗLYXN)fOi 7vX1x=mBapyV $+9Yd7" 20%F{LO^$BS|?%\p{FhmދbЍiTݘ/r]~=JW;u~k3#&]9@V͍l\jTPV5~:ѓ 6kql5;08e_?=5Z%BJ IDAT#!Qd?F0#HVۑjQ2P{N ZP*͵M(2sEK˲OcvR[nӐ(錤aw p]_FZ3x}LI]jH[Ϗ~>i3x =¤Y벜JԙLZXa5bi^T6/0az2x "je#u$,1-({) *"H-*23j]Ddۊ1ξpþ@:6Mv$BPj?4* a -݈\g}F<ґP+0D2 Z6L|qfdl0ue"Rqt. 9b^z?)7C;|9 8(M.fTF14iGfdG;`ŒWue |Q0"{FKf)#Ҁic)Ku0壍l#r`"ՠ+18{x| 4W3I4w^Ji`c:Q 0`!!s̈IUH'z WsTe6vGRb+ Jcގ֓8|Lo|Ni,(X}BJdY0^)f1ZqfY(+RI(H|R/b4Ċ*XYP$Ukҟ43HA4a8C`bzEpN*' h*Z;ccnrWZn{Έ!iLHi[m ZPڎ R2Oւ0&d,mh| PD"  _O7iDIkUq:a7kNQxA-ҹHBRoQ9ViYփI+<3Q.8gX: I}xAN-~\O߮}q{jܸ8 /&5ZxU,˘)` VJ}% Vw'=vZஃU@@3*!v/[TՐV譫FKS!kn} Ԭ% Af5QXgwߔ>a闹8@mGK hQ`abZ'5K^dcVjun࿍HChq9=ÏX|mI*l7D k,4Kx;} ^" |PYLT+5غVRl91wJu1a2H*" ڇVRk9e0Ee +xvJ8 VBŽoHKlBlR"ҽ=UC/Y;ۼJOx YmʈO[@bb^^AKIt ؙIlm3ɱ 庖PQy,0FJW) rI%XG?Vt~ӣΌ @qe6]/*Q!d`x[xYQ}w/nB y!M(QFF遀pE$p ͳ r$Dj8&?#h-\TWtٍ1OQ,(GKX9C#G"@ipy~I JӹR`#Q 3F?"Y)*1b6  v+ 40Z| Zk#L]5iC,r\ֱx7:e:3[!XEj=X`N  6ed`pVXn״("%JvDi rU c=G<j-֚7xA’@mb2O@-׊K`t 4L!0E0ި=ݿQ*UQƁb5jƜ?~WG3dv`j<5茨hQS|aP 4b%d#Bp DI=߭/>/ q|\9A>8Ԣ~L;ɽ/{kp-hUI"6"!38}s2O6لz/"5Vf}nFp˯лn7/z^gn;^|j1wä~+mV0ֶ$VjLD,(knh9#:3ܦ{lm ^kx<4_G%U@34 L6Ud(j-36GoDj&3We ׺CDZC.Hj-"9i5*$@dBkA>`i1ֱt˚6^7-FY}d(sb@ޘvd0/R k Mafj|(M+YӋ6 $ %{.)jUPNXI'lO߁umh#I GuE`H"fjxS;Sj6SFN]D$L枙cY5=2/!HHKԖt'>"#G41=IX^? xx[)a$J9eŇ! 2mAn ԕhb(5 ()"L`uP׳{8P yxSc-عsrf+x)ܖO2|٬?6N=]#ܾf8W$CMQ+O MN7n *Zfu6ۥUQ@(<4T{J@(u]d=Mk"K6XF" wJ "VPVWmq4-17 < *qc⥖>IAuk9&q86V/a`jNniF k«.MMw}.,t:iRKHk+hOcA2w]3hF@Hndz0"bufdESM2UL#8Owg$l(Sv:[Ȗ)n3"BE"䁼p%Op_Y‘ Ն0FE`F!kҨ1/qY2s-Z*Q@b쪂 PI "r3~74w9 nSw3]kE,|sQbi-8LQUUUަ%cY/Ք=_8b̉&oV-T>5POK7qFh-oRkuZ(DAj]]QÌ,ѡX◣ԟ]Fc]7yE3ew*MR\c2ngb[4ॴJ~Ql AuOF Й:_ص% q=R,Kj]HOjqh?WXs10/@` (`m>]l&QP\-TAH^kgdWuPC _#NM݋#W [+xƇiA op1#pCB nRL!B5=i [P,CO7W#$npLddh>VnokS`*"eֲ8ҶEP!Z[H̗a0Mʻ66zщ?{@)A㋵h*U7&{@iX=i;6Ms! [iF_a([l-T~D'ܢ$Kcӟ4}859wn] <󝛌e8o봸DC'c{H7AeUn/]o˙ IyIlm&qžP4ɚ6zFbdmШ9/ *dŘ`2Ծ߼Ķu?imj54Xvm'܍?bpuw)0]VJM(0~z&c^^.搎7 ȧ#ւl_Cx1 ^AFۭZZT 5 ZL#HrUR]3=ؾv֦{:`ͣuSp,~^]z鎶h@V7=z=9VSÆ2ԴtUTyFij(mnKZ@F_gۨ;D@i.ODZY\J7fD[Qq?H[c:" NjފSi !t҇}WϜ|{ /sZkGKޗZdž/ @mG٠+옭^:QГ͂ڧ:ZF{vP*I*[STiu J{Fd\P@ 6R]-J*ƃ]AK>C(9ʼC{.kqVkˎ_?^POKn>{\aOg}0ZY_5|.eAl!c7s%!~|gG]񝋈L{?LŹGwD <<~ttC=]w_*|Rbrُ+r$`x73W:A d} ɜpkH 5v$kӨmGfc3RS蕧oմH. o @QK(%֔@]’6 kPUy_Y ;l7mvU 1Fgn iX*j-j'&`)ɥ6͜d3q3^2VV3Rp㒁>͇h_p\9cۋ# &L+`tkU?P |eqZیVȦV&vT"2曡!bRm<`P X"s#T71p9,cȞ +XI L*27jfb9͟#4 &zشwJQP#X&Mxs UT]— fR)57.RG_V>- #ߜ'\sGcQ_lH<>jP\ 3M+Wn׿ w1;ATO?A h=7i?o?jh#tZYTKlմuԺ]ghNI]Aspv 솟~.lsYd5՘4lʻ  7YKڦ~q.TvaBxMlk>o1 ܓ[ %z&Ny/JE]2NǗfP*9ǎYy찁oO; ɽWį.xUw"ý°3x?*x/|UA#oAJ.BXQr+L4f'NI޽䰌Jj5q.Ѭk;\L98\U LvmyZ sp3 :rd63|6m2 SeHWus2.3XHdHaZ^=3V X›Uk a۔i@ހ3D ARV vA4P ZN7IKmCRdjq]=t*M͆ƑX%[vC~O@.xG*fݘ %= VH) k*N\ X1lmAV(X{zdKϴ8`l&L-I$9Us\ F̡o8͹¿O!?wކGr_7 ʌw7SA<K,haa쓒hi}bnCbL5jX^hfo(APT#,ZG{xwoa4%g?' s##YXTj[Xe^Z8#w?zbx^6eq¥l}`DPvjƏ30WHu[BkxQ H[4^?ί7#W9Z8C#(FlS](p,k:6?`YT+dvfL-Co)I00RYw NL+MnDkƷe+^bfDt7 .w ?wiz2'Si.+5obMb28kB@M*CD q҄] H s <+k Y&ƪ&wZ(iʘٯZz_zÚl~YӮ[|D(`E7jek[mRUJ$Fj|'H`slIo ٧׷jFjkOkayВ\͘snr oBS. f46"l@DbSk |-eT:~CwL{!M*z/VuN7'E1>y8 [O>BT*iE F>Nf\NF$ɳg0`1B0\17PR'@ㄊ&HqB RطӟeSu*mh2P}^-[>4MVx>0T$pw%ޝQ1T( 2=@: d@zySp#'8_EHMIltX'Xv+S1j]c\l~,,[`a2sm6V8&ARZ+KdQR0af>./~Gŗ>GCSC4nGftčjqc ŎT`j ݾeYDޣv#I{pݣPo ҺBնp%dG0@ 5:P`A0fv@-ڄh XK,·/ϟJPx9(PUUo" 3g*OG}&y$#weMM08!Qj:ތ_\-4 b`ͮy35@FIR57Y"mByO,WuoO}burUn~6ĔtX7ޞg dİ猙2̷xhG0 E6z4q h4U]abkr>[4q MM8.jKk޵OS󝗕FFj@w0gvF'|1S@ƂɵpV.05Ok Ix5}ueǏ ?.`#y}o)>۟^?6g)i_r仧 >wNU|Ys:.U𧷆 ܛ}0h)sARGk|[6wtP$ƏKVh_&|X[F:gU4ݷMD\Th?KfAIV/͏bv˰dn12`` QChf}?rgػ `*t=sC<ï@:$p:9R>kok/`jj-;;=L;#g!(^9ww½VJ&LA/(jmB{]"Z}=6oݵ>~x '[n(M~ v9O jA;@kht:ޝa:V֣]RrU&YsQMT%B.Qga3Շ(iSCu&J}vf.lQ5]녥6G v?~Bdw  6xkpY0%r9lh$ _,`$m%J1.VvjLŚ:1CƜ*\vd%^+42 /i3Ӳ2=>y۟]% Q \Y78cӼ!4Tw~>r?6ezSb ȨB.ji͝4 i9QP*{;X[f,V<|csjAs97 :ZpoI̲ːl 2U4LLKMx^e=w_<_|߬86\kˆp^梥xۚu X7+S5#׏kݱڳZjC! ׵ !e  գ۲ݰ׏{׏%5,/UFl*,-Wk קkαn >D}&\O7$ TJk/6%6M;Hw*Ǧ 3qoy&,z<'Ҵgŕ# D46uۜ`ܵ&~ kKPu?g[ nAF??a@+~ۓ\! D >uɱ>kCxrܩ=VPY^m.,eNaX1J͢{PM& Aog2hcrRU^:wmeh☶d=ڂT/ϖ]wkЀV ,j{̠̦ 6_#<ܖHD3O1IP;@~~)숰mq=NlJn:NX7q#p?toXh cS)7<5UpY}VxPLZ yoz&ne}_1 X[Wt@i8|6k ̦hyY`zo"E$D h yD6p ,uBTs]ܠC^"JJ$UvTQ)vrġj$^!- kc{ M6i;)L& 340ն-V "Y+6sIG10l8dhD`I8E~mqy8A:I@X\V!k*mjC7|f(߽Wv :4OBnr"Cja  0<4k:]>&%huYF줠F)j{C镲H6j1{~Wnm[< IEVfO2m.F:ttri du&>.q5R*)vJ ՊҾh&kgjw?'UŢE˱0u8rL:Oqp{sia2-ɾY# ,14ߍFihca#[kZ<ӆc]j22l݉)Kc2=uX_DBsE=\.˟x&՘ƔZoHT#]X#GhAk4q(W1iV˜y xgx7 {Uo>.@á[r6dn]7A@c9U-omOcA+ TC iP3o%[oOH'gOuzyym~zr7kmԺch0D\3p8$"J/D؜>݃: Lo1,{-޷eZmoG?~ցs09<IF{1X˪i~cYwgwK2c!݀nskhW3u ,IE+0k!%`ѯvwFTՕ&BZT)ژY&B(v ](~w˿(#3 g/S"\ɂ3'X6+J 9Nϝ2t"OAv͜ĦN駐P'V #7EZjTv&HڊʡjJk>Y9aIr)^[D63b:pn:H1qŗMjAV~خv4!mer(pȲ0w͸.?-?Dup3NzؓBu3(UwK`^_ǥͨP&&{2]e;~?GAaG>ۺ05,+.ZLx|$'{HQAE(^ `d?iФzy}[$CÖRw-"]E ъaq*dO0`̈7% 9CrT f\ Mde%Jƍwh4+e;H( $L]/kqЕX!&-zu$rIKeF0u]7ᦁ 5K-锽e_ &t}'\ :FW]#.,yUqѿ/*U>hStt2 Dh2" ]*œV8|bsy{g WʖxSbb z3>~s H^H^.?!@kc)V&oVBhIh`Z_eD0Q|6K彠)@{1H& (mIE"$G~(kMBkQ׉䆧 Ȫ>^~ Epbbp7Ѝ=UHSCfvy\^I J uzYYu8~|.^6 0Yr05 zve+{a0Ͻ΅!Uh[Ckr2W9-W{7T[z,TZB"e֟0I؄@\T^[͊"P {C%nr&iBk Ձ˘@Ȑ"۹@EagVs|5lEemRq=/'mBUW%LKF)P` 545;4mJELaj++.4d6y'v:ID_G{pgXiY@{ҿIt`N e ow+M 0ҌSlt}F@p ]V| 7\_x@>w4zEDS0[2IDAT"c2PGK9nG@*ZkZ&?CɛRӀHDg5/6̰|,"EDDm=PʠwWBf]q|ߨH̭o/^G^Xfd\z} C )RLsőgL ϸ7%[,_ F5~n"M>?,g\ g觲w?l8+f47&A=uʊ=/'hy%6 o\@ӔgYz(=fNMUځ\5;i0O!y*(II@(h1c9OBʪSUqkE/Q۫B+ĸӥ0?}t;wh1*auҙl) @cE+w32֗9Vm <e pnuZWS, &ENmkۋɢ!LlѶzpp \2n2:J1Zߵsaƒpv - ^u]6]ߚ9||? eqmoX%^5QVa ꌊWpmjZjuK9 x—[~ri @KߝdwI2?t^QL&%:֤5FƸlIbup4܈b߽O><p4֦_w~{*l^2&CUGo(2Ҙ?5TC/9>$(kr)IB7& aIZK͍^9'qdN O#Ԣ;6zP~8k+ȔPkokeSԯ;v۫n蔶ۭc$ %>9|zzEAIr ،+H\7X0È^5D7Fhcongla13͏jp` qJSug-6~_䐓H x+-fA&*B$dN )dJ}兕rxֶ$uhb@[u {f#d@3%h姏7R`J掗@0=a6(ieAzDry,)~ƐbGj]Rgܲdz]i.sfb8<;jNwtGLI$ʥsqڎ&u]ykek{O 0MnIENDB`aMule-2.3.1/src/utils/amps/images/conn_lowid_kad_fw.png0000644000175000017470000000151410351466234022001 0ustar topiusersPNG  IHDR(-SgAMA7tEXtSoftwareAdobe ImageReadyqe<ePLTE7n%JdIDATxuMOQtZ A[CHʂ VqO" J](04DM[,i;\$"{-^][̹GCM4Oc/f ^m1 f5mFyS  U.AӥeiW_eWrOP`iCF$DlE)OD! Զ.n!<VVTUwqLFۄewxDf mL/ϊəO# w>SUL"2t4[.@jbYڶ*ٟQ&'"#b1, "˶/X/1Fk~YWcrX%)Y;X2Vc&z"E4"tK_᷁ҧ2K#f W gex\e)$!DbNG$х@ΙLα@L>qqLB$Hι9ĔI9sT!ϧuT)RK(0B[T%1$rhhzit9ke$JIR*"4 $)&+V~mR C" !~ %3h#A|!CttLGGizzxrSxy]qP:SO'! eu5eRB>Z!9m:o[ʐ2쯒h]Gm{g g]Q $F@2TAYk4PBR}ezlC1c"+}mBHV|c(ILH) U Q)V# Ht-%>&b*۝naP[6s"I*PisL1eTlh-ZB"j.v=/_, xL1?n3m)=O\k!! 7yH)}1$H)B9wR,ߞ*L:K)hWq<8`:馀/(EY)ev0(H!}BP´>7iwJ-I>2 )s VCU6X^bƏD>!;˗%Z*Rh!鬥%%}ciah,Cl@H h5fcV&Ed!06;VBLX|L߀fMmX΅rz~BimBԔy|7sF+Ek ZI./Dk F)JRlV!s" ZTb&ctId?e @7j8RIl[@ L_9wR0cVTϷ3`it|`)[Ae)%1&lsQZUVE7X&2ý45T@x=$\Y-ӲL~ Ma䤖NX1%7(sN 3i QIV{#T։7,qktb3a sDH)ce'\DJ .c(Ed  E 1DmB2j,] WS4/Sfr59GH{\(TT&3wJi8p s!|* pAXm4]giZMVF  $"f~ U%TL9(L2zbL<n|$b,.ԅ%s9gk9 &0G+emSZn P8Ōm5hBh:-)QFn 3KI|.@U<:/,bz 9x5JIJVLH`hvk؝,B ش,U.M[A+#&*Dz)c*ŕuPd, | ~rlԂ3f0eu"D.W%IY0$UteOӼɗIn^Rm2 C]H1XW~L n!,0Ut w 6ٴnKAVV%Ndߵ\"׊]pv BC 7qb_]i0zC9kɆ1VVQZޒF sʆ"t nT|\ pGOn,wPELN[u-ZBmCӖ2~M7I+jV`Y&O yt)koS]@܎m獔-%5 M6er޵ Cr֗IM<3>DnljzN^H/IQED sXЊV64"t7 K_P@X0"Tt bj dI &d%LFMiNӑRJRJ}eb3 dtaV`-R[TSR14?-Ϟl,pcC]aSX\j\MQ%reZۖ`-"gr2 | 猏3;Pq9-#tbEיR7dU4h%Ek5>rhL /m`F߻Ǣ]X+kR l%93jӘV8Kd+~?z',;@}2*Z+:cmskLY Xq1B]'ߥ ߨU^ڂxUƫ]HQ+}aYU խ[}5R|%!.q RODR?yX}.c=d8S,hە}kzCpq.2<:/%mᗰElCX>= ߿ l)޶kia6X9K. z*JJvXD M@!FbXmJ [H}%dabxn:4OMG1C؀xvw8ˍYY0T1}cކFO4d`kl5ꮆLcb5ɕ1%!g$ b#FlJ" R VcXnV >c&)#2 "{V g4PO;vDk[4Zӷ grEtNKWpbXo4TsėL>fـ^Y%vAwL14gJhi)o/ 10_ϸ#nٚ"_Zn, XN7#nc`Xc/?+{-+%K]p1 mCg-C=_(A̿WVL%v8saƉnՋilCg jJmRζ4!@-Bܗ*W pSʌipo{'fl͜qvauZk7m54lڝLnR%rfXLSɪϳw>dg4#2n踼DM K8|o]cq횖4t?ٱk{r\g0%xnN^n8TзynG`rZ`bh5Ckڵ\.Ɓh`uۮ|Usf\hJ!)m Z]@,}sFmyINnj#4A`5K4J MGΙE,.p~W`swS"XAVV]·ط-F+.*KܾfiOU'c{324Ns1lo . kn[mB-l8eR"?d͝B(U1UOtfBHDž˖߶"ؽqq܍/oPRbf5=0j\ ] .`њŇ-tz]qqeZ.kٴPucª3| q7;'ӱV,o"GisPF37.; Z m'K`[ס<]maGߵvm}JNӲ ݼ啸_nǿ1w\ gt1 cz9k|q.%ܜ ~ıHq|$FIu=Q{Y`o }Sٛ0ΌKCx9RfɅwzV~ۤ@jQ\ zgQA Ta \B't N(3~}(sZYWhe_yʹg[xmҭҀnoi:C;UWB}t3s8.n-f83kX'9xuq})rEѭl *Mkeh;:[~`vhܝq;/w׼9rGe\ dE6g=O-m9.vMiDmTo q< <cq[ ZH>k1S*݋td#э&̷ a #|Ø<9$RFݷdҒ(X-7jWh!CРyMBGp!r7p n3Pp*P n~(D.T]UF)Qh緵4u7.ð .z8u`bؗ JHUUc]2$v;"b$YidB=mhǡr?97}rQ 5&9 of&;z04ZEgCTVȂbRW4>ffkarEfwLn!12ͅ V _77CfZ?[Rmzp,yg:9n>;r]asuq+P D^#Mbbq s_uq7Pdw=-~/g,qNGw܄S|S0TJ%l0΃sQU]}Zɝ<=x~1pk9-C[Z oJ8qnt̮Hќ}+!B]t óCjsld9:1-+͇f侊]St5;d5X88ξ4p\B] |DŽq>fixlՊڭy= qZ#קT\k{_;q*PvYm5]$7 W&B,}@])')Pm+WGnJIWI`i}2Ebʉwa*1,kTN{ayoUBnn5jþ۱o*v]I:S4Y!BR d&'%!exHhF^9pjpQw5빆#awٱhz]5z4?sfܘ.~-&o{^<{n6GpN1!Fyi3Aq\FޜnZζڎ9]0 g኎pq G0d2M{Uj)F4!fZ~iBb"2lc‡0֡%'!s&צ ;,'bbrƹh09&g CJIX7bGfoJ~.2.̷ XHN-~WIn%]WWmD$Zk 0.rmJ~|hN`b+V̇TC%R((q F[B(7?mHF4k5Dµ-ƨU4J0,,1񾔂ئV`~1ʹcNBDW]xY Jgr388e_Ϗ{v_۵^v-H1W7#קS) ]ɉN*e$_ tW%gn u'qIk\Xׇ{6*%Z5}W;Ik42%RJ߅+eC1y9F0Ņ{2AhAb=4v$dXM3 gF}s< IDAT99-̣U_EwRY+53,Os.]6<}f ,mٍof'so]s[%+GY:Ӱjh雖F[Po>&7RQ!ebrs աv(ahbjo22%8noNlt\fDOŒuw[yyBb¸h9{ҳ(ef(=p/>(3wGN3mRGarҺF4ϼy(񠇯Ѵa-VBՖFrlRK,N; 3ʨKLc`qWSr󌝔嘶^RZy.:ۦsJ S1{ ;,y}vx9S~euVdg{~tl09>~s8ǹZn;y=oZLos`98曅n3s(/xIk_)/Vsw<;]M)& 3rsA,6;.qvb øpZB)Ʋ G񐵯Yv.;}T4jd;6^/$-q>t><#e ^^ۋdyՒЂ;y?É; »?{R5-!FH!ٵ}p!/DX21.wiaվ=l:pܜf.Jْw֗lǾ)yz)y8վ7lj4sZS脐Sg6Ɓv쯺Cf¸|>jzcFnOo oLnZ}\uPZe îcSmmwcnȫSd~4ND+)4F7(Q2 nm.$_3G_o,%gW=zj߲ ߾:މ+'2(˖ߜ1|0J (!~.z'kys*#l5},4kw4JV,<RK1]W^m7,[+ ;uϗRMKtubhmCS[k.5GJHFJifg)t풱K>bZoKÅij]oljT\> ƪ+nᢥ?oh{ RJ~=_͟?f?CfIe^)czˏů-Ҧe;]@=^\$4 `+z7ް~O=S/wg:ҏtbHٍHʳW{A$:+1q/ofՁw#Ve?(ܺ{10<)nfݲҏeߵAe1 U5tu M lC_Кҙae֖X8Lq#®yXooQ ._oi55,}ݛ0΄Jՠ\*D)56?+eFO)<%OՋAbpyyx_}Ǜk+e,K4zMMlF[.=/.tɾk?܌>~߾L[͎Z؟9rwGn?>l5] =C_oEse8p2_=I_ƅXh{Kߚ-D3Gk4wZ3.~ 1q}9-8_ؽi+2z_¼˒T@tiꪏG_K=tr_KouTq3Lwp?^OZ{ޠF=o0Fe = ;:TJKdukG3**aہ(!M),3,rb Vf?Ctq 1nKkg 8oev]aօ] K~~q{M?(* GV6)=[Ci5!$*mXB$.*\:K)E>9'>|-*dm+FLq}/p;xvv۷|v[=cHL!1MՉݾӁgw\] 4/'q{q?a^0{,~ƅ%,,Zo/.k[* "V7[of4ƣ$9M Ο|%v1 F!yf7⣫Iߩ쟟1?kI>!vg?8pGw]^n^Mo&n?>0sQ߿- ?L >N{WL=%CkuXuuX;YvX\ yc q'5)0n-j΋>n]%]tWʩa>nqgVj+;+'^^s(BzW]BX@& 6’1ѐ}aLi:qƭlSL_`.-ׇtqֵ\ wۄȫ#yalwmtmK/pzKU4Vckkݮ!S:hsc&P78%V703-'|\_snYLDHa6Xm&rUR:ϻZBs=҈D1`=RفK]g>2A\J'[IV)N)"1P'7E## -|Jķ`Igz4bJDV v,>N~&!B T>7'B}{ arynOńs ch>baZjRw'Ʃھb-noZn;CڦătaXS1pS}Ncf0 E3OE¹@$ %GRPFj͌_9NΙ͸i>쒳~Y7 Mǧ77/>~'A0īG~Kg4>?v}WWľ='y{|K[-;mXl+Y?oYpf>y{ތ}\+;W4"tV-iMO&׈l=1rNP2.DI6숺ʨ'vd&̑zrb|=FWLh.gg{qֵ`J uY}\W'DipZ{+5ئ`ސV-YAƐUI.]"N9nfNe)9}4#{;Jl˾雞6Р$XLV0  DR@"DʈFDڧb8~ٍhS`z;N)X=-iۯ4a\vNy᳛+wǩ|^:,w7X[݌Qr՚FƖyk(}jƓkqt{{X*]KujTS̀(U:6P7Z$a%e<9gܽyɁ W%:?)r38-\j+]vm_{nn_sgbF/J/'s^;%5O音.߾܎ѽcx%@GO ܍}ӵDH诤TWb0A+ͮ9C+[R-n8mB5;҄f_p'jM$7Bhx楥= WQqZ s~f>΂F\'=O;vmYߕJb)üu1s*[sĸ&>LfZ}Y6݂\:Ԫ̠BF%PtT 8 JiTZ3-Jkߡ k6Jmjv542r7 #QDF?1W fWƹ}a)0][6-,+ȕ+&WwLCŮ+'|zi0)f5%~`jT6 Ax}l:%3\8Ko?@ߵ5M!s @ps8ތnNNp|`wYo'ތܾ:Tb-摛|ŰWp5R}f^s/x ߎKwucC"kupcɥ;5&-g4Kxsy9~ԝ K~쌾Ѽ{- 1S`ˇ\Ĵ%}nL-V7}Kw٢.|]$^n:iGw iG:+mTLGb HrʻJCf4,&s.m+斷#܎#y0s߈z?++v-]AY\ ?#ȐQ!ch!0Rd}krBLG \f+1-} rݕk>nuZm0Z^}M[hj܎\pa9qtd}6CX} +V]uEuXK{t̷n`]3>9y ӛ;Zۆ}l=][Z)+8{J5~VhVcM鰠w,\pX6&a 3MF6\v r""IJ1roWǿ}'o8o]zggE7-ӿŻS/<}c"D*vl`A(Q&1!7 Bhn:fֿs0Ɯk]T9Z_c|e[S3 F<3y8EXO%BѶ㱥i@i9{?NGw.!ȓF7-C,Wo.sXl_d'K]yvCϳ%YھE)Ҁ( ^dFy6Ԛc,V7s sNHTVѻeDcL趝С F1?!WlƁяl\ m2Ous޿8_NMh.$i'o.IW) +؍H…Ԅ>Y{1Hl",~ڴx@\M_Qw4oӻ!DsVs_]4m uR-%y4pMQ&Ʋ8X>suO.S/SBLdC~JMLEV́hRc[-3Xl)uWGH-P")uBHHWIKbӹfaTu]꫁Yg[hOE| b M$4o/IznZoMz5 $1-~[o~`Cpl"`^?u,IMKbZGeoe9;Hbso +ъYۋU᪡º~˱y{xtz{3$c\~25;is(xɧ&yRH@T Kr] 7čnI>M!6dItFo;gkb5k{*I_#{|[w,󄏮?=t_EjI0,,,i}{{Sگ0OɟQۗSfӧ3@IET6=u06tC-8;7h%X)˒Ղuu0A1P}@^\"̀9#߬tN/)3j}9nܹPujLAǷn6mB_U,eUN9|CB਎a.N2= R23$aiʩN()~gb{ m6&E҆}1/ /\Iw3\wa*/)޽InX˔GK OlV4U-F :6%߽4= n4eHʙB5*!O:ş3!5 \W16;P޴c%`xl&0[8 l0E&#Q lɝ='%E (Fr|}:<Ѽuw %k~xˇǯM};%X/Ibe_}p;8CwQUe:YĩF+C,Ȓ86&'1R(rS<.P #3Mek=ZuǨ,-d']M˶x?rha_RAS(pH3CV'9˓ИTd:l6 Vc6ď8;6{0z +ef(3C;L~ZscSMqX갹G ioyJ _'ڰ*l%EРf#6/OTTt >/:rx3 mv"Y!]$ %.RSmꁡt4f*2Dk&l-,)Z$z R0N҃Fv;2`h4^R9Nd#'͒Ђq(n! ֶ&fhN& rR>3:K߷HB%!RzЖrn]\=>rrdu^|/CKN#1֎Ök>݇/7<:K۪lVdd&GIMZtJ`mO7ޅTfJ\\:N (GvKvfΫ}1Zc8w&C2 ^"촒ܻw,79>COc4A`]qy~ȍ}sMY'S隶p2Kxޚ{!>rhhIL1YT>]v*ǖ&]ár|2p϶dpDhśw|(vUǻv\گ̚>O|g5#9^){}oqR<8p\C?1%ضqusу72ޠAϨd\II7QIp*6,F'C3ϧ*ɡ;!:91=JYpn:K>sgcr98R'C"+ȓԘF9%qǁ(!Z: F! H ݀IÚ*@]_ll{DZwtMoINe({ ǫj26͓hx3n@_p5&,5EDą3tnBhO_d+*d Ul7FO{yһGB/ ҠUi @ mC%Og?` VlP7C,- SvޢHjBђEnXF-˝އBhn@Y,n{SO{mNRe.MeRD$+|+*D39 8VFШ>KC\Ym7k\l̰VTZ}Qw;c-K4a]d,"gpi#|l[0:vwm nsg, e w{GV4lu= ۓ8nn Ǟ2WGY}x?ryؾ9N`w}_/̱;|٭Y7>Xq)XRD 'Gg V.\׾H )V 7VoCy=W?Q_s75u1JQisErm-U6/z8ȄZRlbKMц4IPZ!'-"s|Dd^[^30KQ : Ǟ)F(@^w I??b_}y?A3IF*,IY0_!P$F]5q vYϧ:u{PeEnJR&&) RB`[Ȗ8Z7lM0旧ma2ĵ4n$QI#5;3cIBtxҶt#3!ׁ ]iNRT"1!]%DmPF溥 )sOkn/8l,lYr,Ɍf;m_}9+w@xmļ?хrJ4Mȳ,NeوtnP1oRRZ(vXuorĘv8!F%}`;ib&ISP_{o7#|Cso>zFo޹ON<ֳ(r ڤgjP ̦ $eQ*q?M1ƨƃy@N .F]gt6-lO5d,ʻEP1'O=C5HLn;lsqVU}嬼}r$4$  FT)C?ГR<+,7<")F%hT]Z9ZMIEFcCMuhq>8I:I& ; 9+/b0j޻cSQu-u|li 9)Oy<^~2$[ n/Mki#]ÓgYpuN(N69yfhځmuU(ظ@,qwOO1F0=l2diI<-$JHP n9ǁBZ x)YRJHMHHcs@bLytcU1%~ʹ8::ߪ Avm- nW}Ivhded*-ҌeVb { بYٮjҎaUl}a^Mb=nF͔H"R높1hu`ch#ލzC2*\Y RVr\d`l~>SHo;꺧ieAtؑ;=*3RLg SM~S؃zuGs} da[Y/ؔSV^f@`bA+2G*JRpaZL /]$十Lx0Dݬssc*EHw5_;Da#*B(Y/NL<.)_7 'o6|^}@;4 iBs!'FLCS5+<=tő;g%wJN9Qm N9\o]5A {YߧxVFdʄ H nNJU'gUPw]ggpnM3sKVgglؼ"?=~ǫ&\ "fuZ) α*XU[ڪq>/*IYn`m$ʨٹ:WG烋BjƜ:HJdd*A_#n \ !~pH pU{`dqA' BKF0]˓`dHc4S* (HM2O'=ucp@7/Z+?C&_hݘj֔ ?YlV2eQ&lrU뚫n<=gd94׳xp'HxފeN?:0B 1kF^GP=B{ZKMhAyDv߱{Տ_yOj9an IDAT;dk:y۳kWM>SC~S:9l+CGZC ',Rq{6*G:5,ɓrD[:g !)nj5{9:H1vdQ*h1hNChpȡ %MفCSoTm=G63|SS7<#>ؘ?sd֒Mbh< L2Jͭ)%(7װha?2{c[hM;P=cG;Q3oernRDzVsMR&sE2daހt6|\5۹`5j &^089W5)4%hhOMIu6@J<5HY{Rb4v 1!L}~`;nhl永Z,x>E2 aUl%bQ`1 p-c<;(Xn0IFܰ9QmՎ{?M4aKwѻEv8XsyUqqUs>Zsw[1$JAZK|gU"z[w?iٍa#Mnl $ܦwx#9fЕ 18 w{l5O;Uͱm [YU;RCG cUCY   +NbOƏP,} @{*iH?9/X@!J,Y8f |J{F61: 6~Xq~;9Q D"݇/~oMKz`E84diu[ a'U*̋$6ZQʰ9wMYI827"%L>7uIc*EmD1' b>pp|zB Mtrh"ZFZ!& $QHI/JuC /1aKB)$lYgλYc{cB8׍Q'Wit !f'iqݏ>}^iLnw\y,3KLxv.SE2Bo4MQcw861͍6dqi:KdSO_vb[lm0 #xBdfAׅ29|@$wޢ,<:=;ҒC~6:{7:Tck[lGus-Z/6''\~g8/;{4{{ck\+'uyn 1 g=^rwxt&ybc=E>Y"%,E:{dtsz9b[ YMlniFrWs8E'}t<<{^^e=+9;)X-S\cN,2-~-NMd8:1i#Kz+Tb_ zuPCp2ߔ$K)9'ZΎ, !ZYmj%9]7 !jJ~pmka94} #Etoy"$D0͚ @n`pR΀S+>U)s0VQ7ffr .'Q8|2r وnl dh{zD-k@:BPF>6NSSv;~nZ q: [>ýYFjB*}$m__OʟO__B+9wOcN]";=s{ӒiG"]~k|p۬t;9`NJI}av컆._ŠYd]RwJ>:}z׶ۚw/>D+Eնu,2 {@.Ǚ&%Y,3Tyx-΋{$'9;KXK7/ӡjB47q?ձc9LS;v}K tcwl9} ^4BI9oZ:Zxi㔁[ 4"5s,}ΏerzxeatRv\mk~S\a£S~xo_`kr%w~0=< T 8(%IE͑q5- 6jHF[!! 2 N R)Cׇ +(gzXhFl$Nm7MJKL()|Ipy7Pm\qSä z2b o&nƆ{ei>Pt.:Qg7Ga10&Dc㷿ab6sLP5:DiR:& Yj/\Jh$A!4LI1"CXBO ['BQAS5ZW,5wg=}?2I!l=#F~U28:1z34@DQd Z*%, IYHim_B W@91DF'AI)Coj z ֆ]pA@N sxZ$ Tp`B0Ix0O%Q ;ϝ҉N !$؂eÛ1/GH=,ؙڄ$ZlpeßnM}l''KJ_8);2/½hVєY ?i?Gh~?çY+?;{A"C8:iwY9(QS|IUO-meSs.//R5, 6M机x`^YI7ʐi#~;Pyr0W6hH$e_?/g,‡4xI>L}5_&ϱS{IŤ):KqF!'0솎n[+4aʄy]Ylܥo^gz͌<֎m$%28M TJ**q*PE%b "l lKeifg~ygܞIc}̹>wä! Yf!;79YVw"G8v j(qb}!FE1XMQVXd`eE%yfoK%87*Ȇϫ#fDp3rn,09Ya^@RSizA%K~3Rb!Km84>U[Ũw7oVvy\2s[+xoI`"{f-%SXcrb!w0x=!ӄNXVe,ٝٝٛiA%,S.2Jݗ2-D4_(IQ$<,GR" 0" %h :fiX"ZG<Sc bs6`e\!8vt, 9p=;OXyCZ4!WFfzjjۀ8ArPi7I;f獯Z >,߬ cl믟Lc:C?mA1_UDY S$YCE <ɟi~< GB3kKޱӔsʊ_/>2KYldSvntsֈ|2\ɹ{w4p󜚜!OpMGnW1K[+L+|` zGmF]M\ NU`u@\k-%{1njc;jhҧ&~ шѐ͕ a`Rm-;8N+ڦ?,!hED4tZ)[38{&H'/ϊР"vC$2;B 1# 4 `"0$93Ocݹ E+YQ a )ݥņk2CDH6@۳c+pEN"k𺇟3MC_eemYwsue;9\F#m#[fI N5&TS&0c1=pxփb{/E/eYc 䒆k;ra5U2œƤˏnپǺ*>f\-Vu`^-Jc^-Hu_ iCnߔ(6Ľãp.tuk{y3>D%"QS\5t2Ƿ+6J*d"Q&,Tk9*U1t9Qұ&f=gОV{?|Gq>FˬPBJTJCFUHT:>7FqC|_az 9 ?,hL " IDAT$(K0 qC}~K?'.>D@ӶL #޽argKr5n/NX95$l))+wߝ6f2) m hi%S~ͣIRRJR I"s"| A/U1 PSǚ6J׍IE M˼lYTm.̿8"6Ze:l݃/9XF}b7p?4vP\0u.QЋ%b()j79*Qb)jsg&lݯ=gw/Z,&}(IFlku-{7iL͖ʨHSVGCήrjeBNJɢn8,ˇ 5J 3}"G}++4YRVH  MKw:P/Z mGx~g"36BpæF}DGa{8NZw"$ށg] q!iIAC+%M"%=ШoSO\209,ٌEጻ!w,{G 1e_EH'AU$P젦7454 㳮b=K:šzd Z3HM=KgS87{p1$,cBj‡5&cN߳7Q}([|SޮR?AT`=C|ءAwasXNC"Ύ8K ,4D*&z)z*D8OZ T<Ey)R7vʵSNާK7zp'14$;m^so~:" #c"|V08D jiϮֳ|'sVǓ :!BJ.щxo #B|V 6~ I>808oжhQǭD`s,RX6S>K>25fa[rp)?©-dB)򙿉s9O:yHq%b -Ors>w<+\ p1T;$JER푪=qW؜iZ ^O1Se5BWs^vX?ڛ4)lENlR^%%nK4E@yx_uV~_Ɓݽm^y6/>^cm0ҚE`^/X%CjS֠sp_\s<,gWN?{OCEHdih3 Uԋ :o)$!MyqV31^oC/=. 5̱VvVxo5,e:rztqD,W}UMe-q:QdM>HMsF7ŏx,yC9o!x~P֦ϐd}G DF/z&s >JCYkX>6*JByE۴4mztB}[kM/[ a2\?Dނ~scgNֿᠹ,|u [~X^T>p':TYE`ݯ>Dg/|}c\|A6$O8?@.t#/~mW~՟⫯-ϝck5?tsƼO%$DƟ9PZױOacc^󏿏\z?ߏEKEMįR!E)_Z=0@8^~g+VV' 6-ek.fُ:{I mb^KѸ{u ZiD+<RRIc|ׇxυC~T]G *c&&U(ɭCJq&;ai^t`HUɌm Dƭfo:b%ZxeP$}*gn_Ga \}P&2!9XP) l(2̆pFّmhm-USSUw".:k1~olm]e.۳[(Օ!R bkbP0ʆQނ-W l􉒌р IcgVUCw͝] ch-:#.8^U2"!5$qŴ.ꅡB4އƴ@=)idӔT1kVn˶ 1$w]HtMMw28;Y'%ނj4}OiKD$a3DD[OgO >o049#/\s $(Z(!MFvN1+*~ Q yo|p)Aזh1T*t= @/ J古4iN0CAUS;gܹ{Yˇ;|cśpwoEՍb%$8*H:EZd|*7ݠl*mbP$=m빿W#q`\[ܹ+7YasuԜ,)V3yo#&$7v^$ђ] x'ٜl2F(wR*Kt]Dtc&$*1Ml _ɩ^NU[S5!v`pq>H>5 |scm_Ҵ-iMCkZDV2ǾzT};D9iaeQٙ\;+6XIb:zU7?t6!d@0d:HXbA5viʢVlfgòdQ7K?R,#ٿ]z5OsM1:d $%$ǺXU"6DI6S9h$II܅j(lNc+ZO2B>H~u B~. cԎ[>~¶utC#7?Y)YLJ# '҅ F_]VpvwS={ĻtqAc{23:k/X]WM3)vFmJZZ)f4%eS2fݻKC8uJKJ3N 4w3}ƛKu*yjkbVk[uIcZR-92D+Ac,ĸ6%ъYOԔ!"U,m+ qJKrRW݃ܛ'xa6{OH"Erty06/`Vj$#D\BBD*!?$dF$BCRHQwB @ h,+hxRKj"H[zZ m!{ߺ煱tcltcڼ_r_6k9Y'd=iGzO= dIބc Hw^otMXwO<_rE>TK8, |jHB|`/wK#Ǐ=**~\".N %)wuGf#0t60KRF^{>\ ![+RJsBhJ^ `ݜ;^ꒀJxׅǙW@C`ѓR6|  c!2PP奁ȼl*^RwV%YckGi=mٰ52\۳]>c<},KZ%I@,hEC%M*N={1-&+[Wl F5~r.;фsh93pg.Y2k[_%x` rΆʺAG 2n#=0/]ġ@wqᏢŸ|ƋdzWHTFHu.r@I͆=Qo= 豤o*UsˊVq>bGiNFRJ$q'; "H*0|S!4V8|!ӔzRd%Abej\8 IKV8B2YQ!R(D^:0$8pN.ˌB" 4|-NH.m] ^;$Gl`|-- ihP5u.t7"FS,(NvbB8Y'dbk'wQEA`X"ع{><L3A6EuR ?g~s|zY[-4?Ο4!=ޙW^2g~/pX:]z--ZŏZr_s))2=­0FNIJ&Y+-;0 R&B;aًCνԦۯqn[%H#5ZYs^ (ƅ\]^k >e{{.e}d{|3gs:H%мZ̓ChVkܹs/ "OG Q`,21>{Z66Ѵ,{yd,8Vkgi .=њ<լ Z0^{*I9k50F9rNhÁSQB8p=hgJ|pmqX'y'( G=^ȾY$ol4fnY7+д&62g,jmDuNֿN`<$aN4VaOˎ!qo:Xٛ{t_ ̟Szs%quw??SdYʧ?m<%\kPUyV0(Ƽv.??ǏjP kښ7d5b:&1&tֵ]HBPpKA= L0@f(|ʅ`Vs8x{lNVIjgMWo]{޽cl\0yz:8WbSr}XQ7%s7c5QH%3nM&|9(OLouݿѧA6^6,lCE7\t v_Ja gP-k2d5Ș씤]) Efx R6TZ!)njn#c4S*tEmL6K46d,udviBP TKU hVKyxQbDXFvuu88cpus KZ,-6Xep2ivMشЇvoBT|4pN:Y[[BT$#92'޼|#ܥ(9Q9NHUcR֡[7X-1|+O|Sbe<&[L{4Rw=8??4ފZ Zc O!yV!ڦZ?e131^Y㹧C{~OW`u=,:BWٽ:SGrUk=jsѰXP{!c*=F?B6Ȉ;ۯJŐbd8dVnѭMdڄavF7*EModFҩ3|)g[`~/ryko\$>AI){$3N*ϯSPH,:i%B'$ ^/Ea!UiH4Txxz8kf).7hu >\,B  Aӽu^p,eIځ0\oR` IDATJt2FD]56)hi(6' LkiC:ʄ:ȹ"bU2u,)1S]$cO?C 2G XFK:yKI㱟5͛h)Z$sgR> gk/O~'Օ5t~o#8t@/Q(&ڋ4v()W=nyC@j4?S#*{?1%h,dB༠uWn^9/] ;;hnl"ф18SruFP-'Ia|!dyzN)YFEóa8Qaϋ{޹֚ǞfŴ" c[IrDi\Ғ$%o-X+Vڐ_e:*._hq#=z^Kxϒsix-=_;5@i4@dlMRBc5|4 )Y#YRtW=eP )?R8a'44r<̭a HUpș@1J0ڣu8G4J9YӡE0ojU5QFk%no.&kb-u}MsN.,O]!D:bjXlq~1ASa4QOkh!Y,n vsq|ҜpN^DR٣n7E'X~MGQ`o~#e}2*iJ~5 Ok.$9Ν)D@yQ?Y޹xpq֚WN4ܽ,}[Olai0%l82+\\Ye}Jc1cq!UM$[A_. 3d"x5&gGz~q`ʊkY- 6Vxц:`gj$cksLQ:5>eeMG*5g`Sp8 q6ߍIG [ й&&D ٹ2Z1HB nJN1LJ' TWe:ڐABS&M«ǻR>ů 8ϙ鈕)"SŦ Xr}$[eNMP(k3oQdqQm5fn9Kꊅ U/RHP#OEw ΅TAlp_1;+WD?1q1Zq1: i:E"dԡzTeO2,wR X E*eMQ6@3ZҶ6=B:ECM$o؇xO:Y_k-ۏً(2樱ghcjhEZ"& S{H0QBvܻL=n{9kn#0$JY0a:d᳿+gQag-J', >a@+@茲n֠qbIE=7_[?aWXGB6HA$@h 5)ӐVC-M#lKݻIٔڻJhU`1[AQ2lTo.4,vKg" (%CX6H)F)#sQ.8\̹#OÏ Ŵ-^$Ai۳kε\Zy4xRJnaG/3^MbE|BusI? +tK˴ Uڝl{SOc{-,Y9?c~oA[خ(w7;): ]i9YF4R;W&Dkx1kE(w66k\cZKST/>K`͌]Rڍ n-"Ah~>8hvL9NMW8=U` t 6؁ceF 'd:y֑  M$ %5JXPT-UyRAvwS;*I00̇ EZ0ȃY4Өʜ4XږVX,h@'TEM`~ G)y: 4{urZŴ p 68y[}@蜋ds;Y'_\X%ORZL6ۻ_J;z@mRJpؚNĂ7 rQyP˺j) pOl X]) #mϹs~EY7-_=J(R$:HrŘq1H Fň"+ Q òhJ͜W3*S ǢTTheE|IЩ´k> :U8i^u&:mk1&h몥-:&=:&Ǿ uw&,IxYQK 7y] _2ś=ݔdY>w]~饫o~Ru(^kazfcgAݒ鄧Ο&blZʝ[`$#MqF724.MֆA1lakNN]]ŖtP\Qil"Psm2>;fee@'ZkUXB9K]\mhkK],kE3y=(T.q;acuid7H9}jAɝ{3̙/¿v Br>Zj$cR Q9,|#@ :yvg>S6jFk@+(&ic|JD%IHx`Fu- Ukyds8c3Pŗ^ڄskFE(=CT ,:߃ W#\R$䒠@ A ) }}} QDAݙ鞞]*}޼N/"3@!nD<sA}q~@2ŘI9a\"+baY1. V^Klm--Z^1&5EӘbQmDfK !@d h0$x7БhjcGi^Ҙbrcq#4&6 4}Z}ur7+uP;^~]/=@)߼EiZReZؿ:CdIX~s^TH7<<?ߝ&ӊ"}::'-)J<<<Ƹ2ES%%۳^#V脿m21a!e .^w2%BD$3R.UBz~ٚNx&I'<=>?}ͨq"6 )EL8&`Dt}?:^ɸc؆3Ѷc]N5{8QwX} cx|424A%dI(d\Lke7!4Bq]DbbhdWhqkJ&y h@[F 3pM7(1i &rp?ߦiX?[ڟPTY;fyFAZ !:\;I\ 6d8ɉ214E:S"2q&VLsIU!QXY-[uaSqfe7K&Kr>'TuǺ8;yvp֘{Q;1+slX 2;nxoǺ-5Z)Fňi9FyS%eV0Ȕ&Y Ag:45?rs z~&AU\rakiAO<W"# 3.OQtx!6/{..xp`A9WO>| >9 /{ s\zx8pΤ(sp5l_P0}@E߽c9\<ʌ uR;t~Z56ԃ7%ZIIir(sML i,y+۞=f:)OKnM98Zrpdlc I6t%/o>yp LhO+Li NE\ hȔEJ"9sU!eF:m1\ZY6=%U4e$Ӄݵ7yg 9@& ])OI(^J؜:BC@OO|ÃB3Pߵ|rpv|XT,~~8d)mNzm?-OÕdZ/%$Ck8G*RϷv'LJ>:`hRw^:4OQ^Fϸ`{ϟUR%}{}&Fgs~|5:† >ycS暻;ckY$k[C%H긋S¥'G={ uߝ3l #BW1`6)tnh960]+m 's4ܗڂ [od19U C2GxvzqǦp|O&ް7d\ ?l};yqHcռ8Z5f>-MK&6%;SEb-x֌\aΕbT:z:&_dYԙ@&> .h)V)yZFpDJ\?*K Q.Z8 .$8 ]ҸMg"B޸ψUJ D%p^hʨc<=+ R&P)uvcm "VOu[AS2U ?WD*2ӻz`@H.Gr9i*, IDAT2N!zpt:Ä`ஈ.?N /T*7ٷ'7CK^>eHvM @@vyE\$Y5뺡 uk8;_;.]b|jW|섕1OA_QR DIM*иp7TE#Qx{{f6* U.ybRB ,?u14چ2d2R8gScuBw?-0 K?|/L91˩nv>ظ=sƶU]s||&JG*/Uy2vvCj/r]*txۓ]6Ǜd:؎> ޝ95&z<-TR:lLJnW ,[庭ypp/Jsvv X6-':۲j/ j[Uã8YI:,t, ˸8ص֖OێL$tu@xEsWQk3=趮C=8Gc:Nョ3lu֤> \zVLed:%eVP`|lRkuGvEXgPp5Ɓlv]9s@gH%=}w8g" %&7#Z c 8k.CrFQJ}"d>xqB%J2ظŬ'ꔓ|oƥ!<>¯oFU)C)D>9>zO5y)Ϟӵ|vvώ(2MUd\[w{\K I@ qB$LÕG,<9f>3Mj1Ni@Yox=QV.rtv-l6\68 *!E%[ )1^qOxvxQˍQ1(nzG H@+Mh(nj/ӽNoLz٤ kY6Kfb5-97KV}8b.,S(GjI+*2IA,etT+xuG2ҹhY-l[{-lçAksA ^#+X:S䙎مYU^_FB AU@j7E-cnI2"ؤa j¥@z[le ͙Kbvz!~~gM[>&{1 ӊLIL[Y өU 7)H#HoAD0lÇ2:D{Sc}:1JbÉg\" ҽvJbUU֑2dQhB4G ?٧1qxJhP@8Z$ J9ៜ9/o\yy<޸tDg?x+ԟ74bd^0jGdCETN@]VIؾ g|7GQΣVMx@(Y(@t88Åh;:Z7>Z;٪FK;8/22/>O[iK3N g!if@ޣ#>86Uq\sio./(%W\ o)fc<{Ӫ3±[:ᒧ?;dEg-ZIk͔*lNJr>?+^Zַٝ-Ex)>tDgQU^ cqe'BȦ~ f1&nFVb]YL2PP 68\EjtXZ_Rw?/ik鞾eJj+&Řhƴ{Tփ@"]Ɠjj`2"X31p9~4뎦y|Ø\:6gˤ)jHaY#H͢)29Ts*@NԉozR'%Ud|B\YM*YI/qpW}4+r]D= t'&w ]<0.a7]7藬ktuD>~c0@:i":I 4lUe2(&BjtS Nbc{IɀV5穗˪06j*l:mGg5j}Ú4:@$B +n1& LSI#(F%Y780w|KQI^d +N O}uF=Tx ew~PZ'~92B7mxxo^% <Q@H Dӌ :2pXw;^Un_ LKޜ(s<;Ywmu?fvOOs>1MjG'X92N$ИsVx`rox:@z /=R+N$> \Ǫ]l5E|iM S L :S=ˋ6VKh*G%B3g(P6BkSt]5c%A uC8~^!yph^Ml]l$p.6ب3L9O2Io@/MRIlcqj Əop M32yhȤFK5UƜ*#3hI"y1[>ݺΐ*!dKVdx0]w stz³~~+Sh3LzĀy{X+n{0pt|k7&R$!@D{ON@HxAWwnlfs<>cyV1`~6b /͒z/ΟjWR ^i2~tR)ܜA.Y\oC&X,:-R$Yb^-5 Z!Cr3'cw =XdIH Iʢe>=g\fڎŜōq|TBfuUqp"?Mn=*LʂV36;h8/U<}oO( Ljx|&R$A(X4L@j:opcmj0bMkt#"}0|6K S~̅\NTiR u>N f[N[6{zDY1o~ 8c82vWuYM26؝`cV<=}ue"Ȃ{/~瓒)"S\!x?.մZDUٿ1Ť'%˖eNBÿ7Q/M "7heb5Mͦ|06`Lf+v7pog9ϸ;ܘU1[){b\\ 'Tֆ'\U}af1kKgӲ-BeJ%xN1$:Pi5gZ2c;E}Nu t\|2pX4|1;[1.e6)7es3OV]4/ߺb". Gq<̪6cHUbլhmezؖߌ>l=Pp12e&g>RarO>JZHsi%Tñ >%I@ȼu>V,;u%$Kҗʂ5ukDֵ{hM$-ՐL qɸ,}Y5"&B0F`5ӲL=)GѻDסbxDb 鵴&f,˓O6q ;;x4"߮|A)Rq1gc@ǧpքjnB^$3RE&%X |~K>F^F}}|?G=DdԕpFG|!Y{gYh n.u]e,ː@d*~x7yeu6ƛYq'c=duLg/ Ge;s+:5<~B dRd];.X5 K8%\# WIjwȵָ-ťXdZRhƔɈOV`a`k2a{:ew62˩''8?zEz|A׏N5qTVO^cg;eT8+y*KСĠi_#\4C`LJK$RȳرSeka<tJα&+Ͽ-f%u|F/)%0:#X(Ђ٨"S x4e JJL)AP; Ms:EkHk:lUӥ @wep߶@IH1#=suAMS&9Y:gܿR2w M0t㓣8E\/fܯ??|crZ]Ǒ-G ,+NgܿCta/݇;s莵616ç>W+Mç8c01T} iuQ6dmDj˽{[ o ɔ)`oߜ%D1"A 2MgLs>K,cקt^~)y}a3skN>P&hA=躯wWvx=Ho$.2YޘVƞq%ZkB1QX7iU ҋ,22 DʜQLiʔ"]9)挊bXG rf!1дg-yǞRڢ* rF aZK&@+d(,E[S9Kә4\\ Oُ*[/3-lOUEq 'oV$uijߙ9sFUF)6*fŲ5M"h3cִ5cP9ƴ.V;a!PkZQw5fz5ƚ")zҥ;=(CK0W͊( WbA^l}|Ȃ\.i|uf} &Ø4۸k Y53hqh7f1wڵM}q^vt ԆLW] ˀNPLʜ\+&f\ eԺAE2!@/>1^ %Γtk Ƹ L HH`c$:vg]җEcݵ,Κ1n`diSc&Qc =bT̨B]qnK8,ohBe~Tz7e@Bxq0O%Ⴧ^~i zǃgmrL-I:f"{,xw{Xy(>I eg!iNcl gM]Z\0یϏ,)e4GGtR%yKFܹNJT(]%g3NV_q:_k5Pĉ}yeNr,\bB\w[{SeW^ 0Up,tݰ:WL*#xy?ӸKr80΃) ykܘegzq1c>Gͱ_> Mk99]3lmTlmؘ̧%YFlQ g5'+ֵilږutu\U>b>3.FCZd:ckE;Zb65m,iBhblPNjI^i*K08DIld遍\Sk"` .UwzZO3rczw9b3u)2V4e)eUlzKM^EwG,S3cpWbYYgX>̂ޠp+.٥4S˜٨HLJ*ޝjlp3αlZcms qf(fv:\WyJU^ */QZ1)GTyio .Duצh#Ϫm0bwIh :0k׏UTAU٘Q>\9Udd>,3ºe՜sxLVnޝЊ.<WzW@KszB_g<1TTゲٕ/,Rhi5߿9]&J-ϭx"p(3^zeP8݊MNjK^yuHyjjt=:NZ+͐w&Sn$(g<ͩF9IhRRRZ,51Ӭk-ZKg#[:VkY_7A[F*YENq 7-%EcD}gmB8]6icv\5!S})r^ \gL*JGRRdKE1P[x0Y%ׯ8] u}F_}_%+pV*ؗYb)|ʨDf*͵tfIkj9e^}lJ0.flTQG?SfoJ9.!J}8nnܢKLQkRL eZ0"v{XK?Dw;eo{D+=уp9\.i͚_BKY>|xd<έ `ko޽-NٿIVhdЀk]|ϟ]R!MG^ #{'dbgg8FoB˪7ъ~hYl adxqxslI6,FcϖtWrXK.(wmN&USy9v.hRZwwvPBR9NZ29jX/8_󋦉.ue qy{3vfJs\.UG [0m3EV[8{82clGWfgsdFoߛ GK^~Φ&,ȓ*kG1l5+58 Y ^7K.T)@7'&V;@p[vgE>B4nmj"=.Cw ؾ ] eQ/^#kQhEQ聹O )?h*tWa."B2׌X˳vd\ MgeceIR^ٲav]7|pKBF}e-C~uhW5>n SApK:ےUYI׵.>; x#?/"sn6",W+BJӚ:ђmcs +i;GHa} ]umȼ_]w^}+J T (62rŽW/x#MҨi& N ([[[L*Ww)7ȲKUJC7sj^F`cVP1)0lmzudڏI]o( 4hZ®Yk ©0è15[TF !x{ &^}0cuPB25/=_OyMӲ4=Cf[U2vphZLqsO,)99;Z'zV؄t֜鴈ҩCg@E|Snޝ˟?֝9F8.kw+__oo#ފzI^8vN,;8=9>]JSU>FJYqrي]g;/<;wlLZEѧrAUބКiNvFΝ- 2N/x g77pls^ڛX;K|alFk'7ٝfsbƴ~ڻϰγ\uk"-&mK7*w,gNV,.Z6x_ى+ W]؈PFgiVeUd<&dU.TdLYM}ukY4bM^;[]7J~k7FVq&{RKݖ-+#@0b # M?!7#0H āGIVKnulάy<Z{s8tCQ@XuêoY>xWd2#9əS&Le"'If1q;p;jkv͎M0. ό&vX&tfEl1.].ޅ6p,t-$a.1pal':us>eDmn떪#:;8X}_Oxd))G7ofLҌ4NR8URRX5gSt&BФ T`]m1-uװfK7t}nKY}?.?> g/1\}a+~kC&J=΂5D)/* .eyk=wEɎa\9tJ3<~Cޟ"ZO,q ??te a\6[N>^dj :W?NA/p}EHɥY3@'P5BJ̠LZKsQ=o/&awq|@BŮNGնM.tM{KmP;5WT㬧 ?-{xB$+okn=|*u,w5kV#udw&[ǣ]v{yȫ:x'7{9Y9/_te9YU6 uE퉬%)OQ&ӁӖNĐ3jT"Gp:UP Pokzmr]x6ddBO=2gxhiufU5%u[B߹ v!KޕhnK.Of)i8؝bxcV[Xd^^K2()vMGTUmǩX=::~2RcH Ōy>%O tLsܹ.)RY#MJ1;g>I8hf]J݆kT3`ޓ|ы_Fd ?ȱu%C9&t7+gUo"+ qdzZ%pz(6Byήnq?ņ(>T,$H]a<^‡{ >y|ppyF>`=byx3hOy:%*g:8S;8 ށz(#oH 6؟rxA+Eնꆪ "ˠY2Eގ-n]s棂Y?I34]ϽSكxھuWN||tXpW0yF>Mٿ0MuEi-"Ux *U$n%A.*ڲm(54ێ U}kZ Ꞿ Aџ$n^jR$go:o)s<7z:ZI\˞fݒbg)}b1L$2!$uX&/Fܱ,pDw!c]=P1>NG"-&1Ι{$:#3PBDg5O-* ;%|&>L` { :q$޵ag-{I7ڀ?w>-?kp9y.YIyʜ?x>WG!8xog"A!};{uKԇ&/ hY o.~úMf఻α[ɋ_ًYL _Ǐ23ATop4rx[oOMw;BjX5uw-$Rl ϻeq/v=nk^ ׹^K)ɮlꀌJ)>c{1awp`#'&q01^ ztҝ7#9^<.Da4ڄظ9nX,Zur#Ve2~@O{=G%ժ.һ㭻' sl:6UhԜo'Qsi9.ί1ɒIx{G;Ǵ]>ǰk;˶c Td\#'~r)%uszmIC9bFQn[G[VugꫂleC㉟ymVl-7Jy1gM?3t"əa)&>㶤xǶgw߆IjݷԨp5Y2BU0t[ \*%hq8J$$s8B*DJӸJ2_h.a f·wQ%:#7Sa 9$$: j7]CUtl7T햺5M)?IdFo;OR4 4CI(Ҍ$&~{稻vlֲkʦ;EMwx##lOqxP54Z8usΫK]ky>_{YR_"6Mkyx /]T ƢtJH \3o3:FGe/j< tm,ST8Wbے4s?|^p#8#dt܀;zo-uڎ )B? ψf1"D@{m??_#\~qX!IIpZ$:ֻ[7{[}0@ʦmPovf7nxaZ0dq6M`K{rZ?Sxb#W`Noo쇪~gG)L~4˱ztUeWli`ٟ\&ַ5OunL&!MQ\DNip߼Zb2`<hh}cf׍S]iv]@T Eܯ姍U[)I7!O2`c۶obƺ\Sc<$43q7˄'z}?ޱ-qj:ʶl# 0gBbwj-2{=֍Ar{zcnNSÅ~ UhʠdfBLItN"Z%%3 )նat^IgBq\3b11 &YY쌖i(&e}`,*Ë` 8//yqzs=S[5}%JSp.Lek8^n³L<ǍSsRiU}dE_QQ+mOߵ!&/*. .;<Rcm!x1R Z1_r9w>")f&x# Cyp\|=:Bh`o{w_?8#Z`ƆAFI3 #z b.{?{{\}~ DpM$y0^rhX4ȸb(÷=mA /FUi$x*62ý49}rnae0F+H(L 7Ol 3 '!>$Ƭ nO[q ]ٟf|!yŝm9YU9^hvEqE:gr<ܥl7?e. E*Lni؁86v80v-uЩ$QdFcZIHVzӲ]Ul6 uݝz;MtDIXu*Y^ IDATL !U"t~Ѕ 5r,ԩ֒"#M4Rd%%]d9-Q[(=cX,mȎy1g1؎ۦkX,姒ǧg0"f&̊" JL!PXod[*|ǰeS,uOFJ%Pf0䓄43DDSLL0g ,uƴ0m >O5OffB!LC=U|;F1QEwn[/kOR/r;wPn@ciiJt߻U@iȘfOQhCːU"&E 3~>yfx흇/ԉS f&X)#L"g)9yX3z0@<>|C9Iy7PCHǽo~._? 4(=O ٔ|osܻ϶ܵˈ4F9<$Q)ׯ]΀̞={!}Œdp꼈m윙76iJlW%~$pBMzG[uO aΆiŔi ٛM0Ϲx0e2IH96fpXmjve'_;q+ɘ3لI:؎YSϕ=[5|RL2,Oɓ ,T+Ҵ!tǛ)wMFmuٜo1oݓ A gO_kYؔ1eL)<{Ħޛ'dj^Σ?}`#`+ftĹLP"CpIua5Z\=.ԫ&dQO@z]!q7o=|&a)w5>K/.2_L)5R5AHc9ٱzՌ%wۆrvkgSx䰜0!lEţ mgn[lvm~Ybt?=MװH!JdmjR$#9щUb]m6|tYUIL,; O'ё;ק*mkfCӗM}¶9j׋{>GMB.ůҟJ)}C3TJFg.TN iL Jrx!og{r>I+ X qGH/=R*x!QH]aǵ굷 $4/ o:ʫ lQXmRCg$PO݆nˇD႓)eӲk/]"MҸKT.Z~\iyϟi ?a; }V7|뗰[wv|gڶ^9/\y:x1MQ[VaR ph߾y/dlEBq(>9B~)>}>(ܻ/-5SyʅˎսY?+WsyoGM>QGWcűiaH ԱnHe8BK]vd}Զ NmH3?Il0ە-0 {g\8giZ˃[Naa?)۞M܆<əSf,lB I,+Bǣ]IݕXQ-$Z2C}F+3TIK7 AMհ,k6eˮ ޳ sߧ9kϏrQ$ (bhlaF'OQS5SdBf߉*mj5Kھ_懵jro}b^ZtEN3>>00ny;w7qT6zyopsoۇ= =^߭wqil&m/H!]l=;Tȸf>[6nt׶aN(cZ#;GUܹ( I3_wn;3v {8k\|il#s?+y/9є?zn_BS1'<֏K~o*_G"{ׅ=散de3~/?_=ԅ E0"'p8E@^쬋ݾ{ǃK~v6tϰwu,zbIG)SEʷ^Ľ-o[hSؑXX1||506ܬGgwDw5KT!jm-uWS%UE階 Mxw_/r9i詽p8aoYkۆͮmXkexM]MX'LY17iO@E)Z8]OY68nuߪۺ]w뿌r>8ʕRdi+'a MOT6r]O:겧@DYeCƨ)5]༣w-MTf38SBعޱ9|~AmN:IX߱{\{\ց|4U 7_|{$a:MyUv*"Mت E7%㫱5ᬣV\N)ČMlBuPPonwm=ھ7զsr,s YƴPLrCoUqXkW%mK_Q|UAFQ "v&ɏnD+E$d&jIz9çk)LĂw~1;heRcPncMZ14 =?|m֕6}wK7m+#mFH 4Mû7nr[qNc-R8rY. k黎]cWUj!'=.CsW8|~K_9@jz^Zn}>;[hמY ǜ<(j˻{W~Ys֔9Qw8_ʕk\;D+ŪqyΒ_76+ {"IH x .T:ރIarBWػ6ä IMuCn]r zV .N0-_s҂4ix8ִΡ0BjLG,wkq: uzO ;n6fQOT<=pz gȓ)Oo[=oOk%1FR & ̠ w<^lw-U}a&PR<̲,Qa^#-c;P8'p^%27AVeSۚnŦPU a/s30FMb h0,S&HLak0 .+.~k宦nkՎ}ߏć@JyƴH(2`oڵo5L<<"TZlsJ#?y L>Dk6mQT_W|WRqǹ:>m)H%Hhʖ7>]lO߷8kQF&-dyp1X%v-#8Yu0c҂$O 3 l%o6?wnJBg*{7b>jN4&UTf90aQ[K֫O$ST"׫^7S<{t+G!8mxmnNUmevx =ұ&~Ge`0>/;wH&b?#$Da2%}%}g6A=M Y6$TEeA7=uq|RrUE7\\P$:cpeyItV Iݕ,ˇ=d۬1pB$$p`1ϘOSDSi-[ʪi1p6" "Nx"e1 76iV?9YG#mh^벡!$8pJ*!ukٔY6eoG2d& [MI׷l-jC5at%zDh"S$sdFƯ }Jj>Tݖhe?? x%Z@4y(s.k"CiUĮTeG]u 8i_DwOHBkI$h twƃզjz6妦;.|y;W/K׿K_pզKھs-e]q7?O[h1 @LP4AeEp܁74MxӚ\F8B* IDATq~Z$IIdpT gYmֻp@{*YouÏs_?m; ֨3}Bѹܳ3,R ׻84bm"q28ۅ>q΍{)-&IFeq\rZnB`E1MXr/LXe,[<mD= ]"/CE2 gs mu`xxfţ͊u=7zS 2Gi~XT+e%> n_QpbX 6ˊ Sϧ!4&YFn197mUhY-[ej[Sw*)/ͯ~{/s`"/HyajO$KR.MRDah^\'tz*b7btԤ׶]Z-eӎo=E<8 5cs4'5)NɒIZ k}C6!u۔mŶva)Ivޞ^D,mW(bV$]blm2W]3l޶te׬lKن=պ+l~}?= B(74cFc8ТQW}`]hꎦ8<@?>{Q 7XLSDW=3"ʎmRa;V>kR_gs\b6#IS$18}5k֡&+ DJ*\Ď>pC6$A!Ԕ\Fk}e4RvJ&*Rmn7ܻ{;5Yھ:G,^:d j1$%Ia[;]nݰ>nݸ#ZwCYz1J Q!QJTQh)ɒ"R)E]ZzgMc۲*w6K)T}⛠`^M=۸WM׌O{A76 @LbVpS]P^:TXS;nK7leqk8O=thI~BAmgpFSmOSQY2>"^b.8q)IJOy{&,TuOt WM}.Y^?kً׮^g ̦SIс蚆 uqB DcLI }hCLDa4Bk~P2b+^Ķ T1vcnܸ[wcBcUM:8c҃ ,G+؝ugA![;6 Z)u>:uCfCYmbvs5pQ}*>#ܱy?͸0/){Y#:Nv ]M&OwB (@ ,.O/.$l7jYnBŶl_zAF R&5 |$h42hS: RqmDAĐF5gn7$O)lIQIZwZ%mߠ)p(uSSw;i]X4 MSf{yhHiOf^ x~7 kCZ%ɴ.HZږ 'If Mk?Q5gEKͼ͗׮3Wz{sf (l.8-m]G Z'$IةmS$-2dbH}׍7=.ŐFش-Ǽ}^-nݾŻ7!$E@e"T$(|#Q^`wdQy5Jة='EIn fj[ʦaTMMն4}D䟰 lT_O3L?a%0yN j{&e.Z{ԧ\?i'EaLn#fCk{-P:-a\%InYdaR=с)#yM`X<ꖺ cԺcd?ͧ){,3& "^]7P='Y( $q*OK#ԤE"-Ht<lJ)9KJӷTMEk{K4$:)5ζڀ*S- afMӗ;TľnZ4jDeIlHSMV֧[Iuψm*;6ժfꎶ)9|C=OrgG9IfS ,-X̧h%\ \Ww!4V)&csu6t } ;wwِ]8:vGuܼ}~oCV#y ȆՎz(mև65QJ.rjd}0eTm[d̎mچkm?NYs9E^f4"a3 {i0SRF[@%Eo=a]4EFnЪlX Mxpn˟R>ӖA L)t4[ BHlØ6͊M}BӅ 3 -etm:ǣDp<,1#Sٺ?2 ,wmղ^No8sv*pCEhlN_$M…i{ʪ m,7{q^Oݻ̮.8 #yJ$c[3Cy*rVXRҲF=vlv>߹l8rn^εeG"d̰0p{v[guyrGiJ((EB M_ET"`G%1{!WP}AweLr~av3ƌԲuL]!$j ۖbƥ\*棇_# Gnat}oZلto|vϺUKTŒ8Yn|O>/?u<2PsH*g0 1&*BI8ECjE :  xIr7@@˺+_w ,0M-ԏ<7,',iY?G/IAoBU^e-b~<ྑй*2{vPs;9wp34YGbBx0\N[q ;m=g񩃹kjcF?br9 B|zP RUȠtt@ j`4U]5GfQjŲpZB5b! 16 mK=}uzq>q 0@7~,l9Ʌi.n! (d0krVbpF.ԌZM$!怐W =rB'4UFᰳ uOCS*(RuȨX0VCH(-q30sJ@ g'h&35b 38r>vۍ7םBA+ɍXm1-vn4 3C ᴝpwO{ˏq\(%?~!rAtsQs.QUa B*BX;)7js⬷EeɿFGzwP_W/f-Xt|Fz k~M ` -X '0XLA73ؤxp3~ARt1+sF! 3E#HX(./T ($jh;1YA@*D ARGĜ{eEl!c /ԧ-IJlwh?^[yO׀wNfpD17lhĻKpqżPhrLO?E =h0͙ BH fbBT8B)=J B* gR)83f3mh֦\Rs78.8K]7;>dD&C ^~rqȚxEUp,ZKA:CZ>@ h* Ö$hօZ2VwvV2 ;okg\ג$[Xzg/x}zMQ@g720G>zH9s sCI '%HN~)%5PE~~KJTkO_ws8qzK',sqz| !}$JFHxX<>I7`oԁ ϴ"or jlH^Xʅ2J碰۔QT(I# AH kiE>F<mO>&l!ڥmq !&z'%*FOxv;P8<勻O8-Tq251#b4z]oƈ48nXz;wflT"r8r#|Z+"eI v`Mi\Z Uv܌'ht3pZglq'L{F9^>‹g|K,s)g`9ńplA"ǬV9~UVBK륕(@7 <F&q-8(oQ v35= ?"k!y-^"SOəH4rVxqи9 q .QcJ1cx]Laq j~LcFcod$R0UI1cZ o0@ . سR]]iU[3D0i(D#W2M+jМr1G laCHCOM7g^plT(Zd4xv Tyv)ȴdc',[D+NKee, (t׮ H$7l( MϭTXlBV"K"2x% rG-5)_a##}FvצٓrvW,~FH1]5W_7|nco T.P yC)f1 R3S Jp/99%sR i ,1`?~s ~ =ؓhcҍV*敤-vUugJk]͠0[Kj05GaSS`@-ۆ *f_$j&DR:[X~ok5O{㧿?|/>/P0EBh"Q,nqR+b5;H[qBi,suy_|>g_|ww>|v..FY=`{sJeNnN7K#͇xow ,Ȱa9(ΦSZA) Hںv#DV)ܮ+^?>tqgܽǗ^>[` 96P{hOK K9"fߓإTXF\{%T.>9"Xί]浅Tw8i?=e\%6ɁMY`ۈOHQ"% Y ף (iQQJPRS6URԌBgRkJڒGxl^ҏڕ}aVZXk4eC*NJ+RS"3W!F+eūxqZ^cY7!W`w]vT6vϙ;w0&{ H- 5A+귥@1-Euf 5#!XKBHBVjEļ../t.]}^4w`󓾰1 ?-5&GUiᴃ5 - DVaBzR2ְ` /[U7!AmX$+i JG* 2cS4жETpwtf[9?_9Lv3AV[Hp~k@*B|0o3B9` Kqbf..)뛦מ8IPX DboZKvT0>aQ%f#$pa!{8p<{&z^u]׏ v@:Lg}h(Ei+{ &HHJ U%3d졤4v+!Oz(is4ڢ5n9GjR1{h d,xB2CW5IDAT 22C!3,U~ ,1@y)'jӈ4X2g["fߍ^\FiXc1V vU 986a((""A3OE@HbPH"FҶ JFM601r Wi-,Gh_miG8pvmes;Ln׏ Xms;heps{VYJkA}(5CK wKOMoϥ@ʉ7 S#HTļ"䕁b%'**@MI)B Ԋ M!d,kHW*D3MDr\.teC5|\n o^rYkwHWN!F7& 'glԴ!!ycz!jqj-V@%,SBNV3Q+-R= )>h K]ێb3p4x{w`(J\0!Eh HDw79 $0)1fQ:7L׋u]u]dmͥYÙauZء?'u#&.R.r c>. KH?sh*!yhL**~DV$+H!Y I8q^PO嘐P.[ݖ5oh:J8q);K79#:FG;[뺮Ju oHJGJ*ހ(A ggܛ6Jɯ:l[$u)6n)XCa0 8jH)b?z/@+3";bʈl&'&H@zJ6,e ͎igkE/kW~_Q$n=)g >B36O8z--;A նK F;spіG(Ѿi_c$U8ܖR:x<3RJC P9k k* bl*͵`WL)Bux]{%â 7v,\w\I'RBLh kspFgUIc7.$I"gP\5&+SkL\.!$z~WbIJ=W36 ]}ڧ£{oe+÷]wǛV[Xea 1]J(d{T<4tf'$]8ſ˱vA&z UK1E s3^kvh n "L^YgdWIzuk S^Sw\fRųG%aejۓowzi[du]zG-:5XȚ jm49RJ"JEvh &QJT*R2d(PN̋6Zֵaf"ry_{{^>=9׼yU{ޫŃoxgznln\tXwqs7 -W{ VFo'=޽ޛ{޻z=ws=sez7ޭmɜsOpa&y[}moV{_wҷF|Kn{ީw^{]]{7=.={^y}})=w j>|<ڭ'*|R\>8,t>Gy|o>o=nw-=x6qg7o⽟}狼y{s֧yaY}>_m}sޓ篟vn{y&ݷfyV}箾OsOz;|nz1ྻIqzg>^y7\>}k_puǍg+m({4A T.q4:sBS{lx_v>Xg}ﯚl|.\}:!ZưAh0@# h@eSQ@: Raa~Ee\GEǛfROfQ'GAyo~菼m *C)t":d;/q6&c"TsVH18p1#b撱qr/v^'wjY?S̾Nx弼!}$!5u"!/PsVşP91 v{?ڤ(pͼ71C-awKHQQO(~8723H"g;;.p'DAjWk=,uCUV:2 k=Y\ߚ}O A[-("җN> FH'0PNɈ˜Caz=QY<9ZJ}Ջ +G)x]e!c\=ݻ_sK`&aw{q8b|j$L"M÷gAQ6_#C%̰m{C6?h/svQkד]psoZLgrjMpA(_Wי܋ؒm?ݣ&+N#블7~i99kYNY@?;C!ayOntoYmv[Txh|Kt ܡ.\?O\ӡm[8aP3Y5-iS+DC`|ts= ]^dU- s8Itf\52kPh-<^SL]f22`y^=/{*GÍ~c1!8pqş#f%qaij\'s{^*C$4~*gyC3̜69nͩ8y\u_]g>+y%]BhÚu_|\7*`$k˟NLǺ(R= 0"{SI$:>(YQ NҞ"XgάOͽ~I N2JՉ?W}&0W:KdQO~" I}O9諯m1X] yMPĒ=R+SrzQm3ԗ^4S[D1v$$Hɛ2& `az%{5DG?s.ku dyHZbS1gCÏwt4|ZO ٧pW\Dgi|~wt>-;urxnSWVKG蒟]svy{/غOJ4k|;^^gmq o3X9qa|-eS|)tłPSlo _*g1$ p`L=QIjR,(%CE뙍)`bHJpl|d,Qi$:fkA!cHC3'K'{<:/{e38~ׁX;}>/Rc;ԁ㑐Bķ˅PTԤ:RiMi3e[atP5n*leti~SC: 1;Dho M6 "sD^Nw& 4xwR,Ӻ/J^Mí)ReD kv, -'5Mr.c `0C]\}nvk (gpjB-X,5xf,8d6M0jOV8ҫoB:=NMl:A* to޵. X E=AL"c+ahQOrj}7I@%Y-xAs[jiƵ<9$-(I{;-ۆ&d]M-gX{VkN_}Y'oyY$AT.>D"DA덚5}w[92=IŹs?]KUUH{ hsE|ą['e iwg7N?yH_FFR6krͮT7BuS6*Yu]t#ҹO6JmdԯZ;ohaX!zZX Aۻ~* W>P@b~b Vsn/ZUd6S\_Ih?_WʽщhFQNٖZИ|Eu]ru1 )u>4-Ho aH(L]g rq'mq avl1KAQ>:, & R %p1G|(uiwqryݻoF&K(qE(T$m.yi/L߲^h?0Ӝ-dRA8\O?M1Z:l6׹[sm>(RRO(ϩD}07VߌLRzO~Ʀ_p]šG3/#DdS2dKT-`A,2X@tkAeQK _,ж$]T =Ƞ8 g1 uHWi;&SwaBMꓵ0=e9Q/ҖU%`Ys[&}/DYXvwi]Ys+6<&L Yz7_xoy/w)e릨 ĻG%ũjey+(?"b'i~"VԠR^\TSV= iH;Q0V lF"blr)„ JUCp$5 y(ħo.dHAjePb'n14u+wU.*gJS՘BtJuӱR3\As0#5Fc76TS`CO9wرH5~#MRFhJ#yBWZ9)`8;ɜoΙmMH~۟gcn:l b0jeL}|Ǐqb3f1^mQno-[w;Dh$)%zX`B(68$q{o7_*}~詳43Fdd^hE9+(THdyN[WMlp޳<l9h `m2#(*!fYI:I~owr#^V_sװ(m HtCo]1Di1XBy~;gy>{Mοjt&.DDťc뷣qG=}yea'z\UDE걼ںږau~ô=~SqYHۄ; TZ{{[s/@8,+%!UyLV,_{>WH?F1}apM߳sڞ;j"R H$3jꗻKogw+ge"~Us/L껍YTb9֖",j#zR4%҂ٖB:AP&uz2 l vu2i3d}%b9Tc#TBf0BJR?V?7>'>$@3Q骈9HJՉD% Bk(s`$&x@bh_6hTФ& 2QCu rgⱤnvguO_wdu UEoX}ct}/N|{ڏ Lѯ: Bq"#1`o:(aMB:BLՖҼ6}0F$QO:p$$mWaA5-_m&@҇J !׶DUm7>Gri"gN/wLSMe=ܮ s)psk\XeOPYoFz=d$<2; 89/JK($)y##ZN?~2m5N_  練z^4 tPTϒځURdpvU-33xQ / Zi,A#/ 8X = 6x pCyj>gw=2˔m=A!Im_Ef|$,¤E#+.nC-[ 2KlR>LQS'e,PXBF˗}p?!Jtx*KGРֱIN_ Ni՘o12n,BDSL?҆F|*8"RXڙgsa1ݜV)Tϳ퇼'ύ5SG6ru z !|.gVKZR_Axnu4iJ3;]l.ɧh\rHo/^_cٞNNoZgZNS. nnz].Q{]#s>K"!|fmߕc VvI/Em˼/*[^R'aIqUϵLH<?׹6MvþT & G Yج׫WM"(mn]jrSȆiT*9|R'7Ap<*ϵz>Pgk JTuVgg7t<vVߨR5K>vٺޖ}'aNTڤڕMZu^Ud\" /DYϿ+&Y($*tb{f34.A"fsmdl6Q{ț2F4Ȉ$$sw /U``Qĥyto{UV7^mbx+(å4GQʃGyP$텋7 ) OVj{{{P9~񝯑~'2}f|6ta t^&r`mΩT Z:n^N}CtTKoU&F~WLcI5Fᢕmإإ6H }CQJ5v ! oU?EL$0{_ W%HaXg꺧~xUHH|Xi@\#9Yyv`g}L)I@+ϭY*^d~oH|SOT4,tDPSɃ"O{€tV8?da=#'НNB5;9_|՝K2[i<6w=ڦAcÄ79 dPBA Q)xȻLU+j(Eu'](>/w(Das/GqN 75^l2H \˗Zv!Ϫr8f"ug8G +TH*uGv#!lz'+l a`AQ#^̯sn@rWpz5pIKOV jI֐ʺ j?;qȮ]IqE $Ľ=}Y튑w6 ASRp RrKM̞֚LIaT[ry$ E뜸N.y{Bǒ&HIY0dard!D A"$QḬt AP 2dx !#~@~60M$"R@20M2)gQ?ȱ*1dJȖûBG! !p߶G RAR"2eGɄ|w:$9yFGH1d|PA2g)/* D F0pP?hfm{tI݈O1HH% r@|593 B47$`)XgX)ه{%V $3$[3Ab Uu)c`}d+ʑI0K *Ć$ @!c0IP.RXH`]Ey,?A@EkFD9dD?rD,Lo3g$G? RH&ff// 0!3 RY|g@T H(F (IE$d4#ȕ $QGѴ)~d2$C|)&RN `d@$2%D~ ܊L2#0@&)}i%,G$B?v( "QE&.~fd$$F30A8Ғ>#!D0~F%:grvBMkJ4&d*!Nqz^߽tkkjoǍ]3Is׹8&rc`ߘ4\!ɵg5bZDCf)QDH">{ ;/F} *nO} ٹXM 2h>kZeJyܞ%GF[<%H=[@$ $A"J'ڟ\,]HZ=>+zg`_A89 :f< ~vv '^rVW^?Wvsg+$ՏLZ) bzk.{ڬZ1U6ߥg$st~MmY~t4},ϖ|ٗ9%֬-ξ/ZT4@!o)fmh$ΖՒMQVL\k΁T蒨ms|^tOґ7w?aͽt>+k]WTpg=mWtn܅zGUERM~KTJI)"\a&܈ I-~I^U}: \ٿ'k?}` &=z5OԑЬ}l혀Mn8 +4KxO˧KӜ?yǟ;9N  DB" ( BD}8;t%zk? Fou2; v`>WR:8?Lȇ7;~ $n yp}"/Z N"aܚ =p Pn v,cF2G.4P /q -4B< .C#w. ໻$"72d ϙW E!j3ya*@p}&%o}yÂe\";ڈ0d75`΃;1wM  Gz2[&0:܆$$HNxPdoQ5g!39I* w,`7IN0/~GE"`nf) |>ȇ&s 0q9c}紑))$o1vd7(H^ yA8I{F>A>W$d v.Cy.dE<L2$b( Q@@@N˃{uҵo≢P~$̙V>?7*Yx.`l]|,{ãNuܽj޾/̽z0o$x H'xL'|PB^"Xci6ih JM*/+&+=g%T=Ը%+_4aj8c* 3 )=!.M\Rޤx5܀aY˥Lv_C]FKlʢb˗8tPGfx}̼yoPD)$`A Hg쀫~4$13 ,6=3.9!hq{zăo pE4hNf\DNL;3.2 w88m0!`_.Yhp=XFxc^p.#34G~Cnz5- d]p!p`Ix;Ʌ~` ۪q*@$xwPdI @8tJ" !ݣ0  FPtݨ0 x% :%mfPRݳFJ7o Etrd`uH.*ߟyyD Q$"(QE@$Q# O%RgnLj?N&//k#}m߅Ddgv6dx>_'ur+T=/aT'.*gMo1tZ3zK*K/Wm]<8\+蓮3%u~?@!Hg2 #H&AfIBNs4 EIQ  D$H2| HA&#N)%k D ! $jZ v{ FT~ӸIF yH&DRZK RD*vHGS̺KRCriGﰚLo84YwM/ 2Ӻ $d3̎Z%U|`xX kkM:?'Soöf`z(b^y37h=mI`} W9c[E{]V䰏̉fGHcGT1py@q@s)Ӱz+8jD{CB sk}C[c?^JaB^߶0;q{޸E'abE̯xQCdvHW.=fsmڠQ~ 788a蓞^z>GV$CoM#fHR0tb mfv]2 a($zWe/|]"`HQAO*XDA1&[ИI]}O ȋ ot8Obs98ߩm_YݺٮtcL? %w7]tbbR8ΞY#[L^CpNMMIՑISxp"3c* T@e+ fB&IGmLK $@A48d I?M<ׇOIa3G̃"A4?&/E2SJI8EWN?[3&Z cֹsȱF.F`#ueUe"^\=}\Ϸ!==e9ߧx?N/PiL8+U- % {O_.72֍Jņr%O`g֙|rs}[g aE?3uUQOzvooR|BuԴ.6WۘMe XTlrɂ"! 3uOD@"!#A " 6+cXEIdh. 1̣(&jpS Lg Pf *9@? hl( ȋP0r?4"#yt@u))F0T( H E \"?"aeWk_nQg\mQ~MQ0tpPm޻+[Q#萓G.jԫjJ @f$2IiHsb5nj'SxLe`~=bD_?&W=H6ժ𼳒:ϞP@xiU^3Tq#7jkE"~5h0[z!d=Eviُu)}d[n'8E`3ˍd ESs{;ن|'O1wY娮"ֿI;%MqRrv\~ \ֲIKs]"bHjIlX}HVsx~Gœ}tQK(!%;+줤`}G>G31Q[ny.MZǎO'| :_I19"r&|O6)B_XItv_@S =*n v@YX8[b8jX_KqLq P!L:@D0.@bAr&_硅HDT7<5bѝC<|e'6DCL ?KEݿsxC^uI"C"n-Y<_J؁J]4mn} Y(\kàl"9r@68rHV+;WE]H y]w6$"&\ ,l\Ց iPbBNc4}eZ-HiaQIx?-ulGuj6{#T`H]?FĜX1^8f7إ6 /y̓Wy=Qs"ʰEüjCPš5N?9i9XS6ʤoտ.?fY#Ȉ'o0`E$nو oVjz h#|0k5jPX^CrADesI}K/:xmQ{犂!LCE 眙<Ņ$9%f e]I- qDM}2ϣ"*<t|iN0tԂ5FJr~zN\00H YHAapJfH n B@< Ahl'9y뽉ZIP'OQ OU'd "KG`FQ9}=ihh?%(&YUQ P'H*ZT t 0w,sۦpKVz5;bns?#kYݤ)3aw8HTotDmҼInXn %&Ry]YKT3M }WOQL7R5@(!gkޡ`7ac cXyw}dfP}9EuU*Ncؚ:>qƼ?z;g«LžgԿ3UY'~xq|ʝټ5ƫ=Vd17gg{e'>Oנ,U"6{|cc^!o$xʻrY!V=,_`v5#C5Gfq NPXw޿[_9?eHya* &8q;d>~uECåML8۟B 6+L7THWvlDs{gw;TL^4D@+ [*MP7!ŤW{Q@!Aр*'.uH}_!LCg}&wtMD9BLetwXT; 2%q61~{P0st[}IQ=E:?{]gT-;:d}J_Olv}ˈ|_a>i,kҡ yo=g1#bWձ SId?/A1, I =9ܵ|V-:餑 k7YԢM0K~G .01IQfSq sHzʹVLtA =EWj"1 Gb6-֯bT;<PF>ە~7~QثJyK<~1a]T7th"_q`! [NB+*bB$n}hlWt2$=HJQɷۥx<#(ri,N<FbyO'}GJ8Z[:{ca]J#jC6o:><4n0Ql}̢Z<b֒=57B`jpCF 2TaZuDnUq6u;ۜ&l u3$I$pr"=RD4݄BI\q(h"ha1 '-Kd2(zt D^XD: {v'ņ劣%"Cwg}wDn(Zap`6Ds!!2~&˨#2ϧx؃id rF&KU{ڸ:B!^&" b7xdJ5D 5ÚeLï>wrb5[ty1/,Qyj(yhWv=]b*u:bڋ qӔ~U`[ݢ ԗ\v}cݰhyWXL8^ˠ>AGyL %H0^c~/_:PTh (vL/x )Z_)!q~m{ R aS"㼣;ŗ ">KqBwU"#dWiy*9{H7Ls?'s>]qx75(|>([>b"ii4ߪ905_u'N9D^%c5,H_{e]!j |9buΠY>dc0/Oy`p/D%U,,j=xeQZ]2 ZC , rlTW^ 랶GtaBK\ZnUzNKWTRe9njhr*S` "pF X_8|co'uspT!#vm!؜"ArɃ;lD8tY ( PL"..j2@I0mhrp{ZY\n ` 2[8`Y%1# DDa8yb0C./2 n." 4_ [kЩR^G@2f[BԖ`{scwuA9;^aG.^T|}_4 -ȈDl9O,4P7 *LIi6Pk8#ml6ͼӰ4a!Û̞Q>1 lTāzŭva0=mV7£Lw=IʿL/L"yKD?/xWh>{#³,mŨL'66`0oo3\ytS< RcxmNc!&Si-o?69 fBѐ<^&cgx R~F4Px3`ZS{t&9y4@-^_nԅ="H'@#X2*nH|#H|[݌b 3OH3UQǃFY-SՅo eѥ,FG)uj"{ԊR`Œ*B#W KQ u% ڼ יzɘ\0{׏æz8U@ [0By7V_ͫDXV.5 -fvnuCR#\ܛjXr zwv+J"9wgj`p2#k0~IGo_8gz?7Yҽ ZUQ_(р?fDak1rfTz[_# .dKnS#nKC`|]"a-CiXɜ#u=5so!G9ꊹJ-Cc@@g$>\ ?-xT0#㜭`l&@D:$7FAS3@Ym9$Z{2q~ /'zPJ s_~ ְ bM AiA=–QT1Hq j I% )% 3Ruω_(?+WjYeW%h8{~ Ű39B燊@ H=DU?q#If3zzH+>$g!9^Ӯs6ۑϟ8"81gO\}7IBqFJ\u7н9f+j\ s(ӻt*.D!]KX~V4 R"#m ;JqX{̜UfO˖Pnҍ~DV Mu(>*1TE&E/КC_F8D$ u rStM(73ziԩggkZ_ۖMeT2,n(G "!IQ]-C|eH'cݴ*W).͈qj(cl,H#B W|m@yHdOLA%E6Et0\e X Y%P͒#&g^s @U+z^F&6OV uߕXqGD@Y3!;3H8=8]B1SuN.R٫YmqD䭜>Wp͋ifL B@zsҕ"Y8/?ch`#H|tZ@MܕH Fm" |Fl!>{Cm"*E=P<"v*,P@q#7E~-\9q/taDTU7C7yl؄c6m4g|v gɸ"E(T/ y_/1.N`0 9 LI~3)$f0oQ~~[R,Bi}LE$T^xIF8?;CaYӋ$mVn^=Ɓ0(s?[v/Fy}MAgx&ocpk`!ӻ-'}:*:.ZjLk}H0ns(' .0狲)HVAvb+o0 Eb_!q NT yȏSq)9=tuyG3^MČ![xQ6[,^hս7 x4 Y~=|fgf&F,Ҹ@N߭PcWA+ ̎O$qeiSIDŰVuM+4Ŝ~TP9*TMhk(PI#^ŒV: ]dȗ+DVC9w؋c1`҇K$TuTrUX9V皶G^4↴Ҥ,EADIB7sAfԕ7}㞝#]ff(tnI^ P]ImXu&gW mƋy xxEr`Ox6Nb}·g&3mVqm= UcU, DEe=H?o}۠N1x+f j2KC#BK?q@%]$\w#L">nC(0_J} ^MyZCɉzWvt0DN?ru娷ًdQ0kiZ^%bxS}jȠV>ZGy] Α7c=}턘>S̅uO0OQo Xn9 fEjȩ.b7 :0οmνTdn RmY+}GelV}]KAdu4j㪑_Hsitޢ2dhuttMd~CSP/8H ]iem 5 {cЏ !}b2(MXwޱbK<H0qEHDBZZ1֕Pa+ؙЂ0$ЪB`<63TadPaP(#'`yZ˄$5[E^noT RA"1F8#J|DbGi56c1Ϸw]oFF"0#ElpEšRz"5Wnz0ߵ1io-1mTiH@s9!).TTl\w _> &5W?I`vFPpOy(OڳRrlB?N#Wgn~Ҵ00*w1n%CnmuF WL$dzUdi\bd(}p_pys'Oj^/z,Y%l 87/Kߵa?0)e,WH3^A /6)zLG4n8Vz%EM㕭EnCxHMP.7h}V젌lW6B#J/CD8ֹؑD ^+m :~ݐ6}DMݎ hQ"Z0qRZ++r)4ANu~*ʺ ּLӞS;sAkAmpK!dJ«)̱Sz>F]oA ye FQS"#Sդ~6{-d`f1]%@={ZTt䅫ygsPAPmb,`sxhLt${Ɣ#xEGu5 KdKsp.*g|I^Ny>)J0[Am5`u4hQF c5Y ߍcCi(&c(4G8TbuզHk1l1_%QQv$\jE GK̃A'uw"me*JS? | TT\x2K֡Io+HY@_ tܰD^>jϩl8H@M~GV$)░K; O)QyCVek@Ԃ~tDSJB~CJȌ!@`^x"s2Z&b- 4Q_ir=+cS[h#'Sjgkڶ+D_Uޔ\}o]& X:$ Кi*ѩ+QA'*8!ğK?CZ}9B,E,jL_ݸ^V﹜g|PMhG΂Own> )sDpHPIB'~&,E8)"5 yYKM;}ѡ@~SǩX"AHl̕H]3c/ٱB(&`uTɚUp8xR6\ q.XuѸ"TٌDCϟCvՋh5^6)$ YZCN#/nH>!{(fZ"T<ɄcuExټ᲎?}8+_jN8lk>M}Ӄ${ (4vם]@BlF;6U^SEk&1| tT8q9S*.a~p򢒏ǙfTsF J . 0IC.}(xㄫ2_9%lAG 1OH p,&0;(,0v~%@̂%ڱW*rɏnzĖg66s1~ ]E-& z?J |~ߖI4O 9 tc.%`FKJzO60}-/uMk4.@9T=jo՜UG jN+$ɫQV%L|7wQy0jK+!0-zKj!'lR4I g;jgCTQvP%4.1e&.KlB}4 dU^OЈ > $( fI+`_S4L`ʂkGǿ["؃Le'\5 kh֏{DMy қZY.)V4 n%,RAgaxcs9[#LG[t]D:>!v$#5ɘ!\FU6)C()$ѱ\ex<׊|HჍޝK3pz@M ԑƈBqߟ_WcOr ! B#ھ'H_k칺$6r4yfjF7{ lnMKFaKG7^ 2 *K,䛳]%. ~0W-Uj׹>viJ3ti(bJDftU&;M- @k*#/#np e?|h>@@m:y]-ߤƭD*-tD!DN"bfהkͺ4~#J 2yδj0nhQOϰ`¯@8@RA*ؾf&Z>I;+#`shW BGDcY$['$(A|pYϫt+Fo#l YxL w+3Zn'j@9Յrp?~S:١H%JIq}c(bњh8ʣK.6j,K5jjjk a>Φ[c~gM/SY|V겠>i<඀I/̐Tr {nM-Lhʂ0Y.`CeDhK.e1#6d$%ύ6q8I) .ؐP}>n OsUwotѡe0Wx\ ϻ\V22RRSo}SiE~z9nA&²?wQfA妍hSb6*;sV d c VdbFw"G͌΢sWSʮ eBw)Ȫ ?B:+{Qp&7F(eb-mo\nu7?WS]G @`m~p,=~!"a/}1 Y_5ԗ7-mk_mn&|5j>: $./mL;Ž\# E^j[،\5*s".i+_r'zO/q=L,<;1S4n"@E8LΚ]Yh-wڐ+B}v ^cb ْ }[<_`l C\o6Oň}{6ފYC Uց]4G XC]߭q?~r1G6nNeّn=pSܜ%y$@C`iJRkT9l_2~JZքplj8- 1ɑ_ؐBNFHTa1LW?ě:,uo6oYP<=vxV@2cJjmusGXhv6D.yG|Ig++_[¿?YąlE2! tߋ~>0A{eB^BU"|t>Wr/ &}w菪$;{'W!e q=e0?+Nx&tRKM? 8i4ᢨGdҏi3\辌@I:QUZgs %ob%}ܮgSgH<dx>o.uT? PpYy{^֜`U21;oǭxxjOb,Bn@nf72Kuzѩk;?ְ߉Ik;ޕ {|q;B/E :$WX( ޿>rg\ٹr(Ar9G7y\g+7"%SBY<˜S Fr;!!U}nzx,x@3y^4o8~x=_bzlZZ[EUi $ZHvHm/ō8h&jE5tU\,mW`آ'đY;ku4|#dq~?v9Z&ƴq<>#ݒw>bIh8I?;4w\k^1^R^9J<ڞ-|˻orc6Ryug_OpL]%~ 8,98ܝddR [:PN߀ o cd3!qr3.\$m tmo Z^nѕuܗgF gȎGgTc;S fξJ/Ld}\ к8LD0*}Jb̆2[# thzgL0FN,F:a'7*\>`6".E[F[_oR˥≃-Jn.W+7Wptno\Nwl9I}"4(TLɗ[<3^eR7W-\Q"!!qBAm݌&8BZy>FLr8ؚ+15s(&x4c'7L^ง:H YiɻgZ2GlFy؝qfKo.U[/+OOQ5WnG7z$lse\ Av5xRl8#}+1Zd8LlF V97<۱"3Zz>}q#xєeS@X#_EsLq\(F<wox7$b+o%xľ.~/L'<] uXF *)z*~`amͲ/ٯqO)eqDnWŽ˷=|'3yqx-K/kv[KE6<`t5OoQh.x cBB7ќskƤǘ}2A 7 LK+Y/Ot\$ Z b+ e Kp*Wh\m3+u*_GIvyS;3to繢>,_}<"ǭ ]E1` i΃VcN+t$Dzݩ]/kmT"+!L':Jk yzcMM^0#@sZ;uUӆ=̃KV{ˌ>6g r1y:9Cr? ElxZso0[ /;&mk|KfcyB"pagBK$#Mii *=V.&uڢ l%QvCY:LnBSD%5Yz$9KPccO9%x/nzz5+([@~[;QoDgoælj%n.$rœa<>cϼ%C O8ڒğ1FC@؃9a_A.Gs 3ԭyJ +"x'rJy8~@>m姦[޷֯C3G!Yild7+wbdgXjؔmKGѵT";mo}aߦ,8\JҺwuj6'+˅4/箶Nz |r|`[IO%ؑ- 8%ְB]ۚBpzi +rļfCL[hTiCc2pSƌޗ/d2؝G{-1m=ýsY+39cKOEf\Qe#8KdZ-Ȭ,Nw(n"oeM7t}ߛk2YVt8pt&}H r.UEZۇ{ykϽp)F\u2.S!nwA wûO4 Kqlt~-/r}0&9& 1`,cx]c]]ԞDL!^7eB7!ZVo3wTހ٧zM '|XJ6ޯ;e?g֗ >e?o@߻)Cw3D6w\hDsiAӆAM'ˉԡo䛣xԚ]K-!0d""i"-)ͻЍ}.L'S꾜k~4|j[lj2( ,sH2 4!-_8N;Šf+_:W=WJ;Ys ~-WgYrX:x@f7Գ9,8 4@yt.<@L,t['-C^m \6`ȵ T}Ÿ>`kС߼Ȳ7Թ 0R |c-r]@ew\PTj?a1pn{xL-!{G[ 8m'Z*FR-|&rKݰΌPPDs,_sݳےs;tտR)x𺟿,7'/ïlZSQhJIL669G6{B F4fDhJI\qHcj#SVEџZ#s Is"؋:9WX(9xr":6v̬c08"YateHe~a*%Ms?Ygr1*ؗ#- m.^s(9d)HT=)%?/'\!5y TOR߈0YѦ\z{S.km-kn[ dR V_f63qmvyێ]=Mϴ8O>s 6wSa% fum1t#4Á4$)2"AskE_&#(QhʷP_V<%c5Yv j:^܌|6̦NëP Mhꗫ9jE7;:jk /KOw u61{G[@y:zntDDD=G++MK1jDҌ #F]B=9K;Q:dI3a YUmBZ4 ]AwHgV?z-+A~=w;f,c;yђY Fh⼅nW|Z դbud}gsZD7<ȁҨ턒 m6tS b2-ؾ h^p8Bz/on's~ٻ6VN3ZT\6J|yoc7@5CH% "-,/CbdxnʑfPH˛8QU!&=0WY]x5Ui3Qi6 Vk~{71nk=L:sԣ!؏?1M:Tsz7|꣙wܺ&"qn)ިyf۽ ?:˛OWIv($r[ Ųٜ Xc$6G>2U5u #j.6KtjsǦcjC;걬.Ysk+gVџxwWO|ZJIkC !>-Nnnkw8AF 5ze^yVZh r1ek$}h-o[˙^ÍNׂ0wX"7YWoQxĢ޲uq]9x\QG@|a C/|{QZC><Kļ hE#Њ]Iܨ~遗 xy).$h3t]DpN6Q qhr[25%$s-Xqӷ9IRjG{n?_sk{Nhp> vlJs>]d#H#"ز<uT=dq?^يkMӏa~ݪ&F3GxD`$R Yku_\>n(xyU5HntBf~gxt IѴO!rot7\$^ SG0ćܰ?!o*/˟YhaHghID,2y2XB?qiWQ.G`fyqL.+4)ޮ_J4-VHy.SiCqxNF<1C.~hL^=h 7,%;#wXQ󰇎ُ߽zx\B6hn 8-c'%':#"dc2:j1rQPW jߙYPȬ$O4]J#K &焜']weC Xk)Tc?T^q6g9_qsƴ)X/QJn,XWH1 GSYT~QTty UmHkZ Իl5+_G`b+Nw+ V_! hfq+QL̠ e֬?%U&UoBO_r2W͎rGs=W"hp"O%G(m؜PQw%\ɻǜG?9C Oɦox8qRѣ͊TDdsוf<ϗBήst4KGxpts3:c2rl&iVWA?ӱ %/2$P0wS h8MJW]Ϲ }ec NZm𬷧cC'B74ϋ-<󄏻 [Qj PGV'ol;ʹh>Sxof͝?J4-a9!}>L}?8}!v4h\.vU['[I_DU) 416kJ{xBbY*) $/ @[5i n_%z >uzFkdDs#+&M11nuՇG1/b(opF?[sD_o4teK@^i]=e'#՘{TNvU~ 2nqp<1?l)cƽBѧ7]F}cW",ҮDDp$ws<`󩧴Wp Mh3BdJ<ܰKLP?a5phQbv:_10#3ID$2D"gkqV wFI<^o#vw2df(hU0~qد##`[~_W;ԗx~euW里sgA{*IwM_E,|sZsMB*NJb^F4{pFu0D%S|i.eWȞ~0KG6p2Mp`#|f?Buq^1>4tx*;u"f[d% u9ə" 4 (H24'iQF1 G/*!V <^S + Mk l4YLjlgyv6ó@Rv @\s,-P62ǙQY*.]}],@}p7:{}M`-j)4'۟6C`PN7pbBDlȿ#6?t}F<>)Yk~Ml!TÑwhg>ߏGD"SD&-cPx[ȟ%HGf"`QR  ݃'IJjŌ D"-(NsB! ^Z! uMsgp?0CH%$'BLĒr/o‡X+Tbh(`B?ۿ9&Lf.b S#i6o— } Bq?Si`0):c'V8ʊ:Gd_?E{yW\w~:C"lKDY HI_Zʁmlu?zܷyސh1SE!#}Q$^(s%خ4X]À~MLB'y`uXΚӅjHUmpMfq) 3VGHtnYk F԰-& wr ˈzȦ m;  `욋ذB$Q#8~˼v:Ǹ{ݎXs%wbnIҦ,jfL<F[I22!3 BBHD1ūY9v*}eoGiM﹤+=g:#SsKiL-wby /ϬL}m&@U]y2X5Gn[EUjYhfR܌jƳ/  87a`rP; %X\!X?k=[HɫXSl?4gD X`f̧SzX;JFl1 2ۧ(\w2DayJʍؔxPvCRab$f^Z_#ȡpZy0vІhlma}ԍ bJb=Kx_):0L &) `%gu9zlkHzՕ BL[|6rBU5JnwuC>A?wm(%`JtUd%Ms/cmh!a}`Wێ  7!\AϽ2Ѩj\haUJvWJq\s_%,f7[kT?u9N2n^ }m8dm~1@`Hb,,5HDBf^%A%P FFA)8#C",s~A`Z+1BtP' ݎ/߅voUL2/Q͕y?6M6} -³!c=@R-,>XlSgaa⍋p<$/b{b25R ҈OR5p8 ૣ!킗e$Եի]^*aj,MgfB~;D/&ͤ*d el&+įPM߮o[[x;*s'f^ºq`p&}.2 uȘT[-niQXmw_MQBz7.3zoRh?tf:д+U)`P8e!>~D%9}荔`U0pd!no'ᑌ(i)p(!SIyQ$] >%gMkqV"RX{6ΉrA1Uqil!8C~_Yv -q Am6'!l/FLÆW>)UM6:VO+T#N3* HKF $T@Iޥ:ye yI̮oKͲBdk9ˣ!_t}r^nE›Ob&AvHƺ!6{OU&E_;V3IG9w߶z`Wנb-Qݥ90>lVM&~Nٺ4,ZIiBF-v&DjlIrJccmCRh2lw>]Po6Q b,p.%OZIhM5P!7iXW ?!Y [)C"y݊- $4@<ވbczwO ?;r4 BDaPL <%6eP5hI &>e"o6QWQS0UMnO7&G ^&Nv wu9BX4{ORqFv%*}%]'n﫥):>Ps "㣜}o:8܎m`q˔H*!76S|>O٭MΛI +i<:SUS" ߺ5ahjQp ɦA$WK J;?ks ѧvS[E&JJRTRvKI6nUk9і;0AZ!Ӓ峣pY`dʶFzMɊbc~\A=+Ҕ*I =ݵ9 )[ CKe 5J QQ?Č- "K@P{+twĀ+ otav4$A걎S8T 8 ^ᄜ5;#jS(n иY6lLSP̪a0bl,95CNCv z^K܉bJ%>G4h2eKayWtlV\0EOJJ+el9&ίXFoćݪf' 78Pd84 L㯆U$_s@z 'V ;{:]<~+Y>/2~+9>;}_fp*;>y?ZrxjXBrDBm?$GCw2;*YAPm8.{䅪Ǎv1EGo"\ajw90>xL" -M./oϡ-;,(>V)UiXw{]}R& DJ Ȓ*L&GA1M]\b0~oWN)('Z$`UwgQWOT9bФ<7F'e("򑬌o tѿ񌎛M_M$%;^_>cn@cd6'\' &Ԍ(Rc٬UIsTqn۴QnL+89\Xyc72 йm)[+Jo6DfQb0IGT~|50 XH y6.k]`3\"90ծHS2p1LNTÅ{UoPb8nP_{3¾R_{#F2\˪X7`Uij uz%{wF>k"I{7rrbMrׅMU.ӞeލR{|_]_$MX?<)[ʨ9OO(|`KBDRp YvcRNNX>>OfX [唱$/xv lz#mR$2vk[&G.[k]ױ9P8AQq(@%p}uܺu[ga&JNR˒#n l_ ,[w1HZ-Ņ[K?lFQA՗7WiƧ ,NӢ] HoAHiֈpyM+[>e:n|Hpne|t08~pC &i^QMyF2u52`4GTQ]^= V[jZ,0~hzwDꊍAۣ 6 .Rbﶰ՞k͇[!oRiP n3/Dݰ,C";@xcIUn%[U Rkv)H^?Tڂ{V m?LT<4+ ΅ܩ (cȣj$3>&^iUnT ?,E*qWDD6]]_?ptUzYTS:B!aAE&bՇI$;֝'-Wj2׹ٻߜt CP+6ԍqZH$DP\T }L1g~] sYYKp7\Ԭ6S[tVĚ7-ӄah 9Gis*-Bpg^-mϤ4}8O[$!IXUD <\cTၖpgNS$>$&wju͒2mʏ\ ,m~oUYɘN&iaC($WxKcgk+ۻ-12DͬTx|93dy6Xrÿ4Te<rq@R  CN)Q$B[3H=DS.i>eĕp8ɼg!Sc#R'es 8NFLdQ3 L|^81< u$$*]$gz_Uff`fX _twZx?l`[_s}&t>6'ruVy'^ha-;=^!9&pH}Wp@3bv,gWVj*?g5k>ϭ!!R& jܱbX@o8?{sNMO49 Ϙ"8N@ 'eFD}i}cٻz(!6/mn?)1 |:" {~P5%^'c$},x_z( LiBV<, ,jv7sG/lkz۪6ue! `Is3x\du:4Y6g͢G'훹8/GE΋rq#э#t{D`QԖQћrR& b&s)a/暻&~L"VT.DCl1!v|?^տ /޴]t.o cu' R/zq$L(sd2I~^;.u@͘Z~#DݢIR JMHO;dDU.X2V5]/_CL T&Z5d#TH'L˅ zS ܡ$19xe:k~[s)p~o0iY|gGN<(ߘz^ y[XC\ZA4zO_U)z]Y]:T(]5=V1f]$g\)(ni&^kz%݅DʒtMtK84(Z}UüU1OfkcDOyٷD~$Ljfc[Z;YƃHlfF.7%ݍ8  Nv ?'ֱɢ'eեp|Idd@KC<"U<&6Y. BX9sܞ<)iWJM-O0E*fi0ؘz>]o_jyZ7{`2|*]fKFg5NMOhPcd'dly21;!8@gpb'v7^J`K%yhdh0V؜H0=T0υi)8>/*򽡌X:?*}/ݝ+ JCPuX gLvLѨ< Qci*st={{ϝրj0^%ꋇ4/fȃ)@?!o|h Kz$;'[(a:NU<&w*Nh ôzf?WC7b(yYc]Sm6<鬟-,lO3c*0]ZwSW31-'wI.yT(]NR_|xNxxD? vX=_%r;_Hl;&t _~Uv?~يZ؂2cwk^ScFJ4J %]Ц)؄M~u.1<Q$LviAH S[cܚxe?F;#C|79h\ƻ)oSCNWQ."gZz+0_(>۾׌Jg9SW|7x{,jg +K{1OpNL6XoyV_ߌ׫-W,pӆ-*"7 1G8*f€T}yY/vMugV~Mzj B\į8sC^ĵ0i_'d?Vb"SCj'~G3[auWם[3Oد$ku&6Lk@_s8;IEǾAme)!սޒaA[f{1޿yϓRĂ#vy݇M/Nަ Jd{l WGC2 D:=.SsbYR \*Prk@7{V iUƩ`$2oO$7ITB6Iq;fJ t.{{QS~Uo!5AAlu\<^j;sʹNsMΛ/= q^uG!5jH?<~19_$1 Pv42jqs?a%-juw7C䬑Fp|$:?:y)~jJ%oEdAἍSZ 'l$jSBrتMUvsO\IXN[/ysy  1_`&n3]갴SRkjiŀ Y[JSo^^__fb׌T_Qz]@lK|1 q4ϝp%WDCܮ5]&mX;~ADs _H}Y)MB5AEB @2 U^{S2T 4;DW9xū_}@&ϲgĥpz̛1:AW :v_ ֆf7̠ޓe@1%r}DudF(>3W̃uTnik\U=꽑taVuha;:jS6vIW٥$qWǮ9@z%4Jro4+vVAI<:oVA|g)=7QDH\zY<C+P D]ͮN ! I]B]T ݊JR| f &$ST;!3Kl,4S [Jýwcƥ)\y*\֑3ߣ{[0QۡESk`>xg|h%/C6#忺2E}OgCy?*B}#lnRjOMok"" vyY_OZ"(Io#'ajc>F]#ioݹ%yAZPErE ܵ)?u&Krl@uu69"~&H"Kry5.~R`~6ٽgi:v7#묑薺(f߇-Y*Kڿ_Yb+|I_m e;m{1!P?o&|qm-}Ѵ 9MHM뿟ᵰft5IntQN3Ƽ[Rze:YԵ 3 Ez5l<_&g5@.Ό(@h]X V'GJpY{t s෗̬M2f2UJ~,hIY95`a|TGnx7% \hc tDOf`ب?y5@5t~ ux3@Su*?tC.5ᛟqY¯[Fߴ^wx-Zz|(=BV&qHDak<77ymwz$֌OZ= O8QWQ+JF58""":{$,*iMnv[ߐ r±FtTx=fv?\=FJ~+Լ~Dгh9sd=kF|$*%Pz<6FRan}q(p1*)GI{ߴ NLN{ub  A;nKGyvޢ wYfj~H"Da ,5@jz}hNЅ3vٲفѺ$]b]kwb.uWZ_#t;-ch县ܳO>h ROUTXM˽]ql~ȋmv1A!K~7wgW. u(T QS oS-Yݿ' ߩ+> pm|6O#x,|Ƒ.03$B{^G\J\F8#Bg*PPmы@T8XZ hwk鵀9y&"&l|1b7~'nVJ։E O)?jJ]=* dCgҲ>s X@}mL!̹GOf.*&[В(^N0^Hmݗ]_h 4?K5w>DUF{]uD\2}'kgZlgJq:pɾ߻@K#cY9|$s DMg[Zβ'{DU_=vd Ce+? u9]+fcࠦ- ?O!\:tCy'.ߔcǃn VI:BFx|e -ho~a'V?,6%҃kڹ~{]9 maw8+fH6]G;nRr%lz) <Z kM^hKcMղmw 7OQѧFmXguɇ Y~T枯tT Oөa[;NF"QVH6nҤyo*@dt+& rɃڿh[f>uw_j 8[_ ᤋ5V>{OU.+_~cYD]:$Jy u`AcI蛰"wGref/haƶw'eT6G.я.0vH!k3U>YB/W5e|>gguo v}zedL-!;l2x.ֲ 78?北_?_.6?B3gBE,G"1hI`Wih73:a\ebgLGȺ{}v| FCaA kIu[wl*~"EFAx@ka҄2䳈Ќ~G XNܱ90~Fgynנӎ,;|\Q[IesZ0`VЃc_{zWlQeo;65[-MP{[5#<OuH﷗NT?ND*ܲH%zo(D dz (:~{Ő $ I|hU5Pe W n76\A(0H月Y]}7X$23fo=a>Lxq^^6o04E..^:ԫ_WMD|GHvMy k͎S; q.Dri4._܁:mÀ WЍc@{6lN/Í'+8J寎??O<^T|QE3eQYv3 pmv 4u?I]c3$]ljKeLJH*TDA _Y9ES0 9d6}&gf!ޏI>4AGb-Y/Z9VѬ%LY[~CYe;zQ+Oy?#=޷mU\'!6+$o+4s._uWkRJ(Oy#[Jk#j*E\?? NE/MTf+h{~E(gWC(OS 0 7"gc@ҐiRc[2} *MBs*y $XsN `;n};TtKMz@t+ܮRUP+.BG9 9t+Cg-=y1n[Oɛ 7?* IM%{c)A9E9j:=  1"6< pS??TjSwuw6ۑp۹(q=ޗ0rm!P%ugO;ua0A?H9u G p0VЕvqPl7Gr< 8':vjAy5]bn:{jO+gm >5.X چ1o+v2m \Zv(A7g>dC;M 9zL هΖ^φlQek0!B{ >g'ke ?'F劉M6kWX9=dF_ɣ#b~!16o;U3 ,`:o Xyk*'=ҰBZ6f˛ w_+k7 ?Fvɜ}A"ٝ #5v!!%rT"A4Lm6(AL=E/N9j3Ixu:bRyܙpyR;^MUErSt.0E/xFXk)~|ȐRRvn\.a M#olZ'nfULlӡx:CÍn^>0 &6& tBB_?^C7;rVi`Xv3eԳ!{w!1:bV= U4<]'/dA칠BZ@SLݯR;LnL8vˏ0ЯA7>oby6%]'FSvl.v+iKw+x:ÊS`;Qwmmj"[ܶ^%u=$<ߑ59o\ o܌nC&qw!]:~K½NC;Uߧ?`뒫]-z^DXE0+38#a*P腆`-6^f1@xi\wz6ȳBi7ՇM[mQ"f$"&s|26`V2½L=V,<>հD?gODr|a 69y<.KRd%i/iFYPQS_6urZdMgڜpvgvc߅k3UUz<:]߰|ڎvY&~X}ZPkdeJuqt 1K_B 뒨qTmnV󠐹7m=jyRю%yI_%*lnL,.0I8\]=$a52eC+=n4Jaز` f`uGsJ({oWrs[(ˊʧ!:_ UTYxz'E󮷶EHX=דBݒ2 At"b&e=_-X۷Us8r_?o?(:Qs) 1᳹_8[UzPdfbIPÚa%/8 :1uxp?̕Xo<9_X_E^hq]bjO0c*% "1 N03R&!kP?'3&DFz;tMQV35z&͓-tDtX]|.]{kW C%i 5׏Ymh50/V&LgH <{_| [)Ւ4ɻ6lZAuH`í_FSATP1NB;s_^!Vy|eGv<>NL=%bBaSTD'p<y9Gm%Gެn#2-oIMJBvS VP ̹z:E1k.x׈}?𱃷m|d\Gc)4gvBs o;';lKgX]&M5ϭgP8B?0ly Hww"b*FT:_e!2r"nE/mWN?\>]/}{$ڶeSr^_GmDKOv^/0{"yYsPv*2*bPBa}M^2~fp'$r"t|]};˔)> K(3D4q0_|E-<{T|=mM=_/6iiߤtQz8Ё_|ǡ><DO#AnVs?rDM:?|qrSF {ZAcIۯWLڢǩLnGV9%FŽӓ!1ӂa]VaL&3.~f;袵fI$tŸKpu!ib$G7QE)y+ƝxJcGNez"HknYϭvaA9q/ =d#l[$;ZT9 {:un4$ MQmK(ի?է»VKnkO /([W>Wfh]R8ς$x0SB/LM)e4ʜB2 >A ڴ64J/s)\ ?:2 ȇO"~0tUçѿr &4B^ÁJ0.,>d qO>IҲy>;Mv wqy0(sJ1WZL{~ - j?@z$m_m/ 6e7_NlwxXq%#Y/ND kj9BYove.KIՇ=@'*-pgG.5F$PU GkW}hE*Qэ*N{:E>=rզ@|w0A#_Il˯5 bZ&LErZ7 o@d ~:wMe;č>ixr8!čva^bh8xo2IoW{k}GWjE4V| ķQ?l 'G3oUJ -Qb~KOM;Qڃ{Gr2!,oK#vNiYdUl C6>j6G.<6A mD&)KQX@Ç2.>GsVh]gX] "mfb91llGQE:OKN뤚$0<ϟȎ, 9ō ;g;Axd<[/{aD3xab%REHO'9`:CZKO\(iLDlɴVor(i>QRr8f<~IW.Zݮ1 6 z; Kײ;v{Oqw+7| @'L˸&7,*٢4D( R"mK&)9ϝ_79,Nr< }f 0 ONkRH0zY'%>b-li"}` ,dsZYcG Zru10I>sJ0IW$߫[@NJ]51~k3M Rv_GDzN S#Fp,${,wZ^~*.xziRU/!"WYiWZ}w׾~?g=dE/NtLcB Ɠfǰ.jpNoM:ߴֶjrͮ{q^nz <lv0rDAc_nC:'aNkĴ<yE4~,]|9ov1,wk"˯I-|"_6]•Űv:˥+;d\ ~<BR,r+ŭeS1Y0x1\1T,9X-l:JY\}&)o^˧J[aw6PǸ{Ʋ~wn?0I v@o6WB?xrF9 7Zd K䜍"Զ &IX1k&J,23N¡K )D7Cg*KK #?fJ)L*H|xQ'^O=7 92_1/zh{yk^ZC}$/yV}=&ϔ%J%f4=)TZX/쾸__71lFmZr!MvĨQ)"z5BGj&郇y>TJ{: rT98bIgPtfݖn |7Sܳ∉EtU%n9AfnŹ/+^'(IwR4/^ `I4I)!Ӏld.c}$UʲSnD>S#+̕1rެ=HsÍQ`lێZPh~zD}NݖSs3^T39?K$`ؘre~C_1e^.挨>.h-vüG%^oq*){]%BNqQJ9윧|⒨43&Q#-iVVq|k^W} 53(f~Nb: Hdf^U2y7A=t^G׌K 0l0信5o}'iD"ZBSƕ/»Q:2/wu`碙 ]!>@٩ɗ(_* -O% Fш ?kj>|žm.Ld`;q$Q"b[1?߳R\bal&1ldD}NDZID.~o#R F j/f| 0|)_/j!Ib0l+ i~M  G3r[z6sh2frNJ9zAY_:$pi g(D/'םdҜ? 0Զm[e4Æ1}bo1;v4 0p,o7 JE7 k!Đs_4jŬbf%yewbCvrkOPx%a) dYP1`.V%5ơwZfųMc%4\ah 60o]BCfhw?ЀoTWڈqLm#/7O0,ۛ8ӶAτfŪׅ4 b߇ZQ*kjVH{`\@*z;Fl1 lA߃ރhw4Dx7tٱY nwMطstmыpHm=WQ?@QEWϪ5\o'Ѡ0D({6h xOBiPnwl~ig;vT=+c?w0QRjY|{K-~S[33>Y=FE;K΋z[y=p4*J -zguV#5~ ^v07.>}x+YCջ|+Qf C:. dv`E[#Z.Eb:sxvZ#)>R ċrM0q$0^Bo|{K_%\DdB0C.C_b]RAp!- 3It'e'+UOd^bғH5+&foZ)R$v}RwT=О'"Ds̓m[X]l\z {9}Y본>%h>!֟bgظۮf;zaK1&Si;UY=RTѝr壑jdtFGl0[U@HK .{nFxy #g$ij[֜:nnPU֫_C#i<[<7 ,QC4<0x5Cwthq'@E+ 8W;f nBolOĂ&$+"X\O3.%fI,?'վ>⨹ (Ɯe_s0::/DEM[n  vp Q޸OwR|n=]sl@5~ZQC U!\U^֯Ct*9f"܎b)*OQF 4v'J/+n^y9Q37d5OPHSL> !1χf/:֘* \0W-Kp6d Ju]bXwƹW_*yinX6|J82Vrɠ tɴ $A,n^ede߻h4|3?$C{6I 8G#*1efu,L'8H gjhm]ۋJ[_;侾74?~(>՝V PtiNRZ4çLo5K̀OHL3u|SCLL=@cPm4y>jz@: ™az׺k3* ˌsT/u[_KԤE"#IȈ(Ls_25CXru(IU^o ɺYEz £`&fDh7iB̏ӍkVw,TNm`GU\k7vau<=MN- F3 '!1/3m*z/d{m&e{F1qʴa*d!q%0t8}r_sZA6PB탕s[!{x욃jtE;:\J],WWpM-GBR@l &_dL{#{۞yOÍy*#վ7΀HY@&nguMh -?Mwcݴv s?mth/8@#doaÔx$<)$d>6I-%P׾cR宰.\h{>$ N8M5Mb_JR> R<d }vLt*5BHQ囶u['`!jsv_+jY|GZU7>~8Vk 'ԫw)vi|5q魡@:{y(lA<8^7LP^Q.(<9(Æa^6$q̝A7 VϟvtK %ü0MEAbYE⧏/x '#*bH-B_,iB{ BZ2 /dZ_y aג V:mlG+ע= Xn:&N:WJ׿Տ͍'1_ ڱ0&4)oxd댇zÇTv lM/p5rP{g95}aӂ[nB;-V!XT3g !Ѕ% :v Yܙ= KPAѧ9#%zj;o[gUY=a]YAMU/tScd6iX mvuP sP/]dG(hY/3\Kwqeq.b,>0d-BQn)Aݙg2jtZix0=4g4Iq{~NBS<\j;Dk ޡԿ\eQPC&8+܄S5JR "YoKcf eEj},b79) $ z1ZVB8>$b5G$B^do BCT; PQOe{|{Ki+u753z]W,ޓtrNl@P7">U Ǚu9vo6Í)qj5 {?nR]ذGw}7߅@j3a5hԟNWYtH0Na52$H3׀n j=vC¢j4v$Pn)u~#6WM"J]P3rtQBV=EvסȆf@H" }L0mYLc&bXUƵx da&\ 09+3|IxI"$-|6l"t!rZ=q0g.qt|񦆃> m2̎XF@l %+"fe;UseTZI /\>:kpŅ:MSǸ^ Fi@C7$ 03%4"!MTQ&/~SN~tS/5 ;UL*ld ')\]w QପvU%P)~^%ݥi߈e^h?+1F[gsgYD}OQ㝋YQ”W* .n[OF>^GwPj0 $n[@`P?2\3ݏ!|ΏJ:L ,fggVZ/}zt 4πƴu؛[mF4/OH a+1/^_. LJY]e$M2l+c$T=)N^P9dT:`"^2JQ HB'-AHS`^-YTuM/6K4HU}i,,KKG' qu mWog`ǰwr `n Jö8"\ B4D>#@X>;}n{'uw0{izwC";gJGy˂7_)ĀUy/\i֓§a!qry G9B}-f%ze|J*H>Ɋj+SSk"a߻ZoػNo+ Mn\ݖtÆ æ\6p2T}g}ϋPj'RNn{uykjA}k<ޗΎ%[ &h=T\0tYjSQ ϹOY O V籄xXL$*QD:x nJ"+b4NCMF5$Wψ߆z7V8F+)S^W!:JlDb̶{u-,J1"#c^N ڕ!*X/4CODI\}i)k VTp9PƏuC5.MfW O;j'͒v6N]/)h:t=Rwt z-m_089ʎk.jҰE)SÇ%wz2V{I"yަCK:4TIU[rz;?3M {^Q #oMԷ6'O|%-mVXwUQm^ uLڙlm{$vfY_+GFn|ۻeOǤGQ(Mʕkqs bU;7{R{<ҕ6`YqfqaVC2kqŀⶇXbdX}^hijQ^~LzˑwlwX:Ȅ#c3.&fQم^>'DSn+/(o(Կ|gB */{ #ڊBS-KZ+mٳJ$_iycQ2#x|UXb&Ym~"VJ+l[a XP"tH,WƬ|1طBBy<^7L\኉De\J49oMu+ Ą -UpQM<[tv痛nww:YoEr {?~q !/;X^ϙJWR13"":fy""\5wl,z}ItƯ,MEbLꡝ"⒴gł$'i|}`fA!&hA0ڱ*P+RBg Rƣ%p[)]l5$ް$]tVC~iua!MԭMi'(%*cd*RZeQ꬜n(?-}C5[>m[.ь >9M}( Q '/NQr ў38J#QW6@)eN:*m2k<.0^X" IR Ui2ᵀiB q+3F܄Q׶k"iotQpJ:bEzĒzR#u"vTݢIՉkūw֕4IE(GPnKSeLɍ,@+ aO_׵p7ص)2J6L'+hf@_q8_G.I$~GzkR̐ʞٞz_o&'=㝭gch -!ygT33M-#鰴yUǼPEMf U&t#ZFUM-MFSj"z~q֭/NAE` rJNq9࣒V&{!Bnq|GͫwXe?߂M| ٱxw'CxJ;8{ 8Y vp< N:z#H{+(|P9UdVP ϼ6BY"oJ .ȷ,X9i0;E 5(qTyt@e e\J|p,G!qiFg _ݛDDD5S>*^ Z6^oWU ruI&Pku c7m6>(91J2hu2bCN;KZ.jVS.mc6ESaV%Vp[g_ߋZq(3 BqPF}'XE`3oeuLUw"]mHj cxiqu 8llPP|Wś6P:f?iao4_)WÆ#N7cu?O -}wevwһG5boX MìV~sm%?E7ihAΗY F1w5wєs}ͅ]~E?v㼋N>QYK=N &5XBKDյҺU2iOڤ 9<@(bHuC)uB]Ϟlm%K Wd?9 Z=m$y@yd%fF|]͛`$}cTQZC:&/Gɪ'XU5~fPc FJw=M1<`ZcDuWjU0@f UC6" }?$ɃwKOشaLYчXP'IQ'$ g`|O\;S ] 81Fo觏i}wZK?O f 8 8ipgB fiߦgUU> B9ocP') ە{s/z!T@CD/8pπ iEAwU6\pmw9 iSP^QjWGKjVbV`ֶ J]SWQB w_H$"a = w;lLT[U|=W|{E13[pVp[8i>jM?DpI13V6Pr[8HadW[2E䁊c InM%q E/[) 8BWjhzSY6 [>q\?oM0zSIj2ҏȌR ēNc>Ic^4=ϚF 77O._\+)| YԛJZJçRkk|67Z&7xKɠNک_ a @z@.ᢀh#%tmC=!9F|Ίb]—fq-G6SNaL* `d=ƪI"$ r`J 5ɇs 1.}h}:;X:׫6p r!t)a֩C iMA4q@FՄv`׊hZq^jv}Hf;V硷lw̺M~Lg[w򨴦>\zEW3M+ρ96QBM̽슽7FC0cc_8O82„R Yye;tv~#o-Cr޺HDVqZ!=$&9X?Nogg P/ɛDcuֿ^ugfwdPvK#I'ux|! #('\#U,@q&_7&+ _._yZy`du}EZM0roúH1;&fgzlj kT#^yPPXW cѻUZ; T?E鱂3L֗nVHvt~PbovLKWG5yΝK^Щ 䤎RN"٧OKOgbhWLNy>Wi7n: ٝa^nj:99e+.A +KuBмA5V,n&6R727 'cᣧ(UscK9Pvgwy31Iqe}򽿾R4.ӑ1Nhe,<q"uxU7-ކVͥj7 %9wRÇ/A(Mf{Ftrd leq!J Џn z ?[U|%=%M<OG|' {M IF%\nQ]LHλz: 0i%oS++Y|wGMal AH]&zoѤ(]r)ŬogufKN%@hn.@tyx^o60n2y\G'4),vQvNgE4 6 jHF~IĻ |7[xu} `?hrhZfiN}UVy7=;W.dh" 9}-箕hYvDFKx4cco^Hӯ~&n/bӷ=x5l9U݁ 1$ɯxNpؤWΔBAɕ'_k8MtXbZ 3DCAcU_P 0ŨޭPN2d۩sQX̕I$Y'>LGMȦa5>y#ݎ% ^~ GfCve9hͯ V@h)'0.#XtβB0twNz] R6rjjfP\ᢁ]_G1ڕ(= y$uΜ R+aEk$AKP=x){]gFXdq5||(X}к>)ɐBX`WFG"@Ox]b  aQJDŇ M`\2HP"iCQiQ0vf>~ZH~j;e4rG#9.hm2昼CB3}ɸgM*VNb>(_T TiO K4hv=č_ͥHLn? <A΂rL"R;Yy<'SuVBvc58%Bv_Vr ŁYϩ^D7eGr$> 6CH(tr.x7: @ڟ什l 'ahOnQWOK+?zUʲW4C[ZyI~RԬtd*O}d]0jw"F;)I't}8 x JrJxSSA vЮaFvSOCP]dY#o$Mbm pX6qi!z%f[jqifڈ=8pO0|Mֺ'PfO^R#ÅWȀȤբ3f6Vs66L[i޲2*zdxg?B6dPG9h馌.X7s#e $ܻ$"dw\>O} Dc ,B:4;SιX^fv/$0fDJ)_׌`E<Q ɥ 캟zw8q@'K)sYxrx' #7,zoW~ؾ wc߸g]~)Dy^;|~ɽ`c囵N\vm+cM&d> Y<<57wl?ts,R &q< ( W]5zZ>=7IGVbo_Ho*aQyk]T hVٱxl|8DT5łFB%64Q6Wkt'N{Icnӱ5fbF;zXr%qO!KLBa*nbFލq~2c8P(B LcHKMjki} &`clڭ[CH(}'b_)`x扆iÀ oU3h60D# x}K"`}Kp̤ _?oƎ%0݆vqu=g|QO%,"Z`^c(umc&y8a,|{΢OF,?%Vbb!ŎuՠV-MmfmjT٪VJx|T@JkGU^y}-mF9` XfnzSNZJQo5.%U. 6g D$B?rN)Joi-%B| e8h s%a-r0:29O" @zE9CS B #]}Tm,:v^ltt ~Y@>3P[Nb2#uD` L/8!b߼3 ϼ?ִ&Qzrtp%?\Үlj$@CāFxfҧy:o+09ԃ`YjW@f'ܸ(`go/Z[)|I,\1)$$ p0qHk5Ү%XܶB;iR<7;W]N;jZ I ?K|c&y8PP @ˁ$3i~ euy--]ʀs9dI4(cGŻj#ixd8pY4/qSZ/6ReXGbi>(Ћt|nau3kƴL짃y|gِqX1&M ҄ !wdy0e!uL}fQ v^!b\r|sE bX Fzjp{'4Oمv x6x^013 ݦ,@Q405L05Ojڪ(39'1%<|dQḛ:@Sƺ ȾsfʂrMI2ɜ%= Km^ʃm^80]>wJ<ƴ|nyU2Nժx0; -eWﷇxeڥlx_YCnI}v ,V66RýWAA njj}MXD{S'[=ڡ;qA,=fr ƖV}ҧ2>C+ђ0jk/""+[a_nn+x`-tѲ)5 ׼,YWbkMӓ?nс1`_fMvX50L/6M :kn{>\rd ߯KA:16CJ#{dU.pue,D $'"Kf2K%ͮhAM%i1xW,xrgyl3]tGCnZqeUzmz5>AU~AX\X##`"+2hܩN> yJ k $+#2rꚥLlIzOƃXsְ@hEKg%3-*I4Sl?l8Wi"}n`%ΟĽ|N 5),wrKP0ѧ~}{w;7H~K݋w[jT3OμW6uuĜ&#>e:I}pmk]~vIjn\Jg. }q!61|ix>[.25ٔCV"vjꑉվrD$Pzcj: g &[y[q;B. $ 8]{~uk0V mǞ~YiUDxeiU$F8yidHgZhˉV3췇Zcy& MygeNY-جKd Q@lpGB@o4]íM[IYljy^T^gosق\: @qwe4$vj/ ?v7uֆ#o=TL|k|DeW'.Nib :Tb:?2.{qH>p_Kڷ+[PwJ~ ЬǕ{Fnop/;ڮ3RpM S4!deN3un!QұU <@&WARvw4Qf\_yR,=awW?鳩gtpp(M7 Pơٙ,KgQ[[AO;#`{? SK-&a%if5f!DFʹgH: *ݡۤel]LNSg♘i?B%Xʙ?!L*N =ʲ5Z@[a>zv! _O97;.x60 8߂f @OWyi{|]?(G^1vP6D͉/V4mS8C?LZ릈|} ݬZ@@ Ǎkd1gpI|rM u88 ۣ sXQT!2BiTgdJOPK|ۂT 1 \CVKVHq[aQЦxts=7wΝ):M5ϡ5ʷsy9[JZ:dҽJ-:~8UW6FZmh'ʭg_=pe% %чW^^ɂb#P!@nܱB h  |# \s>w~h`<}3 Wee;^V4qaQ(T+Q(؉Z`Is2W.{6 YKtU;/4ʨ4-tC,B;>Aj7" .25d<*ҾAB*3OP",l2MkP#2`N m)#4N*?U5n6X$ۯNZ֒،q( Wч|Vy-4OBHtʱm`#a8:WzܶƊ5Sn:OV^ -NnNTcy_V7l}t]bEHFto cs3ZşI2ll#7tWS:H$`]v 8v՚> lcx^ 5Ay}Ck7-^o"=9tݗwD5(Fۊ"ln6k WʏY7ͮd64rm;G 5(*ux /!.HVUA A.xEJ~O;jr6t](~R^m䔂!rE2EDz `gzA?+[U3S_" &$rOPXjy8i I`kwʒZS7kk~~ͺ!{6 15bc:vބ)ݙmhNuTl刏Nl ٶuGOHBc|;uѝBiZ3;jvUT%wɃ[YImZ;r,O׍(Y./9Kuea@-_]Sz)rzvs!ƯM#ws=4$,)m^!1;肏Ŋ, CNP8hJ RR.9 `&1ff[S4E?T̏aͰ:V?H*z^4L \&S\]IU_@A vn No^"V64C3AxՆ !ƺrqOE 1QDd?20aX7~+*ֽ3/ylЄWF OXB!;)ӻ3% y]Կ0ĐLȘe1|FY$}~)ZX(Vݫ%q$jv+!qVz'cH=׶F; C~‹N&݅8gWw)W: oOp³pirAT#6뾕iHwkQh͆bsM>J0)qɰoDnwn:>'Jp΍e~Iہ0FljdP/~Wb 6POK@-_Vm74l*%IKd=҂4.3DDe> !-790Cܐ/1Z U)ah_r zjyidvJˑP pS&,Eҕ :67yٻtkD.NL!oD(! }Y 0︃f],<76|u~yKh׮JDSf,0ȨبSaק-xR:و-=(9l(xC>X۩"rHφ^njU3mil]dX[){|Ԛ ˭vgd*= V\"I"2HQ#RN BQ+ic5}h%jX<Y*5!//*A~1q5rݎ}Jt\I@3\뇺 H{%>#le Z!K %2K<۟*Ε.űu˭ 2*eoom]rv6C\1L엽K@y_:-4ױMDϤ uzHC+eĔsyrmS쯪r:>(2 $8;`DNjBVMw<;MݶQId70_Oj^FvR#4B@ z‚&wⵓ roмǠ5'z(Ȉ~XT+СtJ94kX0F !QIs| =5|_[CN~ }l qʼ*| An ]0mm)߰*#s2vV-)RwG!CYf9]IOn%ҟƦ ¾0Aq ,:/i>F-/?LsֈR.6ݲ5cݲM kzySޛխEj9يJmE31"l.u388c'1Amw~9=>ёw=|^&mZ`'#ܖ \2L.Rl;/m27*" :m -O[oSkW :W9ֱR*1T\$I#Sq0. 4q|͍u8l> 33jF5!lHhpvɝ9FP$>7Zuwp=jHx:"5Jz#@Miwjō aL 4;Zzxr1W|}mhw/5ѻЖPFC:"~[9g0H|}i'TdkTLG#ZabY'ӛ 3!s'6#r/Y"ĠBO-Mbhw4aVGP5# z]Ǝ'N:MG3gq\, Tm$6qZvBzIOSR5歼݁^t h(zIKsTR3->z?Y*ݽ{IOl e;DBVIW?{ i~u_g~p8rX|֝9U1+ ZҴ!?!x+4o"09oaˉɱ8Hd:?&M擜)1ɡ< B\,hf[ 8R,ꏥp (&rpEk8/t(XUVD{mZuYj2G+}Q[{ccNka^lٳuu=򯪱bfZs!t@joEM"wgz]n)}._ȡ+@"(ERǪA=>Qmj;)Ӭɍ] bpM{7ܾE=;+|Iv11z|ܞEѫ0c89d˃u[L>׊=w_\:L&>~É mz(m+&udb] "A(t C$a5ͻF=@!>]|7IoU"7{Xea @ڲu$`HAJbʠ[l!H[/ ;]m0%V }x"0) c=hr%u;Cw|orǬM$͞LLsáz1048p|plD\+Nl)35QtEJBVo SMΩ(=fffr@P2<Ӗ=΄69MXj"/ ]ߎe Ӽ-#sd <2@6aUzI'-p$i9;I5nXNiiK/@@lwZoxnƷ?39d-3BO2~ @ 7jDݬ8@ʁmHubv Zq&h*އ \o͔}]:~V{cY;S z]a U<4әΊ[DeU}>@,õBq`4QR=tBX~=y.#.Hp2q} RNe@\rtLύ\X!3B.fM%3s ŽRM}05;g/>=Wӎ5LES+͏UAb3ŗ^kUsEg KC"-h߉tD*ծ|8*ȟyq<"@64Z=ڶFp3Bw巳d>|]vXy6>_X%oL&D sFXYwWǽ CZ{Dw?G!>wSuTtԹB1;\j, 'X06:@!!|P}wЇ91@34n?YAZ=/RUS 9^WuU#Z4ڛׇay//piN|Ne#PdZ뗰'B%'rI"L2 @ Aotc:GjZ\z2{m%)1Zubhؘd GH.AWד(Sc#yĺ`"JZ25.":;eW2FީRXrBstp3ekӷ2)j`iqI'lX|Szn+e[/)Y ,x 'mˋ;뺿\U]4"u_HhΘla+R˓MM,n20Q sXARKA]`*,ع5rOZ׉kX4uݝ!랟yK Anymtl Ή9d %机tH'1v !uVwER P~¶kT= S2{Zd$0,ioxX=wB`>>",vW{|0H=¤-rmP_JR,>ݙIp(y^/u5Gՙǭ0H.$$J*"@K[@tO]uuH f{x fk"ڃeffj(d1=6J,[(Gjjґ,a?9"L1i^ iU]ƽ=h:cyP(˽ʊ0 QWSu9ĉS֯ H%3adA$tN}5ߡ%pl$YX_ >BS-mwv{Vaih\ێY?ضVnl. ҔŸ%k `ݯ* PmZDZtpUmG]*/y3 "5@#X!'30dYt{Q[Ukaz~\FR=^8‚)Y2{ \x j;$S "ZHo C{0aSߞˢ;YPNWĘD9r92CI[ ./󛏎ZFLI7T>+ڠĵTNh_;ȱ;'d?okqWqAH<C]֢>;zOz#h@ _V$$Ry3ࢉB/.]32Jc^~W/s^{$2qMCOM riVc]ADswfI|fx7+͌!p( jwkZQ=!Qջp{H}}M>NUe2A!1!& i4'O Ggo*zRء|0ewځ1 ;uΊu"[/NY훾l#29ӴQgOeűP璠Cu"/f{S~T ڿ'ߟ=7Tkɥ*zaRh:Ljθ7V|LG36fc;/))LޟVh4<&1#ѓ~1ssw(a /I&4D_=Kdĝ~SE-yˣ O("ǰzЋ"G*;P5*aCp 0OƱ`' W˕_CQzB ML HfȧD@3VZ|8J̻ZБħb9eoǷY)(y[PT[MTI}. ; ) (vWBB|l=[:q,bjKCt -r"8!;=YR,a1^S4:j,bt9@xMN^XX[ X==քG6b.|Ah#O2u4Bہżm{puoi>]EP QN01 B""xs$)$ x%"5D2-g3f"~sakmPc #pXv+Y'Ƽs:ԣ+=gdz~kJj!v) Cúۀ|ԓy2j"^f3= )8Iw3(>K~m#m̭:t,7K&{ 9A۫k␤ BN 7o8p6i#kjjk8V 7.K\6O}mZC3·qBtgkf#@t@\ J jͧo(-q+Q -[evsX-2CP2 |.`w-.[}&iGPTY"yj5 ̰#[7FB22G7-O^za\qz?6, u2z"tY/<ӛBgگAPެ1*e`Rwi4eV@L9=U4۵ķF^6%H<~ۉmSbh4Δ;N{x2buR p*eh.B+ M 5QOudOYi48.?t1 ɤ= moSԥ1qL]wgԳ_K}X=X6R`XD 4z*Pu#uҔ a͘jN¢wbŌ3s^3ljO=~Qr6.:*~( ;-Ydj.&SL>cyt߷ o%n:m&176 ɶ2"'=9z%v;xPW>1+[9Q0AhHscObSDPPp<8!Jf(yh/Lh2EI!knq*VGYwNxN4Sb$(7筂;O#:p"@) J ,a&dq&Y g-C="@u_Q0K/$;Jj0hgGSdpspcQ`3W2"+1}x ].@ewRڋ,&>ΐ}T1Se3!.ί3}p 8}p֝v4}J׹QzCy fX0@P=RKg|vu~BW _YA~^&+IlGHR-&^8ej!^{1>?k?il5P |„w{1=$؅dБ|33~B&_]BsnT ` q! G+}L;9q|X.GChtr _?_b>lhp9Mr"_Es"jq*Aenkdޢ~] =AAHq5BčK7Mu3t$5d54bl6E|fҫ!&K{Êj_sZyPi+*FӿKHLgl>1AA2+"AFq" #>+0:^ͅ-b򭁹Sr;9j!rqi?zl,uxٓsY~4위׀  1P]B P1kGmtwnks;ZYTο`WnUH􌸯7Z<md j!&;Dfe@dV;O1э5pg#'Tޮq8#ׯ OfcDJ+=jt> a.0o_ 8`Ml#쒉(.XD3|$bP&-dE]@jx՚"aoP$$@ zm8%)WE/u?;FOܢ;aؠY#}2+5-p INBػk+1LCk-AB+'sL@9"'HHO!{`t Ta&_evAXwz<>2tKi!͞8>`udP`zhLt*BԼ-tFN٪&!! `Sq'jL rw{sV(*v_W!f7٧e׾2\^-|)%Sf"I;&Vy>KW nztaiaT.8ԅw'Es- 3]3sH5:MYQnd8QMNd;x:@"DzgF]# ^¬t!pSɴDٰ*]}V2~+-Ƀ d#N4ٖsK7K{6-cP?Hx:_@>#u&^n ?G3BU9%%tz\Ӹg-5nIj#/s" ȀȍS"}vEbdH$y`tG '44 ]ɛzDC1O;fm4BAŰ5> n큧$6mLN\木 8 H:}*e''Y!mOlD('c׶`;HTg f'3< aM^ATr@#Pݜ7qXB.@:Rwǖ<7/[nX,j d.Sl$e+ 7s.qSFRwΜwmHϺ~H YD p%C =Buw+i*5j006wF@>wAHlxZ1.E/?fN֭C2o3n^[:fo8Y'fp}o>~9t13)^XT>׵@@"-Du2JِpFoa60#oeM3^6$/g>Eolmz®L8aԬU/r6еQ&H[vH x 3D3I|pٱɍd1}A:^." t?7xxcx8GjdZOO&c75A;5(R3| bZt6Rm{j9YlK:x!66?v0x#% sP=7c|&X$ʤ ⶜7j?2W=:i #@ىgB΢$OTqݚhѫX晩nNP&,'+(k2keG6XF-cȦ`+y22!-qY 3ؔT )hB!Q8dTZAˆk`]dHb|K5R {Uc!fC80l$$ dF_礁. ҭ3CRYieփQHpľ[" G3'LJbXtޱm婒f sۃɰj] #Fw._.RZ1z6q2ZDE$DD#n.XI)Txf4 ũ_#Z=MX1ow\|ћfo C?3Bt+EHNIp6HN9Ew4 .GHʏ>R@ߋ>۹pye{v?R7Va3H(dHW%}* FS dY JK 随$vgD"FF wb3At w=XPZ&ZAzu[v,܅)n٢CFEbd \%M!y/ljl[>66QfX PFM!&'uFImd`݊su\+xNj応"D܂}&7jDbV;ͬ"[5AuUZD)Y6ȕܣxBЎs3l;_J~Pjх[$,y (ei$y;Aq!N#_ov{}\Nϣj3R@sF\ުcPtB[O.p /o)-$&;XItRK&aA@N3d.o*DDL zG֐Ʀmrn :83v= 3-DoM.Vn4-6>On }+\ f*m4([XhDҭvٶ>a{̓Ka<<١ɑ).W\Fxrl}>iLZ)> :i\P0%cgu0e'_G#46od{We0Ǡ)U9^Ӷ)#eldF&a݃h8;k q)" #~%| .̎wbr=N|3}FfqN?{sg&(}'߹Tf >_?Yuc⻳mI85zMvMD> C711nu,td_Ips Y/?&5ld >n=y;fۅCp/xo^F1wC|EVt?t_ /4M>!DK"y}s|I=–Nb$M3-##=4Aj6ꇱ꧚"s[٘"2,h&@is ~+G9oo^xV77^Bž*Jʀ&Jy!b39{ 3M;KI4t@ItTs{8$O l^T_eS+Ϻ*\\kNT5k;"G' rr<m$[Ku!\dl2$(1ӔzkJ@]Ȳ_Sv6lk@J<'g"" o}kF!M~oLbCS{;BЇ?=bEÆ'^^;w'(gڨ,F|F_DIm"eҥE<|0_/ !2X1%m!H7ntvu}",(ZK 8A5v8z$0h0)/G`5\}&r;K緃{]w|`^k|΂WZwp7_  ?~HV@gQWe=~R>|ra21"RW]xHrn 84s1W0 q{7dԫ)UZL SbNٿ *"~hqf(u7X y}%$K],,s$Wl~F @W谪|@c6"uf &jL( G2dqv8'$Jcgz,:kAvC&ym.~]{,^GkSw_Y1mDa=ESz - ɴA2 =ւ " al=υݕޜR[!U䓶 ۧw8き#eddG;j{4#$ R8Ւ8QC" {|f"2yw6uW2|RZXcT֐R%,o/<(δLE< t9b)-Ĥly,Nj 1-|qH eKIv/4ùG2Q),ֹ D3ob1Fў>&rS(,&QNI F0ڪ\YNK]F@P !*wlHʷY8MG kJXLIb/z q8eWܷ4>[:*:W(:\`A֗e:ǭ0X5Le~s kuLD4ɻc^JV'X\>ńKџd =ﳧ<{;N9%^O8M(hO1*}RD"ښ!Ehq{ p`:՜i߂>$U(zx3.5٬'?d{ /vP7^0zb\F=ţ›|k})h$(JO.G$Rytr Ep C0&j5x|!R7b#|-*)kku!Yi[U{,>\v rFLCpdk>9OYvHiaU1KD fK.x0N qfYcm88!݁:B BYUX ʙJ7{Dz}ok~ M5h~KͮmnYgGV_kFHx&1Ign\6qNߨ8bzz_Le!#ou$ ]=t=Ltiz[Ilcy]}qN)ԧ÷a?A?%a q.qJ A)K.9 Ët{Oa+7!\CMڎ{Q_Wqʴ; Q m`4(#Bm b5y3\%(d {r謴2gN(bzGѱN@ -'BJ pQi?Yrk6ձVS B}s#c'Xuv gKnRճ \7ڍcJ;ׄ׸<  p7~ n@Θq+#a,%͉TT]\5&eBaR =.?x:IQ1  O7Q\cÛ(Cn>m%͎ѡ4ۢ\=^`K Bx} łrfuѼTDc^b*ɩ)x[c\YZ(y'Eҝbmi]ZOg780]E2]R"! DuKFXzGͥ\z][u#Hr..E4l}hVC2UF7b5HK⧷TUEO#!DBHśYIFZŦKAa]烔fcF<]/\eЛF$0g,*mͩ t: s6wk6n1on=o= qYqӯuKD yhlJHsp݅DV)8T khGh"32EE(y| 9޿λ[WSώ殌z;?UEq'9ݽ]'IJ`iI.?c#mqa7I-e4[X* S-W7Ĵv옂7XHDŽ_j|tht4Ճ vx ЧD ɌsLus.~"'i3 lP DGz'JꊵHWSk0+M)tdC!EƖE AqcH!: G5ls[edxs{߅О:yiZTދ,̭h[M$"kbٷ=}}_  \JoF {c1ہoӽ6g pqS ,h7oy(B)[ "Pi^;30㥸 ȣŀYZk6qxN8 -hjO>f-Se 9>n,Gh~>4mQXH)D##%/H^H /AS+Á'YG b@,s6XnojdBKe|HAQRg 5"i &[f1U[QLCj́-CQKU[XNf7"MaDat 9N_?-]3t,$u6Tdy>2nUI.[@*>pڷ؂۪$q$y|`+f7gnBkj["j 3;!n+Dx:v׋'Ǻ "3EEN΃T^PE췔JtA͏VeDA.tZASc 6Ca9MK/Z$gR(/lrЄZSSMS3C嬵!{3dc1miSo׶Wxr#BjMB5}*XՒ5q0&_!&MĄhNGAqsG8t%r\F^5V [>ȈI`H;Mu: ,؁v>|45J=-dH #Gjejn r4x8  F%+ b)*^5k`ee1"B%nꌇB~rI*- Bz8&J54aE:wAvY# Cۑ{ZhM;5Rұl tGW,?§ T2k=VnJlj{QCl]|9G.~= ݊dǩ`T p%҆*5 %ˤBe`5I@1 `"a3V.8RQE9,*,@o\![n9B LHms[6;C[`謥_ q0i'}X1 YJ<7x2q ޛ9ɞX^]5j CחY[Ij]у F`VwpR,D r8ᕉIGF牌tB:خխIv.b >d3Hz ,n9:FAΧW⪨U^jgd8}I+,k +":~]Q=N.((hwxX[%{.\Jq^?z/C]}cI!Ҍ3 &tބ}d.DN!@M<roX3捜_~aܮwyw )pe:Y9wsq- IfqN㦊1\1`BE BzϘUQ}q#6wxffnNPh),4p@[s4VV+z=ÙH͜$&B9-ق9&AĦ]l 1dJ5a)C(c.Cuy#YI1>Ds P08-J&ľG6kFL=l%[%Mm]Nx0SAKgM_*t-+#:FFҞ6l9o" R(g2]9&'o/ wŊvԻ;pΪO޺#"ۅi>-\r:+6})KQ;Y%˨̴֪>^zcljrj\Cfn=msDES@>+ć6| K=$D0S1׿Ƒ~7}Suٹ07B\*dmNM/NβW$/qC?1_l+?&/sEƦ$ 6 _S0 oOai@NI !Q@)h|IKj*4V :6f99]l@ 5Ԙ &Ol' <Wߗ+!<f*C.+F8#9 +W0JwS¶09 RaJ|\lͬ"e I"Dg.n5xE])1pꃃ9ġU`,u%0l;'I W_]+(9*x<& )juS=w;ALw 0xDrcZ13ckEau/He۟P!{ qgI4NӦ&f59J=}b9T<=1'.Qt {'VUCkJ @QjclOE.R!JZ f7;uo+ Ы60Ti }f*0c,J&B <(fT U1d5#g[@a~ڳmUeg,PH%D RVncHKlv>g͍A łMG:d-R[BNs\cTiH&5w$m@{ 8bB6xDj4)VptxxXLomo_Ca/P~;eN8i{j^1r=O T40>0ˑI"?GQ6:x% =һtL5MȭAl& mrW*=27ޜx< _M n0{ޠg8n.fSFN"@.dE! Ej_-^8ס xJ؂ܘc/y)ϷÁ5 RkZ^h NlSdCI@'4Ye)PLX̭nVxF&J!rF4kN a  @ Mb"(o`C@oӉD\|aci6;#/ti:]EBp~$;+,%]1"h&XY^ǥ&k8@}YD˚+2c}yIpyAk\jFvxoT5 _|P,z*1E d߽&{T{/Z\8$tĬTwD1 %/i6#9:l.y|?.CJ Lp8("!,!c5gz^.p"!hnh6 ӕ)!{Mxm4:F<؀lH9Q/d|h40ivW.#@ s/dN|x Y|EB,CNpKxoFAs{|_rQ0 x3-𩱨A[H"N!|K=OZWCLE@DC#>%fs]8DD%qX9&G|Qk(+y<1r Ɏuov%F@5Yuy_\x`԰¨/1^0Kql‹MڱЅ]'@&,b}#{f<9c"#?#^`#ҾO+]{!{n 垟?u7%FIFֲ~>s . e.ݕ!eoN zo+ӀMc}A}f'09[ [WN{lzb09j#:hT"),G\KXڡكBj\qPdԨ=ߴNG#;rš1A^4XΥAC0gbQ̍lr1)3@(}f(Xo32 Yk*7R`Jh65|o)_}گ!%W |O?<"l%vͤGmF4>֕tq]I3/Om$C{tx'/J#v4N"h,(c_DێALCAc[Px6qo`0p >; uKB`(IL!CZh_~zYA$iȯ\YT7g6sHDf:{>[.() >m:!:3ks: B%:C8 Y@ x5%qn:BzT尪*M^'.7XݓORˎ#bرgJR_ 'LG9` $@:l 9Α01s~v~櫾fXFl$kdM}%IIdL@K6>YF|I &/ /"L1-#a/Ll缃y//˧i`kL.@im-]J}d|@3Q"% ցqc ~W4[HL59MvR{ ($9䩲OJ?_mBBw ]"ìwWr^y3H?m ̢%s6bV=68ˀ&LWl.mJV{&>e6UECa5ߧ)nшP] pfs֍ 5/ HaY#Y;2 RGy漢n" "0խ6_'bZ0& U<|FrH%-°brO7]t*+%[M`xsOҀτlv-xQ!pU'ϸ~s :b)}r_4#vfX#:Y7w}0u#m dfXNwr!o!ju`ILJ,DqV)o=2سa* t"qXݕ-=M9-͎XߤfPgLI3# !`Ǻ'hH!.E ,;Ih[ E@ G 2;rqy)R18S9C}m~ԧ"Zܣþ%˶Ff wtRwābz{imrNVu%!עG"h Dq))HMe~8[;:O7@6 Pxf wuh\2aqd6Ę8)Ky5/rXLu^ lpaUaJXqC [T2W6lEJG9.GYuKwbG814!P@ 1 `!!so`L5(XVN9s* >f 0f d|'5&$y},gQO,-$$+yB7aץQX7&#lv$E5:y qkzZ%xlIytY}\kh3+PFzyOw=\A{ny'힣l ],]LPB*!ւa(q!!?ɢPFXiCZDZv"װA;FLfcӑlYo3`!Iѡ"%]GeaMP*-:ڇl+ /3.Z[A‘)r00'rd`]n ջ A!s1bqEK'G:m,ۺD’oYј2WdVUQHj%^e&H׸WU4\H@!F U(4*,N , sW sI5Z~NISSH 7N`a-D CY7;eYȖM%*P;tndXOB9 %yA0Pu$@#Pb\9"H³ aER/&'y]0)kcԶp/@ Z1|5d1*ޙC{qr#{rC} ~[7t^s0QL.3kPLA v˜tc.3׀cC J-nf53Z!,@X 0 p4.EZ$У^7 mbXHMM:47@ p慳j4 !j֧K^JA !QN@ई Do5+W`z )FFNn%)FGGx7kbXJ5<%ؠppPiAJ *NA2jC2BXQvr/C*Q8.2-nBqm]uC /40a X;.Op;"V4~G<=6zpt3'0qQ:BM#I FD9_"ѳKVe ֹk!uEt BvcG I9OVxJ11@04 BpPza{5Z=h*01%"N4`hh-fn"O9y$67!kFA dc'. }&K~sr/.b{r`.?,T%6> Hp""#Kijy7O.j]x73c9n<-:h״3)&@dݟ beNoD*IQToZ,Ge S=zH}ϰ>#nQ`/o%9}sYpiW`!)iv#U5_y` IBG!Na^u!dy%\y-u~r¼C#im*Ze(_tVhҕVUAr2Yg/2jjw[U |=%b~mڲOpGgox/c-\.>UǗd+_y\$>᮷^| Ac%E~gGH%I$2ro%>0m}cM9"Y= `/Ǔ^}-j;yI%I+f<%7 Z.gkNa3;<=w!>J VHg)8nk6TT&r|`۝a-3JH*pj3vHܾ2a!\6st54>B98@ڎJwy+{ E cgXdP3[qSOʶWeq]PS4X3N_pu]Rդf ܷU:~* ĥ31#ݝ2QRpxBBZkMbzλeŹU}׹̘,[a~ɜ+@c|50幝 ^f+@MvÂTbd-Ҋ ZJŁGE9Q`$ $ƣH,@eJP|ڔ) $)gAjŃD$KJͿh4L/١b+& 8F竾}ؕAt90RBԀ2&VS\Nv0fIA$@MckfJ8?Fb_ZܛP)v +2R1DOm*{%0JID9H8Lq[%HٜحP|W}}+b2%޷\qqkq7wp±ZfHr;ʔ]A7w 17w]I{дLӘ A``& W2њۣs*Sߘ~ӹݢC(C۞} V+JZCIvޏB~ r[wn=nOb. ).ZPJU4*[u;*mu6'פP'Ep_<66%ֺU.R54 նs=Rlm5 SVX7;x2L+f饳ܫs*KQ0X=WӴ &$k,P% J&mKXZ\J$쒈Gnq{o <#J42x'sGB^hBA†1Ut1~N jt׭̂@r֨}j'qx$K5I8q)t*vBZ<'8;NYL(b7H6Xp[ᾑBGM@ȋI=h+j@ .D)v+ A( 1$ %#'QAU?OΒW@vsѹǸ33Wydt2L$ GPx">58IJQƂűV๒Njoc{on2L L $ksh cjM@c4 /b%LؽR#4h ZI228v~¶(&ֵۺX $ w6J?fJ`ti%$@f置@f `  `+g.!#¡ގ5fOBV'$j+)VCv泒nZG(L\ϽUNMrƒ-YȨ΢i)>BA I5buS &zTUQ,ed+ [ 4pSZllh{osuN^2(?^@ ۱ h.e[XTca+2>XsnᾐC3i49 7qva`dz ~LAz@Aoq}p6:=+Nv0 8D!g5˪ R7# @BXl} Hbep9}@K Hryxх86  IEU V %vYp0T2$ݜ;텋A+W|qRTTrX; :3BցlvBϱ8FJٌ+%Ug8̴=l9HAAH6i7P6i+W@PA/$H g7%)-tj_BsJLŋ')tKhH_Ȏk&|C]=I](2Fڔo `1Z   o2 @I9fbb$8gQSHpڷv 1j=m! 'ڷj£b@U;gA2XH&]xu7c|mY 4E4Iw]bП7}p~v=487 @f K(,Fp.N(2VOP; |ŲL ")il-G@8 ό%䔘b)-Vܦ᪇  .>*Q0' } &:,ʜn t|-{ "MHA (o x0 󺀄fÉ ,73LrudHm-e SP^  䱡-ad ]WWU#I8T*݀ic@ֵ%Wk@ƉcD*51f6;8 f "`cwA8'#؎HlؗD* mF/\JA80fֳ1ceBP2fP`S)YnP'd l8 %@ @XIDY{hd%Q$fI*r5]鏒lߞB֏wC2Ie`ba\u (f@;Μc7&qZ8[)74.I1g7,…\CRcSL܁9 &td-0o#Ԉej3YzcPGx0A ݉p@p(5q. t=3Kfp8L*Io k].W)FSzs=RJʩ4>;8)A6d.ã${H7*Ѻ;~]{Ԛi/gK \w JGج:~*d֧^Y8_ w9 ߙ[3{tZLGM)m%GLF,A$HMz3i1/ۆٿMUU Nxz`.$pH@ClbpnԆp3bP}0X(L}abC5[cj`m ׮c<,0d"!I^A|DX^X8(7\(,  S&0(Ah 4; %VdRF(p\0H .rI]E2,Zݼkco%,{~ݵ.:d8y<~"=˭x(;sj`)RkoKȑޛ,O.\gYfW$`<38#u{{CM&NҽXɆq B~;xc`3k,x2] N`Q;T87ſe,W,mJ6 7p)4 <~g PL2g Pmؼ"T $Q[ YeL @!A$0` 4ѐm]F֍0k\2 (@hH@ njRy 6/.tZE(G1iLaz}EU ]mVtI8q=ee'<r}YFڵ0 08VJ7e4Y4n욃*fU,4I^p{F+ <Gf:rBbGr1*W*W FIU6@gBaJYrznJWV3[Ϩ w$ݪqWvԫ?c'FWtQJLaLG-U!ͫG-EF_J7ڞ"tK%-J PZ "$ZCW~L2eD:tn RUZ 5I%mwd'I%gZ A`hkֱzʌϱD\%&' Ӗ۬I*6_pKZc;F`P6`j8^ CF-yT*=qLH5"";;aH]Z^Y;bp(4Ei4§kBRrS(Z %So 2<@̚vůdЍئ N&f^p". JKf(\n}ᐓl-- 7Ù YcWt^]L J3g9\A5ENU|4:#:˛sXd&5dp]͡$_.RVn]D\L;rI06 ]Jr" sN`s;Hښ@WM $%ܯNijK&S i0þP.I}"?}D)@DGEA%Εu]]p$7BS|MNØ/"Ќ􁜘kA1 8|V Bp@*A (*rmc ?]  lt ؀_?aX, ×ߖN YC䡏kAg5cxHgW,GL~'#abRd;m@ݖ[sN!'[(ϢFf3IE5c{bp(TNrhs9MlE7q kA-]D[8 0~t f,ou9mqLRՂh!aS\-&iNgf;A|O]Y"<Lj I69{|_PycO EHs ۔B\HF24>#'(KOoR8 HWk>…'k'F0 _ ɞ楩ħbq ٨sFBCWd6F=g@xß23ִ?nh~bA1~"ZT+:D/a `"B2k7:M[TUYaUQ+<,^7eMq) E>j~]Xt3?ɲi6.X b@p@f mP.@;TH?'h(_? ;#ْ'm6Ð;Ӳ|z)U''Yj`E# pҫ* (7 6d0*V^V [Mbbe9#ʜBO.~Ok%\#$W4p|OKHF&,bJH|} 2a^P4W^ 'ؙk,V5eZ&I'YZb}u9}0`: !FBqz8z: &Wvz?(xR˹8,&t%SVCi|?-2!ypO%^Uv#6JYMW 1@!*Ưu@8/S2#$bDyA+N  j$K%j%wEPU+sҼZY kX!nR]؃ly6l8&"]v#2zh˹5J3B藚@n1DDLӫ") /*f%ԍ4 D %xr L|2DGOOg0(8@ Dwov :U(C{t7clmJS&Bls\s_mqS&MPs Sa`81vMd$̀I [@w Ay|W7w.JY eDpZTncqb*R3B*49y"TIJo_Ex)_Zysv 3¨Dj;H*FIsz]Wq<"72"T>=B{?Q$Uj2uMKaoCxy&Fwa {ǗƧu޹p.X:~9a`\IScQ#6m+],UVTrҜ\[OM$gT5"68/EO*Ž nZR*2["mwT^)o(F|cQSNeFlI,P})w#:MKVJ:e sJ7ΛJ8p:ymMuAAcc|x@ܥ3j v8Ml"C].]X9J<8V@q9KH48<HyKMŠ3re0^b V3w c!y^Td<.ؐOHj"Ey;{R+0Vk+ibf&HwS_&E :&tQ3($"C eNZ3ni$(B뜒g8و?R|i8-5N:z(W#Lͻ( %bk{pVmVVMj9Ќ,ԗm!s>[yl -mtvӉQa(9(YꭘHNBAQPQJ%!N!z^SWhI7g$k^%Eo8Hv6mZ!)$&pyXYe+, G5,H "$BB(tl#!(FR&@1*7``AШHݜS(۞D6\ڠf:{Kpߖ3\ 㳱,CixgKơL2Uxd?|mtyqYx} +!G(2Rq4 &n]:#anik~93bPގ>^8 W-i}zX}ϘLO/uqy^p[ͺܲllUޤOsi@ȐÛ,#y5^BaD"Q̦<9HD3ú=kiζp7{=;n~%5~F!YXѬoyF74ӓJE3M'Bt' |{*N &K|@yl.2ɨks\<̛Ԋ= ;!Yԩ#S7_r bM2$K@TM<) 1ŘFnbԟ\g&t1Z coPz)(6~z: jc>$aPsQ(J؃澘t/T8Nmد7@ˍG= ƳZE}'+:.]/񸦴b]U~``rr CR"SEfag'8/j5ddQ.`q"h?{PוDS UhQr֦˗@rC,$f P0Eu-6SVZ0J_m`q0fd \,{Õ?~#9z{=9#zP۔Q~sw#8>K_tTRKCg6j&S-7Qjh&*R0 "|s'F|mntɩ)ҢKԁs89QtxZ3l6XG,빁D +{b(^;WSL C: q0?4?0Qca#)K9F5 ru|OyJ Ź7EYiNo2m ܨ24poA3*DJl)Sh Pd:h[P6g3 <րsH<7@\*w`dм[T*ٱH%]eB$* bN FۛmA(!ú` 8cKyl Zɲ D>#8$ PmA@g=ugEDJZh STQ䌇aqpc@g0ɰi$2LSlTYⱸ5ͬ4 3DܔQ#c_ߙ5mirxw5M9P2@S[粘(9 r߃Ԃ̓xP Ày*"(HP|DZaMule-2.3.1/src/utils/amps/images/conn_highid_kad_fw.png0000644000175000017470000000151510351466234022120 0ustar topiusersPNG  IHDR(-SgAMA7tEXtSoftwareAdobe ImageReadyqe<hPLTE7n%J)C*x^t}_evEYeulӤIvs>(|f ?|4y iu/ka,RopxUld Rnqlb^X5kOop ?>ɕ>#X9lcZ*olhޙ}zǵ^IoEvn{$VjXv?rz"\6F&٥ M/H۶(3ҹcCTX-u ᖑRSKSIv7&F y:O[8a B ganQ͑9pc/P/S-$lrr _׻ܩ}:NqЙ@4 Ç4YZQV;>x⌮* xX"F"ţ4{?Thi\>|><ݫb7ל2t)(܅duMzATI$#Jn;.{z x~<%9[3d$I&jٔu.PfUY-Ҳoa H@`T{/`VDi}7WG  [Kw>KYoAEv(hFIENDB`aMule-2.3.1/src/utils/amps/README0000644000175000017470000000402111543632432015233 0ustar topiusersAMPS - AMule PHP Statistics Copyright (c) 2004-2011 Matt Britt ( uberpenguin@hotpop.com ) Thanks to BigBob for writing the original aStats, which inspired this script To use AMPS, just copy this entire directory somewhere under your HTTP server's document root. AMPS requires that your PHP binaries have been compiled with GD and FreeType support (configure options '--with-gd[=DIR] --enable-gd-native-ttf'). Since AMPS has to access files outside the document root of your webserver (specifically the aMule signature file), the safe_mode option in your '/etc/php.ini' MUST be set to 'off'. If you want AMPS to display in a different language, append '?lang=xx' to the 'index.php' file where 'xx' is the two-letter country code (assuming that translation exists) such as en, de, fr, etc. If you input a country code the script does not recognize, it will simply default to en. Or you could just use the handy language selection drop- down list at the bottom of the page! AMPS looks for the aMule signature file (amulesig.dat) in /tmp. So make sure amulesig.dat is actually being written to /tmp (the default is ~/.aMule). If you would like to add a translation in your language, open the file 'en.inc' in the 'langs/' directory, translate all the strings, and save the translated file as 'xx.inc' where 'xx' is the two-leter language code (en, fr, etc). That's it! Also, you probably will want to add the two-letter language code to the array $completedlangs that is set near the top of 'index.php'. If you produce a translation, please be sure to send it to me for inclusion in the main distribution! Sometime in the near future I will complete the theme support I have stubbed into the script. If you have a colour scheme that you think looks good, modify 'style.css' and be sure to send me a copy of your new syle so I can include it in future versions! Please send any bugs, translations, or verbal abuse to Questions or comments regarding translations can be directed to the respective translators listed in the CHANGELOG file. aMule-2.3.1/src/utils/amps/style.css0000644000175000017470000000323011575347521016235 0ustar topiusers/** * AMPS - AMule PHP Statistics * Written by berpenguin, AMPS is an adaptation of BigBob's aStats * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Be VERY careful with this one... I'm providing it because I'm a nice guy */ body.thebody { } /* High level table */ table.toplevel { width: 50%; } /* Top table for each section box */ table.sec { width: 100%; background-color: #486591; } /* Lowest level table where the data is arranged */ table.organize { width: 100%; } /* Area where the title of each section lives */ tr.secheader { background-color: #486591; } /* Area where the data table is placed in each section */ tr.secbody { background-color: #e6e6e6; } /* Area where the title of each section lives */ td.secheader { color: #fefefe; text-align: center; } /* Area where the data table is placed in each section */ td.secbody { color: #00000; } /* Place where the statistics are put */ td.organize { border-style: none; border-width: thin; background-color: #fefefe; } aMule-2.3.1/src/utils/fileview/0000755000175000017470000000000011657306263015236 5ustar topiusersaMule-2.3.1/src/utils/fileview/Print.cpp0000644000175000017470000003321011575347521017036 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2008-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "Print.h" #include #include #include #include #include #include "../../OtherFunctions.h" #include "../../Friend.h" // Needed for FF_NAME #include "../../KnownFile.h" // Needed for PR_* #include "../../NetworkFunctions.h" // Needed for Uint32toStringIP #include #include #include SDMODE g_stringDecodeMode; wxString MakePrintableString(const wxString& s) { wxString str = s; unsigned c = 0; for (unsigned i = 0; i < str.length(); i++) { c |= (wxChar) str[i]; } if (c <= 0xff && GetStringsMode() != SD_NONE) { wxCharBuffer buf = str.To8BitData(); wxString test = UTF82unicode(buf.data()); if (!test.empty()) { str = test; c = 0; for (unsigned i = 0; i < str.length(); i++) { c |= (wxChar) str[i]; } } } wxString retval = wxT("\""); if (GetStringsMode() == SD_DISPLAY) { retval += str; } else if (GetStringsMode() == SD_UTF8) { str = wxString::From8BitData((const char *)str.utf8_str()); c = 0xff; } if (GetStringsMode() != SD_DISPLAY) { for (unsigned i = 0; i < str.length(); i++) { if (GetStringsMode() == SD_NONE ? ((unsigned)str[i] >= ' ' && (unsigned)str[i] <= 0x7f) : std::isprint(str[i])) { retval += str[i]; } else if (c <= 0xff) { retval += wxString::Format(wxT("\\x%02x"), str[i]); } else { retval += wxString::Format(wxT("\\u%04x"), str[i]); } } } retval += wxT("\""); return retval; } std::ostream& operator<<(std::ostream& x, const CTimeT& y) { if ((time_t)y != 0) { wxDateTime dt((time_t)y); return x << (time_t)y << " (" << dt.Format(wxDefaultDateTimeFormat, wxDateTime::UTC) << " UTC)"; } else { return x << "0 (Never)"; } } std::ostream& operator<<(std::ostream& x, const CKadIP& ip) { return x << hex(ip) << " (" << Uint32toStringIP(wxUINT32_SWAP_ALWAYS(ip)) << ')'; } std::ostream& operator<<(std::ostream& x, const CeD2kIP& ip) { return x << hex(ip) << " (" << Uint32toStringIP(ip) << ')'; } static inline wxString TagNameString(const wxString& name) { if (name.length() == 1) { return wxString::Format(wxT("\"\\x%02x\""), name[0]); } else if (name.length() > 1) { if (name[0] == FT_GAPSTART || name[0] == FT_GAPEND) { return wxString::Format(wxT("\"\\x%02x"), name[0]) + name.substr(1) + wxT("\""); } } return wxT("\"") + name + wxT("\""); } #define TEST_VALUE(VALUE) if (value == VALUE) return #VALUE; else const char* DecodeTagNameID(uint8_t value) { TEST_VALUE(FT_FILENAME) TEST_VALUE(FT_FILESIZE) TEST_VALUE(FT_FILESIZE_HI) TEST_VALUE(FT_FILETYPE) TEST_VALUE(FT_FILEFORMAT) TEST_VALUE(FT_LASTSEENCOMPLETE) TEST_VALUE(FT_TRANSFERRED) TEST_VALUE(FT_GAPSTART) TEST_VALUE(FT_GAPEND) TEST_VALUE(FT_PARTFILENAME) TEST_VALUE(FT_OLDDLPRIORITY) TEST_VALUE(FT_STATUS) TEST_VALUE(FT_SOURCES) TEST_VALUE(FT_PERMISSIONS) TEST_VALUE(FT_OLDULPRIORITY) TEST_VALUE(FT_DLPRIORITY) TEST_VALUE(FT_ULPRIORITY) TEST_VALUE(FT_KADLASTPUBLISHKEY) TEST_VALUE(FT_KADLASTPUBLISHSRC) TEST_VALUE(FT_FLAGS) TEST_VALUE(FT_DL_ACTIVE_TIME) TEST_VALUE(FT_CORRUPTEDPARTS) TEST_VALUE(FT_DL_PREVIEW) TEST_VALUE(FT_KADLASTPUBLISHNOTES) TEST_VALUE(FT_AICH_HASH) TEST_VALUE(FT_COMPLETE_SOURCES) TEST_VALUE(FT_PUBLISHINFO) TEST_VALUE(FT_ATTRANSFERRED) TEST_VALUE(FT_ATREQUESTED) TEST_VALUE(FT_ATACCEPTED) TEST_VALUE(FT_CATEGORY) TEST_VALUE(FT_ATTRANSFERREDHI) TEST_VALUE(FT_MEDIA_ARTIST) TEST_VALUE(FT_MEDIA_ALBUM) TEST_VALUE(FT_MEDIA_TITLE) TEST_VALUE(FT_MEDIA_LENGTH) TEST_VALUE(FT_MEDIA_BITRATE) TEST_VALUE(FT_MEDIA_CODEC) TEST_VALUE(FT_FILERATING) return "??"; } const char* DecodeTagName(const wxString& value) { TEST_VALUE(TAG_FILENAME) TEST_VALUE(TAG_FILESIZE) TEST_VALUE(TAG_FILESIZE_HI) TEST_VALUE(TAG_FILETYPE) TEST_VALUE(TAG_FILEFORMAT) TEST_VALUE(TAG_COLLECTION) TEST_VALUE(TAG_PART_PATH) TEST_VALUE(TAG_PART_HASH) TEST_VALUE(TAG_COPIED) TEST_VALUE(TAG_GAP_START) TEST_VALUE(TAG_GAP_END) TEST_VALUE(TAG_DESCRIPTION) TEST_VALUE(TAG_PING) TEST_VALUE(TAG_FAIL) TEST_VALUE(TAG_PREFERENCE) TEST_VALUE(TAG_PORT) TEST_VALUE(TAG_IP_ADDRESS) TEST_VALUE(TAG_VERSION) TEST_VALUE(TAG_TEMPFILE) TEST_VALUE(TAG_PRIORITY) TEST_VALUE(TAG_STATUS) TEST_VALUE(TAG_SOURCES) TEST_VALUE(TAG_AVAILABILITY) TEST_VALUE(TAG_PERMISSIONS) TEST_VALUE(TAG_QTIME) TEST_VALUE(TAG_PARTS) TEST_VALUE(TAG_PUBLISHINFO) TEST_VALUE(TAG_MEDIA_ARTIST) TEST_VALUE(TAG_MEDIA_ALBUM) TEST_VALUE(TAG_MEDIA_TITLE) TEST_VALUE(TAG_MEDIA_LENGTH) TEST_VALUE(TAG_MEDIA_BITRATE) TEST_VALUE(TAG_MEDIA_CODEC) TEST_VALUE(TAG_ENCRYPTION) TEST_VALUE(TAG_FILERATING) TEST_VALUE(TAG_BUDDYHASH) TEST_VALUE(TAG_CLIENTLOWID) TEST_VALUE(TAG_SERVERPORT) TEST_VALUE(TAG_SERVERIP) TEST_VALUE(TAG_SOURCEUPORT) TEST_VALUE(TAG_SOURCEPORT) TEST_VALUE(TAG_SOURCEIP) TEST_VALUE(TAG_SOURCETYPE) return "??"; } const char* DecodeTagType(uint8_t value) { TEST_VALUE(TAGTYPE_HASH16) TEST_VALUE(TAGTYPE_STRING) TEST_VALUE(TAGTYPE_UINT32) TEST_VALUE(TAGTYPE_FLOAT32) TEST_VALUE(TAGTYPE_BOOL) TEST_VALUE(TAGTYPE_BOOLARRAY) TEST_VALUE(TAGTYPE_BLOB) TEST_VALUE(TAGTYPE_UINT16) TEST_VALUE(TAGTYPE_UINT8) TEST_VALUE(TAGTYPE_BSOB) TEST_VALUE(TAGTYPE_UINT64) TEST_VALUE(TAGTYPE_STR1) TEST_VALUE(TAGTYPE_STR2) TEST_VALUE(TAGTYPE_STR3) TEST_VALUE(TAGTYPE_STR4) TEST_VALUE(TAGTYPE_STR5) TEST_VALUE(TAGTYPE_STR6) TEST_VALUE(TAGTYPE_STR7) TEST_VALUE(TAGTYPE_STR8) TEST_VALUE(TAGTYPE_STR9) TEST_VALUE(TAGTYPE_STR10) TEST_VALUE(TAGTYPE_STR11) TEST_VALUE(TAGTYPE_STR12) TEST_VALUE(TAGTYPE_STR13) TEST_VALUE(TAGTYPE_STR14) TEST_VALUE(TAGTYPE_STR15) TEST_VALUE(TAGTYPE_STR16) TEST_VALUE(TAGTYPE_STR17) TEST_VALUE(TAGTYPE_STR18) TEST_VALUE(TAGTYPE_STR19) TEST_VALUE(TAGTYPE_STR20) TEST_VALUE(TAGTYPE_STR21) TEST_VALUE(TAGTYPE_STR22) return "??"; } const char* DecodeServerTagNameID(uint8_t value) { TEST_VALUE(ST_SERVERNAME) TEST_VALUE(ST_DESCRIPTION) TEST_VALUE(ST_PING) TEST_VALUE(ST_FAIL) TEST_VALUE(ST_PREFERENCE) TEST_VALUE(ST_DYNIP) TEST_VALUE(ST_LASTPING_DEPRECATED) TEST_VALUE(ST_MAXUSERS) TEST_VALUE(ST_SOFTFILES) TEST_VALUE(ST_HARDFILES) TEST_VALUE(ST_LASTPING) TEST_VALUE(ST_VERSION) TEST_VALUE(ST_UDPFLAGS) TEST_VALUE(ST_AUXPORTSLIST) TEST_VALUE(ST_LOWIDUSERS) TEST_VALUE(ST_UDPKEY) TEST_VALUE(ST_UDPKEYIP) TEST_VALUE(ST_TCPPORTOBFUSCATION) TEST_VALUE(ST_UDPPORTOBFUSCATION) return "??"; } const char* DecodeFriendTagNameID(uint8_t value) { TEST_VALUE(FF_NAME) return "??"; } typedef std::map FlagMap; class CFlagDecoder { public: void AddFlag(uint32_t bit, const char* name) { m_flags[bit] = name; } wxString DecodeFlags(uint32_t flags) { uint32_t cur_flag = 1; wxString result; while (flags) { if (flags & 1) { if (!result.empty()) { result += wxT(" | "); } FlagMap::const_iterator it = m_flags.find(cur_flag); if (it != m_flags.end()) { result += wxString::FromAscii(it->second); } else { result += wxString::Format(wxT("%#x"), cur_flag); } } cur_flag <<= 1; flags >>= 1; } return result; } private: FlagMap m_flags; }; #define ADD_DECODER_FLAG(decoder, FLAG) decoder.AddFlag(FLAG, #FLAG) std::ostream& operator<<(std::ostream& out, const CTag& tag) { out << "{ "; if (tag.GetName().empty()) { out << hex(tag.GetNameID()) << ' ' << DecodeTagNameID(tag.GetNameID()); } else { out << TagNameString(tag.GetName()) << ' '; bool name_decoded = false; if (tag.IsInt() && tag.GetName().length() > 1) { wxCharBuffer ascii_name = tag.GetName().ToAscii(); char gap_mark = ascii_name ? ascii_name[(size_t)0] : 0; if (gap_mark == FT_GAPSTART || gap_mark == FT_GAPEND) { unsigned long gapkey; if (tag.GetName().Mid(1).ToULong(&gapkey)) { out << DecodeTagNameID(gap_mark) << wxString::Format(wxT("[%lu]"), gapkey); name_decoded = true; } } } if (!name_decoded) { out << DecodeTagName(tag.GetName()); } } out << ", " << (unsigned)tag.GetType() << ' ' << DecodeTagType(tag.GetType()) << ", "; if (tag.IsInt()) { if (tag.GetName() == TAG_SOURCEIP) { out << CKadIP(tag.GetInt()); } else if (tag.GetName() == TAG_SERVERIP) { out << CeD2kIP(tag.GetInt()); } else if (tag.GetName() == TAG_ENCRYPTION) { uint8_t enc = tag.GetInt(); out << hex(enc); if (enc) { CFlagDecoder decoder; decoder.AddFlag(0x01, "CryptSupported"); decoder.AddFlag(0x02, "CryptRequested"); decoder.AddFlag(0x04, "CryptRequired"); decoder.AddFlag(0x08, "SupportsDirectCallback"); out << " (" << decoder.DecodeFlags(enc) << ')'; } } else if (tag.GetNameID() == FT_LASTSEENCOMPLETE || tag.GetNameID() == FT_KADLASTPUBLISHSRC || tag.GetNameID() == FT_KADLASTPUBLISHNOTES || tag.GetNameID() == FT_KADLASTPUBLISHKEY ) { out << CTimeT(tag.GetInt()); } else if (tag.GetName() == TAG_FILESIZE || tag.GetNameID() == FT_FILESIZE || tag.GetNameID() == FT_TRANSFERRED || tag.GetNameID() == FT_ATTRANSFERRED ) { out << tag.GetInt() << " (" << CastItoXBytes(tag.GetInt()) << ')'; } else if (tag.GetNameID() == FT_ULPRIORITY || tag.GetNameID() == FT_DLPRIORITY || tag.GetNameID() == FT_OLDULPRIORITY || tag.GetNameID() == FT_OLDDLPRIORITY ) { out << tag.GetInt() << ' '; switch (tag.GetInt()) { case PR_VERYLOW: out << "PR_VERYLOW"; break; case PR_LOW: out << "PR_LOW"; break; case PR_NORMAL: out << "PR_NORMAL"; break; case PR_HIGH: out << "PR_HIGH"; break; case PR_VERYHIGH: out << "PR_VERYHIGH"; break; case PR_AUTO: out << "PR_AUTO"; break; case PR_POWERSHARE: out << "PR_POWERSHARE"; break; } } else { out << tag.GetInt(); } } else if (tag.IsStr()) { out << MakePrintableString(tag.GetStr()); } else if (tag.IsFloat()) { out << tag.GetFloat(); } else if (tag.IsHash()) { out << tag.GetHash(); } else if (tag.IsBlob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBlobSize()); } else if (tag.IsBsob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBsobSize()); } else { out << "(...)"; } out << " }"; return out; } std::ostream& operator<<(std::ostream& out, const CServerTag& tag) { out << "{ "; if (tag.GetName().empty()) { out << hex(tag.GetNameID()) << ' ' << DecodeServerTagNameID(tag.GetNameID()); } else { out << TagNameString(tag.GetName()); } out << ", " << (unsigned)tag.GetType() << ' ' << DecodeTagType(tag.GetType()) << ", "; if (tag.IsInt()) { if (tag.GetNameID() == ST_DYNIP || tag.GetNameID() == ST_UDPKEYIP) { out << CeD2kIP(tag.GetInt()); } else if (tag.GetNameID() == ST_UDPKEY) { out << hex((uint32_t)tag.GetInt()); } else if (tag.GetNameID() == ST_UDPFLAGS) { uint32_t flags = tag.GetInt(); out << hex(flags); if (flags) { CFlagDecoder decoder; ADD_DECODER_FLAG(decoder, SRV_UDPFLG_EXT_GETSOURCES); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_EXT_GETFILES); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_NEWTAGS); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_UNICODE); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_EXT_GETSOURCES2); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_LARGEFILES); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_UDPOBFUSCATION); ADD_DECODER_FLAG(decoder, SRV_UDPFLG_TCPOBFUSCATION); out << " (" << decoder.DecodeFlags(flags) << ')'; } } else if (tag.GetNameID() == ST_PREFERENCE) { out << tag.GetInt() << ' '; switch (tag.GetInt()) { case 0: out << "SRV_PR_NORMAL"; break; case 1: out << "SRV_PR_HIGH"; break; case 2: out << "SRV_PR_LOW"; break; default: out << "??"; } } else { out << tag.GetInt(); } } else if (tag.IsStr()) { out << MakePrintableString(tag.GetStr()); } else if (tag.IsFloat()) { out << tag.GetFloat(); } else if (tag.IsHash()) { out << tag.GetHash(); } else if (tag.IsBlob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBlobSize()); } else if (tag.IsBsob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBsobSize()); } else { out << "(...)"; } out << " }"; return out; } std::ostream& operator<<(std::ostream& out, const CFriendTag& tag) { out << "{ "; if (tag.GetName().empty()) { out << hex(tag.GetNameID()) << ' ' << DecodeFriendTagNameID(tag.GetNameID()); } else { out << TagNameString(tag.GetName()); } out << ", " << (unsigned)tag.GetType() << ' ' << DecodeTagType(tag.GetType()) << ", "; if (tag.IsInt()) { out << tag.GetInt(); } else if (tag.IsStr()) { out << MakePrintableString(tag.GetStr()); } else if (tag.IsFloat()) { out << tag.GetFloat(); } else if (tag.IsHash()) { out << tag.GetHash(); } else if (tag.IsBlob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBlobSize()); } else if (tag.IsBsob()) { out << wxString::Format(wxT("(size = %u)"), tag.GetBsobSize()); } else { out << "(...)"; } out << " }"; return out; } aMule-2.3.1/src/utils/fileview/eD2kFiles.h0000644000175000017470000000307511575347521017165 0ustar topiusers// -*- C++ -*- // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef FILEVIEW_ED2KFILES_H #define FILEVIEW_ED2KFILES_H class CFileDataIO; void DecodePreferencesDat(const CFileDataIO& file); void DecodeFriendList(const CFileDataIO& file); void DecodeServerMet(const CFileDataIO& file); void DecodeClientsMet(const CFileDataIO& file); void DecodeKnownMet(const CFileDataIO& file); void DecodePartMetFile(const CFileDataIO& file); /* Not really eD2k related... */ void DecodeStatisticsDat(const CFileDataIO& file); #endif /* FILEVIEW_ED2KFILES_H */ aMule-2.3.1/src/utils/fileview/Makefile.am0000644000175000017470000000134411575347521017275 0ustar topiusersnoinst_PROGRAMS = mulefileview mulefileview_SOURCES = \ ../../CFile.cpp \ ../../SafeFile.cpp \ ../../OtherFunctions.cpp \ ../../Tag.cpp \ ../../kademlia/utils/UInt128.cpp \ ../../kademlia/kademlia/SearchManager.h \ eD2kFiles.h \ eD2kFiles.cpp \ FileView.cpp \ KadFiles.h \ KadFiles.cpp \ Print.h \ Print.cpp mulefileview_DEPENDENCIES = ../../libs/common/libmulecommon.a mulefileview_CPPFLAGS = $(MULECPPFLAGS) -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include $(WXBASE_CPPFLAGS) $(CRYPTOPP_CPPFLAGS) mulefileview_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) mulefileview_LDFLAGS = $(MULELDFLAGS) -L../../libs/common $(CRYPTOPP_LDFLAGS) mulefileview_LDADD = -lmulecommon $(WXBASE_LIBS) $(CRYPTOPP_LIBS) aMule-2.3.1/src/utils/fileview/KadFiles.h0000644000175000017470000000267711575347521017106 0ustar topiusers// -*- C++ -*- // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef FILEVIEW_KADFILES_H #define FILEVIEW_KADFILES_H class CFileDataIO; void DecodePreferencesKadDat(const CFileDataIO& file); void DecodeLoadIndexDat(const CFileDataIO& file); void DecodeKeyIndexDat(const CFileDataIO& file); void DecodeSourceIndexDat(const CFileDataIO& file); void DecodeNodesDat(const CFileDataIO& file); #endif /* FILEVIEW_KADFILES_H */ aMule-2.3.1/src/utils/fileview/FileView.cpp0000644000175000017470000001332311575347521017457 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2008-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include #include #include "eD2kFiles.h" #include "KadFiles.h" #include "Print.h" #include "../../CFile.h" #define VERSION_MAJOR 0 #define VERSION_MINOR 10 #define VERSION_MICRO 0 class CFileView : public wxApp { private: virtual int OnRun(); virtual void OnInitCmdLine(wxCmdLineParser& parser); virtual bool OnCmdLineParsed(wxCmdLineParser& parser); std::list m_files; }; DECLARE_APP(CFileView); // Logging facility from aMule enum DebugType {}; class CLogger { public: void AddLogLine(const wxString& /*file*/, int /*line*/, bool /*critical*/, DebugType /*type*/, const wxString& str, bool /*toStdout*/, bool /*toGUI*/); }; void CLogger::AddLogLine(const wxString& /*file*/, int /*line*/, bool /*critical*/, DebugType /*type*/, const wxString& str, bool /*toStdout*/, bool /*toGUI*/) { cout << "DebugLog: " << str << "\n"; } CLogger theLogger; IMPLEMENT_APP(CFileView); void CFileView::OnInitCmdLine(wxCmdLineParser& parser) { parser.AddSwitch(wxT("h"), wxT("help"), wxT("Show help"), wxCMD_LINE_OPTION_HELP); parser.AddSwitch(wxT("v"), wxT("version"), wxT("Show program version"), wxCMD_LINE_PARAM_OPTIONAL); parser.AddOption(wxT("s"), wxT("strings"), wxT("String decoding mode: display (default), safe, utf8, none"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); parser.AddParam(wxT("input file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE); } bool CFileView::OnCmdLineParsed(wxCmdLineParser& parser) { if (parser.Found(wxT("version"))) { cout << wxString::Format(wxT("MuleFileView version %u.%u.%u\nCopyright (c) 2008-2011 aMule Team\n"), VERSION_MAJOR, VERSION_MINOR, VERSION_MICRO); return false; } else { wxString strDecode; if (parser.Found(wxT("strings"), &strDecode)) { if (strDecode == wxT("display")) { SetStringsMode(SD_DISPLAY); } else if (strDecode == wxT("safe")) { SetStringsMode(SD_SAFE); } else if (strDecode == wxT("utf8")) { SetStringsMode(SD_UTF8); } else if (strDecode == wxT("none")) { SetStringsMode(SD_NONE); } else { parser.SetLogo(wxT("Error: Invalid argument to --strings option: \"") + strDecode + wxT("\"")); parser.Usage(); return false; } } else { SetStringsMode(SD_DISPLAY); } for (size_t n = 0; n < parser.GetParamCount(); n++) { m_files.push_back(parser.GetParam(n)); } if (m_files.size() == 0) { parser.Usage(); return false; } else { return true; } } } int CFileView::OnRun() { for (std::list::const_iterator it = m_files.begin(); it != m_files.end(); ++it) { wxString basename = (*it).AfterLast(wxFileName::GetPathSeparator()).AfterLast(wxT('/')); try { CFile file(*it); if (file.IsOpened()) { if (it != m_files.begin()) { cout << endl; } cout << "Decoding file: " << *it << endl; if (basename == wxT("preferencesKad.dat")) { DecodePreferencesKadDat(file); } else if (basename == wxT("load_index.dat")) { DecodeLoadIndexDat(file); } else if (basename == wxT("key_index.dat")) { DecodeKeyIndexDat(file); } else if (basename == wxT("src_index.dat")) { DecodeSourceIndexDat(file); } else if (basename == wxT("nodes.dat")) { DecodeNodesDat(file); } else if (basename == wxT("preferences.dat")) { DecodePreferencesDat(file); } else if (basename == wxT("emfriends.met")) { DecodeFriendList(file); } else if (basename == wxT("server.met")) { DecodeServerMet(file); } else if (basename == wxT("clients.met")) { DecodeClientsMet(file); } else if (basename == wxT("known.met")) { DecodeKnownMet(file); } else if (basename == wxT("statistics.dat")) { DecodeStatisticsDat(file); } else if (basename.Find(wxT(".part.met")) != wxNOT_FOUND) { DecodePartMetFile(file); } else { cerr << "ERROR: Don't know how to decode " << *it << endl; } } } catch (const CEOFException& e) { cerr << "ERROR: A CEOFException has been raised while decoding " << *it << ": " << e.what() << endl; return 1; } catch (const CIOFailureException& e) { cerr << "ERROR: A CIOFailureException has been raised while decoding " << *it << ": " << e.what() << endl; return 1; } catch (const CSafeIOException& e) { cerr << "ERROR: A CSafeIOException has been raised while decoding " << *it << ": " << e.what() << endl; return 1; } catch (const CMuleException& e) { cerr << "ERROR: A CMuleException has been raised while decoding " << *it << ": " << e.what() << endl; return 1; } catch (const wxString& e) { cerr << "ERROR: An exception of type wxString has been raised while decoding " << *it << ": " << e << endl; return 1; } } return 0; } aMule-2.3.1/src/utils/fileview/eD2kFiles.cpp0000644000175000017470000002133311575347521017515 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "eD2kFiles.h" #include "Print.h" #include "../../SafeFile.h" #include "../../ClientCredits.h" // Needed for MAXPUBKEYSIZE #include "../../OtherFunctions.h" // Needed for CastItoXBytes #include #include enum VersionType { PrefFile, PartMetFile, CreditFile, KnownFileList }; static wxString VersionInfo(uint8_t version, uint8_t type) { wxString verStr = wxT("??"); if (type == PrefFile) { if (version == PREFFILE_VERSION) { verStr = wxT("PREFFILE_VERSION"); } } else if (type == PartMetFile) { if (version == PARTFILE_VERSION) { verStr = wxT("PARTFILE_VERSION"); } else if (version == PARTFILE_SPLITTEDVERSION) { verStr = wxT("PARTFILE_SPLITTEDVERSION"); } else if (version == PARTFILE_VERSION_LARGEFILE) { verStr = wxT("PARTFILE_VERSION_LARGEFILE"); } } else if (type == CreditFile) { if (version == CREDITFILE_VERSION) { verStr = wxT("CREDITFILE_VERSION"); } } else if (type == KnownFileList) { if (version == MET_HEADER) { verStr = wxT("MET_HEADER"); } else if (version == MET_HEADER_WITH_LARGEFILES) { verStr = wxT("MET_HEADER_WITH_LARGEFILES"); } } return hex(version) + wxT(' ') + verStr; }; void DecodePreferencesDat(const CFileDataIO& file) { cout << "(Version): " << VersionInfo(file.ReadUInt8(), PrefFile); cout << "\nUserHash : " << file.ReadHash() << '\n'; } void DecodeFriendList(const CFileDataIO& file) { uint8_t version = file.ReadUInt8(); cout << "Version : " << VersionInfo(version, KnownFileList) << endl; if (version != MET_HEADER) { cerr << "File seems to be corrupt, invalid version!" << endl; return; } uint32_t records = file.ReadUInt32(); cout << "Records : " << records << '\n'; for (uint32_t i = 0; i < records; i++) { cout << "\tUserHash : " << file.ReadHash(); cout << "\n\tLasUsedIP : " << CeD2kIP(file.ReadUInt32()); cout << "\n\tLasUsedPort: " << file.ReadUInt16(); cout << "\n\tLastSeen : " << CTimeT(file.ReadUInt32()); cout << "\n\tLastChatted: " << CTimeT(file.ReadUInt32()); uint32_t tagCount = file.ReadUInt32(); cout << "\n\ttagCount : " << tagCount << '\n'; for (; tagCount > 0; --tagCount) { CTag tag(file, true); cout << "\t\t" << CFriendTag(tag) << '\n'; } } } void DecodeServerMet(const CFileDataIO& file) { uint8_t version = file.ReadUInt8(); cout << "Version : " << VersionInfo(version, KnownFileList) << endl; if (version != 0xE0 && version != MET_HEADER) { cerr << "File seems to be corrupt, invalid version!" << endl; return; } uint32_t ServerCount = file.ReadUInt32(); cout << "Count : " << ServerCount << '\n'; for (; ServerCount > 0; --ServerCount) { cout << "\tIP : " << CeD2kIP(file.ReadUInt32()) << '\n'; cout << "\tPort : " << file.ReadUInt16() << '\n'; uint32_t tagCount = file.ReadUInt32(); cout << "\ttagCount : " << tagCount << '\n'; for (; tagCount > 0; --tagCount) { CTag tag(file, true); cout << "\t\t" << CServerTag(tag) << '\n'; } } } void DecodeClientsMet(const CFileDataIO& file) { uint8_t version = file.ReadUInt8(); cout << "Version : " << VersionInfo(version, CreditFile) << endl; if (version != CREDITFILE_VERSION) { cerr << "File seems to be corrupt, invalid version!" << endl; return; } uint32_t count = file.ReadUInt32(); cout << "Count : " << count << '\n'; for (uint32_t i = 0; i < count; i++) { cout << wxString::Format(wxT("#%u\tKey : "), i) << file.ReadHash(); uint32_t uploaded = file.ReadUInt32(); uint32_t downloaded = file.ReadUInt32(); cout << "\n\tUploaded : " << uploaded; cout << "\n\tDownloaded : " << downloaded; cout << "\n\tLast Seen : " << CTimeT(file.ReadUInt32()); uint32_t uphi = file.ReadUInt32(); uint32_t downhi = file.ReadUInt32(); uint64_t totalup = (static_cast(uphi) << 32) + uploaded; uint64_t totaldown = (static_cast(downhi) << 32) + downloaded; cout << "\n\tUploadedHI : " << uphi << " Total : " << totalup << " (" << CastItoXBytes(totalup) << ')'; cout << "\n\tDownloadedHI : " << downhi << " Total : " << totaldown << " (" << CastItoXBytes(totaldown) << ')'; cout << "\n\t(Reserved) : " << file.ReadUInt16(); uint8_t keysize = file.ReadUInt8(); cout << "\n\tKeySize : " << (unsigned)keysize; cout << "\n\tKey Data : "; char buf[MAXPUBKEYSIZE]; file.Read(buf, MAXPUBKEYSIZE); PrintByteArray(buf, MAXPUBKEYSIZE); cout << endl; if (keysize > MAXPUBKEYSIZE) { cerr << "\n*** Corruption found while reading credit file! ***\n" << endl; break; } } } static inline void PrintDateFromFile(const CFileDataIO& file, const wxString& prefix = wxEmptyString) { cout << prefix << "LastChanged : " << CTimeT(file.ReadUInt32()) << '\n'; } static void PrintHashsetFromFile(const CFileDataIO& file, const wxString& prefix = wxEmptyString) { cout << prefix << "FileHash : " << file.ReadHash() << '\n'; uint16_t parts = file.ReadUInt16(); cout << prefix << "Parts : " << parts << '\n'; cout << prefix << "HashSet : "; for (uint16_t i = 0; i < parts; i++) { if (i) { cout << ", "; } cout << file.ReadHash(); } cout << '\n'; } void DecodeKnownMet(const CFileDataIO& file) { uint8_t version = file.ReadUInt8(); cout << "Version : " << VersionInfo(version, KnownFileList) << endl; if (version != MET_HEADER && version != MET_HEADER_WITH_LARGEFILES) { cerr << "File seems to be corrupt, invalid version!" << endl; return; } uint32_t records = file.ReadUInt32(); cout << "Records : " << records << '\n'; for (uint32_t i = 0; i < records; i++) { PrintDateFromFile(file, wxString::Format(wxT("#%u\t"), i)); PrintHashsetFromFile(file, wxT("\t")); uint32_t tagCount = file.ReadUInt32(); cout << "\tTagCount : " << tagCount << '\n'; for (; tagCount > 0; tagCount--) { CTag tag(file, true); cout << "\t\t" << tag << '\n'; } } } void DecodePartMetFile(const CFileDataIO& file) { uint16_t PartCount = 0; uint8_t version = file.ReadUInt8(); cout << "Version : " << VersionInfo(version, PartMetFile) << endl; if (version != PARTFILE_VERSION && version != PARTFILE_SPLITTEDVERSION && version != PARTFILE_VERSION_LARGEFILE) { cerr << "File seems to be corrupt, invalid version!" << endl; return; } bool isnewstyle = (version == PARTFILE_SPLITTEDVERSION); if (!isnewstyle) { uint8_t test[4]; file.Seek(24, wxFromStart); file.Read(test, 4); file.Seek(1, wxFromStart); if (test[0] == 0 && test[1] == 0 && test[2] == 2 && test[3] == 1) { isnewstyle = true; } } if (isnewstyle) { uint32_t temp = file.ReadUInt32(); if (temp == 0) { PrintHashsetFromFile(file); } else { file.Seek(2, wxFromStart); PrintDateFromFile(file); cout << "FileHash : " << file.ReadHash() << '\n'; } } else { PrintDateFromFile(file); PrintHashsetFromFile(file); } uint32_t tagCount = file.ReadUInt32(); cout << "TagCount : " << tagCount << '\n'; for (; tagCount > 0; tagCount--) { CTag tag(file, true); if (tag.GetNameID() == FT_FILESIZE) { PartCount = (tag.GetInt() + (PARTSIZE - 1)) / PARTSIZE; } cout << '\t' << tag << '\n'; } if (isnewstyle && (file.GetPosition() < file.GetLength())) { file.Seek(1, wxFromCurrent); cout << "HashSet : "; for (uint16_t i = 0; i < PartCount && (file.GetPosition() + 16 < file.GetLength()); i++) { if (i) { cout << ", "; } cout << file.ReadHash(); } } cout << '\n'; } void DecodeStatisticsDat(const CFileDataIO& file) { uint8_t version = file.ReadUInt8(); cout << "Version : " << (unsigned)version << '\n'; if (version == 0) { uint64_t tmp = file.ReadUInt64(); cout << "Total sent bytes : " << tmp << " (" << CastItoXBytes(tmp) << ")\n"; tmp = file.ReadUInt64(); cout << "Total received bytes : " << tmp << " (" << CastItoXBytes(tmp) << ")\n"; } } aMule-2.3.1/src/utils/fileview/Makefile.in0000644000175000017470000011411511657306263017306 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = mulefileview$(EXEEXT) subdir = src/utils/fileview DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_mulefileview_OBJECTS = mulefileview-CFile.$(OBJEXT) \ mulefileview-SafeFile.$(OBJEXT) \ mulefileview-OtherFunctions.$(OBJEXT) \ mulefileview-Tag.$(OBJEXT) mulefileview-UInt128.$(OBJEXT) \ mulefileview-eD2kFiles.$(OBJEXT) \ mulefileview-FileView.$(OBJEXT) \ mulefileview-KadFiles.$(OBJEXT) mulefileview-Print.$(OBJEXT) mulefileview_OBJECTS = $(am_mulefileview_OBJECTS) am__DEPENDENCIES_1 = mulefileview_LINK = $(CXXLD) $(mulefileview_CXXFLAGS) $(CXXFLAGS) \ $(mulefileview_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(mulefileview_SOURCES) DIST_SOURCES = $(mulefileview_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ mulefileview_SOURCES = \ ../../CFile.cpp \ ../../SafeFile.cpp \ ../../OtherFunctions.cpp \ ../../Tag.cpp \ ../../kademlia/utils/UInt128.cpp \ ../../kademlia/kademlia/SearchManager.h \ eD2kFiles.h \ eD2kFiles.cpp \ FileView.cpp \ KadFiles.h \ KadFiles.cpp \ Print.h \ Print.cpp mulefileview_DEPENDENCIES = ../../libs/common/libmulecommon.a mulefileview_CPPFLAGS = $(MULECPPFLAGS) -I$(top_srcdir)/src/libs -I$(top_srcdir)/src/include $(WXBASE_CPPFLAGS) $(CRYPTOPP_CPPFLAGS) mulefileview_CXXFLAGS = $(MULECXXFLAGS) $(WX_CFLAGS_ONLY) $(WX_CXXFLAGS_ONLY) mulefileview_LDFLAGS = $(MULELDFLAGS) -L../../libs/common $(CRYPTOPP_LDFLAGS) mulefileview_LDADD = -lmulecommon $(WXBASE_LIBS) $(CRYPTOPP_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/fileview/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/fileview/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) mulefileview$(EXEEXT): $(mulefileview_OBJECTS) $(mulefileview_DEPENDENCIES) @rm -f mulefileview$(EXEEXT) $(AM_V_CXXLD)$(mulefileview_LINK) $(mulefileview_OBJECTS) $(mulefileview_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-CFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-FileView.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-KadFiles.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-OtherFunctions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-Print.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-SafeFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-Tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-UInt128.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mulefileview-eD2kFiles.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` mulefileview-CFile.o: ../../CFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-CFile.o -MD -MP -MF $(DEPDIR)/mulefileview-CFile.Tpo -c -o mulefileview-CFile.o `test -f '../../CFile.cpp' || echo '$(srcdir)/'`../../CFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-CFile.Tpo $(DEPDIR)/mulefileview-CFile.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../CFile.cpp' object='mulefileview-CFile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-CFile.o `test -f '../../CFile.cpp' || echo '$(srcdir)/'`../../CFile.cpp mulefileview-CFile.obj: ../../CFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-CFile.obj -MD -MP -MF $(DEPDIR)/mulefileview-CFile.Tpo -c -o mulefileview-CFile.obj `if test -f '../../CFile.cpp'; then $(CYGPATH_W) '../../CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../CFile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-CFile.Tpo $(DEPDIR)/mulefileview-CFile.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../CFile.cpp' object='mulefileview-CFile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-CFile.obj `if test -f '../../CFile.cpp'; then $(CYGPATH_W) '../../CFile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../CFile.cpp'; fi` mulefileview-SafeFile.o: ../../SafeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-SafeFile.o -MD -MP -MF $(DEPDIR)/mulefileview-SafeFile.Tpo -c -o mulefileview-SafeFile.o `test -f '../../SafeFile.cpp' || echo '$(srcdir)/'`../../SafeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-SafeFile.Tpo $(DEPDIR)/mulefileview-SafeFile.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../SafeFile.cpp' object='mulefileview-SafeFile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-SafeFile.o `test -f '../../SafeFile.cpp' || echo '$(srcdir)/'`../../SafeFile.cpp mulefileview-SafeFile.obj: ../../SafeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-SafeFile.obj -MD -MP -MF $(DEPDIR)/mulefileview-SafeFile.Tpo -c -o mulefileview-SafeFile.obj `if test -f '../../SafeFile.cpp'; then $(CYGPATH_W) '../../SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../SafeFile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-SafeFile.Tpo $(DEPDIR)/mulefileview-SafeFile.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../SafeFile.cpp' object='mulefileview-SafeFile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-SafeFile.obj `if test -f '../../SafeFile.cpp'; then $(CYGPATH_W) '../../SafeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../SafeFile.cpp'; fi` mulefileview-OtherFunctions.o: ../../OtherFunctions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-OtherFunctions.o -MD -MP -MF $(DEPDIR)/mulefileview-OtherFunctions.Tpo -c -o mulefileview-OtherFunctions.o `test -f '../../OtherFunctions.cpp' || echo '$(srcdir)/'`../../OtherFunctions.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-OtherFunctions.Tpo $(DEPDIR)/mulefileview-OtherFunctions.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../OtherFunctions.cpp' object='mulefileview-OtherFunctions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-OtherFunctions.o `test -f '../../OtherFunctions.cpp' || echo '$(srcdir)/'`../../OtherFunctions.cpp mulefileview-OtherFunctions.obj: ../../OtherFunctions.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-OtherFunctions.obj -MD -MP -MF $(DEPDIR)/mulefileview-OtherFunctions.Tpo -c -o mulefileview-OtherFunctions.obj `if test -f '../../OtherFunctions.cpp'; then $(CYGPATH_W) '../../OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/../../OtherFunctions.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-OtherFunctions.Tpo $(DEPDIR)/mulefileview-OtherFunctions.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../OtherFunctions.cpp' object='mulefileview-OtherFunctions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-OtherFunctions.obj `if test -f '../../OtherFunctions.cpp'; then $(CYGPATH_W) '../../OtherFunctions.cpp'; else $(CYGPATH_W) '$(srcdir)/../../OtherFunctions.cpp'; fi` mulefileview-Tag.o: ../../Tag.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-Tag.o -MD -MP -MF $(DEPDIR)/mulefileview-Tag.Tpo -c -o mulefileview-Tag.o `test -f '../../Tag.cpp' || echo '$(srcdir)/'`../../Tag.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-Tag.Tpo $(DEPDIR)/mulefileview-Tag.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../Tag.cpp' object='mulefileview-Tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-Tag.o `test -f '../../Tag.cpp' || echo '$(srcdir)/'`../../Tag.cpp mulefileview-Tag.obj: ../../Tag.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-Tag.obj -MD -MP -MF $(DEPDIR)/mulefileview-Tag.Tpo -c -o mulefileview-Tag.obj `if test -f '../../Tag.cpp'; then $(CYGPATH_W) '../../Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/../../Tag.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-Tag.Tpo $(DEPDIR)/mulefileview-Tag.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../Tag.cpp' object='mulefileview-Tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-Tag.obj `if test -f '../../Tag.cpp'; then $(CYGPATH_W) '../../Tag.cpp'; else $(CYGPATH_W) '$(srcdir)/../../Tag.cpp'; fi` mulefileview-UInt128.o: ../../kademlia/utils/UInt128.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-UInt128.o -MD -MP -MF $(DEPDIR)/mulefileview-UInt128.Tpo -c -o mulefileview-UInt128.o `test -f '../../kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`../../kademlia/utils/UInt128.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-UInt128.Tpo $(DEPDIR)/mulefileview-UInt128.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../kademlia/utils/UInt128.cpp' object='mulefileview-UInt128.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-UInt128.o `test -f '../../kademlia/utils/UInt128.cpp' || echo '$(srcdir)/'`../../kademlia/utils/UInt128.cpp mulefileview-UInt128.obj: ../../kademlia/utils/UInt128.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-UInt128.obj -MD -MP -MF $(DEPDIR)/mulefileview-UInt128.Tpo -c -o mulefileview-UInt128.obj `if test -f '../../kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) '../../kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/../../kademlia/utils/UInt128.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-UInt128.Tpo $(DEPDIR)/mulefileview-UInt128.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='../../kademlia/utils/UInt128.cpp' object='mulefileview-UInt128.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-UInt128.obj `if test -f '../../kademlia/utils/UInt128.cpp'; then $(CYGPATH_W) '../../kademlia/utils/UInt128.cpp'; else $(CYGPATH_W) '$(srcdir)/../../kademlia/utils/UInt128.cpp'; fi` mulefileview-eD2kFiles.o: eD2kFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-eD2kFiles.o -MD -MP -MF $(DEPDIR)/mulefileview-eD2kFiles.Tpo -c -o mulefileview-eD2kFiles.o `test -f 'eD2kFiles.cpp' || echo '$(srcdir)/'`eD2kFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-eD2kFiles.Tpo $(DEPDIR)/mulefileview-eD2kFiles.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='eD2kFiles.cpp' object='mulefileview-eD2kFiles.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-eD2kFiles.o `test -f 'eD2kFiles.cpp' || echo '$(srcdir)/'`eD2kFiles.cpp mulefileview-eD2kFiles.obj: eD2kFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-eD2kFiles.obj -MD -MP -MF $(DEPDIR)/mulefileview-eD2kFiles.Tpo -c -o mulefileview-eD2kFiles.obj `if test -f 'eD2kFiles.cpp'; then $(CYGPATH_W) 'eD2kFiles.cpp'; else $(CYGPATH_W) '$(srcdir)/eD2kFiles.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-eD2kFiles.Tpo $(DEPDIR)/mulefileview-eD2kFiles.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='eD2kFiles.cpp' object='mulefileview-eD2kFiles.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-eD2kFiles.obj `if test -f 'eD2kFiles.cpp'; then $(CYGPATH_W) 'eD2kFiles.cpp'; else $(CYGPATH_W) '$(srcdir)/eD2kFiles.cpp'; fi` mulefileview-FileView.o: FileView.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-FileView.o -MD -MP -MF $(DEPDIR)/mulefileview-FileView.Tpo -c -o mulefileview-FileView.o `test -f 'FileView.cpp' || echo '$(srcdir)/'`FileView.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-FileView.Tpo $(DEPDIR)/mulefileview-FileView.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileView.cpp' object='mulefileview-FileView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-FileView.o `test -f 'FileView.cpp' || echo '$(srcdir)/'`FileView.cpp mulefileview-FileView.obj: FileView.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-FileView.obj -MD -MP -MF $(DEPDIR)/mulefileview-FileView.Tpo -c -o mulefileview-FileView.obj `if test -f 'FileView.cpp'; then $(CYGPATH_W) 'FileView.cpp'; else $(CYGPATH_W) '$(srcdir)/FileView.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-FileView.Tpo $(DEPDIR)/mulefileview-FileView.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='FileView.cpp' object='mulefileview-FileView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-FileView.obj `if test -f 'FileView.cpp'; then $(CYGPATH_W) 'FileView.cpp'; else $(CYGPATH_W) '$(srcdir)/FileView.cpp'; fi` mulefileview-KadFiles.o: KadFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-KadFiles.o -MD -MP -MF $(DEPDIR)/mulefileview-KadFiles.Tpo -c -o mulefileview-KadFiles.o `test -f 'KadFiles.cpp' || echo '$(srcdir)/'`KadFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-KadFiles.Tpo $(DEPDIR)/mulefileview-KadFiles.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadFiles.cpp' object='mulefileview-KadFiles.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-KadFiles.o `test -f 'KadFiles.cpp' || echo '$(srcdir)/'`KadFiles.cpp mulefileview-KadFiles.obj: KadFiles.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-KadFiles.obj -MD -MP -MF $(DEPDIR)/mulefileview-KadFiles.Tpo -c -o mulefileview-KadFiles.obj `if test -f 'KadFiles.cpp'; then $(CYGPATH_W) 'KadFiles.cpp'; else $(CYGPATH_W) '$(srcdir)/KadFiles.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-KadFiles.Tpo $(DEPDIR)/mulefileview-KadFiles.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='KadFiles.cpp' object='mulefileview-KadFiles.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-KadFiles.obj `if test -f 'KadFiles.cpp'; then $(CYGPATH_W) 'KadFiles.cpp'; else $(CYGPATH_W) '$(srcdir)/KadFiles.cpp'; fi` mulefileview-Print.o: Print.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-Print.o -MD -MP -MF $(DEPDIR)/mulefileview-Print.Tpo -c -o mulefileview-Print.o `test -f 'Print.cpp' || echo '$(srcdir)/'`Print.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-Print.Tpo $(DEPDIR)/mulefileview-Print.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Print.cpp' object='mulefileview-Print.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-Print.o `test -f 'Print.cpp' || echo '$(srcdir)/'`Print.cpp mulefileview-Print.obj: Print.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -MT mulefileview-Print.obj -MD -MP -MF $(DEPDIR)/mulefileview-Print.Tpo -c -o mulefileview-Print.obj `if test -f 'Print.cpp'; then $(CYGPATH_W) 'Print.cpp'; else $(CYGPATH_W) '$(srcdir)/Print.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mulefileview-Print.Tpo $(DEPDIR)/mulefileview-Print.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Print.cpp' object='mulefileview-Print.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mulefileview_CPPFLAGS) $(CPPFLAGS) $(mulefileview_CXXFLAGS) $(CXXFLAGS) -c -o mulefileview-Print.obj `if test -f 'Print.cpp'; then $(CYGPATH_W) 'Print.cpp'; else $(CYGPATH_W) '$(srcdir)/Print.cpp'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/fileview/KadFiles.cpp0000644000175000017470000001555111575347521017434 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "KadFiles.h" #include "Print.h" #include "../../SafeFile.h" #include "../../kademlia/kademlia/SearchManager.h" // for CSearchManager::GetInvalidKeywordChars() #include void DecodePreferencesKadDat(const CFileDataIO& file) { cout << "IP : " << CKadIP(file.ReadUInt32()) << '\n'; cout << "(unused): " << file.ReadUInt16() << '\n'; cout << "ClientID: " << file.ReadUInt128() << '\n'; } void DecodeLoadIndexDat(const CFileDataIO& file) { cout << "Version : " << file.ReadUInt32(); cout << "\n(savetime): " << CTimeT(file.ReadUInt32()); uint32_t numLoad = file.ReadUInt32(); cout << "\nnumLoad : " << numLoad << '\n'; for (uint32_t i = 0; i < numLoad; i++) { cout << "\t{ " << file.ReadUInt128(); cout << ", " << CTimeT(file.ReadUInt32()) << " }\n"; } } // from Kademlia.cpp #include "../../CryptoPP_Inc.h" void KadGetKeywordHash(const wxString& rstrKeyword, Kademlia::CUInt128* pKadID) { byte Output[16]; #ifdef CRYPTOPP_ENABLE_NAMESPACE_WEAK CryptoPP::Weak::MD4 md4_hasher; #else CryptoPP::MD4 md4_hasher; #endif // This should be safe - we assume rstrKeyword is ANSI anyway. Unicode2CharBuf ansi_buffer(unicode2UTF8(rstrKeyword)); md4_hasher.CalculateDigest(Output, (const byte *) (const char *) ansi_buffer, strlen(ansi_buffer)); pKadID->SetValueBE(Output); } // code from CSearchManager::GetWords(const wxString& str, WordList *words) bool IdentifyKeyword(const Kademlia::CUInt128& keyID, const wxString& str, wxString& keyword) { wxStringTokenizer tkz(str, Kademlia::CSearchManager::GetInvalidKeywordChars()); while (tkz.HasMoreTokens()) { wxString current_word = tkz.GetNextToken(); if (current_word.Length() > 2) { current_word.MakeLower(); Kademlia::CUInt128 currentID; KadGetKeywordHash(current_word, ¤tID); if (currentID == keyID) { keyword = current_word; return true; } } } return false; } void DecodeKeyIndexDat(const CFileDataIO& file) { uint32_t version; uint32_t numKeys; uint32_t numSource; uint32_t numName; uint8_t tagCount; cout << "Version : " << (version = file.ReadUInt32()); cout << "\nSaveTime: " << CTimeT(file.ReadUInt32()); cout << "\nID : " << file.ReadUInt128(); cout << "\nnumKeys : " << (numKeys = file.ReadUInt32()) << '\n'; for (uint32_t ik = 0; ik < numKeys; ik++) { Kademlia::CUInt128 keyID = file.ReadUInt128(); bool identified = false; cout << "\tKeyID : " << keyID; cout << "\n\tnumSource: " << (numSource = file.ReadUInt32()) << '\n'; for (uint32_t is = 0; is < numSource; is++) { cout << "\t\tSourceID: " << file.ReadUInt128(); cout << "\n\t\tnumName : " << (numName = file.ReadUInt32()) << '\n'; for (uint32_t iN = 0; iN < numName; iN++) { cout << "\t\t\tLifeTime : " << CTimeT(file.ReadUInt32()) << '\n'; if (version >= 3) { uint32_t count; cout << "\t\t\tnameCount: " << (count = file.ReadUInt32()) << '\n'; for (uint32_t i = 0; i < count; i++) { wxString name = file.ReadString(true, 2); cout << "\t\t\t\t{ " << MakePrintableString(name); cout << ", " << file.ReadUInt32() << " }\n"; wxString keyword; if (!identified && IdentifyKeyword(keyID, name, keyword)) { cout << "\tKeyword: " << MakePrintableString(keyword) << '\n'; identified = true; } } cout << "\t\t\tipCount : " << (count = file.ReadUInt32()) << '\n'; for (uint32_t i = 0; i < count; i++) { cout << "\t\t\t\t{ " << CKadIP(file.ReadUInt32()); cout << ", " << CTimeT(file.ReadUInt32()) << " }\n"; } } cout << "\t\t\ttagCount : " << (uint32)(tagCount = file.ReadUInt8()) << '\n'; for (uint32_t it = 0; it < tagCount; it++) { CTag *tag = file.ReadTag(); cout << "\t\t\t\t" << *tag << '\n'; delete tag; } } } } } void DecodeSourceIndexDat(const CFileDataIO& file) { uint32_t numKeys; uint32_t numSource; uint32_t numName; uint8_t tagCount; cout << "Version : " << file.ReadUInt32(); cout << "\nSaveTime: " << CTimeT(file.ReadUInt32()); cout << "\nnumKeys : " << (numKeys = file.ReadUInt32()) << '\n'; for (uint32_t ik = 0; ik < numKeys; ik++) { cout << "\tKeyID : " << file.ReadUInt128(); cout << "\n\tnumSource: " << (numSource = file.ReadUInt32()) << '\n'; for (uint32_t is = 0; is < numSource; is++) { cout << "\t\tSourceID: " << file.ReadUInt128(); cout << "\n\t\tnumName : " << (numName = file.ReadUInt32()) << '\n'; for (uint32_t iN = 0; iN < numName; iN++) { cout << "\t\t\tLifeTime: " << CTimeT(file.ReadUInt32()); cout << "\n\t\t\ttagCount: " << (tagCount = file.ReadUInt8()) << '\n'; for (uint32_t it = 0; it < tagCount; it++) { CTag *tag = file.ReadTag(); cout << "\t\t\t\t" << *tag << '\n'; delete tag; } } } } } void DecodeNodesDat(const CFileDataIO& file) { uint32_t numContacts = file.ReadUInt32(); uint32_t fileVersion = 0; cout << "NumContacts #1 : " << numContacts << '\n'; if (numContacts == 0) { cout << "FileVersion : " << (fileVersion = file.ReadUInt32()) << '\n'; if (fileVersion == 3) { cout << "BootstrapEdition: " << file.ReadUInt32() << '\n'; } if (fileVersion >= 1 && fileVersion <= 3) { cout << "NumContacts #2 : " << (numContacts = file.ReadUInt32()) << '\n'; } } for (uint32_t i = 0; i < numContacts; i++) { cout << wxString::Format(wxT("#%u\tID : "), i) << file.ReadUInt128(); cout << "\n\tIP : " << CKadIP(file.ReadUInt32()); cout << "\n\tUDP Port : " << file.ReadUInt16(); cout << "\n\tTCP Port : " << file.ReadUInt16(); if (fileVersion >= 1) { cout << "\n\tVersion : "; } else { cout << "\n\tType : "; } cout << (unsigned)file.ReadUInt8(); if (fileVersion >= 2) { cout << "\n\tUDP Key : { " << hex(file.ReadUInt32()); cout << ", " << CKadIP(file.ReadUInt32()); cout << " }\n\tVerified : " << (file.ReadUInt8() != 0 ? "true" : "false"); } cout << '\n'; } } aMule-2.3.1/src/utils/fileview/Print.h0000644000175000017470000000773511575347521016520 0ustar topiusers// -*- C++ -*- // This file is part of the aMule Project. // // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org ) // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef FILEVIEW_PRINT_H #define FILEVIEW_PRINT_H #include #include #include "../../kademlia/utils/UInt128.h" #include "../../MD4Hash.h" #include "../../Tag.h" #include #include #include #if defined __GNUC__ && defined __GNUC_MINOR__ # if __GNUC__ > 3 || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 2)) # define __attribute_always_inline__ __attribute__((__always_inline__)) # else # define __attrbiute_always_inline__ # endif #else # define __attribute_always_inline__ #endif using std::cout; using std::cerr; using std::endl; enum SDMODE { SD_DISPLAY, SD_SAFE, SD_UTF8, SD_NONE }; extern SDMODE g_stringDecodeMode; inline void SetStringsMode(SDMODE mode) { g_stringDecodeMode = mode; } inline SDMODE GetStringsMode() { return g_stringDecodeMode; } wxString MakePrintableString(const wxString& str); #if !wxCHECK_VERSION(2, 9, 0) inline __attribute_always_inline__ std::ostream& operator<<(std::ostream& x, const wxString& y) { return x << (const char *)unicode2char(y); } #endif inline std::ostream& operator<<(std::ostream& x, const Kademlia::CUInt128& y) { return x << y.ToHexString(); } inline std::ostream& operator<<(std::ostream& x, const CMD4Hash& y) { return x << y.Encode(); } inline wxString hex(uint8_t value) { return wxString::Format(wxT("0x%02x"), value); } inline wxString hex(uint16_t value) { return wxString::Format(wxT("0x%04x"), value); } inline wxString hex(uint32_t value) { return wxString::Format(wxT("0x%08x"), value); } inline void PrintByteArray(const void *buf, unsigned int size) { // #if wxCHECK_VERSION(2, 8, 4) // cout << MakePrintableString(wxString::From8BitData(static_cast(buf), size)); // #else for (unsigned int i = 0; i < size; i++) { cout << wxString::Format(wxT("%02X "), static_cast(buf)[i]); } // #endif } class CTimeT { public: explicit CTimeT(time_t t) { m_time = t; } operator time_t() const { return m_time; } private: time_t m_time; }; class CKadIP { public: explicit CKadIP(uint32_t ip) { m_ip = ip; } operator uint32_t() const { return m_ip; } private: uint32_t m_ip; }; class CeD2kIP { public: explicit CeD2kIP(uint32_t ip) { m_ip = ip; } operator uint32_t() const { return m_ip; } private: uint32_t m_ip; }; class CServerTag : public CTag { public: CServerTag(const CTag& tag) : CTag(tag) {} }; class CFriendTag : public CTag { public: CFriendTag(const CTag& tag) : CTag(tag) {} }; std::ostream& operator<<(std::ostream& x, const CTimeT& y); std::ostream& operator<<(std::ostream& x, const CKadIP& ip); std::ostream& operator<<(std::ostream& x, const CeD2kIP& ip); std::ostream& operator<<(std::ostream& x, const CTag& tag); std::ostream& operator<<(std::ostream& x, const CServerTag& tag); std::ostream& operator<<(std::ostream& x, const CFriendTag& tag); #endif /* FILEVIEW_PRINT_H */ aMule-2.3.1/src/utils/plasmamule/0000755000175000017470000000000011657306263015564 5ustar topiusersaMule-2.3.1/src/utils/plasmamule/plasmamule-engine-feeder.cpp0000644000175000017470000000356711575347521023137 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "plasmamule-dbus.h" #include #include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); Plasma::Applet* aMuleEngine = new Plasma::Applet; Plasma::DataEngine::Data data = aMuleEngine->dataEngine("plasmamule")->query(QString("cat_names")); QStringList cat_names = data["cat_names"].toStringList(); QMenu *menu = new QMenu; for (QStringList::const_iterator constIterator = cat_names.constBegin(); constIterator != cat_names.constEnd(); constIterator++) { menu->addAction(*constIterator); if (constIterator != cat_names.constEnd()) { menu->addSeparator(); } } QAction *cat_selection = menu->exec(QCursor::pos()); if (cat_selection) { for (int i = 1; i < argc; i++) { sendLinkToEngine (argv[i], cat_names.indexOf(cat_selection->text()), 0, 0); } } QCoreApplication::exit(0); } aMule-2.3.1/src/utils/plasmamule/plasma-applet-plasmamule.desktop0000644000175000017470000000116411644077302024052 0ustar topiusers[Desktop Entry] Name=aMule Plasma Applet Comment=Prints Information about aMule Comment[fr]=Affiche des informations sur aMule Comment[tr]=aMule hakkında bilgi görüntüler Type=Service ServiceTypes=Plasma/Applet Icon=application-x-emulecollection X-KDE-Library=plasma-applet-plasmamule X-KDE-PluginInfo-Author=Werner Mahr (Vollstrecker) X-KDE-PluginInfo-Email=amule@vollstreckernet.de X-KDE-PluginInfo-Name=plasmamule X-KDE-PluginInfo-Version=0.5 X-KDE-PluginInfo-Website=http://www.amule.org/ X-KDE-PluginInfo-Category=Utilities X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true aMule-2.3.1/src/utils/plasmamule/qt-emc.h0000644000175000017470000000317311575347521017130 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef QTEMC_H #define QTEMC_H #include #include class qtEmc { public: enum emcError { BadFileFormat, BadTagFormat, UnknownTag, UnknownTagType, WrongTagCount, CorruptFile }; private: bool valid; int errorCode; QString author, authorKey, name; QStringList list; quint8 lastTag, lastTagType; quint16 tagFormat; quint32 emcVersion, fileCount, headerTagCount; public: qtEmc(const QString &filename); const int getError(); const QString getErrorMessage(); const QStringList getLinks(); const bool isValid(); private: bool readBinary(QFile &collection); bool readText(QFile &collection); }; #endif // QT_EMC_H aMule-2.3.1/src/utils/plasmamule/application-x-emulecollection.svg0000644000175000017470000013607311575347521024251 0ustar topiusers aMule-2.3.1/src/utils/plasmamule/plasmamule-dbus.cpp0000644000175000017470000000265211575347521021371 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "plasmamule-dbus.h" #include #include #include void sendLinkToEngine (QString link, int cat, QObject* obj, int debugChannel) { QDBusConnection bus = QDBusConnection::sessionBus(); QDBusInterface *interface = new QDBusInterface("org.amule.engine", "/Link", "org.amule.engine", bus, obj); interface->call("engine_add_link", link, cat); kDebug(debugChannel) << "Sent Link " << link << "with cat " << cat; } aMule-2.3.1/src/utils/plasmamule/magnet.protocol0000644000175000017470000000013711575347521020624 0ustar topiusers[Protocol] exec=plasmamule-engine-feeder %U protocol=magnet input=none output=none helper=true aMule-2.3.1/src/utils/plasmamule/Makefile.am0000644000175000017470000000341711657246511017624 0ustar topiusersif PLASMAMULE modulesdir = ${KDE_MODULE_PATH} modules_PROGRAMS = plasma-engine-plasmamule.so plasma-applet-plasmamule.so EXTRA_DIST = plasma-engine-plasmamule.dektop plasma-applet-plasmamule.desktop application-x-emulecollection.svg ed2k.protocol magnet.protocol plasmamule-engine-feeder.desktop BUILT_SOURCES = plasma-engine-plasmamule.moc plasma-applet-plasmamule.moc servicedir = ${KDE_SERVICE_PATH} dist_service_DATA = plasma-engine-plasmamule.desktop plasma-applet-plasmamule.desktop ed2k.protocol magnet.protocol icondir = ${KDE_ICON_PATH} dist_icon_DATA = application-x-emulecollection.svg mimedir = ${KDE_MIME_PATH} dist_mime_DATA = amule.xml appsdir = ${KDE_APPLNK_PATH} dist_apps_DATA = plasmamule-engine-feeder.desktop bin_PROGRAMS = plasmamule-engine-feeder endif plasma_engine_plasmamule_so_SOURCES = plasma-engine-plasmamule.cpp qt-emc.cpp plasma_applet_plasmamule_so_SOURCES = plasma-applet-plasmamule.cpp plasmamule-dbus.cpp plasmamule_engine_feeder_SOURCES = plasmamule-engine-feeder.cpp plasmamule-dbus.cpp nodist_plasma_engine_plasmamule_so_SOURCES = plasma-engine-plasmamule.moc nodist_plasma_applet_plasmamule_so_SOURCES = plasma-applet-plasmamule.moc plasma_engine_plasmamule_so_CXXFLAGS = -shared -I${KDE_HEADER_DIR} ${QT_CORE_CXXFLAGS} -DPIC -fPIC ${DEBUGFLAG} plasma_applet_plasmamule_so_CXXFLAGS = -shared -D__IMG_PATH__=\"${KDE_ICON_PATH}\" -I${KDE_HEADER_DIR} ${QT_GUI_CXXFLAGS} -DPIC -fPIC ${DEBUGFLAG} plasmamule_engine_feeder_CXXFLAGS = -I${KDE_HEADER_DIR} ${QT_GUI_CXXFLAGS} ${DEBUGFLAG} plasmamule_engine_feeder_LDFLAGS = ${QT_GUI_LIBS} -lkdecore -lplasma ${QT_DBUS_LDFLAGS} noinst_HEADERS = plasma-engine-plasmamule.h plasma-applet-plasmamule.h plasmamule-dbus.h qt-emc.h %.moc : %.h ${QT_MOC} -o $@ $< CLEANFILES = *.moc MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/plasmamule/plasma-engine-plasmamule.cpp0000644000175000017470000002426011575347521023153 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "plasma-engine-plasmamule.h" #include "qt-emc.h" #include #include #include #include #include #include #include PlasmaMuleEngine::PlasmaMuleEngine (QObject* parent, const QVariantList& args) : Plasma::DataEngine (parent, args) { Q_UNUSED (args) setMinimumPollingInterval (0); } bool PlasmaMuleEngine::sourceRequestEvent (const QString &name) { return updateSourceEvent (name); } QStringList PlasmaMuleEngine::sources() const { return QStringList() << "cat_dirs" << "cat_names" << "clients_in_up_queue" << "config_found" << "down_speed" << "ed2k_state" << "ed2k_server_name" << "ed2k_server_ip" << "ed2k_server_port" << "ed2k_id_high_low" << "kad_status" << "nickname" << "os_active" << "session_bytes_downloaded" << "session_bytes_uploaded" << "shared_files_count" << "total_bytes_downloaded" << "total_bytes_uploaded" << "up_speed" << "uptime" << "version"; } void PlasmaMuleEngine::init () { Home = QDir::homePath(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); timer->start(60000); m_timer = TRUE; setData(I18N_NOOP("uptime"), 0); if (!Home.endsWith("/")) { Home += "/"; } m_debugChannel = KDebug::registerArea ("plasmamule-engine", #ifdef __DEBUG__ true #else false #endif ); regDbus(); initVals(); } void PlasmaMuleEngine::regDbus () { new EngineAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/Link", this); kDebug(m_debugChannel) << "Registerred dbus: " << dbus.registerService("org.amule.engine"); } void PlasmaMuleEngine::downloadFinished (KIO::Job* job,const QByteArray& data) { if (data.length() == 0) { KNotification::event(KNotification::Notification, QString("Download of %1 failed.").arg(job->queryMetaData("Name"))); return; } kDebug(m_debugChannel) << QString("Finished download of %1").arg(job->queryMetaData("Name")); QString downloadFileName(QString("/tmp/plasmamule-download-%1.emulecollection").arg(qrand())); QFile downloadFile(downloadFileName); if (!downloadFile.open (QIODevice::WriteOnly | QIODevice::Append)) { KNotification::event(KNotification::Notification, QString("%1 can't be written to temp-file.").arg(job->queryMetaData("Name"))); return; } QDataStream out(&downloadFile); out.writeRawData(data, data.length()); downloadFile.close(); engine_add_link (downloadFileName, job->queryMetaData("Category").toInt(), job->queryMetaData("Name")); downloadFile.remove(); } void PlasmaMuleEngine::engine_add_link (const QString &link, const int &category, const QString &printname) { kDebug(m_debugChannel) << "Received Link " << link << " with cat " << category; QString link_to_write; if (link.startsWith("ed2k:") || link.startsWith("magnet:")) { link_to_write = link; if (category > 0) { link_to_write.append(QString(":%1").arg(category)); } link_to_write.append("\n"); } else if (link.contains(".emulecollection") && KUrl(link).isLocalFile()) { qtEmc* collection = new qtEmc(link); if (collection->isValid()) { QStringList links = collection->getLinks(); for (QStringList::const_iterator constIterator = links.constBegin(); constIterator != links.constEnd(); constIterator++) { link_to_write.append(*constIterator); if (category > 0) { link_to_write.append(QString(":%1").arg(category)); } link_to_write.append("\n"); } } else { KNotification::event(KNotification::Notification, collection->getErrorMessage()); } delete collection; } else { KIO::TransferJob *job = KIO::get(KUrl(link)); job->addMetaData("Name", link); job->addMetaData("Category", QString(category)); connect (job, SIGNAL(data(KIO::Job *, const QByteArray&)), this, SLOT(downloadFinished(KIO::Job *,const QByteArray&))); kDebug(m_debugChannel) << QString("Starting download of %1").arg(printname); return; } QFile link_file (Home + ".aMule/ED2KLinks"); if (!link_file.open (QIODevice::WriteOnly | QIODevice::Append)) { KNotification::event(KNotification::Notification, QString("Problem opening %1 for writing").arg(link_file.fileName())); return; } QTextStream out (&link_file); out << link_to_write; out.flush(); link_file.close(); KNotification::event(KNotification::Notification, QString("Downloading %1").arg(printname)); } void PlasmaMuleEngine::initVals () { QStringList catDir; QStringList catName; QStringList tempIncomingDirs; QStringList cleanedIncomingDirs; QStringList::const_iterator constIterator; QFile config_file (Home + ".aMule/amule.conf"); catName.append("Default"); if (!config_file.open (QIODevice::ReadOnly | QIODevice::Text)) { setData(I18N_NOOP ("config_found"), FALSE); return; } QTextStream in (&config_file); while (!in.atEnd()) { QString line = in.readLine(); if (line.startsWith ("OnlineSignature=")) { if (line.remove (0,line.indexOf ("=")+1) == "1") { m_OSActive = TRUE; } else { m_OSActive = FALSE; } setData(I18N_NOOP ("os_active"), m_OSActive); } else if (line.contains ("OSDirectory")) { m_OSFile.setFileName(line.remove (0,line.indexOf ("=")+1) + "amulesig.dat"); } else if (line.contains ("Incoming")) { if (!tempIncomingDirs.contains(line.remove (0,line.indexOf ("=")+1))) { tempIncomingDirs.append(line.remove (0,line.indexOf ("=")+1)); } catDir.append(line.remove (0,line.indexOf ("=")+1)); } else if (line.startsWith ("Title")) { catName.append(line.remove (0,line.indexOf ("=")+1)); } } setData(I18N_NOOP ("cat_names"), catName); setData(I18N_NOOP ("cat_dirs"), catDir); if (m_OSActive && !m_dirwatcher.contains(m_OSFile.fileName())) { kDebug(m_debugChannel) << "Registering: " << m_OSFile.fileName() << " for monitoring"; m_dirwatcher.addFile (m_OSFile.fileName()); connect (&m_dirwatcher, SIGNAL (dirty (const QString &)), SLOT (file_changed (const QString&))); connect (&m_dirwatcher, SIGNAL (created (const QString &)), SLOT (new_file (const QString&))); } for (constIterator = tempIncomingDirs.constBegin(); constIterator != tempIncomingDirs.constEnd(); constIterator++) { if (!m_dirwatcher.contains(*constIterator)) { kDebug(m_debugChannel) << "Registering: " << *constIterator << " for monitoring"; cleanedIncomingDirs.append (*constIterator); m_dirwatcher.addDir (*constIterator, KDirWatch::WatchFiles); } else { cleanedIncomingDirs.append (*constIterator); } } for (constIterator = m_incoming_dirs.constBegin(); constIterator != m_incoming_dirs.constEnd(); constIterator++) { if (!cleanedIncomingDirs.contains (*constIterator)) { kDebug(m_debugChannel) << "Removing " << *constIterator << " from monitored dirs"; m_dirwatcher.removeDir (*constIterator); } } m_incoming_dirs = cleanedIncomingDirs; config_file.close (); setName("plasmamule"); setData(I18N_NOOP ("config_found"), TRUE); scheduleSourcesUpdated(); } void PlasmaMuleEngine::file_changed (const QString &path) { if (path == m_OSFile.fileName()) { kDebug(m_debugChannel) << "Rereading " << path; updateSourceEvent ("dummy"); } } void PlasmaMuleEngine::new_file (const QString &path) { if (path != m_OSFile.fileName()) { kDebug(m_debugChannel) << "File " << path << "was created"; KNotification::event(KNotification::Notification, QString("Finished Download of %1").arg(path)); } else { kDebug(m_debugChannel) << "Rereading " << path; updateSourceEvent ("dummy"); } } void PlasmaMuleEngine::timeout() { initVals(); } bool PlasmaMuleEngine::updateSourceEvent(const QString &name) { Q_UNUSED (name) if (m_OSFile.open (QIODevice::ReadOnly | QIODevice::Text) && m_OSActive) { QTextStream in (&m_OSFile); setData(I18N_NOOP("ed2k_state"), in.readLine().toInt()); setData(I18N_NOOP("ed2k_server_name"), in.readLine()); setData(I18N_NOOP("ed2k_server_ip"), in.readLine()); setData(I18N_NOOP("ed2k_server_port"), in.readLine().toInt()); setData(I18N_NOOP("ed2k_id_high_low"), in.readLine()); setData(I18N_NOOP("kad_status"), in.readLine().toInt()); setData(I18N_NOOP("down_speed"), in.readLine().toDouble()); setData(I18N_NOOP("up_speed"), in.readLine().toDouble()); setData(I18N_NOOP("clients_in_up_queue"), in.readLine().toInt()); setData(I18N_NOOP("shared_files_count"), in.readLine().toInt()); setData(I18N_NOOP("nickname"), in.readLine()); setData(I18N_NOOP("total_bytes_downloaded"), in.readLine().toLongLong()); setData(I18N_NOOP("total_bytes_uploaded"), in.readLine().toLongLong()); setData(I18N_NOOP("version"), in.readLine()); setData(I18N_NOOP("session_bytes_downloaded"), in.readLine().toLongLong()); setData(I18N_NOOP("session_bytes_uploaded"), in.readLine().toLongLong()); setData(I18N_NOOP("uptime"), in.readLine().toInt()); m_OSFile.close(); scheduleSourcesUpdated(); return true; } else { return false; } } K_EXPORT_PLASMA_DATAENGINE(plasmamule, PlasmaMuleEngine) EngineAdaptor::EngineAdaptor(QObject *parent): QDBusAbstractAdaptor(parent) { setAutoRelaySignals(true); } EngineAdaptor::~EngineAdaptor() { } void EngineAdaptor::engine_add_link(const QString &link, const int &category) { QMetaObject::invokeMethod(parent(), "engine_add_link", Q_ARG(QString, link), Q_ARG(int, category), Q_ARG(QString, link)); } #include "plasma-engine-plasmamule.moc" aMule-2.3.1/src/utils/plasmamule/plasma-engine-plasmamule.h0000644000175000017470000000503511575347521022617 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef PLASMAMULENGINE_H #define PLASMAMULENGINE_H #include #include #include #include #include #include class PlasmaMuleEngine : public Plasma::DataEngine { Q_OBJECT public: PlasmaMuleEngine(QObject* parent, const QVariantList& args); QStringList sources() const; void init (); public Q_SLOTS: Q_SCRIPTABLE void engine_add_link (const QString &link, const int &category, const QString &printname); protected: bool sourceRequestEvent(const QString& name); bool updateSourceEvent(const QString& name); protected Q_SLOTS: void downloadFinished (KIO::Job *,const QByteArray&); void file_changed (const QString &path); void new_file (const QString &path); void timeout (); private: void initVals (); void regDbus (); bool m_OSActive, m_timer; int m_debugChannel; KDirWatch m_dirwatcher; QFile m_OSFile; QStringList m_incoming_dirs, downloadsNames; QString Home; }; class EngineAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.amule.engine") Q_CLASSINFO("D-Bus Introspection", "" " \n" " \n" " \n" " \n" " \n" " \n" "") public: EngineAdaptor(QObject *parent); virtual ~EngineAdaptor(); public Q_SLOTS: void engine_add_link(const QString &link, const int &category); }; #endif // PLASMAMULENGINE_H aMule-2.3.1/src/utils/plasmamule/qt-emc.cpp0000644000175000017470000002332611575347521017465 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "qt-emc.h" qtEmc::qtEmc(const QString &filename) { QStringList files = filename.split("file://"); for (QStringList::const_iterator constFilesIterator = files.constBegin(); constFilesIterator != files.constEnd(); constFilesIterator++) { if (!QString(*constFilesIterator).remove("\n").trimmed().isEmpty()) { QFile collection(QString(*constFilesIterator).trimmed()); if (collection.open (QIODevice::ReadOnly)) { valid = readBinary(collection); } else { valid = FALSE; errorCode = BadFileFormat; } collection.close(); } } } const int qtEmc::getError() { return errorCode; } const QString qtEmc::getErrorMessage() { switch (errorCode) { case BadFileFormat: { return QString("File format wasn't recognised"); } case BadTagFormat: { return QString("Tag format -%1- not recognized.").arg(lastTag); } case UnknownTag: { return QString("An unknown Tag (%1 in type %2) was read from collection file").arg(lastTag).arg(lastTagType); } case UnknownTagType: { return QString("An unknown type of tag (%1) was read from file").arg(lastTagType); } case WrongTagCount: { return QString("Tag count claims to be %1").arg(lastTag); } case CorruptFile: { return QString("Your collection file was corrupted and ends to Early"); } } } const QStringList qtEmc::getLinks() { return list; } const bool qtEmc::isValid() { return valid; } bool qtEmc::readBinary(QFile &collection) { int fileSize; QString fileHash, fileName; quint8 rating, sFileSize, tag, tagType; quint16 length, mFileSize; quint32 lFileSize, llength, tagCount; quint64 xlFileSize; QDataStream in(&collection); in.setByteOrder(QDataStream::LittleEndian); in >> emcVersion >> headerTagCount; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } else if (emcVersion > 0x02) { return readText(collection); } for (int i=1; i<=headerTagCount; i++) { in >> tagType >> tagFormat; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } if (tagFormat != 1) { lastTag = tag; errorCode = BadTagFormat; return FALSE; } in >> tag; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } switch (tag) { case 0x01: //FT_FILENAME { in >> length; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } char* buffer = new char[length]; in.readRawData(buffer, length); name = QString(buffer); delete [] buffer; break; } case 0x31: //FT_COLLECTIONAUTHOR { in >> length; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } char* buffer = new char[length]; in.readRawData(buffer, length); author = QString(buffer); delete [] buffer; break; } case 0x32: //FT_COLLECTIONAUTHORKEY { in >> llength; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } char* buffer = new char[llength]; in.readRawData(buffer, llength); authorKey = QString(buffer); delete [] buffer; break; } default: { lastTag = tag; errorCode = UnknownTag; return FALSE; } break; } } in >> fileCount; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } for (int i=1; i<=fileCount; i++) { fileHash.clear(); fileName.clear(); in >> tagCount; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } if (tagCount > 5) { lastTag = tagCount; errorCode = WrongTagCount; return FALSE; } for (int j=1; j<=tagCount; j++) { in >> tag; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } in >> tagType; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } switch (tagType) { case 0x01: // FT_FILENAME { switch (tag) { case 0x82: { in >> length; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } char* buffer = new char[length]; in.readRawData(buffer, length); fileName = QString().fromLocal8Bit(buffer, length).trimmed(); if (fileName.length() > length) { fileName.chop(fileName.length() - length); } else if (fileName.length() == length) { int pos=0; for (int k=0; k= 0x11) && ((tag^0x80) <= 0x20)) { length = (tag^0x80) - 0x10; char* buffer = new char[length]; in.readRawData(buffer, length); fileName = QString().fromLocal8Bit(buffer, length).trimmed(); if (fileName.length() > length) { fileName.chop(fileName.length() - length); } else if (fileName.length() == length) { int pos=0; for (int k=0; k> lFileSize; fileSize = lFileSize; if (in.atEnd() && (j != tagCount) && (i =! fileCount)) { errorCode = CorruptFile; return FALSE; } break; } case 0x88: { in >> mFileSize; fileSize = mFileSize; if (in.atEnd() && (j != tagCount) && (i =! fileCount)) { errorCode = CorruptFile; return FALSE; } break; } case 0x89: { in >> sFileSize; fileSize = sFileSize; if (in.atEnd() && (j != tagCount) && (i =! fileCount)) { errorCode = CorruptFile; return FALSE; } break; } case 0x8b: { in >> xlFileSize; fileSize = xlFileSize; if (in.atEnd() && (j != tagCount) && (i =! fileCount)) { errorCode = CorruptFile; return FALSE; } break; } default: { lastTag = tag; lastTagType = tagType; errorCode = UnknownTag; return FALSE; } } break; } case 0x28: //FT_FILEHASH { switch (tag) { case 0x81: //FT_FILEHASH { char* buffer = new char[16]; in.readRawData(buffer, 16); if (in.atEnd() && (j != tagCount) && (i =! fileCount)) { errorCode = CorruptFile; return FALSE; } for (int pos = 0; pos < 16; pos++) { fileHash.append(QString().setNum(((buffer[pos] >> 4) & 0xF), 16)); fileHash.append(QString().setNum((buffer[pos] & 0x0F), 16)); } delete [] buffer; break; } default: { lastTag = tag; lastTagType = tagType; errorCode = UnknownTag; return FALSE; } } break; } // The comment is read correctly. It will be stored when I know what to do with it. case 0xf6: //FT_FILECOMMENT { if ((tag^0x80) == 0x02) { in >> length; if (in.atEnd()) { errorCode = CorruptFile; return FALSE; } } else { length = ((tag^0x80)-0x10); } char* buffer = new char[length]; in.readRawData(buffer, length); delete [] buffer; break; } // The file-rating is read correctly. It will be stored when I know what to do with it. case 0xf7: //FT_FILERATING { in >> rating; break; } default: { lastTagType = tagType; errorCode = UnknownTagType; return FALSE; } } } list.append(QString("ed2k://|file|%1|%2|%3|/").arg(fileName).arg(fileSize).arg(fileHash)); } return TRUE; } bool qtEmc::readText(QFile &collection) { quint8 character; QString tmp; collection.seek(0); QDataStream in(&collection); in.setByteOrder(QDataStream::LittleEndian); for (int i=0; i<=6; i++) { in >> character; tmp.append(character); } if (tmp == "ed2k://") { while (!in.atEnd()) { in >> character; if (character == 0x0d) { list.append(tmp); tmp.clear(); } else if (character != 0x0a) { tmp.append(character); } } } else { errorCode = BadFileFormat; return FALSE; } return TRUE; } aMule-2.3.1/src/utils/plasmamule/ed2k.protocol0000644000175000017470000000013511575347521020174 0ustar topiusers[Protocol] exec=plasmamule-engine-feeder %U protocol=ed2k input=none output=none helper=true aMule-2.3.1/src/utils/plasmamule/amule.xml0000644000175000017470000000047011575347521017413 0ustar topiusers Collection of eD2k-links eD2k Link Sammlung aMule-2.3.1/src/utils/plasmamule/plasma-engine-plasmamule.desktop0000644000175000017470000000117111644077302024030 0ustar topiusers[Desktop Entry] Name=aMule Plasma Engine Comment=Gathers Information about aMule Comment[fr]=Rassemble des informations sur aMule Comment[tr]=aMule hakkında bilgi toplar Type=Service X-KDE-ServiceTypes=Plasma/DataEngine X-KDE-Library=plasma-engine-plasmamule X-Plasma-EngineName=plasmamule X-KDE-PluginInfo-Author=Werner Mahr (Vollstrecker) X-KDE-PluginInfo-Email=amule@vollstreckernet.de X-KDE-PluginInfo-Name=plasmamule X-KDE-PluginInfo-Version=0.5 X-KDE-PluginInfo-Website=http://www.amule.org/ X-KDE-PluginInfo-Category=Applications X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true aMule-2.3.1/src/utils/plasmamule/Makefile.in0000644000175000017470000013442211657306263017637 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @PLASMAMULE_TRUE@modules_PROGRAMS = \ @PLASMAMULE_TRUE@ plasma-engine-plasmamule.so$(EXEEXT) \ @PLASMAMULE_TRUE@ plasma-applet-plasmamule.so$(EXEEXT) @PLASMAMULE_TRUE@bin_PROGRAMS = plasmamule-engine-feeder$(EXEEXT) subdir = src/utils/plasmamule DIST_COMMON = $(am__dist_apps_DATA_DIST) $(am__dist_icon_DATA_DIST) \ $(am__dist_mime_DATA_DIST) $(am__dist_service_DATA_DIST) \ $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(modulesdir)" \ "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(icondir)" \ "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(servicedir)" PROGRAMS = $(bin_PROGRAMS) $(modules_PROGRAMS) am_plasma_applet_plasmamule_so_OBJECTS = plasma_applet_plasmamule_so-plasma-applet-plasmamule.$(OBJEXT) \ plasma_applet_plasmamule_so-plasmamule-dbus.$(OBJEXT) nodist_plasma_applet_plasmamule_so_OBJECTS = plasma_applet_plasmamule_so_OBJECTS = \ $(am_plasma_applet_plasmamule_so_OBJECTS) \ $(nodist_plasma_applet_plasmamule_so_OBJECTS) plasma_applet_plasmamule_so_LDADD = $(LDADD) plasma_applet_plasmamule_so_LINK = $(CXXLD) \ $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_plasma_engine_plasmamule_so_OBJECTS = plasma_engine_plasmamule_so-plasma-engine-plasmamule.$(OBJEXT) \ plasma_engine_plasmamule_so-qt-emc.$(OBJEXT) nodist_plasma_engine_plasmamule_so_OBJECTS = plasma_engine_plasmamule_so_OBJECTS = \ $(am_plasma_engine_plasmamule_so_OBJECTS) \ $(nodist_plasma_engine_plasmamule_so_OBJECTS) plasma_engine_plasmamule_so_LDADD = $(LDADD) plasma_engine_plasmamule_so_LINK = $(CXXLD) \ $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_plasmamule_engine_feeder_OBJECTS = \ plasmamule_engine_feeder-plasmamule-engine-feeder.$(OBJEXT) \ plasmamule_engine_feeder-plasmamule-dbus.$(OBJEXT) plasmamule_engine_feeder_OBJECTS = \ $(am_plasmamule_engine_feeder_OBJECTS) plasmamule_engine_feeder_LDADD = $(LDADD) plasmamule_engine_feeder_LINK = $(CXXLD) \ $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) \ $(plasmamule_engine_feeder_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(plasma_applet_plasmamule_so_SOURCES) \ $(nodist_plasma_applet_plasmamule_so_SOURCES) \ $(plasma_engine_plasmamule_so_SOURCES) \ $(nodist_plasma_engine_plasmamule_so_SOURCES) \ $(plasmamule_engine_feeder_SOURCES) DIST_SOURCES = $(plasma_applet_plasmamule_so_SOURCES) \ $(plasma_engine_plasmamule_so_SOURCES) \ $(plasmamule_engine_feeder_SOURCES) am__dist_apps_DATA_DIST = plasmamule-engine-feeder.desktop 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__dist_icon_DATA_DIST = application-x-emulecollection.svg am__dist_mime_DATA_DIST = amule.xml am__dist_service_DATA_DIST = plasma-engine-plasmamule.desktop \ plasma-applet-plasmamule.desktop ed2k.protocol magnet.protocol DATA = $(dist_apps_DATA) $(dist_icon_DATA) $(dist_mime_DATA) \ $(dist_service_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @PLASMAMULE_TRUE@modulesdir = ${KDE_MODULE_PATH} @PLASMAMULE_TRUE@EXTRA_DIST = plasma-engine-plasmamule.dektop plasma-applet-plasmamule.desktop application-x-emulecollection.svg ed2k.protocol magnet.protocol plasmamule-engine-feeder.desktop @PLASMAMULE_TRUE@BUILT_SOURCES = plasma-engine-plasmamule.moc plasma-applet-plasmamule.moc @PLASMAMULE_TRUE@servicedir = ${KDE_SERVICE_PATH} @PLASMAMULE_TRUE@dist_service_DATA = plasma-engine-plasmamule.desktop plasma-applet-plasmamule.desktop ed2k.protocol magnet.protocol @PLASMAMULE_TRUE@icondir = ${KDE_ICON_PATH} @PLASMAMULE_TRUE@dist_icon_DATA = application-x-emulecollection.svg @PLASMAMULE_TRUE@mimedir = ${KDE_MIME_PATH} @PLASMAMULE_TRUE@dist_mime_DATA = amule.xml @PLASMAMULE_TRUE@appsdir = ${KDE_APPLNK_PATH} @PLASMAMULE_TRUE@dist_apps_DATA = plasmamule-engine-feeder.desktop plasma_engine_plasmamule_so_SOURCES = plasma-engine-plasmamule.cpp qt-emc.cpp plasma_applet_plasmamule_so_SOURCES = plasma-applet-plasmamule.cpp plasmamule-dbus.cpp plasmamule_engine_feeder_SOURCES = plasmamule-engine-feeder.cpp plasmamule-dbus.cpp nodist_plasma_engine_plasmamule_so_SOURCES = plasma-engine-plasmamule.moc nodist_plasma_applet_plasmamule_so_SOURCES = plasma-applet-plasmamule.moc plasma_engine_plasmamule_so_CXXFLAGS = -shared -I${KDE_HEADER_DIR} ${QT_CORE_CXXFLAGS} -DPIC -fPIC ${DEBUGFLAG} plasma_applet_plasmamule_so_CXXFLAGS = -shared -D__IMG_PATH__=\"${KDE_ICON_PATH}\" -I${KDE_HEADER_DIR} ${QT_GUI_CXXFLAGS} -DPIC -fPIC ${DEBUGFLAG} plasmamule_engine_feeder_CXXFLAGS = -I${KDE_HEADER_DIR} ${QT_GUI_CXXFLAGS} ${DEBUGFLAG} plasmamule_engine_feeder_LDFLAGS = ${QT_GUI_LIBS} -lkdecore -lplasma ${QT_DBUS_LDFLAGS} noinst_HEADERS = plasma-engine-plasmamule.h plasma-applet-plasmamule.h plasmamule-dbus.h qt-emc.h CLEANFILES = *.moc MAINTAINERCLEANFILES = Makefile.in all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/plasmamule/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/plasmamule/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ 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)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) install-modulesPROGRAMS: $(modules_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(modulesdir)" || $(MKDIR_P) "$(DESTDIR)$(modulesdir)" @list='$(modules_PROGRAMS)'; test -n "$(modulesdir)" || list=; \ 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)$(modulesdir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(modulesdir)$$dir" || exit $$?; \ } \ ; done uninstall-modulesPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(modules_PROGRAMS)'; test -n "$(modulesdir)" || 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)$(modulesdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(modulesdir)" && rm -f $$files clean-modulesPROGRAMS: -test -z "$(modules_PROGRAMS)" || rm -f $(modules_PROGRAMS) plasma-applet-plasmamule.so$(EXEEXT): $(plasma_applet_plasmamule_so_OBJECTS) $(plasma_applet_plasmamule_so_DEPENDENCIES) @rm -f plasma-applet-plasmamule.so$(EXEEXT) $(AM_V_CXXLD)$(plasma_applet_plasmamule_so_LINK) $(plasma_applet_plasmamule_so_OBJECTS) $(plasma_applet_plasmamule_so_LDADD) $(LIBS) plasma-engine-plasmamule.so$(EXEEXT): $(plasma_engine_plasmamule_so_OBJECTS) $(plasma_engine_plasmamule_so_DEPENDENCIES) @rm -f plasma-engine-plasmamule.so$(EXEEXT) $(AM_V_CXXLD)$(plasma_engine_plasmamule_so_LINK) $(plasma_engine_plasmamule_so_OBJECTS) $(plasma_engine_plasmamule_so_LDADD) $(LIBS) plasmamule-engine-feeder$(EXEEXT): $(plasmamule_engine_feeder_OBJECTS) $(plasmamule_engine_feeder_DEPENDENCIES) @rm -f plasmamule-engine-feeder$(EXEEXT) $(AM_V_CXXLD)$(plasmamule_engine_feeder_LINK) $(plasmamule_engine_feeder_OBJECTS) $(plasmamule_engine_feeder_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` plasma_applet_plasmamule_so-plasma-applet-plasmamule.o: plasma-applet-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_applet_plasmamule_so-plasma-applet-plasmamule.o -MD -MP -MF $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Tpo -c -o plasma_applet_plasmamule_so-plasma-applet-plasmamule.o `test -f 'plasma-applet-plasmamule.cpp' || echo '$(srcdir)/'`plasma-applet-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Tpo $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasma-applet-plasmamule.cpp' object='plasma_applet_plasmamule_so-plasma-applet-plasmamule.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_applet_plasmamule_so-plasma-applet-plasmamule.o `test -f 'plasma-applet-plasmamule.cpp' || echo '$(srcdir)/'`plasma-applet-plasmamule.cpp plasma_applet_plasmamule_so-plasma-applet-plasmamule.obj: plasma-applet-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_applet_plasmamule_so-plasma-applet-plasmamule.obj -MD -MP -MF $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Tpo -c -o plasma_applet_plasmamule_so-plasma-applet-plasmamule.obj `if test -f 'plasma-applet-plasmamule.cpp'; then $(CYGPATH_W) 'plasma-applet-plasmamule.cpp'; else $(CYGPATH_W) '$(srcdir)/plasma-applet-plasmamule.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Tpo $(DEPDIR)/plasma_applet_plasmamule_so-plasma-applet-plasmamule.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasma-applet-plasmamule.cpp' object='plasma_applet_plasmamule_so-plasma-applet-plasmamule.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_applet_plasmamule_so-plasma-applet-plasmamule.obj `if test -f 'plasma-applet-plasmamule.cpp'; then $(CYGPATH_W) 'plasma-applet-plasmamule.cpp'; else $(CYGPATH_W) '$(srcdir)/plasma-applet-plasmamule.cpp'; fi` plasma_applet_plasmamule_so-plasmamule-dbus.o: plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_applet_plasmamule_so-plasmamule-dbus.o -MD -MP -MF $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Tpo -c -o plasma_applet_plasmamule_so-plasmamule-dbus.o `test -f 'plasmamule-dbus.cpp' || echo '$(srcdir)/'`plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Tpo $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-dbus.cpp' object='plasma_applet_plasmamule_so-plasmamule-dbus.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_applet_plasmamule_so-plasmamule-dbus.o `test -f 'plasmamule-dbus.cpp' || echo '$(srcdir)/'`plasmamule-dbus.cpp plasma_applet_plasmamule_so-plasmamule-dbus.obj: plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_applet_plasmamule_so-plasmamule-dbus.obj -MD -MP -MF $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Tpo -c -o plasma_applet_plasmamule_so-plasmamule-dbus.obj `if test -f 'plasmamule-dbus.cpp'; then $(CYGPATH_W) 'plasmamule-dbus.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-dbus.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Tpo $(DEPDIR)/plasma_applet_plasmamule_so-plasmamule-dbus.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-dbus.cpp' object='plasma_applet_plasmamule_so-plasmamule-dbus.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_applet_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_applet_plasmamule_so-plasmamule-dbus.obj `if test -f 'plasmamule-dbus.cpp'; then $(CYGPATH_W) 'plasmamule-dbus.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-dbus.cpp'; fi` plasma_engine_plasmamule_so-plasma-engine-plasmamule.o: plasma-engine-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_engine_plasmamule_so-plasma-engine-plasmamule.o -MD -MP -MF $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Tpo -c -o plasma_engine_plasmamule_so-plasma-engine-plasmamule.o `test -f 'plasma-engine-plasmamule.cpp' || echo '$(srcdir)/'`plasma-engine-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Tpo $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasma-engine-plasmamule.cpp' object='plasma_engine_plasmamule_so-plasma-engine-plasmamule.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_engine_plasmamule_so-plasma-engine-plasmamule.o `test -f 'plasma-engine-plasmamule.cpp' || echo '$(srcdir)/'`plasma-engine-plasmamule.cpp plasma_engine_plasmamule_so-plasma-engine-plasmamule.obj: plasma-engine-plasmamule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_engine_plasmamule_so-plasma-engine-plasmamule.obj -MD -MP -MF $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Tpo -c -o plasma_engine_plasmamule_so-plasma-engine-plasmamule.obj `if test -f 'plasma-engine-plasmamule.cpp'; then $(CYGPATH_W) 'plasma-engine-plasmamule.cpp'; else $(CYGPATH_W) '$(srcdir)/plasma-engine-plasmamule.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Tpo $(DEPDIR)/plasma_engine_plasmamule_so-plasma-engine-plasmamule.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasma-engine-plasmamule.cpp' object='plasma_engine_plasmamule_so-plasma-engine-plasmamule.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_engine_plasmamule_so-plasma-engine-plasmamule.obj `if test -f 'plasma-engine-plasmamule.cpp'; then $(CYGPATH_W) 'plasma-engine-plasmamule.cpp'; else $(CYGPATH_W) '$(srcdir)/plasma-engine-plasmamule.cpp'; fi` plasma_engine_plasmamule_so-qt-emc.o: qt-emc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_engine_plasmamule_so-qt-emc.o -MD -MP -MF $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Tpo -c -o plasma_engine_plasmamule_so-qt-emc.o `test -f 'qt-emc.cpp' || echo '$(srcdir)/'`qt-emc.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Tpo $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qt-emc.cpp' object='plasma_engine_plasmamule_so-qt-emc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_engine_plasmamule_so-qt-emc.o `test -f 'qt-emc.cpp' || echo '$(srcdir)/'`qt-emc.cpp plasma_engine_plasmamule_so-qt-emc.obj: qt-emc.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -MT plasma_engine_plasmamule_so-qt-emc.obj -MD -MP -MF $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Tpo -c -o plasma_engine_plasmamule_so-qt-emc.obj `if test -f 'qt-emc.cpp'; then $(CYGPATH_W) 'qt-emc.cpp'; else $(CYGPATH_W) '$(srcdir)/qt-emc.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Tpo $(DEPDIR)/plasma_engine_plasmamule_so-qt-emc.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='qt-emc.cpp' object='plasma_engine_plasmamule_so-qt-emc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasma_engine_plasmamule_so_CXXFLAGS) $(CXXFLAGS) -c -o plasma_engine_plasmamule_so-qt-emc.obj `if test -f 'qt-emc.cpp'; then $(CYGPATH_W) 'qt-emc.cpp'; else $(CYGPATH_W) '$(srcdir)/qt-emc.cpp'; fi` plasmamule_engine_feeder-plasmamule-engine-feeder.o: plasmamule-engine-feeder.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -MT plasmamule_engine_feeder-plasmamule-engine-feeder.o -MD -MP -MF $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Tpo -c -o plasmamule_engine_feeder-plasmamule-engine-feeder.o `test -f 'plasmamule-engine-feeder.cpp' || echo '$(srcdir)/'`plasmamule-engine-feeder.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Tpo $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-engine-feeder.cpp' object='plasmamule_engine_feeder-plasmamule-engine-feeder.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -c -o plasmamule_engine_feeder-plasmamule-engine-feeder.o `test -f 'plasmamule-engine-feeder.cpp' || echo '$(srcdir)/'`plasmamule-engine-feeder.cpp plasmamule_engine_feeder-plasmamule-engine-feeder.obj: plasmamule-engine-feeder.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -MT plasmamule_engine_feeder-plasmamule-engine-feeder.obj -MD -MP -MF $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Tpo -c -o plasmamule_engine_feeder-plasmamule-engine-feeder.obj `if test -f 'plasmamule-engine-feeder.cpp'; then $(CYGPATH_W) 'plasmamule-engine-feeder.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-engine-feeder.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Tpo $(DEPDIR)/plasmamule_engine_feeder-plasmamule-engine-feeder.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-engine-feeder.cpp' object='plasmamule_engine_feeder-plasmamule-engine-feeder.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -c -o plasmamule_engine_feeder-plasmamule-engine-feeder.obj `if test -f 'plasmamule-engine-feeder.cpp'; then $(CYGPATH_W) 'plasmamule-engine-feeder.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-engine-feeder.cpp'; fi` plasmamule_engine_feeder-plasmamule-dbus.o: plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -MT plasmamule_engine_feeder-plasmamule-dbus.o -MD -MP -MF $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Tpo -c -o plasmamule_engine_feeder-plasmamule-dbus.o `test -f 'plasmamule-dbus.cpp' || echo '$(srcdir)/'`plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Tpo $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-dbus.cpp' object='plasmamule_engine_feeder-plasmamule-dbus.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -c -o plasmamule_engine_feeder-plasmamule-dbus.o `test -f 'plasmamule-dbus.cpp' || echo '$(srcdir)/'`plasmamule-dbus.cpp plasmamule_engine_feeder-plasmamule-dbus.obj: plasmamule-dbus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -MT plasmamule_engine_feeder-plasmamule-dbus.obj -MD -MP -MF $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Tpo -c -o plasmamule_engine_feeder-plasmamule-dbus.obj `if test -f 'plasmamule-dbus.cpp'; then $(CYGPATH_W) 'plasmamule-dbus.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-dbus.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Tpo $(DEPDIR)/plasmamule_engine_feeder-plasmamule-dbus.Po @am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='plasmamule-dbus.cpp' object='plasmamule_engine_feeder-plasmamule-dbus.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(plasmamule_engine_feeder_CXXFLAGS) $(CXXFLAGS) -c -o plasmamule_engine_feeder-plasmamule-dbus.obj `if test -f 'plasmamule-dbus.cpp'; then $(CYGPATH_W) 'plasmamule-dbus.cpp'; else $(CYGPATH_W) '$(srcdir)/plasmamule-dbus.cpp'; fi` install-dist_appsDATA: $(dist_apps_DATA) @$(NORMAL_INSTALL) test -z "$(appsdir)" || $(MKDIR_P) "$(DESTDIR)$(appsdir)" @list='$(dist_apps_DATA)'; test -n "$(appsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appsdir)" || exit $$?; \ done uninstall-dist_appsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_apps_DATA)'; test -n "$(appsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(appsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(appsdir)" && rm -f $$files install-dist_iconDATA: $(dist_icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(MKDIR_P) "$(DESTDIR)$(icondir)" @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-dist_iconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icondir)" && rm -f $$files install-dist_mimeDATA: $(dist_mime_DATA) @$(NORMAL_INSTALL) test -z "$(mimedir)" || $(MKDIR_P) "$(DESTDIR)$(mimedir)" @list='$(dist_mime_DATA)'; test -n "$(mimedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(mimedir)" || exit $$?; \ done uninstall-dist_mimeDATA: @$(NORMAL_UNINSTALL) @list='$(dist_mime_DATA)'; test -n "$(mimedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(mimedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(mimedir)" && rm -f $$files install-dist_serviceDATA: $(dist_service_DATA) @$(NORMAL_INSTALL) test -z "$(servicedir)" || $(MKDIR_P) "$(DESTDIR)$(servicedir)" @list='$(dist_service_DATA)'; test -n "$(servicedir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(servicedir)" || exit $$?; \ done uninstall-dist_serviceDATA: @$(NORMAL_UNINSTALL) @list='$(dist_service_DATA)'; test -n "$(servicedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(servicedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(servicedir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(modulesdir)" "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(icondir)" "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(servicedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-modulesPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_appsDATA install-dist_iconDATA \ install-dist_mimeDATA install-dist_serviceDATA \ install-modulesPROGRAMS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_appsDATA \ uninstall-dist_iconDATA uninstall-dist_mimeDATA \ uninstall-dist_serviceDATA uninstall-modulesPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-modulesPROGRAMS ctags 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-dist_appsDATA install-dist_iconDATA \ install-dist_mimeDATA install-dist_serviceDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-modulesPROGRAMS 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 uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-dist_appsDATA uninstall-dist_iconDATA \ uninstall-dist_mimeDATA uninstall-dist_serviceDATA \ uninstall-modulesPROGRAMS %.moc : %.h ${QT_MOC} -o $@ $< # 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: aMule-2.3.1/src/utils/plasmamule/plasma-applet-plasmamule.h0000644000175000017470000000453111575347521022637 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef plasmamule_applet_h #define plasmamule_applet_h #include #include #include class PlasmaMuleApplet : public Plasma::Applet { Q_OBJECT public: PlasmaMuleApplet(QObject *parent, const QVariantList &args); ~PlasmaMuleApplet(); void paintInterface(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRect& contentsRect); void init(); public Q_SLOTS: void onSourceAdded(const QString&); void onSourceRemoved(const QString&); void dataUpdated(const QString&, const Plasma::DataEngine::Data&); protected: void dragEnterEvent(QGraphicsSceneDragDropEvent *event); void dropEvent(QGraphicsSceneDragDropEvent *event); void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); private: void connectToEngine(); QString calcSize (qlonglong); QStringList m_catDirs, m_catNames; int m_ed2k_state, m_ed2k_server_port, m_kad_status, m_clients_in_up_queue, m_shared_files_count, m_uptime, m_debugChannel; QString m_ed2k_id_high_low, m_ed2k_server_name, m_ed2k_server_ip, m_nickname, m_version; double m_down_speed, m_up_speed; qlonglong m_total_bytes_downloaded, m_total_bytes_uploaded, m_session_bytes_downloaded, m_session_bytes_uploaded; bool m_os_active, m_config_found; Plasma::Svg m_svg; Plasma::DataEngine* m_aMuleEngine; signals: void engine_add_link(QString, int); }; #endif aMule-2.3.1/src/utils/plasmamule/plasmamule-dbus.h0000644000175000017470000000216011575347521021030 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef plasmamule_dbus_h #define plasmamule_dbus_h #include #include void sendLinkToEngine (QString link, int cat, QObject* obj, int); #endif aMule-2.3.1/src/utils/plasmamule/plasma-applet-plasmamule.cpp0000644000175000017470000003763311575347521023203 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2010-2011 Werner Mahr (Vollstrecker) // // Any parts of this program contributed by third-party developers are copyrighted // by their respective authors. // // This program is free software; you can 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, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "plasma-applet-plasmamule.h" #include "plasmamule-dbus.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include K_EXPORT_PLASMA_APPLET(plasma-applet-plasmamule, PlasmaMuleApplet) PlasmaMuleApplet::PlasmaMuleApplet(QObject *parent, const QVariantList &args) : Plasma::Applet(parent, args), m_svg(this) { QString path = __IMG_PATH__; path.append( "application-x-emulecollection.svg"); m_svg.setImagePath(path); setBackgroundHints(TranslucentBackground); setMinimumSize(200, 200); setMaximumSize(300, 300); setAcceptDrops(TRUE); setHasConfigurationInterface(FALSE); } PlasmaMuleApplet::~PlasmaMuleApplet() { } void PlasmaMuleApplet::init() { m_debugChannel = KDebug::registerArea ("plasmamule-applet", #ifdef __DEBUG__ true #else false #endif ); connectToEngine(); } void PlasmaMuleApplet::paintInterface(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRect &contentsRect) { painter->setRenderHint(QPainter::SmoothPixmapTransform); painter->setRenderHint(QPainter::Antialiasing); QPixmap pixmap; pixmap = m_svg.pixmap(); QPixmap temp(pixmap.size()); temp.fill(Qt::transparent); QPainter p(&temp); p.setCompositionMode(QPainter::CompositionMode_Source); p.drawPixmap(0, 0, pixmap); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); p.fillRect(temp.rect(), QColor(0, 0, 0, 200)); p.end(); pixmap = temp; painter->drawPixmap(contentsRect, pixmap); painter->save(); painter->setPen(Qt::red); QFont font = painter->font(); font.setBold(true); painter->setFont(font); if (!m_config_found) { painter->drawText(contentsRect, Qt::AlignCenter, "aMule not configured or installed"); } else if (!m_os_active) { painter->drawText(contentsRect, Qt::AlignCenter, "Online Signature disabled"); } else if (m_uptime == 0) { painter->drawText(contentsRect, Qt::AlignCenter, "aMule is not running\n"); } else { QString message; painter->setPen(Qt::black); int time, days, hours, minutes; QString runtime; days = m_uptime/86400; time = m_uptime%86400; hours=time/3600; time=time%3600; minutes=time/60; time=time%60; runtime = QString("%1:%2:%3").arg(hours, 2, 10, QLatin1Char('0')).arg(minutes, 2, 10, QLatin1Char('0')).arg(time, 2, 10, QLatin1Char('0')); if (days) { if (days = 1) { runtime.prepend(QString("%1 day ").arg(days)); } else { runtime.prepend(QString("%1 days ").arg(days)); } } message = QString("%1 has been running for %2 \n\n").arg(m_version).arg(runtime); if (m_ed2k_state == 0 && m_kad_status == 0) { message.append(QString("%1 is not connected ").arg(m_nickname)); message.append("but running\n\n"); } else if (m_ed2k_state == 0 && m_kad_status != 0) { message.append(QString("%1 is connected to ").arg(m_nickname)); if (m_kad_status == 1) { message.append("Kad: firewalled \n\n"); } else { message.append("Kad: ok \n\n"); } } else { message.append(QString("%1 is connected to %2 [%3:%4] with ").arg(m_nickname).arg(m_ed2k_server_name).arg(m_ed2k_server_ip).arg(m_ed2k_server_port)); if (m_kad_status == 1) { if (m_ed2k_id_high_low == "H") { message.append("HighID | Kad: firewalled \n\n"); } else { message.append("LowID | Kad: firewalled \n\n"); } } else if (m_kad_status == 2) { if (m_ed2k_id_high_low == "H") { message.append("HighID | Kad: ok \n\n"); } else { message.append("LowID | Kad: ok \n\n"); } } else { if (m_ed2k_id_high_low == "H") { message.append("HighID | Kad: off \n\n"); } else { message.append("LowID | Kad: off \n\n"); } } } message.append(QString("Total Download: %1, Upload: %2\n\n").arg(calcSize(m_total_bytes_downloaded)).arg(calcSize(m_total_bytes_uploaded))); message.append(QString("Session Download: %1, Upload: %2\n\n").arg(calcSize(m_session_bytes_downloaded)).arg(calcSize(m_session_bytes_uploaded))); message.append(QString("Download: %L1 kB/s, Upload: %L2 kB/s\n\n").arg(m_down_speed, 0 , 'f', 1).arg(m_up_speed,0 ,'f', 1)); QString files_unit; if (m_shared_files_count == 1) { files_unit = "file"; } else { files_unit = "files"; } message.append(QString("Sharing: %1 %2, Clients on queue: %3").arg(m_shared_files_count).arg(files_unit).arg(m_clients_in_up_queue)); painter->drawText(contentsRect, Qt::TextDontClip | Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap, message); if (painter->boundingRect(contentsRect, Qt::TextDontClip | Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap, message).height() > contentsRect.height()) { kDebug(m_debugChannel) << "Resizing"; resize(painter->boundingRect(contentsRect, message).height()+(contentsRect.topLeft().y()*2), painter->boundingRect(contentsRect, message).height()+(contentsRect.topLeft().y()*2)); } } painter->restore(); } QString PlasmaMuleApplet::calcSize (qlonglong in_size) { int unit=0; double size; QStringList units; units << "Bytes" << "kBs" << "MBs" << "GBs" << "TBs" << "PBs" << "BBs" << "ZBs" << "YBs"; while (in_size >1023) { in_size /= 1024; unit++; } size = (in_size * 1024) / 1024; return QString("%L1 %2").arg(size, 0, 'f', 2).arg(units.at(unit)); } void PlasmaMuleApplet::connectToEngine() { m_aMuleEngine = dataEngine("plasmamule"); m_aMuleEngine->connectAllSources(this, 0); connect(m_aMuleEngine, SIGNAL(sourceAdded(const QString&)), this, SLOT(onSourceAdded(const QString&))); connect(m_aMuleEngine, SIGNAL(sourceRemoved(const QString&)), this, SLOT(onSourceRemoved(const QString&))); } void PlasmaMuleApplet::onSourceAdded(const QString& source) { kDebug(m_debugChannel) << "New Source: " << source << " added"; m_aMuleEngine->connectSource(source, this, 0); } void PlasmaMuleApplet::onSourceRemoved(const QString& source) { kDebug(m_debugChannel) << "Source: " << source << " removed"; update(); } void PlasmaMuleApplet::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data) { if (data.isEmpty()) { return; } bool needs_update = FALSE; kDebug(m_debugChannel) << "Updating data" << data; if (data["cat_dirs"].toStringList() != m_catDirs && data.contains("cat_dirs")) { m_catDirs = data["cat_dirs"].toStringList(); } if (data["cat_names"].toStringList() != m_catNames && data.contains("cat_names")) { m_catNames = data["cat_names"].toStringList(); } if (data["os_active"].toBool() != m_os_active && data.contains("os_active")) { m_os_active = data["os_active"].toBool(); needs_update = TRUE; } if (data["config_found"].toBool() != m_config_found && data.contains("config_found")) { m_config_found = data["config_found"].toBool(); needs_update = TRUE; } if (data["ed2k_state"].toInt() != m_ed2k_state && data.contains("ed2k_state")) { m_ed2k_state = data["ed2k_state"].toInt(); needs_update = TRUE; } if (data["ed2k_server_name"] != m_ed2k_server_name && data.contains("ed2k_server_name")) { m_ed2k_server_name = data["ed2k_server_name"].toString(); needs_update = TRUE; } if (data["ed2k_server_ip"] != m_ed2k_server_ip && data.contains("ed2k_server_ip")) { m_ed2k_server_ip = data["ed2k_server_ip"].toString(); needs_update = TRUE; } if (data["ed2k_server_port"].toInt() != m_ed2k_server_port && data.contains("ed2k_server_port")) { m_ed2k_server_port = data["ed2k_server_port"].toInt(); needs_update = TRUE; } if (data["ed2k_id_high_low"] != m_ed2k_id_high_low && data.contains("ed2k_id_high_low")) { m_ed2k_id_high_low = data["ed2k_id_high_low"].toString(); needs_update = TRUE; } if (data["kad_status"].toInt() != m_kad_status && data.contains("kad_status")) { m_kad_status = data["kad_status"].toInt(); needs_update = TRUE; } if (data["down_speed"].toInt() != m_down_speed && data.contains("down_speed")) { m_down_speed = data["down_speed"].toDouble(); needs_update = TRUE; } if (data["up_speed"].toDouble() != m_up_speed && data.contains("up_speed")) { m_up_speed = data["up_speed"].toDouble(); needs_update = TRUE; } if (data["clients_in_up_queue"].toInt() != m_clients_in_up_queue && data.contains("clients_in_up_queue")) { m_clients_in_up_queue = data["clients_in_up_queue"].toInt(); needs_update = TRUE; } if (data["shared_files_count"].toInt() != m_shared_files_count && data.contains("shared_files_count")) { m_shared_files_count = data["shared_files_count"].toInt(); needs_update = TRUE; } if (data["nickname"] != m_nickname && data.contains("nickname")) { m_nickname = data["nickname"].toString(); needs_update = TRUE; } if (data["total_bytes_downloaded"].toLongLong() != m_total_bytes_downloaded && data.contains("total_bytes_downloaded")) { m_total_bytes_downloaded = data["total_bytes_downloaded"].toLongLong(); needs_update = TRUE; } if (data["total_bytes_uploaded"].toLongLong() != m_total_bytes_uploaded && data.contains("total_bytes_uploaded")) { m_total_bytes_uploaded = data["total_bytes_uploaded"].toLongLong(); needs_update = TRUE; } if (data["version"] != m_version && data.contains("version")) { m_version = data["version"].toString(); needs_update = TRUE; } if (data["session_bytes_downloaded"].toLongLong() != m_session_bytes_downloaded && data.contains("session_bytes_downloaded")) { m_session_bytes_downloaded = data["session_bytes_downloaded"].toLongLong(); needs_update = TRUE; } if (data["session_bytes_uploaded"].toLongLong() != m_session_bytes_uploaded && data.contains("session_bytes_uploaded")) { m_session_bytes_uploaded = data["session_bytes_uploaded"].toLongLong(); needs_update = TRUE; } if (data["uptime"].toInt() != m_uptime && data.contains("uptime")) { m_uptime = data["uptime"].toInt(); needs_update = TRUE; } if (needs_update) { kDebug(m_debugChannel) << "Updating view"; update(); } } void PlasmaMuleApplet::dragEnterEvent(QGraphicsSceneDragDropEvent * event) { kDebug(m_debugChannel) << "Dragged Data detected " << event; if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } } void PlasmaMuleApplet::dropEvent(QGraphicsSceneDragDropEvent * event) { QStringList::const_iterator constIterator; event->acceptProposedAction(); QMenu *menu = new QMenu; if (m_catNames.count() == 1) { sendLinkToEngine (event->mimeData()->text(), 0, this, m_debugChannel); } else { for (constIterator = m_catNames.constBegin(); constIterator != m_catNames.constEnd(); constIterator++) { menu->addAction(*constIterator); if (constIterator != m_catNames.constEnd()) { menu->addSeparator(); } } QAction *cat_selection = menu->exec(QCursor::pos()); if (cat_selection) { sendLinkToEngine (event->mimeData()->text(), m_catNames.indexOf(cat_selection->text()), this, m_debugChannel); } } delete menu; } void PlasmaMuleApplet::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) { QStringList::const_iterator constIterator; QMenu menu; if (m_catDirs.count() == 1) { menu.addAction (KIcon("folder"), QString("Default")); } else { QMenu *open_sub_menu = menu.addMenu("Open Incoming"); for (constIterator = m_catNames.constBegin(); constIterator != m_catNames.constEnd(); constIterator++) { open_sub_menu->addAction(KIcon("folder"), "Folder for " + *constIterator); if (constIterator != m_catNames.constEnd()) { open_sub_menu->addSeparator(); } } menu.addSeparator(); } QClipboard* clipboard = QApplication::clipboard(); if (!clipboard->text(QClipboard::Clipboard).isEmpty() || !clipboard->text(QClipboard::Selection).isEmpty()) { if (m_catDirs.count() == 1) { if (!clipboard->text(QClipboard::Clipboard).isEmpty()) { menu.addAction(KIcon("arrow-down-double"), "Download Link from Clipboard"); if (!clipboard->text(QClipboard::Selection).isEmpty()) { menu.addSeparator(); } } if (!clipboard->text(QClipboard::Selection).isEmpty()) { menu.addAction(KIcon("arrow-down-double"), "Download Link from Selection"); } } else { QMenu *download_sub_menu = menu.addMenu("Download Link"); for (constIterator = m_catNames.constBegin(); constIterator != m_catNames.constEnd(); constIterator++) { if (!clipboard->text(QClipboard::Clipboard).isEmpty()) { download_sub_menu->addAction(KIcon("arrow-down-double"), "Clipboard->" + *constIterator); if (!clipboard->text(QClipboard::Selection).isEmpty()) { download_sub_menu->addSeparator(); } } if (!clipboard->text(QClipboard::Selection).isEmpty()) { download_sub_menu->addAction(KIcon("arrow-down-double"), "Selection->" + *constIterator); } if (constIterator != m_catNames.constEnd()) { download_sub_menu->addSeparator(); } } } } menu.addSeparator(); menu.addAction(KIcon("documentinfo"), "About"); QAction* selectedItem = menu.exec(QCursor::pos()); if (selectedItem) { if (selectedItem->text() == "About") { KPluginInfo* service = new KPluginInfo (KService::serviceByDesktopName ("plasma-applet-plasmamule")); KAboutData* aboutData = new KAboutData (service->name().toUtf8(), service->name().toUtf8(), ki18n(service->pluginName().toUtf8()), service->version().toUtf8(), ki18n(service->comment().toUtf8()), KAboutData::License_GPL_V3, ki18n(QByteArray()), ki18n(QByteArray()), service->website().toLatin1(), service->email().toLatin1()); aboutData->addAuthor (ki18n(service->author().toUtf8()), ki18n(QByteArray()), service->email().toLatin1(), service->website().toLatin1()); aboutData->setTranslator(ki18nc ("NAME OF TRANSLATORS", "Your names"), ki18nc("EMAIL OF TRANSLATORS", "Your emails")); aboutData->setProgramIconName (service->icon()); KAboutApplicationDialog* about = new KAboutApplicationDialog(aboutData, KAboutApplicationDialog::HideTranslators); about->exec(); } else if (selectedItem->text().startsWith("Folder for")) { kDebug(m_debugChannel) << "Opening Folder " << m_catDirs.at(m_catNames.indexOf(selectedItem->text().remove("Folder for "))); KUrl url(m_catDirs.at(m_catNames.indexOf(selectedItem->text().remove("Folder for "))) + "/"); (void) new KRun( url, 0, true ); } else if (selectedItem->text().startsWith("Download")) { if (selectedItem->text().remove("Download Link from ") == "Clipboard") { sendLinkToEngine (clipboard->text(QClipboard::Clipboard), 0, this, m_debugChannel); } else { sendLinkToEngine (clipboard->text(QClipboard::Selection), 0, this, m_debugChannel); } } else if (selectedItem->text().startsWith("Clipboard->")) { sendLinkToEngine (clipboard->text(QClipboard::Clipboard), m_catNames.indexOf(selectedItem->text().remove("Clipboard->")), this, m_debugChannel); } else if (selectedItem->text().startsWith("Selection->")) { sendLinkToEngine (clipboard->text(QClipboard::Selection), m_catNames.indexOf(selectedItem->text().remove("Selection->")), this, m_debugChannel); } } } #include "plasma-applet-plasmamule.moc" aMule-2.3.1/src/utils/plasmamule/amule_applet.svg0000644000175000017470000027416611575347521020776 0ustar topiusers aMule-2.3.1/src/utils/plasmamule/plasmamule-engine-feeder.desktop0000644000175000017470000000126411644077302024010 0ustar topiusers[Desktop Entry] Exec=plasmamule-engine-feeder %U Type=Application Name=file- and linkhandler for plasmamule Name[de]=Datei und Linkhandler für plasmamule Name[fr]=Gestionnaire de fichiers et de liens pour plasmamule Name[tr]=Plasmamule için dosya ve bağlantı yöneticisi Comment=Sends ed2k://, magnet: or *.emulecollection to the engine Comment[de]=Sendet ed2k://, magnet: oder *.emulecollection zur engine Comment[fr]=Envoie les éléments ed2k://, magnet: ya da *.emulecollection Comment[tr]=ed2://, magnet: ya da *.emulecollection unsurlarını gönderir Icon=application-x-emulecollection MimeType=application/x-emulecollection; NoDisplay=true StartupNotify=false StartupWMClas=false aMule-2.3.1/src/utils/Makefile.in0000644000175000017470000005276411657306262015506 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/automake/dist-hook.am subdir = src/utils ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @CAS_TRUE@OPT_CAS = cas @WXCAS_TRUE@OPT_WXCAS = wxCas @ALCC_TRUE@OPT_ALC = aLinkCreator @ALC_TRUE@OPT_ALC = aLinkCreator @XAS_TRUE@OPT_XAS = xas @PLASMAMULE_TRUE@OPT_PLASMAMULE = plasmamule @FILEVIEW_TRUE@OPT_FILEVIEW = fileview SUBDIRS = $(OPT_FILEVIEW) $(OPT_XAS) $(OPT_CAS) $(OPT_WXCAS) $(OPT_ALC) ${OPT_PLASMAMULE} DIST_SUBDIRS = fileview xas cas wxCas aLinkCreator plasmamule MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = mkFileSum.c EXTRA__DIST__SUBDIRS = amps scripts DISTCLEANFILES = scripts/denoiser.sed all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/automake/dist-hook.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/utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -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 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: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive dist-hook distclean distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am dist-hook: test -z "$(EXTRA__DIST__SUBDIRS)" || \ for d in $(EXTRA__DIST__SUBDIRS) ; do \ mkdir $(distdir)/$$d ; \ for f in `find $(srcdir)/$$d -name '.svn' -prune -o -printf "%P\n"` ; do \ if test -d $(srcdir)/$$d/$$f ; then \ mkdir $(distdir)/$$d/$$f ; \ else \ cp -p $(srcdir)/$$d/$$f $(distdir)/$$d/$$f ; \ fi ; \ done ; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/mkFileSum.c0000644000175000017470000003135011575347521015467 0ustar topiusers/* * This file is part of the aMule project. * * Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* * This program generates an md5sum from a C/C++ source file. * Basic preprocessing is applied to the source (comment removal, * whitespace normalization), so only real code change will result * in md5sum change. * * Preprocessor code is written by Dvai Tams (gonosztopi@amule.org) * md5 code is taken from src/MD5Sum.cpp * * Usage: the program takes input from stdin and places output to stdout. * This behaviour cannot be altered. */ #include #include typedef unsigned char *POINTER; typedef uint16_t UINT2; typedef uint32_t UINT4; typedef struct { UINT4 state[4]; UINT4 count[2]; unsigned char buffer[64]; } MD5_CTX; void MD5Init(MD5_CTX *); void MD5Update(MD5_CTX *, const unsigned char *, unsigned int); void MD5Final(unsigned char [16], MD5_CTX *); const int table[][9] = { { 0x0206, 0x0206, 0x0008, 0x0100, 0x0101, 0x0102, 0x000e, 0x0100, 0x00ff }, { 0x0101, 0x0101, 0x0101, 0x0101, 0x0100, 0x0101, 0x010b, 0x0101, 0x00ff }, { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0100, 0x010c, 0x0102, 0x00ff }, { 0x0003, 0x0003, 0x0003, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff }, { 0x0006, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x00ff }, { 0x0206, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x00ff }, { 0x0006, 0x0006, 0x0007, 0x0100, 0x0101, 0x0102, 0x000d, 0x0100, 0x00ff }, { 0x0606, 0x0606, 0x0004, 0x000f, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff }, { 0x0606, 0x0606, 0x0005, 0x0003, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff }, { 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff }, { 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x00ff }, { 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x00ff }, { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x00ff }, { 0x0006, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff }, { 0x0206, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff }, { 0x000f, 0x000f, 0x000f, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff }, { 0x000f, 0x000f, 0x0006, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff } }; int GetCharCode(int c) { if (c == '\r' || c == '\n') return 0; if (c == ' ' || c == '\t') return 1; if (c == '/') return 2; if (c == '*') return 3; if (c == '\"') return 4; if (c == '\'') return 5; if (c == '\\') return 6; if (c == EOF) return 8; return 7; } int main() { int c; int state = 0; MD5_CTX context; unsigned char digest[16]; unsigned char buffer[1024]; int count = 0; MD5Init(&context); while (state != 0x00ff) { c = getchar(); state = table[state][GetCharCode(c)]; if (state & 0x0800) { buffer[count++] = '\\'; } if (state & 0x0400) { buffer[count++] = '/'; } if (state & 0x0200) { buffer[count++] = ' '; } if (state & 0x0100) { buffer[count++] = c; } state &= 0x00ff; if (count > 1020) { MD5Update(&context, buffer, count); count = 0; } } MD5Update(&context, buffer, count); MD5Final(digest, &context); for (count = 0; count < 16; count++) printf("%02x", digest[count]); putchar('\n'); return 0; } #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static void MD5Transform (UINT4 [4], const unsigned char [64]); static void Encode (unsigned char *, UINT4 *, unsigned int); static void Decode (UINT4 *, const unsigned char *, unsigned int); static void MD5_memcpy (POINTER, POINTER, unsigned int); static void MD5_memset (POINTER, int, unsigned int); static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. 15-April-2003 Sony: use MSVC intrinsic to save some cycles */ #ifdef _MSC_VER #pragma intrinsic(_rotl) #define ROTATE_LEFT(x, n) _rotl((x), (n)) #else #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) #endif /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ /* Defines must be on one line to work with GCC-2.95.3 */ #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init (MD5_CTX *context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen) { unsigned int i, index, partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { context->count[1]++; } context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) { MD5Transform (context->state, &input[i]); } index = 0; } else { i = 0; } /* Buffer remaining input */ MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the * the message digest and zeroizing the context. */ void MD5Final (unsigned char digest[16], MD5_CTX *context) { unsigned char bits[8]; unsigned int index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); /* Append length (before padding) */ MD5Update (context, bits, 8); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information.*/ MD5_memset ((POINTER)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform (UINT4 state[4], const unsigned char block[64]) { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset ((POINTER)x, 0, sizeof (x)); } /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ static void Encode (unsigned char *output, UINT4 *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } } /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ static void Decode (UINT4 *output, const unsigned char *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); } /* Note: Replace "for loop" with standard memcpy if possible. */ static void MD5_memcpy (POINTER output, POINTER input, unsigned int len) { unsigned int i; for (i = 0; i < len; i++) output[i] = input[i]; } /* Note: Replace "for loop" with standard memset if possible. */ static void MD5_memset (POINTER output, int value, unsigned int len) { unsigned int i; for (i = 0; i < len; i++) ((char *)output)[i] = (char)value; } aMule-2.3.1/src/utils/xas/0000755000175000017470000000000011657306264014220 5ustar topiusersaMule-2.3.1/src/utils/xas/autostart-xas.in0000644000175000017470000000253111543632432017361 0ustar topiusers#!/bin/sh # This file is part of the aMule project. # # Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) # Copyright (c) 2006-2011 Werner Mahr (Vollstrecker) ( amule@vollstreckernet.de ) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # prefix=@prefix@ exec_prefix=@exec_prefix@ xas_bin=@libdir@/xchat/plugins/xas.pl if [ -z $xas_bin ] ; then echo "xas.pl: Plugin not found" exit 0 fi if [ -d ~/.xchat2 ] ; then if [ -e ~/.xchat2/xas.pl ] ; then rm ~/.xchat2/xas.pl fi ln -s $xas_bin ~/.xchat2/xas.pl && echo "autostart successfully added" if ps -A | grep -q xchat ; then echo "You have to restart XChat to autoload xas.pl" fi else echo "XChat-Datadir not found" fi aMule-2.3.1/src/utils/xas/Makefile.am0000644000175000017470000000026011575347521016252 0ustar topiusersSUBDIRS = docs dist_plugins_DATA = xas.pl pluginsdir = $(libdir)/xchat/plugins bin_SCRIPTS = autostart-xas EXTRA_DIST = autostart-xas.in MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/xas/docs/0000755000175000017470000000000011657306264015150 5ustar topiusersaMule-2.3.1/src/utils/xas/docs/xas.it.10000644000175000017470000000275711655447554016461 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "Novembre 2011" "xas v1.9" "Utilità di aMule" .als B_untranslated B .SH NOME xas \- Statistiche di aMule per X\-Chat .SH SINTASSI \fBnessuna\fP .SH DESCRIZIONE \fBxas\fP è un plugin per xchat. Per il caricamento vedere la documentazione di xchat. Dopo il caricamento digitare /xas e le statistiche verranno inviate sul canale a cui siete collegati. Queste sono prese dal file di firma online. Per il funzionamento, dovete abilitare l'opzione della "firma online" nelle preferenze di aMule. Per abilitarlo ad ogni avvio di xchat dovete eseguire lo script autostart\-xas (presente in /usr/bin se avete installato con \-\-prefix=/usr) \fBxas\fP è stato originalmente scritto da niet .SH "SEGNALARE I BUG" Per favore segnalare i bug nel nostro forum (\fIhttp://forum.amule.org/\fP) o nel nostro bugtracker (\fIhttp://bugs.amule.org/\fP). Per favore non segnalare i bug via posta elettronica, né nella nostra mailing list né direttamente a qualunque membro del gruppo. .SH COPYRIGHT aMule e tutti i programmi di utilità correlati sono distribuiti in accordo alla GNU General Public License. .SH "VEDI ANCHE" .B_untranslated amule\fR(1) .SH AUTORE Questa pagina del manuale è stata scritta da Vollstrecker .SH TRADUZIONE ITALIANA Stefano Corti aMule-2.3.1/src/utils/xas/docs/xas.10000644000175000017470000000210511653631431016014 0ustar topiusers.TH XAS 1 "November 2011" "xas v1.9" "aMule utilities" .als B_untranslated B .SH NAME xas \- X\-Chat aMule Statistics .SH SYNOPSIS .B none .SH DESCRIPTION \fBxas\fR is a plugin for xchat. For loading see your xchat documentation. After loading type /xas and it will send statistics to the channel you are in. These are taken from your Online Signature file. For this to work, you must enable the "Online Signature" option in aMule's preferences. To enable it on every startup of xchat you can just run the autstart-xas script (in /usr/bin if you installed with \-\-prefix=/usr). \fBxas\fR was originally written by niet .SH REPORTING BUGS Please report bugs either on our forum (\fIhttp://forum.amule.org/\fR), or in our bugtracker (\fIhttp://bugs.amule.org/\fR). Please do not report bugs in e-mail, neither to our mailing list nor directly to any team member. .SH COPYRIGHT aMule and all of its related utilities are distributed under the GNU General Public License. .SH SEE ALSO .B_untranslated amule\fR(1) .SH AUTHOR This manpage was written by Vollstrecker aMule-2.3.1/src/utils/xas/docs/Makefile.am0000644000175000017470000000205311641025331017166 0ustar topiusersdist_man_MANS = xas.1 man_langs = de es fr hu it ru tr EXTRA_DIST = xas.de.1 xas.es.1 xas.fr.1 xas.hu.1 xas.it.1 xas.ru.1 xas.tr.1 install-data-hook: @for lang in $(man_langs); do \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1 ; \ list='$(dist_man_MANS)' ; \ for file in $$list; do \ tmp=`echo $$file | sed -e "s/\.1/\.$$lang\.1/"` ; \ if test -f $(srcdir)/$$tmp; then name=$(srcdir)/$$tmp; \ else name=$$tmp; fi; \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ done ; \ done uninstall-hook: @for lang in $(man_langs); do \ list='$(dist_man_MANS)' ; \ for file in $$list; do \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ done ; \ done MAINTAINERCLEANFILES = Makefile.in aMule-2.3.1/src/utils/xas/docs/xas.de.10000644000175000017470000000265211653631431016412 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "November 2011" "xas v1.9" "aMule Hilfsprogramme" .als B_untranslated B .SH NAME xas \- X\-Chat aMule Statistics .SH SYNTAX \fBKeine\fP .SH BESCHREIBUNG \fBxas\fP is a plugin for xchat. For loading see your xchat documentation. After loading type /xas and it will send statistics to the channel you are in. These are taken from your Online Signature file. For this to work, you must enable the "Online Signature" option in aMule's preferences. To enable it on every startup of xchat you can just run the autstart\-xas script (in /usr/bin if you installed with \-\-prefix=/usr). \fBxas\fP wurde ursprünglich von niet geschrieben .SH "FEHLER MELDEN" Bitte meldet Fehler entweder in unserem Forum (\fIhttp://forum.amule.org/\fP), oder in unseren Bugtracker (\fIhttp://bugs.amule.org/\fP). Bitte meldet uns weder Fehler per E\-Mail, noch auf unsere Mailingliste oder direkt an unsere Teammitglieder. .SH COPYRIGHT aMule und alle seine zugehörigen Anwendungen werden verteilt unter der GNU General Public License .SH "SIEHE AUCH" .B_untranslated amule\fR(1) .SH VERFASSER Diese manpage wurde geschrieben von Vollstrecker Diese manpage wurde übersetzt von Vollstrecker aMule-2.3.1/src/utils/xas/docs/xas.hu.10000644000175000017470000000267311656343533016447 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "2011. november" "xas v1.9" "aMule segédprogramok" .als B_untranslated B .SH NÉV xas \- X\-Chat aMule Statisztikák .SH ÁTTEKINTÉS \fBnincs\fP .SH LEÍRÁS A \fBxas\fP egy xchat plugin. A betöltéshez olvasd el az xchat dokumentációját. Betöltés után a /xas parancs kiírja az aktuális csatornára az aMule statisztikáit. Ezek az Online Aláírás fájlból kerülnek kiolvasásra. Ahhoz, hogy ez működjön, engedélyezni kell az \(BqOnline aláírás\(rq opciót az aMule beállításaiban. Ha az xchat minden indításakor szeretnéd automatikusan betölteni, futtasd az autostart\-xas programot. A \fBxas\fP\-t eredetileg niet írta. .SH "HIBÁK JELENTÉSE" A hibákat kérjük vagy a fórumon (\fIhttp://forum.amule.org/\fP), vagy a hibakövetőben (\fIhttp://bugs.amule.org/\fP) jelentsék. Hibákról kérjük ne írjanak levelet (e\-mail\-t) se a levelezési listára, se közvetlenül valamelyik fejlesztőnek. .SH COPYRIGHT Az aMule és az összes hozzá tartozó segédprogram a GNU General Public License védelme alatt áll. .SH "LÁSD MÉG" .B_untranslated amule\fR(1) .SH SZERZŐ Ezt a kézikönyv lapot Vollstrecker írta. .SH MAGYAR FORDÍTÁS Dévai Tamás aMule-2.3.1/src/utils/xas/docs/xas.tr.10000644000175000017470000000301711657220745016451 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "Kasım 2011" "xas v1.9" "aMule yardımcı araçları" .als B_untranslated B .SH İSİM xas \- X\-Chat aMule İstatistikleri .SH KULLANIM \fBboş\fP .SH AÇIKLAMA \fBxas\fP xchat için bir eklentidir. Yüklemek için xchat yardım belgelerine bakınız. Yüklendikten sonra /xas yazdığınızda istatistikleri bulunduğunuz kanala yollar. Bu bilgiler Çevrimiçi İmza dosyanızdan okunur. Bunun çalışması için aMule'ün ayarlarında "Çevrim İçi İmza" seçeneğini etkinleştirmeniz gerekmektedir. xchat programının her başlayışında yüklenmesi için autstart\-xas scriptini çalıştırmanız yeterli olacaktır (\-\-prefix=/usr ile kurduysanız /usr/bin dizininde bulunur). \fBxas\fP başlangıçta niet tarafından yazılmıştır .SH GERİBİLDİRİM Hataları bildirmek için forumumuzu (\fIhttp://forum.amule.org/\fP) ya da hata takipçimizi (\fIhttp://bugs.amule.org/\fP) kullanınız. Hataları bildirmek için e\-mail ve e\-mail listemizi kullanmamanızı ve geliştiricilerden birine doğrudan bildirmemenizi rica ederiz. .SH "TELİF HAKKI" aMule ve ilgili tüm yardımcı araçları GNU Genel Kamu Lisansı çerçevesinde dağıtılmaktadır. .SH "İLGİLİ BELGELER" .B_untranslated amule\fR(1) .SH YAZAN Bu kılavuz sayfası Vollstrecker tarafından yazılmıştır. aMule-2.3.1/src/utils/xas/docs/xas.ru.10000644000175000017470000000404411653631431016445 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "November 2011" "xas v1.9" "утилиты aMule" .als B_untranslated B .SH ИМЯ xas \- X\-Chat статистика aMule .SH ОБЗОР \fBнет\fP .SH ОПИСАНИЕ \fBxas\fP \- это плагин для xchat. Для установки смотрите вашу документацию по xchat. После загрузки наберите /xas и он пошлет вашу статистику в канал на котором вы находитесь. Статистика берется из файла онлайн\-подписи. Чтобы это работало, вы должны включить опцию "Онлайн подпись" в настройках aMule. Чтобы включать его при каждом запуске xchat вы можете просто выполнить скрипт autstart\-xas (в папке /usr/bin если вы установили с \-\-prefix=/usr). \fBxas\fP изначально был написан niet .SH "СООБЩЕНИЕ ОБ ОШИБКАХ" Пожалуйста, сообщайте об ошибках либо на нашем форуме (\fIhttp://forum.amule.org/\fP), либо в багтрекере (\fIhttp://bugs.amule.org/\fP). Пожалуйста, не сообщайте об ошбках по электронной почте, по нашим спискам рассылки, или напрямую участникам. .SH "АВТОРСКИЕ ПРАВА" aMule и все прилагающиеся инструменты распространаются под Открытым Лицензионным Соглашением GNU (GNU GPL). .SH "СМ. ТАКЖЕ" .B_untranslated amule\fR(1) .SH АВТОРЫ Автор страницы помощи: Vollstrecker , перевод: Radist Morse aMule-2.3.1/src/utils/xas/docs/Makefile.in0000644000175000017470000004414111657306264017221 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/utils/xas/docs DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = 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' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = xas.1 man_langs = de es fr hu it ru tr EXTRA_DIST = xas.de.1 xas.es.1 xas.fr.1 xas.hu.1 xas.it.1 xas.ru.1 xas.tr.1 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/xas/docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/xas/docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { 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'; \ } | 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,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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 @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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 @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook 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 uninstall uninstall-am uninstall-hook \ uninstall-man uninstall-man1 install-data-hook: @for lang in $(man_langs); do \ echo " $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1" ; \ $(mkinstalldirs) $(DESTDIR)$(mandir)/$$lang/man1 ; \ list='$(dist_man_MANS)' ; \ for file in $$list; do \ tmp=`echo $$file | sed -e "s/\.1/\.$$lang\.1/"` ; \ if test -f $(srcdir)/$$tmp; then name=$(srcdir)/$$tmp; \ else name=$$tmp; fi; \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ $(INSTALL_DATA) $$name $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ done ; \ done uninstall-hook: @for lang in $(man_langs); do \ list='$(dist_man_MANS)' ; \ for file in $$list; do \ inst=`echo $$file | sed -e "s/\.1//" -e '$(transform)'`.1 ; \ echo " rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst" ; \ rm -f $(DESTDIR)$(mandir)/$$lang/man1/$$inst ; \ done ; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: aMule-2.3.1/src/utils/xas/docs/xas.es.10000644000175000017470000000256611653631431016435 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "November 2011" "xas v1.9" "aMule utilidades" .als B_untranslated B .SH NOMBRE xas \- Estadísticas aMule para X\-Chat .SH SINOPSIS \fBnone\fP .SH DESCRIPCIÓN \fBxas\fP is a plugin for xchat. For loading see your xchat documentation. After loading type /xas and it will send statistics to the channel you are in. These are taken from your Online Signature file. For this to work, you must enable the "Online Signature" option in aMule's preferences. To enable it on every startup of xchat you can just run the autstart\-xas script (in /usr/bin if you installed with \-\-prefix=/usr). \fBxas\fP fué escrito originalmente por niet .SH "INFORMANDO ERRORES" Por favor informa de fallos ya sea en nuestro foro (\fIhttp://forum.amule.org/\fP), o en nuestro bugtracker (\fIhttp://bugs.amule.org/\fP). Por favor no informe de fallos por correo, ni en nuestras listas, ni directamente al correo de algun miembro del equipo. .SH COPYRIGHT aMule y todas las demás utilidades relacionadas son distribuidas bajo la GNU General Public License. .SH "VEASE TAMBIEN" .B_untranslated amule\fR(1) .SH AUTOR Esta página de manualfue escrita por Vollstrecker aMule-2.3.1/src/utils/xas/docs/xas.fr.10000644000175000017470000000270011657217366016436 0ustar topiusers.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH XAS 1 "Novembre 2011" "xas v1.9" "Outils d'aMule" .als B_untranslated B .SH NOM xas \- X\-Chat aMule Statistics .SH SYNOPSIS \fBaucun\fP .SH DESCRIPTION \fBxas\fP est une extension pour xchat. Pour le chargement voir la documentation de votre xchat. Après le chargement tapez /xas et il enverra des statistiques sur la canal où vous êtes. Elles sont prises à partir de votre fichier de signature en ligne. Pour que cela fonctionne, vous devez activer l'option "Online Signature" dans les préférences d'aMule. Pour l'activer à chaque démarrage de xchat vous devez juste lancer le script autstart\-xas (dans /usr/bin si vous l'avez installé avec with \-\-prefix=/usr). \fBxas\fP a été initialement écrit par niet .SH "RAPPORTER DES BOGUES" Veuillez rapporter les bogues sur notre forum (\fIhttp://forum.amule.org/\fP), ou sur notre bugtracker (\fIhttp://bugs.amule.org/\fP). Veuillez ne pas rapporter les bogues par e\-mail, sur notre liste de diffusion ou directement à n'importe quel membre de l'équipe. .SH COPYRIGHT aMule et tout ses outils sont distribués sous la licence GNU General Public License. .SH "VOIR AUSSI" .B_untranslated amule\fR(1) .SH AUTEUR Cette manpage a été écrite par Vollstrecker aMule-2.3.1/src/utils/xas/xas.pl0000644000175000017470000002012511575347521015350 0ustar topiusers#!/usr/bin/perl # we register the script # if someone knows how to unload it clean....do tell IRC::register("xas", "1.9", "","XChat aMule stats"); # welcome message IRC::print "\n\0033 Follow the \0034 white\0033 rabbit\0038...\003\n"; IRC::print "\n\0035 Use command \0038/xas\0035 to print out aMule statistics\003"; # we have no life. we are robots...and we hang around in here: IRC::print "\0035 (#amule @ irc.freenode.net)\003"; # command that we use IRC::add_command_handler("xas","xas"); #25.06.2005 - PleuR : int_to_byte, ratio-fixer, fixed line 1 (is connected to online ?) #16.12.2005 - stefanero : some kad cleanups #12.12.2005 - fulgas ; made kad work with xas #06.05.2005 - niet : file handle change #12.10.2004 - bisley : added session/total ratios #16.06.2004 - niet : added support for memory usage and binary name #05.05.2004 - Jacobo221 : fixed typos, sig 2 support, new outputs, crash detect #29.04.2004 - niet : renamed astats to xas (X-Chat Amule statistics) #22.04.2004 - citroklar : added smp support # 2004 - bootstrap : some hints on file opening # 2004 - niet : used some of cheetah.pl script and so astats was born # Five status currently: online, connecting, offline, closed, crashed sub xas { #amule program name chomp(my $amulename = `ps --no-header -u $ENV{USER} -o ucmd --sort start_time|grep amule|head -n 1`); #amule binary date (because we still don't have date in CVS version). GRRRRRR #ls -lAF `ps --no-header -u j -o cmd --sort start_time|grep amule|head -n 1|awk '{print $2}'` # system uptime chomp(my $uptime = `uptime|cut -d " " -f 4- | tr -s " "`); # number of cpu's calculated from /proc/cpuinfo chomp(my $number_cpus = `cat /proc/cpuinfo | grep 'processor' -c`); # type of cpu chomp(my $cpu = `cat /proc/cpuinfo | grep 'model name' -m 1 | cut -f 2 -d ":" | cut -c 2-`); # cpu speed chomp(my $mhz = `cat /proc/cpuinfo | grep "cpu MHz" -m 1 | cut -f 2 -d ":" | cut -c 2-`); # what is the aMule's load on cpu chomp(my $amulecpu = `ps --no-header -C $amulename -o %cpu --sort start_time|head -n 1`); # how much memory is aMule using chomp(my $amulemem = (sprintf("%.02f", `ps --no-header -C $amulename -o rss --sort start_time|head -n 1` / 1024 ))); # bootstrap # there is no spoon...err.... signature open(AMULESIGFILE,"$ENV{'HOME'}/.aMule/amulesig.dat") or die "aMule online signature not found. Did you enable it ?"; chomp(@amulesigdata = ); close AMULESIGFILE; # are we high or what ? :-Q if ($amulesigdata[4] eq "H") {$amuleid="high"} else {$amuleid="low"}; # are we online / offline / connecting #kad on if($amulesigdata[5]==2) { if ($amulesigdata[0]==0) { #$amulestatus="Not Connected"; $amulextatus="Kad: ok"; } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 $amulestatus="connecting"; $amulextatus="| Kad: ok"; } else { $amulestatus="online"; $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: ok"; } } elsif ($amulesigdata[5]==1) { if ($amulesigdata[0]==0) { #$amulestatus="Not Connected"; $amulextatus="Kad: firewalled"; } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 $amulestatus="connecting"; $amulextatus="| Kad: firewalled"; } else { $amulestatus="online"; $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: firewalled"; } } else { if ($amulesigdata[0]==0) { $amulestatus="Not Connected"; $amulextatus="| Kad: off"; } elsif ($amulesigdata[0]==2) { # Since aMule v2-rc4 $amulestatus="connecting"; $amulextatus="| Kad: off" ; } else { $amulestatus="online"; $amulextatus="with $amuleid ID on server $amulesigdata[1] [ $amulesigdata[2]:$amulesigdata[3] ] | Kad: off"; } } # total download traffic in bytes (int_to_byte *after* calculations) my $tdl = $amulesigdata[11]; # total upload traffic in bytes my $tul = $amulesigdata[12]; # session download traffic in bytes my $sdl = $amulesigdata[14]; # session upload traffic in bytes my $sul = $amulesigdata[15]; # ratio my $totalratio = calc_ratio($tdl,$tul); my $sessionratio = calc_ratio($sdl,$sul); # do int_to_bytes to make human-readable output $tdl = int_to_bytes($tdl); $tul = int_to_bytes($tul); $sdl = int_to_bytes($sdl); $sul = int_to_bytes($sul); # convert runtime from sec to string my $seconds = $amulesigdata[16]; my $days = pull_count($seconds, 86400); my $hours = pull_count($seconds, 3600); my $minutes = pull_count($seconds, 60); my $runtime; if ($days > 0) { $runtime = sprintf "%02iD %02ih %02imin %02is", $days, $hours, $minutes, $seconds; } elsif ($hours > 0) { $runtime = sprintf "%02ih %02imin %02is", $hours, $minutes, $seconds; } elsif ($minutes > 0) { $runtime = sprintf "%02imin %02is", $minutes, $seconds; } else { $runtime = sprintf "%02is", $seconds; } # and display it # if current user isn't running aMule if ( ! `ps --no-header -u $ENV{USER} | grep amule`) { IRC::command "/say $amulesigdata[10] is not running"; # Crash detection is implemented since v2-rc4, so XAS should be backwards compatible if ( grep(/^1./,$amulesigdata[13]) || $amulesigdata[13]=="2.0.0rc1" || $amulesigdata[13]=="2.0.0rc2" || $amulesigdata[13]=="2.0.0rc3" ) { IRC::command "/say aMule $amulesigdata[13] was closed after $runtime!" } elsif ( ! grep(/^00 /,$runtime)) { IRC::command "/say aMule $amulesigdata[13] crashed after $runtime!" } else { IRC::command "/say aMule $amulesigdata[13] was closed" }; IRC::command "/say Total download traffic: $tdl"; IRC::command "/say Total upload traffic: $tul" } # if aMule is running else { if ($amulesigdata[0]==0 && $amulesigdata[5]==0){ IRC::command "/say $amulesigdata[10] is not connected"; } else { IRC::command "/say $amulesigdata[10] is $amulestatus $amulextatus";} IRC::command "/say aMule $amulesigdata[13] is using $amulecpu% CPU, $amulemem MB of memory and it has been running for $runtime"; # we only display "number of cpus" when we have more then one if ($number_cpus > 1) { IRC::command "/say on $number_cpus x $cpu @ $mhz up $uptime" } else { IRC::command "/say on $cpu @ $mhz MHz up $uptime" }; IRC::command "/say Sharing $amulesigdata[9] files with $amulesigdata[8] clients in queue"; IRC::command "/say Total download traffic: $tdl, total upload traffic: $tul, Total Ratio: $totalratio"; IRC::command "/say Session download traffic: $sdl, session upload traffic: $sul, Session Ratio: $sessionratio"; IRC::command "/say Current DL speed: $amulesigdata[6] KB/s, current UL speed: $amulesigdata[7] KB/s" }; return 1; # that's it } # usage: $count = pull_count(seconds, amount) # remove from seconds the amount quantity, altering caller's version. # return the integral number of those amounts so removed. sub pull_count { my($answer) = int($_[0] / $_[1]); $_[0] -= $answer * $_[1]; return $answer; } sub calc_ratio { my $ratiomethod = 1; # total download traffic in bytes my $dl = $_[0]; # total upload traffic in bytes my $ul = $_[1]; my $ratiodown = 0; my $ratioup = 0; # calculate ratio if ($ul > 0) { # we don't want 'division by zero'-error $ratiodown = ($dl/$ul); $ratioup = 1; } if ($ratiodown == 0) { # we don't want 1:0 ratio's if down eq 0 $ratioup = 0; } elsif ($ratiodown < 0.5) { if ($ratiomethod == 1) { # Set down to 1, calculate up $ratioup = ($ul/$dl); $ratiodown = 1; } if ($ratiomethod == 2) { # Increase by 10 until greater than 0.5 while ($ratiodown < 0.5) { $ratiodown = $ratiodown * 10; $ratioup = $ratioup * 10; } } } $ratiodown = (sprintf("%0.1f",$ratiodown)); $ratioup = (sprintf("%0.1f",$ratioup)); return "$ratioup:$ratiodown"; } sub int_to_bytes { my($value) = int($_[0]); if ($value >= 1073741824) { $value = (sprintf("%0.2f",$value/1073741824)); return "$value GiB"; } elsif ($value >= 1048576) { $value = (sprintf("%0.2f",$value/1048576)); return "$value MiB"; } elsif ($value >= 1024) { $value = (sprintf("%0.2f",$value/1024)); return "$value KiB"; } else { $value = (sprintf("%0.2f",$value)); return "$value B"; } } aMule-2.3.1/src/utils/xas/Makefile.in0000644000175000017470000006056611657306264016302 0ustar topiusers# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/utils/xas DIST_COMMON = $(dist_plugins_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/autostart-xas.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/GeoIP.m4 \ $(top_srcdir)/m4/build-tools.m4 $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/cryptopp.m4 $(top_srcdir)/m4/fallocate.m4 \ $(top_srcdir)/m4/gdlib.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/kde.m4 \ $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libpng.m4 $(top_srcdir)/m4/libupnp.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/m4/plasmamule.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/qt.m4 $(top_srcdir)/m4/readline.m4 \ $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/m4/zlib.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = autostart-xas CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pluginsdir)" SCRIPTS = $(bin_SCRIPTS) AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive DATA = $(dist_plugins_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALCC_MANPAGES = @ALCC_MANPAGES@ ALC_MANPAGES = @ALC_MANPAGES@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AMULECMD_MANPAGES = @AMULECMD_MANPAGES@ AMULEWEB_DEFS = @AMULEWEB_DEFS@ AMULE_DAEMON_MANPAGES = @AMULE_DAEMON_MANPAGES@ AMULE_GUI_MANPAGES = @AMULE_GUI_MANPAGES@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CPPFLAGS = @BFD_CPPFLAGS@ BFD_LIBS = @BFD_LIBS@ BUILD_CC = @BUILD_CC@ BUILD_CFLAGS = @BUILD_CFLAGS@ BUILD_CPPFLAGS = @BUILD_CPPFLAGS@ BUILD_EXEEXT = @BUILD_EXEEXT@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ BUILD_LDFLAGS = @BUILD_LDFLAGS@ CAS_DEFS = @CAS_DEFS@ CAS_MANPAGES = @CAS_MANPAGES@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CRYPTOPP_CPPFLAGS = @CRYPTOPP_CPPFLAGS@ CRYPTOPP_LDFLAGS = @CRYPTOPP_LDFLAGS@ CRYPTOPP_LIBS = @CRYPTOPP_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUGFLAG = @DEBUGFLAG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ ED2K_MANPAGES = @ED2K_MANPAGES@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GDLIB_CFLAGS = @GDLIB_CFLAGS@ GDLIB_CONFIG_PATH = @GDLIB_CONFIG_PATH@ GDLIB_LDFLAGS = @GDLIB_LDFLAGS@ GDLIB_LIBS = @GDLIB_LIBS@ GENCAT = @GENCAT@ GEOIP_CPPFLAGS = @GEOIP_CPPFLAGS@ GEOIP_LDFLAGS = @GEOIP_LDFLAGS@ GEOIP_LIBS = @GEOIP_LIBS@ GLIBC21 = @GLIBC21@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ KDE4_CONFIG = @KDE4_CONFIG@ KDE_APPLNK_PATH = @KDE_APPLNK_PATH@ KDE_HEADER_DIR = @KDE_HEADER_DIR@ KDE_ICON_PATH = @KDE_ICON_PATH@ KDE_MIME_PATH = @KDE_MIME_PATH@ KDE_MODULE_PATH = @KDE_MODULE_PATH@ KDE_SERVICE_PATH = @KDE_SERVICE_PATH@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ LIBPNG_CONFIG_PATH = @LIBPNG_CONFIG_PATH@ LIBPNG_LDFLAGS = @LIBPNG_LDFLAGS@ LIBPNG_LIBS = @LIBPNG_LIBS@ LIBS = @LIBS@ LIBUPNP_CFLAGS = @LIBUPNP_CFLAGS@ LIBUPNP_CPPFLAGS = @LIBUPNP_CPPFLAGS@ LIBUPNP_LDFLAGS = @LIBUPNP_LDFLAGS@ LIBUPNP_LIBS = @LIBUPNP_LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MONOLITHIC_MANPAGES = @MONOLITHIC_MANPAGES@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MULECFLAGS = @MULECFLAGS@ MULECPPFLAGS = @MULECPPFLAGS@ MULECXXFLAGS = @MULECXXFLAGS@ MULELDFLAGS = @MULELDFLAGS@ MULERCFLAGS = @MULERCFLAGS@ 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@ PKG_CONFIG = @PKG_CONFIG@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ QT_CORE_CXXFLAGS = @QT_CORE_CXXFLAGS@ QT_CORE_LIBS = @QT_CORE_LIBS@ QT_DBUS_LDFLAGS = @QT_DBUS_LDFLAGS@ QT_GUI_CXXFLAGS = @QT_GUI_CXXFLAGS@ QT_GUI_LIBS = @QT_GUI_LIBS@ QT_MOC = @QT_MOC@ RANLIB = @RANLIB@ RC = @RC@ RCFLAGS = @RCFLAGS@ READLINE_LIBS = @READLINE_LIBS@ RESOLV_LIB = @RESOLV_LIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SVNDATE = @SVNDATE@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WEBSERVER_MANPAGES = @WEBSERVER_MANPAGES@ WXBASE_CPPFLAGS = @WXBASE_CPPFLAGS@ WXBASE_LIBS = @WXBASE_LIBS@ WXCAS_MANPAGES = @WXCAS_MANPAGES@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION_FULL = @WX_VERSION_FULL@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ XGETTEXT = @XGETTEXT@ YACC = @YACC@ YFLAGS = @YFLAGS@ ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@ ZLIB_LDFLAGS = @ZLIB_LDFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_BUILD_CC = @ac_ct_BUILD_CC@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = docs dist_plugins_DATA = xas.pl pluginsdir = $(libdir)/xchat/plugins bin_SCRIPTS = autostart-xas EXTRA_DIST = autostart-xas.in MAINTAINERCLEANFILES = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/xas/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/xas/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): autostart-xas: $(top_builddir)/config.status $(srcdir)/autostart-xas.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ 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-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files install-dist_pluginsDATA: $(dist_plugins_DATA) @$(NORMAL_INSTALL) test -z "$(pluginsdir)" || $(MKDIR_P) "$(DESTDIR)$(pluginsdir)" @list='$(dist_plugins_DATA)'; test -n "$(pluginsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pluginsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pluginsdir)" || exit $$?; \ done uninstall-dist_pluginsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_plugins_DATA)'; test -n "$(pluginsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pluginsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pluginsdir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pluginsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -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-dist_pluginsDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binSCRIPTS 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 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: uninstall-binSCRIPTS uninstall-dist_pluginsDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binSCRIPTS install-data install-data-am \ install-dist_pluginsDATA 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-recursive \ uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-dist_pluginsDATA # 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: aMule-2.3.1/src/IP2Country.h0000644000175000017470000000461611575347521014423 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 Marcelo Roberto Jimenez ( phoenix@amule.org ) // Copyright (c) 2006-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // // // Country flags are from FAMFAMFAM (http://www.famfamfam.com) // // Flag icons - http://www.famfamfam.com // // These icons are public domain, and as such are free for any use (attribution appreciated but not required). // // Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. // A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 // // If you find these icons useful, please donate via paypal to mjames@gmail.com // (or click the donate button available at http://www.famfamfam.com/lab/icons/silk) // // Contact: mjames@gmail.com // #ifndef IP2COUNTRY_H #define IP2COUNTRY_H #include "Types.h" // Needed for uint8, uint16 and uint32 #include #include #include typedef struct { wxString Name; wxImage Flag; } CountryData; typedef std::map CountryDataMap; class CIP2Country { public: CIP2Country(const wxString& configDir); ~CIP2Country(); const CountryData& GetCountryData(const wxString& ip); void Enable(); void Disable(); void Update(); bool IsEnabled() { return m_geoip != NULL; } void DownloadFinished(uint32 result); private: struct GeoIPTag *m_geoip; CountryDataMap m_CountryDataMap; wxString m_DataBaseName; wxString m_DataBasePath; void LoadFlags(); }; #endif // IP2COUNTRY_H aMule-2.3.1/src/ExternalConn.h0000644000175000017470000001331411575347521015040 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 Kry ( elkry@users.sourceforge.net / http://www.amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2008-2011 Froenchenko Leonid (lfroen@gmail.com) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef EXTERNALCONN_H #define EXTERNALCONN_H #include #include "amuleIPV4Address.h" // for amuleIPV4Address #include "RLE.h" // for RLE #include "DownloadQueue.h" #include "PartFile.h" // for SourcenameItemMap class wxSocketServer; class wxSocketEvent; template class CTagSet : public std::set { void InSet(const CECTag *tag, uint32) { this->insert(tag->GetInt()); // don't remove this-> } void InSet(const CECTag *tag, const CMD4Hash&) { this->insert(tag->GetMD4Data()); // don't remove this-> } public: CTagSet(const CECPacket *request) : std::set() { for (CECPacket::const_iterator it = request->begin(); it != request->end(); it++) { const CECTag *tag = & *it; if ( tag->GetTagName() == OP ) { InSet(tag, T()); } } } }; class CObjTagMap { std::map m_obj_map; public: CValueMap &GetValueMap(uint32 ECID) { return m_obj_map[ECID]; } size_t size() { return m_obj_map.size(); } }; class CECServerSocket; class ECNotifier; class ExternalConn : public wxEvtHandler { private: typedef std::set SocketSet; SocketSet socket_list; public: ExternalConn(amuleIPV4Address addr, wxString *msg); ~ExternalConn(); wxSocketServer *m_ECServer; ECNotifier *m_ec_notifier; void AddSocket(CECServerSocket *s); void RemoveSocket(CECServerSocket *s); void KillAllSockets(); void ResetAllLogs(); private: // event handlers (these functions should _not_ be virtual) void OnServerEvent(wxSocketEvent& event); DECLARE_EVENT_TABLE() }; class ECUpdateMsgSource { public: virtual ~ECUpdateMsgSource() { } virtual CECPacket *GetNextPacket() = 0; }; class ECPartFileMsgSource : public ECUpdateMsgSource { typedef struct { bool m_new; bool m_comment_changed; bool m_removed; bool m_finished; bool m_dirty; CPartFile *m_file; } PARTFILE_STATUS; std::map m_dirty_status; public: ECPartFileMsgSource(); void SetDirty(CPartFile *file); void SetNew(CPartFile *file); void SetCompleted(CPartFile *file); void SetRemoved(CPartFile *file); virtual CECPacket *GetNextPacket(); }; class ECKnownFileMsgSource : public ECUpdateMsgSource { typedef struct { bool m_new; bool m_comment_changed; bool m_removed; bool m_dirty; CKnownFile *m_file; } KNOWNFILE_STATUS; std::map m_dirty_status; public: ECKnownFileMsgSource(); void SetDirty(CKnownFile *file); void SetNew(CKnownFile *file); void SetRemoved(CKnownFile *file); virtual CECPacket *GetNextPacket(); }; class ECClientMsgSource : public ECUpdateMsgSource { public: virtual CECPacket *GetNextPacket(); }; class ECStatusMsgSource : public ECUpdateMsgSource { uint32 m_last_ed2k_status_sent; uint32 m_last_kad_status_sent; void *m_server; uint32 GetEd2kStatus(); uint32 GetKadStatus(); public: ECStatusMsgSource(); virtual CECPacket *GetNextPacket(); }; class ECSearchMsgSource : public ECUpdateMsgSource { typedef struct { bool m_new; bool m_child_dirty; bool m_dirty; CSearchFile *m_file; } SEARCHFILE_STATUS; std::map m_dirty_status; public: ECSearchMsgSource(); void SetDirty(CSearchFile *file); void SetChildDirty(CSearchFile *file); void FlushStatus(); virtual CECPacket *GetNextPacket(); }; class ECNotifier { // // designated priority for each type of update // enum EC_SOURCE_PRIO { EC_PARTFILE = 0, EC_SEARCH, EC_CLIENT, EC_STATUS, EC_KNOWN, EC_STATUS_LAST_PRIO }; //ECUpdateMsgSource *m_msg_source[EC_STATUS_LAST_PRIO]; std::map m_msg_source; void NextPacketToSocket(); CECPacket *GetNextPacket(ECUpdateMsgSource *msg_source_array[]); // Make class non assignable void operator=(const ECNotifier&); ECNotifier(const ECNotifier&); public: ECNotifier(); ~ECNotifier(); void Add_EC_Client(CECServerSocket *sock); void Remove_EC_Client(CECServerSocket *sock); CECPacket *GetNextPacket(CECServerSocket *sock); // // Interface to notification macros // void DownloadFile_SetDirty(CPartFile *file); void DownloadFile_RemoveFile(CPartFile *file); void DownloadFile_RemoveSource(CPartFile *file); void DownloadFile_AddFile(CPartFile *file); void DownloadFile_AddSource(CPartFile *file); void SharedFile_AddFile(CKnownFile *file); void SharedFile_RemoveFile(CKnownFile *file); void SharedFile_RemoveAllFiles(); }; #endif // EXTERNALCONN_H // File_checked_for_headers aMule-2.3.1/src/ClientCredits.cpp0000644000175000017470000001477211575347521015540 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ClientCredits.h" // Interface declarations #include #include "GetTickCount.h" // Needed for GetTickCount #include "Logger.h" // Needed for Add(Debug)LogLine CreditStruct::CreditStruct() : uploaded(0), downloaded(0), nLastSeen(0), nReserved3(0), nKeySize(0) { memset(abySecureIdent, 0, MAXPUBKEYSIZE); } CClientCredits::CClientCredits(CreditStruct* in_credits) { m_pCredits = in_credits; InitalizeIdent(); m_dwUnSecureWaitTime = 0; m_dwSecureWaitTime = 0; m_dwWaitTimeIP = 0; } CClientCredits::CClientCredits(const CMD4Hash& key) { m_pCredits = new CreditStruct(); m_pCredits->key = key; InitalizeIdent(); m_dwUnSecureWaitTime = ::GetTickCount(); m_dwSecureWaitTime = ::GetTickCount(); m_dwWaitTimeIP = 0; } CClientCredits::~CClientCredits() { delete m_pCredits; } void CClientCredits::AddDownloaded(uint32 bytes, uint32 dwForIP, bool cryptoavail) { switch (GetCurrentIdentState(dwForIP)) { case IS_IDFAILED: case IS_IDBADGUY: case IS_IDNEEDED: if (cryptoavail) { return; } break; case IS_NOTAVAILABLE: case IS_IDENTIFIED: break; } m_pCredits->downloaded += bytes; } void CClientCredits::AddUploaded(uint32 bytes, uint32 dwForIP, bool cryptoavail) { switch (GetCurrentIdentState(dwForIP)) { case IS_IDFAILED: case IS_IDBADGUY: case IS_IDNEEDED: if (cryptoavail) { return; } break; case IS_NOTAVAILABLE: case IS_IDENTIFIED: break; } m_pCredits->uploaded += bytes; } uint64 CClientCredits::GetUploadedTotal() const { return m_pCredits->uploaded; } uint64 CClientCredits::GetDownloadedTotal() const { return m_pCredits->downloaded; } float CClientCredits::GetScoreRatio(uint32 dwForIP, bool cryptoavail) { // check the client ident status switch (GetCurrentIdentState(dwForIP)) { case IS_IDFAILED: case IS_IDBADGUY: case IS_IDNEEDED: if (cryptoavail) { // bad guy - no credits for you return 1.0f; } break; case IS_NOTAVAILABLE: case IS_IDENTIFIED: break; } if (GetDownloadedTotal() < 1000000) { return 1.0f; } float result = 0.0f; if (!GetUploadedTotal()) { result = 10.0f; } else { result = (GetDownloadedTotal() * 2.0f) / GetUploadedTotal(); } float result2 = sqrt((GetDownloadedTotal() / 1048576.0) + 2.0f); if (result > result2) { result = result2; } if (result < 1.0f) { return 1.0f; } else if (result > 10.0f) { return 10.0f; } return result; } void CClientCredits::SetLastSeen() { m_pCredits->nLastSeen = time(NULL); } void CClientCredits::InitalizeIdent() { if (m_pCredits->nKeySize == 0 ){ memset(m_abyPublicKey,0,80); // for debugging m_nPublicKeyLen = 0; m_identState = IS_NOTAVAILABLE; } else{ m_nPublicKeyLen = m_pCredits->nKeySize; memcpy(m_abyPublicKey, m_pCredits->abySecureIdent, m_nPublicKeyLen); m_identState = IS_IDNEEDED; } m_dwCryptRndChallengeFor = 0; m_dwCryptRndChallengeFrom = 0; m_dwIdentIP = 0; } void CClientCredits::Verified(uint32 dwForIP) { m_dwIdentIP = dwForIP; // client was verified, copy the keyto store him if not done already if (m_pCredits->nKeySize == 0){ m_pCredits->nKeySize = m_nPublicKeyLen; memcpy(m_pCredits->abySecureIdent, m_abyPublicKey, m_nPublicKeyLen); if (GetDownloadedTotal() > 0){ // for security reason, we have to delete all prior credits here // in order to save this client, set 1 byte m_pCredits->downloaded = 1; m_pCredits->uploaded = 1; AddDebugLogLineN( logCredits, wxT("Credits deleted due to new SecureIdent") ); } } m_identState = IS_IDENTIFIED; } bool CClientCredits::SetSecureIdent(const byte* pachIdent, uint8 nIdentLen) { // verified Public key cannot change, use only if there is not public key yet if (MAXPUBKEYSIZE < nIdentLen || m_pCredits->nKeySize != 0 ) { return false; } memcpy(m_abyPublicKey,pachIdent, nIdentLen); m_nPublicKeyLen = nIdentLen; m_identState = IS_IDNEEDED; return true; } EIdentState CClientCredits::GetCurrentIdentState(uint32 dwForIP) const { if (m_identState != IS_IDENTIFIED) return m_identState; else{ if (dwForIP == m_dwIdentIP) return IS_IDENTIFIED; else return IS_IDBADGUY; // mod note: clients which just reconnected after an IP change and have to ident yet will also have this state for 1-2 seconds // so don't try to spam such clients with "bad guy" messages (besides: spam messages are always bad) } } uint32 CClientCredits::GetSecureWaitStartTime(uint32 dwForIP) { if (m_dwUnSecureWaitTime == 0 || m_dwSecureWaitTime == 0) SetSecWaitStartTime(dwForIP); if (m_pCredits->nKeySize != 0){ // this client is a SecureHash Client if (GetCurrentIdentState(dwForIP) == IS_IDENTIFIED){ // good boy return m_dwSecureWaitTime; } else{ // not so good boy if (dwForIP == m_dwWaitTimeIP){ return m_dwUnSecureWaitTime; } else{ // bad boy // this can also happen if the client has not identified himself yet, but will do later - so maybe he is not a bad boy :) . m_dwUnSecureWaitTime = ::GetTickCount(); m_dwWaitTimeIP = dwForIP; return m_dwUnSecureWaitTime; } } } else{ // not a SecureHash Client - handle it like before for now (no security checks) return m_dwUnSecureWaitTime; } } void CClientCredits::SetSecWaitStartTime(uint32 dwForIP) { m_dwUnSecureWaitTime = ::GetTickCount()-1; m_dwSecureWaitTime = ::GetTickCount()-1; m_dwWaitTimeIP = dwForIP; } void CClientCredits::ClearWaitStartTime() { m_dwUnSecureWaitTime = 0; m_dwSecureWaitTime = 0; } // File_checked_for_headers aMule-2.3.1/src/ClientList.cpp0000644000175000017470000011131611575347521015046 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ClientList.h" // Interface declarations. #include #include #include #include #include #include "amule.h" // Needed for theApp #include "ClientTCPSocket.h" // Needed for CClientTCPSocket #include "DownloadQueue.h" // Needed for CDownloadQueue #include "UploadQueue.h" // Needed for CUploadQueue #include "IPFilter.h" // Needed for CIPFIlter #include "updownclient.h" // Needed for CUpDownClient #include "Preferences.h" // Needed for thePrefs #include "Statistics.h" // Needed for theStats #include "Logger.h" #include "GuiEvents.h" // Needed for Notify_* #include "Packet.h" #include #include "kademlia/kademlia/Search.h" #include "kademlia/kademlia/SearchManager.h" #include "kademlia/kademlia/UDPFirewallTester.h" #include "kademlia/net/KademliaUDPListener.h" #include "kademlia/routing/Contact.h" /** * CDeletedClient Class * * This class / list is a bit overkill, but currently needed to avoid any * exploit possibility. It will keep track of certain clients attributes * for 2 hours, while the CUpDownClient object might be deleted already. * Currently saves: IP, Port, UserHash. */ class CDeletedClient { public: CDeletedClient(CUpDownClient* pClient) { m_dwInserted = ::GetTickCount(); PortAndHash porthash = { pClient->GetUserPort(), pClient->GetCreditsHash()}; m_ItemsList.push_back(porthash); } struct PortAndHash { uint16 nPort; void* pHash; }; typedef std::list PaHList; PaHList m_ItemsList; uint32 m_dwInserted; }; CClientList::CClientList() : m_deadSources( true ) { m_dwLastBannCleanUp = 0; m_dwLastTrackedCleanUp = 0; m_dwLastClientCleanUp = 0; m_nBuddyStatus = Disconnected; } CClientList::~CClientList() { DeleteContents(m_trackedClientsList); wxASSERT(m_clientList.empty()); } void CClientList::AddClient( CUpDownClient* toadd ) { // Ensure that only new clients can be added to the list if ( toadd->GetClientState() == CS_NEW ) { // Update the client-state toadd->m_clientState = CS_LISTED; //Notify_ClientCtrlAddClient( toadd ); // We always add the ID/ptr pair, regardles of the actual ID value m_clientList.insert( IDMapPair( toadd->GetUserIDHybrid(), CCLIENTREF(toadd, wxT("CClientList::AddClient m_clientList.insert"))) ); // We only add the IP if it is valid if ( toadd->GetIP() ) { m_ipList.insert( IDMapPair( toadd->GetIP(), CCLIENTREF(toadd, wxT("CClientList::AddClient m_ipList.insert")) ) ); } // We only add the hash if it is valid if ( toadd->HasValidHash() ) { m_hashList.insert( HashMapPair( toadd->GetUserHash(), CCLIENTREF(toadd, wxT("CClientList::AddClient m_hashList.insert")) ) ); } toadd->UpdateStats(); } } void CClientList::RemoveClient(CUpDownClient* client) { RemoveFromKadList( client ); RemoveDirectCallback( client ); if ( RemoveIDFromList( client ) ) { // Also remove the ip and hash entries RemoveIPFromList( client ); RemoveHashFromList( client ); } } void CClientList::UpdateClientID( CUpDownClient* client, uint32 newID ) { // Sanity check if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetUserIDHybrid() == newID ) ) return; // First remove the ID entry RemoveIDFromList( client ); // Add the new entry m_clientList.insert( IDMapPair( newID, CCLIENTREF(client, wxT("CClientList::UpdateClientID")) ) ); } void CClientList::UpdateClientIP( CUpDownClient* client, uint32 newIP ) { // Sanity check if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetIP() == newIP ) ) return; // Remove the old IP entry RemoveIPFromList( client ); if ( newIP ) { m_ipList.insert( IDMapPair( newIP, CCLIENTREF(client, wxT("CClientList::UpdateClientIP")) ) ); } } void CClientList::UpdateClientHash( CUpDownClient* client, const CMD4Hash& newHash ) { // Sanity check if ( ( client->GetClientState() != CS_LISTED ) || ( client->GetUserHash() == newHash ) ) return; // Remove the old entry RemoveHashFromList( client ); // And add the new one if valid if ( !newHash.IsEmpty() ) { m_hashList.insert( HashMapPair( newHash, CCLIENTREF(client, wxT("CClientList::UpdateClientHash")) ) ); } } bool CClientList::RemoveIDFromList( CUpDownClient* client ) { bool result = false; // First remove the ID entry std::pair range = m_clientList.equal_range( client->GetUserIDHybrid() ); for ( ; range.first != range.second; ++range.first ) { if ( client == range.first->second.GetClient() ) { /* erase() will invalidate the iterator, but we're not using it anymore anyway (notice the break;) */ m_clientList.erase( range.first ); result = true; break; } } return result; } void CClientList::RemoveIPFromList( CUpDownClient* client ) { // Check if we need to look for the IP entry if ( !client->GetIP() ) { return; } // Remove the IP entry std::pair range = m_ipList.equal_range( client->GetIP() ); for ( ; range.first != range.second; ++range.first ) { if ( client == range.first->second.GetClient() ) { /* erase() will invalidate the iterator, but we're not using it anymore anyway (notice the break;) */ m_ipList.erase( range.first ); break; } } } void CClientList::RemoveHashFromList( CUpDownClient* client ) { // Nothing to remove if ( !client->HasValidHash() ) { return; } // Find all items with the specified hash std::pair range = m_hashList.equal_range( client->GetUserHash() ); for ( ; range.first != range.second; ++range.first ) { if ( client == range.first->second.GetClient() ) { /* erase() will invalidate the iterator, but we're not using it anymore anyway (notice the break;) */ m_hashList.erase( range.first ); break; } } } CUpDownClient* CClientList::FindMatchingClient( CUpDownClient* client ) { typedef std::pair IDMapIteratorPair; wxCHECK(client, NULL); const uint32 userIP = client->GetIP(); const uint32 userID = client->GetUserIDHybrid(); const uint16 userPort = client->GetUserPort(); const uint16 userKadPort = client->GetKadPort(); // LowID clients need a different set of checks if (client->HasLowID()) { // User is firewalled ... Must do two checks. if (userIP && (userPort || userKadPort)) { IDMapIteratorPair range = m_ipList.equal_range(userIP); for ( ; range.first != range.second; ++range.first ) { CUpDownClient* other = range.first->second.GetClient(); wxASSERT(userIP == other->GetIP()); if (userPort && (userPort == other->GetUserPort())) { return other; } else if (userKadPort && (userKadPort == other->GetKadPort())) { return other; } } } const uint32 serverIP = client->GetServerIP(); const uint32 serverPort = client->GetServerPort(); if (userID && serverIP && serverPort) { IDMapIteratorPair range = m_clientList.equal_range(userID); for (; range.first != range.second; ++range.first) { CUpDownClient* other = range.first->second.GetClient(); wxASSERT(userID == other->GetUserIDHybrid()); // For lowid, we also have to check the server if (serverIP == other->GetServerIP()) { if (serverPort == other->GetServerPort()) { return other; } } } } } else if (userPort || userKadPort) { // Check by IP first, then by ID struct { const IDMap& map; uint32 value; } toCheck[] = { { m_ipList, userIP }, { m_clientList, userID } }; for (size_t i = 0; i < itemsof(toCheck); ++i) { if (toCheck[i].value == 0) { // We may not have both (or any) of these values. continue; } IDMapIteratorPair range = toCheck[i].map.equal_range(toCheck[i].value); if (userPort) { IDMap::const_iterator it = range.first; for (; it != range.second; ++it) { if (userPort == it->second.GetUserPort()) { return it->second.GetClient(); } } } if (userKadPort) { IDMap::const_iterator it = range.first; for (; it != range.second; ++it) { if (userKadPort == it->second.GetClient()->GetKadPort()) { return it->second.GetClient(); } } } } } // If anything else fails, then we look at hashes if ( client->HasValidHash() ) { // Find all items with the specified hash std::pair range = m_hashList.equal_range( client->GetUserHash() ); // Just return the first item if any if ( range.first != range.second ) { return range.first->second.GetClient(); } } // Nothing found, must be a new client return NULL; } uint32 CClientList::GetClientCount() const { return m_clientList.size(); } void CClientList::DeleteAll() { m_ipList.clear(); m_hashList.clear(); while ( !m_clientList.empty() ) { IDMap::iterator it = m_clientList.begin(); // Will call the removal of the item on this same class it->second.GetClient()->Disconnected(wxT("Removed while deleting all from ClientList.")); it->second.GetClient()->Safe_Delete(); } } bool CClientList::AttachToAlreadyKnown(CUpDownClient** client, CClientTCPSocket* sender) { CUpDownClient* tocheck = (*client); CUpDownClient* found_client = FindMatchingClient( tocheck ); if ( tocheck == found_client ) { // We found the same client instance (client may have sent more than one OP_HELLO). do not delete that client! return true; } if (found_client != NULL){ if (sender) { if (found_client->GetSocket()) { if (found_client->IsConnected() && (found_client->GetIP() != tocheck->GetIP() || found_client->GetUserPort() != tocheck->GetUserPort() ) ) { // if found_client is connected and has the IS_IDENTIFIED, it's safe to say that the other one is a bad guy if (found_client->IsIdentified()){ AddDebugLogLineN(logClient, wxT("Client: ") + tocheck->GetUserName() + wxT("(") + tocheck->GetFullIP() + wxT("), Banreason: Userhash invalid")); tocheck->Ban(); return false; } AddDebugLogLineN(logClient, wxT("WARNING! Found matching client, to a currently connected client: ") + tocheck->GetUserName() + wxT("(") + tocheck->GetFullIP() + wxT(") and ") + found_client->GetUserName() + wxT("(") + found_client->GetFullIP() + wxT(")")); return false; } found_client->GetSocket()->Safe_Delete(); } found_client->SetSocket( sender ); tocheck->SetSocket( NULL ); } *client = 0; tocheck->Safe_Delete(); *client = found_client; return true; } return false; } CUpDownClient* CClientList::FindClientByIP( uint32 clientip, uint16 port ) { // Find all items with the specified ip std::pair range = m_ipList.equal_range( clientip ); for ( ; range.first != range.second; ++range.first ) { CUpDownClient* cur_client = range.first->second.GetClient(); // Check if it's actually the client we want if ( cur_client->GetUserPort() == port ) { return cur_client; } } return NULL; } CUpDownClient* CClientList::FindClientByIP( uint32 clientip ) { // Find all items with the specified ip std::pair range = m_ipList.equal_range( clientip ); return (range.first != range.second) ? range.first->second.GetClient() : NULL; } CUpDownClient* CClientList::FindClientByECID(uint32 ecid) const { for (IDMap::const_iterator it = m_clientList.begin(); it != m_clientList.end(); it++) { if (it->second.ECID() == ecid) { return it->second.GetClient(); } } return NULL; } bool CClientList::IsIPAlreadyKnown(uint32_t ip) { // Find all items with the specified ip std::pair range = m_ipList.equal_range(ip); return range.first != range.second; } bool CClientList::ComparePriorUserhash(uint32 dwIP, uint16 nPort, void* pNewHash) { std::map::iterator it = m_trackedClientsList.find( dwIP ); if ( it != m_trackedClientsList.end() ) { CDeletedClient* pResult = it->second; CDeletedClient::PaHList::iterator it2 = pResult->m_ItemsList.begin(); for ( ; it2 != pResult->m_ItemsList.end(); ++it2 ) { if ( it2->nPort == nPort ) { if ( it2->pHash != pNewHash) { return false; } else { break; } } } } return true; } void CClientList::AddTrackClient(CUpDownClient* toadd) { std::map::iterator it = m_trackedClientsList.find( toadd->GetIP() ); if ( it != m_trackedClientsList.end() ) { CDeletedClient* pResult = it->second; pResult->m_dwInserted = ::GetTickCount(); CDeletedClient::PaHList::iterator it2 = pResult->m_ItemsList.begin(); for ( ; it2 != pResult->m_ItemsList.end(); ++it2 ) { if ( it2->nPort == toadd->GetUserPort() ) { // already tracked, update it2->pHash = toadd->GetCreditsHash(); return; } } // New client for that IP, add an entry CDeletedClient::PortAndHash porthash = { toadd->GetUserPort(), toadd->GetCreditsHash()}; pResult->m_ItemsList.push_back(porthash); } else { m_trackedClientsList[ toadd->GetIP() ] = new CDeletedClient(toadd); } } uint16 CClientList::GetClientsFromIP(uint32 dwIP) { std::map::iterator it = m_trackedClientsList.find( dwIP ); if ( it != m_trackedClientsList.end() ) { return it->second->m_ItemsList.size(); } else { return 0; } } void CClientList::Process() { const uint32 cur_tick = ::GetTickCount(); if (m_dwLastBannCleanUp + BAN_CLEANUP_TIME < cur_tick) { m_dwLastBannCleanUp = cur_tick; ClientMap::iterator it = m_bannedList.begin(); while ( it != m_bannedList.end() ) { if ( it->second + CLIENTBANTIME < cur_tick ) { ClientMap::iterator tmp = it++; m_bannedList.erase( tmp ); theStats::RemoveBannedClient(); } else { ++it; } } } if ( m_dwLastTrackedCleanUp + TRACKED_CLEANUP_TIME < cur_tick ) { m_dwLastTrackedCleanUp = cur_tick; std::map::iterator it = m_trackedClientsList.begin(); while ( it != m_trackedClientsList.end() ) { std::map::iterator cur_src = it++; if ( cur_src->second->m_dwInserted + KEEPTRACK_TIME < cur_tick ) { delete cur_src->second; m_trackedClientsList.erase( cur_src ); } } } //We need to try to connect to the clients in m_KadList //If connected, remove them from the list and send a message back to Kad so we can send a ACK. //If we don't connect, we need to remove the client.. //The sockets timeout should delete this object. // buddy is just a flag that is used to make sure we are still connected or connecting to a buddy. buddyState buddy = Disconnected; CClientRefSet::iterator current_it = m_KadSources.begin(); while (current_it != m_KadSources.end()) { CUpDownClient* cur_client = current_it->GetClient(); ++current_it; // Won't be used anymore till while loop if( !Kademlia::CKademlia::IsRunning() ) { //Clear out this list if we stop running Kad. //Setting the Kad state to KS_NONE causes it to be removed in the switch below. cur_client->SetKadState(KS_NONE); } switch (cur_client->GetKadState()) { case KS_QUEUED_FWCHECK: case KS_QUEUED_FWCHECK_UDP: //Another client asked us to try to connect to them to check their firewalled status. cur_client->TryToConnect(true); break; case KS_CONNECTING_FWCHECK: //Ignore this state as we are just waiting for results. break; case KS_FWCHECK_UDP: case KS_CONNECTING_FWCHECK_UDP: // We want a UDP firewallcheck from this client and are just waiting to get connected to send the request break; case KS_CONNECTED_FWCHECK: //We successfully connected to the client. //We now send a ack to let them know. if (cur_client->GetKadVersion() >= 7) { // The result is now sent per TCP instead of UDP, because this will fail if our intern port is unreachable. // But we want the TCP testresult regardless if UDP is firewalled, the new UDP state and test takes care of the rest wxASSERT(cur_client->IsConnected()); AddDebugLogLineN(logLocalClient, wxT("Local Client: OP_KAD_FWTCPCHECK_ACK to ") + Uint32toStringIP(cur_client->GetIP())); CPacket *packet = new CPacket(OP_KAD_FWTCPCHECK_ACK, 0, OP_EMULEPROT); cur_client->SafeSendPacket(packet); } else { AddDebugLogLineN(logClientKadUDP, wxT("KadFirewalledAckRes to ") + Uint32_16toStringIP_Port(cur_client->GetIP(), cur_client->GetKadPort())); Kademlia::CKademlia::GetUDPListener()->SendNullPacket(KADEMLIA_FIREWALLED_ACK_RES, wxUINT32_SWAP_ALWAYS(cur_client->GetIP()), cur_client->GetKadPort(), 0, NULL); } //We are done with this client. Set Kad status to KS_NONE and it will be removed in the next cycle. cur_client->SetKadState(KS_NONE); break; case KS_INCOMING_BUDDY: //A firewalled client wants us to be his buddy. //If we already have a buddy, we set Kad state to KS_NONE and it's removed in the next cycle. //If not, this client will change to KS_CONNECTED_BUDDY when it connects. if( m_nBuddyStatus == Connected ) { cur_client->SetKadState(KS_NONE); } break; case KS_QUEUED_BUDDY: //We are firewalled and want to request this client to be a buddy. //But first we check to make sure we are not already trying another client. //If we are not already trying. We try to connect to this client. //If we are already connected to a buddy, we set this client to KS_NONE and it's removed next cycle. //If we are trying to connect to a buddy, we just ignore as the one we are trying may fail and we can then try this one. if( m_nBuddyStatus == Disconnected ) { buddy = Connecting; m_nBuddyStatus = Connecting; cur_client->SetKadState(KS_CONNECTING_BUDDY); cur_client->TryToConnect(true); Notify_ServerUpdateED2KInfo(); } else { if( m_nBuddyStatus == Connected ) { cur_client->SetKadState(KS_NONE); } } break; case KS_CONNECTING_BUDDY: //We are trying to connect to this client. //Although it should NOT happen, we make sure we are not already connected to a buddy. //If we are we set to KS_NONE and it's removed next cycle. //But if we are not already connected, make sure we set the flag to connecting so we know //things are working correctly. if( m_nBuddyStatus == Connected ) { cur_client->SetKadState(KS_NONE); } else { wxASSERT( m_nBuddyStatus == Connecting ); buddy = Connecting; } break; case KS_CONNECTED_BUDDY: //A potential connected buddy client wanting to me in the Kad network //We set our flag to connected to make sure things are still working correctly. buddy = Connected; //If m_nBuddyStatus is not connected already, we set this client as our buddy! if( m_nBuddyStatus != Connected ) { m_pBuddy.Link(cur_client CLIENT_DEBUGSTRING("CClientList::Process KS_CONNECTED_BUDDY m_pBuddy.Link")); m_nBuddyStatus = Connected; Notify_ServerUpdateED2KInfo(); } if( m_pBuddy.GetClient() == cur_client && theApp->IsFirewalled() && cur_client->SendBuddyPingPong() ) { cur_client->SendBuddyPing(); } break; default: RemoveFromKadList(cur_client); } } //We either never had a buddy, or lost our buddy.. if( buddy == Disconnected ) { if( m_nBuddyStatus != Disconnected || m_pBuddy.IsLinked() ) { if( Kademlia::CKademlia::IsRunning() && theApp->IsFirewalled() && Kademlia::CUDPFirewallTester::IsFirewalledUDP(true) ) { //We are a lowID client and we just lost our buddy. //Go ahead and instantly try to find a new buddy. Kademlia::CKademlia::GetPrefs()->SetFindBuddy(); } m_pBuddy.Unlink(); m_nBuddyStatus = Disconnected; Notify_ServerUpdateED2KInfo(); } } if ( Kademlia::CKademlia::IsConnected() ) { // we only need a buddy if direct callback is not available if(Kademlia::CKademlia::IsFirewalled() && Kademlia::CUDPFirewallTester::IsFirewalledUDP(true)) { // TODO: Kad buddies won't work with RequireCrypt, so it is disabled for now, but should (and will) // be fixed in later version // Update: buddy connections themselves support obfuscation properly since eMule 0.49a and aMule SVN 2008-05-09 // (this makes it work fine if our buddy uses require crypt), however callback requests don't support it yet so we // wouldn't be able to answer callback requests with RequireCrypt, protocolchange intended for eMule 0.49b if(m_nBuddyStatus == Disconnected && Kademlia::CKademlia::GetPrefs()->GetFindBuddy() && !thePrefs::IsClientCryptLayerRequired()) { AddDebugLogLineN(logKadMain, wxT("Starting BuddySearch")); //We are a firewalled client with no buddy. We have also waited a set time //to try to avoid a false firewalled status.. So lets look for a buddy.. if (!Kademlia::CSearchManager::PrepareLookup(Kademlia::CSearch::FINDBUDDY, true, Kademlia::CUInt128(true).XOR(Kademlia::CKademlia::GetPrefs()->GetKadID()))) { //This search ID was already going. Most likely reason is that //we found and lost our buddy very quickly and the last search hadn't //had time to be removed yet. Go ahead and set this to happen again //next time around. Kademlia::CKademlia::GetPrefs()->SetFindBuddy(); } } } else { if (m_pBuddy.IsLinked()) { //Lets make sure that if we have a buddy, they are firewalled! //If they are also not firewalled, then someone must have fixed their firewall or stopped saturating their line.. //We just set the state of this buddy to KS_NONE and things will be cleared up with the next cycle. if( !m_pBuddy.HasLowID() ) { m_pBuddy.GetClient()->SetKadState(KS_NONE); } } } } else { if (m_pBuddy.IsLinked()) { //We are not connected anymore. Just set this buddy to KS_NONE and things will be cleared out on next cycle. m_pBuddy.GetClient()->SetKadState(KS_NONE); } } CleanUpClientList(); ProcessDirectCallbackList(); } void CClientList::AddBannedClient(uint32 dwIP) { m_bannedList[dwIP] = ::GetTickCount(); theStats::AddBannedClient(); } bool CClientList::IsBannedClient(uint32 dwIP) { ClientMap::iterator it = m_bannedList.find( dwIP ); if ( it != m_bannedList.end() ) { if ( it->second + CLIENTBANTIME > ::GetTickCount() ) { return true; } else { RemoveBannedClient(dwIP); } } return false; } void CClientList::RemoveBannedClient(uint32 dwIP) { m_bannedList.erase(dwIP); theStats::RemoveBannedClient(); } void CClientList::FilterQueues() { // Filter client list for ( IDMap::iterator it = m_ipList.begin(); it != m_ipList.end(); ) { IDMap::iterator tmp = it++; // Don't change this to a ++it! CUpDownClient* client = tmp->second.GetClient(); if ( theApp->ipfilter->IsFiltered(client->GetConnectIP())) { client->Disconnected(wxT("Filtered by IPFilter")); client->Safe_Delete(); } } } CClientList::SourceList CClientList::GetClientsByHash( const CMD4Hash& hash ) { SourceList results; // Find all items with the specified hash std::pair range = m_hashList.equal_range( hash ); for ( ; range.first != range.second; ++range.first) { results.push_back( range.first->second ); } return results; } CClientList::SourceList CClientList::GetClientsByIP( unsigned long ip ) { SourceList results; // Find all items with the specified hash std::pair range = m_ipList.equal_range( ip ); for ( ; range.first != range.second; range.first++ ) { results.push_back( range.first->second ); } return results; } const CClientList::IDMap& CClientList::GetClientList() { return m_clientList; } void CClientList::AddDeadSource(const CUpDownClient* client) { m_deadSources.AddDeadSource( client ); } bool CClientList::IsDeadSource(const CUpDownClient* client) { return m_deadSources.IsDeadSource( client ); } bool CClientList::SendChatMessage(uint64 client_id, const wxString& message) { CUpDownClient* client = FindClientByIP(IP_FROM_GUI_ID(client_id), PORT_FROM_GUI_ID(client_id)); AddDebugLogLineN( logClient, wxT("Trying to Send Message.") ); if (client) { AddDebugLogLineN( logClient, wxT("Sending.") ); } else { AddDebugLogLineC( logClient, CFormat( wxT("No client (GUI_ID %lli [%s:%llu]) found in CClientList::SendChatMessage(). Creating") ) % client_id % Uint32toStringIP(IP_FROM_GUI_ID(client_id)) % PORT_FROM_GUI_ID(client_id) ); client = new CUpDownClient(PORT_FROM_GUI_ID(client_id),IP_FROM_GUI_ID(client_id),0,0,NULL, true, true); AddClient(client); } return client->SendChatMessage(message); } void CClientList::SetChatState(uint64 client_id, uint8 state) { CUpDownClient* client = FindClientByIP(IP_FROM_GUI_ID(client_id), PORT_FROM_GUI_ID(client_id)); if (client) { client->SetChatState(state); } } /* Kad stuff */ bool CClientList::RequestTCP(Kademlia::CContact* contact, uint8_t connectOptions) { uint32_t nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); // don't connect ourself if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { return false; } CUpDownClient* pNewClient = FindClientByIP(nContactIP, contact->GetTCPPort()); if (!pNewClient) { //#warning Do we actually have to check friendstate here? pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true); } else if (pNewClient->GetKadState() != KS_NONE) { return false; // already busy with this client in some way (probably buddy stuff), don't mess with it } //Add client to the lists to be processed. pNewClient->SetKadPort(contact->GetUDPPort()); pNewClient->SetKadState(KS_QUEUED_FWCHECK); if (contact->GetClientID() != 0) { uint8_t ID[16]; contact->GetClientID().ToByteArray(ID); pNewClient->SetUserHash(CMD4Hash(ID)); pNewClient->SetConnectOptions(connectOptions, true, false); } AddToKadList(pNewClient); // This was a direct adding, but I like to check duplicates //This method checks if this is a dup already. AddClient(pNewClient); return true; } void CClientList::RequestBuddy(Kademlia::CContact* contact, uint8_t connectOptions) { uint32_t nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); // Don't connect to ourself if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { return; } CUpDownClient* pNewClient = FindClientByIP(nContactIP, contact->GetTCPPort()); if (!pNewClient) { pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true ); } else if (pNewClient->GetKadState() != KS_NONE) { return; // already busy with this client in some way (probably fw stuff), don't mess with it } else if (IsKadFirewallCheckIP(nContactIP)) { // doing a kad firewall check with this IP, abort AddDebugLogLineN(logKadMain, wxT("Kad TCP firewallcheck / Buddy request collision for IP ") + Uint32toStringIP(nContactIP)); return; } //Add client to the lists to be processed. pNewClient->SetKadPort(contact->GetUDPPort()); pNewClient->SetKadState(KS_QUEUED_BUDDY); uint8_t ID[16]; contact->GetClientID().ToByteArray(ID); pNewClient->SetUserHash(CMD4Hash(ID)); pNewClient->SetConnectOptions(connectOptions, true, false); AddToKadList(pNewClient); //This method checks if this is a dup already. AddClient(pNewClient); } bool CClientList::IncomingBuddy(Kademlia::CContact* contact, Kademlia::CUInt128* buddyID) { uint32_t nContactIP = wxUINT32_SWAP_ALWAYS(contact->GetIPAddress()); //If aMule already knows this client, abort this.. It could cause conflicts. //Although the odds of this happening is very small, it could still happen. if (FindClientByIP(nContactIP, contact->GetTCPPort())) { return false; } else if (IsKadFirewallCheckIP(nContactIP)) { // doing a kad firewall check with this IP, abort AddDebugLogLineN(logKadMain, wxT("Kad TCP firewallcheck / Buddy request collision for IP ") + Uint32toStringIP(nContactIP)); return false; } if (theApp->GetPublicIP() == nContactIP && thePrefs::GetPort() == contact->GetTCPPort()) { return false; // don't connect ourself } //Add client to the lists to be processed. CUpDownClient* pNewClient = new CUpDownClient(contact->GetTCPPort(), contact->GetIPAddress(), 0, 0, NULL, false, true ); pNewClient->SetKadPort(contact->GetUDPPort()); pNewClient->SetKadState(KS_INCOMING_BUDDY); byte ID[16]; contact->GetClientID().ToByteArray(ID); pNewClient->SetUserHash(CMD4Hash(ID)); buddyID->ToByteArray(ID); pNewClient->SetBuddyID(ID); AddToKadList(pNewClient); AddClient(pNewClient); return true; } void CClientList::RemoveFromKadList(CUpDownClient* torem) { wxCHECK_RET(torem, wxT("NULL pointer in RemoveFromKadList")); if (m_KadSources.erase(CCLIENTREF(torem, wxEmptyString))) { if (torem == m_pBuddy.GetClient()) { m_pBuddy.Unlink(); m_nBuddyStatus = Disconnected; Notify_ServerUpdateED2KInfo(); } } } void CClientList::AddToKadList(CUpDownClient* toadd) { wxCHECK_RET(toadd, wxT("NULL pointer in AddToKadList")); m_KadSources.insert(CCLIENTREF(toadd, wxT("CClientList::AddToKadList"))); // This will take care of duplicates. } bool CClientList::DoRequestFirewallCheckUDP(const Kademlia::CContact& contact) { // first make sure we don't know this IP already from somewhere if (IsIPAlreadyKnown(wxUINT32_SWAP_ALWAYS(contact.GetIPAddress()))) { return false; } // fine, just create the client object, set the state and wait // TODO: We don't know the client's userhash, this means we cannot build an obfuscated connection, which // again mean that the whole check won't work on "Require Obfuscation" setting, which is not a huge problem, // but certainly not nice. Only somewhat acceptable way to solve this is to use the KadID instead. CUpDownClient* pNewClient = new CUpDownClient(contact.GetTCPPort(), contact.GetIPAddress(), 0, 0, NULL, false, true); pNewClient->SetKadState(KS_QUEUED_FWCHECK_UDP); AddDebugLogLineN(logClient, wxT("Selected client for UDP Firewallcheck: ") + KadIPToString(contact.GetIPAddress())); AddToKadList(pNewClient); AddClient(pNewClient); wxASSERT(!pNewClient->SupportsDirectUDPCallback()); return true; } void CClientList::CleanUpClientList() { // We remove clients which are not needed any more by time // this check is also done on CUpDownClient::Disconnected, however it will not catch all // cases (if a client changes the state without beeing connected // // Adding this check directly to every point where any state changes would be more effective, // is however not compatible with the current code, because there are points where a client has // no state for some code lines and the code is also not prepared that a client object gets // invalid while working with it (aka setting a new state) // so this way is just the easy and safe one to go (as long as amule is basically single threaded) const uint32 cur_tick = ::GetTickCount(); if (m_dwLastClientCleanUp + CLIENTLIST_CLEANUP_TIME < cur_tick ){ m_dwLastClientCleanUp = cur_tick; DEBUG_ONLY( uint32 cDeleted = 0; ) IDMap::iterator current_it = m_clientList.begin(); while (current_it != m_clientList.end()) { CUpDownClient* pCurClient = current_it->second.GetClient(); ++current_it; // Won't be used till while loop again // Don't delete sources coming from source seeds for 10 mins, // to give them a chance to connect and become a useful source. if (pCurClient->GetSourceFrom() == SF_SOURCE_SEEDS && cur_tick - (uint32)theStats::GetStartTime() < MIN2MS(10)) continue; if ((pCurClient->GetUploadState() == US_NONE || (pCurClient->GetUploadState() == US_BANNED && !pCurClient->IsBanned())) && pCurClient->GetDownloadState() == DS_NONE && pCurClient->GetChatState() == MS_NONE && pCurClient->GetKadState() == KS_NONE && pCurClient->GetSocket() == NULL) { DEBUG_ONLY( cDeleted++; ) pCurClient->Disconnected(wxT("Removed during ClientList cleanup.")); pCurClient->Safe_Delete(); #ifdef __DEBUG__ } else { if (!(pCurClient->GetUploadState() == US_NONE || (pCurClient->GetUploadState() == US_BANNED && !pCurClient->IsBanned()))) { AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x with up state: %i ")) % (long int)pCurClient % pCurClient->GetUploadState()); } if (!(pCurClient->GetDownloadState() == DS_NONE)) { AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x with down state: %i ")) % (long int)pCurClient % pCurClient->GetDownloadState()); } if (!(pCurClient->GetChatState() == MS_NONE)) { AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x with chat state: %i ")) % (long int)pCurClient % pCurClient->GetChatState()); } if (!(pCurClient->GetKadState() == KS_NONE)) { AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x with kad state: %i ip: %s")) % (long int)pCurClient % (int)pCurClient->GetKadState() % pCurClient->GetFullIP()); } if (!(pCurClient->GetSocket() == NULL)) { AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x: has socket")) % (long int)pCurClient); } AddDebugLogLineN(logProxy, CFormat(wxT("Debug: Not deleted client %x with kad version: %i")) % (long int)pCurClient % pCurClient->GetKadVersion()); #endif } } AddDebugLogLineN(logClient, CFormat(wxT("Cleaned ClientList, removed %i not used known clients")) % cDeleted); } } void CClientList::AddKadFirewallRequest(uint32 ip) { uint32 ticks = ::GetTickCount(); IpAndTicks add = { ip, ticks }; m_firewallCheckRequests.push_front(add); while (!m_firewallCheckRequests.empty()) { if (ticks - m_firewallCheckRequests.back().inserted > SEC2MS(180)) { m_firewallCheckRequests.pop_back(); } else { break; } } } bool CClientList::IsKadFirewallCheckIP(uint32 ip) const { uint32 ticks = ::GetTickCount(); for (IpAndTicksList::const_iterator it = m_firewallCheckRequests.begin(); it != m_firewallCheckRequests.end(); ++it) { if (it->ip == ip && ticks - it->inserted < SEC2MS(180)) { return true; } } return false; } void CClientList::AddDirectCallbackClient(CUpDownClient* toAdd) { wxASSERT(toAdd->GetDirectCallbackTimeout() != 0); if (toAdd->HasBeenDeleted()) { return; } for (DirectCallbackList::const_iterator it = m_currentDirectCallbacks.begin(); it != m_currentDirectCallbacks.end(); ++it) { if (it->GetClient() == toAdd) { wxFAIL; // might happen very rarely on multiple connection tries, could be fixed in the client class, till then it's not much of a problem though return; } } m_currentDirectCallbacks.push_back(CCLIENTREF(toAdd, wxT("CClientList::AddDirectCallbackClient"))); } void CClientList::ProcessDirectCallbackList() { // we do check if any direct callbacks have timed out by now const uint32_t cur_tick = ::GetTickCount(); for (DirectCallbackList::iterator it = m_currentDirectCallbacks.begin(); it != m_currentDirectCallbacks.end();) { DirectCallbackList::iterator it2 = it++; CUpDownClient* curClient = it2->GetClient(); if (curClient->GetDirectCallbackTimeout() < cur_tick) { wxASSERT(curClient->GetDirectCallbackTimeout() != 0); // TODO LOGREMOVE //DebugLog(_T("DirectCallback timed out (%s)"), pCurClient->DbgGetClientInfo()); m_currentDirectCallbacks.erase(it2); if (curClient->Disconnected(wxT("Direct Callback Timeout"))) { curClient->Safe_Delete(); } } } } void CClientList::AddTrackCallbackRequests(uint32_t ip) { uint32_t now = ::GetTickCount(); IpAndTicks add = { ip, now }; m_directCallbackRequests.push_front(add); while (!m_directCallbackRequests.empty()) { if (now - m_directCallbackRequests.back().inserted > MIN2MS(3)) { m_directCallbackRequests.pop_back(); } else { break; } } } bool CClientList::AllowCallbackRequest(uint32_t ip) const { uint32_t now = ::GetTickCount(); for (IpAndTicksList::const_iterator it = m_directCallbackRequests.begin(); it != m_directCallbackRequests.end(); ++it) { if (it->ip == ip && now - it->inserted < MIN2MS(3)) { return false; } } return true; } uint32 CClientList::GetBuddyIP() { return GetBuddy()->GetIP(); } uint16 CClientList::GetBuddyPort() { return GetBuddy()->GetUDPPort(); } // File_checked_for_headers aMule-2.3.1/src/CaptchaGenerator.cpp0000644000175000017470000000637411575347521016215 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "CaptchaGenerator.h" #include "RandomFunctions.h" #include "MemFile.h" #include #include #include #define LETTERSIZE 32 #define CROWDEDSIZE 20 // fairly simply captcha generator, might be improved is spammers think its really worth it solving captchas on aMule CCaptchaGenerator::CCaptchaGenerator(uint32 nLetterCount) { ReGenerateCaptcha(nLetterCount); } void CCaptchaGenerator::ReGenerateCaptcha(uint32 nLetterCount) { static wxString schCaptchaContent = wxT("ABCDEFGHJKLMNPQRSTUVWXYZ123456789"); m_strCaptchaText.Clear(); // Bitmap must be created with full depth, or it will fail on GTK wxBitmap pimgResult(LETTERSIZE + (nLetterCount-1)*CROWDEDSIZE, 36); wxMemoryDC dc(pimgResult); dc.SetBackground(*wxWHITE_BRUSH); dc.Clear(); dc.SetTextForeground(*wxBLACK); dc.SetTextBackground(*wxWHITE); double lastrotate = 15.0; for (uint32 i = 0; i < nLetterCount; i++) { wxString strLetter(schCaptchaContent[GetRandomUint16() % schCaptchaContent.length()]); m_strCaptchaText += strLetter; uint16 nRandomSize = 30 - GetRandomUint16() % 12; wxFont font(nRandomSize, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD); dc.SetFont(font); uint16 nRandomOffset = 3 + GetRandomUint16() % 8; uint16 maxRotate = 50 - nRandomSize; // rotate small letters more than large letters double fRotate = (double)(maxRotate - (GetRandomUint16() % (maxRotate*2))); // limit angle diff - it causes too much overlap since wx rotates at the corner // (maybe I'll redo that with some coordinate transformation one day) if (fRotate - lastrotate > 20) { fRotate = lastrotate + 20; } else if (fRotate - lastrotate < -20) { fRotate = lastrotate - 20; } dc.DrawRotatedText(strLetter, nRandomOffset + i * CROWDEDSIZE, 0, fRotate); } m_pimgCaptcha = pimgResult.ConvertToImage(); // wx always saves as 24 bpp except when it gets this WELL DOCUMENTED option... m_pimgCaptcha.SetOption(wxIMAGE_OPTION_BMP_FORMAT, wxBMP_1BPP); // m_pimgCaptcha.SaveFile(wxT("captcha.bmp"), wxBITMAP_TYPE_BMP); } bool CCaptchaGenerator::WriteCaptchaImage(wxMemoryOutputStream& file) { return m_pimgCaptcha.SaveFile(file, wxBITMAP_TYPE_BMP); } aMule-2.3.1/src/ClientTCPSocket.h0000644000175000017470000000577511575347521015412 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // // // Handling incoming connections (up or downloadrequests) // #ifndef CLIENTTCPSOCKET_H #define CLIENTTCPSOCKET_H #include "EMSocket.h" // Needed for CEMSocket class CProxyData; //------------------------------------------------------------------------------ // CClientTCPSocket //------------------------------------------------------------------------------ class CUpDownClient; class CPacket; class CTimerWnd; class CClientTCPSocket : public CEMSocket { public: CClientTCPSocket(CUpDownClient* in_client = NULL, const CProxyData *ProxyData = NULL); virtual ~CClientTCPSocket(); void Disconnect(const wxString& strReason); bool InitNetworkData(); bool CheckTimeOut(); void Safe_Delete(); void Safe_Delete_Client(); bool ForDeletion() const { return m_ForDeletion; } void OnConnect(int nErrorCode); void OnSend(int nErrorCode); void OnReceive(int nErrorCode); void OnClose(int nErrorCode); void OnError(int nErrorCode); uint32 GetRemoteIP() const { return m_remoteip; } CUpDownClient* GetClient() { return m_client; } virtual void SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0); virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend); virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 overchargeMaxBytesToSend); protected: virtual bool PacketReceived(CPacket* packet); private: CUpDownClient* m_client; bool ProcessPacket(const byte* packet, uint32 size, uint8 opcode); bool ProcessExtPacket(const byte* packet, uint32 size, uint8 opcode); bool ProcessED2Kv2Packet(const byte* packet, uint32 size, uint8 opcode); void ResetTimeOutTimer(); void SetClient(CUpDownClient* client); bool m_ForDeletion; // 0.30c (Creteil), set as bool uint32 timeout_timer; uint32 m_remoteip; }; #endif // CLIENTTCPSOCKET_H // File_checked_for_headers aMule-2.3.1/src/UploadQueue.h0000644000175000017470000000700111646365642014670 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef UPLOADQUEUE_H #define UPLOADQUEUE_H #include "ClientRef.h" // Needed for CClientRefList #include "MD4Hash.h" // Needed for CMD4Hash // Experimental extended upload queue population // // When a client is set up from scratch (no shares, all downloads empty) // it takes a while after completion of the first downloaded chunks until // uploads start. Problem is, upload queue is empty, because clients that // find nothing to download don't stay queued. // // Set this to 1 for faster finding of upload slots in this case. // aMule will then try to contact its sources for uploading if the // upload queue is empty. #define EXTENDED_UPLOADQUEUE 0 class CUpDownClient; class CKnownFile; class CUploadQueue { public: CUploadQueue(); ~CUploadQueue(); void Process(); void AddClientToQueue(CUpDownClient* client); bool RemoveFromUploadQueue(CUpDownClient* client); bool RemoveFromWaitingQueue(CUpDownClient* client); bool IsOnUploadQueue(const CUpDownClient* client) const; bool IsDownloading(const CUpDownClient* client) const; bool CheckForTimeOver(CUpDownClient* client); void ResortQueue() { SortGetBestClient(); } const CClientRefList& GetWaitingList() const { return m_waitinglist; } const CClientRefList& GetUploadingList() const { return m_uploadinglist; } CUpDownClient* GetWaitingClientByIP_UDP(uint32 dwIP, uint16 nUDPPort, bool bIgnorePortOnUniqueIP, bool* pbMultipleIPs = NULL); uint16 SuspendUpload(const CMD4Hash &, bool terminate); void ResumeUpload(const CMD4Hash &); CKnownFile* GetAllUploadingKnownFile() { return m_allUploadingKnownFile; } private: void RemoveFromWaitingQueue(CClientRefList::iterator pos); uint16 GetMaxSlots() const; void AddUpNextClient(CUpDownClient* directadd = 0); bool IsSuspended(const CMD4Hash& hash) { return suspendedUploadsSet.find(hash) != suspendedUploadsSet.end(); } void SortGetBestClient(CClientRef * bestClient = NULL); CClientRefList m_waitinglist; CClientRefList m_uploadinglist; #if EXTENDED_UPLOADQUEUE CClientRefList m_possiblyWaitingList; int PopulatePossiblyWaitingList(); #endif std::set suspendedUploadsSet; // set for suspended uploads uint32 m_nLastStartUpload; uint32 m_lastSort; bool lastupslotHighID; // VQB lowID alternation bool m_allowKicking; // This KnownFile collects all currently uploading clients for display in the upload list control CKnownFile * m_allUploadingKnownFile; }; #endif // UPLOADQUEUE_H // File_checked_for_headers aMule-2.3.1/src/ServerConnect.cpp0000644000175000017470000004466611575347521015571 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ServerConnect.h" // Interface declarations. #include #include // Sometimes we reply with TCP packets. #include #include #include #include "SearchList.h" // Needed for CSearchList #include "ServerUDPSocket.h" // Needed for CServerUDPSocket #include "SharedFileList.h" // Needed for CSharedFileList #include "Packet.h" // Needed for CTag #include "MemFile.h" // Needed for CMemFile #include "ServerSocket.h" // Needed for CServerSocket #include "ListenSocket.h" // Needed for CListenSocket #include "Server.h" // Needed for CServer #include "amule.h" // Needed for theApp #include "ServerList.h" // Needed for CServerList #include "Preferences.h" // Needed for CPreferences #include "Statistics.h" // Needed for theStats #include "Logger.h" #include "GuiEvents.h" // Needed for Notify_* #include "IPFilter.h" // Needed for theApp->ipfilter->IsReady() #include //#define DEBUG_CLIENT_PROTOCOL void CServerConnect::TryAnotherConnectionrequest() { if (m_recurseTryAnotherConnectionrequest) { return; } if ( connectionattemps.size() < (unsigned)(( thePrefs::IsSafeServerConnectEnabled()) ? 1 : 2) ) { CServer* next_server = used_list->GetNextServer(m_bTryObfuscated); if ( thePrefs::AutoConnectStaticOnly() ) { while (next_server && !next_server->IsStaticMember()) { next_server = used_list->GetNextServer(m_bTryObfuscated); } } if (!next_server) { if ( connectionattemps.empty() ) { m_recurseTryAnotherConnectionrequest = true; if (m_bTryObfuscated && !thePrefs::IsClientCryptLayerRequired()){ AddLogLineC(_("Failed to connect to all obfuscated servers listed. Making another pass without obfuscation.")); // try all servers on the non-obfuscated port next m_bTryObfuscated = false; ConnectToAnyServer( false, true); } else { AddLogLineC(_("Failed to connect to all servers listed. Making another pass.")); ConnectToAnyServer( false ); } m_recurseTryAnotherConnectionrequest = false; } return; } ConnectToServer(next_server, true, !m_bTryObfuscated); } } void CServerConnect::ConnectToAnyServer(bool prioSort, bool bNoCrypt) { if (!thePrefs::GetNetworkED2K()){ AddLogLineC(_("eD2k network disabled on preferences, not connecting.")); return; } if (!theApp->ipfilter->IsReady()) { // do it later when ipfilter is up theApp->ipfilter->ConnectToAnyServerWhenReady(); return; } StopConnectionTry(); Disconnect(); connecting = true; singleconnecting = false; m_bTryObfuscated = thePrefs::IsServerCryptLayerTCPRequested() && !bNoCrypt; // Barry - Only auto-connect to static server option if (thePrefs::AutoConnectStaticOnly()) { bool anystatic = false; CServer *next_server; used_list->ResetServerPos(); while ((next_server = used_list->GetNextServer(false)) != NULL) { if (next_server->IsStaticMember()) { anystatic = true; break; } } if (!anystatic) { connecting = false; AddLogLineC(_("No valid servers to which to connect found in server list")); return; } } if ( thePrefs::Score() && prioSort ) { used_list->Sort(); } used_list->ResetServerPos(); if (used_list->GetServerCount()==0 ) { connecting = false; AddLogLineC(_("No valid servers to which to connect found in server list")); return; } theApp->listensocket->Process(); TryAnotherConnectionrequest(); } void CServerConnect::ConnectToServer(CServer* server, bool multiconnect, bool bNoCrypt) { if (!thePrefs::GetNetworkED2K()){ AddLogLineC(_("eD2k network disabled on preferences, not connecting.")); return; } if (!multiconnect) { StopConnectionTry(); Disconnect(); } connecting = true; singleconnecting = !multiconnect; CServerSocket* newsocket = new CServerSocket(this, thePrefs::GetProxyData()); m_lstOpenSockets.push_back(newsocket); newsocket->ConnectToServer(server, bNoCrypt); connectionattemps[GetTickCount()] = newsocket; } void CServerConnect::StopConnectionTry() { connectionattemps.clear(); connecting = false; singleconnecting = false; if (m_idRetryTimer.IsRunning()) { m_idRetryTimer.Stop(); } // close all currenty opened sockets except the one which is connected to our current server for(SocketsList::iterator it = m_lstOpenSockets.begin(); it != m_lstOpenSockets.end(); ) { CServerSocket *pSck = *it++; if (pSck == connectedsocket) // don't destroy socket which is connected to server continue; if (pSck->m_bIsDeleting == false) // don't destroy socket if it is going to destroy itself later on DestroySocket(pSck); } } void CServerConnect::ConnectionEstablished(CServerSocket* sender) { if (connecting == false) { // we are already connected to another server DestroySocket(sender); return; } if (sender->GetConnectionState() == CS_WAITFORLOGIN) { AddLogLineN(CFormat( _("Connected to %s (%s:%i)") ) % sender->cur_server->GetListName() % sender->cur_server->GetFullIP() % sender->cur_server->GetPort() ); //send loginpacket CServer* update = theApp->serverlist->GetServerByAddress( sender->cur_server->GetAddress(), sender->cur_server->GetPort() ); if (update){ update->ResetFailedCount(); Notify_ServerRefresh( update ); } CMemFile data(256); data.WriteHash(thePrefs::GetUserHash()); // Why pass an ID, if we are loggin in? data.WriteUInt32(GetClientID()); data.WriteUInt16(thePrefs::GetPort()); data.WriteUInt32(4); // tagcount // Kry - Server doesn't support VBT tags afaik. // Not to mention we don't know its flags yet CTagString tagname(CT_NAME,thePrefs::GetUserNick()); tagname.WriteTagToFile(&data); CTagInt32 tagversion(CT_VERSION,EDONKEYVERSION); tagversion.WriteTagToFile(&data); uint32 dwCryptFlags = 0; if (thePrefs::IsClientCryptLayerSupported()) { dwCryptFlags |= SRVCAP_SUPPORTCRYPT; } if (thePrefs::IsClientCryptLayerRequested()) { dwCryptFlags |= SRVCAP_REQUESTCRYPT; } if (thePrefs::IsClientCryptLayerRequired()) { dwCryptFlags |= SRVCAP_REQUIRECRYPT; } // FLAGS for server connection CTagInt32 tagflags(CT_SERVER_FLAGS, CAPABLE_ZLIB | CAPABLE_AUXPORT | CAPABLE_NEWTAGS | CAPABLE_UNICODE | CAPABLE_LARGEFILES | dwCryptFlags ); tagflags.WriteTagToFile(&data); // eMule Version (14-Mar-2004: requested by lugdunummaster (need for LowID clients which have no chance // to send an Hello packet to the server during the callback test)) CTagInt32 tagMuleVersion(CT_EMULE_VERSION, (SO_AMULE << 24) | make_full_ed2k_version(VERSION_MJR, VERSION_MIN, VERSION_UPDATE) ); tagMuleVersion.WriteTagToFile(&data); CPacket* packet = new CPacket(data, OP_EDONKEYPROT, OP_LOGINREQUEST); #ifdef DEBUG_CLIENT_PROTOCOL AddLogLineC(wxT("Client: OP_LOGINREQUEST")); AddLogLineC(wxString(wxT(" Hash : ")) << thePrefs::GetUserHash().Encode()); AddLogLineC(wxString(wxT(" ClientID : ")) << GetClientID()); AddLogLineC(wxString(wxT(" Port : ")) << thePrefs::GetPort()); AddLogLineC(wxString(wxT(" User Nick: ")) << thePrefs::GetUserNick()); AddLogLineC(wxString(wxT(" Edonkey : ")) << EDONKEYVERSION); #endif theStats::AddUpOverheadServer(packet->GetPacketSize()); SendPacket(packet, true, sender); } else if (sender->GetConnectionState() == CS_CONNECTED){ theStats::AddReconnect(); theStats::GetServerConnectTimer()->ResetTimer(); connected = true; AddLogLineC(CFormat( _("Connection established on: %s") ) % sender->cur_server->GetListName()); connectedsocket = sender; StopConnectionTry(); CServer* update = theApp->serverlist->GetServerByAddress(connectedsocket->cur_server->GetAddress(),sender->cur_server->GetPort()); if ( update ) { Notify_ServerHighlight(update, true); } theApp->sharedfiles->ClearED2KPublishInfo(); Notify_ServerRemoveDead(); // tecxx 1609 2002 - serverlist update if (thePrefs::AddServersFromServer()) { CPacket* packet = new CPacket(OP_GETSERVERLIST, 0, OP_EDONKEYPROT); theStats::AddUpOverheadServer(packet->GetPacketSize()); SendPacket(packet, true); #ifdef DEBUG_CLIENT_PROTOCOL AddLogLineC(wxT("Client: OP_GETSERVERLIST")); #endif } } theApp->ShowConnectionState(); } bool CServerConnect::SendPacket(CPacket* packet,bool delpacket, CServerSocket* to) { if (!to) { if (connected) { connectedsocket->SendPacket(packet, delpacket, true); return true; } else { if ( delpacket ) { delete packet; } return false; } } else { to->SendPacket(packet, delpacket, true); return true; } } bool CServerConnect::SendUDPPacket(CPacket* packet, CServer* host, bool delpacket, bool rawpacket, uint16 port_offset) { if (connected) { serverudpsocket->SendPacket(packet, host, delpacket, rawpacket, port_offset); } else if (delpacket) { delete packet; } return true; } void CServerConnect::ConnectionFailed(CServerSocket* sender) { if (connecting == false && sender != connectedsocket) { // just return, cleanup is done by the socket itself return; } //messages CServer* pServer = theApp->serverlist->GetServerByAddress(sender->cur_server->GetAddress(), sender->cur_server->GetPort()); switch (sender->GetConnectionState()){ case CS_FATALERROR: AddLogLineC(_("Fatal Error while trying to connect. Internet connection might be down")); break; case CS_DISCONNECTED: theApp->sharedfiles->ClearED2KPublishInfo(); AddLogLineN(CFormat( _("Lost connection to %s (%s:%i)") ) % sender->cur_server->GetListName() % sender->cur_server->GetFullIP() % sender->cur_server->GetPort() ); if (pServer){ Notify_ServerHighlight(pServer, false); } break; case CS_SERVERDEAD: AddLogLineN(CFormat( _("%s (%s:%i) appears to be dead.") ) % sender->cur_server->GetListName() % sender->cur_server->GetFullIP() % sender->cur_server->GetPort() ); if (pServer) { pServer->AddFailedCount(); Notify_ServerRefresh( pServer ); } break; case CS_ERROR: break; case CS_SERVERFULL: AddLogLineN(CFormat( _("%s (%s:%i) appears to be full.") ) % sender->cur_server->GetListName() % sender->cur_server->GetFullIP() % sender->cur_server->GetPort() ); break; case CS_NOTCONNECTED:; break; } // IMPORTANT: mark this socket not to be deleted in StopConnectionTry(), // because it will delete itself after this function! sender->m_bIsDeleting = true; switch (sender->GetConnectionState()) { case CS_FATALERROR:{ bool autoretry= !singleconnecting; StopConnectionTry(); if ((thePrefs::Reconnect()) && (autoretry) && (!m_idRetryTimer.IsRunning())) { AddLogLineN(CFormat(wxPLURAL("Automatic connection to server will retry in %d second", "Automatic connection to server will retry in %d seconds", CS_RETRYCONNECTTIME)) % CS_RETRYCONNECTTIME); m_idRetryTimer.Start(1000*CS_RETRYCONNECTTIME); } break; } case CS_DISCONNECTED:{ theApp->sharedfiles->ClearED2KPublishInfo(); connected = false; Notify_ServerHighlight(sender->cur_server,false); if (connectedsocket) { connectedsocket->Close(); } connectedsocket = NULL; theApp->searchlist->StopSearch(true); Notify_SearchCancel(); theStats::GetServerConnectTimer()->StopTimer(); if (thePrefs::Reconnect() && !connecting){ ConnectToAnyServer(); } AddLogLineC(_("Connection lost") ); break; } case CS_ERROR: case CS_NOTCONNECTED:{ if (!connecting) break; AddLogLineN(CFormat( _("Connecting to %s (%s:%i) failed.") ) % sender->info % sender->cur_server->GetFullIP() % sender->cur_server->GetPort() ); } case CS_SERVERDEAD: case CS_SERVERFULL:{ if (!connecting) { break; } if (singleconnecting) { if (pServer && sender->IsServerCryptEnabledConnection() && !thePrefs::IsClientCryptLayerRequired()){ // try reconnecting without obfuscation ConnectToServer(pServer, false, true); break; } StopConnectionTry(); break; } ServerSocketMap::iterator it = connectionattemps.begin(); while ( it != connectionattemps.end() ){ if ( it->second == sender ) { connectionattemps.erase( it ); break; } ++it; } TryAnotherConnectionrequest(); } } theApp->ShowConnectionState(); } void CServerConnect::CheckForTimeout() { uint32 dwCurTick = GetTickCount(); ServerSocketMap::iterator it = connectionattemps.begin(); while ( it != connectionattemps.end() ){ if ( !it->second ) { AddLogLineN(_("ERROR: Socket invalid at timeout check")); connectionattemps.erase( it ); return; } if ( dwCurTick - it->first > CONSERVTIMEOUT) { uint32 key = it->first; CServerSocket* value = it->second; ++it; if (!value->IsSolving()) { AddLogLineN(CFormat( _("Connection attempt to %s (%s:%i) timed out.") ) % value->info % value->cur_server->GetFullIP() % value->cur_server->GetPort() ); connectionattemps.erase( key ); TryAnotherConnectionrequest(); DestroySocket( value ); } } else { ++it; } } } bool CServerConnect::Disconnect() { if (connected && connectedsocket) { theApp->sharedfiles->ClearED2KPublishInfo(); connected = false; CServer* update = theApp->serverlist->GetServerByAddress( connectedsocket->cur_server->GetAddress(), connectedsocket->cur_server->GetPort()); Notify_ServerHighlight(update, false); theApp->SetPublicIP(0); DestroySocket(connectedsocket); connectedsocket = NULL; theApp->ShowConnectionState(); theStats::GetServerConnectTimer()->StopTimer(); return true; } else { return false; } } CServerConnect::CServerConnect(CServerList* in_serverlist, amuleIPV4Address &address) : m_idRetryTimer(theApp,ID_SERVER_RETRY_TIMER_EVENT) { connectedsocket = NULL; used_list = in_serverlist; max_simcons = (thePrefs::IsSafeServerConnectEnabled()) ? 1 : 2; connecting = false; connected = false; clientid = 0; singleconnecting = false; m_recurseTryAnotherConnectionrequest = false; // initalize socket for udp packets if (thePrefs::GetNetworkED2K()) { serverudpsocket = new CServerUDPSocket(address, thePrefs::GetProxyData()); } else { serverudpsocket = NULL; } } CServerConnect::~CServerConnect() { m_idRetryTimer.Stop(); // stop all connections StopConnectionTry(); // close connected socket, if any DestroySocket(connectedsocket); connectedsocket = NULL; // close udp socket delete serverudpsocket; } CServer* CServerConnect::GetCurrentServer() { if (IsConnected() && connectedsocket) { return connectedsocket->cur_server; } return NULL; } void CServerConnect::SetClientID(uint32 newid) { clientid = newid; if (!::IsLowID(newid)) { theApp->SetPublicIP(newid); } } void CServerConnect::DestroySocket(CServerSocket* pSck) { if (pSck == NULL) { return; } m_lstOpenSockets.remove(pSck); pSck->Destroy(); } bool CServerConnect::IsLocalServer(uint32 dwIP, uint16 nPort) { if (IsConnected()){ if (connectedsocket->cur_server->GetIP() == dwIP && connectedsocket->cur_server->GetPort() == nPort) return true; } return false; } void CServerConnect::KeepConnectionAlive() { uint32 dwServerKeepAliveTimeout = thePrefs::GetServerKeepAliveTimeout(); if (dwServerKeepAliveTimeout && connected && connectedsocket && connectedsocket->connectionstate == CS_CONNECTED && GetTickCount() - connectedsocket->GetLastTransmission() >= dwServerKeepAliveTimeout) { // "Ping" the server if the TCP connection was not used for the specified interval with // an empty publish files packet -> recommended by lugdunummaster himself! CMemFile files(4); files.WriteUInt32(0); //nFiles CPacket* packet = new CPacket(files, OP_EDONKEYPROT, OP_OFFERFILES); #ifdef DEBUG_CLIENT_PROTOCOL AddLogLineC(wxT("Client: OP_OFFERFILES")); #endif // compress packet // - this kind of data is highly compressable (N * (1 MD4 and at least 3 string meta data tags and 1 integer meta data tag)) // - the min. amount of data needed for one published file is ~100 bytes // - this function is called once when connecting to a server and when a file becomes shareable - so, it's called rarely. // - if the compressed size is still >= the original size, we send the uncompressed packet // therefor we always try to compress the packet theStats::AddUpOverheadServer(packet->GetPacketSize()); connectedsocket->SendPacket(packet,true); AddDebugLogLineN(logServer, wxT("Refreshing server connection")); } } // true if the IP is one of a server which we currently try to connect to bool CServerConnect::AwaitingTestFromIP(uint32 dwIP) { ServerSocketMap::iterator it = connectionattemps.begin(); while (it != connectionattemps.end()) { const CServerSocket* serversocket = it->second; if (serversocket && (serversocket->GetConnectionState() == CS_WAITFORLOGIN) && (serversocket->GetServerIP() == dwIP)) { return true; } ++it; } return false; } bool CServerConnect::IsConnectedObfuscated() const { return connectedsocket != NULL && connectedsocket->IsObfusicating(); } void CServerConnect::OnServerHostnameResolved(void* socket, uint32 ip) { // The socket object might have been deleted while we waited for the hostname // to be resolved, so we check if it's still among the open sockets. SocketsList::iterator it = std::find(m_lstOpenSockets.begin(), m_lstOpenSockets.end(), socket); if (it != m_lstOpenSockets.end()) { (*it)->OnHostnameResolved(ip); } else { AddLogLineNS(_("Received late result of DNS lookup, discarding.")); } } // File_checked_for_headers aMule-2.3.1/src/DownloadListCtrl.cpp0000644000175000017470000012207211600726027016214 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "DownloadListCtrl.h" // Interface declarations #include #include #include // Needed for CFormat #include "amule.h" // Needed for theApp #include "amuleDlg.h" // Needed for CamuleDlg #include "BarShader.h" // Needed for CBarShader #include "CommentDialogLst.h" // Needed for CCommentDialogLst #include "DataToText.h" // Needed for PriorityToStr #include "DownloadQueue.h" #include "FileDetailDialog.h" // Needed for CFileDetailDialog #include "GuiEvents.h" // Needed for CoreNotify_* #include "Logger.h" #include "muuli_wdr.h" // Needed for ID_DLOADLIST #include "PartFile.h" // Needed for CPartFile #include "Preferences.h" #include "SharedFileList.h" // Needed for CSharedFileList #include "TerminationProcess.h" // Needed for CTerminationProcess #include "TransferWnd.h" #include "SourceListCtrl.h" class CPartFile; struct FileCtrlItem_Struct { FileCtrlItem_Struct() : dwUpdated(0), status(NULL), m_fileValue(NULL) { } ~FileCtrlItem_Struct() { delete status; } CPartFile* GetFile() const { return m_fileValue; } void SetContents(CPartFile* file) { m_fileValue = file; } uint32 dwUpdated; wxBitmap* status; private: CPartFile* m_fileValue; }; #define m_ImageList theApp->amuledlg->m_imagelist enum ColumnEnum { ColumnPart = 0, ColumnFileName, ColumnSize, ColumnTransferred, ColumnCompleted, ColumnSpeed, ColumnProgress, ColumnSources, ColumnPriority, ColumnStatus, ColumnTimeRemaining, ColumnLastSeenComplete, ColumnLastReception, ColumnNumberOfColumns }; BEGIN_EVENT_TABLE(CDownloadListCtrl, CMuleListCtrl) EVT_LIST_ITEM_ACTIVATED(ID_DLOADLIST, CDownloadListCtrl::OnItemActivated) EVT_LIST_ITEM_RIGHT_CLICK(ID_DLOADLIST, CDownloadListCtrl::OnMouseRightClick) EVT_LIST_ITEM_MIDDLE_CLICK(ID_DLOADLIST, CDownloadListCtrl::OnMouseMiddleClick) EVT_LIST_ITEM_SELECTED(ID_DLOADLIST, CDownloadListCtrl::OnItemSelectionChanged) EVT_LIST_ITEM_DESELECTED(ID_DLOADLIST, CDownloadListCtrl::OnItemSelectionChanged) EVT_CHAR( CDownloadListCtrl::OnKeyPressed ) EVT_MENU( MP_CANCEL, CDownloadListCtrl::OnCancelFile ) EVT_MENU( MP_PAUSE, CDownloadListCtrl::OnSetStatus ) EVT_MENU( MP_STOP, CDownloadListCtrl::OnSetStatus ) EVT_MENU( MP_RESUME, CDownloadListCtrl::OnSetStatus ) EVT_MENU( MP_PRIOLOW, CDownloadListCtrl::OnSetPriority ) EVT_MENU( MP_PRIONORMAL, CDownloadListCtrl::OnSetPriority ) EVT_MENU( MP_PRIOHIGH, CDownloadListCtrl::OnSetPriority ) EVT_MENU( MP_PRIOAUTO, CDownloadListCtrl::OnSetPriority ) EVT_MENU( MP_SWAP_A4AF_TO_THIS, CDownloadListCtrl::OnSwapSources ) EVT_MENU( MP_SWAP_A4AF_TO_THIS_AUTO, CDownloadListCtrl::OnSwapSources ) EVT_MENU( MP_SWAP_A4AF_TO_ANY_OTHER, CDownloadListCtrl::OnSwapSources ) EVT_MENU_RANGE( MP_ASSIGNCAT, MP_ASSIGNCAT + 99, CDownloadListCtrl::OnSetCategory ) EVT_MENU( MP_CLEARCOMPLETED, CDownloadListCtrl::OnClearCompleted ) EVT_MENU( MP_GETMAGNETLINK, CDownloadListCtrl::OnGetLink ) EVT_MENU( MP_GETED2KLINK, CDownloadListCtrl::OnGetLink ) EVT_MENU( MP_METINFO, CDownloadListCtrl::OnViewFileInfo ) EVT_MENU( MP_VIEW, CDownloadListCtrl::OnPreviewFile ) EVT_MENU( MP_VIEWFILECOMMENTS, CDownloadListCtrl::OnViewFileComments ) EVT_MENU( MP_WS, CDownloadListCtrl::OnGetFeedback ) END_EVENT_TABLE() //! This listtype is used when gathering the selected items. typedef std::list ItemList; CDownloadListCtrl::CDownloadListCtrl( wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) : CMuleListCtrl( parent, winid, pos, size, style | wxLC_OWNERDRAW, validator, name ) { // Setting the sorter function. SetSortFunc( SortProc ); // Set the table-name (for loading and saving preferences). SetTableName( wxT("Download") ); m_menu = NULL; m_hilightBrush = CMuleColour(wxSYS_COLOUR_HIGHLIGHT).Blend(125).GetBrush(); m_hilightUnfocusBrush = CMuleColour(wxSYS_COLOUR_BTNSHADOW).Blend(125).GetBrush(); InsertColumn( ColumnPart, _("Part"), wxLIST_FORMAT_LEFT, 30, wxT("a") ); InsertColumn( ColumnFileName, _("File Name"), wxLIST_FORMAT_LEFT, 260, wxT("N") ); InsertColumn( ColumnSize, _("Size"), wxLIST_FORMAT_LEFT, 60, wxT("Z") ); InsertColumn( ColumnTransferred, _("Transferred"), wxLIST_FORMAT_LEFT, 65, wxT("T") ); InsertColumn( ColumnCompleted, _("Completed"), wxLIST_FORMAT_LEFT, 65, wxT("C") ); InsertColumn( ColumnSpeed, _("Speed"), wxLIST_FORMAT_LEFT, 65, wxT("S") ); InsertColumn( ColumnProgress, _("Progress"), wxLIST_FORMAT_LEFT, 170, wxT("P") ); InsertColumn( ColumnSources, _("Sources"), wxLIST_FORMAT_LEFT, 50, wxT("u") ); InsertColumn( ColumnPriority, _("Priority"), wxLIST_FORMAT_LEFT, 55, wxT("p") ); InsertColumn( ColumnStatus, _("Status"), wxLIST_FORMAT_LEFT, 70, wxT("s") ); InsertColumn( ColumnTimeRemaining, _("Time Remaining"), wxLIST_FORMAT_LEFT, 110, wxT("r") ); InsertColumn( ColumnLastSeenComplete, _("Last Seen Complete"), wxLIST_FORMAT_LEFT, 220, wxT("c") ); InsertColumn( ColumnLastReception, _("Last Reception"), wxLIST_FORMAT_LEFT, 220, wxT("R") ); m_category = 0; m_filecount = 0; m_ItemSelectionChangePending = false; LoadSettings(); //m_ready = true; } // This is the order the columns had before extendable list-control settings save/load code was introduced. // Don't touch when inserting new columns! wxString CDownloadListCtrl::GetOldColumnOrder() const { return wxT("N,Z,T,C,S,P,u,p,s,r,c,R"); } CDownloadListCtrl::~CDownloadListCtrl() { while ( !m_ListItems.empty() ) { delete m_ListItems.begin()->second; m_ListItems.erase( m_ListItems.begin() ); } } void CDownloadListCtrl::AddFile( CPartFile* file ) { wxASSERT( file ); // Avoid duplicate entries of files if ( m_ListItems.find( file ) == m_ListItems.end() ) { FileCtrlItem_Struct* newitem = new FileCtrlItem_Struct; newitem->SetContents(file); m_ListItems.insert( ListItemsPair( file, newitem ) ); // Check if the new file is visible in the current category if ( file->CheckShowItemInGivenCat( m_category ) ) { ShowFile( file, true ); if (file->IsCompleted()) { CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(true); } SortList(); } } } void CDownloadListCtrl::RemoveFile( CPartFile* file ) { wxASSERT( file ); // Ensure that any list-entries are removed ShowFile( file, false ); // Find the assosiated list-item ListItems::iterator it = m_ListItems.find( file ); if ( it != m_ListItems.end() ) { delete it->second; m_ListItems.erase( it ); } } void CDownloadListCtrl::UpdateItem(const void* toupdate) { // Retrieve all entries matching the source ListIteratorPair rangeIt = m_ListItems.equal_range( toupdate ); // Visible lines, default to all because not all platforms // support the GetVisibleLines function long first = 0, last = GetItemCount(); #ifndef __WXMSW__ // Get visible lines if we need them if ( rangeIt.first != rangeIt.second ) { GetVisibleLines( &first, &last ); } #endif for ( ListItems::iterator it = rangeIt.first; it != rangeIt.second; ++it ) { FileCtrlItem_Struct* item = it->second; long index = FindItem( -1, reinterpret_cast(item) ); // Determine if the file should be shown in the current category CPartFile* file = item->GetFile(); bool show = file->CheckShowItemInGivenCat( m_category ); if ( index > -1 ) { if ( show ) { item->dwUpdated = 0; // Only update visible lines if ( index >= first && index <= last) { RefreshItem( index ); } } else { // Item should no longer be shown in // the current category ShowFile( file, false ); } } else if ( show ) { // Item has been hidden but new status means // that it should it should be shown in the // current category ShowFile( file, true ); } if (file->IsCompleted() && show) { CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(true); } } } void CDownloadListCtrl::ShowFile( CPartFile* file, bool show ) { wxASSERT( file ); ListItems::iterator it = m_ListItems.find( file ); if ( it != m_ListItems.end() ) { FileCtrlItem_Struct* item = it->second; if ( show ) { // Check if the file is already being displayed long index = FindItem( -1, reinterpret_cast(item) ); if ( index == -1 ) { long newitem = InsertItem( GetItemCount(), wxEmptyString ); SetItemPtrData( newitem, reinterpret_cast(item) ); wxListItem myitem; myitem.m_itemId = newitem; myitem.SetBackgroundColour( GetBackgroundColour() ); SetItem(myitem); RefreshItem( newitem ); ShowFilesCount( 1 ); } } else { // Try to find the file and remove it long index = FindItem( -1, reinterpret_cast(item) ); if ( index > -1 ) { DeleteItem( index ); ShowFilesCount( -1 ); } } } } void CDownloadListCtrl::ChangeCategory( int newCategory ) { Freeze(); bool hasCompletedDownloads = false; // remove all displayed files with a different cat and show the correct ones for (ListItems::const_iterator it = m_ListItems.begin(); it != m_ListItems.end(); it++) { CPartFile* file = it->second->GetFile(); bool curVisibility = file->CheckShowItemInGivenCat( m_category ); bool newVisibility = file->CheckShowItemInGivenCat( newCategory ); if (newVisibility && file->IsCompleted()) { hasCompletedDownloads = true; } // Check if the visibility of the file has changed. However, if the // current category is the default (0) category, then we can't use // curVisiblity to see if the visibility has changed but instead // have to let ShowFile() check if the file is or isn't on the list. if ( curVisibility != newVisibility || !newCategory ) { ShowFile( file, newVisibility ); } } CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(hasCompletedDownloads); Thaw(); m_category = newCategory; } uint8 CDownloadListCtrl::GetCategory() const { return m_category; } /** * Helper-function: This function is used to gather selected items. * * @param list A pointer to the list to gather items from. * @return A list containing the selected items. */ ItemList GetSelectedItems( CDownloadListCtrl* list) { ItemList results; long index = list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); while ( index > -1 ) { FileCtrlItem_Struct* item = (FileCtrlItem_Struct*)list->GetItemData( index ); results.push_back( item ); index = list->GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } return results; } void CDownloadListCtrl::OnCancelFile(wxCommandEvent& WXUNUSED(event)) { ItemList files = ::GetSelectedItems(this); for (ItemList::iterator it = files.begin(); it != files.end(); ) { ItemList::iterator it1 = it++; CPartFile* file = (*it1)->GetFile(); if (file) { switch (file->GetStatus()) { case PS_WAITINGFORHASH: case PS_HASHING: case PS_COMPLETING: case PS_COMPLETE: files.erase(it1); break; } } } if (files.size()) { wxString question; if (files.size() == 1) { question = _("Are you sure that you wish to delete the selected file?"); } else { question = _("Are you sure that you wish to delete the selected files?"); } if (wxMessageBox( question, _("Cancel"), wxICON_QUESTION | wxYES_NO, this) == wxYES) { for (ItemList::iterator it = files.begin(); it != files.end(); ++it) { CPartFile* file = (*it)->GetFile(); if (file) { CoreNotify_PartFile_Delete(file); } } } } } void CDownloadListCtrl::OnSetPriority( wxCommandEvent& event ) { int priority = 0; switch ( event.GetId() ) { case MP_PRIOLOW: priority = PR_LOW; break; case MP_PRIONORMAL: priority = PR_NORMAL; break; case MP_PRIOHIGH: priority = PR_HIGH; break; case MP_PRIOAUTO: priority = PR_AUTO; break; default: wxFAIL; } ItemList files = ::GetSelectedItems( this ); for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { CPartFile* file = (*it)->GetFile(); if ( priority == PR_AUTO ) { CoreNotify_PartFile_PrioAuto( file, true ); } else { CoreNotify_PartFile_PrioAuto( file, false ); CoreNotify_PartFile_PrioSet( file, priority, true ); } } } void CDownloadListCtrl::OnSwapSources( wxCommandEvent& event ) { ItemList files = ::GetSelectedItems( this ); for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { CPartFile* file = (*it)->GetFile(); switch ( event.GetId() ) { case MP_SWAP_A4AF_TO_THIS: CoreNotify_PartFile_Swap_A4AF( file ); break; case MP_SWAP_A4AF_TO_THIS_AUTO: CoreNotify_PartFile_Swap_A4AF_Auto( file ); break; case MP_SWAP_A4AF_TO_ANY_OTHER: CoreNotify_PartFile_Swap_A4AF_Others( file ); break; } } } void CDownloadListCtrl::OnSetCategory( wxCommandEvent& event ) { ItemList files = ::GetSelectedItems( this ); for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { CoreNotify_PartFile_SetCat( (*it)->GetFile(), event.GetId() - MP_ASSIGNCAT ); ShowFile((*it)->GetFile(), false); } wxListEvent ev; OnItemSelectionChanged(ev); // clear clients that may have been shown ChangeCategory( m_category ); // This only updates the visibility of the clear completed button theApp->amuledlg->m_transferwnd->UpdateCatTabTitles(); } void CDownloadListCtrl::OnSetStatus( wxCommandEvent& event ) { ItemList files = ::GetSelectedItems( this ); for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { CPartFile* file = (*it)->GetFile(); switch ( event.GetId() ) { case MP_PAUSE: CoreNotify_PartFile_Pause( file ); break; case MP_RESUME: CoreNotify_PartFile_Resume( file ); break; case MP_STOP: CoreNotify_PartFile_Stop( file ); break; } } } void CDownloadListCtrl::OnClearCompleted( wxCommandEvent& WXUNUSED(event) ) { ClearCompleted(); } void CDownloadListCtrl::OnGetLink(wxCommandEvent& event) { ItemList files = ::GetSelectedItems( this ); wxString URIs; for ( ItemList::iterator it = files.begin(); it != files.end(); ++it ) { CPartFile* file = (*it)->GetFile(); if ( event.GetId() == MP_GETED2KLINK ) { URIs += theApp->CreateED2kLink( file ) + wxT("\n"); } else { URIs += theApp->CreateMagnetLink( file ) + wxT("\n"); } } if ( !URIs.IsEmpty() ) { theApp->CopyTextToClipboard( URIs.BeforeLast(wxT('\n')) ); } } void CDownloadListCtrl::OnGetFeedback(wxCommandEvent& WXUNUSED(event)) { wxString feed; ItemList files = ::GetSelectedItems( this ); for (ItemList::iterator it = files.begin(); it != files.end(); ++it) { if (feed.IsEmpty()) { feed = CFormat(_("Feedback from: %s (%s)\n\n")) % thePrefs::GetUserNick() % theApp->GetFullMuleVersion(); } else { feed += wxT("\n"); } feed += (*it)->GetFile()->GetFeedback(); } if (!feed.IsEmpty()) { theApp->CopyTextToClipboard(feed); } } void CDownloadListCtrl::OnViewFileInfo( wxCommandEvent& WXUNUSED(event) ) { long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); if (index >= 0) { ShowFileDetailDialog(index); } } void CDownloadListCtrl::OnViewFileComments( wxCommandEvent& WXUNUSED(event) ) { ItemList files = ::GetSelectedItems( this ); if ( files.size() == 1 ) { CCommentDialogLst dialog( this, files.front()->GetFile() ); dialog.ShowModal(); } } void CDownloadListCtrl::OnPreviewFile( wxCommandEvent& WXUNUSED(event) ) { ItemList files = ::GetSelectedItems( this ); if ( files.size() == 1 ) { PreviewFile(files.front()->GetFile()); } } void CDownloadListCtrl::OnItemActivated( wxListEvent& evt ) { CPartFile* file = ((FileCtrlItem_Struct*)GetItemData( evt.GetIndex()))->GetFile(); if ((!file->IsPartFile() || file->IsCompleted()) && file->PreviewAvailable()) { PreviewFile( file ); } } void CDownloadListCtrl::OnItemSelectionChanged( wxListEvent& ) { if (!m_ItemSelectionChangePending && !IsSorting()) { m_ItemSelectionChangePending = true; Notify_DownloadCtrlDoItemSelectionChanged(); } } void CDownloadListCtrl::DoItemSelectionChanged() { m_ItemSelectionChangePending = false; CKnownFileVector filesVector; filesVector.reserve(GetSelectedItemCount()); long index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); while ( index > -1 ) { CPartFile* file = ((FileCtrlItem_Struct*)GetItemData( index ))->GetFile(); if (file->IsPartFile()) { filesVector.push_back(file); } index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); } std::sort(filesVector.begin(), filesVector.end()); theApp->amuledlg->m_transferwnd->clientlistctrl->ShowSources(filesVector); } void CDownloadListCtrl::OnMouseRightClick(wxListEvent& evt) { long index = CheckSelection(evt); if (index < 0) { return; } delete m_menu; m_menu = NULL; FileCtrlItem_Struct* item = (FileCtrlItem_Struct*)GetItemData( index ); m_menu = new wxMenu( _("Downloads") ); wxMenu* priomenu = new wxMenu(); priomenu->AppendCheckItem(MP_PRIOLOW, _("Low")); priomenu->AppendCheckItem(MP_PRIONORMAL, _("Normal")); priomenu->AppendCheckItem(MP_PRIOHIGH, _("High")); priomenu->AppendCheckItem(MP_PRIOAUTO, _("Auto")); m_menu->Append(MP_MENU_PRIO, _("Priority"), priomenu); m_menu->Append(MP_CANCEL, _("Cancel")); m_menu->Append(MP_STOP, _("&Stop")); m_menu->Append(MP_PAUSE, _("&Pause")); m_menu->Append(MP_RESUME, _("&Resume")); m_menu->Append(MP_CLEARCOMPLETED, _("C&lear completed")); //----------------------------------------------------- m_menu->AppendSeparator(); //----------------------------------------------------- wxMenu* extendedmenu = new wxMenu(); extendedmenu->Append(MP_SWAP_A4AF_TO_THIS, _("Swap every A4AF to this file now")); extendedmenu->AppendCheckItem(MP_SWAP_A4AF_TO_THIS_AUTO, _("Swap every A4AF to this file (Auto)")); //----------------------------------------------------- extendedmenu->AppendSeparator(); //----------------------------------------------------- extendedmenu->Append(MP_SWAP_A4AF_TO_ANY_OTHER, _("Swap every A4AF to any other file now")); //----------------------------------------------------- m_menu->Append(MP_MENU_EXTD, _("Extended Options"), extendedmenu); //----------------------------------------------------- m_menu->AppendSeparator(); //----------------------------------------------------- m_menu->Append(MP_VIEW, _("Preview")); m_menu->Append(MP_METINFO, _("Show file &details")); m_menu->Append(MP_VIEWFILECOMMENTS, _("Show all comments")); //----------------------------------------------------- m_menu->AppendSeparator(); //----------------------------------------------------- m_menu->Append(MP_GETMAGNETLINK, _("Copy magnet URI to clipboard")); m_menu->Append(MP_GETED2KLINK, _("Copy eD2k &link to clipboard")); m_menu->Append(MP_WS, _("Copy feedback to clipboard")); //----------------------------------------------------- m_menu->AppendSeparator(); //----------------------------------------------------- // Add dynamic entries wxMenu *cats = new wxMenu(_("Category")); if (theApp->glob_prefs->GetCatCount() > 1) { for (uint32 i = 0; i < theApp->glob_prefs->GetCatCount(); i++) { if ( i == 0 ) { cats->Append( MP_ASSIGNCAT, _("unassign") ); } else { cats->Append( MP_ASSIGNCAT + i, theApp->glob_prefs->GetCategory(i)->title ); } } } m_menu->Append(MP_MENU_CATS, _("Assign to category"), cats); m_menu->Enable(MP_MENU_CATS, (theApp->glob_prefs->GetCatCount() > 1) ); CPartFile* file = item->GetFile(); // then set state bool canStop; bool canPause; bool canCancel; bool fileResumable; if (file->GetStatus(true) != PS_ALLOCATING) { const uint8_t fileStatus = file->GetStatus(); canStop = (fileStatus != PS_ERROR) && (fileStatus != PS_COMPLETE) && (file->IsStopped() != true); canPause = (file->GetStatus() != PS_PAUSED) && canStop; fileResumable = (fileStatus == PS_PAUSED) || (fileStatus == PS_ERROR) || (fileStatus == PS_INSUFFICIENT); canCancel = fileStatus != PS_COMPLETE; } else { canStop = canPause = canCancel = fileResumable = false; } m_menu->Enable( MP_CANCEL, canCancel ); m_menu->Enable( MP_PAUSE, canPause ); m_menu->Enable( MP_STOP, canStop ); m_menu->Enable( MP_RESUME, fileResumable ); m_menu->Enable( MP_CLEARCOMPLETED, CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->IsEnabled() ); wxString view; if (file->IsPartFile() && !file->IsCompleted()) { view = CFormat(wxT("%s [%s]")) % _("Preview") % file->GetPartMetFileName().RemoveExt(); } else if ( file->IsCompleted() ) { view = _("&Open the file"); } m_menu->SetLabel(MP_VIEW, view); m_menu->Enable(MP_VIEW, file->PreviewAvailable()); FileRatingList ratingList; item->GetFile()->GetRatingAndComments(ratingList); m_menu->Enable(MP_VIEWFILECOMMENTS, !ratingList.empty()); m_menu->Check( MP_SWAP_A4AF_TO_THIS_AUTO, file->IsA4AFAuto() ); int priority = file->IsAutoDownPriority() ? PR_AUTO : file->GetDownPriority(); priomenu->Check( MP_PRIOHIGH, priority == PR_HIGH ); priomenu->Check( MP_PRIONORMAL, priority == PR_NORMAL ); priomenu->Check( MP_PRIOLOW, priority == PR_LOW ); priomenu->Check( MP_PRIOAUTO, priority == PR_AUTO ); m_menu->Enable( MP_MENU_EXTD, canPause ); bool autosort = thePrefs::AutoSortDownload(false); PopupMenu(m_menu, evt.GetPoint()); thePrefs::AutoSortDownload(autosort); delete m_menu; m_menu = NULL; } void CDownloadListCtrl::OnMouseMiddleClick(wxListEvent& evt) { // Check if clicked item is selected. If not, unselect all and select it. long index = CheckSelection(evt); if (index >= 0) { ShowFileDetailDialog(index); } } void CDownloadListCtrl::ShowFileDetailDialog(long index) { // Make list of part files in control std::vector files; int nrItems = GetItemCount(); files.reserve(nrItems); for (int i = 0; i < nrItems; i++) { files.push_back(((FileCtrlItem_Struct*)GetItemData(i))->GetFile()); } bool autosort = thePrefs::AutoSortDownload(false); CFileDetailDialog(this, files, index).ShowModal(); thePrefs::AutoSortDownload(autosort); } void CDownloadListCtrl::OnKeyPressed( wxKeyEvent& event ) { // Check if delete was pressed switch (event.GetKeyCode()) { case WXK_NUMPAD_DELETE: case WXK_DELETE: { wxCommandEvent evt; OnCancelFile( evt ); break; } case WXK_F2: { ItemList files = ::GetSelectedItems( this ); if (files.size() == 1) { CPartFile* file = files.front()->GetFile(); // Currently renaming of completed files causes problem with kad if (file->IsPartFile()) { wxString strNewName = ::wxGetTextFromUser( _("Enter new name for this file:"), _("File rename"), file->GetFileName().GetPrintable()); CPath newName = CPath(strNewName); if (newName.IsOk() && (newName != file->GetFileName())) { theApp->sharedfiles->RenameFile(file, newName); } } } break; } default: event.Skip(); } } void CDownloadListCtrl::OnDrawItem( int item, wxDC* dc, const wxRect& rect, const wxRect& rectHL, bool highlighted) { // Don't do any drawing if there's nobody to see it. if ( !theApp->amuledlg->IsDialogVisible( CamuleDlg::DT_TRANSFER_WND ) ) { return; } FileCtrlItem_Struct* content = (FileCtrlItem_Struct *)GetItemData(item); // Define text-color and background // and the border of the drawn area if (highlighted) { CMuleColour colour; if (GetFocus()) { dc->SetBackground(m_hilightBrush); colour = m_hilightBrush.GetColour(); } else { dc->SetBackground(m_hilightUnfocusBrush); colour = m_hilightUnfocusBrush.GetColour(); } dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); dc->SetPen( colour.Blend(65).GetPen() ); } else { dc->SetBackground(*(wxTheBrushList->FindOrCreateBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX), wxSOLID))); dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); dc->SetPen(*wxTRANSPARENT_PEN); } dc->SetBrush( dc->GetBackground() ); dc->DrawRectangle( rectHL.x, rectHL.y, rectHL.width, rectHL.height ); dc->SetPen(*wxTRANSPARENT_PEN); if (!highlighted || !GetFocus() ) { // If we have category, override textforeground with what category tells us. CPartFile *file = content->GetFile(); if ( file->GetCategory() ) { dc->SetTextForeground(CMuleColour(theApp->glob_prefs->GetCatColor(file->GetCategory())) ); } } // Various constant values we use const int iTextOffset = ( rect.GetHeight() - dc->GetCharHeight() ) / 2; const int iOffset = 4; wxRect cur_rec( iOffset, rect.y, 0, rect.height ); for (int i = 0; i < GetColumnCount(); i++) { wxListItem listitem; GetColumn(i, listitem); if (listitem.GetWidth() > 2*iOffset) { cur_rec.width = listitem.GetWidth() - 2*iOffset; // Make a copy of the current rectangle so we can apply specific tweaks wxRect target_rec = cur_rec; if ( i == ColumnProgress ) { // Double the offset to make room for the cirle-marker target_rec.x += iOffset; target_rec.width -= iOffset; } else { // will ensure that text is about in the middle ;) target_rec.y += iTextOffset; } // Draw the item DrawFileItem(dc, i, target_rec, content); } // Increment to the next column cur_rec.x += listitem.GetWidth(); } } void CDownloadListCtrl::DrawFileItem( wxDC* dc, int nColumn, const wxRect& rect, FileCtrlItem_Struct* item ) const { wxDCClipper clipper( *dc, rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); const CPartFile* file = item->GetFile(); // Used to contain the contenst of cells that dont need any fancy drawing, just text. wxString text; switch (nColumn) { // Part Number case ColumnPart: { if (file->IsPartFile() && !file->IsCompleted()) { text = CFormat(wxT("%03d")) % file->GetPartMetNumber(); } break; } // Filename case ColumnFileName: { wxString filename = file->GetFileName().GetPrintable(); if (file->HasRating() || file->HasComment()) { int image = Client_CommentOnly_Smiley; if (file->HasRating()) { image = Client_InvalidRating_Smiley + file->UserRating() - 1; } wxASSERT(image >= Client_InvalidRating_Smiley); wxASSERT(image <= Client_CommentOnly_Smiley); int imgWidth = 16; // it's already centered by OnDrawItem() ... m_ImageList.Draw(image, *dc, rect.GetX(), rect.GetY() - 1, wxIMAGELIST_DRAW_TRANSPARENT); dc->DrawText(filename, rect.GetX() + imgWidth + 4, rect.GetY()); } else { dc->DrawText(filename, rect.GetX(), rect.GetY()); } break; } // Filesize case ColumnSize: text = CastItoXBytes( file->GetFileSize() ); break; // Transferred case ColumnTransferred: text = CastItoXBytes( file->GetTransferred() ); break; // Completed case ColumnCompleted: text = CastItoXBytes( file->GetCompletedSize() ); break; // Speed case ColumnSpeed: if ( file->GetTransferingSrcCount() ) { text = CFormat(_("%.1f kB/s")) % file->GetKBpsDown(); } break; // Progress case ColumnProgress:{ if (thePrefs::ShowProgBar()) { int iWidth = rect.GetWidth() - 2; int iHeight = rect.GetHeight() - 2; // DO NOT DRAW IT ALL THE TIME uint32 dwTicks = GetTickCount(); wxMemoryDC cdcStatus; if ( item->dwUpdated < dwTicks || !item->status || iWidth != item->status->GetWidth() ) { if ( item->status == NULL) { item->status = new wxBitmap(iWidth, iHeight); } else if ( item->status->GetWidth() != iWidth ) { // Only recreate if the size has changed item->status->Create(iWidth, iHeight); } cdcStatus.SelectObject( *item->status ); if ( thePrefs::UseFlatBar() ) { DrawFileStatusBar( file, &cdcStatus, wxRect(0, 0, iWidth, iHeight), true); } else { DrawFileStatusBar( file, &cdcStatus, wxRect(1, 1, iWidth - 2, iHeight - 2), false); // Draw black border cdcStatus.SetPen( *wxBLACK_PEN ); cdcStatus.SetBrush( *wxTRANSPARENT_BRUSH ); cdcStatus.DrawRectangle( 0, 0, iWidth, iHeight ); } item->dwUpdated = dwTicks + 5000; // Plus five seconds } else { cdcStatus.SelectObject( *item->status ); } dc->Blit( rect.GetX(), rect.GetY() + 1, iWidth, iHeight, &cdcStatus, 0, 0); if (thePrefs::ShowPercent()) { // Percentage of completing // We strip anything below the first decimal point, // to avoid Format doing roundings float percent = floor( file->GetPercentCompleted() * 10.0f ) / 10.0f; wxString buffer = CFormat(wxT("%.1f%%")) % percent; int middlex = (2*rect.GetX() + rect.GetWidth()) >> 1; int middley = (2*rect.GetY() + rect.GetHeight()) >> 1; wxCoord textwidth, textheight; dc->GetTextExtent(buffer, &textwidth, &textheight); wxColour AktColor = dc->GetTextForeground(); if (thePrefs::ShowProgBar()) { dc->SetTextForeground(*wxWHITE); } else { dc->SetTextForeground(*wxBLACK); } dc->DrawText(buffer, middlex - (textwidth >> 1), middley - (textheight >> 1)); dc->SetTextForeground(AktColor); } } break; } // Sources case ColumnSources: { uint16 sc = file->GetSourceCount(); uint16 ncsc = file->GetNotCurrentSourcesCount(); if ( ncsc ) { text = CFormat(wxT("%i/%i")) % (sc - ncsc) % sc; } else { text = CFormat(wxT("%i")) % sc; } if ( file->GetSrcA4AFCount() ) { text += CFormat(wxT("+%i")) % file->GetSrcA4AFCount(); } if ( file->GetTransferingSrcCount() ) { text += CFormat(wxT(" (%i)")) % file->GetTransferingSrcCount(); } break; } // Priority case ColumnPriority: text = PriorityToStr( file->GetDownPriority(), file->IsAutoDownPriority() ); break; // File-status case ColumnStatus: text = file->getPartfileStatus(); break; // Remaining case ColumnTimeRemaining: { if ((file->GetStatus() != PS_COMPLETING) && file->IsPartFile()) { uint64 remainSize = file->GetFileSize() - file->GetCompletedSize(); sint32 remainTime = file->getTimeRemaining(); if (remainTime >= 0) { text = CastSecondsToHM(remainTime); } else { text = _("Unknown"); } text += wxT(" (") + CastItoXBytes(remainSize) + wxT(")"); } break; } // Last seen completed case ColumnLastSeenComplete: { if ( file->lastseencomplete ) { text = wxDateTime( file->lastseencomplete ).Format( _("%y/%m/%d %H:%M:%S") ); } else { text = _("Unknown"); } break; } // Last received case ColumnLastReception: { const time_t lastReceived = file->GetLastChangeDatetime(); if (lastReceived) { text = wxDateTime(lastReceived).Format( _("%y/%m/%d %H:%M:%S") ); } else { text = _("Unknown"); } } } if ( !text.IsEmpty() ) { dc->DrawText( text, rect.GetX(), rect.GetY() ); } } wxString CDownloadListCtrl::GetTTSText(unsigned item) const { return ((FileCtrlItem_Struct*)GetItemData(item))->GetFile()->GetFileName().GetPrintable(); } int CDownloadListCtrl::SortProc(wxUIntPtr param1, wxUIntPtr param2, long sortData) { FileCtrlItem_Struct* item1 = (FileCtrlItem_Struct*)param1; FileCtrlItem_Struct* item2 = (FileCtrlItem_Struct*)param2; int sortMod = (sortData & CMuleListCtrl::SORT_DES) ? -1 : 1; sortData &= CMuleListCtrl::COLUMN_MASK; // We modify the result so that it matches with ascending or decending return sortMod * Compare( item1->GetFile(), item2->GetFile(), sortData); } int CDownloadListCtrl::Compare( const CPartFile* file1, const CPartFile* file2, long lParamSort) { int result = 0; switch (lParamSort) { // Sort by part number case ColumnPart: result = CmpAny( file1->GetPartMetNumber(), file2->GetPartMetNumber() ); break; // Sort by filename case ColumnFileName: result = CmpAny( file1->GetFileName(), file2->GetFileName() ); break; // Sort by size case ColumnSize: result = CmpAny( file1->GetFileSize(), file2->GetFileSize() ); break; // Sort by transferred case ColumnTransferred: result = CmpAny( file1->GetTransferred(), file2->GetTransferred() ); break; // Sort by completed case ColumnCompleted: result = CmpAny( file1->GetCompletedSize(), file2->GetCompletedSize() ); break; // Sort by speed case ColumnSpeed: result = CmpAny( file1->GetKBpsDown() * 1024, file2->GetKBpsDown() * 1024 ); break; // Sort by percentage completed case ColumnProgress: result = CmpAny( file1->GetPercentCompleted(), file2->GetPercentCompleted() ); break; // Sort by number of sources case ColumnSources: result = CmpAny( file1->GetSourceCount(), file2->GetSourceCount() ); break; // Sort by priority case ColumnPriority: result = CmpAny( file1->GetDownPriority(), file2->GetDownPriority() ); break; // Sort by status case ColumnStatus: result = CmpAny( file1->getPartfileStatusRang(), file2->getPartfileStatusRang() ); break; // Sort by remaining time case ColumnTimeRemaining: if (file1->getTimeRemaining() == -1) { if (file2->getTimeRemaining() == -1) { result = 0; } else { result = 1; } } else { if (file2->getTimeRemaining() == -1) { result = -1; } else { result = CmpAny( file1->getTimeRemaining(), file2->getTimeRemaining() ); } } break; // Sort by last seen complete case ColumnLastSeenComplete: result = CmpAny( file1->lastseencomplete, file2->lastseencomplete ); break; // Sort by last reception case ColumnLastReception: result = CmpAny( file1->GetLastChangeDatetime(), file2->GetLastChangeDatetime() ); break; } return result; } void CDownloadListCtrl::ClearCompleted() { CastByID(ID_BTNCLRCOMPL, GetParent(), wxButton)->Enable(false); // Search for completed files ListOfUInts32 toClear; for ( ListItems::iterator it = m_ListItems.begin(); it != m_ListItems.end(); ) { FileCtrlItem_Struct* item = it->second; ++it; CPartFile* file = item->GetFile(); if (file->IsCompleted() && file->CheckShowItemInGivenCat(m_category)) { toClear.push_back(file->ECID()); } } if (!toClear.empty()) { theApp->downloadqueue->ClearCompleted(toClear); } } void CDownloadListCtrl::ShowFilesCount( int diff ) { m_filecount += diff; wxStaticText* label = CastByName( wxT("downloadsLabel"), GetParent(), wxStaticText ); label->SetLabel(CFormat(_("Downloads (%i)")) % m_filecount); label->GetParent()->Layout(); } static const CMuleColour crHave(104, 104, 104); static const CMuleColour crFlatHave(0, 0, 0); static const CMuleColour crPending(255, 208, 0); static const CMuleColour crFlatPending(255, 255, 100); static const CMuleColour crProgress(0, 224, 0); static const CMuleColour crFlatProgress(0, 150, 0); static const CMuleColour crMissing(255, 0, 0); void CDownloadListCtrl::DrawFileStatusBar( const CPartFile* file, wxDC* dc, const wxRect& rect, bool bFlat ) const { static CBarShader s_ChunkBar(16); s_ChunkBar.SetHeight(rect.height); s_ChunkBar.SetWidth(rect.width); s_ChunkBar.SetFileSize( file->GetFileSize() ); s_ChunkBar.Set3dDepth( thePrefs::Get3DDepth() ); if ( file->IsCompleted() || file->GetStatus() == PS_COMPLETING ) { s_ChunkBar.Fill( bFlat ? crFlatProgress : crProgress ); s_ChunkBar.Draw(dc, rect.x, rect.y, bFlat); return; } // Part availability ( of missing parts ) const CGapList& gaplist = file->GetGapList(); CGapList::const_iterator it = gaplist.begin(); uint64 lastGapEnd = 0; CMuleColour colour; for (; it != gaplist.end(); ++it) { // Start position uint32 start = ( it.start() / PARTSIZE ); // fill the Have-Part (between this gap and the last) if (it.start()) { s_ChunkBar.FillRange(lastGapEnd + 1, it.start() - 1, bFlat ? crFlatHave : crHave); } lastGapEnd = it.end(); // End position uint32 end = ( it.end() / PARTSIZE ) + 1; // Avoid going past the filesize. Dunno if this can happen, but the old code did check. if ( end > file->GetPartCount() ) { end = file->GetPartCount(); } // Place each gap, one PART at a time for ( uint64 i = start; i < end; ++i ) { if ( i < file->m_SrcpartFrequency.size() && file->m_SrcpartFrequency[i]) { int blue = 210 - ( 22 * ( file->m_SrcpartFrequency[i] - 1 ) ); colour.Set(0, ( blue < 0 ? 0 : blue ), 255 ); } else { colour = crMissing; } if ( file->IsStopped() ) { colour.Blend(50); } uint64 gap_begin = ( i == start ? it.start() : PARTSIZE * i ); uint64 gap_end = ( i == end - 1 ? it.end() : PARTSIZE * ( i + 1 ) - 1 ); s_ChunkBar.FillRange( gap_begin, gap_end, colour); } } // fill the last Have-Part (between this gap and the last) s_ChunkBar.FillRange(lastGapEnd + 1, file->GetFileSize() - 1, bFlat ? crFlatHave : crHave); // Pending parts const CPartFile::CReqBlockPtrList& requestedblocks_list = file->GetRequestedBlockList(); CPartFile::CReqBlockPtrList::const_iterator it2 = requestedblocks_list.begin(); // adjacing pending parts must be joined to avoid bright lines between them uint64 lastStartOffset = 0; uint64 lastEndOffset = 0; colour = bFlat ? crFlatPending : crPending; if ( file->IsStopped() ) { colour.Blend(50); } for (; it2 != requestedblocks_list.end(); ++it2) { if ((*it2)->StartOffset > lastEndOffset + 1) { // not adjacing, draw last block s_ChunkBar.FillRange(lastStartOffset, lastEndOffset, colour); lastStartOffset = (*it2)->StartOffset; lastEndOffset = (*it2)->EndOffset; } else { // adjacing, grow block lastEndOffset = (*it2)->EndOffset; } } s_ChunkBar.FillRange(lastStartOffset, lastEndOffset, colour); // Draw the progress-bar s_ChunkBar.Draw( dc, rect.x, rect.y, bFlat ); // Green progressbar width int width = (int)(( (float)rect.width / (float)file->GetFileSize() ) * file->GetCompletedSize() ); if ( bFlat ) { dc->SetBrush( crFlatProgress.GetBrush() ); dc->DrawRectangle( rect.x, rect.y, width, 3 ); } else { // Draw the two black lines for 3d-effect dc->SetPen( *wxBLACK_PEN ); dc->DrawLine( rect.x, rect.y + 0, rect.x + width, rect.y + 0 ); dc->DrawLine( rect.x, rect.y + 2, rect.x + width, rect.y + 2 ); // Draw the green line dc->SetPen( *(wxThePenList->FindOrCreatePen( crProgress , 1, wxSOLID ) )); dc->DrawLine( rect.x, rect.y + 1, rect.x + width, rect.y + 1 ); } } #ifdef __WXMSW__ # define QUOTE wxT("\"") #else # define QUOTE wxT("\'") #endif void CDownloadListCtrl::PreviewFile(CPartFile* file) { wxString command; // If no player set in preferences, use mplayer. // And please, do a warning also :P if (thePrefs::GetVideoPlayer().IsEmpty()) { wxMessageBox(_( "To prevent this warning to show up in every preview,\nset your preferred video player in preferences (default is mplayer)."), _("File preview"), wxOK, this); // Since newer versions for some reason mplayer does not automatically // select video output device and needs a parameter, go figure... command = wxT("xterm -T \"aMule Preview\" -iconic -e mplayer ") QUOTE wxT("$file") QUOTE; } else { command = thePrefs::GetVideoPlayer(); } wxString partFile; // File name with full path wxString partName; // File name only, without path // Check if we are (pre)viewing a completed file or not if (!file->IsCompleted()) { // Remove the .met and see if out video player specifiation uses the magic string partName = file->GetPartMetFileName().RemoveExt().GetRaw(); partFile = thePrefs::GetTempDir().JoinPaths(file->GetPartMetFileName().RemoveExt()).GetRaw(); } else { // This is a complete file // FIXME: This is probably not going to work if the filenames are mangled ... partName = file->GetFileName().GetRaw(); partFile = file->GetFullName().GetRaw(); } // Compatibility with old behaviour if (!command.Replace(wxT("$file"), wxT("%PARTFILE"))) { if ((command.Find(wxT("%PARTFILE")) == wxNOT_FOUND) && (command.Find(wxT("%PARTNAME")) == wxNOT_FOUND)) { // No magic string, so we just append the filename to the player command // Need to use quotes in case filename contains spaces command << wxT(" ") << QUOTE << wxT("%PARTFILE") << QUOTE; } } #ifndef __WXMSW__ // We have to escape quote characters in the file name, otherwise arbitrary // options could be passed to the player. partFile.Replace(QUOTE, wxT("\\") QUOTE); partName.Replace(QUOTE, wxT("\\") QUOTE); #endif command.Replace(wxT("%PARTFILE"), partFile); command.Replace(wxT("%PARTNAME"), partName); // We can't use wxShell here, it blocks the app CTerminationProcess *p = new CTerminationProcess(command); int ret = wxExecute(command, wxEXEC_ASYNC, p); bool ok = ret > 0; if (!ok) { delete p; AddLogLineC(CFormat( _("ERROR: Failed to execute external media-player! Command: `%s'") ) % command ); } } // File_checked_for_headers aMule-2.3.1/src/ArchSpecific.h0000644000175000017470000001215611575347521014766 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef ARCHSPECIFIC_H #define ARCHSPECIFIC_H #include "Types.h" #define ENDIAN_SWAP_16(x) (wxUINT16_SWAP_ON_BE(x)) #define ENDIAN_SWAP_I_16(x) x = wxUINT16_SWAP_ON_BE(x) #define ENDIAN_SWAP_32(x) (wxUINT32_SWAP_ON_BE(x)) #define ENDIAN_SWAP_I_32(x) x = wxUINT32_SWAP_ON_BE(x) #if ((defined __GNUC__) && __GNUC__ >= 2) || defined (_MSC_VER) || (defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x550)) #define ENDIAN_SWAP_64(x) (wxUINT64_SWAP_ON_BE(x)) #define ENDIAN_SWAP_I_64(x) x = wxUINT64_SWAP_ON_BE(x) #endif // ntohs #define ENDIAN_NTOHS(x) ( wxUINT16_SWAP_ON_LE(x) ) // ntohl #define ENDIAN_NTOHL(x) ( wxUINT32_SWAP_ON_LE(x) ) // new #define ENDIAN_NTOHLL(x) ( wxUINT64_SWAP_ON_LE(x) ) // htons #define ENDIAN_HTONS(x) ( wxUINT16_SWAP_ON_LE(x) ) // htonl #define ENDIAN_HTONL(x) ( wxUINT32_SWAP_ON_LE(x) ) // new #define ENDIAN_HTONLL(x) ( wxUINT64_SWAP_ON_LE(x) ) /** * Returns the value in the given bytestream. * * The value is returned exactly as it is found. */ // \{ inline uint16 RawPeekUInt16(const void* p); inline uint32 RawPeekUInt32(const void* p); inline uint64 RawPeekUInt64(const void* p); // \} /** * Writes the specified value into the bytestream. * * The value is written exactly as it is. */ // \{ inline void RawPokeUInt16(void* p, uint16 nVal); inline void RawPokeUInt32(void* p, uint32 nVal); inline void RawPokeUInt64(void* p, uint64 nVal); // \} /** * Returns the value in the given bytestream. * * The value is returned as little-endian. */ // \{ inline uint8 PeekUInt8(const void* p); inline uint16 PeekUInt16(const void* p); inline uint32 PeekUInt32(const void* p); inline uint64 PeekUInt64(const void* p); // \} /** * Writes the specified value into the bytestream. * * The value is written as little-endian. */ // \{ inline void PokeUInt8(void* p, uint8 nVal); inline void PokeUInt16(void* p, uint16 nVal); inline void PokeUInt32(void* p, uint32 nVal); inline void PokeUInt64(void* p, uint64 nVal); // \} #if defined(__arm__) || defined(__sparc__) || defined(__mips__) #define ARM_OR_SPARC #endif /////////////////////////////////////////////////////////////////////////////// // Peek - helper functions for read-accessing memory without modifying the memory pointer inline uint16 RawPeekUInt16(const void* p) { #ifndef ARM_OR_SPARC return *((uint16*)p); #else uint16 value; memcpy( &value, p, sizeof( uint16 ) ); return value; #endif } inline uint32 RawPeekUInt32(const void* p) { #ifndef ARM_OR_SPARC return *((uint32*)p); #else uint32 value; memcpy( &value, p, sizeof( uint32 ) ); return value; #endif } inline uint64 RawPeekUInt64(const void* p) { #ifndef ARM_OR_SPARC return *((uint64*)p); #else uint64 value; memcpy( &value, p, sizeof( uint64 ) ); return value; #endif } inline uint8 PeekUInt8(const void* p) { return *((uint8*)p); } inline uint16 PeekUInt16(const void* p) { return ENDIAN_SWAP_16( RawPeekUInt16( p ) ); } inline uint32 PeekUInt32(const void* p) { return ENDIAN_SWAP_32( RawPeekUInt32( p ) ); } inline uint64 PeekUInt64(const void* p) { return ENDIAN_SWAP_64( RawPeekUInt64( p ) ); } /////////////////////////////////////////////////////////////////////////////// // Poke - helper functions for write-accessing memory without modifying the memory pointer inline void RawPokeUInt16(void* p, uint16 nVal) { #ifndef ARM_OR_SPARC *((uint16*)p) = nVal; #else memcpy( p, &nVal, sizeof(uint16) ); #endif } inline void RawPokeUInt32(void* p, uint32 nVal) { #ifndef ARM_OR_SPARC *((uint32*)p) = nVal; #else memcpy( p, &nVal, sizeof(uint32) ); #endif } inline void RawPokeUInt64(void* p, uint64 nVal) { #ifndef ARM_OR_SPARC *((uint64*)p) = nVal; #else memcpy( p, &nVal, sizeof(uint64) ); #endif } inline void PokeUInt8(void* p, uint8 nVal) { *((uint8*)p) = nVal; } inline void PokeUInt16(void* p, uint16 nVal) { RawPokeUInt16( p, ENDIAN_SWAP_16( nVal ) ); } inline void PokeUInt32(void* p, uint32 nVal) { RawPokeUInt32( p, ENDIAN_SWAP_32( nVal ) ); } inline void PokeUInt64(void* p, uint64 nVal) { RawPokeUInt64( p, ENDIAN_SWAP_64( nVal ) ); } #endif // File_checked_for_headers aMule-2.3.1/src/ClientRef.cpp0000644000175000017470000001267511575347521014657 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2003-2011 Stu Redman ( sturedman@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include "ClientRef.h" #include "amule.h" // Needed fot theApp #ifdef CLIENT_GUI #include "UpDownClientEC.h" // Needed for CUpDownClient #else #include "updownclient.h" // Needed for CUpDownClient #endif #ifdef DEBUG_ZOMBIE_CLIENTS #define MFROM m_from #define ASSIGN_MFROM(a) m_from = a #else #define MFROM #define ASSIGN_MFROM(a) #endif CClientRef::CClientRef(const CClientRef& ref) { m_client = ref.m_client; ASSIGN_MFROM(wxT("copy ctor of ") + ref.m_from); if (m_client) { m_client->Link(MFROM); } } CClientRef::CClientRef(CUpDownClient * client LINKED_FROM) { m_client = client; ASSIGN_MFROM(from); if (m_client) { m_client->Link(MFROM); } } void CClientRef::Link(CUpDownClient * client LINKED_FROM) { Unlink(); m_client = client; ASSIGN_MFROM(from); if (m_client) { m_client->Link(MFROM); } } void CClientRef::Unlink() { if (m_client) { m_client->Unlink(MFROM); m_client = NULL; } } // in amulegui clients are never deleted except when they are marked as removed through EC #ifndef CLIENT_GUI CUpDownClient * CClientRef::GetClientChecked() { if (m_client && m_client->HasBeenDeleted()) { m_client->Unlink(MFROM); m_client = NULL; } return m_client; } CClientRef& CClientRef::GetRef() { if (m_client && m_client->HasBeenDeleted()) { m_client->Unlink(MFROM); m_client = NULL; } return *this; } void CClientRef::Safe_Delete() { CUpDownClient * client = m_client; if (client) { Unlink(); client->Safe_Delete(); } } #endif #define WRAPC(func) CClientRef::func() const { return m_client->func(); } uint32 WRAPC(ECID) bool WRAPC(ExtProtocolAvailable) uint16 WRAPC(GetAvailablePartCount) const wxString& WRAPC(GetClientFilename) const wxString& WRAPC(GetClientModString) const wxString& WRAPC(GetClientOSInfo) uint8 WRAPC(GetClientSoft) const wxString& WRAPC(GetClientVerString) uint64 WRAPC(GetDownloadedTotal) uint8 WRAPC(GetDownloadState) CFriend* WRAPC(GetFriend) bool WRAPC(GetFriendSlot) wxString WRAPC(GetFullIP) uint32 WRAPC(GetIP) uint16 WRAPC(GetKadPort) float WRAPC(GetKBpsDown) uint16 WRAPC(GetLastDownloadingPart) uint16 WRAPC(GetNextRequestedPart) uint8 WRAPC(GetObfuscationStatus) uint16 WRAPC(GetOldRemoteQueueRank) const BitVector& WRAPC(GetPartStatus) uint16 WRAPC(GetRemoteQueueRank) CPartFile* WRAPC(GetRequestFile) uint32 WRAPC(GetScore) double WRAPC(GetScoreRatio) uint32 WRAPC(GetServerIP) const wxString WRAPC(GetServerName) uint16 WRAPC(GetServerPort) const wxString& WRAPC(GetSoftStr) const wxString& WRAPC(GetSoftVerStr) int WRAPC(GetSourceFrom) uint64 WRAPC(GetTransferredDown) uint64 WRAPC(GetTransferredUp) uint32 WRAPC(GetUploadDatarate) uint64 WRAPC(GetUploadedTotal) const CKnownFile* WRAPC(GetUploadFile) uint16 WRAPC(GetUploadQueueWaitingPosition) uint8 WRAPC(GetUploadState) size_t WRAPC(GetUpPartCount) uint32 WRAPC(GetUserIDHybrid) const wxString& WRAPC(GetUserName) uint16_t WRAPC(GetUserPort) const CMD4Hash& WRAPC(GetUserHash) uint32 WRAPC(GetVersion) bool WRAPC(HasDisabledSharedFiles) bool WRAPC(HasLowID) bool WRAPC(IsBadGuy) bool WRAPC(IsFriend) bool WRAPC(IsIdentified) bool WRAPC(IsRemoteQueueFull) void WRAPC(RequestSharedFileList) bool CClientRef::IsUpPartAvailable(uint16 iPart) const { return m_client->IsUpPartAvailable(iPart); } void CClientRef::SetFriend(CFriend* newfriend) const { m_client->SetFriend(newfriend); } void CClientRef::SetFriendSlot(bool bNV) const { m_client->SetFriendSlot(bNV); } #ifndef CLIENT_GUI void WRAPC(ClearUploadFileID) uint16 WRAPC(GetUDPPort) void CClientRef::SetCommentDirty(bool bDirty) const { m_client->SetCommentDirty(bDirty); } #endif bool CClientRef::SwapToAnotherFile(bool bIgnoreNoNeeded, bool ignoreSuspensions, bool bRemoveCompletely, CPartFile* toFile) const { return m_client->SwapToAnotherFile(bIgnoreNoNeeded, ignoreSuspensions, bRemoveCompletely, toFile); } wxString CClientRef::GetSecureIdentTextStatus() const { wxString ret; if (theApp->CryptoAvailable()) { if (m_client->SUINotSupported()) { ret = _("Not supported"); } else if (m_client->SUIFailed()) { ret = _("Failed"); } else if (m_client->SUINeeded()) { ret = _("Not complete"); } else if (m_client->IsBadGuy()) { ret = _("Bad Guy"); } else if (m_client->IsIdentified()) { ret = _("Verified - OK"); } } else { ret = _("Not Available"); } return ret; } aMule-2.3.1/src/webserver/0000755000175000017470000000000011657306264014271 5ustar topiusersaMule-2.3.1/src/webserver/src/0000755000175000017470000000000011657306264015060 5ustar topiusersaMule-2.3.1/src/webserver/src/php_syntree.h0000644000175000017470000003700311575347521017574 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2005-2011 Froenchenko Leonid ( lfroen@gmail.com / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // /* * Syntax tree implementation for amule-PHP interpreter. */ #ifndef _PHP_SYNTREE_H_ #define _PHP_SYNTREE_H_ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #ifdef _MSC_VER typedef unsigned __int64 uint64_t; #define YY_NO_UNISTD_H #else #include #endif #if !defined PRIu64 # if defined(__alpha__) || defined(__ia64__) || defined(__ppc64__) || defined(__x86_64__) \ || defined(__mips64__) || defined(__hppa64__) || defined(__sparc64__) # define PRIu64 "lu" # else # define PRIu64 "llu" # endif #endif typedef enum PHP_VALUE_TYPE { /* simple values */ PHP_VAL_NONE, PHP_VAL_INT, PHP_VAL_FLOAT, PHP_VAL_STRING, PHP_VAL_BOOL, /* both point to same map but meaning is different */ PHP_VAL_ARRAY, PHP_VAL_OBJECT, /* Internally used (not ref counted) data */ PHP_VAL_INT_DATA, /* ptr_val points to VAR_NODE */ PHP_VAL_VAR_NODE } PHP_VALUE_TYPE; typedef struct PHP_VALUE_NODE { PHP_VALUE_TYPE type; union { uint64_t int_val; double float_val; char *str_val; /* used for arrays and internal objects: * * array contain std::map of key:value pairs * * object contain internally interpreted data */ void *ptr_val; struct { void *inst_ptr; const char *class_name; } obj_val; }; } PHP_VALUE_NODE; /* * Flags for different variable types/usages */ #define PHP_VARFLAG_STATIC 0x0001 #define PHP_VARFLAG_GLOBAL 0x0002 #define PHP_VARFLAG_BYREF 0x0004 /* Data about variable. */ typedef struct PHP_VAR_NODE { PHP_VALUE_NODE value; /* php support references */ int ref_count; int flags; } PHP_VAR_NODE; /* Node in expression tree. Contain either (left op right) or (value) */ typedef enum PHP_EXP_OP { PHP_OP_VAR, PHP_OP_VAL, PHP_OP_ASS, /* dereference */ PHP_OP_ARRAY_BY_KEY, PHP_OP_VAR_BY_EXP, /* array construct */ PHP_OP_ARRAY, PHP_OP_ARRAY_PAIR, PHP_OP_ARRAY_REF_PAIR, /* object access "->" and "::" */ PHP_OP_OBJECT_DEREF, PHP_OP_CLASS_DEREF, /* casting */ PHP_OP_CAST_INT, PHP_OP_CAST_FLOAT, PHP_OP_CAST_BOOL, PHP_OP_CAST_STR, /* arithmetics */ PHP_OP_MUL, PHP_OP_DIV, PHP_OP_ADD, PHP_OP_SUB, PHP_OP_REM, /* str concat */ PHP_OP_CAT, /* bits */ PHP_OP_SHL, PHP_OP_SHR, PHP_OP_OR, PHP_OP_AND, PHP_OP_XOR, PHP_OP_NOT, /* logical */ PHP_OP_LOG_OR, PHP_OP_LOG_AND, PHP_OP_LOG_XOR, PHP_OP_LOG_NOT, /* compare */ PHP_OP_EQ, PHP_OP_NEQ, PHP_OP_SAME, PHP_OP_NOT_SAME, PHP_OP_GRT, PHP_OP_GRT_EQ, PHP_OP_LWR, PHP_OP_LWR_EQ, /* conditional assign (mux) */ PHP_OP_MUX, /* specials */ PHP_OP_FUNC_CALL, PHP_OP_PRINT, PHP_OP_ECHO, PHP_MAKE_REF, /* list of expressions */ PHP_OP_LIST, /* for "switch" list of cases */ PHP_OP_CASE } PHP_EXP_OP; struct PHP_EXP_NODE { PHP_EXP_OP op; union { struct { struct PHP_EXP_NODE *left; /* In the 'switch' statement expression points * to beginning of code*/ union { struct PHP_EXP_NODE *right; struct PHP_SYN_NODE *syn_right; }; } tree_node; struct PHP_EXP_NODE *next; }; union { PHP_VALUE_NODE val_node; // for "internal" variables, like function param list PHP_VAR_NODE *var_node; struct PHP_SCOPE_ITEM *var_si_node; struct PHP_EXP_NODE *exp_node; }; }; typedef struct PHP_EXP_NODE PHP_EXP_NODE; typedef struct PHP_LIST_ASSIGN_NODE PHP_LIST_ASSIGN_NODE; struct PHP_LIST_ASSIGN_NODE { int is_list; union { PHP_VAR_NODE *var; PHP_LIST_ASSIGN_NODE *list; }; PHP_LIST_ASSIGN_NODE *next_node; }; typedef struct PHP_FUNC_PARAM_ITEM PHP_FUNC_PARAM_ITEM; struct PHP_FUNC_PARAM_ITEM { char *name; char *class_name; int byref; PHP_FUNC_PARAM_ITEM *next_item; }; typedef struct PHP_SYN_NODE PHP_SYN_NODE; /* * Scope table: holding variable definition and declarations for * functions and classes * Can be present in several locations: * 1. Representing stack frame block, inside of called function * 2. As global scope - holder of global vars, classes and global functions * 3. At class scope - holder of class members * 4. Copied to class instanse * */ typedef enum PHP_SCOPE_ITEM_TYPE { PHP_SCOPE_NONE, PHP_SCOPE_VAR, PHP_SCOPE_FUNC, PHP_SCOPE_CLASS, PHP_SCOPE_PARAM } PHP_SCOPE_ITEM_TYPE; typedef struct PHP_SCOPE_ITEM { PHP_SCOPE_ITEM_TYPE type; union { PHP_VAR_NODE *var; PHP_SYN_NODE *func; PHP_SYN_NODE *class_decl; struct { PHP_VAR_NODE *var; int num; } param; }; } PHP_SCOPE_ITEM; /* thre's stl object behind it */ typedef void *PHP_SCOPE_TABLE; typedef void *PHP_SCOPE_STACK; /* Syntax tree node, representing 1 statement. */ typedef enum PHP_STATMENT_TYPE { PHP_ST_EXPR, PHP_ST_IF, PHP_ST_WHILE, PHP_ST_DO_WHILE, PHP_ST_FOR, PHP_ST_FOREACH, PHP_ST_SWITCH, PHP_ST_CONTINUE, PHP_ST_BREAK, PHP_ST_RET, PHP_ST_FUNC_DECL, PHP_ST_CLASS_DECL, PHP_ST_ECHO } PHP_STATMENT_TYPE; /* * Syntax tree constructs: regular statements and declarations */ typedef struct PHP_SYN_IF_NODE { PHP_EXP_NODE *cond; PHP_SYN_NODE *code_if, *code_else; } PHP_SYN_IF_NODE; typedef struct PHP_SYN_WHILE_NODE { PHP_EXP_NODE *cond; PHP_SYN_NODE *code; } PHP_SYN_WHILE_NODE; typedef struct PHP_SYN_FOR_NODE { PHP_EXP_NODE *do_start, *cond, *do_next; PHP_SYN_NODE *code; } PHP_SYN_FOR_NODE; typedef struct PHP_SYN_FOREACH_NODE { PHP_EXP_NODE *elems; PHP_SCOPE_ITEM *i_key; PHP_SCOPE_ITEM *i_val; PHP_SYN_NODE *code; int byref; } PHP_SYN_FOREACH_NODE; typedef struct PHP_SYN_SWITCH_NODE { PHP_EXP_NODE *cond; PHP_EXP_NODE *case_list; } PHP_SYN_SWITCH_NODE; /* for built-in or native functions */ typedef void (*PHP_NATIVE_FUNC_PTR)(PHP_VALUE_NODE *result); typedef struct PHP_FUNC_PARAM_DEF { char *class_name; int byref; PHP_VALUE_NODE def_value; /* * In PHP, user can choose per-call whether parameter is passed * by value of by reference. So, save ptr to original varnode, * for "byvalue" case since we don't have other lvalue to put in * that scope item. */ PHP_VAR_NODE *var; PHP_SCOPE_ITEM *si_var; } PHP_FUNC_PARAM_DEF; typedef struct PHP_SYN_FUNC_DECL_NODE { char *name; PHP_SCOPE_TABLE scope; int is_native; union { PHP_SYN_NODE *code; PHP_NATIVE_FUNC_PTR native_ptr; }; int param_count; PHP_FUNC_PARAM_DEF *params; } PHP_SYN_FUNC_DECL_NODE; /* * Evaluating $obj->some_field for built-in objects */ typedef void (*PHP_NATIVE_PROP_GET_FUNC_PTR)(void *obj, char *prop_name, PHP_VALUE_NODE *result); typedef struct PHP_SYN_CLASS_DECL_NODE { int is_native; char *name; union { PHP_SCOPE_TABLE decl_scope; PHP_NATIVE_PROP_GET_FUNC_PTR native_prop_get_ptr; }; } PHP_SYN_CLASS_DECL_NODE; struct PHP_SYN_NODE { PHP_STATMENT_TYPE type; union { PHP_EXP_NODE *node_expr; PHP_SYN_IF_NODE node_if; PHP_SYN_WHILE_NODE node_while; PHP_SYN_FOREACH_NODE node_foreach; PHP_SYN_FOR_NODE node_for; PHP_SYN_SWITCH_NODE node_switch; PHP_SYN_FUNC_DECL_NODE *func_decl; PHP_SYN_CLASS_DECL_NODE *class_decl; }; PHP_SYN_NODE *next_node; }; /* * Interface to lib of built-in functions, classes, variables */ /* * Using fixed size array will allow "in-place" definition * of built-in functions without pointer mess. * */ #define PHP_MAX_FUNC_PARAM 16 typedef struct PHP_BLTIN_FUNC_DEF { const char *name; int param_count; PHP_NATIVE_FUNC_PTR func; } PHP_BLTIN_FUNC_DEF; typedef enum PHP_MSG_TYPE { PHP_MESAGE, PHP_WARNING, PHP_ERROR, PHP_INTERNAL_ERROR } PHP_MSG_TYPE; #ifdef __cplusplus extern "C" { #endif /* * lex/yacc stuff */ int phperror(char *err); int phpparse(); extern int pphdebug; extern FILE *phpin; extern char *phptext; extern int phplineno; /* * Syntax tree interface to parser */ /* * Const expressions */ PHP_EXP_NODE *make_const_exp_dnum(int number); PHP_EXP_NODE *make_const_exp_fnum(float number); PHP_EXP_NODE *make_const_exp_str(char *s, int unescape); // exp node for internally handled data PHP_EXP_NODE *make_const_exp_int_obj(void *obj); /* casting functions */ void cast_value_dnum(PHP_VALUE_NODE *e); void cast_value_fnum(PHP_VALUE_NODE *e); void cast_value_str(PHP_VALUE_NODE *e); void cast_value_array(PHP_VALUE_NODE *e); void cast_value_bool(PHP_VALUE_NODE *e); void value_value_free(PHP_VALUE_NODE *val); void value_value_assign(PHP_VALUE_NODE *src, PHP_VALUE_NODE *dst); void var_node_free(PHP_VAR_NODE *var); /* array operations */ PHP_VAR_NODE *array_get_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key); PHP_VAR_NODE *array_get_by_int_key(PHP_VALUE_NODE *array, int key); int array_is_key_here(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key); int array_get_size(PHP_VALUE_NODE *array); PHP_VAR_NODE *array_push_back(PHP_VALUE_NODE *array); void array_add_to_int_key(PHP_VALUE_NODE *array, int key, PHP_VAR_NODE *node); void array_set_by_key(PHP_VALUE_NODE *array, PHP_VALUE_NODE *key, PHP_VAR_NODE *node); PHP_VAR_NODE *make_array_var(); // signle operand expression: // FIXME: prefix and postfix form not recognized PHP_EXP_NODE *make_exp_1(PHP_EXP_OP op, PHP_EXP_NODE *operand); PHP_EXP_NODE *make_exp_2(PHP_EXP_OP op, PHP_EXP_NODE *left, PHP_EXP_NODE *right); // this is for "OP=" forms PHP_EXP_NODE *make_exp_2_self(PHP_EXP_OP op, PHP_EXP_NODE *self, PHP_EXP_NODE *right); PHP_EXP_NODE *make_known_const(char *name); PHP_EXP_NODE *make_func_call_exp(char *func_name, PHP_EXP_NODE *args); // create func call param list PHP_EXP_NODE *make_func_call_param_list(); // add next argument to function call param list void func_call_add_expr(PHP_VAR_NODE *paramlist, PHP_EXP_NODE *arg, int byref); extern PHP_SYN_NODE *g_syn_tree_top; /* make syntax node for expression */ PHP_SYN_NODE *make_expr_syn_node(PHP_STATMENT_TYPE type, PHP_EXP_NODE *node); PHP_SYN_NODE *make_ifelse_syn_node(PHP_EXP_NODE *expr, PHP_SYN_NODE *then_node, PHP_SYN_NODE *elseif_list, PHP_SYN_NODE *else_node); PHP_SYN_NODE *make_while_loop_syn_node(PHP_EXP_NODE *cond, PHP_SYN_NODE *code, int do_while); PHP_SYN_NODE *make_foreach_loop_syn_node(PHP_EXP_NODE *elems, PHP_EXP_NODE *i_key, PHP_EXP_NODE *i_val, PHP_SYN_NODE *code, int byref); PHP_SYN_NODE *make_for_syn_node(PHP_EXP_NODE *start, PHP_EXP_NODE *cond, PHP_EXP_NODE *next, PHP_SYN_NODE *code); PHP_SYN_NODE *make_class_decl_syn_node(); PHP_SYN_NODE *make_func_decl_syn_node(const char *name, PHP_EXP_NODE *param_list); PHP_SYN_NODE *make_switch_syn_node(PHP_EXP_NODE *cond, PHP_EXP_NODE *case_list); // // add new item into function param list (in declaration ) // PHP_EXP_NODE *make_func_param(PHP_EXP_NODE *list, PHP_EXP_NODE *var_exp_node, char *class_name, int byref); PHP_VAR_NODE *make_var_node(); PHP_EXP_NODE *get_var_node(const char *name); // C can't call "delete" void free_var_node(PHP_VAR_NODE *v); /* scope table manipulation */ extern PHP_SCOPE_TABLE g_global_scope, g_current_scope; extern PHP_SCOPE_STACK g_scope_stack; PHP_SCOPE_TABLE make_scope_table(); void delete_scope_table(PHP_SCOPE_TABLE scope); void switch_push_scope_table(PHP_SCOPE_TABLE new_table); void switch_pop_scope_table(int old_free); void scope_reset_nonstatics(PHP_SCOPE_TABLE scope); void add_func_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *func); void add_class_2_scope(PHP_SCOPE_TABLE scope, PHP_SYN_NODE *class_node); PHP_SCOPE_ITEM *add_var_2_scope(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var, const char *name); const char *get_scope_var_name(PHP_SCOPE_TABLE scope, PHP_VAR_NODE *var); PHP_SCOPE_ITEM_TYPE get_scope_item_type(PHP_SCOPE_TABLE scope, const char *name); PHP_SCOPE_ITEM *get_scope_item(PHP_SCOPE_TABLE scope, const char *name); /* engine */ void php_engine_init(); void php_engine_free(); void php_syn_tree_free(PHP_SYN_NODE *tree); void php_exp_tree_free(PHP_EXP_NODE *tree); /* * Return code meaning: * 0 : continue execution to the next statement * +x : return and skip current loop cycle, as "continue expr" means * -x : return and break as "break expr" means * In non-loop situation any != 0 code means "return" */ int php_execute(PHP_SYN_NODE *node, PHP_VALUE_NODE *result); void php_expr_eval(PHP_EXP_NODE *expr, PHP_VALUE_NODE *result); PHP_VAR_NODE *php_expr_eval_lvalue(PHP_EXP_NODE *expr); void php_eval_simple_math(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); void php_eval_int_math(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); void php_eval_compare(PHP_EXP_OP op, PHP_VALUE_NODE *op1, PHP_VALUE_NODE *op2, PHP_VALUE_NODE *result); void php_add_native_func(PHP_BLTIN_FUNC_DEF *def); void php_add_native_class(const char *name, PHP_NATIVE_PROP_GET_FUNC_PTR prop_get_native_ptr); // // left = VAR(func_name), right=ARRAY(args) void php_run_func_call(PHP_EXP_NODE *node, PHP_VALUE_NODE *result); #ifdef __GNUC__ void php_report_error(PHP_MSG_TYPE mtype, const char *msg, ...) __attribute__ ((__format__ (__printf__, 2, 3))); #else void php_report_error(PHP_MSG_TYPE mtype, const char *msg, ...); #endif /* * Debugging */ void print_val_node(PHP_VALUE_NODE *node, int ident); void print_exp_node(PHP_EXP_NODE *node, int ident); void print_syn_node(PHP_SYN_NODE *node, int ident); #ifdef __cplusplus } #endif /* * C++ only functions, type definitions */ #ifdef __cplusplus typedef std::map::iterator PHP_ARRAY_ITER_TYPE; typedef std::list::iterator PHP_ARRAY_KEY_ITER_TYPE; // // In php arrays are behave like hashes (i.e. associative) and are sortable. // STL std::map is not sortable. // typedef struct { std::map array; std::list sorted_keys; PHP_ARRAY_KEY_ITER_TYPE current; } PHP_ARRAY_TYPE; // // using std::string instead of "char *" so keys will be compared // by string value typedef std::map PHP_SCOPE_TABLE_TYPE; typedef std::list PHP_SCOPE_STACK_TYPE; const std::string &array_get_ith_key(PHP_VALUE_NODE *array, int i); PHP_VAR_NODE *array_get_by_str_key(PHP_VALUE_NODE *array, std::string key); void array_add_to_str_key(PHP_VALUE_NODE *array, std::string key, PHP_VAR_NODE *node); void array_remove_at_str_key(PHP_VALUE_NODE *array, std::string key); void func_scope_init(PHP_FUNC_PARAM_DEF *params, int param_count, PHP_SCOPE_TABLE_TYPE *scope_map, PHP_VALUE_NODE *arg_array, std::map &saved_vars); #endif #endif //_PHP_SYNTREE_H_ // File_checked_for_headers aMule-2.3.1/src/webserver/src/WebServer.h0000644000175000017470000004443111575347521017143 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2003-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifndef WEBSERVER_H #define WEBSERVER_H #ifdef WITH_LIBPNG #include #endif #include "WebInterface.h" #include "KnownFile.h" #include "RLE.h" #include "OtherStructs.h" #include // Needed for CECID #ifdef ENABLE_UPNP # include "UPnPBase.h" #endif #include // For DownloadFile::wxtLastSeenComplete #ifdef _MSC_VER #define strncasecmp _strnicmp #define snprintf sprintf_s #define atoll _atoi64 #define strdup _strdup #endif class CWebSocket; class CMD4Hash; #define SESSION_TIMEOUT_SECS 300 // 5 minutes session expiration #define SHORT_FILENAME_LENGTH 40 // Max size of file name. wxString _SpecialChars(wxString str); class CEC_PartFile_Tag; class CEC_SharedFile_Tag; class CEC_UpDownClient_Tag; class CEC_SearchFile_Tag; class CProgressImage; class CEC_KadNode_Tag; class CURLDecoder { public: static wxString Decode(const wxString& url); }; class DownloadFile : public CECID { public: wxString sFileName; uint8 nFileStatus; uint64 lFileSize; uint64 lFileCompleted; uint64 lFileTransferred; unsigned long lFileSpeed; long lSourceCount; long lNotCurrentSourceCount; long lTransferringSourceCount; long lSourceCountA4AF; double fCompleted; uint32 lFilePrio; bool bFileAutoPriority; wxString sFileHash; wxString sED2kLink; uint8 nCat; wxDateTime wxtLastSeenComplete; CMD4Hash nHash; CProgressImage *m_Image; PartFileEncoderData m_Encoder; ArrayOfUInts16 m_PartInfo; std::vector m_ReqParts; ArrayOfUInts64 m_Gaps; // container require this static class DownloadFileInfo *GetContainerInstance(); DownloadFile(CEC_PartFile_Tag *); void ProcessUpdate(CEC_PartFile_Tag *); uint32 ID() { return ECID(); } }; class SharedFile : public CECID { public: wxString sFileName; uint64 lFileSize; uint64 nFileTransferred; uint64 nFileAllTimeTransferred; uint16 nFileRequests; uint32 nFileAllTimeRequests; uint16 nFileAccepts; uint32 nFileAllTimeAccepts; uint8 nFilePriority; bool bFileAutoPriority; wxString sFileHash; wxString sED2kLink; CMD4Hash nHash; static class SharedFileInfo *GetContainerInstance(); SharedFile(CEC_SharedFile_Tag *); void ProcessUpdate(CEC_SharedFile_Tag *); uint32 ID() { return ECID(); } }; class ServerEntry { public: wxString sServerName; wxString sServerDescription; uint32 nServerIP; uint16 nServerPort; wxString sServerIP; int nServerUsers; int nServerMaxUsers; int nServerFiles; static class ServersInfo *GetContainerInstance(); uint32 ID() { return nServerIP; } }; // This is a client we are uploading to, not a file class UploadFile : public CECID { public: wxString sUserName; uint32 nTransferredUp; uint32 nTransferredDown; uint32 nSpeed; uint32 nUploadFile; // ECID of shared file uploading to client UploadFile(CEC_UpDownClient_Tag *tag); static class UploadsInfo *GetContainerInstance(); uint32 ID() { return ECID(); } }; class SearchFile : public CECID { public: wxString sFileName; uint64 lFileSize; CMD4Hash nHash; wxString sHash; long lSourceCount; bool bPresent; SearchFile(CEC_SearchFile_Tag *); void ProcessUpdate(CEC_SearchFile_Tag *); static class SearchInfo *GetContainerInstance(); uint32 ID() { return ECID(); } }; /*! * T - type of items in container */ template class ItemsContainer { protected: CamulewebApp *m_webApp; std::list m_items; void EraseAll() { m_items.erase(m_items.begin(), m_items.end()); } public: ItemsContainer(CamulewebApp *webApp) { m_webApp = webApp; } virtual ~ItemsContainer() { } int ItemCount() { return m_items.size(); } T *AddItem(T &item) { m_items.push_back(item); T *real_ptr = &(m_items.back()); return real_ptr; } /*! * Re-query server: refresh all dataset */ virtual bool ReQuery() = 0; typedef typename std::list::iterator ItemIterator; ItemIterator GetBeginIterator() { return m_items.begin(); } ItemIterator GetEndIterator() { return m_items.end(); } }; /*! * T - type of items in container * I - type of item ID * G - type of tag in EC */ template class UpdatableItemsContainer : public ItemsContainer { protected: // need duplicate list with a map, so check "do we already have" // will take O(log(n)) instead of O(n) // map will contain pointers to items in list std::map m_items_hash; public: UpdatableItemsContainer(CamulewebApp *webApp) : ItemsContainer(webApp) { } T *AddItem(T &item) { T *real_ptr = ItemsContainer::AddItem(item); m_items_hash[item.ID()] = real_ptr; return real_ptr; } T *GetByID(I id) { // avoid creating nodes return m_items_hash.count(id) ? m_items_hash[id] : NULL; } T * GetByHash(const CMD4Hash &fileHash) { T * ret = 0; for (typename std::map::iterator it = m_items_hash.begin(); it != m_items_hash.end(); it++) { if (it->second->nHash == fileHash) { ret = it->second; break; } } return ret; } /*! * Process answer of update request, create list of new items for * full request later. Also remove items that no longer exist in core */ void ProcessUpdate(const CECPacket *reply, CECPacket *full_req, int req_type) { std::set core_files; for (CECPacket::const_iterator it = reply->begin(); it != reply->end(); it++) { G *tag = (G *) & *it; core_files.insert(tag->ID()); if ( m_items_hash.count(tag->ID()) ) { T *item = m_items_hash[tag->ID()]; item->ProcessUpdate(tag); } else { full_req->AddTag(CECTag(req_type, tag->ID())); } } std::list del_ids; for(typename std::list::iterator j = this->m_items.begin(); j != this->m_items.end(); j++) { if ( core_files.count(j->ID()) == 0 ) { // item may contain data that need to be freed externally, before // dtor is called and memory freed T *real_ptr = &*j; this->ItemDeleted(real_ptr); del_ids.push_back(j->ID()); } } for(typename std::list::iterator j = del_ids.begin(); j != del_ids.end(); j++) { m_items_hash.erase(*j); for(typename std::list::iterator k = this->m_items.begin(); k != this->m_items.end(); k++) { if ( *j == k->ID() ) { this->m_items.erase(k); break; } } } } void ProcessFull(const CECPacket *reply) { for (CECPacket::const_iterator it = reply->begin(); it != reply->end(); it++) { G *tag = (G *) & *it; // initialize item data from EC tag T item(tag); T *real_ptr = AddItem(item); // initialize any external data that may depend on this item this->ItemInserted(real_ptr); } } bool DoRequery(int cmd, int tag) { CECPacket req_sts(cmd, EC_DETAIL_UPDATE); // // Phase 1: request status const CECPacket *reply = this->m_webApp->SendRecvMsg_v2(&req_sts); if ( !reply ) { return false; } // // Phase 2: update status, mark new files for subsequent query CECPacket req_full(cmd); ProcessUpdate(reply, &req_full, tag); delete reply; // Phase 3: request full info about files we don't have yet if ( req_full.HasChildTags() ) { reply = this->m_webApp->SendRecvMsg_v2(&req_full); if ( !reply ) { return false; } ProcessFull(reply); delete reply; } return true; } virtual void ItemDeleted(T *) { } virtual void ItemInserted(T *) { } }; class UploadsInfo : public ItemsContainer { public: // can be only one instance. static UploadsInfo *m_This; UploadsInfo(CamulewebApp *webApp); virtual bool ReQuery(); }; class ServersInfo : public ItemsContainer { public: // can be only one instance. static ServersInfo *m_This; ServersInfo(CamulewebApp *webApp); virtual bool ReQuery(); }; class SharedFileInfo : public UpdatableItemsContainer { public: // can be only one instance. static SharedFileInfo *m_This; SharedFileInfo(CamulewebApp *webApp); virtual bool ReQuery(); }; class SearchInfo : public UpdatableItemsContainer { public: static SearchInfo *m_This; SearchInfo(CamulewebApp *webApp); virtual bool ReQuery(); }; class CImageLib; class DownloadFileInfo : public UpdatableItemsContainer { CImageLib *m_ImageLib; // parameters of progress images wxString m_Template; int m_width, m_height; public: // can be only one instance. static DownloadFileInfo *m_This; DownloadFileInfo(CamulewebApp *webApp, CImageLib *imlib); void LoadImageParams(wxString &tpl, int width, int height); virtual bool ReQuery(); // container requirements void ItemInserted(DownloadFile *item); void ItemDeleted(DownloadFile *item); }; class CAnyImage { protected: unsigned char *m_data; int m_width, m_height; wxString m_name; int m_size, m_alloc_size; wxString m_Http; void Realloc(int size); void SetHttpType(wxString ext); public: CAnyImage(int size); CAnyImage(int width, int height); virtual ~CAnyImage(); const wxString& GetHTTP() const { return m_Http; } virtual unsigned char *RequestData(int &size); }; class CFileImage : public virtual CAnyImage { public: CFileImage(const wxString& name); bool OpenOk() { return m_size != 0; } }; class CImage3D_Modifiers { unsigned char *m_modifiers; int m_width; public: CImage3D_Modifiers(int width); ~CImage3D_Modifiers(); unsigned char operator[](int i) { return (i < m_width) ? m_modifiers[i] : 0; } }; class CProgressImage : public virtual CAnyImage { protected: DownloadFile *m_file; wxString m_template; // // Turn list of gaps, partstatus into array of color strips typedef struct Color_Gap_Struct : public Gap_Struct { uint32 color; } Color_Gap_Struct; // result of rendering - single line uint32 *m_ColorLine; void CreateSpan(); public: CProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); ~CProgressImage(); const wxString &Name() { return m_name; } virtual wxString GetHTML() = 0; }; #ifdef WITH_LIBPNG // // Dynamic png image generation // class CDynPngImage : public virtual CAnyImage { public: CDynPngImage(int w, int h); ~CDynPngImage(); virtual unsigned char *RequestData(int &size); protected: png_bytep m_img_data; png_bytep *m_row_ptrs; static void png_write_fn(png_structp png_ptr, png_bytep data, png_size_t length); }; // // Dynamic png image generation from gap info class CDynProgressImage : public virtual CProgressImage, public virtual CDynPngImage { CImage3D_Modifiers m_modifiers; void DrawImage(); public: CDynProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); ~CDynProgressImage(); virtual unsigned char *RequestData(int &size); virtual wxString GetHTML(); }; #else // // Fallback to original implementation class CDynProgressImage : public virtual CProgressImage { public: CDynProgressImage(int w, int h, wxString &tmpl, DownloadFile *file); virtual wxString GetHTML(); }; #endif // // Representing statistical sample for some parameter. Circular buffer // inside to avoid rellocations // class CStatsData { uint32 *m_data; uint32 m_max_value; int m_size; int m_start_index, m_end_index, m_curr_index; public: CStatsData(int size); ~CStatsData(); int Size() const { return m_size; } uint32 Max() const { return m_max_value; } uint32 GetFirst(); uint32 GetNext(); void PushSample(uint32 sample); }; class CStatsCollection { CStatsData *m_down_speed, *m_up_speed, *m_conn_number, *m_kad_count; CamulewebApp *m_iface; double m_LastTimeStamp; int m_size; public: CStatsCollection(int size, CamulewebApp *iface); ~CStatsCollection(); CStatsData *DownloadSpeed() { return m_down_speed; } CStatsData *UploadSpeed() { return m_up_speed; } CStatsData *ConnCount() { return m_conn_number; } CStatsData *KadCount() { return m_kad_count; } void ReQuery(); }; #ifdef WITH_LIBPNG // // This gonna to represent data used to "write" numbers on // dynamically generated images. // Easiest way to represt numbers: 7-segments model // class CNumImageMask { png_bytep *m_row_mask_ptrs; int m_width, m_height; int m_v_segsize, m_h_segsize; // mask generation void DrawHorzLine(int off); void DrawVertLine(int offx, int offy); void DrawSegment(int id); static const int m_num_to_7_decode[10]; public: CNumImageMask(int number, int width, int height); ~CNumImageMask(); void Apply(png_bytep *image, int offx, int offy); }; class CDynStatisticImage : public virtual CDynPngImage { CStatsData *m_data; // size of "font" of imprinted numbers int m_num_font_w_size, m_num_font_h_size; int m_left_margin, m_bottom_margin; int m_y_axis_size; // hope nobody needs "define" for 10 ! CNumImageMask *m_digits[10]; // indicates whether data should be divided on 1024 before // drawing graph. bool m_scale1024; // // Prepared background // png_bytep m_background; png_bytep *m_row_bg_ptrs; void DrawImage(); public: CDynStatisticImage(int height, bool scale1024, CStatsData *data); ~CDynStatisticImage(); virtual unsigned char *RequestData(int &size); virtual wxString GetHTML(); }; #endif class CImageLib { typedef std::map ImageMap; ImageMap m_image_map; wxString m_image_dir; public: CImageLib(wxString image_dir); ~CImageLib(); CAnyImage *GetImage(const wxString &name); void AddImage(CAnyImage *img, const wxString &name); void RemoveImage(const wxString &name); }; class CParsedUrl { wxString m_path, m_file; std::map m_params; public: CParsedUrl(const wxString &url); const wxString &Path() { return m_path; } const wxString &File() { return m_file; } const wxString &Param(const wxString &key) { return m_params[key]; } void ConvertParams(std::map &); }; // Changing this to a typedef struct{} makes egcs compiler do it all wrong and crash on run struct ThreadData { CParsedUrl parsedURL; wxString sURL; int SessionID; CWebSocket *pSocket; }; enum { // Socket handlers ID_WEBLISTENSOCKET_EVENT = wxID_HIGHEST+123, // random safe ID ID_WEBCLIENTSOCKET_EVENT, }; #ifdef ENABLE_UPNP class CUPnPControlPoint; class CUPnPPortMapping; #endif class CWebServerBase : public wxEvtHandler { protected: wxSocketServer *m_webserver_socket; ServersInfo m_ServersInfo; SharedFileInfo m_SharedFileInfo; DownloadFileInfo m_DownloadFileInfo; UploadsInfo m_UploadsInfo; SearchInfo m_SearchInfo; CStatsCollection m_Stats; CImageLib m_ImageLib; virtual void ProcessURL(ThreadData) = 0; virtual void ProcessImgFileReq(ThreadData) = 0; int GzipCompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); friend class CWebSocket; friend class CPhPLibContext; bool m_upnpEnabled; int m_upnpTCPPort; #ifdef ENABLE_UPNP CUPnPControlPoint *m_upnp; std::vector m_upnpMappings; #endif void OnWebSocketServerEvent(wxSocketEvent& event); void OnWebSocketEvent(wxSocketEvent& event); DECLARE_EVENT_TABLE(); public: CWebServerBase(CamulewebApp *webApp, const wxString& templateDir); virtual ~CWebServerBase() { } void Send_Discard_V2_Request(CECPacket *request); void StartServer(); void StopServer(); void Print(const wxString &s); long GetWSPrefs(); // // Command interface // void Send_ReloadSharedFile_Cmd(); void Send_SharedFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg = 0); void Send_DownloadFile_Cmd(wxString file_hash, wxString cmd, uint32 opt_arg = 0); void Send_DownloadSearchFile_Cmd(wxString file_hash, uint8 cat); void Send_Server_Cmd(uint32 ip, uint16 port, wxString cmd); void Send_AddServer_Cmd(wxString addr, wxString port, wxString name); void Send_Search_Cmd(wxString search, wxString extention, wxString type, EC_SEARCH_TYPE search_type, uint32 avail, uint32 min_size, uint32 max_size); bool Send_DownloadEd2k_Cmd(wxString link, uint8 cat); void Reload_Stats() { m_Stats.ReQuery(); } CamulewebApp *webInterface; }; class CSession { public: bool m_loggedin; time_t m_last_access; std::map m_vars, m_get_vars; void LoadVars(CParsedUrl &url); }; /* * Script based webserver */ class CScriptWebServer : public CWebServerBase { wxString m_wwwroot; wxString m_index; char *ProcessHtmlRequest(const char *filename, long &size); char *ProcessPhpRequest(const char *filename, CSession *sess, long &size); char *GetErrorPage(const char *message, long &size); char *Get_404_Page(long &size); std::map m_sessions; CSession *CheckLoggedin(ThreadData &); protected: virtual void ProcessURL(ThreadData); virtual void ProcessImgFileReq(ThreadData); public: CScriptWebServer(CamulewebApp *webApp, const wxString& templateDir); ~CScriptWebServer(); }; class CNoTemplateWebServer : public CScriptWebServer { protected: virtual void ProcessURL(ThreadData); public: CNoTemplateWebServer(CamulewebApp *webApp); ~CNoTemplateWebServer(); }; #endif // WEBSERVER_H // File_checked_for_headers aMule-2.3.1/src/webserver/src/php_lexer.l0000644000175000017470000001177011575347521017231 0ustar topiusers%{ // // This file is part of the aMule Project. // // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // Copyright (c) 2005-2011 Froenchenko Leonid ( lfroen@gmail.com / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #include #include "php_syntree.h" #include "php_parser.h" void php_set_input_buffer(char *buf, int len) { yy_delete_buffer(YY_CURRENT_BUFFER); yy_scan_bytes(buf, len); } int yywrap(); #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE php_include_stack[MAX_INCLUDE_DEPTH]; int php_include_stack_ptr = 0; int yywrap() { if ( --php_include_stack_ptr < 0 ) { return 1; } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer(php_include_stack[php_include_stack_ptr] ); } return 0; } %} %x BLOCK_COMMENT %x LINE_COMMENT %x INCLUDE %option stack %option yylineno DEC_NUM [0-9]+ FLOANUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*) HEX_NUM "0x"[0-9a-fA-F]+ IDENT [a-zA-Z_][a-zA-Z0-9_]* EOL ("\r"|"\n"|"\r\n") %% "" return END_SCRIPT; "exit"|"die" return EXIT; "function" return FUNCTION; "const" return CONST; "return" return RETURN; "if" return IF; "else" return ELSE; "elseif" return ELSEIF; "endif" return ENDIF; "while" return WHILE; "endwhile" return ENDWHILE; "do" return DO; "for" return FOR; "endfor" return ENDFOR; "foreach" return FOREACH; "as" return AS; "endforeach" return ENDFOREACH; "switch" return SWITCH; "endswitch" return ENDSWITCH; "case" return CASE; "default" return DEFAULT; "break" return BREAK; "continue" return CONTINUE; "echo" return T_ECHO; "print" return PRINT; "new" return NEW; "->" return OBJECT_OPERATOR; "list" return LIST; "array" return ARRAY; "++" return INC; "--" return DEC; "=>" return HASH_ASSIGN; "or" return LOG_OR; "xor" return LOG_XOR; "and" return LOG_AND; "||" return BOOLEAN_OR; "&&" return BOOLEAN_AND; "+=" return PLUS_EQ; "-=" return MINUS_EQ; "*=" return MUL_EQ; "/=" return DIV_EQ; ".=" return CONCAT_EQ; "%=" return MOD_EQ; "&=" return AND_EQ; "|=" return OR_EQ; "^=" return XOR_EQ; "<<=" return SL_EQ; ">>=" return SR_EQ; "===" return IS_IDENTICAL; "!===" return IS_NOIDENTICAL; "==" return IS_EQ; "!=" return IS_NOEQUAL; "<=" return IS_SMALLER_OR_EQ; ">=" return IS_GREATER_OR_EQ; "global" return GLOBAL; "static" return STATIC; "include" BEGIN(INCLUDE); [ \t]* \'[a-zA-Z_][a-zA-Z0-9_\.\-]*\' { yytext[strlen(yytext)-1] = 0; if ( php_include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "WARNING: maximum include depth (which is %d) exceed", MAX_INCLUDE_DEPTH); } else { php_include_stack[php_include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen(yytext+1, "r"); if ( !yyin ) { printf("WARNING: include file [%s] can not be opened\n", yytext+1); } else { yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE )); } } BEGIN(INITIAL); } "("[ \t]*("int"|"integer")[ \t]*")" { return INT_CAST; } "("[ \t]*("real"|"double"|"float")[ \t]*")" { return DOUBLE_CAST; } "("[ \t]*"string"[ \t]*")" { return STRING_CAST; } "("[ \t]*("bool"|"boolean")[ \t]*")" { return BOOL_CAST; } "#"|"//" { BEGIN(LINE_COMMENT); yymore(); } [^\n\r]+ { yymore(); } {EOL} { BEGIN(INITIAL); } "/*" { BEGIN(BLOCK_COMMENT); yymore(); } "*/" { BEGIN(INITIAL); } "$"{IDENT} { phplval.exp_node = get_var_node(yytext+1); return VARIABLE; } {IDENT} { strcpy(phplval.str_val, yytext); return IDENT; } {HEX_NUM} { int val; sscanf(yytext, "0x%x", &val); phplval.exp_node = make_const_exp_dnum(val); return DNUMBER; } {DEC_NUM} { phplval.exp_node = make_const_exp_dnum(atoi(yytext)); return DNUMBER; } {FLOANUM} { phplval.exp_node = make_const_exp_fnum(atof(yytext)); return FNUMBER; } \"(\\.|[^\\"])*\" { yytext[strlen(yytext)-1] = 0; phplval.exp_node = make_const_exp_str(yytext+1, 1); return STRING; } \'(\\.|[^\\'])*\' { yytext[strlen(yytext)-1] = 0; phplval.exp_node = make_const_exp_str(yytext+1, 0); return STRING; } [ \t\v\n\r\f] { } . { return yytext[0]; } aMule-2.3.1/src/webserver/src/WebInterface.cpp0000644000175000017470000005272411575347521020134 0ustar topiusers// // This file is part of the aMule Project. // // Copyright (c) 2004-2011 shakraw ( shakraw@users.sourceforge.net ) // Copyright (c) 2003-2011 Angel Vidal ( kry@amule.org ) // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org ) // // Any parts of this program derived from the xMule, lMule or eMule project, // or contributed by third-party developers are copyrighted by their // respective authors. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // #ifdef HAVE_CONFIG_H #include "config.h" // For VERSION and ENABLE_NLS #endif #include #ifdef __WXMAC__ #include // Do_not_auto_remove #include // Do_not_auto_remove #if wxCHECK_VERSION(2, 9, 0) #include // Do_not_auto_remove #else #include // Do_not_auto_remove #endif #endif #include // Needed for CECFileConfig #include #include "WebServer.h" #include #include #ifdef ENABLE_NLS # include #endif #ifdef AMULEWEB28 /* * Socket handling in wxBase (same as amuled) * */ class CSocketSet { int m_count; int m_fds[FD_SETSIZE], m_fd_idx[FD_SETSIZE]; GSocket *m_gsocks[FD_SETSIZE]; fd_set m_set; public: CSocketSet(); void AddSocket(GSocket *); void RemoveSocket(GSocket *); void FillSet(int &max_fd); void Detected(void (GSocket::*func)()); fd_set *Set() { return &m_set; } }; CSocketSet::CSocketSet() { m_count = 0; for(int i = 0; i < FD_SETSIZE; i++) { m_fds[i] = 0; m_fd_idx[i] = 0xffff; m_gsocks[i] = 0; } } void CSocketSet::AddSocket(GSocket *socket) { wxASSERT(socket); int fd = socket->m_fd; if (fd == -1) { return; } wxASSERT(fd >= 0 && fd < FD_SETSIZE); if (m_gsocks[fd]) { return; } m_fds[m_count] = fd; m_fd_idx[fd] = m_count; m_gsocks[fd] = socket; m_count++; } void CSocketSet::RemoveSocket(GSocket *socket) { wxASSERT(socket); int fd = socket->m_fd; if (fd == -1) { return; } wxASSERT(fd >= 0 && fd < FD_SETSIZE); int i = m_fd_idx[fd]; if (i == 0xffff) { return; } wxASSERT(m_fds[i] == fd); m_fds[i] = m_fds[m_count-1]; m_gsocks[fd] = 0; m_fds[m_count-1] = 0; m_fd_idx[fd] = 0xffff; m_fd_idx[m_fds[i]] = i; m_count--; } void CSocketSet::FillSet(int &max_fd) { FD_ZERO(&m_set); for(int i = 0; i < m_count; i++) { FD_SET(m_fds[i], &m_set); if (m_fds[i] > max_fd) { max_fd = m_fds[i]; } } } void CSocketSet::Detected(void (GSocket::*func)()) { for (int i = 0; i < m_count; i++) { int fd = m_fds[i]; if (FD_ISSET(fd, &m_set)) { GSocket *socket = m_gsocks[fd]; (*socket.*func)(); } } } class CWebserverGSocketFuncTable : public GSocketGUIFunctionsTable { private: CSocketSet *m_in_set; CSocketSet *m_out_set; wxMutex m_lock; public: CWebserverGSocketFuncTable(); void AddSocket(GSocket *socket, GSocketEvent event); void RemoveSocket(GSocket *socket, GSocketEvent event); void RunSelect(); virtual bool OnInit(); virtual void OnExit(); virtual bool CanUseEventLoop(); virtual bool Init_Socket(GSocket *socket); virtual void Destroy_Socket(GSocket *socket); virtual void Install_Callback(GSocket *socket, GSocketEvent event); virtual void Uninstall_Callback(GSocket *socket, GSocketEvent event); virtual void Enable_Events(GSocket *socket); virtual void Disable_Events(GSocket *socket); }; CWebserverGSocketFuncTable::CWebserverGSocketFuncTable() : m_lock(wxMUTEX_RECURSIVE) { m_in_set = new CSocketSet; m_out_set = new CSocketSet; m_lock.Unlock(); } void CWebserverGSocketFuncTable::AddSocket(GSocket *socket, GSocketEvent event) { wxMutexLocker lock(m_lock); if (event == GSOCK_INPUT) { m_in_set->AddSocket(socket); } else { m_out_set->AddSocket(socket); } } void CWebserverGSocketFuncTable::RemoveSocket(GSocket *socket, GSocketEvent event) { wxMutexLocker lock(m_lock); if (event == GSOCK_INPUT) { m_in_set->RemoveSocket(socket); } else { m_out_set->RemoveSocket(socket); } } void CWebserverGSocketFuncTable::RunSelect() { wxMutexLocker lock(m_lock); int max_fd = -1; m_in_set->FillSet(max_fd); m_out_set->FillSet(max_fd); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 10000; // 10ms int result = select(max_fd + 1, m_in_set->Set(), m_out_set->Set(), 0, &tv); if (result > 0) { m_in_set->Detected(&GSocket::Detected_Read); m_out_set->Detected(&GSocket::Detected_Write); } } bool CWebserverGSocketFuncTable::OnInit() { return true; } void CWebserverGSocketFuncTable::OnExit() { } bool CWebserverGSocketFuncTable::CanUseEventLoop() { return false; } bool CWebserverGSocketFuncTable::Init_Socket(GSocket *) { return true; } void CWebserverGSocketFuncTable::Destroy_Socket(GSocket *) { } void CWebserverGSocketFuncTable::Install_Callback(GSocket *sock, GSocketEvent e) { AddSocket(sock, e); } void CWebserverGSocketFuncTable::Uninstall_Callback(GSocket *sock, GSocketEvent e) { RemoveSocket(sock, e); } void CWebserverGSocketFuncTable::Enable_Events(GSocket *socket) { Install_Callback(socket, GSOCK_INPUT); Install_Callback(socket, GSOCK_OUTPUT); } void CWebserverGSocketFuncTable::Disable_Events(GSocket *socket) { Uninstall_Callback(socket, GSOCK_INPUT); Uninstall_Callback(socket, GSOCK_OUTPUT); } class CWebserverAppTraits : public wxConsoleAppTraits { private: CWebserverGSocketFuncTable *m_table; wxMutex m_lock; std::list m_sched_delete; public: CWebserverAppTraits(CWebserverGSocketFuncTable *table); virtual GSocketGUIFunctionsTable* GetSocketGUIFunctionsTable(); virtual void ScheduleForDestroy(wxObject *object); virtual void RemoveFromPendingDelete(wxObject *object); void DeletePending(); }; CWebserverAppTraits::CWebserverAppTraits(CWebserverGSocketFuncTable *table) : wxConsoleAppTraits(), m_table(table),m_lock(wxMUTEX_RECURSIVE), m_sched_delete() { m_lock.Unlock(); } GSocketGUIFunctionsTable *CWebserverAppTraits::GetSocketGUIFunctionsTable() { return m_table; } void CWebserverAppTraits::ScheduleForDestroy(wxObject *object) { wxMutexLocker lock(m_lock); m_sched_delete.push_back(object); } void CWebserverAppTraits::RemoveFromPendingDelete(wxObject *object) { wxMutexLocker lock(m_lock); for(std::list::iterator i = m_sched_delete.begin(); i != m_sched_delete.end(); i++) { if (*i == object) { m_sched_delete.erase(i); return; } } } void CWebserverAppTraits::DeletePending() { wxMutexLocker lock(m_lock); while (!m_sched_delete.empty()) { std::list::iterator i = m_sched_delete.begin(); wxObject *object = *i; delete object; } } CamulewebApp::CamulewebApp() : m_table(new CWebserverGSocketFuncTable) { wxPendingEventsLocker = new wxCriticalSection; } wxAppTraits *CamulewebApp::CreateTraits() { return new CWebserverAppTraits(m_table); } #endif //------------------------------------------------------------------- IMPLEMENT_APP(CamulewebApp) //------------------------------------------------------------------- BEGIN_EVENT_TABLE(CamulewebApp, CaMuleExternalConnector) END_EVENT_TABLE() void CamulewebApp::Post_Shell() { m_webserver->StopServer(); delete m_webserver; m_webserver = 0; } bool CamulewebApp::OnInit() { return CaMuleExternalConnector::OnInit(); } #ifndef VERSION #include #endif int CamulewebApp::OnRun() { ConnectAndRun(wxT("aMuleweb"), wxT(VERSION)); return 0; } bool CamulewebApp::CheckDirForTemplate(wxString& dir, const wxString& tmpl) { DebugShow(wxT("checking for directory '") + dir + wxT("'...")); if (wxFileName::DirExists(dir)) { DebugShow(wxT(" yes\n")); dir = JoinPaths(dir, tmpl); DebugShow(wxT("checking for directory '") + dir + wxT("'...")); if (wxFileName::DirExists(dir)) { DebugShow(wxT(" yes\n")); wxString tmplPath = JoinPaths(dir, wxT("login.php")); DebugShow(wxT("checking for file '") + tmplPath + wxT("'...")); if (wxFileName::FileExists(tmplPath)) { DebugShow(wxT(" yes\n")); // dir is already set to the directory component of the template path return true; } else { DebugShow(wxT(" no\n")); } } else { DebugShow(wxT(" no\n")); } } else { DebugShow(wxT(" no\n")); } return false; } bool CamulewebApp::GetTemplateDir(const wxString& templateName, wxString& templateDir) { wxString dir; m_localTemplate = false; DebugShow(wxT("looking for template: ") + templateName + wxT("\n")); #ifdef __WXMAC__ CFURLRef amuleBundleUrl; OSStatus status = LSFindApplicationForInfo( kLSUnknownCreator, // This magic string is the bundle identifier in aMule.app's Info.plist CFSTR("org.amule.aMule"), NULL, NULL, &amuleBundleUrl); if (status == noErr && amuleBundleUrl) { CFBundleRef amuleBundle = CFBundleCreate(NULL, amuleBundleUrl); CFRelease(amuleBundleUrl); if (amuleBundle) { CFURLRef webserverDirUrl = CFBundleCopyResourceURL( amuleBundle, CFSTR("webserver"), NULL, NULL); CFRelease(amuleBundle); if (webserverDirUrl) { CFURLRef absoluteURL = CFURLCopyAbsoluteURL(webserverDirUrl); CFRelease(webserverDirUrl); if (absoluteURL) { CFStringRef pathString = CFURLCopyFileSystemPath( absoluteURL, kCFURLPOSIXPathStyle); CFRelease(absoluteURL); #if wxCHECK_VERSION(2, 9, 0) dir = wxCFStringRef(pathString). AsString(wxLocale::GetSystemEncoding()); #else dir = wxMacCFStringHolder(pathString). AsString(wxLocale::GetSystemEncoding()); #endif if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } } } } } #endif dir = GetConfigDir(wxT("remote.conf")) + wxT("webserver"); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; m_localTemplate = true; return true; } #ifdef WEBSERVERDIR dir = wxT(WEBSERVERDIR); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } #endif dir = wxStandardPaths::Get().GetResourcesDir(); // Returns 'aMule' when we use 'amule' elsewhere #if !defined(__WXMSW__) && !defined(__WXMAC__) dir = dir.BeforeLast(wxFileName::GetPathSeparator()); dir = JoinPaths(dir, wxT("amule")); #endif dir = JoinPaths(dir, wxT("webserver")); if (CheckDirForTemplate(dir, templateName)) { templateDir = dir; return true; } // template not found. reverting to default const wxChar* const defaultTemplateName = wxT("default"); if ( templateName == defaultTemplateName ) { return false; } Show(wxT("Template ") + templateName + wxT(" not found, reverting to default\n\n")); return GetTemplateDir(defaultTemplateName, templateDir); } void CamulewebApp::OnInitCmdLine(wxCmdLineParser& amuleweb_parser) { CaMuleExternalConnector::OnInitCmdLine(amuleweb_parser, "amuleweb"); amuleweb_parser.AddOption(wxT("t"), wxT("template"), _("Loads template "), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("s"), wxT("server-port"), _("Web server HTTP port"), wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("u"), wxT("enable-upnp"), _("Use UPnP port forwarding on web server port"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("U"), wxT("upnp-port"), _("UPnP port"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("z"), wxT("enable-gzip"), _("Use gzip compression"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("Z"), wxT("disable-gzip"), wxT("Do not use gzip compression"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("A"), wxT("admin-pass"), _("Full access password for web server"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxT("G"), wxT("guest-pass"), _("Guest password for web server"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("a"), wxT("allow-guest"), _("Allow guest access"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("d"), wxT("deny-guest"), _("Deny guest access"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddSwitch(wxT("L"), wxT("load-settings"), _("Load/save web server settings from/to remote aMule"), wxCMD_LINE_PARAM_OPTIONAL); amuleweb_parser.AddOption(wxEmptyString, wxT("amule-config-file"), _("aMule config file path. DO NOT USE DIRECTLY!"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); /* * In this mode, internal PHP interpreter is activated, and * amuleweb will forward there requests for .php pages */ amuleweb_parser.AddSwitch(wxEmptyString, wxT("no-php"), _("Disable PHP interpreter (deprecated)"), wxCMD_LINE_PARAM_OPTIONAL); /* * Reload .php page each time it's requested - don't cache * compilation results. Used for script development. */ amuleweb_parser.AddSwitch(wxT("N"), wxT("no-script-cache"), _("Recompile PHP pages on each request"), wxCMD_LINE_PARAM_OPTIONAL); } bool CamulewebApp::OnCmdLineParsed(wxCmdLineParser& parser) { wxString aMuleConfigFile; if (parser.Found(wxT("amule-config-file"), &aMuleConfigFile)) { aMuleConfigFile = FinalizeFilename(aMuleConfigFile); if (!::wxFileExists(aMuleConfigFile)) { fprintf(stderr, "FATAL ERROR: file '%s' does not exist.\n", (const char*)unicode2char(aMuleConfigFile)); return false; } CECFileConfig cfg(aMuleConfigFile); LoadAmuleConfig(cfg); // do not process any other command-line parameters, use defaults instead m_Verbose = false; m_KeepQuiet = true; m_LoadSettingsFromAmule = true; if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { // no reason to run webserver without a template fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); return false; } return true; } if (CaMuleExternalConnector::OnCmdLineParsed(parser)) { if ( parser.Found(wxT("no-php")) ) { fprintf(stderr, "WARNING: --no-php switch have no effect. Long live PHP\n"); } parser.Found(wxT("template"), &m_TemplateName); if (m_TemplateName.IsEmpty()) { m_TemplateName = wxT("default"); } if (!(m_TemplateOk = GetTemplateDir(m_TemplateName, m_TemplateDir))) { // no reason to run webserver without a template fprintf(stderr, "FATAL ERROR: Cannot find template: %s\n", (const char *)unicode2char(m_TemplateName)); return true; } long port; if (parser.Found(wxT("server-port"), &port)) { m_WebserverPort = port; } if (parser.Found(wxT("enable-upnp"))) { m_UPnPWebServerEnabled = true; } if (parser.Found(wxT("upnp-port"), &port)) { m_UPnPTCPPort = port; } if (parser.Found(wxT("enable-gzip"))) { m_UseGzip = true; } if (parser.Found(wxT("disable-gzip"))) { m_UseGzip = false; } if (parser.Found(wxT("allow-guest"))) { m_AllowGuest = true; } if (parser.Found(wxT("deny-guest"))) { m_AllowGuest = false; } wxString tmp; if ( parser.Found(wxT("admin-pass"), &tmp) ) { if (tmp.IsEmpty()) { m_AdminPass.Clear(); } else { m_AdminPass.Decode(MD5Sum(tmp).GetHash()); } } if ( parser.Found(wxT("guest-pass"), &tmp) ) { if (tmp.IsEmpty()) { m_GuestPass.Clear(); } else { m_GuestPass.Decode(MD5Sum(tmp).GetHash()); } } m_LoadSettingsFromAmule = parser.Found(wxT("load-settings")); return true; } else { return false; } } const wxString CamulewebApp::GetGreetingTitle() { return _("aMule Web Server"); } void CamulewebApp::Pre_Shell() { // Creating the web server if (m_TemplateOk) { m_webserver = new CScriptWebServer(this, m_TemplateDir); } else { m_webserver = new CNoTemplateWebServer(this); } m_webserver->StartServer(); } void CamulewebApp::TextShell(const wxString &) { #ifdef AMULEWEB28 while (true) { m_table->RunSelect(); ProcessPendingEvents(); ((CWebserverAppTraits *)GetTraits())->DeletePending(); } #else #ifndef AMULEWEB_DUMMY wxApp::OnRun(); #endif #endif } void CamulewebApp::LoadAmuleConfig(CECFileConfig& cfg) { CaMuleExternalConnector::LoadAmuleConfig(cfg); m_UseGzip = (cfg.Read(wxT("/WebServer/UseGzip"), 0l) == 1l); m_AllowGuest = (cfg.Read(wxT("/WebServer/UseLowRightsUser"), 0l) == 1l); cfg.ReadHash(wxT("/WebServer/Password"), &m_AdminPass); cfg.ReadHash(wxT("/WebServer/PasswordLow"), &m_GuestPass); m_WebserverPort = cfg.Read(wxT("/WebServer/Port"), 4711l); m_UPnPWebServerEnabled = (cfg.Read(wxT("/Webserver/UPnPWebServerEnabled"), 0l) == 1l); m_UPnPTCPPort = cfg.Read(wxT("/WebServer/UPnPTCPPort"), 50001l); m_PageRefresh = cfg.Read(wxT("/WebServer/PageRefreshTime"), 120l); m_TemplateName = cfg.Read(wxT("/WebServer/Template"), wxT("default")); } void CamulewebApp::LoadConfigFile() { CaMuleExternalConnector::LoadConfigFile(); if (m_configFile) { wxString tmp; m_WebserverPort = m_configFile->Read(wxT("/Webserver/Port"), 4711l); m_configFile->Read(wxT("/Webserver/UPnPWebServerEnabled"), &m_UPnPWebServerEnabled, false); m_UPnPTCPPort = m_configFile->Read(wxT("/WebServer/UPnPTCPPort"), 50001l); m_TemplateName = m_configFile->Read(wxT("/Webserver/Template"), wxEmptyString); m_configFile->Read(wxT("/Webserver/UseGzip"), &m_UseGzip, false); m_configFile->Read(wxT("/Webserver/AllowGuest"), &m_AllowGuest, false); m_configFile->ReadHash(wxT("/Webserver/AdminPassword"), &m_AdminPass); m_configFile->ReadHash(wxT("/Webserver/GuestPassword"), &m_GuestPass); m_PageRefresh = m_configFile->Read(wxT("/Webserver/PageRefreshTime"), 120l); } } void CamulewebApp::SaveConfigFile() { CaMuleExternalConnector::SaveConfigFile(); if (m_configFile) { m_configFile->Write(wxT("/Webserver/Port"), m_WebserverPort); m_configFile->Write(wxT("/Webserver/UPnPWebServerEnabled"), m_UPnPWebServerEnabled); m_configFile->Write(wxT("/WebServer/UPnPTCPPort"), m_UPnPTCPPort); m_configFile->Write(wxT("/Webserver/Template"), m_TemplateName); m_configFile->Write(wxT("/Webserver/UseGzip"), m_UseGzip); m_configFile->Write(wxT("/Webserver/AllowGuest"), m_AllowGuest); m_configFile->WriteHash(wxT("/Webserver/AdminPassword"), m_AdminPass); m_configFile->WriteHash(wxT("/Webserver/GuestPassword"), m_GuestPass); } } #ifdef ENABLE_NLS static inline bool CheckDirForMessageCatalog(const wxString& dir, const wxString& lang, const wxString& domain) { return wxFileName::FileExists(JoinPaths(dir, JoinPaths(lang, JoinPaths(wxT("LC_MESSAGES"), domain + wxT(".mo"))))); } static inline bool DirHasMessageCatalog(const wxString& dir, const wxString& lang, const wxString& domain) { if (!CheckDirForMessageCatalog(dir, lang, domain)) { wxString lingua = lang.BeforeFirst(wxT('.')).BeforeFirst(wxT('@')); if (lingua == lang || !CheckDirForMessageCatalog(dir, lingua, domain)) { wxString lng = lingua.BeforeFirst(wxT('_')); wxString ctry = lingua.AfterFirst(wxT('_')); if (ctry.IsEmpty()) { ctry = lng.Upper(); return CheckDirForMessageCatalog(dir, lng + wxT("_") + ctry, domain); } else if (ctry == lng.Upper()) { return CheckDirForMessageCatalog(dir, lng, domain); } else { return false; } } } return true; } #endif wxString CamulewebApp::SetLocale(const wxString& language) { wxString lang = CaMuleExternalConnector::SetLocale(language); // will call setlocale() for us // SetLocale() may indeed return an empty string, when no locale has been selected yet and // no locale change was requested, or, in the worst case, if the last locale change didn't succeed. if (!lang.IsEmpty()) { DebugShow(wxT("*** Language set to: ") + lang + wxT(" ***\n")); #ifdef ENABLE_NLS wxString domain = wxT("amuleweb-") + m_TemplateName; Unicode2CharBuf domainBuf = unicode2char(domain); const char *c_domain = (const char *)domainBuf; // Try to find a message catalog // First look in ~/.aMule/webserver/