diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 00:43:50 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 00:43:50 +0000 |
commit | ceea23677c61f20759ae986bd77b0d5c4d673edb (patch) | |
tree | 3fcec1702eaf9c14d1dd736e594f5df08dab4001 | |
download | kbfx-ceea23677c61f20759ae986bd77b0d5c4d673edb.tar.gz kbfx-ceea23677c61f20759ae986bd77b0d5c4d673edb.zip |
Added old KDE3 version of kbfx
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kbfx@1091549 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
281 files changed, 39056 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..52e2459 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,274 @@ +PROJECT(kbfx) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.4.2 FATAL_ERROR) +SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmakemodules) +SET(CMAKE_COLOR_MAKEFILE ON CACHE STRING "Enable/Disable color output during build." FORCE) +#SET(CMAKE_VERBOSE_MAKEFILE OFF CACHE STRING "Enable/Disable cmake debug output during build." FORCE) + +# Optimization flags +# SET(CMAKE_CXX_FLAGS_DISTRIBUTION "-O3") +# SET(CMAKE_C_FLAGS_DISTRIBUTION "-O3") + +# Global variable CMAKE_BUILD_TYPE +# None (CMAKE_C_FLAGS or CMAKE_CXX_FLAGS used) +# Debug (CMAKE_C_FLAGS_DEBUG or CMAKE_CXX_FLAGS_DEBUG) +# Release (CMAKE_C_FLAGS_RELEASE or CMAKE_CXX_FLAGS_RELEASE) +# RelWithDebInfo (CMAKE_C_FLAGS_RELWITHDEBINFO or CMAKE_CXX_FLAGS_RELWITHDEBINFO +# MinSizeRel (CMAKE_C_FLAGS_MINSIZEREL or CMAKE_CXX_FLAGS_MINSIZEREL) +IF (NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE RelWithDebInfo + CACHE + STRING "Specify build type: None Debug Release RelWithDebInfo MinSizeRel." + FORCE) +ENDIF (NOT CMAKE_BUILD_TYPE) + +OPTION(USE_STRIGI "Enable use of Strigi search support (disabled)" OFF) +OPTION(USE_MENUDRAKE "Use 'menudrake' instead of 'kmenuedit' in Mandriva (auto)" ON) +OPTION(USE_KDE4 "Compile for KDE4 (disabled)" OFF) + +SET(BIN_SEARCH_PATHES + $ENV{HOME}/bin + $ENV{HOME}/usr/bin + $ENV{KDEDIR}/bin + ${CMAKE_INSTALL_PREFIX}/bin + /opt/kde/bin + /opt/kde3/bin + /opt/kde4/bin + /usr/kde/3.5/bin + /usr/bin + /usr/local/bin + /opt/bin + ) +SET(INCLUDE_SEARCH_PATHES + $ENV{HOME}/include + $ENV{HOME}/usr/include + $ENV{KDEDIR}/include + /opt/kde/include + /opt/kde3/include + /opt/kde4/include + /usr/kde/3.5/include + /usr/include + /usr/local/include + /opt/include + ${CMAKE_SYSTEM_INCLUDE_PATH} + ) +SET(LIB_SEARCH_PATHES + $ENV{HOME}/lib + $ENV{HOME}/usr/lib + $ENV{KDEDIR}/lib + /opt/kde/lib + /opt/kde3/lib + /opt/kde4/lib + /usr/kde/3.5/lib + /usr/lib + /usr/local/lib + /opt/lib + ) + +# Setting versions + +# For versions that are stable set to 1, else to 0 +SET(APPLICATION_STABLE 1) + +SET(LIB_MAJOR 4) +SET(LIB_MINOR 9) +SET(LIB_RELEASE 3) +SET(LIB_SUB_RELEASE 1) +SET(APPLICATION_INTERNAL_VERSION "20070516") +SET(APPLICATION_DATE "2007-05-16") + +SET(APPLICATION_NAME "${PROJECT_NAME}") +SET(APPLICATION_MAIN_VERSION "0.${LIB_MAJOR}.${LIB_MINOR}.${LIB_RELEASE}") + +IF (APPLICATION_STABLE) + SET(APPLICATION_STABLE_RELEASE ".${LIB_SUB_RELEASE}") + SET(APPLICATION_VERSION "${APPLICATION_MAIN_VERSION}.${LIB_SUB_RELEASE}") + SET(GENTOO_VERSION "${APPLICATION_MAIN_VERSION}.${LIB_SUB_RELEASE}") +ELSE (APPLICATION_APPLICATION_STABLE "") + SET(STABLE_RELEASE) + SET(APPLICATION_VERSION "${APPLICATION_MAIN_VERSION}-${LIB_SUB_RELEASE}") + SET(GENTOO_VERSION "${APPLICATION_MAIN_VERSION}_pre${LIB_SUB_RELEASE}") +ENDIF (APPLICATION_STABLE) + +SET(VERSION ${APPLICATION_VERSION}) + +SET(STRIGI_VERSION "0.3.11") +SET(GENTOO_KEYWORDS "x86 ~ppc ~amd64") + +# Prepare docbook part +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/doc/en/index.docbook.in ${CMAKE_BINARY_DIR}/doc/en/index.docbook @ONLY) + +IF (USE_STRIGI) + FIND_PACKAGE(Strigi REQUIRED) + INCLUDE_DIRECTORIES(${STRIGI_INCLUDE_DIR}) + MESSAGE(STATUS "Strigi support is: ON!") +ELSE (USE_STRIGI) + MESSAGE(STATUS "Strigi support is: OFF!") +ENDIF (USE_STRIGI) + + +FIND_PROGRAM(HAVE_MANDRAKE menudrake) +IF (HAVE_MANDRAKE AND USE_MENUDRAKE) + SET(MANDRAKE "1") + MESSAGE(STATUS "Will use 'menudrake' instead of 'kmenuedit'!") +ELSE (HAVE_MANDRAKE AND USE_MENUDRAKE) + SET(MANDRAKE "") + MESSAGE(STATUS "Will use 'kmenuedit'!") +ENDIF (HAVE_MANDRAKE AND USE_MENUDRAKE) + +IF (NOT USE_KDE4) + MESSAGE(STATUS "Building for KDE3") + INCLUDE(TestCXXAcceptsFlag) + + SET(CMAKE_CXX_FLAGS_DEBUG + "${CMAKE_CXX_FLAGS_DEBUG} -DTESTING_RC=\"\\\"\${CMAKE_SOURCE_DIR}/configdialog/kbfxconfigappui.rc\\\"\"") + + CHECK_CXX_ACCEPTS_FLAG("-fexceptions" CXX_EXCEPTION) + CHECK_CXX_ACCEPTS_FLAG("-fstack-protector" CXX_PROTECTOR) + + FIND_PACKAGE(KDE3 REQUIRED) + + INCLUDE(FindKdeLibs) + INCLUDE(MacroEnsureVersion) + + # Dummy macros for compatibility + MACRO(KDE4_AUTOMOC _dummy) + ENDMACRO(KDE4_AUTOMOC) + + MACRO(KDE4_ADD_LIBRARY _dummy _dummy1 _dummy2) + ENDMACRO(KDE4_ADD_LIBRARY) + + MACRO(KDE4_INSTALL_LIBTOOL_FILE _dummy _dummy1) + ENDMACRO(KDE4_INSTALL_LIBTOOL_FILE) + + MACRO(KDE4_ADD_UI3_FILES _dummy _dummy1) + ENDMACRO(KDE4_ADD_UI3_FILES) + + MACRO(KDE4_ADD_DCOP_SKELS _dummy _dummy1) + ENDMACRO(KDE4_ADD_DCOP_SKELS) + + MACRO(KDE4_ADD_EXECUTABLE _dummy _dummy1) + ENDMACRO(KDE4_ADD_EXECUTABLE) + + MACRO(KDE4_INSTALL_ICONS _dummy) + ENDMACRO(KDE4_INSTALL_ICONS) +ELSE (NOT USE_KDE4) + MESSAGE(STATUS "Building for KDE4") + FIND_PACKAGE(KDE4 REQUIRED) + ADD_DEFINITIONS(${KDE4_DEFINITIONS} ${QT_DEFINITIONS}) + SET(INCLUDE_SEARCH_PATHES + ${INCLUDE_SEARCH_PATHES} + ${KDE4_INCLUDES} + ) + SET(LIB_SEARCH_PATHES + ${LIB_SEARCH_PATHES} + ${KDE4_LIB_DIR} + ) +ENDIF (NOT USE_KDE4) + +INCLUDE_DIRECTORIES( + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/kbfxlib/data + ${CMAKE_BINARY_DIR}/kbfxlib/common + ${CMAKE_BINARY_DIR}/src + ${CMAKE_BINARY_DIR}/configdialog + ${CMAKE_BINARY_DIR}/plugins/common + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/kbfxlib/data + ${CMAKE_SOURCE_DIR}/kbfxlib/common + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/configdialog + ${CMAKE_SOURCE_DIR}/plugins/common + ${KDE3_INCLUDE_DIR}/kbfx + ${KDE3_INCLUDE_DIR}/kbfx/plugins + ${INCLUDE_SEARCH_PATHES} + ) + +IF (NOT USE_KDE4) + IF (CXX_EXCEPTION) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + ENDIF (CXX_EXCEPTION) + IF (CXX_PROTECTOR) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector") + ENDIF (CXX_PROTECTOR) + + ADD_DEFINITIONS(${KDE3_DEFINITIONS} ${QT_DEFINITIONS}) + SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) + SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) + + IF(KDE3_KDECONFIG_EXECUTABLE) + EXECUTE_PROCESS(COMMAND ${KDE3_KDECONFIG_EXECUTABLE} "--version" OUTPUT_VARIABLE output) + STRING(REGEX MATCH "KDE: [0-9]+\\.[0-9]+\\.[0-9]+" KDEVERSION "${output}") + STRING(REGEX REPLACE "^KDE: " "" KDEVERSION "${KDEVERSION}") + ENDIF(KDE3_KDECONFIG_EXECUTABLE) + SET(KDE_MIN_VERSION "3.5.0") + MACRO_ENSURE_VERSION(${KDE_MIN_VERSION} ${KDEVERSION} VERSION_OK) + IF(NOT VERSION_OK) + MESSAGE(FATAL_ERROR "You need at least KDE Version of 3.5.0 in order to compile KBFX.\n Please upgrade your KDE or install the development files of KDE.") + ENDIF(NOT VERSION_OK) +ENDIF (NOT USE_KDE4) + +SET(KBFX_LIB_INSTALL_DIR ${LIB_INSTALL_DIR}) + +ADD_SUBDIRECTORY(kbfxlib/data) +ADD_SUBDIRECTORY(kbfxlib/common) +ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(configdialog) +ADD_SUBDIRECTORY(skin/vector) +ADD_SUBDIRECTORY(skin/raster/default) +ADD_SUBDIRECTORY(skin/raster/2panels) +ADD_SUBDIRECTORY(images) +ADD_SUBDIRECTORY(doc) +ADD_SUBDIRECTORY(doc/en) +ADD_SUBDIRECTORY(doc/common) +ADD_SUBDIRECTORY(po) +ADD_SUBDIRECTORY(plugins/common) +ADD_SUBDIRECTORY(plugins/applications) +ADD_SUBDIRECTORY(plugins/settings) +ADD_SUBDIRECTORY(plugins/plasmoids) +ADD_SUBDIRECTORY(plugins/recentstuff) +IF (USE_STRIGI) + ADD_SUBDIRECTORY(plugins/strigi) +ENDIF (USE_STRIGI) + +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h @ONLY) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/kbfx.spec.in ${CMAKE_BINARY_DIR}/kbfx.spec @ONLY) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/kbfx.ebuild.in ${CMAKE_BINARY_DIR}/kbfx-${GENTOO_VERSION}.ebuild @ONLY) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/strigi.ebuild.in ${CMAKE_BINARY_DIR}/strigi-${STRIGI_VERSION}.ebuild @ONLY) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/kbfx-svn.ebuild.in ${CMAKE_BINARY_DIR}/kbfx-9999.ebuild @ONLY) + +SET(DIST_INCLUDE "kbfx-9999.ebuild kbfx.spec kbfx-${GENTOO_VERSION}.ebuild strigi-${STRIGI_VERSION}.ebuild") +SET(DIST_EXCLUDE "Helperstuff") +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmakemodules/makedist.sh.in" + "${CMAKE_CURRENT_BINARY_DIR}/makedist.sh" + IMMEDIATE + @ONLY) +ADD_CUSTOM_TARGET(dist + "${CMAKE_BINARY_DIR}/makedist.sh" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + +IF (NOT USE_KDE4) + CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmakemodules/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + ADD_CUSTOM_TARGET(uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") +ENDIF (NOT USE_KDE4) + + +FILE(GLOB _POFILES po/*.po) +FOREACH(_p ${_POFILES}) + SET(POFILES "${_p} ${POFILES}") +ENDFOREACH(_p) + +SET(MESSAGES_DIR ${CMAKE_SOURCE_DIR}) +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/cmakemodules/package_messages.sh.in" + "${CMAKE_CURRENT_BINARY_DIR}/package_messages.sh" + IMMEDIATE + @ONLY) +ADD_CUSTOM_TARGET(package-messages + "${CMAKE_CURRENT_BINARY_DIR}/package_messages.sh") + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..d3f4983 --- /dev/null +++ b/build.sh @@ -0,0 +1,246 @@ +#! /bin/sh + +CMAKE_OPT_PREFIX_KDE3="-DCMAKE_INSTALL_PREFIX:PATH=`kde-config --prefix 2>/dev/null` " +CMAKE_OPT_PREFIX_KDE4="-DCMAKE_INSTALL_PREFIX:PATH=`kde4-config --prefix 2>/dev/null` " +CMAKE_OPT_PREFIX="" +MAKE_VERBOSE="" +USE_STRIGI_SEARCH="" +MENUDRAKE="" +KDE4="" +ACTION="install" +NOCHECK=0 +build_state="touch kbfx_build" +command_line_args=$@ +eval "which kbfxconfigapp > /dev/null 2>&1" && kbfx_installed="1" || kbfx_installed="0" + +color_ok="\\033[1;32m" +color_error="\\033[1;31m" +color_normal="\\033[0;39m" +color_warn="\\033[1;33m" + + +prog_action(){ + echo + echo -e "$color_ok $@ $color_normal" +} + +prog_err(){ + echo + echo -e "$color_error ERROR doing $@ $color_normal\n" +} + +confirm() { + printf "$color_warn %s (Y)es/(N)o? [%s]$color_normal " "$1" "$2" + unset user_input + answer="$2" + read user_input +if [ "$user_input" = "y" -o "$user_input" = "Y" -o "$user_input" = "YES" -o "$user_input" = "Yes" -o "$user_input" = "yes" ]; then + answer="Y" +fi +if [ "$user_input" = "n" -o "$user_input" = "N" -o "" = "NO" -o "$user_input" = "No" -o "$user_input" = "no" ]; then + answer="N" +fi +} + +parse_command_line() { + if [ "$#" -eq 0 ]; then + return 0 + fi + while [ "$1" != "${1##-}" ]; do + case $1 in + --verbose|-v) + MAKE_VERBOSE="VERBOSE=1" + shift 1 + ;; + --prefix|-p) + if [ -n "$2" -a "$2" = "${2##-}" ]; then + t=0 + stop=0 + s="" + for p in $@ + do + t=$[t+1] + if [ $t -gt 1 -a "$p" = "${p##-}" -a $stop -eq 0 ]; then + s="$s$p " + fi + if [ $t -gt 1 -a "$p" != "${p##-}" ]; then + stop=$[t-1] + fi + done + if [ $stop -eq 0 ]; then + stop=$[t-1] + fi + if [ -n "$s" ]; then + s=${s%%[ ]} + CMAKE_OPT_PREFIX="-DCMAKE_INSTALL_PREFIX:PATH='$s' " + fi + shift $stop + else + shift 1 + return 1 + fi + ;; + --strigi|-s) + USE_STRIGI_SEARCH="-DUSE_STRIGI:BOOL=TRUE" + shift 1 + ;; + --menudrake-off|-m) + MENUDRAKE="-DUSE_MENUDRAKE:BOOL=FALSE" + shift 1 + ;; + --kde4|-k) + KDE4="-DUSE_KDE4:BOOL=TRUE" + shift 1 + ;; + --uninstall|-u) + ACTION="uninstall" + shift 1 + ;; + --nocheck|-n) + NOCHECK=1 + shift 1 + ;; + *) + if [ "$#" -ge 1 ]; then + return 1 + fi + return 0 + ;; + esac + done +} + +show_usage(){ + echo + echo -e "$color_warn Usage: \n\t build.sh \t [(-v|--verbose) Be verbose when compiling (default: no)] \n\t\t\t [(-u|--uninstall) Uninstall KBFX (default: no)] \n\t\t\t [(-p|--prefix) Install prefix (default: KDE prefix)] \n\t\t\t [(-s|--strigi) Compile strigi search plugin (default: no)] \n\t\t\t [(-m|-menudrake-off) Don't use menudrake in Mandriva (default: auto)] \n\t\t\t [(-k|--kde4) Compile for KDE4 (default: no)] \n\t\t\t [(-n|--nocheck) Do not check for old KBFX versions (default: check)] $color_normal" + echo +} + +parse_command_line $command_line_args +if [ "$?" -eq 1 ]; then + prog_err "build.sh" + show_usage + exit 1 +fi + +show_usage + +if [ "$ACTION" = "install" ] +then { + if [ $kbfx_installed -eq 1 -a $NOCHECK -eq 0 ] ; then + echo + echo -e "$color_error \n\t You have KBFX installed in your \$PATH!\n\t In order to compile the new version you HAVE TO REMOVE the old KBFX first!\n $color_normal" + exit 1 + fi + + if [ -d build ] ; then + echo + echo -e "$color_warn Directory 'build' exists! Using it...$color_normal" + echo -e "$color_error If 'build.sh' fails, try removing the directory 'build' and run 'build.sh' again! $color_normal" + else + mkdir build + fi + cd build + + if [ "$CMAKE_OPT_PREFIX" = "" ] + then { + if [ "$KDE4" = "" ] + then { + CMAKE_OPT_PREFIX=$CMAKE_OPT_PREFIX_KDE3 + } + else { + CMAKE_OPT_PREFIX=$CMAKE_OPT_PREFIX_KDE4 + } + fi + } + fi + + CMAKE_OPT="$CMAKE_OPT_PREFIX $KDE4 $MENUDRAKE $USE_STRIGI_SEARCH" + + prog_action "Doing CMake configure..." + echo $CMAKE_OPT + eval "cmake ../ $CMAKE_OPT" + if [ $? -ne 0 ]; then + prog_err "CMake configure..." + exit 1 + fi + + prog_action "Doing make..." + make $MAKE_VERBOSE + if [ $? -ne 0 ]; then + prog_err "make..." + exit 1 + fi + + eval $build_state + prog_action "Success building KBFX...\n" + + confirm "Do you want to install KBFX?" "Y" + if [ "$answer" = "Y" ] + then + sucommand="make install" + after_su="touch kbfx_install_user" + if [ `whoami` != 'root' ] + then { + confirm "To install KBFX as 'root', answer 'Yes'. To install as '`whoami`', answer 'No'" "N" + if [ "$answer" = "Y" ] + then { + sucommand="su root -c 'make install'" + after_su="touch kbfx_install_root" + } + fi + } + fi + + prog_action "Doing 'make install'..." + eval $sucommand + if [ $? -ne 0 ]; then + prog_err "make install..." + exit 1 + fi + eval $after_su + echo + echo -e "$color_warn NOTE: If you have used a custom prefix for your install (-p or --prefix option for script), \n you should add '$s' to your \$KDEDIRS environment variable\n and '$s/lib' to your \$LD_LIBRARY_PATH environment variable!\n $color_normal" + fi +} +else { + if [ -d build ] + then + cd build + else + echo + echo -e "$color_error \n\t Directory 'build' DOES NOT exist!\n\t You HAVE NOT used 'build.sh' script for installing KBFX! \n\t Uninstall CAN NOT continue!\n $color_normal" + exit 1 + fi + + if [ -f kbfx_install_user ] + then + sucommand="make uninstall" + after_su="rm -f kbfx_install_user" + elif [ -f kbfx_install_root ] + then + sucommand="su root -c 'make uninstall'" + after_su="rm -f kbfx_install_root" + elif [ -f kbfx_build ] + then + echo + echo -e "$color_error \n\t KBFX IS NOT installed! \n\t Uninstall CAN NOT continue!\n $color_normal" + exit 1 + else + echo + echo -e "$color_error \n\t You HAVE NOT used 'build.sh' script for installing KBFX! \n\t Uninstall CAN NOT continue!\n $color_normal" + exit 1 + fi + + prog_action "Uninstalling..." + eval $sucommand + if [ $? -ne 0 ]; then + prog_err "uninstall..." + exit 1 + fi + eval $after_su + +} +fi + +prog_action "All actions ended successfully...\n" diff --git a/cmakemodules/COPYING-CMAKE-SCRIPTS b/cmakemodules/COPYING-CMAKE-SCRIPTS new file mode 100644 index 0000000..4b41776 --- /dev/null +++ b/cmakemodules/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cmakemodules/CheckCXXCompilerFlag.cmake b/cmakemodules/CheckCXXCompilerFlag.cmake new file mode 100644 index 0000000..43ea9a6 --- /dev/null +++ b/cmakemodules/CheckCXXCompilerFlag.cmake @@ -0,0 +1,21 @@ +# - Check whether the CXX compiler supports a given flag. +# CHECK_CXX_COMPILER_FLAG(FLAG VARIABLE) +# +# FLAG - the compiler flag +# VARIABLE - variable to store the result + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckCXXSourceCompiles) + +MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT) + SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") + SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}") + CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT}) + SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") +ENDMACRO (CHECK_CXX_COMPILER_FLAG) + diff --git a/cmakemodules/FindGNUWIN32.cmake b/cmakemodules/FindGNUWIN32.cmake new file mode 100644 index 0000000..8b999d9 --- /dev/null +++ b/cmakemodules/FindGNUWIN32.cmake @@ -0,0 +1,49 @@ + +# Copyright (c) 2006, Peter Kuemmel, <syntheticpp@yahoo.com> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (WIN32) + +# check if GNUWIN32_DIR is already set +# (e.g. by command line argument or the calling script) +if(NOT GNUWIN32_DIR) + # check for enviroment variable + file(TO_CMAKE_PATH "$ENV{GNUWIN32_DIR}" GNUWIN32_DIR) + if(NOT GNUWIN32_DIR) + # search in the default program install folder + file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _progFiles) + find_file(GNUWIN32_DIR_tmp gnuwin32 win32libs + PATHS + "${_progFiles}" + "C:/" "D:/" "E:/" "F:/" "G:/" + ) + set(GNUWIN32_DIR ${GNUWIN32_DIR_tmp}) + endif(NOT GNUWIN32_DIR) +endif(NOT GNUWIN32_DIR) + +if (GNUWIN32_DIR) + set(GNUWIN32_INCLUDE_DIR ${GNUWIN32_DIR}/include) + set(GNUWIN32_LIBRARY_DIR ${GNUWIN32_DIR}/lib) + set(GNUWIN32_BINARY_DIR ${GNUWIN32_DIR}/bin) + set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} ${GNUWIN32_INCLUDE_DIR}) + set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${GNUWIN32_LIBRARY_DIR}) + set(GNUWIN32_FOUND TRUE) +else (GNUWIN32_DIR) + set(GNUWIN32_FOUND) +endif (GNUWIN32_DIR) + +if (GNUWIN32_FOUND) + if (NOT GNUWIN32_FIND_QUIETLY) + message(STATUS "Found GNUWIN32: ${GNUWIN32_DIR}") + endif (NOT GNUWIN32_FIND_QUIETLY) +else (GNUWIN32_FOUND) + if (GNUWIN32_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find GNUWIN32") + endif (GNUWIN32_FIND_REQUIRED) +endif (GNUWIN32_FOUND) + +endif (WIN32) + diff --git a/cmakemodules/FindKBFX.cmake b/cmakemodules/FindKBFX.cmake new file mode 100644 index 0000000..b865018 --- /dev/null +++ b/cmakemodules/FindKBFX.cmake @@ -0,0 +1,32 @@ +# - Try to find the KBFX package - +# If found the following will be defined +# +# KBFX_FOUND - KBFX package found on the system +# KBFX_INCLUDE_DIR - Directory of the KBFX package include files +# KBFX_LIBRARY - Where libkbfxplasma.so resides +# + +FIND_PATH(KBFX_INCLUDE_DIR kbfx/kbfxconfig.h + PATHS + ${INCLUDE_SEARCH_PATHES} +) + +FIND_LIBRARY(KBFX_LIBRARY NAMES kbfxplasma + PATHS + ${LIB_SEARCH_PATHES} +) + +IF(KBFX_INCLUDE_DIR AND KBFX_LIBRARY) + SET(KBFX_FOUND TRUE) +ENDIF(KBFX_INCLUDE_DIR AND KBFX_LIBRARY) + +IF(KBFX_FOUND) + IF(NOT KBFX_FIND_QUIETLY) + MESSAGE(STATUS "Found KBFX package: ${KBFX_LIBRARY}") + ENDIF(NOT KBFX_FIND_QUIETLY) +ELSE(KBFX_FOUND) + IF(KBFX_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find KBFX package! Please download and install KBFX from http://www.kbfx.org") + ENDIF(KBFX_FIND_REQUIRED) +ENDIF(KBFX_FOUND) + diff --git a/cmakemodules/FindKDE4.cmake b/cmakemodules/FindKDE4.cmake new file mode 100644 index 0000000..bbcd8d5 --- /dev/null +++ b/cmakemodules/FindKDE4.cmake @@ -0,0 +1,40 @@ +# Find KDE4 and provide all necessary variables and macros to compile software for it. +# It looks for KDE 4 in the following directories in the given order: +# - CMAKE_INSTALL_PREFIX +# - KDEDIR +# - /opt/kde4 +# - /opt/kde +# +# Please look in FindKDE4Internal.cmake and KDE4Macros.cmake for more information. +# They are installed with the KDE 4 libraries in $KDEDIR/share/apps/cmake/modules/. +# +# Author: Alexander Neundorf <neundorf@kde.org> +# Modified by PhobosK <phobosk@mail.kbfx.org> + +# For KDE4 kde-config has been renamed to kde4-config +FIND_PROGRAM(KDE4_KDECONFIG_EXECUTABLE NAMES kde4-config + PATHS + ${BIN_SEARCH_PATHES} + NO_DEFAULT_PATH) + +IF (NOT KDE4_KDECONFIG_EXECUTABLE) + FIND_PROGRAM(KDE4_KDECONFIG_EXECUTABLE NAMES kde4-config ) +ENDIF (NOT KDE4_KDECONFIG_EXECUTABLE) + +IF (KDE4_KDECONFIG_EXECUTABLE) + IF (KDE4_FIND_QUIETLY) + SET(_quiet QUIET) + ENDIF (KDE4_FIND_QUIETLY) + + IF (KDE4_FIND_REQUIRED) + SET(_req REQUIRED) + ENDIF (KDE4_FIND_REQUIRED) + + # use FindKDE4Internal.cmake to do the rest + FIND_PACKAGE(KDE4Internal ${_req} ${_quiet}) +ELSE (KDE4_KDECONFIG_EXECUTABLE) + IF (KDE4_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "ERROR: Could not find KDE4 kde4-config") + ENDIF (KDE4_FIND_REQUIRED) +ENDIF (KDE4_KDECONFIG_EXECUTABLE) + diff --git a/cmakemodules/FindKDE4Internal.cmake b/cmakemodules/FindKDE4Internal.cmake new file mode 100644 index 0000000..3747468 --- /dev/null +++ b/cmakemodules/FindKDE4Internal.cmake @@ -0,0 +1,839 @@ +# - Find the KDE4 include and library dirs, KDE preprocessors and define a some macros +# +# This module defines the following variables: +# +# KDE4_FOUND - set to TRUE if everything required for building KDE software has been found +# +# KDE4_DEFINITIONS - compiler definitions required for compiling KDE software +# KDE4_INCLUDE_DIR - the KDE 4 include directory +# KDE4_INCLUDES - all include directories required for KDE, i.e. +# KDE4_INCLUDE_DIR, but also the Qt4 include directories +# and other platform specific include directories +# KDE4_LIB_DIR - the directory where the KDE libraries are installed, +# intended to be used with LINK_DIRECTORIES() +# +# The following variables are defined for the various tools required to +# compile KDE software: +# +# KDE4_KCFGC_EXECUTABLE - the kconfig_compiler executable +# KDE4_MEINPROC_EXECUTABLE - the meinproc executable +# KDE4_MAKEKDEWIDGETS_EXECUTABLE - the makekdewidgets executable +# +# The following variables point to the location of the KDE libraries, +# but shouldn't be used directly: +# +# KDE4_KDECORE_LIBRARY - the kdecore library +# KDE4_KDEUI_LIBRARY - the kdeui library +# KDE4_KIO_LIBRARY - the kio library +# KDE4_KPARTS_LIBRARY - the kparts library +# KDE4_KUTILS_LIBRARY - the kutils library +# KDE4_KDE3SUPPORT_LIBRARY - the kde3support library +# KDE4_KXMLCORE_LIBRARY - the kxmlcore library +# KDE4_KHTML_LIBRARY - the khtml library +# KDE4_KJS_LIBRARY - the kjs library +# KDE4_KNEWSTUFF_LIBRARY - the knewstuff library +# KDE4_KDEPRINT_LIBRARY - the kdeprint library +# KDE4_KSPELL2_LIBRARY - the kspell2 library +# KDE4_KDNSSD_LIBRARY - the kdnssd library +# KDE4_PHONONCORE_LIBRARY - the phononcore library +# KDE4_PHONONUI_LIBRARY - the phononui library +# KDE4_KAUDIODEVICELIST_LIBRARY - the kaudiodevicelist library +# KDE4_KDEFX_LIBRARY - the kdefx library +# KDE4_THREADWEAVER_LIBRARY- the threadweaver library +# KDE4_SOLID_LIBRARY - the solid library +# KDE4_SOLIDIFACES_LIBRARY - the solidiface library +# KDE4_KNOTIFYCONFIG_LIBRARY- the knotifyconfig library +# KDE4_KROSSCORE_LIBRARY- the krosscore library +# KDE4_KTEXTEDITOR_LIBRARY - the ktexteditor library +# KDE4_KWALLETCLIENT_LIBRARY - the kwalletclient library +# +# Compared to the variables above, the following variables +# also contain all of the depending libraries, so the variables below +# should be used instead of the ones above: +# +# KDE4_KDECORE_LIBS - the kdecore library and all depending libraries +# KDE4_KDEUI_LIBS - the kdeui library and all depending libraries +# KDE4_KIO_LIBS - the kio library and all depending libraries +# KDE4_KPARTS_LIBS - the kparts library and all depending libraries +# KDE4_KUTILS_LIBS - the kutils library and all depending libraries +# KDE4_KDE3SUPPORT_LIBS - the kde3support library and all depending libraries +# KDE4_KXMLCORE_LIBS - the kxmlcore library and all depending libraries +# KDE4_KHTML_LIBS - the khtml library and all depending libraries +# KDE4_KJS_LIBS - the kjs library and all depending libraries +# KDE4_KNEWSTUFF_LIBS - the knewstuff library and all depending libraries +# KDE4_KDEPRINT_LIBS - the kdeprint library and all depending libraries +# KDE4_KSPELL2_LIBS - the kspell2 library and all depending libraries +# KDE4_KDNSSD_LIBS - the kdnssd library and all depending libraries +# KDE4_KDESU_LIBS - the kdesu library and all depending libraries +# KDE4_PHONONCORE_LIBS - the phononcore library and all depending librairies +# KDE4_PHONONUI_LIBRARIES - the phononui library and all depending librairies +# KDE4_KDEFX_LIBS - the kdefx library and all depending librairies +# KDE4_THREADWEAVER_LIBRARIES- the threadweaver library and all depending libraries +# KDE4_SOLID_LIBS - the solid library and all depending libraries +# KDE4_SOLIDIFACES_LIBS - the solid iface library and all depending libraries +# KDE4_KNOTIFYCONFIG_LIBS - the knotify config library and all depending libraries +# KDE4_KROSSCORE_LIBS - the kross core library and all depending libraries +# KDE4_KTEXTEDITOR_LIBS - the ktexteditor library and all depending libraries +# KDE4_KWALLETCLIENT_LIBS - the kwallet client library and all depending libraries +# +# This module defines a bunch of variables used as locations +# for install directories. They are all interpreted relative +# to CMAKE_INSTALL_PREFIX +# +# BIN_INSTALL_DIR - the directory where executables be installed (default is prefix/bin) +# SBIN_INSTALL_DIR - the directory where system executables will be installed (default is prefix/sbin) +# LIB_INSTALL_DIR - the directory where libraries will be installed (default is prefix/lib) +# CONFIG_INSTALL_DIR - the config file install dir +# DATA_INSTALL_DIR - the parent directory where applications can install their data +# HTML_INSTALL_DIR - the HTML install dir for documentation +# ICON_INSTALL_DIR - the icon install dir (default prefix/share/icons/) +# INFO_INSTALL_DIR - the kde info install dir (default prefix/info) +# KCFG_INSTALL_DIR - the install dir for kconfig files +# LOCALE_INSTALL_DIR - the install dir for translations +# MAN_INSTALL_DIR - the kde man page install dir (default prefix/man/) +# MIME_INSTALL_DIR - the install dir for the mimetype desktop files +# PLUGIN_INSTALL_DIR - the subdirectory relative to the install prefix where plugins will be installed (default is ${KDE4_LIB_INSTALL_DIR}/kde4) +# SERVICES_INSTALL_DIR - the install dir for service (desktop, protocol, ...) files +# SERVICETYPES_INSTALL_DIR - the install dir for servicestypes desktop files +# SOUND_INSTALL_DIR - the install dir for sound files +# TEMPLATES_INSTALL_DIR - the install dir for templates (Create new file...) +# WALLPAPER_INSTALL_DIR - the install dir for wallpapers +# KCONF_UPDATE_INSTALL_DIR - the kconf_update install dir +# XDG_APPS_DIR - the XDG apps dir +# XDG_DIRECTORY_DIR - the XDG directory +# DBUS_INTERFACES_DIR - the directory where dbus interfaces be installed (default is prefix/share/dbus-1/interfaces +# +# The following variables are provided, but are seem to be unused: +# LIBS_HTML_INSTALL_DIR /share/doc/HTML CACHE STRING "Is this still used ?") +# APPLNK_INSTALL_DIR /share/applnk CACHE STRING "Is this still used ?") +# +# The following user adjustable options are provided: +# +# KDE4_ENABLE_FINAL - enable KDE-style enable-final all-in-one-compilation +# KDE4_BUILD_TESTS - enable this to build the testcases +# KDE4_ENABLE_FPIE - enable it to use gcc Position Independent Executables feature +# +# It also adds the following macros (from KDE4Macros.cmake) +# KDE4_ADD_UI_FILES (SRCS_VAR file1.ui ... fileN.ui) +# Use this to add Qt designer ui files to your application/library. +# +# KDE4_ADD_UI3_FILES (SRCS_VAR file1.ui ... fileN.ui) +# Use this to add Qt designer ui files from Qt version 3 to your application/library. +# +# KDE4_ADD_KCFG_FILES (SRCS_VAR [GENERATE_MOC] file1.kcfgc ... fileN.kcfgc) +# Use this to add KDE config compiler files to your application/library. +# Use optional GENERATE_MOC to generate moc if you use signals in your kcfg files. +# +# KDE4_ADD_WIDGET_FILES (SRCS_VAR file1.widgets ... fileN.widgets) +# Use this to add widget description files for the makekdewidgets code generator +# for Qt Designer plugins. +# +# KDE4_AUTOMOC(file1 ... fileN) +# Call this if you want to have automatic moc file handling. +# This means if you include "foo.moc" in the source file foo.cpp +# a moc file for the header foo.h will be created automatically. +# You can set the property SKIP_AUTOMAKE using SET_SOURCE_FILES_PROPERTIES() +# to exclude some files in the list from being processed. +# If you don't want automoc, you can also use QT4_WRAP_CPP() or QT4_GENERATE_MOC() +# from FindQt4.cmake to have the moc files generated. This will be faster +# but require more manual work. +# +# KDE4_INSTALL_LIBTOOL_FILE ( subdir target ) +# This will create and install a simple libtool file for the +# given target. This might be required for other software. +# The libtool file will be install in subdir, relative to CMAKE_INSTALL_PREFIX . +# +# KDE4_CREATE_FINAL_FILES (filename_CXX filename_C file1 ... fileN) +# This macro is intended mainly for internal uses. +# It is used for enable-final. It will generate two source files, +# one for the C files and one for the C++ files. +# These files will have the names given in filename_CXX and filename_C. +# +# KDE4_ADD_PLUGIN ( name [WITH_PREFIX] file1 ... fileN ) +# Create a KDE plugin (KPart, kioslave, etc.) from the given source files. +# It supports KDE4_ENABLE_FINAL. +# If WITH_PREFIX is given, the resulting plugin will have the prefix "lib", otherwise it won't. +# It creates and installs an appropriate libtool la-file. +# +# KDE4_ADD_KDEINIT_EXECUTABLE (name [NOGUI] [RUN_UNINSTALLED] file1 ... fileN) +# Create a KDE application in the form of a module loadable via kdeinit. +# A library named kdeinit_<name> will be created and a small executable which links to it. +# It supports KDE4_ENABLE_FINAL +# If the executable has to be run from the buildtree (e.g. unit tests and code generators +# used later on when compiling), set the option RUN_UNINSTALLED. +# If the executable doesn't have a GUI, use the option NOGUI. By default on OS X +# application bundles are created, with the NOGUI option no bundles but simple executables +# are created. Currently it doesn't have any effect on other platforms. +# +# KDE4_ADD_EXECUTABLE (name [NOGUI] [RUN_UNINSTALLED] file1 ... fileN) +# Equivalent to ADD_EXECUTABLE(), but additionally adds support for KDE4_ENABLE_FINAL. +# If you don't need support for KDE4_ENABLE_FINAL, you can just use the +# normal ADD_EXECUTABLE(). +# If the executable has to be run from the buildtree (e.g. unit tests and code generators +# used later on when compiling), set the option RUN_UNINSTALLED. +# If the executable doesn't have a GUI, use the option NOGUI. By default on OS X +# application bundles are created, with the NOGUI option no bundles but simple executables +# are created. Currently it doesn't have any effect on other platforms. +# +# KDE4_ADD_LIBRARY (name [STATIC | SHARED | MODULE ] file1 ... fileN) +# Equivalent to ADD_LIBRARY(), but additionally it supports KDE4_ENABLE_FINAL +# and under Windows it adds a -DMAKE_<name>_LIB definition to the compilation. +# +# KDE4_INSTALL_ICONS( path theme) +# Installs all png and svgz files in the current directory to the icon +# directoy given in path, in the subdirectory for the given icon theme. +# +# KDE4_CREATE_HANDBOOK( docbookfile ) +# Create the handbook from the docbookfile (using meinproc) +# +# KDE4_INSTALL_HANDBOOK() +# Install the handbook documentation +# +# KDE4_CREATE_HTML_HANDBOOK( docbookfile ) +# Create HTML version of the handbook from the docbookfile (using meinproc) +# +# _KDE4_PLATFORM_INCLUDE_DIRS is used only internally +# _KDE4_PLATFORM_DEFINITIONS is used only internally +# +# +# Copyright (c) 2006, Alexander Neundorf <neundorf@kde.org> +# Copyright (c) 2006, Laurent Montel, <montel@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# Modified by PhobosK <phobosk@mail.kbfx.org> + + +INCLUDE (MacroEnsureVersion) + +cmake_minimum_required(VERSION 2.4.3 FATAL_ERROR) + +set(QT_MIN_VERSION "4.2.0") +#this line includes FindQt4.cmake, which searches the Qt library and headers +find_package(Qt4 REQUIRED) + +if (NOT QT_DBUSXML2CPP_EXECUTABLE) + message(FATAL_ERROR "Qt4 qdbusxml2cpp was not found. Make sure it has been built and installed by Qt") +endif (NOT QT_DBUSXML2CPP_EXECUTABLE) + + +# Perl is required for building KDE software, +find_package(Perl REQUIRED) + +# remove once we require cmake >= 2.4.4, then the REQUIRED flag is honored by FindPerl.cmake, Alex +if(NOT PERL_FOUND) + message(FATAL_ERROR "Perl was not found. Make sure it has installed on your system") +endif(NOT PERL_FOUND) + +include (MacroLibrary) +include (CheckCXXCompilerFlag) + +#add some KDE specific stuff + +# the following are directories where stuff will be installed to +set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" ) + + +# this macro implements some very special logic how to deal with the cache +# by default the various install locations inherit their value from theit "parent" variable +# so if you set CMAKE_INSTALL_PREFIX, then EXEC_INSTALL_PREFIX, PLUGIN_INSTALL_DIR will +# calculate their value by appending subdirs to CMAKE_INSTALL_PREFIX +# this would work completely without using the cache. +# but if somebody wants e.g. a different EXEC_INSTALL_PREFIX this value has to go into +# the cache, otherwise it will be forgotten on the next cmake run. +# Once a variable is in the cache, it doesn't depend on its "parent" variables +# anymore and you can only change it by editing it directly. +# this macro helps in this regard, because as long as you don't set one of the +# variables explicitely to some location, it will always calculate its value from its +# parents. So modifying CMAKE_INSTALL_PREFIX later on will have the desired effect. +# But once you decide to set e.g. EXEC_INSTALL_PREFIX to some special location +# this will go into the cache and it will no longer depend on CMAKE_INSTALL_PREFIX. +macro(_SET_FANCY _var _value _comment) + if (NOT DEFINED ${_var}) + set(${_var} ${_value}) + else (NOT DEFINED ${_var}) + set(${_var} "${${_var}}" CACHE PATH "${_comment}") + endif (NOT DEFINED ${_var}) +endmacro(_SET_FANCY) + + +_set_fancy(SHARE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/share "Base directory for files which go to share/") +_set_fancy(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} "Base directory for executables and libraries") + +_set_fancy(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" "The install dir for executables (default ${EXEC_INSTALL_PREFIX}/bin)") +_set_fancy(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" "The install dir for system executables (default ${EXEC_INSTALL_PREFIX}/sbin)") +_set_fancy(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" "The subdirectory relative to the install prefix where libraries will be installed (default is ${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX})") + +_set_fancy(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4/libexec" "The subdirectory relative to the install prefix where libraries will be installed (default is ${LIB_INSTALL_DIR}/kde4/libexec)") +_set_fancy(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4" "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde4)") + +_set_fancy(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" "The subdirectory to the header prefix") +_set_fancy(CONFIG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config" "The config file install dir") +_set_fancy(DATA_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/apps" "The parent directory where applications can install their data") +_set_fancy(HTML_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/doc/HTML" "The HTML install dir for documentation") +_set_fancy(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "The icon install dir (default ${SHARE_INSTALL_PREFIX}/share/icons/)") +_set_fancy(KCFG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config.kcfg" "The install dir for kconfig files") +_set_fancy(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" "The install dir for translations") +_set_fancy(MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mimelnk" "The install dir for the mimetype desktop files") +_set_fancy(SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/services" "The install dir for service (desktop, protocol, ...) files") +_set_fancy(SERVICETYPES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/servicetypes" "The install dir for servicestypes desktop files") +_set_fancy(SOUND_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/sounds" "The install dir for sound files") +_set_fancy(TEMPLATES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/templates" "The install dir for templates (Create new file...)") +_set_fancy(WALLPAPER_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/wallpapers" "The install dir for wallpapers") +_set_fancy(KCONF_UPDATE_INSTALL_DIR "${DATA_INSTALL_DIR}/kconf_update" "The kconf_update install dir") + # this one shouldn't be used anymore +_set_fancy(APPLNK_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/applnk" "Is this still used ?") +_set_fancy(AUTOSTART_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/autostart" "The install dir for autostart files") + +_set_fancy(XDG_APPS_DIR "${SHARE_INSTALL_PREFIX}/applications/kde" "The XDG apps dir") +_set_fancy(XDG_DIRECTORY_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" "The XDG directory") + +_set_fancy(SYSCONF_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/etc" "The kde sysconfig install dir (default /etc)") +_set_fancy(MAN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/man" "The kde man install dir (default ${CMAKE_INSTALL_PREFIX}/man/)") +_set_fancy(INFO_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/info" "The kde info install dir (default ${CMAKE_INSTALL_PREFIX}/info)") +_set_fancy(DBUS_INTERFACES_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/interfaces" "The kde dbus interfaces install dir (default ${SHARE_INSTALL_PREFIX}/dbus-1/interfaces)") +# _set_fancy(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4/libexec" "The subdirectory relative to the install prefix where libraries will be installed (default is /lib)") +# _set_fancy(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde4/modules" "The subdirectory relative to the install prefix where plugins will be installed (default is ${KDE4_LIB_INSTALL_DIR}/kde4)") + + +################################# + + +# get the directory of the current file, used later on in the file +get_filename_component( kde_cmake_module_dir ${CMAKE_CURRENT_LIST_FILE} PATH) + +# the following are directories where stuff will be installed to + + +option(KDE4_ENABLE_FINAL "Enable final all-in-one compilation") +option(KDE4_BUILD_TESTS "Build the tests") + +if( KDE4_ENABLE_FINAL) + add_definitions(-DKDE_USE_FINAL) +endif(KDE4_ENABLE_FINAL) + +#Position-Independent-Executable is a feature of Binutils, Libc, and GCC that creates an executable +#which is something between a shared library and a normal executable. +#Programs compiled with these features appear as ?shared object? with the file command. +#info from "http://www.linuxfromscratch.org/hlfs/view/unstable/glibc/chapter02/pie.html" +option(KDE4_ENABLE_FPIE "Enable platform supports PIE linking") + +#now try to find some kde stuff + +#are we trying to compile kdelibs ? +#then enter bootstrap mode +if(EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + + message(STATUS "Building kdelibs...") + + set(KDE4_INCLUDE_DIR ${CMAKE_SOURCE_DIR}) + set(KDE4_KDECORE_LIBS ${QT_QTCORE_LIBRARY} kdecore) + set(KDE4_KDEUI_LIBS ${KDE4_KDECORE_LIBS} kdeui) + set(KDE4_KIO_LIBS ${KDE4_KDEUI_LIBS} kio) + set(KDE4_KPARTS_LIBS ${KDE4_KIO_LIBS} kparts) + set(KDE4_KUTILS_LIBS ${KDE4_KIO_LIBS} kutils) + set(KDE4_KDEFX_LIBS ${KDE4_KDEFX_LIBS} kdefx) + + + set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin ) + + if (WIN32) + set(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH} ) + # CMAKE_CFG_INTDIR is the output subdirectory created e.g. by XCode and MSVC + set(KDE4_KCFGC_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/kconfig_compiler ) + set(KDE4_MEINPROC_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/meinproc ) + set(KDE4_MAKEKDEWIDGETS_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/makekdewidgets ) + else (WIN32) + set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib ) + set(KDE4_KCFGC_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/kconfig_compiler.shell ) + set(KDE4_MEINPROC_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/meinproc.shell ) + set(KDE4_MAKEKDEWIDGETS_EXECUTABLE ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/makekdewidgets.shell ) + endif (WIN32) + + set(KDE4_LIB_DIR ${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}) + + # when building kdelibs, make the kcfg rules depend on the binaries... + set( _KDE4_KCONFIG_COMPILER_DEP kconfig_compiler) + set( _KDE4_MAKEKDEWIDGETS_DEP makekdewidgets) + set( _KDE4_MEINPROC_EXECUTABLE_DEP meinproc) + + set(KDE4_INSTALLED_VERSION_OK TRUE) + +else(EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + + # ... but NOT otherwise + set( _KDE4_KCONFIG_COMPILER_DEP) + set( _KDE4_MAKEKDEWIDGETS_DEP) + set( _KDE4_MEINPROC_EXECUTABLE_DEP) + + # Check the version of kde. KDE4_KDECONFIG_EXECUTABLE was set by FindKDE4 + exec_program(${KDE4_KDECONFIG_EXECUTABLE} ARGS "--version" OUTPUT_VARIABLE kdeconfig_output ) + + string(REGEX MATCH "KDE: [0-9]+\\.[0-9]+\\.[0-9]+" KDEVERSION "${kdeconfig_output}") + if (KDEVERSION) + + string(REGEX REPLACE "^KDE: " "" KDEVERSION "${KDEVERSION}") + + # we need at least this version: + if (NOT KDE_MIN_VERSION) + set(KDE_MIN_VERSION "3.9.0") + endif (NOT KDE_MIN_VERSION) + + #message(STATUS "KDE_MIN_VERSION=${KDE_MIN_VERSION} found ${KDEVERSION}") + + macro_ensure_version( ${KDE_MIN_VERSION} ${KDEVERSION} KDE4_INSTALLED_VERSION_OK ) + + else (KDEVERSION) + message(FATAL_ERROR "Couldn't parse KDE version string from the kde4-config output:\n${kdeconfig_output}") + endif (KDEVERSION) + + + set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib ) + + # this file contains all dependencies of all libraries of kdelibs, Alex + include(${kde_cmake_module_dir}/KDELibsDependencies.cmake) + + find_library(KDE4_KDECORE_LIBRARY NAMES kdecore PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDECORE_LIBS ${kdecore_LIB_DEPENDS} ${KDE4_KDECORE_LIBRARY} ) + + find_library(KDE4_KDEFX_LIBRARY NAMES kdefx PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDEFX_LIBS ${kdefx_LIB_DEPENDS} ${KDE4_KDEFX_LIBRARY} ) + + find_library(KDE4_KDEUI_LIBRARY NAMES kdeui PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDEUI_LIBS ${kdeui_LIB_DEPENDS} ${KDE4_KDEUI_LIBRARY} ) + + find_library(KDE4_KIO_LIBRARY NAMES kio PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KIO_LIBS ${kio_LIB_DEPENDS} ${KDE4_KIO_LIBRARY} ) + + find_library(KDE4_KPARTS_LIBRARY NAMES kparts PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KPARTS_LIBS ${kparts_LIB_DEPENDS} ${KDE4_KPARTS_LIBRARY} ) + + find_library(KDE4_KUTILS_LIBRARY NAMES kutils PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KUTILS_LIBS ${kutils_LIB_DEPENDS} ${KDE4_KUTILS_LIBRARY} ) + + find_library(KDE4_KDE3SUPPORT_LIBRARY NAMES kde3support PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDE3SUPPORT_LIBS ${kde3support_LIB_DEPENDS} ${KDE4_KDE3SUPPORT_LIBRARY} ) + + find_library(KDE4_KHTML_LIBRARY NAMES khtml PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KHTML_LIBS ${khtml_LIB_DEPENDS} ${KDE4_KHTML_LIBRARY} ) + + find_library(KDE4_KJS_LIBRARY NAMES kjs PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KJS_LIBS ${kjs_LIB_DEPENDS} ${KDE4_KJS_LIBRARY} ) + + find_library(KDE4_KNEWSTUFF_LIBRARY NAMES knewstuff PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KNEWSTUFF_LIBS ${knewstuff_LIB_DEPENDS} ${KDE4_KNEWSTUFF_LIBRARY} ) + + find_library(KDE4_KDEPRINT_LIBRARY NAMES kdeprint PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDEPRINT_LIBS ${kdeprint_LIB_DEPENDS} ${KDE4_KDEPRINT_LIBRARY} ) + + find_library(KDE4_KSPELL2_LIBRARY NAMES kspell2 PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KSPELL2_LIBS ${kspell2_LIB_DEPENDS} ${KDE4_KSPELL2_LIBRARY} ) + + if (UNIX) + find_library(KDE4_KDESU_LIBRARY NAMES kdesu PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDESU_LIBS ${kdesu_LIB_DEPENDS} ${KDE4_KDESU_LIBRARY} ) + endif (UNIX) + + find_library(KDE4_KDNSSD_LIBRARY NAMES kdnssd PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KDNSSD_LIBS ${kdnssd_LIB_DEPENDS} ${KDE4_KDNSSD_LIBRARY} ) + + # now the KDE library directory, kxmlcore is new with KDE4 + find_library(KDE4_KXMLCORE_LIBRARY NAMES kxmlcore PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_KXMLCORE_LIBRARIES ${kxmlcore_LIB_DEPENDS} ${KDE4_KXMLCORE_LIBRARY} ) + + find_library(KDE4_PHONONCORE_LIBRARY NAMES phononcore PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_PHONONCORE_LIBS ${phononcore_LIB_DEPENDS} ${KDE4_PHONONCORE_LIBRARY} ) + + find_library(KDE4_PHONONUI_LIBRARY NAMES phononui PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_PHONONUI_LIBS ${phononui_LIB_DEPENDS} ${KDE4_PHONONUI_LIBRARY} ) + + find_library(KDE4_KAUDIODEVICELIST_LIBRARY NAMES kaudiodevicelist PATHS ${KDE4_LIB_INSTALL_DIR} NO_DEFAULT_PATH ) + set(KDE4_KAUDIODEVICELIST_LIBS ${kaudiodevicelist_LIB_DEPENDS} ${KDE4_KAUDIODEVICELIST_LIBRARY} ) + + find_library(KDE4_SOLID_LIBRARY NAMES solid PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_SOLID_LIBS ${solid_LIB_DEPENDS} ${KDE4_SOLID_LIBRARY} ) + + find_library(KDE4_SOLIDIFACES_LIBRARY NAMES solidifaces PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_SOLIDIFACES_LIBS ${solidifaces_LIB_DEPENDS} ${KDE4_SOLIDIFACES_LIBRARY} ) + + find_library(KDE4_THREADWEAVER_LIBRARY NAMES threadweaver PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_THREADWEAVER_LIBRARIES ${threadweaver_LIB_DEPENDS} ${KDE4_THREADWEAVER_LIBRARY} ) + + find_library(KDE4_KNOTIFYCONFIG_LIBRARY NAMES knotifyconfig PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_KNOTIFYCONFIG_LIBS ${knotifyconfig_LIB_DEPENDS} ${KDE4_KNOTIFYCONFIG_LIBRARY} ) + + find_library(KDE4_KROSSCORE_LIBRARY NAMES krosscore PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_KROSSCORE_LIBS ${krosscore_LIB_DEPENDS} ${KDE4_KROSSCORE_LIBRARY} ) + + find_library(KDE4_KTEXTEDITOR_LIBRARY NAMES ktexteditor PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_KTEXTEDITOR_LIBS ${ktexteditor_LIB_DEPENDS} ${KDE4_KTEXTEDITOR_LIBRARY} ) + + find_library(KDE4_KWALLETCLIENT_LIBRARY NAMES kwalletclient PATHS ${KDE4_LIB_INSTALL_DIR} ) + set(KDE4_KWALLETCLIENT_LIBS ${kwalletclient_LIB_DEPENDS} ${KDE4_KWALLETCLIENT_LIBRARY} ) + + get_filename_component(KDE4_LIB_DIR ${KDE4_KDECORE_LIBRARY} PATH ) + + + # at first the KDE include direcory + # kpassworddialog.h is new with KDE4 + find_path(KDE4_INCLUDE_DIR kpassworddialog.h + ${KDE4_INCLUDE_INSTALL_DIR} + $ENV{KDEDIR}/include + /opt/kde/include + /opt/kde4/include + /usr/local/include + /usr/include/ + /usr/include/kde + /usr/local/include/kde + ) + + find_program(KDE4_KCFGC_EXECUTABLE NAME kconfig_compiler PATHS + ${KDE4_BIN_INSTALL_DIR} + $ENV{KDEDIR}/bin + /opt/kde/bin + /opt/kde4/bin + NO_DEFAULT_PATH + ) + find_program(KDE4_KCFGC_EXECUTABLE NAME kconfig_compiler ) + + find_program(KDE4_MEINPROC_EXECUTABLE NAME meinproc PATHS + ${KDE4_BIN_INSTALL_DIR} + $ENV{KDEDIR}/bin + /opt/kde/bin + /opt/kde4/bin + NO_DEFAULT_PATH + ) + find_program(KDE4_MEINPROC_EXECUTABLE NAME meinproc ) + + find_program(KDE4_MAKEKDEWIDGETS_EXECUTABLE NAME makekdewidgets PATHS + ${KDE4_BIN_INSTALL_DIR} + $ENV{KDEDIR}/bin + /opt/kde/bin + /opt/kde4/bin + NO_DEFAULT_PATH + ) + find_program(KDE4_MAKEKDEWIDGETS_EXECUTABLE NAME makekdewidgets ) + +endif(EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + + +##################### and now the platform specific stuff ############################ + +# Set a default build type for single-configuration +# CMake generators if no build type is set. +if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + + +if (WIN32) + + if(CYGWIN) + message(FATAL_ERROR "Support for Cygwin NOT yet implemented, please edit FindKDE4.cmake to enable it") + endif(CYGWIN) + + find_package(KDEWIN32 REQUIRED) + + # is GnuWin32 required or does e.g. Visual Studio provide an own implementation? + #find_package(GNUWIN32 REQUIRED) + find_package(GNUWIN32) + + set( _KDE4_PLATFORM_INCLUDE_DIRS ${KDEWIN32_INCLUDES} ${GNUWIN32_INCLUDE_DIR}) + + # if we are compiling kdelibs, add KDEWIN32_LIBRARIES explicitely, + # otherwise they come from KDELibsDependencies.cmake, Alex + if(EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + set( KDE4_KDECORE_LIBS ${KDE4_KDECORE_LIBS} ${KDEWIN32_LIBRARIES} ) + endif(EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + + # windows, mingw + if(MINGW) + #hmmm, something special to do here ? + endif(MINGW) + + # windows, microsoft compiler + if(MSVC) + set( _KDE4_PLATFORM_DEFINITIONS -DKDE_FULL_TEMPLATE_EXPORT_INSTANTIATION -DWIN32_LEAN_AND_MEAN -DUNICODE ) + # C4250: 'class1' : inherits 'class2::member' via dominance + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4250" ) + # C4251: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2' + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4251" ) + if(CMAKE_COMPILER_2005) + # to avoid a lot of deprecated warnings + add_definitions( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE ) + # 'identifier' : no suitable definition provided for explicit template instantiation request + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4661" ) + endif(CMAKE_COMPILER_2005) + endif(MSVC) + + + # for visual studio IDE set the path correctly for custom commands + # maybe under windows bat-files should be generated for running apps during the build + if(MSVC_IDE) + get_filename_component(PERL_LOCATION "${PERL_EXECUTABLE}" PATH) + file(TO_NATIVE_PATH "${PERL_LOCATION}" PERL_PATH_WINDOWS) + file(TO_NATIVE_PATH "${QT_BINARY_DIR}" QT_BIN_DIR_WINDOWS) + set(CMAKE_MSVCIDE_RUN_PATH "${PERL_PATH_WINDOWS}\;${QT_BIN_DIR_WINDOWS}" + CACHE STATIC "MSVC IDE Run path" FORCE) + endif(MSVC_IDE) + +endif (WIN32) + + +# also use /usr/local by default under UNIX, including Mac OS X +if (UNIX) + option(KDE4_USE_ALWAYS_FULL_RPATH "If set to TRUE, also libs and plugins will be linked with the full RPATH, which will usually make them work better, but make install will take longer." OFF) + + link_directories(/usr/local/lib) + set( _KDE4_PLATFORM_INCLUDE_DIRS /usr/local/include ) + + # the rest is RPATH handling + # here the defaults are set + # which are partly overwritten in kde4_handle_rpath_for_library() + # and kde4_handle_rpath_for_executable(), both located in KDE4Macros.cmake, Alex + if (APPLE) + set(CMAKE_INSTALL_NAME_DIR ${LIB_INSTALL_DIR}) + else (APPLE) + # add our LIB_INSTALL_DIR to the RPATH and use the RPATH figured out by cmake when compiling + set(CMAKE_INSTALL_RPATH ${LIB_INSTALL_DIR} ) + set(CMAKE_SKIP_BUILD_RPATH TRUE) + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + endif (APPLE) +endif (UNIX) + + +# UNIX, except OS X +if (UNIX AND NOT APPLE) + # Done by FindQt4.cmake already + #find_package(X11 REQUIRED) + # UNIX has already set _KDE4_PLATFORM_INCLUDE_DIRS, so append + set(_KDE4_PLATFORM_INCLUDE_DIRS ${_KDE4_PLATFORM_INCLUDE_DIRS} ${X11_INCLUDE_DIR} ) +endif (UNIX AND NOT APPLE) + + +# This will need to be modified later to support either Qt/X11 or Qt/Mac builds +if (APPLE) + + set ( _KDE4_PLATFORM_DEFINITIONS -D__APPLE_KDE__ ) + + # we need to set MACOSX_DEPLOYMENT_TARGET to (I believe) at least 10.2 or maybe 10.3 to allow + # -undefined dynamic_lookup; in the future we should do this programmatically + # hmm... why doesn't this work? + set (ENV{MACOSX_DEPLOYMENT_TARGET} 10.3) + + # "-undefined dynamic_lookup" means we don't care about missing symbols at link-time by default + # this is bad, but unavoidable until there is the equivalent of libtool -no-undefined implemented + # or perhaps it already is, and I just don't know where to look ;) + + set (CMAKE_SHARED_LINKER_FLAGS "-single_module -multiply_defined suppress ${CMAKE_SHARED_LINKER_FLAGS}") + set (CMAKE_MODULE_LINKER_FLAGS "-multiply_defined suppress ${CMAKE_MODULE_LINKER_FLAGS}") + #set(CMAKE_SHARED_LINKER_FLAGS "-single_module -undefined dynamic_lookup -multiply_defined suppress") + #set(CMAKE_MODULE_LINKER_FLAGS "-undefined dynamic_lookup -multiply_defined suppress") + + # we profile... + if(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + endif(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) + + # removed -Os, was there a special reason for using -Os instead of -O2 ?, Alex + # optimization flags are set below for the various build types + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-common") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common") +endif (APPLE) + + +if (CMAKE_SYSTEM_NAME MATCHES Linux) + if (CMAKE_COMPILER_IS_GNUCXX) + set ( _KDE4_PLATFORM_DEFINITIONS -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_GNU_SOURCE) + set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}") + set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}") + # we profile... + if(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + endif(CMAKE_BUILD_TYPE_TOLOWER MATCHES profile) + endif (CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_C_COMPILER MATCHES "icc") + set ( _KDE4_PLATFORM_DEFINITIONS -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_GNU_SOURCE) + set ( CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_SHARED_LINKER_FLAGS}") + set ( CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -Wl,--no-undefined -lc ${CMAKE_MODULE_LINKER_FLAGS}") + endif (CMAKE_C_COMPILER MATCHES "icc") +endif (CMAKE_SYSTEM_NAME MATCHES Linux) + +if (CMAKE_SYSTEM_NAME MATCHES BSD) + set ( _KDE4_PLATFORM_DEFINITIONS -D_GNU_SOURCE ) + set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lc") + set ( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -lc") +endif (CMAKE_SYSTEM_NAME MATCHES BSD) + +# compiler specific stuff, maybe this should be done differently, Alex + +if (MSVC) + set (KDE4_ENABLE_EXCEPTIONS -EHsc) +endif(MSVC) + +if (MINGW) + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-all-symbols") + set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--export-all-symbols") +endif (MINGW) + +if (CMAKE_COMPILER_IS_GNUCXX) + set (KDE4_ENABLE_EXCEPTIONS -fexceptions) + # Select flags. + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 -fno-inline") + set(CMAKE_CXX_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") + set(CMAKE_C_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") + set(CMAKE_C_FLAGS_DEBUGFULL "-g3 -fno-inline") + set(CMAKE_C_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + + if (CMAKE_SYSTEM_NAME MATCHES Linux) + set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-long-long -ansi -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common") + set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -fno-check-new -fno-common") + endif (CMAKE_SYSTEM_NAME MATCHES Linux) + + + check_cxx_compiler_flag(-fPIE HAVE_FPIE_SUPPORT) + if(KDE4_ENABLE_FPIE) + if(HAVE_FPIE_SUPPORT) + set (KDE4_CXX_FPIE_FLAGS "-fPIE") + set (KDE4_PIE_LDFLAGS "-pie") + else(HAVE_FPIE_SUPPORT) + MESSAGE(STATUS "Your compiler doesn't support PIE flag") + endif(HAVE_FPIE_SUPPORT) + endif(KDE4_ENABLE_FPIE) + # visibility support + check_cxx_compiler_flag(-fvisibility=hidden __KDE_HAVE_GCC_VISIBILITY) + + # get the gcc version + exec_program(${CMAKE_C_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info) + + string (REGEX MATCH "[345]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}") + # gcc on mac just reports: "gcc (GCC) 3.3 20030304 ..." without the patch level, handle this here: + if (NOT _gcc_version) + string (REGEX REPLACE ".*\\(GCC\\).* ([34]\\.[0-9]) .*" "\\1.0" _gcc_version "${_gcc_version_info}") + endif (NOT _gcc_version) + + macro_ensure_version("4.1.0" "${_gcc_version}" GCC_IS_NEWER_THAN_4_1) + + set(_GCC_COMPILED_WITH_BAD_ALLOCATOR FALSE) + if (GCC_IS_NEWER_THAN_4_1) + exec_program(${CMAKE_C_COMPILER} ARGS -v OUTPUT_VARIABLE _gcc_alloc_info) + string(REGEX MATCH "(--enable-libstdcxx-allocator=mt)" _GCC_COMPILED_WITH_BAD_ALLOCATOR "${_gcc_alloc_info}") + endif (GCC_IS_NEWER_THAN_4_1) + + if (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") + else (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) + set (__KDE_HAVE_GCC_VISIBILITY 0) + endif (__KDE_HAVE_GCC_VISIBILITY AND GCC_IS_NEWER_THAN_4_1 AND NOT _GCC_COMPILED_WITH_BAD_ALLOCATOR) + +endif (CMAKE_COMPILER_IS_GNUCXX) + +if (CMAKE_C_COMPILER MATCHES "icc") + set (KDE4_ENABLE_EXCEPTIONS -fexceptions) + # Select flags. + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + set(CMAKE_CXX_FLAGS_DEBUG "-O2 -g -0b0 -noalign") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g -Ob0 -noalign") + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") + set(CMAKE_C_FLAGS_DEBUG "-O2 -g -Ob0 -noalign") + set(CMAKE_C_FLAGS_DEBUGFULL "-g -Ob0 -noalign") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ansi -Wpointer-arith -fno-common") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ansi -Wpointer-arith -fno-exceptions -fno-common") + + # visibility support + set(__KDE_HAVE_ICC_VISIBILITY) +# check_cxx_compiler_flag(-fvisibility=hidden __KDE_HAVE_ICC_VISIBILITY) +# if (__KDE_HAVE_ICC_VISIBILITY) +# set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") +# endif (__KDE_HAVE_ICC_VISIBILITY) + +endif (CMAKE_C_COMPILER MATCHES "icc") + +# we prefer to use a different postfix for debug libs only on Windows +# does not work atm +if (WIN32) + SET(CMAKE_DEBUG_POSTFIX "") +endif (WIN32) + +########### end of platform specific stuff ########################## + + +# KDE4Macros.cmake contains all the KDE specific macros +#include(${kde_cmake_module_dir}/KDE4Macros.cmake) +include(KDE4Macros) + + +# decide whether KDE4 has been found +set(KDE4_FOUND FALSE) +if (KDE4_INCLUDE_DIR AND KDE4_LIB_DIR AND KDE4_KCFGC_EXECUTABLE AND KDE4_INSTALLED_VERSION_OK) + set(KDE4_FOUND TRUE) +endif (KDE4_INCLUDE_DIR AND KDE4_LIB_DIR AND KDE4_KCFGC_EXECUTABLE AND KDE4_INSTALLED_VERSION_OK) + + +macro (KDE4_PRINT_RESULTS) + + # inside kdelibs the include dir and lib dir are internal, not "found" + if(NOT EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + if(KDE4_INCLUDE_DIR) + message(STATUS "Found KDE4 include dir: ${KDE4_INCLUDE_DIR}") + else(KDE4_INCLUDE_DIR) + message(STATUS "Didn't find KDE4 headers") + endif(KDE4_INCLUDE_DIR) + + if(KDE4_LIB_DIR) + message(STATUS "Found KDE4 library dir: ${KDE4_LIB_DIR}") + else(KDE4_LIB_DIR) + message(STATUS "Didn't find KDE4 core library") + endif(KDE4_LIB_DIR) + endif(NOT EXISTS ${CMAKE_SOURCE_DIR}/kdecore/kernel/kglobal.h) + + if(KDE4_KCFGC_EXECUTABLE) + message(STATUS "Found KDE4 kconfig_compiler preprocessor: ${KDE4_KCFGC_EXECUTABLE}") + else(KDE4_KCFGC_EXECUTABLE) + message(STATUS "Didn't find the KDE4 kconfig_compiler preprocessor") + endif(KDE4_KCFGC_EXECUTABLE) +endmacro (KDE4_PRINT_RESULTS) + + +if (KDE4Internal_FIND_REQUIRED AND NOT KDE4_FOUND) + #bail out if something wasn't found + kde4_print_results() + if (NOT KDE4_INSTALLED_VERSION_OK) + message(FATAL_ERROR "ERROR: the installed kdelibs version ${KDEVERSION} is too old, at least version ${KDE_MIN_VERSION} is required") + else (NOT KDE4_INSTALLED_VERSION_OK) + message(FATAL_ERROR "ERROR: could NOT find everything required for compiling KDE 4 programs") + endif (NOT KDE4_INSTALLED_VERSION_OK) +endif (KDE4Internal_FIND_REQUIRED AND NOT KDE4_FOUND) + + +if (NOT KDE4Internal_FIND_QUIETLY) + kde4_print_results() +endif (NOT KDE4Internal_FIND_QUIETLY) + +#add the found Qt and KDE include directories to the current include path +#the ${KDE4_INCLUDE_DIR}/KDE directory is for forwarding includes, eg. #include <KMainWindow> +set(KDE4_INCLUDES ${QT_INCLUDES} ${KDE4_INCLUDE_DIR} ${KDE4_INCLUDE_DIR}/KDE ${_KDE4_PLATFORM_INCLUDE_DIRS} ) + +set(KDE4_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS} -DQT_NO_STL -DQT_NO_CAST_TO_ASCII -D_REENTRANT -DKDE_DEPRECATED_WARNINGS ) + +if (NOT _kde4_uninstall_rule_created) + set(_kde4_uninstall_rule_created TRUE) + + configure_file("${kde_cmake_module_dir}/kde4_cmake_uninstall.cmake.in" "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake" @ONLY) + + add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_BINARY_DIR}/cmake_uninstall.cmake") + +endif (NOT _kde4_uninstall_rule_created) diff --git a/cmakemodules/FindKDEWIN32.cmake b/cmakemodules/FindKDEWIN32.cmake new file mode 100644 index 0000000..afa8ee9 --- /dev/null +++ b/cmakemodules/FindKDEWIN32.cmake @@ -0,0 +1,89 @@ +# - Try to find the KDEWIN32 library +# Once done this will define +# +# KDEWIN32_FOUND - system has KDEWIN32 +# KDEWIN32_INCLUDES - the KDEWIN32 include directories +# KDEWIN32_LIBRARIES - The libraries needed to use KDEWIN32 +# +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +if (WIN32) + +file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _program_FILES_DIR) + +if(NOT QT4_FOUND) + find_package(Qt4 REQUIRED) +endif(NOT QT4_FOUND) + +find_path(KDEWIN32_INCLUDE_DIR winposix_export.h + ${_program_FILES_DIR}/kdewin32/include ${CMAKE_INSTALL_PREFIX}/include +) + + +# at first find the kdewin32 library, this has to be compiled and installed before kdelibs/ +# search for kdewin32 in the default install directory for applications (default of (n)make install) + +set(KDEWIN32_LIBRARY_PATH ${_program_FILES_DIR}/kdewin32/lib) +find_library(KDEWIN32_LIBRARY_RELEASE NAMES kdewin32 + PATHS + ${KDEWIN32_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib +) + +# msvc makes a difference between debug and release +if(MSVC) + find_library(KDEWIN32_LIBRARY_DEBUG NAMES kdewin32d + PATHS + ${_program_FILES_DIR}/kdewin32/lib ${CMAKE_INSTALL_PREFIX}/lib + ) + if(MSVC_IDE) + # the ide needs the debug and release version + if( NOT KDEWIN32_LIBRARY_DEBUG OR NOT KDEWIN32_LIBRARY_RELEASE) + message(FATAL_ERROR "\nCould NOT find the debug AND release version of the KDEWIN32 library.\nYou need to have both to use MSVC projects.\nPlease build and install both kdelibs/win/ libraries first.\n") + endif( NOT KDEWIN32_LIBRARY_DEBUG OR NOT KDEWIN32_LIBRARY_RELEASE) + SET(KDEWIN32_LIBRARY optimized ${KDEWIN32_LIBRARY_RELEASE} debug ${KDEWIN32_LIBRARY_DEBUG}) + else(MSVC_IDE) + string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER) + if(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) + set(KDEWIN32_LIBRARY ${KDEWIN32_LIBRARY_DEBUG}) + else(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) + set(KDEWIN32_LIBRARY ${KDEWIN32_LIBRARY_RELEASE}) + endif(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) + endif(MSVC_IDE) +else(MSVC) + set(KDEWIN32_LIBRARY ${KDEWIN32_LIBRARY_RELEASE}) +endif(MSVC) + +# kdelibs/win/ has to be built before the rest of kdelibs/ +# eventually it will be moved out from kdelibs/ +if (KDEWIN32_LIBRARY AND KDEWIN32_INCLUDE_DIR) + set(KDEWIN32_FOUND TRUE) + # add needed system libs + set(KDEWIN32_LIBRARIES ${KDEWIN32_LIBRARY} user32 shell32 ws2_32) + + if (MINGW) + #mingw compiler + set(KDEWIN32_INCLUDES ${KDEWIN32_INCLUDE_DIR} ${KDEWIN32_INCLUDE_DIR}/mingw ${QT_INCLUDES}) + else (MINGW) + # msvc compiler + # add the MS SDK include directory if available + file(TO_CMAKE_PATH "$ENV{MSSDK}" MSSDK_DIR) + set(KDEWIN32_INCLUDES ${KDEWIN32_INCLUDE_DIR} ${KDEWIN32_INCLUDE_DIR}/msvc ${QT_INCLUDES} ${MSSDK_DIR}) + endif (MINGW) + +endif (KDEWIN32_LIBRARY AND KDEWIN32_INCLUDE_DIR) + +if (KDEWIN32_FOUND) + if (NOT KDEWIN32_FIND_QUIETLY) + message(STATUS "Found KDEWIN32: ${KDEWIN32_LIBRARY}") + endif (NOT KDEWIN32_FIND_QUIETLY) +else (KDEWIN32_FOUND) + if (KDEWIN32_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find KDEWIN32 library\nPlease build and install kdelibs/win/ first") + endif (KDEWIN32_FIND_REQUIRED) +endif (KDEWIN32_FOUND) + +endif (WIN32) diff --git a/cmakemodules/FindKdeLibs.cmake b/cmakemodules/FindKdeLibs.cmake new file mode 100644 index 0000000..1259480 --- /dev/null +++ b/cmakemodules/FindKdeLibs.cmake @@ -0,0 +1,316 @@ +#INCLUDE(FindQt3) +#INCLUDE(FindQt) +#INCLUDE(FindKDE3) +INCLUDE(kdesvnMacros) +INCLUDE(KDE3Macros) + +FILE(GLOB GLOB_PATHS_INCLUDE /usr/lib*/qt-3*/include/) +FIND_PROGRAM(PKG_CONFIG NAMES pkg-config) +EXECUTE_PROCESS(COMMAND ${PKG_CONFIG} "--variable=prefix" "qt-mt" + OUTPUT_VARIABLE _qt_mt_path + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +SET(QT_MT_PATH ${_qt_mt_path} CACHE STRING "QT Path" FORCE) +FIND_PATH(QT_INCLUDE_DIR_PLUS qt.h + ${GLOB_PATHS_INCLUDE} + ${QT_MT_PATH}/include) +IF (NOT QT_INCLUDE_DIR) + SET(QT_INCLUDE_DIR ${QT_INCLUDE_DIR_PLUS}) +ENDIF (NOT QT_INCLUDE_DIR) + +FIND_PROGRAM(CMAKE_UNAME uname ${BIN_SEARCH_PATHES}) +IF(CMAKE_UNAME) + EXECUTE_PROCESS(COMMAND ${CMAKE_UNAME} "-m" + OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + IF("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "64") + SET(LIB_SUFFIX "64" CACHE STRING "Define suffix of directory name (32/64)" FORCE) + ELSE("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "64") + SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" FORCE) + ENDIF("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "64") +ENDIF(CMAKE_UNAME) + +SET(INCLUDE_SEARCH_PATHES + ${INCLUDE_SEARCH_PATHES} + ${KDE3_INCLUDE_DIRS}) + +SET(LIB_SEARCH_PATHES + ${LIB_SEARCH_PATHES} + ${KDE3_LIB_DIR}) + +IF (LIB_SUFFIX) + SET(LIB_SEARCH_PATHES + $ENV{KDEDIR}/lib${LIB_SUFFIX} + $ENV{HOME}/lib${LIB_SUFFIX} + $ENV{HOME}/usr/lib${LIB_SUFFIX} + /opt/lib${LIB_SUFFIX} + /opt/kde/lib${LIB_SUFFIX} + /opt/kde3/lib${LIB_SUFFIX} + /usr/lib${LIB_SUFFIX} + /usr/kde/3.5/lib${LIB_SUFFIX} + /usr/local/lib${LIB_SUFFIX} + ${LIB_SEARCH_PATHES} + ) +ENDIF (LIB_SUFFIX) + + + +FIND_LIBRARY(M_LIBRARY NAMES m + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_LIBRARY(KDE3_UI_LIBRARY NAMES kdeui + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_LIBRARY(KDE3_PART_LIBRARY NAMES kparts + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_LIBRARY(KDE3_KIO_LIBRARY NAMES kio + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_LIBRARY(KDE3_KHTML_LIBRARY NAMES khtml + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_LIBRARY(KDE3_DCOP_LIBRARY NAMES DCOP + PATHS + ${LIB_SEARCH_PATHES} +) + +FIND_PROGRAM(KDE3_KDECONFIG_EXECUTABLE NAME kde-config + PATHS ${BIN_SEARCH_PATHES}) + +FIND_PROGRAM(MSGFMT + NAMES gmsgfmt msgfmt + PATHS ${BIN_SEARCH_PATHES}) + + +FIND_PROGRAM(STRIP + NAMES strip + PATHS ${BIN_SEARCH_PATHES}) + +FIND_PROGRAM(KDE3_MEINPROC_EXECUTABLE NAME meinproc + PATHS ${BIN_SEARCH_PATHES}) + +IF(KDE3_MEINPROC_EXECUTABLE) + MESSAGE(STATUS "Found meinproc: ${KDE3_MEINPROC_EXECUTABLE}") +ELSE(KDE3_MEINPROC_EXECUTABLE) + MESSAGE(FATAL_ERROR "Could NOT find meinproc program!") +ENDIF(KDE3_MEINPROC_EXECUTABLE) + +IF(MSGFMT) + EXECUTE_PROCESS(COMMAND ${MSGFMT} "--version" + OUTPUT_VARIABLE _msgout + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + STRING(REGEX MATCH "GNU[\t ]gettext" _isgnu "${_msgout}") + IF (NOT _isgnu) + MESSAGE(STATUS "No gnu msgfmt found!") + SET(MSGFMT ":" CACHE STRING "Msgfmt program") + ELSE(NOT _isgnu) + MESSAGE(STATUS "Found gnu msgfmt: ${MSGFMT}") + ENDIF (NOT _isgnu) +ELSE(MSGFMT) + SET(MSGFMT ":" CACHE STRING "Msgfmt program") + MESSAGE( FATAL_ERROR "Could NOT find msgfmt program") +ENDIF(MSGFMT) + +EXECUTE_PROCESS(COMMAND ${KDE3_KDECONFIG_EXECUTABLE} "--prefix" + COMMAND xargs "echo" "-n" + OUTPUT_VARIABLE _kde_prefix_path + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +SET(KDE_HTML_COMMON_PATH ${_kde_prefix_path}/share/doc/HTML/en/common CACHE STRING "KDE HTML common Path" FORCE) + +# 'cause my own defines were not good I take them from kde4 trunk +#add some KDE specific stuff +SET(SHARE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}/share CACHE PATH "Base directory for files which go to share/" FORCE) +SET(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Base directory for executables and libraries" FORCE) +# +## the following are directories where stuff will be installed to +SET(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" CACHE PATH "The kde bin install dir (default prefix/bin)" FORCE) +SET(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" CACHE PATH "The kde sbin install dir (default prefix/sbin)" FORCE) +SET(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE) +SET(LIBEXEC_INSTALL_DIR "${LIB_INSTALL_DIR}/kde3/libexec" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib/kde3/libexec)" FORCE) +SET(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/kde3" CACHE PATH "The subdirectory relative to the install prefix where plugins will be installed (default is ${LIB_INSTALL_DIR}/kde3)" FORCE) +SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The subdirectory to the header prefix" FORCE) +SET(CONFIG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config" CACHE PATH "The config file install dir" FORCE) +SET(DATA_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/apps" CACHE PATH "The parent directory where applications can install their data" FORCE) +SET(HTML_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/doc/HTML" CACHE PATH "The HTML install dir for documentation" FORCE) +SET(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" CACHE PATH "The icon install dir (default prefix/share/icons/)" FORCE) +SET(KCFG_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/config.kcfg" CACHE PATH "The install dir for kconfig files" FORCE) +SET(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" CACHE PATH "The install dir for translations" FORCE) +SET(MIME_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/mimelnk" CACHE PATH "The install dir for the mimetype desktop files" FORCE) +SET(SERVICES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/services" CACHE PATH "The install dir for service (desktop, protocol, ...) files" FORCE) +SET(SERVICETYPES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/servicetypes" CACHE PATH "The install dir for servicestypes desktop files" FORCE) +SET(SOUND_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/sounds" CACHE PATH "The install dir for sound files" FORCE) +SET(TEMPLATES_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/templates" CACHE PATH "The install dir for templates (Create new file...)" FORCE) +SET(WALLPAPER_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/wallpapers" CACHE PATH "The install dir for wallpapers" FORCE) +SET(KCONF_UPDATE_INSTALL_DIR "${DATA_INSTALL_DIR}/kconf_update" CACHE PATH "The kconf_update install dir" FORCE) +# this one shouldn't be used anymore +SET(APPLNK_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/applnk" CACHE PATH "Is this still used ?" FORCE) +SET(AUTOSTART_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/autostart" CACHE PATH "The install dir for autostart files" FORCE) +SET(XDG_APPS_DIR "${SHARE_INSTALL_PREFIX}/applications/kde" CACHE PATH "The XDG apps dir" FORCE) +SET(XDG_DIRECTORY_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" CACHE PATH "The XDG directory" FORCE) +SET(SYSCONF_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/etc" CACHE PATH "The kde sysconfig install dir (default/etc)" FORCE) +SET(MAN_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/man" CACHE PATH "The kde man install dir (default prefix/share/man/)" FORCE) +SET(INFO_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/info" CACHE PATH "The kde info install dir (default prefix/info)" FORCE) + +# linker flags - must get checked +SET(LINK_NO_UNDEFINED "") +SET(lundef "-Wl,--no-undefined") +KDESVN_CHECK_LINK_FLAG(${lundef} _NO_UNDEFINED) +IF (_NO_UNDEFINED) + SET(LINK_NO_UNDEFINED "${lundef}") +ENDIF (_NO_UNDEFINED) + +SET(lundef "-Wl,--allow-shlib-undefined") +KDESVN_CHECK_LINK_FLAG(${lundef} _ALLOW_SHLIB) +IF (_ALLOW_SHLIB) + SET(LINK_NO_UNDEFINED "${LINK_NO_UNDEFINED} ${lundef}") +ENDIF (_ALLOW_SHLIB) + + +# own macros +MACRO(KDESVN_INSTALL_ICONS _theme) + + FILE(GLOB _icons *.png) + FILE(GLOB _svg *svgz) + SET(_icons ${_icons} ${_svg}) + FOREACH(_current_ICON ${_icons} ) + GET_FILENAME_COMPONENT(_ctype ${_current_ICON} EXT) + + IF (${_ctype} STREQUAL ".png") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _size "${_current_ICON}") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _name "${_current_ICON}") + SET(_sizestring "${_size}x${_size}") + ENDIF (${_ctype} STREQUAL ".png") + + IF (${_ctype} STREQUAL ".svgz") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _name "${_current_ICON}") + SET(_sizestring "scalable") + ENDIF (${_ctype} STREQUAL ".svgz") + + SET(_icon_GROUP "actions") + + IF(${_group} STREQUAL "mime") + SET(_icon_GROUP "mimetypes") + ENDIF(${_group} STREQUAL "mime") + + IF(${_group} STREQUAL "filesys") + SET(_icon_GROUP "filesystems") + ENDIF(${_group} STREQUAL "filesys") + + IF(${_group} STREQUAL "device") + SET(_icon_GROUP "devices") + ENDIF(${_group} STREQUAL "device") + + IF(${_group} STREQUAL "app") + SET(_icon_GROUP "apps") + ENDIF(${_group} STREQUAL "app") + + IF(${_group} STREQUAL "action") + SET(_icon_GROUP "actions") + ENDIF(${_group} STREQUAL "action") + + #message(STATUS "icon: ${_current_ICON} size: ${_sizestring} group: ${_group} name: ${_name}" ) + SET(_ICON_INSTALL_DIR ${ICON_INSTALL_DIR}/${_theme}/${_sizestring}/${_icon_GROUP}) + + INSTALL(FILES ${_current_ICON} DESTINATION ${_ICON_INSTALL_DIR} RENAME ${_name}) + + ENDFOREACH (_current_ICON) +ENDMACRO(KDESVN_INSTALL_ICONS) + +MACRO(ADD_POFILES packagename) + SET(_gmofiles) + FILE(GLOB _pofiles *.po) + + FOREACH(_current_po ${_pofiles}) + GET_FILENAME_COMPONENT(_name ${_current_po} NAME_WE) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)(\\.po)" "\\1" _lang "${_current_po}") + SET(_gmofile "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gmo") + ADD_CUSTOM_COMMAND(OUTPUT ${_gmofile} + COMMAND ${MSGFMT} + ARGS "-o" "${_gmofile}" "${_current_po}" + DEPENDS ${_current_po} + ) + SET(_gmofiles ${_gmofiles} ${_gmofile}) + INSTALL(FILES ${_gmofile} + DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES + RENAME ${packagename}.mo) + ENDFOREACH(_current_po ${_pofiles}) + + ADD_CUSTOM_TARGET(translations ALL + DEPENDS ${_gmofiles}) + +ENDMACRO(ADD_POFILES) + + +# KDE3_CREATE_HANDBOOK( docbookfile ) +# Create the handbook from the docbookfile (using meinproc) +MACRO (KDE3_CREATE_HANDBOOK _docbook ) + GET_FILENAME_COMPONENT(_tmp_src_FILE ${CMAKE_CURRENT_SOURCE_DIR} ABSOLUTE) + GET_FILENAME_COMPONENT(_tmp_bin_FILE ${CMAKE_CURRENT_BINARY_DIR} ABSOLUTE) + + IF(EXISTS ${_tmp_src_FILE}/${_docbook}) + get_filename_component(_input ${_tmp_src_FILE}/${_docbook} ABSOLUTE) + ENDIF(EXISTS ${_tmp_src_FILE}/${_docbook}) + IF(EXISTS ${_tmp_bin_FILE}/${_docbook}) + get_filename_component(_input ${_tmp_bin_FILE}/${_docbook} ABSOLUTE) + ENDIF(EXISTS ${_tmp_bin_FILE}/${_docbook}) + + SET(_doc ${CMAKE_CURRENT_BINARY_DIR}/index.cache.bz2) + ADD_CUSTOM_COMMAND(OUTPUT ${_doc} + COMMAND ${KDE3_MEINPROC_EXECUTABLE} --check --cache ${_doc} ${_input} + DEPENDS ${_input} ${KDE3_MEINPROC_EXECUTABLE} + ) + ADD_CUSTOM_TARGET(handbook ALL DEPENDS ${_doc}) +ENDMACRO (KDE3_CREATE_HANDBOOK) + + +# KDE3_INSTALL_HANDBOOK() +# Install the handbook documentation +MACRO (KDE3_INSTALL_HANDBOOK _appname ) + GET_FILENAME_COMPONENT(_tmp_src_FILE ${CMAKE_CURRENT_SOURCE_DIR} ABSOLUTE) + GET_FILENAME_COMPONENT(_tmp_bin_FILE ${CMAKE_CURRENT_BINARY_DIR} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_tmp_src_FILE} NAME_WE) + SET( dirname ${_basename}/${_appname}) + + FILE(GLOB _books_bin ${_tmp_bin_FILE}/*.docbook) + FILE(GLOB _images_bin ${_tmp_bin_FILE}/*.png) + FILE(GLOB _books_src ${_tmp_src_FILE}/*.docbook) + FILE(GLOB _images_src ${_tmp_src_FILE}/*.png) + + INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/index.cache.bz2 ${_books_src} ${_books_bin} ${_images_src} ${_images_bin} + DESTINATION ${HTML_INSTALL_DIR}/${dirname} ) + + INSTALL( CODE "EXECUTE_PROCESS ( COMMAND /bin/ln -s \"${KDE_HTML_COMMON_PATH}\" \"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\" ERROR_QUIET )" ) + INSTALL( CODE "MESSAGE(STATUS \"Installing $ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"IF(EXISTS \\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\\\")\\n\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"MESSAGE(STATUS \\\"Uninstalling \\\\\\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\\\\\\\"\\\")\\n\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"ENDIF(EXISTS \\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\\\")\\n\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"FILE(REMOVE \\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/common\\\")\\n\")" ) + + # Specific for KBFX code - remove for other installs + FILE(GLOB _docbook_PNGFILES ${CMAKE_SOURCE_DIR}/skin/raster/default/*.png) + FOREACH(_p ${_docbook_PNGFILES}) + GET_FILENAME_COMPONENT(_png_name ${_p} NAME) + INSTALL( CODE "EXECUTE_PROCESS ( COMMAND /bin/ln -s \"${DATA_INSTALL_DIR}/kbfx/skins/default/${_png_name}\" \"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}\" ERROR_QUIET )" ) + INSTALL( CODE "MESSAGE(STATUS \"Installing $ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/${_png_name}\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"MESSAGE(STATUS \\\"Uninstalling \\\\\\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/${_png_name}\\\\\\\"\\\")\\n\")" ) + INSTALL( CODE "FILE(APPEND ${CMAKE_BINARY_DIR}/uninstall_plus.cmake \"FILE(REMOVE \\\"$ENV{DESTDIR}${HTML_INSTALL_DIR}/${dirname}/${_png_name}\\\")\\n\")" ) + ENDFOREACH(_p) + # End of specific for KBFX code +ENDMACRO (KDE3_INSTALL_HANDBOOK ) + diff --git a/cmakemodules/FindQt4.cmake b/cmakemodules/FindQt4.cmake new file mode 100644 index 0000000..8f3be9c --- /dev/null +++ b/cmakemodules/FindQt4.cmake @@ -0,0 +1,1081 @@ +# - Find QT 4 +# This module can be used to find Qt4. +# The most important issue is that the Qt4 qmake is available via the system path. +# This qmake is then used to detect basically everything else. +# This module defines a number of key variables and macros. First is +# QT_USE_FILE which is the path to a CMake file that can be included to compile +# Qt 4 applications and libraries. By default, the QtCore and QtGui +# libraries are loaded. This behavior can be changed by setting one or more +# of the following variables to true: +# QT_DONT_USE_QTCORE +# QT_DONT_USE_QTGUI +# QT_USE_QT3SUPPORT +# QT_USE_QTASSISTANT +# QT_USE_QTDESIGNER +# QT_USE_QTMOTIF +# QT_USE_QTMAIN +# QT_USE_QTNETWORK +# QT_USE_QTNSPLUGIN +# QT_USE_QTOPENGL +# QT_USE_QTSQL +# QT_USE_QTXML +# QT_USE_QTSVG +# QT_USE_QTTEST +# QT_USE_QTUITOOLS +# QT_USE_QTDBUS +# +# All the libraries required are stored in a variable called QT_LIBRARIES. +# Add this variable to your TARGET_LINK_LIBRARIES. +# +# macro QT4_WRAP_CPP(outfiles inputfile ... ) +# macro QT4_WRAP_UI(outfiles inputfile ... ) +# macro QT4_ADD_RESOURCE(outfiles inputfile ... ) +# macro QT4_AUTOMOC(inputfile ... ) +# macro QT4_GENERATE_MOC(inputfile outputfile ) +# +# macro QT4_ADD_DBUS_INTERFACE(outfiles interface basename) +# create a the interface header and implementation files with the +# given basename from the given interface xml file and add it to +# the list of sources +# +# macro QT4_ADD_DBUS_INTERFACES(outfiles inputfile ... ) +# create the interface header and implementation files +# for all listed interface xml files +# the name will be automatically determined from the name of the xml file +# +# macro QT4_ADD_DBUS_ADAPTOR(outfiles xmlfile parentheader parentclassname [basename] ) +# create a dbus adaptor (header and implementation file) from the xml file +# describing the interface, and add it to the list of sources. The adaptor +# forwards the calls to a parent class, defined in parentheader and named +# parentclassname. The name of the generated files will be +# <basename>adaptor.{cpp,h} where basename is the basename of the xml file. +# +# macro QT4_GENERATE_DBUS_INTERFACE( header [interfacename] ) +# generate the xml interface file from the given header. +# If the optional argument interfacename is omitted, the name of the +# interface file is constructed from the basename of the header with +# the suffix .xml appended. +# +# QT_FOUND If false, don't try to use Qt. +# QT4_FOUND If false, don't try to use Qt 4. +# +# QT_QTCORE_FOUND True if QtCore was found. +# QT_QTGUI_FOUND True if QtGui was found. +# QT_QT3SUPPORT_FOUND True if Qt3Support was found. +# QT_QTASSISTANT_FOUND True if QtAssistant was found. +# QT_QTDBUS_FOUND True if QtDBus was found. +# QT_QTDESIGNER_FOUND True if QtDesigner was found. +# QT_QTDESIGNERCOMPONENTS True if QtDesignerComponents was found. +# QT_QTMOTIF_FOUND True if QtMotif was found. +# QT_QTNETWORK_FOUND True if QtNetwork was found. +# QT_QTNSPLUGIN_FOUND True if QtNsPlugin was found. +# QT_QTOPENGL_FOUND True if QtOpenGL was found. +# QT_QTSQL_FOUND True if QtSql was found. +# QT_QTXML_FOUND True if QtXml was found. +# QT_QTSVG_FOUND True if QtSvg was found. +# QT_QTTEST_FOUND True if QtTest was found. +# QT_QTUITOOLS_FOUND True if QtUiTools was found. +# +# QT_DEFINITIONS Definitions to use when compiling code that uses Qt. +# +# QT_INCLUDES List of paths to all include directories of +# Qt4 QT_INCLUDE_DIR and QT_QTCORE_INCLUDE_DIR are +# always in this variable even if NOTFOUND, +# all other INCLUDE_DIRS are +# only added if they are found. +# +# QT_INCLUDE_DIR Path to "include" of Qt4 +# QT_QT_INCLUDE_DIR Path to "include/Qt" +# QT_QT3SUPPORT_INCLUDE_DIR Path to "include/Qt3Support" +# QT_QTASSISTANT_INCLUDE_DIR Path to "include/QtAssistant" +# QT_QTCORE_INCLUDE_DIR Path to "include/QtCore" +# QT_QTDESIGNER_INCLUDE_DIR Path to "include/QtDesigner" +# QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR Path to "include/QtDesigner" +# QT_QTDBUS_INCLUDE_DIR Path to "include/QtDBus" +# QT_QTGUI_INCLUDE_DIR Path to "include/QtGui" +# QT_QTMOTIF_INCLUDE_DIR Path to "include/QtMotif" +# QT_QTNETWORK_INCLUDE_DIR Path to "include/QtNetwork" +# QT_QTNSPLUGIN_INCLUDE_DIR Path to "include/QtNsPlugin" +# QT_QTOPENGL_INCLUDE_DIR Path to "include/QtOpenGL" +# QT_QTSQL_INCLUDE_DIR Path to "include/QtSql" +# QT_QTXML_INCLUDE_DIR Path to "include/QtXml" +# QT_QTSVG_INCLUDE_DIR Path to "include/QtSvg" +# QT_QTTEST_INCLUDE_DIR Path to "include/QtTest" +# +# QT_LIBRARY_DIR Path to "lib" of Qt4 +# +# QT_PLUGINS_DIR Path to "plugins" for Qt4 +# +# For every library of Qt, a QT_QTFOO_LIBRARY variable is defined, with the full path to the library. +# +# So there are the following variables: +# The Qt3Support library: QT_QT3SUPPORT_LIBRARY +# +# The QtAssistant library: QT_QTASSISTANT_LIBRARY +# +# The QtCore library: QT_QTCORE_LIBRARY +# +# The QtDBus library: QT_QTDBUS_LIBRARY +# +# The QtDesigner library: QT_QTDESIGNER_LIBRARY +# +# The QtDesignerComponents library: QT_QTDESIGNERCOMPONENTS_LIBRARY +# +# The QtGui library: QT_QTGUI_LIBRARY +# +# The QtMotif library: QT_QTMOTIF_LIBRARY +# +# The QtNetwork library: QT_QTNETWORK_LIBRARY +# +# The QtNsPLugin library: QT_QTNSPLUGIN_LIBRARY +# +# The QtOpenGL library: QT_QTOPENGL_LIBRARY +# +# The QtSql library: QT_QTSQL_LIBRARY +# +# The QtXml library: QT_QTXML_LIBRARY +# +# The QtSvg library: QT_QTSVG_LIBRARY +# +# The QtTest library: QT_QTTEST_LIBRARY +# +# The qtmain library for Windows QT_QTMAIN_LIBRARY +# +# The QtUiTools library: QT_QTUITOOLS_LIBRARY +# +# also defined, but NOT for general use are +# QT_MOC_EXECUTABLE Where to find the moc tool. +# QT_UIC_EXECUTABLE Where to find the uic tool. +# QT_UIC3_EXECUTABLE Where to find the uic3 tool. +# QT_RCC_EXECUTABLE Where to find the rcc tool +# QT_DBUSCPP2XML_EXECUTABLE Where to find the qdbuscpp2xml tool. +# QT_DBUSXML2CPP_EXECUTABLE Where to find the qdbusxml2cpp tool. +# +# QT_DOC_DIR Path to "doc" of Qt4 +# QT_MKSPECS_DIR Path to "mkspecs" of Qt4 +# +# +# These are around for backwards compatibility +# they will be set +# QT_WRAP_CPP Set true if QT_MOC_EXECUTABLE is found +# QT_WRAP_UI Set true if QT_UIC_EXECUTABLE is found +# +# These variables do _NOT_ have any effect anymore (compared to FindQt.cmake) +# QT_MT_REQUIRED Qt4 is now always multithreaded +# +# These variables are set to "" Because Qt structure changed +# (They make no sense in Qt4) +# QT_QT_LIBRARY Qt-Library is now split + +# Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. +# See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + +INCLUDE(CheckSymbolExists) +INCLUDE(MacroAddFileDependencies) + +SET(QT_USE_FILE ${CMAKE_ROOT}/Modules/UseQt4.cmake) + +SET( QT_DEFINITIONS "") + +IF (WIN32) + SET(QT_DEFINITIONS -DQT_DLL) +ENDIF(WIN32) + +SET(QT4_INSTALLED_VERSION_TOO_OLD FALSE) + +# macro for asking qmake to process pro files +MACRO(QT_QUERY_QMAKE outvar invar) + FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake/tmp.pro + "message(CMAKE_MESSAGE<$$${invar}>)") + + EXECUTE_PROCESS(COMMAND ${QT_QMAKE_EXECUTABLE} + WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake + OUTPUT_VARIABLE _qmake_query_output + ERROR_VARIABLE _qmake_query_output ) + + FILE(REMOVE_RECURSE + "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmpQmake") + + STRING(REGEX REPLACE ".*CMAKE_MESSAGE<([^>]*).*" "\\1" ${outvar} "${_qmake_query_output}") +ENDMACRO(QT_QUERY_QMAKE) + +# check for qmake +FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake4 qmake-qt4 PATHS + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin" + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin" + $ENV{QTDIR}/bin +) + +IF (QT_QMAKE_EXECUTABLE) + + SET(QT4_QMAKE_FOUND FALSE) + + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION) + + # check for qt3 qmake and then try and find qmake4 or qmake-qt4 in the path + IF("${QTVERSION}" MATCHES "Unknown") + SET(QT_QMAKE_EXECUTABLE NOTFOUND CACHE FILEPATH "" FORCE) + FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 PATHS + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin" + "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin" + $ENV{QTDIR}/bin + ) + IF(QT_QMAKE_EXECUTABLE) + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION) + ENDIF(QT_QMAKE_EXECUTABLE) + ENDIF("${QTVERSION}" MATCHES "Unknown") + + # check that we found the Qt4 qmake, Qt3 qmake output won't match here + STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" qt_version_tmp "${QTVERSION}") + IF (qt_version_tmp) + + # we need at least version 4.0.0 + IF (NOT QT_MIN_VERSION) + SET(QT_MIN_VERSION "4.0.0") + ENDIF (NOT QT_MIN_VERSION) + + #now parse the parts of the user given version string into variables + STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" req_qt_major_vers "${QT_MIN_VERSION}") + IF (NOT req_qt_major_vers) + MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT_MIN_VERSION}\", expected e.g. \"4.0.1\"") + ENDIF (NOT req_qt_major_vers) + + # now parse the parts of the user given version string into variables + STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_qt_major_vers "${QT_MIN_VERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" req_qt_minor_vers "${QT_MIN_VERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_qt_patch_vers "${QT_MIN_VERSION}") + + IF (NOT req_qt_major_vers EQUAL 4) + MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT_MIN_VERSION}\", major version 4 is required, e.g. \"4.0.1\"") + ENDIF (NOT req_qt_major_vers EQUAL 4) + + # and now the version string given by qmake + STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_qt_major_vers "${QTVERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+.*" "\\1" found_qt_minor_vers "${QTVERSION}") + STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_qt_patch_vers "${QTVERSION}") + + # compute an overall version number which can be compared at once + MATH(EXPR req_vers "${req_qt_major_vers}*10000 + ${req_qt_minor_vers}*100 + ${req_qt_patch_vers}") + MATH(EXPR found_vers "${found_qt_major_vers}*10000 + ${found_qt_minor_vers}*100 + ${found_qt_patch_vers}") + + IF (found_vers LESS req_vers) + SET(QT4_QMAKE_FOUND FALSE) + SET(QT4_INSTALLED_VERSION_TOO_OLD TRUE) + ELSE (found_vers LESS req_vers) + SET(QT4_QMAKE_FOUND TRUE) + ENDIF (found_vers LESS req_vers) + ENDIF (qt_version_tmp) + +ENDIF (QT_QMAKE_EXECUTABLE) + +IF (QT4_QMAKE_FOUND) + + # ask qmake for the library dir + # Set QT_LIBRARY_DIR + IF (NOT QT_LIBRARY_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_LIBS" + OUTPUT_VARIABLE QT_LIBRARY_DIR_TMP ) + IF(EXISTS "${QT_LIBRARY_DIR_TMP}") + SET(QT_LIBRARY_DIR ${QT_LIBRARY_DIR_TMP} CACHE PATH "Qt library dir") + ELSE(EXISTS "${QT_LIBRARY_DIR_TMP}") + MESSAGE("Warning: QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as ${QT_LIBRARY_DIR_TMP}") + MESSAGE("Warning: ${QT_LIBRARY_DIR_TMP} does NOT exist, Qt must NOT be installed correctly.") + ENDIF(EXISTS "${QT_LIBRARY_DIR_TMP}") + ENDIF(NOT QT_LIBRARY_DIR) + + IF (APPLE) + IF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework) + SET(QT_USE_FRAMEWORKS ON + CACHE BOOL "Set to ON if Qt build uses frameworks.") + ELSE (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework) + SET(QT_USE_FRAMEWORKS OFF + CACHE BOOL "Set to ON if Qt build uses frameworks.") + ENDIF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework) + + MARK_AS_ADVANCED(QT_USE_FRAMEWORKS) + ENDIF (APPLE) + + # ask qmake for the binary dir + IF (NOT QT_BINARY_DIR) + EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_BINS" + OUTPUT_VARIABLE qt_bins ) + SET(QT_BINARY_DIR ${qt_bins} CACHE INTERNAL "") + ENDIF (NOT QT_BINARY_DIR) + + # ask qmake for the include dir + IF (NOT QT_HEADERS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_HEADERS" + OUTPUT_VARIABLE qt_headers ) + SET(QT_HEADERS_DIR ${qt_headers} CACHE INTERNAL "") + ENDIF(NOT QT_HEADERS_DIR) + + + # ask qmake for the documentation directory + IF (NOT QT_DOC_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_DOCS" + OUTPUT_VARIABLE qt_doc_dir ) + SET(QT_DOC_DIR ${qt_doc_dir} CACHE PATH "The location of the Qt docs") + ENDIF (NOT QT_DOC_DIR) + + # ask qmake for the mkspecs directory + IF (NOT QT_MKSPECS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QMAKE_MKSPECS" + OUTPUT_VARIABLE qt_mkspecs_dir ) + SET(QT_MKSPECS_DIR ${qt_mkspecs_dir} CACHE PATH "The location of the Qt mkspecs") + ENDIF (NOT QT_MKSPECS_DIR) + + # ask qmake for the plugins directory + IF (NOT QT_PLUGINS_DIR) + EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE} + ARGS "-query QT_INSTALL_PLUGINS" + OUTPUT_VARIABLE qt_plugins_dir ) + SET(QT_PLUGINS_DIR ${qt_plugins_dir} CACHE PATH "The location of the Qt plugins") + ENDIF (NOT QT_PLUGINS_DIR) + ######################################## + # + # Setting the INCLUDE-Variables + # + ######################################## + + FIND_PATH(QT_QTCORE_INCLUDE_DIR QtGlobal + ${QT_HEADERS_DIR}/QtCore + ${QT_LIBRARY_DIR}/QtCore.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_INCLUDE_DIR by removine "/QtCore" in the string ${QT_QTCORE_INCLUDE_DIR} + IF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR) + IF (QT_USE_FRAMEWORKS) + SET(QT_INCLUDE_DIR ${QT_HEADERS_DIR}) + ELSE (QT_USE_FRAMEWORKS) + STRING( REGEX REPLACE "/QtCore$" "" qt4_include_dir ${QT_QTCORE_INCLUDE_DIR}) + SET( QT_INCLUDE_DIR ${qt4_include_dir} CACHE PATH "") + ENDIF (QT_USE_FRAMEWORKS) + ENDIF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR) + + IF( NOT QT_INCLUDE_DIR) + IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + MESSAGE( FATAL_ERROR "Could NOT find QtGlobal header") + ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + ENDIF( NOT QT_INCLUDE_DIR) + + ############################################# + # + # Find out what window system we're using + # + ############################################# + # Save required includes variable + SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES}) + # Add QT_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES + SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};${QT_INCLUDE_DIR}") + # Check for Window system symbols (note: only one should end up being set) + CHECK_SYMBOL_EXISTS(Q_WS_X11 "QtCore/qglobal.h" Q_WS_X11) + CHECK_SYMBOL_EXISTS(Q_WS_MAC "QtCore/qglobal.h" Q_WS_MAC) + CHECK_SYMBOL_EXISTS(Q_WS_WIN "QtCore/qglobal.h" Q_WS_WIN) + + IF (QT_QTCOPY_REQUIRED) + CHECK_SYMBOL_EXISTS(QT_IS_QTCOPY "QtCore/qglobal.h" QT_KDE_QT_COPY) + IF (NOT QT_IS_QTCOPY) + MESSAGE(FATAL_ERROR "qt-copy is required, but hasn't been found") + ENDIF (NOT QT_IS_QTCOPY) + ENDIF (QT_QTCOPY_REQUIRED) + + # Restore CMAKE_REQUIRED_INCLUDES variable + SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE}) + # + ############################################# + + IF (QT_USE_FRAMEWORKS) + SET(QT_DEFINITIONS ${QT_DEFINITIONS} -F${QT_LIBRARY_DIR} -L${QT_LIBRARY_DIR} ) + ENDIF (QT_USE_FRAMEWORKS) + + # Set QT_QT3SUPPORT_INCLUDE_DIR + FIND_PATH(QT_QT3SUPPORT_INCLUDE_DIR Qt3Support + PATHS + ${QT_INCLUDE_DIR}/Qt3Support + ${QT_LIBRARY_DIR}/Qt3Support.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QT_INCLUDE_DIR + FIND_PATH(QT_QT_INCLUDE_DIR qglobal.h + PATHS + ${QT_INCLUDE_DIR}/Qt + ${QT_LIBRARY_DIR}/QtCore.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTGUI_INCLUDE_DIR + FIND_PATH(QT_QTGUI_INCLUDE_DIR QtGui + PATHS + ${QT_INCLUDE_DIR}/QtGui + ${QT_LIBRARY_DIR}/QtGui.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTSVG_INCLUDE_DIR + FIND_PATH(QT_QTSVG_INCLUDE_DIR QtSvg + PATHS + ${QT_INCLUDE_DIR}/QtSvg + ${QT_LIBRARY_DIR}/QtSvg.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTTEST_INCLUDE_DIR + FIND_PATH(QT_QTTEST_INCLUDE_DIR QtTest + PATHS + ${QT_INCLUDE_DIR}/QtTest + ${QT_LIBRARY_DIR}/QtTest.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTUITOOLS_INCLUDE_DIR + FIND_PATH(QT_QTUITOOLS_INCLUDE_DIR QtUiTools + PATHS + ${QT_INCLUDE_DIR}/QtUiTools + ${QT_LIBRARY_DIR}/QtUiTools.framework/Headers + NO_DEFAULT_PATH + ) + + + + # Set QT_QTMOTIF_INCLUDE_DIR + IF(Q_WS_X11) + FIND_PATH(QT_QTMOTIF_INCLUDE_DIR QtMotif PATHS ${QT_INCLUDE_DIR}/QtMotif NO_DEFAULT_PATH ) + ENDIF(Q_WS_X11) + + # Set QT_QTNETWORK_INCLUDE_DIR + FIND_PATH(QT_QTNETWORK_INCLUDE_DIR QtNetwork + PATHS + ${QT_INCLUDE_DIR}/QtNetwork + ${QT_LIBRARY_DIR}/QtNetwork.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTNSPLUGIN_INCLUDE_DIR + FIND_PATH(QT_QTNSPLUGIN_INCLUDE_DIR QtNsPlugin + PATHS + ${QT_INCLUDE_DIR}/QtNsPlugin + ${QT_LIBRARY_DIR}/QtNsPlugin.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTOPENGL_INCLUDE_DIR + FIND_PATH(QT_QTOPENGL_INCLUDE_DIR QtOpenGL + PATHS + ${QT_INCLUDE_DIR}/QtOpenGL + ${QT_LIBRARY_DIR}/QtOpenGL.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTSQL_INCLUDE_DIR + FIND_PATH(QT_QTSQL_INCLUDE_DIR QtSql + PATHS + ${QT_INCLUDE_DIR}/QtSql + ${QT_LIBRARY_DIR}/QtSql.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTXML_INCLUDE_DIR + FIND_PATH(QT_QTXML_INCLUDE_DIR QtXml + PATHS + ${QT_INCLUDE_DIR}/QtXml + ${QT_LIBRARY_DIR}/QtXml.framework/Headers + NO_DEFAULT_PATH + ) + + # Set QT_QTASSISTANT_INCLUDE_DIR + FIND_PATH(QT_QTASSISTANT_INCLUDE_DIR QtAssistant + PATHS + ${QT_INCLUDE_DIR}/QtAssistant + ${QT_HEADERS_DIR}/QtAssistant + NO_DEFAULT_PATH + ) + + # Set QT_QTDESIGNER_INCLUDE_DIR + FIND_PATH(QT_QTDESIGNER_INCLUDE_DIR QDesignerComponents + PATHS + ${QT_INCLUDE_DIR}/QtDesigner + ${QT_HEADERS_DIR}/QtDesigner + NO_DEFAULT_PATH + ) + + # Set QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR + FIND_PATH(QT_QTDESIGNERCOMPONENTS_INCLUDE_DIR QDesignerComponents + PATHS + ${QT_INCLUDE_DIR}/QtDesigner + ${QT_HEADERS_DIR}/QtDesigner + NO_DEFAULT_PATH + ) + + + # Set QT_QTDBUS_INCLUDE_DIR + FIND_PATH(QT_QTDBUS_INCLUDE_DIR QtDBus + PATHS + ${QT_INCLUDE_DIR}/QtDBus + ${QT_HEADERS_DIR}/QtDBus + NO_DEFAULT_PATH + ) + + # Make variables changeble to the advanced user + MARK_AS_ADVANCED( QT_LIBRARY_DIR QT_INCLUDE_DIR QT_QT_INCLUDE_DIR QT_DOC_DIR QT_MKSPECS_DIR QT_PLUGINS_DIR) + + # Set QT_INCLUDES + SET( QT_INCLUDES ${QT_INCLUDE_DIR} ${QT_QT_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ) + + + ######################################## + # + # Setting the LIBRARY-Variables + # + ######################################## + + IF (QT_USE_FRAMEWORKS) + # If FIND_LIBRARY found libraries in Apple frameworks, we would NOT have + # to jump through these hoops. + SET(QT_QTCORE_LIBRARY "-F${QT_LIBRARY_DIR} -framework QtCore" CACHE STRING "The QtCore library.") + SET(QT_QT3SUPPORT_LIBRARY "-framework Qt3Support" CACHE STRING "The Qt3Support library.") + SET(QT_QTGUI_LIBRARY "-framework QtGui" CACHE STRING "The QtGui library.") + SET(QT_QTNETWORK_LIBRARY "-framework QtNetwork" CACHE STRING "The QtNetwork library.") + SET(QT_QTOPENGL_LIBRARY "-framework QtOpenGL" CACHE STRING "The QtOpenGL library.") + SET(QT_QTSQL_LIBRARY "-framework QtSql" CACHE STRING "The QtSql library.") + SET(QT_QTXML_LIBRARY "-framework QtXml" CACHE STRING "The QtXml library.") + SET(QT_QTSVG_LIBRARY "-framework QtSvg" CACHE STRING "The QtSvg library.") + SET(QT_QTDBUS_LIBRARY "-framework QtDBus" CACHE STRING "The QtDBus library.") + SET(QT_QTTEST_LIBRARY "-framework QtTest" CACHE STRING "The QtTest library.") + + # WTF? why don't we have frameworks? :P + SET(QT_QTUITOOLS_LIBRARY "-L${QT_LIBRARY_DIR} -lQtUiTools" CACHE STRING "The QtUiTools library.") + + ELSE (QT_USE_FRAMEWORKS) + + # Set QT_QTCORE_LIBRARY by searching for a lib with "QtCore." as part of the filename + FIND_LIBRARY(QT_QTCORE_LIBRARY NAMES QtCore QtCore4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH ) + + # Set QT_QT3SUPPORT_LIBRARY + FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY NAMES Qt3Support Qt3Support4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTGUI_LIBRARY + FIND_LIBRARY(QT_QTGUI_LIBRARY NAMES QtGui QtGui4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTMOTIF_LIBRARY + IF(Q_WS_X11) + FIND_LIBRARY(QT_QTMOTIF_LIBRARY NAMES QtMotif PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(Q_WS_X11) + + # Set QT_QTNETWORK_LIBRARY + FIND_LIBRARY(QT_QTNETWORK_LIBRARY NAMES QtNetwork QtNetwork4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTNSPLUGIN_LIBRARY + FIND_LIBRARY(QT_QTNSPLUGIN_LIBRARY NAMES QtNsPlugin PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTOPENGL_LIBRARY + FIND_LIBRARY(QT_QTOPENGL_LIBRARY NAMES QtOpenGL QtOpenGL4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTSQL_LIBRARY + FIND_LIBRARY(QT_QTSQL_LIBRARY NAMES QtSql QtSql4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTXML_LIBRARY + FIND_LIBRARY(QT_QTXML_LIBRARY NAMES QtXml QtXml4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTSVG_LIBRARY + FIND_LIBRARY(QT_QTSVG_LIBRARY NAMES QtSvg QtSvg4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTUITOOLS_LIBRARY + FIND_LIBRARY(QT_QTUITOOLS_LIBRARY NAMES QtUiTools QtUiTools4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTTEST_LIBRARY + FIND_LIBRARY(QT_QTTEST_LIBRARY NAMES QtTest QtTest4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + FIND_LIBRARY(QT_QTDBUS_LIBRARY NAMES QtDBus QtDBus4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + IF(MSVC) + FIND_LIBRARY(QT_QTCORE_LIBRARY_DEBUG NAMES QtCored4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY_DEBUG NAMES Qt3Supportd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTGUI_LIBRARY_DEBUG NAMES QtGuid4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTNETWORK_LIBRARY_DEBUG NAMES QtNetworkd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTOPENGL_LIBRARY_DEBUG NAMES QtOpenGLd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTSQL_LIBRARY_DEBUG NAMES QtSqld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTXML_LIBRARY_DEBUG NAMES QtXmld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTSVG_LIBRARY_DEBUG NAMES QtSvgd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_DEBUG NAMES QtUiToolsd QtUiToolsd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTTEST_LIBRARY_DEBUG NAMES QtTestd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTDBUS_LIBRARY_DEBUG NAMES QtDBusd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTASSISTANT_LIBRARY_DEBUG NAMES QtAssistantClientd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(QT_QTMAIN_LIBRARY_DEBUG NAMES qtmaind PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(MSVC) + + ENDIF (QT_USE_FRAMEWORKS) + + IF( NOT QT_QTCORE_LIBRARY ) + IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + MESSAGE( FATAL_ERROR "Could NOT find QtCore. Check CMakeFiles/CMakeError.log for more details.") + ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED) + ENDIF( NOT QT_QTCORE_LIBRARY ) + + # Set QT_QTASSISTANT_LIBRARY + FIND_LIBRARY(QT_QTASSISTANT_LIBRARY NAMES QtAssistantClient QtAssistantClient4 QtAssistant QtAssistant4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTDESIGNER_LIBRARY + FIND_LIBRARY(QT_QTDESIGNER_LIBRARY NAMES QtDesigner QtDesigner4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTDESIGNERCOMPONENTS_LIBRARY + FIND_LIBRARY(QT_QTDESIGNERCOMPONENTS_LIBRARY NAMES QtDesignerComponents QtDesignerComponents4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + + # Set QT_QTMAIN_LIBRARY + IF(WIN32) + FIND_LIBRARY(QT_QTMAIN_LIBRARY NAMES qtmain PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH) + ENDIF(WIN32) + + ############################################ + # + # Check the existence of the libraries. + # + ############################################ + + MACRO (_QT4_ADJUST_LIB_VARS basename) + IF (QT_${basename}_LIBRARY OR QT_${basename}_LIBRARY_DEBUG) + + IF(MSVC) + + # Both set + IF (QT_${basename}_LIBRARY AND QT_${basename}_LIBRARY_DEBUG) + SET(QT_${basename}_LIBRARY optimized ${QT_${basename}_LIBRARY} debug ${QT_${basename}_LIBRARY_DEBUG}) + ENDIF (QT_${basename}_LIBRARY AND QT_${basename}_LIBRARY_DEBUG) + + # Only debug was found + IF (NOT QT_${basename}_LIBRARY AND QT_${basename}_LIBRARY_DEBUG) + SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY_DEBUG}) + ENDIF (NOT QT_${basename}_LIBRARY AND QT_${basename}_LIBRARY_DEBUG) + + # Hmm, is this used anywhere ? Yes, in UseQt4.cmake. We are currently incompatible :-( + SET(QT_${basename}_LIBRARIES optimized ${QT_${basename}_LIBRARY} debug ${QT_${basename}_LIBRARY_DEBUG}) + + ENDIF(MSVC) + + SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY} CACHE FILEPATH "The Qt ${basename} library") + + IF (QT_${basename}_LIBRARY) + SET(QT_${basename}_FOUND 1) + ENDIF (QT_${basename}_LIBRARY) + + ENDIF (QT_${basename}_LIBRARY OR QT_${basename}_LIBRARY_DEBUG) + + IF (QT_${basename}_INCLUDE_DIR) + #add the include directory to QT_INCLUDES + SET(QT_INCLUDES ${QT_INCLUDES} "${QT_${basename}_INCLUDE_DIR}") + ENDIF (QT_${basename}_INCLUDE_DIR) + + # Make variables changeble to the advanced user + MARK_AS_ADVANCED(QT_${basename}_LIBRARY QT_${basename}_INCLUDE_DIR) + ENDMACRO (_QT4_ADJUST_LIB_VARS) + + + # Set QT_xyz_LIBRARY variable and add + # library include path to QT_INCLUDES + _QT4_ADJUST_LIB_VARS(QTCORE) + _QT4_ADJUST_LIB_VARS(QTGUI) + _QT4_ADJUST_LIB_VARS(QT3SUPPORT) + _QT4_ADJUST_LIB_VARS(QTASSISTANT) + _QT4_ADJUST_LIB_VARS(QTDESIGNER) + _QT4_ADJUST_LIB_VARS(QTDESIGNERCOMPONENTS) + _QT4_ADJUST_LIB_VARS(QTNETWORK) + _QT4_ADJUST_LIB_VARS(QTNSPLUGIN) + _QT4_ADJUST_LIB_VARS(QTOPENGL) + _QT4_ADJUST_LIB_VARS(QTSQL) + _QT4_ADJUST_LIB_VARS(QTXML) + _QT4_ADJUST_LIB_VARS(QTSVG) + _QT4_ADJUST_LIB_VARS(QTUITOOLS) + _QT4_ADJUST_LIB_VARS(QTTEST) + _QT4_ADJUST_LIB_VARS(QTDBUS) + + + # platform dependent libraries + IF(Q_WS_X11) + _QT4_ADJUST_LIB_VARS(QTMOTIF) + ENDIF(Q_WS_X11) + IF(WIN32) + _QT4_ADJUST_LIB_VARS(QTMAIN) + ENDIF(WIN32) + + + ####################################### + # + # Check the executables of Qt + # ( moc, uic, rcc ) + # + ####################################### + + + # find moc and uic using qmake + QT_QUERY_QMAKE(QT_MOC_EXECUTABLE_INTERNAL "QMAKE_MOC") + QT_QUERY_QMAKE(QT_UIC_EXECUTABLE_INTERNAL "QMAKE_UIC") + + FILE(TO_CMAKE_PATH + "${QT_MOC_EXECUTABLE_INTERNAL}" QT_MOC_EXECUTABLE_INTERNAL) + FILE(TO_CMAKE_PATH + "${QT_UIC_EXECUTABLE_INTERNAL}" QT_UIC_EXECUTABLE_INTERNAL) + + SET(QT_MOC_EXECUTABLE + ${QT_MOC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The moc executable") + SET(QT_UIC_EXECUTABLE + ${QT_UIC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The uic executable") + + FIND_PROGRAM(QT_UIC3_EXECUTABLE + NAMES uic3 + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_RCC_EXECUTABLE + NAMES rcc + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_DBUSCPP2XML_EXECUTABLE + NAMES qdbuscpp2xml + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + FIND_PROGRAM(QT_DBUSXML2CPP_EXECUTABLE + NAMES qdbusxml2cpp + PATHS ${QT_BINARY_DIR} + NO_DEFAULT_PATH + ) + + IF (QT_MOC_EXECUTABLE) + SET(QT_WRAP_CPP "YES") + ENDIF (QT_MOC_EXECUTABLE) + + IF (QT_UIC_EXECUTABLE) + SET(QT_WRAP_UI "YES") + ENDIF (QT_UIC_EXECUTABLE) + + + + MARK_AS_ADVANCED( QT_UIC_EXECUTABLE QT_UIC3_EXECUTABLE QT_MOC_EXECUTABLE QT_RCC_EXECUTABLE QT_DBUSXML2CPP_EXECUTABLE QT_DBUSCPP2XML_EXECUTABLE) + + ###################################### + # + # Macros for building Qt files + # + ###################################### + + MACRO (QT4_GET_MOC_INC_DIRS _moc_INC_DIRS) + SET(${_moc_INC_DIRS}) + GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES) + + FOREACH(_current ${_inc_DIRS}) + SET(${_moc_INC_DIRS} ${${_moc_INC_DIRS}} "-I" ${_current}) + ENDFOREACH(_current ${_inc_DIRS}) + ENDMACRO(QT4_GET_MOC_INC_DIRS) + + + MACRO (QT4_GENERATE_MOC infile outfile ) + # get include dirs + QT4_GET_MOC_INC_DIRS(moc_includes) + + GET_FILENAME_COMPONENT(abs_infile ${infile} ABSOLUTE) + + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${moc_includes} -o ${outfile} ${abs_infile} + DEPENDS ${abs_infile}) + + SET_SOURCE_FILES_PROPERTIES(${outfile} PROPERTIES SKIP_AUTOMOC TRUE) # dont run automoc on this file + + MACRO_ADD_FILE_DEPENDENCIES(${abs_infile} ${outfile}) + ENDMACRO (QT4_GENERATE_MOC) + + + # QT4_WRAP_CPP(outfiles inputfile ... ) + # TODO perhaps add support for -D, -U and other minor options + + MACRO (QT4_WRAP_CPP outfiles ) + # get include dirs + QT4_GET_MOC_INC_DIRS(moc_includes) + + FOREACH (it ${ARGN}) + GET_FILENAME_COMPONENT(it ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/moc_${outfile}.cxx) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${moc_includes} -o ${outfile} ${it} + DEPENDS ${it}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH(it) + + ENDMACRO (QT4_WRAP_CPP) + + + # QT4_WRAP_UI(outfiles inputfile ... ) + + MACRO (QT4_WRAP_UI outfiles ) + + FOREACH (it ${ARGN}) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_UIC_EXECUTABLE} + ARGS -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) + + ENDMACRO (QT4_WRAP_UI) + + + # QT4_ADD_RESOURCE(outfiles inputfile ... ) + # TODO perhaps consider adding support for compression and root options to rcc + + MACRO (QT4_ADD_RESOURCES outfiles ) + + FOREACH (it ${ARGN}) + GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(rc_path ${infile} PATH) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx) + # parse file for dependencies + FILE(READ "${infile}" _RC_FILE_CONTENTS) + STRING(REGEX MATCHALL "<file>[^<]*" _RC_FILES "${_RC_FILE_CONTENTS}") + SET(_RC_DEPENDS) + FOREACH(_RC_FILE ${_RC_FILES}) + STRING(REGEX REPLACE "^<file>" "" _RC_FILE "${_RC_FILE}") + SET(_RC_DEPENDS ${_RC_DEPENDS} "${rc_path}/${_RC_FILE}") + ENDFOREACH(_RC_FILE) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_RCC_EXECUTABLE} + ARGS -name ${outfilename} -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile} + DEPENDS ${_RC_DEPENDS}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) + + ENDMACRO (QT4_ADD_RESOURCES) + + MACRO(QT4_ADD_DBUS_INTERFACE _sources _interface _basename) + GET_FILENAME_COMPONENT(_infile ${_interface} ABSOLUTE) + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + SET(_impl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -p ${_basename} ${_infile} + DEPENDS ${_infile}) + + SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + + QT4_GENERATE_MOC(${_header} ${_moc}) + + SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc}) + MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc}) + + ENDMACRO(QT4_ADD_DBUS_INTERFACE) + + + MACRO(QT4_ADD_DBUS_INTERFACES _sources) + FOREACH (_current_FILE ${ARGN}) + GET_FILENAME_COMPONENT(_infile ${_current_FILE} ABSOLUTE) + + # get the part before the ".xml" suffix + STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2" _basename ${_current_FILE}) + STRING(TOLOWER ${_basename} _basename) + + QT4_ADD_DBUS_INTERFACE(${_sources} ${_infile} ${_basename}interface) + ENDFOREACH (_current_FILE) + ENDMACRO(QT4_ADD_DBUS_INTERFACES) + + + MACRO(QT4_GENERATE_DBUS_INTERFACE _header) # _customName ) + SET(_customName "${ARGV1}") + GET_FILENAME_COMPONENT(_in_file ${_header} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_header} NAME_WE) + + IF (_customName) + SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_customName}) + ELSE (_customName) + SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml) + ENDIF (_customName) + + ADD_CUSTOM_COMMAND(OUTPUT ${_target} + COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_in_file} > ${_target} + DEPENDS ${_in_file} + ) + ENDMACRO(QT4_GENERATE_DBUS_INTERFACE) + + + MACRO(QT4_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass) # _optionalBasename ) + GET_FILENAME_COMPONENT(_infile ${_xml_file} ABSOLUTE) + + SET(_optionalBasename "${ARGV4}") + IF (_optionalBasename) + SET(_basename ${_optionalBasename} ) + ELSE (_optionalBasename) + STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile}) + STRING(TOLOWER ${_basename} _basename) + ENDIF (_optionalBasename) + + SET(_optionalClassName "${ARGV5}") + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + SET(_impl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + IF(_optionalClassName) + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} + ) + ELSE(_optionalClassName) + ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header} + COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile} + DEPENDS ${_infile} + ) + ENDIF(_optionalClassName) + + QT4_GENERATE_MOC(${_header} ${_moc}) + SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE) + MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc}) + + SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc}) + ENDMACRO(QT4_ADD_DBUS_ADAPTOR) + + MACRO(QT4_AUTOMOC) + QT4_GET_MOC_INC_DIRS(_moc_INCS) + + SET(_matching_FILES ) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE) + # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. + # here. this is required to make bouic work correctly: + # we need to add generated .cpp files to the sources (to compile them), + # but we cannot let automoc handle them, as the .cpp files don't exist yet when + # cmake is run for the very first time on them -> however the .cpp files might + # exist at a later run. at that time we need to skip them, so that we don't add two + # different rules for the same moc file + GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC) + + IF ( NOT _skip AND EXISTS ${_abs_FILE} ) + + FILE(READ ${_abs_FILE} _contents) + + GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH) + + STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") + IF(_match) + FOREACH (_current_MOC_INC ${_match}) + STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") + + GET_filename_component(_basename ${_current_MOC} NAME_WE) + # SET(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h) + SET(_header ${_abs_PATH}/${_basename}.h) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) + ADD_CUSTOM_COMMAND(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_moc_INCS} ${_header} -o ${_moc} + DEPENDS ${_header} + ) + + MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc}) + ENDFOREACH (_current_MOC_INC) + ENDIF(_match) + ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} ) + ENDFOREACH (_current_FILE) + ENDMACRO(QT4_AUTOMOC) + + + + ###################################### + # + # decide if Qt got found + # + ###################################### + + # if the includes,libraries,moc,uic and rcc are found then we have it + IF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET( QT4_FOUND "YES" ) + IF( NOT Qt4_FIND_QUIETLY) + MESSAGE(STATUS "Found Qt-Version ${QTVERSION}") + ENDIF( NOT Qt4_FIND_QUIETLY) + ELSE( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET( QT4_FOUND "NO") + SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE) + IF( Qt4_FIND_REQUIRED) + IF ( NOT QT_LIBRARY_DIR ) + MESSAGE(STATUS "Qt libraries NOT found!") + ENDIF(NOT QT_LIBRARY_DIR ) + IF ( NOT QT_INCLUDE_DIR ) + MESSAGE(STATUS "Qt includes NOT found!") + ENDIF( NOT QT_INCLUDE_DIR ) + IF ( NOT QT_MOC_EXECUTABLE ) + MESSAGE(STATUS "Qt's moc NOT found!") + ENDIF( NOT QT_MOC_EXECUTABLE ) + IF ( NOT QT_UIC_EXECUTABLE ) + MESSAGE(STATUS "Qt's uic NOT found!") + ENDIF( NOT QT_UIC_EXECUTABLE ) + IF ( NOT QT_RCC_EXECUTABLE ) + MESSAGE(STATUS "Qt's rcc NOT found!") + ENDIF( NOT QT_RCC_EXECUTABLE ) + MESSAGE( FATAL_ERROR "Qt libraries, includes, moc, uic or/and rcc NOT found!") + ENDIF( Qt4_FIND_REQUIRED) + ENDIF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE) + SET(QT_FOUND ${QT4_FOUND}) + + + ####################################### + # + # System dependent settings + # + ####################################### + # for unix add X11 stuff + IF(UNIX) + # on OS X X11 may not be required + IF (Q_WS_X11) + FIND_PACKAGE(X11) + ENDIF (Q_WS_X11) + FIND_PACKAGE(Threads) + SET(QT_QTCORE_LIBRARY ${QT_QTCORE_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) + ENDIF(UNIX) + + + ####################################### + # + # compatibility settings + # + ####################################### + # Backwards compatibility for CMake1.4 and 1.2 + SET (QT_MOC_EXE ${QT_MOC_EXECUTABLE} ) + SET (QT_UIC_EXE ${QT_UIC_EXECUTABLE} ) + + SET( QT_QT_LIBRARY "") + +ELSE(QT4_QMAKE_FOUND) + + SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE) + IF(Qt4_FIND_REQUIRED) + IF(QT4_INSTALLED_VERSION_TOO_OLD) + MESSAGE(FATAL_ERROR "The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required") + ELSE(QT4_INSTALLED_VERSION_TOO_OLD) + MESSAGE( FATAL_ERROR "Qt qmake not found!") + ENDIF(QT4_INSTALLED_VERSION_TOO_OLD) + ELSE(Qt4_FIND_REQUIRED) + IF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY) + MESSAGE(STATUS "The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required") + ENDIF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY) + ENDIF(Qt4_FIND_REQUIRED) + +ENDIF (QT4_QMAKE_FOUND) + diff --git a/cmakemodules/FindStrigi.cmake b/cmakemodules/FindStrigi.cmake new file mode 100644 index 0000000..072ad84 --- /dev/null +++ b/cmakemodules/FindStrigi.cmake @@ -0,0 +1,47 @@ +# - Try to find Strigi +# Once done this will define +# +# STRIGI_FOUND - system has Strigi +# STRIGI_INCLUDE_DIR - the Strigi include directory +# STRIGIHTMLGUI_LIBRARY - Link these to use Strigi html gui +# STRIGICLIENT_LIBRARY - Link to use the Strigi C++ client +# + +FIND_PATH(STRIGI_INCLUDE_DIR strigihtmlgui.h + PATHS + $ENV{HOME}/include/strigi + $ENV{HOME}/usr/include/strigi + $ENV{KDEDIR}/include/strigi + /opt/kde/include/strigi + /opt/kde3/include/strigi + /opt/kde4/include/strigi + /usr/kde/3.5/include/strigi + /usr/include/strigi + /usr/local/include/strigi + /opt/include/strigi + ${INCLUDE_SEARCH_PATHES} +) + +FIND_LIBRARY(STRIGIHTMLGUI_LIBRARY NAMES strigihtmlgui + PATHS + ${LIB_SEARCH_PATHES} +) +FIND_LIBRARY(STRIGICLIENT_LIBRARY NAMES searchclient + PATHS + ${LIB_SEARCH_PATHES} +) + +IF(STRIGI_INCLUDE_DIR AND STRIGIHTMLGUI_LIBRARY AND STRIGICLIENT_LIBRARY) + SET(STRIGI_FOUND TRUE) +ENDIF(STRIGI_INCLUDE_DIR AND STRIGIHTMLGUI_LIBRARY AND STRIGICLIENT_LIBRARY) + +IF(STRIGI_FOUND) + IF(NOT Strigi_FIND_QUIETLY) + MESSAGE(STATUS "Found Strigi: ${STRIGIHTMLGUI_LIBRARY}") + ENDIF(NOT Strigi_FIND_QUIETLY) +ELSE(STRIGI_FOUND) + IF(Strigi_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Strigi! Please download and install Strigi from http://strigi.sf.net") + ENDIF(Strigi_FIND_REQUIRED) +ENDIF(STRIGI_FOUND) + diff --git a/cmakemodules/FindX11.cmake b/cmakemodules/FindX11.cmake new file mode 100644 index 0000000..1fd45e1 --- /dev/null +++ b/cmakemodules/FindX11.cmake @@ -0,0 +1,352 @@ +# - Find X11 installation +# Try to find X11 on UNIX systems. The following values are defined +# X11_FOUND - True if X11 is available +# X11_INCLUDE_DIR - include directories to use X11 +# X11_LIBRARIES - link against these to use X11 + +# Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. +# See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + +if (UNIX) + set(X11_FOUND 0) + + set(X11_INC_SEARCH_PATH + /usr/X11R6/include + /usr/local/include + /usr/include/X11 + /usr/openwin/include + /usr/openwin/share/include + /opt/graphics/OpenGL/include + /usr/include + ) + + set(X11_LIB_SEARCH_PATH + /usr/X11R6/lib + /usr/local/lib + /usr/openwin/lib + /usr/lib + ) + + FIND_PATH(X11_X11_INCLUDE_PATH X11/X.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xlib_INCLUDE_PATH X11/Xlib.h ${X11_INC_SEARCH_PATH}) + + # Look for includes; keep the list sorted by name of the cmake *_INCLUDE_PATH + # variable (which doesn't need to match the include file name). + + # Solaris lacks XKBrules.h, so we should skip kxkbd there. + FIND_PATH(X11_Xaccessrules_INCLUDE_PATH X11/extensions/XKBrules.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xaccessstr_INCLUDE_PATH X11/extensions/XKBstr.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xcomposite_INCLUDE_PATH X11/extensions/Xcomposite.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xcursor_INCLUDE_PATH X11/Xcursor/Xcursor.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xdamage_INCLUDE_PATH X11/extensions/Xdamage.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xdmcp_INCLUDE_PATH X11/Xdmcp.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_dpms_INCLUDE_PATH X11/extensions/dpms.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xf86misc_INCLUDE_PATH X11/extensions/xf86misc.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_xf86vmode_INCLUDE_PATH X11/extensions/xf86vmode.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xfixes_INCLUDE_PATH X11/extensions/Xfixes.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xft_INCLUDE_PATH X11/Xft/Xft.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xinerama_INCLUDE_PATH X11/extensions/Xinerama.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xinput_INCLUDE_PATH X11/extensions/XInput.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xkb_INCLUDE_PATH X11/extensions/XKB.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xkblib_INCLUDE_PATH X11/XKBlib.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xpm_INCLUDE_PATH X11/xpm.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_XTest_INCLUDE_PATH X11/extensions/XTest.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xrandr_INCLUDE_PATH X11/extensions/Xrandr.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xrender_INCLUDE_PATH X11/extensions/Xrender.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xscreensaver_INCLUDE_PATH X11/extensions/scrnsaver.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xshape_INCLUDE_PATH X11/extensions/shape.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xutil_INCLUDE_PATH X11/Xutil.h ${X11_INC_SEARCH_PATH}) + FIND_PATH(X11_Xv_INCLUDE_PATH X11/extensions/Xvlib.h ${X11_INC_SEARCH_PATH}) + + + FIND_LIBRARY(X11_X11_LIB X11 ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + + # Find additional X libraries. Keep list sorted by library name. + FIND_LIBRARY(X11_Xau_LIB Xau ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xcomposite_LIB Xcomposite ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xcursor_LIB Xcursor ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xdamage_LIB Xdamage ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xdmcp_LIB Xdmcp ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xext_LIB Xext ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xfixes_LIB Xfixes ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xft_LIB Xft ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xinerama_LIB Xinerama ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xinput_LIB Xi ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xpm_LIB Xpm ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xrandr_LIB Xrandr ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xrender_LIB Xrender ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xss_LIB Xss ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xt_LIB Xt ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xv_LIB Xv ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + FIND_LIBRARY(X11_Xxf86misc_LIB Xxf86misc ${X11_LIB_SEARCH_PATH} NO_SYSTEM_PATH) + + if (X11_X11_INCLUDE_PATH) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_X11_INCLUDE_PATH}) + endif (X11_X11_INCLUDE_PATH) + + if (X11_Xlib_INCLUDE_PATH) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xlib_INCLUDE_PATH}) + endif (X11_Xlib_INCLUDE_PATH) + + if (X11_Xutil_INCLUDE_PATH) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xutil_INCLUDE_PATH}) + endif (X11_Xutil_INCLUDE_PATH) + + if(X11_Xshape_INCLUDE_PATH) + set(X11_Xshape_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xshape_INCLUDE_PATH}) + endif(X11_Xshape_INCLUDE_PATH) + + if (X11_X11_LIB) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_X11_LIB}) + endif (X11_X11_LIB) + + if (X11_Xext_LIB) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xext_LIB}) + endif (X11_Xext_LIB) + + if(X11_Xft_LIB AND X11_Xft_INCLUDE_PATH) + set(X11_XFT_FOUND TRUE) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xft_LIB}) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xft_INCLUDE_PATH}) + endif(X11_Xft_LIB AND X11_Xft_INCLUDE_PATH) + + if(X11_Xv_LIB AND X11_Xv_INCLUDE_PATH) + set(X11_XV_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xv_INCLUDE_PATH}) + endif(X11_Xv_LIB AND X11_Xv_INCLUDE_PATH) + + if (X11_Xau_LIB) + set(X11_Xau_FOUND TRUE) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xau_LIB}) + endif (X11_Xau_LIB) + + if (X11_Xdmcp_INCLUDE_PATH AND X11_Xdmcp_LIB) + set(X11_Xdmcp_FOUND TRUE) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xdmcp_LIB}) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xdmcp_INCLUDE_PATH}) + endif (X11_Xdmcp_INCLUDE_PATH AND X11_Xdmcp_LIB) + + if (X11_Xaccessrules_INCLUDE_PATH AND X11_Xaccessstr_INCLUDE_PATH) + set(X11_Xaccess_FOUND TRUE) + set(X11_Xaccess_INCLUDE_PATH ${X11_Xaccessstr_INCLUDE_PATH}) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xaccess_INCLUDE_PATH}) + endif (X11_Xaccessrules_INCLUDE_PATH AND X11_Xaccessstr_INCLUDE_PATH) + + if (X11_Xpm_INCLUDE_PATH AND X11_Xpm_LIB) + set(X11_Xpm_FOUND TRUE) + set(X11_LIBRARIES ${X11_LIBRARIES} ${X11_Xpm_LIB}) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xpm_INCLUDE_PATH}) + endif (X11_Xpm_INCLUDE_PATH AND X11_Xpm_LIB) + + + if (X11_Xcomposite_INCLUDE_PATH) + set(X11_Xcomposite_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xcomposite_INCLUDE_PATH}) + endif (X11_Xcomposite_INCLUDE_PATH) + + if (X11_Xdamage_INCLUDE_PATH) + set(X11_Xdamage_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xdamage_INCLUDE_PATH}) + endif (X11_Xdamage_INCLUDE_PATH) + + if (X11_XTest_INCLUDE_PATH AND X11_XTest_LIB) + set(X11_XTest_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_XTest_INCLUDE_PATH}) + endif (X11_XTest_INCLUDE_PATH AND X11_XTest_LIB) + + if (X11_Xinerama_INCLUDE_PATH) + set(X11_Xinerama_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xinerama_INCLUDE_PATH}) + endif (X11_Xinerama_INCLUDE_PATH) + + if (X11_Xfixes_INCLUDE_PATH) + set(X11_Xfixes_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xfixes_INCLUDE_PATH}) + endif (X11_Xfixes_INCLUDE_PATH) + + if (X11_Xrender_INCLUDE_PATH AND X11_Xrender_LIB) + set(X11_Xrender_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xrender_INCLUDE_PATH}) + endif (X11_Xrender_INCLUDE_PATH AND X11_Xrender_LIB) + + if (X11_Xrandr_INCLUDE_PATH) + set(X11_Xrandr_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH}) + endif (X11_Xrandr_INCLUDE_PATH) + + if (X11_Xxf86misc_INCLUDE_PATH) + set(X11_Xxf86misc_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xxf86misc_INCLUDE_PATH}) + endif (X11_Xxf86misc_INCLUDE_PATH) + + if (X11_xf86vmode_INCLUDE_PATH) + set(X11_xf86vmode_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_xf86vmode_INCLUDE_PATH}) + endif (X11_xf86vmode_INCLUDE_PATH) + + if (X11_Xcursor_INCLUDE_PATH AND X11_Xcursor_LIB) + set(X11_Xcursor_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xcursor_INCLUDE_PATH}) + endif (X11_Xcursor_INCLUDE_PATH AND X11_Xcursor_LIB) + + if (X11_Xscreensaver_INCLUDE_PATH) + set(X11_Xscreensaver_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xscreensaver_INCLUDE_PATH}) + endif (X11_Xscreensaver_INCLUDE_PATH) + + if (X11_dpms_INCLUDE_PATH) + set(X11_dpms_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_dpms_INCLUDE_PATH}) + endif (X11_dpms_INCLUDE_PATH) + + if (X11_Xkb_INCLUDE_PATH AND X11_Xkblib_INCLUDE_PATH AND X11_Xlib_INCLUDE_PATH) + set(X11_Xkb_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xkb_INCLUDE_PATH} ) + endif (X11_Xkb_INCLUDE_PATH AND X11_Xkblib_INCLUDE_PATH AND X11_Xlib_INCLUDE_PATH) + + if (X11_Xinput_INCLUDE_PATH AND X11_Xinput_LIB) + set(X11_Xinput_FOUND TRUE) + set(X11_INCLUDE_DIR ${X11_INCLUDE_DIR} ${X11_Xinput_INCLUDE_PATH}) + endif (X11_Xinput_INCLUDE_PATH AND X11_Xinput_LIB) + + # Deprecated variable for backwards compatibility with CMake 1.4 + if (X11_X11_INCLUDE_PATH) + if (X11_LIBRARIES) + set(X11_FOUND 1) + endif (X11_LIBRARIES) + endif (X11_X11_INCLUDE_PATH) + + set(X11_LIBRARY_DIR "") + if (X11_X11_LIB) + GET_FILENAME_COMPONENT(X11_LIBRARY_DIR ${X11_X11_LIB} PATH) + endif (X11_X11_LIB) + + if (X11_FOUND) + INCLUDE(CheckFunctionExists) + INCLUDE(CheckLibraryExists) + + # Translated from an autoconf-generated configure script. + # See libs.m4 in autoconf's m4 directory. + if ($ENV{ISC} MATCHES "^yes$") + set(X11_X_EXTRA_LIBS -lnsl_s -linet) + else ($ENV{ISC} MATCHES "^yes$") + set(X11_X_EXTRA_LIBS "") + + # See if XOpenDisplay in X11 works by itself. + CHECK_LIBRARY_EXISTS("${X11_LIBRARIES}" "XOpenDisplay" "${X11_LIBRARY_DIR}" X11_LIB_X11_SOLO) + if (NOT X11_LIB_X11_SOLO) + # Find library needed for dnet_ntoa. + CHECK_LIBRARY_EXISTS("dnet" "dnet_ntoa" "" X11_LIB_DNET_HAS_DNET_NTOA) + if (X11_LIB_DNET_HAS_DNET_NTOA) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -ldnet) + else (X11_LIB_DNET_HAS_DNET_NTOA) + CHECK_LIBRARY_EXISTS("dnet_stub" "dnet_ntoa" "" X11_LIB_DNET_STUB_HAS_DNET_NTOA) + if (X11_LIB_DNET_STUB_HAS_DNET_NTOA) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -ldnet_stub) + endif (X11_LIB_DNET_STUB_HAS_DNET_NTOA) + endif (X11_LIB_DNET_HAS_DNET_NTOA) + endif (NOT X11_LIB_X11_SOLO) + + # Find library needed for gethostbyname. + CHECK_FUNCTION_EXISTS("gethostbyname" CMAKE_HAVE_GETHOSTBYNAME) + if (NOT CMAKE_HAVE_GETHOSTBYNAME) + CHECK_LIBRARY_EXISTS("nsl" "gethostbyname" "" CMAKE_LIB_NSL_HAS_GETHOSTBYNAME) + if (CMAKE_LIB_NSL_HAS_GETHOSTBYNAME) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lnsl) + else (CMAKE_LIB_NSL_HAS_GETHOSTBYNAME) + CHECK_LIBRARY_EXISTS("bsd" "gethostbyname" "" CMAKE_LIB_BSD_HAS_GETHOSTBYNAME) + if (CMAKE_LIB_BSD_HAS_GETHOSTBYNAME) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lbsd) + endif (CMAKE_LIB_BSD_HAS_GETHOSTBYNAME) + endif (CMAKE_LIB_NSL_HAS_GETHOSTBYNAME) + endif (NOT CMAKE_HAVE_GETHOSTBYNAME) + + # Find library needed for connect. + CHECK_FUNCTION_EXISTS("connect" CMAKE_HAVE_CONNECT) + if (NOT CMAKE_HAVE_CONNECT) + CHECK_LIBRARY_EXISTS("socket" "connect" "" CMAKE_LIB_SOCKET_HAS_CONNECT) + if (CMAKE_LIB_SOCKET_HAS_CONNECT) + set(X11_X_EXTRA_LIBS -lsocket ${X11_X_EXTRA_LIBS}) + endif (CMAKE_LIB_SOCKET_HAS_CONNECT) + endif (NOT CMAKE_HAVE_CONNECT) + + # Find library needed for remove. + CHECK_FUNCTION_EXISTS("remove" CMAKE_HAVE_REMOVE) + if (NOT CMAKE_HAVE_REMOVE) + CHECK_LIBRARY_EXISTS("posix" "remove" "" CMAKE_LIB_POSIX_HAS_REMOVE) + if (CMAKE_LIB_POSIX_HAS_REMOVE) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lposix) + endif (CMAKE_LIB_POSIX_HAS_REMOVE) + endif (NOT CMAKE_HAVE_REMOVE) + + # Find library needed for shmat. + CHECK_FUNCTION_EXISTS("shmat" CMAKE_HAVE_SHMAT) + if (NOT CMAKE_HAVE_SHMAT) + CHECK_LIBRARY_EXISTS("ipc" "shmat" "" CMAKE_LIB_IPS_HAS_SHMAT) + if (CMAKE_LIB_IPS_HAS_SHMAT) + set(X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} -lipc) + endif (CMAKE_LIB_IPS_HAS_SHMAT) + endif (NOT CMAKE_HAVE_SHMAT) + endif ($ENV{ISC} MATCHES "^yes$") + + CHECK_LIBRARY_EXISTS("ICE" "IceConnectionNumber" "${X11_LIBRARY_DIR}" + CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER) + if (CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER) + set(X11_X_PRE_LIBS -lSM -lICE) + endif (CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER) + # Build the final list of libraries. + set(X11_LIBRARIES ${X11_X_PRE_LIBS} ${X11_LIBRARIES} ${X11_X_EXTRA_LIBS}) + endif (X11_FOUND) + + MARK_AS_ADVANCED( + X11_X11_INCLUDE_PATH + X11_X11_LIB + X11_Xext_LIB + X11_Xau_LIB + X11_Xlib_INCLUDE_PATH + X11_Xutil_INCLUDE_PATH + X11_Xcomposite_INCLUDE_PATH + X11_Xcomposite_LIB + X11_Xaccess_INCLUDE_PATH + X11_Xfixes_LIB + X11_Xfixes_INCLUDE_PATH + X11_Xrandr_LIB + X11_Xrandr_INCLUDE_PATH + X11_Xdamage_LIB + X11_Xdamage_INCLUDE_PATH + X11_Xrender_LIB + X11_Xrender_INCLUDE_PATH + X11_Xxf86misc_LIB + X11_Xxf86misc_INCLUDE_PATH + X11_Xinerama_LIB + X11_Xinerama_INCLUDE_PATH + X11_XTest_LIB + X11_XTest_INCLUDE_PATH + X11_Xcursor_LIB + X11_Xcursor_INCLUDE_PATH + X11_dpms_INCLUDE_PATH + X11_Xt_LIB + X11_Xss_LIB + X11_Xdmcp_LIB + X11_LIBRARIES + X11_Xaccessrules_INCLUDE_PATH + X11_Xaccessstr_INCLUDE_PATH + X11_Xdmcp_INCLUDE_PATH + X11_Xf86misc_INCLUDE_PATH + X11_Xkb_INCLUDE_PATH + X11_Xkblib_INCLUDE_PATH + X11_Xscreensaver_INCLUDE_PATH + X11_Xpm_INCLUDE_PATH + X11_Xpm_LIB + X11_Xinput_LIB + X11_Xinput_INCLUDE_PATH + X11_Xft_LIB + X11_Xft_INCLUDE_PATH + X11_Xshape_INCLUDE_PATH + X11_Xv_LIB + X11_Xv_INCLUDE_PATH + ) + +endif (UNIX) diff --git a/cmakemodules/KDE3Macros.cmake b/cmakemodules/KDE3Macros.cmake new file mode 100644 index 0000000..f132854 --- /dev/null +++ b/cmakemodules/KDE3Macros.cmake @@ -0,0 +1,392 @@ +# + +# See FindKDE3.cmake for documentation. +# +# this file contains the following macros: +# KDE3_ADD_DCOP_SKELS +# KDE3_ADD_DCOP_STUBS +# KDE3_ADD_MOC_FILES +# KDE3_ADD_UI_FILES +# KDE3_ADD_KCFG_FILES +# KDE3_AUTOMOC +# KDE3_INSTALL_LIBTOOL_FILE +# KDE3_CREATE_FINAL_FILE +# KDE3_ADD_KPART +# KDE3_ADD_KDEINIT_EXECUTABLE +# KDE3_ADD_EXECUTABLE + +#neundorf@kde.org +# +# Modified by PhobosK <phobosk@mail.kbfx.org> + +INCLUDE(AddFileDependencies) + +#create the kidl and skeletion file for dcop stuff +#usage: KDE_ADD_COP_SKELS(foo_SRCS ${dcop_headers}) +MACRO(KDE3_ADD_DCOP_SKELS _sources) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE) + GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE) + + SET(_skel ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_skel.cpp) + SET(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl) + + IF (NOT HAVE_${_basename}_KIDL_RULE) + SET(HAVE_${_basename}_KIDL_RULE ON) + + ADD_CUSTOM_COMMAND(OUTPUT ${_kidl} + COMMAND ${KDE3_DCOPIDL_EXECUTABLE} + ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} > ${_kidl} + DEPENDS ${_tmp_FILE} + ) + ENDIF (NOT HAVE_${_basename}_KIDL_RULE) + + IF (NOT HAVE_${_basename}_SKEL_RULE) + SET(HAVE_${_basename}_SKEL_RULE ON) + + ADD_CUSTOM_COMMAND(OUTPUT ${_skel} + COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE} + ARGS --c++-suffix cpp --no-signals --no-stub ${_kidl} + DEPENDS ${_kidl} + ) + + ENDIF (NOT HAVE_${_basename}_SKEL_RULE) + + SET(${_sources} ${${_sources}} ${_skel}) + + ENDFOREACH (_current_FILE) + +ENDMACRO(KDE3_ADD_DCOP_SKELS) + + +MACRO(KDE3_ADD_DCOP_STUBS _sources) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE) + + GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE) + + SET(_stub_CPP ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_stub.cpp) + SET(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl) + + IF (NOT HAVE_${_basename}_KIDL_RULE) + SET(HAVE_${_basename}_KIDL_RULE ON) + + + ADD_CUSTOM_COMMAND(OUTPUT ${_kidl} + COMMAND ${KDE3_DCOPIDL_EXECUTABLE} + ARGS ${tmp_FILE} > ${_kidl} + DEPENDS ${tmp_FILE} + ) + + ENDIF (NOT HAVE_${_basename}_KIDL_RULE) + + + IF (NOT HAVE_${_basename}_STUB_RULE) + SET(HAVE_${_basename}_STUB_RULE ON) + + ADD_CUSTOM_COMMAND(OUTPUT ${_stub_CPP} + COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE} + ARGS --c++-suffix cpp --no-signals --no-skel ${_kidl} + DEPENDS ${_kidl} + ) + + ENDIF (NOT HAVE_${_basename}_STUB_RULE) + + SET(${_sources} ${${_sources}} ${_stub_CPP}) + + ENDFOREACH (_current_FILE) + +ENDMACRO(KDE3_ADD_DCOP_STUBS) + + +MACRO(KDE3_ADD_KCFG_FILES _sources) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE) + + GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE) + + FILE(READ ${_tmp_FILE} _contents) + STRING(REGEX REPLACE "^(.*\n)?File=([^\n]+)\n.*$" "\\2" _kcfg_FILE "${_contents}") + + SET(_src_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_header_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + + ADD_CUSTOM_COMMAND(OUTPUT ${_src_FILE} + COMMAND ${KDE3_KCFGC_EXECUTABLE} + ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ${_tmp_FILE} + DEPENDS ${_tmp_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ) + + SET(${_sources} ${${_sources}} ${_src_FILE}) + + ENDFOREACH (_current_FILE) + +ENDMACRO(KDE3_ADD_KCFG_FILES) + + +#create the moc files and add them to the list of sources +#usage: KDE_ADD_MOC_FILES(foo_SRCS ${moc_headers}) +MACRO(KDE3_ADD_MOC_FILES _sources) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE) + + GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp) + + ADD_CUSTOM_COMMAND(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_tmp_FILE} -o ${_moc} + DEPENDS ${_tmp_FILE} + ) + + SET(${_sources} ${${_sources}} ${_moc}) + + ENDFOREACH (_current_FILE) +ENDMACRO(KDE3_ADD_MOC_FILES) + + +GET_FILENAME_COMPONENT( KDE3_MODULE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) + +#create the implementation files from the ui files and add them to the list of sources +#usage: KDE_ADD_UI_FILES(foo_SRCS ${ui_files}) +MACRO(KDE3_ADD_UI_FILES _sources ) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_tmp_FILE ${_current_FILE} ABSOLUTE) + + GET_FILENAME_COMPONENT(_basename ${_tmp_FILE} NAME_WE) + SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + SET(_src ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp) + + ADD_CUSTOM_COMMAND(OUTPUT ${_header} + COMMAND ${QT_UIC_EXECUTABLE} + ARGS -L ${KDE3_LIB_DIR}/kde3/plugins/designer -nounload -o ${_header} ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} + DEPENDS ${_tmp_FILE} + ) + + ADD_CUSTOM_COMMAND(OUTPUT ${_src} + COMMAND ${CMAKE_COMMAND} + ARGS + -DKDE_UIC_PLUGIN_DIR:FILEPATH=${KDE3_LIB_DIR}/kde3/plugins/designer + -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC_EXECUTABLE} + -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE} + -DKDE_UIC_CPP_FILE:FILEPATH=${_src} + -DKDE_UIC_H_FILE:FILEPATH=${_header} + -P ${KDE3_MODULE_DIR}/kde3uic.cmake + DEPENDS ${_header} + ) + + ADD_CUSTOM_COMMAND(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_header} -o ${_moc} + DEPENDS ${_header} + ) + + SET(${_sources} ${${_sources}} ${_src} ${_moc} ) + + ENDFOREACH (_current_FILE) +ENDMACRO(KDE3_ADD_UI_FILES) + + +MACRO(KDE3_AUTOMOC) + SET(_matching_FILES ) + FOREACH (_current_FILE ${ARGN}) + + GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE) + + # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. + # here. this is required to make bouic work correctly: + # we need to add generated .cpp files to the sources (to compile them), + # but we cannot let automoc handle them, as the .cpp files don't exist yet when + # cmake is run for the very first time on them -> however the .cpp files might + # exist at a later run. at that time we need to skip them, so that we don't add two + # different rules for the same moc file + GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC) + + IF (EXISTS ${_abs_FILE} AND NOT _skip) + + FILE(READ ${_abs_FILE} _contents) + + GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH) + + STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") + IF(_match) + FOREACH (_current_MOC_INC ${_match}) + STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") + + GET_FILENAME_COMPONENT(_basename ${_current_MOC} NAME_WE) +# SET(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h) + SET(_header ${_abs_PATH}/${_basename}.h) + SET(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) + + ADD_CUSTOM_COMMAND(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_header} -o ${_moc} + DEPENDS ${_header} + ) + + ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc}) + + ENDFOREACH (_current_MOC_INC) + ENDIF(_match) + + ENDIF (EXISTS ${_abs_FILE} AND NOT _skip) + ENDFOREACH (_current_FILE) +ENDMACRO(KDE3_AUTOMOC) + +# only used internally by KDE3_INSTALL_ICONS +MACRO (_KDE3_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group _orig_NAME _install_NAME) + + # if the string doesn't match the pattern, the result is the full string, so all three have the same content + IF (NOT ${_group} STREQUAL ${_install_NAME} ) + SET(_icon_GROUP "actions") + + IF (${_group} STREQUAL "mime") + SET(_icon_GROUP "mimetypes") + ENDIF (${_group} STREQUAL "mime") + + IF (${_group} STREQUAL "filesys") + SET(_icon_GROUP "filesystems") + ENDIF (${_group} STREQUAL "filesys") + + IF (${_group} STREQUAL "device") + SET(_icon_GROUP "devices") + ENDIF (${_group} STREQUAL "device") + + IF (${_group} STREQUAL "app") + SET(_icon_GROUP "apps") + ENDIF (${_group} STREQUAL "app") + + IF (${_group} STREQUAL "action") + SET(_icon_GROUP "actions") + ENDIF (${_group} STREQUAL "action") + +# message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} name: ${_name}" ) + INSTALL(FILES ${_orig_NAME} DESTINATION ${_install_PATH}/${_icon_GROUP}/ RENAME ${_install_NAME} ) + ENDIF (NOT ${_group} STREQUAL ${_install_NAME} ) + +ENDMACRO (_KDE3_ADD_ICON_INSTALL_RULE) + + +MACRO (KDE3_INSTALL_ICONS _theme ) + SET(_defaultpath "${CMAKE_INSTALL_PREFIX}/share/icons") + # first the png icons + FILE(GLOB _icons *.png) + FOREACH (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _size "${_current_ICON}") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _name "${_current_ICON}") + _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme}/${_size}x${_size} + ${_group} ${_current_ICON} ${_name}) + ENDFOREACH (_current_ICON) + + # and now the svg icons + FILE(GLOB _icons *.svgz) + FOREACH (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _name "${_current_ICON}") + _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme}/scalable + ${_group} ${_current_ICON} ${_name}) + ENDFOREACH (_current_ICON) + +ENDMACRO (KDE3_INSTALL_ICONS) + +MACRO(KDE3_INSTALL_LIBTOOL_FILE _target _place) + GET_TARGET_PROPERTY(_target_location ${_target} LOCATION) + + GET_FILENAME_COMPONENT(_laname ${_target_location} NAME_WE) + GET_FILENAME_COMPONENT(_soname ${_target_location} NAME) + SET(_laname ${CMAKE_CURRENT_BINARY_DIR}/${_laname}.la) + + FILE(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n") + FILE(APPEND ${_laname} "# The name that we can dlopen(3).\n") + FILE(APPEND ${_laname} "dlname='${_soname}'\n") + FILE(APPEND ${_laname} "# Names of this library\n") + FILE(APPEND ${_laname} "library_names='${_soname} ${_soname} ${_soname}'\n") + FILE(APPEND ${_laname} "# The name of the static archive\n") + FILE(APPEND ${_laname} "old_library=''\n") + FILE(APPEND ${_laname} "# Libraries that this one depends upon.\n") + FILE(APPEND ${_laname} "dependency_libs=''\n") +# FILE(APPEND ${_laname} "dependency_libs='${${_target}_LIB_DEPENDS}'\n") + FILE(APPEND ${_laname} "# Version information.\ncurrent=0\nage=0\nrevision=0\n") + FILE(APPEND ${_laname} "# Is this an already installed library?\ninstalled=yes\n") + FILE(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\nshouldnotlink=yes\n") + FILE(APPEND ${_laname} "# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n") + FILE(APPEND ${_laname} "# Directory that this library needs to be installed in:\n") + FILE(APPEND ${_laname} "libdir='${_place}'\n") + INSTALL(FILES ${_laname} DESTINATION ${_place}) +ENDMACRO(KDE3_INSTALL_LIBTOOL_FILE) + + +MACRO(KDE3_CREATE_FINAL_FILE _filename) + FILE(WRITE ${_filename} "//autogenerated file\n") + FOREACH (_current_FILE ${ARGN}) + FILE(APPEND ${_filename} "#include \"${_current_FILE}\"\n") + ENDFOREACH (_current_FILE) + +ENDMACRO(KDE3_CREATE_FINAL_FILE) + + +OPTION(KDE3_ENABLE_FINAL "Enable final all-in-one compilation") +OPTION(KDE3_BUILD_TESTS "Build the tests") + + +MACRO(KDE3_ADD_KPART _target_NAME _with_PREFIX) +#is the first argument is "WITH_PREFIX" then keep the standard "lib" prefix, otherwise SET the prefix empty + IF (${_with_PREFIX} STREQUAL "WITH_PREFIX") + SET(_first_SRC) + ELSE (${_with_PREFIX} STREQUAL "WITH_PREFIX") + SET(_first_SRC ${_with_PREFIX}) + ENDIF (${_with_PREFIX} STREQUAL "WITH_PREFIX") + + IF (KDE3_ENABLE_FINAL) + KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${_first_SRC} ${ARGN}) + ADD_LIBRARY(${_target_NAME} MODULE ${_target_NAME}_final.cpp) + ELSE (KDE3_ENABLE_FINAL) + ADD_LIBRARY(${_target_NAME} MODULE ${_first_SRC} ${ARGN}) + ENDIF (KDE3_ENABLE_FINAL) + + IF(_first_SRC) + SET_TARGET_PROPERTIES(${_target_NAME} PROPERTIES PREFIX "") + ENDIF(_first_SRC) + + KDE3_INSTALL_LIBTOOL_FILE(${_target_NAME}) + +ENDMACRO(KDE3_ADD_KPART) + + +MACRO(KDE3_ADD_KDEINIT_EXECUTABLE _target_NAME ) + + IF (KDE3_ENABLE_FINAL) + KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN}) + ADD_LIBRARY(kdeinit_${_target_NAME} SHARED ${_target_NAME}_final.cpp) + ELSE (KDE3_ENABLE_FINAL) + ADD_LIBRARY(kdeinit_${_target_NAME} SHARED ${ARGN} ) + ENDIF (KDE3_ENABLE_FINAL) + + CONFIGURE_FILE(${KDE3_MODULE_DIR}/kde3init_dummy.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp) + + ADD_EXECUTABLE( ${_target_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp ) + TARGET_LINK_LIBRARIES( ${_target_NAME} kdeinit_${_target_NAME} ) + +ENDMACRO(KDE3_ADD_KDEINIT_EXECUTABLE) + + +MACRO(KDE3_ADD_EXECUTABLE _target_NAME ) + + IF (KDE3_ENABLE_FINAL) + KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN}) + ADD_EXECUTABLE(${_target_NAME} ${_target_NAME}_final.cpp) + ELSE (KDE3_ENABLE_FINAL) + ADD_EXECUTABLE(${_target_NAME} ${ARGN} ) + ENDIF (KDE3_ENABLE_FINAL) + +ENDMACRO(KDE3_ADD_EXECUTABLE) + + diff --git a/cmakemodules/KDE4Macros.cmake b/cmakemodules/KDE4Macros.cmake new file mode 100644 index 0000000..8be1538 --- /dev/null +++ b/cmakemodules/KDE4Macros.cmake @@ -0,0 +1,854 @@ +# for documentation look at FindKDE4Internal.cmake +# +# this file contains the following macros: +# KDE4_ADD_UI_FILES +# KDE4_ADD_UI3_FILES +# KDE4_ADD_KCFG_FILES +# KDE4_AUTOMOC +# KDE4_INSTALL_LIBTOOL_FILE +# KDE4_CREATE_FINAL_FILES +# KDE4_ADD_KDEINIT_EXECUTABLE +# KDE4_ADD_EXECUTABLE +# KDE4_ADD_WIDGET_FILES +# KDE4_INSTALL_ICONS +# KDE4_REMOVE_OBSOLETE_CMAKE_FILES +# KDE4_NO_ENABLE_FINAL +# KDE4_CREATE_HANDBOOK +# KDE4_CREATE_HTML_HANDBOOK +# KDE4_INSTALL_HANDBOOK + +# Copyright (c) 2006, 2007, Alexander Neundorf, <neundorf@kde.org> +# Copyright (c) 2006, 2007, Laurent Montel, <montel@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# +# Modified by PhobosK <phobosk@mail.kbfx.org> + +macro (KDE4_ADD_KCFG_FILES _sources ) + if( ${ARGV1} STREQUAL "GENERATE_MOC" ) + set(_kcfg_generatemoc TRUE) + endif( ${ARGV1} STREQUAL "GENERATE_MOC" ) + + foreach (_current_FILE ${ARGN}) + + if(NOT ${_current_FILE} STREQUAL "GENERATE_MOC") + get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE) + get_filename_component(_abs_PATH ${_tmp_FILE} PATH) + get_filename_component(_basename ${_tmp_FILE} NAME_WE) + + file(READ ${_tmp_FILE} _contents) + string(REGEX REPLACE "^(.*\n)?File=([^\n]+kcfg).*\n.*$" "\\2" _kcfg_FILE "${_contents}") + set(_src_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + set(_header_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + set(_moc_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc) + + # the command for creating the source file from the kcfg file + add_custom_command(OUTPUT ${_header_FILE} ${_src_FILE} + COMMAND ${KDE4_KCFGC_EXECUTABLE} + ARGS ${_abs_PATH}/${_kcfg_FILE} ${_tmp_FILE} -d ${CMAKE_CURRENT_BINARY_DIR} + MAIN_DEPENDENCY ${_tmp_FILE} + DEPENDS ${_abs_PATH}/${_kcfg_FILE} ${_KDE4_KCONFIG_COMPILER_DEP} ) + + if(_kcfg_generatemoc) + qt4_generate_moc(${_header_FILE} ${_moc_FILE} ) + set_source_files_properties(${_src_FILE} PROPERTIES SKIP_AUTOMOC TRUE) # dont run automoc on this file + list(APPEND ${_sources} ${_moc_FILE}) + endif(_kcfg_generatemoc) + +# if (KDE4_ENABLE_FINAL) +# kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${ARGN}) +# macro_add_file_dependencies(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_src_FILE}) +# endif (KDE4_ENABLE_FINAL) + + list(APPEND ${_sources} ${_src_FILE} ${_header_FILE}) + endif(NOT ${_current_FILE} STREQUAL "GENERATE_MOC") + endforeach (_current_FILE) + +endmacro (KDE4_ADD_KCFG_FILES) + + +GET_FILENAME_COMPONENT(KDE4_MODULE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) + +#create the implementation files from the ui files and add them to the list of sources +#usage: KDE4_ADD_UI_FILES(foo_SRCS ${ui_files}) +macro (KDE4_ADD_UI_FILES _sources ) + foreach (_current_FILE ${ARGN}) + + get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE) + get_filename_component(_basename ${_tmp_FILE} NAME_WE) + set(_header ${CMAKE_CURRENT_BINARY_DIR}/ui_${_basename}.h) + + # we need to run uic and replace some things in the generated file + # this is done by executing the cmake script kde4uic.cmake + add_custom_command(OUTPUT ${_header} + COMMAND ${CMAKE_COMMAND} + ARGS + -DKDE4_HEADER:BOOL=ON + -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC_EXECUTABLE} + -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE} + -DKDE_UIC_H_FILE:FILEPATH=${_header} + -DKDE_UIC_BASENAME:STRING=${_basename} + -P ${KDE4_MODULE_DIR}/kde4uic.cmake + MAIN_DEPENDENCY ${_tmp_FILE} + ) + list(APPEND ${_sources} ${_header}) + endforeach (_current_FILE) +endmacro (KDE4_ADD_UI_FILES) + + +#create the implementation files from the ui files and add them to the list of sources +#usage: KDE4_ADD_UI3_FILES(foo_SRCS ${ui_files}) +macro (KDE4_ADD_UI3_FILES _sources ) + + qt4_get_moc_inc_dirs(_moc_INCS) + + foreach (_current_FILE ${ARGN}) + + get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE) + get_filename_component(_basename ${_tmp_FILE} NAME_WE) + set(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h) + set(_src ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp) + set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp) + + add_custom_command(OUTPUT ${_header} + COMMAND ${CMAKE_COMMAND} + -DKDE3_HEADER:BOOL=ON + -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC3_EXECUTABLE} + -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE} + -DKDE_UIC_H_FILE:FILEPATH=${_header} + -DKDE_UIC_BASENAME:STRING=${_basename} + -DKDE_UIC_PLUGIN_DIR:FILEPATH="." + -P ${KDE4_MODULE_DIR}/kde4uic.cmake + MAIN_DEPENDENCY ${_tmp_FILE} + ) + +# we need to run uic3 and replace some things in the generated file + # this is done by executing the cmake script kde4uic.cmake + add_custom_command(OUTPUT ${_src} + COMMAND ${CMAKE_COMMAND} + ARGS + -DKDE3_IMPL:BOOL=ON + -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC3_EXECUTABLE} + -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE} + -DKDE_UIC_CPP_FILE:FILEPATH=${_src} + -DKDE_UIC_H_FILE:FILEPATH=${_header} + -DKDE_UIC_BASENAME:STRING=${_basename} + -DKDE_UIC_PLUGIN_DIR:FILEPATH="." + -P ${KDE4_MODULE_DIR}/kde4uic.cmake + MAIN_DEPENDENCY ${_header} + ) + + add_custom_command(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_moc_INCS} ${_header} -o ${_moc} + MAIN_DEPENDENCY ${_header} + ) + list(APPEND ${_sources} ${_src} ${_moc} ) + + endforeach (_current_FILE) +endmacro (KDE4_ADD_UI3_FILES) + + +macro (KDE4_AUTOMOC) + qt4_get_moc_inc_dirs(_moc_INCS) + + # iterate over all files + foreach (_current_FILE ${ARGN}) + + get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) + # if "SKIP_AUTOMOC" is set to true, we will not handle this file here. + # here. this is required to make bouic work correctly: + # we need to add generated .cpp files to the sources (to compile them), + # but we cannot let automoc handle them, as the .cpp files don't exist yet when + # cmake is run for the very first time on them -> however the .cpp files might + # exist at a later run. at that time we need to skip them, so that we don't add two + # different rules for the same moc file + get_source_file_property(_skip ${_abs_FILE} SKIP_AUTOMOC) + + # if the file exists and should not be skipped read it completely into memory + # and grep for all include <foo.moc> lines + # for each found moc file generate a custom_target and collect + # the generated moc files in a list which will be set as a source files property + # and later be queried in kde4_add_library/executable/plugin() + if (EXISTS ${_abs_FILE} AND NOT _skip) + set(_moc_FILES_PROPERTY) + + file(READ ${_abs_FILE} _contents) + get_filename_component(_abs_PATH ${_abs_FILE} PATH) + + string(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}") + if (_match) + foreach (_current_MOC_INC ${_match}) + string(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}") + get_filename_component(_basename ${_current_MOC} NAME_WE) + set(_header ${_abs_PATH}/${_basename}.h) + set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC}) + + if (NOT EXISTS ${_abs_PATH}/${_basename}.h) + message(FATAL_ERROR "In the file \"${_abs_FILE}\" the moc file \"${_current_MOC}\" is included, but \"${_abs_PATH}/${_basename}.h\" doesn't exist.") + endif (NOT EXISTS ${_abs_PATH}/${_basename}.h) + + add_custom_command(OUTPUT ${_moc} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${_moc_INCS} ${_header} -o ${_moc} + MAIN_DEPENDENCY ${_header} + ) + + list(APPEND _moc_FILES_PROPERTY ${_moc}) + +# if (KDE4_ENABLE_FINAL) +# kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${ARGN}) +# macro_add_file_dependencies(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_moc}) +# else (KDE4_ENABLE_FINAL) +# macro_add_file_dependencies(${_abs_FILE} ${_moc}) +# endif (KDE4_ENABLE_FINAL) + + endforeach (_current_MOC_INC) + endif (_match) + + set_source_files_properties(${_abs_FILE} PROPERTIES AUTOMOC_FILES "${_moc_FILES_PROPERTY}") + endif (EXISTS ${_abs_FILE} AND NOT _skip) + endforeach (_current_FILE) +endmacro (KDE4_AUTOMOC) + + +macro(KDE4_GET_AUTOMOC_FILES _list) + set(${_list}) + foreach (_current_FILE ${ARGN}) + set(_automoc_FILES_PROPERTY) + get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) + get_source_file_property(_automoc_FILES_PROPERTY ${_abs_FILE} AUTOMOC_FILES) + if (_automoc_FILES_PROPERTY) + foreach (_current_MOC_FILE ${_automoc_FILES_PROPERTY}) + list(APPEND ${_list} ${_current_MOC_FILE}) + endforeach (_current_MOC_FILE) + endif (_automoc_FILES_PROPERTY) + endforeach (_current_FILE) +endmacro(KDE4_GET_AUTOMOC_FILES) + +macro (KDE4_INSTALL_HANDBOOK ) + get_filename_component(_tmp_FILE ${CMAKE_CURRENT_SOURCE_DIR} ABSOLUTE) + get_filename_component(_basename ${_tmp_FILE} NAME_WE) + file(GLOB _books *.docbook) + file(GLOB _images *.png) + set(relative ${ARGV0}) + set( dirname ${relative}/${_basename}) + FILE(MAKE_DIRECTORY ${HTML_INSTALL_DIR}/en/${dirname}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/index.cache.bz2 ${_books} ${_images} DESTINATION ${HTML_INSTALL_DIR}/en/${dirname}) + # TODO symlinks on non-unix platforms + if (UNIX) + ADD_CUSTOM_COMMAND(OUTPUT "${HTML_INSTALL_DIR}/en/${dirname}/common" + DEPENDS "${HTML_INSTALL_DIR}/en/common" + COMMAND /bin/ln + ARGS -s "${HTML_INSTALL_DIR}/en/common" "${HTML_INSTALL_DIR}/en/${dirname}/common" + COMMENT "Symlink") + ADD_CUSTOM_TARGET(CreateSymlinks ALL DEPENDS ${HTML_INSTALL_DIR}/en/${dirname}/common) + endif (UNIX) +endmacro (KDE4_INSTALL_HANDBOOK ) + +macro (KDE4_CREATE_HANDBOOK _docbook) + get_filename_component(_input ${_docbook} ABSOLUTE) + set(_doc ${CMAKE_CURRENT_BINARY_DIR}/index.cache.bz2) + set(_ssheet ${DATA_INSTALL_DIR}/ksgmltools2/customization/kde-chunk.xsl) + add_custom_command(OUTPUT ${_doc} + COMMAND ${KDE4_MEINPROC_EXECUTABLE} --check --cache ${_doc} ${_input} + DEPENDS ${_input} ${_KDE4_MEINPROC_EXECUTABLE_DEP} ${_ssheet} + ) + add_custom_target(handbook ALL DEPENDS ${_doc}) +endmacro (KDE4_CREATE_HANDBOOK) + +macro (KDE4_CREATE_HTML_HANDBOOK _docbook) + get_filename_component(_input ${_docbook} ABSOLUTE) + set(_doc ${CMAKE_CURRENT_SOURCE_DIR}/index.html) + set(_ssheet ${DATA_INSTALL_DIR}/ksgmltools2/customization/kde-chunk.xsl) + add_custom_command(OUTPUT ${_doc} + COMMAND ${KDE4_MEINPROC_EXECUTABLE} --check -o ${_doc} ${_input} + DEPENDS ${_input} ${_KDE4_MEINPROC_EXECUTABLE_DEP} ${_ssheet} + ) + add_custom_target(htmlhandbook ALL DEPENDS ${_doc}) +endmacro (KDE4_CREATE_HTML_HANDBOOK) + +# only used internally by KDE4_INSTALL_ICONS +MACRO (_KDE4_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group _orig_NAME _install_NAME) + + # if the string doesn't match the pattern, the result is the full string, so all three have the same content + IF (NOT ${_group} STREQUAL ${_install_NAME} ) + SET(_icon_GROUP "actions") + + IF (${_group} STREQUAL "mime") + SET(_icon_GROUP "mimetypes") + ENDIF (${_group} STREQUAL "mime") + + IF (${_group} STREQUAL "filesys") + SET(_icon_GROUP "filesystems") + ENDIF (${_group} STREQUAL "filesys") + + IF (${_group} STREQUAL "device") + SET(_icon_GROUP "devices") + ENDIF (${_group} STREQUAL "device") + + IF (${_group} STREQUAL "app") + SET(_icon_GROUP "apps") + ENDIF (${_group} STREQUAL "app") + + IF (${_group} STREQUAL "action") + SET(_icon_GROUP "actions") + ENDIF (${_group} STREQUAL "action") + +# message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} name: ${_name}" ) + INSTALL(FILES ${_orig_NAME} DESTINATION ${_install_PATH}/${_icon_GROUP}/ RENAME ${_install_NAME} ) + ENDIF (NOT ${_group} STREQUAL ${_install_NAME} ) + +ENDMACRO (_KDE4_ADD_ICON_INSTALL_RULE) + + +macro (KDE4_INSTALL_ICONS _defaultpath ) + + # first the png icons + file(GLOB _icons *.png) + foreach (_current_ICON ${_icons} ) + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _type "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _size "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _group "${_current_ICON}") + string(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\4" _name "${_current_ICON}") + set(_theme_GROUP "nogroup") + + if( ${_type} STREQUAL "ox" ) + set(_theme_GROUP "oxygen") + endif(${_type} STREQUAL "ox" ) + + if( ${_type} STREQUAL "cr" ) + set(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if( ${_type} STREQUAL "lo" ) + set(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if( ${_type} STREQUAL "hi" ) + set(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/${_size}x${_size} + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + + # mng icons + file(GLOB _icons *.mng) + foreach (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\1" _type "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\2" _size "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\3" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" "\\4" _name "${_current_ICON}") + SET(_theme_GROUP "nogroup") + + if( ${_type} STREQUAL "ox" ) + SET(_theme_GROUP "oxygen") + endif(${_type} STREQUAL "ox" ) + + if( ${_type} STREQUAL "cr" ) + SET(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if( ${_type} STREQUAL "lo" ) + set(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if( ${_type} STREQUAL "hi" ) + set(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/${_size}x${_size} + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + + + # and now the svg icons + file(GLOB _icons *.svgz) + foreach (_current_ICON ${_icons} ) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _type "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _group "${_current_ICON}") + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" "\\3" _name "${_current_ICON}") + SET(_theme_GROUP "nogroup") + + if(${_type} STREQUAL "ox" ) + SET(_theme_GROUP "oxygen") + endif(${_type} STREQUAL "ox" ) + + if(${_type} STREQUAL "cr" ) + SET(_theme_GROUP "crystalsvg") + endif(${_type} STREQUAL "cr" ) + + if(${_type} STREQUAL "hi" ) + SET(_theme_GROUP "hicolor") + endif(${_type} STREQUAL "hi" ) + + if(${_type} STREQUAL "lo" ) + SET(_theme_GROUP "locolor") + endif(${_type} STREQUAL "lo" ) + + if( NOT ${_theme_GROUP} STREQUAL "nogroup") + _KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake + ${_defaultpath}/${_theme_GROUP}/scalable + ${_group} ${_current_ICON} ${_name}) + endif( NOT ${_theme_GROUP} STREQUAL "nogroup") + + endforeach (_current_ICON) + +endmacro (KDE4_INSTALL_ICONS) + + +MACRO (KDE4_INSTALL_LIBTOOL_FILE _target _dir) + GET_TARGET_PROPERTY(_target_location ${_target} LOCATION) + + GET_FILENAME_COMPONENT(_laname ${_target_location} NAME_WE) + GET_FILENAME_COMPONENT(_soname ${_target_location} NAME) + set(_laname ${LIBRARY_OUTPUT_PATH}/${_laname}.la) + + FILE(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n") + FILE(APPEND ${_laname} "# The name that we can dlopen(3).\n") + FILE(APPEND ${_laname} "dlname='${_soname}'\n") + FILE(APPEND ${_laname} "# Names of this library\n") + FILE(APPEND ${_laname} "library_names='${_soname} ${_soname} ${_soname}'\n") + FILE(APPEND ${_laname} "# The name of the static archive\n") + FILE(APPEND ${_laname} "old_library=''\n") + FILE(APPEND ${_laname} "# Libraries that this one depends upon.\n") + FILE(APPEND ${_laname} "dependency_libs=''\n") +# FILE(APPEND ${_laname} "dependency_libs='${${_target}_LIB_DEPENDS}'\n") + FILE(APPEND ${_laname} "# Version information.\ncurrent=0\nage=0\nrevision=0\n") + FILE(APPEND ${_laname} "# Is this an already installed library?\ninstalled=yes\n") + FILE(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\nshouldnotlink=yes\n") + FILE(APPEND ${_laname} "# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n") + FILE(APPEND ${_laname} "# Directory that this library needs to be installed in:\n") + FILE(APPEND ${_laname} "libdir='${_dir}'\n") + + INSTALL(FILES ${_laname} DESTINATION ${_dir}) +ENDMACRO (KDE4_INSTALL_LIBTOOL_FILE) + + +# For all C++ sources a big source file which includes all the files +# is created. +# This is not done for the C sources, they are just gathered in a separate list +# because they are usually not written by KDE and as such not intended to be +# compiled all-in-one. +macro (KDE4_CREATE_FINAL_FILES _filenameCPP _filesExcludedFromFinalFile ) + set(${_filesExcludedFromFinalFile}) + file(WRITE ${_filenameCPP} "//autogenerated file\n") + foreach (_current_FILE ${ARGN}) + get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) + # don't include any generated files in the final-file + # because then cmake will not know the dependencies + get_source_file_property(_isGenerated ${_abs_FILE} GENERATED) + if (_isGenerated) + list(APPEND ${_filesExcludedFromFinalFile} ${_abs_FILE}) + else (_isGenerated) + # don't include c-files in the final-file, because they usually come + # from a 3rd party and as such are not intended to be compiled all-in-one + string(REGEX MATCH ".+\\.c$" _isCFile ${_abs_FILE}) + if (_isCFile) + list(APPEND ${_filesExcludedFromFinalFile} ${_abs_FILE}) + else (_isCFile) + file(APPEND ${_filenameCPP} "#include \"${_abs_FILE}\"\n") + endif (_isCFile) + endif (_isGenerated) + endforeach (_current_FILE) + +endmacro (KDE4_CREATE_FINAL_FILES) + +# This macro sets the RPATH related options for libraries, plugins and kdeinit executables. +# It overrides the defaults set in FindKDE4Internal.cmake. +# If RPATH is not explicitely disabled, libraries and plugins are built without RPATH, in +# the hope that the RPATH which is compiled into the executable is good enough. +macro (KDE4_HANDLE_RPATH_FOR_LIBRARY _target_NAME) + if (NOT CMAKE_SKIP_RPATH AND NOT KDE4_USE_ALWAYS_FULL_RPATH) + set_target_properties(${_target_NAME} PROPERTIES INSTALL_RPATH_USE_LINK_PATH FALSE SKIP_BUILD_RPATH TRUE BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "") + endif (NOT CMAKE_SKIP_RPATH AND NOT KDE4_USE_ALWAYS_FULL_RPATH) +endmacro (KDE4_HANDLE_RPATH_FOR_LIBRARY) + +# This macro sets the RPATH related options for executables +# and creates wrapper shell scripts for the executables. +# It overrides the defaults set in FindKDE4Internal.cmake. +# For every executable a wrapper script is created, which sets the appropriate +# environment variable for the platform (LD_LIBRARY_PATH on most UNIX systems, +# DYLD_LIBRARY_PATH on OS X and PATH in Windows) so that it points to the built +# but not yet installed versions of the libraries. So if RPATH is disabled, the executables +# can be run via these scripts from the build tree and will find the correct libraries. +# If RPATH is not disabled, these scripts are also used but only for consistency, because +# they don't really influence anything then, because the compiled-in RPATH overrides +# the LD_LIBRARY_PATH env. variable. +# Executables with the RUN_UNINSTALLED option will be built with the RPATH pointing to the +# build dir, so that they can be run safely without being installed, e.g. as code generators +# for other stuff during the build. These executables will be relinked during "make install". +# All other executables are built with the RPATH with which they will be installed. +macro (KDE4_HANDLE_RPATH_FOR_EXECUTABLE _target_NAME _type) + if (UNIX) + + # set the RPATH related properties + if (NOT CMAKE_SKIP_RPATH) + if (${_type} STREQUAL "GUI") + set_target_properties(${_target_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE BUILD_WITH_INSTALL_RPATH TRUE) + endif (${_type} STREQUAL "GUI") + + if (${_type} STREQUAL "NOGUI") + set_target_properties(${_target_NAME} PROPERTIES SKIP_BUILD_RPATH TRUE BUILD_WITH_INSTALL_RPATH TRUE) + endif (${_type} STREQUAL "NOGUI") + + if (${_type} STREQUAL "RUN_UNINSTALLED") + set_target_properties(${_target_NAME} PROPERTIES SKIP_BUILD_RPATH FALSE BUILD_WITH_INSTALL_RPATH FALSE) + endif (${_type} STREQUAL "RUN_UNINSTALLED") + endif (NOT CMAKE_SKIP_RPATH) + + if (APPLE) + set(_library_path_variable "DYLD_LIBRARY_PATH") + else (APPLE) + set(_library_path_variable "LD_LIBRARY_PATH") + endif (APPLE) + + set(_ld_library_path "${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/:${LIB_INSTALL_DIR}:${KDE4_LIB_DIR}:${QT_LIBRARY_DIR}") + get_target_property(_executable ${_target_NAME} LOCATION ) + + # use add_custom_target() to have the sh-wrapper generated during build time instead of cmake time + add_custom_command(TARGET ${_target_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + -D_filename=${_executable}.shell -D_library_path_variable=${_library_path_variable} + -D_ld_library_path="${_ld_library_path}" -D_executable=${_executable} + -P ${KDE4_MODULE_DIR}/kde4_exec_via_sh.cmake + ) + + macro_additional_clean_files(${_executable}.shell) + + # under UNIX, set the property WRAPPER_SCRIPT to the name of the generated shell script + # so it can be queried and used later on easily + set_target_properties(${_target_NAME} PROPERTIES WRAPPER_SCRIPT ${_executable}.shell) + + else (UNIX) + # under windows, set the property WRAPPER_SCRIPT just to the name of the executable + # maybe later this will change to a generated batch file (for setting the PATH so that the Qt libs are found) + get_target_property(_executable ${_target_NAME} LOCATION ) + set_target_properties(${_target_NAME} PROPERTIES WRAPPER_SCRIPT ${_executable}) + + set(_ld_library_path "${LIBRARY_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}\;${LIB_INSTALL_DIR}\;${KDE4_LIB_DIR}\;${QT_LIBRARY_DIR}") + get_target_property(_executable ${_target_NAME} LOCATION ) + + # use add_custom_target() to have the batch-file-wrapper generated during build time instead of cmake time + add_custom_command(TARGET ${_target_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + -D_filename="${_executable}.bat" + -D_ld_library_path="${_ld_library_path}" -D_executable="${_executable}" + -P ${KDE4_MODULE_DIR}/kde4_exec_via_sh.cmake + ) + + endif (UNIX) +endmacro (KDE4_HANDLE_RPATH_FOR_EXECUTABLE) + + +macro (KDE4_ADD_PLUGIN _target_NAME _with_PREFIX) +#is the first argument is "WITH_PREFIX" then keep the standard "lib" prefix, otherwise set the prefix empty + if (${_with_PREFIX} STREQUAL "WITH_PREFIX") + set(_first_SRC) + else (${_with_PREFIX} STREQUAL "WITH_PREFIX") + set(_first_SRC ${_with_PREFIX}) + endif (${_with_PREFIX} STREQUAL "WITH_PREFIX") + + kde4_get_automoc_files(_automoc_FILES ${_first_SRC} ${ARGN}) + + if (KDE4_ENABLE_FINAL) + kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_first_SRC} ${ARGN}) + add_library(${_target_NAME} MODULE ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + else (KDE4_ENABLE_FINAL) + add_library(${_target_NAME} MODULE ${_first_SRC} ${ARGN} ${_automoc_FILES}) + endif (KDE4_ENABLE_FINAL) + + if (_first_SRC) + set_target_properties(${_target_NAME} PROPERTIES PREFIX "") + endif (_first_SRC) + + kde4_handle_rpath_for_library(${_target_NAME}) + + if (WIN32) + # for shared libraries/plugins a -DMAKE_target_LIB is required + string(TOUPPER ${_target_NAME} _symbol) + set(_symbol "MAKE_${_symbol}_LIB") + set_target_properties(${_target_NAME} PROPERTIES DEFINE_SYMBOL ${_symbol}) + endif (WIN32) + +endmacro (KDE4_ADD_PLUGIN _target_NAME _with_PREFIX) + + +# this macro checks is intended to check whether a list of source +# files has the "NOGUI" or "RUN_UNINSTALLED" keywords at the beginning +# in _output_LIST the list of source files is returned with the "NOGUI" +# and "RUN_UNINSTALLED" keywords removed +# if "NOGUI" is in the list of files, the _nogui argument is set to +# "NOGUI" (which evaluates to TRUE in cmake), otherwise it is set empty +# (which evaluates to FALSE in cmake) +# if "RUN_UNINSTALLED" is in the list of files, the _uninst argument is set to +# "RUN_UNINSTALLED" (which evaluates to TRUE in cmake), otherwise it is set empty +# (which evaluates to FALSE in cmake) +macro(KDE4_CHECK_EXECUTABLE_PARAMS _output_LIST _nogui _uninst) + set(${_nogui}) + set(${_uninst}) + set(${_output_LIST} ${ARGN}) + list(LENGTH ${_output_LIST} count) + + list(GET ${_output_LIST} 0 first_PARAM) + + set(second_PARAM "NOTFOUND") + if (${count} GREATER 1) + list(GET ${_output_LIST} 1 second_PARAM) + endif (${count} GREATER 1) + + set(remove "NOTFOUND") + + if (${first_PARAM} STREQUAL "NOGUI") + set(${_nogui} "NOGUI") + set(remove 0) + endif (${first_PARAM} STREQUAL "NOGUI") + + if (${second_PARAM} STREQUAL "NOGUI") + set(${_nogui} "NOGUI") + set(remove 0;1) + endif (${second_PARAM} STREQUAL "NOGUI") + + if (${first_PARAM} STREQUAL "RUN_UNINSTALLED") + set(${_uninst} "RUN_UNINSTALLED") + set(remove 0) + endif (${first_PARAM} STREQUAL "RUN_UNINSTALLED") + + if (${second_PARAM} STREQUAL "RUN_UNINSTALLED") + set(${_uninst} "RUN_UNINSTALLED") + set(remove 0;1) + endif (${second_PARAM} STREQUAL "RUN_UNINSTALLED") + + if (NOT "${remove}" STREQUAL "NOTFOUND") + list(REMOVE_AT ${_output_LIST} ${remove}) + endif (NOT "${remove}" STREQUAL "NOTFOUND") + +endmacro(KDE4_CHECK_EXECUTABLE_PARAMS) + + +macro (KDE4_ADD_KDEINIT_EXECUTABLE _target_NAME ) + + kde4_check_executable_params(_SRCS _nogui _uninst ${ARGN}) + +# if (WIN32) +# # under windows, just build a normal executable +# KDE4_ADD_EXECUTABLE(${_target_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp ${ARGN} ) +# else (WIN32) + # under UNIX, create a shared library and a small executable, which links to this library + kde4_get_automoc_files(_automoc_FILES ${_SRCS}) + + if (KDE4_ENABLE_FINAL) + kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/kdeinit_${_target_NAME}_final_cpp.cpp _separate_files ${_SRCS}) + add_library(kdeinit_${_target_NAME} SHARED ${CMAKE_CURRENT_BINARY_DIR}/kdeinit_${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + + else (KDE4_ENABLE_FINAL) + add_library(kdeinit_${_target_NAME} SHARED ${_SRCS} ${_automoc_FILES}) + endif (KDE4_ENABLE_FINAL) + + kde4_handle_rpath_for_library(kdeinit_${_target_NAME}) + + + configure_file(${KDE4_MODULE_DIR}/kde4init_dummy.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp) + kde4_add_executable(${_target_NAME} "${_nogui}" "${_uninst}" ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp) + target_link_libraries(${_target_NAME} kdeinit_${_target_NAME}) +# endif (WIN32) + + if (WIN32) + target_link_libraries(${_target_NAME} ${QT_QTMAIN_LIBRARY}) + endif (WIN32) + +endmacro (KDE4_ADD_KDEINIT_EXECUTABLE) + +macro (KDE4_ADD_EXECUTABLE _target_NAME) + + kde4_check_executable_params( _SRCS _nogui _uninst ${ARGN}) + + set(_add_executable_param) + set(_type "GUI") + + # determine additional parameters for add_executable() + # for GUI apps, create a bundle on OSX + if (APPLE) + set(_add_executable_param MACOSX_BUNDLE) + endif (APPLE) + + # for GUI apps, this disables the additional console under Windows + if (WIN32) + set(_add_executable_param WIN32) + endif (WIN32) + + if (_nogui) + set(_type "NOGUI") + set(_add_executable_param) + endif (_nogui) + + if (_uninst) + set(_type "RUN_UNINSTALLED") + endif (_uninst) + + kde4_get_automoc_files(_automoc_FILES ${_SRCS}) + + if (KDE4_ENABLE_FINAL) + kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_SRCS}) + add_executable(${_target_NAME} ${_add_executable_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + else (KDE4_ENABLE_FINAL) + add_executable(${_target_NAME} ${_add_executable_param} ${_SRCS} ${_automoc_FILES}) + endif (KDE4_ENABLE_FINAL) + + kde4_handle_rpath_for_executable(${_target_NAME} ${_type}) + + if (WIN32) + target_link_libraries(${_target_NAME} ${QT_QTMAIN_LIBRARY}) + endif (WIN32) + +endmacro (KDE4_ADD_EXECUTABLE) + + +MACRO (KDE4_ADD_LIBRARY _target_NAME _lib_TYPE) +#is the first argument is "WITH_PREFIX" then keep the standard "lib" prefix, otherwise set the prefix empty + + set(_first_SRC ${_lib_TYPE}) + set(_add_lib_param) + + if (${_lib_TYPE} STREQUAL "STATIC") + set(_first_SRC) + set(_add_lib_param STATIC) + endif (${_lib_TYPE} STREQUAL "STATIC") + if (${_lib_TYPE} STREQUAL "SHARED") + set(_first_SRC) + set(_add_lib_param SHARED) + endif (${_lib_TYPE} STREQUAL "SHARED") + if (${_lib_TYPE} STREQUAL "MODULE") + set(_first_SRC) + set(_add_lib_param MODULE) + endif (${_lib_TYPE} STREQUAL "MODULE") + + kde4_get_automoc_files(_automoc_FILES ${_first_SRC} ${ARGN}) + + if (KDE4_ENABLE_FINAL) + kde4_create_final_files(${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp _separate_files ${_first_SRC} ${ARGN}) + add_library(${_target_NAME} ${_add_lib_param} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_final_cpp.cpp ${_separate_files} ${_automoc_FILES}) + else (KDE4_ENABLE_FINAL) + add_library(${_target_NAME} ${_add_lib_param} ${_first_SRC} ${ARGN} ${_automoc_FILES}) + endif (KDE4_ENABLE_FINAL) + + kde4_handle_rpath_for_library(${_target_NAME}) + + if (WIN32) + # for shared libraries a -DMAKE_target_LIB is required + string(TOUPPER ${_target_NAME} _symbol) + set(_symbol "MAKE_${_symbol}_LIB") + set_target_properties(${_target_NAME} PROPERTIES DEFINE_SYMBOL ${_symbol}) + endif (WIN32) + +ENDMACRO (KDE4_ADD_LIBRARY _target_NAME _lib_TYPE) + + +macro (KDE4_ADD_WIDGET_FILES _sources) + foreach (_current_FILE ${ARGN}) + + get_filename_component(_input ${_current_FILE} ABSOLUTE) + get_filename_component(_basename ${_input} NAME_WE) + set(_source ${CMAKE_CURRENT_BINARY_DIR}/${_basename}widgets.cpp) + set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}widgets.moc) + + # create source file from the .widgets file + add_custom_command(OUTPUT ${_source} + COMMAND ${KDE4_MAKEKDEWIDGETS_EXECUTABLE} + ARGS -o ${_source} ${_input} + MAIN_DEPENDENCY ${_input} DEPENDS ${_KDE4_MAKEKDEWIDGETS_DEP}) + + # create moc file + qt4_generate_moc(${_source} ${_moc} ) + + list(APPEND ${_sources} ${_source} ${_moc}) + + endforeach (_current_FILE) + +endmacro (KDE4_ADD_WIDGET_FILES) + +MACRO(KDE4_ADD_DCOP_SKELS) + MESSAGE(FATAL_ERROR "There is a call to KDE4_ADD_DCOP_SKELS() in the CMakeLists.txt for '${ARGV0}', but DCOP is no longer supported by KDE4. + Please remove it and port to DBUS.") +ENDMACRO(KDE4_ADD_DCOP_SKELS) + +MACRO(KDE4_ADD_DCOP_STUBS) + MESSAGE(FATAL_ERROR "There is a call to KDE4_ADD_DCOP_STUBS() in the CMakeLists.txt for '${ARGV0}', but DCOP is no longer supported by KDE4. + Please remove it and port to DBUS.") +ENDMACRO(KDE4_ADD_DCOP_STUBS) + +MACRO(KDE4_REMOVE_OBSOLETE_CMAKE_FILES) +# the files listed here will be removed by remove_obsoleted_cmake_files.cmake, Alex + install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake ) + set(module_install_dir ${DATA_INSTALL_DIR}/cmake/modules ) + + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "#generated by cmake, dont edit\n\n") + foreach ( _current_FILE ${ARGN}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "message(STATUS \"Removing ${module_install_dir}/${_current_FILE}\" )\n" ) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "exec_program( ${CMAKE_COMMAND} ARGS -E remove ${module_install_dir}/${_current_FILE} OUTPUT_VARIABLE _dummy)\n" ) + endforeach ( _current_FILE) + +ENDMACRO(KDE4_REMOVE_OBSOLETE_CMAKE_FILES) + +MACRO(KDE4_NO_ENABLE_FINAL _project_name) + if(KDE4_ENABLE_FINAL) + set(KDE4_ENABLE_FINAL OFF) + REMOVE_DEFINITIONS(-DKDE_USE_FINAL) + MESSAGE(STATUS "You used enable-final argument but \"${_project_name}\" doesn't support it. Try to fix compile it and remove KDE4_NO_ENABLE_FINAL macro. Thanks") + + endif(KDE4_ENABLE_FINAL) +ENDMACRO(KDE4_NO_ENABLE_FINAL _project_name) + + +FIND_PROGRAM(MSGFMT + NAMES gmsgfmt msgfmt + PATHS ${BIN_SEARCH_PATHES}) + +IF(MSGFMT) + EXECUTE_PROCESS(COMMAND ${MSGFMT} "--version" "2>&1" + OUTPUT_VARIABLE _msgout) + STRING(REGEX MATCH "GNU[\t ]gettext" _isgnu "${_msgout}") + IF (NOT _isgnu) + MESSAGE(STATUS "No gnu msgfmt found!") + SET(MSGFMT ":" CACHE STRING "Msgfmt program") + ELSE(NOT _isgnu) + MESSAGE(STATUS "Found gnu msgfmt: ${MSGFMT}") + ENDIF (NOT _isgnu) +ELSE(MSGFMT) + SET(MSGFMT ":" CACHE STRING "Msgfmt program") + MESSAGE( FATAL_ERROR "Could NOT find Msgfmt program") +ENDIF(MSGFMT) + +MACRO(ADD_POFILES packagename) + SET(_gmofiles) + FILE(GLOB _pofiles *.po) + + FOREACH(_current_po ${_pofiles}) + GET_FILENAME_COMPONENT(_name ${_current_po} NAME_WE) + STRING(REGEX REPLACE "^.*/([a-zA-Z]+)(\\.po)" "\\1" _lang "${_current_po}") + SET(_gmofile "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gmo") + ADD_CUSTOM_COMMAND(OUTPUT ${_gmofile} + COMMAND ${MSGFMT} + ARGS "-o" "${_gmofile}" "${_current_po}" + DEPENDS ${_current_po} + ) + SET(_gmofiles ${_gmofiles} ${_gmofile}) + INSTALL(FILES ${_gmofile} + DESTINATION ${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES + RENAME ${packagename}.mo) + ENDFOREACH(_current_po ${_pofiles}) + + ADD_CUSTOM_TARGET(translations ALL + DEPENDS ${_gmofiles}) + +ENDMACRO(ADD_POFILES) diff --git a/cmakemodules/MacroAddCompileFlags.cmake b/cmakemodules/MacroAddCompileFlags.cmake new file mode 100644 index 0000000..12038c0 --- /dev/null +++ b/cmakemodules/MacroAddCompileFlags.cmake @@ -0,0 +1,19 @@ +# - MACRO_ADD_COMPILE_FLAGS(<_target> "flags...") + +# Copyright (c) 2006, Oswald Buddenhagen, <ossi@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (MACRO_ADD_COMPILE_FLAGS _target _flg) + + GET_TARGET_PROPERTY(_flags ${_target} COMPILE_FLAGS) + if (_flags) + set(_flags "${_flags} ${_flg}") + else (_flags) + set(_flags "${_flg}") + endif (_flags) + SET_TARGET_PROPERTIES(${_target} PROPERTIES COMPILE_FLAGS "${_flags}") + +ENDMACRO (MACRO_ADD_COMPILE_FLAGS) diff --git a/cmakemodules/MacroAddFileDependencies.cmake b/cmakemodules/MacroAddFileDependencies.cmake new file mode 100644 index 0000000..9e55360 --- /dev/null +++ b/cmakemodules/MacroAddFileDependencies.cmake @@ -0,0 +1,20 @@ +# MACRO_ADD_FILE_DEPENDENCIES(<_file> depend_files...) + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (MACRO_ADD_FILE_DEPENDENCIES _file) + + GET_SOURCE_FILE_PROPERTY(_deps ${_file} OBJECT_DEPENDS) + if (_deps) + set(_deps ${_deps} ${ARGN}) + else (_deps) + set(_deps ${ARGN}) + endif (_deps) + + SET_SOURCE_FILES_PROPERTIES(${_file} PROPERTIES OBJECT_DEPENDS "${_deps}") + +ENDMACRO (MACRO_ADD_FILE_DEPENDENCIES) diff --git a/cmakemodules/MacroAddLinkFlags.cmake b/cmakemodules/MacroAddLinkFlags.cmake new file mode 100644 index 0000000..a10d39e --- /dev/null +++ b/cmakemodules/MacroAddLinkFlags.cmake @@ -0,0 +1,18 @@ +# - MACRO_ADD_LINK_FLAGS(<_target> "flags...") + +# Copyright (c) 2006, Oswald Buddenhagen, <ossi@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO (MACRO_ADD_LINK_FLAGS _target _flg) + + GET_TARGET_PROPERTY(_flags ${_target} LINK_FLAGS) + if (_flags) + set(_flags "${_flags} ${_flg}") + else (_flags) + set(_flags "${_flg}") + endif (_flags) + SET_TARGET_PROPERTIES(${_target} PROPERTIES LINK_FLAGS "${_flags}") + +ENDMACRO (MACRO_ADD_LINK_FLAGS) diff --git a/cmakemodules/MacroAdditionalCleanFiles.cmake b/cmakemodules/MacroAdditionalCleanFiles.cmake new file mode 100644 index 0000000..593182f --- /dev/null +++ b/cmakemodules/MacroAdditionalCleanFiles.cmake @@ -0,0 +1,21 @@ +# - MACRO_ADDITIONAL_CLEAN_FILES(files...) +# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] ) + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (MACRO_ADDITIONAL_CLEAN_FILES) + GET_DIRECTORY_PROPERTY(_tmp_DIR_PROPS ADDITIONAL_MAKE_CLEAN_FILES ) + + if (_tmp_DIR_PROPS) + set(_tmp_DIR_PROPS ${_tmp_DIR_PROPS} ${ARGN}) + else (_tmp_DIR_PROPS) + set(_tmp_DIR_PROPS ${ARGN}) + endif (_tmp_DIR_PROPS) + + SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${_tmp_DIR_PROPS}") +ENDMACRO (MACRO_ADDITIONAL_CLEAN_FILES) + diff --git a/cmakemodules/MacroBoolTo01.cmake b/cmakemodules/MacroBoolTo01.cmake new file mode 100644 index 0000000..63b9852 --- /dev/null +++ b/cmakemodules/MacroBoolTo01.cmake @@ -0,0 +1,20 @@ +# MACRO_BOOL_TO_01( VAR RESULT0 ... RESULTN ) +# This macro evaluates its first argument +# and sets all the given vaiables either to 0 or 1 +# depending on the value of the first one + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO(MACRO_BOOL_TO_01 FOUND_VAR ) + FOREACH (_current_VAR ${ARGN}) + IF(${FOUND_VAR}) + SET(${_current_VAR} 1) + ELSE(${FOUND_VAR}) + SET(${_current_VAR} 0) + ENDIF(${FOUND_VAR}) + ENDFOREACH(_current_VAR) +ENDMACRO(MACRO_BOOL_TO_01) diff --git a/cmakemodules/MacroEnsureOutOfSourceBuild.cmake b/cmakemodules/MacroEnsureOutOfSourceBuild.cmake new file mode 100644 index 0000000..ef4d525 --- /dev/null +++ b/cmakemodules/MacroEnsureOutOfSourceBuild.cmake @@ -0,0 +1,16 @@ +# - MACRO_ENSURE_OUT_OF_SOURCE_BUILD(<errorMessage>) +# MACRO_ENSURE_OUT_OF_SOURCE_BUILD(<errorMessage>) + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO (MACRO_ENSURE_OUT_OF_SOURCE_BUILD _errorMessage) + + STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource) + IF(insource) + MESSAGE(FATAL_ERROR "${_errorMessage}") + ENDIF(insource) + +ENDMACRO (MACRO_ENSURE_OUT_OF_SOURCE_BUILD) diff --git a/cmakemodules/MacroEnsureVersion.cmake b/cmakemodules/MacroEnsureVersion.cmake new file mode 100644 index 0000000..9d936ce --- /dev/null +++ b/cmakemodules/MacroEnsureVersion.cmake @@ -0,0 +1,35 @@ +# This macro compares version numbers of the form "x.y.z" +# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) +# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION +# where both have to be in a 3-part-version format, leading and trailing +# text is ok, e.g. +# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) +# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system + +# Copyright (c) 2006, David Faure, <faure@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) + + # parse the parts of the version string + STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") + STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") + STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") + + STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") + STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") + STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") + + # compute an overall version number which can be compared at once + MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") + MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") + + if (found_vers_num LESS req_vers_num) + set( ${var_too_old} FALSE ) + else (found_vers_num LESS req_vers_num) + set( ${var_too_old} TRUE ) + endif (found_vers_num LESS req_vers_num) + +ENDMACRO(MACRO_ENSURE_VERSION) diff --git a/cmakemodules/MacroLibrary.cmake b/cmakemodules/MacroLibrary.cmake new file mode 100644 index 0000000..3b80212 --- /dev/null +++ b/cmakemodules/MacroLibrary.cmake @@ -0,0 +1,18 @@ +# - include MacroLibrary offers a collection of macros which extend the built-in cmake commands +# OPTIONAL_FIND_PACKAGE( <name> [QUIT] ) + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +INCLUDE(MacroOptionalFindPackage) +INCLUDE(MacroOptionalAddSubdirectory) +INCLUDE(MacroAdditionalCleanFiles) +INCLUDE(MacroAddFileDependencies) +INCLUDE(MacroAddCompileFlags) +INCLUDE(MacroAddLinkFlags) +INCLUDE(MacroEnsureOutOfSourceBuild) +INCLUDE(MacroBoolTo01) +INCLUDE(MacroPushRequiredVars) +INCLUDE(MacroLogFeature) diff --git a/cmakemodules/MacroLogFeature.cmake b/cmakemodules/MacroLogFeature.cmake new file mode 100644 index 0000000..55f7b69 --- /dev/null +++ b/cmakemodules/MacroLogFeature.cmake @@ -0,0 +1,112 @@ +# This file defines the Feature Logging macros. +# +# MACRO_LOG_FEATURE(VAR FEATURE DESCRIPTION URL [REQUIRED [MIN_VERSION [COMMENTS]]]) +# Logs the information so that it can be displayed at the end +# of the configure run +# VAR : TRUE or FALSE, indicating whether the feature is supported +# FEATURE: name of the feature, e.g. "libjpeg" +# DESCRIPTION: description what this feature provides +# URL: home page +# REQUIRED: TRUE or FALSE, indicating whether the featue is required +# MIN_VERSION: minimum version number. empty string if unneeded +# COMMENTS: More info you may want to provide. empty string if unnecessary +# +# MACRO_DISPLAY_FEATURE_LOG() +# Call this to display the collected results. +# Exits CMake with a FATAL error message if a required feature is missing +# +# Example: +# +# INCLUDE(MacroLogFeature) +# +# FIND_PACKAGE(JPEG) +# MACRO_LOG_FEATURE(JPEG_FOUND "libjpeg" "Support JPEG images" "http://www.ijg.org" TRUE "3.2a" "") +# ... +# MACRO_DISPLAY_FEATURE_LOG() + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# Copyright (c) 2006, Allen Winter, <winter@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +IF (NOT _macroLogFeatureAlreadyIncluded) + SET(_file ${CMAKE_BINARY_DIR}/MissingRequirements.txt) + IF (EXISTS ${_file}) + FILE(REMOVE ${_file}) + ENDIF (EXISTS ${_file}) + + SET(_file ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) + IF (EXISTS ${_file}) + FILE(REMOVE ${_file}) + ENDIF (EXISTS ${_file}) + + SET(_file ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) + IF (EXISTS ${_file}) + FILE(REMOVE ${_file}) + ENDIF (EXISTS ${_file}) + + SET(_macroLogFeatureAlreadyIncluded TRUE) +ENDIF (NOT _macroLogFeatureAlreadyIncluded) + + +MACRO(MACRO_LOG_FEATURE _var _package _description _url ) # _required _minvers _comments) + + SET(_required "${ARGV4}") + SET(_minvers "${ARGV5}") + SET(_comments "${ARGV6}") + + IF (${_var}) + SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) + ELSE (${_var}) + IF (${_required} MATCHES "[Tt][Rr][Uu][Ee]") + SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/MissingRequirements.txt) + ELSE (${_required} MATCHES "[Tt][Rr][Uu][Ee]") + SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) + ENDIF (${_required} MATCHES "[Tt][Rr][Uu][Ee]") + ENDIF (${_var}) + + SET(_logtext "> ${_package}") + + IF (${_minvers} MATCHES ".*") + SET(_logtext "${_logtext}, ${_minvers}") + ENDIF (${_minvers} MATCHES ".*") + SET(_logtext "${_logtext}: ${_description}; ${_url};") + IF (${_comments} MATCHES ".*") + SET(_logtext "${_logtext}\n${_comments}") + ENDIF (${_comments} MATCHES ".*") + FILE(APPEND "${_LOGFILENAME}" "${_logtext}\n\n") + +ENDMACRO(MACRO_LOG_FEATURE) + + +MACRO(MACRO_DISPLAY_FEATURE_LOG) + + SET(_file ${CMAKE_BINARY_DIR}/MissingRequirements.txt) + IF (EXISTS ${_file}) + FILE(READ ${_file} _requirements) + MESSAGE(STATUS "\n----------------------------------------------------------------------------------\n-- The following list of REQUIRED packages could not be located on your system. --\n-- Please install them before continuing with this software installation. --\n----------------------------------------------------------------------------------\n${_requirements}----------------------------------------------------------------------------------") +# MESSAGE(STATUS "MISSING REQUIREMENTS\n${_requirements}\n") + FILE(REMOVE ${_file}) + MESSAGE(FATAL_ERROR "Exiting: Missing Requirements") + ENDIF (EXISTS ${_file}) + + SET(_summary "\n") + SET(_file ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) + IF (EXISTS ${_file}) + FILE(READ ${_file} _enabled) + FILE(REMOVE ${_file}) + SET(_summary "${_summary}----------------------------------------------------------------------------------\n-- The following list of OPTIONAL packages were located on your system. --\n-- You will have all the following features available from this software. --\n----------------------------------------------------------------------------------\n${_enabled}") +# SET(_summary "${_summary}Enabled Features:\n${_enabled}") + ENDIF (EXISTS ${_file}) + + SET(_file ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) + IF (EXISTS ${_file}) + FILE(READ ${_file} _disabled) + FILE(REMOVE ${_file}) + SET(_summary "${_summary}----------------------------------------------------------------------------------\n-- The following list of OPTIONAL packages could not be located on your system. --\n-- Please consider installing them to enable more features of this software. --\n----------------------------------------------------------------------------------\n${_disabled}") +# SET(_summary "${_summary}Disabled Features:\n${_disabled}") + ENDIF (EXISTS ${_file}) + MESSAGE(STATUS "${_summary}") + +ENDMACRO(MACRO_DISPLAY_FEATURE_LOG) diff --git a/cmakemodules/MacroOptionalAddSubdirectory.cmake b/cmakemodules/MacroOptionalAddSubdirectory.cmake new file mode 100644 index 0000000..b0d565c --- /dev/null +++ b/cmakemodules/MacroOptionalAddSubdirectory.cmake @@ -0,0 +1,27 @@ +# - MACRO_OPTIONAL_ADD_SUBDIRECTORY() combines ADD_SUBDIRECTORY() with an OPTION() +# MACRO_OPTIONAL_ADD_SUBDIRECTORY( <dir> ) +# If you use MACRO_OPTIONAL_ADD_SUBDIRECTORY() instead of ADD_SUBDIRECTORY(), +# this will have two effects +# 1 - CMake will not complain if the directory doesn't exist +# This makes sense if you want to distribute just one of the subdirs +# in a source package, e.g. just one of the subdirs in kdeextragear. +# 2 - If the directory exists, it will offer an option to skip the +# subdirectory. +# This is useful if you want to compile only a subset of all +# directories. + +# Copyright (c) 2007, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY _dir ) + GET_FILENAME_COMPONENT(_fullPath ${_dir} ABSOLUTE) + IF(EXISTS ${_fullPath}) + OPTION(BUILD_${_dir} "Build directory ${_dir}" TRUE) + IF(BUILD_${_dir}) + ADD_SUBDIRECTORY(${_dir}) + ENDIF(BUILD_${_dir}) + ENDIF(EXISTS ${_fullPath}) +ENDMACRO (MACRO_OPTIONAL_ADD_SUBDIRECTORY) diff --git a/cmakemodules/MacroOptionalFindPackage.cmake b/cmakemodules/MacroOptionalFindPackage.cmake new file mode 100644 index 0000000..816cdb7 --- /dev/null +++ b/cmakemodules/MacroOptionalFindPackage.cmake @@ -0,0 +1,28 @@ +# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION() +# MACRO_OPTIONAL_FIND_PACKAGE( <name> [QUIT] ) +# This macro is a combination of OPTION() and FIND_PACKAGE(), it +# works like FIND_PACKAGE(), but additionally it automatically creates +# an option name WITH_<name>, which can be disabled via the cmake GUI. +# or via -DWITH_<name>=OFF +# The standard <name>_FOUND variables can be used in the same way +# as when using the normal FIND_PACKAGE() + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +MACRO (MACRO_OPTIONAL_FIND_PACKAGE _name ) + OPTION(WITH_${_name} "Search for ${_name} package" ON) + if (WITH_${_name}) + FIND_PACKAGE(${_name} ${ARGN}) + else (WITH_${_name}) + set(${_name}_FOUND) + set(${_name}_INCLUDE_DIR) + set(${_name}_INCLUDES) + set(${_name}_LIBRARY) + set(${_name}_LIBRARIES) + endif (WITH_${_name}) +ENDMACRO (MACRO_OPTIONAL_FIND_PACKAGE) + diff --git a/cmakemodules/MacroPushRequiredVars.cmake b/cmakemodules/MacroPushRequiredVars.cmake new file mode 100644 index 0000000..650b566 --- /dev/null +++ b/cmakemodules/MacroPushRequiredVars.cmake @@ -0,0 +1,47 @@ +# this module defines two macros: +# MACRO_PUSH_REQUIRED_VARS() +# and +# MACRO_POP_REQUIRED_VARS() +# use these if you call cmake macros which use +# any of the CMAKE_REQUIRED_XXX variables +# +# Usage: +# MACRO_PUSH_REQUIRED_VARS() +# SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DSOME_MORE_DEF) +# CHECK_FUNCTION_EXISTS(...) +# MACRO_POP_REQUIRED_VARS() + +# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +MACRO(MACRO_PUSH_REQUIRED_VARS) + + IF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER) + SET(_PUSH_REQUIRED_VARS_COUNTER 0) + ENDIF(NOT DEFINED _PUSH_REQUIRED_VARS_COUNTER) + + MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}+1") + + SET(_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_INCLUDES}) + SET(_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_DEFINITIONS}) + SET(_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_LIBRARIES}) + SET(_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER} ${CMAKE_REQUIRED_FLAGS}) +ENDMACRO(MACRO_PUSH_REQUIRED_VARS) + +MACRO(MACRO_POP_REQUIRED_VARS) + +# don't pop more than we pushed + IF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0") + + SET(CMAKE_REQUIRED_INCLUDES ${_CMAKE_REQUIRED_INCLUDES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_DEFINITIONS ${_CMAKE_REQUIRED_DEFINITIONS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_LIBRARIES ${_CMAKE_REQUIRED_LIBRARIES_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + SET(CMAKE_REQUIRED_FLAGS ${_CMAKE_REQUIRED_FLAGS_SAVE_${_PUSH_REQUIRED_VARS_COUNTER}}) + + MATH(EXPR _PUSH_REQUIRED_VARS_COUNTER "${_PUSH_REQUIRED_VARS_COUNTER}-1") + ENDIF("${_PUSH_REQUIRED_VARS_COUNTER}" GREATER "0") + +ENDMACRO(MACRO_POP_REQUIRED_VARS) + diff --git a/cmakemodules/generatelibtoolfile.cmake b/cmakemodules/generatelibtoolfile.cmake new file mode 100644 index 0000000..d74ed21 --- /dev/null +++ b/cmakemodules/generatelibtoolfile.cmake @@ -0,0 +1,16 @@ + FILE(WRITE ${OUTPUTFILE} "# ${OUTPUTFILE} - a libtool library file, generated by cmake \n") + FILE(APPEND ${OUTPUTFILE} "# The name that we can dlopen(3).\n") + FILE(APPEND ${OUTPUTFILE} "dlname='${SONAME}'\n") + FILE(APPEND ${OUTPUTFILE} "# Names of this library\n") + FILE(APPEND ${OUTPUTFILE} "library_names='${SONAME} ${SONAME} ${SONAME}'\n") + FILE(APPEND ${OUTPUTFILE} "# The name of the static archive\n") + FILE(APPEND ${OUTPUTFILE} "old_library=''\n") + FILE(APPEND ${OUTPUTFILE} "# Libraries that this one depends upon.\n") + FILE(APPEND ${OUTPUTFILE} "dependency_libs=''\n") +# FILE(APPEND ${OUTPUTFILE} "dependency_libs='${${_target}_LIB_DEPENDS}'\n") + FILE(APPEND ${OUTPUTFILE} "# Version information.\ncurrent=0\nage=0\nrevision=0\n") + FILE(APPEND ${OUTPUTFILE} "# Is this an already installed library?\ninstalled=yes\n") + FILE(APPEND ${OUTPUTFILE} "# Should we warn about portability when linking against -modules?\nshouldnotlink=yes\n") + FILE(APPEND ${OUTPUTFILE} "# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n") + FILE(APPEND ${OUTPUTFILE} "# Directory that this library needs to be installed in:\n") + FILE(APPEND ${OUTPUTFILE} "libdir='${LIBDIR}'\n") diff --git a/cmakemodules/kde3uic.cmake b/cmakemodules/kde3uic.cmake new file mode 100644 index 0000000..0dbbbcf --- /dev/null +++ b/cmakemodules/kde3uic.cmake @@ -0,0 +1,20 @@ + + +# used internally by KDE3Macros.cmake +# neundorf@kde.org + + +EXECUTE_PROCESS(COMMAND ${KDE_UIC_EXECUTABLE} + -L ${KDE_UIC_PLUGIN_DIR} -nounload -tr tr2i18n + -impl ${KDE_UIC_H_FILE} + ${KDE_UIC_FILE} + OUTPUT_VARIABLE _uic_CONTENTS + ERROR_QUIET + ) + +STRING(REGEX REPLACE "tr2i18n\\(\"\"\\)" "QString::null" _uic_CONTENTS "${_uic_CONTENTS}" ) +STRING(REGEX REPLACE "tr2i18n\\(\"\", \"\"\\)" "QString::null" _uic_CONTENTS "${_uic_CONTENTS}" ) + +FILE(WRITE ${KDE_UIC_CPP_FILE} "#include <kdialog.h>\n#include <klocale.h>\n\n") +FILE(APPEND ${KDE_UIC_CPP_FILE} "${_uic_CONTENTS}") + diff --git a/cmakemodules/kdesvnMacros.cmake b/cmakemodules/kdesvnMacros.cmake new file mode 100644 index 0000000..29b99db --- /dev/null +++ b/cmakemodules/kdesvnMacros.cmake @@ -0,0 +1,50 @@ + +MACRO(KDESVN_CHECK_LINK_FLAG FLAGS VARIABLE) + IF(NOT DEFINED ${VARIABLE}) + TRY_COMPILE(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${CMAKE_ROOT}/Modules/DummyCXXFile.cxx + CMAKE_FLAGS -DCMAKE_EXE_LINKER_FLAGS="${FLAGS}" + OUTPUT_VARIABLE OUTPUT) + IF (${VARIABLE}) + MESSAGE(STATUS "Checking to see if linker accepts flag ${FLAGS} - yes") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the linker accepts the flag ${FLAGS} passed with " + "the following output:\n${OUTPUT}\n\n") + ELSE (${VARIABLE}) + MESSAGE(STATUS "Checking to see if linker accepts flag ${FLAGS} - no") + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Determining if the linker accepts the flag ${FLAGS} failed with " + "the following output:\n${OUTPUT}\n\n") + ENDIF (${VARIABLE}) + ENDIF(NOT DEFINED ${VARIABLE}) +ENDMACRO(KDESVN_CHECK_LINK_FLAG) + +# this macro is required to add libtools to normal build so +# we may debug our part from within build dir +# output name where +# _laname _soname ${LIBRARY_OUTPUT_PATH}/kde3 +MACRO(KDESVN_GENERATE_LIBTOOL_FILE _target) + GET_TARGET_PROPERTY(_target_location ${_target} LOCATION) + GET_FILENAME_COMPONENT(_laname ${_target_location} NAME_WE) + GET_FILENAME_COMPONENT(_soname ${_target_location} NAME) + IF(LIBRARY_OUTPUT_PATH) + SET(_laname ${LIBRARY_OUTPUT_PATH}/${_laname}.la) + ELSE(LIBRARY_OUTPUT_PATH) + SET(_laname ${CMAKE_CURRENT_BINARY_DIR}/${_laname}.la) + ENDIF(LIBRARY_OUTPUT_PATH) + IF(LIBRARY_OUTPUT_PATH) + SET(_libdir "'${LIBRARY_OUTPUT_PATH}/kde3'") + ELSE(LIBRARY_OUTPUT_PATH) + SET(_libdir "'${CMAKE_CURRENT_BUILD_DIR}/kde3'") + ENDIF(LIBRARY_OUTPUT_PATH) + ADD_CUSTOM_COMMAND(TARGET ${_target} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -DOUTPUTFILE:FILEPATH=${_laname} + -DSONAME:STRING=${_soname} + -DLIBDIR:STRING=${_libdir} + -P ${CMAKE_SOURCE_DIR}/cmakemodules/generatelibtoolfile.cmake + ) +ENDMACRO(KDESVN_GENERATE_LIBTOOL_FILE) diff --git a/cmakemodules/makedist.sh.in b/cmakemodules/makedist.sh.in new file mode 100755 index 0000000..2a77085 --- /dev/null +++ b/cmakemodules/makedist.sh.in @@ -0,0 +1,36 @@ +#!/bin/sh +VERSION=@VERSION@ +SRCROOT=@CMAKE_SOURCE_DIR@ +BUILDDIR=@CMAKE_BINARY_DIR@ +PROJECT=@PROJECT_NAME@ +GENTOO_VERSION=@GENTOO_VERSION@ + +EXCLUDE="@DIST_EXCLUDE@" +INCLUDE="@DIST_INCLUDE@" +EXPORT_DIR="${PROJECT}-${VERSION}" + +if [ ! -d ${SRCROOT}/.svn ]; then + echo "This script must run for a svn dir!" + exit 1 +fi + +echo "Exporting source tree" +svn export "${SRCROOT}" ${EXPORT_DIR} + +echo "Copy required files to export" +for i in $INCLUDE ; do + echo " $i" + cp ${BUILDDIR}/$i ${EXPORT_DIR} +done + +echo "Removing not needed stuff" +for i in $EXCLUDE ; do + echo " $i" + rm -rf $EXPORT_DIR/$i +done + +echo "Generating archive" +tar cjf ${BUILDDIR}/${PROJECT}-${VERSION}.tar.bz2 ${EXPORT_DIR} + +echo "Cleaning up" +rm -rf ${EXPORT_DIR} diff --git a/cmakemodules/package_messages.sh.in b/cmakemodules/package_messages.sh.in new file mode 100755 index 0000000..f062fca --- /dev/null +++ b/cmakemodules/package_messages.sh.in @@ -0,0 +1,84 @@ +#!/bin/sh + +# little helper script for regenerating translation files. Mostly taken from cvs.sh from kde-autotool environment +# adapted to a cmake build environment and removed a lot not realy needed stuff +#EXTRACTRC=@EXTRACTRC@ +#PREPARETIPS=@PREPARETIPS@ +MESSAGES_DIR=@MESSAGES_DIR@ +SOURCE_DIR=@CMAKE_SOURCE_DIR@ +MAKE=make +POFILES="@POFILES@" +podir="${SOURCE_DIR}/po" + + +cd ${SOURCE_DIR} +rm -rf po.backup +mkdir po.backup + +for i in `ls -1 po/*.pot 2>/dev/null | sed -e "s#po/##"`; do + egrep -v '^#([^:]|$)' po/$i | egrep '^.*[^ ]+.*$' | grep -v "\"POT-Creation" > po.backup/$i + cp po/$i po.backup/backup_$i + touch -r po/$i po.backup/backup_$i + rm po/$i +done + +podir=${podir:-$PWD/po} +#files=`find . -name Makefile.am | xargs egrep -l '^messages:' ` +#dirs=`for i in $files; do echo \`dirname $i\`; done` +dirs=${MESSAGES_DIR} +tmpname="$PWD/messages.log" +if test -z "$EXTRACTRC"; then EXTRACTRC=extractrc ; fi +if test -z "$PREPARETIPS"; then PREPARETIPS=preparetips ; fi +export EXTRACTRC PREPARETIPS + +for subdir in $dirs; do + test -z "$VERBOSE" || echo "Making messages in $subdir" + (cd $subdir + echo -e 'i18n("_: NAME OF TRANSLATORS\\n"\n"Your names")\ni18n("_: EMAIL OF TRANSLATORS\\n"\n"Your emails")' > _translatorinfo.cpp + $EXTRACTRC `find . -name \*.ui -o -name \*.rc` > rc.cpp + XGETTEXT="${XGETTEXT:-xgettext} -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale -x @KDE3_INCLUDE_DIR@/kde.pot" + find . -name '*.cpp' | xargs ${XGETTEXT} _translatorinfo.cpp -o ${podir}/@PROJECT_NAME@.pot + find . -name '*.ui.h' | xargs ${XGETTEXT} _translatorinfo.cpp -j -o ${podir}/@PROJECT_NAME@.pot + ) 2>&1 | grep -v '^make\[1\]' > $tmpname + test -s $tmpname && { echo $subdir ; cat "$tmpname"; } + test -f $subdir/rc.cpp && rm -f $subdir/rc.cpp + rm -f $subdir/_translatorinfo.cpp +done +rm -f $tmpname +for i in `ls -1 po.backup/*.pot 2>/dev/null | sed -e "s#po.backup/##" | egrep -v '^backup_'`; do + test -f po/$i || echo "disappeared: $i" +done +for i in `ls -1 po/*.pot 2>/dev/null | sed -e "s#po/##"`; do + msgmerge -q -o po/$i po/$i po/$i + egrep -v '^#([^:]|$)' po/$i | egrep '^.*[^ ]+.*$' | grep -v "\"POT-Creation" > temp.pot + if test -f po.backup/$i && test -n "`diff temp.pot po.backup/$i`"; then + echo "will update $i" + msgmerge -q po.backup/backup_$i po/$i > temp.pot + mv temp.pot po/$i + else + if test -f po.backup/backup_$i; then + test -z "$VERBOSE" || echo "I'm restoring $i" + mv po.backup/backup_$i po/$i + rm po.backup/$i + else + echo "will add $i" + fi + fi +done +rm -f temp.pot +rm -rf po.backup + +echo Merging messages +for cat in $POFILES; do + msgmerge -o $cat.new $cat @CMAKE_SOURCE_DIR@/po/@PROJECT_NAME@.pot + if test -s $cat.new; then + grep -v "\"POT-Creation" $cat.new > $cat.new.2 + grep -v "\"POT-Creation" $cat >> $cat.new.1 + if diff $cat.new.1 $cat.new.2; then + rm $cat.new + else + mv $cat.new $cat + fi + rm -f $cat.new.1 $cat.new.2 + fi +done diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..e040792 --- /dev/null +++ b/config.h.in @@ -0,0 +1,4 @@ +#cmakedefine APPLICATION_VERSION "@APPLICATION_VERSION@" +#cmakedefine HAVE_MANDRAKE @MANDRAKE@ +#cmakedefine APPLICATION_INTERNAL_VERSION @APPLICATION_INTERNAL_VERSION@ +#cmakedefine KBFX_LIB_INSTALL_DIR "@KBFX_LIB_INSTALL_DIR@" diff --git a/configdialog/CMakeLists.txt b/configdialog/CMakeLists.txt new file mode 100644 index 0000000..c65e04b --- /dev/null +++ b/configdialog/CMakeLists.txt @@ -0,0 +1,57 @@ +SET(kbfxconfigappsrc + main.cpp + kbfxconfigapp.cpp + ) + +SET(kbfxconfigappui + kbfxthemeinfo.ui + kbfxconfigdlgbutton.ui + kbfxconfigdlgmain.ui + kbfxconfigdlgthemes.ui + kbfxconfigdlgabout.ui + kbfxconfigdlgstyle.ui + kbfxconfigdlgtooltip.ui + kbfxconfigdlgfonts-old.ui + kbfxconfigdlgplugins.ui + kbfxconfigdlglayout.ui + ) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${kbfxconfigappsrc}) + + KDE3_ADD_UI_FILES(kbfxconfigappsrc ${kbfxconfigappui}) + + KDE3_ADD_EXECUTABLE(kbfxconfigapp ${kbfxconfigappsrc}) + + TARGET_LINK_LIBRARIES(kbfxconfigapp + kbfxdata + kbfxcommon + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${kbfxconfigappsrc}) + + KDE4_ADD_UI3_FILES(kbfxconfigappsrc ${kbfxconfigappui}) + + KDE4_ADD_EXECUTABLE(kbfxconfigapp ${kbfxconfigappsrc}) + + TARGET_LINK_LIBRARIES(kbfxconfigapp + kbfxdata + kbfxcommon + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxconfigapp + RUNTIME DESTINATION ${BIN_INSTALL_DIR}) + +INSTALL(FILES kbfxconfigappui.rc DESTINATION ${DATA_INSTALL_DIR}/kbfxconfigapp) +INSTALL(FILES kbfxconfigapp.desktop kbfx_theme.desktop DESTINATION ${XDG_APPS_DIR}) +INSTALL(FILES kbfx_install_theme.desktop kbfx_prepare_theme.desktop + DESTINATION ${DATA_INSTALL_DIR}/konqueror/servicemenus) +INSTALL(FILES x-kbfxtheme.desktop + DESTINATION ${MIME_INSTALL_DIR}/application) diff --git a/configdialog/kbfx_install_theme.desktop b/configdialog/kbfx_install_theme.desktop new file mode 100644 index 0000000..9406742 --- /dev/null +++ b/configdialog/kbfx_install_theme.desktop @@ -0,0 +1,22 @@ +[Desktop Entry] +Encoding=UTF-8 +ServiceTypes=application/x-kbfxtheme +Actions=kbfx_install_theme + +[Desktop Action kbfx_install_theme] +Icon=kbfxconfigapp +Exec=kbfxconfigapp --install %u +Name=Install KBFX Theme Package +Name[bg]=Инсталиране на пакета KBFX Theme +Name[da]=Installér KBFX-temapakke +Name[de]=KBFX Theme-Paket installieren +Name[el]=Εγκατάσταση του πακέτου θέματος KBFX +Name[es]=Instalar paquete con el tema KBFX +Name[et]=KBFX teemapaketi paigaldamine +Name[fr]=Installer le paquet des thèmes KBFX +Name[ja]=KBFX テーマパッケージをインストール +Name[nl]=KBFX-themapakket installeren +Name[pt]=Instalar o Pacote de Tema do KBFX +Name[pt_BR]=Instalar Pacote do Tema KBFX +Name[sv]=Installera KBFX-temapaket + diff --git a/configdialog/kbfx_prepare_theme.desktop b/configdialog/kbfx_prepare_theme.desktop new file mode 100644 index 0000000..f510fc5 --- /dev/null +++ b/configdialog/kbfx_prepare_theme.desktop @@ -0,0 +1,23 @@ +[Desktop Entry] +Encoding=UTF-8 +ServiceTypes=inode/directory +Actions=kbfx_prepare_theme + +[Desktop Action kbfx_prepare_theme] +Icon=kbfxconfigapp +Exec=kbfxconfigapp --prepare %u +Name=Prepare KBFX Theme Package +Name[bg]=Подготовка на пакета KBFX Theme +Name[da]=Opret KBFX-temapakke +Name[de]=KBFX Theme-Paket vorbereiten +Name[el]=Προετοιμασία του πακέτου θέματος KBFX +Name[es]=Preparar paquete con el tema KBFX +Name[et]=KBFX teemapaketi ettevalmistamine +Name[fr]=Preparer le paquet des thèmes KBFX +Name[ga]=Ullmhaigh Pacáiste Téama KBFX +Name[ja]=KBFX テーマパッケージを準備 +Name[nl]=KBFX-themapakket voorbereiden +Name[pt]=Preparar o Pacote de Tema do KBFX +Name[pt_BR]=Preparar Pacote do Tema KBFX +Name[sv]=Skapa KBFX-temapaket + diff --git a/configdialog/kbfx_theme.desktop b/configdialog/kbfx_theme.desktop new file mode 100644 index 0000000..50b3b37 --- /dev/null +++ b/configdialog/kbfx_theme.desktop @@ -0,0 +1,18 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=KBFX Theme Installer +Name[de]=Installations von KBFX-Themes +Name[el]=Εγκατάσταση θέματος KBFX +Name[et]=KBFX teema paigaldaja +Name[fr]=Outil d'installation des thèmes KBFX +Name[ja]=KBFX テーマインストーラ +Name[nl]=KBFX-thema-installatie +Name[pt]=Instalador de Temas do KBFX +Name[pt_BR]=Instalador de Temas do KBFX +Name[sv]=KBFX-temainstallation +Exec=kbfxconfigapp --install %u +Icon=kbfxconfigapp +Type=Application +MimeType=application/x-kbfxtheme +NoDisplay=true + diff --git a/configdialog/kbfxconfigapp.cpp b/configdialog/kbfxconfigapp.cpp new file mode 100644 index 0000000..ac17881 --- /dev/null +++ b/configdialog/kbfxconfigapp.cpp @@ -0,0 +1,416 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxconfigapp.h" + +KbfxConfigApp::KbfxConfigApp ( QWidget* parent, const char* name, WFlags fl ) + : KbfxConfigDlgMain ( parent,name,fl ) +{ +// m_KbfxVersion = tr2i18n("<p align='center'>Running KBFX version: " APPLICATION_VERSION "</p>"); + m_KbfxVersion = tr2i18n ( "<p align='center'>%1</p>" ); + m_KbfxVersion2 = tr2i18n ( "You are running: <b>KBFX " APPLICATION_VERSION "</b>" ); + m_KbfxNewsBrowserError = tr2i18n ( "<br><p align='center'><font color='#ff0000'>" + "The connection to the KBFX News Section on www.kbfx.org is broken." + "</font><br><br>" + "If you want you can check the latest news for KBFX from here:" + "<br><a href='http://www.kbfx.org/'>KBFX News</a></p>" ); + m_KbfxLogoButton = tr2i18n ( "<font size='+1'><b>KBFX start button</b><br></font>" + "<b>Tip! </b>" + "You have 3 options to select for your KBFX start button." + "You have to select <i>(Normal, Pressed, Hover)</i> images. <br>" + "Down below you can also see a preview of the images you have selected." ); + m_KbfxLogoAbout = tr2i18n ( "<font size='+1'><b>About KBFX</b><br></font>" + "<b>Tip! </b>" + "Here you can find information about the KBFX Project and all the people involved in it." ); + m_KbfxLogoFonts = tr2i18n ( "<font size='+1'><b>KBFX font settings</b><br></font>" + "<b>Tip! </b>" + "Here you can set the fonts of the current theme.<br>" + "If you don't have any 'kbfxfontrc' file don't worry about that.<br>" + "When done just hit 'Apply' button and KBFX will save the 'kbfxfontrc' file." ); + m_KbfxLogoLayout = tr2i18n ( "<font size='+1'><b>KBFX Layout</b><br></font>" + "<b>Tip! </b>" + "Here you can configure the Look and Feel of your KBFX menu.<br>" + "The most important settings that are used with the '<strong>Make it...</strong>' buttons are marked with '<strong>*</strong>'<br>" + "Have in mind that the Layout of the theme also depends on the sizes of the images!<br>" ); + m_KbfxLogoPlugins = tr2i18n ( "<font size='+1'><b>KBFX Plugins</b><br></font>" + "<b>Tip! </b>" + "Here you can select what plugins will be enabled and in which panel of the KBFX menu." ); + m_KbfxLogoStyle = tr2i18n ( "<font size='+1'><b>Menu Type</b><br></font>" + "<b>Tip! </b>" + "Please select which kind of menu you would like to use." ); + m_KbfxLogoThemes = tr2i18n ( "<font size='+1'><b>KBFX Themes</b><br></font>" + "<b>Tip! </b>" + "To keep it simple place all your themes inside one folder.<br>" + "Then create different folders inside that folder with different names.<br>" + "KBFX will then read those folders as themes." ); + m_KbfxLogoTooltip = tr2i18n ( "<font size='+1'><b>KBFX tooltip settings</b><br></font>" + "<b>Tip! </b>" + "Here you can configure the behaviour of KBFX's own tooltip." ); + m_KbfxNewsBrowserAddress = "http://www.kbfx.org/news/"; + InitForm(); +} + +KbfxConfigApp::~KbfxConfigApp() +{} + +void KbfxConfigApp::InitForm() +{ + lb_Main->clear(); + + /* initialize Themes page */ + lb_Main->insertItem ( img_themes, tr2i18n ( "Themes" ), THEMES ); + KbfxConfigDlgThemes *pageThemes = new KbfxConfigDlgThemes(); + ws_Main->addWidget ( pageThemes, THEMES ); + connect ( this, SIGNAL ( KbfxConfigDlgThemesChanged() ), + pageThemes, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgThemesChanged(); + connect ( pageThemes->KbfxGetMoreThemes, SIGNAL ( clicked() ), + this, SLOT ( KbfxGetMoreThemesClicked() ) ); + connect ( this, SIGNAL ( KbfxThemeDoInstall ( QString & ) ), + pageThemes, SLOT ( KbfxThemeInstall ( QString & ) ) ); + + /* initialize Button page */ + lb_Main->insertItem ( img_button, tr2i18n ( "Start Button" ), BUTTON ); + KbfxConfigDlgButton *pageButton = new KbfxConfigDlgButton(); + ws_Main->addWidget ( pageButton, BUTTON ); + connect ( this, SIGNAL ( KbfxConfigDlgButtonChanged() ), + pageButton, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgButtonChanged(); + + /* initialize Fonts page */ + lb_Main->insertItem ( img_fonts, tr2i18n ( "Fonts" ), FONTS ); + KbfxConfigDlgFonts *pageFonts = new KbfxConfigDlgFonts(); + ws_Main->addWidget ( pageFonts, FONTS ); + connect ( this, SIGNAL ( KbfxConfigDlgFontsChanged() ), + pageFonts, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgFontsChanged(); + + /* initialize Layout Page */ + lb_Main->insertItem ( img_search, tr2i18n ( "Layout" ), LAYOUT ); + KbfxConfigDlgLayout *pageLayout = new KbfxConfigDlgLayout(); + ws_Main->addWidget ( pageLayout, LAYOUT ); + connect ( this, SIGNAL ( KbfxConfigDlgLayoutChanged() ), + pageLayout, SLOT ( ChangeForm() ) ); + connect ( this, SIGNAL ( KbfxConfigDlgLayoutLeft() ), + pageLayout, SLOT ( LayoutFormLeft() ) ); + emit KbfxConfigDlgLayoutChanged(); + + /* initialize Plugins Page */ + lb_Main->insertItem ( img_plugins, tr2i18n ( "Plugins" ), PLUGINS ); + KbfxConfigDlgPlugins *pagePlugins = new KbfxConfigDlgPlugins(); + ws_Main->addWidget ( pagePlugins, PLUGINS ); + connect ( this, SIGNAL ( KbfxConfigDlgPluginsChanged() ), + pagePlugins, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgPluginsChanged(); + + /* initialize Tooltip page */ + lb_Main->insertItem ( img_tooltip, tr2i18n ( "Tooltip" ), TOOLTIP ); + KbfxConfigDlgTooltip *pageTooltip = new KbfxConfigDlgTooltip(); + ws_Main->addWidget ( pageTooltip, TOOLTIP ); + connect ( this, SIGNAL ( KbfxConfigDlgTooltipChanged() ), + pageTooltip, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgTooltipChanged(); + + /* initialize Menu Style page */ + lb_Main->insertItem ( img_style, tr2i18n ( "Menu Style" ), STYLE ); + KbfxConfigDlgStyle *pageStyle = new KbfxConfigDlgStyle(); + ws_Main->addWidget ( pageStyle, STYLE ); + connect ( this, SIGNAL ( KbfxConfigDlgStyleChanged() ), + pageStyle, SLOT ( ChangeForm() ) ); + emit KbfxConfigDlgStyleChanged(); + + /* initialize About page */ + lb_Main->insertItem ( img_about, tr2i18n ( "About" ), ABOUT ); + KbfxConfigDlgAbout *pageAbout = new KbfxConfigDlgAbout(); + ws_Main->addWidget ( pageAbout,ABOUT ); + pageAbout->KbfxLabelVersion->setText ( m_KbfxVersion2 ); + + connect ( btn_Default, SIGNAL ( clicked() ), + this, SLOT ( btn_DefaultClicked() ) ); + connect ( btn_Help, SIGNAL ( clicked() ), + this, SLOT ( btn_HelpClicked() ) ); + connect ( lb_Main, SIGNAL ( highlighted ( int ) ), + this, SLOT ( KbfxMenuItemChanged ( int ) ) ); + connect ( btn_SaveApply, SIGNAL ( clicked() ), + this, SLOT ( btn_SaveApplyClicked() ) ); + + m_KbfxPage = THEMES; + lb_Main->setCurrentItem ( THEMES ); + ws_Main->raiseWidget ( THEMES ); +} + +/* process help for each page */ +void KbfxConfigApp::btn_HelpClicked() +{ + if ( m_KbfxPage == THEMES ) + kapp->invokeHelp ( "kbfx_themes", "kbfxconfigapp" ); + if ( m_KbfxPage == BUTTON ) + kapp->invokeHelp ( "kbfx_button", "kbfxconfigapp" ); + if ( m_KbfxPage == FONTS ) + kapp->invokeHelp ( "kbfx_fonts", "kbfxconfigapp" ); + if ( m_KbfxPage == LAYOUT ) + kapp->invokeHelp ( "kbfx_layout", "kbfxconfigapp" ); + if ( m_KbfxPage == PLUGINS ) + kapp->invokeHelp ( "kbfx_plugins", "kbfxconfigapp" ); + if ( m_KbfxPage == TOOLTIP ) + kapp->invokeHelp ( "kbfx_tooltip", "kbfxconfigapp" ); + if ( m_KbfxPage == STYLE ) + kapp->invokeHelp ( "kbfx_style", "kbfxconfigapp" ); + if ( m_KbfxPage == ABOUT) + kapp->invokeHelp ( "kbfx_about", "kbfxconfigapp" ); +} + +/* process default options for each page */ +void KbfxConfigApp::btn_DefaultClicked() +{ + switch ( ws_Main->id ( ws_Main->visibleWidget() ) ) + { + case THEMES: /* Themes page */ + { + ConfigInit().m_SpinxThemeBasePath = ConfigInit().m_SpinxThemeBasePathDefault; + ConfigInit().m_UserSpinxThemeBasePath = ConfigInit().m_UserSpinxThemeBasePathDefault; + ConfigInit().m_SpinxThemeName = ConfigInit().m_SpinxThemeNameDefault; + ConfigInit().m_SpinxDudeBlink = ConfigInit().m_SpinxDudeBlinkDefault; + ConfigInit().m_SpinxDudeImage = ConfigInit().m_SpinxDudeImageDefault; + ConfigInit().m_KbfxWatcher = ConfigInit().m_KbfxWatcherDefault; + ConfigInit().m_KbfxShowOldThemes = ConfigInit().m_KbfxShowOldThemesDefault; + emit KbfxConfigDlgThemesChanged(); + break; + } + case BUTTON: /* Button page */ + { + ConfigInit().m_KbfxNormalButtonPath = ConfigInit().m_KbfxNormalButtonPathDefault; + ConfigInit().m_KbfxHoverButtonPath = ConfigInit().m_KbfxHoverButtonPathDefault; + ConfigInit().m_KbfxPressedButtonPath = ConfigInit().m_KbfxPressedButtonPathDefault; + ConfigInit().m_ToolBarResize = ConfigInit().m_ToolBarResizeDefault; + ConfigInit().m_fadeTime = ConfigInit().m_fadeTimeDefault; + emit KbfxConfigDlgButtonChanged(); + break; + } + case FONTS: /* Fonts page */ + { + ConfigInit().readFontrc ( ConfigInit().m_SpinxThemeBasePath, + ConfigInit().m_SpinxThemeName, + FALSE ); + emit KbfxConfigDlgFontsChanged(); + break; + } + case STYLE: /* Style page */ + { + ConfigInit().m_KbfxMenuType = ConfigInit().m_KbfxMenuTypeDefault; + emit KbfxConfigDlgStyleChanged(); + break; + } + case TOOLTIP: /* Tooltip page */ + { + ConfigInit().m_ToolTip = ConfigInit().m_ToolTipDefault; + ConfigInit().m_ToolTipAnimation = ConfigInit().m_ToolTipAnimationDefault; + ConfigInit().m_ToolTipText = ConfigInit().m_ToolTipTextDefault; + ConfigInit().m_ToolTipAvatar = ConfigInit().m_ToolTipAvatarDefault; + ConfigInit().m_SpinxTooltipDudebox = ConfigInit().m_SpinxTooltipDudeboxDefault; + ConfigInit().m_SpinxTooltipMask = ConfigInit().m_SpinxTooltipMaskDefault; + ConfigInit().m_SpinxTooltipWindow = ConfigInit().m_SpinxTooltipWindowDefault; + ConfigInit().m_SpinxTooltipLogo = ConfigInit().m_SpinxTooltipLogoDefault; + emit KbfxConfigDlgTooltipChanged(); + break; + } + case LAYOUT: /* Layout page */ + { + ConfigInit().readThemerc ( ConfigInit().m_SpinxThemeBasePath, + ConfigInit().m_SpinxThemeName, + FALSE ); + emit KbfxConfigDlgLayoutChanged(); + break; + } + case PLUGINS: /* Plugins page */ + { + ConfigInit().m_pluginsLeft = ConfigInit().m_pluginsLeftDefault; + ConfigInit().m_pluginsRight = ConfigInit().m_pluginsRightDefault; + emit KbfxConfigDlgPluginsChanged(); + break; + } + case ABOUT: /* About page */ + { + KMessageBox::information ( 0, tr2i18n ( "No default settings here ;)" ) ); + break; + } + default: /* Default Action Switch should never be reached */ + kdDebug() << "Default action switch for default clicked..." << endl; + } +} + +void KbfxConfigApp::KbfxMenuItemChanged ( int index ) +{ + /* + * switch is used in case we want to add special code + * for certain page before raiseWidget is called + */ + + + if( m_KbfxPage == LAYOUT ) + { + emit KbfxConfigDlgLayoutLeft(); + } + + m_KbfxPage = index; + + switch ( index ) + { + case THEMES: /* Themes page */ + { + KbfxLogoText->setText(m_KbfxLogoThemes); + ws_Main->raiseWidget ( THEMES ); + emit KbfxConfigDlgThemesChanged(); + break; + } + case BUTTON: /* Button page */ + { + KbfxLogoText->setText(m_KbfxLogoButton); + ws_Main->raiseWidget ( BUTTON ); + emit KbfxConfigDlgButtonChanged(); + break; + } + case FONTS: /* Fonts page */ + { + KbfxLogoText->setText(m_KbfxLogoFonts); + ws_Main->raiseWidget ( FONTS ); + emit KbfxConfigDlgFontsChanged(); + break; + } + case STYLE: /* Style page */ + { + KbfxLogoText->setText(m_KbfxLogoStyle); + ws_Main->raiseWidget ( STYLE ); + emit KbfxConfigDlgStyleChanged(); + break; + } + case TOOLTIP: /* Tooltip page */ + { + KbfxLogoText->setText(m_KbfxLogoTooltip); + ws_Main->raiseWidget ( TOOLTIP ); + emit KbfxConfigDlgTooltipChanged(); + break; + } + case LAYOUT: /* Layout page */ + { + KbfxLogoText->setText(m_KbfxLogoLayout); + ws_Main->raiseWidget ( LAYOUT ); + emit KbfxConfigDlgLayoutChanged(); + break; + } + case PLUGINS: /* Plugins page */ + { + KbfxLogoText->setText(m_KbfxLogoPlugins); + ws_Main->raiseWidget ( PLUGINS ); + break; + } + case ABOUT: /* About page */ + { + KbfxLogoText->setText(m_KbfxLogoAbout); + ws_Main->raiseWidget ( ABOUT ); + break; + } + default: /* default action switch should never be reached */ + kdDebug() << "Default action switch for menu changed..." << endl; + } +} + +void KbfxConfigApp::KbfxNewsBrowserOpenURLRequest ( const KURL &url, const KParts::URLArgs & ) +{ + kdDebug() << "Starting Konqueror ... "<< endl; + KRun::runCommand ( "konqueror " + url.url() ); + + return ; +} + +void KbfxConfigApp::KbfxNewsBrowserCompleted() +{ + kio->KbfxKioDownloadEnd(); +} + +void KbfxConfigApp::browserInit() +{ + /* initialize NewsBrowser widget */ + kio = new KbfxKioDownload(); + connect ( kio, SIGNAL ( KbfxKioDownloadReady() ), + this, SLOT ( KbfxNewsBrowserLoad() ) ); + kio->KbfxKioDownloadStart ( m_KbfxNewsBrowserAddress ); +} + +void KbfxConfigApp::KbfxNewsBrowserLoad() +{ + if ( kio->KbfxBrowserError() ) KBFXNewsBrowser->setText ( m_KbfxNewsBrowserError ); + else + { + browser = new KHTMLPart ( KBFXNewsBrowser ); + browser->openURL ( kio->KbfxBrowserTmpFile() ); + browser->view()->resize ( KBFXNewsBrowser->width(), KBFXNewsBrowser->height() ); + browser->view()->setVScrollBarMode ( QScrollView::AlwaysOff ); + browser->view()->setHScrollBarMode ( QScrollView::AlwaysOff ); + browser->view()->setFocusPolicy ( QWidget::NoFocus ); + browser->view()->show(); + + connect ( browser->browserExtension(), + SIGNAL ( openURLRequest ( const KURL &, const KParts::URLArgs & ) ), + this, + SLOT ( KbfxNewsBrowserOpenURLRequest ( const KURL &, const KParts::URLArgs & ) ) ); + connect ( browser, SIGNAL ( completed() ), + this, SLOT ( KbfxNewsBrowserCompleted() ) ); + } +} + +void KbfxConfigApp::KbfxGetMoreThemesClicked() +{ + KRun::runCommand ( "konqueror 'http://www.kbfx.org/news/new_themes.html'" ); + + return ; +} + +void KbfxConfigApp::KbfxThemeInstall ( QString & themeURL ) +{ + emit KbfxThemeDoInstall ( themeURL ); +} + + +void KbfxConfigApp::btn_SaveApplyClicked() +{ + if( m_KbfxPage == LAYOUT ) + { + emit KbfxConfigDlgLayoutLeft(); + } + + ConfigInit().write(); + ConfigInit().writeThemerc ( ConfigInit().m_SpinxThemeName ); + ConfigInit().writeFontrc ( ConfigInit().m_SpinxThemeName ); + + + DCOPRef m_kickerkbfxDevelnterface ( "kicker","KBFXInterface" ); + m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" ); + +/* +// m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" ); +// DCOPRef m_kickerPanel("kicker","Panel"); + DCOPRef m_kickerPanel("kicker","kicker"); + m_kickerPanel.call("restart()"); +*/ +} + +#include "kbfxconfigapp.moc" diff --git a/configdialog/kbfxconfigapp.desktop b/configdialog/kbfxconfigapp.desktop new file mode 100644 index 0000000..bac0e2c --- /dev/null +++ b/configdialog/kbfxconfigapp.desktop @@ -0,0 +1,36 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=KBFX Configurator +Name[da]=KBFX-indstilling +Name[de]=KBFX einrichten +Name[el]=Ρύθμιση KBFX +Name[es]=Cofigurador de KBFX +Name[et]=KBFX seadistaja +Name[fr]=Configuration de KBFX +Name[ga]=Cumraitheoir KBFX +Name[ja]=KBFX 設定ツール +Name[pt]=Configuração do KBFX +Name[pt_BR]=Configurador do KBFX +Name[sv]=KBFX-inställning +Comment=KBFX Configuration Utility +Comment[bg]=Настройка на KBFX +Comment[br]=Ostilh kefluniadur KBFX +Comment[da]=KBFX-indstillingsværktøj +Comment[de]=KBFX Konfigurationswerkzeug +Comment[el]=Εργαλείο ρύθμισης του KBFX +Comment[es]=Utilidad de configuración de KBFX +Comment[et]=KBFX seadistamistööriist +Comment[fr]=Outil de configuration des services KBFX +Comment[ga]=Uirlis Chumraíochta KBFX +Comment[gl]=Ferramenta de Configurazón de KBFX +Comment[ja]=KBFX 設定ユーティリティ +Comment[nl]=KBFX-configuratieprogramma +Comment[pt]=Utilitário de Configuração do KBFX +Comment[pt_BR]=Utilitário para Configuração do KBFX +Comment[sv]=KBFX-inställningsverktyg +Icon=kbfxconfigapp +Exec=kbfxconfigapp +Type=Application +Categories=Qt;KDE;Settings; +DocPath=kbfxconfigapp/index.html +X-DCOP-ServiceType=Unique diff --git a/configdialog/kbfxconfigapp.h b/configdialog/kbfxconfigapp.h new file mode 100644 index 0000000..80f22ca --- /dev/null +++ b/configdialog/kbfxconfigapp.h @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +#ifndef _KBFXCONFIGAPP_H_ +#define _KBFXCONFIGAPP_H_ + +#include <config.h> + +#include <qbuttongroup.h> +#include <qgroupbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qmap.h> +#include <qpushbutton.h> +#include <qtabwidget.h> +#include <qtextbrowser.h> +#include <qtimer.h> +#include <qtoolbox.h> +#include <qtooltip.h> +#include <qvariant.h> +#include <qwhatsthis.h> +#include <qwidgetstack.h> + +#include <dcopref.h> +#include <kactivelabel.h> +#include <karchive.h> +#include <kcmdlineargs.h> +#include <kcombobox.h> +#include <kdebug.h> +#include <kfiledialog.h> +#include <khtml_part.h> +#include <khtmlview.h> +#include <kicondialog.h> +#include <kio/job.h> +#include <kio/netaccess.h> +#include <klocale.h> +#include <kmainwindow.h> +#include <kmessagebox.h> +#include <kpushbutton.h> +#include <krun.h> +#include <kstandarddirs.h> +#include <ktar.h> +#include <ktempfile.h> +#include <ktextedit.h> +#include <kurl.h> +#include <kurlrequester.h> + +#include <kbfxconfig.h> +#include <kbfxkiodownload.h> +#include <kbfxthemesdata.h> + +#include "kbfxconfigdlgabout.h" +#include "kbfxconfigdlgbutton.h" +#include "kbfxconfigdlgfonts-old.h" +#include "kbfxconfigdlglayout.h" +#include "kbfxconfigdlgmain.h" +#include "kbfxconfigdlgplugins.h" +#include "kbfxconfigdlgstyle.h" +#include "kbfxconfigdlgthemes.h" +#include "kbfxconfigdlgtooltip.h" + +/** + * @short Application Main Window + * @author PhobosK <phobosk@mail.kbfx.org> + * @version 0.1 + */ + +enum {THEMES=0, BUTTON, FONTS, LAYOUT, PLUGINS, TOOLTIP, STYLE, ABOUT}; + +class KbfxConfigApp : public KbfxConfigDlgMain +{ + Q_OBJECT + public: + /** + * Default Constructor + */ + KbfxConfigApp ( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + + /** + * Default Destructor + */ + virtual ~KbfxConfigApp(); + void InitForm(); + + QString m_KbfxVersion; + QString m_KbfxVersion2; + QString m_KbfxNewsBrowserError; + QString m_KbfxNewsBrowserAddress; + + void browserInit(); + + + private: + QString m_KbfxLogoButton; + QString m_KbfxLogoThemes; + QString m_KbfxLogoAbout; + QString m_KbfxLogoLayout; + QString m_KbfxLogoTooltip; + QString m_KbfxLogoFonts; + QString m_KbfxLogoStyle; + QString m_KbfxLogoPlugins; + KbfxConfigDlgButton *pageButton; + KbfxConfigDlgThemes *pageThemes; + KbfxConfigDlgFonts *pageFonts; + KbfxConfigDlgStyle *pageStyle; + KbfxConfigDlgPlugins *pagePlugins; + KbfxConfigDlgLayout *pageLayout; + KbfxConfigDlgTooltip *pageTooltip; + KbfxConfigDlgAbout *pageAbout; + KHTMLPart * browser; + KbfxKioDownload * kio; + QString m_KbfxThemeUrl; + QString m_KbfxThemeFolderUrl; + int m_KbfxPage; + + public slots: + virtual void btn_DefaultClicked(); + virtual void btn_HelpClicked(); + virtual void btn_SaveApplyClicked(); + virtual void KbfxMenuItemChanged ( int index ); + virtual void KbfxNewsBrowserOpenURLRequest ( const KURL &, const KParts::URLArgs & ); + virtual void KbfxNewsBrowserCompleted(); + virtual void KbfxNewsBrowserLoad(); + virtual void KbfxGetMoreThemesClicked(); + virtual void KbfxThemeInstall ( QString & ); + + signals: + void KbfxConfigDlgButtonChanged(); + void KbfxConfigDlgThemesChanged(); + void KbfxConfigDlgStyleChanged(); + void KbfxConfigDlgTooltipChanged(); + void KbfxConfigDlgLayoutChanged(); + void KbfxConfigDlgLayoutLeft(); + void KbfxConfigDlgPluginsChanged(); + void KbfxConfigDlgFontsChanged(); + void KbfxThemeDoInstall( QString & ); + +}; + +#endif // _KBFXCONFIGAPP_H_ diff --git a/configdialog/kbfxconfigapp.lsm b/configdialog/kbfxconfigapp.lsm new file mode 100644 index 0000000..df0859a --- /dev/null +++ b/configdialog/kbfxconfigapp.lsm @@ -0,0 +1,16 @@ +Begin3 +Title: $APPNAME$ -- KBFX Configuration Utility +Version: $VERSION$ +Entered-date: +Description: +Keywords: KDE Qt +Author: PhobosK <phobosk@mail.kbfx.org> +Maintained-by: PhobosK <phobosk@mail.kbfx.org> +Home-page: http://www.kbfx.org +Alternate-site: +Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils + xxxxxx kbfxconfigapp-0.1.tar.gz + xxx kbfxconfigapp-0.1.lsm +Platform: Linux. Needs KDE +Copying-policy: $LICENSE$ +End diff --git a/configdialog/kbfxconfigappui.rc b/configdialog/kbfxconfigappui.rc new file mode 100644 index 0000000..74cf442 --- /dev/null +++ b/configdialog/kbfxconfigappui.rc @@ -0,0 +1,8 @@ +<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +<kpartgui name="kbfxconfigapp" version="1"> +<MenuBar> + <Menu name="custom"><text>C&ustom</text> + <Action name="custom_action" /> + </Menu> +</MenuBar> +</kpartgui> diff --git a/configdialog/kbfxconfigdlgabout.ui b/configdialog/kbfxconfigdlgabout.ui new file mode 100644 index 0000000..034575f --- /dev/null +++ b/configdialog/kbfxconfigdlgabout.ui @@ -0,0 +1,727 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgAbout</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgAbout</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>697</width> + <height>578</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>Form1</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">People behind KBFX</p></h3></b></string> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxLabelVersion</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>629</width> + <height>20</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>629</width> + <height>20</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image1</pixmap> + </property> + <property name="font"> + <font> + <pointsize>11</pointsize> + </font> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>You are running: <b>KBFX 0493</b></string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>20</height> + </size> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image2</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + </widget> + </hbox> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Here are the people behind the KBFX application. +We would like to thank all people who have helped with KBFX or have donated money to our project! +THANKS A LOT ALL OF YOU OUT THERE!!!</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line3</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QTextEdit"> + <property name="name"> + <cstring>KbfxTeamInfo</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="text"> + <string><strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org</string> + </property> + <property name="wrapPolicy"> + <enum>AtWordOrDocumentBoundary</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>20</number> + </property> + <widget class="QLabel" row="1" column="2"> + <property name="name"> + <cstring>KbfxPixmapLabelEphracis</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image3</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>KbfxPixmapLabelJohnny</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image4</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="0" column="1"> + <property name="name"> + <cstring>KbfxPixmapLabelPhobosK</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image5</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="0" column="2"> + <property name="name"> + <cstring>KbfxPixmapLabelNookie</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image6</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>KbfxPixmapLabelNathanael</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image7</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>KbfxPixmapLabelSiraj</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>90</width> + <height>90</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShape"> + <enum>WinPanel</enum> + </property> + <property name="frameShadow"> + <enum>Raised</enum> + </property> + <property name="pixmap"> + <pixmap>image8</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string><b>Tip!</b> Hover over the contact images to see each personal contact information.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>24</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>SPONSORS!</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>4</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>We would like to thank swedish computer company <b>PC Agenten</b> for sponsoring us with a server and bandwidth.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignVCenter</set> + </property> + </widget> + <widget class="KActiveLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string><p align="right"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW.PCAGENTEN.SE</a></u></b></p></string> + </property> + </widget> + </grid> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="32618">789cb59cc76e23cb9286f7f7291ab7761783bab42289c12c286f284bf9c12caa2a93a20c2947d9c1bcfb4446fc119945f5b2bb03c98340903c72f9f10f93f9ef7ffdba3cdafff5af7fffe375512c6eab5fd5b478f9f52ff7369b7dfdf7fffcd7fffee39f2badc1af56e357a7dbffd5fae77ffce39fc78b5fd5afac5bf4abc924f87906dfc12fd82f2d5ec2d77805dfc377ec5716f7f011af8ee14f109fb0efecf537f011f71df6bdc5a7f011af4ec41f3410bf657f62ef7f27bec5efe137e1cf82bfd2b0f8037cc4fd13fb4d8bcfe1235e8de1b71097e7b7ecfd1fe16bfc197e1bfe0bfb6d8b2fe023eef7e177107f65bf63cf7f83afeff70e1fcff7d7f0bbf87a4fd9efdaf33fe0ebfb7fc1c7f3f34ff6572cfe0d1f719fc35f81df60bf67cf1fc2d7f75b85afcfdf63bf6ff135f888e7ebf07bf8facfd81f587c033ee2f926fc3e9e7fce7e61f12df888e7dbec9716df81aff13df803f8bbec57161fc147dcadc32f1097df9fb3d71fc047dc0fe197f079ffad787bfe217c7dbf23f8fa7cf97b9a58fc183ee2f9097cddbffcf7da6b58fc143ee29ebfbe5ed3e2e7f0f5f567f0b1bf3dfffdf65a16bf80affbff12beeedf2bf6db16bf868fb87f85affb97ff9e7a1d7b7d13bec65bec772dde86aff18ef805f66f255fdf8ac5bbe25bfc12beeedf15f67b1acffbf0950ffcf7dceb5bbc075f5f3f808ffdeaf9efbb37d07896c3d778011ffbd3f1df77afd07896c1573ec8d7535abc808f7856c2c77ecc98d7bdcae20ebec63d7ce585fcbe9cc527f075ffafc0d7fd2c3f4fafcfafaee1e3f9d92d7c3c3f63def726169fc2d7f81d7ceccf8cf9dd6f58fc013ee26e133ef667c6bcee37edf533f8884ff8e7d16f59fc11bebefe093ef663c6fbaddfb6f80b7cc47d091ffb31e3bfe77ec75ebf808ff8847f9efdaec6ab067c7dfd1b7cddeff2f5ae58fc1d3ee26e0b3ef663c67ceff7345e35e16b9cf9deef9bff051ffbb3e2fdd51f58fc1b3ee26e1b3ef65fc63ceb171acf56e123ee76e0ebe73bef8f7e69cf5f83afefb70e5f9fcf7faffdcae21bf011cfe4f75f95d88f9eff9efbcee2f2f371165fc0d7fd28df8fd778b6031f71c7fcef4f2caebebe7e041ffbb1621e0d1a16df838fb86bc1d7fdc89f1783a6c6b303f8badfcfe1eb7ee4cf8741cb9e7f045fdfef18beea01fe7b1ab42d7e025ff76b07beee47fe7c1874ecff3786affbff1d3ef6e384f933e8daf3cfe0ebfb9dc3c7f32be6c560c5e217f0757f5fc2d7fd2d3fbf9ec5afe023ee27f0757f327f067d8d670df8aa0f985f8381c59bf035de83affb577e5f85bd7f1bbec6bbf0757fcacfb3b4f80a7c8dcbfb57ea577df8ba9ff9ef69e0ecf97df8ca8375f8d89f15efa781d778a63ee2057fde0c26e617f0753ff3df5fd1b078061ff1a284affb99dfaf685abc82af9fe723f8ba7ff9efad68d9f31d7c3cbf98c0c7f30bdebf45dbe237f0f5fde057d88f4ebede8ebd7e2abec5dbf0753ff3f75f74355edcc2d778055ff7ab7cff2bf6fc3bf8787e710f1fcf2ff8f3a9e8597c065f3fef0fe1ebe7bdfc3cfaf6fa397cddff63f8d85f057f5e15038d17cff035ce9f5f4561f117f888bb097cec3f273fefd25eff0a5fe307f0b1ff0ae6675159fc10bec6993785d378f1015fe3eff0b1ff0afefc29bcc53fe1ebfe3f828ffde799ffc5c49eff0d5fdf6f081fcf2ff8f3a86c98bf061ffbb3e0fd54362dbe015fe3fcf952b6ccdf82af7a9ef955b62dbe0d1f71d7818ffd59f0e74bd9d178b10b5ff7f714beee47e65fd9b5d78fe0233eb9818ffd35e1bfd772c59ebf0f1fcf77c7f0753ff2efb7ecd9ffef10bef2a10b5ff723ff3ecabebdfe18bec6f9efb51c987f025ff7277fbe9485c5cfe06bfc5c7ca7fb575e5f5a5c7edea5c68b4bf8ba7fe5e75159fc0abec6e5eb7316bf86aff153f8ba1ff9f3a3f41a2f9af0753f6fc3d7fdc69f17e5c45edf86af71fe7ba81ae677e1ebfee4df7fd5b4f80a7c8d9fc1d7fdc59f27554be3451fbe7e5edfc2d7fdc29f0f555be3ee163ee28ef95675345ee6f0112f33f8d86f25f3b4ea5abc848ff844be9f157bff7bf8fafa0a3ef65fc93cac7a16f7f011770ff0b1df4ae659d5b7d7dfc0d7fcfc1c3ef65b295fcfc05e7f0b5ff7b37cff85c5d5d7fd3c838ffd55caf753dafb3fc0d7cff30bf8d85fa5bcbeb2d7cfe1ebfee4bfe7ca59fc11bebefe09beee4f79bdb7f8337cc4cb57f8d86f257f1e54138b2fe0ebe7f7257cfdbce5fde01af6fc77f8fa7e6ff0f1fc9279ef9a16ff84aff12ff13df65fc9fc762d8b0fc5d7b8bf878ffd5732cf5ddb5ebf065ff373fef9bb8ec5d7e1ebfe7e84af9feffcf3745d7bff0df8babf8fe0633f96fc79e056345e6ec1d7cf6b89f72cbe0d5f5fbf031ffbb564bebbbec577e1ab7eff80affb9179ee06f6fa117cddcf2bf0753f32df5d61af3f84af71f9fe4a8b1fc3d7fdfa025f3f8ff9efcb55f6fa13f8aac77bf0753f326f9dd378790a5ff7b33cdf5bfc0cbec6afe0eb7ee4fdec26f6fe97f0351fff82affb91f79f6fd8ebafe0eb7e575ff72bef17dfb4e75fc3d7f76bc0d7fdc99f07be65f1167cfd3c3f83affb933f0f7cdb5edf81af9fe7cc5bdfb1af67015f5fbf025ff7bf7c7d5d8b77e16bbd6e065ff723ffbcfd8ac6cb3e7cddff3bf0753ff2e785ef69bccae16b3d9e3f0f7cdfe2057ce5c7a7f813adb7f1e7831f68dcbd89af713f87affb597e9e85fdff2af1edfd1c7c7d3eef1ffae969dcc3d7fafd04beee7fe619fdf4347e035fe31ff0b13f2bfefca09f9ee6fbb7f075ffb7e1ebfe65bed14f479f7f075fdfef1ebee6e3cc2ffa6e353e83af9fff7df85aafe39f177db7fafa47f8faf9cf7ca2ef4ee34ff095179ff0353fe7fd4d5fadbeff0b7c8dbfc2571ef07ea3af56e30bf8ca83267cadbff1df0b7d35ca976ff85aef7f83aff938ff7ee8abd1f8077c8d7fc2d7cf7bde9ff4ee1aff82aff5b66ff85a8fe3bf1f7a777dfe2a7c7dfe10be7efecbf7d3b7f81a7ccde7d7e1ebfe95d70f2cbe015fe303f89acfcbefabd078b5095febf5f2fb2d2dbe0d5f5fbf0b5feb79bc9f29aaf13df81adf87affb973f4f28aa7c59858ff8c4c3d7fdcd9f1714d5f73b80aff58235f8ba7ff9f3861cfdff1dc247fc7891676405ad32af7297fb7cc276934f794df3dbfc8eec3e7fc8676473b6c7fc89d663fe9cbf90bde68bfc2d7fcf3fc8c2e367fe45eb3b1f92adb2ad91ade71b6c9bf956be9defd0e36ebe476b44b69f1ff03ac80ff323b6e3fc241fb39de667f939adb3fc22bfa475955f93356835f356dece3bbc3a79976d85ac97f7690df24196c3c2bf82569955648ecc934d6037d934bba57597dd933db0cdb239d963f644eb397b617bcd166c6f66efd907afcfec8b5678fccabec98664ab646b64eb6c1bd926d916d976b603db25dbcb46b4f6b2fdec203ba475901d65c76c27d9383b251b939d65e7b42ed82e695db15d670db666d6226bb375b26eb642d663ebc30662455e6445f8473f8c8292c02208ed600474b21bb229ec96ec8ed75d715f3c1433b239af79f1c8eba9782e5ed85ec9166c6fbcde8b8fe2b3f822fba6ff0ec956c9d68af562836db3d8220b8fdb643bc52ed95e3122dbe715eca038243b223be67542362e4e8b33b2f3e20276595c15d7b046d1646b156db64ed1255b21eb91f5d9066265ce46796f29ff42025191f9b0d1cb1bb669795bdef1ba2befcb07b65939a7352b1fd99ec89ecb17b2d77241f656be971fb43ed9becaef7258ae966bbcd6d936d836c9b6ca6dd84eb95beed11a91edd33a203b2c8f681db39d908d799dd23a233b67bb282f695d915d9335c89af4df16599bad43d62d576875cb1e599fd6801e07156d74da06e1d7cfdf74a5ff484612b8c2ba619b92dd567764f7d5033dceaa39d923db13d933ad17b257b205db1bd93bad0fb24f5a5f64dfd5b05aadd6e871ad5aa7b5c1b6596dd1dae6b553ed567b64a36a9fd601ecb03aa2f5c72cd02ecf8877f8e513eb82f9ea98693709acab4e40bb603322de433eafc6c4ba2763dd0b916e91bf57a7605da0dd07b14e683764d2ad5567601d59754ea4dbe1b543bc13d68d9875817687a05db053b67336e1dd15114f6817ac49ab9db7ab0b615d75498f7db65e9687655630ef0aa3dda4baa275cdeb9679174c4837679b913db23d19ed9878552318512ed847d50ca6acab5a4cbb6f22dd30a1dd06d9166c9b79b72db4abda551bb4db67da1db111ebaa4ed54978775e759768771d6857ad10ebc8aa9ed14e58c7bcab9875d52018b32e27d2e5ccbacce546bb8a3947e6b2c03b57f0ba756571e72aa2dd03af9973609d1893ce795a13e65d20de879910ef937837e4b54aac5be5c70d665da0dd36f34e58273602ed0e130bac3b26d29d10e7c64cbb6017ee262c7aacb3ae09d6b5887681771d3705f1c03b77ebeef0071f5847cbdd0763de4d8877de3d8077b760dd9d9bd1a3f06eceac9b97733707ed02ef16b4dec9de88769f3061dd904807deb947f704de6d31ef94798175bbe05d30639d7ba6f5428f8176a74c3ab1cb483bf70ada09e95a4a3ab7700b629dd02e581f3620de15c43ba69d7b736f205d459cf3c23af74eebc37d10eba64cbb3ba2dd3dd16e06da3d89b94fa6dd8bfb52dab96fa2dd3bd3ee0bb45b251bf25a7743a35d60dd26b34e4847e656897523b74aff25dab9b53fc93ad0ae48785791b21353753735d6cdd8987641db11f11e610bb637a2dddb12edbe49d50da1edd669817544bbc83aa1ddbe5b67e605d21d827441dd09ed44db5dc0ae4ddd3559dd358977817442bcbe6abbc0b8a0eedc8629bbb0c94b669d6365c7eaaeba66de4dcd98766e937997d26e41a47b65cebd31eb82b27b775b443a221eabba4fa2dc97db6655c7e67688761be09dd28e759ddbcdc4466cfb6ccaba23d275443b5ea7a4e9c6acecce03ebdc9edb33da35847644bac8bbaeb2aeea577d3752755711eb8877c43ab70f6d571565423ca7c4337d77cbbcabab3bd1768178cf9178c23a77502cdca13b64d67d31e93edd11934ed5dd06d4dd26d4dd96293b5577b4dc71b14f4b59770c1b33ef9876ee2418f3eeca8d8576ee14bc5365d766da7544ddb93328bb7ea2ed325a65605d5985153817b41d5877ebce23eb40bb99bb08bc739744bbc7f29978f7ccb66053dabd83755ff4a8b4636d67ac13d26d9ab6db01edf67989b6536547c423da05651774dd29b4dda5bb82b2bb20daa9be6b91ba0ba423de05d6b15d1beb7a4abb2a67de1581748175cc3b27da8e38e74dd7dd10e5a6a6ed1e58d9cd99758f29eb40ba85fb26d6bd41d911e95c835917d69a6b12e7d688761b66c2ba40bb1d32683b21dd5fa35d5ddb795e09ed48db2d293b64b273f0ee456967acfbe225daee3bc963d7a1efb658db09ed7642264ba41b41db1d2699ec69c2bbf325dea9b20ba46b7326ab792ceb3a5ec106b54cb650de91ae23de057507da456d77cf59ec0394dd8c33d927e4b29cc706da09e9c4dc16d3ee938927baeedb881795dd06f258e1dd76b69b45de056db7e75ac864430e7b0cde8d59d929efce58d95d06e6a9b623ce4926db442e1bb45d0779aca9bb24930db4931f449d759cc992b69bd24741e1da41db31e7e4f12e90ce39a83bd577cf5077aceb88730b7e14da057527daee1bac0bb45b4bb41de7b1ae63bc536d37626d1732d923d735de8dd9288b0d9c0b8fa2ed8874574bea2ee8baa0ecda41d791b2eb1aed9878f4677e9b68bb403b269ef20eb49b22930df640b4933c3664b273ce611f1d130f99ecc288f76179ec17916ec8fa6e955857cf6537925c76d768b72b79ac5ba1c7635577cc3aa69deb9567612197bd2c8578174cba6b229d6a3b56765077ddb03897155d97d04e7947b413d669262bb4bbe13c36d83debba90c9ce5c1fdaeef1a7b213d6f1e307749dd06e885c764db41d3d92b27303e4b2bbb402ebf6798dfe0eeb6ab4cb40bbcaea76463be3dd03f36e1e389728bb17ca678577ef09ef3ef36f9f5b2ebbaa553be2dc468d759cc9b2ae2365e733abdb69d5ee04ac0beaee22a1dd3568d706ef3ad50569bb151848a7acf345c23b51764e4997dd42db057b40d56e399315d6bdfa327b21d62d44dff92ab08e18f76eea2ee4b2817435da7927bcf3be96c7ee864c1659ec9ee5b249260bd3ba5dd076c102e92e85757ea2b4ab7aa4ecb47217ab763d517592cb229335da85a205b3ae02eb8876deea769cc916a0dd3dd94c7857cb65857694c712f116ca3bcb659975a4ee4226bb4a8f81746b89b25baedbedf929d7ed3897257577505377a2ec4e82b203f158db29eb48db5dff50775dd576a8dc0dfc2d67b24abbc0bbc268e7cd621e7beb35930dc49b71262bbc63e231ed42cd4eeb76c13e4ddb11ebfc7dc863fd8369bb75cb65b78c773bb53c562a7707a0dd8b29bb5336ce6449d969267bc1baee8a699754ed44d9952baaedfccccf348f25d6655cb34326ebe750774e32d990c78278b7c86399749cc7861559176a7756b783b2536da7bcfb42d52e902e54eed659d7d1f28fa0ddae65b39cc92aedfe2cf18c7651df456517aa7637443acd66ef99770ffe496807de3d83756f4beaee0b99ec907359addbad5bd56eab96c98e6adaeed03f239b3d45e5ee3c64b3fe05a40b75bb867f45d5aec95d0aabdc31edfa31970dace35cb600ef349345e58e4c4837e52ec514bc9b817741d73d41dbbdb22d947651dba16e277d0ad57643f06e3d5b23de91b2f31ebcdbf28ba44bb16b75bb03b08e7b14fe8d59174877eadf8575a8dc5d32ed24930dfaaeb9a4edb47297e4b2cabaf0e8f6997715945d92c7fa9bc83bd6766209eba0ee6aca8eb5dd2264b28176c865bf34974dba14a166b75ecf6349d9ed8695f629dcb1e4b1c866a3ae3bd1aa9de4b164579ccbde80780da65d2be95274887342bb5a8f02996c507699e6b2d0764439d27613669de83badda719f8232d944dd599742ab760bce65857743a6dd2a580765e79edc63a2edb68873dbaaebfc07f72846d6a7b0ca9d6abbf214ca4e2a77caba2b683baddb75c440bb85693bed530cb86647cb7f0aed50b9e3aa1d912eaabbdba44b7107dacd6b953b68bb5add2e2ca61d67b25faced56c1bab5a52e85e4b23bc6babd50b50bbc736bc4babfd5a5c8628f82697713959da9bb59ad4b91d6ec84746f4cba0fabd97da3472199aca93baedb6d99b2db4d581768776099ecd8f2d8d3dff6641ba6efb827cbbceb6b8f82941d6887ba9d66b295f08e7b14579ac7d212da6997e2a1a6ed5e688174a17207debd8bb6b31e85b0eeaba6ec922e05b16e83b59dd04ef358d5757bc4ba7dce638f8c7527494f56d49de4b06ada91156dd74c3259d577d69365de15d695951f46057557abdbf147015817fa14c4babbb46647bc13d63d59a76202e229eba443a1d5bbefa42b1b2b773193ddfd6d57f630e9c9c6aadd89d08e74dd0f759728bb96b02e64b19ccb92b6935cd6456d97f1c23f68bbca32d9293259ed53a0239bd0ee9149f784aadd8bd5edeada6ed54c6957ef536c33efb6932ec501772902e98e7ed06e0c7577ceac23f35fd076d756b753e2b56b5d8a1e783748b41d77642d93459722d4eda0edb843e1bf413bd17692c93e998175692e0bd67dba0668b70ad60d95755cbddbfa0def82ae1b29edfe2cebb44b91f428aae5aa1decb64e3babd9056d675d0a746523ef86694fd6aa76328112ab76a4ee2893d5f993033fb45c76ccca6e9c74652f9875c2bb265b03ac6babb2ab2ef315bf2ab9ac5ff36bca3be8bb92ad325d3709992c2fed51c80cca9cd55d9ac772379672d9579e40418f22fba8f5643fad72b76aca2ed89ad4ed4cdd89aea347d27523d176ae9566b246bb137429987541db718fe232f6648576599b7b142dd376a15ec735bb8ab358bfae79accea0208f159b44d679eec9aa5926fb50cb64e7e8503c731eab5d8a348f0d9cfbf21bc86455dbad25acd33c767b49ddd5b358e5dd986750b41f1b3359e31d65b24d68bb763281c2fa8e48a73dd9fa044a91b02ecca030eb9876a4eeb84b712bca8e56aaed1ec5ac4bf18ccadd1bcfa0bca16ef76975bb3564b28f09ef88757eb396c9ee93badb65da4957d6e64fac72772a3328dca150d65da027bb54b963d675421e8b5cb6873e05b34eeb7681769840719ac95a1e7bc33dd93bb307cb661ffd56c8648345de11e5b84fa1cace7ab243e3dd1a67b1ebcc3ab16dd80e2a7723ed5210edfe70ed8e695762442368bb92485759d5ee66a92b2b95bb39f3ee09bc5bf0144abd4bf1c1b3769fd691157567b483bad3badd48bbb2a6ee6257769cb0ee0ceace7259d6752d54eeba92cb12ebfad6a1e841dd65605d663328aced8c771364b2776c5077dc938df376cf71fa44e7ed7ca5c4431eaba6f37643f46475da6ec3e6edb6631eab3d0ace6365d64ebbb2a7984189f376e7c864af58e13512dab5c0bb40bb76cc6403edb46a9759e52e2a3b22de92b2b379bb29f2d83bed5210e944df3d26864c56eb7644bc37d3765f3fba14f5ba9d64b2db495fd66a769acd523edb65de8d55d7a5b40b596c92c7728fc26f43db694f760596e4b2499722cedbf9403b225ddaa5887d8a7bee53c8b49d54eeb46a17b4dd73d293fd449f224cdb7d43dd255d59cb64b76a7d8a34970d79ec51ec5330f1c6e8528c2d8b3db74c56bb148d64022556eeea13777dbf8359bb3ce9ca0ae92abf8baa9d970914eecb2aebee316fc7d37644bbd8a5780d2ba83bb04e2a779f4b5d0acd63d7317fb2c1aa6eab96c9eeebf409b4ddc19fa69d4d1797cc3a671328cc3ace62a7365dfc90e4b2f3a51e4560dd1bd41daa763e0fdaceef61fe643d9db6a3c73d68bb34933d40dd4e67ed4e40ba947692c94a36cbac23ce859e6c1b1328cabb41ad232bff4ad4ed7ca05decc99ab67b4826eea4279b4edb2d947749dd0eea0e753bd576c3a579bbf5403aeb536cfd8676a2ec62ed4ea64fb4233b8ed3c53681d2f01354ed58dd253d59eeca8abae39e6c4ddb594f1613777ec4ac73491e9b255d8a7b4ca0d4e74f1e6db218ca0ef3c51fe8c9d669b70adead735f5678b7096547c40bdace4fb5231b265090cb1e71dd4eb55da8da09f1305b2cacb389bbeba589bb8ef463d1a500ef421e9b7429a0edb44bc1ca0e5d0ad27669ddee01da6e6eea4e33d95768bb7758acda0da3ba33da3d11e536307fa2d3767b367db29ff4280e6db6f88427eec6d6a5b8547597b04e94dd525f967359ee51e8048ad1aee0ba5d9154ee9c75656fcc629f02d37694c9ceb94ff124ea4e2650ac6eb7d04c96b2d8388342ea4e2650c0ba386fa7da6e573a143a6f17945d75f497ba14da93ad6ce2ae9ec9ea04ca5d328112d51d9bdfc7c45dd476433b4b81aa9da83b9b2dde62dae904ca419cb7439782ab76fec0b4dd79d291bd4297426750bab03ed45d3fe4b1e9bc9d65b2a12b2bc4d3e993d8a778902e05e9ba8724930d753bce66431e1b7bb29177492efb6d36c4fc09b2d83881e217769e22ce164b97623fe9539cd47817955d20dd25b4dd15945dc3ea761d18730eac63da8579bbdab45dc91377e9fc097ab2c23aeb52dc63fee4c1397f885cf69989a735bb8974299476e852688f224e17874c766db96a9764b1a6ed306f7790d4ed947563addb89b6e365553bce66ebf3762b463b3d4fc1592ce68b4b9db863da399db8336537f57756b7bbb7b3148fd0764f609d4ea0a4b4d3e96261ddbacc16ebf4893f62de6d27b3c53bacec46e85308ef96e64f388b8d3dd948bb58b76b30edda7a96c23a14dd3883c2e728c48876c9048a4bfa143ea15d3d8f15da3d2d9da5e0199490cb9abaabd38e7897d06e9d951dcfdbf9c7a52ec5c81f43df1d729fe28f6b3ba83be95254c9c9b11b23de2db2d8bb9ab27b626d271377daa57837da694776159d8a7563dd4692c96a4f761fb92cf7646dba98b41d687766d37697645796c926b4b30994be56edf2815f731bbeb04cd6e6ed94766256b9bbb74ec5ccb4dd13e7b14f5077a2eddea2b65bea5248263bd4ca1d65b2eb365d9ce6b19acb8e96d4dd514a3bebca8eb52b1b58c7a4a36c96955dc3b45d3c39d6b63c5672d981f629e42c459c40616577c2553ba755bbc03acd643173f7b0dca7281efdd8268ba3ba9393636f3849f1c9e7c6be6dba7858ebc96e26b4db4e5867b4b35c369d2d3eb36cf63c6a3be35da8dbb528936d2dcf16b3ae5bb12ec5dd721e9bf464431e3bb1b31477a8db3de011d3c5d0763a5dfc1232597fca3dd9d8a518f25a8d27c7dc63309bb7dbc274b17465f7a0ecf651b53bb6936351d99d481e4ba43bb34e45da936d492eebcf62e54eb51df41d4e8ec5693be19da9baaa36814279acf5288c76c4b979d2a778412ebb904e85cda0c45c761526bc5b3775b7892c56a6ed7663ddcee68bff46972268bbc2945d959ca598fee634c57c69e24e265002e916d6a3f802efa0ed924cd666eea0ece2fc49acdb49d54ea78bc7327d929fdbfc8954edae49db29eb3ac974713f3925cbbcb309145577aaec3cd7eeaeed2cc54dad47f1503b4911eb76af3fe68b4dd9c589bb8477e9c93199b8dbc674b1d26e94ccdb91b2f3e735da8d93baddb99d1c0bc4bb469f42cf8dc5f993cef2c49d4ca0fca8dbc52914a7cace6b4736aa3bcb63b96ea73d593949f194cca02ce7b2ef366ff79d746437c0bbad62d35fa4fa8e3259eb5298ba0b553bcd64a5237b1a67508874977a728ca7edae59d93599781d4cdb756a553b54eeec946c964c1893b6a3473e4b91746563e52e9e1cb35cd66887d9627f99a83baddb255d8a64b6384e17efa8b6b34c76c4792cd45dd2a3182767c7cead4f116877e5af92ba1d6a77bf3d4b211dd99ca750ca248f4dcf8d25b4e3b314b7384b1168f7184fc95a1e6b5d59abdabde39c6cd0764abb35992eb6d31469266bca0e79ec2acec9fe95ba5dd295753f68778793b256b3cb1f92793b3d4b81c9e2ead45f0beb7c23992d5e4dcf526002652bed5220973dac75294eac237b0a6577663d8ae5d314dd98cb2e4fa084ba5da2ed5c6213c963ad6ea77d8a786e4cce5248dd2e64b20b3b25fb1659873ec5a74e1787f962ebca0aef3497dd4cba143b4b5d8afd5a9fe2987b14a7b52ec552dd2e7629428762f9a46c9cb60b796c42bb4cd49dcba1ef64beb8d6a5d093b2b59add8c32d9797272ac7e2b00b259cb643f9269bb78726cb576728c3b145077bbb573b24c3b3e491127504ea1ec428fe24cb59d7429dc69c862692d6bbb0e4e52484f964f8eb9bbf49cac9c91ad4d174f2c97bdb37b01e2690a65dd93e83b9bb7d34cf6c3f258b08ee78bb96e17aa76acee36937363b14bb15fcb638ff4dc18af71ad6e47fa8ee78b2593bd48ce8d3559db75ec3c45d772d9e4dc98d6ede20c8a7565933c96bb14729622addc3da6f70230ef50b50b3d59dfd4b31492c926f3767a9662c3ba14da95ddb1b3b2239d41f97b3d59ce6403e9cae494ac4f3ab2f55b01e656b9136db7e05b0164baf803fa2e9db78bb70248edeedc6827ca8ee7ed780645b5dd11b4dd31ee4039af9d1bbbb473b2d736811279b7c2eaaeaff32752b7b3e9e282a74f1c2fafb3c5764af60e95bbd8a7783475f7c4ac7bc139d985dd0950ef527c572de35d3c37569fb7dbc27d00d076a8dc45d6c50994403a99b8b3693bd0ee0a27c71abfa15d37d175bd784a3666b2a6ec4a9b41a9e5b24cbbb66bdbbc5dc862ef7ff4299e45d9d9c9313d3b166f058875bb5533e9c96e24f327c2bb5d3e4991e4b24b77021cffae2b9b66b25cb36b42ddd9c41da68bfb3c6fd7d373b289b62b7ff06e82e9e2a0eaa67a964233d9a51e85cedb712e8be9e2a0ecdeece498f66357b5231be7edbc56eef4d4d8becd171fda498a675377ca3bc964316f979ca468241d0a54ed78da6ec52650a42b3bd0aa9dd2ceb748d6cdd1914d2750a6cc3be29c6f27ea6eb6dca560d6bd18f17e9ea540266b33286ba6ed3497d59314fb325dfc77cfc942db79bbf18996efe094ecd4668bf5a4ec43729a426e41d1badd1bf2d80f3b251bbb14b81300e728f42485a83bedc8ee43dda5b7029ceb743172d94b639d9ca568d4cec9aaba1bd4ef4021de15e05d65cace6713dff52b3837b67c07ca6ce9568057abda2577a0c819595576ca3aeec70e75de8e4f52ac87693b3b296b27c778da2eac7de3dd71726e6c6cb9ac9c913d4f7a1457e1922f3b29db462e8b69bb78e353aaee967ab272e353e8c94eecbe27abdb09ed90cbce64de4e4e52d07ae62c9627ee64de4ea78b6bf3769fa8dbd5ef05d0badde66fa7edeaf376474ba7644fe274b14cdbe9490ace64d3793b3e27cb73c5c865eda46c3a81c2f3c5209d56ee2676722cf428a676dfd31d7ab20fc974f1134e8ec56cf63d992ed62e453c39f658bbf549678b776ce26ed7ee40919eec61d2a738f1bdda2d28e7769ae2c2ee7caae5b17ca26225c9657bc9c9b19fdace219315936eec8dcda0dc837673cb6643cdee79f956005e1fc864932e856bda0ccaba293bbd012564b2f15e80913f1665f76759579b40d15fbfcea0dce8044a42bb999e9465d2cdedcea705aff7e49c6ce8c87eea048ad02edef8c4da6e3bb9ef694fcfc99aba8bb41b2737029ce3c6a76bd4ef02ebe2bc5d07a7c66cb638cd647de1fb3f32d9493c2b6bb702dcff46db857eec53cc63ad72c7ca4ece8dc53b50e28d4f7e909c941565b761b3c5dbb147615d599e3ff1e7f15600527527b5b3141736598ce9e2dfdcf7a46729d09565da0d34974d3359f464b52f7ba3f7db09ef2c8fb53b01a472c7c4930994673d47811b9fe29d00b127fbfd43ddc90d775b917746bb91dc8182b363fb56b7133bb15cf6c2eeb7bb4cee7cd2e99326e7b29ac5769319941eabbb9476f59314e939d929e64f6eeb77a00465e72eb92b4bb4e33b9f64e2ee3599b87b5baadaada61328c6ba8d249bddc3b4dd6eede458bcddee24e9529c2679acde0970850994a6ce9e949d508a4aa6ed94765ab3cb6397c2b72c9385b6637537e5d3148174b74bca2e3d37f6143bb293cc2a77aaed3e51b71baab25baada6d9ab64bef401911ed5659d9fdf9936325949d36a66bb44bea7677756d873b9f5e7406051328daa7f84c4e8eadd98d4febc91d28db51db71d56edfea768796c92637a090b2d369bb600d3e291b4f53681e5bef53e8c49dd6ed4a4ca04847163328bce436cffb64de2ebd13e0c9eeb67b4d2a77a2ed3897b5aa9d76295697ce8ea5992c130f373e29ebe2b4dd419c2e66d29d4e0af428ce6c02255ae09ddee629377a8275b57363fd2aed5124b96ced9ceca4764a766a2729eed0979d41d9c51b9f9e6502c5cecaa65dd9afa44bf16d79accca06cd52b77917693d2d4dde18fd31492c99e2bef64d68e6c5c9f2f86bec36c316eb7ab9da5b089bb427b14acefa4239bd6ed306f873c56e7ed12ded5bb14b8cdf3ad368192d08eb55dbccf739b73d91dee53c86d9ebb56b5d31e45c865b54f21553bbdf3e94c6f7cb29e6c3a5dac1d59d4edfc0cf7dbe9c931cb649373b2d552267bcb4bee4049ef05a857ed5e527d57bff1299d2ec604ca5a52b7d30914bd156084b363cc3ab1bfa1ed50b98bb702dca4137776078aaabbf9d2d931b913e0dd4e52c41994a44b61f3279bb55b014672e7537292224ea09cdac9b148bbaba5fb3cdbe8caaab68b27650761fea4d6a5a8cf9f784c17dfda0d286926cb373e4d2a3b25fb6237dcd568575377b59b8bf95e00659dcedce96c71729b67ed0e14ed529ce0a4ec6972964233d98be4ac6cd2935d3e39a6166f05a86ab47339d49d4cdbd9ad00a6eca6494f16b92c6e04485897f664933b01a46ef795e4b2e9ad0071deae7ee7d31ed34e58b78f5b0134974d4ec9c6f9e2d8a548ee406961bab8b33483d28be7c6c0ba524fcada7d4f51e14dd39363ca3a54eee6762fc03332d93871f766d376c325d6ad219705edfc51edfee2385d7c60d3c57c030aaf93a5aeec394e52484f3666b24dd4ee3a7a4e96b2d854dbe9c9b13ccd63f57e3bbf6bd9ec24b915209ea57848b51d912ee6b20bcb668575c6bb8993e962629d75656bb7db692ebb13cf52049bf8bf335d8c79bbe2c71d28762f00a68b677696229d40116df796dc0af0b57477f16afd5600abdcc59363f1a6f6434ca01cd91d28e3a55b0154dba51377694f369db84bce52a05351c6bb8bf5dc5872e7d31477b5c71b9f1e937b01ec9ef6c9a47607ca07dff80465f79b9b8b634f56cec9caad00db6e17992c138f4fc9ee65b5b31476c3dd1867292ef80e942bbecf33de81d2cce2690acd657bf10e94a59e6c91683b557655bcbbd86b57f6d6a68b6b99ac9d93959bda9ff4c627ebcabe2ddfe769753bd576ebe852589fc226ee82ed13f16e126d779c74294eb4271bcfc92ef12e9ea468e19c2c6a76dca380bab38e2c136f320de7c6a0ed2a9b2e4eef05b053b2b8df4eef69d79363f13ecffa1d2849ddceee4079fc716a2c906e1b3dd991cd9f1c9ab67b49ee04883328e9b4dd9565b2d7365d1cef4059ea51e849d91fe7642bee53b878df13df5dac75bb87e416943885f25c3da34ff12a9d59ce64df7ff428bef47ebb50b5c39d001b492eab55bb3dedc86202e58fda3fffef3ffff1ffdef98a26</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="1503">789c9594cf4a04310cc6eff314657b5b64d61554447c04c1a3201ed2f4cf4cbb330bba1e447c77933483d7766e3fd28f245f9239eccdebcbb3d91f86cf0b5c663438c187d9fbaf65f97e7b7ffa1976b777e6e6da1cefcd717735ec4e068d8d0f1163641c0521ba8a5651a38ba0dba2a0a85154f4159d206e51afa8d1a8182a0641bf45b3a246cf8ab1e22a18b6c749511f17457d3c0bc62d3a296a74b460c1a1f7244ff44df3d4f48939d60229bdcf21e49c526993aa16009de3bc99f3f6684f54348267b34287b4e65d488b5c35d5ccda4675f58a8a762cf599fa2da5c7ab4d1c327bd52aad794700d1462e3995d68e252f8cb5e698453ba70eade5bc484ef17c4b9a7bf2da45bd0a2b659e4a8fcfc0e345e9978beef14a6a96b4816794a68e7e4732daf146071e52a7cf5c34af55f4d5e8be9aa95f3986b052da46e9ff1d61bda39072e9bbdf456e21d05292b4f4cc887f1b283b4936e773e76ef02938f971b0576d4ad2fe3e0e7f0aaa12e4</data> + </image> + <image name="image3"> + <data format="XPM.GZ" length="19265">789cd55cc97262c996dcd757a455eccadae249cc585b2fc42021404c426868eb4504330249cc435bff7bbb7b5c9032d1abaa6d7192e1702fe071c2cf143794fffae3c753e3eec71ffffa6db972ab71f74777e4163ffee8ad67b3fd7fffcf7ffdef6fbf67523ff02f964cfe88fdfe1fbffdee333fba3fccc525457a5a7a8c223d263d4e911e979ea0487f919ea4484f4a4f51a45f484f53a45f4acf50a427a46729d2ebd21d85baa94af714e93de95d0a75db96dea3e878457a9fa2e30fd20714e9afd435dc0be9f7d275d3e7bbd263141d6f498f5374dc4b4f50747c283d49913e909ea248ef484f53a48fa56728d247d2b314e913e98e227d26dd53a44fa57729d29df41e457a5f7a9f22bd217d4091fe465dd31bc6aff168b81abf6d4ad74dfa527a9c227d253d4191aef9882529d265bf588a22fd517a9a22fd497a86227d233d4b91fe2edd51a48b5f314f91be96dea5485f48ef51a46fa5f729d2c5bfd88022fd99bae8acf11bd95bd31bc62fbe6bb861fc3be9ba49bf929ea0489f4b4f52a4cb3fe2298af4bdf43445bfa7f98f6728d235fff12c45fc177fe38ea2cf7f48f7149d2fbec5bb14e99aef788fa2f3e55ff13e45c7c5c7f880a2e3f237b96f987ff9bbe81cc62fffd5f46afce64eba064cdd69fc09dd743c2f3d49911e3e9fa2683c05e9698abe3f273d43d1f9e17896223d1c7714e91a7fc253a467a57729c27323bd47d1f19af43e45bf5f963ea0e8f70fd415ae347e2ffbc97d83ff6b3e45e710ffc4374d6f18bffc47c30de3173f92ba49171f93298a74f13199a648973f253314e9e27f324b91aef9493a8af4f0fb9e225dfe97ec528447fe92ec51745c7c4bf629d2154f93038af4227585e7c07fd943e12a8c5ff142eeabf13bd95f740ef14ff150d31bc6af78a1e16afcce4ad74dc7155f53698a8ecbbea90c45c715bf53598a74f131e528d215bf539ea2f94b49ef52745c7c4cf528fafe92f43e45ba913ea048977f2b1d69fc4efeaff01cf29ffc45e12a8c5ff155ee1be65ff152740efe2ffe6b7ac3fc2bde6bb861fc8adf69ddf479c5c77486a2cf2bffa6b3141d177fd28e225df6497b8abe4ff134dda5e8b8e26fba47d1f16be97d8a8e8b6fe90145c7157f957ec3f8155f958ec2fc2bbf283c07ff57bc54b80af3affc29f70df95ff6109dc3fc8b9f9a5e8ddfc9bf34dc307ecd6746377d5ff8fd2c45c765bf8ca348573cc8788a74c5d74c97225dfe91e951a4cb7f327d8af0295e660614fd9ef281ca8d307ed953e957e377e2bfd251f07ff14de139ccbfe29bc25518bff82ef70df3aff82b3a87f1df4ad704ebb8f06bb861fce26356379d2ffe651d45c7c3ef7b8a8e07bd4ba1de94bdb33d8a8e2b9e66fb14e9e267764091ae78a0f22a8c5ff151e54618bfeca5f41bc6aff9563a0af59fe285c27318bffc4de12ad47ff217b96f18bff8243a87fa4ffeaae9d5f89df8a5e186fc17ced74dfea1f1384fd171e54bd7a5e8f38a9fae47911ef0f529d2159fdc80225df145e56488fff20f955761fccacf2a3702ff353ea5df307ef9b3d291c6ef140f159e03ff854fe12a8c5ffe28f70df94ff94b740ef56ff83d4db074c5470d37f05ff5afd74dc715bf7d97a2e3cacfbe4791aef8effb149daf7ce507141d57be52f91ce65ff949e56418bfe291caab10ff142f546e84f1cb7f957ec3fc6b7c4a4761fe958f149ec3f855cf285c05fe2b5fcb7dc3f8c3ef8bd03a5fe3d3f46afc5efcd670c3f8c5e7ae6ed2955fba3d8a74c5f36e9fa2ef93bdbb038a8e2bbeaa5d08f3af78acf2398c5ff583cac9c07fc51f955761fce2abca8d30ffe283d26fa8ff845fe928d43f9a1f85e7c07fc57385ab307ed943ee1be63ffcbe082d5df150d31bfc5ffea8e186fca7fcd6d34de72bdef4fa14e99abfde80225df14eed51a8ff347f6a1742fed3f7a97c0efc177f544e86f8af78a7f22a8c5ff657b911c62f7f51fa0df5aff0281d05fe2bde283c87fca7f12b5c85fa5f7c91fb06ff17ff45e790ff651f4d6fa8ff655f0d37d4bf8a6f7ddd8457f1a83fa048173fd50e86fa47f8d41e85fc277c6a17c2f8e50f2a9f43fc577c573919c6af7ca2f22af05ff958e546987ff99bd26f987ff9a7d251987fc52f85e730ff8a270a5761fe357eb96fe0bfea31d139f05ff94ad31be65ff14ec30dfd8fe673a05bc817ff1c0978adf967c83f1aafb3de766dcff6edc00eed0832848c21e17982c757088f4da04ff538b633fb86cfbddb0f3bb70bbc5a4256f89e955ddb0d9eb77607d9db83bdb2399bb7055bb4d7f6c696ecad2de3b97292aabdb3353c56f158c7eb9fe51c6fc336214e78c7b62574f7b8b7ed03b491ede0c804a37a048e27205be175439fea427f06da17c805707fd84b1c9d62245b1bc3585e6cdc266cd2a66cda666c163f674e68ab2709286b903be3fe06dea930cf8c07ba01eef7f6de74ed83e9017307471bc0b0b071d3c7af266dda0cccd08c60b9bd19e3790b59d8ad99001bf17e600c3dbcb320663331437b30af668ab367e60d1626de8a501ea56e1c70d689d6bce3f967f9156f03b69b00f148361deab165bc107ba05dc14e73a0fc3073b3304bb3326bb3315bb3832c201bc912b2367b73305778ccc1ea8f18551e780ba668aecd0d6c9c3025e02c47788ff623da5bf34ecc782cebf98b9ce1f5403b02deb1a9988a1d98aaa98209e404d930c19ccecd9da901d9dad44dc3344d4bd234f7a66d1e4cc766cca37932cfe6c55c984b133371d833613f4cdf24f1c9b94d99a94999378c281db1f788571604ca5b21e673e62ff136e4477d30b70ddbf661d30731979ce858070bf54d166813b06cd1b49ca5006b1a5fe64c07c561d7f5ccd4f5cd0512c5d016dcc88dd1364fc09d0f8c91783102f7eaa666ee66427c233e44887fc1fbfeb39ce19d00157d7d4cebc2a3de81b14b4e60040ddb332393776fee1db35c771f6e6ed2a68dc7b60522a05d9847b784fd5eddcaad4dcc0dddc66dddceeddd01675c6146b6e6c1e55cde155c119fbc36f657c427bce44559afbfc819de81f1f2fe116c3a83878ce0f52ddb06e61122c0c626dc8d5901e987d05e41d27806175c89b68df01271ceddbab23bb88aabba3b577375ccc9ce1c9c377bd7704dd7321d58facddd9ff0d64efcbdd5ecff1dbcf7b0ea0c7ec5c8db07c2296304c6002ec0d37726072e14e147c5605d59f80177082c685c5b6c78701de07d04235a6e646e5c11367e720393c4cc6cddc2191377cfee0533f28a28517117f6c6946d0978eaf2b34f4e94c1890c7b423ee39c5ff17684b4a368d681a5a7e0c140af18453fe0691bd3701ff23420848f112f04686368edba40f3625ed05526d039a65cda6631f337e80ab32e0dbfacc3bad674bc85cfdd9b852d7ae3eec14bd8d296812e602d1f45fdeb4524787d867706b4b468178807c0cafc1070afec95bb42f44c9cf0126b8497686d1e68dbe61adc4dc0b60df0a1e09d1bc3b264700d983be07d5adf802ecd2cdc95efba7b6f60e17be0adc8aae560cf6053e20c3d9beff1f519deb1f2da003899379cec3c54847b84afe57c1ff62d42e86d8c0c6d5a19684b7e40f682b70f7ee86e15c752f0b7a91ff931f87b272b378171ee62868c7f361b9bf413f30e06dfc8beb588b327bcc1b67f86d7744ff898631dbcee41bef6665f10f1b3ee0d3109684fb1b74ddb9a2b4633795b1fbc250ff22eef5ffd14d6ddf8997f838577fe1d989bf600beacbd778ff88ea1b9f11ff2b40af032a77db1f091b97fca870779dc48596e0c263c284ff41119aecc1dd8b011527a1c62af69c2df1e80b6848918880f4bf3ac489677433f35253f43444bfbb99fc3f3eefcc2a59019afcc0efcce2926676123e55fc6023cfeca87bfc2db16de8e1d820943d63686b1ad8b6a208948b690750f6204735a4b31a214259f1838e191df9ec988e60a5c58da825fbab43bf8a529b9aa5f21ba7953848d63e079c1af310b9ba866806f9da2c14598fd207fca871ef0a27284bf299f4198edb6c8f65944cf357c859982f9825e7750662b2132185762345696032bfcd05b57f753efc0de6bf0a28928fce4b7e0f01471fa039f9ffa152279dc302393b965bf930d896f17492f7abd8748ff066f5b95c383f0cec005e68db8f90017e6c84ec44ad46b3cd78197f9cdcad66dc5613c027d9751c25b7ff057b06f0bf7b1dbfbad9ff89ccfbb077c5703b1f9128f2fb6e2bb7eef2ec807bf81ec3eed69327f072f10f7f0fc10ea49e0ee233264d126af51a36c8e48438e330bbc9b45e575e70b86d199155b4bb1d8bb17f0a2ec0f6e4a56f8b12f42aefd0df25a13513a895feb98badf203e548df37be0dd9ff01263ef64eb7f8fb722eb127105358e178b57f0e31a70ed4e68eb40b58095b2a82cfba87d63a8cfb7f619552faa7477e56e10f71240dd731d7219d502716f903baa7ee18bf0c331a2460915451bbf5af6c8bfe4b1305e7e72e2aff1c2aaaa1d81f61558c7ea283668c3cb8864a8cac4dc3d50bf812149604d98a1afa066ebc323b78822ec899e51738e513b6e907767e0e9d00f91a37b403e15e6ac5fd86b540e65075ff4557f67afe96bf6c6efa28aa11cbcec6fe06d4716267fd9f7b490372e18c980700bde6e70a76c510dde980f77031b0dcc1d32df076cfc8e7b0c6c1f993172770ee75d215ebca2427fc0289b880d53474fcc28da563c2a1db0a0a6585653859011e2236fffd2df7c1d157a4f2c0e3d650bb55adce6e46b1b75136ba1066f61f31bf40e97e0400cb6eda983dba0171a832577b07ed2d4301f6964921262f6423cdf22bf759b2b543955e4e16aa8787d8335bb6fda7a88b2b0ebdeb7c0e5fd5ffb9b2204f13ea82a1b200ff7157913514428e27903fc39d8146c007b7740cb731bb0ee12e74fec25b016f0a9b97b038bbbc0f8066bdff90abc72880c9ef7f7f6cedfe2f751e170d6d911c3e31cf132020be3dfb0afd8fbc9df0e18fc822c8faa012899292875f137070b0eeddc5790a51240fc6617260feccfb0367cce704e980d5fd1173de08c1d58d2077768e106ab065f058b19b0efe1713dd4103721aa85ce42f9b8fc9778878c09ea2f5fa3ae02de2e5f5bd1b28ab50746075f46ef9887208fc08ae0053b0fe04584c0bb1f38be70efb0a4f53353a30fc2f67333c14810d3d4adbf810da7ce22ca70517e3be6df53e688e40c2fe3ed7de8e165dfa5e52fef1057593720ab410e8c1066ebd7886835c81c79f5c62481f9803871c97806db221bba0fb0618d0a82916b849e3e2106778097fe56127ba37e387a1565e363fefd4bbcac7186b06b4bf56f8735af7c6dadfc5b8f3a21d6bfcc742bb314ea79c04eff83d442a4067fee515fbc226ee591abe90106b924ef52fec6a3ca818fd555e184a8103aca2f78bf93733ea83ee73ad352ab4949ccec5a780fb42f7b61f00ff52b9921dcab90f5103516b4aab8b30e1586fad0b65b23af0dd18f3eb906eac824aa9f9a7b0507c8841bd590017159ec2d872afdbcd6f9b65e67149bc0d3dfeddef491097260c35cf6da2bab355102cda31e281d7a37f59bc0af2a06568f3c93155c5a997981ee62a82e69edcae8f0abeed5b7e95fb07099b9f8b442125649be54c027ac513d7c8677651f296662068a57595ff67de50ada906b0eea84d851e8eb2736af5507a728dbc67868f360f926ceb218530715cf1c88f3c8cc2d64e2074b8f2b41e86d77aa7f6bd16adfb1432e87ec71447b9c8133bc97f0982bc4b067fa86d69d6ac2cbd5a68d66199d31ecf9a0eab124bc3333b3199b41f53b979543a509ae033f6b9f7673e51ffc9b2fa266dfba9d61f7c32ef32d5adde3fa5e45f6aefe09def277fd3c3102efc63ea31754fe0abeeede80999ca07d5bf2a3b6787c85f99e447db161d58633f651d559670f8de36dd4092370620bccefe83a8b4079ad3ef32e5aebab8635a9284abc477c38f51511bb6fcfd777dc0df03eda0ba0656799231f98a5907dd7b272b06f53bd6653eb51c0ac5e887c48e3bdbdf88bf3f1f9b0a6f600bc537670c07ce7b7e8e13bbe86fba3b167eba9b508f1cfeb25ef477e9fd91799095cb84226bae39a63e46d0bad3fee98019493599f37c55255eae405fc3facf5309b8415cb046335fafc0caaf7142adf3c3a8d313a4c66e227c82deb9dc8c2c7f5c9239fc34a5af9540395bf5fdf015f51d322e682c5bee0fbea2a8457d6dd699daf4e86caa30ee2aafc0f681f809c3162a76a6eafcccda89636f77ee05fdd931ba1ea7d476cb8c64fbd19e3ef908bc3fa595861e7e391d177217f9ce2dced777cb08cf63956b75cd943aeadd9039980d99d332b20d62634df21cf1523ef6a2a2a93211cd90d47aaf7b7d0939e35dd0e8c79b65954ea47bc308e7fe673b4aa1a2420ae059b9f5651eba72b03bfda17d91577722f47eb82cf3fe30d6bd475d53d5c87684588b9068c3e5f5d53165cca29f325516deee1b11b7c671bf1ac852eb9e2db40fa8422e5c916cff87b644845b88f2ca9455734aa6778979841d636095808968aa2d9420c5e889561e5bcf8156fc40fd6154bd66ea81af3b80f505f5ea17e2ca0a2804fbaa929016f11be5643467ef28fa8d46dc488c8bed16ae54db4ee5efb05ed195ecbecbbc48c2f5535283ec8aa0ba1dd00eff60bdea8c214239a420ca6b877cc4c4e7dc708cc28f3922ec6b54677bf84ac60dd9a2d22c73de27e2bdc2808c1e7373c921dc47a1badb256225e1fc7f06b7ff182e87b50f4dc187a4d01fe77886219b970c47b8818b117f656e06fc86db827d88b92fb3c8a8c11771b20bdf253d40e2b20ecb899e21979f1886c27b4122b0bdf9eae14dc2a0f96dc3d05a339c36baaa876d6c86e0544e2b88d6166c55df160291b3346ec554fd465e360e788c542bd52b6e00af5ccbce048015e76407470409df76dff8c3b5801bc8fbf88896c1d70978f382518cf19de0b7fe9ebe892b90675c1ea1b9dcd5c33ca6b3f0ba15d4778f7513ddc88b0921356eb27ac8c0eca2917e88def51373cf9a5cdfa2bd9b726b4cc198ac1471b1f39f10571e92b561efba67fab0271ccc751b33ff1ca5a88c2eae7b7b80b2d6bb020475f93bf314624a2f5c07a58bb747174c3715747e570704d3f721b540f45648ce073b7ee15360662f6f70117d19ed0db234fc2bb9073bcece77be8933dfb31204ea21fba893a865d64dd956af5956af24fa94b3ebd0f7d9ee2d88b5b994b603de03e669ef31320669eeb1cf192099fb8023788ef84f3f8deaf7c4800a9d6a45007bf80c1e86ee073397a9de25ae0c35112270e3393ade4890b60fc50f7fc01df5da1cf2c200bb57dc9872aa2e2af5d45350459711bc95310e17afaf24e60f5d3297f9fad47f9baf67c5da043ee21da271139f97b39ae3109f156fd445835d99c3ceeb80eb8037f2af0535d9df5157c0add1fc78cfaadee477ee2b2aec21a8251cd9cdd88e9f3d527cee3f16ffa0badf7016f1578d143e2f70b425c38e6ba13e64d5411d7655d460f6695da316ae3d8bdebb9b679368f8c2ce0f2ccd5fcb3cb8a0f6dd53d3710fa1e98416e2022778216f12442caa33cf6cdfa4e8fd704b8ca637bea7473c46cb85a53e02a25abcb2f88233e73850aefcf754e74451978dbe611e97f097f7bc10ce450ed4c9029663e877b17d86f91918b407e734258939cf07ec54a39bf7ec12bdbb07015996382fe82aba45943c479cc6a9e2b66acd9a26a6d17215f727d8a5124acaa72658d566625c218821ee4157ce8a05ecf499e61e51925a08850d6d887fe2c3f1dc75c9cf3973b07424cb3886611de0ff021cf2a2062b272ac3db087e76bd5427d30b5a6f33f8cea1c78db15ab3c8c63004e74dc23a230f82bcb3ecbae6df1e126624584e927f97c9767b7cff0566d1b1e57479c88db167d3bb2578e57d7c1e764c08c31646543c50e1c8f341dc3d8ec8799204bbedb6758bc865a676966c870597f1f1093118cc38ac57727e4b5c89e9ff27514dfe0f5097281ecc5aba199707e61c132585900de34e2f1802b8f56d822749442600cce4852c32beed5e0bcb0679ea0835ea247ae85fdae7e01095b1b7364865007ccb56fe5dfe3bd64ae80d75510273a76cb48a419af0943da8cb46b841d489271c348ecd127d1add29e5aa7fa109396f0b427f49c25d7f05bc8bd64a2b8960ddc003b4ea8a97d15fa23455c07ebbf890f1570e132ca184ffc7dc62620fe109a0aa2eb871912b356a9c51055bb6406afcaec1435785d43f53d22daa3bafd25b03d29f66e5143dccbcadd60e70833fdb07b269c8b45189dcb9eaff7810515b202d2b24bae3ab2768856f492a869b9ea336636206af0a30f86a49955c4f5a522022be6b9fc708b7c9c848557c8c313ff803aed9dd7eb9193ef235e7c7223f0e327d11c4c249a9933bcbc6adcd2d5215e1ff26608ebd5d46dd6c460221ed9392ab72be4b0116dcd3549ee7b2247985190e3d6810fdc2b0146c46163e0e5ce6d7162eb8a40bc921c112fbe30fbabfc62e133bc4bb0f6de5f006d07781fb996ab9e1ed642e4cdb1233363e0bdc29d8fcf668248f00c899b01f32063857a0bcc8419e1d516f5dabd9972e706b8f0ee2a147343113358fd6c890cef6789eb684b498415aff2e4fd377cf076a3f5ea292a34c7f829feaeb562cad58984ea0362ddd91862d68b76a175ed3bf770f15a118e73957da7b3625a9d2fba9e2fb9bdcb9c701ead4c14f77887b67e08568fac2f7c1c5ff80c3fe58ae7eb7ddce36037c86d3d70630aabdda9f6652e9bfb32e2d31dec162c1c03aa779cd7b033481f235d02ff02efadf0ea5d98375cc7403d34f5075f3cb3ae3c0fc856c0528934eaf9308e1045225ec8ce67f962e7e6a6092c0d58ccd906d72979ad9088e1757dc66154991f407c057b5ec0ba2b601d686fc7587b921a40ce1d351e76e75ec40b449283f7c816774091fb3923b306f6375a399979136a496461762077aa2deef8cc58860832f1abb3f533e78cd9eb5a0339c1fd668ca2f3e31a04b8acce1751788fecc71cd6033a5dcde7de0e5d0f1d68c57ba4bd984f60d71851e3d1a450ed5c9fdb17f6cb03fd3b7c911197eccd6b6f47258a257aa6b7faa23beb2f6c0a5c7b030317f60d51628c9e68c4bd7c81c166cebe977142bb10c98a0b206ac837830ca3dd1e0ea370da65f9841e70ceeb2ee891e75c81e0ae085496ad207e6c4aee0e957c1eb5fcd866dd356404c1333abeb91ffbb1ab824b63f426a3b37cd157d4ec036f0331a2611f59731fd727e973f0ff826a8984f64dc661e327ee668d76a6ccb49b91bb53df6c13479eec16e7ed5cd70d1021b85a4d996b07471538e6fe0dc89edcb4b9821567f0498976a46cdd1638796e11efcc9171a667782bbc9689b9e6b5a15770f3497ba27661bdcfbd29d3aaba948dfb8c5986be391113c6da9532c3a79b182b7d8e570fd388c16d57704d97e6feaea3f5683f770d4433d46dcea5e07323a13b5a99c7ef30a6b1c6d6f253373cf33756e449c426af2bc74d7b810855d015971db3b2aac62cab4b5e25246230796757389f577079c579a6fd543d59f849d74186e8a13bdc71060b7d326114494b984b2e0f2b566d9612d0f228777b40aae0c29b1b36cffc8d15827dd175ee31acd4834ff5b55eb90d1541a864b8da74c48bac1c471498cacf66f85413481bdab7f666e7bace99f3036f4dcc5f116d9023623f037b5bb0e12bf8f0c5b2c7b1401fc9ea4bb0a4ec52dfe4e3a1f63f205f00f71ed6e3be9d9d56766861d6e41f5eb51af12a1f8fed162827daa5d6411c5cc3ae5e36be0c6b58e8e152880f575c9f3cfa5bc08cd74bee86706593fa8273244fe439d77c05d46930236fcef0fa179f849f4d75ad3d6e5831e4a2eb9bb0303c4ed7348497578d13aad6c6c80c3dedf461dc659e6326d9f07a26f76d9825faa14b57e0eac3514e51624cbcc05337b18032e0a4ddb59aa911e2c8c1559b2b13fbb67f7336166a2e751135aeac026d8437f081fec6ddd5a8742eb5cec0bcc17de41bf8df00a388016f4c3b641a8890de25bdc3ef1ef8d76b5ca5fc44ae9d53d7b05d8c482394d111d97e29d683c99881eff6a75680f80588b8d65b3b5d695904bcec293186a89b081d9222db38ac39d0a2eecd31573f2112aad77413543b055bd05eb4a6a244845ab8d38e3e5570b7e27284339cc3b3f4893162c3b583179cf76f3ee95f80986bbfa1675f2853e81a06238422302d9cd4d5f96065d69239ad09f21acb1ee76b170f3aa1a5472784d8d0c42f12ed81eb6847cc9210e552de12e5096953c2f93884b5583732717fcedf3a574cd0cbb72dd7f5f7e18a76e8dfa38cccde28cb1e881d907c2e21e66cdd87499b2b73cfeb1bae844cc9eb1b8fe605d69dc2c30fa820c6c27b88d0045c1b77805d073e15e1fbc41acedc80f769fa2a66e03c3e70f7373be4187aa20d2c54275ed567ec6eb6e26f36ac4268dd3d6742ee2800af753133730beeac47dce30e840e38d7878507c8b7dc6dd4fa62e10ded8d1837f24439f043f81d7cf2283aae337416ea67133767d7bbb57256b50f40fc62efed12b3be858de7da47bbd1d52274cbc2bad52a70d44b601c6b743ece4ccd15a25b5c7d6902efc65cc2ad5d5dbc7488b1d320c81dace0c711375be06f038f9b937d39aa0d6deb4bbc730f1b62ccfa1bfe26d469b6803889d75374407b60ad455d672d42bb347beea835bc76b015bff7e601bef56812dc1913d61e2cd7a7ee5dc7d56921dc4bee5936e46b08505f417f754dfd470e69370d7fcff929c03cd5fdd96dc0dfb37c0c9bb6952d5a5c0556573f43d7004fd21a13f770d5b4b29a400dded45a7a51bbbb30fb60ec0c0c4b60b46bed9f6377f18267ee3b5c730fa510cbb6448d5765f1813923652e685fda5ec736813718d31058871ca94bbaf8f97a1457a374af026dcb0e904150333227333284b528ed533d68b7f2bdf0f28a46039533bc0be77265f399d7b22cb88c38dcb017888c13450059198c7de66a3b500c61c30250a6dc03f4d79f2c5cf26434f9e0827dbfe16f3df4c65a61ef69e5afc23d69e8e6c6aa856a810deefdf8d70cbcb6ad2b9e4db0f7d93cdb37c498a93a8f17e4c867ed9f9ba0a678312bfe5d0062d30836ab03cf15f728caf7c7f0c8b5ae208d8090f1a4e4b98fa6de5c7137a3f66ad75dce9cad9788030fdacfd5d6ba5f1a0ce9e03983775fb45e9985eff18a22bb5eee302986bf744174f0e6d5b19b239fd6da9bf888cfbcab0ade80177b33702b307508748fae612ee1411d78e30a5adb19d838a7bfffee98174615f36a9e81917f19b1e2de149b71e7fd3157522fe4695cb54ec0babcf6f2aae74b3b42e44aea6f8736b2e81cf6dd6b5f04f7ab4ef0fddecee8a9daa5c2bf73ea89c9fccba31e9077519d1e80a0c39970fccb11cc3130c580b9078ba610272879485d32442679d57e51c7587e86f71f20ff54bcff1cf9fdfffef3b7ff077a0d4a88</data> + </image> + <image name="image4"> + <data format="XPM.GZ" length="67522">789c74bdc79603b9b2ae37bf4fb1d7e5ec2c2d5e9ab4030de8bd7755a5a5417a3293de93f7e585c4ff03bdf79174f254777f3b0d0281402060f9bffeeb5f3fd3d1bffeeb7ffd8fdbddbbef827f055beffaafff0a1f87c3e7fffabfffcffffd3ffea763fd4bfc7fb56297ff55f99fffc7fff89f9bc5bf827f154a5649fc5fce4951b257f24ba6bc3f921c94ec5224ef07e4a8e4e69c1e248782e5fbb1abd992cffbe4b8e4e57c467a9160f97cf6d56ccbf71be072a954cdf954911cabfba72a58dc97f2c72dcd4ece8754b34cef50269791debea9597eff50d20c79bb9a839c770fcdc87f815c29f952fe5acee2e3ccdf29068bff457eeff0472ee3f9a4a5597e3ff6c8959221b9a959e6f7f0965c161a2c4bf957e418f9df0760f1bfc8f288dbe40ae4d9163487327d8f5c457e8e91e48a2851e82724c7d0e7de07abf2487fc94afe02b90a7b499a9a657ae9916c40beec8f6c42fe4346b690fe16f25595bcfbba66c8db241b787fe76896f74f06d9a43df71497251fa57d89a76394c701f931547eb62ed9447ee39a66591e494331be97edc9943ff6354bfded8a9a51fe1dc565599eb16255bf42c5f8fe662cd914f551ca779c9359df4e916699de99f785bea4be931ad92ccbfcec1b640be9ed06641bcfef909ea5f297f63543de2fd9827dc51fcd52beb448b6690faee232eaabbaef523f4fc5b8bfdf48b6557ddeafc906f4173b6407f2edee9a65fe766fb2cbf2eb923dc87f44fd146f43bec3875c46f96ebb64e67f5b24bb65593fb35fb2578a735e9f24bbc263c25f4ec811fd41192cd293f2ef6cb283ef2575b25796efc78a7dd8ff26268715a98f05bee7955cd8fff28fecc37fac9b9aa5ffd9c19e3c551fb74332ed2b3d917da4bf73c901f495b435433f077288f2d9ee15a3fc96d25f0ae95de8a37b267b288fc6911c505f53cdf0efb0575fd8af4c7f3324bb15999f4b9dec217fdb1d593c21f3a39e0f68df37c5903fb2c8947f05fb094afcde3221539f3bc82bde867d65193980fee2b76699ffc824872cefa162eaf7458ea0df0df41b088729d35ba03cc4dbd0c7a044a6beda2f7284fb1bf8ff50b7773f6483e5dd233b90ef5223b33ea46732f5930ec84adeab66d43f931c41dfb14a3fc6f7b60bcdf007237085f56d26dbf372a4e28bb54f0e501e7d971ca23cea7732dba30dfc5ba4dad37d44a67fd8f6c92eca6bab9e8f20cff64b56f2d634cbfceff87e85fadc0c1457647ddf34c92caf19fc572ce497f2ae86e410feb4b723b3bc6ab0973c3e81bf8dc816fcc9ee4066796d07640ffe62db21b3bcb294ccf2d86ec97159967f8cf28f4575427df535cbfc259166a9bf88f25754bc322257f0fd7d8b5ca57e141b5529cf4afa27a13dfabfe695ccf23b5fc065c69bc73a99fe69e79163c8b31b8145c001f96c7285ed75aab88cf2516c56a5bc9b99e4b2d27756277bd0efce2007d4cf881c41bff10b2cfe17b4677dcd28af02b9427d7e35a3feadc806e4df7414435f3bc897c743f2f9e382ccf67517936dd8eb3521b3bdcc7ec831d377c04abe2dbf2ffe0ffeca265729df926c507f5bc5d0df4ed69f4a1e7f49fdc416583c2ffdeba64f36ab883733b2c5ef7515e37b494a66fbb36e939d2af4b3d32ccbf72beb67258fbf647a872f99f1d2ea44762ab27e5cd47dbf2cebe315f931720d4bfb5b920dda2fdf17f221fd1ed9467e360db20b79d667cd527f6b595f2a229e823e575db25391e5733e933db427e71999f5f7b02347b0bf5d00163540a677ad902b28ff9da919f53b24dba89f9b844c7d2663b28bef5ff07d4bf587d236d9c5f7d75fc5907f7d207b687faf6532dbbb0cf25b423cd85348b62bf27b2bcdd0df6a4476a0bf13d2b395bf890cb2057fb7b314439eeb8e6cc35f6e0332f53dbd2846f92d4b9a657ad188ccf621192886fdac43c555d8f7871c18525fd3a266999f139e77543cb5f821fbf8de2e23476c4ff7e498e50dfb73440d437eda6403fa4bde641bf98b0db25b81fcb16699def44f31ca7fb9d50cfb7c68467fa34266fcb9aa2aaea2feaaf43d03ede59aec23bfc95031d21fd515a3bc1717cd486f42667c3971151b32bd8f6c4f736bc5fd7989ecc2be573f8a91ff5d4a0e189f259aa53c29f4e18afa84f87542a6bf5854c81ecbfba859ca331c917dfa83b362d8c398f25502e8775ed72cdf3f81bd3c2297e9a5641ffe78d8270788e7176d7208f9e67772047f3bff23c715c44ff0e79ef0d832bdb447a6bd4c5a641ff26d0e8a21ffe6420e50be9bbb66a9cf0de5af847cfe4b8e717f72d48cfed0145c2d419f4dd8bbaffa63639fcc78fb7d538cf21b3dc98cbff73f9a11cf27e408fe7d8dfa28b459c1fd0999fe22f990e9bfa201d9477ac3bb62e4271e9143d8cba6a6d8c078d94b33e2bf393936256f287fb564c8f4665bcd52be6941b129f5b944fe83bc879773eb4c667bb15b6896ef8f6764f60f265fcdb27e2cd78ae13f1a3b32fb0f2b5f31fccd3224c715f9fe1af14320f429d35f5e35cbfabcec92cbb0b7dd945c857dae078a111f6fc764faa7bd4756fddda766f9fecc2087b4c73d39a23dde34cbf7c73139a67f863f0a847ee5f3b38566f9fc94e9e7034252de0bb962c29e50fe61de2397f98d34cbfa3b7f907dd8c7744f0e108fce7e14c3ff2ca0ff504434327f377ebfc2f185fd92cc7865d0538cfcc44332eb7f6228863d278966d99e446372ccfe595f31f4bfc914c37e370fcdb057ca2bf483f664ac59de9f9cc822a490fae2f7ab55e87bb5d42cf5bd6c6996fa5acaf19d4ade3f437fbb47f6618f53759ffdf7e799ccfe6886784cf4c7c0830a3960fc1991e38ae4f98f62e477c4e7f30142799fe9898056d6bfd95433fcff4a31f2333f6896f91977c855d8d3a4a759ea639d6996e531f5c906f53bd20cfb8b3463bc07efc7f98887e48e66696fe33999fa5ad714c35eee7572c8f183ab6629cfecac18eded0af523efcfc9f24d999e8ae7571bc5e8bf2c57641bf53ded92198fcd7fc96c3f976d72047dc7f017b1e860c8f7273bc5b0c7f945b3d4c7e89ffbf27bd3896294c76c46aea03c562dcd685fcae42afdf15431ec61bcd38cfaf0d52cd31f2e344bfdcda93f515e32bd69a819ed6f57b3ccdfeaa059ca3f19914dc8bfa86bc6f7a57fac96547f665ed68cf1ab1e99e5dd37c921fcd1e8a519ed47a0599667e742667f3d6d9163d4af5b0856fda784df57f52bae82c5ff22e549b6e44a05fe31500cfd0d26e42aeca1bf508cf67530d60c7bb828a63ecf9ae5fdfe51b3d4cf34211b5594b792cf80bd0dfa9a65fe17b16294dfe01f96f20f979a65792c469a517e57b209fb9c469ae5f3e3ae62d8dfa4a319fef1ad59b62f8321d9823d0e379ae10f22cdf007321eac9655bcbc8cc92ecaab7b2407a8ef6bcd681f66bfe410f6b53a9323c4a78f3b588d1fdd86e432dab7c10fb9caf1d40e99fd8bf587ecb1ffb726c706c663513ee52afbbb2b5731ca679b90196f2c341be8df9c35a3ff59275710afcc999eaaafa303d9403c315b6a467ba2d237183f7c34e37ea219f6f1269bf027fd9962b62f7bcdb06f5333ea83a119e5f90fcbfccd32b2057b9ace34cbe767a962c83b7c6946f9ec35a3bdfde73ee239f53d1bf9991b9ae17f9a9aa16f9bec9a187f81fd55d4fcc8ea42f6d8bedf35cbfcced47dc6df931a39803fea25e410fe685d504cfbf82547688f1efc5e85f345b735b98cf8ec362773fcaa7ed42cf3f77e900dd487458bec61bcaab622331e5def354bf9174d32e3d1c55a33c6f77cb28a47e02f44b88cef2d178a612f49955c417cb76a2b867d6d6332e3c9d54a31ec6b44f9843d633ce8aa19e537570c7b9ba9e74dd4d7b6fa9e09fbe936354b79fa27cd529fcb8a66f9fe28235bf0a7cb8266a9af41a419fe71ab59ca379c6b96e5dd576cd37f0f14d3ff679a118f389ae5f3cb29d961fbbdd60cff3dd60cfb7a913d13f10ed2ab961dd8e7f24731fcede24066ff75d5d78cf6483deff3f95fcd182f0f344b7d9caf64b6cfe385628cb79d4a60e18fe5f3df2699e36ff72eb9c2f1a51dd944fd996dc816fc7b1fed7155f85b94574733da275f33c6132d7205f6d767fe557cbf6d900dfa6bcdb0efc54ab3cccff04b3691feb8a719e53fd52cd35b9e14c35eba0ed9c2784bafa418f56f962886ff6eaf35cbfbddae66d4ffaa66f447e6641bf1c928550cfbebd5344b7b1a6c3523feea68c678b1497620cff0a919fdbf50b32cbf794b33fac736d9c5f7562a7f3eedb5aed892fa5e399aa5fc3dc867e433d2f2fe55b3bc3ffb23fbf0e7f39766d47f8bccf9cfe94133e67ffb9ad19eedc91c4fa9ddc931fb2b686f0d353f714cc8069e5f6cc81c4f4c284f1e51c8fb5bc58817974bcde84fbd35cbf77bbfe40ae2b5dd852caa98ccff4ab3b4af9e4a8ffdb138229b187f6bcd15c3bf2d3dcd885f995f619fe83f9e14c33ee64bcd189fa6feaa36f4373a2a867f1e198ad1fef76e8ae99ff79aa5bcdd9666f497166407fdb7de5731e3cf54b39467116a96e9f7ca648e270f468a11af2d6b8ad93fd6cfa37e2d2dcd182f54fa752df89f8cec417fc38966f82f4733da3f95df80efc35f9b6a7dc8fc4d663c3c5e9239ff3d2b6946bc7725071c5ff825b37fdcf735a37f5fd72cf3d7f7c811e7b7c69a65f92cba9a617f4a9e18f5a70efb30f319d39cb3985c457df87cc906fcfd8ef2576cf4ff7665b283fab43a92395ef945fd36457dc0f88d45ae703cadaa597ebff724b33f3aac91ad2afae37dc528af6447b6319ed853e9d9f0dfe38a62d8d7fca819f7d5f71cc42fc38f66699fa3a662faef8666f97c67aa593edfa77eab9cbf9bc68aa18f85cabf8bf66871d70cfb7b6846fdba6896df1b4e35637c7ea119f6add8437d1ca79a51bfdb8ae1afd7fa3efcf52023fbd0d764a219fe7e4b0ef1fc4aa5175968ef20bf9edf9b7f34c37e1b64ae67aa5fc99cdfe99e34cbef37027288f9c3fa991ce17edfd60c7f3c24737dc518fec452e377cf0399ebefbe0fcd529fb51a99f363bb3fb281fa7375c90ee6cfcf0532fbbb4bca2bfa9bf00f283f4bd8bf94a73e235710cf27945f6850f23c23dbf0efd38a66297fa7af19f30b1332ebdfe4a618f636fc534c7b596946fc7227bbb097de43b3b4976e4733c6ffda640ff5a1f7d10cff6c6996df1fa8fcd1de1663b28ff4fa57cda8bf75cda87f2dc5f0b7eb9d66a98f09cbbb1a307f0dc58c47589eda3e915f5badc7e83b64da5f634fe67c6123d30c7f7dd38cf90dc55cbf517b90633cdf42f9dbc2fe309f53d08cfc07e432fcf5473d5f41fdd81415c3ff9e4b6417f69a6dc911c6bfb28d668cc7c37e6c11d1c8f71b43b209ffd6b5c916e293f14131c79fbb641bed6d73a918f6d952ecc07fb5169a657eba75cd888f5d32fdd5ca508cf26aabef79f4af13cd90b7ad19fe2925fbf49767cd523f839d627c7f38d30c7b9a9303d8fb52c913c0bfad9f9a31be417ba986907f5e558cefad682fd5d8427f0cfecc51f6d6ba92391e512c6a96fa6eaae7697fb52799fdb1e65933da933e99f3fb6dd8a323ec09e5f30f63fce148e67ae746aa98eb4dd79a118ffc6986ff52dfe3f8c561a35996cf7b4e76607f9f5f72887874ccf445874cdeaf4fc91c2f38bcc816e613e38766f4f7d4f3e27f91f61069c6f8424d31dad74b83ccf9b5f64631ecb133d32cf5d75c913dd8f7bcad98fe64ac19eb190b64ce8fac978a614f9db166797fd2d78cfe95490ee8ffde9aa57d8d7a8a196fee34237e50ef87a81fab58b185f683e525fc1ffcef5533daef2f39b6b0de81df334af09763d883abc6132e8a03aeb73b2a86fd8cde6465af0772047bac5f3463fc8aefabf185b5a719feff4be6f85ae746e6fab7547115fe7338d08cf1b72799eb5bae3199e3131b9fccf9a6dd96ec633e69572173bef35b22c7b0b709ecd115f60bfb1a93391e350834a3fd1e925d94d7f4aa59d6c77e4a66fcd6ed6996fa19a8f47cc4c35375df87bd4fcb8a612f19e5ad72fe7d6e2ae6f8d78f66dc9f9343a43f192886fd8cf79a613f4fcd88ef0c72c4f1dbaa62f8cfe5881c23bd31ea9ba7faf39d2b99f3afa30f99f6f37d9163fa3fe4cfcb57584a79fe6159beed27b90a7b6a1cc8f45f971e99fdb301eab357ad707ce7876ca0ffd2e8932df4576a4bb28dfe7e67ae18e5d1e1f7957fe974c91edaabce4833de1f90e93f261639e0f8cdaf62e87f5926878ccf1272047b99bd35a33c3e8a515e4b5333f43921c79c3f7234633ca9a419ed774331fcc57aab59d6d735e513fe04feb3a019f680fcf8aa7f3b3d9255ffb54766797f21bfafe2f9494333e28b07b982f26e5ec806ebbb4736e93f9a641bf7cf53cdd23f7f50febe1a2f6c2b66ffb2b9508cf1c6ee97ecb0fd28905d3c7fad92b9fe64db54ccf6aca698e3d503b28ff981de5531e74f8ae480e3771dcd18af0ac821ec6dd455ccfaba22478ca732cd184f1d9263d8d75aa51fd3fe28bf51e2f877aa19e36d7f8a51fed312b90c7b9c203e0c54ffed0b7b0d543c3c3d6b96f9f93ec98c4f66657215e5d750cf1be80f5d4b6407feaf6f90e96fba2639863f7d231e08f2190e59bfd79ab13ebc4ae67c48d7229be8df1dd5fb1cefee868ab1bea63e21737ea1ad98fdffd64cb3cc7f6b45f6605f8d8166297f7b4156ed7f448e393f82fa1188f2c07aa28a668ce73615a3fe4ef97d513ef0cf889742b51e7ffaab597eaff622abfa5326b33e77f1bd50cd77f6779ad13ff4c936dacb4e4a76b01e64db22bba81fdf5fc5686f3b6dc5d05f7b4666ff34fe2373bd687b4e66fb373a9143946f1c93397f369b28e6784aa618fa1aa03d09853e515f6e8ad1fe4e289fd027c6132dc5e81f2cbfe40adb53ca671816fc0bec3daa985c5f17927dc45f2dd86724e269cc67189a657e3b4db205ffd3bb90191fb7a764c6c3dd0f99f1efac4ef6d9be7514b37fd7d78cf9ae3139e2f835d928737d775531f33b215b96b4c70ffae7b18adff63199eb4dae4732c7f7bbf06fb1a89f58bfcef7f3192829ef826c401f53759ff335ada16669df6dc5f4efdf1fb283fafbd990b93eb93d520cfbdd9dc98ccfe23239c4787f1ff6116bffb82657d81f9d91abf4b715b281f672b523db96bcff91df334a6a7cea7d225bd0cff74bf6e0ff2e7d32c7833b3b703ee320f3f3ab18f1cef54036f1bdd6984c7baa2dc82ef4d76991399e3ea77cc27eb03ef60136b8de334e3463fee45731fbdf7c5fe41fe36b2ed9b210efbdc9ae2dcbe72df52faccd647ff7a219f5e541e67aecdd8aecc17fdd8a64ee97b89e34a3bf9a92b95ee032508cf6e8b005abf54933be2fec11f3759ad91e8cc9b4c7e69cccf19636bf2fec4fd68fee9becc2de5a1372c0f1982999ed7d54011b5c4f9b7dc865f4cfe7337295f1a64d36a1ffae4bb6507e0f944745d897ccdfeba859beffb8921de8ebf30f637ca043e6f8d96da119fb014be06a19fdfdcf8a6c62fc6a32538cf8bcbf550cfb6bf4c85caf529f936d3c9f5ec82eda97d640319e6f8d344bfb7e4fc91ee6af3e6bcd182f6d2a467935d4fb3ec6338e2139447e7a0db05141fddf527f8609fb9fecc936e2e7d587ecdab27cefa85f55b5ffe675d02cd3bb37c91cef38d6c85c9f7dbf91395ffa6e934394e76709ce57e049ffb12173ff586d4e663cd39c69863ece64dae7a04a66fb19419ff98428f6b73f1523be9d303f8663c9e7ef90cf10f623e57d1e354b7b7eedc91ef2df7928867d5fcf64ae7fe85e15237e7b2b0e90df7b83ccfda7ef1699fb1db34831e2bb1ed3cf572c49fbe2f744fc87f5f57d32edabbd23fba88f034f31e2bb01f36770fde2b04836183fc46413edc50de595efb792f2b6df8a614fb70299eb793f0f7288fd2cef0f99fb55df4d32f7f75d86e07cc59fd4e75533d683dcc91c4fe9bec86c4f5f73b28dfcb6ba8a315fdeee911de8a7cfef89f611ed01ef8bfa80f5d9f09f965abf7ff3c801f2ff596896fabff9e02ac793de5f7219efb7b7e40aece51690d97fe817c816f2d763fa6a3ebcd523b37c63f82f4b9428c6cf5332e75b96137280f63b837fb045f948792f8a999feb851cb1bea23edbf90a5a69af1dc5b0df779dccf18fddaf62b477e70a99febaa39e57f17483ecc1ffb5fb641ffe6d3420733f5a734d8ef1fc0cf5d7ce3520cb8ff2a9f639c9c83edac7695f31e2e1554a8e6dcc87c0bf384a3fef1799ebf15e280fa7ca78e2dd23737cf0ddd58cf1e51ab94affb6d62ce5ef6c15a37d684ec8cc4f734ab6d15ef73664ee7fecc78ad15e4ed5f7fd0ac6db0ae418f5fdc2ef8bf619eb3128bfe1225e98988ab95ec3217b906f5452ccf118ea4be80fed2fca371fbf94f6f87e9363d8f71be5edaaf5b0a9e2329edffd902bd4ef93ccf8baeb2b86bddf566403fea53922337e6e7435633e1ff9730dee3f99458a315ef081fff0843f46ffa0a118e9a77532fdf1a74de6fe931af4e1a9f503df32d9467b531f91395fdaee9219cf5e14c7dc2f82f6cc33b85ee18bf2f2d5fe980ffca52fec51caf7e99059ff3e2d32dbbf669f6ca0ffd2a9912df4976b1bb28dfe6f537ddfc1fa9cd696ccfd89cdb162bc7fbd91b91fadff508cfcbee0cf7d83fbd956686f7c11eecbf7bfd04f20f207f9a7e418f1c4b7af59e6e78eef05ca1f7dba9af17e5333f4c3ef0bfda07fdf2257b19eafa119e5751b900df88ffa906c627dd09bf254391ed154cf733d53f7a918f6d7ee9059fe2dc51eeed73332e773cf686f0283fbff877572087dcfc6648eaf7ef1bd50cdc77e619fa1c83fdae30159e57f45aec05f348be42afc59a3a918f6f0a9912d945f83e989fca13fd0223be8afb654fab48f1af41789fa24bf97d6c83ccfa1de558cf6fb4b56fd9bcf845c86fd7d079ae17ffa64ae2f4eef64fadf469b6ca0fc7a47b2c3f541277284f288f97e6e11b27dd99023b42f19da9f285fc024e5413c102bff57477d8dabb4f7ef98ccfec677a819f2abe7595f6b75cdb2fc6b53c5f0c78d06d944f9bc997ebe0244d6ef2fd986bdbd0764eecfed27e408ede9e74ce6fedb1eda9758d457acbf2f91b93ead26e5354b2abfdf2539a67d4d34c3be3b9ad15fea83ab25c8fb1993b9bfe63bd58ce707e42ae2df469dccfd305d83ecc0ffbe166497dfff2373bf46af45667bf01e9263e437e27db38cf70f157205ede7e241ae229ee8c66403f1e68af29bae23bf5f93fec72c0b7d617c790e16f681fcce34a3bd686bc67c528d5c457e9b3d32fd735b3def22fd0bd353e31dd7146c72bf494dd62f335fbf8ffd00c86f45c9536b90cba88fcd36b982f6b736218b1e9c94f74536a1afda91ccfef7feab18f78f4b720cde237fa27f8afef3f98fccf6e46c91038c1fd5600f55e5df6a7d32e3eb5a47b3d45fab4ee6f91f8d2fd9447eba0f32f5d76a923dd84784f211dd7fa4df5f29467c5ac7f70cd53ed5915ebe9e17e3d763cd580ff1d28cf26893abd477876c23de6b76c9dc7fd46e2946fcb75b933da437cdc006f72f3622b2c3fe0ce5111e0bebf97ec0790748e6d725b3ff5d833e4cb5ffa8de2273bd4f5bdde7f847ab41e67903a32dd834505fd60fb26b637d9eec1f9a96f287ad1a99fd9b2c209b1c5f6f9079be49b345b6f97c93ccfc9dab60d1c3c17aa831d9c7785654068b37a47e22be6fdaf0278b25d9b1a5bdd6219fadf5d1201b6c1fdf8a19df37c95c7fd7f9905db49fbb0d39c4fbbd03d828a1bf342c93397f51c7f79c2acf47a8bfc955fa8b87668c0f7cc9b4df6683ccfadab8906db62f1fb2cbf106d88763d2df9c12b2077d37647b69ba3a9ea893e91fda8a4d7cafab9e77789e44400e91fe0ee9bb26c7bf1a32de13c4fad17a6b86be9f6403f969bec836dbc3b766c46fd0af27226e29dfb9083639feb775c83c3fa385eff96a7f48e346a6fdb73e6413faedaafb6c5f0e0999feae8bf4fd3ca295f6057bf2cdd046f9a0bcf27813faab91b9de7e6c820dae07b8f8640fe9dfef64c62f03f8afc00cb9be0efa0895bdb6bf8aa1ffce8bccfdd05db48f61dec396f6e891395e7c199363c8d7843e22515fe10f9e6417f25c36e410febb45163d32ac8f427ee37c059794e749f651df1f093982fe4fb0e7d860fbff3d91391ff16a9123e8f3f5d28cfd3a28afd8f431de7f827e63ab8cf53787bd66acaf7a90b91f7b59241b36c6df64fead921acfddff82853fc6faa405d9477bf3fa92d93ebeda64dacb84df33d97f5bd960cb71903fa91fab6cb0febceae03c8292fcd68cf9a987628c7f9d0d32cb7f7d070b8787f51c63b2edc8fcbc70bfa2d37b9023e4af57010b7395efafbb6403dfbbcaf2b2aa559efff8aa81457ed15fbc81f38846f2875c41bc3be8927d8cdfa67bb0f802d663b7c86ccfd609d971713e14f46d186c8f3b67b0c978faec93d97e4690371f6ec2f8f2966ca2ff90943563fdc35931e63b5f785fb47ff87e94822d0bcf6748cf32180f749664c6e767132c6a24faef19d8e2fa8fab6c0f2cd1fb447d7ae27bb6c1f8edb524f3bcaa179f37395ed12c90d9ff7f65648e37c5280fdbe2fcd182dfb71c5bea6f0a7d3816d717ad6372e8c2de71dfcd4720657d4fc801e469ff8145c40a7bee90b9de728ff2cffdb57cfff447e6f93ee71b99f3eb29cac313ee18e7b1a0fe7916fbdbd18eccf993838c9f04717fec674b663cd780fdfb26d7af8da7605143a57d9cf6649eaf96f2792b447a099fb74be04cfa4f2b30d8bf4b2be410e98f866093fbffa312d8e2f868d42687907f3c540cf96e90275f5f80f613e515e62372d25e2232cf0f89501ea115a13d79e1f948bc2fbfff84bc91c1f6fcd42273fe2145fdcffda97cbe0efdc6cade5f5d728cf6f43d52ccf359a0ffd87231ff3ab7c076c9c1796c32deb6457f0bf1d2714b3611ffde1f608bf39d5106b6694f57195f08e2fecd5b1f6c727fdde543ae727e694d3650ff9e7bb0c5fd44ed0b99f3fd0f69ef76c5e07920d11fd8ae60fcf52cfb4b79f887fc0ece64aed77bc7e408fe3efa8285fb4179d7c9dcaf7f92e52f3af716ea773b019b9c2fdff3be6d71ffda91eca2bd78431ed3e27e9b3bf26389f05ae667ec8185bd61fd8e05b6234fa61fc9feab2dfe8ffb47ba640ffefd81fc39aa7e9d517e8ecdf9bafe9aec617d4b17e9096de07eed04b678de585dfa2fdb33e92f3b0999fb9ba21ad8e67e922826733de31de5e7abf2affd804d97f14b44f6e0df0e7532c7dbaeb09740e9bb5b059b5cbfd1803e038beb295a27728cefbfc78a713f2a80c517305e05fb0b4deec74d9f648e4f65783e52edff3524f37e6f457621ff634b8ed17f78cdc0a2c4d1fe2fc901c6b3ae0699eb69e653b05376e1df64bc6ac7b603ff107dc831d60fdee57d477837e8376b812deeafee3fc955d85b73438e30df36d982ed18f639bb83f34bdab32c6f27af7f586f6681c51730ffd423737dd34de6c7c9e3119c0f792333be98ccc1a28542fb8cf7f3fa8af9eb1a99e7990c1b602101e647f6e40acbb34866bc3392fe4874a7b8dff91c90b9dea98efc1826fb3f8d2939867ebf15b0c5f9d9574ce6790dcd0c6c73fdd989ec9420fff54916976ccfde641130487d40bfa6c9f36aae7f64a65f4479c80e9fe48266f97e31d62cd32feec8a2ca4bff2cfd976359f4bffd102c24c0fb01d9827c454fb37cbf9868c6fc3cf2276a1be47d47e03cc291e9adc8dc1f54e47d21117eafc026abf442b24d797ccde8efce35637fd384ccf9af26f4e598dc2f9c2dc116cf5b3a35c926caa3f943e67eb127be2732047b89a16fc7f1309eff863c6e3e0220ede7410e58df9764ee7f4d5f60d1fe617de45d33f627b5c99c2fb8cdc036fdd119e5e93a26e2e984ef8b37307f027d796a7ce49b9169bffd21d8e2fea906f2e3395c7f5298915df46fa32ed9477b7f91fd7bc757f1c2734ef6195f75c83caff4f22687680f86a82fbec81ffc17ecc9775c17f175991c223ff14233ce47fe23c7f02717945760717fc521d62cf5f7299179bec6f80c161108f6578cc8b68df5a528bf40a487f3603d7284f1b01bec2534391e74799199bfc68c1c737d6b1f2cfc2bce9f77c92ecfcb813f0b1daedfd80fc84c3f8dc911f27b857e23e110305f55250788e75ea8af91c5f1ceef112ce259ac0fdc9139bef0ea9323e8e7ea808547c07ad094ec59f2f998df1329c8fa9d599a713ec2921c43bf1d19cf3ba2f541fffa067b14fd71b437ef2599fba767f87e2c6a18e2c33539863e12945fec96d01ecd468a3dacdf92f621ee56e06fb20599f1d6c927331e4aab64fafbeb1eec703fe971440e696f4db05bc6fd70a619f3ff457205fdadabac3f6ed9e47cc6f94be67992b71639463c9bbec116d7e3eeffc801b87e00abfade88c9dc1f1b42fefc7843997ee8922b28afa04eae427fcb06d9f6311f28eb8b5b11fd57f9fe63428e60df57e8af62f13cb3d78accf3a55a3bb0900fe33357728cf8c547fa15d7803da51ed9c4f36f70351f3193edc98accf8eef2005b3c7f6fb0018bf292cf5f3a64d6d7e8172cf481f3193f6403f5bd2bfd919086e7a9d432b283fa715c9363c417e11c2ce4857f88344b7d14268ab13e6f619345c02dbf2feb939b0f98633dd55333ce9b1990196fde7a9ae5fb0fbeafe297179f172d2acea7e3f744fae89f5e34633c07dfb394fd9d6b64ee4f1fa07c2c8bfd9ffd96ccf5a4fb3739443cd347fdb1720f2bfdcd8d4cff700ec95c1f7f467958aabe9c23cd52bec2986c63bd8137d08cf5b3fc9eeb7888a750bf448788f6d02033fe3d1dc12ed70f4f578a6db4b773b28df98dc294ec407f5187ccf6309d91d91fdafe6ac6ef3fdc35637cfa87ccfdc2db9b668c5f21bf8eb02f8cc7e37b8e886f711eff8eccf57ec33399ed718cfa25aa1bead374a7d891e55918901dc85fe86bc6f9ad2732e52f8c1443ff6944f6217f3cd78cdf776968c6ef212879d87e77f1bc2bea2be28132d982ffefb5c122e0437c02ffe92a7f7f82ffca5f90f92d0cc92ee4cb2e64a69f303da15fc40f7bcd585fbad08cf900948f6733ff4fe4d773781edef042b6e0cf3fd097273c1ec6d352c5a85fe309d980bf1b8fc9167944f6501efb3e99e72315ba8a617fdd44b3cc5fd8220790373e68c6ef55a9f74394976f6b96e515a69a717eda9e1cfb386f0bf5dff34a3ece7b80bd8bd690f14e85ccf5e8d75f32fd53562487ec3fad34633c84cfdbdcef3542f9faa20660ffd74b31f27fec935dc87f30c91ef29729667b5de828c6fb873399fb23f73dcd52be70aa18e5132d34cbe7c38c1ca2bd0c77e408f614ac3463be1aed576045f08f17b4cfe26ba8bf75e83bc82b80ccef5b31eae3ac41b65dc42b6732d73f1f0764ea635cd48cdfe7ea923dc837ba69467be028c6fce8c120fbd0c7e1aa19e5632ba6fdfd91e9bf0a3dc5984fc9d4f7687fd18a1cc13e83b566f8dbb6629457a8f2cff3127c47b3ccbfef6a96e985b0d7c0e37eb517f4afe3eb0cdf0f6d9e9fd543fd0e557bf3de934d946fbf4266fcd273c8f4f7c7a166999fd15533e2850e99f31ddd1d99f636ec6846fb3e510cfb0b9be410e5f7bd68867f6e28a67dabfb3ccfc4ff92197ffb35c5fc3eea5f28f405fb5d6a46ffaea559a677413c18e9f6b447f639dff121333ec8e07f457f03fabea0fca37c4424e70efc67944734d27e0b64b65fa33bd9a53e999ed2e7e9a218f9d91734a37eb4c901f2734a35e37cb1b5668cc71ec9b4d7c14a33fa6f65cd525f614933fa8f1bc5881fa21b99fddbaba519eb5fae9a65fa859662d49f704ba6fd4707c568ef02d4f7c82ba1fe863fe432ebc75bb3fc9effd18cf671af18ed4f1bf535b6381e79447e629be78d5f5b9a71de0ade8f45048ef9dc13d9417aaf54337e2f91ef0b7da13d6d6b96ef371332edb7676b467c3223f33c8af34633ea435d31ea43a1a919f345944fd833da8faa6694e74231f411d6c815a4e75735c37e64fdca6b0be2975b83ccfdb89f884cff3fdc9363eecf8ac1b68bf2eab96061ef888702b207797b3e99ed77e7a019e36d1fcdd06f5731ea4793f228fdf67f14dbd8bfa7be477b6b6e3523be2f69463c7cd78c78ed5731ec71b0d02cfd81ff02e71a92f6e268c678534d31da97c391ccfe816f6996f9f5dae40ad2f3ba9a657a5e5f33daa32ab98af4a3ab66f4b7a47ff1f29f8b94ed7d0dfac8c7a7e5f7da67b0cbf8b475247bdc7f922986be3bea3edbcfd34731ecf1999295fd6bc6fbed1399f1c5e3a819bf37b7508cef3577648e870d969aa57cc39662f8c7460256f6ef9b9a618f9e62c43f3d7d1ff563d8548cfe85ff24b33ded1514c31fdedfe40abe1f2c344b7bf27a8ab99e4d3f0f790b1fc5180ff23ae42afb336fcd32bfc18c6c409ee0a519e791e17ba236a33dbb1fc91c5fc9f07e45d803e697566475be30ea53c509905e2f04abfed33b2373bee47b550c7b6d1fc88c679af00715551eef944c7b0f6a9a51ff2e9ad19fcf14b3be19e40aecc17f68467bfda398eba3df9a511fbf8aa1ef934dae22fde0ab19f5794b36d03e159e9ab15e6aaa18e34b5b253fdbffe0ad19e7971d15a3fe3ee0ffaa963a7fb9468ed8ff80bde6cb0971bf49e6fae701ecbfead0ff4ca19f6adea397fa38911dd85b3723b33fd94dc921f25fbb9123d8dfe748667cf5e1fbaafc9e3b32edbd76d10c7fb4d48cf5227bc5a87f6ff57e95f1da4733c6f7be9a114f3f1443ff27f5bec17839d18cf12b5f31f47db2c826ebd74b31eca157d58cf3f1cf64eed74fa78ad9bf3890399ed381fd19167fafe982ef1922bec0fecc22d940791e1a64ce7f5f618f868a5f5e3b32f5dbca34cbe79f5b32ed35396a86bfb234637eb9ad18f5a9abdf477bf9d9930dd6cfa766f40fd78a610f3d4331d6479cd57d8e1f6e4f9ab1ff4fb185fc057332f73bee6a8af1fd3bec335f1f20e5ed37c821f7e3a1fd366dfeded3b54036a1cfe181ccdf77383f35637d09fc9de954311ff61a825dce973c4ee400e5fd86be4cd59edca66496d7634f663c75782a86bd364332cbabffa718e9b533cdd82f43f9953d6767cdf0ef2fcd527f5e4b31e4f19a9ad1df2c934dd88f7f574cffbdd72cf55dd0f7d11e3e943c16d28fce9a515f978a217f1dfedf52fda56146e67aa2fb99eca27fd256cfb3ff3282be2c4795c78e4c7f74877fb0543cd682bd58a23c10ffedc9b4bf34d48cfe6349b3d487d7508cf7fd2b99e35bfe4d33c6b334c3fe0b17cdb0ef0799f61d3a8a11df240732c72bbdba668c7fcec82ed2fb227fb6c5fde57d3c6fabf545cf02d980fd5f5cb2097befaafbecffbf60cfb6f2d7c74031f2932ab6685f35c5684ffc0ad986fd14ae8a315f5f386bc6fe4acaebb1ff14dc3563bd86fa9e8bef7b5fcd52bec25e31f41b531f1ec773f71d32c7c76ef077f9f832e259e4c771d85e8c2db285f8fc89f6c351f17393cfe71e46a6f743e678699c91997fefad19fd2fc50ecaef6a6ac6f8d24e31f2533869c678e687ccfdc451a019ed914ff6a0af78a719f1d45133fa934a5e0fe511aaeff9906ff7d52cf31f4fc91cffeac9f139913a7f4f63f026f3f79fb22999bf57b0df91797eef21d28cf5de1532cf4b3d7ec82ec7334b649e0ff750ef73bcfe9892795e5feb97ccfe5d9bef3baccf4fcae784d0d717f6e9aafe4408ffe38af2417dffd32ce5f13e9a116f6cc83caf223a6946bc78548cf51cc18dccf1c928d48cf331d4f77cdafb4131ec21189303c6c347cdd88f8ce7853560befd3c22f37cc44e4c66fff68ef6c9cb0ff093df9f925dc8174c34a3fff9d28cf1831399e3fd6148a63d793772007b2da48aa18f2becc9b7f9fb5fbd0599e78b9f3c32cfcbbd75c91c0f1fa0befbf98c899407e5e92b79bca766a94fefae19fd878cec23fffe5e33eaef4ab3fc7eba518cfa53d86a467bf14b66f984137288f4bc8b66f8bf113962fa07cdf27bde951c437f37f88f40add7a9fd92d99f6ec21f041ec7db43c51ef31391995fefa1597ecfff21077cffa519f69828c67a287f43e67e91507d2f627ecf9aa5bd851e99fdf516daa3d0e2f9f343d887a89d88974f3f64ee8f6f3864f6573e7c5eb5cfcfab6247a65f3b936dd697353964fbbed38cf1f9a766f8cb4831d65f05eafb2cafa4a498fe7a4c66798523cdb2bcd38962f43742e6df2f21bd23f21bd921fa071fe83b5f9f82fedb4831be3785bc916b623fc113f53b52fddf47463690ffe04c0e587f2f64eac33b69467cb824476cef53cd187fdd6ac6fca8ad18f6518835cbe78b884722bf84f5b98ba7621ffde521b9ccef1734637d0aca3fb6793ec47b45e6fcce1ef62ab4cbf9872a99e36da941aeb2ff3a23bbb0f7e189ccf1ae26ec3516fe11f583e909fde0f705fe14633e31b890a9afa2a518fdc980dff7389eebc79a616fa16207ed3bca2f16fa823e3dcd88c7127219f19aafee737d4e43ea4f5817db835e9fccf3765397ccf36d2f0958e9eb5b25b33ff3e27dd51ff72332c7ebfc0599f90b879a115f1f14a33f111cc1b944f2f9a266f8e74433c66f02c5c87fc0ef09fb807e7cc5d0b7b72357108ffaea3ec7d31ef89e781bf634843c6587eb753a2b32ebc3b54ee6792d6fc857f6d83f0907609feb85bda366b4879966cc5f4fc965ea2fd02ce529da8a919f89a1d8c77ce39e5ce1fc404131fc811793ab48af05fd56d4fa9f16ca4ff44eb99e05e5557138dff82993397e737e93395e365a835deaf3e28145ff01e3a72138b730c97332f3eba58a513ede5e33d6c39a8a5da9bfe24a33be372357d8deb89a11cff515a33c8a8e62e827b991ab68bf0b45c52e7e4fecab38407bb92573fd7003f917bd059e0f087babda16e3ad3f327f1fe01390f97b3cdd2939423c7c3f811d8eaf8d3c32f72b5f7ec9ecbfb6cb649e8f18f6c042bfc8ff9d4cfd84b662da63a819eb910dc5d82fe539e42acbafa819edb9a518e57db86996f78b55c5d0a73f211b28ff5d5731fcdb03f93584bfc27ae33a99bfcff25a9339df3c7891b9be7304fb371c9eb79975c8553c7fe6f30ec7a786f007865b41fb9d3dc13ec76b32974cffbfb5344b79bc4031ec2118900de83fde2886fda50bc5b0bf5d5333cac3269b28af624531cae38efc9b367f4f62b823f3fce27e8dccf55687a562e4bf0b7b31457dc6fa43de17f683f5906332fb9b23c86f7a2594e709fa3345fd44ffe240a6bef6337295eb5b7f34a33c1e6483fe7dac19ed99af18f6e8459a65f96ccb8a5dd447936cb27d311443be34510cfb0b3b9a61df1699fdf9e29f62acd7de56c92ee46ba07c2cd55e36e6e498f68af2b71c9ec771f9d38cf5cc9166ccb7403f96e8c161fd545d337e3fab480eb1bef288fa63a9fa9ba6e42af479f41443fff14533d6e3ed14c3fefc11d980beb626d9843e824c33f45b50ccf1838362e82b70c916d2f7879aa5bcf14931fd795933ce27ed906dc6cf5dcd525fc59262947f1ff5c7b679fef309fede76b81eb2b32173bfd108f5d5762b8877472332fdff05fab67dceefa52bb201798e05cda80f77c5b0af20259bc8eff645b6d8dfb315333ef03463ffd55a33e2c75fc52ec60f1cb28df2f2aa9a61cf65cdd81ff7500c7b2ffe68c6face0ad9617b71d38cf98fb762f4a782866294b7a7f4e522be3fa03c1cc782bf79a0fc1d35fffd803e1c617ff2fe93f7557bba9f904dc8731c2b86be821ed9427ecf2e99f691fc6946bcdd510c7ded8b9ad19f6b931dc6cf03cdf03f15cdb0ef1fc5c8ff4ebdcff343025331e42db89ad17e3614a33cb33bd947fa4fb40fae8abfb209b942fb2d92793ef23123dbecef7414c37f4f91be2b7adcf2f919ef8b8815fb0bba64d142cbef2764c3c77ee729d962feb68aa1cfa3af19eb457ec82c0fafa418fa3c3b64da577855ccf2ed6b467bf1d28cfee34631c67b0283ecc21e829d66b40f3f9a11df2d14237edcaaf73df6473cc52ec69fc79ad11f6d93397e55873ff76caec7bd5cc8fcbd881bfcb9f83acaabbe2657c1bd1ed9447d19f964cea7dfd1be786a3dcb13f2785e087b7a8dc8ec6f3f50be9e8a378e5332cf4fb8f7c916eadf9eefe71e5396cf5eb3d4ffc125b3bcbc3fc5acaf4332ed3dbc68863e13cd980fb034a3bfeb6846fbbb568cf2098f648ff5f15733fccf4633f65bd98a03ac67df9159bfdef0dfbe1a1f7e911dae376895c99c0f3ca9fb06d7177dc9dccff444fc9cafa795f28e117f0971609fa3981c7a986f4179f8a2ff82f8604e66795ddf6435dfd6d50c7f39d08cf1de5f32db97fd98ece0fdd35333fabf7dcd28bfb966c48b0fcd68ef8a6496afdfd38c78d926b3fe24bf9ad11f3e6bc6fc86a919eb030dcdf83dbb50b18ff967957f8eb70615cd18bffbe73efc81450e90dfc5427180fe19ea5760f3f7811f288f408d17d5fec855d66783ec72bd0bea47e096183facc88c57c6b08fc0e3f8d6b4410e3dec27bc9323c8ffbc9163e8631229c6fe8f07f41de43d18f9fc88ccfafc689339dff8686a467b909055fdcec82ecae73ed12cdfbf6dc8ca1f5635a3bd72c8ac4fc94633c6bb4f9a313e6e6bc6ef91468a7d9417f52d348cfabcd60cffbbd40cffdb2247b49f9266f43f507ff3fd86989f7a6a96f93b84640bf178674de6fad307ea573e9e0b7d3fc831fd2bea4f28f48ff38dc664c65f8f9666ec0778931dd8f7c1217b78fef4d08cf1e495668cd79b641fe98755cdd85f35d38cf9e41f72c0f9e79266a9dff8ac19fa2b2b467f2088c921eb574733d6b3ad34c37f57c811e2f985a738c4783d9e8fd4790867e82fca7720cbfc6fc89c8fde3fc95c9f949a64ceef4f909f48d427940f9ff74b90ef3e25333e7f34c8dc6f7e1f9119dfdd07649e17714ec93ee797d79ab15ef71fc6ef0bb734237e36c801e4b9be3463bfeb5633d683dec921fd5b5933cabfa219eb9faa8ad9df50e9b3fd0f42cd98ef9a6b4679ff9263b4ff0de85f6817e30557f813e18d107f8ce03f6397eb252f64553f2e681f63d11fc57af00f99e341b73f32e3f7679fccfdf98f9a66acf71d9219bf6d9f64ea337a9143e42fbb6986bd2c35a3fffa4b8e60df851fcd323f41931cb3fdf035637c72a119eb59653c1494d4faad5785ccdfdfbedb64febee1ed0b764a189f1a3cc80eda97d42173bded23540c7d1f7fc95c6fdbef6a467bb100bb01ecef3e038bf281be5f60513e589ffb261bd0d7f0aad8c7ef3194c9a687fa53273bb0c7c757b3ccdf437d8ff15ba2be17a23ca3a7628e47533e618f38bf62a319ed7fa0d8c77eec1599e5e34d34a33efc29667d88c04243e8af069ab1fe43fa8fa06cf3f7a1ef0999e70fdcce6015ef5d0e640bf1c1d720733fc0eda819fa2d92b95e67fc01bbacdf37e8b7ec71fc6bf247f65cc9d33a39c6f8cfb30656edfdf3a359eaefd923339ef6a664a59f9562c49b05e8bb2c2c46ca37ef932b81bc3f7734e37c2d976c84d8df2ee3fba0a2ce67186ec9dc7f3574c9b4cfcb9eccfd3fdd0999ebc3bb4532e7cb2efc9e8aaf6e64d121c1fa26d85f45f873946783ec82cf47c5b0b7d74433f6d7b615fb88973e640ff6e537c1a2c4d05f596b463cb32457505ef38162f4371ab0afaa6da3fff736c9fcbdb903ea6b3e5e8ff83b2573fd5b2b2473bf552722733e2d857fa9badc1f935ae40ae6dfaf3f648e4f7f0fe408fe7882fa5015d9853d525e353f7ffd2a867f9f501e9fe70fbcc66417efcf5a8a7dfc3e1ff45dcd0f7894fa803c86c82ecaaf4ae6fcf61bf2e7e7c540de1d99eb55af33b281fe56a348b651dfba0bb28bfedce04ee67ed8fe87ccfd62177e5fed171f2dc90ef8c6fb1ec7e79ea88f868adf9e5db20ffb9aa3fe19e292f71773b215221e44fb60aaf99d960756f311a73599fb05b32e99f276a16f53eddfbec21f986a7dd86549a6ff9ca2fe9abe81fee603ed87a5c6239a8662e8f383fa6a89fe2fd6d75864eeb7bcefc86c9fba2572087927fcbef05ff83dbd1a397651dea84f96f0ffd89fae19fdbb59012c3c14ce63833e6c55bec73799fbc10f0139e0fad996669cff51d18cfd210999fb4746281f5bd59f738fccf3ff274b32fdf5c4077b06cb1ffec316e52fdf9ff3be287129ef17f239ca5e4f4532f737765c72ccf61dfed171795e4baf4b3631bffcec80457c2e9f9f415e47a487df5b89c95620f5b37893ed00e739a17dd1ebe51a6532f7433dc90e7fafb25121b3fdbbbdc8fc7dacd786ccf6afe39003d8c3a145e67cf21ef18eabe2c7de9cccfd1463c8eb7a9c0f1f5cc815e877aaeebb981f78f2fb3ecf739c439f22fc09d0ff6e2a46ff633123fb68bf1694370842ccff417f7abffb7543e6f8c96445a6ff9cc29f78dade515f3cd11dc37e4fb4475eee11e4fbfc7e600658df0d7bcfc797107f54c91ccfad79640bfabf079a711eba62ee8fbe8e35e37cc8aa66fc3e9d4df660ffb71399fee6a1e489d1def6866075fecc6945e6faf4c708ec713e60fa2247d8cf3d657abeeb61fd09fc83a83090f703fd076abcbaed69c6fed12d99f1efed0676b93fab59269721ff3022f3bc95a1a318f5bbdf2173fde7f841e6faedb17ade453c765d93d95f1ebfc85cff31b6c91c0f98f07961bfd21ec71732e7bba7684f03bfe462bd13ec47fc5f88fe12ea83f08e90271b93b95e7f7023737fc9d82573fdf0a4480ed07ef5df9a719e1df41b7a8c1f273f649ff11fca3b14f2c09f259af17bb7881fc2b012a1bf06fde7fd77ecd7f434e3f73bab64f6e7ef3199fbcbbfbe66fcbeb9629ffd1fe42f52f1df5131f777dd6a8ab9bfab47aea2bcbb7f9ab1bf774836115f8e66648be309b0ffc8e3faa9c9866ca37f39833f8944fd85be2b64173ceb9343e86b36204721e2e9ad668c4f8f35433f88af62557ff7f87eaccef3c90664aeb7cafa64ae471f3fc95cdf7ac9c801fcd507fa8fbd2afbd70b32fb6f53f8d338f003e4d723878867deb2bcc392f227b58266cc275864eee77d2ec9dceff9f1c911ecf5be21733f6d630156e7896443cda8ff57cdf87dd43bd944f9f6db9a715ece806c235e1e523e515f705eeb1f99ebe5674c4f5c88e777e44a887849fa87303fdf11ebdfaa649e5751ff23d3bf5e905ed9e5feddc39cccf9fe4e4866bc39b4c93c7f677c25abf6c604e73d6c292ff45916124a7d2e8a9a713e23caaba2c60bee5bb0f2dfc71799fef251540c795a1532fd633622733f433b24733dc4d02473ffc550dde7fad97700f638ded0eb904dc4536f3eefb1ff3afa05071caf9f337d9143ec7f437a5515dfd58a649ebf717b82953fad879ab1ffc027b37de8049ad11fcbc8dcaf59df90b97ef8ba20fbe81f2ca0cffc0795e1df0b9ad17f837c86f28f8f19d8e57eb137efbbdc0ffc52ccf2e894c83cdfe8782053df3df53d1ffdbdd1941ca0bcce5d32dbaf01eccb10fa873e61af82600feda262eaaf44e679148f1f32f7ffb60cb08817b09fa0a218fabd7dc83c9fa1c1f4d4f95d873699f3d5437ecfe37acd29ecc50ccd08e757a2fc2d151f740a64aeb7bf1b64ee6fa8c39e2c55de17beef723fd1e548a63f18dfc9d4df15fecc12f260fe2e2473fc750af92d2121cedb97ed55680bff87fdf6f01fb68a7f6bbcaffc43dd2673bf5dab4ab659deea7d87f67923733f4f6f44e6fafcb1bacff5e67dd8a7ed05988facedc17e05eb0f36280f3b7423f9fd4d44f6a0ef8dad19bff70376d47ebc2ffc8be372fd69c7225751df1a0699fb11da3e99fee4e190797e7bad44e67aecd104acf66b5f57640be35bb714ecf37ce00dcacb090dc433b380ec44b8ff4bf610cf6cd6643fc2ef0db4c84184f97dd40757c55f6d93ccfd14dd2599fb074e8a23e87f34067bec2ffef07bb94665fa0ed985be5715b28ff437a666699f9b0d39407935f1bca7ce87e9fe6a467b04fd781e7f9f619280c517246f7ec84a1f7fe480e95534cbfcad27e410cf3751debec3fd0375b2286fb4178a5df0be4a56f1bdad19e77ba0bc7c2120ec11f5259f9093e5bf3134a3befe917de8635ed30cfd95c921e50f34637f2aeee7fd0bccffda64c613b50ad966fce290e92ff67b32f7d31c9f64ee9f39da9a315eae19edfb0fea43a0ecf5a740b6d0be6faa641ff20f87e400fa9f5535633f0dbe9fcf6762bd21395f1024e5f7c9ec1f1c666496dfd7d48cfe3bda8b509d7771bb2bc6f8c810e987be81f58b4be43f14ed1ffa135fb281f1881f8f6c225e1e94c9f42f137e4fe407e3dfa8ef91f6175532f787d65db2cff5fc1639e0fa950e39647f6044e6fe9b1edacb3cfe97fe6171068bf240fff0876c623c61139239be577f906de477532247b0af36ec2556fd8fc71f99fef0e391b95eea3127737f612d21737d59ad4c56e5732073fcbce56b46f9aaefc7f0076dd87facce37391ec9dc5fd352f72b28df19da8f58e803f1ce806c22ffaf33d942fe6b1fb203fdb564f94425757ee05731f7377eaa64ee1feaaec01ed7af9f3b64ae0fbf55c0c2a1c8f79b37b09007fbf3ef641be93fa5bf88cacabfd44dcd383fd821b3ff7c53ccfd2ac713d8e37e856389ccf5162da45716f9873f8bc80ee4f9bc34435fc8bf8897a1fffb0f99fb01af53b0c7fd12f58266ac3f5e92d57aeb0b99eb7dbf0d707ec0b2fc7e8fec42becf4733c6db8a64b67f17a62f2c18e5077d887818e9bf2b64eaf36383957f3874c93c9f687fd48cf8cf548cfab93f91b99fe06829467e6e0fb28578b5f605abfcd551be793c2cdfff16c921f4f7de90190f754cc55c6f89f23044fdc778c3834cfd76ca8a298fab19fda93399f32d774f31d713abfb5c2f72e5f7730f29e595f53b325daea7b94764ee1faca17e98a2fc11cf068a111fdf8b64ae8fdf9fc95c3f56ffd18cefbb9a71fea449e67adad382ccf18106cac714eac4792417720cf99fb0074be9bb6690b9bfab0efbb1847ef1fb6305b25abfdb2673fd7007f5c952ed5ff34166fafd88eca37d38c3fe2c611138af06dfcfc7ef91df5fb0c7fd5877934c7bdd1b64b57efe4e56fae2f784bc383f6648e6fa8d2ef4610bf9b07f39233be80f3ea04f47f9930ed2733cee77ba97c95c9fff30c926d7534fc9d4d7c52673fdde517d8febf17a63cdf83d17dc7795bdd64ccd58eff52673bd462d2473fd521de59b8f7f233e42fdf4843eb15eaa4466f93e969ad1bfae92b93fe6eb91591f0e3d32d7171f2f64aeef3c96c95ccf52c7f77c615f380f13f6e58bf430feb42633bff73f32f7933c369a317e3e21737df2d722539f872299eb7d8a284f3f0a42ecef599243cc2f6c4b9ab1bf14f2056a3f72a742e6fa9700f615441c2f2c4e35235e407ef2fdcc587f1092b91ee35ed22cebebd3d68cf59c1332e53f29a6fd1e6f64aeef3a4dc95c9fd19b68c67a6d944728f28ff3c32ccd385f27d18cf5da737284f1b522bf17c518cff1869ad1bf86fc91281fc4cb2b32d7bb3effc8fc7d8ca7a919f9b734e33c39755fadb71b81d5febf10fe2752e5559c6996df2ba23e457189f9696b46fd46fd8a3dae1ffbda64eafb087bcdf7ebe23cc93999fbeb8a9027160922bd2139867e8b7d705c467a2f995e5c12f6299fdf5be400faf9189a71bef20f99f3c37b17ec737dcc694c2e431fe79666eccf198055f9149be0b842ae6bc6fcabac2f7159cd37bc2cb28df45e3f6407fad93be07c87add457855ce17eb39962ea0bf29595fe8b1dcdb0af1e99e385c59b62f40f0b737205fdc9e2975c0db1fefcad19eb7d65fd8c2b1ed757be4be410fa3c5ec1425ecc0f5fc0425fd8afd4000b79205f97acf4f7211b78de1b69463c23c7efe3aac7f52def2ad9a33ff4c95cff7546f9e4fb37517e35b0480ff97b6a86bcd21fc686c7f5a4758fccf5735dde57dfdbdbe42aee5f4e8a513e873199fb1b1f48cf10f9877c5bb292e745a6be8b0fcd583f83f44c9ffb0f0f7d7299f68bf235d5fbd9954cfd051bc52cefbb66ec07803d5a1ed74bbd4cc518af39a3fcf2fd66e88fafc0a23997f6f0817de7e369987f5a93b9bff080fae388f7d1bf0fc0f90f56c9f4511f3dbf84f18ec388ec21bde2122c2eac4781bcbe2a8f5a4c36b0bee93024fb18df2b421ff90246294f4dc64f7120e4c3798c7f641bef7f4c32d7073d65fc14876a3fe408f6140a0785f950dc17e60e2e66e42896e5f31369c67c645333de57f763f00bdf8b853c904fb103f9be9166f89312d9c5fceadb21fbd83ff2fa2307989ffec25fc5425e9cef74d72c9fff0935c31ecfe428c67ace5833fcff4333dacb5433f47122c731d60f5f34a37c8e9ad1fe1c34c33fec35c3dffdf33eea4faa99bf57562c14bda2cf3faf181443f9ef7f2e5fffdbd7fffd9f57242ef5df81bc42f9cf9c637125e252dff8f7ef07c5adb882e24e5c857f7b3fe4bbea9212ceee527eaf9816b3e2be7890d7515eeabf0ffabf0fff71ffa8ef1dff3fae13fff0d4f9fff5e67f7ffaf4ff7b4fc9b217575af428efa5782dde8af7e2435c4ff1f7127f6ff1f7117f5ffeafeaaa89eb53ac8beb2dee3dc55fe33fae9af86bf2af5e6c15dbc58ebc5ac56eb127fe995f7dfd3710ff1c8a6b24ff6b2cfe3911ffadaefcbfa7c559715e5c1497424a25ef5e48bb2aae8b1b79fd88ebb7f827fe592a968b15f1572d1ae2328b56d1169753740bc542a1e015fc4220fe1916a2422cae445cdbc24efca5854c5cfbc2a17014d7a97016d7a5702ddcc4dfbdf0283ce5dfabf02e7c0adf42ad502f340acd42abd02e740add42afd02f0c0a43f1372a8c0b13714d0b3321f15ecb7b28cc0b8bc2b2b012d7bab011d74fe1b7f0572815ca854aa12aaeb2bc0c7199054b5cb6f8b753700b8e302dd393a751e51bc03c39ac2d5c67e26dbd5d7e468b977a99b7177fa977f08ef2efe49dc5dfc5bb8aebe6ddbd87f7f45ededbfb785fafe6d5bd86b89ae26a796dafe375bd9ed7f706de50588596d71b79e3c2da9b78536fe6cdbd85f85b7a2b6f2daefcdf1b71fdf09fbfde9fbc4af989bff929b3f9c998f96980f9896e9e2baa63fe4fb95fcd0ff2416ce1b8137feb4b07eeeffc545c99bf177f07ff28fe7df2cffe45d0555c37ff2eaf87b89efe4b5c6fffe37ffd9a5f177671a4bcbb5c5ebfe137859c0b29eb5cc8b8f25b7edbeff81d21f3aff7e3777319fd9ef7e7f785ac7ffec0abfa43798dfcb13fc9e5f5a7fe8cd754fef7d49ffb0b7f99afadf75742cea5bf167f4b7fe3ff88bf5ff9ef93b83642e63f2971293fa7243ffb41c86ae67bbaf37db141d1af07857f93f7e88d02aff017e49b80026f11c8c16ed1bd58fb9d2096f2e6ba155a0d12716dc5bf7790d6ab06a93f0e32ead781acc13e3888bfa3947a119c8484abe01c5c84746bff27b806577f23fe7ec59509697f839b90f62fb8070fbf143c8357f00e3ec137a809799d7cdfb37070ff2eaf27e56d0879a3c017128642ea3068062d6a575cb95e73ad0a69db4127e87abf42e2bfa017f4838e3fceed4168d8c9cf100c06fecc7382617ef987e028a4161a15b22e44a9e71267c128184b1985bcc144685668389806d3fc8413ff2a249d05f360915fbe152c7d275805ebe0dfed41d86fb0097e825f21651cfc796b21772cae5250cee5952b9bab42e25c5e43c86b0656b013f6500a5221bb2dba91aeb407931a0ec26258c8e5155dcc93d06e6e03a9bf0ffdfc9f42e2a3283ef97f42e2731809696fc1348c85359485bc4fa1dd7998e4e70184db7027ae34ccc2bdf06cff266ff1111e0a9b5cbb42bebfa025fe84e4e151fcfb2f3c8527bf27241e04bbf02cae4b7815b2f6c4950659d0096ff9d99a9e13dec3bbd0ad2be52d0a9b9de6d206c75038bcf021ae67f80a5f52e22cd76d2e6ff8f64f6118dcc28ff8af725ee3c26ff091522fc25a580f1be26a86ad701fb6ff43de67d8097ef3f2cf2d5648d99517feab149e44fdeaf903217192cb9bff53c8da13baed0459d8f5ac6020e4edf9c5b01f0ec2a17714ff1c099f20ae701c4ebc6f380d67e13c5c844bef13aea4579032435a21ef5bc87b0dd7b977089ee146c8fc0c7fc25f29ef5f5812f296ffdd7e8bb5b01356c26a68846678129650155757eab79b4be7e7daec086bcdaffcdf89f8a723ae763008e44fb178f9f27e5b48ea84ae08260a91978f98883ef552f4ace32889b6d12e4aa32cda4787e8e8bd2329b1d4ec273a0b59dfb9370bd742b39fe0135d7c23ba06cbdc1ea25b74ff6ffa3d165fd1237a8646f4fa475e216d379759e832c9eb9b90b14f49a5dce12dec0a691dcfccb52bfc6e18bda34ff48d6a513d6a44cda815b5a34ed48d7a513f1a44c368148da349348d66d13c5a44c2f70aade6ff27e5cdcf2392f50df22e85ffcd7fd271e7db61335a45ebffa6df5cde8dd4aea1f52bec57c81ce7f62bace0a425ed88ab9dcb2924cd7fa666ec8fa21f21ed6ff41795a2725489aa9111999115d9a28b9fffec4c31cefb0bbea8c4324a8f93a8156fe35d9c8a9217d610dce34c7ade5c5a7109effb14d75be8370d56f13e3ec4c7ff2e6f7c8acf41596a58c897fb835c5a79e52c359bd736296d5faec695120b99b3e827bec4d7f816dfa34afc889ff12b7ec79ff82ba4acc5f5b81137e356dc8e3b7137eec5fd78100fe3513c8e27f1349ee5d28a8e451667c143f8dfb294f8934b1c2c85377385bc7321ef225efea7bcd27e8d7815aff39d3fa28e9d4589e7dee02474dc965226d2223aa23d1b899a66c71b11ca0e3c33de7885f827fe8dffe2523e4a207aca86e82de6fd3d47c8e98ad0b79078892f5e0f9328899324d926bb244db2649f1cc24d987784447b9cb717d1394c9263721412bf600f611acf9353722e4e93cbbfc92bfd4310c6ebe49aefcc91369140a3425e239736cf412ea7f463b668d38c78130ce24dd84f6ec93d79c48fe499bc9277f249be494d5cf5a4913485b4ada49d7492aef8eb89ffb59f0c9261324ac6c924997a1751cffe84ef15961b9df34bb46b5fd152bc9299d0aeeddbc93cde278b6429f47bf84f7943d12e24ab649d4b9b6cc24bf293fc4a9985bf1597f867f21798a28e89f641f85d7909db2d8676524aca4925a9264662265662274ee28a6e4321696cbda4299c5ab00db7d136de26dbed76b74d93c136dbeeb787ed313a080dbfc38fd0ed7d7b8acedbf3f612bca5f53e453b916eafe2ba6defdb8794b720e52de4feb7582efc85e6f6a9e44d7e85ccb9463bc9dff62565be247fe14db46e6e6eb3b98603db1f87d6f6bdfd4493ed775bdbd6b78d6d73dbdab6b79d6d575cbd6d7f3bd80eb7a3ed38796f2789bd9d6e67dbf976b15d6e57717dbb8ee2ed069610dc73ed4a795fd1d57f45b7bca66d7fa4bcbfdbbf6d4968d5ff47de6d39f80dcd649dacc2b390f537d76deec9644db373df90fc09c92bdbead6f0acadb97d893f4b78b1686b6f9dad2b3a6085ad082a76fe2ec89de62ede25bbed6eb74b77d96ebf3bec8ebbd3eebcbbecaebbdbeebe7bec9ebbd7eebdfbecbebbdaae2eece021a53d0733199b497b0877c93c996fafbb06e50dfe69df76cd5d2ba8266be9bb2ee212ff16ad6e5fb711f6f695fceddabb8e67855d216b7e59a1b5ebee7abbfe6eb01bee46bbf16eb29bee66bbf96eb15bee56bbf56eb3fbd9fdeefe76a55d7957d95577c6cedc593b3b7177cece4d8b6921f5527f7b4e83348c72ddce832fbdd90bde378db63fc9228dff4dde44c85b4b93742b2cc1ccad21ddc93a96c7361dea58782fa9df97d4ec2b973d4db796e7a759ba4f0fe9313da5e76d2fbda4d7f496ded347fa4c5fe95b5c9ff49bd6d27ada489b692b6da79db49bf6d2fed64b07e9301da5e374924ee34cca7b0a1edb5398081de7beb729ae5d1aa5332dafac6fe95ccabb4897794426fe2c2daf21dbb33eda87ff905768375df9a3749d6ed29ff410b7d3dfed28fd4b4b6939ada4d5d448cdd44aedd449ddac283a735e2602c92ccc22e168936c9bedd273966659b6cf0ed9313bf9e55cdee89c097f26fcc3ccaf0a4fd60cffd2c8b7e3797649e37f6b2ffce231bbc6a7ec266ad926f91106774f778199eeb606bc8294544828ea9b886db2c7f625feccec913db357f6ce3ee921fb66b5ac9e35b266d6cada5927eb66bdac9f0db26136cac6d9249b66b36c9e2db265b6cad6bb5db6c97e84c4bfd95f56caca99688b73bd4667e179853fcbaa22366be4b143666466320fb3cc92f2c21e02d1ff17edb190f727b3b37c1f8d25757cdb1ac9af921836107685ed8a7f4b795d7fb42fee0b7b6fefef837db88ff6c255eeb7fbdd3edd67fbfdfeb03fee4ffbf3feb2bfee6ffbfbfeb17fee5ffbf7feb3ffee6ba212d6f78d7d73dfdab7f79df00bef2bf59b47922232db77c5d5dbf785bcadfde0dfe4dd0a79853d8455a9df4d2e73eecd327b3fdc8ff663f137117fd35c4efa055ac47eb69fef17fbe57eb55fef37fb9ffdeffe6f5fda97f7957d756feccdbdb5b7f7cede3d880ef8c13b88eec6213c44875838dded6197d50e69dc386487fde1107ea1df48da836f1d8e87d3e1bcef1d2efb5e661eaed4aff78f7e0f376f7eb84b799dcc163afd15ff7684b4e3fd545c42e2f00a1d4bcf20e5f54787c7e179781dde87cfe17ba81dea87c6a179681dda87cea17be81dfa87c16178181dc687c9617a981de687c56179581dd687cde1e7f07bf83b940ee54345f47fcbb95e655dfba22774a81e2e997110f67090f21e2c51cb305f664bfd26b188150ecec1497e44cbf09bfc1ddc63916ddb55b619e2dffb49ba92320b798f85a377f445072d3c46c75834fadbe3ee981eb3e3fe78381e8fa7e3f9303d5ef6eef17abc1defc7c7f1797c1ddfd9e4f8397e8fb563fdd8c86a71f3d8fc7fdaf88e25d7951ddb79ff86e60a79133da2374966d224494933794fef23debf3f40aa7d4eed7bbb1034a26816910b0b005955f76eaf1dc61f26609d33c33e28566235d6623d36623326b115db80371d5e7fe3453d7b834731b7a102e3a32b58cbbf99edc35ec0fb727e54621ed398c50ee075632ff6631e07711847f126dec6bb78148fe3493cfd3c369bc5f378112fe355bc4e86c920d963830945dff9b14d2eef71724d6ec73ab943cf866821531c9ae4913c9357f24ee22449d2244bf2a10ba7bafee1435224e5e396542f8a1e7ed1a4061e582feb9339f2af01e22d46de11ca01c0cd8ecfa449daa44bfa4448c4444ae44449d4444bf4c448cc842456622734618993b88997f8094f82244ca264936c935d324ac6c9249926b3649e2c8e5db23cf6a70d64e229a05d25eb74980ed27d7a488f50729dd34b7afda77e00bc9008ef8fdb254c41643ef602be66cf25f83443a45f4efcd43c37f816fc7c5ca6ef344e93344db3344f8bb44cabb44e9bb44dbbb44f85544cfc544ae55449d5544bf5d448cd94a4566aa73465a993baa997fa294f83ebfbd8a7e173fa9c1e9b639346e926dda6bb74948ed3493a4d67e93c5da4cbbff1827f39f2217d60bc21e60f4298d255bac6b553f6652efa16d75e2c1b66836c9f1db2230cc339bb64d7ec0676cf1ed9337b65ef2c4e9c2cc9d22ccbf2acc8caaccaeaacc9daf725eb5227eb3321133329930fc5b14f96b70cf0fa5737533235d3323d333233239995d919cd58e60c5f3f786f5fff66eef1fa17deec5b45a6eb74f5478371f9472b5e76e6657ec6b3200bb328db64db6c978db27136c9a6d92cd5b379b6c896ef21ccb36c95adf3613ec8f73994633058e7fc925fa158bce78f1c6af5d335b91fdde7f4b038807f33357fe5ef3cce933ccdb33ccf8bbcccabe12baf3f784f5fffe60d54bcd1b7924c1f10775bd409c0bb4a57a068f64f5599c33ac5c8cbdbbccbfb5cc8c55ccae55cc9d527cbb55ccf8ddccc496ee5764e73963bb99b7bb99ff33cc8c33cca37f936df25bb7c948ff3493ecd67f9fc744dc334fc3e2339d4f9225fe6ab7c5d0c8b41b1073b60c35f9c8bcbbf7cc078c3fcf6cd18d76dfa044cd9d730ee102f7af807af0373bbb8e65d712beec5a37816afe25dc44552a44556e44551944555d44553b44557f48550888554c88552a88556e88551980529acc22e68c14e21e205fffaa8c18726560aa7700baff0012f071b144111fe8d17fdbb7721da3e7ebd6ebe7cc01c57449f47f2ebf71a729c8dbc2d366f6048b129b6c5ae1815e362524c8b59312f16c5b25815eb72580eca3d3ef8284fe5b9bc94d7f256decb47f92c5fe5bb8ccba44ccbaccccba22ccbaaaccb067d8b0c4e96657b98975dd9974229965229974ac14bb5d44abd347ee18d93a2344b525aa55dd2925dc292a52fa8dba397fdfee438e0f5b3a4e90b94cc41fc7817ef75e9946ee9957ec9cba00ccba8dc94db72578ec0c6e5a49c96b3725e2eca65b92ad7d5b01a54fbea004df0a93a63b357ddaa7bf5a89ed5ab7a9fa0152d5bccc247a18aaba44aabac94aabce05551aa0fa92a4ba3aafec9c77155574dd5565dd55742255612cce54aa95430add2f2b6d2c10c98e07371055f6355412bb3229555d915ad58e5546ee5557ec5aba00aaba8da54db6a578daa7135a9a6d5ac9a578b6a59adaa753dac07f51e4af2637daacff5a5bed6b71ada8d779c2cdfd373563fea67fdaadfc500280549b14e1e529d1667c0fb8f7febacceeba22eebaaaeeba66eebaeeec1845aac2530b9566ab5d6c0f4daa8badaacf49ad4566dd7b466b553bbb557fb35af833aaca37a536feb5d3daac7f504d06feb693dabe7f5a25ed6ab7add0c9b41b38786e7d89c9a737369ae5094dc116fd942cef0cf0516facd13ca9257a934ef2686294159ff072ff46f4dd6e44dd1944dd5d44dd3b44dd7f48dd088605223374aa3c25c6bf4c668cc8634566337b4618dd3b88dd7f80d6f82266ca27ad66c9a6db36b46cdb899345340eb03ee69336be6cda25936ab66dd0edb41bb6fa181684fedb9bdb4d088b6776c44106fd99e8bf6d9beda771bb7499bb6d9c7f2b668cb7ff0ee87afd268abb66e9bb66dbbb607135ab1956092c194566d95e2006b5aabb7466bb6a4b55abba52d6b9dd66dbdd66f791bb4611bb59b76dbeeda51396dc7eda49db6b376de2eda65bb6ad7ddb01b74fbeed01df1115f77e9aeddadbb778feed9bdba37f001ca85d3ed2477719774699775203f1d045f9b7530a45df3076fd70eb3aeebfa4ee8c44eeae482744aa7765aa777466776a4b33abb93e113ed58e7746ee765a7ceef7817746117759b6edbedba5137ee26ddb49b75f36ed12dbb55b7ee87fda0dff70768184eedaa3ff797fedadffa7bffe89ffdab7ff7719ff4690558d3f0eb5ffc9fb97dd6e77dd1977d0584844106e7757ddf0b6dd98bffe2eda55eee955eedb55eef8ddeec496ff5764f7b069f1d5877c1bcdeeff967a27dd0877dd46ffa6dbfeb47fdb89ff4d37ed6cffb45bfec96fdaa5f0b436100d35e380847e1249c854bbd10aec24db80b0fe129bc84b7100b89900a597d4b96f5fd076f23e40208766608a550091040fd8798422b747ffc9bd75525f48220888224c88202b8b8a00a5aefc25c1674c1104c8180016af8640b54608223b88227f802170221142261236c859d307a3bc2589808536126cc8585b01456c25a1c8a03712f1ec4a37812cfe245bc8a37f12e3ec4a7f82a1b216b1f5f3b0a87f9d54da33e17df622c26622a6610f0392c0bb114ab7fe30df18ab5d808b2d88a400ab1170558174549c4b9282aa22a6aa20e66809922112dd116a9c8444774454ff4452e06622846e246dc762b71278ec4b13811a7e24c9c8b0b7129aeca91b89686d240da4b07e9289da4b374291bec2f511ba42bda51784f63b5cfa59b74971e420d057d2d419327bda5f8b73e54959448a99449b95448e5d720dc2a90b2466aa54eea25411225fc91254552254dd2254332252259922d5189498ee44a9ee44bbc5c4981144a91b491b6d24e1a496369224da599349716d2525a496b79280fe4bd7c908fcf1494f7269fbaa77c962ff87050bec977f9213fe597f490dfd07c24422da77226e772f12f5eb9942bb9961b10830ea65e06e7ca922ccb8aacca9aaccb866cca44b6645ba632931dd9953dd997b91c48961cca91bc91b7f24e1ec96379220ee5a93c93e7f2425eca2b79ad0c9581b2570eca51392967e5a25c959b72571ecaf3016d2fe26dee80f7827895376663255612255532289c73199a00e9a914504e819efdd4671fbc4aa5d472a7344aab744aaf088aa8488aac288aaa688aae188aa910c5526c852a4c711457f1145fe14aa0844aa46c94adb25346ca5899285365a6cc9585b25456ca5a1daa0375af1ed4a37a52cfea45bdaa37f5ae3ed4a7faba25c91d74ecd63ea4abfa060f5fd5584dca4e4d552828d5424ed552ad0073aad66af39b0f88576dd54eed554115554995554555554dd555433555a25aaa2dfb2a5599eaa8aeeaa9becad5400dd548dda85b75a78ed4b13a51a7eaec7d54e7ea425daa2b75ad0db501d81e5f396927edac5db4ab76d3eeda437b3e5bed853d1b6662e9da3e5468a410aff6d6622dd1522d83420e8a53b5929e72aa15ff89572ba14ca8b5466bb54eeb3541133549b13559533455d3345d33145f3335a25960b64635a6869aa3b99aa7f91ad7022dd4226da36db59d36eae7da589b68536da6cdb585b6d456da5a1fea037daf1ff0058e7ed62ffa55bf1dca6b8c3519fee776e5addf81bd67fda13ff597fed66325d37239d6a11944ffeadf7cfcf3bc5a2ef54ccff5422fa1aca9f546257aab777aafe9baa0b9280bbaa4cbbaa239baa2ab1f83af60ddd04d9de8966eeb5467baa3bbbaa7fb3ad7033dd4237d530ef5adbed347fa589fe8537da6cff585bed457fada181a03637fa80eb3a32f64a869186d06be363b1967e3625c950c1a80d2b8e98998298571ffed5fe3613c8d97f1366223315223539991ab916e188551ea280515e0538cda68c0a78ed11a9dd11b8221aadc900cd9500cd5d00cd8dd30d599410ccbb00d6ab054351cc3353cc337b81118a111191b636bec8c91313626c6d49819f37473e6c6e23047b46a6c2c8d95b13687e640cbccbd79909e22362f2ff368dcb17e304f7ff09a67f3625ecd9b79575cf301380b35349fe65397ccd7c7afaaae986f333613cd315333831488536e16666956666d36666b76666f0aa6684aa66c2aa69a10533375d3304d939896699bd464a663baa667fa26370333342373636ecd9d39926fc80863698ecd89393567e6dc5c984b3d3157a868e6d15cff8d970cc980ecf1852b8ebdf9242772068409fa915c0c4173c8150dd066e446ee303dc893bcc89bc4242129c9484e0a52928ad4a4212de9484f846c44442211992844251ad189414c4288456c4209230e718937a8884fb839320e243096a71d094944364249b6d253adcc95b9126ab223a3bfeac907199309996a06b05532300183f700d10c709dc91c2698837763d8de9205e05dc2b72bb8abb535b406d6de3ae0eb78eb6c5dacab751343eb6e3dac27347e6f2bb6122bb5322bb70aabb42aabb61a98b75667f59660891648b8a558206518ca3104836558669a9b0bc05bca09e2b588b9fe85776f3c2ccbb22d0a1404a69a99c52c87dc2dd7f22cdfe2866005566845648eccb036d6d6da01e23b6017d540e6d6c81a5b136b6acdacb9b5b096d6eaa95b6b7b680fec3dbeaab34ff6d9bed857fb66dfc11f3272cc7ed84f6807df766c27766a672fdfce9347acda855dda955ddb8d79c048b35b73657776ff17de812d005cd1966c5957cdd4e8ad903c2cc7566cd5d62c8edeb522c48becb536b66e1be0dd05ecd919956dcabe4d6ccbb66d6a336b1ebf6dc7766def55dbbecdedc00eedc8ded85b7b678fecb12eaa21b9620cdb1362da537b865eb6e7f6c25eda2b7b4d877440f7f4408ff4a443669313bb85a9ff5b1fe8d9b2e8855ead061074045f2c38964391a70f7a276760b1481f6642aed68e3ee9cb7280d54fdc17e250a46f1ad384a634a3392d68692d69456bdad09676b4a70215a94465aad877aa4223ffd218944c4faa511dbd4c0d6ada3125d41a38d4a69432ea50977ad4a75c7a9a2b1ad09046c69d6e7ee1ddd21d1dd912390177bb0fd207b92166403f473ed3316885a2eb7402885fb6018c09e12e5a60c7c628e894cee89c2ee892aee89aaed9900dd89e1dd8919dd8995dd895ddd89d3d546ebed893bdd89bc52c212ff3c95296d96396b38295ac62356b58cb3ad633c13c508efac0441a30c95cffc27b6332dd3185a9740c63bf000598232ed43034a6314806cc004fcf75959946cb08b398cd2863e40e2d48aaf8cc612ef398cf380b58c822b6615bb6632336661336653336670bb6642ba3676b67083670f6ce81cc9da3193b27d375cecec5b93a37e7ee3c9ca7f3ba73e78d7c909e4eec244efa973edc860fba73325b324432b7301ff41fbc9ae638b98e5835b0043cddeb1a3319315aa7b042c04b81c90ba3b365953aa55339b5d338add339bd2338a22339b2a3382aa418dd311cd32180d2827898931733acc0b161a20e2317e7e4388eeb788eef7027704227a2beb3c1ca016ab35cc99dad9ed2cd9f7e08f50cf0ee9c1114e3bd33a62fb2007d78a0f662dec57183a896e13ac893fb072370c4e2163733cc1e1a7326eac6993a3367ee2c9ca5b372d6eed01db87bf7e01edd937b762feed5bd21df4023cf568063452e308e77f74e2e387aeec37dba2ff7edc66ee2a66ee6e66ee11643f8514bb7726bb7f99d8f2d8b292eb4bec0da1de20506dfe0dc67e406d3cca7db9133b21ab0ded1f05edc1e7d056b3d70a47405577425577615577541b65cc3355de25aaeed5297b98eeb42169a5bdcf55c9f62be99e1f93f76a17730dd1ebbdc0ddcd08ddc8dbb7577eec81d215a3976c7eee46fbceed49db9734007fe73211f30e62e71bcdd15b9d13bd3c1173332735746fb932f4039d03b70dd85bb66a6c6bca137f0f6dec13b7a27efec5df0c5af7707617b784fef45d6a063677af7dede1beef2e6c55e0215934e661fbd9cbb1d4bbdd4cbbcdc2bbcd2abbcda6bbcd61d799d92038bdf64e4f5ffe60b7af6044f745b5057e001f8f7ee498c7a324c0a6014d0b7e099a527c1e8a750cce0cb0207a2c52237dbf0546bcb4c4ff37476f30ccff4886779b6473de6399eeb7958291b15a82178d7f23c1f3c70f3b81778a19920a77084741deb152ff236ded6db79236ffcc5ab567222e664f7979edde899ee3cd19b9829e2f0a69e84f810afbb729768788d2f4e640bfa9f81a27990af3f9f1f9eeacd4dc75b784b6fe5adfda13ff0f7fec13f2a1ef0e0854c80d1e9ddde3f91a57f8666ea646b6eefbdc90c994766889dbcfc8b7ff56ffedd7ff84fffe5bf29875cd1c9891ffb89ff1ffae0678817aebd7057de14fd0c90e80f2b96784ec48be36f43b9e8e77e6e31c03bfb307a062d47e1977ee5d77ee3b77ee7f7bee03dc99aa5e60b551251e1e4f9fec95dfa22647a0fb1d2cf56f4b27384c85bfb922ffb8aaffa9aafbb3bcaedce37e4d837012ff98d17f9eb5bc0df057a18ab073044a6591e22064edca0c659a27f7ebe3118f5cfbe0d5b504d6e46e7539ff98eeffa00cae7fe450dc80bf30f980091aaf9270fbec2f3a1873df98b14ee55f6c58f9781c57ee0877ee46f00efd647bc2d0dd4d21ff963e4c34fbff9c1eb4f604433c86d2f8ca58fd7202be3f99117101333cbf3a75fbc9f3b5a204f601b7202cc10fcb9bff097feca5ff3211fb81dbd63ae44b67cee7e89bef57c5bc3fb47c41f75442ec8701e8e7aa4cb7c8fbf1cca4ffccc2fee48c9311b235e7efd9d8f8d8727f01be28548f031d6f8dd3fe139b046fbdcfb83defc195c4df514f270d7c81bac33f07a6effad7ef8833ff98bbf79cc9fc0810b1cb780fb837bf9418d062384fef4def493efc1eba03a9e6c719e60a5ed763ce519cf79c14b88b612f0064aae15bce2f5df7ae64f548ec783602a8c812f6ce4309eef5305e3553dffc41bdea2df31e6306f20133e31f3e01defb9c0452e7119eaa6feabd3160af077bf1956241867fe992b7846d83e431fc0f9801574823a4cae5ce51ad7b9c14d77c4090dcd955a02bd2b3ffd6fffe2f8830fa18e041ef89f9a07f8f0a97b7a33c5252a8627590e0724e863a83855bc075b230ba7e036a79c7187bba084d287b78b4f75e4201340d3571e3eb638c3b73e7ada0259c39183cce37cc6097a02ee73ce031ef2886f00e9564e941cf0eefe8b0f233e467ff2099ff219fa01bb1e88a78f5f5023713c11ad37658cdff91c228ef1055f7a0a5f81e02a7eced7c13018b82b54147769b4a8d5384a70a7e0674f7297bce50dc603461f1ca3d1099d38147308aa1d8cc115f066f8cbe8c1d12db49c6f910f4aa136bf9e57433de909c1293823dffc5370e18b4f4509e3696be0718807e4d84789578cd91a6ee510417cc6587045bff1c656835b700f1ec13378a182db06ef406b5cb86fe031c62d1e0f7841d13d3978076fde324a6f50f15898e5fc997f767bf46f10074990065990cb09139928c7411194bff46c8ffe0d2aa38411c678003e7c62cd417ef827ac1b4133cf1ffd12215a661f1503750b6a603a6003746ad000de36e8823e1002319002399011273205d696fe8c37be18bc3d05759d37b02643b69f391472fdc5ed21d2657a0f94400db4400f8cc00c889cf02ddf2ab96f0616f2f747cf2e1fbc40c44ffd00638ee7c1b56f0ce378629ec30c0d584fe82b085beac56489e38c73387819b0c009dcc00b7cc07bb1dce0826ce510999f1c78e32df874c5578817cff2e18de7bd1d3be09f989d915710046110059b601bec02a824f119cf70188c82b14f8cc7f0fbf755177a0e26c13480be07bdea49a8df9fc8ff28196a11f2e0731fcbafea0733c8ff3ca05fc4b005c62498078b6009fe5d052b0e9e056c0b345412bc6b88cb06f122ff21deeeee0a1a3da8d5ac88d998ffc9459783b52f8743ff110e102fd6666a391ce22ffcfbe93f78a17f0b8fe109e2edfecd97216607e79b2b310621d7439c21628c12d435cc71e067d70b1033aaac6d0483f0125ec35b780f1f1f5c700f1897b82f4466133ef90ae30cbdf051c4334ba0f633a0d7cabcd083facd7c4169f40adfc1218cfd1dd4652fec8f29e756f8bb7e18a07fc3d49f930544d123cc401fefa8301fbc1f0e62a4e1f87de2cfff8317725610ccf05984e5847958846558853558f3c13a039fd741fdcd6e889fc3fd7ebc806c3b3b03ece198465ee4cc1350b6b951846dd8857d2884a2bf03febeed2e948c1be095ffc56b9e8c47a884aa3f87ee12c62ecc98ed4da1c6c1e7248f9f2c76fbf6a098b35083dcb5977cf2c6e38737789c16ea21541ca8dfc18b4f4167eebc837a53fae615dc1baaf41e2b0a33637a68025a3d50304f589cde741dab879084566887a23b0a08be6fc1276821057d48fff4431fbc2c7442d79bf0310c8c6fe6380f79189077700ecededc9b8710089f25f7e67c0cfbf13f5b3f9f42588fc24db8f58b70178ec231efc349380da790a51f6c05fbf1ef916e0beb33aa86739f12e238decbaab860e3a37bd515c245b80c57e13a1a722b1a5824da939df48e0ed1313afd7e1e159da30bbd44d7e816dd023bba478fe81ed8b0f68c5e60cfe81dc5d19b8fa204b6e194c2b7d32885e5143e65604f6317e55111955115d5510356c0d4465dd44742780a4f7864788a44384e8ae44889d44883a51e19703513965a44222bb2231ab1c8e13b3997f3c835d7521c79911ff161f6f3bc6f0f788328b4ac288a36d136da815afc983bc5291ab953e8403e16ed40fb26b84fb4fbee89dbe0d31862f6184dfeb1693483f93cfaec877bfc391e6c0bfb6fa305ceffbd56b48c56d17a33dc0c36fbcda1491be889bff3e804c9f9b8390dbfffffa71e3e984ccfc6e33bfdb6efb6df660bffd73eff6d7ff6a7675bf87bcbffbd3fdaf08106ba950db3ead70f7ede9cfffc3da45bfefc45e7e0670e4bb887c12fdbff5ec2777f9683ef7e79ddb55dfbd71160e6c93cfdd9ef9fe3cfdf6dbfb6fce7b560ffffdcf2b327febde9fffbdffff9ff2f1cdb0e</data> + </image> + <image name="image5"> + <data format="XPM.GZ" length="46834">789cc5bdd992e3c892a6795f4f71a470d732c2e6bec8c85c8074d2e94edf77f791b9c0be0324888d6c99771f83fd3fcc232223332babbba7c28e47c6e7240135355535353503cf7fff6ffffa78b8fdd77ffbefff762c8c22b0fe65f946feafff66974972fabfff9fffeb7ffcdbbfcfa7ff12ff1b2c66f37f0dfffdfff8b77fef6dfe65fd4bebcb3f929f14cbd7b558f1b8e5f8fbfd13f9fe47f2009fb7ae14e3f389e2917c7da7585e6ff5a5585e2f78553c6b39bc50bc90bc526ccbfb4fc843ca7fa57820aff7a658ca63db8aa53cdab562797fb3248f703db3522c3f6f4c154bf9ad6bc5d396a3816229afd1c937c6f5bc27c5f2fec64631ae172996f2687dc5521f81419ee0f528542cf561acc953f6d7502cafef7cb394d7e8f43b238fc90b8eef8be481b28f0fc5f2faab4fc5d05f43a63df4b68ae578f41e14cbfe9fd7648e9fa62b96f2da966229dff982ccf1e95d2b96f224ddfbc7d07ff0a218fa09c8135cbf2a14cfe5f5607fc3d6c2240f154b79ed2bc5181f8dccfeeaa662296fbc562cc7af7743eeec75a718fed8572ce53b6fc8ecaf36502cefef988ae5f5f317f218f23b578aa5fc7e499ed2df34c5525f9a2b79d48db7b1550cfb9f2b96f2f53aa6bf1b978ae5ebe63b99fdd50dc5d0c7983ca2bed78aa5bcbda962d8e3824c7fd2868aa5be83ee7e13c8e3198a116f3ec8b3be213f0f7b1d77fdd51cc5521ee34ab194270a14cbeb659a6229df2a27d31e8267c5b0af1999f1c73514633c2dc5523f5a8fdc8dff56b194cf2fc863dacf40b1944f3314233ef5155b329eaec953c6c34fc5521edb24db78bf564b9e74fa726cc5b85fc7ecbf1692192f8d9562c41b9fdc8d67a018e3e79227b4877bc5f03f53b1d497b3254fa19fd59b62a97feb86cc7897e17ad3ae3fe152b1b40fc323b33f89ad18f7f7c95dfcca15cbfbc7978a113fb6648e67342433def73e1563fc0f64f6bf1c9019cf7b978a657fb44cb1ecaf3e22cfa04f2b201b7d53fa27ec67d6f53ffa522cef973f91bbfe56e4aebf97e4ce3e8f8a118f1df204f2f5468aa57cc64c31fcd12373feaa3ec933deffac58ea277920cf619f06e68f79d71fcf2777f65892196fb525b993ff4466fc34768aa53e960bf284f1ec823c653cfb528c78fa419e71fc4ac5b23ff9b362297fafbbde1cfad122f202e3658564abefcafbc39f165dffb21e99f1f370a118faebdedff95ba118f3c52599fd5b1d14c3bf2df20cf299b56229bfdebd3ee7fbf78ae5f89b1fe405f575ab58ea4b5f930dcabb53ecc8f186bf1addf8ba2699f668b8648ea7ae91bb78b8264fd05fed5631fca3e32e1ede90e7906f9991991f9543c5b23fe6896cc09e7347b1d4cfea9d6c221f7130bf9b6abe1d91399ef18562d86bc7f40f6da418f276d79b31de2e15637e8cc873ce671d2f20eff9926c309e5c914dd89f0fffb694fe3532f51f3e92a9ffe32599f694db64c6a760429e613cec6bc5c88f43c598bf37e439f4ad77d73321afbb265bb4c7eefd36ee97c33eed4efed50b99f2af9ec89c5f570f64fa8bed9269dff551b1b407ef93bcc0fdce5bb2c5fcfd836c63fc3de8cfe9e4318f64ea6f75a118f2ecc99c1f0d874cfd7a1e99f6a9dd2996fa39edc806e429478a61dff764eaabe8e473e07f25e285dbc9bbbc23533fab6732e75f6d4ce6f8e93dc590ef8d4c7b3bdd90a92fdd213bb04fcf22bb887f7b391f0ed4fad5ccc9f49fba63fafbea95dccd873199e3b75a2b96f2380e79c1f58a45a67e967bb24bffb9522cfd25adc06d93fa7c230f07521e13f2a8f5d5ea9e3c05577d32c7afacc916e3a50b161790f6be1f9207b8fe41c6fbc1b0bb7ef14aa67e5619b9f3d782ccf9ae6cc80be6f33d32eda779269bd05f3124db9cffee154bfdc45b70dba47e713db5de087532d78bfb8c4cffcceec8dd7afa91ccf89d9664eacfd1c806ae577f914dceaf13b245fbbb25d3deaa2fc5723ccb8aec42dfb9af58fac7d9060bf5caf79fafc943bc6ec9783850eb0dcb27d37fcd37f28ceb87846c329e478a610f63b205799b17b2cdfcf11ddc5aacb417debfb52029df8e3c823f190bb268523e194f062adfb7b6648e87bd235b187fe346b1bcbfbb213bcc4721ef444828efe7c9f83a50f977d023f3fa5143b6608fe6994cff333fc91c9f33fc75da8e98bc9e49164dca0b7954beeb5e90a9ffb349e6fc686a6407f65c17648ebf36050fb85ed01ec81cefe581ccfe069f64d1a4fdc07e55be6a5f9269afc6904cff6a8e64c69b0af63eefc6f77c431ec3fff5097982f8e35764d1a43c72be1b2c943e7a64c603ff8a3c677e72261b9c9f6332c7d7be21bbb44fdc7fd1f983bf218f21cfd9254f21af5f934593f100f753f99eed915d8c8709ff343a7b0e62f208fa58e6e409ae7fbe250b0b91af3f9067884781ac670ccc362390fac5fc6276e3eb5ae421fa53978ae5fd4e1e798cf13fdd91a7b8be67934593afa3ff5617af6c8dbce0fc7e4b76995f223e5aa2bff2f346421e421fe755c7d0af36238f980f4dc933e8a38815637ebb538cf9da230b0b92f1fb8a2c9a8caf886f7637de01ae6f0f586fab2ac5d2feb547f204fa581ec973eadf228bd67202799c2ede9b0678c07ab0959039deab4b32ed7d7524b3bffa96bc607fef15437e872c9a945fe66b0395df783d32e345bc22d33f6c8c973b60bdc771c91c9f72aa58da535d913b7bb92753ffda1399fa593d920dc40f57ca3b6cf30d393ec72bf080eb77e38e3ce0fd6a32f5a5cdc9138c4ff8449ed29e7d32fd439f9117d0e7e94131d61faf6413f2e9be62a90fef1ddc36a91f996f0963e57ce7786021bf1c8f7d431eb11e939259bf3a6ec9538c777922cfa04f7d4e9ed3ffbbeb73bc934770dbe4f8c9f11d0ed57a05f71302b21eed93c7ac9f2cc9acbfeb0bf21cfaf42fc90bdab7cc6786a301ebdfce4e31fccb21b33e669a64fa539190278c773332c7ab6a14a3ffd764dacf29202fa02ffd8a6c301e3e922de8279a80db26f50179547e62dc83bbfb37afe419fa5fd564da4731221b1c0f9f6ce27eda0bd942fc5f16641bf127e2e7db26f523f3e3e1a41befe68d4cfd6b0bb2017f3a3d914dfa5341b660afda33d981bd46d0f7a46dd2dee4fc369caafc7c0816e303fbccc8bcbf17902df4fff448b6d1df558feca2bf1ef43b6d9bbc9f8c5fc399c87f10af311eb3ce7e5c973c62bcf1c913c6c73bf214f6523764fa83bb25d31e629bccf1c96332ed410f14637dfb40b6319ff92b70dba43cd097983d307f794332d7ff76a058ea2f199367b02773a558ead3bd22cfe17f7a777d93f1fc49b11caff323d9a63d956417f25bf0ef85b89eb41fd3ea18fa30f664dacb2924733cbdbe62e4e73d32ed670979166d8494f17543164df607fe29a239f7ab16e439f4519e15a3bef9405e401fe7806cd2be23b2c5f96e47a6ff181a99f6b6acc06d8497f6c8d7458494f78f62b2682da7886766379ed63d79c1f1ba201bd05f9e906dcaf74c7668ff180f53dc5f5e7f659087b0a7684a164ddabf49b687587f211e5803ee07d821b9ab976664d60feb7ec7902fdd904dea2b26d33fcfcf8ab17e89c89dfef87a1b31a57c7c7d3847bc0806640bf2ba987fec6ebc0f2699f5c1d30bd9c5fd9764a11fcc9fcf64d1e4fd10ff9db68228e305c6bbcd8f90bf774c7bb21ec806ecc7be23b31e690ec816f4b3ec916dd87bf34e76a0af25e2bdd3cea8523fa162e4a72679c47cee852c9a945fae8f866dbd07f33fecd9edc6cf8b1563bc876493eb996bb285f1351ec936eb2bb662e443bc9f901ffbaba162ecd73e935dce0f888fae88c7a847ecc9a2497965be37ea77f2ba3b32c7b31e906dce0711d9613c89c92efc53bf538cf30fcfe0368390fe3006b74ddaef893c18a1fe22e513e944b77e3e9139be76a418f588eefd0ef469aec92ef47530c06d4628f53f208fe80fb78a31ff75ef9f22bf0b8660d103793f9ff2b44dea4fea7f24bc1dfab3efc91ccf6a4476319e410a6e330ac936b86d72fce47c381a75fa361db2cbf883cf8f447fa0ff843ce07c119187e8cfb2264fb11e702fc90bf4afb0c0e28f942f7115a37e26f3c391c877e0efaeaf18f69d90590fb61f144bf94b9dccf1b11e15c3bea1df719bc14bff2cc803f4af189387183f23572cc7ef70431e419f2b8b3c1bc8fb17d0df5834ece7bd2996fa2ce5fc3c9a0cb81f111cc826e28d73a758fa8337223bac3fc1fe276d862eef6f92e7d0af61910de47b1ee499b44dfa878c2723915f419f4ea458ea737f26b35e6cc71d437f35ec71dad983f1441ec2ffcc0d7944fb78518c789f92c7f4877bf204f16fd990e7d0a76b93178827de17d91ecacf67bcbed02ff25d5ebf6df2f3323e8e665d7fdd1b32f7e7b34f70d79f604f1ec09ff50732fd77a991a7e8cff29dbc80bd2fdf3ac6781c61cfb35642e9cf0d5934694fe8bfc8b7988f76ec603ceab362ac0f609ff321ebd579461ec25f9b0ff204f67bb8558cf565a218f1ff48667f923d7986f9c7b0c92ef45da0bf73d1b0de992bc67e11e45b74fdb1601f8b768525edeb449ec17f4eaf8a518fb0c922a391f109f3c3a26d52be906c8cb09e2dc9e608fb87f02763c0faa37b4b66fdd1463c68f337d8f3903c627c70c963c89b456403f279185fa36d521fe8bf58bdf3fc5c4ea6bfba9057e46bdcbf4a15633e8cc903c4abc31d790c7bb413c5a8b767e439e78f82bc807ccb13d986fe569562ec075e81c5fc82f1a63c228221bff8209bd077e02b96fe53e1fa229f637f30de9658f0e3f31999fb35a73732fddd3a9027ccaf9fc953d843fc4476b19e8bafc16d93f7c3f5ed21eb97ce0379087d362599f5eba54136114f96e78e114f12dccf6e9be40fb233463d13ef7706ac1fbb181f91af313f999059cfdcebe411c6b39a2896d7332fc963f4bf1e91596f3d5864d6bb97ddf52cc49315e657478c9f7cbd70c90ef4135e2ac678c8f5c0c81d72bf2bdf93278817a647667ddb28c926e76b8cbfdb5d3ff8228b26fd03feea8efbd05720e3c9b8df8d8f7fa358ea27ec91e96f6e4466bdb3d6c9ac775acfe429f4d154e405d75fd76031bf21df9c921dc8e7bd82db26e591f1403817c7cbdb2b96fa3a3c9047ac572fc9ac8f1e6c32ebeff6137946fdbd90e98fab062cc60bfb675fe0b6497971fde190fb2ff10b99d73747e419ecf9784db660cf46457661cffe19dc36e97fd29ec76d7e86fac73d99fb09ce2379cafdab1732eb974d4d9ee3f3e65631ecf3132ccc1bccfb891bcafefa7cbf98b1b1bfd407b74dfa9bf48fb11017e391f5c9d4b777502cfb67e5e419fc274bc8942ffb22b35e79ea3e6f707df54ab6a93f8ccf588c0fe2514d1ea07eb73a9147584fe71e58080cf93b167fa4bcb0bf49377e794e663d263a93e79c9f978a511f4ac8cc27b2986c22de379f64d6934e7b32c77fc9ebb52b0a29ff0d798e7c3484fd4cda26e559906763c8037b10f919e6cffd4a31ea5577e429eb2969c7d0afdd31edc77d508c7ade3b790eff7012b2c1783826b3be693f2bc6fea54fb638df75f2399cef1cb0c880b15e08c973ac3f938cbc40bcf060afd3b649ffc378ce84bcd85fd71463fffd894c7b6b1a32eb676941b6a08ff36bc7b0a725ec7326e443fd72409e623e3e5e80857f60bceec963c4b3fc9d2c9a94f78e3c1f4bfb08707f91df617cb20199f566f791cc7aa6979317f0ff834336385f8dc9acf72e4db0100feb9f4431fceb44667ff69447b807ead936794e7ddf2896e39bc23e1743d6ff235d31f6135ec8b417f38a6cc13fcc80ecc03ef4b463faf71bd9e57cba038bfc42ca53c0bf16a2e1bce4b362e49fbcfed818237f82bf1b43ee1f84af64caa73f925de65f182fa3cdb864ff615f4677bf704736309e994336c7b23f39e2a529ee87fade5131ea618aa1affd0599f5e1c31399f5d1d0e818facebbcf2f783e2323337e3a2999f5536fa618f5bf37b20d7b37afc92ec627c47c60b64d8e37fa6b0d594ff68e64ee7f1c5c32eb6fb1df31e78357b2057d5b47c5529f29ee67b513a0b4df3e790a7b5ddd925dacc7f673b0b0478c075f170df25f29c67ad6203b189f13fcdb1e723f323990b9ff17be91b9bfe23c93592fb73332ebbff54cb1d46fbd22b3de6522bed96d854cdaf73bb9ebafa518f992473611ff42c4675bf457deff70495ec01fa3926c818bbe62a98fe3896c633c135fb1d44709fb76baf9234bc9ac2717b962c41f8f6c723ff0be638cefa97bbf8dfedaaf6487f16042a6bde9d0679b2fa39ef3491e231e44d0afd33639feb29e377685bd215f353b86bc4149e6fe8993916dce77b162d47b2ec894e7fcde31e6ab14f6e48a040ae3f7411ec37f8c3e7981fc69e5926dd4cb8ec8275cd1a4bcd14131f20d990f4cc46a8fe729e6649bf5803d58e807feba230f103feb2999f53d33228f605fc71a3ce9437f81d7f104f50f19ef4432cffb3b2f64d6978fb78ab13f528047dc4f59dae411f2c9e580bc403d3f89c1ddfdc31bb268723ca53d4f84f563ffe554768cf1496fc81cbfd3a76279fd3820b3fe5d5f8047dcffd19fc9038ca73925733fa69e9039befa1399f3a7f94276389e2bb0589ee1fc934b164dfacf93623c4f83f113da41bd65bf21b39e7ef0c9ac7fba8962e4cb4332ebe9fe83629c775d2bc6fee81b78d4d51fcf6061ae72bc7ce847161ce5f8bc932790b7c1fdc65d7e15adc8ddfe6041a63c35ec55e4e7cc8ff7e401f46926e419fcd93c80853cf2fdb149b6399ff7c14222ec0f7f91c7d0af71ad18f3f32d7932813e20cfa4f3ef2c030bf9a4fcf1ab62e4af7bf200faacd764d613ad5231fceb863c417e62c6e429ec6b7941a6fd1f30deed07a43c51419e40ff87b562d4bbd1ffe990fbbba145a67dc7a162ecc755e04e7eeb9dcc7ab8392373bf6a057b9b0afd233fd4c913d4570ac48769275ff24a16ad652d558c7cf04c3626a8dfc2fe679d7d3418bf9998df709ee84066bda980ffce5a85caf17a20cf309e995c5f4fe643d6dfcb2bc5787e6246e6fe4e88fecfbbf12d378a71be2825737ccd7bf29cf1fc8bec70fe457c9cb7124affd715c31f3b9e431fa5cc37268b2e5e790b32f73f0fe8ef62c47a76c9d7d5f87d90c7e44a31ce474ec9acc7db6fe4295e3fc13f16623cb1bf0dff5d080fc17af7933c81bea33d5934c9321f9b18439e1f2f6ab2cdf53efcc118717f299f92593f76f6e409fde5963cc37c64a664eef72ed76407eb5f939f17cb11e47b88cf46dbe4787f929d09e22fe46bf357e44788f7e688f5f6bc20b37e69cec9dc0f32efc873faaf4b36907f463ed9e2fc067b33c723c817f1fe2282213f29c953d8cb9eef17f622f59376ef37e12f7be8db1af2bc7584f821f261faff0799fb35a1ad18f6fc4ca67dd83979c2fd10f88f351e60fd746ec843ecc7ac42f21cfebf8a15a3fe32202f907f1664213fea0f07b268d23ee10f76679fcd893c837e8b0579cefd18876c63ff7705ff10f92deaa3fb2358dc4f5e3fcac8a2497d36647782fa1ce477863cafdd2cc98c4731fc457837ecc3ef91879ccf368ab1be70c923e6438fe431fae766e419f3c70f32cf73e807c5e8ef18dcd9b77e265bd0ef8af28af950ca73803f3b9d3d0523b20dfd6726d941ff8f8817ceb40fffc8707f77c47a7f32578cf89e2b96f7ab9664c6c7d021b35eef558a616fefe439f4a1bf9117c8e7cb19d940fcd78f8a11df0c32ebfd4b4f31e2db82ecc23e62be5fd803ea97723ca6fd2efe446b32f72fca4bf214f35f3e23cf20af5593698fd6277981fe3907c5723ccd0599f29e4bb285fac1720316f141de3f1980857fc09f657e351d0cb95f91e07a8311f71fd25b32f71faa1e99fe1c34648e47dd7d9ef1cc7d21cf21ef69d531fccf792573bf6ce993bb784cf9c653ec279d676417f6b84cc1229fc7fc1d926df8e791f289df607d73ec782af515c9f95b244bdcff6bcee011f73b7d8dcc786d1fc93c3f9f978a71debce818f6743e902de4ef568fccfd36fd55b1d4ffbe0f1e73ffdd7c24cf50ff3133f21cf952f60e16f11cfb41ec8fe83ff63779fdb6c9f1c6f88f467c1ea5d2c8dc2f4cefc8dceff19fc8dc4fa9e68a613f9f64d6a3ed0fb2017b75f78a31fefd8e619fd58cec20dfd173f0b88ff1dfc31f46229f91f21f376407fdcb5ec92ec6bb94f1693aeeecb768c8dcbfc86b32cfdb1fefc916c6c3eade6f233e2cb7e031cf0ba417e0764695d7fb22f3fefe12dc36298fcc97a7edf201f6b621737fc6abc9f4e7bc22537f4549e6feb69393f97c805e905dd88f85f19c8c59bf385d28c6f9b367b28bf87ed6c1225fc0f906f8df444408f9fe20208f613fde0b593439fe78ff74c4fd09df20335eb9af64fa773e27f3f98c66d031f29933ec63daeed849fe240f508fb74c32ebc7964d36303ea705d9c4fe9d7e22bbd83f3b9345bcc07e10fc4bfe91e305fdcc860b9e3fc67889f502ec273992b99f1ef6c9dc5f8c23c5b23f8dde31c6afdc92b95feabc91f93c848bf8381b5bf06ff3896c23ff8861af3321aebc9ebf268b26c70bfd9b0bfda2de5891b99f607d9159afb0baf7733f48e7fbdb1d22a9cf59c7587fe81f8a51ffd890a7c8ef9797e439e2f5724276a87fc43fe1cd585faf22f218f5f29cd717fdc1f81864d1a4ffe98ae11f907f31e27e4b5290198f8e4f6493f1ea8bccfd16af518c7aec92ccf30f76773d87faecd8457cd7e10f0bd17f7cffcb82bc803ecc07b2817cf7b425dbc86775d88f58ffa03e7a3e2b463d86ef17fe86f807ff165743fc4e7b64da5bb5229be88f7b20bb988f8f90c718f33cc069421ed2dfbec8638cff322473fed13fc93cef51bc90791e62c5fb8bfc02f9e1182cc613eb69976c60fc425c5f5c8df5ef5231e2eb82cce75dfc67b28df1083d32f76fdc37c552fe43777d97cf53c17f4574607ed5ef18fe78ea9107882ffa3b99e3bb0c1463ffdb229b18dfe53599e7299653b0984e512fe1fbc50c8dfa36e59d8a0195fd75c9a2b55c63bcad11cf77943699fb45d55ab11c8fca2073ffd73b91a99f66d431ecbbe92986be1b72777e7fa018cf4f551d235edbb0074be813cf471ec98ccf67be5ff803f6b76ab2897adb794cb6614fcb1d58c467d81be5691f6895efa73e2673d43b63c46f4b6400727c6359df9b8af51de6dbf89dccfde0664ce6fe6fa329c67e02ecd91ef37902bb24b37eb8bc22331e9f6b32cfbb9ce14fb6886f88975fe411f62fcf53f20cfe7e80feed368390fa8fc853d8c37e44164dfac797623c4f067b14d686f1ae2fc92ee2bd8df73ba23f388f73568cfcd6548cf365ef64d6eb4f6332c7f3a491391f9c07e439e787926cc03f4e98ef1da10fe8979f17f938e27d489e225f8a7b64d1e4fb319e62fdc57ada4831deffa118eb8f1e99f1bc5991996f1f5fc83c8f7e7c26bb980f0ed0bfc816f079ff4531d633ef1d335ed48a114fa7e405e6c73decdf15f11bf5738bec62fc72e99fb3be9047ea23d514a3de7349a6ffd935783c64be909347e8df6948eef2a315d9e27cbd568cf3a811d9857f2d63b0988f11cf6ec873cc47e739588c1ff2ef67b068a8dfc9f8371b8cf8bc4ee992b91f991a8ab15e3b83c7ddf317df8cf5c9a263f6af210f11afec8adcd9eb803c63bed85d6fcefc58271b5c5ff0fa2282e03cea1bb86dd21e64fe3a1b76f6921d15e33c2ac66fd89e8092d7bb228f611fa5a918f9d7903c41bc297be439ea09e79cbce0fe4ec7dcbf3b998a115fbbeb39987fac0bf0a48f7ace2a058b7c1ee76979bdb6c9f190f9c06cd4c5fb069f6fd75fd8afeb9107881fe9bd62c40f8bccfde3c6508cfdea823cc2789ecee431e60f6b449e623fe6047b1f890507f2bd0579cef57e42b6b95f087b1e097fc2fac5038bfe217e8ec9a249fbc2f88bdbd39f3fc8f41fa7e329e43f17648bcf1bc8f96926d65b18ff12f713eb2bd8471891b91f19e8e411e3c588ccfdd9337932843f9eaec80efa97a0bf13e171a82f62fcc5fa08d72f6fc87c3ea8beee18e351e864ee2f3a25798cfefbaf1de3fda5439e20fe55171d637cec3e99cf9f5853b20d7fd3e17f5391efe1fb4402b20dff8a616f53e171d82f86bdccba787b7c258f206f5229c6fcb5540cfbb3c9138edf2779067f3be9e405e473614fed80a03e89fbcfc77c7e63bf23f3fef9993c66fef845e6f34aee5131fc7b4ceeea578897f3b64223f501fd2fc6aca707178a715eee9dccfdb1ea5231cebb5e91a78837f680cc7ab6fba918eb973199cf7b5813329f0fb3a0cf85d0079e2f433c59087b83fe3b1ec2bf72cc2762fdc0e71f3a1ef3fce1944cfbb14f6483f508e8db98f0bc5a0e7b32c4f5519fabc833c4a718fd31c5f571deb3204fa08ff491cce7871ab363e8a79990e7980feb2dd9e07933c447b3ad784b7dc0fecd691fe7230abcdf1a73ffe69091598ff62ec8ac17d63b32f75f9d8a3ce779db37c5380f784b66fe5bc25fec31ebc18794dcd583614f76bb2328df8f782cf235ac0f8a6b32eb79d59562d8bb49eece475be419e271ae9317d06f36211b90d77714633f6e49663da3992ac6fa35265bb4d786ec603ed6793f11bff1bc14ecdf1db3bee87f90a9bfe31b99f57b6f4936615f41089e39333c5f9b9345939f97fe3b17f912f39390ccfd92d22777cfe3bc9359bf3cbc91596f77fb8a71bea7630bfac972b203fb6beec09311c6affe24db580f2411b86d72fce4fc3217f90df75b778a51dffe2073ffa3ba568cfcb97b9dcfcfa44f649ea7ad4df202f122a9c906fa57998a61af57640bf1ad89c936d677cd0d7832407e629fc97c7eaf3a8245fe887a00e5133338ea1f0bf218f97f2aed733eece257b525d3fee2946c42fe6c46e6f30fbeab18f11dfa11f911c783ef6f4f0c49799764aef74fbcffc4c579351fe33112fac278d764d683dc2fc5c86fd6e0e988e7336fc9539cbf38caf82aa697aebe6e910dc48f7c493619dfb664eedfb90599f7b779bdf644921c7fd863bbdd8efda75bb2c57ccd26737fb059931dcc97de8aeca23ee40cc0133e9fa043be8988d8d0afcc17e7227b633e6291395ee933d9427ff63764aecf8a0bb0b83ec6734c1ec37e4e0eb8ad3049fd417e31bf73fd7b43e6f37e05e49f4df87c41734de67cd72cc80bacd76b8cef7cccfdf510f79f4f0688574d44e679216748e6797f7b44e6fae304f9e66d454fca0bf91763d667c2a4638ef70599ebd760d331ec39b5c95dfdc2550c7d7c9259cfadf8fe099f57b07532eb7716ec7f31ed9e4f80fc8b9935c37937b9fe9d1b9d3cfe57c7b0ffe380ccfd12df27d31e1b4731f23bd8833161bd2d8c15637c3cf210e3dd0464ee5f3a27f204d7731a329f17c9c0e698e73dc32999faaa6fc92ec6ab827ce684fb256e45e6fab9d974ccf836275b582f370fe0cebf53f88f29e61f7cff0de4b5c63cbf593e2a96faab317e56178fea7bc558cfccc903ce279562e897ef17e387fd962579867c26c5f5ed31ebfd878362acafbbd7f9fcdc01f6235657b09fac568cf5cf83629c6f8cc8dc9f89f764aecfdd923ce57cb1239bc8ffec09d942bdc886fddbed03be2d2f315e769b914af9607f227fc0f826985f9c4ede604d1e215ef99f8a71fe7d439eb07e89f8e0b43baed21fa00f47cc3ff83e1ed89f335fcc71de1ff2b85d3c4e7432ebeb15ecdf15fac0f3c60bf210e357df9147d057d9f118f1c59e916dd45f4af4d79d0eb03f62417e57ac80b17ec478bbf3fe0ce7e3a53d2ffa9dbd04978a71bd88cc7a45b423f3f917674c5ea01e614fc92ef295e6092ce66b9cb792fa5eb45f3786fdcd1b32c7bf7c218fd0bfea4631cee73c2ac67c704be679ebda274f301f7bddfd185febeef373ecb734976403f94713924decb7386732edad49c82ef49dcaf5e76228e4c7fae3a018fbe17d32cf1757b7e431ecbb761463ff614f9ef0f9d48162f9f9fa89bcc0fabfc9c1b309f6f3f672bdd41eafe3faef81cce7a71b9fcce79b9d1199f50a4727737dd1409e91988f70de59dadf623ce1f73d45b78ab11f7045e67a2b3b750cfdf80199fe5ddb1d237e973179c6f816760cf9dd01d9407dd29928463eda904dd8a373019e3a3c6fc4ebcd67c8ef53999f8bc996f5c0434e66fd221e2ac679aa943c857dfaa162cc0f0f1dd3fe2ec973d86fdc271bccc76ab285fedb73f094e747238f3c873ffbddeb26f283c404cffad83f3b63fc27f3f10cf11ce33d9db0feb1bf27b3de78382ac6f3c877e439e47787643ecf51078af13cf51799fe114ec836c6a77e21733fdd5981a763ac970f32de2d6613d607bd0d99f5e71ae3339bf279d32625b3ded7833fceda26f581eb8b8413e3997a64aeaf93a562c8bb508cf56f429ed13e3b76d0df0af63117f684fb43fff3b6c9ebc15fc400713e1990799e3acec0ed092f196f1fc853ec6ff7e02ff28f1c7fbcdee62b789ee49e3c677cc815633dbe21f3fba1a20ff094cfd334884fc68cfbc3cd237986f9eb80f86e881942da73ef19dc36693f90c714f793fa0bae14e33ca8495e405e3f26f33c5c9829c6fca75e873ef61a99e79fcaa463f873582b463e1990b9be299fc83c8f5bc0ffcc29d76bc59accf3a3f573c798cf9d257904fb726664ee6fb81dcff8bc77c7f4cf949f17fa929f7f2cc8a2497dda647b01ffc4f85813aea7f7b662acbf52c5a8270cc806d71b33b20dfff4c7643e8fe89e3a467ddf457cb4da137752ff7bc5723c7af0174b3439debd4831feff101cb2b340bd0bf1c216e38ff5f73bd964be70a718ebe188ccf18931dfd8533e3fd1c03eec2e9e3973f200fb11f5077984fd703f27cf711ec75990593feeb960d1a07f4331feffaa7cb2037f8b311f3a42bf781ef382cc7a516428467d562773fd979d15633f1dfee1087fc7fa2a508cf1989007b4d79d629c77bb270f715ea27e25f3f9568fafb71531d91fcc478e1821f48ff7133d94fde9bd934593f604fb14f9239f67be064f079c9f46e431e65f3f234f110f43d8579b5fe2ff4f04feebb64dea43fa83d19f707d9d5f82a7fcbeaca34fe6facddb9247d89f72a6e409d69b914be679eefa9decf2f900033ce3f328f69a6c613dd08bc16d93e32de73f6330613d235b911d8c7f3c568cfd991d99ebc123e469bfbe18fe37548cf32c5bc558cf4764d65bbc3bf06c86fdfc5e0a6e9bf427b91e3186139ed7db3f2946bd17f20da75cff150f64d6d38a2b32f35d7fda31f4e7eae0199f67abdec936eaf9ab11b86d52ff32be1b223f843c614e76b99ebe004fb93edd5b8a11bf4664aeffc23999ebf572af18f58384ccef8ff176e419e3774ab6904fc4b0b7f67821be9f00e321bf5047de4fce7fc6b8f3477f44e6f934774c9e415fd6023c1fa1beb1ea83db26e303ec6b32e5f9c3fd2379c8f9e8b5637e1fd384ccfee45b32f3c5a3479ef1fba5a66403eba9ea856cc2ff7de86b321b60fdeedd92c7889ffe81dcd917c6433e9022e591f501633a613d28ea8185bcf2f36940e67a2bb826f3fbc78e23c5521fc50d79c6eff389c873e47f09e49bcef8bc430ffe260f78c9f191eb7f43e47b8837c5bd62e4431a79c4f963421e339e648aa5be8f3199e74fea8e4dcc37ee996c63be77618fb3199f07ab643c35e65303f12745bc98cffba827ae06e0b6c9d7d1df85187fccef7d32d7efd11b99e7d30f4332edb9cac826cebf64b02f43f5af4fe679a2f240e6f3b847d8af39e57ae9382573ffe75092179cff9fc826f21f0fe367cec6a85f5707f21ce77beb8c6c61bf36c6f5ac4ebfd12399e7b722c4136bc67a53f54676e09f89cc570d7bcaf56f7043e6fae23823333f081bf08ce7d7ab57329f5f4b31be8e9007cf7fbe28c6f3e64fe439ec35bf558cf3c947b209fd04ddeb3c1f5ca5641bf6e0c3fe9c59775eefac18eb33836ca37e9f60fe73a7dcdf882bf204f2ec11ef5cb180c1ff9f8a8c0766bf3d512ce5bd06cf18dffd94cc7899e66403e357efc162bd8bf948fa93d9ce3778de4c07cf799e2abb21cff0bc432cf30391fcf07c71fa4576111ff7cf8ab1ff8deb8bf903f12796e367aa78bd7f232ff8fc6c433620fffe85ccfa431a9299bfe63b32eb4b09e41dcd1cf4670ff946427ed4a3e7640bf5a7e0916c73ff41da8f08a6bcdf614e76204f70079ef17c6db623f379f858ae47cc497b8254de6f40b6206f3c558cf8e580857f61ff4e23cff83c0af439999b33e80bef9fcefafc3eba90ccef934976e419ec2f85bea7733edf9d4a7b32679d3fed7dc5384f58935df437b2c1ed8922e90f05b9fbbe988a4cf9ab67f202fa2f3fc1f33eeca73c82178319e2559f3c9e633e803dcfdb1378f2f577b0b801beeff291bc807f174f60b1fc453e8efb2f665cbf946fe429ecbfcc1423ff989299ffd407f06231c7f32f186f6366e1f37bc863ce789ef4d090c7e4197982eba5723e342da15fc4ff21b83da127fbdb23f3fb9c228b3c81bee31399ebc93df469cdc7dc0f5a901deeb7c0ff6d615ff07f19ff4da73d01283f1f922790f788fe3a6dc55fea27ef18e7d752e8cb9df1fbc392ad62e4dfafe4399e173d4ec806ce1fc5d27f2c118ff8bcc4864c7d1df9fa7c8efbe70fe085b020f97e191fad61a79fec8abc00ef5d32e7ab634276602ffb183ce7fc1d4b7d09675c70bf654f36309f941f60b19c427d133c9e71bec96fc8fcfe95e8132c32429c2f91f66bb5e510e85fead76a1f78c0fedb943ca17c323f10c33bc5eb8733783140fde528c7d36a0b5898bff764ceb707691f9631e7f38309f463ce78fe2b97f66559733ecf9a6b609170603f598ea7e5ccfb8c0f72fcec7e276f213f6f0fcc3ed68f7b99ff89c51bf79f7bb27ff2382ad67bd2dfe47109d4af647fdc79db24cb7c5c2e07713e5ac633d7689b7c5dfa9b6bb64db2f42fd76a9b64698faedd36c93ad975913fcaf8e53aa2e1fdb962bc7e248b3f9265fc1260f3f592ecf2fe8562dc6faf587efeb1e8693da367f6acc782fffe67cdee39aab93d4ffca0f9a205a285bf34f79716fdd27ebdbe26a4327a712fe96952feb49789b6ef1dc4cf5efc2bff87edf8432b7e68a56c45affaa5d5bfb4fd2fedd7eb37ea15e8ff247eb7ef9de56f9a3f7cfaef9b2edbf1a73bfd953c7f27df1fdfd16a72297e5652de486af7a2b7ee6d7a97e267fb0fdb9568d7a2ed446b7927db0d7f76fff87abfb64def56fcb4727fdbc39df80d7e7f2ffff54fdbf7b5bffffdc09fc71fda7fe6da6bf977debb7b2ce86fadecddefffb97e7f778fa71fdad50fed3ff2f95f5f5fcb51da0b9dc652bfcfd2cb76eabdffb4ff2fbd57d51e847c0fbfb4c75fdad32fed3f76973721e5b394f75ddaef464afccfa56de5fd6ebfcad2b6ff7979d742aeeff860489fdc286977fcf9d17a7ed7bad1fce87d8a9f8fde97fcfbe3070db7ffea0b4f7c94fe084f5ccb4f4252bc67a3c6f6fbef5fefb49171c4f8adbc9bde40fdfc95be7f9477485947e25fbf6a6fdc9bf013df5ae88b36150defd8fef0ea5fc9fbfe27f2eed495d77f72851fe57da0aedabbcfa435c3365e7b7369d32fbd85d66b7fa3c93f8c711ba9fbbef8fb5bdeed5fcabbff5379bba8b6a68eb77ff8f48ff20a69354333e57fad1fe47dd16ccdd15cd13ccdd77a5a20646d7f1bd2c6602d53718d0125fd96f7e7f8b1a5fd6a7f226ffbdf0bd1dfdb9fe4fa96f22779b5488bb544c89a6a592b8db6d70e5a2eda512bb452abb45a48dc889f9390fa441db751aa8d53adffdd6b67f660fb8ba4987da0f9bf927720ff3d90526fd51cf5abecbca2903616d2ea9a21fe0ea9d956abb5b61412af44bb1052afa5cc1bed52db4a79b7f2aa8f22265f8abb0c7e23ef8e6dabe2c39fdbc340f6ea426baff6c739f55779afc5cf4e486b6a3742d6a368b7da9d76af3d688fda9368cfda8bf6aabd0999df85cc1fc29abbfb5c6b9fe2ea973fe877f38bb46d4419c8f9e2cffc0db62b6c41fb92efdefd41e24e5ef95b2dd1fa42de813614ef7d15839d0bad8eb4b136d1a6da4c9b6b0b91146a8661988665d88623d26e4fb30d5f8cc54e7c56ef3d1a818876ed15e7d2f67f94772da5bd97f2662a9eb5bafeb614cc81f7f4b4c11f2cea9726eed9b681f038317708af3a1aa11119b19118a991197be360e4c6d1288cd2a88cda688c93713674d196c6aa1d1be3c2581b1b4d372e8dad71a53942e21b11035bcb16b21a220333dadeb43afdbdbcd0dd9a31ed6ff3ab565a610bad16b6bd176327b43b366e8c5be3ceb8371e8c47e3c978365e8c57e3cd78373e8c4fe3cbe81b0363688cb4c6b8ea3d196363626c8ca93133e6c6567385bce3de42483be9091d487917329edd297ffb9dbc5d34fcfb7cf041c6d09d1c0921af119a3d53dcc8344dcbb44d472cb33cd33703333423333613333533736f1eccdc3c9a85669ba5583857a2c7b1598bf9e6455c69dcbb311bf1df7b31667df32423eb8ff6fb477be8fc77277df3efe4ed634484ed36daad90f66ceae6d25c9917e6dadc9897e6d6bc32afcd9d7963de9a77e6bdf9603e9a4fe6b3f962be9a6f5a63be9b1fe2d3591b67445bf7c642da8d94d71057df49ef172b09e4937f2aef96def677f2e2931bf35dc86b6b23f3d3fc3252b36f3c98037328b43b32c7e6c49c9a33736e2eac9e25d6ea966959966d396249eb59bed0f2521339851558a115696d3468a3e25cd8c3a09dafa586db9c2cfa537bf8b6e1bf97f65b5e5f2bacd8fcb212e3de4aadccda9b1beb60e5d6d12aacd2aaacda6aac9368674bb796d6cabab0d6d6c6bab4b686ae15bd9d75655d5b3b113186d28e5fdbf8217e7723a3441b1ffecc7e11b3da7158ff66c6f9b56da00f2db76e85b4c2168cd4bab3eead07ebd17ab29ead17ebd57ab3dead0febd3fab2fad6c01a5a236b6c4daca935b3e6d6c2eed99a59f41e6dc336b56bdb12f25e094f14999e7565db5c95ec6d87f9fa1fe545ec1b8838feb7d1ec07794fb66b44b6671ab66f07766847766c27e6c84eedccdedb073bb78f7661977665d776639fecb3addb4b7b655fd86b7b635fda5b11272e2c21af7dd5ca6b6c95bc17bd8d9076ff27faed568d1b31af7fcf3d3bf5df9d5a99f2b7e27d2f6296f5ed6b7b67dfd8b7d69d7d67dfdb0ff6a3fd643fdb2ff6ab90f7cd7eb73f84bc9ff697ddb707f6d01ed9637b624fed993db7174ecfd1da18e6188ee9588e2d62f1b6d7d774ab5dcb627edbff497cd8d01630d3dd33aa21a358cbd76f85845be9073b196b3690d6714cdd711dcff19dc0099dc889cd919338a923f4ebec9d83933b47bb720aa7742aa7761ae7e49c1ddd593a2be7c2593b1be7d2d93a57bda994b7b50721aff03778fddfc9bb8624722efcfeedaeb7656ef243b6a65d095fbbb45d7b671aceb5b3736e9c5be7ceb9771e9c47e7c979765ea4bcafce9bf3ee7c389fce97d37706ced019396367e24c9d993377166ecfd5b44a5896c8e35d43e4fdc2dfe4daa4cbcffe2cfeee945d42de0bbe82f96e2de7ea0b562a448c94facdb5c6355dabad89b9aeebb9be1bb8a11b592f76eac66ee2a66ee6eedd839b3b1feed1e9bb855bba955b8bd6b827f7eceaeed25db917224e2c7b731175a722a6bf2a4dfdbabef859de357d08368a4c622d7f7e8c7603b79bb1c57b45d6b57237eea5bb75afdc6b77e7deb8b7ee9d7bef3eb88fce8bfbe43ebb2feeabfbe6bebb1feea7fbe5f69df6eb4c86eec81dbb1377eacedcb9bbf07a9eb89066f7069e21d77b5b39cffd9dbce851abb7db5eb72a4246dcc68b8d677a96677b8e0bff13beeb896cd7f33cdf0bbcd08bbcd84bbcd4cbbcbd77f072efe8155ee9555eed35dec93b7bbab7f456de85b7f636dea5b7f5aebc6b6fe7dd78b7de9d77ef3d788f5a2de6894fafad5b6cdb39e81fcabb535e860877e93d0b695fbc57efcd7b177f7fc83e7c0a79bfbcbe37f0864ee08dbcb13711f24ebd9937f7167ecfd77cc36b7cd3b77cdb777cd7f77cdf0ffcd08ffcd84ffcd4cffcbd7ff0737be38b9cc22ffc52c83b311b315f3632a3f87bfb853decb4b35f49bbb89431e1c2affdc63ff967efc3d7fda5bff22ffcb55801b9fec6bff4b7fe957fed0b6b701efc1bffd6bff3effd07aff41ffd27dff09ffd17ffd57ff3dffd0fffd3fff2fbfec01ffa237f2c249ef8537fe6cffd45d033f4de20d002a37745795fffb0bef8dd7cdcadb0588108ccc012b2d6811d38811b787e13f842ee93f71c04411844411c24e65b900659b00f0e411e1c83c2790ecaa0f2caa00e9ae0e49d8273a007cb60155c04eb60135c06dbe02ab80e76c14d701bdc05f7c143f0183cf9c7e03978095e83b7a05d8db83283ff6b7be8729d35f57d2fa4fd686342f0e99fb4afe04b48eb06fd602064ae8361300ac6c1249806b3601e2cecfbe010f6422d34823234432bb4432774432ff4c3200cc3c8bb08e33009d3300bf7e121ccc363588465588575d884a7f01ceae1325c8517c6265c0b796db10ee9d617bfcf777e5c3bed647c103384907720fcec2ddcf87a78196ec3abf03adc8984ea26bc0defc2fbf0217c0c9fc2672b7382f0c5cac3d7f04dcafb1e7e849ffe53f815f6c341380c47e1389c84d37016cec345d48bb4c888ccc88aecc889dcc88b7c4f8b82e0250a8d4d6f22e4cda348bbd2ce3fad8f7f2f6fa765f15b77edaefd2a8aa3244aa32ce87bafd13e3a88964679748c8aa88caaa88e1adbb7b2e8e4dc47e748f78ed1325a4517411dadad41b4892ea36d74155dbb836817dd44b7d15d741f3d448fd153f41cbd44afd15bf41e7d449fd665f415f5a38198895b799d6848fde67fba1eda2a3bc66f6fcd53348ac6d1249a4663ef233a045fd12cf002d7d7a379b4887b62496fc4666cc576ecc4ae736fbdc45eecc7411c867650fb4fee7b1c79e7388e93388db3781fa6f121cee363f41017711957711d37f1293ec77abc8c57f145bc8e3742defbf852d8ef4c665df99fae37ff506588b7d128be0a2fc5b2a68eafa32cde095bb80ebcf8c67b0977f16d7c171de2fbf8217e8c9fe267fbdeb98f85bcce73fc1a5a5e19bf0527ff5948fb1e7fc49ff157dc8f07f150483b8ac7f1247a8aa7f12c9ec78ba427168246625a9e88109f89d5ae341291f7248eb086c15fdac3565985acf488c8d078223e041f891bf842af7d5f0fc4a410a589ef3d2741122651122749922659b2b7efdd9bf8c5bf4b0e9037c9936352f85652265552274d724ace899e2c935572113d25eb64935c26dbe42ab94e76c94d729bdc25f75a98c8caa5ccd25ea564f95ff8db777c905998b108db35ea2079f43e82afe4c95f27cfc94b7893bc266fc97bf2917c265f493f1924c364948ca1df64924cdd2499f9bd649e2cd25eaaa56291945aa99d3aa99b2c532ff5d3200dd3288dd3244dd32cdda787344f8f699196c20adabaf1ae3d5325f2b4aedea771bfa5fdf7774d72cb1cb2cb7744f69856bd4d3409af5bfd464721e7735ab79af62fd2263da5e7544f97e92abd48d7e926bd4cb7e9557a9deed29bd67ad3dbf42eba4cefd387f4317d4a9fd397f4357d4bdfd38ff433fd4afbe9201da6a3749c4ed2693a4be7e9c23f663d29ef7d2616a1c6a594ecf7f305ec764059656c10128bf92dde8ae953c4b0ccd0be3253586f3ff192d7cc4a9e323b733237f3323f0bb2308bfc5d16674932c9d22cf3ca6c9f1d423fcbb363566465566575d664a7ec9ce9d9325b6517d93a1d649bec32db6657d975b6cb6eb2dbec2e6b35f6d85b1bf33f913757f6800c176b4dc82b2c22b0bc67e1635be16b37c973e06722ee06fdec217b4cfcec297bce5eb2d7ec2d7bcf3eec20fbccbeb27e36c886d6879477149cb37136c9a6d92c9b670b71636d6feccdbdb5b7a3479118bb7b6fefef837db88ff6f13ed9a7fbac9557e468ebde87b088bf9217f5aaae5a089bb8f46cbfdeef5b0f8b6f8cebfd41c8f8180b79a36c9f07fd78b73fee8b7db9aff6f5bed99ff6e7bdbe5fee57fb8bfd7abfd95feeb7fbabfd7536d9eff637a9bdbf8d0ffbbbecbcbfdf3fec1ff74ffbe7fdcbfe75ffb67fdf7fa487fde7fe6bdfdf0f84bc0f42dead90f752f85b67bfc66fe55d3396b1669856fb611b79c50cfc15dea4757cb31f855bed2bdca6f57ebc9feca7fbd97ebe5f1c7a07ed601ccc8375b00fcec13d7807ff1084ee2114134b7c480ee9214bedc3fe7038e487a3b088f3a13894c28e83e4e2501dea4373381dce07fdb03cac0e179a29f2c98d9077f597f276339bb005b13ae3ca27de8a25d949c4afd97ee27d08ab75a383711db887b5f675d81c2e0fdbc3d5e1fab0f3fa879bc3ede1ee707f78383c1e9eb2ecf01cbaf6e7e1c5290faf87b7c3fbe1e3f079f83af40f83e83e591e8687d1617c981ca687d9617e58e4bd5ccb8ddcccaddcce1db1929b08593f38ce3fcbfba3bfc1d3ee3d4bae8d65b4481e93d756c3c25e5f0febb4167142586fee267eeee57e1ee4611ee5719ee4699ee5fbfc90e7f95124eb455ee6555ee74d7ecacfb99e2ff3557e91bee6eb64999dfd38dfe497f936bfcaaff35d7e93dfe677f97dfe903f3a9bfc297ff68c1c7b0b9b5fe4fd359ed10e5cd4895b792fc38d8865affe397fdd8f849c6fe195c87c76e25feff947fe997fe5fdb606950ff2613ef2d27c9c5ee7c77c924ff3593e0ffd7c71ec1db5437a348ee6d13ada4727df1cdda37714a9e3313c46c7f8981cd36376dc1f0fc7fc783c16c6568b6545b5ad0843aadfebb79b2fbeb3c9adac2f5cec87f9abf6752c8fd5b13e36c7d3f17cd48fcbe3ea78715c1f37c7cbe3d6c88e57c7ebf0e5b83bde1c6f8f77c7fbe3c3f1d1ab8f4fc7e7fc747c39be1edfb2d9f1fdf871fccc16c7af635fb4c171781c1dc7c7c9717a9c1de7c745d1b32e8d915873ea622dbf6bf71054fefbd7f27ee768a27785e657c6229a174661165661174ee1169e58b80445584445ac4d8ca4488a34bd2cb2625f1c8abc38164551165551fbcf45539c8a73a117cb62555c14eb62535c16dbe2aab82e76c54d715bdc15f7c543f1583c15cfc54bf1ea9a22f24effd3f26edb35651be7dcb57355bc15efc547f1597c15fd62500422e3bb2f86415c8c8cac181793f0a59816b3625e2cca5ea99546929766699576e9946e299646a5488ae37e19890c785ac6f1b94cca342ccbacdc9787322f8f5eaf2cc49a7e605d6b496f2be46dfe43f26e7f9016f68c58f1d8aeaa7a6331877c9465ef456bcaaaacb5a7b2294f46569e4bbd5c96abf2a25c0b7937e565b92dafe2a8bc8edf8365b92b6f84bcb7e55d795f3e948fe553f95cbef8fdf2b57c2bdfcb8ff2b3fc2afbadb769476da8f585bc1b21affd1f94f7c77ade8095a9818831d7e5a07723e415fd2e87e548bb2bc7e544b4a9d937d7d1c9bd11c1e2f5785bceca79b908edaa5769959194f147b0aacccaaaeccaa9dccaabfc2aa8c22aaae22aa9d22aabf6d5a1caaba3a7b5d959552879eb7f2c2f347b4ffdb6f5a1b190b8ddb93a688d115665555575d51899f1d8ae8dab5375f6ef83d22bdca74aaf96d5aabaa8d6d5a6baacb6d555755dedaa9bea56b4bbeabe7aa81eaba7eab97aa95eabb7eabdfaf034ad6ab52bede13f27afca7db4b3acbb6caacfb6eaa28945b7d6545f555fc83b682bead5b01a55e36ae24dbc99f35c4d9d7d35f3aa6a5e2dea5eadd5466dfa5e6dd576edd46eedb58bed3aaca33aae933aadb37a5f1fccd73ad7022b12d2b6f2befe03fbfd6eebdef77e51bb1f79d36ada2fdafd6b63591feba22eebaaaeebc678b01eea537daef57a59afea8b7a6d19cebeded497f5b6beaaafeb5d7d53dfd677f5bd90f2a17eac9feae7faa57eaddfeaf7faa3fe0c9e8a57b1b6b817b6d0caab9bef5afd1b79dfe5de5657a7eebcedc75affb7ec57d2dfdaea7fa369e6bbb113f27e999aa9d775abe1ba5f0f84c4c37a548feb493dad67f5bc5e343da126a3311babb11ba7711baff19ba0099ba8899ba4499bacd9378726179157d7721179fb52e244c86bcb7d819ff7e735b5bff95d23fd9de47f9057fc391a61fd65dc34c76ad0ee03081b7eb0ef9aa2299b2afb6aeaa6b18ae6d49c1bbd5936abe6a259379be6b2d93657cd75b36b6e9adbe6aeb96f1e9ac7e6c97c9579ef4c445e21af6df7aefe445eccc73875b275d75c15ef7e8ac5bf91177b16daa8ea37cfcd8bd0f19770bad7e6cd4a9bf7c36df3518d0f77cda779dd7c35fd66d00c9b51336e26cd54b459336f16a7de493b1927f3649dec9373728b57b330c4681ad376f750dee95dce17bfcafb4cfb6db3f4cbf88af2aad9b8f75daf96f1e127796deda4dd696fcd8b363d7927dfbf3c05a7f0149de253724a4fd9697f3a9cc4647c2a4ee5a93ad5a7e6743a9d4ffa69795a9d2e4eebd3e67479da9eae4ed79e266ca1e9bd7a8659b5adadf6998d3cefb1fd455e83fa1d2077fc49de9f4f3cfc51de463b9d76a79bd3adf670ba3bdd9f1eb4a7d3e3e9e9f47c7a310ea757a33cbd9dde4f1fa7cfd3d7a97f1a9c86a7d1697c9a9ca6a799bd38cd4f8b73efac9d8db369e8594fd6d6dbb33e134abbed0d45fb555eadd79e43dc7067e5e7facecfa74994bcf26ad4ef6977b6cef6d939bb4262d1ceded9377aa7e773700ecfd1393e27e75424e7fbf3e19c9f8f6791489ccb7375aecfcdf9743e9ff5f3d23c9e57c221575ad67bf28cf3456f725e9f37220e89f5857d25cfdcfd28efbb90369333c2656ff393f5fe782601bfbbeae4edddb4a75b5a79cf97e7edf9ea7c7dde9d6fceb7e7bbf3bdf6727e383f8af6747e3ebf9c5fcf6fe7f7f3c7f9f3fc75ee9f07e7e179741e9f27e7e979769e9f1786aef774adf7a11b5aac0d9d2b21ef63efc57c37dfc5f563ddfc83bcc64ff16cf78bb4dffb2f6dddfa1afe0679db88a61d744bb775477785c437baa7fbdaab90d7d7033dd4233dd6133dd5337daf1ff45c3fea855eea955eeb8d7ed2cfbaae2ff5955668ae7ed1ee77db963c0d78f337f2beff90afffb843f1e3f9a2adda3dfcb15a256611cfd5d7fa46c8ebe8976757df9e1ef42bfd5adfe937faad7ea7dfeb0ffaa3fe24e47dd65ff457fd4d7fd73ff44ffd4befeb037d6878da5e8c137cea414ac66b8bf9a895672acf23fd3a5ffc2cefaf6da72ce2e7595acaeb17fa48df9caff5b13ed1a7fa4c9feb0b7d9727faedb2b7d496c6d25c5a4b7be92cdda5b7f497c1325c46cb78992c53a3dd837df96936eaee87fac7777de177f3f19fcbfb3d6ffcf1fcc6ae375e66cbfdf2707697f9f2b82c96e5b25ad6cb667912d29e97fa72b95c2d2f96ebe56679b9dc2eaf96d7cbddf266796be6cb3b6da9d962d4ff98af747ba7df5afab3faceeff39deff3313f9e06926436bab5bc3f3bcb077dbb7c5c3e2d9f972fcbd7e5dbf27df9b1fc5c7e0979fbcbc172b81c2dc7cbc972ba9c2de7e66b9b359a858886b9dc4df9b9b573d6ba9bbffe46dedf69b69377ade2dbb7bc6d7b592e8ae1e96ef9b8eaadb495b13257d6ca161afe58392b77e5adfc55b00a57d12a5e25abd4daee07ab2cb95fedb5d1ead0e6fcbfcaab9d63ac68bad390ff54de1fe3daa6f77dc280fea8b9ab5c8cec5b55ae8eab42485cae4cd75e552261a857cdeab43aaff4d572b5caee8cd43f0a492fcc62b5d69ad546db8a08b0ffc3ddd6ee9ae7c97ebcf7efeb51bfb7dc1fe3c4baf7639c13ff6af762e509becabe363f5797abedea6a75bddaad6e56b7abbbd5ddf2252d57f786be7a308bec7ef52866865de2b427ebf48b68a8ce6ffda89def33b19d0dfe95bcbfc633eeb9fe6147b6935bcc73f1a5587351ea4c58e6ea49fc3c878fab97f6e4d6ea35bb17a12214afeeb5f6b4084e884ec5e767bdf91ff52beb1e90f47b6ffdafcff7fd55fb9db57cfc700ed19572b70b0aaf95b6edc312275437abb7d5bb15c9fc7620cfa6ce45fbf53cdeefeffa3f27ef8ffffef5bcef074fd3b667fd9c76452366c19e98b5aeb4c48a561fd675dbc45cd66af9f537fafd5f2defafeda93df1d9b5ded3ea539daf6ef3ab57791eb5b552b1c2b16deb4aae75e4193bd15e38b7fdb99cff1be4fd59e2d5d7ea4bc9f3247528673159617a12f2263fbcfaa2ea637fd7fed7c94b99bbc6f394dff27e6bbb6d573fe9f3499e0dfcff5fde6fb91f85a4573f48fb2df1a63da3d61b8bacae912780dbf73ffc17c8fbf253fb8de68555b7eb84f6fc7aeb7bae3cb728cf86ff9c93fd6f92f7d708fcf2f712cb98d17a9edbc6bc761da59ed778f8dbc8f0abbcddfab83b07fe9fd1f17f7c2cbe7fbe7bfcd7b242aae6a7fc7729338cff9af61fd1d04eae318d9f9e77bae52bff75ed3b57fdb1b5f57dd843f4c3fa622fadf8ee1f3f5df8bfbfb592b54f3b35ab3eeb25edf36fadbeef7a7ff72ce07f45c3338fedf385783e2bee99ab414f137f0fc5bf7f7dfaf3bfbea5bd532f5a8dc47fad7fff7fffcf7ffbff00ab5044c0</data> + </image> + <image name="image6"> + <data format="XPM.GZ" length="95682">789c44ddc7722a5dd6ade17e5dc51745afe204854d92c66948026441202f9d388dc4c93bbcf4dffc9f30df31b4b55b4fa459b9cc5c260dfffdcf3f77fdee3ffff9efbfe68b6cf13cfa67f494cdfef9cf78f9fefef3fffefffffd9f7ffd3b4dfec9ffd7aaa5d23fd57fff9f7ffdbb3839fe67f44fa15429e5ff76f0740a544ae5d8e26807556ff1d8002a823a500526a7863846a5050ccbb1c5e87a07b5bf5d4e0cb1cbfb85a11209ab0035b6c84686d8e2ed12a8039b6c07f5edd5ec60d10474da2c33c4419f8e0db14b36047cda8921b678b905eada626a882daeaa802ebf7f6a885daa17c008981cee2071aebf5f024afad389217679ae18e2b48f09e0a48f0db1c5700628a5ef5786a81f1ff740020c8f0db51d7c960df51d4c75da06bb4c1b4013b82d18a69141756028d0b58c816e0b989477292d14df8069390efa14f5b4e1c21e0a94639bd410f9f1786a885d4657404df5a3606097ae816af96d8874bc5d00aa0e8f0b43e458f603284f473740832dbeea405a4a76705d02b2d22432a866880caa291d1975ac7a6388749ceab4438e71ba31c431aa6f027619dc03a3d238ce32177096dab52176a9770c7171374ac7985dcecf0cb14bd230449e565f0c54981e306197febd2176b9be03a66c91960d91a7f57743e46956dc41fa170c360682411550e98f2e0c71dae75343a4f4f5d710a77d6d03aa0e4f3303f5f4dbc0310a8638c650c7481493cf0c44a93d403568da0452416a8866faa8cb6f02df354323a2f6a1214abf710ea88ef50680aad4e0c11055eab2216097a46d20f4bd1ae25a9a4b43e447bf04a8165e248638ed656a88d3f6950ed5d38bba214e7b796988d3269f8638ed838a4131a8a7cb574dbeb934c4416fae0cd4e45b431cf4eec010e57273618862383b06269cf6fc46a006746da0cd1d19e2b4fd3b439cf6fade406b50d94e39e865dd10c7a82d0c34e481218e51bb3144d2eb354334b1e6b1218dfc201de512074d5b86386895922b97e3a085e299218e51a389952bc05be469d30d797469a0cd6d00b5caec1150ab1c760cc4f52f435ccbeb11a036f7b831d0357e19e22ca33b436450a507a86b1c7e1a6297a7a2217679bd0552f5a60503d1e1d410bb5cbe1b8671d00468b2cb630a6434f5d3b5212addac040c4b91c9974d43b4b95edf10bb9cfe0aa852571f86c8e4fb2f436461e5c81009eb1e036ad9e7b7065ac39580b39cb50cf4737b8638cbcdb521b2f052f9a1967da674a8659fcc0d71d0eedf1671d0d37d03cd2333c4b5245f8628978b0630e1e2ee9474b7ec4b03a73d30c469bb6d032dfbd610a7bddb37c469abef86a8c9b599214abfaf63a8ed9fb50d74c0a78638cbed9921ce92a486384bf5ce106779a06abbeddfff18e2a00fb706925e3270d08a210edae42c797420a0540c71d0d2a9210efa7069e0a01f8638686d6d88caff400dca434e1ca3bc31c4311eae0c749e2706425f15a8ea183543ec5288269679eab529001a7f0ce780a2d4e39981807208284a3d9f18628b55c940c8591a22e232b1da02a1efc71029fd38021a3a4bdd1067f9ac19e22c2f0f80e2d87762208e7d182283c63aa846289f554324ec7405e47f91a70f866862d32230649787be21da7ef94da0807260885c7f18008a41a72d8146171786d8e5fcc4406f7a6b88cb6ffc01f574df10573b6f00632eeefac1402cbc13286ccd0cc4c2b621d271db3530b8fa834847b96c887434fece12a57fa52d14a5cebb06e247c7c0b067cf1067e9f50c7196b46a204add1b1a3110780734c4af5c1be2b4bd530381be6620c2248638ed55c9c0691f0c71b537478668c8b7242c8f41d48f1743a4e3ae6788740cee0c918e7edf10e928750cd4d31b43a4a3746448233ffeced28c5ac8d53a16d6ab06cab66ee0b42786386de5d8402c5c19e2f22ba7064eabb35474967b439ca5b631c459caef06a265c71067691072f2e048c2ce0cb14bbd6e885d9299211236b8026a1c631d653bf4ca55a106683eb72a001a174e4f0dac90b40d91c9cf178022ee6bc7105b3cfe18187e2d0d9141cf0340f1745d32c4317e278638c6bc698863ac8780e2e9fbad21e27a616a88fc18be1b224fd765402b35ab91210efaf1b70541ba6a60a9e2d930dac14c5b640af46f86d8e5a36488748c6e0d51b6677b8618d2ce2ac050d3d9cc10071dd70c113f0a8f02a2e5c38581d1d609a08966a925608bde31a0107cb210b0c5ddaf81d167df10799a9c1b08063d0311f7ef18712d6fd7c0840c5a160dd1379c1d0a38ed43c310a73d3d30c469cf7b8638edcdb9214e5baf18e2b4e535a010dc3b3170b545439cb67b6888d35edf18e2b4f74d439cb6f16d20f27f199802fe18a2a9af28fd7289fce85d186220d0bc17a8e33b3390b02703097b3744c24a6d0331f9d8404cfe3634033e01c5e4d29581d35e1be2b4835b439c76706388d35e940d84be6f435c7e4907554cbebe327096bf2de22c975503ddfcbd815c2f1bb2b8b85343b4ca1aedc563dcd2a181303e3250a52a06aea56988b2ad370c7171d51950e318496660ac7d6588635c960d91d2f4cd1051aa4e4d2ed739463d31c4316ac4f572c2691b45436cb18ede63e4f1fa2205d49dbc770cd15e3e0e0c513fb225a0b5be978e81db1c6d43ecf2726888c29e7401f51ed5c4400f3437b0cc503444416dee008dc65f0f0cb1c56a0ca86ff86a1888c94d43ecf2a30c5257b01c1a9846fe6d11993c7c3544b9bcdf008afc4f1f86d86278028c38c663c1105b64bf8628b97b659002fd780f18738c936f8106bda7862897932f0353d17b432ddacb8721f2e358bb6801a079698883de370c9163e99e81867c66888326234324fd7e03284877f70dac5da40696f6ee0cc4c24f03e3e4a5818162c910797a4de9e7b190fe3635b0aaf060a0273c3730472e19e2b4f77fc788d3562f0db4fdb221d2d1bc0514829b178638edd5bb8115b41b0303d6aa214e7bfe778c386dff6f9738edb376a9300e4af705a4e3a262600a583470f99f06ba824b43a463d033908e6b43a4e3d6e9207c0e068688857d81a276fdd8c064a46988d35e560c71da8b5b03d1b268e0b47d439cb6fa6c20046b178dd7cbaf06baa43b03a7bd3430e63f37c46953c2671ec6e31869cd10c7480b863846656c8863dc9e1822e99509a0ae207d3570da4343ecf21a3076e4cfd60616762f0145fee99981c8df32b0ca726460eab532101c1786c8d3a73ea0a9c6d3998109cddf1671d0e7bf2d98ae1c035acba9ed1bb8ebd532c42ecb0c70df303390b0b921f2f4696d609dff0670675134c4316e6b8618c0ffe8b49a1524bf06e2faa7217619578031a77db93744fde829d715f99bd706725de998305d393b317083fb4da0b85e32b032f1608874dc340045edfb0f03f7929a863846af6b88cb4f87062a6e746b6307e9db92210e3ae81a58a9691be2a0773f06c6741f069ad8c81059382183ca6532e8e5ce1019745b16e8e20a06baa47d43a4e37c60605dfbca40dff064606c393744bb7da58ee5519b35b6738126341d0363dc0343a4a37766a06bbc3210b6ee0c849cb62186d63caa31fe1b5a2bc7aae447e3cb10e9e85f18e82c4e0cf495bf066eeadc1a221d49cb10f991cc0d918ea46f88a87d2df0e07b6e88833e9c1b38e89d210e7a716f888356540c0ad20faf863868e3cd1007bd2c1938e883215a765d755de3f5fab9218ed17c30c4311a05431ca34a3c2d3714e853c36e8b42515ba4e598797ec4d54ef240bf6b6285c291a11c859d1922a07c9f1ba2d22def0d2cff2440a2871756061e4b3a3210d7bb8022ffe38581877d5a06ee12f70c51c7b20590d247fd8e0c74055503c7681a18d42c0d2c3328619a4854eb86d8e27969889afcf300649c36f931c42e135ddc505dd2be814595cc4050ba04465a422a1bd8e20ad0ace0b96660a14a6751df502f19221d4d1d43e3f5135ddc34424e2153e92bd0df750d9185cd1b0371fdc1c04889fae1f58f6a4340a04f5f0c7196dea1817b7c45033730af0cdc7d5b1858b6ed191806b60dd15e26d40f47fee443a04713ca066638a70686a35d03339c370331e8da10a7edeba08aeb8d8d40bde9ab81a9c6af8141efb581307e63e06aeb86386d435b286aa7cf06d6faba06c6301503538dbe8121fea581d366067a8f1743c4d34be28747d297778638e8ddc61007ad2e0d712d777dc330ce3231c459ee75f91a6bdf9c1818c31c1b18af5f1858b92a18a27e5cdd1ae22c35028ac378e9d6c002516aa08efd6dc15cecc8c0a34daa850d0e9a6e0c742725431ca3b167a06f5819a2cd355471d3d8a5507832c416e93bd0e42cb368c8537516c545c34067313430803f07bc62746c88aabd57041a7a627760e01645cf4023fc3230a43d34b09297018afcc9dac02e2b0323fa4f435487a72ed0e45a2ae78648c74f19d098bffe69a06f5819e22c9f3ac65013ab9981bb4d434314f6ef13a0c87ff16c6019eac51075eca50da82b78aa1be2e2d6caa02991ae722fd03a4cd4a0a943f0ddb9210e3ae1a08e9693c410b5f0fb6f8ba8859f15a002ccca86a874c9be809073716d60a67505548996c981406bf49f069eeee819e218f72f06d6607d508dd81e0c712db7d43107a5fb9a814897180817370656153686b8fc2b5d9c6250f9c5c042d5c01007ad4c0d71d066c9100db93833c459d286814ca68ee51186d0d735c4596ece0c7196eb4b43e447b569606c796ee0aec6c6100595fe008a63c9bd214e5b4b0dcc2c1a86386d7360888b6b560c934847df104396e25c508908d350d25345cb2303d1726d886b299d19e2a005e2988263a1f828a870bb7617d8f2318e42df53cf105b4cbb866862f3be81dba403a0a16597be81875b7a06028a76493592ee1b788477cfc052c5c6100de8f10850e89bf40c2ceb9f1922a56f3f06d661168628ecf925a0f5f59f922176792b18e28e55d633c4319e7e0cf4955f806fb5fe1a58219919a28e3dbf1b98475581911e476e198874d78638c6545938261d635d8bee790e9f80a9b6d80ff05dc0496a882d4a97069ae98380f1d8a40138e2560ccc4dcb023ddb5330c469dfb91687e03413d02a37234001b67620d040b16e2016560d8c507e0d712d3fb486724d8b4c37028d939f0ddcf77832f08cd185212ebfa4a42b5ade1e198896b786d8e5e6d4408edd190828654324fd9ec2fe9b781f1ba8858981d9fcccc058aa69e075066ab2435fe3d51067b93d3690d24703e3c217034149a0b0754303caa31491ae616018583330f750b5cc941fc48ff2b0c27dc2681e653fd2fc5d057427f1e3d0c0232345402b028bc44060bb3030ea3b0714e9960f06d60cfeb6e0a1d69581b77dae00c5c2e90da038b62c1b58b97a3430a63b333079d76935bd9f0c0ccca25b066e4f3e1aa2aebf6d0ccc4d47805604922b038bc34b431ce34b3936221d5f0303d3b7a9218ef1fb6ce0e6f4b5211ad0cb2930d6312a060657878648fae3da10c7183e1ba2d24d4ac0842d1ef70d51d79fbf0decd204a644cb51db10bb1c6b17bd24704395da46e56862df86a8ebe303a04c3a3e1e0c51f9bf740c0d47cb770246c1e7f74095d39e760cbc97543244a54bfb0666af7b86b8b8790ad438e86668e035a43d43e4fa15f54391ae50fc03e247c740db7f37c4c55d53933d0c4cd78638c6c39b8149e21f101dea06467d7fc720a0d0801cd8ca3f067aa0998163d40c0ce12e0431842b144f0cbc527509783afb6c205a2606c67477069eb6fd15c4410b45da5c1e1c7984f7cbc0907625606cd9d4b564ba965760483aa611932b1e062eea40935858fd323084bb364474f86d1a18c25d1876cdb490750d849c2320d398ae6f6085f5c4c0db933d0367b934100b6f812107ddcb0c0c47eb06de6e79361061c6066eb6b50d512df786c048af421e19e2a07b8f060e3a3110b6fe8e11f9f1b230b052330014fadef60d2ceb3f19885237c044a72d1b88b863435ccb8a746cc79f112d1f0d0c145b800679dd534354ba3119940fd0629765c11095ee5707ad69907700d435473e31308621a579bb658bba8185aa1b0373b19521a68085ae21d2b1a19ee60db91a5bbc1a18f63c1b08285503f3392a5dde4cb9ab313030f3fc03dadcdc403335d04ceb1f809a693931c42e75e57ac62ea97619b24545573bd2164b435c6d910a539e54b83312795af538e8b36488b6ffdd033c9f3b073486793d0518c314b23fe02668cfc07cee1250db5f570c54dc0743ec321f006ac8d9938191d2818163940c718cbd11a011caf4dac013bbc70692fe07bca57760e0aec6ccc0d8e10a50bb4dbb066a72cb10c7f8d6c5a9ddbe4e0d4cf0be0d71963d6d31e5a0a34303cf05770c718cc7e8b3ab1e7f4cca40992d2a578668514fef86d86544d23d20395919080637408d63d0c4aa9e698d6f813ac1e0776a60765214d07966f780fadbc20940d7587cb80334b3482f0c849c2b4334e4c2a981e98aae96ceb3904d0dac273f1a184be9b46aa64d253dd3314a0646e309a0769b2c04b4dbeaa7212eae796ee0630d918535bffdb45700349118f701759ebfa921ead8de1850034a4f0cb1c5d7a9213a8bd205a0f6325c1862979faa819b6d9f061e04ed006e0d6d032d6a63887eeefdc7c092c91e30a106ed4d00b586e6be210eda8e865cf372c743ddc053154f86a8419fdaa5ac6597b581aef101a890d2e9ca1009eb75042c5564246cdbfae3185706660577408d848daf0dd464a554cf7e35bc0523faf13d50e76aa9da35b7b9b35381be32a284256aa687400318ed09ca54edbe213abe4c094ba39e160a6740535b28c73c3e7d03684085ac22a0aed7046a2ff554a0637c01238d935f0d747ccf066e0a532dcbd30acf39760db1c52ca0aed97c213b03fc88d500c86884afd7c090db4fc51f4394fee6c11067595c1ab84bdc30c4595e4f0035b14adf40133b35708c0c18ab659f196297af3fe0ad81a2815b9c0343d4f5b90e3ad1aac2c410079df500b5b9e737819ee727e9dba5dd682f5f066e60be1ae2b48f2bc00f3f3d1ba2265f3f0215b6a8bf0998464ed7809b5807a801c73301ade16d68e06a5f0cbb840d1614a53aadc1a26298069405facac8a361185b9480842dc63d038f569f036e739706d6a4a97479138bb728b23b039da772ccbdd80d90698baa21bac62c35d02a752d99dacb37a056992e04ea1a6f010f47af0d348f170399fc6ee0f5632a5d79a2c9fbbd405d63cfc0f38531694ebcb6f57c09684ef876686062f56888f0f97a0c68a0f87865e03de00b035f5eb837446bf83c34f068f50fa07161b360a0d31a1b48fa9181459515a036d74c0ddc59ed18a2791c0d00bac642f1da40b8681ab8fc5743b4a8f7918199567405c9f63e4fb4ca39a0aeb1341450b5e764a19b69e9dc10297d1b0bd865ba0f686d6bb8046a746b9bb1214e3b3a30448579f914e869fd2f43168d9092fb6bb73520115405a4a3f260600e343230fcea020db5ec13038b2abab8544f882883dc909b02b55b2a9dda6d31bd014654fefb6f60acd67062e0b50aaa76de5ea8411fc054107d43522955a2a0bea2a01a5ef99ed780a6668d6780e6734f03c06dae63e086dd0d30d283182706d6d75f0c4487a18106f4688840bfb802c69ca57261e0182303edb660889abc9802eae7defe202add4cbb4c75d0a981267663a0792c0ddc6cdb18a2289fe70686b45171f3faa3a7180b0692be36308d3c35c4590e2f0c3c58ff6ce0de3ce9f012f4f3dac0acf1db102d6af20bd4a8fca363a0ce59a6730343496fa1863c36708c7b20a1477ef912b0c5903ab62d8838e89181b3780bb5b953039fa4fa3570da1f032b02ca8f54af85f70d7171bd4ba0c9c7d5b25b205343a6f2e75d239f2e69036aa6b53d604ccb2ef4007ab1c250853d5543e65a2ae50a813e7ae45483cde2fb2130d23acc8981e9fd25a0d6b0b80626b497fd8521b658bd19a26a17ce0d918ed7170315f70b50f3584c0c54dc3b438c3eb34f4334e48f7d0373f5c8d35475bd907d1918e4b50dac39ce80327d65e7ccc0a0f7d6c023de6f866895af4f061e181a19e22c1997ef29e0fbaf81b727cf0d718ce114d014f0f140a071720f50b7f6a0a4eb764b46616fc73901478638ede2c6c0eb1d43400d689a1968400990028fda25d50b0fba160de1864560a23eaa61a0a06ac094115b15a8542abcc44ad956aa7438aba8da4d47feaf3ea08afb3b07547197cf86d8e27b6488ce62f364e0c1d8bf5d1849170cdc163c06a65aa67c3530171b18a235fc2e0c71711bce92574b569c3f0c4c348b069ad8a78197f1af0d91d2c2952152fa3504ca3ac6858162f836708c2f03cf6baf0c84e0bf5d581fbb04aaea2c7e0c5161a64aba2656cfbada1a8f8c1496803a8be1c410c778d7b5d419b1156640426b588f0c51b5b38e8156790234384b766ca021d70d71da858ac1bdc7ccc08704f70c3cb34985717b79bd13708c590dd04700476b40dfeb1bad0c512d6f6e8111539e79b4b9cc1389f905a0d6d03e02dc1a4a061e6d7a3144d27f878082f4b4666025efd9c0074138862beee60f628bfdb9818afb6d88a4ef7d008ac9df4303bbf40dd1800ef6810a4dacdc30304e9e1ba2b0974f4055c3af8d8178fa00d448d8feab8165863d4314c3fd8180922b2c00ad5a4f96024d134a065e0efc32f0519101a0303ebc34444a871786a8b80ff70666383a8b2aee686320a56b20e518ef778638c67322e018931f03370e55d84d0dbf068638c6dbad80631ccf0d8cb632406f1c3e2bd7337dd5eb0da0791486aa1f13d61d1a5487bcf7e0b60f07add4d47b44d90efd99d18f5b40b7af977706de79af0113bd6f3a37d0c40e0d348f3760ca597e5e0db1cbe1c0c04767fe7689d3cee3e2866e51f76b40613c9b19a27e2cc640855d3a5d03eb744540957ffd6ce0a3440503bd4706d4d8e2e7dd4085d918a2b0f775d07a89e5b01b43d48f0259b89d9ec51677061e6e490155bae135d0d4a0e6d4c08de58a218eb11c09f4f80b05b50d07119333031f681b1b22e40cb5c58401c90509abe851f3ebb2403775ea4045c39e04a8b272f51d716ce420fdd90554a53aa786d865d80234dc180d0c918ee39e218e71fcb705d5323268e42a755a05ca1a6e64063e4df16a88cbef9c008ab81f4d03f5e309501ddb175061068b818128f52ba05cca2950d74277622026bf18a2f40f5a8638e8f00ad0a07754337077e5d34090ee08484761056864505e18e22ceb77010381c206d037430bbf0696a1aa0606246780aaf6746a88637c0e0524ece9c5c092c91fb03ca85df4f4f1746288d33e3e1ae25a56aa1f1a7ffc28c7f4f1bdf1dcc08d65e5875ed81ecd0d3c75f300e8fdec59f45163cf4d8ffa802affb14035f9226ad0d8cb1d27b7802aeef215502dec26405513de85815755be0175f30f25038b7f3a8baad44b034838cb77d3c0ea68dd1045b9ff6820d73f05aa633f40430fea6486a874374301bb4cbd8b56267496544b48430323e91b03672918e22ce70d43a474d83730057c13104f5f9b8628ca93b58127fef70d3c07ab8b53d47ea91b221da38a214ebb51d9aaf20fef007dc3ec6568e0e254b69932e8c040b56c01fa64d9f8db40805d1ab81330327023f50b50f3287c1a58e95d1a681e3340efac8e740cbd80fafc62608d8d92ab94d425918e4a994559e673e34a93b37cc42e132f97ceabc0586deedc10bb9cdc01ee3dce0db1c5799c76fb222ccf7d360c71b527f78638c6fdcac0ac405b94f5a0ce17a0df1a98560db1c57bdd1081edec17d00ac9c31350e32c77670686f88f86a8dab31301a5bf7a07d4e18cea06de5ef830b0d4a9a46b99b2dd01140c16234314e5d3d410e958eba0ba7930f93444c2964a7a83831e1c18187e350c0c9d0a40ca2ea3c44030b835d0adcd0ddcced741d5038d5203f77054946a9585aa81098d2e5fdf949d8c81a1baa45781c2c5b38105c48d812e9a7a5af6f7a57e0d3c91f966a02b5075d09be48f5f063e37a6a4ab553eed016a84df1194a66e40dd3aa0f672167de5f6f541a609df86a8c96725439ce5ac0aa8aedfd40d51938fbb40955d06992192fea6d3eaaed7eac3c0b3c58706d650b48bc6529d63039dd60c503fb7f76ee0d1fb04d01a4a61cfc0935d8f06c6fc4f06d6833a02cae5e5c710a77d9e02ead6b2ae81d3ee1b88fc2303dd5a62a0136f09541d0e0d5194e322e0cadf34d0696506faca7bc03dd0c410e998140d3cd9a53cd50dbb9702a00fc33fff41ecf2a9d3aabd706b605ad6f7933f8a06e2986aa1be61b6a11656f48ed5d96efe5229fdd5e44a80c3784c342b25d7e4cb5743d4d3db3b4015f7b46288d3c62afe76d2a4837e009a89cf4e055a2129025aeef83a11d0f6dfaa80ead8e242a0b26d19221d877d4035e8f1c9c0b27ecd1025f7f4086878fe323130fe1819a8fc5303a3be67404396f834c50ef8b849c3c08de5ba80fc78fc3070f3b169e019349d566f0b0ecb06ee242a3f1460dfb4857e27e051c75095faea1ae8a26f0dfc50cfda405052c929c01e2f007f32f5c1c0d76fffb660c6373190eb5c7e3eab8e94d60e8184d59eeeae8faa943d473e89b3945d714f6b86d8e5f20550c59d5600d5d3f3a281cf49bd1858a73b00f4ede3f3a181aff16586d8e585947a41a4dc0414604f6e00f5fbab174314e57b62e07724947445cbf593217679fbdb8208330654b51f5f0c04d803431c235e73dd41348f8fd410076db70dbcaa321368f5bc00285a0e1f0c71d042db10077daf1ae2a04f1381864e3303f781be0055fefd918125f93781a6094b03a3f14740c38dbd6f03cfc13e1b18e528c7f4f5cab7d4c09d914f035de329a08f9af55550fa20d97064e06d3040ab4ec5176a50455f6e79fa35b0dc7169e065852e5061fdf42b9ac7f605107ee7ec3dc0c3f3f3828184ed030ae38f2786c8a06ecdc0070eca8046c19f4503a3cf33409fc8b85f1ae2e2ce9b063ebd583444619fa706e6955d402f8ebf8c0db1c56bd51009db1f1a58c67e12501da602358fc91fc441f70b0646b0730105d5d369354e2eb40c3c33f16ce09ed6c0c0f8a304a8aec7e3b73b60fcf16ca0d21d19b8381f8340ff7d66e065fc0a40df3088376377c0833a6b0337973e0c3c183b3110615461c66afbc706da7ec510298dc71ab7a080f26ae08ed52f30d5e08afa51d11300d981805d3ea7067af53703e9a028b7e789267609e89b6e05aeb6a25bf1a34f03cf6b934115bdf49dd11a6aba75b4899456dd69751b8067059f0262d0ec0cd02dace12fa0af9cb54f004d34fb05405f90b97c36b0c23a3550933303378626802a7faf6c885d8e2f0cb428efa292fb30f0a6df23a0ca3f1e1ae2187ba981fb0d6301b5f0756ee0d72a46809ac73833444a070503f5e3d2c0bca12620e94f63439c767f696045a005f84798ea06e6402f028db68a0622cc87210afbbd09a83b795006e9dbc7f1d0d10e1827370c1182c73a867ff37164e05b6a113faa15fd14c7d99981e9fd81216af2dbd2407ba13a6cc75b017b404ddfa3a78ee543b828978f68d935af5c5d4475a8fd8db6f6000dae1e6a06d6d8fa807e706cf803f8e7c4ce0dfc1ecea98135fa1ea0b7f3bffe20dacbf119a0c1d55e136872b59f0503cf2a7400d5e4d958a05f01d0b5e801ff878a8131ccb781aee0c24057f0b74bd4b1bd06e0496202289e3e17055ad82d1b1808dc1898abaf0c3c34f009a816be5401bdf3fef86a60b4c5e5fb56dad1a981e7a4b5853ede395e19780fe704d0f794def60cf4a625801751068b6895b5aa3e6c348bd9ebf6dd047e14335a43dd9380fe1050a59b960ddcd2eb1a22a51f53404385872aa06fccdcd40c7c1df9d640777208a8c28cc7069eba9908a863077b802accb06a205a1605fac5cf14d03324e3912132e8f0dcc08fda35050a395780faec56db10bbfc3c0a541dde0dbc81f90668147ca9abd537dc9f9e0cdcf33c34f001f24f4344baf7a221f2e3ee0850b52c7f1bf871bd8581458489818f77de1b58a68c3a56774deedd1bf89d8037433d6a61c340c4dd18f84d8ca68147cec853dd581e2ca8637f95ffd7c0b7c2a9a78ab883c5d8c0d39443018fe0bd68177d35a1f000f08183e2f335a037965791d24437db8ac30da06faa9c3d009acebe3f020a7d6fcf06ee782780ead8b066885d2e5e0c7c92aa67882cecd581312deae1d1c0a4e8c9c0b0f8ccc05d2fefa25e6c66882c3cb906f47384b4cac43579980a742d0d03f7c5da06964c4e01d5d37e6ae07713aa063abeb2811b4351d88907bd77c7023db37969a0077a30f070febd819f7b490c3c807968e05d8dbf2de2f22f8a8006029fa981634c0dd48fbf2de82b755045fe672a9d2aff603131f0f3155d03377429ca8ade8d9cb40ddc2af9db8215b473405f6d7aa6e42afad2c0d3ab81d92bd5b2a22fb6bdad04ccb35f94305e412c9ec770b4e13b01cb26a006f45b30d0df6a178d617e8b86a8fc7b57807aa09e0eaa9714e3134c39683031ac0ba81feb47406d6e3634444a0f7e01b597d5b38063ec550d712db391815b8bc7067e17b004a8bd7c8f0d848b07034fa7af0c51a5f6df0c7c4355bb4cf5552f1d544decf6cac0b7a1ea8648fa2031f00317e4875bd451cfc0ef238f0cfc524dcdc042d5d21055eaee04d06b15df9980ab7d2f1978aaa261e0f9d3a68195de9981cf26de017afdf8a502a83b79da37f01ae31340ef315850d8157d13723a3270df54c7a8d3bf8c740c7d77e3f51ed0b7c346af063eb37124e021ac21ada1a237855f5e0d3c2ca883eaddfbd107a0370e3fa33aa41ef5c5ab5d95ed23effc326d19d072fadda981a1e48540cb833a8616cb378f807f59f2cac02e898119f0bb81db82254095fff4dec07da011a0aa3d9e0af4a4dba7214abfcb41b7377ee2a0770252fad934c469afab8648d8556a600c7309e8c5bedbbe21ead85dc7c02f2b5c19989bbe1b78c84667d1ab7f8386818f120d0ddcc2ba3630916819b897d431f0e1bc8a8171323956d1a7b1961303bfe9f768e006c48d81db605706eed02c04d4c2d323405f163c3937c4e58f53031ddfaf40c3c037407dd45490f082d088eae02636ec19f87607ada1a2cfd2bc2a4f53da5c81d6903731ee6747706c7abab27f2f881c1bc42b4495a6bb938b2930627672f56c601da6282093db07807f89f5c110177735324431f412406f1d5d14047a83fbdbc017ca2600ef1415bb0f86a80e83a640bf6e7b6ba079648648d8f189813b010b03df521b19b87118b9de74abbc9f0b38cb77c1c0f4ad6260c1fd0e50ef51d02e1a7ef51b8638c6e5c4c0f8e3cdc07b5a998135c7634324bd4be957f4b197bd57817e32f7c2106739ec1af866e88b813990b65023ec1c1ae8092706ee13ee1b782e984a57d1d3a5c7c70606ce2543ecf2a383d6d9a2f26488faf1fd28a0217f53713d6d1a51b5ff9a980eaa8fbc8d94c9fad0d37461e067aa75507dc26dac92d3a7a00a2a7d7df969a4c2d627dc9eb48bde19c9d8a5aaf1fa4744a9cc2bced312a08f55fea480bec2fbd304f419a78731a0a5ce8709a071e15e454031f4750cf562ef5303bfa4f804b889150c54fea18135b6c8b1cc0de8e65ea0767b678883dede18e2a0073f06de91e81a98efcf0c71b51719a08eeff7c340946a1a78cae4d9c0b3e75f0656e0056a40b3d4c0b3e74503ddeba1817b054b033ff8313044e95f92eb157d1372f564607cfa6ee06505eda2f7e6377fc00ac99d215ae5d78b8127fe5f01755ac71d03b3359d565f7c7c1c1b784feb51c083f54f2da0a1aef1174835afbc37f015aba181833604749edf027d2ceaab69e065c9a1818f101b48d850a066faa40aa34f643ca96cdd4c75160d58879981d7f563ec90554b55eecf9d01e54a5ced77f4d943b7ec420a68a566af0ee81e5fb70aa88b3e6808a841b7d7801af2ef8381dff5d259f485d4f958a0476727807f822b5ad4d04b15ddb2409f4cad1a0806750313aba521aae5354977c777f568207e240686b453a0c22e3f7fc02e130359f862e0f5d2134314e5610fd0c42ade80d80281fea80ba801bd360ccda8c93a8b7e12e43535f0c2d4a1800af3b167603cf601a8457d6482a85283c527a0e7a546234334e48f8a81d33e197870e91b4839c6d3b3816964dfc0e46c08e8d73b1e755af573594b10a3cfc14249573f17eface6a0efc334fa06de8b568ee90318e31f60aa577722280dabd50af7e7a26a8f3c273cbb07349f7bff36c4696fca8056260a91d2916bf2c5c8404dfe03767906f4baedc550c02ead962112f6303530305a0bb8da8b09a0aaddde0314e8cf6e0c8cc7de0c51fae31740b7af59521b5512d5d32f400f71562a02e60db343034be13320d53302770662726288fcf8d269530abbdb05f454c5b069e04bbe7b061ef47b30701fa86ee096efbb80b3bc6b17ad2a1494523d9f9cb501d5c2c22da04a37d241f5d662bcb09d833ee7f0183936f6e2df4f03d0d76f7b024d57aec702aac3699c76ec4a775d33b0aac0593c64b9181b185d4c015598ab27436c713b3070ff253310c73e0c51613a4780ead8e61ca893a7271740a2e71ceb0622cc126868196a0ea806bd4c0d51b68b02a080b2d4d5aae43eaa0262724626abbf2dc6abf639387e6c007dbee02d9ac7dfc3e897514f27ee3dbe4686c88fcf8e212ebfbd0fa8b3f87e31f049cc7b036f81770524ece80cd042f7f2dac0bdb50c5077f23d31f0835229a06fec7e3e09d4592c007d2cfbfb18d042f7f111a027543fda06d6fac6808ae15d973fe26a571303b79f9430ad9ecf7496318b7fdfcfc094c70ae25df3caa45aaaf0ac0229add62bfce443e4e9dfcf01cdcb80bf30f40428ae77a3014d1dc6af8680aaf6f2dd10797af40528d7bfda02faec5e0950ae676f80e2e9ac2350f85c01aafc5f1301d561aa7434a9c9af6b03c3f32320e39da25111506be857013de778553444e9afc702aee5f00ce04b36c59f918177241203b7497767a9963cf37cb902f4edd2f73ec0c7a206f195c41c34493c043c0c7c7d0734b13abd0134da3aaf012a97931f0323a52740df932e9f0a34dad22efacafbd109e0f9be7669eac74b7a0272fdf41ac8b440a463647a75f8c8105b9c1e03433dcfdf35f0cde10ea04c2ee8f2e9810af1c5a57c4a9054a996510c65df8f9add025516cbe715405f797f2c03eaa3fa6360aac5f22b011d4eaf6d88cb3ffa0ed0f874b05803cab1f58580b67f3200320aeabc6488cb6fbd19a2e4565360487ebc2f8111f163ff0350c55d5d1a22a587a7c0a4c293903f0043c962bc05be03568baf0c54a949409eefec5203ca0ab05da05ae1eefdd0407eec626175fb20281f022b01fa7ee1eb15a00fa3bd9f037add762f2eaee21b323f7d0119b4fc0034e6efbc01a9467d1b403f3ed0bd05f460cae1978137c93f0d04c7a5218e715030f01af48180827a110c2997fd774031e8e8071893f4bd270165bb9e18b86ffa0ce843e81fa463db62e26acf801a45f97e04e453ef68d9bbc056adba5ce27b9fd5ede38404b66b404fbaad9b06dadc95811750fb80be60b74c0dcc3cef0d7c052f9a58d5ab4eef9f80ee481caf0085bea30b40bf0a79a85df44b689d17408b2aed4740cdf42033449b6b691795fed1dac043033a8b3a9cf5c01065db7a07d4e12c7a02b54a5dcb98d3febe0a38e8e2dc40957a06f485c3f88e51b55ae5eddac1e214a8d1e67e77e3c2eadfc7905729a0b25d6b0b15e5c7a58162e8012acaaf92810a5301d44ca78701153dc27bf86a88c23efc30c4c51d2d004ddedb4f807e9ea0f56a885d0ee706ee14ad014dac3aef86c88fd6b381c1d5978046387f3430f37c01dcf6678638c6c99e211276303244c23a3a8b3abec399816f531e0b68a6074340639883892176996b1775056de5a9aa54ebd31015b72d98728cced2c0e373fb061e8e5b18782573256038da89785af31a7dbf06e86d8ef82c6f0ef40dc5838d81178432a05ea53ba1d255532a7fd2317050aa83e3587c84b85a7777129f3badd6ffa2d435a09abca91b7874f601504dfebc31f03b783a8b5e416c45c2ea1ea0b55243e4d8c702d052d6d11c505d6f3d028a52ad2703ade1d9401d2b1a28b97740757dbf6988631cad0c91ebc76bc015770c0cd9e2f01b502d6c7d18f82cefc64084b91010a50ea6c058677934b06cfb62e086ae4eabd0d7ed017a34f2e0c910e9387836c4318e5a020df10f00d5f5b3be815d28caaa1e06fb9e0aa8744787801ef57ae2a0dbe144549889819b07e7003179b03801920a23c76320659cfc195d63e2b7f45e2e0155dcf868f70ea896027d3aeded1cd037773a91418957d0a69cc541ba3531c407c98a19a0f95c6b6aa07bfd30705f3d0554713b3303b1f01550906e4f0ddc5df9317013e34d404cde6f001ea07d1be2b4c71b03916e6e88749cfc020ac1ed774075fde4c010bb1cfd1a7867e40fa8417b80aaf6e1da400d3a307077f650405d6f7d01aaeb476d034dfdd710f5f44067d13add690fd0cdfaf69781f6f26de0182a28cd0ad6978688daade82c1207fa9313817ec1706e8872396c016a2f074b03cf5b36013d65f2f16ba09f3b1344df501c54013d063c3f051a6c7145fdc85b148d700464cc5f862b605aa501456b68b8b358350c4c571e00f50daf9780ba829f1849372a7a55b6fd0a6861b7fd06a8161e2e0ce4e93ea0107cd236c416a7a7800602a75d0385fd6da09eee19e8b3755ac5e4939681b1c3cc40857935c4310e7f0c5194dd3ea08adb591998d0cc0c54870f03b5f04b407558faa054ed8f8d21aa6547e950d53e393490d23d439ca5a584a9ae2f4e0d71d059dbc0b544136bb8f2b7fe805f103a36702d0b817a200eead670726a6097b9805d26af0646175c7edebfc416a52f03977f0668c9f553a74dd8a2451dabea19c50fd251abb0a8129f29ae36eafa7ed026c674a97ba0f72ee0d67061e006f71da01ee8832d2afa58c35e59c0a24a7b026845f1f00dd0e0fb70698872393d01b428db3d0754b54fcf0cb1cbd9df167c5246c71893c967034035f9a463a0357c1a7824b12fd06c7e1f50089e3f09a8c98b3fe0536131354ff31a44439e1b68fbe7061af22f502616b6fe8017fb5606e6736301b1f094abadeaf9c23699fc1793d706966d5f0d7cc84707ad72d00115260fd20cadb9da7c9cc3dc94b2dd469008d2874093b154fca241351f06b092d78ab334bd0030db0734ba687d030a7dadb9806b39eb01aa1f871b0365fb06a8b08f751695ed77db10997cf76988847507804affbc6ce03ee18b800c3a8ccb6fba374d7a0606df3f80a2437b61e0a3665d4045d9d913b04ba76d600de518a86a79b009d4b8b8f9a1811b547d201fe546c747b96c070b718c23a049273ebe00a65516ed4f0c51a596d1df660e17b34b03cb50718caca22f62ac13406ff8b767800afbedd5c023bc77808ab2770378061c4d3d73183f3a126889606260687d00b8cdad0d3c3d780c54d8e273cf10f5635001eaecb2d159f4be69fb0768e8c6d0dcc067bea2bd64b51a4decb30f24d5b8b8ef98bd6ebf6ecacbb4378032f9e443a0a78fe3a0dba75dd8e5d6c0dbb5da424fee7c74047a37e105f0342101741fe8e01dd060a2a7b368a8d0bb06d4ab1f1f186297e318c30cdd80ce2e002d449cd605dae2d210e5727804e816e7eb424060ab90415ecc585e013516446653a0c1cac4eb0a48ab343132c8916ea97434b5fed106320efac516b5bcc5c459a2e4b61fdee4ce59b4a8bceaeb57980780dacbfb99211a61f702d098eefd4ba0c83f07540ca7da450da813c17194e73a4fb83f1bb8c5d931b0e07e0528d7bf5f0d7c1bfbd91025b7e45ab6dd56246c0c0ca9ebf505306612f0fd64883a368f7a3af608e52bead8d8f9f17d0728a0bc0c003d83d6fd05f4cec8e118f0ddfb574031a81b25377640b92f02badab70f4031b9de161060e74740022c2f8011f1f427aaf6b8a65e7d13b3a4bc98e83cbfee0c2c11f400d58fef5b40af0ebf3f036a95ef4fc08478da3f01a6d4e40f76d9deb1dcc16d66e093876ba0aaf67200e816c5e73ed0d0b5f481945d1e3b804aff350a6aea6b99b700fd56c94d94dcd42b352b76d92eefeca0f40d8c39e8c10a9868a9b32320d7571194a6b552955f424b8132b570becbd35a69fb3bc491417d4075ecf51cd0eb728f77803e4a349b046c2b4494feaeb0b73fc6a85b9c7780bebbf12c50c5fdbc0628db42f117d0ac71f618a018542ca54046fff2ba04864c13a69c250f4adc19d98d3ff281833e81f07d03e8e26617803e70f0d103f4f982e707401fbf79ba06f46a792c986d5f9ba7c2ccdb4095087359041ab4a8782471077cbde15140e93fec014dad27732ddb5a165d741d98921f9d968072798cc2aed44635dadcae57af551da43fa2b0ab15bd8cbfaa03758a729918b8d3fc0ca8cd7dfe04b8897db5000d04ee2f055c5cac39e690f2f8ed2150d30dddd60150ad46067d5f00d31a63fe28ca5a5e72c48f3303d1b20fe889888f19a05fb8dc8f0a53dbdeb588e8d036103edf80ba4639020d7b2a55405de3fb22408db0f8be9bced6ea158d729ecb807e33f6e630c053e2ca2740175d6c3e031929edd781b1c2564b407b39af000a17a797c094b374af059ce5ec2a206fec8c61da0295cb9e81a63e35501d224f93b27ea36c360870957aed03fe86c825a0fce8640155fd96cdfaca40cb7e0734ecf9fc05866a40fbc084f0d9de005392fe1955aa51d14f6e7f5d034da5b46760707503e826d7f32da0dff33c1f0754f504c0e71b9091f4f93330a4f27fbe022372fd63058cc9d313d2b1edd8223ffa029ac7bc1390b77e9e2e3d031a352667bf405a639413812df56df48f8830a95bd4e71590ea37db4e01fd7cf8cb39a01f71fb8eab4d9d8e721148345064977a52e35b6a918ea697a1ae7b40938abb3c0746e4c7e60d50d5fe5d01aada9785801a77f08a4f57c0b816b08ac096b727c5f57b60a2df188a069455f5d244a727a06cd775408f8b1d3f034afa490950b5ac4460cbb6613a4a2e2a5d56cfea944ba4349f8c686deb23c0cb1d9d2150a7161e8e0c71dacb0b8015e7e2770b183103fe7e07b4e2bc8e9033ccfb53de577f02aac4b14dd710bf3a5c3c04c635965d22b08d3cf5fabe06f4f6d36734c2d1f61ecd0eae2e01e5d8f52130a4e46ed7c04883ef4f60424abfde81a916dca3f4477903e1699728b9513d8fd35b182ca2184689c2f87437a4ade5d194e9ca2c22dd787b4f33fadb6360a440ff62e0c9d0ae808455de012d33ac22e9db617164507500d4e8a29f23c28ceb25eae97b748d938a9e65398cfa31d9de3cdac1411bd04fa1c74f82d426b592fa8667a05ae537b9de8009bde97be4473e6cd61bbab580aa7ed0f22a2e6e3b94e4d72a3e810ab99e4e803115a611fded34bf1622ee2e5ad64b157d1de8e833c0afdd7cbc0263dacbb21650d36cad7a00e8fecbaa0f28c2dc6e800631687e0368b8717f0534098e85dd6a4fbd5cd16fc814ea01557db3fc730d3468403f170135bd42f475002414f6db49404ef1037df18b5bf5eda88f5f56380ef00a492c54ed20925ebb34f0a5c56e806a72317e6aa1beed4c79f133f2b49a5f2d3f67fa08e86a97b14b6dfb205f54ba1290e91b33510cdb2febf1026a1d48c8f5ca1ba0058078e7ac5edf4eaca36c9f8029d772f21cb01dd446b9bc000d52baac06e4630576892d12a7e3e32c20bf1a967f22e98daa86f8d36340dfc87c8f94363c153d4800f5511703a04e2cacd400256cd607c6ecf21535a8915708cec269f31ce105f6ddeca49ee603345ea53e0dd88e51769024c0309a7a219e2ead6f7b31de383c0fa825945cf90c18d778dcf40398d0abaf220b9b49a3ce3b01bb985ccf14720ad912a850fa971f802accfa1c18d5d8a5088cd59023c7b2bcecf87e5054fe61ded3711ff9129850712bcf065ad4aecfae8f9c41d751d8a33c1d743891f45192712d835dc757cfa32531e8e11d608e5c889fbdab8febc37a246c1d45394e4609e1223279e2d670f7016454cbf56e2050dfced519d345ab9ce625c76f2db68021575b6d03632eaeb7db229f89d4e91bdedf8126756c751e90d7647e847a0234eb91d2e35d034aca79fd609efd05a8b02b82692d92de6d06e401344efbf00bd408f4f1225b3e80192b18f402f246c6b27e1ca39af7a7d4b1fd80fca071b5576702eafa1dbbe4718af75f8e803a092b1f038d5ae4e97d01c82b5554fe2c20cf003e13b8ab0e492d4f070f72b5037496427c153087a4166dbf340234e8fdd8ada124792a14832ac08494eeaf03b6913db67812d0011f5e1b580f7a076ae458fd01a85394f1d980641bc7a841511d92ed5358d15e5e81bafa8631909263dfbb16953763cd80ef2f808c2d92d8a5910c89fcb328ecd4fdedcd0f50233fba71b5cdfcb4dc173b001a356e4fee7ac224cb5b0353c0cb80fcf2196ded0155aa434fd0608bef0f43a4b4a42d32068a716f2d8721d5a115a71d6ebbad1dfcde01aab85f9fc0905c6f1e02a39848141b6b413dde498c4f4224c33c57793c2a0a6a54d3f74fcf228346799f1cb5303edb9c078b841ea8b00bd2c9b8a69fbefaf8023262d06f29605b1f76d03907540bbb2b03993c0352aee5f81a182ae9c580a449d88ad74b93499e85b1cb7d0b18d2080782115b543bc0984c6e5c0153a61ab36862936d148aaa1d253775c2ee2e8029496fef7ab146c9857d740334a321177bbfc0885d6a23604a3a8ed965bb02b083ec21a091712d47bb114aa39c47297ef06315a070513cbc0154fa87bb6b696c031b6fa61c04788bda1898d6f8046424ac921737e16237546854f3ce20ea47e535601b63e218c7409d1c2b35802675ec38929eb70e862c9b41808ba1df0ac8739d30fe023468c84701c9b643890af31d90a7232a5d7d08a47416775f40932d4ab3803c9b79a07d571d1a8dba7a8fda24601bb7231ddf4093b0557a00f28e3efaa8386d9a5f0b4b26bf8026128771f9e9b6538acb3f03aaa4f4760cd4eb7c00230a2a6d94133e66ba6bfb8d3c156cb13707a634b1bdeb80bc77e0a9ac7d0167b9fe04ea754639674083a22c6b97519dfbeabbe6d1c8f20ac36a603320ef3eb9b17c0954b8b8b33550072ece80619d75edc8f52caf21513fea05a041b97c473a8609bd47f1e611c828864eec3272335d7e03d53aaf984d0c5183923720e5f2ab8740c616b7da6554e7f75e3f80498cb60af1dbd7394c197e9dc731c68982f4e997804ab712a4a4f4ba033429cada0930a418d26940de2e192a1480840c4a4a016929e1d719a2f42779c8e1a99b24c095bf7e098c09e367da62427e3cfc08a2ed178abb3eaa31cd2f8e5f6659012929fd7807861ca3143936cd2308af52ef0e9aa7b34abb3d48819482ba1901a33846a1d80cc8db031f7bd945dcb4ec90f3bb06d47b9c3504a4a35207b89662b91bb08d53b14ba4a3921f94afd07c010d12d63a045245ed293025b07deee60d69f5afd21d034d02eccd149824d15eeaab803c4c47d9d64e0db486355027e9b523206fa8113f76b99ecf9a325af6c70730a2b08f2e8129a7edf403f22e87ce6217b6f272546bd87f004664f2b20b8c49d8fa0b989263c7bba094e69532a254a1580234625bf580898e21987271c963c07675384a6e66e095ff04a82791b0fa08481808b4e3b4f9ec952960bb0ca404c7935a403269f07afa2b3025c05e9c046cbf7819a76d0035b6281f0179671065bb07a40903d6269045ab2c0ca7804e9b91d2263d72218bea90e699cc6d9f4940dee3f2e5b813202fdda80e674083ea70baeb0ad2663e5927042f0564d0ddbb812c7c05742df7d7c09494ae7633be34cba75e2c437d06e44d9d5f9a88969de54d3d925e1f032941a97c0b0c49fadd6e08970ef34900cf8dff00aac9d5c8e4615ed8849c1190501d9229a0cbafdf0179d2a2e4e6c090fea5dc03f2e017bb0c02b6f91e2517bb6c233f5f5c2a1b780e3662d028af96712d371b4059f8700aa424ec7e608884d5a7c088840de26ab7819e7baf3f804affee5ac0e577974042ae0ff60d918eab2fa0c12eb547a0195018be00438e71971a785443bb8cb8dafa041847d20bd921a00a53bf0ac8c32303b438e8b63be1c9ae42405e6158eabc06ea9cf67c1f509e1ede011915b711793ac92348e4696f37524af30e876e2d9edcc9a196f022fd2990502de3a3223928832a29a0665a8fb29de6dd059f5b6f01d506eb52bbaadd2ce5f13412d63f02ea54edd63da072399f00aa0eb52e30043e3f81892accbe817b383d60aaca7f6be087e09e02f2fe94f1fa42d0889456a740b91111b734072a0dc652bb10dc2c3bf41d3d0209c590bc029cb6103fb1d42ce767892cac1e1b220b6b9f80f2b4fe0354396d27929e4f4628cad65d40a23c3de804e4991c977fd10734373d790552527a9b0243e5d83d30a16a2727c09456f91d29adf85a9217a04c9ed67a025d0b49cf2b3f9df80da08bab67408d5c2f0bea0d3e2fbe0b8ecd6d37cf4f917e0053527a1b2557cdcb96b31c00151256df13a826ff02754abf7e0d244037ea474d9d56f176088c691ef71d0107bd6e1b9836c5e5d7f2d306dc6740adc17258e4c7760d9a57bb16806261ffc010d772fd258836574ca24ad57df947f702ce52ee0065723d79066a1ca3d234c42efbd180fe4617dd0c50bbed8d8106c570a62d52b6b8fe0032ba93e23ec00a6b21db8de9f2ee761c6729144780c61f490483c6f623aa712d87408d82fafa02f201475ccbd2c0a29ba0a98eef1cc81a3c25bf1b0834d33c26f31af44380fbdbab0530a2a08e1f0d745a87c084a45f9e025332f926225deae6317f03ea6c71bb34b04c99004983a5df1498a47cf97a17f99bcdbc21f324f523a0e0b89c1bf8ce555498a6abc3fd2140e9178a63a0ce16b56740cda32ed064a43c143478a02cda5c33d35936bba14233cbc32741a90e24348ff31720535ff90928280d46c0b4c18fdb9403b613a73846c7c0dae729d0d0d5f681a622ff892176a9160d91d2bd4303bd58a46398a4e4fafe26a0c194b8781f091be63946b4ac024a47a964e07dc207a09932073a07b20613ef0e3004e25383398c4869e9ddc04d9ddd78bdf937b8baba00a61a05472d1c6d87ce51b62d4019548aca3fdaf69691d2a81f7924a4aeaf225c8c3dbf3d8b4a3776c4fde919f850fec6c04ade15d02093931a90523f923340094b8e0cdc8a7f0586b4ec9b2703bd874eeb0c8a7219e7519957008a40fe17d7b21ba035278d1ad7d2ba012624fd3c7aa089236e770e68ec70dd05aaf4b7371d03abf87b063a9c1690a847ae000dc245ed051835f8767aa4749a68e8b4172537cd7bc208b005414ded650f50c8e9ef0309d561a02d144fef5640aa38b667e06ad706566a0e808c9496a3114eb7c3aba80ebbde232b7960d49f02658eb1fa06540cbf1ba04e06dd3f024d8e71df36f015cd1ea0c87fd700c634c2cdae6cb372a245b7fd3a30045ab7018d21bb9c35812967e9160c9185fd97000f362fce01cd5ef76e041ca3b7365072778086f8a70b01bb5cad0c3c55b104328e916d80211974d503265c4bfd0298d2150c234fcbdbf1561c740ed42897eeaebd64957c40c22fc2260179c9453a8e1f0055a9cb13a04931341640c616376b03ef686e80a1ae7669607cfa052816defe005305c771403e2f60cda00f9481ca0aa8502ddbbbe890553dda3a8dc2aea6daa57d0f5414c6cf80a646b0fbc09063b42e80514ab4dc0063b6386f1bf8ce6624ac9aa7945b36a74085987c16c5506b2883da7780c6c9179f01f9e09bd5d16f206397fea181b5f116a068d9a900e32631b90e4ca2b00bc3e7807ce6c0f2716288785a2d08521e1a680335aea5b71b4c64f53c4fa3bddc7c025572bd730fd4a9853fdf404a3fb7f91050d7970b406dff7a038c394b23caa59e677224bdf62a60b4d5190015a05d016acd7234d316504f196edc00f990358e11ad21f1b47a104d2cd92e88c51655a099d203cd808c92bbfc149063d7af803abefe1e3002ce7f8131c57071044c3946e332a0a9767b20a83020e98c802a5b54cf04b497eb1550e36af78e0cfcb8dea921964ce289aa1cc8a042b16d6041358ab2918c29cabb08c18d867ac283a8850d8f4f2f678648e9f90f3022934bec92972d7779da4025651cf40224ec521b08b8daf2c810bbdc452f960f8a695137918e74bb5217d5e1d8c052f81898502ebfe702ead8d5898175a92b60aaa28c769be6bd295f13ef0234b1e2550ba872da7e0750182f0f8024f2a3307c02527649ca40468edd46066d271254cb3ea0fee5f31b18695a3d33f069bd0f039df8113026e4f456001954281e00d388b8856234c2e676112932e815d0d5d6de80843c7d68034daee520b230cb9b18b7398e80b1c641d180b2ed12515c2d5b38932f8f812a15f7f01ea853b5b31f20a1e46aef4046c955330303b4880e430fbf3e17404adfd01b0143726cd001c8a0623f923ef468eb822df246485172d03ca571d0fb73c08df01e1837f9d4cf6efe926de70d7ca0fe1418d3e64ea680aaf6f20c98b2c5efad21b6b88a5a38ca6310370f96408dcb6f5d0a0828372ba0ceb57c7e012aecbb6f4001f64b90727195b521726c3f0a6aec1eb9750de85a2ede8029bbfc46e51fbbb3e8738cedaa52849c095053b43c03ea5cdcf501901250ae04cd94c177020c5561bac0982d6ea3f26f672791d2dbe89127eec4bf3680eac74d34c2499e749ea89a0255fa86874fa0468e5dff004afadd8b80cb1f788bb89642fc5c540e8906680780667ca537a01973b162356ae1643b648d661a839aa9c3e7e50a1893638388a7db990537c9db404df9d100528aa1b2018629f3ec5f60c4414b4b034f20fe016b9f1780d2511d1ae8f88e813c47223f12604a4a0b71b5d3618d2c3cd8e5d8b0a40580e26f051893f4cf59800757ed5b4031e8680ad488528715439cf67c035050c5872f40ddda606388fa717d0c8ce82ce2d3f1398c29a8da47403eb56286b3cbb161394f29f1231170b53d6da1f672d103122aeee52190b2c5a00d0ca9a7774b034bae4303cf90ac8151935be04fc04403810b4324bd4a3af25ac8ca04e9c86b6a9c656f170b87dbdf7aa2275c030dd2715407528aa1ff1890d75346b057801ae1d5dac087d1384b5e0c7c28ae0d34b8fc9b174314c36a06e8b4a5b28151f03ed0e4a057c7069e1f9b02cad3cbb921f2e3fe16504d2e8f035cfad53e5049797c6e0fa846032a141b403e0d88fcd80d9c87f96485b1c31ac8b390cfd224c0985878fe044cb9daee7780fab942b10a8c3430da07265487fb1230d5ece420603b6f8c3ab68b41c3edb23e6b4a7196ed8486fbea6f806af2aa0bd4085bf72740423a3a7706decfce0075c06b1d43616bb6019a348f9ba540177764889152610538c7767dc3309fbfa817fb0112cd2cde81065bdcce019de5a20d8c487aa90a8c29dbf875db1cd4c41ee2f2eb9906dfd51150a7f46f230bf39ace1687754049ef140334602d5e7d1bb82f760b3462aa513cd3162929bde62cf9b5302019007405c5db1930e2b4ad2b03cf39de089a0c25758c29508ee0986479548ed32e0c04a50e401d2b14b8dabc35f0dcc53e5067da94091272ac3a061a04a5ca1e900277110bf3de56d3d968d90de7e9411454c39d45ff15502dbc5818a80e4f8026ab250e9a8f6023d76f1f8121c1e0a80228045ff581b12add29e0294f1dd068eb225a434335a8506c1958427a06aa4d3af15f4075bd7c2950164e80a4c9ef46760c2c10fd000d76d9c431f2f11a5978177d769a476d3ae0c41015e66209682cd5ae01ea6f7fba80c6a79b4fa049dbfffe05b400b09e011a179638685ec7801540c42d762e809a062407806a50f91168029d2886a6e70d0747404a95daeb024d4aff6a0e684273f365880af33303861a386f8009c5305803532a4cbb6be0de5ab486a6fa97e2d1838063dc8f00cd1beeb585a2c3c3b1805d4a3f802ebff20b6454a9f235306452b489e890a555fa86d51dc048a9d88ff6924f0139cbfe2f9051d73fe7c084ea70fc0a4ca941a7ef06227f54fe2cef6f59887836700bab27200b6fde0dbc81f90d9435b1fa03865fe740454385b6815bf1fb80c6967797405db94e7e6c5795a2ddd6808606131303b76b0529292d5f1978ab35ae368f2fd4b1fe17a080d2895e7dd81c5294ad634061fc706ae0d6c003a091c13c0a6a98e76914e5f58981215cdbc074f61cd098ee6661600ea4835675da19a07a7ab73030f79803792f15f5740d34e94eca3740a61e888bdbcee7a301456bc82f9e0ad3ff0446ea1ba25c46798e5193e780067983270135f9204e3bcaca9c257ea52a872a25b77f616085e40148d8e5fadbc090a50434a885f76320a55c1e0e8121575bda00235a6527e2583e9bd7f43e52ba9d34338dfc1228ae9f00ea704e26069e715e0ba852fbd1ef8f1d716f0e800a75ec7229e06a0f4a00cbc7c59f0ea018747f0fa86c1f8e8011c7388a99561e2c28977674f379b5d598ee0618b1c5610dd02afef92b30213f0e1bc0b449fc88de63e2bade1903658dd8be010583e32a50557ecc014587db3d20214fefb48582e395b7a0031e44d89ae6436bd6c73e008d500613604c06f59f0126dec5aba830d3ed5dade8915b4095fcf8bd30f0ecd7d2c02b773503c1600fd088ed686288d35eea2c49935b7a6b6024d807c61cf47cd72a47a5edc32b91d27740d7725c37f041b25a405e0b230b8f2786b8969f334081be5506aaec723107ea6aa60580a85d6c5f03f9f822a008502d0b05a56342c9fd06e427a5f4fb1f01f9d88149f306c8a80e0fb3803ce9fc7ec31cd04cbcb7002a94cbde1950a5e22e4f01c5d3c3a6802dee4a8046d2bf3a464a80bdef014dca65f6066464d0deb9817b8dafc02863445f06c66a51c7c034a3f7d8758da34aca6cadd81a021a3b5c457e6c3f2aca73066ce1cb3f6a18f872ed0050d59ead018d825767065eea15d4095b9b6320618b7653c041ef4f810609fbbd3430a4d5169a8c5cff1a68845f06de9cd6d5aa17bb7903f23e39aeb626a016eeebb493264f306f80691465217ecb7754d92e55c531aa828c3b787b40b9c9d7c413a0d2e4a726771ddf68bb22c024f11da86a6dbc0ea8edf72686c88fdf5f80f95cf16b61e08ef7978096fd7b0da89e0e56066ae12dd0c878e5ee1548b5a872023455d7af0055dc9b5703af445481bc0b8e0c02f22c8c945efd0ad8a2c8e56f9788a24a45c2f27916c1b133019ac0e0035007fc1517b77d7992ef90fc0009e162f325a04a951e0d514f172d205526af0dcc811201a73db836f04c4d0d1892c99d4b20efe9224a29a579671019444ab74b8801bf4055b13032a89ef76291c97723a0415def451dab7bfe72f161e0ab5e534007fd5a02cae4fd3e506797836320a1cd1d570c512de73f4083a6fe3337448e95b44b83fa71d501341a3f1b1a78eda60834a963fdb5819f8b5a006aeab75f80c674976d431c74af6fe0a37757c084cabfb71b5b8eb637b8593d8fc2cec7165cdce577409ea73c22b102d47b0c5e01b5dbe3c4c0679bc7809ae9de1ad018e67b03688673f60534c9c2cb0e90718ce509a01592afb921f2e3ae6ce051af5341c614f009186bfc7120205a1ea6063e7ff20e4cd8e27a0650b58bad81819ff18ae691cfd59848f4a2116e1755186b970d3c89f00530c42f7eaf01d5b1deb3802d5a27404a61af4f812699bc5e18e26a4b4f063e6db30234ba58e91819f163736460a4d4324406ed5f1be25a368780ea69bb27203aac94f411075d0bc63acbb18161f1a78146a8b34c81fda8eb8d6199826aed568b4779d0e2f207d157a61e9e9f8d010d58cfdf01ad7edd698b86c2c509d0a41836df80863dfb7b066ed91c18a26aaf8f0165d07c03a86a2f8f0d3c62f566a07ff911500bef1e010df1efa6c094d3de451f95e67d545498bb8a81dfd5b815640c9ccb40de9423d7a3b0f346aaa81d57dbf4e5ff2c005ddcdec6c0db6073038f9b8e01c685c5c11250d89abd032aecbbe82b9b1aa1146f3f8032f991b0c576e01311378e916535ced29d006a40fd7743e4c7d50618aaa99f02236af26c0968eeb1e900caf583aa805de2e359f9cc5c03f8d5b18171e111a06bb93f032ac06109c8074f71712990f7c9510be3b4dbc51d0e7a0b280bf762683dccd45e4e0b404ac99d66c090467836051460bb9f028ae1771f186b0beda200db2a1ae80a56c044eb30e7022a5d2be2e9302f6c5615ce0dace33e1bb833c259b63728e32c33409380c33250555d6f0235f59527063e011907fd5b98399b004d607f1f5006cd16803a9c9fa5810c7a34f0fae0a9816f888c812957bb896b196def35477b7911b0c5c3dcc08d324ebbbdc71b95ee0fb8499e0ab8fcb34f03df2e251d792d24aef7811a7d65fbcac0e71c1a067e64b80e28a074a21846f95482f7b363d4377685e97f03ea6fbb2303f5239ac7d8577bb10f9481e511a0d9c9fa0ff804e41aa812a54e5201797afa6ae045d82e50e32c7bbb75a9d1c48f031d45d49eb85c0ece0cb1cb41d7c00f491e006afbfd9581e65100aae47ae70650ae1f698b3a55fb6266202855800607bd5c18f85ae3159002fb4afa70c80ba851c7a6db4720e2f27f0cbc8fdc127096bd3d40e572be32f0c4ff12a8522d97daa24adb9f0bb454b13a32f0b0e081802cdcb4015ded51d9c0a3b3d7400a1c3581d1308ed1dec5c27129af963ce2fd11905f1caf97ce001554f709a870b5973f061e365e01badacd5c4023bcd833f095229dd657db1170b5bd1703c39e8581b75af701cd81beb54542c9b5aa40835d1e1606966df70ddce2d469536a61a70134c9b187a58137862ac098831eef3ae07139efa2f97ad42330253f4e9a018e41676ce10c6a750d84e019a0b1f66a65e0a311bf028e71f1074c0296409d637ccf0dfc64cc50409b3b191918f51d0209d7d26e00caa0f6a56018a1ef380d1895098eeb5d9f3daee47b4406f5df02f2fca09b5f012afdfdb6811bfe1f401dd8ef010930fb04349d9d1b68843f1b03dfeb9b00f9002cae6560885d4ec740c616c74560a85d12c0d5212eae9a0f04e2e2ce015fed7a0da83bf96d1ba80e3d4314d46f0b50d23b4d036f714e0d911f2b9d25a5891d8d0c2cebff0137860e8126853dff0032eac746e91871dadf6873355fedfc2b60fb8c48b4db25a01a745c36b02ab9001a348fc1dc40517e0329c758cc0cd4a0b5814f951e1822a5836743246caed336c9a0c5dcc0b078dfc05d9e9e80001bef46e690d1ef2f0f0ddc6f581b28b9d4c087c00a06466c2f026ae1b2036844bf3930d03764065eb81c01238eb1df05a6c3c8e4e3a841b57c0cc30c78d79d8ceb5945139ac8e4ba8ba1fb0ea45cfeaa0da8c2ccbe0dd1d4675f0606353f06be757368605cf8778ca8fcfdb98008d3f31634c2c502c83457ef1828868d81b25d19f822a8123624c7da17061e183a37b094b5074cb445146592877156267e808c5a78be1428c24c0dfc467b11508459b7809186c56d43a463b33490855f02d520ed32a65c16bf066e3f95800999dcea0353c2f825bb8cf2ee330e1ad0f0c5eded0bb896f91c18d22a8f330117773e33f0adce16a08b5b770c44989981a0b4364451fefc1a18180d0d7c4cfd0718b3c57a63e06e42e4476394078c289728dbd45d417f69e0f39ebfc050853d17500cab0da075ba9f3d035f353f127096de9b810fc30f0d91418b1f60427eac7f0dacafff011f32de3730e5d1415593fb3303f72c4e8129701e8d30cde3076f8444d86a3a3fce042adb930c50d24f9f0d2c97b6005dcb6265a0a00e8029b0df11504f1791c9cd5189a2fcf911502dcf9e0c74389f06aa947629d31a2e360656475f818a20826396b7390679af0626deda623c8c72f93d0626dae5d9c01def8581cfaf3d1ae218bd2f600aac2283b2ff6de7cc965c65962c7ddf8fd171ff99e6c1fa4ab384241068d61d20a17946a359bd7bbb93f99fb62aabec1738b577980c2108c257b82f5fe140ea1ddc1f5b2affdaf1fbb7f5ff3922fd1b0deff73f3b7e27aae6fceec804bf6aeb47f406fa6acacf641f7e772c7fb3477ffbbb230a7e9cbfbbf9d78edfa7e57ec23490abfcdeafacfceec8fcc352d5df1dd9df89f2aebf3b72bfe3a80d7e7714c39ff0e8ff801cfeeb2a8f9f4e4399cadfdcf0fadd91feedf4f5cf11995f3f7d557f77e47e77546affdaf15be7ffb176299dfe3e3212ffeef807a0aff5bb23fb7bcab3fabbe39f4eed1f2db592537e6be33f4e1785b95f5b2a8ddf1dabf0b7e09ea4c6552a0cc3dfa568121eab742806ff1cd1fed9b194637487fbb34a8ad2abf0d77c93201645d1f267e6dcd8fcee907f3f3bf8376fff42c1fc1bb7ff41e1bf43c177e3c08d43375ebaf1ca8d23375ebbf1c68db76ebc73e3bd1b1fdcf8e8c627373ebbf1c58daf6e7c73e3bb1bc76efc70e3a71bbfdcf8edc61f37feba7145c2d38d6b6e5c77e3861b37ddb8e5c66d37eeb8b1e5c65d37eeb971df8d6d3776dc78e0c6ae1b7b6e3c74e3911b8fdd78e2c653379e256deec60b374eb971da8d336e9c4d36726e9c77e3821b17ddb8e4c6650c1883f1310126c42c312b4c84596336982d6687d9630e9823e6f4dfa38039632e982be686b96362cc03f3c4bc306fcc07f3c55430554c0d53c734304d4c0bd3c6743016a68be961fa181be30827615c8c8719624698316682996266983966814961d2980c268bc961f29802a6882961caf8e01b7c1f3fc00ff197f8ab7f5a84bfc6dfe06ff177f87bfc03fe11ff847fc6bfe05ff16ff877fc18ff81ffc47fe1bff13ff85ffc0a7ef50f14fc1a7e1dbf81df5414fc167e1bbf836fa9fd7e17bfa728f87d7c1bdfc11fe0bbf81efe107f843fc69fe04ff167f873fc057e0a3f8d9fc1cfe2e7f0f3f805fc227e09bf4c008121f0090282906049b0228808d6041b822dc18e604f702038129c08ce3afae0427025b811dc0962052278103c095e046f820fc197400eab12d408ea0a41d0206812b408da041d028ba04bd0fb0385a04f60133804039df9c025f0088604238231c184604a302398132c08520469820c419620479027281014094a046542080da14f181086844bc2156144b826dc106e0977847bc203e191f0447826bc105e096f8477c298f041f8247c11be093f845fc20a6195b04658276c1036095b846dc20ea145d825ec11f6096d428770a07084aeda1f7a8443c211e198704238259c11ceff40215c10a608d38419c22c612e890219449eb04058242c119659c2d2b0f459062c43964bb57cb96219b15cb3dcb0dcb2dcb1dcb33cb03cb23cb13cb3bcb0bcb2bcb1bcb38c593e583e59be58be597e587e5956585659d658d65936583659b658b65976585a2cbb2c7b2cfb2c6d968e7c157650149603962e4b8fe590e588e598e584e594e58ce59ce582658a659a65465d609955e75ae658e65916fe4061596429f69459c1cab0f275fe578186c32a64b564b5d2585845acd6ac36acb64a3f32ffab1dab3dab03ab23ab13ab33ab0bab2bab1bab3bab98d583d593d58bd59bd58795745861556555635567d560d564d562d566d56165b1eab2eaa9274bfcaffaace4a20eab012b9795c76ac86ac46acc4a86376535633567b560956295d6685a65586559e558e5591592afc5644f895599082243e4ff8142141085444b9db46845142904d15ae9405c4018512c8f361a08d1561d21da292f447ba283124a74243a119d892e44d2c38de84e14133d889e442fa237d187e84b5421aa12d588e4ac065193a845d426ea1059445de542315ee97049d423ea13d9440ed18048aee8110d89464463a209d194684634275a10a588647819a22c518e284f54202a129588caac616d58fb8ac23af8038575c87ac97ac53a62bd5608c417242ee473bd513a586f59ef1408c90eeb3deb03eb23eb13eb33eb8b7af8facafac6faae81b78e593f58cbce17eb37eb0feb2feb8abae8bacabac6bace5afa69b26eb16eb3eeb0b674c2d75dd6bd0405194f9fb5cdda613d487c41365c0565edb11eb21eb11eb396e14d59cb1565840bd6d27f9a75867596758e755e13cdba907c1659975897d9c0e60fbdc0c66713b009d92cd9ac34236e22f50889086184cd5a23423c424861b361b365b363b36773607354dede9cd89cd95cd8c8f64d3949f87c736713b379b079b279b179b3f9b0f9b2a9b091fe6b6cea6c1a6c9a6c5a6cda6c3a9a1a85cf37169baee6c84d4fe75fcd1eb0e9b3b1d9386c64db65e329349b219b119b319b099b299b199b399b059b149b349b8cdabfc9aa5b49a06d726cf26c0ac2267fa1506423d696d9c2d668146c7db68172c43664bb649ba0b08dd8aed96ed86ed9eed8eed91ed81ed99ed89ed95ed85e75e6b737b677b631db07db27db17db375bd9ff655b615b652b5dd5d936d836d9b6d8b6d976d85a6cbb6c7bea0eea113db67db6365b47e1d80ed417b6d23cb643b6238d88ed98ad7c4ed9ced8ce1585ed826d8a6d3a3926a3f3a1bac3280adb2cdb1cdb3cdbbfd8715b645b625b66073bc3ce6717b00b3529882fec96ec56babd8bd8ad35a4771b765b763b767b760776477627766776177657763776777671d21eec9e1ac0bb17bb37bb0fbb2fbb0abb2abb1a3be9aa91444d4f51102fd8353522c4ec5d8b5d9b5de7f753e0109a1088e573278775d9c9469f9dcdce613760e7b2f3d80dd98dd88dd94dd4b9445ceca61a14c2bbbb19bb39bb05bbd41f28ecd2aaed761976597639d59ebbbcb65f140aec8aec64a3ac24b787bd61efb30fd887ec97ec574afefb88fd9afd86fd96fd8efd9efd81fd91fd89fd99fd85fd95fd8dfd9d7dccfec1fec9fec5fecd5efa94d32becabec6beceb0ac1bec1bec9bea5b84853e39bea08fb36fb0e7b8b7d977d8f7d9fbdcdde613f60efb2970386ec47ecc7bfa25322629d10cd7ea291bb9fb29ffd81c27ece7ec13ec53ecd3ea359609f659f53b1b8cfb32fb02fb22fb12f738083e1e073083884ea0e87a572fe61c521e2b056c23b6c386c39c84f7b0e070e470e270e670e170e570e370e774d2b8798c383c393c38bc39bc34733dfe1cba1c2a1ca41faac6bfbb1ffd050a710d610140ef255ae221b1d0e16872e871e873e075b83e2e070187070350ac4fe83a7be70187218711873987098fea59a64d072fe9cc382438a435ad5c121c321cb21977ce639485f450e250e658e68601f0d479f63c031e4b8e4b8e218715c73dc70dc72dc71dc733c703c723c713c73bc70bc72bc71bc738c393e383e39be38be397e54ea1dbf1c2b1cab1c6b1ca5ff861a7f4c1c41184110512ddce2d852052d7ae1d8e6d8e16871ec72ec71ec73b4393a1c071c5d8e9eae3b0488e390e388e398e384a39cf5972f1ce71c171c531cd31c331cb3494680638e639e6381639163896399139c0c279f53c029e4b4e4b4e214715a73da70da72da71da733a703a723a713a73ba70ba72ba71ba738a393d383d39bd38bd397d387d3955385539d538d5554a9d1a9c9a9c5a09293455449cdaca1ab2a12b889646c4499ac5497eea71ea73b239399c069c5c4e1ea721a711a731a709a729a719a739a705a714a7f4df289c329cb29c729cf29c0a9c8a9c4aaa9a4e65552067381bce3ee78073c879c979c539e2bce6bce1bce5bce3bce77ce07ce47ce27ce67ce17ce57ce37ce71c737e707e727e717e73fe70fe72ae70ae72ae71ae736e706e726e716e73ee70b6387739f794057ecd6e6bfbf92adc7996667376380f38bb9c3dce43ce23ce63cd97a21ace13ce53ce33ce73ce0bceb227cd39c339cb59ccc9ff81c2b9c0b9c8b9c4b9cc05d58517c3c5e7126882b8845ce473c525e2b2e6b2e1b255efbdecb8ecb91cb81cb99cb89cb95cb85cb9dcb8dcb9c45c1e5c9e5c5e5cde5c3e5ce4940a972a971a973a9706972697169736970e178b4b974b8f4b9f8bcdc5d15838261c291944032159204afab80cb8c8083d2e432e232e632e132e532e332e732e0b2e292e692e192e592e3945e192e752e0524c5ae90f142e65ae70355c7d5d208a234852b8065c43ae4bae2ba546218e6bc475cd75c375cb75c775cff5c0f5c8f5c4f5ccf5c2f5caf5c6f5ce35e6fae0fae4fae2fae6fae1fae55ae15ae55ae35ae7dae0dae4da4a3a6c73ed70b5b87635b35e7b5cfb5ced4441b82a93242eae8eba834832d151d70485ab348feb90eb88eb98eb84eb94eb4cd3c475ce75c135c535cd35c335cb35c735cfb5a0aae94f5fb816751d2111712d694408355ecbdce066b8f9dc026e21b725b715b748795e16a0b735b70db72db71db73db703b723b713b733b70bb72bb71bb73bb798db83db93db8bdb9bdb87db975b855b955b8d5b9d5b835b935b8b5b9b5b879bc5adcbadc7adaff9526b244fe54821058908217c114b1211be5cdae6e6701b7073951a6e1eb721b711b771f239e136e536e336e7b6e026034e73cb70cb72cbfd81c22dcfadc0adc8adc4adac0afa0e77c3dde71ea8d9f790fb92fb8a7bc47dcd7dc37dcb7dc77dcffdc0fdc8fdc4fdccfdc25d0ebe71bf738fb93fb83fb9bfb8bfb97fb87fb957b84be735ee75ee0dee4dee2dee6dee1dee16f72ef71ef73e779bbbc37da0da799d6407890b710d51eb7797bbc77dc87dc47dcc7dc27dca7dc67dce7dc13dc53dcd3dc33dcb3dc73dcfbda039e25ee45ee25e5677f87f75c6ff82824a8612b14f1ca85e8843e225f18a38526a88d7c41be22df18e784f7c203e129f88cfc417e22bf18df84e1c133f889fc42fe237f187f84b5c21ae12d7d41de23a7183b849dc226e1377882de22e718fb84f6c133bc4036297d8231e266b275b13c78f70f841211e118f75a11d4f88a7c433e239f18238459c2696c1678973c4796231b8482c769579c0c3f0f079043cc23f50782415a187b4482b488f358f0d8f2d8f1d8f3d8f038f238f138f338f0b8f2b8f1b8f3b8f98c783c793c78bc79bc787c79747854795478d479d47834793478b479b478787c5a3cba3c7a3cfc3e6e128ac8f010f9787c763c863c463cc63c263ca63c663ce63a162e9f0a32393da992fd74df148f3c8f090a1e678e47914781495111e25a5c647592178a2283c8d169a9e3ecf8067c873f9372f3c573c239e6b9e1b9e5b9e3b9e7bf585e74123e279e479d2c2d1f3ccf3c2f3caf3c6f3ce33e6f9e0f9e4f9e2f9e6f9e1f9e559e159e559e359e7d9e0d9e4d9e2d9e6d9e169f1ecf2ecf1ecf3b4793a3c073c5d9e1ecf21cf114f19ee84e794e78ce79ce7425190b890eca8112107a7746e9e695d443c333cb33c733cf33c0b9a26443b3ec5ec12cf32af048297f92db7adb2bc7c5e81bac3eb2f5f782d79ad78458ac26bcd4b3eb7bc76bcf60afcebc0ebc8ebc4ebccebc2ebcaebc6ebce2be6f5e0f5e4f5e2f5e6f5e1f5e555e155e555e355e7d5e0d554b27cb578b579757859bcbabc7abcfabc6c5e0eaf012f9797c76bc86bc46bcc6bc26bca6bc66bce6ba122e29552145e69cdf61211af8c2eae5e62588e575e23e255e02536977895f5f38dbac0db68e9595078fbbc03dea1a220aae9bdfccb1722de2bde090aefb516542410de1b25c8f796f74e6b2a6fd973e02d1b27de67de17de57de37de77de31ef07ef27ef17ef37ef0fefaf02f1aef0aef2968d3aef06ef26ef16ef36ef0e6f8b7797778f779fb7cddbe13de0edf2f6780f79cbd0c7bc27bca73aff87444a0bb1bd67bce7bc178ac23bc55b4ccaf0ce2a3bbe73bcf3aa1adf7258917749cbf9925cc56c5950becb7ce063f8f87cfeaa357d423e4b3e2b3e119fb566cacf86cf96cf8ecf9ecf81cf91cf89cf99cf85cf95cf8dcf9d4fcce7c1e7c9e7a5107cdeea119f0f9f2f9f0a9f2a9f1a9f3a9f069f269f169f369f0e1f8b4f974f8f4f9f8f5cc8e133e0e3f2f1f80cf98cf88cf94cf84cf9ccf8ccf92cd4ff850e3f293e693e193e592d3d7d727cf27c0a7c8a7c4a7cca7ce16bf8fa7c03bea13abfaccabe4bbe2bbe11df35df0ddf2ddfdd1f287cf77c0f7c8f7c4f7ccf7c2f7caf7c6f8a82b0d1575accf7c1f7c9f7c5f7cdf7c3f7cbb7c2572e53e35be7dbe0dbe4dbe2dbe6dbe16bf1edf2edf1edf3b5f93a7c077c5dbe1edf21df11df31df09df29df19df39df05df14df34df0cdf2cdf1cdf3cdf02dfa2166065f297727a49ab6c5a56906ecb5a68a940c56801aee25309544448b044632a2195a596ea2b2b5d71c8fe4aa442abb2d6fdabbf78a122c76da9eca8eca91cb4d65e395239513953b9fc1252e54ae546e54e25a6f2a0f2a4f2a2f2a6f25177a87ca954a854a9d4a8d4a934a834a9b4a8c8503a542c2a5d2a3d2a7d2a361587ca808aabee50f1a8881962928c7e42654a6546654e6541254545ae9ba192a592a392a752a052a452a252a69a28fdaaa1ea530da886549754577abbac1a696540d6c4b202326baad23654b7547754f7540f7fa0503d523d513d53bd6889bd7aa57aa37a578294d554355677a83ea83ea9bea8bea97ea87e759950ad50ad52ad51ad536d506d526d51957174a85a54bb547b54fb546daa0ed5015519b74775487544754c7542754a7546754e75413545354d3543354b55ae9ba75aa05aa45aa25aa6063543cda716500ba92da9ada845d4d6d436d4b6d476d4f6d40ed48ed44e493b53bb50bb52bb51bb538ba93da83dff40a1f6a2f656bd50fb50fb52ab68c5b556d51c21bc20408847d46ad4ead41ad49ad45ad4dad43ad42c6a5d6a3d6a7d6a363587da809a4bcda336a436a236a636a136a536a336a7b6a096a296a696a196a596a396a756a056a456a256a60e7543dda71e500fa92fa9afa847d4d7d437d4b7d477d4f7d40f091072cc91fa89fa99fa85fa95fa8dfa5d8dafc7d41fd49f6a79fda5c6d7dfd43fd4bfd42b7fa050af52af6944d4ebd41b7ad3212ca94c90a0104750dd7e57b2dccbe59bd45bd4dbd43bd42dea5dea3dea7dea367587fa80ba4bdda33ea43ea23ea63ea13ea53ea33ea7bea09ea29ea69ea19ea59ea39ea75ea05ea45ea25ea6010d43c3a711d008692c69acd4fe46a4f6376463937c95ed1d8d3d8d038d238d93fa42e34ce342e34ae3a693afdb770d61710131be11d378d078d278d178ff8142438efbd2a8d0a8d2a8d1a8d368d068aa7c6eb4543234da0a44a343c3a2d1a5d1a3d1a761d370680c68b8343c1a431a231a631a131a531a331a731a0b1a727a9a46864696468e469e468146914689469926340d4d9f664033a4b9a4b9a219d15cd3dcd0dcd2dcd1dc2b10cd03cd23cd13cd33cd0bcd2bcd1bcd3bcd581da1f950209a4f9a2f9a6f9dffe647b77f50687e6956685669d668d6ff40a1d9a0d9a4d9a2d9d69b8ec240423ccd0e4d8b66f71708e1c8668f669fa64dd3a139a029c77834870a447344734c7342734a7346734e73413345334d3343334b3347334fb340b348b344b34c0b5a86964f2ba015d25ad25ad18a68ad696d686d69ed68ed691d94145a477584d689d699d685d695d68dd69d564ceb41eb49eb45eb4deb43eb4bab42ab4aab46ab4eab91b426ad16ad36ad0e2deb0f145a5d5a3d5a7d5ab6561f5b8e16605b03cd972d57f3a5a0a0025e46e6d11ad21ad11ad39ad09ad29ad1925316b4524a84ad34ad0cad2cad1cad3cad02ad22ad12ad326d681bda3eed8076487b497b453ba2bda6bda1bda5bda3bda77da07da47da27dd6f25cfb42fbaa06b76fca086dd98875bb2d3f3d69bf68bf697f687f6957d417da55da35da756507898876837693768b765b3da2fdff41a16dd1eed2eed1eed3b6f591044996c20ec79cae237e5443dba13da0edd2f6680f698f688f694f684f69cf68cf692f68a768a76967686769e768e76917681769976897e940c7d0f1e90474423a4b3a2b3a119d359d0d9d2d9d1d9d3d9d039d239d139d339d0b9d2b9d1b9d3b9d98ce83ce539d4248a1f3522c3a6f3a1f3a5f4541dc413684203b158540fc4250e854b50947766a74ea8a42a7f1070a9d269d169d361d39c8a2d3558e148fe8f4e8f4e9d84993af033a2e1d8fce90ce88ce98ce84ce94ce8cce9cce824e8a4e9a4e864e964e8e4e9e4e814e914e894e190b2c83e563055821d6126b851561adb136585bac1dd61eeb8075c43a619db12e5857ac1bd61d2bc67a603db15e586fac8f5283f5c5aa6055b16a58756547ab81d5c46aa9470835586dac0e9685d5c5ea61f5b1ec3f50b01cac01968be5a97cb4865a68b3465863ac09d654d38435c39a632d942cac14561a2b8395c5ca61e5b10a5845ac1256992e740d5d9f6e4037a4bba4bba21bd15dd3ddd0ddd2ddd1ddd33dd03dd23dd13dd3bdd0bdd2bdd1bdd38de93ef4e665f749f745f74df743f74bb742b74ab746b74eb741b749578e69d3edd0b5e876d517048b6e8f6e9fae4dd7a13b5077900dc91a8242d7a5ebd11dfe814277a4b7edbb63ba13ba53ba33ba73ba0bba29ba69ba99a4ec2b5d67e9e6b48cd3cdd32dd02dd22dd12dd3839ea1e7d30be885f496f456f4227a6b7a1b7a5b7a3b7a7b7a077a4785a377a277a677a177a577a377a717d37bd07bd27bd17bd3fbd0fbd2abd0abd2ab2510c8d7c4f89eb426bd16bd36bd0e3d8b5e975e8f5e9f9eadaaa9e7282ff606ea08229c04889eab895350e879f486f4467fa0d01b6b2008fdf6262a19aeb267aaf5e8de8cde9cde825e8a5e9a5e865e965e8e5e9e5e815e915e895e993ef40d7d9f7e403fa4bfa4bfa21fd15fd3dfd0dfd2dfd14f50e84b3bd23fd13fd3bfd0bfd2bfd1bfd38fe93fe83fe9bfe8bfe97fe87ff57676bf42bfaa1121f32f28f46bf4e5b3415f7e6ad16f2b16fd0e7d8b7e977e8f7e9fbead4aa1efd01fd077e97bbf2953bca03fa43fa23ffe0385fe448b8efda9ae23fa33fa73fa0bfa29fa69fa19fa59fa39fa79fa05f585be1c59a25fc606db60fbd8017688bdc45e6147d86bec0df6167b87bdc73e601fb14fd867ec0bf615fb867dc78eb11fd84fec17f61bfb83fdc5ae6057b16bd875ec067613bb85dd5614ec0eb6a55e6077b17bd87d6c5bf9c276140b7b80ed627bd843ec918a6b7bac2888a09688b027d853ec99f2c29f1161cfb117d829ec3476063b8b9dc3ce6317b08bd825ec320e3806c7c70970429c25ce0a27c259e36c70b6383b9c3dce01e78873c239e35c70ae38379c3b4eac0b4d2105e781f3d470705e386f9c0fce17a78253c5a9e1d4711a384d9c164e1ba78363e174717a387d1c5b23c27170064973713c650a678833c219e34c70a638339c39ce022785935605250a422050a69073337fa0e064f54e8493c3c9e314708afa389353c229ebb32c03181806bea23008921632583258318818ac19c8315b063b067b06070647062706670617065706370677b57f103378a8b30c9e0c5e0cde0c3e0cbe0c2a0caa0c6a0cea0c1a0c9a0c5a0cda0c3a0c2c065d063d067d06360387c18081cbc06330643062306630517406536d82d160c660ce60c120c520cd20c3209bacb2643c39cd1d83bfea8e838216a025f70c8aca8b8392b6539e411917bd91ed1a5c5f75e4dd53ed2059f39ac10d7043dc25ee0a37c25de36e70b7b83bdc3dee01f7887bc23de35e70afb837dc7bf21cf603f789fbc27de37e70bfb815dc2a6e0db78edbc06de2b670dbb81db5c7b570bbb83ddcbecebf6be33ab8035c37d9f07087b823dc31ee04778a3b4b28a3833bc795d353b862820c388b9bc3fd0b05b7805bc44deed0b9653cf00c9e8f17e085784bbc155e84b74e24838db7c1dbe2edf0f67807bc23de09ef8c77c1bbe2ddf0ee7831de03ef89f7c27be37df0be7815bc2a5e0daf8ed7c06be2b5f0da781d3c0baf8bd7c3ebe3c9251cbc019e8be7e10dd5ff05026f8437c69be04df1667873bc055e4ab1f0d27819bcacb2869753df112a1542f5f27805bc225e09afcc10867f3dd7744ce98272e8330c1886aa9a864b862b8691dead1205315c33dc30dc3294c3f60c0f7ac9e191a1fc7466786178657863786718337c307c327c317c33fc30fc32ac30ac32ac31ac336c306caaac1ab618b61976185a0ce58a3d867d86364347ef620d070c5d861ec321c311c331c309c369d2660ce70c170c530cd30c6524d25b4ec3619857b3954ae4f88212e7b0a87263586258d6a7474730fa0b85538e91cf286014325a325a291c62fc2862b4567790f439da30da32da31da333a303a329203ce8c2e8cae8c6e8cee8c62460f464f462f466f461f5d688fbe8ce4f255463546d24f835193518b519b51875102c1485a8f519f91cdc861346024277a8c866ad268a42c201e311a334ab0105f18499b319a335a304afdea88515a2d97c421596394619455fb7fa4d7486ccc332a302afe81c2a8c4a8cc18c64657d6cf2d639f71a0459771c878c978c5385205355eebf5c61bf54fa1a5b11cb963bc677c607c647c627c667cd1191e5f19df18df19c78c1f8c9f8c5f8cdf8ca5cf2fe30ae32ae31ae33a63e9b0c9b8c5b8cd584eb4187719f718f719dbaa0bc60ee301635751187b4a04e30494f188b1ec91614c5556cafc8f134618cf93acd1533f1250c60b4d1c4210e39462314eff81c238a3d33e4c5ce0b556d5a8286419cb3979c605c645c625bd973f2e33415198184dda139f49c02464b264b26212315933915fb74c764cf64c0e4c8e4c4e4cce4c2e4cae4c6e4cee4c62260f264f262f266f261f265f2615265526352675260d264d262d266d261d2616932e13b9629f89ad404c1ca580c9405583a020a9417c61e232919f864c46c9d892b8d07028291093896231f9eb899ec94c4b2ce20b933913392ec524ad5130c930c92a234c724cf24c0a4c8a9ab726252665a6e8144d0d539f69c03464ba64ba621a315d33dd30dd32dd31dd333d303d323d313d33bd30bd32bd31bd338d993e983e99be98be997e987e9956985699d698d6993634294c9b4c5b4cdb4c3bc9a7c5b4ab8973da53cb4559aa9aac69936439ed6b444c6d2508d5dd6d7513f91420445609534e9d3f50988a3172318fe990e988e9588110f92c11319d3095ae675a8c9dce93cb2c98a6148b699a69866996698e699ea95ca0c8b4c4b4cc0c668699cf2c6016325b325b318b98ad996d986d99ed98ed991d981d999d989d995d985d99dd98dd99c5cc1ecc9ecc5e9a23c57261c4d95b2362f6512f901430fb32ab68bc0810b36a222893f0919db39aba83a458a549eb577acfea091003667fadac67d2514b6fc9ccdaba821220661d6696d2c4accbaca7abc97545158b5c6cd6575f98d91a143387d9400962e632f3980d99c9b93256d9336526439f335b304b314b33cb30cb32cb31cb332b302b32937ecacc616e98fbcc03e621f325f315f388f95a9f7d1214e61be65be63be67be607e6479d6d59628afd321ed18ef313f3b3c6a9a0a001324fa263a81ca129a6a488cc2fea1dba71fdeb9ef54123429c7f7e637e671eeba7310ac7fcc1fcc9fca5ec3a7feb5545934882987f9499e65f4d63f30af32a73194d9d79837993794b2973de66de616e31174b7accfb49b3993bcc07cc5de61ef32173e941ba9a309f329f319f3397b1a698a799673441ce656039e6792508f108f10289f6b9b4a29a2d5e392fe9b24265a5745bd6ac294dc629835ca088c857a109c16e6158fcf54cbca050bdb00858842c962c569a1d17118b358b8dae26175b8560b1d39a873882a834d127727959db2df6ca558b830e77bf65716471d2a77b166716f27965716321978f593c583c59bc58485732be2f8b0a8b2a8b1a8b3a8b060be9adc5a2cda2c3c262d165d163d167612770cf5838cacd8b010b9785a70b6df1023711ceb2d05a0c598cd45344352dc6ca1d62bce0b298281cba91a8ecc55fcfb8090aa29aaa32c4398b058b140bb13cc322cb22a7cb87455e2fb628b028b228b128934a3285a020f393324a60295f47900a4885a496a456a422526b521b525b523b527b52075272cc89d499d485d495d48dd49d544cea41ea49ea45ea4dea43ea4baa42aaaa8e20c23155530e92b593c4b9909c107eaaae760a0b4c132f10c71411916a909291b448b5497574b65256a2a9a7c97e695d527fbd31244931d5d767dcb6557d752a65937248c9b55d529ede984a0d950852239d7f71b0d4384993460355501055939a90922bcd94ba5273520b5229526952195d35a5a4ff1ca93ca902a922a912a93269481bd23ee98074487aa928a457a423d26bd21bd25b4d78e99d46417a9f4803d9795015282b4861447101e17f99def451275f86276b8df4497584d82f82526455faac1bb2be10383464e480cb5ff7290fdad257d237d277d2b11bcff40587f4431fc64ccbc64bbb48bf93e5ca2c59deba2a57641923c952ec1f274a26fd21fd551e4a57485749cbb975d20dd24dd22dd26dd21dd216e92e69194d9fb44dda212d3dbba43dd2d283983d263d212db6cd34e0452088af89644acf75f2c511d20b6544499342fbc211e9948e4ae4633aadb39dcea8abcac0c46c11d7e96c02c79c748e745e9d25fdd733f195486f01a78baa8bd225d2653290317a8737e3930974492be1900993b8182bd388f34b93cb64e498950e543832139159eb46b74e6643664b6647664fe640e648e644e64ce642e64ae646e64e2626f320f324f322f326f321f32523fd54c9d4c8d4950e840b320d65874c535d23d322d3566b655b165a9211c47ef92a1e9ae928046e3237194b9bf8886091e992e9e9e902877044a6ff070ac1411fbacfd8fad44846ae3a20e3eae33c198f8cf43852fb756ddfd360938b65c6499af8aabc173d9799e8aa4efc363355619399291cc24c9939990519e9334d46f0ca92919d79320268914c894c992c640d599f6c403624bb24bb221b915d2733df535fcb6e7423bb25bb23bbd7f9d08d83aa00dd3eeaa7fa4246cb0d62aa582ebc903de97e090d45a1ab482d1207c99eff62c720793de3a30fce445d7d61e1d05044b61db217b257b2b7242f1613079b687c3a8e865cf64e364eb2d79bec83ec93ec8bec5b754ef693ecf992ad68b6cf56c9d6c8d6c936c836c9b6c8ca31d2bf0cab4b568cec93b5c93a64c56c97aca702293b243b5252cc8e559e652764a78aaf6c881cc8ced44ef1f3ec5c03568d97de169a0bb2a9e457393eadde91cde84f12d159e9e4afe71db3d251419ff9f8797c46dff7415f40dcdcf4a1986c5173b5d82fa9581cc1b5355c653525bdabf125f50551b8b2cecd9635658af192de65670e72869caf9a42482417900bc92dc9adc845e4d6e436e4b6e476e4f6e40ee48ee44ee4cee42e6a98067c3fa9a04c3528e46bee4aeea6e227772717abb3e41e3a2aa12a1995c47cee49ee45eead7326939ffb245e6069f0e6be0904d2c95ff7ac85050502997cf93ce7f425b0e09cbccb2a17ab92abe984e4ea9a11b49e3326d7d08810de163d2728e49a9acc64c123c241be0aab4ba40816e29f42a2c3b1964624c5e65ae4dae43ae42c7262402f01a24fce26e7901b9073c979e486ba0496b99d243128068834ca8d940e7372694173aa6b07593ee57eda5c3d426c962395b9268a850884dc825c2a61444b93682ead9518d9cefd5577fc414122e215e81354b9acbeb022deb1b5747f2ea74b7a013b974f56d3232561b14d12b8b87aaea0d32e66cbfce7c45401a5ace8b8961eec65b4469847137eaf45de90f7c907e443f24bf22bf211f935f90df92df91df93df98352dd229186828518635dd4077b0923e68f9a1a443588b3489c8b58101d25eea0bc9055a520b80b794910a94648584c80f8a9c4c8ac085fe6ff7adb3c7fd6474cf3176d62bfa0f0f09526c52f8293da20442d2609105ade982b0a425a626afeaa7a41e5ed5739227f535e949585c4b056c4d249ec4c7526f3775dd5e663f20ff24ff22ff26ff21ff25ff215f255f235f2328606f966a2822649c5d5d10582d355bf9065b29082ac11f282665bf70b5292327f2493125626a94a0eb5693a18aa830885c976be43de52761306cd77ff42a197787e56395236f27dc5226fab239cd27ab24caf5c435090ee44c94a2c684690697414a061828b84c0a4ab69729c148885d88547259885e18447657c62497e40de252fde31242fd08cc94fc84fc9cfc88b7902538a7c5ae73f9f5114c4480907d1ffa211bb3f8b455f95925898cf6a9acce7941dc454997399a745c2237239a5092bc99ab632743e4fbe40bea87393ffebcd80ad4c4e591d419f14f6158202bf28148cceb6f8bc88796f48c15741269f82852cf54653d50b02d3cf0d02519085400f164f91c9115714a22a84ca5be211024af745614941ba8d28ac296c286c29ec28ec291c281c75a9523825f50b27a90b3494080a67ad204838882f08298ea75a7a295c345968d56ba648493a1027151f2c5cd5312522c413654fe1a6fe2b2ea083bfeb5c16e23f50283c283c29bcf415aec25b5346e1a3b8887714be142abf3259729e3bd04ec511246b683a2c292916aa146a5a1a167710fb0bf5dff89ca694b17e062a8b4ea19242834293428b8298d1a120e77629f428f429d84a7bc226e23ea285c5db7fab263dad9d8917885812fba589238817141c85c6b1150b41411751331d9bda3fd3d42014a0ce7bd7542543924f99b3820cefafb74a15054f5fc3111484230a02db48c3447029c8d06536a6bf4ab630d3f89785937c2dcc35358ae562bfc02ffca75580bc52a940205321042eb32ad425095ce64abc43e0282c28a428a429c8b408ca390a027a41794e7c4a664f49fead0e2f460e92db708282b883a0205f0b450a255d44081cf293ec191d9444e689cd6e920ec4fe1f1d2ddb129885b286ad0cbb084543f1af957531d0874b4f16c590e292e28a62a4d014d7143714b7147714f72ae68b0775042d0176291e159de249a3a378a67849ee170d950b0514492582c2cf4415af6a9b30a5ec71e4e01b4519534c512ef1a4f8a2f8a6f8d15306a344264c95f0ecaec6bcdeaaaf6a38489a146ad0228a0ce9ab21238ee024f525bb9f2c10327a75f9541d6d69d84a529326ba7698d68810cf2d5628fef5b738c46c997f45a1a62f6c16eb141b149bfa573f8a2dd5c8c5a4e657eca8532916728ca0d0d3d4287428ae21aaa9d8571e12a92b1b6289ce4f5127ff27ab0b7b156d1d6ed1a138a0289d781487144714c73af9c589de7af3920281caf3b2cef9c4535e2c4e357174df9a20c50b8a8964941c2188084cb2314c5850a647048b182fea469adeb9c8e84e6faeea5bbc40e74c7afbebaf506492e76b8b8be4334531ad8bab628662569d6234a198d325a3f87f31af66170b148b14e5e032259275d48492a1e42b0a4201325d628616d1273aab227e4a81268b52a8889496945694224a6b4a1bf591d296d24e4f94c3c4425184ba8e9e2b5388dcea57552feafd95aa8222c68b23687db1aa28e882baaf932f7320364bd896f63aff85a42a533ae8a7e4b2d251674ef25ae92fbdb06924af275afa670b0485d2599f9a1607295d92764ddca140e996183ca574a714537a507a527a517a53fae83c94125f50522c2abdcf657f45e74a97610d3552c84259134a62704d795ebe4a280910220d24474a5a11fde326fa577e1581384b6ed2a6aa5a50d6e2baff1b14a57a82f24603a7d4d0145e6aeafc4bcc965a0a81ca96b6d2962ecc87dac4174aedbf575325e9c2d2a7a63f594ad2a94c5d5fb1900029d99404c8a48850722989a932a5234a634a32ffb2739610474791ca256b389dedb9c68252e389d242cd28a512359d552c0485144a01421fb2649a2e7ecb84a202273f2aebfd2b9c4a694a3f0ba1b4fa8278472959ce88bfc8294a37b3a4f472fe8dc7524e8d9738954f59bc94f21ac2a542d28a94c4e9ca94ff7a6faa2ccda71c500e292f29af284794d71a29024d59da96f24e557a794ff940f948f944f94cf942f94af946f9aeab492fa52e27b940ebc247f564f155f1859fd0d05a889c182b2242845aa719ebb6f88b78756aacb53cb14d6cfed5bfc9032b82cb4f0a283f54320a28728cc82a3bf111f11d81550015392f6a45ae2e66979feab3a324af955f89e7ca08dfdac4a3ff46e1a35e50feea4b9de208379b72857295728d729d72837293728b729b72475dab6c51ee52ee5196cb489ecf5076280f28bbcac3658ff250872e33561e511eab474c6412260a8a2ecc2794a71a3bf2b53ca33c579756fa18e89a4f8c97e5702929eda8d02827fb172a1f2447885814c9944bee4d6af96cae4256225f02a1bc482048514e6b93f917a728cbd8b23a304973e51ce53ce5bf6a4d62b9a250d4bc502e69c5b15cd6bf8725fffd6df2671c02a37f806869f40f53c8a25898702d7462f46f56ec0c7b452135d3a84b1f0d079c89e1982c876cc329d1f3138d14cd1d639d7699432d048d0ce764c9a43f192e49c92c5917fd1cf953599773059d89abb5bcacf47f55012228fc30882822097e1532c25322756f49f01675b624b5956e465ff98935d30ba3a58ce1f1972f9492a090239eb26df4adab77e21162f3c7e81b2815a3af22d48c3eb1de30fae872cbe893ac1d8325d9c1202be5a741e4cdccd0d73fb524cbf35e5dc96c9adcc5c9253c374d38c24dea343f825f1c418c940cfa5329902353ba9a32d849be3c26ec5051192e9ee50cb543891795e4331591fa50cf40b5404666c8d1e59cb8802780ca44e68c3e7de2e9fea98c736818a9ea2f797fd71dc51d840eda72dad86875591608b22d26cd8ddeca907ed3464b9159a3951359210bea92824b3fe019fde71b1318131ab3346625481a1319b34e9e4daca95f8819ca0e63cded8285d602863adbc3644524ea400e90fc27332c532dcc27a68af3ffe45a95d596a6831f6a10d6d025d358c5b2a020e120032cbbc6c8b26a6dccd6985d4201392585f44702c198bda060ccc198e3dfbef0949f4fc69cd511cc8574d198ab561f5f7b636ec6dc8d898d791823c4b332468e791bf331e66b4cc598aa3135b2b63175631ac6348d6919d3d6d742b305bd8ff47337519ade5c1e24e5908e52baaefc9a7a43c5cb256592737207a594d07e4ac5afd6cb7a6ab0080dd92f40c85a53efcd6fd4fe9f5abb90a2644475f899319d04024b4c155d604c57ddc1f48ce96bc94bb5b94cd81fcfbe1ae3e81b735fb176608c9ce619333446901bf3de193331666a8c5c636eccc21889adb4311963b2c6c8e8051141ba608c0027b151d63fad276ee1fb8282f103e387fa048175d302c10f16e21a32ab32c3b26af8b9cba0b7e1fb7a4b52eb3713d5578e6bfca5f157facc8ac6fc571d473092c019d87ad63079a827bdd3f4ac1420a61e925c90357e64fcb5f13746484d40f1e5988cf1f7c63f18ff68fc3f549386807f36fec5f857f505ff667c99fc8b62e1c7c67f18ff697cd9ff36fec7f85fe3578c5f251b1abf667c2127dff80de3378ddf327edbf81de35bc6ef1abf677cc90275e3dbc677347768dd6da6eaa8289793d0bd1a5facf58c2f171a197f6c7c19c9d4f833e3cf8dbf108563fc94f1d3c6cfe81e61be6152e912fe4bcb48c4e09cf1f3c62f18bf68fc92f1cbfab70d252e03df04810942132c4db032416482b5093626d89ae08f77e8fe5ddbffa0f09f51f8b76efffb3ffecffffabf5955f19b</data> + </image> + <image name="image7"> + <data format="XPM.GZ" length="95529">789c44bdc7722b418f6e3befa7f8a339ebb8c166f9aac11dc81bca515eba710765e5bda5cecb9f24b13e6ced3d5a51ac744800894466fdeffffce7f268ff3ffff3bffff5f1597fdeb5ff696febf7fffc4ff7f5f434fffffefffff7fffcd77f97f97fc2ff34aea2ff24fffdfffcd77f8f6f7effd3fe673459fe2dc1f6cc41b404f7a5837809eeae1cd83b36361c140b30fbbc0644f6d2d967eec05e7afbecc05e7a7fe8c05efa70ec205d822a75902f41b70f8855cab9032ba5be7160a5bc270eac94bb0b07564add38c896e0f9d1c1b271e3661d90d063f5ad032b76b4ea801edb7760c5d69d032bf666eac08afdcb1c586b6bd523a5d8d199032bb6f9f784153b6a1d506cefc08a1dcd1c58b10fa70eacd8fb7f4f944b30fb73d05bb112878c8a358d0324e8c88155acfd7060151b8d1d58c5bada01153b7360c3d08d00b98abd74407fec39a03f1e1d242630950386e1df4facf9930b078cbefab4a0d876d501c5d60e28f6c101ad2d1d58b1f74f0eacb5ed9d03abc7e8df13360ca7370e2a7b87e64b49c5860f070cc3c881556ce81c58c59a730756b1c33f07568fcd4b07d61f675f0eea25787b07541a976b07568ff6c18115fbfce100b1cc1c30fa170eacd8ef37404d5bb27f00091a1cd83bfacc416360452062e47e008daafeeb00c17d76602ffdd13b5a7e72b3edc05eda6f38b077dcbe3ab09ab6b903ebe48b7fefb0d61edf3bb039f726c1ed28f6ead2416b2f7510d913c70f0eaceadf1a979e773c660eaceac7fb0e067b42537d90ac970eeca5a37b0756f5d1b383a5e08eeada810dc3e1dc4167c51e38b062ff18ca604dac94eed6819532db1360289fe9a048f6a5993b40d1af38b0775cee3bb062bb99005db882728c645f4eef05226636362a4a78c74c2f4d22abc70716284a99b7ef0c54246df98eac4768a9f123332a92ba78403ea20a8189514a5113997c5c3150511b99387cd0a751cf4f9e2307568f6bf5581f5b3d3ed4fc819ffca18362b90a5748501cc54ce41820e379674a2972efe261d58195d29d39b00e7add76c04b2f1d58f35ff71c601aa7007737ce1c6091bf1c58294f730798826307c8c7b7036b4bfde3c08a6df601ee7f5c39a0d81307566c7de0008b3c38a0d8d68115fb3a7560c5b6b700f91fa30d0791d5e3d2416c2072809cce1d50eccc0153ac7560c5aefc7ba9cd979d73073691db17807b285b0ea8d8c401a6b17140c5fe1c600a561c58c586cc81556cebdf3bcc34fe6918e490d46b0e1897750768872707d4a37360f5b83b7780a67b77c0f4c81da0b5330756b1e602200f6574ed80818a1d583dfadc81d5e369e400b1fc05c821f9fa072865cf01fe7ae2005bb9e6c05efad139b0c63dfe39b0b60c830353399f9275b91bcd960384bf7060f578e91d583d867fc0eaf1b4ef009fbf73609dfc70eec0f4d8fea7037348ee6b80fc8f7ad381552cbe7460f578691d58b143eac04a194e1c58297349504de36e5f1ca436b68503466ed78195921c3bc0c7d5e837d296db0e9840570eacd88fc8018afecd818ddc71e1c06cc3e33d401ecadf8d037be9f7bb03d4c5aa031cd63f07d64137eb0e4c3b8c24da9d9ccdc141661d543ab09a7e340eeca5a7770ecc5538fb76605258abb53d5d78b3e1c0de71f40ff0134d42b92c47eb0ecc88a79a1e03667e8d7744326b375b0eac0b8f4b07bc63550047a04605473227c3bd036bfee8c88175e16cdd8155fd68d3819532429223198bba74608dcb3b0736fa477f0254ec4df5906d28de0470aeae4b0726fc2d631b4905dfa2e82329c773553d8bac1eab58c248ba70762540271f1f3ac0e757c5a4a5ea3f0736b6e71a972232b0820a8e4a2a76792c10197864f4234dc237e65ca4f9d27f3ab01e1ba19422b9c56ff447f003ac3f3e18b938073c23eb89fcd339354d34b61f870ef0b5ad1eb1bb4eb7d70eec1d5f7f0e6ce4ba5307ccdb470718cf2920d2ea757080d67e75602ffd5a73803f76e580b99f0062d9fd6f07d8fd5307a8ad1f07d8db5f07d8fd6307564af3e10053700250d8a539724029a70ef0a4cf1c50caae033ae8d801dec5860393c2f7312095d79739c0885f38b062875d0738f033074cd327805c96d1b6031a77e380c6ed38409f3e3b20aa503960a0ee1dd0858d039b2fb7aa87822ab78f0e58bc670eac1ebf130718be3b07ac6f3f1d583d8ea60e882abc39b04e7e5c7160153bfc07302711405ece3076c03afbc18155eca97660155b7f7460157b6b1c50b15f0736911f5b80a22c6f9903d6fb2f0eac1e2f3b0e90c22f070cd4d801cef78d038cb8645d41956ecf011eecd481bdf47770804fd73ab097aeab83144359691d1022787660e392ae3bb06178d907c84379fe7280077be4c05efa7eebc05e7a77e2c034eec9a5031bfda70380bc8b3e7560e3b23f7760a6b1ff7360fab411e8b47cdb7560f5b83d7760f5787e7560c5de1d3940af7f3a30db707aeb0013fdef09abc78546aec314fc6abe28ec727be9c0eab17aeec0eab1bee1c0ead1e909add5b37707e6297d52acc7509a8903fbc947e6c0fae3e9d001fd81058a640abac881bd74e5cc81bdf43b7560efe87a072641eb5b0eaca647ff80f5d8d19a003d369b3a30c1fd46d623598fcf7507568f932b01b95fc86930c9c42d19ec483a399d0b10306b550f69cb51e2c0063b5127673846cf0540cab17d74604f9cfd08e0e53c970069a9c7ca817550a73ed5447ed34b6b2ad65d39b04e2e304951433ce88db91fb58ccb85065be19f026d190d11c5a20c8295b7976673017ed2a3c663f996c3ab031bca099a2ece6216cd342ed67265a062718783f647e31259e4677a3df1b0ad8d4be29ed2fccf012bbed8818dfef39d031b97d53307d6eb7fa90344fbc201a2fdefa52c35be0072ae6e5b07d463e400293c76403ce8c881d5e36bee8090daa503e241aaa9dcaf7ac301c5d60ef01d460e70bfa60e90f577806f72ad3ba0d7371cf0d2350784d44e1ce0f6cc1d5829ebdb0e6c368c0a800244ed8a03ccc9bf27eca5f35f07ec151c39b071f9bb07c8b9eaf71cd0964d0756eccfaa033aa876403c68e6c08addba7560e3f270e280ad23098cef58ad38202072ebc04ab9bd7040d4a97760a53c6d3bb0525afd448ed1ce8e031c922d0756ec7dec80d1ff7160a5ccb71d58295fea207939cf670ef0b6c60eec275ba903d30e377a873c94c7b903a6d8ab037bc7ebaf03d30e1b19a0a6b56fdf0ee8f5ca0151383da118cafb9d032224d70e4cf5dd3f03e47facef3a30c1ed9f1c9872dcd350ca55186e0422dce22b8096915b125cedae74990384ffd5014ae9dc01bed49903ab47f9ef27d696734dd3014b78670a367133ff4e4d8301b6819a6d0b48e3528a8208232c6100d8ca033a39ac67adea6f2f00cddb1fe69c8708e263818870184a299846bc3e7a3d5210b2291cd0c9ccecb0de2726cdb8045b696df9d43b642b3fa70e78c7a500adfda30b23d9a85c3d266bfa892e8c140edbfb12c0787e31a3a28e5e3fae1c58b1512b10b39a67de463ddb4f87df0ed8283b766012748c520a36db1c92d3070784a1687e30c9d6b874ea00fb82f0c70aebaf340ed85aa462b13200920b01de11950099f9c19ccd24691187017d9ac654ec069b9d16b1f5c7ad159bba551f660e90c23707e8a01b0758d357072c68120756b19b6f806cf668e200a7e6df13d8ec130768ba7f4f60b3d71de019fc0064a2fb7d0756cacd9b032ba5fff713568da70eeca52f1140267a2b77409069eec05ebaf9ecc05eba953940f3ab0bb587d36d3960a179e800a55439208a7f0490bdfdda7440a8e2de81fda42f1d101079716053fd2d062810f1fe0f1088b87180cdde7480c6bd7660adbd1d39b0625f761d60e72441329ef595037bc77de68075e58903b2a152802ce1da27408bf7db7b070cc39b039cbc7307f68efed9817550ab9a2a90b979eec07e32bc3bb09f7c6d38305df821b1d46afebe7140a8a27380b775e08018ecaa03d30ef72d409b07ddc481bde3a573c0e6c1ae03d341471f02a8cf467daafdecd71f07ac5ef71cb0c0d37c91f16cfe01b4d4ad00a51cfc3820a06aee57ea8be6fd2f07189c02a0e5ec7524c04b9f9851c1785ac5d6371d10e7df11e027b7884358ac5a07b51307f693f7c101367b5780aa3ffd01527ef2f6e6c07e926c0b50ecd1aa03564953801ce7b7ce017b272b02380217fb0eacb50df32522b4376263287533ff8792f6b07eb72e409ec12dba309879b31e792d1059e31a7461a40dbb7b66a5c7f947170e6ca00a9481e74cd41a06d9ec936b07f69367952229fc8b1d58b1c72a5626fa4bbd3e6828b71d58071dab71434cce04f5881532799e38b09a76470274611c0bd063d19d03742152e86bf5df6b0756d3c2013f49502871027843d6e3820eea5e1c60e6af1c10d865dec61ab9612480d77783d18a2b7aac4592630dc32d4217f7f2a411cb58d3f415c59668c76ad7242873dfe1fdc1012bbe0d07e49fae38b052365207e88f55807c87e1cd011eca8b03acc7a1038ce71420cfa0397080117f7640f38f01b2fb3b7b0e30f32f0eac94cd5707ecdf9e396061a5aacbaa17670eb0956307848f77005a34af1d3bb077fcbd39b077ac6d3ac0cce700d9ece70b0756d3edc801f9b8e70eec1deffb002d78ebd40116390168b1baf1e980c6150e487b7d74800bb7ef002d750790117ff873603fd9ff7160f676e5ca81bd63fbdd814dc2a9444a598cf5b3033c94c60133eac7819532df7260a5bc685c14927ffc76400eda08a084c34735aea31edf2f0e4c4bfddd02a4fa5e32076cd69f383047a053e3b458fd6e1c60f8340907963c6b34ce37da3f260e18973507a62eee98d91e606e4e1d60e7f605a43f7a807461ac9f28afafa183fe99d72d019e38fc05c856de20ebc134d2b84b016d70f70e587922fcc1345a8fb535a0e01db702254facee0294dcf2dd39c0415b73d098bd65e4c2fa96f0f113a0616c574f1d589f7ea20b3d5adc460e788259f96f7d2ba095e70be210149d55fd692a80ab705239b0270ebf1c60e69f0458bde6d70eac4fdf29d66d65b72b80484d620736949b0320a671e59e00cbd915555dee57d108288c4d7fc41aeceecd81b5e52315b05e1f110bcee2026b9aa31de28a15708776885be47484f5089690ed5a15dbd3eb03202918db11e6249163f44c3dd2545915d6a7b95bc2e6dd01d6b405c846bd6c3b20b0fb019049ba7c03684db83177609d7c7000902bf93375c00af8cb0193f0ce01bb3c7f00055457af015a9c6dde39404bcd1cb09d7f0290e6af1307f6447deec0baf0e11020bdbeba0650eed7c6970316890f0eeca5f31d80a7698d1cb0bcdf7380f5c81d90b13b7160eee8e60540795b8f9d03d6843f0e6c46456aadb638cf8e1d98e0eeec02b4b0ba5a738029e8019e043e38b097feec3a20272f77607d3a290598a6b34d07241ef04450f4d6da4925c04f8ee60eacf967f46998fad8b93380e7271f38b0d6eeed03a4e84fde04d88f6af50e45bf6eaf1cb05f7924c04fee558a9441de0b6847f3c20119888c6d242fe766c781bde3784f80a9fe51030aeab1a6620b4a39ca1dd83064cf80125dd83109652cc603b2ee3b898deaa1e8e8ea85032ce18f03b64999846e4e9ab1808cc523a0459fdea083229d5ea82b076c4f1e39c0ac4d1c987c3468a948127475ecc09e985d0b604e8e694bb00d0454cf0478e287e6c709462b8e0450e31ffa891c81f250c01a371ad3b838e327d5dc81bd34993828ac712f809c7a547f0eac94abd8818d6d4a07c565cc2a9a61080b2bb65bf4d25acbc82701c6e542efa8631bfd47f458dcd0a7ef087fa2d6d69f0025fa7d32919396629fcdff28dce03c7d39b0d1ff590328a07a7be280d4c81c2093f47cea00352ea015cef631c073aeee005a9dbceb277ef0a20778f0efc101d3f4c8017b8d0700a5037dce1c506ce6005320a0cc9dd77707d6eb895e2a73d21e3aa84da49e010d3fb9a900f2d87afda4933b7ae6803323330784e45f01ca43f97d724036d42f406afccad6d98587c3ceff1c988cbddf3bb049b84727ffcb10b906c81b5fdd04689778e5c0813d9157028865e73f412cb3cc01a9d5fa89d6b7e78f02e8d3ae0028c3fd251540298dce011e86422c5df5ad201f9182a131921cb5f8b8af5b0069bad981036bdcb1dea178d0c58103e61cef8865f8ae630756caf70d403935678f02f2b53f05d030510788515b1c410ceeaaa9ad1147bb8aa0a5ac62f9c881d52341c6828f6b9d9cee39201f574f946898ee12a0fc8fc4416c02f3c1440e3eaebd74ce60070d436cdca4b0740db372e800777413a09049730bf01d89030756cae71ca0fd868777809f041d3bb0b6ac260025fabdbe3a20ac3f7280b6dc0728f0ff7cefc09abf1a01e44ade150e4ce856638082f6eb2b0eac4fb76a07f693e70780e2eb2b5380b2f5eb4b07a437bc38207deecb814dd3d9dc01a9e67b0e964237fb5407f9d1bf5c807a1c5a44a07475714f6b3dbe7e39156002bda700add6f21b07568fe77707361b361018cf5f7f3d70604379b125808679532919ad8d22019eb8a4b5c141b36138564d150cbdfd0094da57ef00958e31be38b0fe284e1d90ee41274732af9daadea1c77e6d8a95714c079d8c1d587f1c7e08d8441e615e17c04a39a4c7829763f5787c03a48a9ecf04d01fd99f03342e621956c0568fa205e4288372df816d0d8c55b18262f7be1de04b7d024a7ca90e918ae58ebe470eac1ed5aa0015fbdc01348a9e4f04f0a5ce371db0e1cf3084a5b9c947ac1e1b126bdcafb99265a270c76424109bd09d2041c144b1bd903860e18d58265a9d3c670079f41fd6a795ebb1d92f402ecbda194007958e270e70f177008a396e8d001e0ffa066807ef64e680dd951ea015df903b30f9d8b2c655be38bbbf0728ec72f30990999fa700796cb9dea10c91a343804cc1d1af037634694ba4d360c757029a40fa4945c5ce771c60e72207e8b199036b5c9e0124740dfd1191ef301a170e5867d70ef061fe3d61835daa1e447b469c5aacdc3398984eae1669aea65018ec30b3ad71859ed0ca22a2629a62e3cb53408101fe3d07d44cd3ab8900c23fa71eb19ccd41c53636f747a31b0736b6d1e08008ab69ba2a99242ceff700296bd3fe1d90d3c97fcf0005bb9e694b50c956ca0bad4d9585f4695abbcab4ebf562aaaff6fd178efdd6bebb72b80af0a8d32740fdd11e01343d5e0e01ca1bbf4f1c90253f756063bbf904e8991e779503a20a2a56d93fbf1140bef6da4c00a15bb77109f564126e7c3b60cbb705c856ee3c03641a373a800277fb0d20e72777a7006dfa5d6c3ab09f9489031b86820e0a738ef8e91a404bd156c5ca4f6e0f04742a4d356d49391b3f0930fa3395d2333df63f1ce09eabd8812790d33ad6e6c1c5a9003fe97e01f4d868bcebc06abace40c509557f7c052840145502189c832f8066e5eb1c902b4f3a11a071832a264f3aba758042514dab988088ea213bd73294c1ced93b2afa23b8d6d61f7f36d5eb444afa2407c4095b250c7652322b876b4087dd7fb9020c547dd7c6b6f1b5fada36407b7cb32f40cd13c79b004f3b4901adce59c4808e75f6ee8603424807809e9f3cbc0264a3a61600687cebe8859ff895105b3b00b92cb37380826edd0aa0d222f146804ece4b07388a170039247787008d4b74e4c07ef2657a2ca857fbc968cc4b63a5cfad5e02121c92a1052811a3980ab0388bc70e38de5103bc711b02b82c3523176c83b5b65a11e01df1c881f57a310134b67c1b8dde002d06274e1c10d86d1cf4d6da6f40cf4bbf19b97840a19ca894413fb12064e3de564e07b973f5f501d01edfcb354031836d9a9f64a88b27c43251f3bb478036b9b6cd836d7d73fa7717a0e04e7defc07a6c473f51e0bfbe00c8b9fa3c00681df5f006d0deebc79e038e77240005dc5728c5a32cab63809f03e6a51ea4de3b11a03f2e36004ad548130756caf60fa0c61474254061dbdb77807237aa1f07d6fc89d9b9361864b4c31a4029ab7b9f80045dc88e661ba7bcf4fc5b00c7e8e8c70127865a8066f6e9a3004f54330011d6d148ef60ed31dede0468f9565c0920da2523279d3c2e8e1d9038dd38b05e3f1368f8c9a79aaf40f7f80bd0b33ac918175f7b744850a2f04fb50e887822a56241af5b6b23c4324950f429cd4f5240ff01c890f5934c202122a05294e4bb828c25ba72e8d94c411b3c3626210395ca1dfd31f9e8dcfdda34dfb28b74b6fa78c38109ee790b8878e2e9c88175e1df0540db3e7bbf028cfef5b5031bcaf5038092e362d5430180bb1707d6417b37805c71cb2b011601dc72d6b963f47e0cd076feb92a56f2d23c06c858e429a0016c6f017ad986ca0119ff3f00b93df7a60cba587711bc0c0eb051e7023a0d7602504677f7099087d23f000a44aa9d0174d47e4800caecca560032166f1380f458ab9acaa72b6dce7561dd40cad907004b381aff0af044853804d166939cb10d4b0d7be9174217f4ba35ff750dd0284384814a5a14caab2d13bab4a6931f4cd177d904e5f8f8084898c83fb6c0ebdd0f3ade05e82cf1690a5048edf00c20358ef1ec3dff746bdd8149d0caad00a2fdb105500edafb01400eebf3d8017ed026403957d31b075c707029a0d5c98b0322f05f00852aeeef0092f5bb7b402563f103f07c4b7326fa5841fbd57d40c9b2296e04e8e4cb1300bec3b8a48382b6b427b6cc56f6891645ddab808dfe889b7dfac5b1347bc7392049d89f8b0029a0a5d844a93cd5062097726418125dd135c402d8b97e07a0387fbfe9800c777a3dac6f4d5b3ed0965491efc704d0e3f37f9be00e1e609e1d39b05979bd0d5086d9d70bc00f4a7f019895b34f1bca41cbc8d9e71340fa7423062456caecf34d20e24a881f07dc9af00b48051a07660a765701f250e23f8034eefde0c02479e7430091fa55c5b47addf875c095879b0079392f394001a23735bfa694692fa065c2b3035ca75d8082b2c98a0393e47dda123c14fb497eecc064ecf21090a1932f0f1c701c7b0ec8b12f6b0c7650b0a8f10e2057e1c0d4f8e07e72c94f3c2a99ee03121ce772e6804b33e9e444994c0323976a97e7690da080d9cb05a043707f1f0138f0e31eb1cc32bc9cb5e5045a1c52d3355f7b0025b73c3c03065dc4f169e09f9cbe3b400a6f01b2fbfd3d80cd83d9e7870002f3ba0f90586e7e0324635b9b001d749c9c032a2ce1e9ba0376df1e010d4f6c6f035a0466e301a088d1f44f803e3d3a066831d2f1442c6f6b3306e80851ff0b904ff74a6b5d82ca16506a27e0cd818d4ba9975636d8a3f19a039cde57801689ad5eaad04db52b6052381ad11f416bb37c7b16904ede30e0825bec0af0c439a31f060e77634d00d1be8a1c90f43c006240fee680bb90f413cd862276604f9c2141c136b0097a05902978453e82e66753e70ed02638ac2f06d28cb1fd3805c8ce7d221fa95ca7f7094013e8911ecb222202b7d43457071dd8e8470aaacc3e7b8092b0ce3b031e51dc9c0338aa32fbfc1240f8d74e1d70edd90dc0157d0bd031930d019df55aa91c90e53a1188385a3e77c0b578fa49aecbc456003a8a70af7a94346ef3de016aab00c8219908c8d79e9e0074be72cfa658e48ef3dd13402731ee9e1db090380024ccb98b7501ecfeea1e8084b299a5d02c002fddda05b8a23f04d47a073555487e7c52025a04265f05745aac36803e218a7f0d1898b7c58b0041fb1ce013e8841ef309f486487950e58d9726aca34623fd244b709dde0139d3342e1db0f0a6c79242cbd96307ec7b248032b11e9baf011af4e9492c90587f9cdd01bac4c6f6c7a65894aab5bbd6c97eebcaec730068be9c583dfedd9872f5eb80a1ec0464810e006ea30e1d70457909d014bbde02e05c8da7a70ec811180968127e03522d455380e21f1fdb0025b7ac740ed819b905c8817fbb14400a930f8036a707555df1a077015dd3331d0430c0d9cc81896514039410927e38b0b1cd06079db5d6443bf6ccf2df1ea00e3a3b14c075bad80168a7f9ecc901e1d277074469a969b08484c3186ccf96db9a0214ec3aff12d006f78d03a4f0013010201a9b250c35d7bc1d0bc812220e6186a1b65a808c564ed57dfd52d01f61ce91c548178629c64169063bf874188b0f01a6d8c11ba04c883bec38b0819a2041499590a5a69736cccaa200b44cc28e7109b693902b43e996f0f70a50e36cbe9b42893375d08b795b71aed8c5a62903bfaa63f6697d9ab8f5b83e70401adf3e20971bf82780fed83d12a01ef10ca0d4fbed0f40a5b9ff0c9039d9da0690bb311ab70eec89780da040f7c5a70072fa5e1b08b26e4f441340a4d9b0054895f6ba02c0b59ed9f50501143c91d1b8e0c27137c39e034af901b480d51d80b638bfb6051886c9b503e6ed93032bb634e72a717372b10a8819dbecd0017ee18a80243905a4188bfc15a030655c0172a647f5e98010f4002805e8e420c96488140ecc68d5aaba7cbab575408b3ebd3f05286baf3c1648d84a43e8d28976f03e0452567c178028e5ca76063bd5403d234169ab334566a243ebe9b117ea91a50cc3d632c814f9450b334b598dfe1d1dbe780028c3fdea0fa05ca79b434029ab9e0194c9f4f60320b77834ee008daeb7d872c05ed22a40a94d6b4f00ed26dcdf3ac0ce6d0394e27d62639bc6133aa85c03284fe9f0d281b5366d00caa48ee8a020fc6ca49e02142f3cd63bb4c2c96e009a1e13535be9e2160d7b62d5012b0b7e120497bbf6e85317cbe811208d5b8f1da04f2b408deb74f0ee00c1ed1d70efa8398aa9abcf7b5a9bc558b1870d408286795d01283dea9171090b60eefd12e83105a5b536f3c866623296f9c18b9343804e9267df02ca75ba7260e2b0bb0690177c75e1806b68738002eea34f0704771207ac9254ac727a5f6201de916e3bb09a5e170e4ce822152b3fe8454f2862f4b423c04bafa700459c5f6a07d6eb3b7a42b3e16a05d003eec68021e2e2891d072c46ccc75d1ca8b30e3aa42d9ecd70f42ec0f4d8ef013a0cb74f0705f78244611aa7f30de3932d803ca5ab0340255f6adf018ee239a06695b4c34085f50b5adb144ae65eced91c10e39e9f7c01a4e9b247012d24e853b70d19150b530c97e50650f0c4154319a618bb091f0eec89e8c601a6f101a095c536721a343f978ad0b84c092177486196312e4f1b808ed67ed1b8b078b72efc314f3af76db08b5b80ae84f8ae014a6a5d7b76c01180538066d4f611405ecead5eaa94d5e618e0e973df0ec822787280033f05c814340f0e58bfac013c23620f20db70973be0d6840ae0cb844600b18caf00ec9b8e775e00da695eb90128812a3971603fd97c74c0f96cfa2326a832fb7c0524ccfd3b5eea491418f1c5391c8e10fd01b4143ddf06f4f84157d423b8f86c0d3c3a206d7e0590229697ab0eb062112003448c4b7059acf9e519400bdef212d06b157defc014fd550618002791030277ad001eca95f963799a52ca8a800288aff447da33d55710dc601c4826a5f9599f90f56b435978b6dcd133c02f46b397167e0168f603d0b81ce80989360bef42b9a3b3cf7b8064fd3875c051953140925c1c0074b63aaa1dd813df13071c115907e848d5d6960372151e1c905f1839600beb1be0fb408503ce68fe03d8b912d003ce4d9f161ecadabd0344b4e57acf01f9eb95036bcbf7254081aabb5b80ec6d62a1acc2f76f9f19b9249283b62d805e3f7c05c853ba5c0348f8ab2f80d4f8e535a0d082f7d90107b6f58466657402908b9fad3b40f813408d5e4f6240c313fbef00e2b8a3d19a0376027a4087cfdfaa146d4fe6df0236a3c697e702cca862db81f9dae30d801612f985404afc03494e2768a96a5340ef983b20fe710348521297685cdad3eb77cc862c2790f9608abec8e53b0cf47aded2a7eb3650ff4ed9bcd5001d8879e3094ff17edd05e4c869d5396039fb09d039adf71e208faddc7560f271de009403dfcc0494507601d0ed408f9702546cbee280048835075c57380168836aed4440c1ae0f80ee849cae38b077ec3e00e4e4bdee0006eab16f6aabf479bbdf02941bb87727c0dab41f031259a05d07ac1af59384054dc2b87810e1e11790e339be5d01b4287afc70c08e0403150c1f7b8d3f800e3fe8948af9a64ebc0d88308dc92d4001e68b6300abf9d1887a24053fc9f605d00ec9b50356c07a426905652dc04f2a3ad927f2c5cc81d5f4e015d0f1c4f4d701a1ce39a007143b022cef6b0426f1e09f9a3ff0930d0bba956944273fad083050d59e804ab915407f9c0d8014edf0643aa8cca5605fce001d2af8d58c45e53902f304a05cdac43aa8f264c1eb1ce0dbe8230736e7ea7d80e6dcef2d401388f5ed02909951033a9d353f07c841bb3a72408f998c55beff92538aa7136e7f0352c4f27257202654d1004a2650bce5c004f7ed03a0f5dcc7d401927c2d80585e537517fec904a058f0afb9e75542246f7c710288d9e39b4d04b07397eb00797df91c20c357e889929fe47f0ef0619e00ee284e1cb0c23906288890d3fc600999408c5c981ec4726e1c601a0707d6daf4c481bd2355b13d4f9cd3eb7236c727df028876695abb4a27bca33a70c06c402c8359b3d13f431cd28cd9d09a35ad3205cb7f2836cb307c35adcde5c37c9b3f562f56fcd61ff70089f6c6074019dded9703ebc2a74f80ae3c3c1d0474c46c0ee89951b54df5da15fdef3340925c6500856d5fbf017a693e13c01bdf34f559273a21b33d0148e88a07402da1bb72c046c808d049e3260eacd8e9930394b45e3ae090d887e0a23a8c1cdba47301462ecb01114f14a9003e0cfb4075aa44e1f4478027ca13408697736fb3b2ce06fcb17bb3fb753ec144ef98696cfc50cde608a05b46d60f013a1bb9b20ad059d19f75802efd7ffb05c865393902281e7475ee80f31e9f009d063b4d00da6dda9b3bb0275e6dd9d4f87197d50d80ce8bbd570e589d5c0312deb1f10790ac5f5f39e09397b500223552b14a90f93c72c0b501ab0eacc74ed70035ef484e013249dbf458d0966498d1a7c177603772cb81096e1a0b1083dda62d2edaddb100727af804487148a25301e6fe05354da41d2eff1c10d87d04d4e8d3780a5080a844827c7ac46f0eec896aea00e53806e0f38fec9b4b4b8073c5b8840944aaf95c006d997f01345faa7d40cc142b4a40c24bef4c19341efaddb0c6b53a5e3ab2ef672f4e6921eba9c958abc0fff8e400a07b26a6b900e2b06e7ddabacd5e190092d38f7340c64f56bf1c1082ae1c588fad4f01b9b27e571c10763904d4315926aa4747dcf270c7010b4d8141b7ae0082d06181de00110a657bee8071b90428e05e7d039400d1cf1d90ec3303e8e0455a0ba071b33d4005484f017247af0a402f8bfc0b9004add86c68539d9ebca4a62e0ee71f801409baf87560a6c0bec41a801c81877d40a7fbc66d56b699b66c1e01854cf4a64961e7b735be9a8c2d92f309559c0294db336c00f425e7ec0ba0e8f9790dd0a704b7ee005a58ad9b52eab4913afe4d0012babbc601d38397faa268bf1340824ef5848eed1d0c805232f600d006f7d9b303e230aa478d1e3b1d01b4917ab0025054e1cdbc9c2e51d07e750b404d47638afd67912d44d07944608d97a63a6791dc0898488d46f498f4c7684c292e1ff939204b3959ff0e28522ecd7c0394e68f8dd8b2e9d28a9fdc508faca4b53da5e415a2fd6abddefb459373d330bd47f2ee37008ab1dd8c013d2b8b874b071cccf900b0d4987d5a8ff57e5674a500e8f6a8951ea0e0f0e53740c673f7de016db901284c797d0b900b57fe027457d6b539bdbdab9cad4380ceae64bf0208cc11f57093544e010da0d24fe4af8fdf1cf0d22dc0c0d8a6e62af4ee6b67db02293bde7a421edbe10b20c624ed3f01240ee714eba37f6b2e6d1fccad95726d608815db7a2d003a16fef4e3c07eb2bb0250e46aed1ba00488dd478066e5e603a09277a19fb42cdf8ef61d900ad80324418509ff103c03acfa0ea0a3f917544c01f7d1785520e5f8f11d6090274de3fef9c902110b9aac7240eaca0b40b33219003951fcf19f408a9cbe020adeb1ff0c2853ebe4b3165031d8e7fa499372b8d8d4f8904d309e0f9b004de47b7359865c0a766b39948b0986d65e3d34e061a8cb2f80b67cf3015060e65fee01ca81df1b1c10c814d039f1437e92784d7f008a6c1e51acefab9f3f015a86f26015d0c9fd2a05345fae00b2b7e9990177d092312066465dfc0968c1fb0648e5d37d3a201fe6159069b0371c70af136df9a782f5138d6db5e58010e30ba0423eca53400d786e0c64f293ff962badc59cd49715f61db0a07937109c3c1bdbc32b012572e9094f033e022849af3a06283073f20a5022f9b5757294643a31b40d5032e937c5269aea179900ca71ef03d06a6c2b0175726a409ed268bc2ec0f4b8b800a4ac3ccb4f40c613d9bd03a25f2b0026e168bc092835728f008dcb2e350de382a3f8ed808b8d2e010d4fec7e3a2025b107f429c90bbb00ed02ae2cfdd3c59a91b8f6c513405bad1baf8041df9cb6391788be35c0136166b3acbe1590eb140174c6aa9f39b097de8d00ad52340f01ca60beb6d606838c92de3d01a09367f67da07891f8c83ef206a064e559dd01240eb35540a3b558ef801d8923402b6feb1ed0699747a5f42894f2db012fed0cb879dd5f01c4f2c6696d903193e4eac681553da91c709fd22340a6202b0172d0ca0f40ce13d36780d4c5f4c501b13ebad0f5c7f4d501f79ed363692f1f97c665139ef8b4c1fef739b14debd3c527963830b50f908cdd6f01067d78c4a6c72235928b8dc6005dbcb9f30a5096ebf45080c5fbd32fa044a42adef1efdc89809c9afc01106be37004d0516ad44592e85e85490ad09e783500b4e97761e2b04805c4ffa03f7c282f270e5802c6801c9b5de92785a99cd178c50103f50e90a22fe8d3a050885dbc006ad456b2e680fb0c7e000d205907b42894dd3707ec579e003a94d20ebd1ec689ac8a0cd0d1638fc84711a32d7fac83169f0421fd7607a08b6aefb701bafbf8deda92febbed751da030c3fa3d4067bdd6761cd84ffe3e01f2e84f05e4906c7e010a7dd0b20568f17ea5274aed37e400c51d0aebd3d485eee016a0a8c2d1014089b1d7a7808475c3e99703c261ef8014c576f000d02260a2273a24798f273cbe9eef3bb0976e518f5497edef5353d752e513c00d1f150b2ac78add612883d0715cffc5019f249b011a9df5d2132d42b7ab974aa4566240cfcec88acdca34d7b6e0fd35409756ddda7c498b226373daa6fabf2bfd77ae00bab9e5b706e83aeded584039246b009de34bb704908fbb57c0807c4c4d392e2ea82742722280f18ccf01baef62671ba06bf176de005a9df40340e1e3fc0ea0eda704e0e1d2f74340842e2ce780849f9cd0fc307159249a52ca5c3ef25f4084041573074458bf01928ffc0790038a3f07a4f23c024aec5c7ee80065b002a811fee99b00f2b1fb0e9097f3580206c987796c59900fec8b0de5229f8e6f818f1c70ed6a06d0e8afff021466d83f77604fec9a76c87d3bffe21ea023aa373380aea0de3e047844601fa08caaa31b07e4163f0074b6a97c71402cd86643fe6ff4694bd0307c927dd70179d297800470da001477281f1ce0c0536c70bfec89bd1f8092f337c7809a3ebd9c03a4a5aef61db016b381ca7d0b3c59056895d4ff036c94dd02b44a3a587360f538dd061498c68317076ca59d022474572540de78fa05e8b084057d1a848ecbf64db4f32ccd98c82b0e4c6076a87a9601fee8d34c3b23c7cbf0605ce860f0ecd36665f1ef3bcd3da0c6d73e7b0334312764f601ba9db07a06484e8f4e00836e6eb17129929897269f022883837b80d684d99503ebe48b2f40a73550035006620508739f1cc515802213d3470001c4f1e4d601a9c402951ca36d076cfbd0da604ed8e24c1c98da5a5b052873e7642e80485dd0b8a0940d6cdad82e528a7004c6005d98fb63be76e9e7d6f65200e18e917db87971e28c71793c7760127450001a5df0f80390afbd6f9abff47305f13aa0c1347eec0006f4c79959f5d2edfeee9f0372ad2936cc286e7cfc026802e57a87d60dbbcf0099f9e81fb062f7041a7a7d4a078561a0b54f804133cad651a5f7face1c9003b6973b2371e53795acdd01f449c38d2d017613b64c702bb7b7c7ab005da1b2d701b40171f90950fec7fe2f4031fab31780769ad76dce2db23bb893e91a90627072aaeec7f62e79695848b026cc055006fb0700bfdef304a05c96833b0126e11d6d496a2428de0468125e580ca54a23a6e9195577055b3e023c98113920e5ec1c50f0447a09a8b47eb973c085977f0005edb34400913a7816407d4ebf00f20b27770eac71fb02d2c97baf0ed89e642883922653f6c881fd64cd8c4595695676084cae684ff700e8a8e9ad4dc2aa2c328efc2f23f08b5b8b75aba8598f3ad864d6b7eb007dbd63cd7abd0eab026ee5b900c8005fe4006d0b5e6d002ae4e3cc647d9100c146d9d40123d739e012f34f8056af899e903f965075377c3b5f809aa97efe0c68643ccf0052b0f10ea05388f1dd01b9b4f7008d4bb10918f8c99e99b53a9ba02ee6ab808609b46a4f2cd21bac71073340a513ba578046695a3940ced587a9f126d136693602686571d7024add817801a89873c71d40b9c5193f597c7bd36c540d909dcb7a40c9b85c460ec8514c01eaf5f4dc81c9c7650cd030ec3f00fa8c8f0d9ae7d8143a90bb6aa3dffa0a67cbe66deb9b293bef005d2c106d037a56277f3ce1f1f5c314a0fbe9b6bf00527d67af02091b21670e5028534086823d3d0568180e8e00f21cd32700e70ac6bb00d763d7032067364cde000a995c56000dc39580843f19015a7a3dc900d21f7b4f0eac0bdf54ecc014db7b1760a092dc01e1b07b01fcc24bfa74f109329342938fb6a8b5e16faaaff38fb6cfccbc767ead44f6095020e2e608d07329e2f8da01094366a3ba60c5b8c9e6d301896dc700797df10a4021f9e71f802e3789f601ad4215370e48f0374bf86fa7b9ca011ab9f30340c913abdb00b773cf0045be9302a0c8d54502e818fdf319403ae87ae480b3802f000d54f4e980dd485bf076c1a873b79c4df5deef3d7fbb00e80a84551387c5d6331e4a09d0b6f1ac00e863503b67024a6f6801cac79d8e1db0d27a05e8186334026833656a2669b1f54c908997263a2df87709d097f26e670065104def013a24909899ef3d6a9d5d035286f27405e0366a0720c536fd06c85824b503c22ef4a94fc25d13ba3e180b06ead5011e3df5c8229ed859039419e11f539f7dd131b64736b307fff682dd72b6d88f208454ae00743df07e09d049f2dd4d80d4e7f9c80101119b1e830fc3392f0d2609c3b70b503effc12140ebeceb1340c5d83e7f031432c95280927c8f695c18280ec2de00342ec52a2057d47a0e706d3976c0798f2f40a583d2bb023c71b60dd05ee3c53940cb845d3a390cb6f5697e04d0345dd3133ae917df0930722b4bc76861a1f85ee3e818e0f9da870602e230fe2d40172a5709a0a2c77a3da1cb5da33d077c8ae30e30e81cdfb301dfd4495f009a0dd508a04eae0a80bbd6af00f5fafa13405f3448df0478c7fa1ca004cc9509408bc4cb1220d7fae40fa090ebc72e800b85c6e767028c5c7cef808d9007033ee76e96ebfd45c491f972782a4004cdae395f04c271e1ced6003a0c77f56dc007aa6f01fa665b9f00f42592970780f691578f04885d4cce0095ae2c3b00f8c9fa6b8006bbfc03e8e6ebfd1b036eb4ca6780f22ecef600b5a6d818a0f54b760b5008e9ba3610cc092e0b2fcd32f974a981a266bebc2d2750b2b82fc7066ae709a08cccdd5b8072cf672685b1f7e916eff0cbd5fa0690d085f1a10012347c02740c7a720a68d041ef0540129459e362d730a7ab000587935f80c23f316df195454ab11e33b8880d04a123e7db643d0ef387dc51ebf524d2d73af7ad1e8b93e55c5ec11361ee730ffc1d402bf1c9314022b55202b408e8f5522983c907c0cfdf9e3a207a6ef21174034f44078048d6f407203fe8e419506871b60928a550260069dce9034053fd3233e02ecb9d0d431ae91bdc7f56d334d669f457015dc5b0b202504edeefd480c793ff8e00f21dfa0ea07b25f70e00b52279a650826a948d6a01da4d3879016839bbd103745b631509204167530756cae4d581d5f4ed06c00999917da93700cddbb31d807ccbcb4d40cb1349eb80cf46984e4e175f4b37f0018898c8eb023ab6f763e3b2f87033b970154061db5fab5816eb5ce3dea900cbb7ded45696c4389bd116407774ff1d0a30d5d7be0072cf57d61c7009cfba036b7e3f02e8b2b9f1858120a7f68eeb1ea065d3fe2aa067e4cea97a98b764aa9c0062a9be27408e83b6628a3e0b42c8e7194dd6171fe6a54f4de872dfae5dd900e87282436b4bee3772bde6007d7be1fb02a0ab5bf308a02ce83d13fe3ccc0f94d223408aed6a1390634e362825d597e14eff004d4aa8e21c20db70590006ba70dbc676b19b60f55837d3b8f82c225b58a70005325fac6285db86fd3d8036b8cff70df8c8cd22800277931780bcf1f85100d18e4dc31441d649a06a001143796b2357946d666dd9b29f94b13e5d337f04e886f6df06d0e02afccd007ea190cdec7fe73c8f6280bc9c0d93e4e038a1948e32000180d1e80820d7e96c17a08caa6bea11a4906d0e9bd94159600aae77010d336ac3e4a30aca903bdcf700a952cece013a1350c500c5722e6dde5661b942f253eb8074c208a0348bc923a0ccd88a5f070c842957ccbc2e3ea1c375b8664e6affb2e44f0ec87515e51f4097dfdc6d00340cdb7a876e57ff3b06f464555c9a04d5611ad2c96380eecca8ac7141dfd296eb0e208ffe9c976609be65f40e48d10e3b542cab0127b436cf7262f426858b13547c89e40ca07c878d4301a4f06f049025dcaa00fa42cce1e080e5bd39df4d32d1bda323015d57f80c5094e5f40da0e4b8add6011f3d3c06e8a6a37713cb609074bed2d467f3cfaa9bf0b7c133e28632ab58abcb3bc72737023af2ff0bd0ad1ad513a0c7cb39e9008a6d55e6072de2635c1962b2deba5ebfcc0192d38d7b4042a862dbc6a58b75bbfa8d497297b43a1b9902b468eecd41eb529d9039fe16c0229fce01525b07361bba30916d18b64ca1f47e47e6db31803bffc6eb665ffa201f54ec1c90113f9dbf03b41f751c01b459bfb26dc0c561ed0390eb9b07bd80a6c72a40b92c573f00ad3dce4d7d2eb2f5b9be806253ad70f6ee018a5c5dd096d07c1ba8dd39a0c69c9c504a5ee4f693b9d574f08fc91d5c0174eff9ba89c3e0c6f3e20ea0e32e5b37805697ccda6264083e2e39df2d20661df5c74b831b88c7760228f1935f968b8074e2f7c3bcf600dde5ba7160c0bf10f35502748bc4cd314079e3d333038936dabf9e01ba49eff7c88115bb730b4819a8fe1cd012fec927067cc77b751d5092de307b02b438466b7303b95235b6961a66b126d0a5998f001d23b8de34906af976740a88e9e48f1ca0c35fa74f001d2dcf5e01f293d3158016129747809a81bada023454fd5da5a82d67542ccc7d34dd3720c546bd583d62bf44e3e8d2409862dc9d7e0450ec73e71aa0914bad94d056966fb73f007d9de1c0e463917ecbb5345340c64aeb641fa00b634eb7005a67cf7969dad0a7677f02b84ee93f80bb91001482bedf037049d368742680e778940206a6e9666420536077dd4012ebcbb46b8f007db9e70890e80ccdf0079024af6c02943a7b740bd095871b0da0575aa34961e25db8b707d00ecdcb722191a6fe51ee0d9b62a9eb8ff599812492eab3c14e7df57a5400e48f9dfe1af055c1f6d2db4a333f48ff63c566defc3b9b6259a253cff30aa05df3ed1380ae73b830e1cf526d73e40d20c51b8f32806e1a183601054237d1133ac876cc3bc21f996e266379ac4fa4bc6c184874806cf507e0eed72a806118dfd87c092b0b146cf60268718cd66d5c829ae74e95712d800e3abc0044fce484976645c6e81bf877f1d5eb00d0d5cfb7363d165ffa26492f05f4f83073d3b8857f6c70e700d0312b8f4c928b5457979c760e383e78026894f43c050c547de3dd40a61cb46d7ba2d4b523e3b713803ec6b01e1b887519d0ab8d5c99684366af74c041833380bea0bc4729890e3cbce909ad1a676f00250a3f36004fd134492e3dabe2f80f2009da3e0028361e5d190872c9c9e96380c283a73f80322394b534e26915e9937533ebb1c5fa05477113a043bdbfad01bf70ea6c03a06b472607809ab97f633d5665ca22d834a1ab23dd09b961733fcc38a6e9b78d4b9de803f4a736098375c19ace5f00fe15b33380e2749b1f007d9f709c01e48e46294071ed751b973ae72308e3758acdf9d0d778d5544e93e8fb1eeb7706d208077e5e001443b9de00687765eb4200fd71b56d20cb52f2faa6800e03bc6536bbf5fb3e376d5c5aff4ee2a6cdb97f5f865b6f003a187c383290ead6845d7e12943012b403d0c1cfeb4303a162dcb95301061dbcb081eafc73b76bf64417eb9eabf56b80be1a7a67be4397e85eebdf11409702ecf6002d79bef5846e9cbe390368e76cedd50159150e3049f7d6b8ce15cac32740d7479fdf017226e1bacdb92ed37746fe3e00f29476b6000551a78d55802e115db719d5e5723677ccac75455260094df3877ad21f87370614731c9fad035add8435030c0adb0282d6265fbb0164ca51b461080ebc96b3e6c12ebe86c4391c1b9721e1fb1ee3f5dc016a7c0cd0a9e7ef6f8052df4eccc71dfc6281c91140e92f8fab006dd7fe9a5e1f329dc25a5f6aa96ce2df9e5c01c4fa9ef8e68681447765addd02745fce6c0648b1d9d31ae029562f005de433ac003a7dc68b625de51c6f01326a7a3372808fbbe7807aa4002983c70b8032991e6f0c64bac46b96003294d2c923a0275273b563209f10ccd83b0634b9557d6da9c716af647a3c3c39b061385e0148c3c44702149bb606c29a90b4e80d80b29036ad71b1df74b4b96d20d16185bf7303ee909cf7028a165f0074aff5e587013f2ff6fb0ac0ac8dea0301f3fa46f535a0cd71256d6ce3426bb197e5240cc3a64baab7ac4f175eb03db1fa0ad0a78d3e360d789cee78c701678ac60642e5b9e9f9d8019f212e0024a38fea12a0a8755501946a7e720fa8f10b7fadb5a9cfb9b512203770670290cd3e3c01e8c2dcdb6d07f6d2c33503e1ade4d365006dd8cd2a80d209e7af801a4760fb0aa08b8c7f7e1d7037c3b7814c7711ccacd7d320b85c2973259033940520cff98e660b5072fea90d435a4e4a13984d7b22f3cf116e5a8f6589c07606f08cdda9001db46efa63e1e213ca3a01c899b830095aec4898b67cfe0528243f8b013e4d29252f722b656af2116c4589c65d2ad82cf7dbf7371b803e5fb1750cd0d718f74ce5e4a9128577f949984084a05f009ad9838d7e9eb1173daa4de5e47995330c364df3b088c675b26128227ddef5db64bd70dbb0b90328f4e1229bd945d0fc6cb7f00ef72ef67847aa3de013fd44b1f1590ed0271e6f6a0124e8c61a57848289908c002511f8fd35c08045bee21d41c66c3faabe044412ba1f4092b3f61800a9e4f40250aac76e01756e7b0576876a006dce6d6b4bb3962d5616f6d2bf5d037ecee27ed580c771bff6009a51473672a507bb7e7e00ca725de1a59e8891d8b894994eb69db4809afe38793090c72c028e6b406ecd1fd531a0cc6dfba9d64fba1cdf6100e0068eea44a040b46dce55fef5d2cd7503414b919c7f0fe85128ebf6d2cabf81f97d0e907cf4361b2a5facee25803ee3fbd9a672aa30a5d8ae3d05240a64ae0282b82f9f189b62ab6385b1f74df5d561b98ad76753accef87ac7785807e87ce57403a0349c33b3a67590313ae80ed0ab0b6d6c9b5467686e7f01b295fd29402901336b5c93e99c457c01a8887f9c98d16a42e3f8625f04c8514afb05a0345b39b2af96674d98fbd8a8274066fee9a83e0354052bf103408f0adeb3d63655db587fbc98ffd1fae708d7acd8d6077bd304b7f5db4dd78f1d7073cb3b40df9edca801ca1dddb911d0cd714f005d5f70630aa5cdb4bb72f96c2058205a6b26a95ddc1f6df5e089a2e5271b362b3baffabef57ae76ee0da3920d7490cf33ebb4c9ee346042874e78ed9ec2e681842049f068a24436072800fc3332054cdccab4dd33ed199f7ad17803cd82f1ba83ee5c6e9d9a7b5a5cf63f4e9f10fa040f59d1e1a08fdc1f1526b6d18ea92ef139ab735f8452dabd6eb43a27df5ad0f80aec4dc7a05687176689a7f487591e0c7860023d79b67105605baf1c074d0106c2301911140e675e30ea0cdc78d657fe413bf9a73e5db40accf027cac1848527a6cebcd40aa3bcbcf6f004a79af7869a6b4f9e92640dfb09b4f0de41c601fd58780ca54ce789397e6837623b70d1471c1aca41e61ce615e979d9c473eb6dfa70652e529ad5f39b097de4c00fa7ac7c639409f99bddd01140cc3fc0dd022b83f9581a0a6599a0bd47226286591ce60a29d0232346ef10e2872020053000b89d13806f448e1262f2d14fe99ce0c5443c39955ebb1d88fccac3e1bf0ef78ef4406dca73bcd01fa78c9ce3da046e5dcef1a082698e4fc358022f0d5a340c677bd1203798d35ddb27a24bef4da3b032819ecd73a3959e88725b85e37109c093244ac1e8b4c0cdc8d534045cc60cd246811fae64b2456b145609b585f06d0d7190ef7004a7e3a32495e78e3e4b1ed0332c4726dd701978876060ace368dea54a000f0d245e285a90b1bdbcc33bb56ed89cc35ff5a0e5016d2fa0d40572ffe7c1ac822dc9e4d40ae44f2eb1920c31138b1999d15758183f6016854d36f4057981efbb2291656a6f2c66df4f35429ef37170e88e4bd0332964d7bbb007d3b6ef71c50e8eae7b1814c173e1c4d008976ab63015616a7254061ecf35b803e4cf3f06520d74560c99100f6653203c419f3360254f250060341c6e8a0cc017bf33700dd89706093b048b599323d07e8fec2c13ab9d0da63bcbf01d099c4e10bd0282fd88a0dfe3a2ae7770f40078d6a1bfda2180a8cf8ab8160a348acb7d616555493eb64b372e149a32e3e00daa1d9b83690e9fea0539e0815630d0408f385f4b931408a6d6de96be78bd83841d95540ac6c861140f9c91b36fa8b2ba86dbef427805217a4984805db41aceffb07d010ee38b691ab820b4710e1ce01a76c7e0149c16d7cd64155d5d456d33513ba3ad595a9bf3b8012c1ddbd0168fb7a6d70c027a6cf001d6279730be0d6fbf15e6d209b602b57570012edc85a5b4b9f8e6a938fda15caeeb181aaa3eaebcbf55cdea4da9e7c9b013a74e1af29b6c6efa7db3c066822af9780847acc4e0015c3f0b3075006d1dc2a160641769f27825222dfc1ec5c534c58136edc02b43bfb6bfa2338bd88e5ce234047100fb60cb877f17320c02260d32c729b0f18cfe33b013913d69656ba70bc6103d585b1257a9e0174d6ebc0066a11f9e698c92720a783565380b2d3b74c82baa0a6c8c50704734b00b104d4051e5b61a0d4051853535b5d104b3299acf9c1c7d57d8e66817a37e26b0940fefaed264047998e4c29f599be80baf50b50ccf1d53a28b8c5f8967be6b1f5555f1374336d39a40aba6de7804ed78d5d0094b6b6d63b2028cb139962e3bd096ef060517db78700cf537a013444377e4d7087428918f3a53814138fc3ac3506424df9b6f10050387d7f17a03b00364f0c643a98b33172400ce5d3403005c8e9d21b2f227fe9760fd0fdc95b7f06325df830ad0ce44acfbe783410a607f91ffb06aa49858cd9137130af56d3af0a201d747405d0e26c6b0250e3d6520399dc8df36b03e11f19552b808c09346c01f28ccb09ac4f179fde6463796a20d317ea6e057400f5e8cc40aecb09ae00455e60807701ead3bd55408d1abf3e02349ac89452c666f8c61ff6937f49f12feb009dc1dbae013adbf4f903e8758ad3e423f4311668da022a24f9e801a08fd8df5907a5c138a22d7969101993f5cf0b40c154bf4e01250b9a031bca2040859dc2aa8f1d709d83f57ae64a69bb03e85e859dd8807f01f5e802a061d8b3fec8dc99782a01bab4eaa60568a3fdf2dd4040f6c4d70ea0c478ae998c2d9c3cd24eec1db90788d67b8092b04eadb579ce19ded1786c20cc07a2815340aa54e20f404eb11b56f5e0b370d5603d03642591cd23405e92ad1f017a64ec65e98f1545aa7b9dec9a9e00326d1bdbdc0f7dc8c27bfd0490eb4b35634087ba985ac58a30fa0466ec1d6518285e6ae3520685c241a55d80b606d62b80629f0736d8a5bbb4d303404b295b6b00ed241e26060ab576b6346b4595ebe289bb1dc04027ef59175675d4e0d22e8d7851bb1b38bd00c8006f1e027424e2b001e893a89bf6d23a081d67acb60129e0e601a0f3fb9ba7060a1ded3a3519abcb09d19ed7e5eaa458382456f59b1b03b92ee0fab5d606659111d91c014a427ba30d03da3b19d9774602086365adb57109fe071efd772ec004fa329ddc663aebb5b103a830af7f3540f7b19d58e3dac5e2dc9e3803c81b3fba07a4baa09e97e6da483d1f00f2c7f66d66b7a10358592ced7ed165fa56daf69b815cc74c6e4d82ba4269e2d73b808a29766623d7850e22c5db9ee8536d0b3e6f02b49f3d35a3d52fe25fd61f2630bdfb851b570005dd4e0b4082386cbf0074d46dba05d021a3d92b40b27ed30374e0f2cca67aef7ef2a90d655f273531d8a5bb510caed77705a42d7777005a78ef594d875c77421e59b143d950cac6b2947292e9bebef57303a1f96c4e57808c9a1e8c00da03defa0128d1eff5d040680dd93f3d60c07aac2d8df8e25b7268982d402eb1dc3d009444376eae006acbf7cc405018646595804a0babb981303d505b4700f681c6a76780aae4f4f589817a68ec89afa5522a635f584d770c648a3a1d1e00642cd6eda571e8427aec1a90a00bb756019946ce8621c92a4ad92e003aeef26abdbe38ba64c56e7506c26c2058ce4fc233d6fcc91e2043079d9d1aa8869a0b63963aa85c6cf9e28dd7067c39fbf90d6818dbf553c00038b47a2c7678b947601d50e15ddcf093e04ca2c6b7015586736503b5f01dc8e7174891d34313a92cd3f5af7b26a799f7e9eb15a022d8f5f36620f8a77c78640d50518ff972ee978b694b14ee15a08490db0d0102555b2b805ebdfe6c20681036ecac943c4c316e7e32a10b9aaf223fc8401156af1c307c37107e42a07bb9362d435591a0e9a5813c62ceed9c0234e7beac83ca222608b966fd5165ba7c6faf3190eb92fb2debe42a380fac4df7010daed3610118e8c25d938f2ad48c4c841c10acb69924de51b6b46567e96e94ff6ef6d92e0112ba1d9b620bf38a93f761a0d011b36f7e122a465cdbba70b195c6cae2c140f0d8c92d7e0728267db0091872ae94b197863e273e76fa0c680b1b976d537dad3b357b26b80b4b88d1ba0428bd214d0d5451c535926780b8e27293a5992f3b89d4a8ae002dbbf71b97004db183c601d6c3144a5728f4bb7308d0a599776f02f4c78d55ac2bd541d126a02fb9f6dd9474efdef8d76020d494e96142d7077793cbd57280528ad66c1806776a36f70135eee88d356e08fe274bc03b8014fd8e153b0419e34a197e12448acb097e0d5451c92509f780ac62d5b807a82a822a5f80ba2208b9f4f9ab49a254c09bc840f040ac94a7c640153391cf6240c2d83e2fb543b55812d31f5b007d22f6e4cc40e8314e72dd1b0842c72d67c706dab4e304c4b24fab38d75ef4dea681429ef45e0bd0f26d2b02f4cc97611530600a6eacd838281dceef3f011a0cdff13ba0abc8dcb162174752990de700cd86e799005ef0ee95037cfe6d03852ecd3c68014a69fefd01e42c9ab73e010572fab314dc2ad56ed3f8e31750d1c9afe7008ddcaef5c7c2e0584d0ff70125e1f42dabe922e799b587552c73b15cb56158980224f9c8405828d813ef5303414eb9396ea94fab62b10ab28a5d027af4e98eb525ac8118db9f1740a7f41793a0320c3687486ce4aa444776f7760ce889f1f40a90d0413727800e2fe7e6ce40c95ec1381b1ba8fa8aaf42760ea8e9524b55b58fedcfa1005d7864f508ca530efcc840f0ea48b0db06548ced919552575d856d58da97aa29b4d7b89e0274f9deea52a154ad2f020eacd8d667c3ef37809c89f1770128b1846f47808691bbb1891cd489a6c7e080a32a4b7facea8202e5e303d663dde29f75a18d6d57c715fb734bd358056d4a0ce5c17ed257498932b029d6d7596d8aedd9067bc80b0466f7da40a1a8d3fe18d0d141173706ea09f5385afea49e14952ead9a0810e8fe7c35103c32d2801f008385b2c61fbd812020261f339e0835e57cf67228eb28d76185b591814217f84da700cd97bd0b408b68dfee19289542f3551808624756e77228ebc58dfee8e404502063536b5c98b748f2dd1fa021ff63be9cfb61b9af4346fb57067c66e756d3ac0ec26cc3b0948f3acf6b14cad4fa345f2c8b4c4e79a2cc996273eba0a2d065a6eb35a051b07c02506ad3b6f54751eaececa755ac0c2e3c8b112ba5acb549bebf94f560b122d4e7bb40498c6d7d394debc59cc3711e1b08f603d5c7134dc44b77adf94d218f7e6fc340296ffc76df40d551b17d7b4753f7b581f8c30197232dad58dd06f79b036497804a427706a8e9b1997ed260097feda55d9ea0c6bf0f0cb8f5d8b73eedc24f485cba020c64bbdc74068244e1282e7dbaba5fc47bec1d26c97d290b64333b808ab5c7cf527dd643309e36fa07265283cbd8b6356ea8c8421a9fdb3b86266e88f42e67543389e5f4ee5f1b0882cb9c9b1ba8b4e9b753032a6239d777069aa461b5b694a0260a4a89cc8c6f034dda583c68b414cb264e943cf9151b0826c98afd9901e46cbebc1a582ce04cc63600258d9b4606822247197c01065cdaf9d2363449d052848fdf0d043f87648ee5603769a93cb6df2f40c142e2f7d740a535d0ed1a6060f17e581aa8f38a4cc83d034dd970612ea5b449cbe7b2ed1d59585b5829e5bd81f013be42b403181af2fa963e6e58675448f28f408799bfb697e6ed84527697f3a5294ae58ebea60682147263fd312038b556ec6020282e2eecaf0c3461da99485d02c2df129c2580b63115fcb4549fc17fcbe8d3a9f54759c900af2dc5b2a94a3243c7af268555952be2bc9c2f4dbdb8d87bf9c4caa781527be2ab05a002cc1a03cdd0729987fd24d48ca3e5cfeb06428f7167c68981856bb404d59581f0671944b58d7ed7462d5b7acbadd6a60f55b79f3c6f033a5b688e4f4c4efb366618fe96d6b409d314fb52da30847ab626b8c7cf80aa2533c37a6ce80a9cefefe550b69352f9743b330315a9c4e39fe550b60b079e4befae0c7411ef389c00da9e48ded23f0df50c2b3c2b6529fc6d12f4389ef4dcc042712dc1fdab812698606bed87812074d61fbf4bff7471972932b6b907509ae7f6bd81f052f61aad6259584872bfd489818a49381a9f1a08e57024621550b5c49397c2dfe6c135229df00330e0077d8e0c84050ee7a2570025db82997561eec3f0646d092e0c4ae9f8cd407806d3780da8f9c9550b183a16124bf908f626468fddbd1b0806d664ac59ce8636580614ca4f6fa0226366bc7a0f508ae6db8681857f614f2ca7695b871ee388fb0fa0e427cf3b06ea8455e3ad75e1c2be6281acd7eb3e1ad8265d2ab636cc53eceddb26a06571f66902d384a1e42b33b181a00ded89c71a50e05bae02da099aeecd64ac0dbdcec5138d81c52d1a56ca727ab45da5b493874703758f04ed5ab15db05268079b1e5d37e988f46e0022c6e57ce2c04a995b27f78b15ae159b000aeccbc114d0b26f3ab259d987ca5b9f3ecd003deae2a230d0654cc20f1ba821b8e77cf6ee0f505768cbcc407807cac05eba5006dc596eb361e8db8188e2d20077934a11e7bf4d800bccd2127651a340c44e0768b15117a5812eef6cb0cf2e016567795bcd72e4ba78b18d61a2bd6520f8f4f693c36b03e12716cc689673ae4bf24ad6b43050aaa65fad814a7187f9358015ce7877cf409df2c4c39581a085b00d77800a7dfab35c8c74c166a393e7f6441a6a8a2bf967a0c911cbfd08d0e139eee606bab825f9691da00efab10eca2a32ffc65fd780815d9eaf890382a1564a16560e6c0bee027c9ada402d72efa9c7d840982f6c40581766411cb811a303d41d17d7d850864e47a1ccadc7425b19b99f0490f2c4f70e20634df8f40e6888c26d7d0106e2305fc7069a98b5d8c71fa045b47f96ce4417bc0b7afdd95a5b844e66033335d0c634eeeb08d0e2f6ec66808eb19df00e378da75303433cb0d2b271296bc5e8bff700158dfb89010deaf3efdb40d01fdc59de002a14dbf61da0263bec2b05b4ac3da6805053ebd3b3ca405899b365632fad820a36f0f904484baefb3802f4ac3cff7e0c047d6a2ffdba01d4c8e9b680166787566cd5ca0f3ab7d1afbaa623e56c69f7bb3a686d0e9f5be36a9f0d9b534089f1dc33d1aedb029fffeac340d72274fba7068252423b980e6a82c010eafc35d04fa8c76104e8f8c99749725bf5f86373ab691b6c251eca14d0f1d2e73503c1eb47f3b7808291fb28010d32767666a06f06eefeb199dd8535300ec905a0463ee6b7809e1efbde75805eff010c38132fd6da3ebc9430f69503f6d5adea7d589913748b001a86df0a20a1fbfb75c0f906bda3d352c3d456e8d28e0b1fee0df451cfad2bbcb42f7a76cd97a6b10b1608b1fcde06344ce4f919a0a73f7e4c7083c8310cbfab0e08cb75809890da7c00244cb19f07408efef8fc34d066ccfddb15408568bfed1be8b4c279e189a0fb49485d030c92b1a5f1ec27b57ca97967a05132d8f7274016f9ef0f50a3a5765a036dcedeebdb3a409bb1f1b78120da36b63f4b81e9a3d085f4c7a381a0d7b9f1715380d19fdf007204f7e75e005ffb6f05d032f7dfd701035df8b665a05550e57d1530e0e2dfcd0d04cbcf51844800d7faaa37d0a7bdfd646539d5fbb86ed152bf568fb88958f07e3e027252027e37002555bf7f07a8eacf2b0e980deb0eb8f38f62dd58bcbc186827fce4fe0d90341c88d93110068290da362046f85facf989cbe9f7162062cecd7b4086e0fe4c004a69fee51d6d4412e72b4f042b46ba6902e85823eff0d2a082b992bb3010fed94f1eee00656f8dfb5b4a729f7a27ff5c396002dd0112467fde027249f21c50312eaffa494d88f17b1dd000e6365f52efe4876b40daa0938f013911818f2f077c92ac02c8883fa506822f4552eb0810d649f6c433a0a283222a167a84af339c38e0dae61740ca1367a503f4a9553d0bcd47b1d96c58e41bb2789f0232d2b4b66f013546fceb1f404b592767410731c5d60031fefa7e026859599cdac8655eb1f3ca01d79edd00b21e49fe0314bdd5f46be9d4f4b93b02df1b809ee9b16a8a2d6f6326d0f32a20c7f07d3c001adaf268c3907b5bdef60031cae0f90090e1053fbd3ae0c3237a22b868263029a0ec4c709f9e0c8491c3cc2f17127d11b403119255408bba98db601741f3e33a4d05a8e94e09e819cad7d84017b32a78de17605c1e678004c7e8f51190b2147ddf15a0839e12072cf05e0039ad7d3d06548027d5a3c3027d57809e1e7b180c2c24c48afd71c06723c6023dd79cef0002b2522240c9130fb78006ab7ece13438497b36a4f948be08d89c3b703de513be023f60d20458f7d9d0072c05c4f5472e0cf013512f4b80e68b0d9af11a0477f7c66063a05cc1ed7001912f4be0250af3f1e01a43f1e0f05d01f0f3da0e689cf3b40dba1b61e018ad4bcff1a08bd8ee03e3ae0fb626780b2e70b0fdb80e0d62d9f38a20bfb819fcc976e715f8559c937413f00deeb1340a64e1e014a84ffc1a4b00a269ad9700648e8a0af31205507096408ee1ea5787f7c9845ae8269c40265808269faf1e60067f3055022858f53079c8adf72c0878b9e0115729ade3a40c64a0784e5e6805ac5be3ab02766346e98b06e38bb0624036bd3a503dfd761d1cc57bb7a400278ca004d632af8a11540c33cbd013a2d4513c0c040bdde3b2067d3e67e1d8681cd944f07a8cf4b4081c3fa5901aa8e27a87a1828038f078046e1b00e3000debf1d58e3de561c108533fd5107ff1491aa0424eb0320416d3dee01b44c384801253f797f01d498b587dc810df6d3830376890707c4937f0518ca8702203df670036879c7d9c401a77c8f011d4fac98c1090a8709b43a0032067be515900b3c3ba058d3524d9873360c0f314086ef7113d028b4f7016889d37ddd0306c0672980cbf264daa1e963de71ff2da049485bc2b860c5f60518868f0290f2c453ef0083732f40e07f760ba81886273d51f3c4e3ae03ce8b65808627269f0eacd7e32f077c64a777c0b9b50aa010c1590ae8717a8fcc9c34c30409fa353fa80d2b1c6e3636a16b83c1619f9027c20ac7faf4c1a647eb0b9ad707408638dc7d01643dee054acda857075cf4b40a509cffcb64bd75a7e6f3d601072f7e00525bf90ea041b1159f00897676ee802f18de38e0f38c9d037be9e925202cf94d054f01fdff6def3d9a96c7d577dff9f91847f35f118c317546e41c4c3633e340ce2656edef7e2423586ff76af65a7bfcdfdd2acaef852c4b976edd49328f6e237dfc02fa04c0480361a87fdff26d3cbd30a55794d03d0d8d401f9b7feb425f5a31fddb0c0b0d983a1f146d34e0ea0574eb6a20d481667efb013edee7db83f5a572d401cd510319bd13b01b6920d4766efd9e6c3ff8ec6945590da4f48a8a420d7c344ccfd3c0470aada5063e36db30bf80ded1cc7e01fda7162c0d7c28ec090d849a31f7f90142bd81f956c17ef8d94c39bf290cfca4f6502e250da474687e1d6ae0a361ea730d989ed61f6b0d64b555dfd634f091d36df50b68b738ad81cf16c5f9a58140d738bf1d8140ea20fd0b65fb2fa0cfe43d35606859dfad346069e0686b20a75dda6be6036857a195d280a715ca4cf7e34bf2ed0b680ae968e0c3ba137e01fdb7b00a5f40fff99bea17d03f226a7e81f7f073630d849f55f996c2404e947eb7e9cd8734f2fa24d3e5cd7ae8597aa2a2b7da0afd8496f575a481a476bfce570d7cc2a6cbea0be8b0a9a9816fdce06b20d006b8fd662c94365b1f29ba7d017da0aca781b49ea8534d0386af83d585063e3a68f6d4c0878fc4e796503336997f01fd0b65de17d06fb7bc17b2d41efa96553cfc30f1b595f98d06d29f386aac014f8ff6d4d080af9defc8fc02da242dde801cad4e222c35f091d328d0c02701d0bf68c0d33db53f6d689162aa3bf61dfe2caf81cfe00eb9372021fdabb3952fa06f797c01fd92c0f903e8a5ee9c3490d435ba290da43e14de3560e846c79f1a56a89574bc6e650b1f5fbb6d68e06391a76b0d04bad1e94a039fb1d81af8f6d40a3e80ee69a2ac814f4fa7db0fa019738e1a48e99e3a0b0da43590196ac0d0fb2fb39b0632817e3daca50153dff28c1df830e5bb7af6778e06e61f0fb6a081503bacbbc41b906afcdd31cbd440a0c7921b69e023b889d21b90ffeb3f006b7f017d2ca9f105f40fa41c3490d68dce761af84cd4ecfa013e8df6be803e1e156920a3dbe8595f40ef9d6c35607e1ebbd44056c7eacee60be846ff05e863d1872fa0f791df24a7a539d19c0edec077bd9c8a1ac8bd93d482b6067c3dfbe78b0602ad507a6820fc18cfec1b50b2fcbe65af81d4477fb81f400fcef63590d64f49143f8096b1f4ee0bbc1bcd5ebe8026e8f31443df929b7c014dd0e716f3b3d4c32fa0595f6b20ab1b9dcebf80aeb1d280f591e4cf2db950676ade73abdec5d76f3fa101435bf5db4303c127e07daf39e33bfcd9fe03e8a758e117d0bf6d5bd080a1f9982ebec0fb96f4f60be8aeef3490d1b798952fa0ff7e76fa0bbc05c6ac6ac0d435a6ee17d0ef790e3490d5923c687c01fddb619f9e5aa1368d6f4e55865507566f0ad5cf8be98d105703f3cf363a1af0b50f73aabf011549bd197bebd38ceafcbbc64b03193dd946f805f41e5fe60b684ef35f409f203a7c01ed901cbfc07be6a681063e2295b87d01fd2ecf440359ddc6b0a2819c267934d6c05cebf5fb9b20f39b51dc6c34e06bd378b535107e72e3fd372023712dda6f75617e25a8ff010cfd94d959039fe1dbc117d0d6c3d780a9e7d6b2be807e87b7fa05f48b39af2fa0dbf034f0515b89d717d07f44e5fe05de22e5d634f05962b9a906721ab8be17e1bf529d9606beeb36f1f802efa724f35f40ff7e61f405f4d9c0f517d07f1d4a7c81376389a7063e92dc3f7e01ed5b5e3590d38da64f1a70f52df7b705b2a45fa81db477c75402511fc47035f03943f2145f40fb520f0df8daccdfde1db3a4c6d57f95dad0c0471964af1ad09c0ab7f205f44f2094bf80564a992fa07fbcc2d2402ed47fec27ab0137d431d04a03be6e63f3ee7a4eae5b9d429abd816f027175d780a7a7f2b2d440a09308b9b7ef90fbac6c414b03df89e20be83f63bed180a5453b33d1404e87b36ef10be845f8a931ffc8c7fd0be814f47b2ad5b1719de7f734f089b3c76fc6dcaf0b67871ab03441664303ba1f0c9a5f40bfda55d280fb11ba4f8db91e9c91d3c0e764d7f8ede5ccbf3a595434e085fa4f6eef34e0eb7e64061a08748dce5803f2bff768df52287df18f4e7e4fa5279bd0e71cdf06c7539d7f5b755d433df8bd2a335f40ffc67f59039eae71ec6920f8b8b4932fa04f64bed7be1fceb573d57faf5b1904e99e1abe0642fd94fb7b5e42a92df54f51be59973e9f5e409777d7651cae0df025fc023a7dacdb90cdea30f2a901fd14fb7d543406f4ef5bf23fbc7c5910ff83cbff65e19f5870ed686e479e1df97614d851181779bdb0a3a51dade2cf77597cc0bf95d5a7aced686347db3f4079b1b3a3bd1d1dece86847a7bf36728e3f2f76147df0eb3f3dee16b7b98d2f24728fcbc38e9e76f4b2a3bc1d15eca86847253b2adb51c58eaa7654b3a3ba1d35eca869472d3b6adb51c78eba76d4fbc5826d477d3b1ad8d1d08e467634fe94891d4dedc8893ffff7e55dff7d3dfb5c24ec28f9b94ed951da8e0c3bcac465121733fe2a6b47961de590216e3441887f6f1fe17e3a3389ebcc115e5c7c448008110bc412b142ace36f37882d6287d8230e882342b2ef20ce88cb3fb3808810d7bf8ee7cf51fd596443b798ac61dcb93be28178225e71c9c75d2c7c6a16e30e95106544252e55440d514734104d440bd14674105d440f6123fa719b833f3af337aee543877f7cca39cb22c608f95cf94ff9d01922814822528834c240641026221bf7cd42e47eb0e02279fdebf8c7ff4807aeacecc69ff2c661dce3be2aee1cd78b8b8f1ba822a97143dc05ee127785bbc6dde06e7177b87bdc03ee11f7847bc6bde046b857dc1baea23596be3f9f3bf94316de65a49eae7af2c0950f7ae1e6710bb845dc126e19b7825bc5ade1d6711bb892f1413cc61c6eeb170bedff9285b7087c2e643f3a1f89908d74717b9fc1cb62c7732b3b27391ae0caca23dc31ee0457b2e9c4b7cf7013b849350c29266eea23ff83cf9279cfbfbc258d6bfcd10d8964704ddc2cae859b630e73c1dc652ea56fc4dc63ee330f9887cc17cc97cc57ccd771d9fcd20beb780dff8735af9a90039e6fd563549933df31dfab39991f981fd52a50d727e667252fe2150f49aaabb162677e611e31bf32bf31bf2be99d3f984bfcc53ccfbcc0bcc8bc14af9a3f59d07ae16fe2c0bcccbcc2bcaa16c2bcc6bccebca12850c555eccc9bf1678b799b79877997794f2dd2b9fd4316e6fdcf62fe5b99fc9d85f980f990b9245b2219e613e6532581420e4c8e6ac63cc13cc93cc53ccddc602eeb98cc656f2ce6393cf0049e8b37c7f3f07cbc40b5e985780bbc25de0a6ffd57e1ffd7a2f812212720fe2ce16df0b6783bbc3dde4191283fa56af48e78a758ef5415e29dd59c7917bc08effa8305eff68732ff47163e33e0ddf11e784fbc789ee5c8e552f7f27805bc229eec4419af82279f5dc3abe335f09a782dbc365e07af8bd7c3b3f1fa7872f043bc11de186f12f75e5ecb473878b37f232266c19bbd8990022855839a6a2f8197c44bc51a413e288d672865ac44c0559ad2cb2822a48078269eac6fe1fdd28e3eb1cafdd73afc63f07f5020b9f76565177f8eefe1fbf8017e88bfc05fe2aff0d7f81bfc2dfe0e7f8f7fc03fe29ff0cff817fc08ff8a7fc3bfe33ff09ff82ffc3c7e41c98e5fc497ed97f12b1f53aac53096d3849267bf1a4bf5508dd6afe1d7f11bf84dfc565c7ffc99b9f82ebfad56a55a38b2d90e7e175fb660e3f77fb2f0cf33af2877be08fe207efc107f842f1f33c197a0833fc34fe027f1e5606405033f836fe267f12dfc1c010482c025981378043e414010122c0896042b82b55237c186407eeee2277ef5d4500973b0578220d547702038129c08ce041782486999e0fa1dfca7e75bf519c8afee4ac48207c193e045205b28fc602128fe55278fff20e55fbc282b1094940a08ca0415822a418da04ed0500b2f682af52667206811c8cf0e81acdf23b009fa0403822181ecd098604220bbe810cc081204498214419ac020c810986ae6a5fc07d98f8f24af2d821c21ca2e8682d0259c137a84d2c11dc4dec7fc4f674f8aad328a5e5e9128f577181086840bc225e1eaa776fc47ebf087f7a2b8905640393ce19a7043b825dc11ca071c088f4a2149eb109ede2b4ba98ff0acdc95f04218115e096f84127c10ca61bc08f38405c2226189b04c5821ac12d608a5cf3b8b6570a8fda2b021e9881b6f2af519b608db841dc22e618fd02694aaddfe7bcfa564b9c5cf101cd56638201c128e08c7ff672cfc5b49114e0865cf1c42d96e82304928c134a1a16c619851fe52681266092dc21c0b5808162e8b390b8f85cf226011b258b058b258b158b3d8b0d8b2d8b1d8b338b0901637a916bf1cbfd288d2e3e8b038a9014b9bb738b3b8b088585c59dc58481533f8a1da871f4136593cd4725e3c59bc58e4ff1b16926f532475526cbdcb6a0694cd9fb228b028b228b128b3a8b0a8b2a8b1a8b368b090ce991c708b85eca8ec7497458f85cda2cf423e7ec862c462cc62c242b6e3b098b148b048b248b148b330586458c8ee6659582c72cab02f6129940591f22c959c64419ae4a5ab94a2b2d389d867a92a3a967396d24deafd4b16e4986571dd98d08232644b9f65c03264b9f8c1c272a97dd27809c8c12bf95fae58ae596ed46a5cca567672c52a0779b98fa32053b5be3cb03c2ad77579627966796119b194ddbab1bcb37cb07cb27cb1ccb39475e4c04a2ce5482a2cab2c6b2ceb2c1b2c9b2c5b2cdb2c3b2cbb2c7b2c6d967d9603e5682d872c472cc76a3c725d2c272ca72c1d89c865182b0e5961162fc69b921a1ddad495cba8020af9b804cb24cb14cb344b8365e6170b663cfea15a3fd281594ab524d9b558e658c14ab07259cd5979ac7c5601ab90d582d592d58ad59ad586d596d58ed59ed541f1b83ab23ab13ab3bab08a585d59dd58dd593d583d59bd58e559155815599558955955585559d558d55935583559b514cbab36ab0eab2eab1e2b9b555f09e96ac06ac86a1487a1b1fb24a395d5582d462992729e561356b20f8ed24aab19ab04ab24ab14ab342b83d52f1656a65a81ab2c2b4bf991ab9c9acf35ac056b97f59cb5c7da671db00e592f582f59af58af596f586fd5bd32645aef58efd58cad0fac8fac4faccfac2fac23d6b2b51beb3beb07eb27eb17eb3ceb02eb22eb12eb32eb0aeb2aeb1aeb3aeb06eb26eb16eb36eb0eebaea24309ff40794af27add530eabb285a9d8168cd5b0d7b6726154fcd2893bd3673d603d643d623d662d2b4c593bac67ac133f5858cbaea758a7591bac33dae5589bacb3f1234bb1735e52ab606da922958dfc948e83943d3945eb9c8af3d554c809bcb2818d60e3b299b3f1d8f86c0236219b059b259b159b359b0d9b2d9b1d9b3d9b039b239b139b339b0b9b888d6ce4c6e6cee6c1e6194728ef58fe6bc5951723bbcae6f5b1e23d367936b10ad814d994d894d954d854d9d4d8d4d934d834d9b4d8b47fca42ecae39ef048972b6371da5ea375db546644c1ac78eca046ee4c36c36525ee4828c63eacd80cd90cd88cd988dac3065e3b099b149b049b249b149b331d8c81ecb06b36c2c3639b6b0156c5db673b61e5b5f691fe9ed4ad7701bb00dd92ed82ed9ae627efb9f40de8b95a21787c903654794357554c7a41d95eb65bb66bb61bb65bb63bb677b5088ac290de7f6c8f6c4f6ccf65796651bb1bd7e38969f065ba9de5631fd4e5cccf833c1f6cef6c1f6a9d68ba82b8fc55b2b0ab62fb6792523db02db22db12db32db0adb2adb1adb3adb06db26db16db36db0edb2e5b39609badecfa4005c2db2bdb21db919a4c6911b763b613b6d3384c964eda5db120d5449cbc88a3f2be0a6455626aaca2b8adc3567eca1e26d9a6d8a6d9ca516462416e2bd19676641bfb63dbec2f162cb6b90fc7e5d86f1f7f8cf0e41f021be914ed6027d46c48cdb4eea925ba73150bbb393b8f9dcf2e6017b25bb05bb25bb15bb3dbb0dbb2dbb1dbb33bb03bb23bb13bb3bbb08b5460b6bbb2bba9d527e322d5947cca438549ca4e0f63a53088f35a4fd5c9dd1357ad14762f767976057645762576f2ab0abbea5bbad582ddd59423236d879268f994fa0f16760d764d765221c9feb555910192b48bd275574ee8df5870145f5203c959921a71d761d755da48065abb1e3bf9d43ebb013bd9bf11bb31bb09bb293bf9f819bb04bb243b49599a9dc12ec3ce64976567b1cba919936a45dce378b1a9feb987bd88b5e3205e9b37e517b86535a5ca1c286dc5de653f67efb1f7d907ec4315daed17ece5e78afd9afd86fd369eaaa1ca7dec773f58d8efd91f54e2607f642feb9d957d92be8a0a63ffe6503bb1e2b8282dbdbfb08fe2fa57f637f677f60ff64ff62ff679f605f645f6b29765f615f655f635f675f60df64df62df672901df65df63df636fb3efb817296f671164ba546648591f259a4b8edc7ec270a5109b55852f6b2038eca71ec67ec13ec93ec53ecd3ec0df61234d967d95bec735248639d3253eec6010e3f32f11ce4d7730e9e9a5b698d0fbe8a736353fc4f6ee99843a0b20c8790c342d53c2c39ac38ac396c386c39ec38ec391c381c399c389c395c38441cae1c6e1cee1ce4bd4f0e2f0e790e050eb285128732870a872a875a9ce09d297193537da87368706872682971935ae3d0e6d0e1d0e5d0e36073e82bb74d2ae683ecf990c38883eca1fce79483c361c621c121a95693b4205b9343ea170b69a58abd4bec38eee2f1ff43f65df9a4aa7f49153b49c139181c32717da1264796837c4636beb038e438c251707439ce397a1c7d8e01c790e382e392e38ae39ae386e396e38ee39ee341392672c265847a3c723cc54f2c713c2b9754d22115fef1c231e278e578e3785711f7f1a1e64f7df5e4f8e298e758e058e4286f2c73ac70ac2a7b7face94e1e7fe9856343a58fb5c03bb1afdaf95c3b5f4662477df889529cb727a312c772891e6569716c73ecc44fea72940fb639f6390e380e398e388e394e384e393a1c671c131c931c531cd31c0d8e198e26c72c478b638e139c042757c551a739278f93cf29e014725a705a725aa9a4be4a82e6950a942c9c64d970da72da71da733a703a723aa96cd03b157e3a73ba708a7eb070ba2ab52457fbe9a654bd1a9b14f5766c2946b1ae5abc63954fc675f7c9fc3d63fade9b087d55f374e7f4e0f4e4f4e294e754e054e454e254e654e154e554e354e7d4e0d4e4d4e2d4e6d4e1d4e5d4e36473ea731a701a72924d8d39bd7737b29ca69c1c4e334e094e49b5344e294e694e864aba9f329c4c4eb29ac529c719e5809c85525e52c5beb3d26797f39cb3c7d9ffc1c23950f1d239e4bce0bc54690951fc64999c4fec3454abe6bce2bc56ba436a10a523b7ca633d6fd48ca98cb3c959b6b3e3bce77ce07ce47ce27ce67ce11c71be72be71be737e707e727e71ce732e702e722e712e73ae70ae72ae71ae736e706e726e716e2b0374964fe972ee71b639cb7f0e380f39cbb18d394f384f393b9c679c139c939c532abe3aa795299186f66c70ce70967dcb72b638ffca3b5ee0223f5d2e73c5c2c58bade3e8af79a7785fcc6d28222e3ec27a277362df29a562384f6dbd7109b8845c165c643bb2e69acb86cb96cb8ecb9ecb81cb91cb89cb99cb854bc4e5cae5c6e5cee5c1e5c9e5c525cfa5c0a5c8a5c4a5cca5c225ce235f6a5cea5c1a5c9a5c5a5cda5c3a5cba5c7a5c6c2e7d2e032e432ea338432fa3182b5eb6492e632e132e53a571e56abd38bf589871497049aa15286758394e833fb26f7fd92693abe3b35326594b29ad7e497331b8480a4c2e592e16971c11c8962317199e461e914f141085440ba225d18a684db421da12ed88f64407a223d189e84c74218a88ae4437a23bd183e849f422ca1315888a4425a2325185a84a5423aa1335889a442d356c95f26bc55b81f2ab366a93761287cb696532d586ed3fb210f588e21c86db546bfb2c23d0769cfffcfb0e55bc2eae8a639505cb204309e944aba647480b2ae545d691dfca474a69945a568a499446bae4524ce47a912b3cb290427485abe0ea729d73f5b8fa5c03ae21d705d725d715d735d70dd72dd71dd73dd703d723d713d7b35affd259be5eb8465caf5c6f5cefcab3925650bac9f343bc5132e5fa88530c43ae4fae2f1968c4dee7304e35ff230bd73cd742ec66cbd68b5ca5ef7d893de8f15f5da6691c3eef94c85ccb6a695c2b6a5fe45ae55a8b2fea5c1b5c9b5c5b5cdb5c3b5cbb5c7b5c6dae7dae03aeb24f23ae63ae13aeb2a30e57f9c404d724d714d73457836b86abc935cbd5e29ae30637c1cde536e7e671f3b905dc426e0b6e4b6e2b6e6b1986bc9557ec6ef5fe6ae0ff9cc2411c2eff62e1a6f651558c78db2aaff3b653eee76df7473a3cd60b3282beedb91de23df834b7a36241f27d3b713bab2577bb708bb85db9ddb8ddb949e4c9edc52dcfadc0adc8adc4adccadc2adcaadc6adceadc1adc9adc5adcdadc3adcbadc7cde6263b33e036e436e236e636e136e5e6709bc55bf237e53e8517652c9443e9c65dfdc74dc63f13d3ca15e6f62bbf704baaf8fc96e296567a7e2e7b6f286ff2afa706e2867c955c5691e55da577826bbc533255fea9f4f36e196e26b72c378b5b8e3bdc057797fb9cbbc7dde71e700fb92fb82fb9afb8afb96fb86fb9efb8efb91fb81fb99fb89fb95fb847dcafdc6fdcefdc1fdc9fdc5fdcf3dc0bdc8bb2c3f1e4f7555ac1edfe5bd437f994bf9dc598fc96857b897b59654d64887eaf70af72af71afc7dbc4938f37a51ff3deaad1fb65caab8f7330a11c70837b937b8b7b9b7b877b977b8fbbcd5db639e03ee43ee23ee63ee13ee5ee709f714f704f724f714f7337b867b89bdcb3dc2dee391ef0103c5c1e731e1e0f9f47c023e4a19c17b527eefa4a85a98bce67e4ff9b6df7cfba782c7f79d029359f321a7fac78ac796c786cd58182fdf8af3b5f139d1a8ff794e3cdb2d13b0dc563c763cfe3c0e3c8e3c4e3cce3c223e271e571e371e7f1e0f1e4f1e291e751e051e421ef2af3a8f0a8f2a8f1a8f3686863f668f268f168f3e8f0e8f2e8f1b079f4790ce2f0ff165bb1aa4a8eabe5b08c27e6bfa140b93fbf776b1f431e231e631e131e922d87c7ec3d4efbaffbc52cb3d25dd5db1e32f47e24941fe949fa923c523cd23c0c1ef29ff2ab2c0f8b478e273c054f97e79ca7c7d3e719f00c792e782e79ae78ae796e786e79ee54f2e6b9e779e079e479e279e679e119f1bcf2bcf1bc2b8e9e0fb50df17cc612515241879441d190c192d28ecf17f3e2dbd979ef21c45989ab8a4455ba65c0f3d77ec4b3c0b3c8b3c4b3ccb3a20c5270c00dff6dab4a0ea3cab3a6cc920c25a5a5f0d5d69ee2e25957dee7b3c1b3c9b3c5b3cdb3c3b3cbb3c7d3e6d9e7291f2fbb38e239e639e139e5e9f09cf194f72679a678a6791a3c333c4d9e599e16cf1c2f78095e2eaf392f8f971fe70413f1c6f440e55ad576c98457c02be4b5e0b5e4b5e2b58ee5e5aad3939282dd132f8ca9717ec794af0daf2daf1daf3daf03afa36ae5fafc9ba6552ca8345cac1da4bff0525e739cf0edc5e78b32bccebc2ebc225e575e375e775e0f5e4f5e2f5e795e055e455e255e655e155e555e355e755e0d5e4d5e2d5e6d5e1d5e5d5e3d5e36af3eaf01af21af11af312f39da292f471f1790167d7e56bbc7d25b7bcd7825782579a578a5556425031f69ef5e86fadc3d55e725652f59d3e4f52be3f6b278e5c8435e9077c9cfc97b84fd7fb337efe3138eda3b5381bdad0eda481d296521ef930fc887e417e497e457e4d7e437e4b7e477e4f7e40fe48fe44fe4cfe42fe423f257f237f277f20ff24ff22ff279f205f245f225f265f215f255f235f275f20df24df22df26df21db54520c3f97c57a9f37c8fbc4d5e5e0cc80fc98fc88fe3c30b0345417ec2de89cf56c9074dc93be4673f58c8cb6124c9a7c8a7c91be4336a7dbaf63f9cee5281d64b79d9174fe5daf2a6ca0ee5b3e42db528f2390a5010145c0a730a1e059f424021a4b0a0b0a4b0a2b0a6b0a1b0a5b0a3b0a770a070a470a270a670a11051b852b851b853785078527851c8532850285228512853a8284fe1588b8d65bcf552a852a851a8536850685268516853e8c4f9b8774a2a196f5815955a29fcf2a00b3d0a36853e850185a192ba50fe73f437167470edca518d294c284c29381466141214922a3b564851482b67bc6050c8503029642958147214a12828ba14e7143d8a3ec5806248714171497145714d7143714b714771af9c85e281e291e289e299e285a244ae146f2a612d559dcabebeb7aa6714ef141f149f145f14f3140b148b144b14e324ade4ab58a158a5282fea141bbfa229876293628ba2caf6c5fbdc4d152cbb6e9cea964b71f73e53103f550ea943b14bb147d1a6d8575656aeb7a51cc980e290e2484978714c7142714a51362e3b9aa098a498a298a66850cc50342966295a147394a02428b994e6943c4a3ea580524869416949694569cde6a5ce29953694b6ca10482294b310a84fa9984a3b4a7b4a074a474a274a674a174a918a1d4a574a374a774a0f4a4f4aaf5f7bd6b61295529e5281529152491ddb92c8a610e77fe353a67215a8adf4a162a154a654a154a554a3545759d35283529392ec659b524769ca529792ec9c4da94f49561852921d1a539a509a527228cd2825282529a528a5291994e45d26a52c258b528e3294056597f29cb2d45319f568e9328b3855ff0efc96fbf8b4a547d9a71c500e292f282f29af28af296f286f29ef28ef291f281f299f289f7fb050be289dff7c2a29284794af946f94ef941fb182d8c6bbf8fb4feac951867a1e6f9f969f6ac0ee83f28b729e728172917249c55ae5b252d14bd960857295728d729d72837293728b729b72877297728fb26ca74f794079487944794c7942794ad9a12c6f4f504e524ea9a45e391d1b88382babce72856affa26ca863b4928e7286b249394bd9a29ca3021541c5a532a7e251f1a90454422abf76ee2b4b2a2be587046da57555ae6d4a654d6543651b5fecdedb61b18d1851d953395039aaa394959312a2ca99ca854a44e54ae546e5ceda8e6d6a92ca83ca93ca8b8aac56a052a452a252a652a152a552a352a7d2a0d2a4d2a2d2a6d2a1d2a5d2a36253e9531950195219290d5f195399a84952a78a67ef43d3f151d3bbb2821559c1a132a392a0229f9ba292a66250915f9954b25462155ef9956baaa2763ec5506f01498ee538251d8b58af566505e53bb29c284190a09285b2faea0cd5b932c5558faa4f35a02aaf172a772ef2f1f94d892fa9aea8aea96ea86ea9eea8eea91ea81ea99ea89ea95ea8466a9faa7aa57aa37aa7faa0faa4faa29aa75aa02afb50a25a563b83d50ad52ad51ad5ba52132a14369574541b549b545b54db543b54bb547b2af15db5a9f6a90ea80ea98ea88ea94efe99053b5ac7eb7f1ee7144c25c65235c6daf17dba23f6144ab63e71e6c60ae27dfcdb53a454a7541daa33aa09aa49aa29a55cab69aa06d50c55936a96aa4535470d6a829a4b6d4ecda3e6530ba885d416d496d456d4d6d436d4b6d476d4f6d40ed48ed44e4a9a6a67b5366b176a11b52bb51bb53bb50735f9d58b5a9e5a815a915a895a995a855a955a8d5a9d5a835a935a8b5a9b5a87da2f4b59ebfdf585009d5691747c90a43e2c21c33875d847f145cda6d6a736a036a436a236a636a136a5e6c45fcda8259440d564cd14b53435835a869a492d4bcda296a30e7541dda53ea7ee51f7a907d443ea0bea4bea2bea6bea1bea5bea3bea7bea07ea47ea27ea67ea17ea11f52bf51bf53bf507f527f517f53cf502f522f512f532f50af52af51af53af506f5e6ef7dca7f62e1bb0111db4bd9682b76c54d15472a399c516f53ef50ef52ef51b7a9f7a90fa80fa98fa88fa94fa84fd5f90a1908d71deab27e827a927a8a7a9aba413d43dda49ea56e51cfd18086501bfc0d97c69c8647c3a711d008692c682c69ac68ac696c686c6574ac52e18d1d8d3d8d038d238d138d73fc79a111d1b8d2b8d1b8d378d078d278a9bc79234fa340a3f87fc882b4c6c15d6d90374af1db007da511e51268946954685469d468d46934683469b468b46974687469f468d834fa3406ea306e63486344634c6342634ac3a131a391a091a491a291a661d090e33769646958347234a12968ba34e7343d9a3ecd806648734173497345734d7343734b7347734ff340f348f344f34cf34233a279a579a379a7f9a0f9a4f9a299a759a0f95fb1f0899da4fcabbd69a15888b789e3806a48b344b34cb342b34ab346b34eb341b349b345b34db3a362ed6697668fa64db34f734053de35a239a639a139a5e9d09cd14cd04cd24cd14cd3346866689a34b3342d9a395ad012b45c5a735a1e2d9f56402ba4b5a0b5a4b5a2b5a6b5a1b5a5b5a3b5a7758829b8a8cfd69196fc3cd3bad08a685d69dd68dd69c5e7fd5acfffc8c2fbdd9cf127881c28161aa5f824a6ecc18b569e568156915689569956855695568d569d56835693568b569b56875697568f964dab4f4b3e7b486b446bac04a135a135a5252f66b412b492b452b4d2aa972d83568696492b4bcba295a30d6d41dba53da7edd1f66907b443da0bda4bda2bda6bda1bda5bda3bda7bda07da47da27da67da17da917a3fa67da57da31da727da8fffc8c2e473602166413aa7d20eb79fb45fb4f3b40bb48bb44bb4cbb42bb4abb46bb4ebb41bb49bb45bb4dbb43bb4bbb47bb46dda7dda03da43da23da63da13da53da0eed19ed04ed24ed14ed346d83b67c8a493b4b5bf63847073a828e4b674ec7a3e3d309e88474167496745674d6743674b6747674f6740e748e744e74ce71b9d089e85ce9dce233575565d13b77759ca3f3a0f34b163aaf3f5e8299aa3385ee525dc8e5d7c9d329d029d229d129d3a9d0a9d291cdd5e934e834e9b4e8b45550d8e9d0e9d2e9d1b1e9f4e90ce80ce98ce88ce94ce84ce938746674127492745274d2740c3a193a269d2c1d8b4e8e2e74055d97ee9cae47d7a71bd00de92ee82ee9aee8aee96ee86ee9eee8eee91ee81ee99ee89ee95ee84674af746f74ef741f749f745f71baa948374fb740575e94fe030befb33c6abbad5ba65ba15ba55ba32bffd9a0dba4dba2dba6dba1dba5dba36bd3edd31dd01dd21dd11dd39dd09dd275e8cee826e826e9a6e8a6e91a7433744dba59ba16dd1c3de8097a2ebd393d8f9e4f2fa017d25bd05bd25bd15bd3dbd0dbd2dbd1dbd33bd03bd23bd13bd3bbd08be85de9dde8dde93de83de9bde8e5d5e4f70af48af44af4caf42af4aa5c7c65e916b27e8d5e9ddeaf98325e11ea6461af49af45af4daf434ffeb347cfa6d7a737a037a437a237a637a137a5e7d09bd14bd04bd24bd14bd333e865e899f4b2f42c7a396cb0e3a30dfb2db68b3dc7f6b07dec003bc45e602fb157d86bec0db6acb3c3de631fb08fd827ec33f6257e17f88a7dc3be633fb09fd82fec3c7601bb885dc22e6357b0abd835ec3a7603bb89ddc26e6377b0bbeac8f24a5ef7b06dec3ef6e0070bf650858f1b5963843dc69e604fb11dec1976023b899dc24e631bd8196c133b8b6d61e7e8435fd077e9cfe97bf47dfa01fd90fe82fe92fe4a51d05fd3dfd0dfd2dfd1dfd33fd03fd23fd13fd3bfd08fe85fe9dfe8dfe9cbca4ffa2ffa79fa05fa45fa25fa65fa15fa55fa35fa75fa0d15b9f49bf45bf4dbf43bf4bbf47bf46dfa7dfa03fac3b88ce88fe94fe84fe93bf467f413f493f453f4d33f58e81b4a66fa19fa26fd2c7d8b7e8e010c040397c19c81c7c067103008192c182c19ac18ac196c186c19ec18ec191c181c199c18a8d095c18541c4e0cae0c6e0cee0c1e0c9e0c520cfa0c0a0c8a0c4a0cca0c2a0caa0c6a0cea0c1a0c9a0c5a0cda0c3a0cba0c7c066d0673060306430623066305131e560cac061306390609064906290666030c83030196419580c720c612818ba0ce70c3d863ec3e0070bc350e50e870b864b862b866b861b865b863b867b860786478627866786178611c32bc31bc33bc307c327c317c33cc302c322c312c332c30ac32ac31ac33ac306c326c316c336c30ec32ec31e439b619fe180e190e188e198e184e194a1c370c6507626c930c530adce220f0d86198626c32c438b618e118c042397d19c91c7c86714300a192d182d19ad18ad196d186d19ed18ed191d181d199d189d19fd3af5398a544271746574532b6a7467f460f464f462946754605464546254566fb48c2a8caa8c6a8cea8c1a8c9a8ce42d6d461d465d46bdb8419b519fd180d190d188d198d184d19491c368c628c128c928c548b66630ca30321965e36231ca3186b160ec329e33f618fb8c03c621e305e325e315e335e30de32de31de33de303e323e313e333e38b3296e388f195f18df19df183f193f14b85a44197f1affd885afc4ad6b8c0b8c8b8c4b8ccb8c2b8cab8c6b8ceb8c1b8c9b8c5b8cdb8c35836d4636c33ee331e3096378e188f194f949b389e327618cf1827182719a718a7191b8c338c4dc659c616e31c13f56826b2b84ce64c3c26be6261123009992c982c99ac98ac996c986c99ec98ec991c981c999c989c995c98444cae4c6e4cee4c1e4c9e4c5e4cf24c0a4c8a2a969b9498949954985499d498d4993498347f6b4719264f5a4cda4c3a4cba4c7a8ad789cda4cf64c064c864c464cc64c264cac4613263221f9364926292666230c9303199c891584c724c612a98ba4ce74c3da63ed38069c874c174199715d335d30dd3ad62418a8322c264ba63ba576a757a607a647a627a667a899188e995e98de99da9fce793e98b699e698169916989699969856995698d699d69836993698b699b69876997698fe9afb74a250bbeec5c5f8d7f3a603a643a623a663a613a65ea309d314d304d324d314d3335986698ca1e67995a4c7338e0081c17678ee3e1f838014e88b3c059e2ac70d6381b9c2dce0e678f7388cb11e784738e298889908c38179c08e78a73c3897d5e479627ce4be5179c3c4e01a78853c229e35470aa38359c3a4e03a789d3c269e37470ba383d1c5b297ba78f33c019e28c707ebd37e54c70a6380ece0c278193c449e1a4710c9c0c8e8993c5916de598c14c307399cd9979cc7c6601b390d982d992997a3d8dd93a2e1b665b663b667b660766476627666766176611b32bb31bb3bb72ab660f664f662fb522667966056645662566656615665566356675660d664d662d666d661d15e3cfbacc7acc6c667d660366436623666366136653660eb319b304b32433f994343383598699f98385997cbcc52c47021282844b624ec223e19308488424162496245624d6243624b6247624f6240e248e244e24ce242e2422125712371277120f124f122f12f9bf14b9221285b814499448944954485449d4e28b3a8906892689168936890e892e891e099b449fc480c490c488c498c484c49484436246224122492245224dc2209121617291df66d58a48582472242119bb7049f7070bc939498fa44f322019925c905c925c915c93dc90dc92dc91dc933c903c923c913c93bc908c540e2379257923792729af9ff120f3245f24f37179e9f21f58a8912cc49f4592259265921592559212a9936c906c926c916c93ec90ec92ec91b449f6490e480e498e488e494e484e493a246724132493245324d3f1c80d9299f850ae1cd72f594866495a2473a4202548b9a4e6a43c523ea98054486a416a496a456a4d6a436a4b6a476a4fea40ea48ea44ea4ceaa25850c38b079f8a3e447ce8f88f2ca4aea46ef1e79dd483d493946c274f4a7e5524552255265521552555235527d520d524d522d526d521d525d5236593ea931a901a921aa9cdfbd49854bcbd2283cbd494d4af937ea919a904a924a914a9342983544669ca94492a4bca2295230d6941da253d27ed91f64907a443d20bd24bd22bd26bd21b65fcff2508f9bf1391de92de7d5828c42c54340bb2a4f7a40fa48fa44fa4cfa42fa423d257d237d277d20fd24fd2b2913ce902e922e912e932e90ae92a69797b9d7443bdb2926e926e916e93ee90ee92ee91b6f591ea749ff4af38223d242d6f1e939e909e927648cf48274827958e48a748a7491ba433a44dd259d216e91c061802c3c5986378183e468011fe60e1df65a1f42915bd1c8c05c652b160ac30d6181b8c2dc60e638f71c090f809e38c71c18830ae18378cbb1207e381f1c47861e4554ec5286014314a18658c0a4655e5c483bb3a85239d43a3f68305a38ed1c090cdb530da181d8c2e460fc3c6e8630c308618238c31c604638ae160cc301218498c14461ac350edc8b1fd4d168c8c2a5fed20cb5f5828ff6b45182646562d07430e23470632828c4b664ec623e3930954a89209c92cc82cc9acc8acc96cc86cc9ecc8ecc9c86f8f644e64ceeafc5de6422622732573fb1c538b33c999fb0f16320f324f322f32793205324532253265250b7245642a64aa646a64ea641a649a645a64da643a64ba647a646c327d320332c3bfaac6ff9285783964464a2948a1c88cc94cc84cc938646664126492645264d2640c321932a65a9819d9318b4c0e134c81e962ce313d4c1f3350c785cd107381b9c45ca9370445fc16a264c15cff60c1dc606e3177ca46987bcc03e611f38479c6bc60469857cc1be61df3a128309f982fcc3c6601b38859c22c635630ab3f5990b8520adb3f9442f153621b2905c18ce930eb980dcc26664bb160b6313b985dcc1ea68dd9c71c600e31479863cc09e614d3c19435139849cc14661ad3c0cc609a98b2590b33a77692e6c7f8ecd32f16b290959f2ed939598fac4f36201b925dc42c5cc92ec9aec8aec96ec86ec9eec8eec91ec81ec99ec8c6a1b474fbb297789cf97f500d5f4b2915c7bbfccd4cbc9783741cb21159f9c41bd93bd907d927d917d93cd902d922d912d932d90a5959b346b6ae166cb641b649b645b64db643b64bb647d656d29ded939515866447b8294544e7d7ce7d764c7642764ad6213b239b209b249b229b266b90cd9035c966c95a64735860092c176b8ee529a7d3526f1c600558e14f16beda518fff4f6359d2aad15a28ed602db156586bac8d0ad8ad2dd60e6b8f75c03a629db0ce5817ac08eb8a75c3ba633db09e582f2c59bf8055c42a6195b12a5855ac1a563d560d43b5a566fdcab8594dac16561bab83d555c6d2ea61d9587dac01d6106b8435c69a60c9313b5833ac04966c3185252b1b58192c3980ec7f60415bcaf742f88305a50e46ea53b220f5826561e5c8414e9073c9cdc979e47c9501cb05e442720b724b722b726b721b725b723b727b720772477227726772177211b92bb91bb9bb7a5576151f50f9f96640ee41ee49ee452e4fae40ae48ae44ae4cae42ae4aae46ae4eae41ae49ae45ae4dae43ae4bae47ce26d727372037243722372637d173fed6854a29fc41815c32ff52077f8883f294aeda77dac811cad13ae466e412e492e452e4d2e40c72197226b92c398b9c6488f89097da3812eab77f7ca17ef82414ea271f9642bd25bf16ea65e7ad50ef7eee99cb8b83e0f8cf2c08f58ad259a83745d40179a10ea1df853a7efb14eabc615ea8135b45a14edd94853a1b51156aefb92ed4d66253a85da4b6505b085d81f4f9657d5b0df8cdc29fdaf1ef2cbc2fca5a10621684ca640e84ca938d844ab64c840ad165c42ac33819e4c86040bab7d28193be8ab4a5d23c48952697684e284ae47fae1073213c217c210221422116422c993f845809b116e2c7af5609b1156227c45e88831047214e4248e7a423c44508f9f555889b10772164434f215e42e48528085114a2244459888a1055216a42d48568685ba04d63fe370bc57f794dbbcdbf58104d215a42b485901de80ad113c216a22fc44088a1102321c6424c84980ae10831132221445288941069210c21324298426485b084c8c587762533ae70e7c2f584eb0bf747de51b8a17017c25d0a7725dcb57037c2dd0a7727dcbd700fc23d0af724dcb3702fc28d847b8dcb2d06efc27d08f729dc9770f3c22dfc6be44646b845e1963ea5f85e1dc22d0bb7f22e32ee146e35f6208a4a5fc88bb4ca3e08b726dcba701bc26d0ab725dcb6703bc2ed0ab727759c70fbc21d087728dc9170c7c29d08772a5c47b833e126849b146e4ab869e11ac2957d30859b15ae25dc5c7ce4400aca8f98f27f6af9bf2cfc9585ffd1e5fffd5fffdffff3ff03bed571c3</data> + </image> + <image name="image8"> + <data format="XPM.GZ" length="74946">789cd4bd4973033d92a679af5f9156bc958db1c9d8e33007915a2852a424527bdb1c6295b849a2289292facf7710ef03644dcdb459b7755fea53665a3e5f04230087c3e1703810ffe5dffef17433fec7bffd977fd97e67dff3e21fc55bf6f58f7f2b77ebf5ef7ffd7ffeeffff62fff9a44ff68fee3c77ef80fef5fffaf7ff9d7d9fc1fc53f5a1d3f08c2e0c8796db8f0bc6e7ee4e2d270d94dbb1d73ff9b3828a3d05c1f18aebc4ed73f72fd65b8ee763bc991cb17c7d591b3b6d80b3df3bc560a175d73bd2957c3dd4eb7d331efaf3770b763de579dc0be9e5ff51ca786ff1c9bdfe7af70d135bfcf0a7153bfda946f6fb8dbf5f4bc2c177b8167ee2f9f0d7bcdf5d23cff17f63bb1b9de716cde9f77e1a46bae174338ed1a79672d71f38fa97fe7dbb0df3c5ff5ff817d713182a38e296ffe06a7aa4fceef1bf99bf62b2e60e43d53fdfdd08fccfbeaade1a079beb9ffa5726c9e5f7fc3412732f5fb8443c9b37c8723b57731155b7dc92ee0e6df98f64dc47ed835f27de91b0eedfb5e7a96a55f2f5d3810971b38ec64463e91655d2faee1a85398f6b1cf4fd45ecb1b38557d569633b55719c0563f06702dfdc84ab11775cdf3670bb19f0446be1dd52fb2e57d291d77cdf51d1c8acb2e1c214f0f8e3baaef876353fe7c6e59ed9b4bdf22afabfe325bc245609eef499e71a34f6acf4fd857ffc93dc7eadf5770207d7e5b3836d73b051c4a7f57d7702cf9f907cbba5edcc089f4af3a855371fe22f6d2aea95f762ef6134fe5191b4e9af636fa92fb8e4dfb772f2ceb7df3398c3ee64b38d6fbe6a163f59f8565b557f7c1b179decb8963f3bce5359ca07fbf9675dd8f1d9bf6c94670aef6ae6e1d9be7e75bb8567fa8a68ecdf3b34cecf99e799ea7f2a4569fca2f3892fcbd396ccb5f3856ff7e84295fe70a4ed1a78d63f5f7039c7524cfd8b2e4555fc3b9ea9f0de142bfcf2ee14afd27977d49bdba6bca3b577fcb9af634fae6ef2dabfce5371c49ffcb9d63e98ffd7dacf678e9c089faefe209b6fab6b2acf277f68ecdfd9d08cec4a50fe7e84b6259f2cfbfe042f63dabc58dc135e599c161199aeb73d9ebdcd9cf27c7b2573f70247defae2d4bbeeb5b98fabecd1d9be7bd7ec189ec79b9756cae7ba79669ff12a6bdeb1d9cab3c8b47c792bf2d4faefbf3082e18cfaee00afdb7e5ad3de987da3ff74ad9ab4afa5358fbe12596d1c74f38517be51f70aaf275523893fc5ffee09cfe7406178c9f13b864bcba756cdabb86bd4ce3d75af6ab6cdac39467eec389dac7ffb3acdf571338d5f3477d38c37ebfc339fe897d7ec1f830864b95bf683bd6ef53d8ca57f6a274e3abfa67e9d792c793f4a96c065c539f0fd9dbaa919f91a7d7b7acf6bcb4d769ffe1b563233fefccb2ea7bf90c17baffe5c9b2faf7cb0f5c8a9f6fe04a5cdaeb35f633716ccafb24fb5a054924fb2dffa56edac3dcffb68419dfbd14461ff2102ef02f5ee052fdb3f30b57e2e75b18fbfb217b5237fe949197df776cea7bbf80bbb26f776f70e899f79f4770a2fa6633b8c0df957f5107916fe43f31fae5753ab5f4ebe2466cfdaffa034e642febcab129cfeb164ea54fcb5b3813bfdfc1d8b3eebb65e95bd9762cffdcbebf40dfaee192feb8862bd997975fcb6abf8efd3ded590dc4569ef58d63d39ecf7f8ecdfdf74bd843de2bd8a7bcbccf8b25cffb0c2ee4af172db8f4ccef2766bc685a8bf9c3600ce3df7ccce050f279b79ce8feba742cff7f0d33be745a30fa5f5e3936fa54d9f795b297974f70a5f70d6f2cabbdb2095ceb7d9d8365c9e329155b79551770177fe3dcb191ef4be6d8fcfe6e0127e8efdcb2fc8dfc59ece7e2ca8cefc7d6d0f38613b854f99f32cbaaaff70633de77eec5b6ffbc3c3b36f57bb0dc153f5dc19ef87e0efb9e69ffbb0a0e03d33e77af70ec99f678b3bf4f3dfdbe8473f5b7e20bc6dfbfb3d78bc094f73e872bcfd4e7debeaff6e59f8762bfabfadd71bf1f06a67c7b33fe7bbef55f3609cc78b7bc84938ed187f585638d376dc7a67ccb8163d3ff5fdf1c9be7ad4670da51fb1f60e637d53b9cabff3d7460fa6bbd876bb5e725d76d7f1dde3a36edff143b963e468ed53faee0aeea9f8d1d9bf6e90e2cf3fbc4b1f4fdc7b1b9bf9ec09ec62bbf07fbe8cbd8b1b9fffe158e349fb8e8c2b1ea3b5bc189dab348e14c3c1fc2e87fa1fee4fb1db577be839b19e191c7663ee5054d8734cf9f8470a0f16aec3b36fad1af61e613b565c6ab4f7b7f29fda8467085bf7109d792c743e5d8c8b356fd83664431f2184e2debfefb0fc7a63c4fb963f97b2db8abfbdfd6b0a7f7bfd48ee50fb51debf76398f9e4676059e349f509e3ef5733c7467e3ef56fec91ecbf7d5fa1fe7d5788fd6e60de7797c16960daef49e3491026b1ec81facb311e60fac775e4d8c87b308153b5df5b1bcee86fd7702ef9561f30f67c38862bc9bb5cc1b4cfabc6b3b0690fa33f0fa565ecdb1ac69e741f61c6bf871738d07877575b96fd7bc861e2690f3e1ca93f2c7670aef1f1be806b5fe3a5e41ffaa967dedf927e35d6cc577f7f82d3d8c867acf63cc62f4cfd4ebb8ecdfb26111c4b7fafde1c9be7fdf6e00cff650ee7f83fb78e4d79be62c7465ef3165cc83e968f9665af565770a9f65e0e1dcbde0e1c1b7d5cdc3a36ed5dade08af1ce3e0ffbf87c22b6f6e992f737ed659eef2d1c2bde95c3d8abce9363f90f7770a301a6fda8dff10d463e3730fafa36b2acf7f95b38d7783545de8d7a98fb1f35be46cd03cdf5a1ec6b6ce793df6d3895fffc15c1c42bd69770a1f6fe6e3936f75f9e3b36ed751d3b36f5ddbf3a567fcce04aed5dbf3996bd2f2c4bfe1f53cbe8b7f43fb6f1dbfb77d897fd78d939d6f85258d6ef2fbb30f6a8933b56fbfc3956fb3cc0a1e65b0ff6f7b4cffd9b63f3fe87398c7ffae03956fbbe39d6f30238211e7c0d67e2f20626be52daebd89f4cfa13fb99c6a30c7937fe9beca1da3f0ee9bf1fbabf999d48fecb119cab7fce9f1c9bf6bd0e2d4b3ff66f70493ca20557d28fd7856373ffc78363f3becf17b896be5c521ee7bf6e605ff57b9d3836edf5dc766cdae7a1b0acfacedee1007f73efd8b4ef7006879267f7c3b1dafb118ed43e4f154c7bcd2fe144faf6905956bca3e4f93efef9fb9b655ff1ad9163f99fc8cfaf7d23cf91fcd3d4c63bae5ee10cf96ee05cf6ec6d05e33fbce57049fb5e58967cd7e78e4d795f5f1d1bf9fef6e14aefffce1d1bf9ac8696656fbf33b8a67c2bc7a67d4f3dcb7afff99d63d31e6f3ccfc3bfbabc87b1a7cf3398fef8f06a59fde96e09877adee21b8e647f1f2f1c6bbe52c3b4d74308a76adfc78163d98718b6fdf116269e15d8f795bee2eff67995e61faff6feda37e519ebfa31be68da7f3d746ce437cf1c9bfeb38961fcbfc1355cab7dfaaf8ecdfbae13c7a67c7bd9a3ccfa1ffb05dc653de4d6b2faf7cf00663d67d0857dd6f7c670a0fe335b5bc6de9430fde979ea58e367cb32f62e732cfbd8766cdae36e05e3cf3cdbfbb1bf57bf70acf9e7a50727f46ffbbc44fecfe3259cb1be67cb57ea79cba563f3bcb1c6fb2c88e50f9de87a6ed793965730fec83c776cdafbbb80f137d6d730f6f064e5d8b4cf87ec4fde4c9035be3ec08c57179e6373dd3b8723f59fab8363d37ecf779625ef29e56fe465dae3ea07c69e0d1298f8f8d32b6ce5358119ff1f1696e91ff67dc4d776927fded83ba39fd3b9e540f35d8d4f85f5ff9663187f63f8eb58f6ad804be6bff6fe8a78cddcb1b9bf923d3dae679bf63b4b619ffaf7e040f2fb3d716cca3bf0e050f23859c091e4df99c0b1ecc57405339e77298fb327b770a678e1d31b9c6bfc7eba860bd9a7a7956373fd71e858f25fc2e8efd38d63fdfe9fd74df957155c6b3eb576acf9af4f7d9be1d7d4bfd8c081c6af620bb31e7a7f09c79aaf3d3dc06964caf3287d2e1af595fd45be519c18797cc8de97b6ff8cbb96351f795dc395fc8dd50466bc39687c283dd63b2f2f605ff6f1fed3b2da6bb48503e9cfd5091c4a5faff68e4d7f388fe108fbeb3b36efbfa37c4dfbca7e4570a6f67ece61db9e73c7e6f7de142e15df7aaee04abf7f5a3836f77fa83d4b3f91ff30eec1b9daa745fd8310ffa20d136fbeba862b5d5fe8fd4d6f55ffbb4e61fcf97901d79a1f2fd4be8d37aefeffceef9bf144eb0723d8537f3aedc08cdf8716cc7aeee5c0b1e6e3b730f9128318ce984f1d2c6b7cb8a7bc1ef1eb81e582f8c48965c9bf5b3a36e57fa67e478d30fa3a862be9df932d4fadfef3b4766cae079a6f54cdf068deb7e5fdbe17c81f9cc3d89bc737cbea2ffe9765b5dfd50d5c30ff3e580ee58f3ec2756cfaebb3fa67157435df5b4bfeb56dbfe504667e3b5fc095f477aefe5e37ed67da635ec3e4bbdc1696d59e873b38d4f5facab2c6a7ab5398f17abab0acf63a59c3b1fcc1abbe63238f431bce3cd90bcadfd847238f531f66fdf5bee5d894e7d2fe9ef5a73283f1579f4bcb6acfceccb1a9ffa37d5f2df6353fab7dcf57bec3371ca87dca3798f5875bca13f8a1916feb1cce7de9d7135c84b2979a0fd561159bdfbf9bf66f660f85da6370059792cff04f6ce3b1df25eca9bdfb9565d9aff13fd9fcfed6de1f4a7e03dee7915f74b88763e61ff67d09e36100a792efc93bcc7ad1b3fd7da1fe74d982f1072e7dc7e6f99b1c66bdf8e9ddb1d6f7cfc5c712197bb973acf67a756ceadbfd73acf58515dc55fb3cf71d9be7adcf604fcf2b1730fdb55a5ad6f33cead3b4bfe9ef5fa165f5f787133894fefa1bcb6aff4bea17d4cad7999bf6f7bb4dff34e5bf69c3f8f76f6aaf6e636f355faa60f2ebea77d8d3fd9bd4b1e97fbb16ec335f7f752c7dc861fcf7cf0e4cbec2856f59ed3b1c3a36bf1ff560fccffe1b4c7e4db9746c9ef77b0ab37eb95f3a36f53b2b2c4b7fae7630fa76985a963d19447026fdbab3f2c875bd837c3dfc09dfcaa3d4f5e707c7463fbabf70a5f1b8fbe658fe740dd78c1fcf8e15bfad1c6b3d6c263e96c0e8eb15ece1cf8d1c9be73df2fc663c30faf47e0d87f2d71ee770247fcd0b1c9bf25fddc2b5c6fb92f60ed0ef1bd5dfb3fab4b883bbc46b9e1dcbfffa80592fbd5d58269ebf75acf5ea111ccbfe9fdfc389ecfde5a56323ff8b294cbc6310c2b9f4e5ea1b26feb55c38d6fdf6f7a5aeef2bcb924769df5fc97e3df72c4bfe9799d8673dab1b5ba63d3f61fce1a719ec891f6f601ffdb21c6abc784be148f20f1696650f3ccaebc7c40f22c75aefeac289ecc933ede16781fc8727b8d07c6aa2f2fb36fe36577ff69bf656fb2c2c13ff7987599fbb0e604ffafe56c301f1a00a267fe9ca5e677e3f5dc3e4f7ad4bb8507baefec9cae77986e95f4f5398fef572e658fd71e658f122d92fdf271f637569197ffad5b1f213a68e154f7883a9efd3876353bee5394cfbbe5c38967f70ed58faf04fd67ae78965f5d7e71738d0ef9f3e1d9bf79f227f3f94bd7b4de158d75f6bc75aefb3f58ff5fc871e9cc89f7cdac3a5f255ef904f335c69be833c833050fc8bfa07b1d69766b47718868a1f1affd83fae2f9aebc38365d9cfea1b0e88172d61fcfb5bcbcc9f6e2b3895bf3ebc746cea3f3a716ceabf5fc1ac67970f30f952173398fca247fbfc5af27ad1f8131c3d1aa33f014c3ef6f31ca63d1ffee040fdeff1160ed51e5e1b4e7cf37ccf8753f907cfef9603cdd77f60fcdbe74fb8d47cd9abe14afd3ff8b21c187e8603f2b93f2d07eaff0bd5bf199d65afd75730f1dcb9fa5f68dbef2683c9bf9e5730fdfdf513269ff6b686c97f7db4cfcbe4bf1decf3c86f3bcbe152f21dbfc395c68717c93bb4fe5a87f71f4778737d00337e7578fff11746bfbfe088f8c3c6b1ecfddab26fe41d2ce144ebc5fead63f5977bcbd2f7c7059cc95e777b8e95df7201577a5ee7ddb1e6e3b25f6198f8f237cdfca2291dfed82e8359dfbb7d83c9cf7d8861d673ea21cc7ce7fc01263feb2c812bc5234ed49fa3c63ecabf492ccb3e79b7b027793f9f3a96ff7d09fbd2f7e11d8cbfe83996fe3f3fc221f3e3b965ecd32f1c69bcbba73e8d3d937f8d3c1af96a3de61cce359e77ef1c9bf26d22cbcadf795cc285fa57b0b5acf8e358fe7f1424b26f63fd3eb6f1d67917667fc9571bc6fff9f41c9be7dd9430f90c17014cffb89ac3f837f5dab2eebf75d765efceedfbc827ab0f8e4d7df7f6f7ac8f5e0e1d6b7de19fd74dfd4f35fec5d6bf197f5856fb9d8730f1b1ee25ccfce5ac03c7e427a49635be3c2fe084f1d43e2fa1fd288f6dbf873e5ce0dfec1c6bbfce00aed55e2f9437f0a45f575338145777702afdea208fa00c8d3c5ab46f98c8df7b97be27767d64a2fe90d8f950b583593fb8df3856fee50aa6fde69163ad9f179625dfdb5798fce973fb3ef261fb7398f1eaefd3b1e63f5bc7461e57b22789cf783be8c0e44f8d3f2dabff9f3fc2b4ef60e658e3e11b1c303e52dea38537e3ef294cfca65b58a6fd578e35de3dc1f827dddab2eeef2fe044fa7c3f8053e2df5bc71a1f0338c3be7830f1b1e78163737fa70b97b2b75ee958f6edc2b1f693f41d6bfcd859563edf4b08577a7eaefe910489fcd396f42d0989b77ea8fea9b50f5f094c3ee06d0667b277a36f987cebf79665e2df5c6ffaafe2f55d98fcb9cb028e99bfbe5a967cbc7b18ffa463afa7bade3971ac78f3b763cd37a730f9719d158c7c3b6770a5f6ef9e3a56ffbd75ace7d9df937ff4a8f12b6d1c46f3fb1bf90bc7f53bf9937b38537fb95dc1cc1f866affa674d2a703bff7c95febd530feb47f0ae32f5f8630f6e1e51d4ed1b773385379bdae63cd4fd68e954fbe84738d6f97f6fd25faea3b567fb9b48c7f679f4f7cfec196b796fe7ab163ed17d4fc290b3a8a27156730fdff656159f6d67b8519af47b730f99053ae47596cdeb790fe1cd723b5fe18c2ecffb9947f99fbe4b38d5796652f467f7057fefbe101f6648f2e478ea5cf154cbc633e8023b5efe0ceb1f2d99fe058fe4af707469f4f29af9f93dfd3b32c79bc5c3b567bde3836ed736fcb57483e8f33c78a2fbd3936cfeb6fe19af8d3d232fea2da330f3ad217af037ba1ae53dfc69d37cfeb7c38567fbb844371f10d47b2d7f514a63f0ee41fe78d832ffb487dc244f1e731ef0f33ad273c6a7e9ac71dadcf8d65bf0a1b0f5e4f61e2bd6fef96657f16cf70a9f61d9ec0e4b75fa93c854ffe5cff1b66fdffb28433e6fb2dcbb4cf0446decf678e757d09938ff178e758f9f02bc7b23ff78e357fa73e4d7f32ed17ac1c6bfd88e737fd49f1c008667e313e856bb5df44f22ec25cf3efb1fa6f69e39d570b3893ff7f53c0eccfb88860f2e7c67a7f69e3d3af63cbac3fae61f6078d3730e3f9d31d1c6bbe78613951fff372d8daa70e5ca93f3d0fe19af813d7ad7ff6b8b6acf950f7ccb1f63b057018683ef709c7e289fc4bb7fef758c0b5e2c167d28fe3fa99ecf71826dfebf008b39edb9dc219fdb50333febc8c1dab7fa93d2a5b9f4e1ff6d10f95b70a8350f3994b38d3fa5ca1fe524589fae758f6bff6d8cf7b2fffbef6c96ffa1d3bd6fad50c26bfe9e40093dff47b0693df315e3856fb2de144bfbfb887f147cf9fe08cfcd5c8b2fcada1bd9ff5b1f757b8263eb977acf9a1f4a16efa83fcad3fd857fdbb3caf196f94bf45f91bffdde89757c0c443475338d5fb3a1b3897bc3fcdf81874bc48f6e4fe0b66ffdddd075cab7ec39ed8277fbdb786599fdc6430f9300f0798f58233de17309e0d968ee52f0796650f5e3c1879bc5cc11ee389655ff27e99c28cc7dd051cca9e3c6fe128927c6e60fcb1f11fcc78f5710b137fc89fe05af62f2fc5cd7455f3d33bd857ff7b4960de77e7c365ac7819f20d9b1631f6e45c9c4699c67fd37f1bef83f8cf770db31efb903836ef3be77e9ff5e54ddbb1f235fbb02f7f6eb3b62cfdfcfb8103b5dfcf25cc7ae5e8d7b1e2b1119c2b9ef1915b96fe9d3fc3e4339d5c3836e5fda91deb793b98f1e685e71fef30faedc11efe86ef58f38b11eccb3fe89ec391ec67c9fb8252faf849f9c20efb9f787ee4c7da6f64c6afc0b3f19ef3164cfe79fd03335f18dcc3e42b5d4ee054f6c47f1137ff46f94b7398f2de0de140f6b4e3c1b1ec7d7705e7daaf71627f4f3c66b3874b5dfffd832bf59f9ce737fe8bf497fb43d6df072338d47a7b91c191c6b7abcab2f479d28329df53471c05f277f30b3855fca0e4fd51217d9f49ff7db73ebe84d91f7efa0657f27f965398f9fb40fae65b7bbe59c1c4c3ea4b3855ff9ccc1d9bfafd6de04cfa3ef9840b8def27962bd9abfad4b2c6bffa0cc61ef4297f407f3aad61fce9877338953d7a89e142feccf90cae94df55aafd8e0165ed37d8c381f6238f797f237fe51bf99623238f5909a71a4f8796d18f82fa45b9fce51fe96b60e77b571b187fc0bb8073c9ebf7dcb2f47df201d3bfaece1d2b7fbb0d57f477b55fd0f407f9af2b3850fbdc0d60d6f346d730f18207ca13b01ed02f61ceefe88496157f3e55ff6bbc0de95ff606878c8f1aff1a731119799dca1e1de3f546fe3dd983d0c66fc67318fd3ab3d7d93f305fc1d8bf89bd8e7cc65f30f2b87810dbf1d14f619ff89f0f67ea8f2f6abf3064be5a1630fe6b593a567cd67216693eb38591574bfa1d46f4e7a9ca1b79e437fd5ec1b5fcad83c6f3c6dbd0f5c902461eef014c7d2f3a30f929938d63e507aa7d1a6badf63de17a40be49f700e33f7e6430f335ff13aed47ea5ec5514b2bef8c8f3222f347c6ae64b4def643fe997ecfb31beabfd4a1730f9aaeff730fee1f014c6be4f5696d5de671f30f9be75dfb1ce93f985894ffddaf755924fef551c90dfd0cde050ed731ac1b17e5f509e80fcaed9c8b2ec873fb5acf9c68bec4d7c3c00c8c887e7654926fba2f727363e71217b951c17b88fbccb615ffec7f71ca67f9efcc0a9ea3f59c219fef8354cbeee251c109f1bf0bc80f5abee1e265eddddc091e4313a83d9bffc3080b1af37b24749d855fff9b980d1a7eb5f98e74d65bf93b84e4cfdbfd41f53ebff6e3e60f2bd4ee796d98f7109e32f9d5530eb7b93354c7ecd60e158fad2b32cfb34907d489bfea1fcf92f38607eff0d87f29fcf3c3861fff6182ec897f8854bb5ffb3f4256dec89ecf73dcc7af797da3bf3c86f7d847df6874cde60f6fbbe6770a1f1a2fe834be9bff70d13df9949be59403edadf17dc957ef83cafe90f9acf3fc2ec5fa8cf2d4bdf4ff6708cff3a81d1c7fe1acec81f5d5a56bca1a47e41a1e767b2bf59483c291fc1a9f46722fb9845bee479257b905bfb79bf85d9ff780afbe4c75fb461f23dea13b862bfc40026dffc5de35b7e9cc1197d2e60d6236bee0f588ff41ee05ce3e5bde49187e4df4de49fe551207fe053ed591c57408d7dce60ce3bf86cc1e48f4dd45e45c0794bdd5b98f58cf30e8cbdea0e61d6b7bc035ca87c97b2374548fce8620347ba7f18c1ac3fbfdcc1b5fc9fb1f4a1883ad2df990f573a0fe541fa56fa9cf7f6fd0663cf0e35ccfe84877798f1fcefd7b1f97def03663fd336b32cfdda485e65407ee5d7091c481e1fa965cd477f2ac71a0f285fc07eeefa0246ff860f7026be1bc1c4b73dd9e3a6b787cae78a60e2d52bea1bb2fefbfc0d171a4f277db892ff38927fd4cc2ed4fffb96d187fd3bccfac2aeb2cc7a8cfa4b65fbfbe00de6bcc0af3f38e4fa231cb11f40fa5135f65af90d1b3851fd8a1e4cbc2d933d6bbc03e9576b04471a4f66b29755ec45caa769c3bef6bfcfe45fd45ea9f8d3a9ec4bddf45fd9ab03ccfe9fd10f9cb21f82dfdbf9c683fd3df38b2fe9536de5713d87c9bfba7e736caeaf3dd8d77830dec2a9e627a7318cfd38a83fd621fee33e852b9d57e93fc275a4f3b8349ed611f9b817942f6a3c2a333ef2fb388fb5ffc7d8d3f098ef6bdebf6dc3a1fc87fe1e667fc0a082c9673ef91537f5d7f902af30f963973730f189b30c26fef03b8039fff2e2d3b2e6bf0bde1f75649f272adf31dea1f96f01b31ef239b7acf21e3e61ce0b1bed61cebbba68c1e497f7ec75f263876730e721ae3be2807cbaeb058cbf7abd86638d978b2d9cb31efc6c59fa5d5ec0369e62ef277e3e5889c354fecded18ce980feee052fec3d2de5f6bfe985f8923e225d35b38d1ef1f8670aefd134f5d71631ee4ff493e9e4ffef3dda76353dfcf36ccf8d63f1137f6c0b4df640ba7ac4f7dc1b5faff992f6e9ea0fd8e5770287b389ac185c68b69224e3a8a57cccdf81ffa763de5ea1d66bfd24502b39fefe71ac6dffee8c2acd79cd570adf179782eb6eb899bd2b1f6633dc2f4e7fb0bc7465eaf23c7b287af30fde19af2da78eff5079c91cf1f3a36f5fbdbc2c4a72f9ec421f97c275c0f3dda83e787e453df9cc1f8cbb71371d4657e1dc0beeccd534f1c2789f28ba4ff7e833a0f41f509ec7cf23183d99f72fa6599f8ca022e55ff8f08265fe72787c96ffd88c501f93a9357c7e67d1796d9cf3078813df5dfc313cc7ef9df8965c97765af076aafeb254cfe5cef6059f2bb5ec1aca7f8f679b9aeff048ed5def6f925f3c1115c4b9fcfa57f41887f31431e719e68fe207d0bedfc75bf81392f6f74806bc96725fbd2cc3675fd3383d1c7410d33fefd0c1d1bf9f7ce2dcb5e793730f1ba8b77d8e603daebac979da9bdc2668430e5b9fe8189cfdfa87f34eea0eccf7c0433fecf785e94291e3f9d3a36f279943e8571a0f33c6e656f9bd6517defbf61f20927194c7eedc0724e7e500e23bfdea7639d57a6f7476e7cab61cee33ae37eab2ffe02e6bc844d0197f2e7ba13b8927cbad78ecdf3fd3318ffef4af28a1a799afe301bc281c6c7a20f131f9df1be90fd35b9ec5314911f5bece158fe417102a71a1fae646fa2b42ca4efb2efb14ffec96a0ab3bf63aff68803f2cf3f1238943dfcfa71acf3905e61f255bbb2f771c87a63f006fb8a8f8ec630f90953c7d28f600d579a2fac4fc551ca79dedc1f158a9f4ce5bfc44994eabc0cf5a7c467bfced5079c936fd18639cf6facf22536def799c291e47ffd09b39fb8abf72721eb61a37398f58dfb6b98f8f2d504ce35fe7bb26749d489e4bfddc091e2cdab011c6b7d70c6f39af634d7976796e53fbd25702effe0fe16ae25bf278dc74963efe55f4b1f92a4abf35326ea2fa9cf7e860bd53f0d384f6bd0b2acfef453c2e4c3bdee60bbfe54c005ebdfeabf69a3ef8a9725702afd3f0be08c7ca22b98fda16bf5cfb49187e633bc3f4a942f5e2de042f66658c195ceabbdf813c71d5d9fc630f1a49d9e9fd978dff9dcb1f65f491e59c0f96397b796d57f26fcfeb88262ea77706ce473fa0793ff53b561e2f137eabf991ddf7b2b98fce1610897d2a70cb6fd3bd858d67cfb35812bd537f3c47157f2984ade59d249349eea7a1eb01f64f309339ef40f96d51f268563c9f703461f0edf30fba3ceedf34a8daf9eea9787c497cf3730fef7c533ccfe95750a939f7437866bc523eed57ff2c6dfd1fae10466bdecb5826bada7ddcbdee54947e7fd5f4bbf0b9ff5f589ee2f02f24bce5ee148e5bdd9c089ae571d9878e1c51a2ed59e67df30f3bf73d9d72224bed07d71acf9620a97e45f7d38567fe4fd4dfb2b3eb0839b1a1eb9cee05aeb7d934b71dcd57cfac9830bd9cb8efccba2b107e6fd531ff6942ff5740667a9c66f95a7f439fffda68273f5876d0b2e654f1edbb03d7f47fdb5b4f1c4d50b1c69be7a5e58667ff59f63539f871dcc7a6f7f0c27c4679f61e2ff375f8eb5bff70626fe7a3281195f6f787ea39f8ab7f6e080f1fa0ae6fc95730fc67ffcdcc215eb8194bf5147f5df082e896ff3fbc4d7fc6c1a3a36fa762bffccc56f0e927715902ff59559963ff319c2c4636f3ee15cf6e4a70bb39ff25cf6a00aed7e09d98faa996ee9bc009e1737ff98f23cc1e8db54f5a9922031f59dcbbed6d6dffad0ef9bd9affccdf7c2b2f479b38113f253d696d59e675b9878f5c50b5ca93ffea87fd621f987bd33d8d37c73398763ade79ff3bc90fceb731fc6df2f1e60faef90fa34f645e71970fdb80065e4318503e51fb6aee090f1378063d9db9d19bfa28e5d4f5a3dc09cd772bab4cc796a1f30f3f3dec632fe6b05b3be3db1cf4f658f6709ccfaf0fdb963f3fc9b2d5c101fb5efc79fad0371487fbdbb807dc6f33ecc7ef06bcad7c85bf383039ce8faf81bce359ef53fc591cd27f982239d1f90717f1c4bbed746df9bd6c03f3bddc0c44f7b3b98f5dffe155ca8bcaf1e4c3ce8e4dc32f9fc2398f331de7dc7d25fc9b7db5457f6e51bc67e575d187b35cbc5cd0443fa726559f6e0636159fecd54fad08d0bcd87a61db856bed2b4eb58e739dd88d3ac34e5b930fe6c748cd7687d750d63af2e3298f597d7a165e209d237cffa6bde16f6585fdfc1ecc75c1530f9c4c347f1b145ccef2d737efb5908b35f737202130fbbb98219af6fd41e5ed37d351fd4fb8f1b1eb57fb105d33fce1796599fc961ea7ff606b31e5efb30fbcbde2398fdb93de9fb311ea3fd691f7097f800bf0fc907f40630e77d9ded61e63b7de9b71fa12fb79770acf9cced4cdcd457fb131fe158fe4aab0fe7c47f5fc4492321a36f5d38967fff2bf90536dfe6f75adcb4bfece70dcc7ae84f07e6fc9dd35fb856ffbdfd13db78c0e60be6bc98d31f98f5c1db1ecc7efeaa05c77aff6ddf32fbe10298f5d2b303ccf87c2a7b774c2830e5bda53ecd78aa780bbf4f9a0982b157b20fa19dcfded430f1bd9b57c7e6fd077b3fdf1f797b81596feaab3e6148bee4a672acf5c477d8973cfab730fb2beb1066bce97660e2c5373f30fb7b82b6d88ec76796638d6fb3095cb37efc6339d27e0fb55f1877946ff27cb02c7d79dec3dd58f9ef6338617e7aef58fd51fd27b2f381af254cfb5e9730e3c9db8765f5f7f91a2ed5be1fd287c8fa5bb7bf30f1e3d31398fde7bd394cbefc99fa6bf340bd7f7a6559eb4be7df30f9d9b331ccfae50bef8f9a0e66da6b03272aefcd299c6afe7ebd83599f1bdd89634fe3fdfb044e949f777b0f93ef73a7f1f8984e2dff097925b5e2b133f5a738e0fb2bbb020eb1df35ccfae36b17667dfc3a77acef9f5cc2ac6fdd4a9eb18d1fbffa30f91a27df30fb49ce249fc6fa882f5f61e6e79353b8563e4fa6f1228e3dea7f07e791a9df770a975aff9d3e8b1b7ba5feecc14962fadb42fd2f09386f6ebd85a9cfdf9f63e527daebe4375dacc4cd78acf9c91e4ed4bf263b98f86da5f72711fdfb6a00b37ed19f5a96bde95dc191f4cde77d11e7c5ddf4e042e3fda5f43f8939effbe61aa6bfdd3ec08cffad2798f5f4bb589ce4f227ef355e246947f2fad2fbd3a6fd55de1fb8527dae0bc7ca2778b3acf65dc93ea44d7f34f2febb82393fa0ffe758f1b96f9878c0d7c1b1c6fb8d65d9433f87593f9b50bea8d2f8772d79a78d7f237f48f54f8f0945463eb22759c0feb6d3154c7ed785ec51d6b4b7e4790ab39e363d81d98f5b687ccd1a7baaf2fec029fb5b34fe6731fe5a710747d2ff8b1fc75a1f1bc0ec3fca7670a1fe716d9f57ca1e64eaef59d2d57aef94f22421fdc18723b5efec194e63f9f74f7026fff046f631b7f2787b86898f5f5470413ea8e4738cb7287fc5b3ccfcf80cc67f3dfb82c9d77cebc0e493bc0d2c4b9f6e7f1cebbc801d4cfbfb639878474ffe4a1eb11fe946e367ded80fcd0f643ff224623e4afd9244f2b8953dccd3aee6cf5ff2070b9bbfb17e80592f5c7ec105f15fe9671172bed1c98963ad97f0bc46bf8c3e9cbf5bd678f513c2b1e697f3299cc81f7f3f83995f9e4afe858def3e8f2d6bbef3770f678a07df703d4e15ffbcb9810be9cf8fae9776bde2e412663db2df87c9af5eed61ced73c537f2a6dfbf78770a0f6982730eb2337ef9625dfd31e6ccfffb986d9bff0697fcff93ffe1c265f653174acf348642fcb88f5c16e17265e78cbfd11f998c12b1c495ecf299ccb7ebeb461ecabf70cd7f2af6f347e97cd78adf3bb25ff3209e48fdfddc2a1d6d7efa94f9229fe317b844be9e7bde45b057ccfea42fa55859cc7d4fb81bb1a7f5e2f61e47f5ec2c493efcf60cea3587ec3e4cf4dffe04afecbb5f4bb6ae4a37cba019c69bc1a5dc015fa257dade24ae3f535e569ecb1d6f334de54c70f101abe8353d5f78edf37f648f18b27b84c759eacc69f2a8db4bfe35ef6ad6a0ca2f2b154dfdaae9f1e5e617bbedd0c265ef5f00db3fe7bfa6959f2fbe8c39c57b5ddc199f465f503131f5bfb96d93f7cea58e3df04269fe5e4d6b129cfb4e758feea0266bf66d73e9ff9e5f66059edbf81edf873f20093ffe93dc1b4cf9dfa571d77351ef9c8a77167b57f8fe7c5e4dfb7649feae307284dff798153e5573d6ee10c7f94f7a71db57fdfc8233ec68b8c3c9733f1f1c01da3df254c7b7c70bf9ddf4cfb96593ff5c411f3c56100c792c7ba80596f7ebe8659df799f8be358f3a3d92d9c6afde361246ef451f92ea1b8f197941f4379d26eaaf88ad19ff8f8794a9dc7db81c98fbee5bad5cfbd65f69fdd2c1cebfcb900261fe1e0c3f8db9b3b187ffe6f0cb31feed783895f4dcf60d6833ee088fd4427f730fb07fc73c78a471fe054f3a5e7095cc8bef5787fd3c29aff0c60cecbbaf88213f2911ee054fa3439b32cffffda32ebb9590cd7ba3f57fb1e3fe7a8f8c6079c683e7617c1b9fc9f7b7e9ffaa9cecb0f2c678a7fd05e6928fd7d3a85a354f95e928f77cc3835f599c3acefde6ec476fcffac61ce4be8dfc0cc3f773e4cbc742a797b11fbe5c6bfe2469e5a2fbf8643ad67b79ec54d7f94bc6770a97ca88df4d5b3fefdec058e129db77601a799ce63ed8ab33033e59baa3e7ec07962fd33cbacf74bdec703a94cf9fe068e951fd081590fec7dc3e8ebef0d4cbee3ce83c96f3ab5cf67bffba7bd9ffdb71fafe2e3014b46fe94cfaddf0530ebe937bf30f9d3e39db891aff263c630fbdd8a3f3893feb5b89e10afffa43e492c7bf13ab51c6bfff9a3388d32e58f529ecccb242f333e1eb783489efd5fcbe40fdfc2ec477cdd5b667cf261ced73e9b5b963c7fbb30e3d3b7ef58e7db6e61bb3e7406937fb291be0711dfebb8567d8fcb67b2178f30f93b9373187fd2ff804b8dd719e56bf455f9696f70a4f9cc97ae37b363f299ef61ceafdeabbca19d2fbc3f38d678e1c17ccfe2a2706cdeff3781d9bf73b3b62c796e5f60e2d177e730f9c78753b8963cbeb87e5c0131fa700b47d2d7d98965adffcc2e61becf554770aefc9bb72ecc7ed09b3e5ce9fa35ef6be4257f9cfa35e3afce7f1b8aedf8f4a7f68aec7a42ff128ee56fac6630fab4a961ce8f9a5fc085ecd7d71e667f6f6fe958f1bf0bc7f2af355e4411df3bd83cc0acef2c7730f950639edf8c50cac77c8303f2410e96d5df3e2730fd75c2fbadff39a57ecd78a1f3b4b8bfe9af463e33e9579476154fbbe3fe344894df730d67eabf771abf623bdf3948fe8d42a8ffde72dde65ffc9d3b563e6306339ffb3b716ceaffb9b02cfd3a7f85393ff17305dbf5367b3ff2ff5cc3b5c68f9eec71dcc85ff6fc17667efcfb09b31e37d9c3e41badecfd9cf774cdf5c6a3517c610467f2a7ee6ee04afe40a9f1366efabb294f3e8533f997db042e94df78db816be50f9c483f9290f37ddf9f1c6bbfdf1a663cf624ff2462fdf3cbb7acfacf7a30e77b4e2fe058fc51c29c4fd293be24478fd4d8ef4bd897fe5d2670adf9f44cf54b928eead7abe03492bc7fe18cfd09015c6b3c9ec9bea521e71f4fbf60beaf78d8c1e4cb6c73c78ac72d2dabfddf9f61bbbe699f47fef5df059ca9fd7f65afd388f599bf1466bde42b8033e98ff70eb35fec44ed9336e383fc9d191c315e5ec289faebb080f93ef8e795637d1f5cfd234dd8cf7e5ac2a5e25ba7d4af919ff6aff3fca682a6fc07dd9fd9f9eecd12269ffaf7d2b1e4f502e7e44f9fc2ec0ffff51dcbde9d3b567eb0ec6fd3baeaafb33fc7da2fc7fb22ce23d9f660f2f1be033857fbadd5df9ad930fd8ff2c49cb7f297c189fadb9fe60359c278747b6b59f21f50beb44a35ff55ffcfc3947ceb1798f9d67b07e63cf0cf18e67b10a77a7e1eb1fe36ebc39c2739cb60ce33dc058ee58f0c2dabfd6fcf61e2b981c6a33c66ffd7dfccb1be4fccfdb12ff9543ecc7eb2f70a66fe3d957cf284f585a7119c4a7f5a8f70adf9c39fe45fd8f5b8dd2bcc7edfb305ccfceafe00f3fd92d78165f24764af8ac6fe6a7cf880594fb93b83593ff2af60fcb96bd9872266fffb5f0eb3defbc9fb8e23beb1e7f2571beb1a4adecf70a9fcc533b5779192aff5a8f942d128a0e2b9924f69d75b3f2398f8dfd912c6febe9ec0ac07ac5f1c2bff6d05e3bfffc97e968d7d96fd98c2ece7faa82dabbe9fef30f96b3bf5a7f2f8414273ff391cb0ff7508279a1f7d9ec1a99e37e4fd4dff90ff7a0d77657fa6963dc9f383f227befc87a9e45fa689e2777dbdbf0a39dff5fd1166fd69750767b2bf872f98f3ad7eedfde493dc9fc2eca759a83f5611fb437ba796351eaff97d443ce5ab867de20f7bcbc4977c98f31ab7df70a4e7f905ccf73467f67db9e64b95fa7715f33d90cf298cbff6f700871a1faf4fe044f3d7e209ced59f6fecf55ceb597be475d43023ef095c13df1f5ad6783292fe574d7baaffb660ece5e70e4e353f69f560fc9516f7a77c3fe6e7dcb2d6c35befb0affc99f3a9658ddf97d2af2af352d96f95ff181f34effb7d8669dfef25ccfadadfd0b1f65f6c61daff6f6459edfba3f7d791c7f9b4b7704e3c710057ea0f431f265ef87d6959e3cfafe6fb758cbffe49791a7baaf3835b96e55fdfdec0c83f97fdabd38ee62777d43fad33ed3757fbd645596a3e61fcfba6b538dfb43fb02c7d3c3cc3f497bf33187b33ddc2cc577f9f1c6b7e3ab6acfafebec0c8f396dfdbf9edebc1b1be77dc73acfed981bbc4d76e61ce2f7aa37c51a0f7f5afe150f67cfa0347e417dec17cbf6a667f9fcb1f3db1d78977fe4d61cec7fcbc10c7e4fb9ff2fba3c53872b6172785f89bfaa785e25dc39d3823fe751fc165a1f883197f92633e9ad6c3747f3762bf5b3f85d1bfbf6bcb6a8ff7180e99cf0ce1847c9f1b98f329830aaee53f6c25afae8d4f9fb461fca16d078e157fb81dc0b5fc6f7f2d6e2462de17bcc3acbf5c533f1b2fcc12b8943d3850be34d0fcfa368423cd172fa86fe3d06afe2af91e3f8fadf3f066e2a22e15ef57fdbd90f3f56e25cfe30790b51ef308b33efeb0b52cf9bd7dc281f4e310c0ec9ff968c389e4e3bfc17caff3700e733eb0f7218ec9cffbeac3a9eabf19c399ece96f0597b2e77bc9cb4bc9b7b82ac55963d0cdfdaaaf6fd7f70e2f30f9baeb36ccf7ddeeb68e75bd25b6fdf3f701f6d45f4e7ab0cf79b41398ef93072a8f1f735e887f017bf8a70398fdd19fe77028ff737405b3def5790a632f3f478e154fe57969a2f580ef0e5c2b9edad7fb031bef3c7cc0c48f7b9ed8f69776dbb1bea799c2cc2fd64f70ca7ad2ccb1e215a770aef1d21fc17c5fc4dbc0ec673e957d0962d6fb365770a6f1fa53f23ec6efb4decdef935cfed227e569fa87ceb3a63e59586a3c7880ab5cf644fad49817d99373cbb4e7c908a63caf7f30f957af7d3896fde85dc2cc4f2fecef0bf99353d8ae37fcb5e14ceb3fbb10ced5bed73cdfc68f6e787ed383f53dda191cca5fb91ec291f2db874f70acdffbef702af98ceec5cd7829ffd4f85bcdafc9671e9cc19cc73a937e46b1cd8f1dc2e4f307fcdeeaeff4d232ebb37f7082bffb2b6e4644ed6ff7e0aedafbd08303cd97f27b987c9496fa7394468a6fb43ee158f1dc31e5c9f25ceb479e63b5b7f1a71be3cbf9205faf30fb77ce6b98f1f3f5d7b1f2576298fdfdef5dc7dafffe0413df9cee60d66366f67925feaee419c79cdfe05f3a56bcf002f6e44ff925cc7e5a7f6059fad70b2ccbde789f30df8b389bc2899ef7297d8b13e24b9309cc7a43b186735d6f65e23454fec137f54f53d99fdb082e94cf3235fe7d92d8f8eb491fe67b1caf178e25ff4b38953efe0630fb1fa607cb5a2f7c3d85c9575e27702d7ddda8ff25d65fd96ce142f1b5db0bc7da7faff649ecfad6750ff6343e152bb8d0f874a5f133698a6be499a57020f94c3338d2fc377b800badd7ec0bb8d2fadf5cfdf5180f537ef0374c7ee9bb07139f5c3fc3c4dfeefb7022f97d5430f1d989fa631a971a9f4ef8fd714668ca13c0b5dafb5af24b8f1235fab28773cd4f86295cca1eb564dfd2947847f103132f58e9fe2cb2f98d25cc7eb9c5973826bfe4f2c4b1fc6d7e6fdb33c861bee7b891fe66763e16649635ffba1ac391ec6fa1f6ce9af2299eacf6ccf2b850fe85da278fc89ffaeb59c63efcc0e4e3edcf60c6bfb75398f3f2a67bb8245f40f2ce63dafbee17f634fe2cdf605fed37fc70acf3e72b98ef796fedef73e29ff67ed6b337eaff7962f35ba54f79d3c0ca6791fe15767cfbfa86592ff8bb8599dfcccf61ce57bf937e1531e70ffbaf30e7556d8630fb07bc119cf27d5af5c7c2ce9f7fbf60f2a1373f96357efc7cc2b1c6b342fa50a4a9f275db219c2b9f62a2f1a4381ed865ca6bb92e949fabf62aadffb37c80c9c7d9bcc2d8b3cf25ccfad5dd37ccfee2b70d4cfc71b68389cfddf5e14af21b9c3a36bfbfefc1ec27d8aafd4aab2f7e0ddbeffd8d60e24dd321ccf94b9f2730fe63297b5b26e43f5c4a9e6563df15af55f9ab88fd5a275796f99ed6178c7fb9eac2ac672e2c932fb9bd85896fcfd49e554c3ec5760bb3fffeee040e89afb561e2459b4b98f1eceb11663d69a3f9d231fea2fdd992779575357ff8537bd411e7f9fdddc0e4effccce09af3a3555e17af18bec35db5dfeb19ccf9a4f3be63e573c4b0cffefa31ccf77747f679ac0f9d683e5227f8539fbf70267b3b1ec005e7af51bea6c4aabfe45da79ec69b2f0fc67f1c69bcae8f06cbd4d770e31da29fb33dcc7ac3ebb9d8d6c7bb82f9bec3d78365b567ff4e9c70becf6f6959e3c7e7012ed53e63cbc4133637702d7f6fb31337fe9ea95f3b8559efcaafe14acf5f5d88b38ef201f219dc957db8a17cc703fe8cbe1afd4abb11f91ffb6f98f5e7ed06e6fb0eb3035c339fabc431fb39b73398f32e2eaee052f1adcf3f7133be6a7c2b60d6f7066b71339e2a3fe41d269eb0907cba59a4f5843fa36fcdddace7cc5a30fb597ea730fb79ef7ae2a6bc3a8f2681990fdd9fc09c5fb8ce1c6b3f490a739efcf7084e94bfbaca61f6cb5dd9fb99df0ece61f239bf9ec409f95b9b5f38967d3aa7bc09df871bffc07c0f61792ace02f5ef1bde971599cefbbb17e79d4cf60d79141dcd0fbecc78d978738c7f3fcf30f6eaedcbb1fc2db5df71fe6eeab3953ef909eb25bd10e63c90d319ccf70ade6bb8503cb392bc8ec74569be7a6659f98c39cf4f135d1f0f2d331f0a60be4ffe21fdf0b350fbcb6ea84f166b3d6efe0827f24f1fbfe154f2993cc0b9ce77bd53fbf8455c697d52f20c6c3ec55eed1934f6d15c9f9f3956fe55e858f1b4b965c9e7ee07663fd4dd0e66bfd6660073def550f20b1a7ba6fd09a730f916fe1d5c481eb9fa77d0d803e97f17ae0a9d1fbf1537d5d57e75331e1e47438d5fdf2b987cc7f9295cc99f5edec3b5fcc5ed426cf395161b98feb0bf84c95f19df5996bff321f9848d3d543c42f26be6efd29780f2a589f64f5e5dc1e4cf660798fd1ba30798f32c6be9639875b51fe12d8653adcf55bc3fcbb47fa76e39d6faa1f4292cb24af6cef8abc7d9b9da67fe0993dfbdf060f6f36fa59f8d7b417fe3f7763e7b7780b19fefa963e9cb1e4e646f7f13cb92df9565be27b57cb5acdfffaabf1de3113a2fa5077bd2c7f31d5c4b7ee7926f94b23e376dc189e4f9c1ef53f2f1fd0798f3b45a1371c67a4e0b7964e4a3bfc6704e7f7d826be583bea87f1ed35f152f91bce288fd19dba5b831975acf08e158fd73fb05f37d94fb5f3895bcbeee61f2c3866abf637c40fb696630faf8f50cd78aef6c355e34eebcfced3a863dcd2fdf3c98f9d6d5080e359e7fa93fc6767c7e2d61e431be151759a97c1e8d8749447efbf6d5b2eab791fe2631dff378fb81c98f586530f9c6f31e9ca87f8e6730e7a5fedafb39af66f2226eecbdea7f0f931fb6947e2669807d0f60ecd3d7299c295e904b1f93aca3f1b3750207b2efd98f658d07ad2e9c6abda1f50de7cac77d1fc385ce537a90fe267947f19a9b4738caf47d16e9431a11cf9b7fc099e4b568c19cefb2ad61f2b5b6f27fd298f5aced04eeb25e36b32cf92e787e631fe57ff2fc98f3c5169f70a8f9e6b2762c7fed1d8ee49fbcf561ecc37b0293fff87507f37dd38dfcc3b4d16fad976b3c4f1bff4af109cbe43f0ebe61ce2ffa38810bcd97469770a978c3a80d571a6f3e906fa3dfe6f76dca9779ea2f99bd1e6a7da8e5c39c67d2eac099ec7d87e7e79ed683eea55f8df9afccfddfb29f99b3b7f28fb398efd1fddcc1ac071de630f911cb6798f9eedbc1b2e4bf52ffce12ce1b197dc091e4b9e6fea67f6b7deec2b1f227fee052fafda4f6cf324ff9f2d763384ee5df6ce04cfefc48f62dcbf35ce72baa3eb99dafec641f8ff1157d5f6103739ec36709133f3bec61f279d6ea8f79427ec156f63c4fc9b7db0d615fe3e7f8128e34bffaeac0b9fc8ff73e5c2a9ed6e2f94d7f567befe054fdf749ed9be79efae7bdec4b5ec485c6fb08ae4ad94fd5afb0f3d34506335fdb0f2dcbdebdfdc299fadfe419667ef0a1f62a9a0ea678dc0a66ffefcf3b9ca9fdcefb702efd7fefc115fea8ec5791b1be99dfc099fa476b0b17f23726b24f45d1517ce6fe0e4e0a9d472cfb5936f5517ec309ccfebab72dccfe9c65e558f90033c7da0fba8739afec4bf6bdb4f3cbed338cbdbefd869b3f531fe973d9f46fb50ff737e3bdce436cc1acc7b46fe042e729b5bee052f56fade14af91ef73cafa9bfbe9fa0eb959d8f6ed5ff2a3bfffcde3bd6fee71026febb91bf5e35f329eddff8837395bf277b71cc3fd17916dc9f123f1c7cc2a5e6dbb9c6e7aab15fe67a99c0cc2fda4bb852fd32e96b9577343eed54ffdac637676d98fcdb550bc61f7cebc19c4ffd1bc39ccff8b683f107d6ea2fb59d9f0dd5ff6a3b1e6f1e61e22b17d2a73ae3fc89ac03fbd8ff031c6bff60fbd4b1294ffb16ce651f6e5ee02a933ef3be2250ffdd9af66cde1630defa30f9698bdcb1f2496238963dfbdac2e43bccbf60be8ffaf66d59fabdb0ef2b640f7eecf34a5d5f45e2c6e130d7af5a702e7b301a89adfc7e3ee05ce353f10c33ff186e60e239637e6fe5bb7d823d5d1f0d1d4b7fa94fd39fb49feb040e88f7667022ffa81d3b56bcb307e38fdfdcc3f4dff602ae955ff7988a8baee6878f7f705598eb0763ff9ad913e3c96e0bd35efb1dcc7ae07605635f366f30fec8cf9363c5cb24ef6ee2693ef5c3ef9beae9fe354c7fbc55798ff122c5ab1e61f613071f70299eb6e14afefbbbe4d96dfc11c59bb83f0b757fd675acf9f78b65b5c7f0198e549e228663cd27f30c4e35de9dbcc285f4a54dfdb252fb3b7f4ec58d7dd0f71f795e4ebed0ce8c27d9319e24ff4fede325ecaf7a3b71acf58e0b71dad5f87dce753bbe6dbb70a9f9c8c516ae74fd9de7376f54bec8060ef1df9670c4f8760e1792e7cf9965d9c39cf237f6dee8c32f9c77e5cf7d2770a6f8d5bdf4c32b8a52f92dd2573fe67c909f7b18fdb9768cbf5dc0e427ff4696895f8d61e6533f0f96f5fbf98963e51fd8ebc433c7d2273fa9884ff3fe6344cdf4e74fb1edcf1f7b3892fcf21e1c4bbfb295658d3fed1cce99effcc195eceb492dcebbcac76f5fc39ed6b76e1238cfb59f9bf21761a9fdf12f70e351197b2a7b13c49c87748860e4b1dfc395fafbf7409c323e0c5f61e2dbc3ccb1ce73e57929f185cb37c7fa5e83e41564e4b7640b3893fdaa4a98f5adf5095ca4ca67557f099af99ef4ed0ceea6a63dda6338d0f536efcf43ede7ba9e890bbf503c4ef2391e6f68eab3d4fbc398ef25fd3cc2ec1ffb9ac2b5e6c743f5afb0995fe9bc42d9b7b099ef6a7de709c6fe57051cc8bf285e2cab7fb50338d1fca80ae15ce3496b0f17b2276dfbbc52f29cdc58d679f23dea9377946fd79ec381eccf616259f393470f6e14c6e80ff5cbab52eb4594a7a82ae54ba87f4731eb81db3e4cff996f61bed7feddb3ccfe66bdcfe5cfac2c07b277938eb8997fe8fc8e5f71d37f144fa8611b2f788539ffa07de658ebf73caf919ff2c7afe15af198934a9c3716d23c6f0507ca67e81596d1af091ccabe159163f5f70f384a75be05efcf1b0fd93c4ff26a66c3f2dfe60798fccd85de1f5bfb7f9bc05dc9773f8203c537be0630fb91beafc48d476beab757fbc5561f0f03c7ca7ffe837dfc95161cc9bebdffc0b1f46ffd01a7b4c703ccf7de73ead7e8afce73a47ecdf860cab7ee39563cf71966ff48bb74acfccc6fc71abf797ecef9b9ed35ec6b7cde4770207fe897f737ed217bd5856bcdb76f62cbf28f26b217715116d277f947898dbf7e5dc09c0fb308e042e3f3fc1b269ef42d7d4cecfea2af5b187dff3eb7ac7c9e9f040ef99e691b269ffc6709a78a5f6eecf3591fde4a3f92d4d77cf2fa114e647f4eefc4cdf8aff3f953d8577f1bb61debfb33bcaff197f47d9903ccf96d572f70a2f6f9d8c1c4efdabe63cd17915fd31f35bf38776c9ef7be87995fb52398fd6ac5bd63cd67a4bf49d35fb55e9bc3a9c6cb89ec7152448a373c22af222fb59f43bf3fc6dfe4eff6e198f6fb80f9be54ef0466bfe37c07b33f60aefe9226e4bb9dab3ea9b5ff7502a7e2f53bccf7843ed630fed6e8c5b1795eebdeb1fc01f5bf34ef2a1fbde8c2ec4f6afdc2ac9fb5afe048ebc5ed57987cec2284c987cb1ee14cf970238d276911e8fb06a3d8b191ffae038785fc09f91f998dcfece68ef5fdb10d9c4b7e3bcbe4172e4a98f3c7e792e771bf9efcb95fd897bc0f3f70aaf8fc41eddb1448fef050e56bbc51f14906e3ff8f5b70a1f5d7f6002e658f563bcbd2cf2bfbbc4af26d15708dfecade658d3facf59f9d63cdeffab0a7f65f9d59d6fae688e7e5c4e75a4bcb1a5faa0a0ed43ff6391ccafeb590471ea9fd7af67aa4f9fb48f62b2b3ab2870fb7702c7fe95bfe5b33fb67bd41f6214ff81ed2f7a963cdd7ff60f2c5f71730fb01978565d9cf1ffb3cd6e30fbf70a9f9f85ef2cfd30ef932bcaf99ff687f21cfb7f1bb1b1fe6bcecfd14c65fedc99ee4c703e88e3c788763f96fefbccfc6b7d63f30e7bd2d0f702e7b58509fa6bf693fc409ec4b7fde4796759e7bc5fb6d7b55a9658dd7d5031cb13fe20a8ee5affdf4e14cfeefa97d7fa1fbafd57e79e1c9de1da42f856dbfed27cc79367bd5a74858cf38c430f9e3bb5f98f3413ef97d8abf70a6f1a468e4a9f32ae7704cbc780157f80f6bcbea1f05e56bc677e5576afc2c9af9b2e28994afe92fb26725ecc93f6bbfc39ce7fe7ee558feef1446de1f5bc75a7fb98643c5efaeba30df676a3fc3a9de97d9f7a5ea7fdf6398f9d8a3faf731deabfdd64f30f679f702479a9f3d0670e37198f6bbb6acfcffc73e9ca83f8e168e755ed89d637d8fec1e4e75ff84fa37eebdfcc389659d5ffdf200172affb7de5736f656f659f52913ced359547017fdf886f9ded5620147b207cb1798f589ef5fcbc4a76f60f2697e52cb7c7fc45e277f7ea4f1a86cf44de3e3134cbc6cf806331f381fc3f81f1f03187fc3bf8739ff67d481f137da978e35be523f3bbffaa63c39f969edca32f61ef9e47c5fa03d8303ec450f0ea58f15e5cf394fb96e3bd6fad9b563e5efe696355e2f7b8ea5afc8a7b11fd2f78963e5b73c38d6f865df9faa3fec333853bee98dfa4759f8b9bee7fd6c59fa753d8503f4197936fe8029ff8ef75b7fecda3e2f56becae3c1b2e293f71dc7fa9e02fad8e8bbce077e71ac7cce1bc7da6f6e39557f7c44ff8a4ceb0f3bcdb72aeb5f7c6f1dabbfae1d2bfe29fb5225e4231c12cbf88fb2bf955b5f1bc0a5f4ed5bed511d0f3430f6720327f2bf2f17702afdbdf88633f98be7079878e96f6d59e3cd700e731e62aef1f2b83ea17c981798fcd1b727c7a6fd6a0f0ea46fcb8d63c5373fe0107de6fd8d3e6aff7ee158f996118c7fb9b2e5217feb7de858f924d4bfb1bffa9e6900e71aef0e63b8d4fde389e54cf9793e5c6bbd7122fb5835fa267b75ed58ed7f03c75a8fdb3dc399ecef5ee37f6dfdcdddc2b1fcd3251c2bbe714861be0fb93b3896bdf883d98fbfb4f7f33da983bdbf603ddf874bf2c5edfb39af7f29fdab53beb7b495bdaa33becf9469bcae9bf6977cef60fccfd5b96373bda63cd61fad9e2d4b3f1603c7a6feabad63eda7cb61e227ad0a667c6d8f1c6bbef80547d2cff69d63a34f651f4ed5fead399cc91faa6a38977e9d9470217bf5bb872badbf9ff2fe82f5ba8f6b98f8cfe7a365e9d383bb2e7d39431e45a0fd8927b44f11e5ca770e1c6bffcf2b8c3fbd7f72acf9ffb56323affdb363edc7b0e549645ff7be63c50bf68eb51e63afa77afffec1b1be875758c61ed2fe6547f1bd9dd1e7465bd8ffb93b858947ec7a30e7117c5d8a53bec7b68c61ce871ce5621befbe18c395e2059b27b8e67ba4b762eb4f8f4a187ffab5e358fb7b1f1dcbffb870acf3981f1cebfcdd2f18fd5cf61d4b3fedf342dd5f788e15bfb0cf8bf03f378e75fdcbb1d6e33ee158f7bf457022ff7431b62cfd6bbfc0c42fe6f79665ef96278e655f3398f94085fc9bf980ce4b469e8dbe9ae70d68af463fe54f2696a58f3b7b7fe3d01a9ec28d877ce49edaff98ffadf5ee7771a32fb27f2b98f9df228489afecce60ce0b5de6b08da7cde11c7d3b874bed07fa1a8ad35ccfdbf4e152fed786f2651ee7d11470aa7853ff1ece343fbcfc8259ffbfd83936d7071730f3959f8d639d1ff22ab6f39395654ffa57501febffbd6fe1007da13e8dbe283f6300c75acf5c9c5b967d6b9fc009bfdf3a967ffd00a78a0fbdb6e05cfe5f95c005fcea58df2768c3a5d69f5e67e2a2c3f87be558f94b6bd8d3f8da7f81d98fd043de4544fcfbc172aef9ffb765d9bbb36bc7e6f9271e1ceb3c8c6d6c59f67637b62cfb7a953bd6f955118cbdfcbe71acf521c71aefbf6fe18c7896f4cbb3f189450d73becefe1a66bfffe20db6fa7b6259e3f706b6f9ed5bb5bf97f9c4f76770227b397e8059ff39ff812be9f319cfcbf8fec8706959fa375c3936f2192ec476fe72b985f93ee5a80bfb8c8fef30f1d537dfb1ce33423e79acf2b69f2c4b3f7bb163e5d7fc5a96be2d3f61ece1c13e2f517ceaf20033ff6edf3bd6f9951b98f3c01707c72aff95658de723dfb1becf9ec1b9e64f650a17f24fbfedfb6abd6fdfb22cfff26d226efa83c6dfae65d9dbbf5738947effbe39d67ce6e058e7d7dcc191fc8bbf8e65e63713c7a67c7f73c71a2fd0c7a6bf68bdf6dbb2e6f7279165e5a38d9f1cebfc80104e949f30cee142fd7ba1faf86ebef307937fbdb35c4aff377abf9f32df3e485ffd8c7cff5125b6f389e2cdb1c6cb7b18fb38dac009e3eb014e65afb2b563cdc779bfd587c5155c305ffe73acf78530e7a7cfef1ceb7cc7be638dc7bf70a5f7ad7a8ef5bdbf7318fd99cf1c9bfefc165896bdfcb6efafb57f65311217f8effd9665e5536c7dc7cabf0a1ccb9f6cc35de9c329f52f7cf5bfc753cb8ad7f7ecfd81ecf5a37d7e207d192de190f9fec4b1e20bc8d3eadfc5c4b1d683a770adf30dee3a96b51fe01bf9941dd9f7bde41bd878e4f737ccfec9c31ae6fbd67bd52f48f97ed32a84c9ff1fa9bf07365f63f00167ca77f8953d0cecfce8700933dfd9c5b02ffff5fcd4b1c69327d8ce9f7f60fcc3d5278c3d6c7760e22deff63af1c5f60e66be53f88e651fedf373d9cfd3014cfee91af935faa578befa7fd0e887ee9fc09ec6f3cb3fcb8aeffcf41c6bfe34867df59fc3c8b2f4f1776999fd987f8e951ff4ee58e739d796150ffd39810395aff76c59fec2df8b65f9ab0f0f8e65df689f22d4f9b3f38963e583be38d67eaeb563c54f6dfd42d5f7f1c7b2def7d7752cfbfbe658cfb7d723cd3f7b1dc79a0fae1c2b3e7b6b59f2e92796e5af9cdf38d675fb3ce227bd47cb6aafde9363539e7eec58fb83d0d7663e287b2dfd0fedfef4ed29cc7ebf1f8d2f61ea29feba8c60f677fee9fdc77c149d4f7501d7f29f275dcb8a1f9c499fc2c6df50be501f66be77b973aceb7bc78a8f7dc3ccff5627702cfbbadac08c0fa7f796d59f6aca63fbcfebb363c5fbedfbf09717678ed51fff60d65b3eefe052ed3dbf822b8d477de493735eedc0d6b7d6f8b1fe73acfe7fe958f645fd392c6cfe606259f6f72a76acef472d605ffde16c0807b20fbd9665edc7fadd59967ff4f36319fdf61c1bf99ed8f7878aa7bcdd5a963e7f3e38d6f3e796a5cfbd191c69bedbef5a96fde87b8eb5bf62e2d8bcef676b59f5dfd8fbd1f7d3369c68fce8a5702afbb17b8273c96b217d8e9242feca40f53f7e4049f3bf031ce1afd470acf61d798ecdfbca7398f9d8ea03ce24ffb35398fce2f78d65d9e7fdbd65d9afd60dccfcec2a83c9f71dbd5996fd6a49be51e38fca3f1e3a967dbb83bb1aefcf2f604fe55b2f2cab7d4e3ab02f7dff2b2dcb7ffe7b8203ddbff52cab3f2c7e1d4b7e2bcbc4d3ae60ce1fdea596a50f7f9163c57b6e1c6bbde8cbb1f4b30b4792e7f2c3b27edff7e158fabeb3ef8f95ffb6d3f81b277c7f70df83f91ecc52f2685a9ff86d6659f6723f86397f6815c0ec273a577f3fe64799f2dc70bdb1673abf9df75b7dfaf88013c9ffe3d2b2fc81b73b18fd7affb22c792e4ee142f6edf5c9b1b1afef1f8e75dee5dab1f69f7a96357eb57f60fce3bae358e7f54e2cabfd4e6d79998f7ec796d51f3fe43fc48d3fa2f3d1668e8d3cca53c7daefc1fbec7a6a4dfd0b4fefab1f1d1bf99c14b02f7bb77cb72c7d797d8003f9cbbdccb1e66f9565e9c7d9a363f567f77bd9a3d5020ef5feb7a9637d5fe3deb1f673dd38d6fa98954728ffe9efd9b1d6fb1f1dcbdf7d71acfcae6b18fbfa175856795e1f1d2bfff9d9b1ea67cb47fc7adf71ac78b59537fbd9fed68e35de3c59c6bf6c59567bef3dc7f2efbb8e357e8570227decb72dab7cc3ad658d277be95be2d643f4be24e57ce381c6b7637e99be57b887d9cf7826fb97343d5cf9202730e709b5bb8e156f7d8133f5c7410f2ed55fb367c7da3ff00a57ea1fab77c7dadf6b9f5763afc796a57f63b557331b977e9c0ee1aefca5f5dcb27edf8f2cab7d5b5318fffe6de6d894bfb2cfa7bf0cbf1c6b3e780bfb9a8ff79f1ccb1fe95996ffdeb3ef0b355ebd5dc3f8c3672318fbf67a6759e5dd4bfe69c2f78ab6f2bf52779e84ec759a7bcae719fcc1ccaf06bf702cf99c9dc3e4079cf1bc9c7c9ecdb3659577f4ead8dcbf5ec195e435185856ff2d4ab8967dad9f1dabfd644f523b5f3f9bc05dd9d745cfb1f27322cbea7fa739ecc93eaee630e36f9ff735fe9dce4378b0acebf3b163cdb7de2d6bbe319e5a567ce92f86b13f3fbf8e75def2d2b1e291d730f6e17701d39fbfd4de59234e7dcf51f2cf9a16d6fce69facfe790a67f2bfde9730eb196763b8d6f856bf3836e55fad1d2b1ee93996bff5ee58f9f89563c59354dfccc6bb177dc79abfafe02efecd0fec491f3eef1debfb4f218cbf5d9e59a6fd02187ffac6de1f2adedd4b60fc97adbdce7cf1348363f98bbb199cabbdbf24afdccafffc172e15ffb8e8c17cef7e20fb981f57788cbc0770a6feb44be042fde330844bf923ef6bc792f70aaec827557be58d3c955ffceb58f9614bcbea2fcbb563f91b4f7057edb538817dd9afd5d2b1e4f30033bfafef61ecd105e5b7f6677707277afe23f2280a9dd7b050ff28ec7afbb20b87e2dd0ec6df5b0630f9a8db73c7a6bd2e34fe1cf3cbd43fb89ef33dc08b018cfe6f789ef5f7d76f702d7f6c055b7dbdb884bbe4f7dc3a36bf1f8f61e437f160fc9fea09e67c853fdfb1ecc1cab1fc638dd78d36f0bd2ab57769e7fb27295ccbde169a4f95b63fedee619baf247dab9af15ce7cdee61be87d293ff54e5ec673bbb844bd67755de3ae57b7b5f1398ef195ea87f1ff31174be83e20bb59d3fed1e60d67317a6fccdd540e7817c19fb571ccfb3d27ea210e63ccafe83d8ce279746bec7d158f9ad3b33fe1ea3abd2bfadd187465b53edcf6e1b7fa636ff1cf9f6fb3fcf9fcadb6efde7f8fb4f5ddeacf9cbdb85f92bdb55bb6ebfb6dfdaf3e66fd1fc2df95b99bf75fb9dbf0ffe3ecddfa6fd65feb6ed6ff3b76befdddfa1f9efcfbffbfbe5efdfffbbbfe6eff8bb93e689efed5ebbdffc954d79f2f6e97ffaf29eb5cf9bbf8be6bf83f6657bd81eb5afdae3f6a47dddbe69fe6c796f9bbf6379a7fccdda77ffaebcfabb6f3fb41fdb4fcddf73fba5dd6977ff3f65f5fec3dfbfbf76acdb77f39463898f6f3896d96f07ff0be50d9bbffff9f27eb4a376dc4eda69f3d0562b6be5ada255b6aaffd3e56dd5cdbff55baf2a6febad356f2d5acbd6aab56ebdb73e5a9fad4debabb56d7db776ad7debe0f481f2b67e5abfcddf5feba4d56bf55ba7adb3d679eba235685db686ad51ebaa356e4d5ad7ad1bdabf2963ebb6f99b367fb3d6ecff556e5bdea6c4adbbd65d23bbcbd67debe17fa1bc8fada7d673eba5d569755b5ecbff1f96376885ada815b79256da7486e38e91c669cbcaaccaeaec357bcbe6d9a2d1e8ff43e5cd96d92a5bd9f2b687d93a7bcf3eb2cf6c937d65dbec3bdb65fbec90fd64bfeddbec2f3bc94eac4e34ffbf97f5b3d3ec2c3bcf2eb24176990db351f377958db349769ddd64b7d9349b6577d97df6903d664fd973f6f23f2caffa1d253632e9b5ee1b59fec7f276b26ed6fdff2d6f334e66c1f16bab599c25599ab773335b309ad594373f9ea4d378478d0750e7aff95b3ecf17f9b2f95be5ebfc3dffc83ff34dfe956ff3ef7c97eff343fe93fffeef9737ffcb96f949decb1bedce4f6d79f3b3fc3cbfc807f9653ecc47f9553ece27f9757e93dfe6d37c96dfe5f7f943fe983fe5cff94bde39e60c993fffb87ad894346cfe3e9abfe818ed6b6654eda255347e7dd1b8a24555d4a6bcc7bfa6eca6bcd8b7e2d5d8bf43f156cc8f3a512c8ae57f2c6fb12ad6c57bf191adfe63798bcf62537c15dbe2bbd815fbe250fc14bfc55f7152f48a7e715a9c15e7c54531282e8b61312aaeccdf98f2ea7f3f8a49715ddc3433fadb625acc8abbe2be75f3bf5dde87e2b1782a9e8b97e3ba47e115c7f5e8e31ac0310e9496edb2d5b8c38dd358966555fef7eace63b9916c49b0fbf98cc61e1602d266155a6b1d3b00a1b55666f3ef730112f99864557675bfd5e3b1802048cb03875f77bf01646614c44112a44116e44111944115d40f25688236e85ef4afa8d6c1108c4feee7a00e2670ccc112acc11660011e100119501fbcbddf79f1f2050474403f8d816ff6dd37600236e0feca37e00321106f4a200572a0046aa0057a600466600576e0046ee0057e00019a00fef07cf39b6f0d1e4702343804c7e0149c834b70fd777cc37db80b6fe13d7c8441188651183feb59988469988579588465588575d8846dd8857d3884633881cb395cc235dc422cc4432224432aa4010c8005704111f2a1108a3739944239544235d4423d344233b4423b7442f7ed0c6e3bdff2e2575d0bbdd0ffe10b857088846878088fe1293c87975d165ea37db48b6e1118d6a3200ac1c01c474994465994474554465554474dd4465dd4474334465334474bb4465b844578444464444574c4446cc4457c244462244572a4446aa4457a6444666445f6270ec00578001f0045f0cbd78e90bff28dd0e8101da353748e2ed135dec7bbf816dfe3471cc4611cc5719cc4699cc5795cc4655cc575dc00daa07f88cf551577711f0ff1184ff11c2ff11a6f3116e33111933115d33113b33117f3b1108bb114cbb112abb116ebb1119bb115dbb1f3c1d7bc88ddd88bfdd87faeb918fae91bc33112a3f1213e4697188af7e1e5e57b8acff125be3e7d937db24b6ec93d79244112265102be95a44996e44991944995d44993b44997f4c9908cc994ccc992acc99660099e10099950099d30099b70099f08899848899c28899a6889fe89f1c1db3731015662274ee27ef74dbcc44fa0044e90e892a0c921393e7d9353724e2ec9cb178c96bb1434d5f49e3ed2200dd3288dd3244dd32ccdd3222dd32aadd3266dd32eedd3211dd3299dd3255d015b8aa5784aa4644aa574caa46ccaa57c2aa4622aa572aaa4ea07ef3c7efb7ecea15daadd7fcc934fdf547ffba6466aa6566ac78fd4f9cdd705be5eeaa7500aa7488aa687f4989ed2737a49af604cde65b7ec0e167390855994c55992a5d9f32bcf8aacccaaacce9aaccdbaaccf866ccca66cce966ccdb6b76f86017000012033eae99bd1bb306332f6a76fc665fcdb371332319332395332f5ab6fa681a145cf8cccccacccce9cf490b99997f91994c11992a1d9213b66a7ec9c5db22b183f779f80d6993ff2200ff3288ff3244ff32ccff362efe4655ee5f5dbf7e67ff469d0fd0230198d7903687741e8ffccdfbccbfb7cc8c77ccae77cc9d77ccbb11ccf899ccca99cce999ccdb99ccf855ccca55cfef0cd955ccdb55ccf8ddcccaddcce9ddccdbddccfa11cce911ccd0f2f8ef9293fe797fc0ab6263b3054dd8b47010a5d111571911469911539e0f955022a405d34459b584557f4c5508c7f353f145331174bb1165b3e175881174441165441174cc1165cc1a7fb4228c4b82da4274fdf422e94422db4422f8cc22cacc22e9cc22dbcc22fa0022e90022d0e2f8ec5a9381797e25aeecb5d792befe5a30ccab08ccab84ccab4cc4a10e6a7ea4e0513f233aecb237de66c59965559974dd996dd77dfb22f87722ca7722e97022bd7720baf2556e22551922555d2715232255b72255f0aa5584aa55c2aa55a6aa55e1aa5595aa55d3aa55b7aa55f42255c22255a1eca63792acfe5a5bc82316b57ddaa7bf5a8822aaca22aae922aadb22a07e12cabaaaaaba66aab0ed003866aaca66aae966aadb60aabf08af8ee5b91a95e51155d3115fbf4adb88aaf844aaca44aae94aff95ba995f6ac0f955e19955959955d39955b79955f41155c21155a1daa6375aaced5a5ba3e87f9faf61c7a404b0eeba88eeba44eebacceeba22eebaaaeeba66eebaeeeeba11e011360ae977a056c000c80d7f877df9aa8c99aaae99aa9d99aabf95aa8c55aaae55aa9d55aabf5daa8cddaaaedf45ea999513bb55b7bb55f43355c23355a1fea637daacff5a5be8216ba6b6ecdbd793441133611682c49933619583c4553365553374dd3365dd3374333365333374bb3365b833578433464433574c3346cc3357c233462233572a3fcf46dd4466bf4b76f633466633576e3346ee3bd7d1b1fb41b3f331aa8811ba4419b43736c4ecdb9b934d776dfeeda5b7b6f1f6dd0866dd4c66dd2a66dd6e66dd1966dd5d66dd3b66dd7f6edd08eedd4ceedd2aeedd6622dde122dd9522ddd322ddb722ddf0aadd84aaddc2aadda6aadde1adf7d5bb3b55abbd15ba7755baff55ba8855ba445db437b6c4fedb9bd3cfb31e86d8fb86cafddbedb75b7eede3dc0f8187651177749977659977745578234acbba66bbbaeebbba11bbba99bbba55bbbadc33abc233ab2a33aba633ab6e33abe133ab1933ab9533ab5d33abd333ab3b33abb733ab7f33abf833ab8437efa766877f86bdfeed89dbaf36fbe97eedaeffb5d7febeffda30ffab08ffab84ffab4cffabc2ffa122c9bba6fd22143fab6effabe1ffab19ffab95ffab5df7aacc77ba2277baaa77ba6677baee77ba1177ba9977ba5577badd77ba3377babb77ba7777befbb6fef3f7d7ba8879fbe3dd2a3fda13ff6a7fedc5ffaebb01f76c36db80f8fcc1e82211ca2211e9201e80cf9500ce5500df5d00cedd00dfd300ce3300df3b00ceb003af180bdae97011f88811ca8811e98811db8811f84411ca4411e944fd4411bf4c118ccc11aecc119dcc11bfc011ae0e1477c07b4b586df7c87e3701acec365b88efbb76f218f3b30fadec6fbf80083783846633c26633a66633e16633956608937633b76633f0ee3384ee33c2ee33a6e2336e22331922335d22333b22337f2a3308aa334fef21d95511db5511f8dd11cadd11e9dd11dbdd11fa111feee3b22233a1ec6e3781acfe365bc82d6bd9b6ed37d7a4cc1144ed1144fc9944ed9944fc5544e15283bcdd44eddd44fc3344ed3344fcbb44edb844df8444ce4444df4c44cecc44dfc244ce22401e44999d4499bf4c998ccc99aecc999dcc9fb15df4f267f82267842c0e328b8f77afcbb6f373d7da7c3747cfbf6e8749aced365bacefbb7efbc9b6fa0a5dcebf3fc9883399ca3198cbe7332a7733683c6087cf1b99cabb99e9bb99dbbb99f87799ca7797efbcecbbccedb8ccdf84cfc3bbe333953333d33333b73333f0bb3384bb33c2bb33a6bb3fef49d8dd99cadd90638b33b7bb33f43333c23333a1f7a7d3ecea7f93c5fe62bd8e0ee96db725f1e4bb0844bb4c44b3209f3bca44bb6e44bb1944bb5d44bb3b44bb7f4cbb08c6fcf655ae66559d6654be5055bf0afcfe1bff75d88855ca8855e98857dfb8221c3999d855bf84558c4455ae44559d4455bf4c558ccc55aecc559dcc55bfc055ae00559d0e5b01c97d3725e2ecb156ccb76eb6dbdaf8f3558c335faeebbc66b02c6e56ccdd762052df64fbea0fd356bbb76d371edd7611dd7699dd765a1d675dd566cc55762365772beadd44aafcccaaedccaafc22aaed22aafcaaaaedaaaafc66aaed66aafceeaae1e38fc155ae11559d1f5b01ed7d37a5e2feb75db6fbbedb6ddb7c7166ce1166df1967c926ed9966f45ec6c658f6c7ff4ddfe91efd66cedca6cddd66fc3366ed3366fcbb676b76ddbb00ddf888ddca88dde988d05a9cc6dfc26cce8266ed2266fcaa6aec74ddbf4cdd8cccddaeccdd9dccddbfc0ddae04fa00d59d60ddd0edb713b6de73ffa5eb62bb6c776d80dbb638ff18a05588845588c25580ac6fe1c0343105681e1a3c15aacc37a6c48196cc4266cc6166cc5360cc3708cc0488cc2688cc1588cc3784cc0444cc2644cc1544cc374ccc04cccc26cccc15cccc37c0cc2e054c1100cc50ed8113badf98261e7b5c02ed8f5e6e3fb7fee8beff01b7ec71f7880875f7df1088f414b4d407b4ac1c625c70bbcc42b303e35788b77788f0ff8888312812ff88a6f3886e33881933885d33883b33887f3b8808bb884cbb882abb886ebb8819bb885dbb883bbb887fb3884c3ffc4174770143fe047fc849ff10b7e25f6c48eb81177e24104444844444c24440a36563951102551116040225aa2237a62204662226662215662233002270882242882261882253882270442242442261442253442270cc2242cc2261cc2253c804f40044c2004fac98138860e7122cec4056449f257bec4f5ab2fb92777e48dbc930f32f8932f19921119930999921999930559921559930dd9921dd9930339921339930b09529fc43699c4498224498aa44906574996e4481e209022299132a97cf04f7c4995d4489d344893b4481b546b9f74883de9921ee99310099308899207f2483c374a27f24c5ec82bb5a776d48dba538fe7469c8aa8984aa894caa83c66a9822aa98aaaa9866a318ceaa89e1aa8919aa899028b98da288cc2298222298aa22906c0521cc553022502244a4ed5a59bfc2da1144afd6b5f4aa374caa05ebe9445d99443b99447f95f7d298882299828288442a90375a44ed499ba50577a4fefe81b7da71f744065744847744c27744a67744e17744957744d37744b77744f0ff4484ff44c2ff44a6f3446e3344193144353344d33344bb3ffc497e6689e1668919668995668f5138dd6698336dbcb4ad0166dd30eedd21ec0a7211aa6111aa50ff4913ed167fa425f993db3636ecc9d79300113321113330993321993330553321553330dd3321dd3330303861e666266666140816430066708860481a6198661196ea733fc9f7d1981118b8df9cd979119e5e9cba88c369b8cce1829cb98008bb1198771198ff1198881198441990373644ecc99b9305776cfeed81b7b671f6cc0866cc4c66cc2a66cc6e66cc1966c057c9f4365cd366ccb766ccf0eecc84eeccc2eecca6e2cc6e22c813dfee4cb922cc582dd1bcbb0ecb2beab08cbb13c2bb0222bb132abb02aabb13a6bb02615b0166bb30eebb21eebb3100bb3083850f6c01ed9137b662fec95dbbfd87137eece3db80010721117730997721938522ee70aaee42aaee61aaee53aaee7066ee4266ee6969bc7addcf6275f0ee3f0d6e188afbe1cc9516f5f0ebc041ccb711ccf099cc8499ccc299cca699cce19c0146111cee42cce06389ccb799cff02e2600ee150eec01db91377e62edc954bf93dbf03dcf83bffe0033ee4233ee6133ee5333ee78ba76fd5f0e59f7cf98a079b4cbe7d207cc7f76f5f7ee0477ee2671e0c38fcca6fb3f59c7e679bc7789c277872aa788aa7798667798ee779818579919778f9a6f00070a902345ee70ddee42ddee61ddee53ddee7211ee6111ee50ffc913ff167fec25f85bdb0136ec25d780881100a91100b89900a99900b8550fef4152aa1161aa1fd3b5fa103034eff612c0cc018f80aa3004645611156611330010731b681b10c2c81af403c01d6c05720054aa0054660054ee0054110054990054550054dd0054330054bb0054770054ff0054880054440858370144ec259b87cf715aee25edc95b578a315f1fef6151f6220866224c66222c6e9affd90988a99988b85588a9558031ab1153bb11707711427110ca32218ddc44dc4445c24441214555a644456e4445e144451944459544455d4441d6088a66889b6e8882ebf133dd117a19b2bc22222a2e2413c8a27f1fcdd57bc8857692feda4df7ca5bbf49002297cfbbef79b4f5f2992e2b7af94880d9b49a99449b95448a55449b5d400aa2200b75ba9937a6990c6e726439aa5455aa54dc224fcc357222452a2245a622456e2245e12b07b814ba22449b2a448aaa449fa775fc9904cc9926cc991dc8f0ef8f2f5245f8224584224543a48c7b87cd25ea59374962ed255decb3bf926dfe5871cc8a11cc9b19cc8a99cc9b95cc8a55cc9b5dcc8addcc9bd3cc8a33cc9b3bcc8abbcc9988ccb844cca944ccb8c0c16b3cccb822cca922ccb8aacca9aaccb866c022cd9961df9c7f975d9937d19926119f92b5f19950ff2513e3dcfaf3f7de573edca17f92a96ca5ebe2b3bb0b4eeca43099450899458499454c9945c2900a55229b5d228add229fd6b130c3671caa2accaa6600aae106060a0145a611456e19e49af888aa4c893a7288a0ad0145d3114f3bbaf6229b6e228aee229fec70e4f81c0012b88822a07e5a89c94b37251aeea5edda937f5ae3ed4001ca11aa9b19a3c4f8eabb95aa8a55aa9b5daa8addaa9bd3a00c0165d9dd4595dd455dd544cc5554205cdffd98c5456e540011154519554191c8aaaaa9aaaab866aaa966aab8eeaaa9eeaab90fa633faf582aa2a2ea413daaa70d7afaaa67f5a25eb5bdb6d36eda5d7b6881166a91166b0938522dd372add04aadd26aadd15aadd3fafd5e1bb5499bb5455bb54dc3345c233e21354aa3354663354ee3354113354993354553354dd33503782ae0a6a9599aad399aab799aaf411aac211aaa1db4a376faeeab9db58b76d5f7fa4ebfe977fda1077aa8477aac277aaa67609dbfd0f32f148052aff45a6ff456eff45e1ff4519ff4595ff455df744cc7754227754aa7754667754ee775e1b9bc7459577455d7745d377453b7745b777417e0e9be0ee9b08ee828e0a01ff5937e065cf4eb775f636fec8c9b71371e4660844664c44662a44666e44661946f5fa3fa174f5f110b07a3361aa3353aa337066334266336166335360333c0e6c1200cd2a00c3084188cc11a9c014ab1211a92211b8aa11a9aa11b86611ad60bdb700cd7f00cdf800cd8400cd438bc381a3fe26b9c8d8b7135f7e6cebc9977f36106666846666c26666a66666ee65f5d9f9885598203a0e76665d66663b66667f6e6608ee664cee662ae26d85a9a98899b84499a94090627933539933705533425b0fc1553353553370dd3342dd3361dd3353dd3372113361113350fe6d13c9967f347bf30afd6deda5937eb6e3dacc00aadc88aadc44aadcccaadc22aadf2bbaf557dd89ab955837b8dd55a9dd55b83355a93355b4b75b5566bb3300bb7088bb4288bb6c0e868b11667f19660899664c91658369666e920b8a66559b6e558aee559be0559b08558a875b08ed6c93a5b3f7cadab59da7b7b07b87d72073c000120fc7c9b37063cbe90fc466a67766e17766957766d37766b77766f0ff6684ff66c2ff60a001b791bb3719bb0c1b6c0a66dc666c188c4db822dda1271b1655bb1d50db6355bb70ddbb42ddbb61dfb47fd155733073e1ec0073c5d9fd75f7d21c0f3f6575ff813040083df41ed837db44ff6d9bed85767efec9c9b73771e4ee0844ee4bcdf284ec0963e753227770aa7742aa7761aa7753aa777066774a6e729246775360773708770488772e8efbe2f9fe897cf1ef0f846f0c9fb3ef899cf8c78568adc2c1ce61965877538870797bc2338e20bd034c13df9e50a8abca33aa06859bca33b860352d6b11cdb711cd7f11cdf811cd8411cd4393847e7e49c9d8b7375f7ee8fcf4fdaa17b03c71df0701f3f5ef7efbed187af1b7cf0ac6f2f5fc40dddc88dddc44dc191017240e11660902cdd0a50bb3568030da0753bb7779e256170477772677771577773311777099774299776199775399777851fbe2f17570448aef4b7317e13bd1efdc5678c3f314b577ea1b8aaab7d41ffe01963d7b0b7df62fc2a0daee5daaee3baaee7fa2ee4c22ee2a280837bfceeeb9edc33e002b8bad777fcfeced7db7bbb5fdcbcdb5ffb7a77c0c30bbcd00b9fbe5ef4490c48bc1434b2cecbbcdccb3f9cbdc22bbdcaabbdc66bbdceebbdc11bbdc99bbdc55bbffb7adb93f76bee61201fded17bc7fa5b3cbfe4ee377ec5f7c31a7f9ec279f9121fbc5a19e991201fba57843f63ec5180e7f69bf1588ff3784ff0444ff2640f0c353f7c554ffbf40575e0edeb8116e98186e399bff3bd2fffea1be5079fa6d60bdb733cb7e03cef1ddfb7afe77b3e8871ff8cb16378900703100fe1220ff50eded13b7967efe25dfdbdff63bd79cf41e8f6ddf7ef63f83da25f3d9fd7fedd7ff8811fbe88fcd84ffcf49dbfbffb82eef1ca620ff2b34f72bff04bbff26bbff15bbff37b7ff82b5f4f7dd5585065fd110c9520b69fbee59f5cfdd99f7fcf01f09dc55ffdcdc77cfce54b806bd2a7deae3e0d6000ec0bced1bc0c189b3eef0b3ed80cf9922ffb8aaffa9aaffb866ffa96ffe3f39ebff9469ff3c1e7abfcf4f97b9e86efeb4f5fc77741e87c1ff2e1cf08873efe25b6cf2c063ff08a31e05d274084111f051c5e994cf947ffe49ffd8b7f85f63f3e2f573e8176af5c78d55fe806ddbe4c8e5f62f985df9ecb478ca13bf48002105f1f5c0620b21f31c6bd97311442e1d3f7d9335e317e9e208aa018903c579d8f4029944139544025544135d4402dd441fddffa865f6bc3dfc5f25fbebfdf7ff90ed0084dd00c2dd0ea43d0234d419c9f1f1bdcbec6f7e9fb8af13387157b8530087fd50810638880488882688881588803070ffde8179e0a8990f4eac9c013927fe71d4748f9e0bbf73367dfbe3e9ea6900a69900e199009ad900552cc712f900b81120001f9f71cf1f6fd55d70ce8f50526a10f5f18422014dc3e403ffa0574fae5fb9ec39e39f1ddf7fcc19f7ca10b7485f7f00ebec177f80107700847700c2770fa3ff6a52112cee01c62e1e2bb2f5c022a3087fdaba785ffeaba7f9703efe7f35c974f6757866b68f457b8815bb8837b7880c7888227788617787df78bd79b41188c3dfb32c8dd17cf8c78fa822784bef201866018870998842938877fcc67ff9eef731dbe7d610666610ee6610116610996610556610dd661e3edfb6b4efbe6fb9c7e7ef33581b10983dbb0f537beff9a115e75ed35078319f1237ebff37d9dbd3a9a0d7c6dd8815dd0aafce71f0923300a1fe0237c82cff0e583a7dfd3154cee608287afcf8fdf2337640f611e85dcfd13f2b0414c9100ccf4381242341221f11f7c9f991b42bb676d7bfb7ec4ef9ff8220992221992230552221552230dd2221dd22303327ef57ded35568f4626644616644536e4f63ff1453004873ea64a3009230442c0957b037b34b0d3fc5a817ff7fb0ef025110aa111e6793a18e1110111110991110551110dd111e36b1e202662818d8983b860680065ccaf10d8831004e4ab0556198da0c80139222798407e9cef03be187241ae00e215ebf27fe7ebbbcfbfc681ded0e73f8016a0211aa1319aa0299a219a7f037b8c6fbe688e16688956688d36df7dd116edd01e1d601c1d7ffaa21360461774059713ba3df71bef5afccf7c510cc551c2615112a5501a655016e5501e15501195501955deaecfbc7dfaa22aaaa13a6aa0266aa136ea80d1dcf320d090219b4021008c22288a1e60f36f7d17f40838fdaf7dcfe8c5e1d1eb617fd81d9eff45dbe3101cc24374880fc921fdee7bc80ef9a1389487ea501f9a437be80efdd317b640fd05d5f7e97b180e23c8881f9f97fb4fe03fd5f73f87fffa7ffff7fffc7fb4a75040</data> + </image> +</images> +<tabstops> + <tabstop>KbfxPixmapLabelSiraj</tabstop> + <tabstop>KbfxPixmapLabelPhobosK</tabstop> + <tabstop>KbfxPixmapLabelNookie</tabstop> + <tabstop>KbfxPixmapLabelNathanael</tabstop> + <tabstop>KbfxPixmapLabelJohnny</tabstop> + <tabstop>KbfxPixmapLabelEphracis</tabstop> + <tabstop>textLabel6</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">qevent.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgabout.ui.h</include> +</includes> +<variables> + <variable>QString KbfxMemberTextJohnny;</variable> + <variable>QString KbfxMemberTextEphracis;</variable> + <variable>QString KbfxMemberTextNathanael;</variable> + <variable>QString KbfxMemberTextSiraj;</variable> + <variable>QString KbfxMemberTextNookie;</variable> + <variable>QString KbfxMemberTextPhobosK;</variable> +</variables> +<slots> + <slot>KbfxUnmarkAllPixmaps()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function specifier="non virtual" returnType="bool">eventFilter( QObject * obj, QEvent * ev )</function> +</functions> +<layoutdefaults spacing="6" margin="0"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgabout.ui.h b/configdialog/kbfxconfigdlgabout.ui.h new file mode 100644 index 0000000..7f4b739 --- /dev/null +++ b/configdialog/kbfxconfigdlgabout.ui.h @@ -0,0 +1,159 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgAbout::init() +{ + KbfxPixmapLabelNookie->installEventFilter ( this ); + KbfxPixmapLabelSiraj->installEventFilter ( this ); + KbfxPixmapLabelNathanael->installEventFilter ( this ); + KbfxPixmapLabelPhobosK->installEventFilter ( this ); + KbfxPixmapLabelEphracis->installEventFilter ( this ); + KbfxPixmapLabelJohnny->installEventFilter ( this ); + + KbfxMemberTextNookie = tr2i18n ( + "<strong>Name:</strong> Mensur Zahirovic (Nookie)" + "<br><br>" + "<strong>Country:</strong> Sweden" + "<br><br>" + "<strong>KBFX:</strong> co-author, Q/A, system design, web designer, bug hunter, project administror" + "<br><br>" + "<strong>Email:</strong> nookie@mail.kbfx.org" ); + + KbfxMemberTextSiraj = tr2i18n ( + "<strong>Name:</strong> Siraj Razick" + "<br><br>" + "<strong>Country:</strong> Sri Lanka" + "<br><br>" + "<strong>KBFX:</strong> author, maintainer, developer, project administror" + "<br><br>" + "<strong>Email:</strong> siraj@mail.kbfx.org" ); + + KbfxMemberTextNathanael = tr2i18n ( + "<strong>Name:</strong> Nathanael Dracor Gogniat" + "<br><br>" + "<strong>Country:</strong> Switzerland" + "<br><br>" + "<strong>KBFX:</strong> project technical writer, documentation manager, co-author" + "<br><br>" + "<strong>Email:</strong> nathanael@mail.kbfx.org" ); + + KbfxMemberTextPhobosK = tr2i18n ( + "<strong>Name:</strong> PhobosK" + "<br><br>" + "<strong>Country:</strong> Bulgaria" + "<br><br>" + "<strong>KBFX:</strong> package & release manager, Q/A, bug hunter, mandriva packages, project administrator, developer Qt/C++" + "<br><br>" + "<strong>Email:</strong> phobosk@mail.kbfx.org" ); + + KbfxMemberTextJohnny = tr2i18n ( + "<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" + "<br><br>" + "<strong>Country:</strong> Peru" + "<br><br>" + "<strong>KBFX:</strong> developer Qt4/C++" + "<br><br>" + "<strong>Email:</strong> saenzac@mail.kbfx.org" ); + + KbfxMemberTextEphracis = tr2i18n ( + "<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" + "<br><br>" + "<strong>Country:</strong> Sweden" + "<br><br>" + "<strong>KBFX:</strong> library developer for Raptor" + "<br><br>" + "<strong>Email:</strong> ephracis@mail.kbfx.org" ); +} + +bool KbfxConfigDlgAbout::eventFilter ( QObject *obj, QEvent *ev ) +{ + QCursor kbfxCursor; + kbfxCursor.setShape ( Qt::PointingHandCursor ); + this->setCursor ( ( const QCursor ) kbfxCursor ); + + if ( ev->type() == QEvent::FocusIn || ev->type() == QEvent::Enter ) + { + if ( obj == KbfxPixmapLabelNookie ) + { + KbfxTeamInfo->setText ( KbfxMemberTextNookie ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelNookie->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + else if ( obj == KbfxPixmapLabelSiraj ) + { + KbfxTeamInfo->setText ( KbfxMemberTextSiraj ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelSiraj->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + else if ( obj == KbfxPixmapLabelNathanael ) + { + KbfxTeamInfo->setText ( KbfxMemberTextNathanael ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelNathanael->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + else if ( obj == KbfxPixmapLabelPhobosK ) + { + KbfxTeamInfo->setText ( KbfxMemberTextPhobosK ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelPhobosK->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + else if ( obj == KbfxPixmapLabelJohnny ) + { + KbfxTeamInfo->setText ( KbfxMemberTextJohnny ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelJohnny->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + else if ( obj == KbfxPixmapLabelEphracis ) + { + KbfxTeamInfo->setText ( KbfxMemberTextEphracis ); + KbfxUnmarkAllPixmaps(); + KbfxPixmapLabelEphracis->setFrameShape ( QFrame::WinPanel ); + return TRUE; + } + } + +/* + if ( ev->type() == QEvent::Leave ) + { + if( + obj == KbfxPixmapLabelNookie || + obj == KbfxPixmapLabelSiraj || + obj == KbfxPixmapLabelNathanael || + obj == KbfxPixmapLabelPhobosK || + obj == KbfxPixmapLabelEphracis || + obj == KbfxPixmapLabelJohnny ) + { + KbfxTeamInfo->setText(""); + + return TRUE; + } + } +*/ + + return QWidget::eventFilter ( obj, ev ); +// return FALSE; +} + +void KbfxConfigDlgAbout::KbfxUnmarkAllPixmaps() +{ + KbfxPixmapLabelNookie->setFrameShape ( QFrame::NoFrame ); + KbfxPixmapLabelSiraj->setFrameShape ( QFrame::NoFrame ); + KbfxPixmapLabelNathanael->setFrameShape ( QFrame::NoFrame ); + KbfxPixmapLabelPhobosK->setFrameShape ( QFrame::NoFrame ); + KbfxPixmapLabelEphracis->setFrameShape ( QFrame::NoFrame ); + KbfxPixmapLabelJohnny->setFrameShape ( QFrame::NoFrame ); +} diff --git a/configdialog/kbfxconfigdlgbutton.ui b/configdialog/kbfxconfigdlgbutton.ui new file mode 100644 index 0000000..3d63e75 --- /dev/null +++ b/configdialog/kbfxconfigdlgbutton.ui @@ -0,0 +1,1275 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgButton</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgButton</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>613</width> + <height>563</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Button</string> + </property> + <property name="mouseTracking"> + <bool>false</bool> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>To change KBFX button skin, simply browse to the image you want OR just Drag&Drop the images to their respective place.</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBoxPressed</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>"PRESSED" IMAGE SELECTION</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel8</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Please select "pressed" image.</string> + </property> + </widget> + <widget class="KURLRequester" row="1" column="0"> + <property name="name"> + <cstring>KbfxURLRequesterPressed</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="filter"> + <string>image/jpeg image/png image/x-xpm image/gif</string> + </property> + <property name="toolTip" stdset="0"> + <string>The Pressed Button Skin Image</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can choose the Pressed Button Skin Image</string> + </property> + </widget> + </grid> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox10</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>322</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Preview</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KbfxPixmapLabel"> + <property name="name"> + <cstring>KbfxPixmapLabelPressed</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Pressed Button Skin</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can Drag&Drop the Pressed Button Skin Image.</string> + </property> + </widget> + </hbox> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBoxNormal</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>"NORMAL" IMAGE SELECTION</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Please select "normal" image.</string> + </property> + </widget> + <widget class="KURLRequester" row="1" column="0"> + <property name="name"> + <cstring>KbfxURLRequesterNormal</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="filter"> + <string>image/jpeg image/png image/x-xpm image/gif</string> + </property> + <property name="toolTip" stdset="0"> + <string>The Normal Button Skin Image</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can choose the Normal Button Skin Image</string> + </property> + </widget> + </grid> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox7</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>322</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Preview</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KbfxPixmapLabel"> + <property name="name"> + <cstring>KbfxPixmapLabelNormal</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Normal Button Skin</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can Drag&Drop the Normal Button Skin Image.</string> + </property> + </widget> + </hbox> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBoxHover</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>"HOVER" IMAGE SELECTION</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel7</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Please select "hover" image.</string> + </property> + </widget> + <widget class="KURLRequester" row="1" column="0"> + <property name="name"> + <cstring>KbfxURLRequesterHover</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursor>0</cursor> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="filter"> + <string>image/jpeg image/png image/x-xpm image/gif</string> + </property> + <property name="toolTip" stdset="0"> + <string>The Hover Button Skin Image</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can choose the Hover Button Skin Image</string> + </property> + </widget> + </grid> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox9</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>322</width> + <height>150</height> + </size> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Preview</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KbfxPixmapLabel"> + <property name="name"> + <cstring>KbfxPixmapLabelHover</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Hover Button Skin</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can Drag&Drop the Hover Button Skin Image.</string> + </property> + </widget> + </hbox> + </widget> + </hbox> + </widget> + <widget class="KActiveLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>kActiveLabel6_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="resizePolicy"> + <enum>AutoOneFit</enum> + </property> + <property name="dragAutoScroll"> + <bool>false</bool> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><h3><p align="center">Please select KBFX button's images</p></h3></string> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + <property name="autoFormatting"> + <set>AutoAll</set> + </property> + </widget> + <widget class="QGroupBox" row="7" column="1"> + <property name="name"> + <cstring>KbfxResizeKickerBox</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Resize Panel</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel9_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><b>Tip!</b> This button resizes the panel on which the KBFX button is to button's height or width.</string> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop|AlignLeft</set> + </property> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxResizeKicker</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>270</width> + <height>58</height> + </size> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Panel Resize is 'ON'</string> + </property> + <property name="toggleButton"> + <bool>true</bool> + </property> + <property name="on"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string></string> + </property> + <property name="whatsThis" stdset="0"> + <string></string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6_2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="KActiveLabel" row="6" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>kActiveLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="resizePolicy"> + <enum>AutoOneFit</enum> + </property> + <property name="dragAutoScroll"> + <bool>false</bool> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><h3><p align="center">Preview of selected images</p></h3></string> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + <property name="autoFormatting"> + <set>AutoAll</set> + </property> + </widget> + <widget class="QGroupBox" row="7" column="0"> + <property name="name"> + <cstring>groupBox11</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Livepreview</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel9</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><b>Tip!</b> To see live preview, hover or press the preview image with your mouse.</string> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + <property name="alignment"> + <set>WordBreak|AlignTop|AlignLeft</set> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="KbfxPushButton"> + <property name="name"> + <cstring>KbfxButton</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>50</height> + </size> + </property> + <property name="cursor"> + <cursor>0</cursor> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="autoMask"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>KBFX Button live preview</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can see the live preview of the KBFX Button.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QButtonGroup" row="4" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>KbfxFadeButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Button Fade Transition Effect</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="exclusive"> + <bool>true</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Check this to turn the fade effect of the button ON</string> + </property> + <property name="whatsThis" stdset="0"> + <string>This allows you to turn ON or OFF the fade effect for the KBFX button.<br>This effect makes transitions between the three images (normal, hover, pressed) animated.</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Fade Effect Time (in msec.):</string> + </property> + <property name="toolTip" stdset="0"> + <string>The fade effect transition time in msec. Valid values are between 20 and 1000 msec. Default is 75 msec.</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can enter the value of the fade effect transition time in msec.<br>Valid values are between 20 and 1000 msec.<br>Default is 75 msec.</string> + </property> + </widget> + <widget class="QLineEdit" row="0" column="1"> + <property name="name"> + <cstring>KbfxFadeTime</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + <property name="toolTip" stdset="0"> + <string>The fade effect transition time in msec. Valid values are between 20 and 1000 msec. Default is 75 msec.</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here you can enter the value of the fade effect transition time in msec.<br>Valid values are between 20 and 1000 msec.<br>Default is 75 msec.</string> + </property> + </widget> + <spacer row="0" column="2"> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + </grid> + </widget> + <spacer row="5" column="0"> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>KbfxPixmapLabel</class> + <header location="global">kbfxpixmaplabel.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>0</hordata> + <verdata>0</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image1</pixmap> + <signal>targetDrop(const QString &)</signal> + <signal>mouseClicked( const ButtonState & )</signal> + <signal>mouseDoubleClicked( const ButtonState & )</signal> + <slot access="public" specifier="">dragEnterEvent( QDragEnterEvent *mouseDragEnterEvent )</slot> + <slot access="public" specifier="">dropEvent( QDropEvent *mouseDropEvent )</slot> + <slot access="public" specifier="">mousePressEvent( QMouseEvent * e )</slot> + <slot access="public" specifier="">mouseDoubleClickEvent( QMouseEvent * e )</slot> + </customwidget> + <customwidget> + <class>KbfxPushButton</class> + <header location="local">kbfxpushbutton.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>5</hordata> + <verdata>5</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image2</pixmap> + <signal>pressed()</signal> + <signal>released()</signal> + <signal>clicked()</signal> + <signal>toggled( bool )</signal> + <signal>stateChanged( int )</signal> + <slot access="public" specifier="">animateClick()</slot> + <slot access="public" specifier="">toggle()</slot> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> + <image name="image1"> + <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data> + </image> + <image name="image2"> + <data format="PNG" length="1003">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b249444154388db5944d4c5c5518869f73ce9db9cc40f929cc30300e18129a50685268a28291982e1a2175212eaab1c49d3f8971e7aec6aedb54a32b435dd8685cb8c0c4b8b0feb421b7bd8186a069d23209144b18cb0c02f3732ff3c3ccbdd705a571941213f1dd9d93739ef37e6fbeef08d334d9d5d0d090c701c8344d2176c1a6697a5d5d5dd8b64d2a95c2b2ac7f05b12c8b783c8e6118d8b6fd685fdb753a39394928e2a7c55724d693a7e214104220242805520a84d8b9e4790f0b1302c7751958f1e30534be9fa41a0c60db362dbe227f64af91b6e7719c2dfc0117a71c603da591de2882a7d3d4ec27122b10acad50aeb88044d542b84de3af7ab44aa55274f4e449dbf354bc347aa096fbf37e7efa2ecbad1b36907d78b289de8120232f37726250c3f52cf0a026a0f6065b9645d929e038167aa096d91b307171059034b5f8e9e9eb44fa052b4b25eeccd9dc99cb71f6ad082fbea2e351c075bdbdc13b9109fc01b83fef63e2e232e03076b68393231a0dcd024daf502c1e66e67a89cb971ef0e5a74bb4b61e6378248094b92ab0ac024b70ca017ef8360394187b2dc6d8b89ffa500e4d4f93d9083275d5e6f9913ade3dd70ee87c7d25c95646a25415aadab152b09ed4f8c5cc130a853839eac3951b684a61e70ef3f9c739668c24eba912afbfddc6d4d506e6a6d7b8b7d082aa8eb8dab19482cdcd220e36dd3dc19df23545de0a71f952861923493456cfd3cf36123c54a0b7bf0e8064621b21f7712c040857071ca4eea0f40a99f510573ec971cb48030e811a1faded3e94be85f2fb00703d1ff26f96ab9f011a5b04d0c4f26fdb948a754c1b25668c2491483d5d5d611617d6b8f0fe32cb779b492ce65168b4c774a4701eefd8f3a02d56e6e8f13aeefe9a63fa5a89d1970e91d908f3d46003e1480d173e28b37827c9b977348ab92ce16890237d1ec907ee3e8e3d8f60d0e1f4583d009f7d9860662acff89bad1c1faad0717493f7ce7713ed8cb0995c255f2a317a26427b67198f6a70f51c0a41b902279ed1187f23cc17130b7c74de65eac77a7a8f05517e41e2deefa4930576db60fa7a8ee1535134df3e93e7b82e0817476439fd6a9070a49f6fbe4a3077739db99b15c001146dd13a46cf1cc1f83943c62e51de76b0738fc9381e8f3390f0236b252e124999e11724fd833196164bacadb87848224fe874f779b43fe9f2dca928956d505a96dbb3f9bdc18661e00534c26d1a7a40e13912a11c9454280da41048a9915c75585df500074d53d816dc9edd229528ef0db66dbbea3ffdaffa471f1f28d8344df1bf800f1a6e9aa6f813c39885bc050f269c0000000049454e44ae426082</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxURLRequesterHover</sender> + <signal>urlSelected(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterHoverUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterPressed</sender> + <signal>urlSelected(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterPressedUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterNormal</sender> + <signal>urlSelected(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterNormalUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterHover</sender> + <signal>returnPressed(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterHoverUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterPressed</sender> + <signal>returnPressed(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterPressedUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterNormal</sender> + <signal>returnPressed(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterNormalUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxButton</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxButtonToggled(bool)</slot> + </connection> + <connection> + <sender>KbfxPixmapLabelHover</sender> + <signal>targetDrop(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterHoverUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxPixmapLabelNormal</sender> + <signal>targetDrop(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterNormalUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxPixmapLabelPressed</sender> + <signal>targetDrop(const QString&)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxURLRequesterPressedUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxResizeKicker</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxResizeKickerToggled(bool)</slot> + </connection> + <connection> + <sender>KbfxFadeButton</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxFadeButton_toggled(bool)</slot> + </connection> + <connection> + <sender>KbfxFadeTime</sender> + <signal>lostFocus()</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxFadeTime_lostFocus()</slot> + </connection> + <connection> + <sender>KbfxFadeTime</sender> + <signal>returnPressed()</signal> + <receiver>KbfxConfigDlgButton</receiver> + <slot>KbfxFadeTime_lostFocus()</slot> + </connection> +</connections> +<tabstops> + <tabstop>KbfxURLRequesterNormal</tabstop> + <tabstop>KbfxURLRequesterPressed</tabstop> + <tabstop>KbfxURLRequesterHover</tabstop> + <tabstop>KbfxFadeButton</tabstop> + <tabstop>KbfxFadeTime</tabstop> + <tabstop>KbfxResizeKicker</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="global" impldecl="in declaration">kbfxpushbutton.h</include> + <include location="global" impldecl="in declaration">qstring.h</include> + <include location="global" impldecl="in declaration">qpainter.h</include> + <include location="global" impldecl="in declaration">qimage.h</include> + <include location="global" impldecl="in declaration">kbfxpixmaplabel.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgbutton.ui.h</include> +</includes> +<signals> + <signal>KbfxConfigDlgButtonChanged(const char * name, const QString & path)</signal> +</signals> +<slots> + <slot>KbfxURLRequesterNormalUrlSelected( const QString & selected_img_path )</slot> + <slot>KbfxURLRequesterPressedUrlSelected( const QString & selected_img_path )</slot> + <slot>KbfxURLRequesterHoverUrlSelected( const QString & selected_img_path )</slot> + <slot>KbfxButtonToggled( bool )</slot> + <slot>ChangeForm( const char * name, const QString & path )</slot> + <slot>ChangeForm()</slot> + <slot>KbfxResizeKickerToggled( bool )</slot> + <slot>KbfxFadeButton_toggled( bool _state )</slot> + <slot>KbfxFadeTime_lostFocus()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="4" margin="0"/> +<includehints> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kbfxpixmaplabel.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kbfxpixmaplabel.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kbfxpixmaplabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kbfxpushbutton.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgbutton.ui.h b/configdialog/kbfxconfigdlgbutton.ui.h new file mode 100644 index 0000000..015b860 --- /dev/null +++ b/configdialog/kbfxconfigdlgbutton.ui.h @@ -0,0 +1,183 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgButton::init() +{ + connect ( this, SIGNAL ( KbfxConfigDlgButtonChanged ( const char *, const QString & ) ), + this, SLOT ( ChangeForm ( const char *, const QString & ) ) ); +} + +/* actions performed when url is selected */ +void KbfxConfigDlgButton::KbfxURLRequesterNormalUrlSelected ( const QString &selected_img_path ) +{ + emit KbfxConfigDlgButtonChanged ( "normal", selected_img_path ); +} + +void KbfxConfigDlgButton::KbfxURLRequesterPressedUrlSelected ( const QString &selected_img_path ) +{ + emit KbfxConfigDlgButtonChanged ( "pressed", selected_img_path ); +} + +void KbfxConfigDlgButton::KbfxURLRequesterHoverUrlSelected ( const QString &selected_img_path ) +{ + emit KbfxConfigDlgButtonChanged ( "hover", selected_img_path ); +} + +void KbfxConfigDlgButton::KbfxButtonToggled ( bool ) +{ + if ( KbfxButton->state() == 2 ) + KbfxButton->setPixmap ( ConfigInit().m_KbfxPressedButtonPath ); + + if ( KbfxButton->state() == 0 ) + KbfxButton->setPixmap ( ConfigInit().m_KbfxNormalButtonPath ); +} + +/* url processing */ +void KbfxConfigDlgButton::ChangeForm ( const char *name, const QString &path ) +{ + kdDebug() << "Received: " << name << " + " << path << endl; + + QString tmppath = path; + if ( tmppath.startsWith ( "file://" ) ) tmppath.remove ( "file://" ); + + QImage tmp ( tmppath ); + + QString tmpname = name; + if ( tmpname == "pressed" ) + { + if ( tmp.isNull() ) + { + KMessageBox::error ( 0, + tr2i18n ( "<p align='center'>Image cannot be used as a pressed button skin!</p>" + "<p align='center'>Will use default pressed button skin.</p>" ), + tr2i18n ( "Error loading image" ) ); + tmppath = ConfigInit().m_KbfxPressedButtonPathDefault; + } + + kdDebug() << tmpname << " :: " << tmppath << endl; + + KbfxURLRequesterPressed->setURL ( tmppath ); + KbfxPixmapLabelPressed->setPixmap ( tmppath ); + ConfigInit().m_KbfxPressedButtonPath = tmppath; + + if ( KbfxButton->state() == 2 ) + KbfxButton->setPixmap ( ConfigInit().m_KbfxPressedButtonPath ); + } + + if ( tmpname == "normal" ) + { + if ( tmp.isNull() ) + { + KMessageBox::error ( 0, + tr2i18n ( "<p align='center'>Image cannot be used as a normal button skin!</p>" + "<p align='center'>Will use default normal button skin.</p>" ), + tr2i18n ( "Error loading image" ) ); + tmppath = ConfigInit().m_KbfxNormalButtonPathDefault; + } + + kdDebug() << tmpname << " :: " << tmppath << endl; + + KbfxURLRequesterNormal->setURL ( tmppath ); + KbfxPixmapLabelNormal->setPixmap ( tmppath ); + ConfigInit().m_KbfxNormalButtonPath = tmppath; + + if ( KbfxButton->state() == 0 ) + KbfxButton->setPixmap ( ConfigInit().m_KbfxNormalButtonPath ); + } + + if ( tmpname == "hover" ) + { + if ( tmp.isNull() ) + { + KMessageBox::error ( 0, + tr2i18n ( "<p align='center'>Image cannot be used as a hover button skin!</p>" + "<p align='center'>Will use default hover button skin.</p>" ), + tr2i18n ( "Error loading image" ) ); + tmppath = ConfigInit().m_KbfxHoverButtonPathDefault; + } + + kdDebug() << tmpname << " :: " << tmppath << endl; + + KbfxURLRequesterHover->setURL ( tmppath ); + KbfxPixmapLabelHover->setPixmap ( tmppath ); + ConfigInit().m_KbfxHoverButtonPath = tmppath; + } +} + +/* initialize Button page at the beginning or after "Default" pressed */ +void KbfxConfigDlgButton::ChangeForm() +{ + KbfxURLRequesterNormal->setURL ( ConfigInit().m_KbfxNormalButtonPath ); + KbfxURLRequesterPressed->setURL ( ConfigInit().m_KbfxPressedButtonPath ); + KbfxURLRequesterHover->setURL ( ConfigInit().m_KbfxHoverButtonPath ); + KbfxPixmapLabelNormal->setPixmap ( ConfigInit().m_KbfxNormalButtonPath ); + KbfxPixmapLabelPressed->setPixmap ( ConfigInit().m_KbfxPressedButtonPath ); + KbfxPixmapLabelHover->setPixmap ( ConfigInit().m_KbfxHoverButtonPath ); + KbfxButtonToggled ( 1 ); + + if ( ConfigInit().m_fadeTime == 0 ) + KbfxFadeButton->setChecked ( FALSE ); + else + KbfxFadeButton->setChecked ( TRUE ); + if ( ConfigInit().m_ToolBarResize == TRUE && KbfxResizeKicker->state() == 0 ) + KbfxResizeKicker->toggle(); + if ( ConfigInit().m_ToolBarResize == FALSE && KbfxResizeKicker->state() == 2 ) + KbfxResizeKicker->toggle(); + + KbfxFadeTime->setText ( QString::number ( ConfigInit().m_fadeTime ) ); +} + + +void KbfxConfigDlgButton::KbfxResizeKickerToggled ( bool ) +{ + if ( KbfxResizeKicker->state() == 2 ) + { + KbfxResizeKicker->setText ( tr2i18n ( "Panel Resize is 'ON'" ) ); + ConfigInit().m_ToolBarResize = TRUE; + } + + if ( KbfxResizeKicker->state() == 0 ) + { + KbfxResizeKicker->setText ( tr2i18n ( "Panel Resize is 'OFF'" ) ); + ConfigInit().m_ToolBarResize = FALSE; + } + + kdDebug() << "Panel Resize is: " + << ConfigInit().m_ToolBarResize + << endl; + +} + + + +void KbfxConfigDlgButton::KbfxFadeButton_toggled( bool _state ) +{ + if ( _state ) + { + KbfxFadeTime->setText ( QString::number ( ConfigInit().m_fadeTimeDefault ) ); + ConfigInit().m_fadeTime = ConfigInit().m_fadeTimeDefault; + } + else + { + ConfigInit().m_fadeTime = 0; + } +} + + +void KbfxConfigDlgButton::KbfxFadeTime_lostFocus() +{ + int _value = ( KbfxFadeTime->text () ).toInt(); + ConfigInit().m_fadeTime = _value; + ConfigInit().checkValues(); + + KbfxFadeTime->setText ( QString::number ( ConfigInit().m_fadeTime ) ); +} diff --git a/configdialog/kbfxconfigdlgfonts-old.ui b/configdialog/kbfxconfigdlgfonts-old.ui new file mode 100644 index 0000000..e76071f --- /dev/null +++ b/configdialog/kbfxconfigdlgfonts-old.ui @@ -0,0 +1,1193 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgFonts</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgFonts</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>676</width> + <height>497</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Font options</p></h3></b></string> + </property> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>436</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxExportFile</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>EXPORT KBFXFONTRC FILE</string> + </property> + <property name="toolTip" stdset="0"> + <string>Export the kbfxfontrc file to a folder</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QGroupBox" row="1" column="0"> + <property name="name"> + <cstring>groupBox43</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Setup fonts for your KBFX</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="5" column="0"> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="4" column="0"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout15</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout22</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel41</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Application "LINE":</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxLineColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Horizontal line color in the application area.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel39</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Application text :</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxApplicationColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select the color of the "application" in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout20</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel40</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Comment text:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxCommentColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Color of the "comments" in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel43</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Name display:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxNameColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>The color of your login name in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout23</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel42</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Category text:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxCategoryColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Font color of the categoris in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>1</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel43_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Separator:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxSeparatorColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>The color of the separator in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout18</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel43_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Plugin:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxPluginColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>The color of the plugin in the menu.</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout18_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel43_2_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="text"> + <string>Tooltip:</string> + </property> + </widget> + <widget class="KColorCombo"> + <property name="name"> + <cstring>KbfxTooltipColor</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>The color of the tooltip in the menu.</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line2</cstring> + </property> + <property name="frameShape"> + <enum>VLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer6_3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>22</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_app</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the application's text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_comment</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the comment's text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_username</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the username's text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_category</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the category's text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_separator</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the separator's text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_plugin</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the plugins' text</string> + </property> + </widget> + <widget class="KBFXFontChooser"> + <property name="name"> + <cstring>KbfxFont_tooltip</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select font for the tooltip's text</string> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <spacer row="3" column="0"> + <property name="name"> + <cstring>spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="Line" row="2" column="0"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLayoutWidget" row="1" column="0"> + <property name="name"> + <cstring>layout15</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel44</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="resizePolicy"> + <enum>Manual</enum> + </property> + <property name="text"> + <string>Theme that is edited:</string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxTheme</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>69</red> + <green>162</green> + <blue>225</blue> + </color> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="margin"> + <number>-1</number> + </property> + <property name="midLineWidth"> + <number>0</number> + </property> + <property name="text"> + <string><p align="left"><b>default</b></p></string> + </property> + <property name="toolTip" stdset="0"> + <string>Please select the theme you want to edit</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>KbfxBoldHover</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Bold fonts on hover</string> + </property> + <property name="toolTip" stdset="0"> + <string>Make fonts bolder when you hover the mouse over an item</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Make fonts bolder when you hover the mouse over an item</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="0" column="0"> + <property name="name"> + <cstring>spacer2_2_2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> + </widget> + </grid> +</widget> +<customwidgets> + <customwidget> + <class>KBFXFontChooser</class> + <header location="global">kbfxfontchooser.h</header> + <sizehint> + <width>-1</width> + <height>-1</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>1</hordata> + <verdata>0</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image1</pixmap> + <signal>FontChanged()</signal> + <slot access="public" specifier="">setFont(const QFont& font)</slot> + <slot access="public" specifier="">buttonClicked()</slot> + <slot access="protected" specifier="">buttonClicked()</slot> + <property type="Font">font</property> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> + <image name="image1"> + <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxApplicationColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxApplicationColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxCommentColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxCommentColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxLineColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxLineColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxCategoryColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxCategoryColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxNameColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxNameColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxSeparatorColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxSeparatorColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxExportFile</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxExportFileAction()</slot> + </connection> + <connection> + <sender>KbfxFont_username</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxFont_app</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxFont_category</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxFont_comment</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxBoldHover</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxBoldHover_toggled(bool)</slot> + </connection> + <connection> + <sender>KbfxPluginColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxPluginColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxFont_separator</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxFont_plugin</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> + <connection> + <sender>KbfxTooltipColor</sender> + <signal>activated(const QColor&)</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>KbfxTooltipColorSelected(const QColor&)</slot> + </connection> + <connection> + <sender>KbfxFont_tooltip</sender> + <signal>FontChanged()</signal> + <receiver>KbfxConfigDlgFonts</receiver> + <slot>FontChanged()</slot> + </connection> +</connections> +<tabstops> + <tabstop>KbfxBoldHover</tabstop> + <tabstop>KbfxLineColor</tabstop> + <tabstop>KbfxApplicationColor</tabstop> + <tabstop>KbfxFont_app</tabstop> + <tabstop>KbfxCommentColor</tabstop> + <tabstop>KbfxFont_comment</tabstop> + <tabstop>KbfxNameColor</tabstop> + <tabstop>KbfxFont_username</tabstop> + <tabstop>KbfxCategoryColor</tabstop> + <tabstop>KbfxFont_category</tabstop> + <tabstop>KbfxSeparatorColor</tabstop> + <tabstop>KbfxFont_separator</tabstop> + <tabstop>KbfxPluginColor</tabstop> + <tabstop>KbfxFont_plugin</tabstop> + <tabstop>KbfxExportFile</tabstop> + <tabstop>groupBox43</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">kbfxthemesdata.h</include> + <include location="global" impldecl="in declaration">kstandarddirs.h</include> + <include location="global" impldecl="in declaration">kfiledialog.h</include> + <include location="global" impldecl="in declaration">kio/netaccess.h</include> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="global" impldecl="in declaration">kconfig.h</include> + <include location="global" impldecl="in declaration">kbfxfontchooser.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgfonts-old.ui.h</include> +</includes> +<variables> + <variable access="private">bool KbfxFormReady;</variable> +</variables> +<slots> + <slot>ChangeForm()</slot> + <slot>KbfxApplicationColorSelected( const QColor & color )</slot> + <slot>KbfxTooltipColorSelected( const QColor & )</slot> + <slot>KbfxCommentColorSelected( const QColor & color )</slot> + <slot>KbfxLineColorSelected( const QColor & color )</slot> + <slot>KbfxCategoryColorSelected( const QColor & color )</slot> + <slot>KbfxNameColorSelected( const QColor & color )</slot> + <slot>KbfxSeparatorColorSelected( const QColor & color )</slot> + <slot>KbfxPluginColorSelected( const QColor & color )</slot> + <slot>KbfxExportFileAction()</slot> + <slot>FontChanged()</slot> + <slot>KbfxBoldHover_toggled( bool state )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcolorcombo.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kbfxfontchooser.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgfonts-old.ui.h b/configdialog/kbfxconfigdlgfonts-old.ui.h new file mode 100644 index 0000000..11ad864 --- /dev/null +++ b/configdialog/kbfxconfigdlgfonts-old.ui.h @@ -0,0 +1,204 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgFonts::init() +{ + KbfxFormReady = FALSE; +} + +void KbfxConfigDlgFonts::ChangeForm() +{ + KbfxFormReady = FALSE; + KbfxTheme->setText ( "<p align=left><b>" + ConfigInit().m_SpinxThemeName + "</b></p>" ); + KbfxBoldHover->setChecked ( ConfigInit().m_fontHoverBold ); + KbfxApplicationColor->setColor ( ConfigInit().m_fontAppNameColor ); + KbfxFont_app->setFont ( ConfigInit().m_fontAppNameFont ); + KbfxCommentColor->setColor ( ConfigInit().m_fontAppCommentColor ); + KbfxFont_comment->setFont ( ConfigInit().m_fontAppCommentFont ); + KbfxLineColor->setColor ( ConfigInit().m_lineColor ); + KbfxCategoryColor->setColor ( ConfigInit().m_fontIndexColor ); + KbfxFont_category->setFont ( ConfigInit().m_fontIndexFont ); + KbfxNameColor->setColor ( ConfigInit().m_userNameColor ); + KbfxFont_username->setFont ( ConfigInit().m_userNameFont ); + KbfxSeparatorColor->setColor ( ConfigInit().m_sepNameColor ); + KbfxFont_separator->setFont ( ConfigInit().m_sepNameFont ); + KbfxPluginColor->setColor ( ConfigInit().m_pluginNameColor ); + KbfxFont_plugin->setFont ( ConfigInit().m_pluginNameFont ); + KbfxTooltipColor->setColor ( ConfigInit().m_fontTooltipColor ); + KbfxFont_tooltip->setFont ( ConfigInit().m_fontTooltipFont ); + KbfxFormReady = TRUE; +} + +void KbfxConfigDlgFonts::KbfxApplicationColorSelected ( const QColor &color ) +{ + ConfigInit().m_fontAppNameColor = color; + + kdDebug() << "Application color: " + << ConfigInit().m_fontAppNameColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxTooltipColorSelected ( const QColor &color ) +{ + ConfigInit().m_fontTooltipColor = color; + + kdDebug() << "Tooltip color: " + << ConfigInit().m_fontTooltipColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxCommentColorSelected ( const QColor &color ) +{ + ConfigInit().m_fontAppCommentColor = color; + + kdDebug() << "Comment color: " + << ConfigInit().m_fontAppCommentColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxLineColorSelected ( const QColor & color ) +{ + ConfigInit().m_lineColor = color; + + kdDebug() << "Line color: " + << ConfigInit().m_lineColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxCategoryColorSelected ( const QColor &color ) +{ + ConfigInit().m_fontIndexColor = color; + + kdDebug() << "Category color: " + << ConfigInit().m_fontIndexColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxNameColorSelected ( const QColor &color ) +{ + ConfigInit().m_userNameColor = color; + + kdDebug() << "User color: " + << ConfigInit().m_userNameColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxSeparatorColorSelected ( const QColor &color ) +{ + ConfigInit().m_sepNameColor = color; + + kdDebug() << "Separator color: " + << ConfigInit().m_sepNameColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxPluginColorSelected( const QColor &color ) +{ + ConfigInit().m_pluginNameColor = color; + + kdDebug() << "Plugin color: " + << ConfigInit().m_pluginNameColor + << endl; +} + +void KbfxConfigDlgFonts::KbfxExportFileAction() +{ + /* + KFileDialog KbfxExportFontRcDialog(QString::null, + "*.*|" + tr2i18n("All files"), + 0, + 0, + TRUE); + KbfxExportFontRcDialog.setOperationMode(KFileDialog::Saving); + KbfxExportFontRcDialog.setCaption(tr2i18n("Select Folder to export kbfxfontrc file")); + KbfxExportFontRcDialog.setMode(KFile::Directory); + + if(!KbfxExportFontRcDialog.exec()) return; + + QString KbfxExportFontRcDialogURL = KbfxExportFontRcDialog.selectedURL().path(); + */ + + QString KbfxExportFontRcDialogURL = KFileDialog::getExistingDirectory ( + QString::null, + 0, + tr2i18n ( "Select folder to export kbfxfontrc file" ) ).append ( "/kbfxfontrc" ); + + if ( KbfxExportFontRcDialogURL == "/kbfxfontrc") return; + + kdDebug() << "Selected export file is: " + << KbfxExportFontRcDialogURL + << endl; + + KConfig *fontconfig = new KConfig ( KbfxExportFontRcDialogURL ); + + fontconfig->setGroup ( "Fonts" ); + fontconfig->writeEntry ( "TooltipText", ConfigInit().m_fontTooltipColor ); + fontconfig->writeEntry ( "TooltipTextFont", ConfigInit().m_fontTooltipFont ); + fontconfig->writeEntry ( "ApplicationText", ConfigInit().m_fontAppNameColor ); + fontconfig->writeEntry ( "ApplicationTextFont", ConfigInit().m_fontAppNameFont ); + fontconfig->writeEntry ( "CommentText", ConfigInit().m_fontAppCommentColor ); + fontconfig->writeEntry ( "CommentTextFont", ConfigInit().m_fontAppCommentFont ); + fontconfig->writeEntry ( "GroupText", ConfigInit().m_fontIndexColor ); + fontconfig->writeEntry ( "GroupTextFont", ConfigInit().m_fontIndexFont ); + fontconfig->writeEntry ( "UserName", ConfigInit().m_userNameColor ); + fontconfig->writeEntry ( "UserNameFont", ConfigInit().m_userNameFont ); + fontconfig->writeEntry ( "SeparatorColor", ConfigInit().m_sepNameColor ); + fontconfig->writeEntry ( "SeparatorFont", ConfigInit().m_sepNameFont ); + fontconfig->writeEntry ( "PluginColor", ConfigInit().m_pluginNameColor ); + fontconfig->writeEntry ( "PluginFont", ConfigInit().m_pluginNameFont ); + fontconfig->writeEntry ( "LineColor", ConfigInit().m_lineColor ); + fontconfig->writeEntry ( "HoverBold", ConfigInit().m_fontHoverBold ); + fontconfig->sync(); + + delete fontconfig; + KMessageBox::information ( 0, + tr2i18n ( "<p align='center'>The Font configuration of the KBFX Theme <strong>%1</strong> has been exported successfully!</p>" ).arg ( ConfigInit().m_SpinxThemeName ), + tr2i18n ( "KBFX Font Export Ready" ) ); +} + + +void KbfxConfigDlgFonts::FontChanged() +{ + if (KbfxFormReady) + { + ConfigInit().m_fontAppNameFont = KbfxFont_app->font(); + ConfigInit().m_fontAppCommentFont = KbfxFont_comment->font(); + ConfigInit().m_fontIndexFont = KbfxFont_category->font(); + ConfigInit().m_userNameFont = KbfxFont_username->font(); + ConfigInit().m_sepNameFont = KbfxFont_separator->font(); + ConfigInit().m_pluginNameFont = KbfxFont_plugin->font(); + ConfigInit().m_fontTooltipFont = KbfxFont_tooltip->font(); + + /* + kdDebug() << "Changed font... " + << endl << ConfigInit().m_fontAppNameFont + << endl << ConfigInit().m_fontAppCommentFont + << endl << ConfigInit().m_fontIndexFont + << endl << ConfigInit().m_userNameFont + << endl << ConfigInit().m_sepNameFont + << endl << ConfigInit().m_pluginNameFont + << endl << ConfigInit().m_fontTooltipFont + << endl; + */ + } +} + + +void KbfxConfigDlgFonts::KbfxBoldHover_toggled( bool state ) +{ + ConfigInit().m_fontHoverBold = state; + kdDebug() << "Bold on hover is: " + << endl << ConfigInit().m_fontHoverBold + << endl; +} + + diff --git a/configdialog/kbfxconfigdlglayout.ui b/configdialog/kbfxconfigdlglayout.ui new file mode 100644 index 0000000..f759df9 --- /dev/null +++ b/configdialog/kbfxconfigdlglayout.ui @@ -0,0 +1,1084 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgLayout</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgLayout</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>667</width> + <height>369</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <property name="focusPolicy"> + <enum>TabFocus</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Layout options</p></h3></b></string> + </property> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout14_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>408</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxExportFile</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>EXPORT KBFXLAYOUTRC FILE</string> + </property> + <property name="toolTip" stdset="0"> + <string>Export the kbfxlayoutrc file to a folder</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QGroupBox" row="1" column="0"> + <property name="name"> + <cstring>groupBox43</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Setup fonts for your KBFX</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="0" column="0"> + <property name="name"> + <cstring>spacer12_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>23</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout30</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel44</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="resizePolicy"> + <enum>Manual</enum> + </property> + <property name="text"> + <string>Theme that is edited:</string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxTheme</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>69</red> + <green>162</green> + <blue>225</blue> + </color> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="margin"> + <number>-1</number> + </property> + <property name="midLineWidth"> + <number>0</number> + </property> + <property name="text"> + <string><p align="left"><b>default</b></p></string> + </property> + <property name="toolTip" stdset="0"> + <string>Please select the theme you want to edit</string> + </property> + </widget> + <widget class="KComboBox"> + <property name="name"> + <cstring>KbfxLayoutProperty</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Select the Layout property to change</string> + </property> + </widget> + </hbox> + </widget> + <spacer row="7" column="1"> + <property name="name"> + <cstring>spacer9_3_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="6" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer7_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>Kbfx2PanelsLeft</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Make it 2 panels (Left "ON")</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>Kbfx2PanelsRight</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Make it 2 panels (Right "ON")</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>Kbfx3Panels</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Make it 3 panels</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <spacer row="5" column="0"> + <property name="name"> + <cstring>spacer9_3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="4" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout33</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout28</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel1</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel2</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel3</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel4</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>checkBox1</string> + </property> + </widget> + </vbox> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line3</cstring> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="frameShape"> + <enum>VLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout29</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21_2</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel5</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_2_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel6</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_3_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel7</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel7</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit7</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout16_4_2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel8</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>textLabel8</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit8</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="alignment"> + <set>AlignHCenter</set> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>checkBox2</string> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <spacer row="3" column="0"> + <property name="name"> + <cstring>spacer12_3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>23</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="Line" row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + </grid> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxLayoutProperty</sender> + <signal>activated(int)</signal> + <receiver>KbfxConfigDlgLayout</receiver> + <slot>KbfxLayoutProperty_activated(int)</slot> + </connection> + <connection> + <sender>KbfxExportFile</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgLayout</receiver> + <slot>KbfxExportFileAction()</slot> + </connection> + <connection> + <sender>Kbfx2PanelsLeft</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgLayout</receiver> + <slot>Kbfx2PanelsLeft_clicked()</slot> + </connection> + <connection> + <sender>Kbfx2PanelsRight</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgLayout</receiver> + <slot>Kbfx2PanelsRight_clicked()</slot> + </connection> + <connection> + <sender>Kbfx3Panels</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgLayout</receiver> + <slot>Kbfx3Panels_clicked()</slot> + </connection> +</connections> +<tabstops> + <tabstop>KbfxLayoutProperty</tabstop> + <tabstop>lineEdit1</tabstop> + <tabstop>lineEdit5</tabstop> + <tabstop>lineEdit2</tabstop> + <tabstop>lineEdit6</tabstop> + <tabstop>lineEdit3</tabstop> + <tabstop>lineEdit7</tabstop> + <tabstop>lineEdit4</tabstop> + <tabstop>lineEdit8</tabstop> + <tabstop>checkBox1</tabstop> + <tabstop>checkBox2</tabstop> + <tabstop>KbfxExportFile</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kbfxthemesdata.h</include> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">qstringlist.h</include> + <include location="global" impldecl="in declaration">kstandarddirs.h</include> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="global" impldecl="in declaration">kfiledialog.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlglayout.ui.h</include> +</includes> +<variables> + <variable access="private">int previous_state;</variable> +</variables> +<slots> + <slot>ChangeForm()</slot> + <slot>KbfxLayoutProperty_activated( int index )</slot> + <slot>KbfxExportFileAction()</slot> + <slot>LayoutFormLeft()</slot> + <slot>Kbfx2PanelsLeft_clicked()</slot> + <slot>Kbfx2PanelsRight_clicked()</slot> + <slot>Kbfx3Panels_clicked()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function access="private">KbfxShowAll()</function> + <function access="private">KbfxMakePanel(int)</function> + <function access="private" returnType="bool">KbfxMessage()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kcombobox.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlglayout.ui.h b/configdialog/kbfxconfigdlglayout.ui.h new file mode 100644 index 0000000..0ce4a70 --- /dev/null +++ b/configdialog/kbfxconfigdlglayout.ui.h @@ -0,0 +1,641 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgLayout::init() +{ + KbfxLayoutProperty->clear(); + KbfxLayoutProperty->insertItem ( tr2i18n ( "User Properties" ) ); // index = 0 + KbfxLayoutProperty->insertItem ( tr2i18n ( "* Top Bar Properties" ) ); // index = 1 + KbfxLayoutProperty->insertItem ( tr2i18n ( "* Bottom Bar Properties" ) ); // index = 2 +// KbfxLayoutProperty->insertItem ( tr2i18n ( "Scroll Bar Properties" ) ); // index = 3 + KbfxLayoutProperty->insertItem ( tr2i18n ( "* List Box Properties" ) ); // index = 4 + KbfxLayoutProperty->insertItem ( tr2i18n ( "Search Box Properties" ) ); // index = 5 + KbfxLayoutProperty->insertItem ( tr2i18n ( "* Item Properties" ) ); // index = 6 +// KbfxLayoutProperty->insertItem ( tr2i18n ( "Tool Bar Properties" ) ); // index = 7 + KbfxLayoutProperty->insertItem ( tr2i18n ( "* Main Menu Properties" ) ); // index = 8 +} + +void KbfxConfigDlgLayout::ChangeForm() +{ + KbfxTheme->setText ( "<p align=left><b>" + ConfigInit().m_SpinxThemeName + "</b></p>" ); + KbfxLayoutProperty->setCurrentItem ( 0 ); + previous_state = -1; + KbfxLayoutProperty_activated ( 0 ); +} + +void KbfxConfigDlgLayout::KbfxLayoutProperty_activated( int index ) +{ + switch ( previous_state ) + { + case 0: /* User Properties */ + { + ConfigInit().m_facePos_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_facePos_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_userNamePos_x = ( lineEdit3->text () ).toInt(); + ConfigInit().m_userNamePos_y = ( lineEdit4->text () ).toInt(); + ConfigInit().m_faceIconX = ( lineEdit5->text () ).toInt(); + ConfigInit().m_faceIconY = ( lineEdit6->text () ).toInt(); + ConfigInit().m_faceIconH = ( lineEdit7->text () ).toInt(); + ConfigInit().m_faceIconW = ( lineEdit8->text () ).toInt(); + ConfigInit().m_faceBoxHideText = checkBox1->isChecked (); + kdDebug() << "User Properties VALUES: " + << endl << ConfigInit().m_facePos_x + << endl << ConfigInit().m_facePos_y + << endl << ConfigInit().m_userNamePos_x + << endl << ConfigInit().m_userNamePos_y + << endl << ConfigInit().m_faceIconX + << endl << ConfigInit().m_faceIconY + << endl << ConfigInit().m_faceIconH + << endl << ConfigInit().m_faceIconW + << endl << ConfigInit().m_faceBoxHideText + << endl; + break; + } + case 1: /* Top Bar Properties */ + { +/* + ConfigInit().m_topBar_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_topBar_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_topBar_h = ( lineEdit5->text () ).toInt(); + ConfigInit().m_topBar_w = ( lineEdit6->text () ).toInt(); +*/ + ConfigInit().m_topBar_h = ( lineEdit1->text () ).toInt(); + ConfigInit().m_topBar_w = ( lineEdit5->text () ).toInt(); + kdDebug() << "Top Bar Properties VALUES: " +// << endl << ConfigInit().m_topBar_x +// << endl << ConfigInit().m_topBar_y + << endl << ConfigInit().m_topBar_h + << endl << ConfigInit().m_topBar_w + << endl; + break; + } + case 2: /* Bottom Bar Properties */ + { +/* + ConfigInit().m_botBar_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_botBar_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_botBar_h = ( lineEdit5->text () ).toInt(); + ConfigInit().m_botBar_w = ( lineEdit6->text () ).toInt(); +*/ + ConfigInit().m_botBar_h = ( lineEdit1->text () ).toInt(); + ConfigInit().m_botBar_w = ( lineEdit5->text () ).toInt(); + kdDebug() << "Bottom Bar Properties VALUES: " +// << endl << ConfigInit().m_botBar_x +// << endl << ConfigInit().m_botBar_y + << endl << ConfigInit().m_botBar_h + << endl << ConfigInit().m_botBar_w + << endl; + break; + } + +/* + case 3: // Scroll Bar Properties + { + ConfigInit().m_scrollBarTopX = ( lineEdit1->text () ).toInt(); + ConfigInit().m_scrollBarTopY = ( lineEdit2->text () ).toInt(); + ConfigInit().m_scrollBarBotX = ( lineEdit5->text () ).toInt(); + ConfigInit().m_scrollBarBotY = ( lineEdit6->text () ).toInt(); + kdDebug() << "Scroll Bar Properties VALUES: " + << endl << ConfigInit().m_scrollBarTopX + << endl << ConfigInit().m_scrollBarTopY + << endl << ConfigInit().m_scrollBarBotX + << endl << ConfigInit().m_scrollBarBotY + << endl; + break; + } +*/ + + case 3: /* List Box Properties */ + { + ConfigInit().m_listBox_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_listBox_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_listBox_h = ( lineEdit5->text () ).toInt(); + ConfigInit().m_listBox_w = ( lineEdit6->text () ).toInt(); + kdDebug() << "List Box Properties VALUES: " + << endl << ConfigInit().m_listBox_x + << endl << ConfigInit().m_listBox_y + << endl << ConfigInit().m_listBox_h + << endl << ConfigInit().m_listBox_w + << endl; + break; + } + case 4: /* Search Box Properties */ + { + ConfigInit().m_searchBox_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_searchBox_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_searchBox_h = ( lineEdit5->text () ).toInt(); + ConfigInit().m_searchBox_w = ( lineEdit6->text () ).toInt(); + kdDebug() << "Search Box Properties VALUES: " + << endl << ConfigInit().m_searchBox_x + << endl << ConfigInit().m_searchBox_y + << endl << ConfigInit().m_searchBox_h + << endl << ConfigInit().m_searchBox_w + << endl; + break; + } + case 5: /* Item Properties */ + { + ConfigInit().m_itemView_x = ( lineEdit1->text () ).toInt(); + ConfigInit().m_itemView_y = ( lineEdit2->text () ).toInt(); + ConfigInit().m_iconSize = ( lineEdit3->text () ).toInt(); + ConfigInit().m_itemView_h = ( lineEdit5->text () ).toInt(); + ConfigInit().m_itemView_w = ( lineEdit6->text () ).toInt(); + ConfigInit().m_commentMargine = ( lineEdit7->text () ).toInt(); + ConfigInit().m_noComments = checkBox1->isChecked (); + kdDebug() << "Item Properties VALUES: " + << endl << ConfigInit().m_itemView_x + << endl << ConfigInit().m_itemView_y + << endl << ConfigInit().m_iconSize + << endl << ConfigInit().m_itemView_h + << endl << ConfigInit().m_itemView_w + << endl << ConfigInit().m_commentMargine + << endl << ConfigInit().m_noComments + << endl; + break; + } +/* + case 6: // Tool Bar Properties + { + ConfigInit().m_toolBarButtonNormalSize = ( lineEdit1->text () ).toInt(); + ConfigInit().m_toolBarButtonExpandSize = ( lineEdit5->text () ).toInt(); + kdDebug() << "Tool Bar Properties VALUES: " + << endl << ConfigInit().m_toolBarButtonNormalSize + << endl << ConfigInit().m_toolBarButtonExpandSize + << endl; + break; + } +*/ + case 6: /* Main Menu Properties */ + { + ConfigInit().m_userMenuHeight = ( lineEdit1->text () ).toInt(); + ConfigInit().m_userMenuWidth = ( lineEdit5->text () ).toInt(); + ConfigInit().m_startHidden = checkBox1->isChecked (); + kdDebug() << "Main Menu Properties VALUES: " + << endl << ConfigInit().m_userMenuHeight + << endl << ConfigInit().m_userMenuWidth + << endl << ConfigInit().m_startHidden + << endl; + break; + } + default: /* default action switch does nothing */ + kdDebug() << "Default action switch for saving layout changed..." << endl; + } + + KbfxShowAll (); + switch ( index ) + { + case 0: /* User Properties */ + { + textLabel1->setText ( tr2i18n ( "Face Position X" ) ); + textLabel2->setText ( tr2i18n ( "Face Position Y" ) ); + textLabel3->setText ( tr2i18n ( "User Name Position X" ) ); + textLabel4->setText ( tr2i18n ( "User Name Position Y" ) ); + textLabel5->setText ( tr2i18n ( "Face Box Position X" ) ); + textLabel6->setText ( tr2i18n ( "Face Box Position Y" ) ); + textLabel7->setText ( tr2i18n ( "Face Box Height" ) ); + textLabel8->setText ( tr2i18n ( "Face Box Width" ) ); + checkBox1->setText ( tr2i18n ( "Hide User Name" ) ); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_facePos_x ) ); + lineEdit2->setText ( QString::number ( ConfigInit().m_facePos_y ) ); + lineEdit3->setText ( QString::number ( ConfigInit().m_userNamePos_x ) ); + lineEdit4->setText ( QString::number ( ConfigInit().m_userNamePos_y ) ); + lineEdit5->setText ( QString::number ( ConfigInit().m_faceIconX ) ); + lineEdit6->setText ( QString::number ( ConfigInit().m_faceIconY ) ); + lineEdit7->setText ( QString::number ( ConfigInit().m_faceIconH ) ); + lineEdit8->setText ( QString::number ( ConfigInit().m_faceIconW ) ); + checkBox1->setChecked ( ConfigInit().m_faceBoxHideText ); + previous_state = 0; + break; + } + case 1: /* Top Bar Properties */ + { +// textLabel1->setText ( tr2i18n ( "Top Bar Position X" ) ); +// textLabel2->setText ( tr2i18n ( "Top Bar Position Y" ) ); + textLabel1->setText ( tr2i18n ( "* Top Bar Height" ) ); + textLabel2->hide(); + textLabel3->hide(); + textLabel4->hide(); +// textLabel5->setText ( tr2i18n ( "Top Bar Height" ) ); +// textLabel6->setText ( tr2i18n ( "Top Bar Width" ) ); + textLabel5->setText ( tr2i18n ( "Top Bar Width" ) ); + textLabel6->hide(); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); +// lineEdit1->setText ( QString::number ( ConfigInit().m_topBar_x ) ); +// lineEdit2->setText ( QString::number ( ConfigInit().m_topBar_y ) ); + lineEdit1->setText ( QString::number ( ConfigInit().m_topBar_h ) ); + lineEdit2->hide(); + lineEdit3->hide(); + lineEdit4->hide(); +// lineEdit5->setText ( QString::number ( ConfigInit().m_topBar_h ) ); +// lineEdit6->setText ( QString::number ( ConfigInit().m_topBar_w ) ); + lineEdit5->setText ( QString::number ( ConfigInit().m_topBar_w ) ); + lineEdit6->hide(); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 1; + break; + } + case 2: /* Bottom Bar Properties */ + { +// textLabel1->setText ( tr2i18n ( "Bottom Bar Position X" ) ); +// textLabel2->setText ( tr2i18n ( "Bottom Bar Position Y" ) ); + textLabel1->setText ( tr2i18n ( "* Bottom Bar Height" ) ); + textLabel2->hide(); + textLabel3->hide(); + textLabel4->hide(); +// textLabel5->setText ( tr2i18n ( "Bottom Bar Height" ) ); +// textLabel6->setText ( tr2i18n ( "Bottom Bar Width" ) ); + textLabel5->setText ( tr2i18n ( "Bottom Bar Width" ) ); + textLabel6->hide(); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); +// lineEdit1->setText ( QString::number ( ConfigInit().m_botBar_x ) ); +// lineEdit2->setText ( QString::number ( ConfigInit().m_botBar_y ) ); + lineEdit1->setText ( QString::number ( ConfigInit().m_botBar_h ) ); + lineEdit2->hide(); + lineEdit3->hide(); + lineEdit4->hide(); +// lineEdit5->setText ( QString::number ( ConfigInit().m_botBar_h ) ); +// lineEdit6->setText ( QString::number ( ConfigInit().m_botBar_w ) ); + lineEdit5->setText ( QString::number ( ConfigInit().m_botBar_w ) ); + lineEdit6->hide(); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 2; + break; + } + +/* + case 3: // Scroll Bar Properties + { + textLabel1->setText ( tr2i18n ( "Top Scroll Bar Position X" ) ); + textLabel2->setText ( tr2i18n ( "Top Scroll Bar Position Y" ) ); + textLabel3->hide(); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "Bottom Scroll Bar Position X" ) ); + textLabel6->setText ( tr2i18n ( "Bottom Scroll Bar Position Y" ) ); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_scrollBarTopX ) ); + lineEdit2->setText ( QString::number ( ConfigInit().m_scrollBarTopY ) ); + lineEdit3->hide(); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_scrollBarBotX ) ); + lineEdit6->setText ( QString::number ( ConfigInit().m_scrollBarBotY ) ); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 3; + break; + } +*/ + + case 3: /* List Box Properties */ + { + textLabel1->setText ( tr2i18n ( "* List Box Position X" ) ); + textLabel2->setText ( tr2i18n ( "* List Box Position Y" ) ); + textLabel3->hide(); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "List Box Height" ) ); + textLabel6->setText ( tr2i18n ( "* List Box Width" ) ); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_listBox_x ) ); + lineEdit2->setText ( QString::number ( ConfigInit().m_listBox_y ) ); + lineEdit3->hide(); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_listBox_h ) ); + lineEdit6->setText ( QString::number ( ConfigInit().m_listBox_w ) ); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 3; + break; + } + case 4: /* Search Box Properties */ + { + textLabel1->setText ( tr2i18n ( "Search Box Position X" ) ); + textLabel2->setText ( tr2i18n ( "Search Box Position Y" ) ); + textLabel3->hide(); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "Search Box Height" ) ); + textLabel6->setText ( tr2i18n ( "Search Box Width" ) ); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_searchBox_x ) ); + lineEdit2->setText ( QString::number ( ConfigInit().m_searchBox_y ) ); + lineEdit3->hide(); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_searchBox_h ) ); + lineEdit6->setText ( QString::number ( ConfigInit().m_searchBox_w ) ); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 4; + break; + } + case 5: /* Item Properties */ + { + textLabel1->setText ( tr2i18n ( "* Item Position X" ) ); + textLabel2->setText ( tr2i18n ( "* Item Position Y" ) ); + textLabel3->setText ( tr2i18n ( "Icon Size in Item" ) ); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "Item Height" ) ); + textLabel6->setText ( tr2i18n ( "* Item Width" ) ); + textLabel7->setText ( tr2i18n ( "Comment Margin in Item" ) ); + textLabel8->hide(); + checkBox1->setText ( tr2i18n ( "No Comments in Item" ) ); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_itemView_x ) ); + lineEdit2->setText ( QString::number ( ConfigInit().m_itemView_y ) ); + lineEdit3->setText ( QString::number ( ConfigInit().m_iconSize ) ); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_itemView_h ) ); + lineEdit6->setText ( QString::number ( ConfigInit().m_itemView_w ) ); + lineEdit7->setText ( QString::number ( ConfigInit().m_commentMargine ) ); + lineEdit8->hide(); + checkBox1->setChecked ( ConfigInit().m_noComments ); + previous_state = 5; + break; + } +/* + case 6: // Tool Bar Properties + { + textLabel1->setText ( tr2i18n ( "Tool Bar Button Normal Size" ) ); + textLabel2->hide(); + textLabel3->hide(); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "Tool Bar Button Pressed Size" ) ); + textLabel6->hide(); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->hide(); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_toolBarButtonNormalSize ) ); + lineEdit2->hide(); + lineEdit3->hide(); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_toolBarButtonExpandSize ) ); + lineEdit6->hide(); + lineEdit7->hide(); + lineEdit8->hide(); + previous_state = 6; + break; + } +*/ + case 6: /* Main Menu Properties */ + { + textLabel1->setText ( tr2i18n ( "* Main Menu Height" ) ); + textLabel2->hide(); + textLabel3->hide(); + textLabel4->hide(); + textLabel5->setText ( tr2i18n ( "* Main Menu Width" ) ); + textLabel6->hide(); + textLabel7->hide(); + textLabel8->hide(); + checkBox1->setText ( tr2i18n ( "Contracted Menues" ) ); + checkBox2->hide(); + lineEdit1->setText ( QString::number ( ConfigInit().m_userMenuHeight ) ); + lineEdit2->hide(); + lineEdit3->hide(); + lineEdit4->hide(); + lineEdit5->setText ( QString::number ( ConfigInit().m_userMenuWidth ) ); + lineEdit6->hide(); + lineEdit7->hide(); + lineEdit8->hide(); + checkBox1->setChecked ( ConfigInit().m_startHidden ); + previous_state = 6; + break; + } + default: /* default action switch should never be reached */ + kdDebug() << "Default action switch for layout changed..." << endl; + } +} + +void KbfxConfigDlgLayout::KbfxShowAll() +{ + textLabel1->show(); + textLabel2->show(); + textLabel3->show(); + textLabel4->show(); + textLabel5->show(); + textLabel6->show(); + textLabel7->show(); + textLabel8->show(); + checkBox1->show(); + checkBox2->show(); + lineEdit1->show(); + lineEdit2->show(); + lineEdit3->show(); + lineEdit4->show(); + lineEdit5->show(); + lineEdit6->show(); + lineEdit7->show(); + lineEdit8->show(); +} + +void KbfxConfigDlgLayout::KbfxExportFileAction() +{ + QString KbfxExportLayoutRcDialogURL = KFileDialog::getExistingDirectory ( + QString::null, + 0, + tr2i18n ( "Select folder to export kbfxlayoutrc file" ) ).append ( "/kbfxlayoutrc" ); + + if ( KbfxExportLayoutRcDialogURL == "/kbfxlayoutrc") return; + + kdDebug() << "Selected export file is: " + << KbfxExportLayoutRcDialogURL + << endl; + + /* write layout theme configuration file */ + KConfig *layoutconfig = new KConfig ( KbfxExportLayoutRcDialogURL ); + + layoutconfig->setGroup ( "KbfxButton" ); + layoutconfig->writeEntry ( "FadeTime", ConfigInit().m_fadeTime ); + +/* + // No need for this to be exported because it is user/installation specific + layoutconfig->writeEntry ( "Normal", ConfigInit().m_KbfxNormalButtonPath ); + layoutconfig->writeEntry ( "Hover", ConfigInit().m_KbfxHoverButtonPath ); + layoutconfig->writeEntry ( "Press", ConfigInit().m_KbfxPressedButtonPath ); + + layoutconfig->setGroup ( "ToolTip" ); + layoutconfig->writeEntry ( "Avatar", m_ToolTipAvatar ); + layoutconfig->writeEntry ( "Dudebox", m_SpinxTooltipDudebox ); + layoutconfig->writeEntry ( "Mask", m_SpinxTooltipMask ); + layoutconfig->writeEntry ( "Window", m_SpinxTooltipWindow ); + layoutconfig->writeEntry ( "Logo", m_SpinxTooltipLogo ); +*/ + + layoutconfig->setGroup ( "TopBar" ); + layoutconfig->writeEntry ( "DudeX", ConfigInit().m_facePos_x ); + layoutconfig->writeEntry ( "DudeY", ConfigInit().m_facePos_y ); + layoutconfig->writeEntry ( "FaceX", ConfigInit().m_faceIconX ); + layoutconfig->writeEntry ( "FaceY", ConfigInit().m_faceIconY ); + layoutconfig->writeEntry ( "FaceH", ConfigInit().m_faceIconH ); + layoutconfig->writeEntry ( "FaceW", ConfigInit().m_faceIconW ); + layoutconfig->writeEntry ( "UserNameX", ConfigInit().m_userNamePos_x ); + layoutconfig->writeEntry ( "UserNameY", ConfigInit().m_userNamePos_y ); + layoutconfig->writeEntry ( "DisableUserName", ConfigInit().m_faceBoxHideText ); + layoutconfig->writeEntry ( "Height", ConfigInit().m_topBar_h ); + layoutconfig->writeEntry ( "Width", ConfigInit().m_topBar_w ); + layoutconfig->writeEntry ( "X", ConfigInit().m_topBar_x ); + layoutconfig->writeEntry ( "Y", ConfigInit().m_topBar_y ); + + layoutconfig->setGroup ( "BottomBar" ); + layoutconfig->writeEntry ( "Height", ConfigInit().m_botBar_h ); + layoutconfig->writeEntry ( "Width", ConfigInit().m_botBar_w ); + layoutconfig->writeEntry ( "X", ConfigInit().m_botBar_x ); + layoutconfig->writeEntry ( "Y", ConfigInit().m_botBar_y ); + + layoutconfig->setGroup ( "Scrollbars" ); + layoutconfig->writeEntry ( "ScrollBarBotX", ConfigInit().m_scrollBarBotX ); + layoutconfig->writeEntry ( "ScrollBarBotY", ConfigInit().m_scrollBarBotY ); + layoutconfig->writeEntry ( "ScrollBarTopX", ConfigInit().m_scrollBarTopX ); + layoutconfig->writeEntry ( "ScrollBarTopY", ConfigInit().m_scrollBarTopY ); + + layoutconfig->setGroup ( "ListBox" ); + layoutconfig->writeEntry ( "Height", ConfigInit().m_listBox_h ); + layoutconfig->writeEntry ( "Width", ConfigInit().m_listBox_w ); + layoutconfig->writeEntry ( "X", ConfigInit().m_listBox_x ); + layoutconfig->writeEntry ( "Y", ConfigInit().m_listBox_y ); + + layoutconfig->setGroup ( "SearchBox" ); + layoutconfig->writeEntry ( "Height", ConfigInit().m_searchBox_h ); + layoutconfig->writeEntry ( "Width", ConfigInit().m_searchBox_w ); + layoutconfig->writeEntry ( "X", ConfigInit().m_searchBox_x ); + layoutconfig->writeEntry ( "Y", ConfigInit().m_searchBox_y ); + layoutconfig->writeEntry ( "FixedPos", ConfigInit().m_searchBox_static ); + + layoutconfig->setGroup ( "ItemView" ); + layoutconfig->writeEntry ( "Height", ConfigInit().m_itemView_h ); + layoutconfig->writeEntry ( "Width", ConfigInit().m_itemView_w ); + layoutconfig->writeEntry ( "X", ConfigInit().m_itemView_x ); + layoutconfig->writeEntry ( "Y", ConfigInit().m_itemView_y ); + + layoutconfig->setGroup ( "ToolBar" ); + layoutconfig->writeEntry ( "ButtonNormalSize", ConfigInit().m_toolBarButtonNormalSize ); + layoutconfig->writeEntry ( "ButtonPressedSize", ConfigInit().m_toolBarButtonExpandSize ); + + layoutconfig->setGroup ( "MainMenu" ); + layoutconfig->writeEntry ( "UserMenuHeight", ConfigInit().m_userMenuHeight ); + layoutconfig->writeEntry ( "UserMenuWidth", ConfigInit().m_userMenuWidth ); + layoutconfig->writeEntry ( "ContractedMenu", ConfigInit().m_startHidden ); + + layoutconfig->setGroup ( "ItemProperties" ); + layoutconfig->writeEntry ( "NoComments", ConfigInit().m_noComments ); + layoutconfig->writeEntry ( "CommentMargin", ConfigInit().m_commentMargine ); + layoutconfig->writeEntry ( "IconSize", ConfigInit().m_iconSize ); + + layoutconfig->sync(); + + delete layoutconfig; + + KMessageBox::information ( 0, + tr2i18n ( "<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</strong> has been exported successfully!</p>" ).arg ( ConfigInit().m_SpinxThemeName ), + tr2i18n ( "KBFX Layout Export Ready" ) ); +} + +void KbfxConfigDlgLayout::LayoutFormLeft() +{ + KbfxLayoutProperty_activated ( previous_state ); + kdDebug() << "Called Leave form... Previous state is:" << previous_state << endl; +} + +void KbfxConfigDlgLayout::Kbfx2PanelsLeft_clicked() +{ + KbfxMakePanel( 0 ); +} + +void KbfxConfigDlgLayout::Kbfx2PanelsRight_clicked() +{ + KbfxMakePanel( 1 ); +} + +void KbfxConfigDlgLayout::Kbfx3Panels_clicked() +{ + KbfxMakePanel( 2 ); +} + +void KbfxConfigDlgLayout::KbfxMakePanel( int l_type ) +{ + if ( !KbfxMessage() ) + return; + + LayoutFormLeft(); + int mid_h = ConfigInit().m_userMenuHeight - ConfigInit().m_botBar_h - ConfigInit().m_topBar_h; + int mid_w = ConfigInit().m_userMenuWidth; + + ConfigInit().m_topBar_w = mid_w; + ConfigInit().m_botBar_w = mid_w; + ConfigInit().m_listBox_h = mid_h; + ConfigInit().m_listBox_w = mid_w/4; + ConfigInit().m_itemView_h = mid_h; + ConfigInit().m_listBox_y = ConfigInit().m_topBar_h; + ConfigInit().m_itemView_y = ConfigInit().m_topBar_h; + + if ( l_type == 0 ) + { + ConfigInit().m_listBox_x = 0; + ConfigInit().m_itemView_x = ConfigInit().m_listBox_w; + ConfigInit().m_itemView_w = mid_w - ConfigInit().m_listBox_w; + } + + if ( l_type == 1 ) + { + ConfigInit().m_itemView_x = 0; + ConfigInit().m_itemView_w = mid_w - ConfigInit().m_listBox_w; + ConfigInit().m_listBox_x = ConfigInit().m_itemView_w; + } + + if ( l_type == 2 ) + { + ConfigInit().m_listBox_x = 0; + ConfigInit().m_itemView_x = ConfigInit().m_listBox_w; + ConfigInit().m_itemView_w = mid_w/2; + } + + KbfxLayoutProperty->setCurrentItem ( 0 ); + previous_state = -1; + KbfxLayoutProperty_activated ( 0 ); + + KMessageBox::information ( 0, + tr2i18n ( "<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</strong> is ready!</p><p align='center'>Be sure to click the <strong>Apply</strong> button in order the changes to become active!</p>" ).arg ( ConfigInit().m_SpinxThemeName ), + tr2i18n ( "KBFX Layout Ready" ) ); +} + +bool KbfxConfigDlgLayout::KbfxMessage() +{ + int messageBoxReturn = KMessageBox::warningContinueCancel ( 0, + tr2i18n ( "<p align='center'>KBFX will calculate the necessary values using the present values for:</p>" + "<p align='center'><strong>* Main Menu Height</strong> and <strong>* Main Menu Width</strong><br>" + "<strong>* Bottom Bar Height</strong> and <strong>* Top Bar Height</strong><br></p>" + "<p align='center'>So be sure that you have entered their values as you desire!</p>" + "<p align='center'><strong>NOTE:</strong> Have in mind that the Layout of the theme also depends on the sizes of the images! " + "So if the theme does not look like as you desire either change the images' sizes to smaller width OR change <strong>* Main Menu Width</strong> to higher value!</p>" ), + tr2i18n ( "Prepare Layout for the KBFX theme" ), + tr2i18n ( "Prepare" ) ); + + if ( messageBoxReturn == KMessageBox::Cancel ) + return FALSE; + + return TRUE; +} diff --git a/configdialog/kbfxconfigdlgmain.ui b/configdialog/kbfxconfigdlgmain.ui new file mode 100644 index 0000000..c23db41 --- /dev/null +++ b/configdialog/kbfxconfigdlgmain.ui @@ -0,0 +1,670 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgMain</class> +<widget class="QDialog"> + <property name="name"> + <cstring>tb_Main</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>807</width> + <height>618</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Configurator Application</string> + </property> + <property name="icon"> + <pixmap>image0</pixmap> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QListBox"> + <item> + <property name="text"> + <string>Start Button</string> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>KBFX Themes</string> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Fonts</string> + </property> + <property name="pixmap"> + <pixmap>image3</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Menu Style</string> + </property> + <property name="pixmap"> + <pixmap>image4</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Tooltip</string> + </property> + <property name="pixmap"> + <pixmap>image5</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Search Engine</string> + </property> + <property name="pixmap"> + <pixmap>image6</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>Plugins</string> + </property> + <property name="pixmap"> + <pixmap>image7</pixmap> + </property> + </item> + <item> + <property name="text"> + <string>About KBFX</string> + </property> + <property name="pixmap"> + <pixmap>image8</pixmap> + </property> + </item> + <property name="name"> + <cstring>lb_Main</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>265</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShape"> + <enum>LineEditPanel</enum> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KBFXNewsBrowser</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>150</width> + <height>280</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="text"> + <string><br><p align="center"><br><br><br>If you want you can check the latest news for KBFX from here:<br><a href="http://www.kbfx.org/">KBFX News</a></p></string> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>layout12</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>2</number> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>btn_Help</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>&Help</string> + </property> + <property name="accel"> + <string>Alt+H</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="iconSet"> + <iconset>image9</iconset> + </property> + <property name="toolTip" stdset="0"> + <string>Open Help Documentation</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>btn_Default</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>&Default</string> + </property> + <property name="accel"> + <string>Alt+D</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="iconSet"> + <iconset>image10</iconset> + </property> + <property name="toolTip" stdset="0"> + <string>Apply the default configuration for this section only</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer15</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>160</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>btn_SaveApply</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>&Apply</string> + </property> + <property name="accel"> + <string>Alt+A</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="iconSet"> + <iconset>image11</iconset> + </property> + <property name="toolTip" stdset="0"> + <string>Save the configuration and Apply it</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>btn_Exit</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>E&xit</string> + </property> + <property name="accel"> + <string>Alt+X</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="iconSet"> + <iconset>image12</iconset> + </property> + <property name="toolTip" stdset="0"> + <string>Exit the configuration without saving</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QFrame"> + <property name="name"> + <cstring>frame4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>507</width> + <height>100</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>100</height> + </size> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image13</pixmap> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <spacer row="0" column="1"> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>25</height> + </size> + </property> + </spacer> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <spacer row="2" column="1"> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>56</width> + <height>7</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>KbfxLogoText</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="backgroundOrigin"> + <enum>ParentOrigin</enum> + </property> + <property name="text"> + <string><font size="+2"><b>Kbfx start button</b><br></font></string> + </property> + <property name="textFormat"> + <enum>RichText</enum> + </property> + </widget> + </grid> + </widget> + <widget class="QFrame"> + <property name="name"> + <cstring>frame3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>114</width> + <height>100</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>114</width> + <height>100</height> + </size> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image14</pixmap> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>Plain</enum> + </property> + </widget> + </hbox> + </widget> + <widget class="QWidgetStack"> + <property name="name"> + <cstring>ws_Main</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>32767</height> + </size> + </property> + <property name="mouseTracking"> + <bool>true</bool> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="acceptDrops"> + <bool>true</bool> + </property> + <property name="frameShape"> + <enum>NoFrame</enum> + </property> + </widget> + </vbox> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="PNG" length="2524">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af4000009a34944415458859d975b8c5dd57dc67febb2f73967ce998b19db638fc733c6c6a13851622e8646951d11c7a448845649ed90b618c97da8fad0aa5865909a9714a9955af50111445ba545958283422bd504a6b18002b270d2402e8e1b989a62d73633e339336766ce6d9f7d59b73e0ce310620274494b5ada5bebfffdf4df5b6b7d9f0821f051c6f9f3e75592241bacb563ceb9416bad77ce2d79ef2ff5f7f7b777efdeed3f4a3df161002e5cb8105b6bf787100e7aef6ff7de8f8710a4730ee71cc6188c31455114678ba278ae288a270707077fb277efde0f84f99500737373da18f365e0cf815d420800d6f678ef71ce61adc598823c2fc8b28c344d5d96652f1745f1b5f1f1f1537bf6ec795f91f705989999d906fcbd10e20e29a5905222a52084c0f2d2328d8525bc83000819185c3748ad56214d33badd2e49d22349129365d9df79efbf7acf3df7743f34c0ecececa785104f4929c7945268ad595a5c64fabfa6e9b4122a7d556ab57ea2380621289ca1db4bc9f29c6ab5cc96d10d081168369b743a5d7abdde296beda1c3870fcf7d20c0dcdcdca78510cf68ad879552386b38f5d2496ce1d9b47933524960ed53ac4e0f78045e089c08b45a1d44304c6c1da1d96cd26ab54992e4b4b5f6ce23478eccbf2fc0dcdcdc8494f215adf598528af6ca0a2f7ef779b66ddf4e1cc7acfe0281105619ae0004f07e0d4010a4c487c0d2e222db274668b75b349b2d9224f90f21c45d478e1cc9d634e5daa25eaf6b29e53f28a556c59b2b3cffcc77b9f6da6b511282cbf136c7d98ca14a86b709d6a6589b5d99a6c8b079be3aad63f09a61ce5d6c50ad562997cb68adf7e7793ef9ee0e5c01f0de1f9252dea1b5c659cbd4bf1e677c621cef0a9cc97026c5d91ed6f4586a75f8c45688458f2cef50143d0a93501409264bc87b3d8a3425cb0a2ab52a67cfd7191a1a208e23a494938f3cf2c8f5bf00303f3f1f0b21be2aa5144a299efbce338c6cdc882b324c9ea0428f3cef52e45df2bccbce11c96029f0ebd795b861b320cd3a645942962554758f8128254d7a64694a2fcd2955aa5c9a59a256aba294aa861026a7a7a77f0ee0bddf2f84d825a56471fe32972fce82b714599722ebd2a7536a71c6709fa1d7ebf0d6ec32cee6045f30768d64a4e6e8261dbadd3683e5829b2602366d937412ba494a92e62c770c5ac768ad010e4d4d4d8d0048ef3dc0412104524a5e79e125fa6b357a9d36bd6e8bb4db64e6f222b7ee28f3c9f1989acef99f8b75969b2db029c2a694c868359bf43a2d768d4a06cb867dd7079a2b4d9acd0ecd768fdc052ecdad502ec708216aceb93b01f4fcfcbc0a21dc2e842004cff44fdf60a8bf8fb4b5409e36102263d3960d70cb0042486edd5e66b1b1cc9b17e619be6103696ef9c1eb33acb40b2a91260ac36004e34310f93697570a4414a3a462a991b1ef96ad341a1221c401e09fb53166bdd67a1ca051aff3a3575e45bb1ee538a3542a903a67e6a2a7f84c4cb46e07fd718dcf7da29fc79e39cb993767a937733aa9c37bc1c4867e94eb815b3d297cd16569c5ac02288d29728c05a5144288dd8f3ffeb8d4defbad21040970e97f2fd15e6ad15ff144d2e2544120a7670a5e7cf52c9fdf93e36b5bb85c0facac2cb1b8048505eb02ce46949ca5c8361069c1c585821f9e6d92aa2a222aa1754496a5d4eb2d94920821463b9d8ed2218441ef3d2178dacb1dac0d38eb71d66295456009c2f2d8bf9de6d5e905b4d69c9e0b5407375258286cc01889a2c4c2e51e7ff43729231b2bfcf492a7272ab858a0224f2f6f333357e7b3b7ed643096082106bcf7523be79c9412ef574f3867c0ea80d101a407ef70c2e184e7e499b7310e720b516585be810ddc71f318870fec60782066eafb4bfcf55375ce5ccaf1ba848d0546433b69d3cb0aa40c04046b97298076ce2d4b2971ce511ba862aca0b0126504e363fd0c5d33c0815b477975bace4ba7e748538371b09234f9abdfbe9e2f7e660264009773d7ad35b60cc3eb6fe7140e1e7aba41a328a3749928d2083c15b1daed10c28a52ca6beffd256b6d61ad8db76c1bc3a3c98b809492e90b09dfb8f716768e0df0d91bc7f8e32f7e8a13afcdf0d013a719aa69eebe6d144c1b8406a140c08de370e3580438cecdc3c32705422a10122902231b07595c9827847071f3e6cd564651d436c69c35c6b06efd356c9a18232b3459115314110f7ffbcdb596512d6bbeb4771b3b460768753c4966575f040b3e07978337800360cff618a5244a49a480ad1b078823b0d6124278ede0c18341eedcb9d31b639e2b8a02632cb77f611f059acc46e4b6c27ffe2ce15f5e7efb0ac4c58584b766327a59c45bb3c97baff75f18afbce588a2884849b40cecbb793bad567b0de0048006b0d63e09fca9524addfde5dfe45bc7fe1dd3c9084e2395e02f8f5de0a5334b8cae2f71e2b53ab9a970dd963e3ebeadffaac23ec03f9decf1e48f622aa518a504152dd97bf3b5341a0b38e7e694522f5e0188a2e827799ebf2c84d83f30d4cfa1c377f1c413537857021f232871eaf51c44074295482b7e67df26cab1fa25f1e5c4f1d077528effac4cb95a43698dc0f185bdbb302625cf0bbcf7df989c9cec5eb98c76efdeed8ba2f85a9aa6a6d349f8fdfb7e8b8f7d720762b81f31bc0e39b01e5dd9485cda485cde40a932cc8933964efa73d39b99c037bf9772d7a305cf9d5fc7c0e03afa6b156a65c5c7b60c71fb6dd7b1b2d2c618332b8478746ddf1547f4c61b6f887abdfe701cc77f52ad56b1d631f9178fb2dcea22bc473a8ff20ec1aa11f50146062d9fff54cc4a0acf9f95745c0d1d57503a42ca55ab31d4a7f8c3afeca3b1b848a7d375c698df7bf0c107bffd4b00002fbcf0422d8470a2542afd46b55ac53acfdf7efd9b5c5e6aaf16f420567d30010142e28500a9502a422a85940a2105de3bd6d7627ef7eedb68341a743a5d8aa27864d3a64df7df77df7dfeaa0000535353a34288a952a9b4bb5229532997997afe7b9cfae134414aa4502056c5c53b10424904122104010fce71d30d63dcf4f1add4171a24498231e65b5aeb3f387af468f66ebdabdaf2a79f7e7a13f0441445fbe338a6afaf42911b7ef0e369cefcf7055a9d14a13552be03135643ca50adccaf6ddfccae9da3a46942b3d926cb32678c792c8ee3c9fbefbf3f7bafd6fb0693e3c78f578c310f482927955255ad15a5524ca91493a6058b8b4dac90ab29c91ad60df52125ef58f01e795e5014c5acf7fecf4647479fbaf7de7baf1ad33e301b1e3b76ecfa10c224704808515b7b1e42c0fbd55866adc539ffaeb59b73cefda394f2eb0f3cf040e357d5ff50e1f4dcb9739c3c7972c45a7ba7f7fe80736eb7f77ed43937e09cf3defb9510c2c510c26b2184135114bd78f4e8d1ab46b1ff17c07bc7b3cf3e2b1b8d862e8a4278efd15afb8989097be0c0818f5cecff00b05185fb1a9de9ce0000000049454e44ae426082</data> + </image> + <image name="image1"> + <data format="PNG" length="1428">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000055b494441545885c597df6f5c5711c73f73ceb9feb1eb5f09fe11bb95231aa2a03484a72a4f7d4102d1974a14a91595e08522481f10126ffc01bc235554555bf1824042b20502295081080f156d5a1195b451057113275e354e1d7b77f3c37befde33c3c3b971dcf5ba7653898e34bbe7de3d7be67b67be337347cc8ccf53dce76a1d08bd373a0b0b68d1adb71a2b3f5c79e39f4f96ade6b4803955c070d11022a28698e130c41431c501a28aa0882a0e45ccc40f8f2cff35b7c59fbd73e1d7373b9b9b00f73c2fbd2128cf9ca95dfaf35f5e7ef3e5979ebdbcd92167948021084e480a3897aebd0391fbd7ce49f57b5a03cc769b3c3a39c1d9f1875ff9c1bfdffd2966ed7b767778607de9d277dffad5abcf9e9319c2f33f26abd7b89b9784cc2302aa8a88e0bd434de1de93089880901481582a23633596ae5ea6f5a717f95af8f0b96fcfcd5d5c68345e00ba7d012c9f3dfbcce55b77a8ffe4e77ceff45334ae5c676030d0ed4600b22c60aae445411602ce7bd8e6c45e4a9765c981a79f60b1b5c689b3af727c78f289055800ae421f12766fdefc62933a274e7d05ed74d05822066f9f3bcfdffff60f62b74babb9c1ef1717693537084ec0744b659b7a318a4ecec1fa00874e9ea44da0168b29607a57123a4c3da065890f9ee1e141cc8cbb7737595b5ba7d96c5196059d4ecec4c438defbad58f78a8854ff0787e23d800520db15806078a05b9684e0a9d58668b76f1342606e6e86e5e5ab0c0d654c4d4d72e0c00431c63e8ebf0f2091cd8831e24410fdf8de9d00541104552578cfd050c6caca2d060707397af44bbcfefa39cc22870f3fccf0f020799ef735fe7100829ae16427d61d1c48b99dd8eebdc7fbc0da5a8b91911a478e1c066075f506d3d39378efaa3dbb6b164202a28a7782f420d801c099e105342ade3b44a0ddbec5c183e34c4d1de0a1876630336666a6aa74dc5d9d83907920151e2fec7041df1038116299f2dd39e1b1c74e303252a3d32978fcf1531c3f7e8cd9d919cc14e73eb99a3b679881aae19c20b6170052acd4b4aa708ef9f959541391a6a626999d9d21cf0bcc6c1f0092d3cdd283f5e64b5f0f78274455c4a538c6688880f71e33a328ca3d0d6f07d0b58a532e9dff89009c19ce418c8a881182e3b3b4ece03d79d49405b00f0f98e144aa98794288f480fe740032874403a36f16ecf480240f7463b21a4220c60747e07d40b5c054ab3ab007002ab244550c1271a47fa9dd4bcc1207d40c354be7ec05c099e11dc4181120cbfc67021042ea9e66fd0b511f0e28ce09455102303a9af2ff41782802b5e1218a950d62acb2604f0028de0bdd6e6469699589f11af5fad0a7b74eea05cde61dae5d5bc3d408fb29442904429e270f9c3fff01376eb4e813be3d8d9bc1fcfc24aad02d2322fb49c3aa646e6ee68c8d0db37eb3cdc58bd78831c571bfe29c2384c09123336499a72c4abc17c4f62844828a172146a3d158e783a5eb5b7cd8adeff713b34851442e5c58a690014a052f82f41cd12f04e6bd5194caf2958f585d6da2313e50269451b972f923a43e42d492ccd93e48581f7b7fbe7be511f9f0126ffde710a359409cdfb7d1edc79b39dacd2eeb371a9cdcb8c458cc6974ec0e107705f0bb76fe9bef8c8f7ef35b1717dc6b9bebb446bf8017dd228f541d4da4d2aa27b9ea7dfc9ea35cf5e14cf8eaed15bebff626ebad18173bfa1ed0dc7ae0de463318b2815f7ef9e82fbe9e5fff519e6f923b9f860cc057838790061227d57022f7d7ae02e1ab757030a49156bbb4d3d78a377e5bda0bc01fccec4e5f00e925c48f3d7368faf43129bf3110cb09433d961a55d5ddc15251114df7b6f2db746b9f28388c8dc23a7fece87fff05af917475d7d16c1bd90680396012d83f09fa8b02b78046f5bdfb6cf8ff96ff0115ffb738e470aba90000000049454e44ae426082</data> + </image> + <image name="image2"> + <data format="PNG" length="1939">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000075a4944415458859d96cb6f55d715c67ffb711ef71e5ffb0663830d04871653a24a44225594202615ea887106ed3419541db4953acab0c328a366d601832055e20fc8206a076daa760052a536928308298162b00d8ef17d9ed7deab8373eecb3651d575b5ef3eda679ff5f8d6b7d6deeabdf7de7bffd2a54bbf0ac330f0de7b00116124d3cf07d7beebddcbd644842008c28d8d8d8d9b376ffe868f3ffef8be8888f75efe5ff1d3c34f86f35e9cf7e2ebe1bc97a2284444e4f6eddbb2bcbcfc5b1b8661541405bbbbbb1479862e5384c3517c971cb97b3a6a4021880e70041c3fbe88520a63cc19eb9cf34a297c99f3e1ef7ecf9d7ff709e3b8522a1c7046a6acc96469c603999900142068cc608b0f7ef12ea7aefd04e71c228205504a63a4e45fffe9b3fba35fb3bafc0ade41c508d08056d5b39791d2110f0eda9691c519d1b1e61f9f7cc88bdd1dacb5e3752b228c7e7114f2e3f36d2e9e9dc7b9daa882b4804101bd0c7af9617b5247392d8ac9a20254040f179a68ad6748692761281470fd35c7dbeb95510578057901c3129c03e721cda13384671df8b607c3a242890346c75e0a680f7ff682a82aaa911376ec8d0241d17d210c5ec020af0c9625b8128a128a02b2a272202fa105b4144838857a8d884885a052108530bf00b722c1a310f10710a8e357080f37851301a425a82965e3a874a5b8114ea21cc1ad0d580d61088d08a2089a31240d68b4aad94f6ccf3a30521744601b109407a03c94e009c29acab852100430d79c0cadc0e86a53b57756e3040155fde9084c0cba38825835ce751ad10ab4ae46682b54e2a08a3e0cc018260cd5153aa25fe2c0880b7113daedea9b4608a583d24f19a63238865fd7ce0018700a3a1eca8caa945db52f18405af8315945a4ea03a307a52a1624714c7b1e061e0a0de2010faa9e0ba9664f551165e1f0a228c4e1f637f1cf3730f900d23d24dd4367bb68d72330e09f3d4307af33dd246638a094e28f4f3ea1cc35af6c43203183e434852bd9d52f7816f73899867c1d3fa2936e21d990dc751134850c70fb8fd0bde7580f9153340a432b372ca430482c5bf969021dcc34af290e288cb6fc6dfb2336060f481ece11772d990e7061c9b7e1005101af866de276c0b3fe3ee91044146501aed4a043c49871de9516745c1244828b3cbbda61ebe48dfbc088c97566f8e1fc6bacffc093bf5ed0d9876c2094a5e5b46a12194d7341585d0213b64833c87321cf60d8177a1de8f71cfd0e743ad0ef0a450e99133c20433fae862352005a696c12b0fb7085f6c90167cf74c62436b6647434656581948209200c15f13c2c2c57012814de439e439e2ab22114b927f79a3fddb778af66aa6baa158388862863f1ec03fa7b6d865b31fdbd39d217095192d27ca58b0efccca1d858e8638212f155db1b1d52da806e40a3094d251042d8f42007cab03a8caa12534a916590eb1cd3ee2008ad56876829c21716b3d01f7befbd463ca45ef0bd08139455c31f4939ce2a4a0952780a372a4399e5c0b4a44e33cc2cae303539813047873979313e7210a963f50a71752b57e6a0ba4a8756883238a950f2d3552022b597aaaee7845c124adfe0d0415bc3377d27514a8112c4cd9c0c93bda251da23129217314af9233800602c89eaf2973fb478b0781957da51a855cebd426aa55a553d036f112f785f432a20de563c90bad4bc41bcc629837af088283133975a0be0bd6398393ef8e5cf787feb05464754bdee209655d4459e511605da68b43698c08e3b294aa64ec91a9dfa9cb6a16279e52483c1608280312688e39856ab45bbdde6dcb92a1ae71c5114d168340ff9f1f5d70fd8d9de21996b91e739ad56c2850bdf9f4d17e0ca927eaf8fa8aad583a2280a9224218a229452cadebd7bf79f77eedc59595a5a626e6e8e244930c6509625699af1f8f1265aebb143d65a1a8d8873df5b436b4d599638e7d8dc7c82730ead35d65a421b72f7f15d0a57f0d6c5b770e248d3944ea7c3d3a74ff9fcf3cfe9f57a439524c98513274efc7c7575f5cae2e2e2f1b5b5b5f6fafa7a72ead4a9606969893ccf89a208ef3d67ce9c19798ed6ba8e0abcf7946539462ecf73bcf37cb3f90d4fb79e2299c857f7bfcaefddbbd7dbdadadadfdededed9dcdcbcdfeff73f1d61b6009c029680656bed6aa3d1586d369bcb73737327af5fbffef6d5ab57179e3f7f4ea3d1a8f2add40c9994520c06039acd26fbfbfbdcb871e3e1cef6cebdc160b0d51ff49fe579be0dec00bbc01eb0056c8faa60bf1e00aa2c4bdbed76e36eb71b74bbdd8b67cf9efdf4fcf9f32c2e2e323f3f8fb5966eb74b96651863489284388ed9dbdbc35a4b9aa66459f674f3c9e647c05d20adc790aa458d2bf95023aa5f165aeb626d6d8df5f5f5b537de7863e1d8b163244982f71e630ced767bfcc128052b2b2b1863b0d6f2ce3befac6d6c6c38e0d11136265570d46210045cb97285959515161717df7df3cd3789a208e7dcc4cb1af6d13c2d8d46836bd7ae9dbc75ebd6dbdd6ef7ef75e4ffbb03cbcbcbf4fb7dbef8e20b2e5fbe1c7ef6d967e32bd4cb64fa5d18867cf9e5970441f02ad5edfda50e1c79e99d9656abf5ba31e6a7c0c9ef72e0a0deb22cf37ebfff57e05326fc3a24ff05ef7d23a08a1666a10000000049454e44ae426082</data> + </image> + <image name="image3"> + <data format="PNG" length="1637">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000062c494441545885ed975b6c14e715c77fdfececac77bdf67ad7bbbeadaf806d622c3b363763a00e8414e4248a233fb434254a451a4a23552daa5a45aa22241e5af5254f552b953aada2a6525225ea2d2929354ae22a2401ca25d825c10ea9c1062fbeacf732b373fbfab04bd006ab52fb924a65a4bfe661e63bf39b73fee73b33424ac9e779289febd3ef02dc05f85f005001c47ef1efeed9172a8b1d49ebe905e7f7c6d35c9727813b7bb707d80e240b571d00050c015915ce3930e7805dbc349f0145ac2c87607969e4d0c8f77fd5b47de7833d34c86781ea15319dffeccd8b01dc9524c0a27b5bd77d9d9b6b3bd9d1b90deabd5bf0b2e98e282a505958f75f01e4c49dd25d3caaf76b0f6edea32eda8bb4573750ded91422c64ea0a4288a0fe802729f892e0129f36797950a77ab04ca9d7208b534ac79a43a56c3c4fc2495fe00fdeb3741b36717b0a6284a04b0815b567251c8d183e53e81e31ec2c97d8980dbb192e5d54f013e8b65f0f0e096c1e8892ba798be39cd37770cd3b5aa95636b2adae5b9857e3272825b95dfceedf4dbacf504b41f0ef40d0cc6eb5b3447b8cc266638fdc185a5e5b1b9e7b9681d4177178b3360c962198ec75b5aba6f43d7468e9f1ae5e43b635c37e6a9af8a52dfd9a852a33e04443f05360be9b568aeaa8dbf76f4bb23438f0e7e45bb662da2fb1cf60e0df3ed6f3d555139d8fc1dead46781403180c7532ccb69eb5ddbdb97162653172ed9f31766b2673e19c75fa2d2d1b506e2be5e3ca2bd08200398e2e9a7860eb6ec6cebe7ed8fde63f4e72fa75ffdc1f3332f1efb1db595617afa3b20ee1b465536140398ee6d193602f1e5dddbf794bf71e14dac0b8984733233f6d6dfde61d94ad3baaa8e9275913821ef6ec00bc0120503c8f0cddc321fdb332c9acb9056134cf0e7a9f129633eb74879c807115f155e4fcfadf2e73d20d4dbf5772d5fb4aa6e5f735323bf79f53542cdb521594bc78de904b3c99b044b35ea3babb97c7c618005b30198620c581020e4af477efb8be13f9e7aa3e2ea3f26c1ab9495efae1968bda7d997b13298d2042904100234c02e00144c2804d8c6506ff7c696606980bdbb1ec2b85f0fe8520f64cd0c592783c784787b84cbab03dd4ce9dd38cec7482497014539615af33fbdda957a667def263af775444dbf13cd9a6932660addd2c146229185941532e00a700b8dea2b7974e7d6018e8ebec47befbf8fc7a321a5c4366ca28d15ec7cf85e2aeb0294dd130ca64e67f790488f52aa24192e053df7c555abdabef1c4571f430b6bbcf2f631cefcf53cd1aa08b507b662d83a380ab7fbf5168023410ac899ab3bd7f7dc571e2be7e40befb2fcc295b3a4947184d001253b50353cbb355eee8faa44d6f949c5fcdb49a41b9024316cd51f28fbd1c1fdfbc391581987477ec2f4cb130b5ce18af678ac232b8c12c332c0c2c1c52ef40db78b2f01c7797c60cbd6ea896b1fb13c3e6f32cb1fc0fd25f91163d893b9eb974e5f7d66ed03d584d6a8d0e26b6532b0836cf603e669acee8f3746a321266e4c327d665a7232f70a41ef8ca3884e5d66312c034c018e9ba5b06f2a85daeff058f6cf7afafa0ef5f5f690589ac7ab78045da16dac2e5b4d509b67634db70894b42f7e98216564084435623b3455ac8b7d8fa6e623cc95d46575c34e5a497c251e6a5aaa11dde5fda1c186bd0d5bc25ada4c43898352e6f189b6fac788857701780e1f3ecc8ffff4dcebfb0f1ed8b377e8112d874e381ca4b9afc99389db2d37ff99dcccac755edd50f9dcbaaf57df5fd5e7c7527348d725dce623b8d1295f4e3b5f70cfc885ac5c88785afc75f58d519a3aaa45742012abdc14a8fce4d234b2d4a1b4b6848a7b55450fa6e2b98b5a034ba95115c076a471e2ecbb1c3f3586619a20259aa6b2944a832ec2586eab9b76ec6be3499cb33676ce01376f254503272540b71be5797de4f5a36fb55eec9f0c05ab34b2199d99330b18e75cebe6df6d6f709d8b6bbae81f6a60e4ca80b89052225afd0f605b4f6213412a2e28f9ce505485a47999b43942345881577b124b864148a45298768a40489be4c25f709c1709699b886807d094464c2149b9732ce9e7099555e0f776e0081f5927417af14d1ce7a53c80100af90f8d30c5435314cc320be8400d50c1ca4712b8417e2cd50071f2835a0712e437ebaac2269403e68084b8fb677417e0ff1ee05f1458965be335503d0000000049454e44ae426082</data> + </image> + <image name="image4"> + <data format="PNG" length="2248">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000088f494441545885ad97798c5d551dc73fe7de77df36cb7bb374664a4b3b5d862eb4b4a54a0b941064495428062b428906828184144134022e188326c42d4a8dd6440c0409221024104a684b145a96165bc3d27d994e673a4bdf9bb7bfbb9c7bcef18f3b3342a7d3f40f4ff2cb392fb9ef7e3fe7f7fd9d9cdf15c6183e3d767eafe933bf11a04385727db4d4688f0bec64fce664c7dc2f344d9fbd34168f27bd4abe54eceffd78f781c1ad4fec362f7c98a3f7b4d74e1ae3bae25c01c2aa2b30f6fd9d9fbbfea1e957dede919abe003b9982b00e41115d3c81dbfb6f8e6d7fb9ef17cf1f7cf4e98ff90ba0ff0f0002e57bc4620d1be77ef5d10d6d97dd01c28984fd12c84a14ba0ec6053747fedd97f8d1c6d71edbf45ef81320381b40ecec8902a31576ccf976cf2d8f6dc85eb21ea4023b1efd55c44058519a9482c0052368bbfc267eacf5837da3af8ebc7690c70135d5fbad498256ecb3a1f5dc8e956b1fce5e742dd40b604230329ad13091410302d08ad0f7e958798db8f7a6850f64125c72b60d4e0248a49313114f3a2432d3bedeb9726d17d287d0055983a0044115420f4c005a820ec18468add1a144590e2bafb86ce69a1ee766207dce00b1447c22ec788ca6f37b6e48b5748257005987b00cb2046105c25a04a5fd282b2ac4a03168c22020dddec5654ba65d0ecc9e0a60520db84a4cacb512adedd9ce6eb40f2a043b04ed80b0a3d46b09da8b40948bd13e5a2bb4d26825515a31737aa62b619f9ced2bf69d1340457e1ac04a1adbb209ab60ec6897e385674c5407da8fac502eda8468a5d04623a54fe0d61036712168066cce508c9300fa72fec45aa9b038b352aaa13cd03af21b1b84180350a00350014a2b940a515aa2952470ab04f522b952ddf743c273b6e03b4f0d4fac03a9ebcf761dff60c1aaca1c4d0c11060861218435768e155a6b8cd6281d8e4148bc7a995ab54050cab1fb6071c440fe4cbb873314613a2126a22129d8f19fde17730307314210860161e823a54b187ac830200c83b15912861ef55a994a2987571de578ef09bd7d6fe5236060aa0c4c02a857d544b835c3936f5436bfb7eda57f693f8732268250c118ccd85a05047e9d5a79944a71986aa5809b3fc23fde3c70b8f794de010c9eb3057adeed00181d62d9366529cb8f6ce7f1ccdc0faf58be649e65624d60547408c6522e0317dfade1d5cb78f532aadccb5b875b8227dfefd80227ff09d4a6029874172c7f389a5518157e2cc6d5ab17b3b16d70dba2b56d1b696d7668ccb4a3ad04a15448e921a587f22b78c561aa85018ea915ec69f92d474fc943dbfe7ccf3d5effb6ada70b4f79192dbd5f0210042ea9b473fbf7d7a53625bd7c62c71ec17deb25bdbb9fa172702b69334abcad09a934c6af5019cc534ff5102e58cfc9cc2d7cf2d6296efb4a276f1ff0477ff3c33b37d40f3ff7ec990026d50002b4018df5e5efde98fcc3f5170689c270911baf69a26a3a685bf300dbdb9fe6c85bdd34ff7c2bd39e7a9ba6c776b17ff80ef62e7b9960d137495a71be765d0bfd07faf8e9cd0dadf7fc60d3ef45fbe56bcfe88131e633b17883c7dcbbdc8ebbfe141c7295312f6d1930078f558c36c6ec3e149a770e69b3e5a831db5fdd65de7792666f02b3a5b3c7bcf1ce71f3e23e637eb94d9b1dfb9431c6987777e7ccbb7b7266541a73e5bd3b3f21d6b6e474dd491970dd80c6847ae81bd73af33feaad4332c179b31af1425870becd794d8655b3606626c4ba7839a519f3189dd34977c6674d37dcb010562fb0f0152c5ad4c2f1bca6e62abe75ebe717372fbced6e4ebb9826014869cf5b75616c5d6b0b7c78c4a57b4e33f92a145cf00cb4b55aa46da80e0fe0c61d12d90cedcd8d8872856949e8ee14947c287ae063d1755e9a0ff6d758b110565e7be73a485c7c56809850572fb9c039bf6f44926c4860620e250f2a0114dd086444815ff399df9066597333cb5ab2544e5518d1305c8b9ea9f8305286a66c9a42cd50f10ccb572ceeb23bafba0e484de89d0e9072e4a54d198b13799f6c63828a0f9680b80d710b6236602055f3684d242894caf4960a0c9e18c271215f03a97d06ca47b0dc1ed00e4e4382e32392d9b3e2a45a175e541d7ebd0de83f234063a3bd5802ae14641d87a217893b560460c7408450ecefa79ecfe3040169db46f7f7315a07a3a11c54d835f83af3d3331032436726ce4849124f43aaa9bda30ad929016cdbee2cd60d188b9a043f04676cf78e053101e1f008d342c9458d0d38f951c284c3b1a1010a15456bc246ea7616b7dec748c522740d992641804d3d8058bca1e1ac16f881a1e21b1a9291f7e3e2312b5adb36985c9ef9d2c5d59ac1c3872935a4189ed98c5552c433362808029b6a0ddcaaa292b591c2a2ec810c8df569dd4900a3396f285f6f986dc505a11f793e6e414c441698c153f41dda879f1f252125596dc88c0e3150a8e19a388486d08306cb906a165425785a309c07b75c0ea22a9a0a60a4b26770a87d55ba11509018171f9bf120eec798d33748cfd0718ac0bebe231ceb4ae17a16690d3214281b9c068154d1e91109c1d1c31a77f4681e70c7f5261dc3dafedfbdbc778f5095006a0a4a3e940328fb500aa05a82c2a2d56c7ef06fbcb3f44bbcd2d4c9b357ddcbd0237f47366728d5c69ef5a1588fc47d0b864761ffce5ea5f36fee070ae37a932e232bdeeed80b9ef8e3a22fde78e7b23590480061d4d0397674242d013a055a85985c15a723430c11756e268a508fb5400e948ab073739dde57eede45eeafbf025e31c6b86704104240aca543ccfad9afbb56ae5f7fc1eaacd5d10dc944e4bf2da2ef0fcb80355e4e3232d5005a44eda30ca15e8313070c07b71f55c55d0f7f40e1f967801780c129af6321c6bb622b4bfad275a2fda65b1bbbd72ccdcee8ca66bab24e434b1a2711c372a24c083126ac404908dc806aae4a6930ef17fa7b6beef1cd7de49e7b0f75721bb01d1882b3f403ff0318af113103ab7505a2bd072b3d0d3bd944cc4962db7110d678830c0642a9086580f25c74b988191ac4b8c780c3c089a884a331aefb5f877be675a596fb2a0000000049454e44ae426082</data> + </image> + <image name="image5"> + <data format="PNG" length="2112">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000807494441545885e597596c5cd519c77fe79c3b73b7d93c5e633bb163e3a0d464452c624981084a6901152ad44a7d28ea4bfb5015212155ed4b54a942e2a1521fa8aa22fa825468559597aa05a2a46cc1019a04149c409cc589778f97b13d7367e62ee7f4611c484204dd242af593fed2b9df95eeff7fbefb2de708630c5fa4c92f94fd7f4180d8bbf7f9e6ca40a443b4d6609abaa224cc80b59b58dd9c16d656dff606ddb4d791529697e8240a1ac142a5b13a518f82b1d9c5d7dea9d52e1c4637661616defda70558573a0c9a44eb1e9158dfeff6fbee1de8e9dd3eb4a535ddb3d1a3d866e3b829a40403d46bf1c0ea7278e3cc749db363f7706a7ce2f4c9c9838710e9df2c940ebdf52f47a091d47d93881f0de4861ebf69d7b5ad3b6e2cd2b959e064c108d0062ecd5901080952405881a52938f95e9d37473e8cdebf70e0c5d1534fefabae9d3bf95902d4c0c037018874d46ae33d77fbc0ad3f78f0e16ddeb63b3c9ca2208ca15a855a00f5daa751ab42508530013b0f3d431643fd5daa100f0f476cba777e65f4c3b0b170e63305443a2c6453f917bf72ddde7bf63cd889df0d4100f500c20644d13ac2abe092778d00ea7548e761d39043a71c2e6a3174fff4e2b1d38d7ae9aa9150fd030f90c27a664fff9d0f0cdf5e441621a8407825c1e72186386eaeababb0ba62d091a4c3deec44aa65cf85e937de4de2e0fca704f40d3c78ff8e8edd4ff6e5fb599e8b0896410b416c0471d2fc70144278b5285cf25c0f9ac4e539c3f234accc19ea358deb29daf27d99b1a9f7bde5e5930781daa5022ccf721fe9c96e224e3471042ba7356be70da9bc209503cb97c834a0b8a26b08cc7a52ea049204b46efa850b962360dddfde9167f8dafbef183fffd24d3aa9fef53201ad4edb6d9ee5a38d4608102930da102e19c2252065901e2847206c814881480b840542ad230d290b9405428049208921894047a0046ce81aecb094b73d4caa7f03ea1f0bb02da74d0a4962924ff6b6be539102e900b644da8003d26e4644a6c171c1f19a3da1116aaa419d2008495b16be6be3f82994041381eb7b42aa541b605f26a09e544bdae88c4060f8a4c8856a9209677df70e084720d3e0e5c0f5e1ecf80223af4c706eaa4a2d16b8b640498106eaf50491c086628a1bb6f713460b894eeae19549682d05536f0749b0d9533e89892ffe5e842d11b640da026c81b041b95028c2dc6299677e7782935331db77b472df439bd8baa54077bbc2b6214e60a96c181baf72ecd83c7f78e30273a76745ac07bb60e9b2f1abacb4af3bdb773cd2e17688c46800645a209c26a4db84f2a0d00a474f8cf3f35f1dc7efede7b1c7b671dfdd9df4767b2825a9d460b50a951a845ad0dd9966d7ce166ebdad07f283626c66d7ae28b0da493e3c84896a00aa5c3e7d467a2dd76d6cdbb5d5971e5a6a842d508e4439201c8972215f84d1b3133cf9eb8fb8e5ebb7f0bdef741086829912cc97617115ca1558a9c2f9325413383f0be5325402d83298a6e79a8d8c4e5cb33baaacf6d03876006828ad635d5a3af977996dbbb3a7b0b5d3771cb0cd7a049ae48e0f4152e317bf3dc692d846aee8315d4a0842492d129403985c3054ebb05687850adc322cb8a6070e1e37d4eb828555c0182696f294ab5ddba98fae124d1d560071545d9e9e3f3ab2a6a29dc5e2e6de42b60561038ec07220d3026f1c19e3c01107725dccced6383315333e1733b998605282afdeac38372fb830d39c1147cfc0b7f708d642c1cbef449c186bf0dadb01737311b89d90acf6537973445d4c8628accc9dbff0ea81d9caa4ef64bb766fe8ea17d2a129200f2fbf3bc999d976949f225390645b14295710c486f676c98f1fb678eb4cc2d1f188ba49985a4ec86725775d2778767f83d2528c9402658136694cbcec52deff81353878f7c7c51fc78d71cf6d39db96ef14a934281b6c1f1a614cb99a806fe3e7055e56e0f812d713a45cc94a2cf8c62f23a482e2068100b40ba74a866fe5a1bfcf020c3a34045583b224d58a9f4a846ab376eefc6e935fa43c29d3fbb674ec7ca2bfab8f5a1853995f6076f4b419fde095d2d9522ee5763cdae2672ddcacc1f5256e56927205be2f296404a11144cd2a46350c995c538c9b91f82d8aa466406a8454d4e6ca6162eab1659aa5278c69fca4515b7e74f4ec4b8b874fcc351697cead96164e4d2e2e8e9daad54ac768ff5a7fb6fb819f7ab97e9c4c829b91783989480b86fb143fbb57f0ec117873126c0b441d6ed80c8b55882c41ae2069a43442a588a31a7179a44454be60bdfaea3e00698c7ea1d1583d526facb5e8240ac02c01a58f517ecb094a876ea7af7b4fa6e0613b095e56627992242d38780e1a067a0bcdd6dc5f80bd83f0c207802bf1315896c208c5f9e307b599fed361e084b86cbc35fbb40692755c6e4ecf2ee7c6a77e3f7ce743435d1b1d6ccf90f10479076c054507d216180df70c402582e78ec35a03aa01ac9535c75f1f49e6f73f3ec2f23b4f037f565750c4ebc457bfadc46bb3f1cca191855ae606abd0b3a1b73f474f11bab3d093830e1f5a3d287ab01ac3474bcdf3a25010c486c32f1da2f4971fbec6ea9167805780952b057cbe25d5693df3fac1f953ef455333e1866add2b3869978e9c455b46507020ad60b96a3006b29e00095a0962e5315faa5593f2d91788ca272f86fddf3507e95d8fb3f12ed5f9a5eb8bbd5bfbb22d6df9b463a775149ab5a5f98af4dadc8d3bbfdcdbdad5a1849741a7b3cc4c3538f1f6c844e3c8534f30b9ff8fff89808b96065a8176a0087834cf4e0d2022dd35446e70375eeb066cdf57b6e760650b89d6d38c3dbfefbf21e052139740affb14900572800ba4d6218005f17f7f3bfe07f52abb9041473e950000000049454e44ae426082</data> + </image> + <image name="image6"> + <data format="PNG" length="1990">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af40000078d494441545885e59759a85d5719c77f7baf3def339f3be4de4c364d4843d2262db5e596562b2d342d52915691fa52045111d4177dd2828f8a54e8933e494150290a8aad43930e64689ba453d22191a4496f726f73a773ef3df33e7baff5f9b0cfcdd0e445512af8c1621dd89cf5fdbeff37ecb52d11e19334fb13f5febf00e0acfdf8a1650190803230f1de0d0f6f3cffe59f3d74d3a8be71a2167daa5e0cd71542bf64dbb6d3ee25ad53171a679f7fe1d0feead8a4ba7df74d9f8e3c53edf7d3cee24af7e2ec426766fec2d9938b277e7f2a9b78f003cebff051f5c367b85b347f01b2a14f11b90c0060800afcb44cf1d1de57bf5379fa896da53177eda90c1740a10cf50d4fc56fdfb373c708f7ddb5e9aa3356fa30b73ac552e72bc99f5f5f3affccb3eb8e6cfcedbe674cb2780498bdae02fd9c6cea5ef8763d5eef2777dfce980b593ac018411044042c0b11210c4246832e459500d0eb7501b0100ab64575c4c61a77fd3d5bc6b68ed53fb3f5b37f283f369d2c5e78151e5f82fd6b7e2fd580c9d78e3af8eda0881fe76c99165263c8346803592664590e93191b2c951f643bd8cac5763c6ce531c82c7a9d1ebdbe21737c5ce5b11d368cc09780da350a44400f6a4560b658a758f0c830a406c45808328c4f100346f235b7b0c8dbc78fd35c5ec0b204c70d09a3221b376da6562992a4e0fa1e8b5e99cd400c1bf24cd3b80a00c0835a082c14ea94239734cdc88c05c3025d2b1cd777995d6cd06aaf604b1fd78969740ab47b198e6962a5a73872e4003b77ddc61d535304012c0555b601052800e1350ab4f387a31eb0581c63d4cde5cf86b52743e79eeb333d33c3b1837fe7e65ba698d3db58c0a3507128db16cd769f8f2e2e9136dee5b5432f31bfb480bbed6156a30a5eae400404d70008e0434d01bd521d4f41864daaf5a5e82d5bb1d26a73f4e03e76dd7c176fb7b653aec1ae7510bbe02970544c378d79f1e82833ef4524afff95b373a3ecaa4de003c53cfa6b1510f002a809302856096c21d5901a013168035ee0f0c691436cdeb89993e97624862884c516b415b8ea7230bb6f0ec9d49d74de9a66fee441a67b19e1658000b000b9d40519c411940c8aa458c5b30d032da45a1868c076585e69d2695c241adf49c3e4ff6e74a13d805602ab09341358eec1dc0a8caf0f68576f6722cae8b7cfe100658887356f7fbc08e322940c018342094f19faa921130b0b1bdb76595d6d52af55c8fc0aa325e824b9f3815e937fa880814483b6209a588ffad023d0a7c9806a0e501e2a7019c0855204e5ccf1a01011388a540b666df819e82729aeeba35cc5880da182661ffa19a406ac74ad53f2e3030f462a16b3caa54f86c901021faa092820bb12a01643bded84b8850057412fb5315a232268341a8b5eb7cb88ca28bb1ea10ba107bd411e713aac5765e58a1443686ac10c3a2cd9650c8a225a8539800324970032188fc06e290f3ff6315a33c80431064130dae04625ce2d2eb3a1b3885b9dc477205030f072e7dae467d9569e8e3884f9f3abf45b0d662b77026f52003b84f20ab870c52856301e005d27c08e3cd2cc90096428348a3413e2729dd42b3177e63896900338790b9603a886f92a05508b402c983efe12dde62afe9629520c61deee05c0bb0a4086001d2f06dfbb346ef312b0f25d84adb7dec3a953a7689d7b0b6d200a7280d081c085d0857204d8c29b875f65e69d0394aa1ba84f4ed2c45d1b83311f57c085111f588a46705c1bcbb6112c6438f3b581244da98cae63fd9efb38fce2df987eeb6556975b582aafacc807cf83c67297c3fb9fe7ec2b7f221addc4e71f7d8cbe49595131c55c81704d812b8b70dc032ec6e3544b0ec5d802a5b03158c3bce62268f6dcb68b7a2de6c873bfa1fcee3146376e252cd630222c379638f3de1b948a319fdbbb97e68b07885fde47eaefa0e99698d00dc27c0eb85701f830e90333b54d743b65fc634ddadd017ad0234dd261376894681cc7a1be6e82d3bd8d4833455fb880d62749d3944c83134f32397796dd3b53a61e7f00fdcbefa3ce7d8da57884cdfd7384b90257030496356e44b8f71fcff2fe8fceb09274c1182c04cf56584aa13c074f816ddba4aecb5debd7a353c3a0dda397a624bd04a385be9966dbe004db1fb228da42fcf59847bef934a5e64500a2eba520536a5e4647b73c60a67970e5833c998e8bf65c2408d08e4366dba49645aa359d5e9fd9632b8451c458bd4eb15c26180f714570933ecb3d8fee2f7e45bc3781fbefe0911f587c78741555df41e1f4c90091ab15782ecb7ed268349eac79deb880f45b6dd31593f5b5a43da3d3aec8a02d92b4443add7c0a779661c16229299d395f2a40a566dbb551a52a9520884b7e1084cbabfee325134fd44e133fb087e889295efff13b4c8bacaef9bd047008fe783449cedb49729b4028600cf435f40df4802e97f73e900cf7feb09b428c8930a662a569c56eb54a16c4ee3ebef5bd1b166f75d64db3e98b5bd8ffbbac7fe2158e0273c3aa1e5e362f9b43febaf4877952fc7bdf0f16c08d70f70bbbad79f9795de4fdfba5f9ca1764af6dff1a181191eb1e9c5d11e100d0e477d67fd504e00c1c7cf2b83c3973b80927ce7161df07cc0905d62ea6d751e03f6e15283e12f2d47727d5fbb7d8d67ee01bc0988860ad39b7aeb878fe972c027690f7ff59605e44c4fabfff3afe27b84f6c52b49a1ccb0000000049454e44ae426082</data> + </image> + <image name="image7"> + <data format="PNG" length="1507">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af4000005aa494441545885ed974fa8644715c67fe754ddee7ef3269967065f340654304677491809238218043766658c0b1766a3904dc0a52b096e45084a90ec5d8d086e62208b8c5191511223891992996498d199791327999ef7a76ff7edaa735cd4bddd3dd3ddcfe0261b0b2e756fd5bdb7bef37d5fd5a91277e7a32cfa918efe7f0040bcbd41f40970005968ed7c926573fb93cf6e7fe1738f88a5141482800a84507e260a514015a296bea8a0c8d1d03ef72b8d7bc3f1cd975ffad90f9700ac2f02e4f8f1074f7cf3a1271fbf571ba80254117a017a112a5da8abd25e8585feb63eb209cd3f77ef79fdd1e71efb90001cd807363d3b9373ef24766f246210541c69a314812e4a5d885e5aa642db5e0d8493c71b4260eb43007020037b404a0763b7af0d6ef0c85732c9051129af48c7d2f2d78bf72a70ed46e2f2ce1889c10f0120804be80f7eb4797cebcb70779634d6c6c3a71efc6cc5f7be71ac7d47997b7919c0aa727d38e6e95f5dc6906513ceb136c0b4b7fdc0c9a71e7eea07775766d0d4fcfef957198da63035f6274e8c01554754501584521f56f66a48aef8a100c4c02722bd6a7275176e0e411aa19e0a8e6366983966823ba80bb8a20a66c50f22ab8138908d3500dc01030f00e349163f7af33a0fdf5533adc79cd24c366901404a46085064288aabae1fbc83907c0d00ade2a383a3c71e12f14cee57a314b64e7e067ef29d4f403de2a5d7fecd2439968d9ccb37b78ed5f9a26361198c00d9643580ed07bef4f313dfffeea77b188c0e38fdc26bd48d8119c3da4926b8416e018808222d6b8088e26eb82b22e02eac2223b9e0ac5809e391cd300c77b0bf0b8cfb4c2ce2e6604ece8e5134cf66e4ec0b86eb2470dc05f75287e098b164cce482cb0a0013c3b8f601f70f2624ab79974c76b09c71cb980b869352262541241342d1de1d44bc1d5c7107339919730ec24906862e03d89bc0d7ef737efcd871c6c37dbef8b78a265134b7c28019e45424d0593a93168052f6188b57991da5bf80c8eb2470944c59ddeaa99051cc9c9c0d4bd60228d3b03020330050229dfd6b96d46e9d1dee904c6095094d4a8464239be108e62d03de32e04233ed2460367017b90627f83c7a775a5fe88cb1b5d3d024600e6e86991506dcc996c929935d1844676ba3f0d5ab20c632680c4e8825350715b4cbd5dacec7968d415516a2954bb153a69959a739ed82e34c73265491175fcf8c6f8e999820dab4ff97522bb73e236d9b202a0415f6eb8c0c8e21a2b2cc80068c623237c709b8414a0915b82b8c78e5ed8657de1208807a094cbcdc6b49c9e572824015957e74aa18094119f47b6c8621e3d16855366c5d6e9994322e600e4d93c81e78e689e35cfde0805e2f12540841511554b5bd6416adaa5085c03b97f779eee59ab75f7cf6c2f0e29ffe2e7130c94dedbe77eecfcb00a42c223939d90c73a51fe0ce23e023e7c4e7b7e8f703550868d0b2cd094a4b07b7a6e752eebb779f5367f790c9ce953c7ce317c0f9b66bb40240c05a0fa46468889cbbe6fcfa4ca2ce42509be9dc452c32d7182929b9f380aab073bdc6e2065e1d71e00a70b11b6e85048a39a4a9e1ee545e73fa6cc5e97f74c1f93c4829810775a2f84cfb2ac09d1b42af3fa08a917e7f838f6d1af5413dcf548703709a694263e4e96f6f717ee722bd5e445508a1d57b416795390b21287ba329a7fe32e2d21f7e7bad7effec2589fd9c9a31d32b7ffc2b30faaf002a15367ace24c1e35fbd877e557e1c8222556c779eb7eb3e4f36364d9c79ef3d2efeeed50be3779fff2970a9edda05ae1e0e2056b273a3e1ad2b89ba112ebd3f9eb95ca4dd76b551cf123eed258200bb7b0d1353e8df3105de04ce2e07ba06806cf4aadf9cdfe68573351204559f6db563680f21329fe751db95af3b9ca810428ffe4624a5145a9ad696e595f0cd5f3e33be70ea5b63b301b2b0abee82a480405a377544b4f7adf345d254f7ff75e60da03e0c80dc7e3c17911e703fb045b7cdf9df8a500e13e78183752ffd07bf3dd3014cf7856b0000000049454e44ae426082</data> + </image> + <image name="image8"> + <data format="PNG" length="1930">89504e470d0a1a0a0000000d4948445200000020000000200806000000737a7af400000751494441545885ed97cb6f5c571dc73ff7de735f7367c6339ef1f89119c72676daa44968846d8ad23685b689aa54a5a8150b161562c1060976fd23905077112948b068412a52a520a82a1a48d32a84c4496abb715eb6f370ec89331edbf3beef7b59d8a91a0aa8158b2ee84f3afafd76dfcfef9cf3fb1e1d298e63becc90bf54f5af00be0200a44387be8761c8280ac8b284100a9224b1bcbc3ce638cece288a5ad96c36dde974fcc9c9c9e3beef3b85421f7bf68ce3fb0ea6691145219ee711c731898489effbd87687cb97a7300c8bb5b50adddd793a9d36ad56e301002149314120d16efb40802c07a8aac2b973e72e663299b54c26336e59d673100f46513407d2c5c1c11df8be4718860441401c8784615880783c0c838752c9d4ce6432a50f0e8e9c5c5ebefdc7300c6b6118f2ef465edc2f6459c27543c2d05654557e667c7cfc70abd5220c03efead52b27abd5b5dbaaaa059665f6767575f712c7bbb464e29154323d92cd768f66b2d9ed8944aa3bd5955772856dc4bec3da6af987f3f357e7afcf5dffc3952bd36fda7667f6334770f8f08b288ac0f37c3ccfc5f79bc3b6dd7af7e6cd9bbff2fdf8e3743a53b0ace48e627170b858dcde97ebce1773b99e914c26a359e90c092b454f5f09d54c220b0dd5b090559356a341abb646677d9976adc2fcc2f5cae9d3a77e3335f58fd79acddabd4f009e7df605398aa2ee282225497c4dd3d423baaefc58d312eba3a30feb85427f229bcd25852a48a5d3e40b0512a92e34dd42121ab22c1149822882308620003f80180842e8b41dead5325e6d09429b33674ecf1e3ffebb57efdc597807407ae9a5575e1f19197d72dbb662b1502858866e505debb0f3e11d944a7984aa2049328a6aa0ea06c8e0fb5b42e1660e2208c34fe5ad3a88b6ce5905bbd5c65b9b23a1444c7f3cdb3e7af4173fbd7e7dfab7ca91232f1d7bfef91787f2f95ecdb25208a11184e0d811b26cd053c891cd59e8ba2008c073210a37bb8da2ad154304208122405341d74252ba8da574f06b4b68e106aa12632513ecdbb75b53d5e413939367a685aaaa55cbd2fbdbed0eb6ede2fb01494bc5f71d6ecc5d657eee1a854281c1a13eb2f91c9a26705c200249065d014382288af19c1681d3c269b7a96dd469b542da6d9ba1c10ce9ae34ba91469220953279e69983dd478f669e15ba6e04fdfd796cdba1d9ece0ba1e9e17e0fb1e898481e7f9d437aaccd4d648982683c345fa06fa5064085c07dfe950af37585a2c23492084899ec82189010c33a42bd3a47f5b16a12868bac03074c250e2d4a9bffb8d464d124b4be50b535397f6efdebd9381813c9ee7d3e9d8388e8fe779f87e80e705b8ae4f1cc5dc5bbe4bad5a41d504712c21844015827c4f378aa2a0aa3a8a22a3281e862148a5fad1751d5555705d9f4b97e679ebadb7eb6fbcf1fadf1a8df5f7a54c265f320cf307070e3cfdf2534f7de7eb8f3ffe4db5541a4051241cc7c3733d1cc7c5717d3cdf278e24344dc53435645946964151141445a028208482a6090cc344d3141cc76765a5cae4e40c274efcb5f2de7b7f9a5e5c9c3b1345c149e0a2b4358e3a30649ae9c7f6ee1d7b6162e25b8f3e75f040a1d89f4ddeabaeb25eb789e388380c10429048a4d8b9738452a908c4c8b284aa0a5455100411cda6cdca4a85d9d9abeed9b3e7eb172e9c5b9e99393fdd68ac7e047c045c075681e83ec0fd508074c2d0f78d4d3cf9f3b143df9f283db29fd1ed3de4dc2a77cb15366a35eaf51a9224333c3cc4430f8da2693a95ca3a0b0b37fcd9d92b8dcb9767576767a717cbe5db573a9dfa156001b803dc059a6cdac483560c90cd66c33dbb46ea92d5f3a3ecd3afee4f3d760035255891219f4db23b61b1566b72676595e9a9f30441ccc27c99db8bcbce3b7ffefda9851bd7cec77150069680e52dc11ad0f9cc23701f2069590c0f6d47d3554a03fdd83e3f9be97de595a83544e5c232b9a44618c39b7ec0ae94cce1ed691e1e36c8583ad58d06b66de344b2d1373c56b875fbdadb41c065c007c2ff24fac0961f7cf2007dbd0592964514d80365f99137e6a509abdd6c72b7eeb2b86a73eb5e8bb9a52693b30dde9dd9e0e6721b5d68f4e7536493096461d29087fbb5a0ba512edffa00f03e8f388030cc047e1821211148facb379bc305bc75d015c2ba8a2d247415baa4886627a076d7e6f8548be3ae43be4730d8af73f0d13c479e28f2eb99c4185004e63e37806dbb9b551ca399a9b11e4ba25dad209b2687f7a9ec2d6964531a095d60873ad5864aa365e27a314208b6f5a5f8f6d8362e5d381b5ebc787a814f5db0cf053079fe02005114d1d5953eb66faff7d848a977b4d10a786ed773f416328471882a04aa263086363dc0347574432708e02f274ebabf3cf6da9966b37602287f11807f1d43745dfbc68ea1c19f148ba5ef8eee9ae89e187f8274ba6bd3f15481a2c80461406da3c1c28d1bde871f9cb8f1e187ef9eee749aef00ef03ebff13c0566475dd982814fa0ee572bdbb72b9de5c32994cc8b222bbaeebd7ebf576a5b2726f7171ee9aeb7666d834975b80f345c4ff1bc0fd480279200d9880cae6cbebb239db35363b76bfa8f027005ffd0dffef01fe09dcb64ffbb5629db40000000049454e44ae426082</data> + </image> + <image name="image9"> + <data format="PNG" length="914">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000035949444154388d25d3d96b1c7500c0f1ef6f76f6989d3d32e96eb63647a54de2d1568d91d29a10a9a1476ab15044d4fae69b4602fe0de2832f0ae2f522d5070b82078ae08b8514c516dbc4580335246912499a3db2c7eccccecef19bf1a1ffc0e7ed2338f6110084021c4f23264ee50ac6ecc0c1d249c3c8ea5246d46b96737f7de74e7bb7f23141f8b3506266d4f5400854008400d71fd28cdc07a7cf3f7d69fab951d2199db61de274c10f95f86ec59ef8ebd6eac49df99bbfdadbbbb320ee02c4289e07c71b2a0c96be7d7b6e66faa50bc3742c497973878174179c162b6b15841ae7a183fd64070e1fdadba9bed0aded5d2316abc430cea6b45ce6c3d9b9997353cf9458dbece0d4ca5c9e32e87a1e8f0f6a9c7824c9f58532d5ba4342d3481c1831f636d68f050df30705a11c3f75e6a9d79f1d2b516fc0f67d8bf1611d239fe0cb6b2ddeffbe417f29cbe5e97dd49a1dea950a8aaa501c9b9c448d5f529319fdcd23632344019876402299627eb9ce9f2b165a264fa5e9b1bc61333e9a474b54a9b67c7c5921512890347ade528bfdc5a9c5721657ba3c560c1142507674aadb2e0dcb47531c4606faa85b014d53e274555aed066836a942efa89acde9b97233e2b7db4d5e399160a857201024559f17c75566c60fb0bf37c91757b7283741060eb5469d749841d5d209359211aa22e93a1e5f5d77181b50e8d1e068bfe08d7345cc8ee4ddabfff1e98f7bb43b2eb66312065d906922096aa7d5b67291afa38484a1c7edd5003a1e85a9346d4732f9ce32ab9b36222e89a40ba18450a20841605a81d2d8aefca17a6df494023200558274f97bd3e6ca7c8bd52d1b623e51e8411842e023141012bc6a7555b1eae627e6c63afdc504f81e782ea821174f1a9c7d32cdcbd32570fc07b8f4207049ea5964cdc46f363e5322297fbf7763f1bb7c68d1d7a783e3128f42268e6678e2618de38fe6a0eb41e083ef12d7d224441ae7eebf0b84de3731b2a77ddfb46ed9e5da99c1e1c1622ca363b74c1656da2cddeb72e5a735ac4e1b252e48e50c92f13cdd85a59da0b6fb1aa86b3192cf434c69b875f317736be7505e4f8de6f6f7b2db8ab8f14f932012683d3d24e33a62af83b3b874d3af6dbf0aea220804c5f71e844421725c5d845c4c193d73c9e2be23424b272219e199b6ef556aebb259fb3c0ae5d710d5410114fe074bcca25a888f01450000000049454e44ae426082</data> + </image> + <image name="image10"> + <data format="PNG" length="864">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000032749444154388d5dcc4d6b5c550080e1f7dc7bee3de77ecc4c669a4e19930689f8dd141304454a77426becc65d312e1405c9de3fe1aa3b455da85b51b476a136e8a692d44e2425b655842a6992369926339399b9df738f0bc185cf0f78048b532013d07df00b459fb3746bef349dd9b34dbf551596109dc3ee607fbfbb56167c8cb05770ec18ed803188ff02d59b468fdf9f3bf9ccc5d75f7c93f373e768d55b0860afd761a57d8dcfbfbeccaf6b7f7e8574df2374ef521a60710a2e3466c445b9fada678b66f5e135139b91f9bfd48ccc7af7ba59bab46ce473a76f716afe311616b079bcaa21bef4c24b73afbcb5f8360d6792244b29cb1283212b33fa599f075187a88c997abac25eba7dfcef8d87b358f28ac47046d6e452ee65748607b8a5a6f00a0c86d17804405aa674932e7bf11ef7d343b2d61ece74f66abeef9f938e6dbd5b69b9dceedd617d771d3da529c725511ea16d8db0044991d04b7b74b32e1b0f6eb271b041e5a913443db92c83aa7d464e0b12997165f732a94838553fcda47b0c253500599171901f70abb7c9d59def190529de6c8c7f47cc4bab4635af25b88e4529537eeeadb055fcc1949ea1226b000c8b01bbe916f7865be47682aada64798a0c8d9242e748cf21b434755dc5570ea9d3675bdcc6410230b60a52a7a01af828e9d24b071869535a9690100febce84173b05a15654b447a015da5548dbfa3718972479c648a60c444c6625b8c904ddc8cae4a097acb58ed405f7d110df5684be4745297cad51d2010cd9784c944a2c21181b43a153ec7b4d76f68b4d2bebc98f8e6e4a1aaa8ef26c7c47117a1e35dfa711f834c2909ae7112a8de72a94b638e63618fee21325e98716b6f9e9fe8df4cb7cf504f56a88eb1bb494044a530b02ea4148a83db4ebe06a417dc287f64976daf18fc8f25b9b99665e1eb9edc34df972b3d23cde7ad6219c1004be4b35f0705d8b5c6418b740942e9dab35da9ff6ff1a8de32594bd6d537902a4d3cda3e4bbed763a1bdd0d9e0c558d7a23403a16e55890765d76aedbac7f9271e38b831f46e9e80d02fb778c40f0fc3c082006f2718011e7b5d6cb938f040b61c3d158101d16696777f85b1c251f60cc37287b80166004ff00e8a46ea7529ddee00000000049454e44ae426082</data> + </image> + <image name="image11"> + <data format="PNG" length="735">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000002a649444154388da5934b4894511886df73ce7f1b674647d11927bae0586913d8902032ba28c82e625018495450948b70d526db745db5285a1974012130484828b0722ac245372630d394d06abaa8cce4a5747266fef3ffe7b4984d05ddf0ddbfdfcbf77ecf47a494588888f3941fd206948c01953ba0a61d30890d534d03d484a57298ba094933202a87d03820cc551ebfeb0a541aa4ff15270170beafac745164574d75d8a3e68a7f1e20a52c121497375557b41fdbb27e71ffd084888d26f62b12b2444acc0388ffc60961892aa7d7d17e604330b8adbc1467eef5e17134768838e92da5a0d0fdcae4e2f5dc47ab4103c67ef20aa9a66dab79e9cafcb3471b2a1db53e0f5a7bfa10e98d9da0ba72094480e632e75cc3ba9290335fbbce2d5190ad1610b62cb70d5cdbb83ed0d6b673b323ecf3e3d4fd21441e4c9cd7a4721a347b3d3a3e9aba580c2f5ab6876b480eba8400b1b8a873fb9448736368c7c9ba4df0b95c38d7fb12b7efc43b75ce5af143734c0bf9c7a793fce0e12df58aee16cb9e0c7f680e04ddfb8f34850beb0395488b39b43f7b81ae1bf1bb30edbdd0ad94a598b0b50ca46e817942255fa6a6534b8a161b954da15a62f853b98d55156a30af14d3561c37070770b373b29fcc925daa4a2799ad40b53568dc012d9303e65913907652e5b36466f79a321f097997834986193b81876f86d0d5f13526a7c8564d2731d5d2a059068c8c0bc67c1e1c490f5841f96aa896f1313927c2792bbe055cba82599940f4d35b7477a426f998b28d1a7c5032915d9a48482221a980a402d4307538849621e3b9ddd1e80c26c828fa13efd0d36126cd919c3d8c21fa27c028b375305b8721f4ab9f9f3bdf3f1d99c0a34e66a6063c2d8ca1e76f84b2e2956b412503252445e70defe488ab3a3dec3e0e665d909a05c138a4c20126b280fc22b2d077fe0e39d9212d1cfbea170000000049454e44ae426082</data> + </image> + <image name="image12"> + <data format="PNG" length="957">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000038449444154388d2dd2dd6b5b6500c7f1dff33ce73c49ce49fa92646d5abac469b1d9c6e8eccada491d45dceccb10d918689913c482e4629d7ae15fb281e88560a98309b2ab8137c349d196685bd3d1c16293b6491793a63939364d933c2f5ed83fe073f5fd92af7a7a506fb562f1cecef9a0d66fa40e0f3fd54a3de04ac1d41a542910a520a50403a6e3dddd3f3494fa7b6b7373c647e9061bf5fb6351bf7ffec39191b18ba74ff3c3747a3aaf5496689d320010ada1b58656eada6030b8303d3bdb161b1c8c94d2e9d1aae32cb25ba74efd7c6b78f852686e0eb87913afe672a65a5b9bcc53ba498175a23520e5d4058f67e1ed999936f3ce1d780606100b047a2b85c2b811f27acf054321c0b601d7859148e0f2c1814f3e7cf8cd8a6d3721a57b4e880763376e043cb76f03fbfb8094f0c762087675bdce06b4ce341c67e2b55c8e9348042004c6d0107a5fbee4cdb5b5ebc166f383f1ab57ad4022014809380ef4f23292f3f38dbf9e3efd9c8d793ca96dd7cdd052692a5a2c9a341201a48471fe3c42f93cedebee363a12099063ac9249ac3e7a247e5f5cfc420b719f5df6fba15badf5dcd15156140a53d1dd5d8385c3205ac31b8fc31a1c04d51aba5c865c5a42f2f163b1bcba7a574979cf2004ec2ddb06010021528546e359a354bade532e331e0e83500a220474b58afad212fe78f244aea4d39f28a5be6500082130da6b3528a5a02885e6dc5196a5fe4d26715028804622000059ab01ae0b69188a000e07c001985a835d314d4821a0bdde6b174e9efcf1cd6ad5ae95cba8964a286732a8663268390e28e788f6f531a3b3f3fd52b198c5f127ec1dc6a0389f1a8dc717c6f6f7db8ef279340148001621f0710e6ddb603e1f0880682c669a274e4cfe93cf6f52add7d915db7e6fe8ecd985f14aa5ad99c9e0e8187b4d13bb1e8faa3226bb3d1eaa4d13847350a5d0d7df6f22189cd8dfd9c919f13367e6dfadd7038d172fd0044001f82d0b699fafb156af7fa65badaa21e5f7fd5eaf2d098100d0daddc5f0f0b0ad28fd9a366ab5ed03ce414d130480d5d181ad6050fc7978f8a554ea3b0dfcf4ac5299ddaed5ea3edb06d51a94731c359ba8572a0576d1757f29fafd23af7475f5061843aabd5d248bc5bb52887b8cb1ff134bb95e72ddac6959937dd1a8a9c361fcb6b8f83cb7b2f2119be4bce4ecedfd7ae0f35ddab3ac506a67674e08719f520a4208a035985280d629b752c90a4a27b6b3d9ecd6c6c6c78c90a5ff007be7b8a6a32414700000000049454e44ae426082</data> + </image> + <image name="image13"> + <data format="XPM.GZ" length="107915">789cedbd5b6f724d923578dfbfa2d4dc7d1af9e3e4934673818d31b631601b836134179b83c1c607c0806d46f3df2733624564e4063f6f55777fd323bdae14b0233362c58a1591db524955cffffc1fff78685effe37ffccf7ffb5826cba7c13f069364f18fff315cbdbe7eff9fffd7fff17fffdbbfef670fff91cb66ff51383cfe47fedfffb77ffbf7bdda3f06ffc864070707c743b2afc81eaa7d49f6e3c1d1f188ec0b6fe78a07fd244b7695ecc1613629927deeedfce1e161724c7685ec23b5cf601fc13ef576e1e0289b3c925d16bbcff827b073382f898df34f6f17f78f92fe01d9df6a1f92fd05bb0f7b4df681fa2fd5e6f30dec3ece576af3f987b7f70f8e8b7dd667ae36ebb380bd8ff399da7cfee6ed83fde3d180f57a557b9fec77d88f387f519bcfa7641f68fc93da7cfe0c5be2276af3f9b5b70fb3478563b6c7641793c3419fec47d847b047def6dd19b2de43b28ffac521e1df907e4783a3e1319ff7c91ef60f87acdf00f611ec84ecc7fef190f5cc78fb38ebec236f0f8bde1ee54679ce3fccab3d203b07bb80f382da7c9e253baff13db5f9fc01b6c477d4e6f3a6dad4bfe19ddad4bfe13dec22fc6fd566ff1bb5d9bf4b7641f3b5d5e6f886da1c5f579be35bb025df95daec7fa136fb57d5a6fb32bc84bd8ff373b5f99ceeffa8a87815b5d9bfa436fb9f88cdf330bc86bd8ff833b539fe536d8e5f8b8df8b9da39b2bf611fc07f2936fc3fd4667f7a5f8cf695dfa9d8f0ff822df95762e3fc4d6dc67b579bde8fc30d6ce1b3101bf153b5397ea236c73fa95d20fb15f621fcc76ab3ffa3daec4fef8fd181f27b862df9466a737ca236c7bfc0967c03b5d97f4f6df21fecab4df77b70a036bd2f06c7b08fe05f549bfd0fd526ff21bd0f4687ca67081bf907476a335e416dc6cba9cd7819d8923fab36fbb7d566be2db5e9fd33b8579bde3f8307d8c7f0bf539bfdf9fd71a4f5e7614bbeaeda7c7ea336c7dfaacdf93ab0255f436df6bf529bfd6b6ad3fb7170013bc1f9b5da7cceef8f63c5abaacdfe65b5d9ff4c6dfa7b3c68c24e107fa936c79faacdf11bb539fe5bed84ec12ec3ecebfd4e6737e1f25caa7a236fb9fc0967c6bb5f97ca536e32dd5a6f7ede013b6e49fa9cdfe2f6ab3ff9bdaf4be1dbcc21ee0fc5d6d3ee7f7415ff37fa8cdfe73d892ef496d3e1fabcd7853d8922f519bcffb6ad3fb7630803dc4f9506d3ee7f7d140f19f610bfea3da74de3f569be2fb076ad3fb7c30828d7cfd43b5d9bfa036f9f7736ad3fbb39f157b44efcffe3eec11fc7b6a93ff80df4f43ad37a336fb1fc196fc79b5f9bcab36e7bf171bf98bb0257f4b6df6af8b0dff1bb5e97ddabf85fd88f33bb5f99cdf2f23cddf111bfe6dd892af2136ceab6a33deb5daf4feec37614bfe0bb5d9bfac36fb9fab4defcf3edfffd16316e715b5f99cdf478f9abfa636fb5fc2967c25b5f9fc5b6dc6e3f7c5a3e6fb509bcf176ad3fbb5ff093b87f395da7c4eef07e72df9bed466ff53b635df526d3e7f579bf1a66ad3fbb9ffa236bd0ffb6bd8c2e74d6d8e9fa8cdf123b5397eac36bd4ffb8fb0f338a7f7d3634ef93cabcd78af6ab3ff1cb6e47f529bfd876ab3ff406dce9fc046fee4486d3a4ff6d5a6f76f720cbb80f343b5e9bc4ff7f331aff9fa6a73be3dd892afa836e3f5d4e67c59b5e9fd9d1cc096fc39b5d9ff4e6df66fa94defdfa403bb88f307b5f99cde178f05cd5f509bfdf3b025dfbdda7c7eab36e335d4a6f76dd2862df9eb6ab3ffb5daec4fef9bc7a2e235d5e6f31a6c89afaacde7a76ad3fb3aa9a84defcbe402f63efc4fd466ff6fb5d97fa336bd2f932fd807382fa9cde7f4fe78dc573ee76a33fe99da1c7f095bf894d566ff95daecbf509bf32d610b9fb9da7cfeae36bd6f13becf078af7a136fb7fc216bc99da7cfea236e34dc47ea4f771f2ac36bd1f9329ec43f88fc486ff506df67f847d049befffa1e61b8b8df827b5d9ff0db6e4eb8b0dff446df2cf1ca84defcbcca1daf4be4b06b08f383e73ac36c717d4e6f8a2da1ccff7ff48f3edabcdfe476ab37f06b6e0f7d466ffb6dae49fb9579bde87992cec63f8b7d466ffa6daec7fa736bd3f3337b0139cdfaacde7fcfe39563e5db519ff416d8ecfc3163e1db5d9bfa136fb5faacdf9aed4a6f767a6065bf855d466ff73b5d99fdf3789e29fa9cdfe176ab3ff356cc1afaacdfe25b5d97fa336bd9f33df6ad3fb327302bb0fff2fb5d97fa936fbf3fdef2bfe5a6df65fa9cdfea7b005ff536df69fabcdfe53b5e97d9c79539bdea79919ec01fc5fd566ff77b5d99fdf4703c57f569bfd5fd466ff0fd8823f569bfd876ab37f5f6d7a3f66f6d4a6f76366027b88f891da14bf77ac36fff77b476a733cbf3f869aff516dce9fa8cdf9336a73fc00b6e42baacdf9726a93ff5e4f6dfeef4b0f608fe09f579bfddb6ab37f576dfeef57f97d32d27c05b539fe416d8eefa8cdf187b0257f566d8eafabcdf10db539be09fb11e7376af339bf3f1e35bea5369fdfc196f87bb5e9fc66f9bb7ed7effa7b2d7a13647ed7effa5d7faf45373ff95dbfeb77fdbd16ddfcfe1fd740d79ffdfe99f55f83f2bf32ef7f0fbf7f8dd37f56c5ff7837fff549f88f4dcf205aff995aff63acff79d49f2bfdef9af57f72d1cd1ffeaedff5bbfe5e8b6efee877fdaedff5f75a74f31f758d753dfe17ac3f238da3f5d3fe4f083f9dfc29e7bf5ed9ee886d867fc5f69fcff5afd5fccf64fc6b45feaa92ff585dff7573f413cfff9c3effeb7afb57bee17c1bfbe76cff9119fbc32cd1cd9fe87a8ad664c7e29367b3a6b4c4daf6b53b2fb45e77ac175d6cbf614d53eb67ec3feffb65716c0593c8daae2ded9fe6f4f4c3da6615aa7ca7c535be1bcc9f5082321cbd5b9fa71fb96eabf2b455c77645c27d970a7f5abb6b8e3bfc936abbf2ec629766f47335c2697b367667fb09edcf37235d9f58f1bd8a7959ecbfeaca5314f9a7b57b3253d348377f8635dfb1663bd7e287157bfd09219d2dbdff8125c862fd334c17a958593fd7f5533ddb381f3b16e3fdc46857353fe7fab36696ef2ec4598ae56267664149d7b1882a0a2ce67fe49ec6dfd5df3f573bdfaa6d97775add7f9ed1aed9fce73a9fcefa577df9abf567dee9f9daadd52e1e3fa1fddcb919ddfce5de8ad67ac75a9af5d34ebc56ba767984b8cfd4fadafba6df3fb1f8098bd706ebcf552cb7fc378eebee381bfd9342ff9c2a3fc5fcd722fea4949cfdf3387fd22cf86c2bf25307fe956cff3aa3907337c236a7e50f68ff11dd62f4bf9a40ebf95751bbf2338accedbf3221928322e8e697b04ef64e7595dde2273e2bebb2d6a98b912551e52daced95ce2451a5d45e3965a74fe36599c46b179ee52e35eee26af9fda9a66da6273f285afe2153ac90d53dce10ef9f6cd5fde73ab675f8672ab29976f7f174ab8bbbb084bbc5f02b9eafb817e59d7171eda1937f5d93e409bdff695a772b169ec3cd89d77637c3eeaebb136bb03d05a5ad3d1bf1579c8541744e37ff0cabf2ffe93aff61fdc711cffe9b2af9ff9306ffabd75fa9fbffadfe67ffcd3ddf95fd9fe1f29fe1fd5f542fddfceaeffa5dbfebefb5e8e65ffcaedff5bbfe5e8b6efee5effa5dbfebefb5e8e65ffdaedff5bbfe5e8b6e7eed77fdaedff5f75abf37ff77fdaebfe3fabdf9bfeb77fd1dd7efcdff5dbfebefb87e6ffeeffa5d7fc74537fffa77fdaedff5f75afcfffdeb564357d35937b4d3a4dffade2deddfd04ec35975faf07e1d9f06eddcc10e887714e3116f70e67f9b6eff061e75ec7bb41676029b1b45f7999be0d7006a1dfb2dc2e5271bdb82470b35c87e834e1a8ae13d6fd4aa2b8ad4d142be96a9b80eb59a5ad78d6ae53def61b107f3bc8526b78a7dabb5dc2a9706f61ba88bb33675f756230343ab559330eeb5068eb67db8d54eb3cf3d3872bf9b747e031faea605d6e277432c6e525ab1d637aa650b3ba209571f73bf3113d4c2b95d4dc26bc29259e4aaee8999cc4f1d5e7555b5a50cb9ea1b9d6d615bd7a76674164f61dd4c77e0dd54f4263a5227fe759a37d15ba62320b6ccadb21dbc356c449716edb680d332182de46a804d9df468a0d32ddc8a5b5391cf70079dea7af365b523abbed749ed59cdfce701a7edd4b9e4aaef884d2f61f61045f0d343aa4b697e3fa18669da759ecef233d26e4f3b1f7fdeb376d7b0976a2cc376aa3a8bd4de52f35f5b0f5b5a3ca472f5f6acbab69f0f7bdbbd0cac76e70bd9fed4b73f2bbe1dd7f8617f57271aeaf5f043cccff1bc7a3ba7facf31f179f078d8e99fd62068f5a011dbcadb89fa33a3dd36cd19ffffffbb95d32a7dceacfbf4c0f781cefd53ce68e19f58d1bcfb2db8df2c61f630bf3d9cb6e9a44d191ef6a40b59ec17c8caa96f9650fc7e1b4f6dca90773b05eda0f7cf83451e4f7562d1a6375101b10f84f9405879fab69390a753f60d6f308913bf9e5b59f0f21e0517d7c3d30332d4e93c4f4a64119ba7cc59d4fc60b2b691ad07cc3679b5a15b5e117d861c2cd63a8bac92afaef97b944b301e08bb8d9ab3d032f4ab47b8c28b7b2d35f7947f21528abb90d59eb6b5d21cce7962b8a73dc21645db9821ee514115abc35f6a2ea8ee59542bcad4f5bde4f3f28ce53191321fc2a940da3c40dbd091acce715859ad3978b535531e5c0ad4ad3add911cd5192a7d401f83520f6a0b66db646b9b4fd6d41c264e2686d5ce63ae0bf49b27b5e59ee4a1651e954aa7b298b27a2aff03eae8999befe3728494a7387eced2770fd3eee7304b75f5903f47bc0b88cb692c9fe7e8b6670d22bf3dd84fee6916f192bd40f1dcd52ca204496e430f2ae4894b9ed01f8099a3f302b163b639522d4feae5a87b7964cdc3a340ddeb110ecf7101539507521b8af2791e372d4b73cc5ae4c123879bc5739327af1e7161df0752a3873e65a10f6b96434c1e4c395f01b7b7403c795fee618e66e401fb39d28a7fdb50aca095f20deb115e1bdfdca702a2e4ad9fc3ace5b4aa2cfc0a98ad9cee66119d475c417bdbc6ecf63047cc40deb5dcab82e26631af1c9fa79ef530950fc8f5001e0fdadf3c54ada3ca366e374f661e7796df82524d1b35e53145f2ceee818364916e4bae36e63a0b0d1f50739d76b8e7594c719e6647669cdf777c93e41667f11784672fb06f23abdc079ed802d4aaabdf03d5ccf79e673e0b566de89ac7ddc8eb1d948fe754e07fa3c8ad22108a9ad9af7d7cb83b45ec5a0f6b8947213acbed1d18ec03dd2d92ff3ef68bbaeb7d8a5485787bf64545dd379ee129afb90ae46df9154d4c714fde2381b57c17f602dfa2eef1bcefa734e2f37d5381e8c05d0aec3826ab3c0b40e7dd2226d867384446a9c7f338c09d09fc990d6b92a5a72262b2e41fab5304eba266974ae53d2537fc007a17c1ac6098095656df4b077a7fa447762a5895b80739c40a43e1c06f0c6116fa1d74cb91cefc746830439dfb91ee797d1215f6955d51b3493f4315fb5ab79c16749a18b7a87328ece56f5e5eb309c322721d107b99b503e4925a6d37f2ca47ee6e0ef9ac57d1689e558ca2e9698172dbeae233ffb4cfff5a99ea5404df23fa3d0ef39bd9538f5c26a3befe24892ad57dac63453dc2efb122dbdbce9fe01db2172943d8cf69069bf118b1c7b473e46bd03845763be211381d2bb3628468772cc780a8166532b84e218343598f4cc5c570426745731e670d3bc79136db7a6f73168d39ffb647e8746eabb6ed8e1ea5ec5d88a1abb1cab994774ebdb7f95895620ee9beefaea8b8b7adf35114ef94748a1ca363b18271d6e388d3d1964aa12f39e3bf5daf62d22d8a6fc90f35e85cb095514522d532fd1ff259b5769f14f9df45f4785e0d464256bf37c80c34cbd02b9619f953f7dba728b96dc764bb27773e1404ef45de03b7ef7739b60fbc11f9d3ecbb933e62060657e70937e4d8b3719c86de86bfcb9b7904ef7ee651a23917323ca2d745f754d45ac1cc57465c9871a2d51f037d603571b99c26ce9fe312ad75e876a5de4462c8d77f732ece31705e03664696f4f838a84d278f9152b62b89700e272ef69174d62caa669850e22cb9b8bfbc8f376251f63c9a4e8576c528aa7dc4c9083d8bb201d5cd86f4076c795a8e0d4a22e8ac3865384657a80fe02bca0e753fc174c804f21c90c2d069a07a1cf334f828526fc8ea0a2acf3f7a96585e51ff86f82b820e50fc50d54b64c678e6c33e723d621ab45a5b096bc96ad2041f878e323fe987d6ede7c44c106a4894759872680844fe174efdd43c9256235f8ff319d21d1f928643e2eb7ffbdc297a1ed2f950ef4e4213fe8893113d31023f718e3ead47ae8fbb4295522dea3da0ec8c95208f7fef0c75b74f4f23dcfb11553cd20c1ca10cf84ee90efbd02d636f3a1f12ce503560ce09e7265eca847a7e8c9d3edde404f50c490b8e077f79b7d019dd4f8a660fba139439a11a1e29d790bd685fbe13e031179d37f4ab4fb58b0203a00fa8764450952362dd278d99ed00fb43ad6e4413364227fa7afe088dfa38e52919904e5cd100b781df8e8fc20a539320ff23711ad2543f52ae21f971b7fba8004ae27c048d86fcde049311bfd3d1639e8a01defb8f98b911610c50d380b9c34ae035c2cc8e9077844e244691014f844e21f75eba38e24ef3bb0c7339526654212247e8e140fe46722ca3222fbf1fe42e0df19771a4f336824ae822a66100bfa1b903324b7d28370a9af2bfb5ecec7166e23e639d58fe1e9beff4923339f5f9c7e64c9ee5068e698d22bc80ff681046a94cb12d2cc7a968cb45ac518affd8e0f1f324e21d323ea6d046a96f5bf74fda3ca233c31d19ecfb61824fe0647dc65bb83f650cca705d7236316fa2c07c12e1c435d9cea49f0206cf8ce53ed1aa046b60d0d3d813b31beb13dedd96717a1a77331ba80ad2adf14ef411794ca293c0353d73bb27634435871a46468f987b3ca7123d32358cb672f9e72720c69db7da8ea3fca2db583fe36876159fff55f6cc54bdc69917fa7ecdbc45dcfde7d59d4d711eeefd947e9fe9fbddf9a43124feddc43cbbf54e59fdb3f71c2aaab7a6cafb159f29edbe128eb0f708efeaf54248e9f56af0de75f7d99cf30ad9a77a324425cf8819126b56e20d9c0256506b8c5ccf5a9de833444651614c8abe2a8f67ad776c7ee5e9d9307c25c457656dab7d36d654eb1b4223890ae86357cd33e25ea26eb0aea137af50412c8b25bd7f078757d43f357d0fea0e11c355f9588e93e91a6bcfdee1ff065ea285cc13337ad62ebe6b67c6d0d34e16630685fc6cbc51fe69264cdb2b6a7b012ff17f365adb197b439fc344bc424b7b2bec7ad77bc3b761ac9d79a6d97a465786999fa641faf18ca867c3526a1b537576d6653e5ee9e6cfdc9a3b7be6fce66ef1accc9d3d862253f258b85f99248fb170bbcf506c8e7c73429e92f79ca2f9dba37f008b6ff18c9e9fe9e9c3fd72c4339dcf312173ca32a54c0be49fd2d9cc617c007b012db88639983f0367865ae7c4d27f2fc0f8832a7ea5980f8a9a93160b5437a6fa6684e1773f88c72b183ca32ae9b6af6141195f51cf9c3c3f28e33359cf644d31a77cbec093a8f44cf1afc44beafda0bd2975d7e7fe203653aaf8155a7ca043ec299d9c529533301f63ef15ec3ec0fb199c67a86c4cb52c0891d55ba04b635285bb38c3bcbd424dd6650e359f2996fdb8e239a661066e1f8435c33cc9d9986ae1f97b8612539dda293cb9afa2d02b2922fd7dc6cccfa1fb0cdd601ed2239ed357d43e077b99fd29de3e5378cbacceb527acca5cdf1facfe07e14da1375b0be0f0ad9c4333e9b9cc81d439d3d99f83eb981495dbb6c0dde1099de2e6cc34f6037d7945f7a7342baf988b19f9387fbaf90bca12afa9b90dc221edf1013de7503c3c5b94101b4e67fa9699e1341d193c769dc92d0eeb036fa734467a2fb09ae9fb2c8d9d7e5ea4f65ea3ddc5ce1c21cfae0ae4f4a7c8dd7cb6776726c75fa3c4d5fe39f22355f9ae19f959619b7316ed2cfe881747ee9a9bbf8e4e6765ff57ba1169f5b6d1e48d2dd9a786c9620b7996d9eed02263f59ee13b74fba7795b4451bb7a97ceb5bd97e6f29ad99e5efcd2cd5f66569975e6d3ada5db5dbadf397d56eefb8bf6e5f70b676bfc7e66beb1ffe5ec8dfb883f4733e6177ce77af605064b44733e1f23f1de5ec3973dbef0ed112da6f763df95ee08cf90698e4c4b53953ffb262ca96c497e4bf00e1852ef5251840bef7d21ef275458d2e92662f24d9925db8a540c3a7af69c897508bbc28e3f6b87ba42ad5fa444d07919f58a6397c4650d066b45fa54df503d7fbed099b9ee2db53af617f596aad9064a7f81af3fd950154bf464a32c3f11b52445e6e0345755e646e1c05266ea9b7637d069ad13f149384b62b704e6caccc727ed4a352b557ead3b32572bea8bd43b474699c998539800cfe91bf5cb6cc844f05ccfb5d62f9d83a5a2cfd1af2f543f47fd32bfd2b365e63363bb1718ad917d8ebae3e994bbfa0d1dbee8e67bd65ff42dab44df6bfafea2aead3327eee9147b6bedff094de397fbfda428bf57c6de27d9deb30466273a398cfb05ef2fc2f7d865e43d71315fc874aa19fd0e73e05a7d147394bd138add50d427ed9680ffa5b56ca8f635f036382dc3a3847a375493d5664df865addbb33da10a4f50e71a0c644fb27af43574e133e65e52b6ac6b99940a4a32b3c0e5c468778a5abee0f1a57a6d54fd0d943885c2d2178fc63aae81b2a1cab81f65ed2e33b34af93a4ae85a099a948929f7b804dea714c74a6c54858dbe35bed0d92fb03cc5df1e99fd2f9a844f74aba4159e64e4fdb751ff0d70d78a1b3abed655321cc483e72d542b1362f99eaab21ba828dd161e927da3d5f8fe9eeab47fe96d5a43158f5a36757ca1c24f749f95fcd259950e497f3f311765739f6482c2ddd8680ff8369d9ac95ad3cd2fd1fdf0a76189f5857e9776ac32c54934dfb1122682314ef53d52c2db24ceb349fd9ea8259faf142f595f118a8d28516f369187a06f523ba7a98c71ae8de2c5319b1f3895305d719e90215dc146753d31959eec54e844abde18e432f109b56d52dc3629c413b37f82cf065c4e4cc5e99a4e32a5544d1bd5b86c94ded5e15d3d4ecfc4aeac6905acbd01ab6da537c428ddb3a0b978a62b8af5294513bfab1f6bbc2b25eb179e4e7fac666d1449f723f4e42413f76bb3e529dd90ea4f54915d132fd5869c1b9e18dcfc33f7a964ce3355f7cdd60559e76e95dca792b9a4a82b7756a5a70a3e259cfbef0b8af33b555a25fd9410c3288c71e97cc3f925e5f33e21b2429ccedc99df3b233e55625482f739c5091f39b3ab0abf0b177f6e70a536bfe39948ddc2b98a5acf805e852a55cde363ce70c65815285182cf393257a06d09d59f9392a25c155a57a2ec55d5f71c76d5e056e07f4e3c4bc008ba5c91c715ed4b5d8c7b0925fd2e6b7d015d585ba9e682b0ce54d17374e98a343827e51991f95534a60af49261cd1a9e113e673b836225f427ee1957706532fb689e8033ea0cd779016fe94bc54c54c03d874ee754eb39218bce96a9b03da369a9680faea0f6854e61c9f4ab6222cf912b28281d3d23a52f3087e25dd5885226dcc02aeaba3053234af10d126ce9859c9654df73621d6e91d47781ccf4ffb74fbcfcfdf2535173df15fa54e8f792a6859ffc3ad3e7705e83f7193c05ed92eab854c433fa54cdaeaff2da7deab0ce101d729c69deba660cab8af38a7a56c080795fea6f457be4cf1ac48359d7c80a55330379df48e41958f0fc057d1a406fa03ad1eb0c98b67ebfeaa8e34cfdae81c17e356757e05351b49ae17b86fdbae949151c2a2efa1255f9931ace2f33b6a35265d0aaa13e9798868a5a1ea5aafc2ea14b45330bd6a5ee558cb7af2730adab12acce75d4d58a56d850bb0a945085f4bc0aacaa4e1cb3a901fbcc54ecd73554f7110ddc6c3b4b4101cf532abb263655adac9a09532d4a5432a15b32e18275a66a5635f61ab35243e758e586e159258e1528106ea1e439334a9ca1d3a246ac66d5f42b4cb8fbd0cd6fd0bac4af5f4dd84db397f6f1cf357aba51bbe9d66584223e125333e7b508bbb6c3bb6190634fc1b93451fc5c416e3bfbf6a9a9be5c818fbda538c9d78cb237a3dfbb48851bf44b7ce484bd2a5b9588aec29d59d5a2f33bc45d1a2db635bba31c8d48ef74a76aa99834cb4be35703b74b605e02b9a6d19528532daae44ef79beafd27760d3db51cd29d0f0acabdd8a5865837a9e866c43ac66fecc04b6b9cde6da46a61d681595aed509730b889d02f23cd6d3f82a2973bd937b7bc2b99f0d7433c2cb74b4cd31df66b993bdcfc56e69ebefdf291ed4c87befdfe837bf2dfcd4cd7d96db2bc6f9332b4dc6ec379dfbb0faf7b3a6bd16fc3c5755ccc3d797728ceff3eb8a82eb2dd1382cf708fdcfefdd106a270e19886fb3409b54116b3ed9247037b1eab4d671df06be2b90bc62d426b6a641755f85c0f94ababc80d54e3e3f9d30106b3ed40693e6941038ffe40fa49ed2d307c009a447adf1621b4359a916d441395fb754fc84df32e6cc2af43312d54f080aa5a8ad632b84d65df24460fd891d3a67269935f13f82dda7b40e69656d10023ae2c7876c0fa01b5ca730353d385d6cc422a966e7681d981e21dcdd82086a1f626f5a98938998ffb48812666b2a133de22951ea8b6063289322de40e73223c9ba409df83a62ad254d5d893e75bf8c984310273eb40c15051433370ae07d4ced53dd06a635a44a72edd30b93da26c03f7b041332839ee71e6a2e9e6f384f6e85b96672afb1c9975ab0d1ffeee19bf9ec6f37707cab6ddb93ff35e39b25bf49dcde469af47de5d9cf0691718fe370fff8e627729a64b7b5983d8d69856c6f2cce28dd6054697d4960c1cdd03729b6af44fa1d65805a9ad85f785a0788facaad2513e1d65687fdb065d765b51445bb158b756c6aa2b8af422948ea2496f428de295a56e04d61d7dee45e85df42dabb9bb8ad5d5faa45b5d9321f00979bb9ad5ef6529a20b5499a50eb27691d1f2696d3d7753fb5e25e96e2fe290273b1be9948576b61759a37ccf700abd4c67ec65c24c878a790ebaaa7bc7ccae306fab87adab6b32c984053bee631b6fc37077c21db675b53261cabb9930452dbaf93d5a05b7da99223df9df7decb7cd694fd73e597eafa03e7e49fcbe89ec9955207bdf20fbbd7ddaf12707f86d9b08c1b528ed08b9a07a484401dc622c5b917d9638615fd88ab1fe8177c8153c8ae6a417b14ae72d2063402c1a8dd239d2f9d8e730f214950e22eddaa9a730d93fade017773074c1ee1529e220aaa4a077e327ed459922b0a4576ddde961ba0ae6d9afa3287f50ad88deed2be2ae7edba98c55b0bacb5c1f914f8c746432c65a48645c75213ad9a54a5a9918edcf9ea1b3c5ad683bdf055389b3e9e61f3bad8efd5eb297ecb9a7e324c3df6e25a4a35f077ed77924dec7edbb9dccbe7ba65ff7717bfe8cff87ae646764cf21278497b8ac07149ff148ceda775edc5def7f00bc03e2435e9982872006c4c845249e0b3d1ff87ccef7809831d2b1cfe7f7886b0676cf3df560717d05f2a7acbe46aabc4719a91a60641889e7c257e02ba1e73dc248a0592f68e41952ad05ce08fd18edc0c7a8a63e07b1a70e407742eb711efa0e08c7a44e81fc0fb83a64396035098332507505a84915c08bb91e50867da993ef2df5a480fe79df03e2bb27b9b90fa462067d2f806301fac2220de959f54aa40ed19d541546c750be8799c9a8d6a405cf1cb1dba3a949b86f3a1bfc57832ae148b02e682505f4f100ba17683e6822393f7bd01c71c603ee0f4f344d6286f9619ef7a0d03e66f498a795627cf67dce20f782f4e1ceef23baa01d3d90a9245e19cab4cf5c710fa9465240e61fb388fb784cb7f10033780c1d915927f18038b8ecfee6737ff43f7dfded637f80efb0d30fde6ea7aff1432860fee3ac2147109b01cefb9c41ed14aa79668c600f022baed83d8fb6bce2d87e1cab9ea156f842b3c1560d965dc86b551891cf10958d34eb20542ffd50cdfa168d4fd5c33cc5fc3883d635348af5a94b494a87bed5788b7b92ca398835f9c37fd86324553253e665e6443a6d2a864a9a7d6bfefa293fafa7f01bc1cff014fe51959a41764de58314c6d67f02a3e86968a67da0991265398867d04c7ae0151007e6e451fdecaee97ca465f8cf60e7240f4d27fb9607a6c63dd3cd1f614e473ab1fc3bd6799ad0ce04677d8a18abdf133d8f345ed0266e7f0ccf91411d69c6b1ee8f813f4aad902b3c8f9447c8ca7986b026d81f9b2c137d9e444c278683f83fe9139f30ee732a67e0cbbf13608cd46b647826d8191b5c411847deb18e63f21a47fb23ad2964e3fa26b02c57c93656267dd43da6ef27cd6f7d47aa9aaf7f6272b3d744959c28e6489143cda11fb6a789d624bac9197788f712d427fd9d184b72f5a93b23a36950646854ec9b8c122b733289663b74d8fe4ad5415799b050471f8813746662b2d9e9b77314f40a5dee1b3e13d526541f2628f00f332ef3c22c0439eec4846efed4ad17b7e73ffe99bf5fb11bbe196bea505e9df5420853faf5fb6ff87e412d6f1437225ceff942e73e6e4c677e05ec173078410ede7d251e8cf0a2cc989b578063a694ed155c38eb0b7979bcb7a89e29b24d95e10bd61b22469a599e18f39514651623f0f0561f9af9baa6e4fdaa358d0885bd5ea80f2f84c83c5fc0704a2a4df1cb19d8770a45df10e1398fc1678a49633faef24d9f5ee81de4338cc1fa4debef13de5433bf6072a41b320f6f14395295443bf61a11e2146acb444947a6c828679ca58f99e9636a5ed095d0fb3ef49a6a6e399fa85ee1764da1e804bd61a5273a932fe81c7731707c83ef44bbf04abb63451785c379a87da2733205bf91f2e24c53ccd30be66e627047143dd1de4b77a53b13559fa7f24dab7cd13e06d51949e6630a266fd0608a6e48cf642e9d3fddfcf764469fb9db9bb9cf3b9e66c836a7e7b9d97927ff1763b3d73b7c6c249ff247d0d967ae9e8c3d23af99e666cf399d4b8e77e3f3a22be4955c2f407957cfc0f99d90e76a4946eb2f7a84e899d6632bb67cc3e9dc9cce14cf22bd242fd14ee0fca26abf44cc6cbd73ad27e8f702be015b540eac6c0f8597d412f2cf69891d4ed3dd0d95895a73535d60faa2dd7e57fddfa33ad36a8bc2328bb29f56626efafb025c899b699679a4ccbbd62593f5a2f33e8f66f05db3be9b4ca2daccdc8af4acbc2bce3ba2652242b4bd7161e6c20cc6dd0c7943df03cba0ca3c49775eeab50aba5fbaf9f364017d16b466f8fea01ddeffd0a739edcfe869499ef36485f80f83b4a4df15e668010cc19c218bf7e3a715f9ce92b562adf47ca5d93e0dcf4f8afc20ac0f54f1a1f33d23bc0f42f6184bb73e803427cf35b80596bcff41b16bf29f037f81b7d007b499139f257e3f347a06bf05f6d614bf806e1faae3a76af9413967d86765979186d213cff353397ce0575497c5f5ce9165a6dfb2b7a0cf0a1c787f81ca67d4c985ee78fc353ca5e6b562f1d34acf18f743a7487643cfd7d03a4c95f808b335f5c8c77e5207669177e03f575567e8c78aea5e614666d0cc4eb19d599eab0f9c2eb4aaa5f2e6a95a20efa72abd300ace75c6967a33c20d61b4b546088395b9016b626d6f85656b6fe0d24cd8422780d164aaa51e89e553b93f2bd216d9e9e6afcc5a907a4bfa5ee19b7fbf703b636f39fd56df10b5307be225ddf922cdf8fc4bcf97c8fc1d65e1ccdf3b5859bf6fb236ea51329eab8889e45a69a685328b71bfa9862f9323ccd72ee425782c227f5bcf57c2f732ad64ac91c42c34e65bf79749507c9eaa2b465aa5f4e277c2d796bebc4a3b716cd6efa8725b439a8570e74ac344c51314a21651a6a5a270d6c58f55eeea2b6bb5c4edde565a3afed36cc4eb4b35fc36d1cb1d31cb14d2229a029beddbe860f50dbe82bf30df5fc9ae8cc22c9eddf41d92e745f0a49b7fe2d6299d9f2465f7744abf2bdaf75e65fa3d75bf67f4fc4d9edf745e76ab825d8e3821cf13a09d24e714f50d9c7377faad78a7b453a62c3ee2d4598c7d4ec82bcac93865f2f7df7c7642a7a7f865e667847ee6189d20caaf0aa2f959329c226a451c38e3b93b977a997f85b887da24d33745ac340b73fad6d313c782a34e0951e2cfb522ee87a8b8427572c3cfc08a9994717246bc451df639271fe1eaf355a89213ea24479f1b9598cb8a7699afcf784e9fb2e9ea09692b159d20cbb9ce44a8e28c7cbf35ae4c58a7383d51f6acd49966e149fa26bb0cc52ac8794e555490b102e40ad43941cc37ed9d1266199530df1545afb402af285bd2e16faabfac137e4ef629e6e0441593df53c49735fb2934921bc1ef9c539d75afcc397c796e4f758258b1b2eac33905fbc44cdb8afa58564ce9fb29c5acf43eb14aa7f028a3d35c5d192ccbb8c58e07ddfcd3a4ead629eefc897bbec0dc5cd00e9f5669ff94ce64e782bcaaea7982b82a3e2706f934f265d52e802bd8deff047b27faf17e9cf55431abc8554546c95e45962af83372f80ed8cce5d2a9578d185f18fb5cf1ab1a2d9c4e52159e10cb2b5475011d859b209c28b6ffbe3215541593953d873a9ecf25615f189e552879a2a821fa14f75eac2a6a3a058ab00fda593d436faa86dd09f40b3a068cc0f9426b3d4d4257c3a49c46887c7ea53ba143278a1d985793d05b3e918a84fb291439a7be9e982899991017f4907a39d785e6085181d1a9d6280a9c442c6c37a5bea08cbd4b171a1d9887bb50d5a8aad6193a13185f82e709a6f544ef0967bca25908f74118b93700ddfc6a524bae69d593069dd693a6fbbe76fb37eef99af66aee895935e9a9860ffb094603ded7585542adea2ec75c63b70a8f6bca57a3b30665ba06625551ae91a98e678e6d9a7c353c0ba76b42ab827d40a99355432d55ad506a689a2aabb0af0929d4d4a40aae9350bf9c84aa6acab4aa4c6ad8ad457caf530c6ae802fb3790a9a97586987a6471bcf06ea8ce35ed564d39dad8c0562a6c829d9f8026a95e832ed7c428d45bc7be9cd4b5e74d6250333da942ed9ab20ffa54d533fcd6956f4d636e8cda52d9b5e97f0dbb35831ce6e33aa946558749ab9bfe55a3a7b0eae6ec3af2f23a85b9afe9a99ddd5bed4d63abf756fb6057cd539acff60d0bb9c27913d5d614172ad1cdf72addbae8bafbbea5a79ad9bbc1ee0dceea91679dbe6f8c25cffca9e15756cd58f528eb0de1f08da8c3ae1bcf5ba04926ced324b6e2c1bbb22315d493c0fbc620d6125b4f9df2fa779f30bbc1d38da9b94676d0ab9edc46cf7520a7abbcddf20d1e214f88b1fa85dd1b549556d99e875c37a93ca1eeba5996b765184f44da3370b0c8ac957ca7eb0ffdbf31fb37742744dbf47cc9ce4dd4b99b8899ed922896aec72a736370c5bb16d5261c6ef4b416296b6bb2bafcd4019bd14e828d8a273dc6bd4902df1b5abc77a37adfa6f0c3ac4b253132dffc3bb25bc93dad3bfc7abb4dbf77b4774b676dfcdeab778bac7614edf1ee22b47becb4b0cbab93f20899ef1dbf70728f1de1f880ace9b85bb3179eef348b646f51cd777ad28637f3bed51aefc0d5478a1eb75a017f73c43d7dd751653baaeb1ea7b12579ac5256fb96b20df5b4a1d9bdd1f2d6edb6a87fe27997dc9bc8e0db363cea913ab7e6d76a2aaadda11fb73a1182f0a0116d6812e2efcc7350b4ad8ab569a7a359db1a5dc7b9d8ad244c9a68766b72dc9a4eddaa42f104b20a8cd951ac164e1e12999f96a9d9f6f04ed508787553752b0953d7d2a736ea6cab6271b577c81ae6a36378da5b261c6e711632b49370e35a894c17abd8823a2d20ebfcd3cdefbad523d46c92a3df9c7b122d73b4f2eea9475ef9a440df39f5c8d327ef62b2ce234f287eddbb4fc1ede4c8d77ff7e829eff2dde95e8eacacfbbe27940265cfe1dd90039b1e38e62867161ef7847947dc725859b7ebf70acafb2ef2cc13424eebbda75ac2ea117a97aaec81ad7064465df72428f754a1c7cfd26e1e2cef347396587491d19f1748c91efcef09b740bb796894c7d33d9d8b46a2254f5d8fbcba149dd3bef5a045161a171051a0a83c61f7e0770f3b4ff879d42b3dbf87f25df48395e595c777974eb2e0d043f7f3668a244756e7823b1d4fdb9d2a9c857d8fba65ba8499e8cab859e8952396f7c89fc5c4e4d03399a18272b1739e8546dc1199912e6683b52a98fb90558d0af4e1ef700b44ff3bcd2f79bd5717a739a8ce3e3d93e71e1dba235bfa93a30e8a4679bd3d05a87c87881e66be0094bc6ac02ceea94a377374f37b4911b398a3a77db78aee7340cf459c1fbacf11fcd8f70027fb6417e9bca85e1e25a7b1394415dd3a705688e193233df73b47d8f5be0738171e825854aba8b139e0c88ee030d3637a3e842d798f4cbce4f059f7a98643ece5a25c5cc391565244a51c5bc4d33eb81f20b3e875443a0bb31c29c5f9d853d4612c513b28663d64662c5e8fba17ce03679b3f70ce19df7db0679c2383c1daee63460495591f225f1a5174284275dba922d9cc44e6a648cc03f76d86457d3ad2392b9a390afa1c180cfe14d1f79c4139c48c84def7f4fc08d37f84de313eef1ec1af88390975edabfa45ed87ad27a8123a93530d0e1537a8cf37ed000c65060f12ab899d50f6e73bb79fc8df44997d5ef4efea71d6fe1e7ae0563fc3bf6e37e9f7e5597b44bffd813f759f013d1f21964efc3f17e77efbee69089c818f7276dfc700e788721e197c1fbb478894d5651f482c7e8f024bb733747899909b22899343c93012ef507ca2b18a40e716b7e819127341669f3dc3f308a8475087f31a0f5f1772f7354738ed2b6a9f741a68f5096be298ef4904237846b00750ff48aa420eb3cb95a23b45557e60eae963776850435f12c5e12e6438d6781d41adc4b2327c0792033ea2c7c0ad640b43e7cad4d517c692c32c9d1a8fa7f368ce35067983bea97e1495e791d16f8fe66790048e7dcd26333ee0eec558e676d8ece134d24a227053ccbde019b433e359e2162598366655b49d2366d213e84a77a80f948130f637dfdd1fbf12fc0e3d0bfd4de87784d347f1a579788cbc2cc2d04f94da09f389ce13c5123b31cf31421c29fc62b4ddb13eb3d882939867f61fa590e0c71f41886a1c2bafc09071bd520373225c44d33179a73c82c5bc95e120e21363d25b0efd1196e23130cf8f5a8d9c0cb426d94b349fa8ab3300df413f704df5d2747a6b0a8c6e4960bbb5921d71e9ac723e8a548f7de2be8a2a8f6646439c301a609a773149a2ccb14792421b2acea03f4cc519f448adc4b2d77e266606e4dc566dee611f3305efa1d6c43e767ec7c6724f74f327b446eef3e4d633fd4e281bef3cd1e9d0fd0e71ea9fa7f4f442e723b79e1065ad5184fd0ae4898b7d02ce9030269a6182c880f64a2713e07136e1c54ff23d8cf6197fe4720dc1ca7f5ee033429667f21c8297ec86ba9f94d70438e23f34b5c9d913b49920bf283931a713d267a81a053c6118f831ef67d5f249bb3201fb9051547fc2ef33ed4c905f149e2883093c9e0c0f8e7d41b6213a2639fcc9ab7b9a6afe89cec98baa6f6b7e46ad5cf7b3fe4af408dc86988f116683715e227d26ca7384bbf06a384c0c5250fe096b0a9c89cee1449989ce43c567158666a2d87f0ab58606f9d9cc6b9819be2761269ea0a74cebb3ceecb399d66765c438cfa87ba8f33f3433243c03c309784bc6513ff443e68bfd5efa23baf96f6e4ddd67420a4dc9e6ee3cc3d79fbfbb25fbefb4ff4efecf389bd0ef1b3d4fe9f70d79a614cfcf33f292fd19f57986d82922bcf754a39fdcc99c32f3fe3b7ce4fc0de8c2e09d22a4cfefc8c49eef843035086fe4f3a60c9fc1dfc64fa10f473c1bc409f8d8738e084cc59ebb3a85c14431dea09ff07b53c653457b333113ecc7aa4bc4bbf20827dc87399e44993764976aa788902e06edded19f093a3e45d43b183c5367de954d6031851d2628ad9ca070a5cf988fa09a7c4f8138c3ef3bcdc45c2737d46b35098c58f727bcb3644e67846267614e3ecc69a68ab1de6fca63de97bf5e53d4f88cdbe1672f709aa2be99998bf76856a6469127e49b459d7f56ed6646d177f46e82daa798f967edd1d470978ebce389f4a79bbfe87fb89d85fb7cf4976e7d4041ffccbf2b3a7da3ef253e52abb716b4fcf35aad374558c073494f0b202ce989a316c4614d9997e0f30ebc77581fd8f71cdf10e32dd913a40fe5f2ee78bf23f61d4c028305a29674be32552df45b7684f9223a5fa08a50df8766584455d8b55096ef46eb77c330e0f90a5629af77305eead3c2e8293d5ac053eee487a949aa162e71d51fd14e50ee1d13205a7f9abe7f68b50bed6ae8824c8af46ba5331338844a1674fea1b8efd167d90f2a2ce0bb548474a7c259ba7716496a589ac80ffd95e9147d97c6fe3077e443397da82e415f9eee301b2ba3eac27464dd979b27d31eeb291d5c4619c2bdb47b72cf020f334774f3bfdcce17f5e49bbefd2f3f2df55df0a527fe7b434f4bf2fba6a78f7e091e4b8d0e7861ef4477fdde9766e15dc1fa884ed8fe865760c20cc4fb2b755e02e6d2b12d69d62f207dbbdd6f9337b00a39d36796b5b0153d965024c406fc6f9c0abadf2991bd3139bf5359bf916da9793f52eb5b3b94e61333095cacc2db781faacdb7627f69d4b739b3f361f7be4c9e0f93d19e7e9b5d619adefb408778624e228e4ba75d988153e775929a8a2fc5da68bdcb889b9d9d6f339dbcff65d45b2ac350d197b17de74f09fb1b56c0fa3048b6c253330d61daa5cfe2eff74adaddb4b2a162cb4dce4ad169f82de9ee07ddfc52bfec5689d677ff0cbfbce7ad0d7d78c79f6fe0b1a1c852142fab4c7936c422e095710bd9df2394a3983210cb1ae3e32b38df2066038e257a2e6b7409cc4afd73ca52a27c65f5fe066609d9cbe6ac64500467837afd6e85bebf716b37847c1ec56db04ac81d34e475a635063e1b655dd6cc1bf23d57c625d590d97d507d65b03843bd15f7f9d6da03a7b22284aec51c4bcad1636ca0d099764b9490e990de059dce232f990a617da65936ba6b399e61bfac11e746af9251f0dbec6ff4bb8c3e59a536fd9266e37e7f98d92a53159ce9c33d9f990a39437a326306dfa91e9754d30d32c984dbde96f17b6e7af14dec3f8c7adf51bf99cd4697d410304a98c812eeb544f3a494f5597ecb124b37bfea9eab6eefc2fd5ef42fddc773bc24cf0bb7aee8acdcafd1a95470a14bac4b7c2ec8ff92f0ae81774588358aafd24ed5ed95e8d946781ed7b4e3cf02e2858b9548c62d13da15f1138c9a9e5709ebc2f95515dfb3a8125bc6b9a44cec5f2234ce2f1c6b94e70a5ea28b6724f5968c3a418b2bd5f38a90ca88ab1a9f126aab9a5839b5bdb8a40a2ec1ed1ab94af0b834fe01c9a356a1db25ad323ac758c14be6b10a85abf454d2fc171a7ba5fb973a1d554c87e42e13a32af1b9523e9ccd77fb12955f6bb72fc9afaad62558941155c26c5d6aadd79abf0a4d2e754aca607f41aa5dd353a8ae4476d5e15f118ee85ba58e5d688fafc15266f1125594758e641eafcc73197e722f2ea1ca1522cb98c44b422ce12e55c9ff1a3d0cb7ef1addf513cd9e35aa88ab112dcab47ba97732dc2d61c035d4a04b49ab74de74f32f48fdbafb6db8d574bf37e887b7ab6ec77fdfbadf2aad1bf856e953a5df0bfc86b81bf7b9335ebc5785c785c3a8baf32a65bca1a7baa209ca2d656f6a7c53311ae4cfec2ee84932ddd2b3afa1494fb774de344cef885b953c424c9d7c9b1475a795492da2ce2d55da0497aa2e41f2fb77a8bea1199b841f349293bac6dde05d55053aef35f02c9db80323ae3df4cbf26900c957728bee4b36e9e62dc55e506c03dcbc2e4de0874e0425397bc820796e0c831baabc899c1ef3160c4599264508af0b64bc40dd3255ac0c3fdf60f78ef237517d15fb125985427cef1aca804feb9a2db0be006e9862c66d2a621d7d692856d3a0b2fe4de0f2d404ad1bca9a9f6ed45b3a1d14bc309a37d1f73a30a4ff7253ee9403b3ba417fa4f25bca79012e0de3196e8647a9d2cd6f51a67aff9ebe7949ee069ee53bf66851ac9cb768f1693bf2bd3758f7f06fd1f33df6dbfd0ea21a6022fe2df0ba57567cd632eca4028f22f12df83d284e1decc46e1be675ad439877f4a443f82de2da8dea9727bfdf06fb1698fa9890a18e2a2597c4351c7a9798dd23ab574574f01cef55adae41bba7cae42c68ce592563dbd415be3ba6d636e56b99f83af808dfaee66f1856d2e98ee9adf56940c70679d4a110234a76d1b76ee2da7d9943b1629deb98a1baabbe6dfa2633653bd350fd4419eb1bcfa774a3457d173dc364849816e9d5d099935c6df32c33ded60ad3b7294487b96ce13e85888e4e5583503b98934eaaa7965f9bb4b1b738cc631d33e4d8d2cdefa29a7b3ae9921daf6ef491ef2e45c5a7f5c8af8b290a96dded2a7a7767867be3d1323ee1bb6b9e846b8f5805bffa0e74e1de35b97db69e6114320484baf2dee69ed6ae1bf9a475b4cbeeb522df1658d6cd7317b7aedbb73c2dfe7d3f562470d8ceb1dd8b3a540b88e1dc62b4d4cb5bd9285fb79f538eb106a2e57de41df38d6ddb2b5bc17d547d37e5197730c68dabb78ad81ede4728bb22d2d31f4eb679057bd79ca427c54e55dcbdd0a1ed194cdfd978926274fa3776fa79f754a095771debd2af5ffcdb737b39f2668f82b30afd227cc2e2f37d779a07468e3cf9a940597334130545927c1e5d72eebb25b973d8c9c3cad14eceedf0790b9e454261efa2a9a00bac82ab4272327fc1cb2b3fd9291a4fefdb532dc4a7abf5e650af9cf2c97e64e555118b9a57c6396259448468c339bb46f72e342f10aee8db02973c7673a6231cb7af6741d1bcd14bb42feab9f876b57f7952a180bdc08efd43bfb8b69cee88c2b17afbaa89282759f769cf32e18c613e248a79f40c9b3cbc72c62b4c7351a38bda0799be9c99d92e7e0bdac95c5f2659b0b9c2a0a974952732e81ab208c39eb228a8b6212fdfeb02b2755165cef0cda32a9e51998dee569ea2722a68ae6ec42c4737ffa07fe856a17fe4d6313d15dcde31ad437a3a1cecd19e5f79daf35e87fa744ccf87eecc231cb8ef02300bc6fbc060fbd36364f3a80542e1a7432cefc748c7d19ed4e49f0e1c339ff500b978150619e072e60271f32747149527cc03549e478e6370e68a8e8173085d0fa086f8301a65f5d91c0fa9e5909e0f751e0e94cb21f374e7c77a2ebc0fe873002edee788e20afa8c68a9cb65cd1b36529354c058c7e05d00bef485ab3f761807a42154f6cc51332b2dfdcd470aa11655b9a0592426eedb71aaba439d00a95c3c0e69c2e4348fce1d1bbd0ed13fda777c0ff4ec18e847988ba06d41991f139a4c865796bb5130a7b102c73a718185e87884793f84e7a1d62795b2fe05d2f910531214cca3fe03cd7fa41d15c463d259e6d4de23db7df62f901ed094a646d43d46e481cc81bff983c49f0dfa830132b93518729d83e160e4cefd53df7d1ec9ee9377df3fb9f5e86df2788436c783c4ed0f692fc11b84f712991e8fe6be4794fb5073f5d5fb91fe2711c76af765627c163e75df6e710eda054fce422c87f8b83dbfe87408afa167c458fa96738c842d6bc2bc25c25923cee4fdc042581337a9d756c21fd60c48a49ac33b44ad2353e9a36164d97186019410e43ebae1ab79949a4579cfc77d06a9de8ca050e8f7a1f41c0cb946ae0ff56b56d66cc04aa84a03790e5dd49e71f6431743dd12353053437ea2ec5a81cc9562798d4839bca198dd23abe59087a2146b49b123e9364f00f0b93a3b5b8fd0957b34a29a1959a203b747e8cb1c6886b01e5191576e28f327f952d91ef174481dc21412d62326446348d1c7381a5de7f9271cce252c746e587373b7037fbef9d11aebaf5f8ff4ccdf133d4bcc6e8819a7902496f79fa273de9d20c398aa48b017b348e0f33888f93de24c4e3cdb097e630e8f91cfd8f04e90cf569918efb422d6cba23c9a9c9c6d92caf238788eac47c3e311f53f6a8650abd570b2c53351d5b6ab1125c6a9ba1e0dd224aa60a24fa2e138f27bdcea4aa8c3f6ef316231c1d92356dc49ab41bae624b51358a555b05d4fab93f61fa7e2ac8e31c6c4784d4d67d2f9d313314e79a697d41d6b11e63e6621353c0ea4bb81ebee5a623d920857b9d2cdf777f2c57d4fa9c2313d4de9fb957e6525f43d567baa31e139a1d8c4ec86efa9897d03dad46027f079a72c6ff09e12b727c7e509bfecf54a397cfc0b9013c54bdc6962b24fe1297682ef60bd13de8bcbeaf15e10211ecce405bc42dd2faa5da2f526e43dd638afa2477c25bc17fa3c81f513b41a474a3d51edef867b50e005a88951e629ea8b54f6847c82f846dfbbfbf1a23ba197fc798bba18cec760e4eb7ad5cc63b00db54b346bfa0266af3a65534cde142c6c9742056fda8d17d3c917cd62fbfbaedac6de96cd13de6ef2f414f92454d1d8549000c7774598beaa6ae15710a76612d83f812e53c44ed1cfa9765510c6a886b54d5cc677c279455f65da9f4c6d6f83d09fb1763fdc4de69ea86aee846efe8c766683b9fbf0f78bfbe66e3de1e36ddee3d3399dcec87a227b463be2f942888c3657ec99e679a1df97689ff7e664718e39ed3d99c839fd3e69ae19e29ec0678ebd27f33d53de33b09c21f649f1a59e27c4bce8e729aaf0099c04499e43f52f46c1b9d6fb849327c51536acce13ea9a219fad417a11328bb6a286b05f808528f3a1ca079e3c2bd2af27e47f51de33a3e08be1b2347db4df822a3d7fd20a648a669a718638ab82281d26e0057c9ec05a3a3f3793f7623c443dabbe4c69e02aef9f99e976e8c13cb2846398f7303b8145d811ad42cf9ed01d999db9ea134fa8e49b45d1a222b35eeae4c95d129d6457264dee969d8a74a5c8879b3f1bac066bfae6e7d5e0d3fd7e92cdd68aec99f3629f35d99ffacc7e8cb3a6e73550f88cf1f824ec7f22279f7e299af098453b123543a6907b0da44fc55f2ba34ffc8adf6a60abfc8e727d46b5aea0caa7e65b0d429db3e859f4d818cd42e533455a6bdd5f60fda575ad4d8d9f91ef1af1b2136afc1c582d448d500d33f85424f6fd8ee2565bd588b5d22eafb457d22dabc54ad90a87d025abefda7c046fad272b8dfdc414d929b04f767aa4c7db675245982861be8a3c82fa33ad58e6473878365f293681a3553160862c61763e07618a7757b7c214c677c4ae99f2b3731bdf167b27676652348a6efe7a507213bba6b9fdc4ede09d359d95688f9fbfb0bfc1fa8455c22f9f9410fb693c36e67bad88e2ff091625ba3b9ceb13fedfeab9c6de4619d8fd127a11987c9a3ac2ee5ad96e52fb92973d62c6a5c13a8adae0a6079fcf14e637e23651cc37b03786d9c6e85fa20a24eb67e4157eaddedcb39272b29d909aa44701ed536b5d9b1e95b6b27dea9ee45ca9de1bec6f94a79d0e6150420f830676324a03cb741d31b06a4aada26b98c1f58e9c716fed6e89b8ac50bbec97b497f134af231fe19fe69c666e337fee64b236d507053f23eedb1936daa34d4a739e1599a09079fbae71d59f74f34f06a783b2fb6cdce7c47d9fd06fd979f8df359dc9e9a97af3de863c4f756f43bf65f23e1d9c21ceefad9d1590f8778da753c45428bfecf0f346d1cab098c119617aaf34aeb0e4183e3bd79c019b91d784b2d66ca7aa51e056018713b3b789329c500641f0ecce8daaa7a46659d96ddc695955f4f699e12e284169ae790d7583ae9c979fb80ecbfa04559c28ea69a4e4192155a883728b04fd84729ea12f1bd287799ce3f414be612e42867822a446afca19f6cb9196a75a195772ae3ddc6815e70399b853aa79a3dea2c4f60cae0da3739d1bf13ac3f486bed87c41c133d419e630b093b938513665450c5a8baa65fca66731e495dff220e8c66afb89a928b2700cbf01ef1c311b2087990837684337ff7450c5497570e13ed2b7eae012bb57a8c7ef5c68ef6a1477492757ceba446c75704d717e8f7d6bb4389eb12e91819fae29aaec7eabc81358302e732c53be6b643b25eb92bcaf894d19f135ca728d1d5e9764574d0646673655fc5e12ce159d5d114a95729591af8c1cacd7b546fa6a2fc84f725c6a5e51483ccb88949d6bd5b7ac7532bf1a72d59ccf35102fdc93a0b09e35fa94e9ec923a28ca9da2266671ade841953276aed1cb1af2d4909babadd1d905ed5ea257a7c443706ada6b99946bd3e91a615c900aa7e058c57c55a1f1357ac1f356c3b960d754ad2ae9e9ed4bcca3ccd135385dd1f9b54e5498df53f495a7a186dec8945c9a7e56557161121018f7d2e858c3d45da6fa5c55be1253851e57da3fdfc16b9d6daea406fdab986d51f1148cafa926d1e7120a5ea1a25374959fafc0eb1418c0a49b7f35a8d39457e9db3ef35315dff649ce1a91e79539b37b5726a26a3c79b701ab616276e1f9c996e7ba5b55e36173344c5c5df7b79936c0e122e26959a4b5b07555f5f702180de4a99bb37474d5b06c806983aa91339bdf2a11eb57dfdaab47be524b03ca4aa7e2de59ffc6566eab407d70955aa2df25a2ea917ea2769338d4b7f2368059d5a87a5441c3e4d9d505ab7003d96de5d52d2fe628ecfcf7c50ee5c29ccb1c5996e9be5a0d456961d8d8c9c0de83783605b3aef5c6155f98a94ddf0b99781b116e41da97f6e8e6dfb8a71bb773ebd68d5b7764c9a7417b8c257bb714613d1a3ac976cf23faa75bd82de37b65e25b1a7f13fdde223be35a3e9e257b786eb7f00a1eb7c6be5194f82964ba32b8b7e6ac41e877ca36661967e0acb706f16670a5114197b8ce70da306841dd8077033d04f74a158ad9d9ac7c7e97d2c5e6be8a940d0c448b9865d0eacaf836d44fceafd416ae371183ab08777bdd18b45bb56fcdb7f4decf8164883984a91526e939bd8ab25d4571d2831bd5e87670bf93e18d56b9ddc9d837ce776bcee39ec4d132ddb751bc553decc7bd8c316fa35b724537bfed6e5ec77dfcfd6b0d1edc7e9ba6a5e59ebaeed372df6df2eabad5a0bd2e7d7bddbbe4d726842e621ee8e9c1ed76b11ee8fc8190eeb0df260e5dc2e852be16e5f1ecfcd91d320b066377dc7787be5bc4a1ad7cba14eb4fdbe0d43575b4c0bc4dfbdef381ec07f216940eb1bb23bf07daef1037ee4e0bcadd294a877c1a50e301489dc10df2b6e1cbd8a2df1d7977a962d6b64dbadfc0b34b382d68d2a19c6dd2e30e3d7920cf16be1f80d7067fa9b2058d1a94b58d6e75e8c339bbc0bbc3ce1dd808c71b646951350f5acb0d9e5a60cddd6ce9cc70371ed045d963a51a981ed6b68d290a93d6c51c74b48bd2595691e3efa034a30b66386f814d83b2dc61ca1b3a4b7c033a66c6da98c516b83c10073913063c7b6df484bbdfa6dd0e32b6d1812ed411fd1a9891aee9b4dc8a1650db9abfadbd96c9bbc14e57a747aa94196f2bdb3b4cad4c97b06823be819b2fab47fb3d7aceba25f3cd276decf3a767e2bae69b7f73833c3de56847be0b40e86d9db5912d8bbdae41cfeabd6e232e6b32659ddd83578e7ef38665dbe5cc996ae4294b592c8e70e1f8ed25aab471ce939207529b6a2b44115dcad5db42ca2b86549f252451ceeac975e795a9adbb0d065d97b74b3a089ee8653bc85640ee5144503a4f7a64096d97025dd3939ea92a4b0c58535b6b0e9ae568a2ba5a5b9632fb7cf941a8a610f54c6a8f19e4c09333c675495fc3ece50d6a5e7b9dd579eb52f5a19f4197903fb0b1da49de5e14176635745966a637084c7303990c9940af4f0e567c27b6956f1b249bbd1bed6595492eea655088fe57ba6051743a15488d022d6f67dd679f56db7dd8cac2b340968fe389c9222a6b1623fa7af6d566d42cf2144d363ef3a707f0f119ec3e47ed03290b6cc9baaf31598d2f027d1f8c72c00cfe45aaafa06f84702659a5beac9e16a21dbef7525d21d28391da8a2d790a46c72c66341745654dde4354c0951430e759ec594faebead9515dd0a6fbc2c752cf4a118f12a0c4245593a6dbb4e709fdad02e6854d0aeee6b0d05e5b0afe7a2e73ef6b3a6f6224eb6f5b5be6dcc62369aae300d6dda17960565b53fb07d28e0dd2c7514105d44478473e86398837d9d1a5120f44eba51dc8a0a7c0b98e9367ab66fb21428374f6a1b7c0ad192e914f41c721d52067e67846e862e065d437fdaa20bdd7cbf73e43ec7fe69b8e756c667f34feef7c82f7a3ed69eb8338ad81fc8adddf7be7e9762f6e9f7987e33f0a61d2072457e278bcf3e4e049b9edd53d17d0a7496250e8c7304769ef1716049c8f28b7716f045c163c6a30ab3a43367de1f66840529b08737de31a151e75d0cde6ec03b525fe67bec3ddce7882a2fa01e1fc7b58a5e9e4f91b9229e118fa08decee7385845fa4fe1459515f137a22b7c3be3d8f3c9eafd0f24435a2ebb176b580ae792b6315d69ef2fb665f7b5e949940678e07f2b63aa267e9420151f2f6de870a05d64d2be0c9d3dac0a7201fe42a46f3211d2e101bbeb585500f3a162a23c5a9be0278eeabde599e34d3d7639e63c391196785ad4e5f412757f814c8e348952ba88a3c631c9d416559dc18ce5a945e8189d42e5dcbaace05dcaebdd0198acb40fb7d339d3ee648792083bff9c3843db092617f38d0e73df39ca8e7d09ceb723c0641e96182df01bc92e1d09c0ef03d8c30069a6d6f38d238dee7937ec8c5e78497a4b80ca2a7c4d8ea4571b6cebef1e16c5c419f7c13ad8411065225b878bf049e49c43ca00ea3dcc224e610ef0ec20da1e74154c32870101470b1ddf4558ca2bd38e79e766ba83d4be4bd60fa986c29969052490a25e00e28ef40ec8018f52409b54619ac7f5cd3c060879e0cd497198dccbeb065cc91e2075d92d4afedacec86b381562f3723ee507892e7c1b04fb3919ecc3d8332d00c233b69513711abda900e91ea32ad7b3a8d8c217e7dfee0e60f868fc331eed7683821dbf37872bb3cf17c226cd973427b63fa7e74d684767dcc987c47407d429f645246c8b117ed8f286642f623d95cbdb01921720f1c47dafd11e59ed0a9e418a8c72365129401388bbe23e53126b4113118292a573dc0ce58f5092c26602e6fa731ec473cede1f3041623f01883872894987ac68af90854ae6ca4558f740db43f7bb0f9dd33d12e30e2043df52c12ec33e658ab64ac3179ec41cf3df4758cdf3dc51c10ff91624ccc64c8c470b6093ca4cb63788e314d4fa874ace763ad68421823421c2b83300313d236ccd44823431f9fd4833b32c65c253a335ce598264e667204e4b1be45f674ea59d191e695dd0493f5085ba663acd392e8ce00fc07c0d91b5a7dc77abf12e2e1151a616a12a08d81f0a8d3f944714faaf4c078871e3fe1e63febbd9912d674f8e2ec67ad6b4cd6d47d4fb59a09454d69f7d9793cd3d99490a60e5b30bdf5ecf0a6f42b7c27401be89d9d02ef59b3c85e5882fe4cf88c30c60edb233a635663fa7d259c91891f2187f0138ec27ea26f8767448d4cfe5745967a59015fe38b9905417b4634e77cc1a9d431c6feaba97600e429983f43ed6753c5087530da2b6a192b17ae277c9e4de7429daf5aa1543f52859e49db67f219d3fc4ca133e3bc0cc324048d5e3013af984899277e1bd819e1ec239d0451f2c54ca9ad956785f51a1b9584f11495057d474097f7e3883286291c003df497d75859f1e9ab62046499dee9506efd0b614f35b3dc16d16442333bd21e3f6bcd53e832313cc2743e43f931d41fa33fa2eb33eed344a770a2d3236c9f8135d65974a774f3bddf1ba6d93ef3ef3b58febc82ff1be1bea54ede74ef6d2bd3db5f205abf378d7f4e9d87a7e7a1c5de8d3e55df37c36b1a31dfe6f2a7e7edddd90f5e6fa4c64f7cb675b1fc66c374267bfa33afe0f96c549ce9c97bc4e0cf9ac558bb350dbc421ddbde6f26c676eca7be3d6f757d5b0fa9e979b89d75964213cff4acfd55bdefa91cbbf9cae9e44706bb72ecaa39f458b47d4bc505dc8989fcb9931447377f3e5cb8cf87fb5e0e576eadddc7ef4cc9f6a76feeb3a0f329fdae9cf794bca6e4b9c23373618f159df9ef0fb7e73f2b3a5bd1af5f739caf28fb1b61ac28db0a39d78425f173c25f91b5a01abcff12cf2bdaf57e4b44af88cd92f09660b5c05a51751f60e36be6e8056afa00078e5fc28f9145bf25f1961cfe774dbf6b42606ba1670be23f07fa1b182ea0f7944ea65062896ebc9136ac823f61fd03ba60bca1036f94fb839463cc15453106ebff06b405fabba6e8a9f68731fcf7125d5c118b378af8a09355947509be2b528dfd3f30436f8ab1a6ef29eca9a97f8abe7c10b2c717e5a6f05842e715ad25d5b500ab37edd202d3b9a6a73522a7a87c85caa7a48828f1862eafc06145754fa1ed54675566736e265bee84e8f7a6fe2bf4e88378ac50cb1bf82ed0c5a5e6e4fbb440f4c24cf78abc96d0620d4d175070ae3765411a2c35d70a6c56a697721b69cee8e6fbfd35eefca7fb7c696f3f696f3dfca69d253d7f42539eae35d642bf3f158b7fbf5cf40acf2b3a5d9ba895a24876ce2f3b2b83654f3e899df0e47e7d9a73d917e536066d050d173add0175096b49d6276a5e68f5cc92f5fa1eca7b32f05c413da983992db4b22594f2cf2bcdb672fcbec8f34bb30b8acce327f271ed12fb8dc9fa323d580dadaa4b53df129a6d54195f857452ba238a7caa0fd7b524ce2b9d22d16301466b8d923eac537aca5f9545aa0a56f40b682bfd958915f66be4ff06e61add0d9a2f53ca8b865c9ba0057d98ef0afbfeb321660b45085313662b54be02b6d4ec7fad8a9fca3ff420f092095b22f7329581eff142fb1e7a290c96dacd4f9327ccaa70b09874cfe8e67f2a5b79fad46ffeb53b76ff7358d24f4931fcef097e7fc23ac18e8f5c479ea778fbf06959e7b1449f13aa43b04ac4f80bb9d319d7b41ff29c688c787fa9e7da9c09a7ed75824c258d0f089f510ccf71f02d69f427b42fd139ef9f183e56ddf05d426c4939ae9d369f1a55528cb077629ead266b53a1744d32f19d4977f92745d6ca6a854ca561dce3f530ad2dd7c01dfd4a9dd88cb673a14be9290c93bb1d2d756e4f6cda774dbd395144e9aafd0d71271afd15b12929d26794b534b47983d66bc24a730ff6aee94d7367454e5371270661ad3a9c18bdf9e69f0d2b6e49a6737d3a739faa7b3ea35e95e8ec0cd6e7f0c2ad337a3aa388aa392961dfe39e03eb4cd95410c33b557d3e8fa643585cea0e639628e68276cec1b044a8ccc36762d655c5ab12f6393192bd50a73fafea49896aa95084b0a8b81d1fe1f72ec05fde77978a54a14841a9d0e9b97e7396aa56771979568120959fd3f3b97acbb9287e4e1fe98af03e438f049fb5b880a747ad825795a22adabb7355f7d2bcc9cf49fd8a76a8a2b578bf33f5abeaac9c03bf429c2a649d616a2a9884aae96ec5bccb2a841ab4abea8c7c22b284ca4b6a87bf3b82241a9e61e6e4597a24535a02b34f8dab82c31978db7bc759c543fa711975433ac11365ef6e09de9f3a81f68433da3aab98d0734c4d09137f86187b234529990499b8aa410cf9449d73baf955aaf482669a7f2fe9f67afb927ecfa8cf7c72061ff6bf80ede7ff82d4aba0cbb16f85b80bca05de098c5801ce251005b384ef12b894b013727f52b4eccb8432fb2a7255801b6a0cd595c0e89c102e4dd633adf71227c24e90f8d6b3c70575b54a7a8b7a8c52552544850a3d7bbc2add1346ac02ff12b7aba29596707b2f55ff0bbd495cb9ef71504bf4bbc46f95a22bd8fb44dd17b42ba85564ba2456a253dcd5e0f589a833627baebd13fd98dbb9f6b9821a42bfc344c8cc9d117e057a0405ed5c56e87e55f177aa6a34b0f55514493ac86fbb0aea169505fb02673cad67daa1705ed18c9ce55cd539c3e96754cf2566426a39533cbe1b1706fd1253c2efe7707e869a79fe3eb53fa260156f3189124617c03a435fcfa319ab603904baf957cae48a7e6beef78a2cef75857d99922bddabb9efda506e22c75ee97998ddb06a464d1bc7311c57d3c82bf0b8502bb014bc2b605614299c57c8a3861db9ff579ad53211756a9ae7ca78caa736b47c2f14ed22e25651ee9528d795e6b9827a923d5631ac4a14790576c2e02252f86a0ba192ca5f339c2afab9deca76a19559ad42e69ad3f2ca44844e73176bc825df96e315be6d1f6c4f6b06af62e6c54e4ae0173a239dade9fee5b092ca6ba74372d654fbed0e8639ae19c5b6bde35501a230a90dc34484b9b555d50c7698a8f45487db6375b079e3fec9b45e69151c75c6bfb8f975d3d7ba6ad5a04f780e7dbb205b4e1ac3a67bbe518621caae0676e34e847501d42b93a9819d34da45847ba1d85cc9c5f03642afa7501a518638afecd58796d705a22e865786bd651b56dda9d130da35d47f574dc24d7ed3f55a6656ef86f2a8d3a7bee52f48b7a663b6c66d7cd132e4b72adcb8efdb543d71ae86d90d5cafb4c274ef1bc30b13d588327384e55157c45db7d9af3bf2b935e7578673fc9724cc775a85e07ba1136bf5ab9b290e796cc78372a2555d6f6423953d44d9e9ac6bce745e6f358d27cf7e63682747f6ebe87d3cd7c0a39bdf18b686f76e717cd3596d3a6d4699da0ea7e1bc9aeec9efb69cdd02cead5b4ddaf3de7ebf499f5bf26d904763d8d1e726f0fd04dfd2779bb01be4754b2c6e69b5b5774dcacc16c7b570e2638469030c1a84d9228612d9c66e03bcaec80a4f12dfc6dd6d9adeb4c1ee1695b1ef3d185ed1afe4b8228fa6d67faf7dee404daf5387be6f91f90a4c5a60dda43cdcb57bd5abadfa30b316f169e2f79ef4b885ae8c2533c19ab781182abb5506b7a4e815ea9773568eb56ca8d62d554b9888621df268a15a39e950bd0de2d7865adcff2b700b37b0ad775594659524bf68794fbab631b1ccb483de5fa57ad50093b6e66a2ae3b699f27bf06812f6ad66bb42cfe449dedeb7406f1b0de45cfad401f72bec891edcf1a6e60977a2a9eab5521c1a9a9fbb167ad721eb16e7a2b5f0949bddd0bb7d4f37bf438ba7b809667c1bfd6e07bff714d5a1ee76689727ddbf35786ab9671dba253cad1ddc22f16ea2de0ebe1bc0e25bd451cf36613691bf01364d8dbca75c2df4a849b3d6c01de07bde54ee3cb557b8832dadea4a59b480c0312d8a6f03a343f9af90b985ba9ad441562b20354d550db0bc523efc4664d45bd5906bba45fcadde2b5685e7fa9eac5be4e229bbd79c4dcad38057787370960698374d351d55ac85f9ea805713b3ca755c21be6158b6f0ee6f5354079ce5ddddc11436517f1355764cef18a94568f7a64f1dbc29db60c97570b7daf84bc0deccd1ced6bdce5707dc1aa8b385aa39e73ded5da1d6267889daa231bfd19baa4a07681dbc633be02c73cf93df514fe17dab1d6ea8feb7c826732c5d914a5a787f7257b9a3a2cf95b269eb791b6f890ede7557542777f9de64e25991c96a4737bf337cd0a78ec6ecfe4d3ffbd8ae897f4879f9d334b63f4b677cf843cef0bee8506d0f2906db18821ffb59abab880fe4dd155d529eed1d18db7b6df3db56866dfa6d6b9cd4dc4dd9bbab0927c2f34fdeffdcee2eaf187d570fb73bbeadc84f15ec8ab059e3bc6dd527f4291d27f9823681a59d8cdd9dfa49a570f2908a8b35b0fbf73b10d2fc7e52795b119b7537cf5d37699be57d2ad7439a196efe8359a117bd61969e7bd8ed612fab9e59f8e668df3f65c9c7d6e64f854316bfecc79e0fc0b55a0892e479008b073d11cfec304f993bea1d7230f79eb13b88c92a6ed67008f9b2c0ec995c8c15d03957161eb6b69ca93ddde3ace1e2cff3b07aaaf983ea1bba6195084a655d2651a167703ac38246158c3ae2256a0afb301d0fc6b7b3955b6aec190fdb21991299981ef83da8c63d2820ab008d7b29ac302d3d9ce528ae87ecb91d0c7b9aa96758c6139d5516814b11d31754c8a233c2b2a7b31294cba718f3bdc899a9e9695559e4ee19161de81f6621dca68ef6ac13fd8699ed2093ed81d5306bfad3331ccccdf037ff66f9bb7ed7effa7bad7fff7ffef77ffb7f0116ae0066</data> + </image> + <image name="image14"> + <data format="XPM.GZ" length="118955">789c44bdc792ec3a936e39afa7f8ad382b6b63455073d083d45aeb6ceb0165a8d43af3befc65c4b7dcf7c9d15e8741020e87c3e17000fffb3fffb93d3dfacffffcef7fbd7f541fb3e63fcdb47afbcfffb49f8f8fbfffdffffffffe9ffffaeff138f9cf7834fa4f52a6e57fe2fffe7ffeebbfc3e6f03fcd7f82d1eabf15985f3b18afc073e0205a81e98d03bd63bd7790acc0530318f38ee9ad03bd637bee40efd8dc77a077acb70ed215f87c0744bcf477cf81deb1953ad03b76771d64aa4b088829c747b70263affedbb603aa1f03ac2eb36b07faece41e6005ebbf1ce82bfd8e0324d63950e59e0a406c123b76a0777cbe39d04ff66e00093f797c02a47c65e70590d9673f5720f2a63c2a0063aafffee3402f9ddc39a0b601c02af75c39d0134fa50335c3cb35c0eaf2d83bd04fbe7f1de827930690f0c473ed404fac493f626fb9df7d80e9587701b092ceae1ce8a53f1f0ef4d2c3990309797a0db0a24ffe016a9b3bd04f5e124062026a1de827dda3037df6fdd781de31b3a25b533eb40ef4c4426a99b89e6e25006bcacf0f077a62e7d9815e7a380144fce423774057bf7080c43e1da8e8affb0013d02c7280c2a40e68db1b07aacbe41660029a540ef4932e75a09f1c5949532af77aeb8077d40ef48ec78903bde3a307643cf1f5e140e6e25d207599eeee004c1ed30380d5f6f3d1012f7d76a0cf3e1600d38f97d481ded1ae3bd03bfa7d077ac7f3bf9fa8a43f3f0e72bd3403983ca6570ef4d2f61fd04bdfd61de8a55f5f00b31f6f070ef48ee7c601052b1da81c5fdf809c9fcc2f1de82b376b0e4a0d05b2eb99abd4eb21c00434bf7740db760e548e873920e51d6f470ef48ed753077ac7db8903bda34b1ca8a4afe70093c7ecd201bde1ce01ef983bd03bfe6e1c4840df6b80dcac43ec40efe80f1ce8279f19a0e0b3b33307facaa7743d771dfbf80768b9dc81beb2bb0748d1f583da81def1bee10075d877a0977ebe3ad04b7fbe1ca860ddc281eaf276083011b66b0ef48edf0307e8fa2ec024f6b6e1000b73e980cf060ef4d9f51f8049ecfb1950f2d2dbb9834aa00054a35a32d5885cb85a36470e54f4ef3f802bdd910395747ae200897d3b40e92e0026a097dc01635404b0eacf62073c113ac00f4a1c481e931780a9d4eb9903acc3b103bd63f60fe81db373078514661d509a97533bd03b169903bd63f4ec4042beb37298d4df25d3d2a5bec80126b1b71d80496c9a3b5039d6bf1da052bf0e548ef77780e9d8cfbe03bd637ee140ef58ff0014fce463ea00995e3940eaad03496c7aee40b6b08b00a59e088231a0d21341b8e1407a7abfe94012fb563354ae851f338009e86d17e03d6a0b60459f640e10d02bc09af271ea8027360115127bff74a09f4ccf1ca8fa5f27807ad4acc0f515a019752b702c4daeddebfb780258db7ebc03aca17e6f01a6c9ef6f0ed0e4dc818afeb800585d9e260e54d2eec181a4fe3107586dd72b07fac9ebc881daf6c9ea5203268f80869f7c483f1a1f7036ef1c50b97b8077d33d80f5b987ce01e5380054a6850f0ef4c453eb40057bce00354f24ad033554f30968000feaa64d969502f399837605f6e449b7ae851f1f00abcbcf1ea0343ddd7480873277a0baecdd02ac72aff70e54978f12509b804207ea2f5faf80869f4c0f1de889f4c081eaf25c005a7ed27c39d013334aead59f1bc801db1250e775f97c00984acd2307facaef1da0461e1f8d03aa7fe90083523960142b00ad39246f0ef444bfed40259d5c013a7ae54cfda5f3ca2d9e0056b90fe947ef75f96c1dd009ef1ca8477d5680c686e81707f4975707faca340574143d5f38e857d6b29e017a81702a21f75951aa2e07abcf0e0ebf8dc8eb5f002bfaef9603f586ef5780758faf4f0774f51ee045cf1da8b6f33b078c73f6596b9749e7403d6a52003adeb1f807f48ee32b40cf67137b473f96f9ecb605967f7a6909185bdbce045c403fabe175f8ff6660bf2f0136f0fd8d1ca8e8bb770073ae368f00d64d372e00a6c9931e60f2588400eb622fff80aa3fdd772001cd0e1d483f1e4b40c713dd35a01f6b1a19ab29c74b0108bc3960b6c63b9685d7671f05b212011dad46c271e4b5fdf802985dffb427ac2e0f8d03bdf4b973a0eacf1240c74f5e6f003d3ff97a71a0da3e140e68ca7b81a596a9e8470ef444fc6260aca2f7df8031fa11bf3b58c923081207fce4131021b1d983806bd09ceaff939874ec5fc864ad0154368b9e3a605ef906686d583b0698801ee70e54dbaf7780f58697c001ea70e94005db781658f63a15fdca00f298f293a50ea98bf5800879243307cc8017025efd1995cbaa52eff8d067937f06a506987ebcaf01acb66b9d033dd16e1840935ff70066fa166301afdc4b0118238ff9d8814a3a3d3540f5fb4307748f5b40c44b5fed1d3120890c481e417ded8069c29f800be8e117500116cf0e549709f2c8ea4a053b5233a483c210620c018d454846809e2ef63276a0eaffa9bfa4de5f362e1d6050660e548e8e77b880b24f4042e5928903e6a6e78094271e5497d46b3b590778e5d4d8ff02112f32069997f4f504604df97207b07699dd38a0ef7f00520a964c1dac2416b42f0ef0824340c64f9e7f04b29a76993e011a8afe2590fb48b8b106305bb8f30ae850fe871e600df52ea3942f87607d3672a0da3e4d01b169f29901dae5a9022466a5f60129fda5df752021c7cf804cf208d34b072ae9447d2e1f6a4bc85556aa707fec700ae818e776f71da8a43f52fe62395cc8188c1c48a6f323039474913860b25a01acfadfef8084ea3f4c00a9641ab4af805c75099a530778c1325b45d652b94f19d8d2478fa70e6025fddd35c0673f5e00092dd7ff00321b3dd60139959b8f1cc87ce6f6d942050bba33077ae98dbda3a4e81faa5ce563f677ed402a35cf01d61bd67f013160f20648ccae378092cf16b903bdb4cb00150a339781ad5d409f2f00fbca5ae1404ff4bf8094ea2f4a4086801e9f1d10e96d00346598c4808a8225b983957e04d51ea0e689999c9ada1b7bb209e82b228aaa5ce332fdbb05988ecdc60e584da801a9799f570e98e19c02ac47cd0a404ee5b63a006d1b4c7f01357599fe3990a5bb5d001a2a775b3a50f7e8e57d36f9a89290b757b39371fb6fee21b3d57a43cd530354ee7704b0ea6fd84facb6b35b07fac9c981037c980850d0b60fa50395a3c8000d958b3f1da860bd8c52eb75f992a15fced6a4851f6a97ce5bee2b03a428dd6b0cc8ade8a7808a722c460e343668c56a00cd58ef480f012d20b1afb4112f950dea8692b24c7a051853f4577906bd4b7de314905a84e4d181daf6f3c900426e0e002542ce76009dca1134670e30392a58ef059b3e03c6158b4b7f0e54d2ef958f1b8d7cbcfd1b03128afe59023206e0a70c60866d76e28030d40ba0a42e8f8d037eb207a86c04ba00f426f5c480558e920e4547ead780a8623ea7a28f7de07bd907e4b4fefc065002b67a404dd167078046c631087281681469ded0260e88e33e0a78c1a673406452df72a0eaefaf8c41142d3d6569f2029021f5af1e50100090c98906a2728449ea60f59560feea405f39f80344fca457f5a33cae54fd437d25f650d69f641afb28d6ef015c6213408de97b6c1d68d08a9f0486afaa60c13f20c7b9f907f48e8335408c4cdf0c24d4e5e147c065faab922ee70d68b2ea3278a718838d2f0368e1c703a044d71791010cec430db0ca4d9e1d10dc5133248386745287021053d264ee209585b9749069d0ba0358e59e54db64a89ca47ea0fe329802ccc5efa50309f9f81a50a0ebef5b80da943f72c0fafe8103d5f6f103d0f093fc576028a98c63770a48a84bf0ec807047084869cac71d8141c724f5c58b035a6e15ba89b2a58f225def008db9b42340874f17e81dd9f01575d3fcc78104d424800c2107b103fde4615d204f28477f0b482b3d7124d51e549fc1f3a804585ac1ce27c00cdbdc9e30fbf1720568cdd21d39604213033af5a86016080c252506fb0dc829fa93da25f7a24fb601191d79f2eb403ff955572f7cc0d92a0039dd63bd0698c24c6300520f17b230c560846594b22f404e49d30b07b8c51f80827679565d8a7f526f0079a577f42da000eceaa54bf79c66680166a57ede013556ea4d7a5a0e259516966780828295278092a2f752baf25f397a8095e3574d39780e8870c340c148f891002c54f12911569105dd1e73076afdad16906a580bc25d40196942533f38d04f6e0d5426e47381bca4a43fabc959542f67632bb0dd004a1b4e268096924e3588d743579733d117003e1bf429a08a54dbfd1ed0c6f84132e3f5204235547f07282a49ace7b3434955f48d55b02b6a96d366bd2305f436bea860cdd2035149134064f3b93b408c5a3e058004df61662065cc0ee6809aca857b0e56e508a61b0ef4d2fcc1011101d9a066a81c4b36ab284b34f46beaf2796380bafc1e02e8eae19a6adb2e3d218d1e25c0cad12c008dca114cd71da81ccd07a0a55d3e25a0a5074b46d514d099c9516dbba5bfa5a21780120bf3fe02a800e939c01a7b7208e810d04486be1bda96c6e6b3795d697c395017eb072f87f0f10c60255deb01662d377e1db0dcd2002cd0fd2111f6cbb8adec7ae040b58d6240841d7b0c01e87ad8518ee5382679f015af5c7ae440ee57b86f00792405a007eca929877fc62a58b46a9778e9d252974e20b218fd57ee00f7eb1510a3eb3f6b0ee48ed68f809eaf14ef0ea4eb931307e4e53c092c91dae5d700452faf1ce8a547abfe122fd71bc80efb1418d7a6eb6381c802ee3f1307ac36d913639b7a5d0172a4ded500573a157d983551f4f4cc813cc7e90f606c526f1da8e84f1b02595a60947847dea2961f2bc7288e865932c671668059e3d7adc05017c2d80dc002551f0b07aa4b7c0db0961baf3b509f7b390464543f3d15188a2e3fb97f77405ad22520a2728a18ad00e9c8ab3e17c7dea3d627005b7f29ff04220b744f22404e7f59dc014a5cb8c535c0da25fe12183e4bbb1c3bc02fcc1c48eafb1f80989f44ab7e1b0f5e30329d67800c333e3f36c024607e00a06081bc8b3819dea99216ff803ebb57031244988c1de8271bd2b1746cab09dfaadc301e9b3bda0222d3e4c001f6f402505ad10f0de0162f2a40a5212940eaa9952368df1dc80dd49ac50a4840371b8094a26bb018fe9901b6a58583e36c73f55e6039815b81e31b4042d8e5f31a5050f4972340c93c7b3a0654662ded1db57cba400bbacb525017ad04ac00f3864b07c42eb61d10d9ac0159ccc49ba20fdd94617e06e8f01dba6f8162541162ac0dd494f40730061c49c78699b9255f4b84f972b221b5e489c8a2c5b310d0a085d3c201418473408b2bf97c02e8048240663c1f2a2789855b0ef49372e680186c03c891c76457c0abdfdf037aec5827339e7b6d7765b60a376c1b6aec62195790ae378018908f0116ba79df76a0af8c370085342858c86c154349d5b6e5b50355ae7873a0a2e71340613f091d9045a0d62f86daea1df347406fd597c48aa1f58917568088ea6fa85d4a1f70360f0116a67c7c0558ccf1e51e60b1bee99ec03056d25097803c967b1e6e028a98287ee840122b0a07d2b1fd774069ad1f3850e5d6f54435b645e14ff5ecca079c7e0d50327a4cc680868984922886497619134f5e7340e25205a8f8ec44fda51a64cabafa2b600ce8fe00712debb02b210f13091c81bd3b802d3daf4b1ef520753d11f50033399309c04c4ed7021aa43e7902b4d6a354b97a28ba0a56bc3a905a068f0ef4959b2d404dbbfcca6a373e347e4ba51aef0d9f35c0c2fa0b03bd0d8d529866d00f8970b6eb40faa1658e01d8678bce81e4917d3b90d295530309fed80da0e127b31781bc6479f253a3691bd90266943b20cfa00458f838be015434c383fda447ea5335c3e0f113fe09a68098ca85eb0e184e2e000c49016ad90e452766f0eb40452f2606a82d6e4fbbfc5349e7800e30d510dd66353edde24160505cac4300486b7939dff20c3a97c75a0e28b1fca5dc8d6ef0c8d45f8211a062146bce01adea122843640554976ccb80ea12288cbd0252edecc7810a167d033a04544c0d208f75d5a5f7861a6f026c896221433f4c010811dc6f0022c22e4502b096ebb7007c25a8170e346f589c38c01d7d01f466c7de1ca085abbe9f8c224b09f80c00391d68f3c0810af6d3024c2d7f1f0104dcc31f7b8705cc8a5a607004d5a3b2758017fd03d023c2eccf81a49e3f3a20d4f9ed8029209f5dfead5e5aed0222def137114873943f5dc9231947b65c3b19092ca734d2b15b81e55b54b04d07c4c623c01885292b0744adef017122996e7d022adcc04795743c740f123154b9f130ba9209790ac8182be72b233d38e3b105547b408a90e72706986a143c31149d11e81c40d183e6c481da45b9b42ba0dab6b903990b6586ae00b3b51860525fbc0a1449852d7c06a43802dd1a20afd93ea8cf0e9d8149d186015b9dcd1a408175f83900586c3c7b1718944e136f2de70f8d10515b6dcd5801cd4dc31d070421cf1da872d99a037df6e00710a3963f92479ce6369d95aec7de94999e489651257d452f4de211e36dba0348b1ebc54cc035a89c382058be7020d3171e3b6032b2094868fded3340877598ec091419ee79a127d2a1a4ac37a8bfa4ae74c91d20c36c951702568e70ff15c067836eea8085e5d2019afcec40ce7775e040cec42406a43602250e98d08c1ce8a5b74702a94dded7a84b5ad33d1eb70506b5943c7656035f92f9cce2b702742cc7dda957666eb59fe6005b06eb1a40ca2c3a0900950dd1d2d3cc2a17c68f80140195b503daf6c8810454df389080aad0015b88eca5192fddb4277abc9cf54381b464e2fdb02130a883d4b2e5b34555933ff6e54042ee3e01354fb4c70ed8fda48e9c2f43662bf01a3a20edf51690f244f405c86c6a7e09282ca8d23920cf711f405d026ded4af2a1be7806230712a112fd5640cd906d3820ad91cf2efff48e6f07fac9b7fa4b9e56cc92a6d2b1bc286c7efb01401e41a5ca159125406c1c010a5be559035468e1d73d802c82f077c701a387ccc5201ed432369023c2c71a50586c3c0054f4864c252d86ca4940da1aba022a47fee28085f67f3f913fa64cea011498ad76e28097de011a8cd2fb83815483784bd1dd4a3dc9e216ae968b052047c8ed09a041e9bef5c472d628798c65a5cae52c593ff903f4f8745b52cb72b0631a2c941a3980028bdbdc3b50f59b0707aafe3c76a019cefc0550d209f3a903a2c532d295b94e4198027a068b9114b7f2c1e2ef0e30a6032d2e00d691db6f40458c6d5a016ae296b5fa6d359443756953072a7a75ec409e745d002ad5363c390434d4e58e97a6b6b4f82c5daf8a9c96cb55f4619268134dbdb48e6db12d9a03228d40417004c878e9e321a0a2b6f993c0bf9296802a613e3777c042d9ab03a6a29f0ef40eed165c01728c7601b55e1a68dbcd0ae8a5ed2da0c37e6c508ed466c0bd74ac1ef4942dbbef80ae667b875aae892c096bf700601966bf47001ba247f7808e2736f5d9a183e1f3bfee02b085616f4f58d1954abc0292473d77a060a8ce335802ba693d0534a843d93850396ed4d84dda31e5e9a5c9cd600bf19355db76b90c2a4bf703b0b5a448f6a35d3a86eac80dc0b219c65b00160ec3e763408daf3dbf05b480a71d404780a8e1b356f440ab4d2bc034f2cb81e4d13c1a401ed5be03c6280ab6fc93c43207e869ee80e8a8a4de0efa41828c86a42eb265c1bf08d003b2d881ccc5f7d40189b152ba6eb9ceb3026b1980dc9ef0f316603ecc4b0530272fd1e8d1595dc2f2ce81e431ff35803c82d481da658f722cffa4da80146b19ae1f012ac6865d75f57e98ad9187f201e8d1f591cad1bb718c668008797c3e034c61464f004b2b78ac002dd6f24c451fe69d78b0ca641a00450faa890309397f3340ebe7af0e98ce7e3990095692cd007aaadf3f3a60aebefa49ba9c899378f02830d496be3f0690da14fe6e022cb7e7e708608ec02c0314ac9b4e4b408373f5752e30ccb489c11e00c604775a0a36ccb554d2f80a90319ad631c024a6c30906d09bfdf870a0ca55970e0811bc3b90c4aa13076a176dc75e01dc8d53817254ab6d472bd54ec7832380c7f603b08c997c24b05c6e53f74800e62a3c3e022cbbe3eb0ed01055986d014c831e3f01b6385daa60e374446dfbdc812a176e3b50e5aac001b670d5b3d3c83b72f408b055af68e1806cdb0090f393a719a0b2b0ad016bfd49026899bf3ced0a2cc3082bd0ec0352ba69d90a0c6555cb55170e68b9ca817ca9f6cd01f3ca7b4064e6f3d401c18c8503221373000e6b98ae869361de15e33b844f8014c3f61b01ac6db331c08cc1d3c2811afbd99e20a92478e0894100a4136e18b0daf60ed42ef9a70316db4e00315dfdfad600efe8160e9845db57127e7245e5d29e30d48efafe32cc400adeb1406c3924df2380253e8e22802de87e850690d8ed0c60896daf89035ceb6d40c94f9e7b408b081fa600cbbb98491d92c1c230c1db008c999b2e6e001126679f820dfe1851b835011350186d3860b93673c0a4f90a90d84fd61d10444084696a3a760fc0510caf00837c587f91954a0693c3b94e52cba1adc9fbcc0a81c148eb2b55094830e3e93bc04215ef3b00cbc9bbf903b0a01b7e3d386047d929a0c5e43c03bcdf9ef28ec143213343767d20d66f3b07e439560e1466e8330752a95deab244eaa6ad039a61d301d19e77076a172d0a2fff49df1fff00ccb75ce327d918d7ba53cba56584a1df56d1b3c852673f47800ecbbf278b9bc5b979d2b501643a4f00963ff67202b00ca207f5b96cd05329ee530a88883b549f00cb7788d591b3a136a412b70e88073d38609efde18089e6a50319361d7f3280ccc6cad40153c0b1030299bb0e48093806e4487df62a304c6f31c132d25999d4d2b1e6ce8144d85c3b90d235b780d49eb871a02722d5368f2d3770f3d681beb255023206ad2c05d828a679f600bca12e010d4df9dd025a8cd26c13d0b3907acd4f125b36deb801a43c51528ea58834462d1c48843af56d0554f4b607e4b46dfbe1009b5c3a5053a2c9b92bff0325cdab92e8c6a1808bb050eb2f6339ec379d002a0331a0c13a3c3d00488e0b1fd5c58ac4b27f169b80188bfbb407a82ddaf32b309455c660fee6404f4cce1d685ea9a3b106503012763b0e10e18303d22ba700269ae1a97c98221b316fb83c032448ec47ba5ee484f543456ad2a2cc90d88ffa6db9ccba126800a5cd1a67801601bd9d016cf6fa206fab4c225bc3090019ebd95ac3494baf5cf0e700015d3a6033dca90326016f801263b07301a8b0b83be70ed4b65349ac1c6ca1aa7f243d5d263d1375923caaa10391f41c016cbd72143b20dcf1610095ca5a074c24d494d5d05f9803dd022c87e4e914c0981d2ed61d100c2d00b6b03cab1d9047bfed80c9882634d5720fb36ce113a04440c58303f2e92207ccc4470e54fdc335406552bf7480d4af1cd06fb7002d2d7740c1b27186e2228f615097061d1e1aa06037c834ab10e18326565551b32231914a55656cf1f503405eeb275f32c1756c497adf8f0e54dbf01960f6348f0005bde1f816d0306beca5b8f5d0b69cef90014cd75b55bf1e0440ec337120b77872ea8010012f1dfe54d2fad4012bde0da049d9219303da8c15bc6d40af97865bd2d33acbb00e7bd436cbf593f06f0a289848cce42ad4834c99234b2d9b386504fa880119bde1e71090632ef66b406921f917077a22be0358077ad178bb0ccba9291f2a002967e13c70c0ced86d070488360039edb2d832c024e0f507d0e2297d5274738b43ed7e1a409d12b87b72a0b6d586dc1520faf56640aa1d74b50332995e1dc821092f000ddde37a01e8e81e5fa70e54b07b355493595d7e35acb571629a9c01cc11c83a40633bb9f6012d8e402b79b449c1e2f4949fb8eb145e021a6aab43779780cad5cf0ef48ed69eb0bebff30f10ee70406d77ce009d3d21f339fc7ff4f4791d50e56466a8ef2f837f84c3ae0096587f2cbbdec59688314a1c7016815eda2519327d3807948c950f67808a258a4789b0b3f96df89e01ccf4e98caa01b4b8b4f5ad03e2638d03fafe87016abbd7015c1e6b801e133c52bb7459862370b405c0bb087bb9e7dd30ccabb18ff5933eb25d47a9ec693f388aa8d413c0d2d6c63b00db909b4d1c108395d4fbc432ed17db8082610d27afb77965d0f384552e8c361d903f5618a04735af0e58a1193be0e8122a67a62f08cf0da06367f2d8faa103e9b3fb3b06328da6971d00231d6a5534edcbb2a157ae4c5f368a8a11eb512f023e6d7a7c10482c5f7bbe06c890c77c03505a42c88e03d62b2f00154063c30ab0d27c076879e26557c04326c523c0aa5fe60ed46fe7ef0ee84085c0f24ffa71e580b0ed9f03b60edf00c6486cc7013f99770283b7a1a21fac46f56c1cdb56849f05a0c675fafb1448c6ccd55fce0119325d18301d9b6f022c36fe7805a891d87c0f60ae9342f22bc001071b8016f07028e0b3c68337808dc8edb3800ba87c74200169345d01760abf39500060bae94025ddb9059808a335077a698f08074f493f7991162e8f9950cb3d6e0914151bd9da3381b2b459920414c5b693fcb70558ec73bd01741643e18965668e04f400a82c2eb56b00213f5e035a93fa0fa06355548929434dc680ed4d4063fe69263008488d5dfc01c618031d58b702e46c9e39209b611d60be65f36cc046e40307e45c9d026240fa024868974c058b074791c33c8e1cc8181417009b672fa485b10be8e112509b477f066850dc872b07c8d47ed29a087b406f2294262f1344586d9a3990c49a0b07449c3f1d1083ad1c10c8e4b3268f4081eee19fe64a5efc003ac0f443a02c0843b5fca46c1af2d8d42e496c09871b670e64c7d62680da7c1835543258070e498800968b3fdf02b49682f70f9097a32e96a42396c0b7d5c592657da5740f0ed8f33e76c0a93c570e54f49b6d40823dbd3b77c0024403b079d4c9025033f09dcf01ad4558470e38d6aa1428ab5ac3fcee6a98cfd2d8cedc894a809deef155396077beac549ad448ec2105343615dd77c0b178d70044182833344bbd72e5c201796c2f0ec852bb76a0926eaf0352bad8ed9303a4de3a20c2faed804015208ff1e8b395939765830f43b6cb27c0e411df03ec208e3f95344b2c077eb200b0f3205cb40012a7c34503e86c6e7a6380726c49ead960d8f4d942951b085d4c79062ba0f8874e185a01764ebf382033a30358486d373740335cdf395033dc050ed8e56b2f6d326c214f945d43802874a09736d4a5eced89da013bca642d97614a7214bf0196a1fa7b02b0a04a7109b0bccfefb9019bbfc8b00d131e14f7f7015010757a7a02d404551607808e417cbe0de82d37506e4f3e0880ccf26707e8d88f03497dd63bd04cab3790a3b8efcf0e24e4bb0b0738dfb285f930dcd209115051721edb9a9aa188ede8b4e809d090d3fb2dc52d12db89a1c5b6013456fd43800daf8b23808d0d5b7c25b5b4d7f72920235ef8bc092809ec96b20e85d7a5f8752089d59103e2daef80026ba935f115c0513c019498cf6b49bdc86df9e9790d5016aa5ca33e57542394ee5e0e6b39e818a9c439c08ed7dabc00b418839f5740cf0cf84fcef7e08be3e53cde004c83267380e5e23fdc3a40c7761d70dca97a76995a96fcf3b903fca01d07b84ec78031e05ad6b27411eaae9215200bfac70119dd9f0e0832258092d143e7d42c01ef78a7a45945bb6401a0a6b1f7d581ca4195395b5f035fe9cd309271ac62db72979c02482b08c2dc018b4b92699570a24eb8f10db07d387f9b80c41620de1de0196c034a36183eda1315bbd2e635c09af249ea50b9900be958e5f2c8771cb0fbe9cd0173f5d4402e75b8be01543403e67309d896853cf29e70e948667ce8c638df6369509d58f242b90eb0ccaecd33408ce95bfb07d8533402f890a4a1a01e748c41fc1e60eb84daf9b8022c2ed500f604844f970e3028270ed0754a9a16b6c4692f351f06d5ae07799069ffe780c5b6d6011df9c8814c30066500927a306b1c683aab3d7803a8cd81bf73c08164e780062bd5c918d4c3288647afded0c496513552630f6e1106e549bdb271113e9f0162a20acae71f4041f827943a34cb0f4bc7b61d7054c7be03d2096b03546efee58004883f40c3807373ec801d54eafbcd604f05ce297a6e9e41afd1a329bb9a6086e4d1c676f055a2e1a44d2c3b6c2b06d8a2f0f314609d70e31150d97e0f998b7650184478ee80a5a31120e689f617602aa5ade559bbf41d5725d54ac000a87e50ff03c874c740ae099e4e9f5b017da53e01b4a843bee580b803f228462567876912d096ad2df902aac81ca31610371c1dafd6ef12ceca0a77de0109a6efeb11509152f4a8f1a54bcda57d88008981b103468f33408a4cbb7b8065eb771303c40b1f650bbbe50c4642de04208f00bf700950cb1b0368e1ecde01d91deb800e996e7f39d090149e39d04bade8598f2617a9033543a2a6ecf211e027061438bde7578092c8d5b3ba47578c4b529b548ec10bb2b4465987de95ee4befe8b3114195b77780c5b6f219c0f4e32e045097b0ec0d60a5aa3307f4dbc68124b6730ce879c7f6a701c6975cedd22fafccd13b7601113fd99f18e0a5a3d557f2d1302764f2be07f03cd84d81617ce1788b0ad030277cba11486d1bd27417d0317bbde32756d220787380d9ca1cb03beedb01bb06ae1da823ebe089d57d412ad8c5c8816a7b31368080d25b070c058d030266e7002268e16e004850cbd65e9af3d99339c0acf6f3af4011974c8a2e05aa84aebeb6b2daf938e6ccd0203801d87ac37d6980517d7b02b074f59f67406f0bcb5381a1a1a8ed27c06cf2cf1c60fb81d6d601b5252ff095c1e272745a034870699fee00b63fea2176a0a26fabfa63ebd941752560520fb34307c43e23c098b9fac5bd015aae7f7240dee723803054f8b772d0f228b163f1fe3e000d4ededf3ba0650ef47206e879e2519f8d52db51f69302525b351f03328c017a1a0d7d1f2f67cd0186ed47c0d432d01c790972760c1d00c6f47d9d2cb8029cd43a7140aad71d20c21dddfe3680902f160ef8cab1036cf2362066689cde3be02ba70e88296d080ca31829236a8638b1e32c931380a5018ff70189a5de6f016c77cbf735a0c133f8c900d6500b75c2d89dcdc711806d7be16304c8d0c2c76f40ceecf52971c0a5436afd388b98f2c81118404adf7f3802e07e85137e62320dfa4d07c874e400113e032cf8a76d59abc34e0865bd3a201bbb065838acb7cf12ed09dfa85c5ee6e428aaabc7454fcad948c620893d3d5bdd74b00596a19a3820016204c899dffe3d001adb4026f399a4b9f5fdc40152cf008539682a58e2c91ce52fa061447e3e02982390aafa898f513a9e6f00482ca8bf1d10fc9b3b606595a29b0843250aaf76201272bd74c072be06be649847c816d66b80bcc10d5c071480581d394d2c1b2a1e39e0149a0f40435a631d027a929f9ed54dd3342252f3f805c8d0d3e70b077ae9660dc86d6940dd347583f268206609fcf60d60b52d3e1d309afe38208784cfe616735c540e78e2c181aa7fb96d00211f7c3bd067af8e1cb09a3001e4589819252d538ed6ab657252977a2173910d6325b7205e3ae02c35d5254bc6a8761c00ec28a8bf034066797d2f02a96db8fc529fcb06178ec5a54ec08a1e26a50392b08e1ca8efeb1295156015f0db01fb3c37010410c3ddcc0012d37af60a48628b4f408e43a2832697202758aed6cf0a1b3cff7a40cbb4baa6e855894cef55d23cb673f14735c02678a3d0016be20da0b73dde1a5f961685d3d5d700b619fff71950b32cf8f70630577222b335e836aabde01d362b084f24e4dc824c413575c028664fe416940d1d70f1883f91b39cbfe500ab7d0f28f06194a9b204fce4f813d0a00e1fd2c2bc18156c61e6892a21c3ec479a5c24be613b0470206a787c07a8ed446159ed62e8506aa8e74b4069de962c4c91d97e8f660f40582ea864b50bab5c98de38e018a77f80c4a59903d21b0a408180c2da0163d48603f68c2c0025123b90d757144981ef20a52b133bd9f8ef09c0eeda704dfda54c4738027f5f004bae9d57001b811275e4d20a16ded50ec81dbd77406d17060a4eb2d90294365bfb36405dea6307c4a42307ec03fe714034b00358fcf44a8345598cb13013794aa52b4cc34faaaa51f5eb4d40dda8b623f5ec2ab6e4fc1d157d986960fa9e651daad44ee47a7803d84e8ce72b001b72c3441ab48c4a32deaa2e9557ae797140d0edc60167fe3940a63ae76a054837dd01208f400b652bc0f42d3280906f371c70b8da8103c6fd11c0e2633ade6209181adfbe005dc10db952ed6ae8b7789f1ac5ea61a645905a73c27af09404c607003bf0f23b01b4e6c1d6808e43017ed594756a49be0b0326f5a767802de76f360e585aec01b6efb59290eba1361c7bb66ba0c03f7d02208ff0aa37406c2bad1cb085b9334086c8ce11c0c261a59aa1496cafe8b5dcaf65c2a14a7ab60034cc91677f0e38d44c2ad5f867a7db060a160fec898627c24307a489cf00c494827ec7013bc929c7d0b644aed494cde04ce0e41580a621b4a7a66c939491f07e1d9033f0bd4bc8ed72a7d60aac9f3920e37f0c286c35e11e60a7153cbc026cdfebc30bc036b17edf39c004f3598f6dbdfc006c988ffe002620ddf9b80426d314d0f284627d2bc0a20e9fcd3b1afb5e23505bd8dce3e21b5030f0dd6b0ad8c5be97582fed06f70ba3a496eb06479105886d034c56d36b404339eeae002d0645796c4b5030d3ba75c02eac3d076cbada027494f4ead001e7e4ed3ac0d08f0d60b674e2f40aa8474da96dde33050c6307ccf7a5635d1163b6ee678094963b0d01394ede4d03a871d094759377835ab24159ddb4b7f04f50fd003abce051e040e518abb6fde0f4b23ed7023273f266003b20e53b03b4b6965400ecdc9e0759a97e505cfc0f09b97783f26ca0c17ec40f80cec686da004da9fba35680a6dc72c07ec25b07ac48bc027a5aeef6dd009fdd95ae0fff64c0d199a10318e7ac9a8f00092d17ad2a578c124bd3fa7903d801e4afb5c07287945e7a2f30144c12bbd903508ea0ba7640a8f3486040447bb61d90943675a096bbea0c50b97cc3013bda4f1c60f9478031cabf9b18c018bc2f0071c1b9b45780b4908034595d9e39db122c575dc6a91d5ff09818604f8002220360af79f8ba26e0ed72fb22e045d7a166c5d84a1ae8d2b215201a181be01ded9303b229fd1d545fc7e12eebca4fceeda538bd6157080c732095b4fe13a8472dc93e7ae9e058db3e9c0860d557c0ac58a649b3db47ad1f5939c2e4d901bafee78015cd5b072cd61f03222a773d76a097deec3860adc07e129b3f36374063d75b02f5a8614a2c4d8e133ba3fb2f05d8f1c0a30c6067ccec48ea716ae749afed002cbde151958b97e9c61a1ad705724be48a558ed88baec35d5780d4841e10e36b5fb506a87efbe880a160174030238c2f0199553f10585e02219bacba246e2d7fbf05dc63fb947e0c931326abbfef00cbd7dedc0570f473f8bd05b0938d9f3e017654c7a3e491d81ebc808225991d02f8b86680d5b773093919c64a3cd817800d493a82a9586635120e9b3ad06031b973c07196bc63f9b7027b6aec61da8de98bc780ca66f3ea84e9e0b0b23dfd06d0e1c1dee7025ef43799cf74685b32329f0009a735de5d3b50df9f040ec863bb05a418e93637606343ef8015de0340c660f1f6076859e36bd491d3a13730e5598db74596d8b189c919c08e4cddbc316007f81d036c07c4a70a96a576b5c096013bb37ceb0fd0da7ab6cc45e65dfde9048080824905180aafded000a85cd06c0372e62ff5afc0f20461155dbd214f6cc7e197547b191f24a3bb0114242d6ebc002a967dfe3600963eb77f00e851dcdb0f816549a4419b0e64e9745fe3b29c34657760809fa48103fd64f10760f21e7ecb4a15cbb31724b111c03276b7ef01e6a16cad012cb16d5306a5f04df04f1f809818ca235fc9d8591fee4af987eab234f00e181a8ae05f0dc80b32dd6207cc4dc7002224e1edba016a5bcd1cf08e7b07c460297a51ea1d671f52dca21a7148b5ce422a8a61faaa96537ae5009256ce55b072cf8b72f0d7d9e45c0a24b653e75e63e532ec4230740c48ec2817a943e9c9c61fa702c3ec84b3f6d43dca6557969e1e02726ec88d7987d536bcdf76401a5f0e289147b0ee802b419e1ce01667808a277454faf2ffa363dfe7809ee1e4505a5896e6072991ab282bdb8852f38ee5fc5e324562cba9b8864615ac4aec1e895f296e958e2c09eb185022d3f57b809d8ebc7eee805e29c3566523b3b86f0e58699e034c93373b80a7d0d84f526cf2b386936a2900a9e513a06252a444f22530114e018d7e121e6d035a24d6c95c54f59840956627033001457aa21eec292771be012a5b3b890036f7f8e127c3f0aaa2ff1c032c6b6f472d57e711dd54c94f03e870f10f3466d7832bc9ea1b9f7567a2e6b36eb66e8e0055c1cdc51307325be77b809a27e275075c92f16b8074a0b55781d2e6d923a97693d8a4794d126bd2ce124135f035ee4b3d8f00d6b61355ae711f3779055839a203079ca3780cb079b6cefe5902c6dbe0c00191ef5f071cc1645f69f5c4d94768a024d6b707e891a9b6a72f4f956cb93345e6a24dec5cfcdf73806def8853801d38b5a7866a53bb04725f06a5cd2cf9696bc30171987740ca16f7e01e50e0afeb38dc0194a4e03dc8631baa8673a5739d5680b4f99103929fee1ca82ef75b0e98f0ee00882a9c69ada068ab92ad199584dc9a80429a6109640c026a3bb424c9829269e791de0da97697daf1f307f261bacc92c10ece1d30577f05a44cdf1a957498769b7b7e09686d14bb0374b4edd58103ecfa9a03152cda37807eb45780be20a74696ae2bc7286e03a8331bc5be00543fcc3446f5496a87fe4b847d6a89c21f3f8092c9fb766d0017ff59a6af37fd08d747005b6e798a0dd849699af0f6c31f7b9bb61c48b595abb002324a877f0ed86f7a658083494ee55bf6a5ad8cb49a59f4754a545287770e80ea9fe964f4010c1665f544befa6c394af211c1e15f00576e87d91c505a80e808d03205cc6602a9eda2f8e01d698c8fbb3d12f8a7412f00768187cfcf003b25e0f653c06b7b7127b04432c1670678e266df01219309c06217c586010cecd61720c1265f518e32a519b488518e0611261221121b44a8272a4a5a57e8d8fd4a93cb6170c5533a51c186f90d47528d0a038870f3de009ed2da06c0ae8cd997d4c799e549ff2d047276fb8433497d3cf89612e1452260020a9a4f0764438d0163665a177303c8f472c7812476fbec80b4d73d405ab2182b998eab5e1192b38f4ac02476a66bee0750490bcf74b5d10a904eb81a70cac8cdf8ce1ac0d2d6d654db65944505fbee000d9ed2c1026043e3c185c0725f9abad829c0366c3fbd022a3c83d18d404e9e74d8b602cb3f59a93d072ad8fd18c0a439d0994c4b507236760460e619be3c03b252ea70695fa9d1f51e790c9e922a576f032a3ca5e0d801326d1c20755e5ad708797365d707c7d2969ff6f58e38b33cb6e73b03b8818767004be37bfc05b448ece241c00554260e547d1d05b5bcc907c728bf36808e5ddf3be00cf74707a4e17c014ae6ead59fc05039aadf3950c1ee25e42449ec168023806dee59ab00764bf7c621c0ae38d8ee013678fea82327c3e8a1baec9e0162b2d4b6df0139c3c94600e0f4dbf08597661c631dbecc01a56d987a005418c754062571957ae089d20222ba2d7c0530f457066897fac8816a7b73e08020c21a20a3a1e20b40ce4f3e4f003557d5d6eac8c9bf66e81da819825d40dbe2d1eb2bc344c3d681e6000b31ee8d009675f3330314b8f83b5f8086e9fdee36a0c37c6e494f9727d8a9e85beb007303377b80b93d2f8f00cbd97c3650d30c0f6adbd4a609419d0a9808c3f81c90e2e59c5e19a019f69f1db0a873e880ad3b910362066f808c41abe12b838195c25439c09be1ce01c66002680c4c1da8ef47b2855962d7cc6eaa5d3297c7e139c00e003db87480262f0015a7ce86d2d3ac28587f69f98a696150bf01a87e30490119b3f945e880c9c8bd0124968c1c48624a075afe93515d87232d015f691b40a19f843b25a02b719da474990b28d807b426c2b9035678e5e5e4832340cbfd01ec6ef43f59dc657c8cd3a3a4b87936c23a6c7c3a90c4feec093bab736b1390307f794d01966ff932035418949729c00e7a4ad50cf930e3e3589a5d00be7678ab2e96bb4ca714bdb4c8950ec05801d23d6606ec24bdd8019b581b07ece2ac0085c5714f1c7094cb1850d15f5eff1c484067fb8046c3c99916a8ca7c183c89c37c00bce5160e4a01be5277061e1cb0bebf8a8f954512db4df029a0b2748f00e07bf05497221dd9dc949fa4b64722fd05f89d296b00cba5fdfb01f49632d23b204c29d52e068561274605885198ed3b030cf36fe700bb8ae368df816afbbe07b0b4e8572a9759c6eecb038013fcc3971a509b31e80ce04cecdb3b6cd1ef53235051c4447a5f11f2308d24094b5d6c19b9c3835d38903ded0e1de04a8e1d60a45f1d546a5b19d8e25f633f3a50f5c79269997012781827005be4fad912181c780e35cb01253d7bcd9eb030d4fa05a0b5b6d567cb6c44bafa214f6496b17ba23e570e7320a6d511c0229b933f070466f60dd00947670ef060ef1db019ae714092de0da0e2893e77804c7f1d10713640b0eb4c67ba2d4f876991fa13a0b71e25d5ae067f8c23b9df01662dbf558ec10b62afc6ef2fc0c6fd23e9699559b6fec115c06e00d95c00ec728a4632ad5c3fb4a97759139cefeb2703b8e7f19f03bde3eec681a4ae34ade5ffb7ea6b98afbcb6238d2f43e7b0d3a2cf0076b5c0a6dce23ab59b37766f00dc7b1fbeaa2e75c6cd1be158e6a21e8c3422ac00943498f093e10f77e3c601dba11e1d700d4fe880b8e5b70392b09e0116fc9b7e3b20d938308006fdb50eb03009a0ad9867034c62671f1a4deb66640aa36668dc5fff2e00966c5c6e02ecb2d25dc9b4490b2ceeab34b9f12e767400b09c2b25950ce58c5007ad9c0d20a52ef73b00e41116878086f9cbf9be03990bdd455136436f4855b95b406f3648634363b53dfb787580d249f99729676c822f01765bc5c61ea037778327d28431ea2f01782eed19c066d1bf3f8096e8d7970ad60ebd94eba17f1c7004e43b2002ecde03ec66eb6703968efcda03b8ef24fcfb06d812f848d56f4d844118382011f41960f1d32a3180a54b361da8e8278503b4f0c6810a36fef70ea25fad03ee043d30c01e9a7bea32788e1ca9aba1b15dde07a491701d60179fdddc02f0a5c24a4ad70e0e09a15fb9c56d33a6f5efd5fa9d59cb705c013ac6a84216b773776353fe5897597ee16b01b0c32a8f761d60613a038cd92f1307dc56a131aa1b269a6ab9f102d0e08f4594d425369e3b20c7f90440e837d096ff25c03d9fb70eb88ef0dc01fee9b703b6cb1d1940eae508d053b0439ea8c68080729890cf3ede011152cfd56ffba4c4e4dc9e012c2eb5a3c05d9fda81fd5b6aca3ecb6c6fe40ec01ca3c34b801d14f73a77c095420f800ef0a221bacfed50e6853cfa7eb05a6a9723ca31d497a2f395e14f5fb9ac1d60e83b0734e5cc404586bbf4a3af08fe85ef4f8084bb169f0e01a6dacc3cfbaae00eaa9aa20f42d667833d406496eec381de71b7b230d5bf78f25f0cb0fb3df6c60e38bb631360e78dff1d096476fceb7a01c8ed9aa60740cffeec9f1381bc62f5fe80270acb2c1f8f04fe098827064424efc4810474b6e3808df4fb067847f5ee403eeeb40720f5b38f4f81264640b1e4314eedc0dccd894066574e1d1d023ac06b03e04298f03810c8634e075afb12286c93627d2760050b4f8f01633ae1e1be031263ef0d7006515b3bd03bee6e1d48c8a76b80b82243f502c0cc337c7f04d41cb8bd7e0068b0eb3389705cdb96086dfdabc683d231e3cb0088f0ec23072406be1c48710f5786ad8a92928b02effe0c3009f8546da3d42e72fa93d4a3cc8e183e7902e424c86c8f01e66e6c6d032ac0eb046067ffbc9602b9ddcca25379aa6870f2d8fd44c18686d213a337800939bb05440c6b3b850376513c19b077bc38903acc29c7309f21a1ecd2006dfbb1e740ef08128141ea18d86f8009f94efd25f605dddb7380c5607fd50cb1f7dbdd39c046b1d719c0253675c0bcb2153011064ad5a8e282f31cc31775d3a12668e1987778f575d7d1724cc771bedd7780affde880bcf1ca01aea43fc14bfb086001c4f2d3810ab67d6ca0e2d2904307e41706808c3ea785f601d835801f568e920b1c8f3601353f99abf5e3ba6eb0c934c3e07daa60ca98a996f7ad93bbf10e48cc8c170e58f0ff01a4d6d8ab61be4a12db3eb8fe06e8006b5702991dfaff1d006c17c5da29c06e823f92a14f86a1513f39bc724017db75403a90d432b1b60d930a104ba6c1fc1e60ed32fe7480b57c3180aeef3f39e09a267b2245a5ce284765fdf63d35c0b5cc019533899d69657505a4529a350e2043a6bacd640558ced7e8b10ca773706f05b00bc67f559774b0529cef7008c871e0b76f0db09476afa2a756b9603e0510c60e742af10a10e78f1cb033e5c18075b1ce0103f01920b339e18dc0a074cc924a800be8cf01023a0764f6c49a03f22e64e807f78c2d11771b0e7058d581b261da845a6adccf96e76949c8d700db85b52363304810115ea819b2827cfe501900cbaaa130b73f00aa1fcc0f0019f6f4f8d501d721270eb8dce6dc01bb279f0039fba21ff61d702c8d7da5b6721c036c0e1450fd7f225c77c03c5b75c97da2b92e9b9ca71ce71054eb00bb21e6575d3d1f063eb27ef5957c98cce3d3f1846f747c7902b07b3298a8472d37fa711cddb3015ca7c9930392c0ef1c10826e1db0cdf511503034fedc1be027cfdb8092ebd42f4f011d5f79dd34808732d5209e0ff694d4269e1844889003070879039023e45bf94145d2d829016ab9653c99bd1a1af88acc2ef73dfe05b4a402bef50ef0a47701968ffb267914661cc3dd0560ccece44d9e52e122bcdf73c006f67d80c560af160610505a3a50c1b6de1c7041f0830396e27f1d9098720f28f9497ee800d7c97ed2d6ace148ea85cbf44ec660396b22fd053078d224d88500bb2335ef001d3194bd0f018f8def9f00ec8cfff52b07b230c73f004be25c3b774033f095ccb28fdfe4af97b9a5f11d5e0362da763b01708b7bb8b66bc0aef3d807e476879d5aae2c6b760ccd28983bf00b03368a7df3136fa8d18f03f2718f00252da77c8715e0894307845d660ef05064e807ff841ba5030d5acb0823565b7dbf4a527ac3ed25c06c50a1775483d526e0fe00b06379d7f9c9e04c30881f000a964a4e9e011d42de535356f98889e6be645ad9ca7b78cf3bbc72f7fb0e3874770f5061610eec890a89e90cf7156001a27740e03f06585076efc100ed72790e6879e9c735a0b7de20ab5db94c2b3edb9426640d38759221c29b18c075d9612e63500f36885cc910601d287b03d8b91b7f2a583d0859223cfe069480d331a0d2e43da83600367b7d4b00bd01cd2b6bef1eaf19206796f45a013836315c97d5ae4bdb6692f18e41d7592af90320f570f4ed804cd913408d6a9f1f3820197de140ef38ce1d303bd971201ba42dbbcbff5f314bd280530f0d259962a56a6fa8a0764028eb11d07552dc4d7db6496da7ceaffa5c93d9bd1a3f2520666971fd1a90e0c3acdd020a9e38bf03d841606787004b265d93809adcf22e361f01762cde016030396aec3071c045e7bcc3a74dfb53408e513a7805543443da024cc8479f808627e2430744bf160ed88d9e01daaa5733a8a11a6f86e0025099d45340d3616154b03665cb7f105c0212bb33f6cd010b54aadc3214aeca9dc6809ec1621bf06f44be006418fab76b805d6a77fc05b06bcd2ee58f2d83e5b85fb274ad1be96f5eea8a3be6b34b89aceaa2830506608ee2f9c4002667ffd301c1ae230712e1edaf036eff790174c4f91fa60ea452eb7b06b085cac95b01bdf40b21d771cd34413daa1dba072dd700aa4ed5b776696a9a72ac1ed5a5636bb97380dddaf527ebd02d4fc65f81dd0660f7479dbc005aa6097ffb80cec03aa0677cd9d794a71bda96c33bd71de82beb3120c255581f3b2065e4d5017770af3b60dc972dec2adb18bc3635c05474d39e88ac135e032c0a37fa02d03d82e90dc05a2e9c1930afaf73a097b65307ccb4ee1db07fff13d05b304336a8abd31ae32875e8bc6dab6d406501e62b006d1b0452dc61ec183144bf012cea349231e853db6692eaa57d36a69b6e6c022cf36fed0f10630b2f67003b607a6d1fd0a01ffba7065087d30860fab179ec80f383ec2b7656f83a3fc96d27e8c10d204283d6c60ef05078a90b79fa02b0c0ffdd9b01bbdd25738008bf0c10423a56df1ffe49f46bfe6ca062098bea0fed4243ad03accf05d706ac57b600b3a7e7ab66a847714590fa6e5320b103d9f35020b5b3c2d33f406997319c0a0cee0607d69d08e4963173bc0648ec26b45780ade19c5c095423ce105136e5002a82190f3b0006f1f0e406d056dce7f90d30112a676205f4d9b31f81e55b5660af77400ce5c500efb8eb1c70a31205abc76ab970ef099013647ade05140df9520702de50410cf086a22e43bba085abc6aec7a9dd8278b12e9059daebfa9d014e3b59bb0670885710d8130de3dc4605b0de70a266180f9acc824c0048882a6ced015274fdef1fe078cf2b80cd81766b40c16d04173c310c8ddc32231d1bbb77719c02386722bc903cc6de0c11051b9ee164b05d07ea1edd97030cecc80177fb6c3a2057d25f4adbdefe39502c787e0a886c850699d6090af38608adb1c3c901a06f58193914181a1bdff216608d1d7480965e99e889286d716ab6df04323f54f51750621c372602b9a535aee70073147f370091b9f815c0b2d3df6e1c10aa78005832c7b73a6154dad91d85d4327289f531c09639a2d601e707cd1d9001f06c8066d0310a2bc052c99a0375b1e30c10031ecf012957e76943ee001a12fce90dd12064a4ae7e1bb5e38ecc9d959f5cc7bebe7f7b05188f29fa0720a557fe150299dd5c7c79e9804d8af70243bb70504b00b0dd716ff6444217db5838e009fb899db2ba5e022c51786dcf01772fcc1d90fcf40428f8ca5ae48055f31b80dd72f746f5f39e43dd75855f1d2f473a0948ed125bbb04d313000b54c164cf012193c6006ddba70ed8dc73eb80ed1de78084aff433406a136fd9e4b869cc9e22d361b626959287b2020465652d972b231c4529954ad28e639b37a4b8c9f2f0e715f8fa73a0ea9f1d1b307bfa06307bfa160362a4fe1302129c89d35f408a63f43632602bcdf695cc02bb9700aeab0c9fdf0506df52addf1f015ac6ca7903e8cd38ca5c2cefc2c683bd3540bb6cdc39600ef4e440ea90ef3960cb1d32ad536bfd75071c04163bd0674fec2b2977d756b23049d35ad8f6d8016d4bd19b9e997840cb0d1d999df552dc348dc61c76bb0db01397e20650da311b53408dc5fd050cde279b035b80399b5a1919408b09de042ccf0297955a07d8a1dd5f6b8094b8e5760ab04366379f01390a93ef0b9890c33276a027ce2f00290da58b3557403fc9771d700097bd34e39ab7537b22af19b4d494e9d0a398159c02ba96c9fb8901b3a723404f170ba60e54b01b999ce50e0822bd9f02594507bad018950dd692d33d42c09876791b03ccffd8fc0264094bcf5298cc1d81949f78f51fcf1c90a13a0364389b69e18010e3be819a1c92b903ce1f6b1c10b5de74a097be8f1d30b37876c06464ea80acdf23405e71c84ae48073486e1c707cf496013e7b60f228ac6da9be75b130e0a54343612d29693bb2a69c3920f74b4ecdd00ae46e8c1e01b693eb529d301ffa0b991937005b3bb99c037a0ef2d95639962b569ccd9000ecd6d09f0e50e3a19cf0d982eb1ac22d9534f7f1657202486997681780d483ee196022bc7b37c04f8e170e384166ee8073d0fc1d34e55def80359c35406153c01703b82c5fc8b4aef8ecd903a0e532db2b6a5bdbf4fef318d0738e624049ffb5dcdc01db29d5e796bb28586d7a07d8d6d052022a06b7871d873b80884eb8990168ec408b6d03b03c8333296e31b42d6b6b6ab96279c5854c4e0288b196e723404286d9fba5019b78df3b6037873d61b741bf450e3017b7005b4bdada0794bc742374803de527cbc33aa4637ca5aab97a3354f7581e45a1a120aa0cd0729f5b0eb8bf72d781aa7f77e74052dfdf0094e8d8e99e03d9a0d901c056355a59fea2c91ad61b78c73012d2facf80acd34f6ed509cba129f5d92b0d27e530b3e0f89305c0ae05b8bc06582ae0b91c81d28df4d52b20a2e5ce4e0036dfdfdc00d8a5a97f170e64834e0055c2cc62a1d97ce9fd363b0320b1a099026c61e8e8d5814a7a7f698066789b396037fa8d0336c319e01ede00210f809fdc9f3b60f5eddf139c933701d41c2b7171ed8028ed21a047833e7869336ef4d28676696c3f722663500d730fe969f409c8489d4dd700768ce495dcd1657683c06e0bb060d7b934799957c072cbb303dcd13b801dc8fe7e002831c11b0dc00fccdd02d8b5cc87b2745569c7d0eaf6f4415e6e933b80d9d39353406119551f0ec8e9fd02d07261b4e580c1731d50d9327aec80da9e1b6066116c3860c9e61f20cd2275c04936370e887d9e38206d2d03d89ad6e9be01f4e353d6b26aec980da5add5cb85430e0499006c0755a0e97dd5a69df4546b27753d9860163055fd61483603fb08b0838cb70e00b66abe75e880e30ba40eb5d776f4ee8055f34d408dc44ea60e08ee940e54f4e3b903ee8e3b75c026818903aeef0c012c2e05fd9e037681670668a8eb0707dc8ab0e180ecc17b408fc5dd90d757379165997c03ec6eb08eda3605c737565287ba8d709deea4858d8fa62395a3c9ecf6f44b19d866309f92fa5504b00cd5ad238035c3c6cc81eaf22ee7aa29ece62fed13af976b7c04cc14ea6c4ca6c1829fb808abb9011aea2e7540cfce1d70f3c6a103362a2580d6d6e63b034c46d267079cdeb0e38008c9ae030e64af0de0f6ac1f033a8cb452bceba61953b08a77b43103dfbdcc459bd8e1e197eaa66dd6338aedeaa56d6e8b4be72f00ce940df7d60005a3d8da11a0b6b9075fc9edd0bba313404750f6efd2002b895af31c40cfc2e196dc9eb6e030b140994c03b04bcb0ed43d964b7a1c8b27e56fbd8b9d8700d3f57cdd01773fdd03ec1ebcd3030744e11e1c90fb456d6b5b05bc480df093d1a7039554973f0fed56e090dce8275d6a770ac719a064145b97b9e832db79b0a16eda0ddd031bb409884959ddfb0394b69ab0ee80d8d61da0b669f53bc012b90e6f012dc671731b603b4236f96c61376dee4680d8e230546e180a690679c19dcb343b71c096aa09c0965aa7af0e38fbf8ce00f3ca76db01d7988f1db036ffe4808d6c73075ceefb0f70a7dfa90336f7fc027afafecebd030cfd8f0102dd2fea1e5d93abb103ad36d57d1a8ff4939b39804b6483502db75cf42343f5dc01918977404ffcf4f3c700d6f2402dd7e796aebe9d011ada65f30560e673f313d099872285e98b081fe6b003d46c633c9661eb6bbb1354e77e2dc5c33877f80ab076d1151803203a1a284771097004ea3f076cddb9764022c6a3014cdfb92c7fdf58b4677bf5d96694b5ec59ddfb1218a6e22ce94580029fee3405d418a5f70b031686aa000d0bdc5bc7005b29dace019633b1752f50d80954176b02a51d117af42230cc1cd8233102d40cd1a30f80d536bb111890ace5f5a703a63c95017e325a77c006768aded82a8fae471a4083271dafac5433f60cc4df33817ccceacae52d2066b0b87c3060a712af016c5ff4f695030e26c900162f3cde00d83935bb8f064c71d71c9081580a0c368823647f1da00e05c06e645bbb00d8f2c2ec5bc02dff9d5a6eec127ba06083c448bfdd358090a73f0ef493e6d9010b6588b08978c7f13b2043b5cbd5a0d544c3fc8580d927c0ae463bed04dc61dd3f073466a4df0096ffb131055856e7d1a940614bcfefc70093d8e9a180d745d7bd0cc0969f6e370d349ca3f8e480ec9fc281da25fe75c07174f60ec250818e3a5e01b2907600098768bcb78094c33b0375a0683902cb9e4aa5628f5a7fab57c65983b5bc528f8af31133bead3b81c2b25d766a80252f6c8d1db0a16e2e50fa0d75d28fb8b20dec542ef6eadf9f3a601eb507b0da265f0e54b093dc01399bff7ec29ed50d0368e1cd890396f3df1c700453e2802d55d465b9835d6365ef80c1f3de80ad13f2d26162c51da932064966a725adcf00ad6d96d467970b432ac7e5232023155009874b40473e7907b476e88c743d19dc40625b31a0e020b0139ea83a3288f665949265df96c4ce00b664131f39608e7cea404d791d1b4084d7cf0e38a3fbd70161869103967d28589312722db61cb0052072c00eeece002fdddf75a0974eada41975b9ec01390df5f6e180f4176950d2961dc1d00250776ce89716a69e6a7e3303d82dbb1b2a479a4516d9ac009ef4fc04b040f7f6b5013b87e406600b431b92479a5784d4ce5f0d30d5d8690406ab8d4ca5748334586f686a078a5a079b0ed813f060c02e52787380b775e780d8d60ec042e1e1b5030e7bf936409f5b9b3950cb3d1f024a9ae156455f6eeee11d67807c841bf80da8c72cd8350e48f55249b33ca58b5d3e030a034f0e886ec4003bf9e9fd1cd0309aaea780de460fc9342b6cbde17a0d90a4c460295895b20bfc720a28d89d7f3711309986d99e03ee8c3d04a0c9413572406ecfa701f3832a07ac04bc3be0b8c20b079c8574eb409f9dfc026c11639c3a201ff7d5404376e916a065047aef001ca211d652986ce851fac98dccf872d94776ec5afed8d2f211844c002d07f9eceaa5791ee1f65c7d0212bac7c5162067c677760aa8b0967bbf06cc75fa0674b80aef6780de26011a3df262cc4c7c6701b0d4a6038db7b90bf9ecd30142be76c00e990b408e3d2dbf0c58cb7d38e010f377079ca516036cf1203e73a079c36203604b034ffb808a3054a1fe52a42d8757dca8724536a25d36f601b6a3fd7a139093efb02501158565109de680d816648e00961fb4f300b00330a62a69e1a3c7e20b6022bc1f010a8bc2050ed8289d196048da7a7580f2ff032ca6cc1cc8d057f684058747bb0e3017b5015c85f6cc814c706b0523f6192849af29d38a0341ca034087d48b7b406f9b37f49532b394a22bc9a3f404bbf337805de8b02bc3561676bad8d68d01747debd401023a73c022d735c016ca76e6004be4da9247bf5cf7e03e710a36f463b5cb4f0230cfe0fc1080d4838710805a06d3d4018d7d65c0266773077ae2e5db81e4a133cb5780059929a0e2a5e35f03fce4fad1814478750720541184aa6d358c2fdcdc53006cee51c87c56d918cfe02c01d42372e0e5c3548365d33b7678e9bf68a094ae2accb01dde01ac036df4004bf53aa51c45c652da4e6580416bf713603b856b75a0ca6dd09d8192eadf6580cadce22b079c95b5e180f8a9ac43d5b61d67315297b6ebb8ed57d5afd37644bf7d30c0926f5e013ab26e2ed51beac1d2130ccd01259731ec6a54af0bdb2fb6b903484939dbba0058f5f70e012d42be556fa8eb88bd2b0ff2b5eb411e34259ff5eadf4d1d30255e006a2476bbe500ef73cf0141c847077a69ffe2801b1d1b0704cb3b4083b7357d73c06eb053038c1e3aa6a7a9db31b18bd907c0b6a7df697edba423ce1b0fd53d9a4193f593eb0d404dbef6f516a061c9f72a05d83ebe738d514d6e67207e6c19c0a01ca9f59bc252acf6f88aebfaf126c06e65da7d0398d37b2ac56d7cfdf6577dee5f58ffb807547c76fe6ec09a320620e4b0380010f90eafeda596087a123a5027fcdc76c067670e485b7b34a0f3600386b5657614c1bf730792d8f58b011bb4f849dbd8eca404f41d8756a937b499ddd7b82ea3b45c8050f52f5f00b59dca7303b0348b73d5b62d2c7afe7e0ab0248a5dde31981cd6924e0cd813af005b0839e48961d628999e95000414c6db0eb8f23207b43846c98601261257c70eb8937ce240026a3207fa6c3977c012c501c082d40f9474e82fb42dd56fedf8821b15bdf34c95e81dc0353c81f6480cad44903a507af600ec64d20b03b96d315307eaf20c1ff7eadb01bee5d40187aa6accee868652631fcc01b12dc57f00ec648e441da8f3eacf5e0104fe832a76406daf0d20e4cbca0123d0a50316ebf71c508ea903ae233c77c051729b0e34697e7804b09a102cee1cb0c5ecc401cb827f0ef03e29693ba2f56bda6518a3381f462fed7d67cacd14d090945604808e41fce611d0db62ac6c509fb7cc3dd6a574bd7b5b3b21c0728cf60e002de1f44b8d51bd6776ed6b3819bc0f3957818ee81a408475c86f002d324da98b8930dc3e02f418a5db03072cea9c3860879dbd946b228389f463f827ea507e18a013be6e0052ce630bde012d49f1e5ca336847c3048f79d495406ebb7d2eb6010d8ed1fba14061a9e65bb7005b6fd899011ac0cd58a0b4dba03f37040611aa5dde2680d8563477000d7a3a3906984c4f8f0026a0e2db00029a6602838058191919e027f58b017eb2d80458d06d7aed80c8843f6187871f0874630cfd9d24b6bcad82eabf005ad4f2e64920b3ed3fd73b808e40d535eff031fb40021ae72931c7dd1e6047631d9d09147682ee0d3f29fa8cd47b9e682cebe6741dd0a174776aa8713bb291f00730b645e153030499ba6f0324b7d41f0e54d2f1950305cb1733408490bbd8812c4cbd6b004d3e5877c0da6b6880149a9b0e1063b64e25a068d064bc1c295d54440868670f60376d1ed7809625cedd77800dc0c72a6954db7c4e77c70da54083c22802208f609600ac72dd8701e241e98303ccf8b1038e29de70c0dea6670354bff872c05e8d1920a619eeecb3b600712b11c63e4bba96d4e3ac27aa70a50e14e731e76b5ffd001a46c2ef5b408b802ea5417131e63cc7cb5740c234e1e40360c7271d6f012a9c9a9d1660894bbbf652f34f9ff889e958f0c04fda9825f0e9990184bcbd6d8086facd1cd09163076c44b972c0b5111d20c118e81eab25e089590a4819e7167340c60d421552ef928e2b62f5d2242d99bde68540969a4322eb901476e5e5ee0850d94eae0f406d47c87e01ec32977d152c296d77cbc603204a596fc800e6e2671a1b12afbeae975fd69595b369e580b5b53d079c97d31840c8934f07c894a20f12a3e50203ccd6ceb61da8e83bb9019af23d7220217f9e016a1286ee54b0e58e1069d0ee54c0e3303b06d84e19e84cd965b158f73893a14fdd839da972a977f5f90520b545ae230326b17707c42ea60e88499f38e01ac075037c4549692b40dafc9d0355ae7a71a097269f0eb825a20010f80fbad2012b9a130704983f1c70978d95b4b29d8ff695d6f293ed273dee860edf6b9717f5b29aa0c6ce323b93a91801227ac3812a97b9b9d8fc01543629fa04d8a9e67b927a5646843a1f3566674b33bd025d0eb0ab26cf0a00120b16f7000bdabf7e1a40a64de980f3c716801c99ce0b07d8e4d001271ded1b6042136d3be0f0ac0d404166e8e331c0a4feae712eeb461d37d3768098e0ceadea92a7dc0a19de4e0176f64f72299055b82c3af56d989a9a31d84c0016ed39bb005448fd90af1476b8c9e79f01acf69d5c85dce21fc1ec4dc0954e374d2c01423eaf1ce8a5779103e2eb147d782ddec5960315ec6aee80f393f70df095f6d68104141d3a2018da00885a07d3dc81be32ba3280064dec1d449cc3732ba965fdea508001d8be46dd87d3e65d449cee46836731f40655ff5a76acc8c7364417809238ffd52fa027fc7329890dee3a63f6d939a0c00fd2315f03b038cc9e04540c1d880cf74b40cc36c6bd3d0398cfb99ab2f086bab805984c475b0e08aa04004418685fe30ab04f2b77c0b94e5f06f84a9b3a607efbe94001e6871e50d272b3cc019fdd77c085eb1f0628fae1b703f22ede017e9d983d61bbc0bf4f00bdd9642ad7658cfbb7aa5c99da699eb97c9832b3c31aae7822cf69cad329c06e33d994cb520e0a822d4c0125aec2c60ec03609ec19e878c79e4c4e3978066c55517f297dc5eaeac50181087ee241b73f7ee2fdf662f67fd97baf658751adedfa627c3eca391c3ae72067fbcc39e7ecabff414c58abbb7777effdd57bf857512e795846e2613209022440f2254050807d1210c601e3501a570b242b671b0764454856807d3430ba382075a58d63221dde98a93c27aaa7258308a678e87d13658a444780ddbaa467dcd6241994aed75de24826c41716ef02ec22a3624080ddc6297330201594e740e5928088ecde3035f6317196bc793a60feb28c0b4819cf1fd876054cec248abb033231f664813847b330d807f2f2c5b0033235d2c561140bec5702a6e2a4b72507a4bd7eb6c07aba9480997d38fd7640d6e19842a877f2917adff8f5a91ba9899bac9cc6a3d2f58a1f04a4a44aea1b91a72aa3642279ca0199c667727f9a9c8bea156341d3992cef08ec8c15ea99d352cd1f1d9089a025076432c7d20229c8d78303b2f353c301d9da77e880eced3212200211ef3b60f468652d90fd2d6b370764f7a88280b9c4119e5a20b67e327e6caa1a02b231ab49cb2c665fac9934656e168fcab07e32246022adadb2c9393dce2f6ded95003baba26f349da5c252804a190b6420a29210601ffbb4520292d254e89ad6c56c3209cbfc42a3d8cc0914fe01b280bd6f81b4d8ca3b07cc5fb2ee2f920db396036610722b776a250ccc714056b61d2d90e72fad82005917cddb58d06c11b6252a2020b5943924c627cf95c79597ec98fa769eb22b42da4f012171d2edb88088b8f19ec9b9f9c43edfef0504c4c429d58d1b9fdba28e27913a0b0a1d1c100b2a0b70c99f5a201664b61cf2818c05571d90b730371c9029ef5b010b8974dd764026a5d93b5dc85f1636d2a5dd29fe6a81acb299c8559ca62313c7221693ee5bc298d442f591cd19f1a300fbcaa9bec9db45626edd8531ba4532222da5b6b1d3452a2ecf2b8b0701f675a66b63300b97fc9d9c3197e1f4c07aee800cfdb61d90458aee0c31dcfcce01793a7b71c0dc69f4ee800cb84f052ceda4929003d296da3b60eacaf5c301590f74764086b2dc5fa47a354b32e78b45504a4373638164d4f52d202c63f4978c03c60a5bc65d2c937653c47c4fc0421c4aded462cb949d87520b0ab06fbba98c1d9001e6b005b2a8a662811bb89b088889636bc81993a98c5cd54d4db89ccea554b64df297aa396a7a6be6018402f68585db8b00eb0c760f010b019db503267189b403d2d590e4bb8cda341c30f932ff01f2b0ad658174139a4b078c5946f30ec890dade0179c563d401b120498bca5bc9ec8e03f20c67e7804c147e59203b4014fd7ee522e872ae7016e0b670bb09b05d8d4ed50179f65a1010930765e58680b83c6ec9da33ecfbc42b5101f6bd6f85ae01f3a094866dd60097966dce015987937440b65ef42cb0ef9e2c3920d34df716c844e1bda47611b212861d3097dd241c907abfef80a981cc3ba77d208f397ee2107f5a142043bff47d9fbc0825ec9eb2e59701ee096f612fc06db3511230b5cf0a8c40a154c856d12301091972ad4404d8e995978301cea4924d039440b20b5e4f804bedc101a96f8f0ec838ffcd01796453b1406cbd7f77c0dcc7bb6d8158e164e780bc5bf0ed80694cecaf02ece8f96eef802cb54f3a20f97273c0e4fe786c810ceeec4f0222523c3a1f0b64b0ab5a15105dc82075dd01e30b8f0d0131016193da706c261b2bf6270624ec4bed2a1d0392d6f8cbc6b4c329fb8687ea5880759fed9780983cf3ac242db0717802ac05959b0e8863ab0998484bdaec08aad4b02e2762521bfe515d6edda96edef6eb0399e75871401297b14022dde72db00d81ad03729580808835ba810392954d07c4e89216c8e05f34e38074debf16c80e433b49ed226a2d190764416ed1028934f0b1401adf81b70059c1cdf52120297da09964c3222560626f7db694d5b5468f4832289da25e4640c276798c738ca88ea64c5b2b0908dbb7976281346aca12a96b8d378202a65235f64206d8d18dc0de14e488537d57754004ca3b20cf4d9f0ec80b1dee1648f3bc1977405e7dd5b04072ff367540de465070405e3c72734072ae26c0e55cc101b9b19403f2aec59fbf18c7b6ba5a2003eeb3a5033284f41610b353355e0e987cb90704a416b2979a494bd43d681f98ab44e3324b9ea8b1e468c26676626681346a5a1b039233695cd58d7788a6dc2cf9a48099d4b7f59801136b1fef9601bae760eed4185dd4693af61c900180a2002be126e58024ffe1803cf7b85b601f0a972c904837721f4ec275c701a95fa616d8f90e770764d144c6017966117140f631ba39602ecbca01534cc7310b24f9ad9c03a6c5b6b2898bdbfb783a60ec74dfb040fcfa6d2b602afd97f3d70199b369ef632e6062f5582ce54d79a654c6e2761641cf54e2b1a45d1ed6343716539e5f7a9e77014969f4564202ec52959271d2fa3d70f270fa29206abb2b5b0b440ff316331f1809d7330136a3562f0b44a079c9017363031c9099b2630ba4644f460ec8d8565740dc5ee566815c65117340cc21e5803187c5d901f1a73b07644cbae980c96cf3604857d012e9e2ea80447a714016b15a0913929698c9a8b82ad9d2425909b0d57cd7dc7a5cf53c657a655b807d83502525c08ed17b5d011329ea35d320894f9311d99ad3f8e4b8537d96b540345d440558c5e6350764357ad5017921eed801696e942c10275d793a20834c7507e4a19f8b436ac248c501d9a22b2ec0aa3eaf3b2025fbe70c59819970c098e52cea80ccbae939207b22742c10e39f970524a52170b4c99f488d9c303e28114f890bee981b4b287f2adb4919af9dd0ef11f5c1a32c202ee5655e11e0d2927440d2927640164c151d9007217107e44d8a370764fb938003d2cf3e5b20cdd17bdd01c9978303261b663101497b630b0764dbe6ac03c6a4a679078c1ed1bd05e23e67330129fb978203a6692dbe30a15f3deac721d549c26543dca42519b7b3d323a67824554e4a6b7c6e40322173034b2d010bbb40c8f842e53ded5cfca58088347a4b6f0176626c2e2cc0eec25bb371d809ba95a08085f4a3ca72d94948220d9ad426b522460fb9d31f4d730e188126210744a0b403e6d6432907cc9d0e4b0e486d3ab440ca5c2deb80bc2126ef8078988303f292f28c009b73939303f2faac9d03b26a31ef80eca6b5b2c0faf5b503b296c75ed63ea2e83c2d905b3f5b81664be9029a5a2cb90c2d658d84296229b7bd67df94db5432267565cb546b29d52c9659d0750111e934378a026632065bef0a581a1030cfd5d58d27e4c6ccd415fd1a5ed134fd70c064f6e428c029b6774096640e1d90f725790e486551b7407ac0dec701d9d32de780b9b167c50119a40e3a208b9d0a02ec9322060ec803bba503f2fea89e03d259b5f731b1ab4ad20ec8ab49ac62f651c9256f81348b4726717a9733190030ee6292b47bb9b6f3029252f64b2b0176a181675a17135535ca1cb48780851deb33e5453f6e90c499e6c6c4195deaea80b9d364d901795056b240dce7abe280b4fa860ec872ca870312c7c701d38f622ec00a942c39200f855b0ec866840307642246de0271f4c98200d9dc95b3057329403d63307a2741739587b9b169ca3ef629bd044c45e46e5c806cf642d39e3193897eb5b080850ca7d78cad4f2776d795a42962d39fc4351d90877e1d07642eedd902a95e7b1b07647434e4802cdd5939209b68d41c30776a7616f481ac6afd3a201b2c350458096331076494b6e980d123161160478be736b57379e07fce0a5848f77e628abaea13881f1b9a368c5edc230b952202c2f6a98669a1cc12767bcf8eb1c259ca6e5fd07c0ab0abd1bd8000db272ca52d90b6653528c0eeca5331963c9bd89e45a72120263d8bb8718e3397516697557f69826cb95c7640e6c04be29c84b1ad03e6b2d1b403e2821d909c7b0f1d902276724022dd08b0d9107d3b60228dad1c902ecfcc0271b0bd9e03f202faa7032671d1af00f7c8e6e58089f49813b0942ee049f4580625f7a76b01e1a52c7830f7318fcb162a444c1b779e08caf3dbb2318779d26ed3933339374fd949e0a58f80897d8fb7a909e74eb1d85a8013e8e38034ae1a0ec81be93b168840ed85033209bcee808c3bdc1c902789650764272c7715a90ac27d0156c270cf02b9ec78e480d1b4187740d6d0941c90e7b7790bc4f5853d014b8974644ad4c2b51de2c6a41689999d7e6b6e5d352fecbac69c00fb6e8e82fc45a96ee2a89b5b5f4ceca4e7ee53404c7a7c1d04a46460a611126037a86f187358cced462d61d3495cb86cd89e1d90aae007c85fba02aca6a1a405124728ee80ccd6bf3a200e36e0804c9b0f3a20b5fadd0119c81c3820ef294a08b0aa872e0e98cb062b0ec84b211a0ec830e5c901d93125e580b4b58b0e98318389bbace47ed0d8a932067b959a03b24d4f5f4048c661a61b015171d293a980d852e6d19b9c5bba72db37b5fa326977c16b9976f252b960e937742d90e66855e298581b6b940458bfde7e0b48c8b3b59a31eda5cb86d05980d3b4ea806ce4337040c62e6e0ec8d4b7ad03e63e261b07642770531a964ec271c00119409c3860246cb71c3012168a0ec836b44907e44d8a710b647c6cdc17103257094c6da42139a37c1110969c3be71d900e6f5b80cdcaa1df645906e351a95e070f031211c9ca685f404c96987513064c42d20eaa450424ec90eb40404aca7ea729c0aed0f5260e18fba89f0c584c640ade7828c066d4786a80137974744026d79e1c90d93f7b07cc55ca5b07647fa9ba0346f5f5d201d9ff34648114a0ced7019396310242f6c60e0ec84077d701e99ca51c90696b47078c62ebb40592b7af9280b0549e23bfdc2e43b19438e958ce80644c0600ba2f0326f6f5bf239373a11fc5520ec8d856d601d9b8b7e2806c0793146013372c3a20a34e1d074ce2066d07a4c5767340fcd8c201d36d5ad42c10d5a715076444b1e48034140b02eccc8c7ecc0173d9fed501790be2de0289b4f67440fc98552c62b783590a982c65999ab9d37032290f317a790352b6fb5630791b9e84e47954bd2f20299eae1310b090e231f00c708af593025ce22e0ec822231c90859f3507649be28303d24e8e39209eae6f81243f527440bc655c40442edbeb38209b34b51c900d419a0ec8c3d89703f2ae7877865cb63976c05cf6bb10101573b87e04c49732bd72eb80cc1b37591949c4a57834aa064c66d6e50c05cc6d85e30958c823df8e494b641ab213a84c418e38917b6d0724b512c78f1e6b07e43d9a550764416ed10179ff4bc682a54ccfee3b20cbe42b02a2124727e180bc7af36881c4617636f6818923f5764096dd4c05c404f48d738c26edc8447563406a214deb8ec9fde8c46e775a2c0ab033219b6f01763e4c3729c0be55d6eb09b0d3b3bdbe00bb0168c3a4363a0dda057512e9d4d640ed8f00db39ab052c90f9851db9ecd2ae08c9ef2d1093fa241c903aeae48058e1c601d9b83725c065c3c50119746b3b2013415b0ec8638eb40326f7af5b0b6c1f79ed8034261a026212697bee8074bcf316485606fb0ec8a0bde4edd24e47be142c58caf46c4f40424ad4a9ea802cfcdc09480a88189163c9886d4cdc04a42cb80b984b1dd5281ba0325bde076cda0eb1a99d375e8d3a20b3e46b0264288bfad8013198ba80883d63e480494b6722202a25bb7610109338bca980949854c7d41e3197b79db30362854d01365fbc8c0372c6cc01e9de3f1d90e646d402c9b9d3dd0111e82bc0e69c9776c044da0c3b6022ad162d105b6ff51d90c7a4920d2a2be5cd70a66e88bb89d34363637a72a989a36f7c723c651d6cc514e4f8c4ee34509538264b71b05d534ce34a75a9f83c01f6dd60edb400fb58b01e1690b23e792a602a7ff14cb327ee34cdc62c90ea245c774024cc0ab012b63c0744c2a803f21aafa90522e138ec8034ad7b0ec83e684307e4c5011101091be9cc0289b4bc7640de8a907140deef11774066ed350524a5261c0405a856bec92893b844d26e9d5635f79150f92283b2a6ed9098dad9d8ddaf00fb2a0e6f28206e27934a1cd38494a8b6fd4bd276de5b025272463d24602ea0694c2ae1346d4e04583d1a470764cef7db01d919ece48049dce5e72fb2c9cad70179bd2b0e8877b067246d33b0e0804c298a3920fb16571d307abc3b0e187358db48539251d3bd0332e9d9fe65b294e6d7cc019961661a9b7aa99bb8cf97809914c2684fc0d23ef631154e3269fb733d9396e4242259d9fc0898d97d15c20216e2fa2a03017630b46beab9e4d48ec2d5a202226241adab80a8e47e3323c0d6c8cdb4006b418d868089adb32702ecfbb4ea41014b3198867139c9a5dd36b1feb24032aa2e89fbc9caa203d286293820af470a3a200579e580d440390129f94be5eb80ecda747240dab86f0193a53ce26c3b6044eedaab4c97329f6ee980cc973267a4122179ecd3378aa552b66b5e380858ca2e232d636329d7a4ad1a77919ada51386f24c0f6c4db1901b69358356d879413a81872c05ca5f21160f5286f1c90f79c951c307f79961d9079d233078cc866b7571f98cc2e741c90356711011389b45076c044babb3b20ef184a3b205552d301930d4f7b59e72d8ddb9aa4e652809a26b327aa7521e52525202a0fdb1a4d014bbbbcd4d8a9ea77cb1c456f6c81148fa22973132750a1e280ec5c7b74c0e45c312ac0263f7f744076e10d3b202fb3ad3a2073586b0ec8f3ca820346a0fc41c0d4461a71401619851c906d68470e9848d71f078cc866b713ede7c4d3b5c60ec8623863a753d5dc904def4c6998269232ea345c08984acb71608a987ee19aec83267f99846d83c4b472544b411c5b0f015139a375109090d645332bc0befabbf51060dfa2eacd2db09ece7818557e6c899238947f95f1b1a90576e2d24c405c3c5da32dc0f64db326b3a72e2b435f07648fee82009b2fdf8903f2eade8003265f3e29076495ded1011369b0ed80c9a8f45ec04c227d0f1c90ed2d70c0446ae628fa409e7b1c1c90b171917039174f577d38200b839b0296028ac6d1cf264159ffd26f0a7023ce6b0171eb2d57029292d93d9351b3a9dd57a1161360a778b72e0266d2b6acc505d8de49eb29602925bb657a38b359d0364723022292fb9db680a8b5a0a080983d6326206ee3580a48884fce189f3c73799bde3920799b74c06443fa20c0e55ccf01f39767d101f397f3c301d92b2beb806ce03775c0dcfabb2b606e232d3920cfd58b0ec883c38203621f4707648dd5da01b18fa703d2a1b90bb05efb9113e00cc65c65aebdb4a9a34c75329fda055355d3df9fcfec9ac46a524048fcba3713603d7f53229dd9564eeb282026e6d034c99fcf8332efc25b09b0b9ff364e69fe930d050744b1920332485d136035bd571d30675c530e4853f2e480f8a08603b267060216f297cbcd0129a65d0764f64fc70193dafc4b8055bd64ec74310dcbdb2ada265f16b3a99db1fb03a4f234ce40cf08909d6c4cddb07089bb051c90fd1c270e88c1ec04d8b49c6f0e485a960ec88b24170e985bbf9c042ce52f97ab03e62fbb9b03925ae3939793b9dd47c028b69cd9b74256111093a1dfd65d801dfdaa472db0a31b1d01f6a9a81712603bbcb58405e2b6bcb000bb4579eb24606e6ba0a30562fccdbc8085f563670176d94db36c8134cf5b26b397f3b0bd8fa405d2d8f43602ecbef8f58300bb56a3f51690b471a42c908e447d22c02e60af9bdc5f2e827660662d40de594f5d445ed8c19dda5c809d015097e42fa36263978b006b1fe7ab03f24a90ba03b2afc254807d4dd3e56c818de3ee806c06547440de28cdff1ffecf835136f0bf8789779f7af7d91fc3dc0f8b3f86a51f56de7ded878d77dfdab0f3c3de0f875fe1e88793773f7bf78b77bf7af79b77bf7bf787777f7af797777f7bf7cf1fc3d786b477cf78f7ac77cf79f7bc1f0adebde8dd4bdebdecdd2bdebdeadd6bdebdeedd1bdebde9dd5bdeddf3ee6defdef1ee5defdef3ee7def3ef0ee43ef3ef2d3f8ff208e0e46d9f1ff1882be8e4b5f292350c8bb877f4913f9a54ed4bbc77c759c40462315e2de3de12b95fc25965227a502010804084c084c09cc08cc092c082c09ac08ac096c086c6dd8fd0aeafc3d8103812381138133810b812b811b813b8107812781178137810f812f8134818c6a05a9ce2981bcea2ca9224da044a04ca0e2a7f47f154782710fd5ff3ad408d40934fcabaafb6efa021975d4bdb6fc54a9e011682b698ced58753a04ba047a04fa04067e18fa6144604c204820e4eba53ec3042204a2046204e20412049204524c601260326132653253ad775579fa42d83059eaa0649aac98ac996cb458932d931d93fdafcf8356539f7354ed13fbdf139333938b0faf4c6e4cee4c1e4c9eff8b3e3f4299cafdf55f8737930f13655631ade324cd24e3ab63a4d9586942da7c262a8539262a6d0526ead64b4cca4c2a4caa4c6a4cea4c1a4c9a4c543c1e9336938e6a43fd41a97f0d5aca9336b7498f499fc9c09752c937f4833a18311933093209f9a79dfe31b63093089328931893389304932493d4ffa2cf4f306d75feeb10603a613a653a633a67ba60ba64ba62ba66ba61ba65ba63ba579d43d5feffdf34fadbd49eb41169335cfa4535e79bdb80e9490b373d33bd30bdfa9f37a6771f9ef4095ae895ffaf7f883fc7f4e1e787b9d64047a23f9f4c5f4cdf4c3f4cbfff8b3e3fc1289bfe63c8d8f0279865aa6e25cfb4c0f47fb72c1d56da22b4347d3f8c989698967d392abe1c079f5499d698d69936983699b6987a4cdb4c3bdaa6a65dffd71ed33ed381e6ea5fbaecf7b4f4ff6c95d3215375d131d320d310d330531561d4de67541f2b1b9fc698c69926982699a67e09f2275932ff107c6567fc0a0166131b02bfc294d98cd99cd982d992d94a24d3791ef64bdc495b969669e0a7ffca6ced97c13cb30db3adf6624a8ed98ed99ed9c13f38323b313b33bbf89f5b5fac1a33f5df1bb33bb307b327b317b337b38f6f92175dcc759cdf7f2bda5d666966196659663966ea2f056645662566656615665566ea5a75660d5bc2d4094d662d661eb336b30e331549cf4f7be06fc2e48feab9609ae2b3be0d0366c35f61f42ba89fc6cc82cc42ccc2cc22fead647c09a2cc62bed16db434b338b304b324b394b63e2de89939cc03cc27cca7cc67cce7cc17cc97cc57ccd7cc37ccb7fe093be6beee73158efec9ea2f27df7bf6fea568eb9aa7ef67e790b9bae285f995f98df99df983f993f98bf99bf987f997795acb3acf30cf32cf31cf4b24735fdcb93a28312f33af30af32aff9c937128dfe18867f2146ab81afecbcfe5f84067375c916738f799b79c74f4c887997798f79dfb756f575a00b9412455999d25489ab74990fb585ce47ba206b59c7cc83ba80cf43beb2615f56bf54aa5c994725aac9eadffd8c72a9f398768e73f5c704f324f3140b5804584c584c59cc58cc592c582c59ac58ac596c586cb5ac8b1d8b3d8b038b230b6bfeaa086a3f536671667161716571637167f1f8831a8be73f69a57e5d3c7d6517af7f0b6f161f165f1669161916591639517691675160e1df93fe5af2cb75525bb1f212aafc2ecaba7a51055cd9e9a2c2a2aa355da884d5b55b5834fc021e956aea5fa55426a9d58ffbb13559b458a8d8da7eb9b661d161d165d163d1673160316431623166116411f24f08b388f89a4659c458c45924ace1f7c5712f922c522c61196039f115f0c372fa13fe49aeb7afec7266c3dc0fb33f8605cb25cb15cb35cb0dcb2dcb1dcbbd7f1f1b6d744ad9e5c177fc155da528db5c1efdcaa7a74d7879d29f4a7165b04a14a5b5b24af5c77f29dab6ba53522ecf3a0f9617965796379677968f3f4a19d0e566f964f962f9d664f961f9659966996199659963996759f07f2ab22cb12cb3acb0acb2ace96c58d6adabcdfa25acc5b2c1b2c9521d782cdb5699bf8af3b7c128dbf99ba02ea9eeb8cf52093464a9241bb30cb20cb10c4b615c4674c296515d4da92a7e19d30e54b90255e4958eba723bf8cda0beeddefc43c8e8ec59c675edb74cb04cb24cb142976e558fad027f50537d5d4d6c98fa9f335673560bffeb92d58ad59ad586d596d58ed5deffd7419baa127475647562756675617565756375b70e41fdfa60a5aef862f566f561f5fd7b89fe36988715e9ff1432acb2ac72acf2ac0aac8aac4aaccafef52aacaadaa6b41b550950775cd777a35c9eca70dd4e584b0fe7dfa51cb26ab06ab26ab1f258b5597558757d157aacfabfa4ecff92d2858136bdd550beaaa2bd1ab11ab30ab20ab10ab38ab08ab2523cce2ac12ac92ac51ad601d613d653d633d673d60bd6b60c29535075c37ac57acd7ac37acb7af73712fd53f0955defff5338b03eb256d738b3beb0beb2beb1beb37eb07eb27ef94d9f16ebb7364cdd903cfe6d334815fcf587f597759a75867596758e759e758175917589759975857595758d759d75837593754babb9f658b7b56aaabcff5956f56b877557d748eb9e9675adc880f590f588f5987590758875581bec3ac23aca5a9d13679d609d649d62039b009b099b299b99bddb9e56763367b360b364b362b366b3f91b95fe36f8ca6eb67f093b367b3607364736ea32673617365736373677360f7f14e31f4bb76e6ffaddf6cd93cd8bcd9bcd87cd974d9a4d864d964d8e8dfab5c0a6c8a6c4a6cca6c2a6caa6a68be7a6cea6c1a6c9a6c5c663d3f65b20bfc4dd74d874b5575519b0f165ddf4d90cd80cd98cd88cd904d9f8f5d526cc26c226ca26e69f10679360936493620bdb00db09db29dbd98f1da8f6f876ce76c176c976c576ed0bf25795fe29f8ca6e377f095bb63bb67bb607b647b6ffd82637617b667b617b657b637b67fb60fb64fb62fb66fb61fb659b669b619b659b639b675b60abfe55625b665b615b655b635b67db60db64db62ebb16db3edb0edb2ed696ffedb60b77db603b643b623b663b641b621b661b64a9428db98d65419affadcc6d926d826d9a6d8c12ec06ec26eca6ec66ece6ec16ec96ec56ecd6e63c50db3dbb2dbb1dbb33b68299458ff41a57f0a7fa3eceec8eec4eecceec2eefa1f74dcddd8ddd93dd83dd9bdd8bdd97dd87dd9a5d965d865d9e5d8e5d915d8a9934beccaec2aecaaec6aeceaec1aec9aec5aec3c766d761d765d763d767d7603764376237663764176217661ed1955d97736ab5af8bb08bb28bb18bb38bb04bb24bb147bd807d84fd84fd9cfd8cfd92fd82fd9afd8afd96fd86fd9efd8efd91fd81fd99fd89fd95fd85fd9dfd8db4a4c7523f70ff64ff62ff66ff61f2dc8ff81b2fbaf8e689f669f619f659f93eb295fb9cfb32fb02fb22fb12fb3afb0afb2afb1afb36fb06fb26fb1f7d8b7d977d877d9f7d8f7d9ab1b1db21fb11fb30fb20fb10ffb9f11f651f631f671f609f649f6290e70087098709872987198ebd2adabaffe1fbcc161a18bbf32c9c392c3ca0f6b0e1b0e5b0e3b0e7b0e070e470e270e670e170e570e370e770e0f0e4f0e2f0e6f0e1f0e5f0e690e190e590e36a5aafa55aef690e750d0e6a5a4f83f5356b915955187a28efa50fae9891fca1c2a1caa1c5492ea1c1a1c9a1c5a1c3c7dc2a1cda1c3419dd6e3d0d79aaa227f18684d0f430eea73cc21c821c421cc21c221ca21c621ce21a1ad726b944a724871846380e384e394e3ec3fb50a267faed694c447bfd5a5ccfcb8e0a8beae745fe0b8e6b8e1b8e5b8e3b8e778e078e478e278e678e178e578e378e7f8e0f8b48532ab1b91c717c737c7cfffadb2ea3ebe1cd31c331cb31c6d661ef31c0b1cd54189639963856395638d639d63836393638ba3c7b1cdb1c3b1cbb1c7b1cf71c071c871c471cc31c851a53ccc31c251253bc631ae053d267c69921c539ce014e034f1c3f46f6555e134fb11f734d7adab93df66507fd7b5d6586b7d5a705a725a715a73da70da72da71da733a703a723a713a73ba70ba72ba7172adda0727159e9c5e9cdeffafca9e3e7f13be9cd29c329cb2bfae97e394e754e054e454e254e654e154e554e354e7d4e0d4e4d4e2e4716a73ea70ea72ea7152a91d701a721a711a730a720a710a738a68a7798a7252a2c43925748daf9a50a7a42ed47ac4a4e77ffe0aaa01abaa7b75f0b772a7b47350a29fe11cd025e03ce13ce5acc89cf382f392f38af39af386f396f38ef39ef381f35127d0b5bdce27ce67ce97bfd7e79f82cc20e07c95471dfaf8e6873be707e727e7971efe71ddeaf39bf387f397739a73867396738e739e738173917389739973857395738d739d73837393738bb3c7b9cdb9c3b9cbb9a7edf4ac621b701e6a733b8f388f3907398738873947384739c77e043dc77f9455cd7e95017f6bcb2ada846ee7aa6aedac428a0b5c025c265ca65c665ce65c165c965c565cd65c365cb65c765cf65c0e3fae560f695eb81cb51a4a96cb4907a79226671f5e443df379b96a78bec9c493bfc8ea07d5f2bfdcb93cb83c7f72f2f2e2f2e6f2e1f2e592e692e192e592e392e752e052e452e252f61b923d5d715f2a5caa5c6a5cea5c1a5c9ad2a7bab4b878fa57d54f55aa5dda5c3a5cba5cd425fa5c065c8662bfea5727ab0a971197b11e06543d8bff68b9da3f0cb904b984b884b944b844b9c4b8a8ab24b824b9a4b8c235c075c275ca75c675ce75c175c975c5752d0317d33bd70dd7ad28fb5b99bf0beeb4896cb771e3bad3fa1a7ab9c9b182d73dd70357db4f551dadeb89eb99eb85eb95ab3a475dfec1f5c9f5c5f5cdf5c3f5cb35cd35a37bf1aaa6be66b50ad71cd73cd782d65129782deaa0baf0d712d732d78a36cf6b551773ddad6a682bbed67cb95b5ceb5a59f579f1f34375a8ae0ded52afcdbf5556f7c786daa55cd5df3dae6daeeaa25dae3dae7dae03ae43ae23ae63ae41ae21ae61ae11ae51ae2adab8757deade125c5524295f8a1d37449c5be0472bcd033fe2de26463d9970253f9b3fabdf14515f752c476e536e33e971a93cb9cdb92db8a98315b735b70db72d37f5c73db7033775fe89db99db4577ff6f575f9d113775c9bb1648f5356f0f7f2864a88dfaf6e4f6e2f6d6e55749a974514d4ead698ddb87db975b9a5b46dbaf33db5b965b4edbf2df292bde76a2db1bb73cb702b722b712b732b70ab72a3715799d5b835b935b8b9bc7adcdadc34dddb0baa5be352395ba01b721b7912f08a2ac96cbffaae54e69b9f44f013ff8e7f827fc5256ce367f1bfb42a7b437b805b985f408a1b9de4d4913e116e516e316e796e096e496e20ef700f709f7a9eec8df67dce7dc17da76ee4bee2b5db4ef6bee1b6d9ef7adf603f71df73df703f723f7936ed8dfcfdc2fda30ef57dd7fbddfb8dfb5d667df42550ead7be24c94eecac6ffa1d920ad85b19caf8ac8fdc1fdc9fdc5fdcdfdc3fdcb3dcd3dc33dcb3dc73dcfbdc05d9d665b992adccbdc2bbe795965c40ab121f08ba77e7f9559833f41d17b8d7b9d7b43d760fa81605e3f327195e6bdc95da5dce3dee6ae12aff4ea71ef731f7057228eb88ff530ca3dc83da4abfe7b987bc44f5594bbd234ce3dc13dc93dc5031e011e131e531e331e731e0b1e4b1e2b1e6bed341e1b1e5b1e3b1e7b5dc01f07dd917d1c799c789c759ee9daec2f823efcbc795cfd712f7f98e671d3b5a56ad26dfd06996a203fee3c1e3c9e3c5e3cde3c3e3cbe3cd23c323cb23c6c2bf391e751d0ae56cbf22795aa3c8aa2e3ef9fecaf327156077d6ac9ff2ceb86811b9e989efc67ce557bb10a0f754e8d479d47834793874a86c7a3cd4369d1e5d1e3a11233e031e431e2a1b408f208f108f388f088f2501af995d223c123c923c5139e019e139e539e339e739e0b9e4b9e2b9e6b9e1b9e5beda0958ecf1dcf3dcf03cf23cf93ef22ec488d19ee52e179d675e3f3c2f3caf3c6f3cef3e1578fbe4b793e79beb4f351fa9abec9f3cdf3c3f3cb33cd33c333cbd32a3b1ff2ccfb492e8a94eaf359f03f8ba298814a40a39e3d4d660ff32ce95375f0ed3f90fb51f6a9d2a322527750f7bd8192a0c1b3c9b3c55325a0cdb3c3b3cbb3c7b3cf73c053ddcd88e79867906788679867846794a74ab34a58826792678a17bc02bc26bca6bc66bce6bc16bc96bc56bcd6bc36bcb6bc76bcf6bc0ebc8e7a68e675e275e675d1455bb9d14d437ffe76b5ea5875ba5e575e375e775e0f5e4f5e2f5e6fdd147b7df41f9539bfbeda41bdd2faeb2ba3c57d6579e578e579157829681dc2b4cc4b850aafaa96480965ac50b42ad803f5979afd5af0e52ec944ed5f67d47935744bcb44fd6af252b7e2f16a8bb21aaa447679f578a9db1df01af21af11af30af20af10af38af052298cf18af34af04af24af1867780f784f794f78cf79cf782f792f78af79af786f796f78ef79ef781f791f789f799f785f795f74d0f0ba8e6c1fbae4760df0fde4fde2fde6fdd2970ca2ae7fb56e1cb3bcd3bc33bcb3bc73bcfdb7f4ea3fcc0bba85dcdbba48d5739fd7759fffd5de15de55de3ade26ff06ef26efdb8dab7c7bbcdbbf323d16fb9d4f1bbcbbbf78b2ba22ccc28fb1ee8df240c798f788f6dbc41de21de61de911f65df51de31de71de09de49de293ef009f099f099f299f199f359f059f259f159f3d9f0d9f2d9f1d9f339f039f239f139f3b9f0b9f2b9f1b9f379f079f279f179f3f9f0f9f249f3c9f0c9fa7fcce992abea34a59d2ad49f3c9f029f229f92f6b69fb26ec029653f153e553e353e753e0d3e4d3e2d3e1e9f369f0e9f2e9f1e9f3e9f8156f3a3fe38d226fc19eb36cc27c827c427cc27c227faa3ec27c627ce27f1a3d227c927256a1af2e597803df393afec37c077a2ffa93ebf53be33be737108df05df25df15df355f3b7cf9ddf2ddf1ddf33df03df23df13df3bdf0bdf2bdf1bdf37df07df27df17df3fdf0fdf24df3cdf0cdf2cdf1cdf32df055f194f896f956f856f9d6f8d6f936f836f9b6f87a7cdb7c3b7cbb7cd5adfb0e517946f5a944f9aa5b1df21df11df30df20d69715533ee98d2cef71be61be11be51be31be79be09be49b220de900e909e929e999365b1595f2bfcaa5a4e7ba879d5e905e925e915effcc309bb6496f486f49efb464e93de983564c1d28c5d4a73a36a26bf57c19f59966be814126a48fa44fa4cfdabd6a11d5dd5c485f49df48db6a2dfd20fd24fd22fd26fd21fd259d269d219d259d239d275d20ad4e2b912e93ae90ae92ae91ae6beb4b37483749b7487ba4d54d77487749ab3bee9356f734243d223d261d241d221d261d211dd586998e918e934e904e924e91814c80cc84cc94cc8ccc5c8b9e5990599259915993d990d992d991d9933990399239913993b990b992b991b99379e8a290799279917993f990f9924993c9fce1b158264b26a76ba01f950ebea6eaeaf93fa827415baa59ba53d0c1d04c914c894c998c6dc066aa64d44dd7c9342c69926991f1c8b4c974c874c9f4c8a85b1c901992199119930992099109938990899289918993499049924991856c80ec84ec94ec8cec9cec82ec92ec8aec9aec86ec96ec8eec9eec41273e7b247b227b267b217b257b237b27fb20fb24fb22fb26fb21fb259bd6ce549f9f219b259b239b275b205b245b225b265b215b255b235b27db20db24db22eb916d93ed90ed92ed91557f1f901dfe0c20644764c764835a255595a9cf6c481453075a345fc06cd8ff8cf8dc2c48505f14cd46fd83986ec966e364ede4866c926c8a1ce4023f0f147213725372337273720b724b722b726b721b725b723b727b72072d6bee48ee44ee4cee42ee4a4efdf74eee41ee49ee45ee4dee43ee4b2e4d2e432e4b2e472e4fae40ae48ae44ae4cae42ae4aae46ae4eae41ae49ae45ce23d726d721d725d723d727372037d48d59256e6e446e4c2e482e442e4c4edd46945c8c5c9c5c825c925c8a3ce403e427e4a7e467e4e7e417e497e457e4d7e4377ee7c8ef79e6b7e477e4f7be70be4af9832866a43402fe1ceb60940d933fda70227f267f216f1fd2e46fe4efe41fe4edb84cfe45fead3be3f90ff92ff934f90cf92cf91cf93cf90279754e897c997c857c957c8d7c9d7c837c937c8bbc475efdb743be4bbe47be4f7e407e487e447e4c3e483e445edd924a4054cf22c8c7c8c7c927c827c9a7284021406142614a6146614e614161496145614d614361abc52dec28ec291c281c299c289c295c285c29dc28dcf55c93c283c293c28bc29bc287c297429a42864296428e425e4f949afa22a8e67ca140a148a1f42394134d09aa0f0e3e8cb813cc8a29759932858a7625852a851a853a85864c072a3429b4287814da143aa26ca14ba147a14f614061486144614c21482144214c2142214a2146214e214121492145118a018a138a538a338a738a0b8a4b8a2b8a6b8a1b8a5b8a3b8a7b8a078a478a27ed348b678a178a578a378a778a0f8a4f8a2f8a6f8a1f5f41f5af2fc534c50cc52cc59cb41694db2de6291628162996289629562856292a5ed7b31f8b0d8a4d8a2d8a1ec536c50ec52ec51ec53ec501c521c5913f2be5ab5d6d714c314831245aa9cf6298a2d5b118fd39d65f238a98057f11f94d8718c538c504c5a49e2a6d8cb498a204a5809ef16a486942694a6946694e694169496945694d6943694b6947694fe940e948e944e94ce942e94ae946e94ee941e949e945e94de943e94b294d2943294b2947294fa940495da2a43b5da53225f559a554a354a7d4a0d4a4d4a2e4516aeba6be52b0d4a1d4a5d4a3d4a734a03494ce556944694c29482944294c2942294a294629aea7e5961294927a726e2945193df5af1ca03ca13ca53ca33ca7bcd0932175ffbe4079497945792d5a29e355411debcfa856590ea2f2b56857f7ff316c29ef28ef29db61e0f291f289f2593f881772a17ca57ca37ca7fca0fca4fca2fca6fca1fca59ca69ca19ca59ca39ca7acee4cfda544b94cb942b94ab946b94eb941b949b945d9a3dca6dca1ac92d7a3dca73cd04dd4f290f288f29872907288729872847294728c729c72827292728a0a5402542654a6546654e654165496545654d6543654b6547654f654fc11d18a0a272a673dbb5489bb3c50b950b952b951b9eb79bb2bf4ec3165c2ea4c3de1b948e541e549e5f517ad54e46f3930725bee2b5bf950f9daf3be54d2543254b2546c1fb792a752a0a20e6cb7af52a652a152a552a352a7d2a0d2a4d2a2e2516953e95051b7d5a3d2a732a032a432a232a612a412a212a612a112a512a312a792a092a492a20ad500d5892ee0f70dd529d519d539d505d525d515d53555c5b7547754f7540f548f544f7a2e78f5acfb2fd50bd5ab9e9f513533eb15b9fbe141f5a9676eb995217ae5c24ecf98d243225d3d0badfad2f379ab6faa1faa5faa693d0975b697c9a6cac8aa19aa59aa39d1ca29668eab79aa05f9551d57ccd31a83f467de0f45aa25aa65aab6e155ad52ad51ad53b50daf6a936a8baa47b54d5525ac4bb547b54f75407548754455dd6b906a886a986a84aa4a648c6a9c6a826a926a8a1ad402d426d4a6d466d4e6d416d496d456ba53bf3a535b53db50db52db51db533b503b523b51533f5da85da9ddfc051b636a776a0f6a4f2d65ed45ed4dede3aff788ea70f22556ee7296fe992525e1286b1ff43cfa8a1eea9ea9cb7df55ce55a9a5a467b033d295add55969a82796a4e2b73f0fbf8f74f05b3b8b240ada88372b2fa9feab844ad4cad227331d53dd5aad46ad4ea52add51ad49ad45ad43c6a6d6a1d6a5d6a3d6a7d6a036a436a236a2acd416a216a616a116a2ad92afe38b504b524b51475a807a84fa84fa9cfa8cfa92fa82fa9afa8afa96fa86fa9efa8efa91fa81fa99fa89fa95fa85fa9dff4c4db79cc9fe17df26782b67c638c8a58bae6e9f921aaed54cfce5bfb212a426b63ccf927fb726b7d07fe64de888e6dfda67ed72d59a5b58a599d537f68575b7ffa7259c574f0bf2ae9aabfb951b6fed25fea2aae8ffeadfea59ea69ea19efd19f0aee7a8e7a9177e11154ad4cbd42bd4abd46bd4ebd41bd49bd45bd43dea6dea1dea5dea3dea7dea03ea43ea23ea63ea41ea21ea61ea11ea51ea31eafeb3f17a827a927a8a063402342634a6346634e634163496345634d6fa89a7aa4bf5ccf78d3e6e6c7c65e3fe32a5903fe72c63edf42b229a205fa336ac6de8f9ab01c6fe8cf3aa9f49617fce7a53cf446f6c356fec68ec691c443ea552e368e5fae86343d4a7fed5ac5a52dfff1c4e34ce342e346cabb671a371a7f1f097a999cec998c693c68bc69b868a5ac59ba691a191a591a391a751a0a1fe58a251a651a151a551a351a7d1a0a1e468d1f068b4697468f8d33a1b3d1a7d1a031a431a231a2afe208d108d308d080d95b6188d388d849e41aee791a77c47e92f85581a15aaba44eb356007ed49676b7feaee46e43606fb63ad7ed08a1bd35ecbfa1e3d797da4bdb0d2773ed4fe5af9f14692468a263403a2a009eab839f903515ffd03b34a7caabf376734e77e50070b9a4b9a2b9a6bd1b1b9a1b9a5b9a3b9ff19bb6c1e68aab84e34cf342f34af346f34ef341f349f345f34df343f34d5e5d3343334b3347334f3340b34559c259a2a920acd2acd1acd3acd06cd26cd164d8f669b66876697668f669fe680e690e6484fc35755b62c8898f83370fdc505aa142b21949f5544cb7df14d78fb17adcbfe4a1575d1b12f77efc7ae45eba8ce09a3efdc9f716de2bf85680669aacfb02f97116ae61fff0e86cbbb0123beb8511f45fddf6234e33413349356d9142d6805684d84b4a6b466b4e6b416b496b456b4d6b436b4b6b476b4f6b40eb48eb44eb4ceb42eb4aeb46eb4eeb41eb49eb45eb4deb43eb4beb4d2b4327a098e4a462bababa3568e569e568196ba50895699564577b85598d6b4ac2db3664c1dd4b4c4caac54e2955bd013f6dbb4ea7edb20a2cd59f9623d1fdd975b4fe4df6b37226b1baddcdac36eac5dfb266cd6f399c5a57a1d534a47de6ad06ad26af98a9910f5a5fbfd5582d984c0d35fcca7092d75731d5a5d5a3d6976b4fab4543286b446b2dab535a615a415a215a615a1a5fe15a315a795a095a495c2032f8037c19be2cdf0e6780bbc25de0a6f8db7c1dbe2edf0f63a85de416be11db5ad2dca5a11ef84a73e2f5a41efaad7837937bdbc5daf55bc692915d10bbdfc5564bab426fdd5391fdd25f5fce6948a477909a548c377c77a89c4491ba092496b1dc67be2bd74c1d75a8f7d8937fec4ff8c547dbac17012e35539a42ee1bdf13eda6c7fe4f28f4dd0e66c7e92ad2abe7869bc8c465e162fa78fbd3c5e01afa82f6c26917925bc325ee5679abc57c553c9aee335f09a782d3c15431baf83d7c5ebe1f5f1067843bc11de182f8817c253498ae045f1627871bc843f7d7ced17bd946fb9bedd79be527a4d93ca9b94bfccccaaa37ddfdd5fd518d52b4c16256dc56db421b7035a6bbd8a6c2272eb0cf8f846ed6bad4c5bc9adff7b16a36e4f7c975af097543cc45de82596d11fe3d5eb5baafa7c558fb5a7be5c26e468cfe440ab97f605d43f3965337f08ed39ed05ed25ed156deb6adb1bda5bda3bed9584ec691f681f699f68ab5bbcd0bed2bed1bed37ed07ed27ed17ed3fed0fed24ed356316769abbbc9d32ed0563194f41224bdec73a88d482f7388f8c9bef92b72ea7af99dfaaab85e0411d316a7e5f05daa363d750365dda16a57f4fabc76559faf1ce2e5a92b741594bdff965bb5a5a6fe1250bd5457dd67cd57f92ccb9f8d9730d9acabb28aadf1fc253eba4ef3cd5f89ab5ce59f446bd7edb170b343cd5c177ffd73c3ff6cea83768bb647bb4dbb6375ecd2eed1eefbcd434394a50c698f688f6907698768876947684769c768c76927682769a7e84027406742674a6746674e6741674967e55747617dc7caa094582a01c6189528ba80dfb5b174d674367e7b60abd551679a42ddd9ea7193ce4ef7a0cc2234d567555a77f6740e748efe3ab4b8eed12ad3564ed9686d1c888a47c77fd185c0386253e9e91a6f2cc66bc49df86bef4cf35985cec9f7936d5fa5269db37f30f73fcd813e36ca36e43cf5d9b9d0b9eae3ce8dce9dce430fcd181d3b4f3a2f3a6f3a1f4bbe74d2743274b2747274f2740a74142fd151c9abd051a2d4e8d4e9a808d54db4e87874d4553a74ba747a74fa7ab15d67a013a92c4b2f211b4a51ed0cf572116d477b5d60db7e7da534d2ea74a482ea8c747f4929db19d309d209e9cf62c33fd8e901ad4e984e44af56ed44fde59353bdfa5469adecba6196f9f674547a61d0d06f1db77c7d77b2765f3bd990ef1982e2a9b4b22ac44547259791ce1d8886175fd94ec20f493a29ffc0ffec4237407742772a8eb53ba33ba7bba06b9f64745774d7743774b7747774f7740f748f744f74cf742f74af746f74ef741f749f745f74df743f74bf74d3743374b37e09bd699b554a69dbd9f92d9ebe5f7b3c74d5acd77fb67d5f39b00bc53b74737ebdbfd0a63a6dd0cd6b1d95e5aab068fa0b7937bee2211d8cd64b756305bdc04a99f6a24ab7a8553697d66b6d6de5a6975e56fddb70c6fbf01db169e70de996e896e9567c0513f633f5eb5807a36c4a876ed50f153fa8831add3a5d75d34d3d895ea46cd1f5e8b67f86c0bb2a915dba3dba7dba03baeac223ba63ba41ba21ba61ba11ba51ba31ba71ba2ac3927453f4a017a037a137d5926959cd7e1823ede0b46b5bea4f6d323bdf9ae27f565677c3c2daf454d99f07e9cde8cde92db46abda5d65a29beaa8bdc4a6523b711baf0d4a3884aeea9e7e7ab5fb3397d4d434d1ac57e8b58378adbda839b8e896aa8f456bf84fa936e027d657bebff1094cdf636f4b6f476f46cefa077a077a46797daec6ef4cef42ef4d4c5d4f19dde83de93de8bde9bde87de975e9a5e865e965e8e5e9e5e815ed10f257a657a155fb2b69f98bdae3db46bf37ba2cab5e97a63fb9f95358d5fe53db5e9294dabfeb2e8a03646b3cebc5713898dbe26f4eabe47f68fd54f0bbf7e93b6da45bac8ce39fce81b96fd2974c66f7d651bbfb46ad26bfd453d51d6a3d7f63f3b7ee8daaf3d7a7d7a037af6715b6f446f4c2fa847648484e885e945e845e9297b89d34bd04bd24bd1877e80fe84fe94fe8cfe9cfe82fe92fe8afe9afe86fe96fe4ed739aa5aefefe91f641040d7e366d43928ca6af8176555ca95cdea05fd736d7d4a5c65bfcaa52afb55e22e2f7a91aa92d558ab7e3cf3d441d9ac2233ffd7fe51bcad9eb8e677378cf1eac8ad73300d12a5acaa0974b3e442ff44ff6cb55aeb4f55bef581e78796f9c957b6afcebeda533bda5a0de9dfe8dfe93ff4308fd1b1ffa4ffa2afeec95662fd2ffd34fd0cfd2cfd1cfd3cfd027dc54bf4cbf42bf4abf46bf4ebf41bf49bf45bf43dfa6dfa1dfa5dfa3d7f857244af36eff7e90ff45e12fda15eb9dc1f4917e8ef6c567155a14d55cc6311b71fd4caeae5f82aab42da3928cbed87b594aaf8cf6e7a06eaeca88f95d00aaa3c5099aa9b0d35697518e3d5e2b6455fd30a3443337af706651011fa512b910a31ab589c7ec23fd0c1281bfb159236a8e314031804184c64387130653063306760371d1a2c19ac18ac196c186c19ec18ec191c181c199c189c195c185c19dc18dc193c183c19bc18bc197c187c19a41964f4ae1b83acd67790d363fb83bc1edb1f14fe2b655563761ed19fca6607ea7e4a0cca5a5c65bf830a03056b5afa415d3b07bd0b88ba13bf425386acfdc342fb043df8edf79895f1ea0bdda4f3a6f56dfb5b89a4fcba6eab0f064d062daba0d3cd7d55e955792c6fdf6933e848d06adae34197418f419f81bf238e483964306260a7270d820c420cc20c942e510631067106090649062986300c309c309c329c319c335c305c325c315c33dc30dc32dc31dceb2725c3835e1f5d7dfbe266191efd7ebdf506ba6def2bab3de3d5af6d86be22118627866786178657862a9e3bc307c327c317c337c30fc32fc3b4ae8294850e33dad51a9fa05ced30abfd86720bcb981f7fed475ced5bfdb1089591fa5a67bf47d764986398178986851fb9dcb17fe02b3b2cfa2276fc03a76f577f1d961896195618da599ec31ac33a43eb6787ea4a2d861ec336431583fa578f619fe180e190e188e198619061886198a15221ca30c630ce30e12b9b6498fa5b65f5d4ddc2bfd8ac526a04a300a309a3a936584594b2a399dea8623467b460b4d44fc0462b466b461bbf6bb7f57760686877a19455f59eea56a8c8554759797ced76afd24f331ed60c65a8db503e77b465b463b417b944342397254333af6b74f095ed323aca813e3ee9afa333a30ba32ba39b4839ba3352b1bb45698abc18bd197d187d19a519a9a46619e518e5191518a9134a8cca8c543aab8c6a8cea8c1a8c9a8c5a8cbc7f51f63f7b03f398ebac0bf2a8cda8c348dd708f515f977aed04141f301a6a6577eac6468cc68c828c428cc2da578e228ca2dacf6a830de95a547b95b55f08ced26070e33b2274559e5f8c628ce28c12a2980e27ada10e49ff53dba551f6c818c601c613c653ffab3b98319e335e30b6bd83f18af19ab13fe62664cb78c778cff8c058fde5c4f8ccf8c2f8caf8c6f8cef8c1f8c9f8c5f8cdf8c3f8cb38cd38c338cb38f7df29dbf48be440caac4aaa92495538e33ce30263750f25c665c615c655c635c675ddaf1d37f4f955753f4dc62ddb196931f6f4d09a6ae48ddbbad29bfb2e42ef6b33d25bb5a87230eee8c84d5006ab0777b6d230507732ee32ee597dfafee7f4976e135feb83afacd6d484817fd2c01e0f198f188f19071987a427360e338e308e328e5965e38c138c938c53042118203821382538233827b820b824b822b826b821b825b823b8277820782478fa776fa04c4c19697348f04cf042f02a3d54bd618d22378277820f5de4953f0d3e09be08be097e08aaaf6982195d968359823982793da2162c102cca435c9d6173dda2a87db54398ef749c7a5d465f5a63262868f66e52cea1a2e22969a182655f2ea3d5e09786fac057365821582558d32858f743c32765ffa726c116414faf32513a06db043b04bb047ba26cb04f704050a57c44704c30483044304c304250252346304e3041304930450842014213425342b37ff106ba777bf1c7096bba960fcd092d082df5031b65984a05655fa195362be54355e155a55e0fc18c08ad096d086d09ed74a90fed75b3347490d142551b878ef278510fc25e74bb42dbecc2cfb39dd4932e288975c3d9df4f48f987d0499b9ad24789a85532ea55ff785cf7950d9d05852e365cfdaf57fff846e84ee841c8fad6d08bd09b906dd286be84d2843284b2847284f2840a84142f112a13aa105251d508d50935083509b5087984da843aff64b3a12ea19e1651d5efaa3086fcd1135d054508f9abe45565a20a7868a8ed4e3907d3fc0c2959c78482da45844284c27e934b5d3da20d56afb928eb41899d9d7ba0875ffdbe9c3a2d14d5c3927a4438e07bf39a0c459aa03719f21b0f6d959c98af4cfcd7e7d54ae77f0d568cb2091f257d6a823b563c4518c201c2f6394d784a784678fed3c70d2f082ff522ccf08af09af086f096f08ef09ef081f091f089f099f085f095b03aff4ef841f8f99f6d36ec376f4b49ed01c26f3f7c087f09a70967086709e7fc319739e13ce102617fa9c6e42c033aea385cd223b6aa520a9709570857b53bd691d408d7ed232f1555c377e541df96f7fe46620b6de3aa2a336aea51983f853ee126e1964814f67c89123ae863a7b5d9713fdc26dc21dcd541fd21dcf3bff6f581fe3a20acee7544d8b661032a8541c2a19f0d4fc261c211c251c231c2ea7aea32ea8f292210091099109912991199135910591259115913d9fc0765557f21b225b2d335bbf292913d9103912391139133910b912b911b913b910791a75639f2d23e745a22f2f60bbbff7030f221f225a262c810c91251a7e5b54b8914881489a893cb442a44ccb348b36d655d07bdc3dd4e6b6a36c352e6acdd6ed70ffe9694911a91baaf4fc7d7aa274269adac6ee19eaf6ca4a1834272d091af26449a445a443c226d3d90a8a554f7aacee9fe340f3a4aa61e1175f280c890884ad89848904888489888122b4a2446244e24412449244514a281bf78037fda9aeae94627ba351a9d129d119d135d105d125d6941d5a73e38115d13dd68a1a35ba23b5d6545f7feb380b23c65513e317ad01d87e891e8493775a367a217a2576da7d11bd1bb1e6d893e648b41e50d5423418f4c5eb5a62a184daf7e3f42b988a5bf804b291b7dfed2a7f123971cf4889af906d137d18fff69c2579fa188f98ca68966886689e688fac389d1825e22125507769ad742a5b3aca7a247951c55a2eada75a2eaef4da22da21ed136d10ed12e5175d53ed101d121d1d19f6d5685a88a39a81589867c41175abe68d80fbeb8d108d128d1981fe24413bec42a2489a674933386ddb537a4ebae58406baa6c3f36d16308b1a96ef0ea06724b6baa5cb9eabfaabe6c6c466cae07c974c376ff63aaaad6d29db7b3b47695cdc616c496be321f91550be534fc10533769e675c5d65abed846823ede0a915377c4d49d1d88d9678bb113b1f3cfb8edec4bec42ec4a4c5df84eec41ec49ec45ec4d4cfd5dfdaa62cb10cbeaa199588e589e588158f1cf361b2b112b13ab683f1babeab2afd5dce84f751cab11537f6ff8a149ac45cc23d626d6f17fea6a9563bdffafbd2beb691e48b6eff333ee792fb1245e344f10028140084b08e1cdfb16b6845d9aff3e75ca7696ef6346bad27dbc50b2caed5e4faaababbadb6d4adff9a81da0fa7416ba7784b53b25f4ea0477efa928ba3362aa439f8e8ddd07e9ee48d75c8678870b482b586b4ce9b655165823bbd748e1267414c1aff6b63efba8bbcf2eaf68763bd2edd60f8cafaf4a8e74b5d29e74fd064a47c48138ed98c690509c489c589c449c549c4c9c5c9c429c529c4a9cb9388fe23c89f32cce8b38afe22cc4596ec96cdae12c8cc2eabc5154a9529786e9529c77713ec4f914e74b9c6f717ec43910e7509c9e3847e2f4c5396ef075b42603714ea90da81676c439e3d0a4b0aa9fe60cc5d13817e28c68bdd1980dc4b91467ccf1cab9a2553bd1fa5f5303505a1d3bbfb1222943fbef947b6915d91a1caacacb0db88a96a991756e08a85e9d5b63ecba49ce449c3b71a6e2b413b52a0bce4c9c870d64b50dbbe2ec89b32f4e471c4de588e38ae389e38b2be242dc40dc50dc48dc58dc44dc742db36e266e4e2fde2dc42dc5ad0c591baf145c774e40dd47719fc47d16f745dc577117e22ec57d13f75ddc0f713f29cbee97b81af3870a5161d501ca3d10f750dc9eb847e2f6c53d16f7843eb13ab5ee8026b07b4a23447174cfb856e60e39cb536b80c47c39f7dcce22cd1b64dd0b43b663b875fec2eaa6c6d3907547bc712fc9f05a334ae396b912f75a5c8d73cb7723ebeeef4ec4bd5b9f2be74ec5bd17572bfa20ee8eb85aef3d71f7c5ed88db15d711d715d713d7174fc483788178e15a66bd48bc98adf54cb772f46f49c152f1f452f132f172f10af14af12af134d5a3784fe23d8bf74270bd57f116e22dc57b13ef5dbc0f5b70bd17ef93ce5bfa444cbd2ff1bec5fb11ef8096997748f5aa56b38ab0dabc2aad91275eaf71f0e8922dccfba84c7e0744d63b12af2fde718b955103e09a0c594fcb1b3441cad4b74de0d878cd4e2b3114ef5c3c7b9351c78733adfa687db4a9a769c704d4bb12ef5abc1bf16ec59b887727de543c6dde4cbc07f176c4d3387be2ed8bd7d942565d03af2b9ed3e8019222e58aa74df529adbe880ff103f143f123f16322eb279c8d5503c04fc5cfc4cf29dd7e412d318b9a0370fd92e2391d70eec6afc49f8baf0935c367fa72fe0b7d36b546e8e07588acff6a07b19a2aa889f23b32f376c2151645b64166d08046f4c6048db784ae467620fea289d7d0e99af848af4bf1b5f6efe27f345b665443f99fb61dca90f5bfc4d726fd887fc0d793fd43f17be21f89df17ff587c8da0a5683e67e20fc5d7f65c883f6a6664fc4bead99399f8e346b7d6ea55c9bf12ff5a7c45e456fc090d06ff4efca9f8f7e2cfb818c3a504c5e841fc1df1774df3fe506fa880fb7be2ef37b339338dd011bf2bbe23be2bbec2e7f38b0dfabf47cb171298f7acae77680b13b9819bb7108f9a69b6f445d504b5813780c46bc46a9436a0b3cf13d939a7fa6cc5189f6edf66e0019805a4349955d3e41952addf7dc60978c0db2378d0963ed21abc8287b52cc12325dec117ed3fc1b79abf61af57826f21f61a6453220b396aed8166e002dfd93a06dfcad1da5f81e6ee19ad02ff0e32e49c77e39256d48cc908dc487ec1f1cdd53ae8ed25fbefec0132562f19dc68760d6e2ab9a52f77a2994c28daeaaad1cedb21a3bf166778bf5b553b6adc84c4768473ada10217f8d216a535d38246dc6a64a7e0d4ffb47d36b5a8f7769d59f8d4a67176c0d9143b7996c7f9e8a37dfe8c6b64d5f4efca670fb41b74c0526deaf3331efc0b8010888018488014c8807c2db3a71aa700ca16d93dd3b025500173e011785252a70078065e80571a52b1b02fd71a703ce4d4cc42a32d8025f006e8c8a6d70f4e7b87b7c027a0e02af30dfc809e64cf1623dea18644e79528abc376bfb035e08b767e6b8f769b2a9391ed5f1a69257bc0518b4c6a4cdaa2b462ee37916d097de0b8096c982914380c0005a0dd621f6819437ad92b64710e5c006a36ebf512180357c0357003687b26c01da05969b633e001d801766b64813d39d108fb40c76cac776334cfaea1a31e41b706d7c8053c2e04a89fa6d2aab0721fd184f6ff29371d013ebf3ba2bf66102008a91f1f46046bff10418420469020481164509b577ddfa97a3d4f50cda64c5cd8ab0a390d2fced83ed36851bbaddeeba8c806256556516a4124051582b9d123410b2a43b6097d327a36be6aa9e69fedfa82e015c1a279db37e82058721a69856cf086e01dc107824f045f08be11fc203840a0ede9213892b1b6aa8f400b3e91a19635907882e0b49659ceb6ec3f51600d5965289ec11902b59ce626b02b705d0e65c910c1b96db83b371b6bdf76d3bc699f4570816084e012c118c1156da65dc5f19ac6b2476945708340074c8da915b883fac43abef95adc3d57c9543328b2f40b349f19f7a3f3b30ef5dcc2358207043b06c8530bce530bd19a6a6477db18bbed757723b06a993d04fb20a0f59cf7917610f02b24931659178187c0e7476ab4eb8701c21061843046987012e43693fe27c21461262307618eb0e0da6d265caf4dfa86ec5e3b3fb04764c3126185706e8fbaad4ee8227cb4fd714fecb3aa079add76f679943b4df54469854653fe05dc1637977b2d7a817089f04d49074084ef083fe4b68f5045e11ee11737ce4cb47adf8d2fab63e369cc83cce347db217a4364c31f6a832da05a0a0f56181ab2e1a185f6dac74708fb0ce4b587f0d842f4f604e100e1299a9740d4e8bb045787ca06d9f01cfa238723841a3e467805d6e36625d42d1dd186e7c9eaae30b236405b35917857a1340dabb02ae877d4064476aa2eec862a68156ea8a96c73bd46e02659db60ab238cc60d1f10aa4dfd81509bb387701fda9175dc0fd592d71aea8fea22f410fa88446642fd1fa9de9870c19c1b4112f368cdb5e5d690a49931a8372e4e2f118586c931e18aa216b19e61f86c213d43368a19a4d04409f9fa56f9d5b566a21451862847b43a01f71e7ca9a73d3a4c8ddc6af9178edbc4a16fc2193f45443b20dfe5b86ba63ee3074415d56b27b7a9ac4c3a2ea2392235a1de106dc92c2765f63f388945a75395c039f839916f4e1eeefc207a41f44ab18d16889688de684274cf10bd1b881f469f88be54843902a9efa02eeff2990bc0b727b66c93f36d937ae650db4825bbac77f222fa46f4d3c042793286e0d6401dd8987452237b6094181d6c5f0f9aa8bc3d44a4298f10f5edb52b9eaa80e818d17f851227ed26ad9e5cebaf3240748a481b3944a4705c703a4a453be24208b41328b2dd5b9b5ed1c863736ab5cf569c37d8df125b445788ae39e6e828aaf2556ffe565e6d06ef0bd10da25b4413447788a68814111d36b5e729a6fa13aa2faea3829ac91ead0519aa65c2f5a149d29a71397fb065fded8dbb665b9f2a964885740fd17e834c0de5165c9d9ad944b68bc8d920b70df75ac6e7d7cfd46a8a03f0e53e4ed4228e10c7bfa019e56aea42bbd5e129e214718638475c202e115788e7881f113f1171edbf5cb9e3ee78c41455c42f885f955472d57a45bcd0e188935b9b7ab6b9ba88974c95be7264579f6aa699bc71988ad5a9d943fc81f813f117621d4eb57475224e106b5b76106be57b888f6884c57dbebfcccf405c99c0ced6c88eca661f6a38417c8c58930f0cab169ff8d478d740f356e819b2f1d916a6f110f1b93117e49bc073468b47882f118f11db51be6a5ec4d7747e76aea90ab4a7c437886fa1237e7c87780a86cca0dd3cd696ec22d6a6daab01d37043a227f6fe8a6df5d1b6755c02aad26a928bb883b88b582be09a19eb6e1a092db81e625fdd337ef34e8d747f4cd32a099084489489912448520efd893a66732479836c52202991544834f091665c2db09c2bb0e5f1da4cd6ce943c2179a6694464bc06a52d41dc849554237bde50f262cc05c533b15c92450bab85274b246f48de917cd49e18924f245f48b4ec1f240748b4ba3d244748fa488e919c2019203945720635929273fe067f0938545776b5ea23249748c6741092ab0dba4672439d90dc2299fc3194add42e473ffa66f71ca0923b330914eb29927b2433243aa67dd17a8d3df114d09d06df44e3548d1eb8b3d7c8b9467bd1a817b5e75460675d247b48f6d738ac990b42a428d7d0f1dac8a5219b742cb463806a2e8e5d5debfee7c6775af290f8fc1662da9e7ca25d2c0d90864823a431d20469aad61fd20c698ed43e0cf21fbf387588b4445a219d237d44fa84f419aa1c3c5701b5b91863d442d0ce9e2ec4d5eb92c6ec96d7d0920c90be217d47fa81f413e917d26fa43f480f906a413da44772fc4e63963ee0bb519f86577a8cf4844b099bd2aab02aa9239b6ab6a748cf0c4143a386a5c68ad78e41b468426ad0233b1711e990ba838f8d7ee56b263d477a817484f4b239764ac77a5743c648af905e23bd417aabea09e904e9dd6f68d2843040a748ef91ce903e20dd41aa49f690ee23eda879db20dbd9afc145aa453b344e5357c1ad976afe34c2524f659660a50b8a6aeaf35398ea426701b21059842c5633801a001e7f832c419622cb90e5c80a6425b20ad91cd923b22764cfc85ee8cd67afc8166b40fea64db81a9449866cb644f6c61864de8df9e0e3ecd3c89e36210b645fc8be91fdac5f135513da99213b407628c7c7ecf2bf02faa299f4c4b9b7961c21eb233b4676824c8b3b4576866c88ec1cd905b211b5adc9ac2d7399f06697c8c6c8ae905d23bbe1ec4ce3e6b622ac32abea22539a70d4caee904d9169715ab707f114ac1df11438056b0fd93eb20e326d91834c33f7283199cf8f92e6401ef0563d23b67dd9809087a4152635a67504656a7c1b183f348e219b474d823a31d3b719e9a35588465099cd63e409f21479d668c93c475ef025c75f015df8e25d202f9157ececf91cf923f227e4cabf207f45be40aec5bd217fb7fc3f906b4dbe6a4c917f23ffb161ed1df901e551fb7834694cb1ee15f243e43dd31215f223e47de4c78435d78a0d909f52cfe6675c3c3fd1c021722d42eb33427e897c8c5c73b86eb1bb31106e36a0b8d968fe728dec1638b76bdcd6e8bfd7c8de58a49b36a3d535da606e5a9a20d72a4ef9fec27f356391dfcbe50ef21925347f40aefc2ef23de4fbc83bc8bbc81de42e1b967bc8fd7533b4b585d802ad3efd21b29c9a713917a6e016017b7a11a28850c4281214298a8c8016398a82b0aa922d4a1415e5b798a378a469553ca17846f162dfccd5db57140b965e2c375a17aef91ae5e20dc5fbfae99a6f892135ca8652f151a7adf5ec398a4f5213f5cbae9f4c53d47274b3ceb1d03afda0d0161efe8ea98a73d1437184a28f425b7b826280e214c5198a218a73da6dc50585b418a1b8b452c6a6c1cf9b12490aaeb6f9a646d660bde5ec81bab96a5a158a570ddfd410bc3703606a70cfe81d140f2876a813d4e42a7639a19e8c51eca1d847d141d145e118a69aadc7466db6b1ae4f1db8c58f3740b0c0c26fe3fb04adc6900c63d632eb378f99deb70435ffd55c730b6432dfbe8a0c9401ca90072faec7a5679411cad8067ae5139429ca0c658eb2405912d0b2a22e2be7281fd9a4f2c944d56f0a6daad8f2a566f2c21d05dd7394afe26a65baf51a17f028fe35a7c1ca058dd6724903ab7ce310a7666ca9693f507ea234e8cb6f1a00e50fca039487287b288f28a76c48bf6ddd57d3eabc6d3e430ca3bcad4f0d4e73bbc264bc9d76dc322b6495ca6303ee18e549d33ce5578feaa70d3fa0e895a7766efb1b4a6de190037d794e355a5ea01ca1541cc728af505ea3bc41798b7282f2ce84b4ce47dbac49664de6f946714da177281f50eed443bf7455587aea89a1dc154fc76bcd730fe5be4d33069cc32d3b66c00694e5b28bd2a1e40629b8ef5e7f6017a5b706ee6ffa355ca1a86bb5426315ad81ebe4f74c4a3bedc4da261c3a98f863ddce5fa86fd77b0e62a56f5ff2d691234015a28a50c5a8125429aa0c558eaa60a7ab4a5415aab941b999c931aa47fe482cabbfae401d21b7ce513da17a46f5c2715f0654056a7239c74456872f3fe3c2816a861ad97007d52b0731d5b3d582925b2d6960556fa894ffd82abd2e94286c873735f1d795fca3ceeb1c3613cab6707cac90ed6fd0766c32d3365c9af0ea13d517556df58deac7e8806ab43a44d5437584aa8fea986ab43a4135a09c6e55ab6f217daab9ea14d599dd4e510ddbfccf9b084afab4ba4035e22242f7d296bb17e2e92f7729ce0167c288ec25dd5fb5b7d472e0e4d68457f589d568adc6a8ae505daf0bd5cc577cd3a8ba475e36f5d46b1d879187dba2306cdb325937a70ef92bdb165966616d5b517ddb14336d88b7035437a86e4d2a27a8544034e63daa19aa07542a38bba8f6b6e2b33c69206bf21f3495504b43152ea30d9b826a949b764ead384db58faa83aa6b3b0a5ec5f95c235b399c8725b2d766932d50e90fe6712db2f2a9f4d5ec5e57a62d85d90ead4ac3b6518316b8e956fcba26ab380d7f6b2d3299d3c09adfc4b09cd6c84eb768856c4d7334543f221f601e621e611eb3cbcf13cc53ebf5376daf9f6ee5b0c9ff4175b6bf96fe47aa7986798eb91657422e68bd8653221b964436b035cce8519c1f2e379c6add2acc15d6c7a6ceffab0afc1d327fdab89db3a5bf66b291d690ad1fac105cdf3eb333ae6eb7f27ac1fcd5c47397cc7cc1980c5f1a81d726045b69ff085c3d5266555693cf467dea540c7fa3853f7fc7fc03f34fccbf30ffe6dcca5c35d29b9c2d303fc0fc90bef2bcc71ffb3fc277f6671d5675feb56e9badf83bb7cd90b6b644f6ea4dfe9ffecfe97ffef5cf7ffc1b920e8074</data> + </image> +</images> +<connections> + <connection> + <sender>btn_Exit</sender> + <signal>clicked()</signal> + <receiver>tb_Main</receiver> + <slot>close()</slot> + </connection> +</connections> +<tabstops> + <tabstop>lb_Main</tabstop> + <tabstop>KBFXNewsBrowser</tabstop> + <tabstop>ws_Main</tabstop> + <tabstop>btn_Default</tabstop> + <tabstop>btn_SaveApply</tabstop> + <tabstop>btn_Exit</tabstop> + <tabstop>btn_Help</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">qstring.h</include> + <include location="global" impldecl="in declaration">qpainter.h</include> + <include location="global" impldecl="in declaration">qimage.h</include> + <include location="global" impldecl="in declaration">qpixmap.h</include> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgmain.ui.h</include> +</includes> +<variables> + <variable access="public">QPixmap img_button;</variable> + <variable access="public">QPixmap img_themes;</variable> + <variable access="public">QPixmap img_fonts;</variable> + <variable access="public">QPixmap img_style;</variable> + <variable access="public">QPixmap img_tooltip;</variable> + <variable access="public">QPixmap img_search;</variable> + <variable access="public">QPixmap img_plugins;</variable> + <variable access="public">QPixmap img_about;</variable> +</variables> +<signals> + <signal>KbfxConfigDlgButtonChanged(const char * name, const QString & path)</signal> +</signals> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="10" margin="10"/> +<includehints> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgmain.ui.h b/configdialog/kbfxconfigdlgmain.ui.h new file mode 100644 index 0000000..ee5fe64 --- /dev/null +++ b/configdialog/kbfxconfigdlgmain.ui.h @@ -0,0 +1,24 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgMain::init() +{ + img_button = image1; + img_themes = image2; + img_fonts = image3; + img_style = image4; + img_tooltip = image5; + img_search = image6; + img_plugins = image7; + img_about = image8; +} + diff --git a/configdialog/kbfxconfigdlgplugins.ui b/configdialog/kbfxconfigdlgplugins.ui new file mode 100644 index 0000000..81db2aa --- /dev/null +++ b/configdialog/kbfxconfigdlgplugins.ui @@ -0,0 +1,390 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgPlugins</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgPlugins</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>660</width> + <height>217</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Plugins options</p></h3></b></string> + </property> + </widget> + <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>KbfxSelectPanel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Select KBFX Panel</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KComboBox" row="0" column="1"> + <property name="name"> + <cstring>KbfxPanel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>44</height> + </size> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Plugin to configure</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Plugin to configure</string> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>44</height> + </size> + </property> + <property name="text"> + <string>Please select the panel you want to configure: </string> + </property> + </widget> + </grid> + </widget> + <widget class="KActionSelector" row="3" column="0"> + <property name="name"> + <cstring>KbfxPluginSelector</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="availableLabel"> + <string>&Available Plugins:</string> + </property> + <property name="selectedLabel"> + <string>&Enabled Plugins:</string> + </property> + <property name="buttonIconSize"> + <enum>SmallIcon</enum> + </property> + </widget> + <widget class="QLayoutWidget" row="3" column="2"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxConfigurePluginButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>&Configure Plugin</string> + </property> + <property name="accel"> + <string>Alt+C</string> + </property> + <property name="toolTip" stdset="0"> + <string>Configure the selected plugin</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Configure the selected plugin</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxPluginInfoButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>&Plugin Information</string> + </property> + <property name="accel"> + <string>Alt+P</string> + </property> + <property name="toolTip" stdset="0"> + <string>Information about the selected plugin</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Information about the selected plugin</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <spacer row="3" column="1"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxConfigurePluginButton</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxConfigurePluginButton_clicked()</slot> + </connection> + <connection> + <sender>KbfxPluginInfoButton</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPluginInfoButton_clicked()</slot> + </connection> + <connection> + <sender>KbfxPanel</sender> + <signal>activated(int)</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPanelSelected(int)</slot> + </connection> + <connection> + <sender>KbfxPluginSelector</sender> + <signal>movedDown(QListBoxItem*)</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPluginSelector_movedDown(QListBoxItem*)</slot> + </connection> + <connection> + <sender>KbfxPluginSelector</sender> + <signal>movedUp(QListBoxItem*)</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPluginSelector_movedUp(QListBoxItem*)</slot> + </connection> + <connection> + <sender>KbfxPluginSelector</sender> + <signal>removed(QListBoxItem*)</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPluginSelector_removed(QListBoxItem*)</slot> + </connection> + <connection> + <sender>KbfxPluginSelector</sender> + <signal>added(QListBoxItem*)</signal> + <receiver>KbfxConfigDlgPlugins</receiver> + <slot>KbfxPluginSelector_added(QListBoxItem*)</slot> + </connection> +</connections> +<tabstops> + <tabstop>KbfxPanel</tabstop> + <tabstop>KbfxPluginSelector</tabstop> + <tabstop>KbfxConfigurePluginButton</tabstop> + <tabstop>KbfxPluginInfoButton</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kbfxthemesdata.h</include> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">qstringlist.h</include> + <include location="global" impldecl="in declaration">kstandarddirs.h</include> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="global" impldecl="in declaration">qlistbox.h</include> + <include location="global" impldecl="in declaration">kbfxplasmapluginloader.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgplugins.ui.h</include> +</includes> +<slots> + <slot>ChangeForm()</slot> + <slot>KbfxConfigurePluginButton_clicked()</slot> + <slot>KbfxPluginInfoButton_clicked()</slot> + <slot>KbfxPanelSelected( int _sel )</slot> + <slot>KbfxPluginSelector_movedDown( QListBoxItem * )</slot> + <slot>KbfxPluginSelector_movedUp( QListBoxItem * )</slot> + <slot>KbfxPluginSelector_removed( QListBoxItem * )</slot> + <slot>KbfxPluginSelector_added( QListBoxItem * )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function access="private" returnType="QStringList">KbfxListPlugins( int panel )</function> + <function access="private">KbfxSaveSelectedPlugins()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kcombobox.h</includehint> + <includehint>kactionselector.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgplugins.ui.h b/configdialog/kbfxconfigdlgplugins.ui.h new file mode 100644 index 0000000..40153d9 --- /dev/null +++ b/configdialog/kbfxconfigdlgplugins.ui.h @@ -0,0 +1,157 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ +void KbfxConfigDlgPlugins::init() +{ + KbfxPanel->clear(); + KbfxPanel->insertItem ( tr2i18n ( "Left Panel" ) ); // index = 0 + KbfxPanel->insertItem ( tr2i18n ( "Right Panel" ) ); // index = 1 +} + +void KbfxConfigDlgPlugins::ChangeForm() +{ + KbfxPanel->setCurrentItem ( 0 ); + KbfxPluginSelector-> selectedListBox()-> clear(); + KbfxPluginSelector-> availableListBox()-> clear(); + KbfxPluginSelector-> selectedListBox()-> insertStringList ( ConfigInit().m_pluginsLeft ); + KbfxPluginSelector-> availableListBox()-> insertStringList ( KbfxListPlugins ( 0 ) ); // list Left Panel Plugins +} + +QStringList KbfxConfigDlgPlugins::KbfxListPlugins ( int panel ) +{ + QStringList _plugins; + _plugins.clear(); + bool _not_present; + QStringList::Iterator it_available; + QStringList::Iterator it_requested; + + KbfxPlasmaPluginLoader *_tmp = new KbfxPlasmaPluginLoader(); + QStringList allPlugins = _tmp -> scanPlugins(); + delete _tmp; + + for ( it_available = allPlugins.begin(); it_available != allPlugins.end(); ++it_available ) + { + _not_present = TRUE; + if ( panel == 0 ) + { + for ( it_requested = ConfigInit ().m_pluginsLeft.begin (); + it_requested != ConfigInit ().m_pluginsLeft.end (); ++it_requested ) + { + if ( ( *it_available ).contains ( *it_requested ) > 0 ) + { + _not_present = FALSE; + break; + } + } + } + if ( panel == 1 ) + { + for ( it_requested = ConfigInit ().m_pluginsRight.begin (); + it_requested != ConfigInit ().m_pluginsRight.end (); ++it_requested ) + { + if ( ( *it_available ).contains ( *it_requested ) > 0 ) + { + _not_present = FALSE; + break; + } + } + } + if ( _not_present ) + { + _plugins += ( *it_available ); + } + } + + kdDebug() << "Available PLUGINS: " << _plugins << endl; + return _plugins; +} + +void KbfxConfigDlgPlugins::KbfxConfigurePluginButton_clicked() +{ + KMessageBox::information ( 0, tr2i18n ( "<p align='center'>Not Implemented yet.</p>" ) ); +} + + +void KbfxConfigDlgPlugins::KbfxPluginInfoButton_clicked() +{ + KMessageBox::information ( 0, tr2i18n ( "<p align='center'>Not Implemented yet.</p>" ) ); +} + +void KbfxConfigDlgPlugins::KbfxSaveSelectedPlugins() +{ + int _selectedPanel = KbfxPanel->currentItem(); + QStringList _plugins; + _plugins.clear(); + int it; + int _num = KbfxPluginSelector-> selectedListBox()->count(); + for ( it = 0; it < _num; ++it ) + { + _plugins += KbfxPluginSelector -> selectedListBox() -> text ( it ); + } + kdDebug() << "Selected PLUGINS: " << _plugins << endl; + if ( _selectedPanel == 0 ) + { + ConfigInit().m_pluginsLeft = _plugins; + kdDebug() << "Saved to Left Panel... " << endl; + } + if ( _selectedPanel == 1 ) + { + ConfigInit().m_pluginsRight = _plugins; + kdDebug() << "Saved to Right Panel... " << endl; + } +} + +void KbfxConfigDlgPlugins::KbfxPanelSelected ( int _sel ) +{ + KbfxPluginSelector-> selectedListBox()-> clear(); + KbfxPluginSelector-> availableListBox()-> clear(); + if ( _sel ) + { + KbfxPluginSelector-> selectedListBox()-> insertStringList ( ConfigInit().m_pluginsRight ); + KbfxPluginSelector-> availableListBox()-> insertStringList ( KbfxListPlugins ( 1 ) ); // list Right Panel Plugins + } + else + { + KbfxPluginSelector-> selectedListBox()-> insertStringList ( ConfigInit().m_pluginsLeft ); + KbfxPluginSelector-> availableListBox()-> insertStringList ( KbfxListPlugins ( 0 ) ); // list Left Panel Plugins + } +} + + + + + +void KbfxConfigDlgPlugins::KbfxPluginSelector_movedDown ( QListBoxItem * ) +{ + /* save current selection */ + KbfxSaveSelectedPlugins(); +} + + +void KbfxConfigDlgPlugins::KbfxPluginSelector_movedUp ( QListBoxItem * ) +{ + /* save current selection */ + KbfxSaveSelectedPlugins(); +} + + +void KbfxConfigDlgPlugins::KbfxPluginSelector_removed ( QListBoxItem * ) +{ + /* save current selection */ + KbfxSaveSelectedPlugins(); +} + + +void KbfxConfigDlgPlugins::KbfxPluginSelector_added ( QListBoxItem * ) +{ + /* save current selection */ + KbfxSaveSelectedPlugins(); +} diff --git a/configdialog/kbfxconfigdlgstyle.ui b/configdialog/kbfxconfigdlgstyle.ui new file mode 100644 index 0000000..df866a9 --- /dev/null +++ b/configdialog/kbfxconfigdlgstyle.ui @@ -0,0 +1,505 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgStyle</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgStyle</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>622</width> + <height>467</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Menu type</p></h3></b></string> + </property> + </widget> + <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>KbfxStyleGroupBox</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Please select the menu style</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <spacer row="0" column="4"> + <property name="name"> + <cstring>spacer4_2_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>53</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="0" column="2"> + <property name="name"> + <cstring>spacer4_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="0" column="0"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>38</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QRadioButton" row="0" column="1"> + <property name="name"> + <cstring>KbfxRadioButtonKbfxStyle</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>KBFX MENU</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <property name="buttonGroupId"> + <number>0</number> + </property> + </widget> + <widget class="QRadioButton" row="0" column="3"> + <property name="name"> + <cstring>KbfxRadioButtonKdeStyle</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>KDE MENU</string> + </property> + <property name="buttonGroupId"> + <number>1</number> + </property> + </widget> + </grid> + </widget> + <widget class="QGroupBox" row="2" column="0"> + <property name="name"> + <cstring>groupBox4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>KBFX MENU</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="1" column="1" rowspan="2" colspan="1"> + <property name="name"> + <cstring>pixmapLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>293</width> + <height>334</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>293</width> + <height>334</height> + </size> + </property> + <property name="margin"> + <number>15</number> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <spacer row="2" column="2"> + <property name="name"> + <cstring>spacer7_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="0" column="1"> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="3" column="1"> + <property name="name"> + <cstring>spacer9_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QGroupBox" row="2" column="1"> + <property name="name"> + <cstring>groupBox6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>KDE MENU</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>5</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>pixmapLabel1_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>293</width> + <height>334</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>293</width> + <height>334</height> + </size> + </property> + <property name="margin"> + <number>15</number> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer7_3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="1" column="2"> + <property name="name"> + <cstring>spacer7_4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="0" column="1"> + <property name="name"> + <cstring>spacer13</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="2" column="1"> + <property name="name"> + <cstring>spacer13_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> + <image name="image1"> + <data format="PNG" length="92583">89504e470d0a1a0a0000000d49484452000001260000012b0806000000735a2e040000200049444154789cecbd79981cc775e0f98bccaceaeaeaea6e34ba1bddb80f822040108728922078811c5214254a322ddb5a6b24ad7578bc92bff5aec7df7ee39df1ec7edfcc78f48d67d6b333e3b5bcf658b24589926cc9165792295a9478481429f0024f80c47d74a34ff455ddd5756466ec1f794544665537204af4672248746546bc78f1de8bf75ebc888c8c14bcc5e9a5975e8aaf77efde6dd56ab57ca351a75c9eabaf59b3ce7f0b49bb9c2ea7cbe92d4ad6a5543a76ec188d460329e54ffdefcffeeccf84e77937f9beffee13274efce1c8c8c813e3e3134fccceceddf5d3e075dd069585f9375b5e97d3e57439fd1c927349b5845803acb8d4463dcf132fbef8e2afb9aebbe9631ffb98e3baee1d4288eee9e96911c14829ff79b95c9eecececac5e623312380d2c5e2a9d97d3e57439bd35e9921c9394f2ff04fee9a5366adb367bf6ece99452022084c802bbc7719c5b081ccca5a48694f25ee0279758ff72ba9c2ea7b7282ddb31b9ae4ba552e1c489130868033a7faa869d65355dba54fc52e24a798911e1e574395d4e6f69726e3b7020b062d7e5939ffc149ffad4273301abd5aa00ae1542145cd71dfcf99279692997cff937df7c33b6632b719700244280d462b1205fbd8b2e2461910e92911480f0526f4704ff870865463574d0a4ede5a62634aad9fab5502951e0854e630a57f23793448d8ee4466b2fce3689ce906354cf6444ad234184309250f00a8122ec0cb9247fa64c96ec781d346a2fa0a6455d5317d3d26ca21a8668451378d984f250095b745a4b191848b37420d28e5612485b5c02eb208440ca01a0cdb66db36e0ef838305028140a9ee7de2ba5ecac542a7693e9d7b293effb542a152a950aaeeb6a659665512a9528168b58d625adcf03f0d4534faf01362639d9345f84da5d12fc9b9f9647c1cf8cce9426fe8c5a12caefcf58e03f4d133f55dd659bd125b672913ef56721e65638339c530d187390320ffc8510e2da8585797cdf579d81f0a1dff525f30d9fc9f906a7e66aaccc5b1721d0749a9898e0e4c9931c3d7a94c9c949cd31f9be4fbd5e677070906ddbb6b173e74e7a7b7b9bad43354daeeb3adff8c637fe3b504f3857c612455a593e3da34a7cdd5cd029a4465426a3ff9b563340976e6769125ad6ce8e199ae743c4932ab50c5893ef2cbc994256ee35d00ce147516c4294126166c127ad3769314d6326748bd22c9a5bd44ce94753dc4d706921753afa9599d5b2956bd932904d4b8cbc283a6d0593ba7b01b8cf414a01f422c4aad3a74fb3b0b0407ba993e1f93a73758f999ac742c367d1f3299717189aaeb2a7b71086c2179fce9c39c3a143872897cb944a1d5c73cd4e7a7bfbb02c0b2104beef333535c5e9d3a7397cf83067cf9ee5d65b6f65d3a64d17dd96eb792b1275159a1e079d23f4d13f25c1305304d772395c47f6207468299b8f8eadca92cecd0208e9933260250ae9c3305d864805e0938e176379a8bc2bf29009eb013f329e8712c913a58a2e60b55469408679ca14570893169390004885d798306fd47ecd040d1d82486b451a3294ab50f3854e666607a6b42dac996e4518a29222107e4c9b815af3e71111e175134d37504450521175a02531bf1164dcef690ad489a2487196e63dba09bb33bc35ec047a01e1844552004343e7a82c2ce0b59578666c819a176942f0d39032b31b97937cdfe7e5975fe6f9e79f67ed9a35ecdc79353d3d3d789ec7dcdc1cd56a0d210442083a3a3ad8b367378383831c3d7a94071e7880db6fbf9d7dfbf62d77d15c114468a4e6d81e5b5c6ad04d4fa7a3b50a698c234bc4bed218aeb45ba36edc845696d5b9c955b036914406a9a842ea3c2b3595b9bfea30483b27b2af63c14983d4943f92097c0ca6470a32763c06fda680cc4b5586dada8e8ce94a4f157486d4812b763251bd983f692cc918864dd20fba18a235b870c545a8b40bcc7046a733a5b14189d47354c8a823cc7a91df891dbb895deab4265aae0eacba2f08cc4773f51a55592b976a5f440e30a24524fd2f05024bcaa48172b9cce2e222b6058e154cd78445ec3084252e690a27a5e4c891237cf5ab5f657e7e9eb5ebd6d2dbdb4b5b5b1b854201c771989d9d61747404cff328953ae8e9e9617070808d1b36303737c7030f3cc0f1e3c72fb6e15808e932fdd2f4eac9a5692cd9701755d6a43c6d8fd2286de1e82e2aa94ad38a908c0293a46675d2de30becdee8f66085aa426e251db489b7e33bcd230341d345d2bd1ad56bd14dc87b05a814cd791e9320d40a6e990ad9457adde921735dfa05e9a4e07535499989a9a8b36e829536bc3c9692bcbd55a8d3367cfd2660b3a7222888845e08c8490e1afb898153b00c6c7c7f9f297bfcce1c387e9eeee4200f3e53233d3d30c0f0f73ecd831ce9c39cd7cb94c5b3e473e9f0724c5629152a9c4e0e0202fbdf4127ffee77fce850b172eaa6d19095126bd2ba58c8522953c553044bbc843a1491969455216294a7c2d950623c147b7eace7445cb2218143893cea80be3ffa4f22b157a939af155cc91ca0b0a4d6aadd83a62c6121e0c9c2a9d092c0aad91cc956a32a14f95a7fa9fca3ba912a50fa2dc58dc7a7f24f4a1c16876acf57104a7f753366de8f4ab7862b6a5dabc22079d8618b7446b29d1274377637dd3ff453a10f3a04a49d14d4db7d53e54fe66b99544ec49ff2baaaed196d24199b4a2eaabd9426217124735c85ab5ced1a347b9edc0014a799b899a17f8a0e00f425817bd08ed791e4f3df514dffad6b7e8eeee6662629213274ee0ba2ef97c9ee999191e7dfc47d45c8f35ab07717dc90ecf637e7e9ea9a9296cdbc2f3dcd8b9dd72cb2ddc77df7dcb6bdce8504dde4a46ac244ab8aa2a6f522590b0ef87aff00981150e01beef212c2b511cc2b9b3a2e451e419e09048fc104de2eca594f8be0c6f453ce94a1409acb03fd40715be94e04b84154d963446755e8ce153e350b322454e328d339882a9b012435a6905d49ad6909ac5465545fd4d1c318932835d9d57b3cf5546625cd19cc3a42d9e8b64d3929e6e663827054e574715572247ad3b44baae4a9256a28767c9dfa6241bb6d0ca3999d435695bd397ac7ece08bb64c89513732cc1f35c262626104057dec6b12da44ca6c39193ba18d7542e9779f0c1073975ea14bdbdbdfcf8c73fa652a9d0d3d383ef7bcccecdd3b9762bed9dab69089f99bae0c5175f6666660acbb2999b9be3e0c1834c4e4ed26834f8def7bec7810307e8e9e959b2ed0c15d44a92654219f217adc849a52c8097a156168b45fafa82c5fa7ab5c2c4c4245836fd7d7d4c8434ae5cb91229617a7a0a61e5e8ebefa3a390637e7686a999398465b16af500ed6d6d4824735317982d2fe0036ded25fafa56624997a98949166a754050eaea61654f37d26b303e3e81eb7b0c0e0e3275e102d55a9dae9e5e3adb1d26262668b87e12d4264cc43a25b405d5444ac9e276760f4b92e54ec546e21585643d456f37ce50165153f061b9c40cc823a516c1a2b081b6f90309a99020624308c60575d136665e813396c84448ab14a9169a5a83940aafc9482784594bc630a98578852e5514f162799aa40c2924ab4ea9abc8f4a540440f4c087420cd975468046d8151987893c15128f4c730d1202204490faa7291d86bd7af73a42f3fe1fbfe5acff31858b58a03b7dd86b41dce2fbaa1230a14ca6b34989f9966a060b375fd9a25a3a74aa5c2134f3cc1e73fff79262626a8d56a341a0df2f91c1313930c4f4cb36dcff5dc7bdf0779cf2def64dfb5bb68ef5cc98b2fbdc491d75e65767a8ac9c9495e7ffd75868787a9d7eb4c4e4ed2d3d3c3a64d9b28168b4ddb765d97871f7e98b1b1b18b8af25aad67bbaecbfefdfbf9ddfffd77a9bb92bbeebe9795b919661624fffeb39fe5b9e79e6372f2029ff9cca7b9e69a6b78fae021ee7aff2ff3de7f72032bfb5773fb1db7236747999899e7df7ff6b3ac5dbb96c17557f28177ddc0e1c3afe11756f1b14ffc8fecd8bc86cddb77b3ffda1d9c79e308d68ad57cf233bfc515fd9d6cbafa1d8c8f8f610bf8833ff8030ebdf412b9ee35fce66f7d8675258f236f9ca0e6663d83fbd9a6b4dcccd5f074b6bac09c5ef8bfc8f6948c65a2585efa2991fd7c7b61992983a75674bea9f2d4108b2cc4c302f197d6e0c020575fbd835b6fbd957beeb987ed3b76506fd4293a168e00f0030f1ace36c259c492696a6a8aa79e7a8a871e7a88b1b1312098028d8f8ff1ccc16738373c8237780d63bd7b383e23f1a4a0e25a9cf73bb9f2c6bb58b56507af1f3dca134f3cc1f0f0708cb75c2ef3d24bc1d3bd73e7cee1795e531ab4758674694691b90a61ceb725f97c9e7aadcefd5fbc9f23474f73dbddefc7711c3a3b3bc9e572d8b645b158a42d9f63f0caabf8c0fbefe6e0b7ff862ffee5fdbcf0c63c1ffbb50fd2d1d14647478983070ff29d87becf96abf7d0d3d7cbfef7fd0257f5e4f9fafd7fc917bff437f4acdfc33d77bf93f5eb06b9e5fa6b3877e228df7fe8414686ce603b36a55227dbf6dec2673ef561865ef8015ff9c677292f36e2f1471abcc5ffa4999f219be5e4c573037d0a17e5a5eb446b4bfad4429b3828f5b2e94fe09bb161ae2f65136e4c47d2942aa0929444538dcbcceb0c4a1590a5e4dc4277d536b2a6e81a9c21c9ccae6ca62fd9928a24d23c35e14d553f69ca2c28f4a5c4f98f7ff01fe9eeeea6bb7b05f54683d1d1512ccba6dd1674e42c6ab52424c56249a7343b3bcba953a778f6d967a9566b9c3b3744ad568bf728351a2ed75d771dbff06bbfc9438b9b797832c7582ec7a42571259c9ab6e8b17a5977d37ddcb8f71afeeafe3fe77bdf7b245e4fa9d7eb8c8e8ef2da6b873971e224dbb65dc9f6eddb59bd7a35193bd79505657d844ec2e3b400b5c7f0241d2065e05cdbdbdbb9eefaebd9b8692343275ec4f73d72b91cf7dd771f5353536cbb721b875e3cc4ba951d74176c5e3e3789efd5193ff93cdd1ffa344ebe1d292577dd7517d755040b13c3cc8c8ff29e4d7d9c9d1863bc5cc317e7294f8dd2b7690fa71ffb5b9e3ef43abff4f17fc62f346afce0db0ff0f83347b11d870fffea879838f4777cf3db8f305bf5b1d4c7ee192a123f2aceb26a7568549f4b1b6b2b99c8a5f9fa4396e36ffe18bcd97d341190265c3cf5c07cd2af80b5724e1af14d4ad38e48aa4251f52a8527db30355e2ed53909653a144169ce4990da57908167393959c3834a87ae4b666ca5cb47d53d99051ed591e06cddba35b8ad57589838c6ec6b4fd1eddcc1ca8ddb29e62c2ed43dacf8c95cb86d4069484daeebf2fdef7f9fa79ffe099393938c8e8e70f4e8515cd7c5f77d8ac522b7de7a2bffeb6fff369d1b76f0d0d353e4a4cf68ad9d89511f4b80acd639519ee3c6419b0feebb819ea243b95ce6bbdf7d1808a6874f3ffd34a3a3a3747474b069d346eebefb6eeebefb6ebabbbb534c464f0f6267635aa9299370735bb24660ae06405b5b1b1bd7afe6c5a7ff9ee70e1ea4a3a79f46a3c1b7bffd6d4e9c38c19ad5ab716c8b91d945e6eb3edb56753236bb40f7daab59183f86575f440878f4d14779fde404ffe50ffe37bafb06383c3cc381c10e56146ce6ec3e8a5dfd8cbff12c0b1746f9b33ffc7d3a7b06f8f0477f9ddbef791f3f7cfebfe2b90dbef9adbfe7b67dbbf9e887dec717bffe10738b6eb8381e4b20e121e2afd9aa8c54d61ee2cd9a04bb3391b16797643d98958a1aa6e51a2c8c246d27d069f878b521ac974c4ca3d0dfe0411b850d12421c326ecb584f8c603248576ba580e345d7503c442b30e6da19715eda79e9eb34610719cb7432e13b5a1093e0a7d6a9542afda4ffb20422a362a1e5e96427f28f9d703cb227a4ebf855479fb61b937f29151ea442b2884f17908c3cf27f33f4c81f333e334fa9fdbfd0b7713b1d8e8d6db9f1960147081c4b662865902ccba2a3a383bebe5ec6c7c778e38d37181b1b8ba75b3b77eee4d39ffe34bb77efe6f4e43c76a346bb9da7202a74b439e07bcc7915166a0dbc5a0de975b367cf5e3efa918f70ecd8314e1c3f812f25f57a8dc1c101b66fdfceb5d75ecbbe7dfb686f6f4fd1a33e71501eb8a515c470f2b12299239a94f8becfc4c4040f3ef820b55a1d2160f38a3eeaf53a8b8b8b542a15aab51abe940cbdf13a0f3ff2236effe087587776822bb7afe56b5ffe5be6e6ab341a0df6eeddcbea0d552686cf509e9de187dffa16577de243fcca473e42cde9a2367392ef7ce7c76cd9bc917bdf7d1767ce4f221a655e7cea793cb741a351e7e5a71fe1d00b87f8adcf7c9c8f0bc117feea3bcc57dd446d234634dd517832d77c4ca1348942b2a603e90a59d9e608bc44b4a2fc689bf6520408326936da8e8d247b3ed39492ecc13d9b97f8af46925483ac748371f4a53e1935364baace43664dbd9addeb6599ba1d17e875a2c5ff382b8ac464135b52286faa22615bc2e441b15127baf416a67167471035981d7a1da4cf8abc45de0e6a08405a929c259a1e7b695916f7dc730ff7dc730fe7ce9de391471ee14ffee44f78eeb9e728163b78ef7befe5a69b6ec216821a368bf94e568a794ab9766c214148ba0b82aaed5271ba7125e4f3396e3b7080f7bef7bd7ce10b5fa05c9e67dfbe7d7cf6b39f65fbf6edad5837926250eae8644a459b6e24b1a1243847eaf9e79fe7cc9933f8be8fe3d84829191d1be35ffddeef31323282e3d87cf94b5f0a6ab915bef3d7f77368fd5a3a8b6d3cfdc4239c1f9b0461f1fbbffffb148bed80e4b1bf1b6374e2029ebcc09ffcf19fb076cd00b67419191e62ba5ca1bde2f1edef3d4e7b5b9ed75e39c4d0d9211a12fef5effd6b868686a82cbec167ffdd597ada6d5c57260a14b32512df140fca5203430afcf8a997390266451a4d0c3bdaf640f2b4253b093d58c81a79b55721c2e1428d1c62da02472394276bcaf3d63882916a04a0922d93ed196a2497d40d2c40738ea6af5746eb24ca517917dae0a8b21b901514fa427d3aa70f13916403c7a04456115ea1cb04935545acd290b730e953b9555f5131f94e251993a8475f5209fcc2be4f0847ed4f1fe53ca6d215fb71f26dd8b51a0b234791ae4b8713ac35b952620b10b6206fa34d159aa5f5ebd7f3bef7bd8fd70e1f6664f82c1bd7aee0c08d5753c883ebb908df63659b4f67638aceca14337200cbafd3539fc2c9e529399df89e87dba8d35ec8f38e77bc830d1b36727e6484ddbb77d3dfdfbf240dea6639a3a08568b3469a246f7676969999692c2b59cfaad56abcf1faebd8b6054230142ed6db9685d758e4f48963a1f28b60df91f43976ec788c57080b2bdc7f343f3bc9ebd313480156b86fac5aa970ecf5d7891eb106f9f0fa1b6f605b3642c0f8d019c620ded794bd07282d82c40464a2b82aa4404326536b49a6f854636a3566aa38d379f17dd690da24ea50a380667f917a9dacba11edba0166c8308da009a4893b8d20c94be2aeac099256a3995a6722ce22452ab3c90cfa9ab71ca4968a409ad12cfdd2098f819cf3e7cfd3d3b392f6353bc99556e2cc8f509b1ea23a3f4d47f72a3a1d8b45cf0f1d13b409b096f64b00747777f3a98fbc871bd69f60857d9a6b7a9f474ecce2e6af60056bd95bac316cad606b5b996e318c101623f936cab90eae699f25d7a851bf700cdbf2b969678e7ffe899b199ef4b8f3de0fd0d9b9cc73eab4a73cea8e09451e221921017ddd50e883ac806023a532740802272465002b8445b036128cc4d18648b5276dcb0a28519619a2750ba145a5017ce0b8a2060382221c48c04af680282bfcc9682ef57800823724a3a731da382d12a388f7a428a39b3296c6d8a251518f11946e489a0d65aa44248270bdc1a4597590490f252fcf469d43929f3411931f5f475da68ce49143d69e5cc7f62a42f615989869654f4fd80571d4a53424a4cc7c573c61548d2e8c2849aa8198a22831ad210d521185085d9a547a55e908d38f68cf3852f4287d4be250622a7d35e25278c8dc049af662428994545b0489f33bbff33b7cfa339fe1e66b77d2be7627f6d808b5850bcc5f18a6af67804e27d8cd6c8bc020db2c81ddd24d26c9916556798f73d3fa17b1ad06fef46378d5c7106dab69effa24db3b37e2fa3ea3f955547201fea94a832bad793677dad8e51f20e7fe967ad5a37db1ca1d9baa54afbc92fe8d1de472b96550106d93d7ef55a14552693a56ca64d39d0212e7a9017fb2a53ee9087d539a3a92c9d4a59052ef20991893fa627f34ba6b7a20953a992392e24a62c5d1b98e29541d7393d12d3dc6a5752295a388c16c2f457546941b194cc4afbe1ea30f26e6942396a38a5ab54445ee3a1d644789aa9ce3b1206e41713a525f8bd6dd2fdab42be30c08193d65238b5175cd4d97a556dec25cd3fda8df64f56dd6aa5bba6d1355467ed3753e81f3f5af7f9d1b6eb8815b6ebe998ef57b705efc3edec2052a93e7b0b65e4b674ee0fa1e36e00897a2d5c016e9c7f259c95b388937f13dfcf9d37840756e1891b3695f91a751cbd399fb149bc87176f41c67173cf2b66075c961736f075dd54330ff3916a64ed09897e005cf3eda8b6771666f81555bc1e968d9beba5540e55b247fc25ce5e9805057d0847629cc3cb57634b29ae5193be5a39155c71117a8941a2366e2a4f41c03af32d4eaf0266d916d8a34d924ce50b6daed1f453fda70db24654e77849e93e5cd2419a610399bb40b8d6340c38966bd021321922672a55d93b1d434591b144c2722d3ce2e4e4664ab014648f570278ee04cb24254223b3bdd6a067c909f4466262e1d81c969a8234266f461123365e24b410b1cdff73975fa1473e5053ad6ef21572cc04c9985c9330074398246c325874bcd5aa4c82236cb8956407a755cb74ac30f88f125f80d0fd75fa4681fa4adb89fc1eefdac28e4d8bcb08865094ac522796b0e161ea53a739af9190f3c08976f90954916c70fd2b1f183d84b38265342d1c26db04868c579f13b6ca10c23330cde610bee8562e8287592fb50a47159744ff08ea1594f44f488184e3dad33588f12314e935611d3a7d31f6feb2029d3eba2e18470aa6909cd71e9f5d2751218194c5d490681f44828e3412259cb4914387e61d718489297a765f02e609019463dc12454fa6a7ef09e618c3382910a2e40fa7e802f8e4a2552fa015ce4906278892f43fc213e94c8d6977e0c9f38d780ae884ed5e99a6b9eaaccd4b6758714f2418c0acda92b05b1838befd3839d8a4775bcc914d08c710cf725030f9938c9687610d11ad94a54e667e052690af3c380412271ba3a3b397df214e7ce9d61c7a6ebc89756e2cc9e677ef4249e5ba7dd824eb188e5d710fe02797f114b2ee11094265d1f1a5ee0a17d3f704e8d45b0678729958ed1d6753b2b9c3e56f93ec1992c3edecc31e4855728cfd6a9d702a7e48741802724ae5747caa5bf851989d75c538abb2c638e2bd0477f331a4ad421542211ae2368d10ddafa803a7ac5194228308a92298ed13cf04c5357119dfe9094ab8e43ad1a39d8984311a3081b4c3b25fd6d01a1e1d0e227ed6954c49a42473ccccb98571913188ecc227962a6ee35521147f9bed4b24339c693682d728840e3b591c8ee1419eb2b655a881494ebde80a4a1c8f9c5408aa38d7c45825b3d11429d0e6b4e5c26f4246780e964e94e5f665eea37e941a27932842b33f215a9263f196d44b2d65c5f6041d914242e15c0d9b46933e393138c8f8db167c74db4f56ec41939cffce831dcda22b9f6760a7201e95569780bd8de22c8e6af81684d891c1e791a7e307bf6fdf01f40d9a5582be336aa48bf9030e0d7c8d58fe3cd0f51590ce02d3f8c98805cbe84dd791522b71ce7182ab854b6cac59bed22c1a94623c2f50465042052e8647938c620a2bb706136766e41a5c82883054811d3111b4f6429911f92fa263d297c925615ab42e10792f03934b864edd574ba49f7eb4e34325cd551278e3292631c33a607e1f852937d9c29631cba5d29f449a5964cfa4db5ca48d18dec647c970a6c882bc12df5fa113d21ffbac350efc3012846a4ad8ea51c868c798d631ccd792522919a6cf57683ebe80141843f1e1031fb49260349a24ec1b44cd167b3dfa2c14b42b2082ed017c44d871d352464b07616e6457b92ccdd2489bb51a67e0972225160d473726d79dc468323478e70e71db753bae246acc34fb338718a46759eb68e120e2e9ebf80f01709ce0a5fde97bb73a54d383dd7e28ebf8ce7d5f1fc80085f0275b0ab2e6ead866f551381fb55e4620577d1a5ee82f483a780d1b2a0d3d647a1ef5aec5ceba772c97931ea82b28ca51009511a52514ed24b221e99f487e7b9b10330a781d134ca17c93431fa35a74496320d8b602c21c30026cc93426b07c0177e46bbe1bdafdf47b8a2fffce85ea1237252228a22045a04954c5789e12366b5880c63848ca318d5b093be898c37d2791d4e99d6c9c41104d323a9f5a93ed553a658beafd537a7726a9b316cd48e4ce0d5299d393d53cfe9521d91f4c327b28864fb063abd9173d2658626ab68cf7b726fc858a924954532a959bcba406e7880d8df282b75515e6c27465bdab4236927e14fa54bf7362a263d23f49224d34047c8605efeeaabafd2f0051d1bde8193b3f016a7989f1ca2d4bb164b58f87e0dcbaf61495765a36572da0758b1f997983afb188bd3c7f042a67d19787ab160515fa882ad1c972b1bd4ab5dc8da0aea8d6922f66d0176ae8df68103b4f7ee85652cc0278a15be34207541998bd0c9bd325e445108c166cf0f7ef083f4f5f51109def33c6cdb0e1c5a844d315acbb2686b6b53d6a82287d1a46d659a21943feaf4482415f47c15a7ea38e23c5ad761b9e51979a4cdc57c6a161418aa6e00e8539be6b0cdae13e764b42d1313359d905aa6c226066ad2a31ab54ea75ae785175ee0b1c71ec3b292759dd4544cb573039f1eb71bbc9a02d742a594d0953a59f59bd873c6279ee26a42a9278d4225343202210d44777cfaaf1375c0f8f81853d353740f5e45a17b15b3537394474f3078d53e6cbb0d373c6500b1c4063b23b5f75f4fc7eabb989f1bc1adcfc71de4db2b99a9f5b1383d4f2eef635b3688e0603951ed21ef0de2fad381bc0548cba2adf36abab77c18a763ed325b0f3ad2f7d54e837887b032128112a2a2f75bd43f8ee370d75d7771e5955732373747b95c8e71747474d0d5d5956adfb6edccd7652ea77ffcc9973e0f3ffcb0fe72b93246a8fec378ae900411d16da8c2c11352c561c826a61f5abfe604fc303612513ddd19a7bc88e664227c6a34a6d3a6e1322f231f2692db78c942a13cba7090c1fc746a6a9a375e3fc2811bdf417bff26183dc8fcd88900ce2a04b3ac30ccbf98e48b22c52dbf4ea1d64de5ccff875f1fc7b57aa8966ea69ebf96da6283c6dc24f57a1d805c2e4f21bf92b6c2ed8886c4f68610561b56ef7e0a57fc2a9476e1793e190709a492b2241a7b70201e514de88c1fa56a80cbf73ca6a6a6989e9e66f5ead5e4dbdaa82e56999c0c78ab7b64e10000200049444154e8e9e969319a5f4e6fa7e47b7e2ae289f43019fec2ec2c35d10c3cf234a9182a855bf34a3184d441b2420b33025370189533aa469e54f57099804d6e7537e5841f6c61be5ce6cce9d3880307e8587335f62b3fa132711acf6d6039ed38c2c2961e96ef37252e2b05d14e1ba27327763fc8c551a4ecc6cbafc717792ccbc2719c782e1efcfab885ad58761bb63f8c703a103dbb10853508eb22be922249d62a96a253e1ca58934e0610199c153339798152a9937ffb6fff1d1da50eda0bedecddbb972baeb8828e8e0ef2f9fc658774391129a036fd0ab3b50b336c68325b4b39b9d4d429b84e7de959c957f38411fcc44f2d23945105952625203393406afbacb23ef6ab8920c5b78cf13bbe040b89e77b9c3e7d9a86ebd2b5f526f28f7e81cae4596a0b3314bbbac0b2c16f2064836cb29a24af4cce9fa0a7bb40b1b08b46633bae2791d2423a3df87637e65e0be1cd41dd45b002dbda85edd8e47379da0b15f2d6028ed3bbaca6e3a71c7168db6c12aa6fd3d3d6f7a2f230d3f77d3cbf41b55ae5eb5fff3ab7df7e80ddbbf7b067cf5ee6e783afcc041f53b89cdeee2979d0174613eada409ca27c63ae634e74941ffd097250275e360edf549018eb3bb127201e75a5e21d64929dd4099f3825ceca5cfe8839205e2f3270c6b240f743114de6533f3fe4df496c56f0ea6baf323b5ba663dd6eda3aba989b3c4d7d7e9a62772f965d444aa82c2cd096af270baa2d92f41bf8b50b14f2927c4f0fbe1facf7f85282f4b1da56416e105f3bafc0c7722fe055837dfcc20a9e605922d870e8c832c806b0acb95cf0a3863c99a166b3385a1765f422ee626511df8742a1c04d37ddca0d37ec036171e1c20556ae5cfa2cf2cbe9ed93f44da55166ea828cc226e58ab3339c97e932a4a1ebe6027f7291e87a18eb24795a15a95454db4db99c0c1ecc3dfaa2054e19ac3145697c6c9c0b1726b962703d1dabafe2c2f1c32cce8cb362ed36a4ccd1a89671eb55da96b1b91140fa75902e4eae3df6eae1d3552c01765b273257427bc2267d70ebf8ce0a7c3f0937a30741969048af0e7661e9f6a3a77266ec192d70abd999c19454c713a4945896c5aa55fd1c3972947ff12ffe25efbcee7adadbdb79eac74f91cfdbecda75cdb2647339bd7d923a9513868ec5ce42996a65aaa2510e895b484f11f5160c34e9e955388d32bf02134fcdccf0c874b46a74164de5a4395353f605aa7c6b842461a1a36e025b5858e095975fe2aa2b7f91ceb55763bff10273a3c759bdf316ac5c076dc5129d2b5762875ff768b9c805203d2c3b87a084ea3125605b12912b229d1c6811934458ed48d185e7250c468f27857040ba64473e192424f1b49297d1412a71ead390488c4a67ac5db306dff7e8e8686768e82c8e636359929ffce4697a7b57b267cf1e6d3fd4e5f4764dca9e2b2111f1cbbc199e24743a3299ab659643a2cecaac4983339f4f49252f09948432b3931ade006d86fe663698b4d1d47fc58197624bea426e6473ca3bcc8eda76ad56e3e8b1a3206c3ad6ef26e7d894cf1f05c0ce7521ac027239077f475c4889b0f28830225209b76c0b290a6124e5878ff44570a48a68c3724a08d1488415474e562289259e10aa918e4e7346c8aa7aa4cc503bd9dc3751f1596c1f64f3d5fd1445835cce2197cbd3d959e2a1871e4208c1ae5dbbb477df2ea7b75f92b1a7096c2130d40c4f62d853b2cb7ca9a75c91373062a88c6f3a653e89ced473758a9501a3e1d16d2af889e22185a6f41bd286778d6088d975d4efbcfbbec7b9b3e7a85416e9dab28f5c3ecfc2d8317ccf45384584652ffb2c261008bb0d3b57424a4fe3cbb2002b874711e90b3c199e611c7a52c72e60d912ec7afc5266dcacb0b09c76f45300325a0fb76aab87b4a73dba1a26a9bf285bfc956fa94918af4846676cba1d9f93b316d70db653ca0747c3ecdfbf1f80c71f7f1ccbb2b8faeaab2f3ba7b7798ad75062bb556601447ec5381f4ca9adff0649337361942b4882276ba9ea699c313146dde85a0b6e4ca76ad21501ea707a99418af2442ef2c98e54361f0a6171f2e449ce8f8cb069602bc5de75cc4f0db158be4047772fc20ef6332d2b6002849507bb1d213d8dc9e020b53c4206a72f3aea4b9f9107a00361e5b0a4af0b4c5801de25926559f1cba152f5ce665014e7eb12934acf476b6348c94845e0d4045b3a058f1e5f604db1406f7b5b18c009f6efdf8fe3383cf7dc735896c5ae5dbb9627accbe91f5f8adf3cd0a764d14f142c348fa11257a0c726ca6b531815215eab898311132e4da6d65a8a9ec8b76a4b1ccd1f21c5f8c23aaa9fca8ab56299c40884fa89f0e0b587898909262727d8ba791ddd9bdfc9f42b3f66717a8c8e1503601591be97e5dab393b0c06e43483f5c278abc9a400a0b4b129ef89810ea8713d2e073e436225a6857239e25a22508df7f0adf814ac895bac4b5c7b199224311370025dbe55b476779f8b909eaa28d3b07ab8c8c483cdfc7b66d1cc761dbb66d4829f13ceff23ad3db384533b9641a652e1d0008a55cad1b2dbaa8f7219cfa755b4d6fcde95752471af759a14b04238d1c7d3457e8ce0ec592da61135a1c66be6d91458b9038495b01ebf57a9d575e7e991bf7eda373e3b5783ff9168b3323c06e6cbbfd22a672611bc2c974d702c54f29c98e0aa3d02c7242b1e75dcaff0749cae40c9f647451e7be90158a467932c988413d2959dbeef289ae698e0ecfb2a5af48a7d54665d1c30f1d532e97239fcfb363c70ef2f97cb0efc9f3b4f7cfde9a148ec16f35191799a2e9749335d77fd0297847532a83aa6efaeadfb48d9acc1a70c65429fa8dcf4bcd9c1b664f0dd5277e594216d1cbc499b85a248564951e93bed8c5c58bf1e068d3178277d55e79e5157c2929addf452edfc6fcf8e9008153c4b2b21dcdcf2b5d9c812b1b2c11242fb62638d4b7ea93176c0d8f19e649e0739ffb1cc56201e94b5e08a78b41cda4ae7eda8085e3d888d48903d19436ac1df69efaabbefd1f45b4dac9002272f04229371d50b0174c6d4395a57ed2802293f85e3dbf4918f5d3b2cc7ac2a3f745124124cb7fea143ad9dea16df390ca290191b16b65d1569430449124039301af9d18a0d12095a9bff2440d952f737aa6bf34acc28d8d8d522c16636761b6a9d312e048f274d9453fd1d95322ba8f671b8acc5a3971b572f4579a65c97512ecc90c1c4dd10679a6b335823b35c688c69ea8d891bedea894707e789899e9694a6b77525831c0dcf937f03d0fdbe9a0bd508442016b19d3a9b732398e43326b4ea2a5987955b091816906a81b627476d29123873361b28e3651efadf81892c419c5799695388ee89812a1389ad879253893b2e80404cb704cd1712591630a4faa0cbfb012ad8925f892533675fe547ea2eb5868f18f159b87d4955d311875b3a1e99c12c3f66303571d93ba274dfa5273008913d1db081e9ce8f9b1d3937e467ee25c52479ec4ce4e5f1e3061b4f39484c0b69dd87122057ebcc8ab0c988a17c83a7207941dd791dc94e955e262d44aaa7732aed5be516c24ced2aecd1ddd6a99eefd32c6228d07d5c1aab4c4f1a44cc20647559230666074749413274e70ddb57be95cbd8df2e8317cb78e932fd2d5dd8d2b2b0c9d7a81860b1207ac3c885c2a9a4916a025aeebe2ba2e954a85e1f3c34c4e4cc44fdc02a2b25c7c866b5e4612021a0d97b1b131a203d6124c41dcaa1d84a60839d97f1414a8ad4b44cc931ed5188e2223a289cf45528ecb359d82b0a2a82aaa6369ce0a917c71453bd329ac6445c7e3aa0e0ae2362d85c68866dde9a1f0a51cf3abc0aa51a71e65850a1eeb9ea2958a638ab282dfd038e372b54cd189d0b02347e32b3b633547162208dd0442284e233acb296c57fa91c1294e3284f1433cea71be7ec887906249c7a4f2694678ea93e084ee48ffa42227a1c1457cc5bf48233232ed27b957a78eca3187dabd9634a557421965a0c86eab89ad667cae5c4476a8b2a27cf6dd493e6f1c0a4d08a666a6191e1ee6faebafa77bcb0d4cfce86bd417cb14ba7a5931700de5b969e6171bd41b5630fb1420ace454cb68e177787898d1d1112e4c4d71fad429ce9e3dc7ecec0c7373652a8b95440bb3b9a1891496284b606cdb4258e13b4542dd302610fa317dd19f004604c1777cf896d651915127e5f1d1b0844a10e14b0d8849cc968c7982a4441939432884f229a7303ff007cd9cb62a97c8098984f4c4bfc44e49979a719334880a1d4fef944aaa738a48d407cb886319a38d6d305ee74d649eb9c90f114b2ce155aac5a103514a0dbb88cb0cd4a1fd2bded1288c18d29c4133a7a43810c3c946e50672a58e522fbc96c6bd824a613ba13bec8ad497c263320426fb26392defb5aff68858c312ad54d55399954922f94b1d9f4a231287e81035a55db7e171f4e81b78bea473fd2ef0ee677ee22cc515abe8e8d94aa1cb67a5e7c5e170b55aa552a950a954181919e1c891c3bcfcf22b1c3f7e9cb1b1316ab5aa36020a117d13ad55522c7a4927d43c358bc4a4b2a12b3a9f49333689321d228e14f475a828df98e6a8d3b1b07e125959a8d32475fa65094bb378a1c0c7d3a738c2d17121c2e954843342a04436ea341085e6a82ca229aea3382ebd7db59ec237aa4dfb9a11cb545fe86b3271a413c39853bff47a8fee109ae7ab5154e4a5a2a828994690e95c426ce1470f9a4d47f5e9608c4f754a0aaec410a3282e824bf0a91153225735bad253ca77283e3bb43add1b67f8de8b4aaab39799cbf9198e9de6e52a5ea1bcc41ba7d02a0f1d7a914aa542c7c056f2c515cc8f9fa477f35e6a8bf354ab5526c7c7989c9e616a668eb1b17186868678fdf5d73937748e99a969ea8d3a20b40f356a87d4b7928836dc2e4f74fac71c0d4ec3f6828139dcf7aef77b32d22afda70ef44d82d418453aee9019bf49791c2da4f850300a1db7d4609a36be44526952475aa181a814c7239c10fad9d0266a8555a9e0d2888794138b0154e12f271a541a6c258668948eaf85ce5b0a7be658285b15366f57bbd0f32239a609085b8a75442a4233fa26beced28e2634eb2a60d85932e0b4b4512d65e04e95ab7833b43aea94b0be137d5825fe8a6708373a3ac2ccf414ab0736501ad8cca91fff3527cf9c6368629ec9f9060dda98b830c5d0d030c3c3c394cb73d46af5008125b41dcf52aa5fea54c85568d258509508a38333f0e88620b3c1a48cc3d7e87b635a3c1abec7a44d4314d935eb23656052da8b0c456a0c2530c1d73eb20cdb17098cf475233247b958b1b3702d95546389ea672955133d57fb296529061ad33853a4247e58a3cd545fb35ca52b723899ced160452af4676e1ad4046cf0671a6148bf50da34f559a5252562f51b97aa93144659b41e2b922f0619551224215f9a3e66f571a44f91b31389cefa2abc81deec63f5138daafd6439be78c62e652227d531864aedc44419c3dccccc0cafbdfa1aebd7dfc3fa9b7e95a15347196d7433597739757e9c13274e30313ecefcc27ce25945d441fa825a569f6abc1af9597565264086eb97196046863640a48402b299662f914cf02cbe33e56254d26096a2c17056495ac6c86ed29505de222fb35f556f691667942540c6176a33f80aaeb342b2b066dca7ad638a4c3dc860259d69d0ae5eaa1f03c87a255faa3434c7a3e665f689f9c9f626c93cdf1ed4a76b2a3f018ce940e39a99edabb2357d872ae72c8fabd268369650ea984e246a6a61618163c78f7147ed0ee64b57f25a7992277ff4238e1c39c2d4d414beef113f2d5290abbaa77a685d2713c6224f6d7044dae92444eb7f03c1640cdaa84bca59a392e69d5284a83424c42754898cf652820c9937861d91210a1343041337920cf32252ce1840284d9a11a32a29bd2d61e4c73485e426118561e432e25fc52175096546723245734287ce7bac345ac8a8cb289b2b1d46fd328e969439a91995c98c3b75c95da79378aaabd6d58337a9a2425f7dcf9ed647b6a3ea888a4bd30d9527a5926a29c17d5a63cd4dc786ab4acbcdf098596e2a223e765819769fb256254ba21e7b6224cff379fc89c73977ee1ccf3efb2c6363a3d4ea752cc247dee1c2ae9489a034224ce7ac349ac04a9d5eed5a2a804651883c99f6344111d167264326110d694597ca74535779edf94986deab3e2f35bd346513e5a9e1b754227999b4a73ed190f179552973249aba6ac418744a235f6680477d19376ed4359e23199545aa0d6d55d6a4439545ccbb24fe11ba4a647e2edbf032dad3521544615655117d0c490a7c6339427d8a2ea55137f179896ea82cfa311842487596a6b79c168b8e5fc94b449bf16e83341b48041c746f8bcf77cbe4096a4cb3825dd5fd4c7d559026a052bb367902105bb76e29807802c40d2659d16b1dda7e9996291d61649767955d4a6ad5c69b999a76db9b823bfbad236d38ce28fbd9d072e978b364d4acbf97babfd87697d2a9acf6d4d44c67b334be957e37c371b174bd59b6b1342e2dca6d4a5b131e5a765bb3f697d4896780034ee2e5a4660b11b06de971843602a462e0e80bb2490d7d003246d9cc701f65112e2358d78603a9656923b688f890e11749d328cc91402129a64b3ba6420bb925e693040d81313a69bba52390b0215f958330f890a49f1c19ce2a2b1c4f427e6588d7c72863f131a9939291cc900f18fd26d5af7e876d4b6df44c688d2a47c3b6d1cb027d615d1d5f65841b558849646ce8bb2a8b8470a9832a7d2a0cc683073786dcb43be54a103f58c928d575226a5db32745d754c890d9645370601b997e41a80853b7b16d29dfe70d788cbb21d897a72df1284fa3cc8731291a623d36a2a2703a103d084b0fc58a2d0b89131907a99fb0ba6914ea85e6b1823ac94298d94119496f56cb6f5a7b79590a0e30e3e994a36d824b2a7fa459a8564e554ac366ed3f31e599d946565626cd19a660388554fb59826bc152abeba43df53a6d3a320b3085c798029a70adaa37ebcf0cc233d9cf846bd26fa9cacbd3f7d48da133cdd4cc5494044ea4cab41a064f511f34b383ec932bd37059b49a6d6a94b490bb59d769d45d25c21106849225c970e51958979eef2d2fc5b85a206d56b42c3a222909033614606a0f4372bbdc2f11a785d802acd5ece21f4c7a333bf86d90225b1497d0ff97029305bb9cebacbacbb177b31e4be05c0a4e49ce4defb8a2a599359b11b6826d959f9afdb5806b76ada62c9856f45d6c1db37ec3172c7aedc8e57ca5a55923cb11d44f8333733ad3227fa9e6b394409d5564c193c05eb49c3366771122758fdb45a72684686c65b5ad4cb5976c57e15d58d05100bb51be687a5bb57529ead3caeede8c64fab09fa63e80f3e5dfbb3d44265a1a6ea29beadf66e54953e9f26c6368de76f61c7f3965903d0f37e7d826af597445d4cdba9d9c716e47e47b88d6e534fac31b7539c13cc5cf4c9ae308eb98ce4480fec4c83414a367d5f6e34bd36128b4a706480546e50389be2e27415882953d251616aa54ab0d8d7f35f08df7b3aa3831dad159cc1e949460375541c1977a5a9a25d7acc0d890991ab8a71e7089440e5abf2310b6c7d6be79da87bea5ed766e3de02e655fa4aeccf28b1bec2fce862ed5becc94a973cab5c3c27000a8b49cbc8240bc6746dfde99204c744c26af9c18b8e2faf10bb0844a29d156d38441470b5c22d488882ab563e3f3be5bd018e152cbcc3d33a6de0b2442f691eb012b6fd35cec6f9f645982952bbb58b5aa9b4aa5c6f99129eab5c65b4dd63f8024901608af06f3c39a478bd77515fb8a5ff9498a22f0b8fc62ed0b45a74d7caa0d65e152ed4babb7847d7111f6959658921ce9d6e3aa49b1d472d4a4e7e943700a5e7de543834cb791e4376bb97959f6e3ceecb2345476dd881e6d3fb29448ea38b6c0ce5bcd43a0b7492a14f2f4f7afa05008ce602f16dbd8bc6980999979a6a7e7deeee2c14380f4915e2d5950ceb009355d947d65e8ae6cd246967d098263747cd97227d31265693ad23c2c5dcf8c561d1ad5d091452ed0885d31af15d4669cab9565e38aa39b302cd6446ee04b5ef84b9769229028c3c472ca141acdb2782ea63aa4488612441ddb869c638505fad011c3abec2b78e27b6148541567289c983c034e23c96c436dc78cc1a3e28cee8c0f8ecffa35ea23c1b62d7a7a4a589608de91545247471b8d4681ea622dee671545c497aaaee6636dcc725306215e75c2a005f75a25650122aa1bd613064ea289487a9cd6a80978904a3d14550875d7f38333f21b55a5f04db2af8861a3dc124955f365596d27a200cf979c1aafb0a1bf3d39f85164b415d3bd7c3bd7ed4b298be56ad857c84ee298dcc5609f8f29a0661d63cacf84d532755cc282a1a159bef5fc045e2ec7076e18644b7f01d70f14243e06c4128c4c2ef2ca9939ee7ee7009eeb63db02e983f465786241b0d334700f12cf5b82cee59465f1a6c1f960d5a954e6117e2e9bd7ec8a4603a6156695b5c295e568b368590a572bfc4bb525999d9d4af42f032a3d4e66e18f9259b3158f59b85ac1986d6453b67c5ccb93a993cf63e540ba55a5fe9b655f7ab9207c5be385f33c7b6e912b37f6f0bebdbde47356f0b934013f7ce502ebfada69cf59bc76b6cc9d7bfb2997e7112b2d1c3b704c9e27c3030583667d2983bd8c123c5721d4f4e8993c34e137836d3339b8f5960c2fa5e3cb567d09962df8c173235c702d6ed9e06057e779e1c82c03ab3a68931e6f8c55a9946b9cbc50e7dce422af9e2d83df60f79a023f786d96aede0e36f4e4387b7a960b0d58bbaac8e4f83cc5de4ede757517f928885982a05620adcb7ca46cd03fd84f61e53adef67395cba975b26c6ae7cf906bd42e790cb998a1656eb6c6b79e1963ff75830ce66bc8c622a78717f8d1b1797a5795f8ebc7ced25fca51c85b1c39378fdba8d3597478e2d0080bf335a6a5c3bb76f570e6cc0c87a77c7a3b1db675db3c79a2cc868176deb5a7ef4db3af669613e53bf8350d8d6c7a97dddcf2c733892f0577bda39bc75e9be18957a728de3080353bc7c3e355b617eabc326773f2d8244e7791352b7354aa6d6c5be5f0f96f9fe27443525d9ce0aab52566eb2eb75f51e4cb3f1ce26337f5f2f7cf0ff3ce3536ab57e42eda57985c35e336b8f711b82cb81e0bb506d24f0ed91326b0211c0d5fe63a433c37694e688c336b8e96663c6e73a91139068e46beacb9d71230262f6aa3c6c019d1a4ce1052b3126d2016c18eea666c8b34af323c85b469b4918127fa7c77ba5e343f32f0b4c22dc09716f9e90b94141b6b6e5fd969b9f62581ce76c9876eece1d9d3539c760a5cb9ba9d3f7af024b582c3ec4b93940a16bb371428e42daab53a5bfa6dbef8d87966163d6ed8b182e90bb37cf38979a617eabc735b270f3d33cae84081172fb80cf6b581576f41cdd234aafc34d7de20c7c17783024379b57501f55ee8b04b956b045a706ede63a0afc085b919ce9c2ff32befece2f063633cbc68f3a9dbfb78d9aaf1f0e13956b597e8ca43dd75b1858f056c5f9d676551b26da0c0be6d5dfce4d81c775eddc593af4ee1d66bd0e49377268dadf833a7c8ba3548102eae2f83f503997cf7ebcd4b9732fd7a2b5abab4dac983e437abc59f9fbc2e364929c921c1733323849872c37e82bae17d56b944c717d6a9d67dc61a825deb0b7ce7d02c8bd5128ef0712d78e7a6021d3678becfe6956dbce640c37541fa74e4e0aeab4abc705272f47439e81fe92384cfee2d25c617a678e6d80cefddd59119eab4b2afd4bde189d20fae22c72433cc2f1eb893574ce245469932d5380fe55a2d1784e3900f5b3a054f0c2dd2d75fe2b6abbba8b89286efd1d35fa4b76031ebc2f5db5670f3d64e8e9f9ee5e4e8229fbc670d8f1f29b3e04ab6af2db2b2c3a1e008debd77259ee7f3ae3d3d7417ede4403a9df74c1aa31fb32cedd8129cc1f7b5825abe9424effde8296b60c7c8cb52d424ffe2c2beac28af197e9396acfb56a1b65e96e84eb336b3e8f333d4b1591b26ee2c1e97fef46236fe56f2c8a2e562f043f2f1d6f85d34a5adc82640ea8bf84663cd7457bd1561e8d9eec08682cfa1f30deedd3fc0ea9e3cfff3fbd7f1c3a3f358b6c58d1bda79ea78998223d8b7b1c899f12aef79c74a3c5f526ab3b86a4d3b57ae6ae3cc6885475e9aa62eda987325037d45766eee4a0e58344869655f803611c8b22f5566f1bdfbd77714243c01dc90f65bcd555e0dbd44cb72039700db227edaf3e491599e3eb5c0afde3ac0ba924d74f0a5e7475f049178121c2ba81c7dadc2976059c19305db12f8be391a679d33a5f394761ee637244cfa7de69c758c5ef3bbb89d83c8e80bc34a326b2f7f2c17314de6d93faa212d273ec8e63bdd8e9a2732e5a1de2dc33c85856d5bf84a34696a86c98bd95e16bc794d13f8045ba483e689534bd54d97071897724fd9e5128bd2b91fb0f1cc9f6af8a21a97665f4169335c96153c99f325f87ef809a9f0519de707b6e7fb241f8e087144b096058fbe32c34f8ece72dd357dbcebaa0e2c04be2ff1e2813fad43adec4ba5313d84a8fc494004a70b60e73390b74ecb318e56e59e02b07f671f37efec47129c4b134f8eac102e847555c4615d1f107658c74eb7792934ea023685e883e52009467df50d6cdde892ab283a489b6256cc22c22ba995ab6d347bd7bd99e124e3916c02172959babd489152ed89b09636a717d4672778fdf011d66cd946ffaa01c53999b1a030dad30d344d4bfa1bca691eb3eed20ed8ec8374791a57963165b595a62ba4dacac7325b4efa69eccb0fff21003bc015db8e155e677d072484f580db77f773c7ee55ba4d5a3f0ffb4a721ce9e46349a4cff283e44063c2483339302bb5593d2a8f5b37c6784de232ae137c024addc4aec013c581175926d2d147b2d3353ca22383fee027a9a953eb83950f1c84f2d14553a849ae6298f1498a26b48921db38621a536692e5709a39c1ac31ae552420537f6ddbe2e86baf31bf30cf7537de84effb812e088b434f3ec1e15343f46fb8026107238617efe368e68cc928cf869729f93473cead6230b30fb2f099692919653bae60b7b3054e7e099b486ce167615f92a08d947da76c48e12a2c338feb49c4a1db502bfbd2cb080f0d48db57d05270e5ccbaa538bb95f85551842467d450bf9a763129f3e0d2b8bd66b844533ad4f0b6d978d76c6522c1a7f31a38a605bb80278350b9f91340731c96066cf371bcb5c392ca75aba4c2357306179b827a96108c8d8d323b3dcd4bb967193b71989946815dfb6ee1bb8f3cc1953b7791f7cb7ce32ffe3bc581cddc74ebcd74b4d986acb369d27b4bfd359d4b366dcbbf57f3d413ff5ba52c471fe59b037a52de9036b35e47532acca40eced9f6d0cc529683b5b99d5c6a5973fb6ac66f73fb52add9716efa3744dfd2125ad4d43ca9df4f6f2520b37c29f8a5609653ffcd4c29fa0558953a8852fca9e8a5ea43f6987ab1cc644d70964ecde12e76c1384ac1d77005966df3fcc1679c482b3d0000200049444154c877ada45d9679edb983acdbbc9955ab07f9c1837f47d7b66b183efc3c6ff4f471ed0d3bf1dda59e602e45cdcfb2e72f0677c48730f232cc517a889e6dd8ebff4d535d498c5f281ff2501d75f3f48fcdbed47cc7e95c8be7fbf89ecfc2629d7a237af2144d6da43628d89645a9238f6d5b4114a8f4473a908e3e059c5020946b3d7c4bc7276ac3d1d61fb3bd966e54d395105a93469a62b39e30f22d7f1e59afc74fe5964a4d3bfb2235e0e7ad34cd922f25bef4f17d1fc771d8bb6727d54a859347df6065ff002bfbfa993b77926aa582ebf96059c13a8521ab4be1e762eafcacf12f2b2a9312ec0276692074e864ce3a176627684c1c44d426b0fbf7d3d1bf233e635e7d55a7957d45a69a695fda77aa7e7afbd2f2e3f65ad9974eb55acf9cce89903e47fa3e489fe9d905beffe469a42fa8353c1a0d3ffcf5a8377c6a6e90e7ba0d7ef93d57f28e9d6b83f5054d5aca442ec595225d83ab9686abc0ca54ef64aff25ffc38c2f27a41087ce985c62941eaab1e59138eacfb26eeb02919cd70b54a59f3f766704bb5a9d6773d8f0d576ca5516f50af5559d9df8fdb70692f9500e8ecea66fdba5e0e3ef52c5bafbb852b766cc575ddd4de51733264d2a3f2d08aff56326925eb2c1cad2675cde491853bae23835859fa3e9ee751a92c049b72950aaeeb31f2ea8314cefd3fcccd9561e7efb3a37313f97c8e6c6f647c7d8456f93f2bfb52b1be89f6a5b4e7449ff95eacbae41c87ed9b57c50ea95a4f1c54adee51777d86462f3033b7085262593642801f465c2926945b8d4529715d0fc77196c790892cbed5f32ccb0a9c65332296dd5676be10848bdec927a6a3626560d35035338865f59381c734e62cdc5986daca7936734c66fb51f23c8f556bd6403056c791504f7f7f584122e9e75d1fdc0252e2791e5e182db48c6e9bd0adfe36939779df4c06adda34fb2f0b26ab0f9ad105907cbadcc76d34a856ab54fc220b0d41becdc1c939d4e7ce20c61fc19d3fcfe9ea0dec58f50e6666a6e8ef5f05122cdb42fa1e895a2b1468c4aaf94b7193556d69fb1296856d59f8be974480481cc70937560beaf51a80f6c1db6c7a9bd32000c7f365b01f47c0dad59d5cffce75d47dc14fa625afcf785cd10e77ad1494ec40c8474f8e323d3347bddee0e0c183cc572af4afdec0d5575d41ceb682b79405e1c820c2bd3e1612197ff6a9ba58e32b0f3cc03ffdc84728140a81324b8930eac67b2d64743c43f0dd604b58c16824096004b88d0627cf9e65cb962df8be9ffec8803644468591c701ed3511c35265182b5b42c6d192ea98b2e4de5a355a8c64661d238c6f0ad7222f8b3695c6246f99caec2d3d5afabe97ca6b46ef721c56b3fa3f0ddcc5d65b567fa1f024835ef67c192c97f8f0f5a7267965c2a27f5517fddd39b64e7d8f9d732f7062ba8747eb1f60b3d34fbd560e9c9a5be1f0912374aed9cedaae62f0827bf4a1002911a1f147af46599615b617ec65b284089f9a06f57cdf8f1d86f4fdd8de08f5392af37d1f61594130113d7d1682c9b3c7397c72984ddb76b261a0070934dc064ffef8492a0b154a1d1d8c8c8eb273e74eaeb9e61adc4603085eca0fb68e44361db429429b0e6c49c4932e1f8923a50c229ed0986ddbe2d8ace05f1d6ed0353bc3e3aee4f9f51dfce6b61c2b72049191ef33572ef3b5bffa2b6ebfed568ebcf41c2747decd2fdeb98bd1e1b34c956b0cae5d4dad52a1afaf8ff9d90be03854cb334c976bf40e0c327cfe3cb5ca1c674f9dc0e9e8a1b7a79bd9f1612a759ffe35eb692ccc509d9fa36177d059b0989a9d67f5ba8de4a97076689452ef20c59c45657a9c8586a0daf0f9cbcfffbffcc66ffc065bb76e4d79ecf4e0628e3c32db7a951b5f8af84141f4af55d2e384e58cb919f8525eca2c6c35756dd5b649a31a376436de025fb3f65ad1d9ac95e538c756304b95356b7d295999726d2673056b1c3125ba32b7e0313ce92272355632c540cf00c747f7f0bde94d9c2a5ec7fc7c8515dd1e12c1f899637ce14fff1b9b6efa049ff9d00146cf0f512d9711c515f4ace8646efc3c95866460dd46daed3a67cf0c932bf5b076f50043c367992b2fb07afd46ea7317a8d71659b5663d434343b8be60f5da7554a646a92c56c877ae62755f89f3e7ce5275259b36aee5fcf0795cabc0fab56bc9d9207cc9371ef80af5ae7e0ab664e3e06df89e87f4240bf30b7ced6b5fe5431ffa1f181f1fa394b7b19d3606d7ac45d4e738777e9c9e81b538b2c1e2ec052a7e8e9eae1253172ed033b08ebe151d843b0363313ad297a93d39c7a67cc6a7e07fd95e62b0e0f19f8ec30fce34b86f9385e779f8be87e779ac5ebd9a5ffce02f71e2e8f33cf8dd838c6c6ae30bf77f897917d66fd9495b6592ebeeb98f233f7a18a7670d475ffa09e5bacfba2bf7e1d8363f7ae8415e1e9a424a9bb59baee2d0333fe08a0d6ba0f30a26cebd4a5f4f17135333b477afa2cd9b65c5e04e4a8b2779e9ec04a2d0cf9afe158c8f9ca2bbb38353a375c6cf0ff3f2cb2fb369d3261c27a7294aa276cd2741d9d39d64ffb01081ac8289e9f23f499056dea805938e2c635e0aa7791dd60b4742bd4c9db89906b81c638c72b2e8561d5b467914956a2983c768d8942d60349eb2a95d0ab679b9307e2569f965e14ce0f5e30543fbf2831943797691f343157a4a92b5037354fc4e5eb07e85c3b9f52c5c6850af56915d02bc06afbefc0257ecb99bc6d8cb9c9db89ebff8d33fa3674517e54558bbf10a5e3df4241bd7aca2d07f356bad519e3a7c8a9a5fe0d73ff9494e1c7e9e279f7e9ac12dfb1839f92cdbb66de3173ff07e7efca32778f5f5e36cdb750b470efd80abb76d6168cae7f6dd1b78fae5c35cb96d3b13c75ee2bb4f1fa2eadabcefbe0f73c7fe9d4c9c39865d2cb17acd7aba06faf9fe634f72cbfe1bb06d9b3beef827bcf0c20bdc79e75ddc7fff1779fa851739f4da61365cb197fac8cbbc313647a17b039d7997c5ca0cb60565bf83b59d3e65d9cb6fff4f1f898f328a24e948a2d13f599b79671f6c28c07f38d1c66dbd707a41727c66815a5de2793ebeef217d9f7abdcecccc34e74e9d24d7d1c7d0d0082fbc728c1dd76ca7201a5cb3632d5ffbc2e7e85e73157b5639bcf0ea71b6efb812bb3a81e7791c39768e5b3ff0cb9c7bf9694e9e3a41e79aadbcf7de03dcffa5bf4302bff0cb1fe699271fc52eaee0da6baee2812f3dc0e8a99388be417aed591a8b1637ecbf8dabb6ace32b0ffc15abf7ece5ddefbd17cbb2536b4d7a4c923546a7f312b50c6b89604d65b15a65b6515ed653b9cbe967919639e57c8bdb14485676e491d2c7977ef0ca876db3589ec73f739853e53146d7efa5d2bf8f99635378d5053cdf474a878599611efdd1ab382b7b9939779a975e394c5de4b8f15df7f2fa8f1f65f8ec197a366ee73d775ecb57fffa514e4f9e66ca2ed05b949c7bfd795e39f43c6e6d9e375e7884bec1d5bcff177f9953af1ce4f4e9532c4c0d71f2d51fd3d337c0473efe1b7cee8ffe2b2f1e7a992bf6dec47defbd933fffbffe036747a759d7df85559b4608c1e1d78e506bef619553e6b3ffc7bf64e79d1fe5e69b049eefd3683468341ad4eb75a484dbefba879e8e3cdffdce431c3f7284ee0d9be8ac4fd120c7813bdf4341d479f2e0213ef6f18ff29ffff03fb3b858a1bdbd40b20b121cdf0fa672c9016c82c192e49f6d6bf09521f8c688c5fa5c83fd2b5da4cce1798153727239aad52affed8ffe98ae9e55bcebdefb5853acf14bf71ee0c4c80c2b7a56b063f75e1e7fee20dbaebf89fd9b8a4c8edcc2a9b139fafa5650ec6863e78695fcfd43dfa4ad7b35575d730d3ffcbbaff237df98e5ea1b0f509d3c49a92d476fff6a8ac57672f976366dd9cc9dfb77f1f8b38729143b58b3663583bd3de4db3ad8b26513726e82af7ce97e3ef6d18f91cbe763c79115aba0de67e85ce6ac4e08a4efd3532cd0ed94e288e462d649b2d4f7528dcc8cf3b2b0e8bc367f776cb93ce8707a04a13af12c4ad4fd3909ae64585063b234174b4f9dd27849c1354bcdf86f4d576b7c4849ceade1fb51a40dc552811e678285e30ff35c773f5b37fd0a67cf5b7808da4b057c193cb51b3b33c4cedbdfc37defbe830b270ef2f8ab93780bb3fce8c1af62f56c64cb559b79e607dfe49bf3e3ecb9e55d6c6edfc3234f3e8f2b2d4a1ded08a06fc32ed65a2e2bba4ab4d902dbb201c1ba1dfbe92de5e82c75600bc1ea35ebd8bea197c79f3ac8e7874f72c75db7e2e59f6666a14ea9b39d7add65fbce1dbc7af49b3cfe5c9dfd37dfc5eaf56b82e51f2448c9fa75eb90523230b08afeee4e72b91c5bb76de5c6bd57f2d44bc758d1b382152b56d0df5d0a4e38d8b0164b38acdfb08183077fc2f5d75d4fb1a383f849f7d8e878c1f3bc27c626e76fb830e771ebbe2bf05c1fcff5383cd36064aece4a5bb2b1c3c24270e2cc792a9532bb776ea456abe3791e8e930f8f9a05cf73a9375c6ccb229fcfffffecbd69905dc775a0f9e55ddefeaa5eed7b01858d20402c14418afb264ad446518b659b924559eeb6db1abb1d31dd8eee8e9998e9e8988eb1a3dd9e69bb3bdcb6c7b6364ad4465294288ae2027113571004b1100bb1170a5528d45e6fbf4bce8fbbbc7befbbaf502029cf78629251c4bb374f9e3c796e9e9327334f9ec4b22d84b77b679ad4eb26aaaaa26a2aaa22a8d7eba87a92a3470e73e4ed43dcfbe9cf22140569db288a7368d75b3093d289ae57afd5b1912474bdb1002825481bd3b4d01389e6c0edc1b4720f8ce961f8b39172a582954aa36432bf228b692515f1de54e0fb9bde1d2d975beaddb6f857c3a9cbc32a6d1b519ca73d9da756ab63da16af9d161cd8bf9fe59913746cb88e74e71aca953acbcb5514b3ce5d9b6af4e6057dfd8348dc83ecee2ef637bef1353ef3e94fd3d1ddcbbe37f7323931ce473ffe4977a11aeaf51ab625492412cece99045555ddc8b0ce62b6611848e1ecae099c5d3f6f51dc34ea58b624994c621a754ccb46d77547a109b02d13c3b2492612d896edd70bf8383ccb103c79c50dbd2cd0752d24af8ae21cf8b66d1b5553bd4b0e5e93709b989aba90324df3b9f9c5ca75474e2d50684b3bdbe1ae15256d276eb1e54edf8aa522c30305c646fb1a4e732bc9e76ad61b01d334314d935432b5faf2ad609a87cff874293c11382104954a05339d8274c63ba6ed9f2bf26062e95821855779e26d92c82535a1529e011cb4409022b4a4138c61dd687660fd2c428f88d0ef87420f51d0b0253cd8c6ca55d8d66850e8d218800fc2848969b6c1a274c6d981be6d23dd754149034634d3856c58ce51fbcf6bbb881408b4244476907752daa8a5055731d528954ba4d2190cc3c4b26d2ccbf10b344d0bc330304d13a35ea1d0de4e5f5f7f78e09350a95448a5520821300c03dbb649a69234a59519164eef46bea2b0ad64edddd5e74417b06d896d49b2298d2bc7da318247073c89f0beb294286a3bd97412cb8a3b6210c311d93817de44936c9450151535a13a1652934478dd2fae3ee1d317f26995017e490f43184f9378c9b86e19a8cddf8df3da45a04c032640d965cdd264f497a35f1a6f6271454fa149ff57304336fd08c34751c7c2cb089ccbe428ac8c147014420c8d71f4adfc10cb8256c79a3d129beb9421de46611b38225fa4a9f2981380c16f26258af4428a28e89a4e7179c919f003156a42a2ea1ae82a6a2e433e9f77fd02c37d30954ab9786ddf0750dae1f8154df4c9804c04de47fbfceae4cb291352c08d6620dcfaa293e8505813ff33ac501fa0d5eb75aad59ae373202071c90b6625d56af552402b54b91a489aa09b46a4f7adfef8fa629300a35e474925f17c4956aae4327452ebf4be208947bb528b1be6f8ca44f88340c07cf7ca4747fcf74cd4fb9d7e15bc0d35d959bfad56abd46a8ee3a1ae25e2cb05da5dabd55df8cb9836ae1afabdc957abfcf745be02905a3291402031f5b8202dff7f0a26015485c410a2c9f3db4f0183e53d69d298ba2fa11e2e1b670b030c042ccecd51ab5449e5dac9e7b3fed9ad10a82da956ca647239dedaf33a83c323747475b1b8b0c0d4c4045b77ec741673df3351cdf47929aee5abe1c6bbe3d82a93ddc0af2882542a81b28a1be585e738fcaba3ec9f4cd2dada73d876d61fdd6c775d293609c7eb5a2897d08dab14ca96badbbf53bb01103bb58abe5ba9dee83b1fd6fd11a92f3609282e159931ccd51de2f54c5cd94c5ab4aa30266fd2e9e6499a3cd91b9002d908afd752e056fb5e00a661f2b7ffe5ffa0a3d046c54ef3b92f7e9181be02d54a05554fa0aa2ab669303f3bc7e30fff90dff89d7fc6e8baf5ecfed9e38c6dd8c8e66ddb18181dc5b20c6a35032d914000b66960018944126919d4eb069a9e40d3d4000d91b6c7bcbf14dbe3781a8cd1e9b5b9194d70daf31e9483fbbda4ed1cd7287414e2fb4aa04f5ad52a95a9c3a47bd6a2663b63a9f38bb4ea4431b0b1d931e557255f2b65b434a5562f5f1e0a81eb2ee0384d3a1ffdb9b75ee2c1838f61091bc59648cb04cb02cb443314eebbeed7b9e5da5b62187d39a6419c9608a6d5e0b95ca333fa352ea73e6f7aa2b8470ba47f5648464427be74a3ab37c58ff2954ef4c06418d25fea0bd5d68009bbf40521c2f08dfae2c4df81312d0bd330d978e526f6bcf226e5629159d5e4a16f7e1db2fdac5fbf9663af3d8d89c6be3d7bc8b5b56318757ef1c4cf181c1ee6b6b98f6254cb644485370e9e62f8caeb48c83233678e50363576dc7017e37b7fcef965938fdf7b2f9bafdae65c0c09ce1459c4af9704296da898f053b0bdc297e246c8bee6522bf71211537784a33175837be3a4b39164d95876206a47149310945e7c0a65e271ea77fd017ab22ddaf840d9d5a49587bd70de4a3844ccef56f444e12fb7ae209c7b24c5779997707ce1348f965f404fa9a42dc8d92a672f1c47ad5b248a09ae1dbe9a9bed9bdd513a4a985381a2a8eea25c0c013efdce8fa6b588585a031fb4e97db8418de7b090c7ff6e95c28ac343ef1d789604c37878bee19eea69a5fc64001abcbda4c66261105f78548f1bc11b1ee90105e9d31a2de185a695011606299601bcce20679a06f38b556efec4af313032c0e1179e40da750ebff818e6f2f5e48637f1918f7e18549d7beefb020ffcf7bfe2caeddbb9f5ee8f93cd6678e6d14710a87cfacb5fe2a7dffa1e351baebae1263a923607df7c897c3a8356b3b094ac7b5ecaad5dd2a028a05808d01ce47148294b1a5ad76bbff49e6c9f5f22824f46b81dee2db1bdd8c7d5a0c651448ef521001b2fb652f8f85270e8008442eddc39c4eb0f91be710766db48603a17edd7ad4d0eff007b288c43abfe1890a555c957105fa07cd3fb56cfd1142f5f41fc9a37fadbb68db0a16e946957935cd7bf83d35347d9deb311bd58a1bbd0cd44f50246adeeb812489b62b148dda82384427b7b3b8aa2a0280aafbefa2a6bd6aca1a7a7c75578927abd4e3299f43b8b1082858579ce9c3ecdce9d3bdddd388fbc80b5203d5223a396ff1e6ab52aba9e084c311b71aaa3e21c4ce1ee4d539e9fe3d5e59ae7d23bc41bc01b12a4a60146d2988f85f6cd9c6719810d41455d161bf863db26a31d2cac409dbc70c78afeb26c9bbec1213ef2e9cf9048384eb5c70e1d64be6c53e81f454f08867a3a68cb6549d497f9f98f1f45d57546fa3a7975f7936cd8b69342572769ea3cfe831fa0b6f7d3a11a0cf57420848296d410e92c8bc70f7171fa229baf1c0baf450519627b8216a439ca418f2f2d0605f7bb84f81dfa3ec1e06f7142d63cef71c2c37a0a317e72e8ede07a6751a3c999ded6a93efb08851e9bfa868fa026323e6cb954a45aab9148a6c965d3119ac2f5bcf8c20becdab58b443241adeac85a1436a2b243d92bc95753197f687b7fe52b8847f398e61de6cd92e433431f6230d9cf5bd32ff0d2c5298a4b15faba46a096c0a8d591b6cd72a9c87ffc8fff1bbdbdbde4b239eefbc217686bcb635b16afbcf20aa9548a9eee6effc0ef830f7e87dffef26f934826314d0b455148a5520c0c0e3aa1312ccf1153806d3937a3a80aa669a26a3a4280659ae0865e90b6631eabaac6b71ef8161ffde8c7181c1808342d3aba063a5768c7298e3381db5244638c55dca33bb63f1236f1bb597682c917b25600ab4112cc5a898038384f79c9886086e155cdb182406098ce14ebee2ffc36176717d1533932691d3d91404d24b9f72bbf47a96690cdb791d21566a62f92692ba07ff03a74613335354b7bdf201a962f2c85ee2e96e617d872ed2df40f0e3af79b79e4c5ae5380176175e5245bb32c6e07d5e787576fcbc2cdbf5d3de44c3ba382dee0b3c48d4661dbf81be4c21de48442f9c45192e75fc6faf0c7213fea1c0d934e34823ffbcf7f86aee9e8c914d77fe8d3dc72f57aa46d392183741dc7f1d2f1897af6b967b9eaaaab308c3adffcd603dc7ffffd6432196ccb44e2de5e633b216854550bb0d969bcef74e05b7cae14f84d8b2aedb81b85dcdfa11dda788b2d4ebe1a6707241aae05609a168b8b45760ced429fcbf1cdfd5f677cfe34b202d4522c4e1d4229a9587513292575c3c0b625375c7f2389648284aef1ca930ff3fc81714e9f1927954a615b16838343fcc99ffe09470e1f4608855ffff5dfe0fbdf7b90c5aae0ea5d37303f71848b5313a85858f93106bb334c1edf4fc94ed0d9374c71fa2485b5d772f315797ef6cc0b58c92eb6efb89afd2f3e86aa2558d6fa78f9e99f70f6cc597effab5f751dd3dcf9bc6f9e453a971d11cc26be050438f06c23fc58dfde7551979d82036b0b216cb2b656837335cb0f41b895a2a20968efec0a4d41d2856ed674f410b4f02c2969ef1fa620f0970286db3a1ad316096b3775e185bcf0ba5d7bb28b4257b703627b612f683d0bf6c87f17ec8e6068fc131caf0259ef0665eba24e66f4907cb55aa75ab728966a148f3e4261fb10e753ebd96c41c6769499699a689ac61ffcc11f7271e210df7dfc493eb0ee3778f6c91f73e0e4349b77dd41a17296ddafed63eb55db10d2e6e06bcff2fcab6ff3c2cb2f60db361fbbe51a7efaf473d4d43c1fbce90ef6ec7e1845d1e8de782d9ffbd86de8aac783805d63479ea30d1591675fbe0225a203f02ae54bbaef04a0d938e7786ccb6279619197f6fc84af9ffd1a73d559baea1ab2ae236b29ecaa8252513197cbd40d03a4a45c2e73eaf429d2e90c6b464678f69707f8d4fd5fe289effd2de7cf4f323533473e9b22954c70ddf53770df177e8ba9e30731cacb1c7b6b1fb5621155a9b150aef3d5dfff5d1ef9ee83ec3f5767e3b61d5cd397e1d1675ee3ab5fb98f6f7ced017eb06799630b25b2ca7164adcaa29de22bbff659fee1efbec98e1d3bf9adfbefa7bbbb3b722b47985fa175a010b3e2e11b8c0d8c20b61310cf6615bb72c16f1145db4457838ce842779c0e6d5a8a5c2529d13ed1323559183105248015f298f6efdcf2da62359bf3c25de08ec717a0b5f9554b25dc04bb029c971f346e62f55300c76af457330d8d03f2d2969cb8708ea7f6ed65ee6207775db38682524593e3ec4fdfcbdbd5ebb02e96d8da25492535df2953d375da0a5d28768d7367c6f9e6838fb1e68a75bcfaf4e3dcb4630c140d35ddcbd4c4537ceb270b7ce177be4acdaaf3a5fbbfcc4f1ffc16a3577d9054f502cf3ff9143355c91f7ee5333cf0b5efb374e3d57414f2f18d96cdadf5d73343165418ecbdca5710ce89c7246d8422e82ca4d9a6cef06f72c3d46a69ead244a673946a154a5a12b3b397cee5a2e3bdea5e6e685916b665a1aa0a433d599efaf9d39c9d2e73fdb6b5bcfeca2f39f0569a643241465678e2c99fa32c5ee0c4f98be4ba0751953a9aa6d3d79162b8b78f74364fcd9867c3600f6ded05467b0af4f60c9048ea5c39b68ea5c3a7c9e5f20c0d74d2b6acd3db3340269ba64d3179e2899ff1eb9fff3c9d1d9deefacf4a5d289c17b7b81cce77454be0ba09842358b6c2be9251d60a2e3ac0440729efe1927a8566a320582e3050c6c2347795d6b4874e26790a29d096a892956e99b83aa2bfa38654102f342b8c505d32fcae9541165b8797279bcbc5f124ca6f8fbf4e5b9dbef2ced42c7ff3dcdb944abbd0bb2dfee5b559f4cc97c914b6535ecab09c4e71b67a9261d986a6aacccfcdf1ad6f7e834a7181f557dd416767815ddb37b24c9a8debd792eeea43b5dee6edc36fd3ddd3c760578e037bde40d4cafcf4f1c719eaefe4a57daf8294f4afd9caf84b4ff0cc134fa0b5f7a12712b1eb5e5e6b9afb4c743fb95986ec15f256235f04e0c485a98b29d3349fb36deb3a69dbd49667593cf926679efe1b6a6a1b9da357b034f10e666581fe5bff053d1b7790efec062178e79d7728974be89acee6cd9ba95716397dee225a32cb486f1b5393935448d3d99e4633abcc2e9719eeeb61fcfc0544aa8d422ee11226e8edeb65666606cb32c9e7db505595e5e565babbbbb970e1025d1d39c6cf8eb358acd2dfd74f22a9d3d9d9c5850b1748ab92f1c90bacdbb089cc0a876b2f31536899ef773421a894cbcc2228abfaeacd94500a4aee252a7c2fe95d4d515aa9a155d4251bbb93ad612e1ff5ca75be8ff8568d33cca31539266d7a649dee7c01cbb2585c2ef3a70fbdcdf74e480a8363fcf9a7faf8c415698a358313b316d3b620ab8d3364e7e869cb71e2c409161717c9b57731b66698842698bb38c5f8c405d2d91c095d676e6191fea13528768d8e7c9aa9e979542c96ca15d6af1b65fccc38a69a41d3551efeced7f9d4bd9fa5bd7f84becec695dfd126c7accabe2fec6bd52523f5bd867f88d7309fb32cfb3a84a0b238c7e9c7fe0c53cdd0bbf36e345dc5366d160f3cc5f2f2321b3efdc7e43bbb403aa783dd13c1cee2b510288af02d0a2ff893b708e6c4077743784a19d2a25e202d1f5ee2bb1238a139ddfa10bea6f7f200847016f7c2ca62055bbe1507e386c2405ea55261ba5667d930fc50164ddd3346efacf4d14256400bf3444064fae39ac0cd6b92f1792bea9b98cafd06ac4291c68967cb0607080acdabe2167d62da10cbd066fe87a60822c88f18bc1e8e952252b46a6b9c14bbbf0592e15c8aeef60e4cc3421170e4cc0cfff6f99f325390dcd27f0f9f1eed40a91749489bb694462e2168cfa5d035d5972fe9ee9a03084534424bbbcf0d7970a211388368e3c4bf10502c96387ffe3c9b366ef237bb566c43cbb607538b4e75c9cebe627dce215ee9b90bb8dbb5966592dd7427ed6bb7d1d6dd8f370e66bad7a01edb876d9ad896b37360c71ce4b502a19e63c23ebbef031941425b5996b6572e06c05fc4b5621a1961bef7ea723a5e34d7966ceceba6ad2d1f504c8db286696299ceba8ba278ab8b71a98520b69ca4384a5f55d515e96b9dc27539f19e452c25c15abd1fde3a525437869a13477d10916cc4758fa2102158007b0583f45296dd4abc6c55ee72acc556933942ef6d6933373b8b6d49df576bfd50817f75cdf52c2bcb0cd98ce5d60000200049444154a5ab74b2447b21413aa93ba1481447b1d896ddb2bf5b04052b4c4bb4846d39e76392c914ebd7adc7308c55b631905a8eb231f215474428ad8ecf9a65db8ea7af69029244b69dfe9db7832ddd1b0f9ccaf55c3bc3bbee40da36a651f7668211ba9afda09bc38305dbd9521c7c48110bd7a82fe8261ce5dba54cc7a86485dbd04c2f388a5b009aa22085eb4a2725f55a8df9850527b68caabedb49516cf20ec85a964977578f7bb5cfeaacb196381dc4ad013c84973a42b91a1de1d62565e09ec11561414a2592f17e71f3578d131fafe7ec6d5a168661fa39d78eadc1b2249ae61eef928e12939674370f5af5c177215f2137fa78f982b0db69b0be86d5b97af96ae647b0be95e4ab8155330c835ab542dda887002f653dc7ce205a10b912eca584ead2cae5d2f5b5ca8fc31d5736f8c90cc37076e6dc1d976aadc6c2c23c9aea58479d9d5d647339cae5f265eddaad9414452197cb3139791ed334d0752d44f7bba9c5697fc33134a4a36400c66554ac18cbc0c0e94d5f56c2831b72de9f4d45b8edc1cbb8eff0fef0329c7e1538837825b6edc45aaad5aa61b52504a6158097e192ef977cad26b5eaf32bc9d74af85bd9922bd5154d5a4f4fa77370374688ea8613c93295d2c201d0564cef8749bc1ad3fb72eb7a1f7008282e171d074fe974baf9f93992993c4fbc7682c58539bef4b10f52abd5c8e57297e4595c7edc77b06d9b52a9ecbb2ac8c8a2e5ca36677c9ed3411a2abab95ab70ed9d04a8d5a2358fdb2c1e345e1ee1b7ced281e4f2dc60f11417a56237471b38db8f25edefb2df4b1b31ddb8926d9ddd37c88b75aadfbc1de5445219d49a3a9ca2a94c97b958ff72a33975bfe72f58103ad49e930301a9e6269d9e4e09169dab2365bae18445195483d2be95419815d09aaf9ce8df090292f515fccbbcbfd1ed121ba159cbb1029dd1016a66951afd549e5347ef4fc61cac579be78f72e7713e0d261640cd3e29df3732c940d72299d2d235d686a733955559d0b203cbf18a44f32802d086ffd07da123ca5e1e7d1606de089f84e1f19ca5b7df3104219c910011ebb930419071b2c16ff3e5aca6b6b143a4481379b8936e512383db2fd147896ee73905b7e79971e7f0009c897695a9c39739ee3c74f33373b8f9ed018191ea4adbd8dc1c15edadb738dca6278e30e2301225acbc7eae48b55c8731c15b184b50097cdddea1249433a0cf4a2ea0901a58ae4e03b0be4b392b5a39d546a16091d34cd1d59c3bd7ae51a63da103d4a19cb8e68dfbe5cb33bce0288f5ea6b555f245338a7d56d29314d83d9d9599696169152a22b36a303dd1c39b1745924966a357eb2e7347fffea3c9b7a127ce3f7aea7ab2db5722119e8f001898a2a203f053dbc9b0438debac17f1bf63ef1765c83a37f7cc9383cd297a1e62fd920b2814f86c98b23558479109aa347746c48afb632afa2383db256d0a1312a38a0bc1a0778a5eddc3074f8c809e6e7e751148b545ae59a6b76323cdccfecec3c131353d8762f85423ec6726e101ed73d836fdf1ff95aa50609c25f42be147761bf79d388a68ea1d9d2392b178cdf3dbf6451aedaf476e439714e6263a0d8cbac1dce90cb3622f0f9378382efe1daa8a5057591ff5fbe591919c2fc772b993cd1fc7751976c74b4d9d939d2e9344343c3188681ae2af477b771ec746b2ba95aad51ad561dc146529c3c4fe5dc38f3330a178a3677ad3b8e52dcc77239455dfd10f9f6b5fe22779822ef48488be11fe1fce77e175bda28fe0dae84b78a457073c1bdc955dafe0017b4a18580a9c90bb4b7b7934c2543836edce68447581826f8ed9be11bb0c45b4cad068f286854a144e1e29453abdfadba561c6cc4c2f2949273b6124e9d9e60cf9ebd2c2e4e934a2559b76e1d965d677c7c82743a436f6f07131353a4524912093d70e57d831845288d75baa6b4028f5d771bcfe2f60702f74281a0fc4adcb86bc2d9d5732e1990bee52325aeeb0e58d25e95040b21989ebe482693269dce34332fa2d4d47ffb6fff9d66dbf6576cdb1e424a0c4332396b335f4ea0e9492cb30da56709a91acc4e5668cb69fe7463faec3b3cf2f043fcf2f5b748640af47515fc0803d2bd66d86b004238f79e4b0928cecd0bee8753550d4508e76a28ef7c960c8c36c1770e8f5dcbcdcbf3dec9c0bfc13f42385be28e3c7bdf3f6825d46a350430b66e3d5525c9b1e925328ac5f9f93aa7262e72cf8d9b492492e87a43a92c2e2ef1f4d32f71f8f029a6a7e738337e8133af3c47d723dfe6dce42cb9d111eebba1ce55dd8f63940ff1e8cfab1c7b6781b1b1611289845f6fb556455355344d6d398a0bdb64ffab2ff0c3477eccc177c619191ee117bb9fe691471ee1e0f1097a074668cf2551350dd5bdba5955351445e1a9a79f666868104dd51af7d44be72ae9849ee0effeeeefe8ebefa7b3b3c397c056c384f7bc92a25951de2fa59882cfadfe5de9f76a71ae04ebbd8a96f1a6cb5252abd5d013096a3583ddbb5fe2b9e776032677dc762b1bd68f9050c132ea144b15745d6779b9886d4b329914cf3cfd3443c343e889248a50511585175e7c914c26433693452050d5b0ac010845757c9d6c4743abaa82a6a9bcfefaeb58b64da1d0e11cdd9292b75e7c921f3dbe1b2d5da0bfbb031b89aaa8bcf6fa1e5e3f728ecdeb4678e9a55fa2280aed6d4e04114d5579e7d831ce4f9e677070c8894d260581e01e6eff113e6dbaaef3dd071f444f26181e1a766ef10dc9b32f831336f2eb9ae7bc65db92c5229c99ac51354dd6afefa2df9c4298272867046d035771512d72eacc0c576cecc1ac9579ece11f50d87a0b9bf2024a93d8ace5a55ffe9273e72fb0ed9a9b5838f736a5c539eae97e3a932613334b5c7bfdcd88e2387bf6bfc3c8e6ab19cadabcf6fa1e12d9363e74e79da86a78c729e67bfb0bb1e168af8d31b995fff16afb5cebfa1c93bc56ad52acd679f8c43267e62b7ca25f30d895239b4ec5229f9cbcc8d4d4023d3dbda452796c0186a2d2515de693a5bddcfaa90fd3d79d647641a35456a856931c3a7a82e1e13e6ebef9bad0227970f1db977a57c2154565e29db778e2b957b8e1cebb11cb93989579f6efdfcf07765ec5d183fbd8f35a17031fbf8d9f3df628a69262dbf69d9c39f0120b4b45bef3c347387be60c9ffee447387af86d26976c3e78e38d5833c779fdd0398e9d9ee263bea26f04c10ff22df8a6c99d25a26cc2c64874cbba854578292b48ae00f36e9e2f051b9cf046f21ad33828972b2c2c2c72ebad37d0ddd3852c15f9cbffe97fa6662cb375fb87b9fdd77e8783078f323b3bcfc8c8083d3d1dbcfcca2b6cd97a15c70fed66b95c45691fe5a16f7f9d2d9bafe0bedffc3566a7c639363ec7d66b6e60eef4dbd4cb45da7a0658ba788ed98ae0ea6b6f22599fe4f57dc7e818d9c4c3dff90e5d8576eefff297191919c5ac5779f2c9e759b3eb46726209c3301d4342151c3d7288037bdfe4ca8deb3970e000e954869c6ef2e2cb7bc9f4aee5e517767371729c2f7df1b748ea1ae99cc9b96282ce844e773ec7999387393b53e59a1b6ee6fc91bd28d266b958a4be3cc78bcf3ecbf0a66d0c76e570cf7737c9b3e669aa4a557264dcc2aa9ca35e3ccf1c23f46dda8aa48b7ab94ed18291d16ea62fce33335b24a11a4c5704375fb18eef7dfdefe9edeb63f395dbb9307e9abd7b5ee3e0e1719616c7b9fdf6dbd8f7c2e3748d5e49bb52e2b1871f61fae43eca8934bf78711f376e1be5c57d07b9f1e6bbb0240869377f7c7f048a798e31ad6573b8c7a6755c7fbd2faeb3451754fd056367d7c9b44c6ae522bdf904a74a3a65abce50579e6c3ad9e8a481343fbf44229172e251b9be3c89421f173f7837b69e40efece2ad43250e1f5acfe8c895dc76c75d6c9c2cb267cf415455e7031fd81ab827cf1b590215b80d1202ce4c2ed033ba9684b078f0c73fe7be6c27a669f2e4d3bfa0b37f8c4d9b37539abdc0e4d993ecddff36478f9ee6d499c37cfe339fa6bbab8bb175ebd8ffca2b3cf093a7c8a4754e9e98402b8e337af5b528b50bae8510f61c0e4e0d1a83438367c1e9a288810f86bb6b5ed9a259d9b45a480d6ac2a0a26a659aad843388db8e810b561437d241c00a7706fe743ac9962d637474763279e238c7c6e798bc38c9d00603292d2626c6397bf63c1d1d05a474363de66667f8ce634ff3d94fdcc5d33f7f0c5d4f32ba762d53a74ff3f7dffc0ed9429e7d074f535c3acf9d1fbe9b636fbcc15cb9c64857869f3cfc084be70eb1a426597cea9724130a43c3c36432594070fcc05efad6af47352a1c9d38cf0b6f9ee6becf7d1cd552d1b404d7efdac281d75f62a6540769f3e03f7c83a373252ac55f90c915181c1ca2904ef2dcd33fe25ca5c45c2d4157ae83b58561a69726181ee8e0a1effd88f1b36ff3a9cf7c16619b7cffbbdf65cbad9f65e336bde10d10956f40f1ae2fb62c0b0b055553d11219526d839c9e57d973b8c28183931c78eb086f1e9c60a96cb2bc5c219d4cd09b96ec3b70940f7c6027a54a8de36f1fe4f95ffe125b28cc4d1ea6a32dcf5d777c88e1a151aebb6a133b3f703dc585092ad51a424db169ac872ddbb6b175ac8f7dfbf653ab19ae177ae4cff74e8f3edb7e102e27cf698b6d459ea56b15bacfb215dee0fbc8b373bf9e13953397cb515a5a646b578ac18e344248bada52e4d2c9a619889492e5e50ac964d28d89e3086d7e6c0bcb777d8efa5d9f6149d179f5b5b38caebb9b8d577e9853a797b16d959b6fbe9e53a7e678eeb9d7020bde819d39c2d34fcbb2593350e0e29993d44c185bbb96a5e512e97486dff9ca3fe38fffe85f70e586019e7beae71c3a7e06a35e6461fa241bd78c70d76db732363c403a9777761beb061d5dbdac1f6aa36edab4b7b7a12a8d35aae094393845f6a7c0ee9fa7c41a7f3632021f9d8ec74db557fcb383bb95f1d3f8f8bc983fde63d968799c6358baaed1d9d9c1e1c34779e699dd740d0ff1a53ffa5ff9d21ffc7b3ef4d9dfe4c2f445969616191cec6360a0cf8f51665a16eb8607b8f3cebbe96c4bb26ea8874c2e8f4450ad5649650b6c5cd3412197e5e6eb76914c26b9e1ea9decbaf626ca8be7a954aa484567db956bd8b1798c743687ae6b482417a667383f5782d245fefe2ffe4fca5a0684b3dc621a261d031bd8329ce7c0eb6f604b49a552c59682756b86b86efb46b2d92c6ddd0594cc2ce35cc147c7b21cba3885de95475575daf2596ad50a5d85366edc750d280ad55ac51d9c65436edd9b8a7d599512f55ffff1bfd16cdbfa8a65db4373259d42ff180323eb9898aa327ffe34dd99129bd6e418eacf535a5e46133506fada48a6520c0e0e72f2edb798291adc7cfb8719e86ea75e29d339b285abb66e61c3d81823c3430845a1afaf974c2643476727375e7f35e552857c7b013d9de5c2cc1257edbc960d63c38185b8d5fc056421f84ce43916f672ff1c955e370c745da55aabd25768a35b9922bd78043dd5cbe90b4bec5cdf4b32d95863aa54aa1c3d7a0645d1ddbbc04460d3c03966522c165194143bb66f279dd6b97061994442a5afaf0d29354e9f3ec1962deba8d76ba8aae21e4b090fda8ed2b2c97574d39e5279f3cdbde47bd770d38d37924e6a8cae19259349236d494a856acd606ccbf5ecd8ba89b1b56b181a1a242f0cde3af83637dd7a23033ded540dc9fa0debd8b1652dfb0e9ca46fcd95ecbc6a33a9542a603145cd96188bc2fdb76133ad945a584def3abd173cef8d06296d6ab51aaaaa23148161983cfae8633cf1b3c74824936cdfb68d0d1b3670f1e20cbb77ff8243870e3134b4861b6eb8165575cec98d8c8c92cd64181c18c006b66f58cb912347d8b4750b9bd78f50aad4e9eded63fdfa750c0f0da1282a3d3d3de47239f26d6ddc72d32eaae50aa96c8eeb775ec5a9e3ef90efeca2a3a383dede4e2af317982a0a3e79cfa719eeeba7b7bb1da4a324babb7b58bb6e1d1d2993351bb6b26ddb26cc5a0d359164d78eab58989ec4d6528c8c5ec9b6cd5770e5d6ad64735ddc76fd0e6af3939c992e73fbdd77d35bc8313c3484aa69dc71cb4d98cbf324da7b69cfa5e206910929e5d7c5d4d474ca34cde72ccbbaeee479a826bae9ef4a70f2c831360e427b7b1681125a01f0ad62215014d5d77e12fc67a7df3a91f8bcdd0070f68c24a02a0a20ddc3bece6e50e812cd95fafba564e1ddc25e0287135da0422693c0320df4649a8ec42493c77e0603f7f1da3bf3dcb163987cbe8d4cc6d979989d5de095570e90c9e4ddab9abddd4c676743d354e6e666181f9f67eddacd188649a552435555329904954a8dc9c9c3dc77dfc7585e5e42d754f7b66219d334677e221405d53d0262bb8b8fcee509ee3710de3df6d255e260db168aa2a22802cbbdfe5911f8074415e17c2fcbb2034a23baf525222aa5d55c99104473b4d14091565bfbd166c793130fbb5a9c314b5eabea4b6e59dbb6595c2a924ce5b04ce758ca238f3cc65ffce59f23a5c1ba75ebc8e7f32c2d2db1b8b8c4d62ddbf9fdaf7e95b1b151a46ceca20921b02ddb59e8c6f91696edeeb6ba07dcbd6f1d3de0ebcb9a7476d054a1b8b76a3b781557017abb7fce4236ee42ba74ae19773741c0db8d13fea648e3462547e61545f832ed1cb8b7c0c5af281efd22bc3b1ce6f56b486ed390d23f62d1d36e7374728113e50cf59a4142cf206db0dd03b2deba4cf0db5bde815c17b9b3da1f866d8afb22dd2341a18fdcdc29e3eaf3d34a1118a3291641b8be15eb72eb13c2f920d296a43319161696e81c1a2199e9c314166bfbdb9b8ad56a75366d1aa5bfbfdbb91ada35d16ddbfbd7269db6397b7682f3e7274826dbd9b56b94c5c52a870f4f3037374e3edf88d4803b6570177b1a422d1434731add3881af013df331e885e8bd17de7bc0f6c2d67a614d8370a2c12b5ba283b3b3eb2a2abf8e00571b7c8c2eee447ebb64b40c1a27444089787343b76e41e359ae568bc4bdbf5cd8c0f38a7ad755162243cddee278786b0af7dcf351b2b934cf3cf32cf57ac54123eadc7cf307f8f5cf7f9e356bdc1d2b9ae5c6f66ec976f966c7f4579b068cf7d30a106bd108632c7006a438f26dd3f6db67074ee35b568b93f95ebe57a7157073f0fe718d97580c11796e5c4660d9649292d18e32f3c512b93e15555302cc71856025eb56467e469ee3d60d1b79b2094e36c1b4ae2ff8b89a0190507dab681b34d63370b654a5b4a89a3a99aecdcc57ca0c76f634d552af1bb4b56549a79324122a9665fb0ac95350a954829d3bd7f3cb5fbe4532d9cbdc5c17a5529943875e219bb5b8f7decf39a7f29b9b1c6090c454bb31d54e44a588323b874c64905d9d887211f43432a921969791b92cd826caf44564328becea40542b604b6436034605512a23b36d28d3d308c340ea09ecfe7e5004a256475cb8008a86ece94526636e731402512e23551551a9a01e3d8ab5650b329f477b7d0fd6fa75c8cece8672894962760e515c0624766f1fa4d34845417bfb6d9489f3d85d5dd81b3720b3d9a60fed7fef287a7f2343225caf5429707f07ec3611008fb3c256ec2b4ea62d25cbb5229a7fdd97444f68dcf5a1dbd9b9733b8b8bcbae95017dbd5dfed5e0ab49ffd4e40be28e3db5ae4fab542b542b15275c2ea00be86b73608a6ea768a4d5d8c07164c6363b064d2b3bbc45f9d5907299f5b95db509a1f764180699b413a242d77516e61718ec59c7e2d24154d1d344866ddb98a6c1cccc4c830cf70bf98bc0c0f0f01077dd95e2e597dfe4a9a79ea2549aa7bb3bc5b5d75ecbdab56b595a76bf856be1c6364e08589a27f1831fa02cd5b173398c4f7e9cc4f77e88ec5e43f58b9f22f5c077a97dfe7368affe02ede05950148c7b7f0b317594c42ff653fef77f84f2fa2f487def11aafff25f93fc2f7f81b5e54a646727e6673f037a0a7def1e12dfff01f6c80072602bd5fb3eee2836d342a633609b0869a13ffe1476a18079f3cdd0d54fe26fbe46f5f77e1763dd26642e8ba81ace2d47a914c2a88161829e44ea1a08c8fcf5df219349642643fd9e7bb047f350ab23de3983ac55b147c748fcdd37a8feeeef22d34944a5825475d035a8d740086422d9c4a6a69f21a3cfbb3a2a2ace315da6a97784012412d3829a51a25aad36b205a4d34932e9066d524af71b0771bc47f96acafac796afe6972bc9571052ebe868c7ca67dd0bf92e2f45a7f4ef37fcaf3aad444fdcc02804944b65273897b4c9a6d3cc2f2e628a4ef4dcb06bf26a213cb59a8110369665609aa6af882ccb229d4e871c310b85021ffad08d1c39721c551d61707008ef02112f059559535255b4c34711a4a9dff351d4fdaf232d0369d790f3efa01d3c85289511f3f368074f50fd837f85f2ce2be8cf3f8bb9b61379ee55d47d87508e9e44d472c85a15994c605eb10999c922dde99dac55b13b0a58fd1da817269002f4e79e477fe515ccabef4439b517ac1adabe439049836992f8e94f514f9ec22eb4432a8d39d285bee74d445dc5bcf92368cfffd8512e5a1fd52f7f1e3b9f825a0debcacdc8b676643683f2ca33249f7d036566116ba41f7df76ed48909acee6ecc359d249fdb836cebc3dab603eda98730eeb80be3ae0fbbf14756fafac1af1de4ad6475bd362edf596bd1758d8e7c7bd314a8d5c4b11585ab49ff6f93af4ba556f40a404b2412d89ae6df2c1b0588c322dde73877a17059778ae42d83ac40880c9409187ffeff576ac8ea529c96f6c6431156442de815024cc3c232eb4829d1741d5dd729956b68a92ecaa522c9c808ed5c55a5238446b95ca65aad60db9262b1c8e8e8285d5d5da1b50421f26cdf95627c791261a84823d0a1034d082dab0489b425525591aa82fad641ec7c07a4b2181fdc8e76e875949945bf8c5484032b6d5054aced5bd17efa0de8d985353aef08b46541bd0e7a82e0fa96a8d5b07b3760dcb913313d8972e23094e6d01fff3eb2af87ca3fff5dece1e7b17b7ab1d78d61bffc32f6c020d5dffe32e9bffe5bf43327b1afda85d5ad90786637c282ea57ff39a9bffd5bc4dc45681b75e8340c300ca494245edc47fdee4fa21cda8d767a097b68086bfd7aaa5fb88ff47ffa4fd43ff53994b75e467bf955e4e07a8c3b3ed4b02e5d7e35be69f816635f05b98667a3cf052d209a70c526892b1cce11926432e99f45f5fb912599aa084e17256b527546da12f8d71ec1fb2a5f1ec101ec78d7a5be7ff215a62d28cf8deb999a6db6e6fadc5b52a4bbbe148d2e00cee85cafd7a9d71d41cce7f3f1a13c7c2a569a80bb6484f4c3e5b022a21945e45d082e48c37b6477805e6ff1dbfb2d2524749dc585057a7bfb989b9d2193cd858a6b9acaf4f43cf97c1a50d134678b349753310c8bd9d985a62a4bf5324ba51295629d8e7c7b131da166babf058065636ede80fad65e128ffd14f2ddd803a3c8d36790bda318490dfdd967b03b3b30360d93fe6fff15296d8c7bbe88b8781c6bfd15c8ce14f46c437f7c12341d619aa8e3e3c88e4e4ccf52d3758c1b6fa4fe898f200c03e5d824eab1e3c8beb5a0cf6317f2c8b60c565f2789ddbb31ab37607777219666487eff07484dc5ba721ddae1bda852606dbd0ee5fcdb581d1dd8850ea47b39a5d43494c949e4e21262fb36cc2d6b493cf933c4d2027677373295444c4f907af847589b4749fcf4c7a026b1366d06731199d09ce921becc377d5aa069ed3c3ac56b2abb92528a004a70fde51a4bd0f3558bdd4b49cee929ec9ccaeb338bdc592eb3b52785883b6ef9ff49f95a19b7585a5c4c5996fd9c6ddbd745ad8362b184aa6acccfcf73e6ec59766cdf160af6ef85f7f00efbd92b2d64fa6448770bd4f9029665f9b18d2f776ab552132f2bc52068aa4f38634ea958046cb219e76654dbb6999d9ba3bba797c9f313f4f4f685dc052a952a274f8e532e5762ab8e639970ebd27495b1b161dadbdb9c2de5857934d51d81e366215e675a5e409d9e4166f2d8bd3d88e21232930545a2cccf6177f4805547999c84641ebbaf1b51293bfdbaad0d2c13657e0199cda29c9f70ac9664126b7818140551a98065617b8bce96897a610a6c155249a4a620dbda11660d313989ccb581ae43bd8a2857916d6dc84c0a656e164c05d9d78b2815b10b05c4a253afd47494e9699425c7c2b38786900905e5fc34424d213309a4aa40b58452b7b07bbb50262f403a8fdd9607a386cce75bccc6a2ab1c97ea79016647f91df90e5e78710069db94ca15da0b1dd896eb4e23047b2f96f877662fe55a02c5806c52b273698aff71d8a6b790f1e5485514dfdd061c99f1e2e07b56b6efd326a573d6d423c5bb18564a3764cee52f5d5c8a3badde7b878ffdfc55ca97fbf09a40dca659b6e36b145db7a8d70d8cfa32c9d42285d40272c0a2545c40d334d75110ea9522c78e1ea164288caddf446f67ce35109d63259e8f8537ec284230333bcb934f3ec57df7dde77ca437de60607090a1c121bc5b489d53ef9e75e29a9b1e673dfaa568118bc7ed7491ebb8850cb02278bcc3df56776d67974b416f1c8940b81701da52a208fc0ea2a8ceedc14b4b8bb1d7e1a4d329b66eddd87a5d6885d46c9d0aff5f21a25fbad13e992f60b575386d95125928346ec4e819708efda869ecb1f520a593e72a1961391686b76366af5be77776e1b5cf1b9cdc6f2b540d7b78d4a3cce19894a066b0d76d08695fe72e44e7d91e1c755a246d64b2c3398bd8e11c101648647f1fd640bf5f5000f69ab56e3d2ece42c1d91597127b6c9dcb0209e9a44383d7494454a33438da3cd1699ef437250f5fd37768548970fa917792c069aa8d512973564a8a26b41b20db04ef9836a5b2896cb7fddddff1b367191a1ee4e2f9096a224b6971968b172f92ebe8e68a8deb11d262fffeb7a8d7ea64b359b6efd8eef80a0985c50b131c3f791a2dd3c9a68debc82435bc6812b6eb1be5cb6a60d2e54f27dda51d4578c1ff1a4a39e82785eb18e91916a665313e3ecec8f03036f87e554e99d6f2e5b8e3b89f1adb392b27a5c4324dacea324a2289aaa5310c8382fe1205fd5184aa3350109c9bbf9772f956f2f91cd2acf1cc23dfe1c83c0c7466b18d12b99dd7b0343b4d329347d534a62e4c53e8ee23a148aacbf3d4451289cd896347387bfa24c95c27a36bc7c8a474a627c7592a55e9efe9666e6e16430a868786dd0075011333d09ca0ac479572541184dcfe64e3b971854d50c3459588f43bafe7f0e67d6484a0bdad8df9850534ad394c895fe7aa2380ae9084376a429cb0b82d72da24bd370d65e600353a99b00362e8f549115879100e1fbdd9858c58b5a1f8ddb6c717af6e775d21c6870dbc4e18aedfa7dd7fd7dc0e1198ae08bf3d1eeeb0eb6743193578e5af77042c9ed0ac3868f24452f413fafc0e3c0767519e2c7ac7a644ad843a7f9235c5321bca05f6a67a595660760a44719113dde71934af42151a75c3e4dbdffe169fb8e37a5edc738c6beffc183ffaceb7185bbb867a69817d477771d38e357cfb816f73dbedb793af56b14c1b916c673716000020004944415450295d38cd771ffc3e4a5b1f69d5a2239f60787890c989f390c8d25968a3343f43b96692692b609416b11359dab2292a8bb3542c414fff00aa55616aea2299f62ed2098dcad21ca5ba4d77ef0009516372ea2299f66e520985ead23c65036aa6cd3ffc5f7fc5effddebf60a0a78be99959544d677070303238347332f82935e99e53b14c8bb97387289a16c9c22692ba4252bf80da7d0da46f82caf31813e751f28e365d5a2e71e0cc453ef985dfe6e5a77e4ab95466cf9e37f8d18f1ee28b5ffc2d5289040ffdf0fb905b434716e6a6c7d1134946375fcff90b17f8c98f1f61ae9aa133afb3be27c581e3a768ef19626d6796479f7e8eaddb3fc097bef09ba49249ff2347bb4bb013cac8f34ac9f6bb547cb990f114ec74c21d495411704884443289a6e9188681a669e8babef2eed965262104c964d29dfe0a7f7d2bd88686a012b8a948046433289c9ee269d80b7e5d911f1ecee07b0181d1b691219aac134f1134061611b04a7d35175cf48db63dd48e20511198200fa079e138d49e008d719d25c297a87a8fd615a9a2a138037268d56b68c71e275f3dc76635c39fcf9ee43fd46ee795cc301bf3c7b875d33beceb38417d7186dbb2b72084caf9d3c7f9fac355befcfb7fc896d12e9ece65f9ece73e8f2a97f9cbbf7e90daa63eaab51acbcbcb6e94531b81e0ed23a7503a07f9cafd5f46d44b48145e7bfa27ecde7b189424ebaed8c91b2f3eced89a214ecf18ac1bc8333557657870889347dfa4a3d0ced01537922f1ee3c0b959b454273ddd9d9c3ab68fb65c8eee911d7499e3bcf6ce39b4ec00437d05ce9d3a4c3e97e5ecac64e2f8715e7ef915f25479f2b5b7b8fe8337f01bbff6b94654d7b839a0a7c8dd6c4de206b232aa28b242c56ee3d491774825aa6c194a92b24e21b33f626941b05cbe9adeee94e35e0ee8d264b954a3bbab8bd7f7ece59a6baee1aa6bae67eb962d7cfb6fff1ba66df2ce6b3fe38a6dd7b0f1dadb184d94d8fdf27efa86d6f0e57ff6fbfcd57ffd4be6662cea7336ed439bf8d26ffd3ae78feee78a1327985baa63989244423a3b4d810f1f16a5e636b6da1c0e960d8facb4b4be42f50af7065e57a83c05201024123a8b8b0ba8aa8aa6692c2f2fbf2f8a494a89aeeb64b3d9c6193bd198c636da163045825689686e7b382c8c672109bfe12d0cb2503d3200241a884353225ff54434bf6ffa8b3056c5fb1d9d1d05853c80dbff50c2b3a402404a64700931211ae3b18133629bb9a8024a2ca2a403851bbf3d13d325c09636965987c9032817df829925aecf74f0bf678ff2c77d454a63173820052c291cb40ed13edfcecef61d64dbda19e8d67973ef5b8c74df8c655a54ca652a0be7b0441a5b4a3a3a3ad8b2652bc9a4b31b6cd936d9944669719199b979d4ca2ca94c9efd074f72e35d9f60e1e45b1c7cfb20036bd673ff57eee74ffef44ff9b5dffc1f78eca1ef313e7e829e2b3ec0dd3b4778e8d197d1ed653efb95dfe699877fc8c49965b6efba91ebb65fc9b7bef56df69e3a85ececa1dd3a4f3165b1e3ba9bd9b1798c071ef82e7dd7ece2decf7e8ed307f73076ee3c338b26a62d515dc9bc94e120713dbfa574d6994a55838a6122914c4c5bcc97af64b93ccce4f4384bcb3a9b37a4d9549a64c3da4e32d92cb7de741d4f3ef220524bb17dd72d64b30ac3806d5a54ab15b46c2f9bb6b793502c8ebcf038a7db7bd979e3ed2c8cbf8dae6af4f60f52ad55d9ba7680370f1ce4bfffd7bf60db55db58285650b2053f7a406826e775ee8049df980af85021d89082f647525708a25a28081b42ed747c69dbaea034a69802686f770e3fcece5c64617efe12acbffc7411b06c8b427bbb7fa96150184232283cd172ff1f112867592d6225054d82c04f1979e72c034ad72208023b6b882123483adfa911b225a01c1541702a2882f9311651a81da229d31f28625398cc86620b82f84a3e42934b97c0ed2b710abbd1bcd06f5c0bd73b5dc15c09666640a6416aac9d7d037dfd047bab650a4bed74e53b6953b24cd5a7a06d3beb366de5531fbb83a77ef6735ededb8daaebfccddffc35e94c9e5beffc24f9b60cd56a85679e799aeeee6ec6c6c64028acdb7c25eb4f9ee01ffeea2f49e73bf8ccbdf772d38d3b79f4e78f22d21decb8f63a6a0b13686a82b56bd692d1353a7bfb995d5862f2ad1778f4fc0057dffa51f2cb47f9de37be4661602357aceb64a0b30d3d9961687888db766de6f9bd474967b2f4f7f530d8d54e229965647810519ce5816f7c8d356bd6502c57696fc73d8e12737a21c8647fd00071616a3a6598e673b6655f674be91ea6b5a856eb2c2c96999a29b3b05c637e611ab37e0a9532b7def82986868691d2a65a2e6349dc7099cec29daaaa98f51a35c322954ef3a3877fc8bab1b56cd9b6135dd7b14d134dd77c87434d53318d3af5ba89a6ebd4eb7512c93449d70338945a8d827eef128ddedfc485f88ed5e8552ddebbe50450ae5448257572d97460646f140eed8cb440ee4f150531b4b622c41566773733e47de26eaf8b982fee29d5a0aa6a9ea634dba00d3f1708fa79d9de06858faf619e89c05e7798fd8dc67a7e4542517ca8a6cf18b067c25e3641ea654c6eb85d0d0aa3ed8f24e135a9113d2a4a855fb7df64192c4e333fdd2329cb4552e93c66bd4ef9f59fd0f7dc5f5328ce52a9c2d1ec087f727b1b8f761e202d1298d2265d4df027ddff0b1f5b7f3775a38ea669d896e95cf5246d27c2849e209d72627b552a157f673b93c9b88a55206d934aa502aa4e3a99440849a55c46a83a89848e6d5968aa866999689a730bd22f7eb11bb356e3d63b3e84a6eb285894cb55b4440a55711aae280a9665a1aa0a957219db86642a89aa389b40966d816d53370d1445c5304c52e934ba16736c29faa19ce7c615e186e14417087f2be10b23806d9918c622f5da2289543f7a2213fa3871cac05b4c2d158be87a824432d1d8a56bd54f56a348562a1f07bb9232ba545d01382104954a05216c526ec708150f991ebf9a74a9e961c83a5c4d0aea968818374d7c2f03f9e5d2b17af8cb6ee1fb922e556b5cbee70798cdb5639a16a651a7f4dacf10bbbfcfe2c05692b7dc4ba93bc35f9ffe3acfccfe927633c7bddd1fe137aff81c7d85bef0b76e35d85eae7cb4e8f30241a5eab8b4a453e9d02ef87b4a97a23508e3e4bf86e43671fefc54caf41553f3081996eb566648b086383360e51646ba7f64048f1fd3e3b0ac342ec68e7e4df55d5ae355ab55baba3b2814da9dbd6f1a454cd3a05cae609a264278d779477912b5365af0c97f74db2f259aa6914e679c2913aee515c817ee7cc3af41b4ca733c9263bd0e57992ed5139a53d87fed92d0814b1142076a7104be61cf456889e1898cb88a0437de5ae1f4323dd8069c83270a2b840c386a7a37ead85c989e4611ba73d3b500cb3429cdcd90c81748a5d308606ae902af9c7d9df5ed635cd1b79184aeb7e06b6bf9bad4f8db1aba59e65b61897a70876dec662ade8d7c8163316975c3a056ad398c7b9f7691fe1f4bef6a30bdb4caf3d10ba8d5ebd86e5400d729875aad4eb5eac4744e6732a4d3694cc3c4b2dfc53df13149114e64d1858505142148a6dc2b9e6420ec0941f709117876955860fae5b86dad1cbee2dda64b7f82f0d6c4caf05ed487e084b43139448a8672f6e6c7be411ee481a39c7c178855e36cc0da11c1f5fc7ffc92b6af93f078ec4553ad5b35eaf53a9ea6d5f3056c2929974a00b469793e32762742084cd3c430de9f7ef3bea75fb17c05abd1744d45ea2a8ab003fa4c34b9c63b3e1972753a8fd55b704e5b5bb738aa9583efe34ac48fe4616dddacc15bdb3161346ee02bbfd34a96978a2c1797d1f424aa9ea4adad8d743ae3744478cffe4b9e4249a7d318f57ac31936645145937b0d8f8c71c4f4044a36f3308ed7517ec68dd7217a5be05929ad842ffc26a62d32f03694dd0cdb086db31a9c518ae2626a86dd251aa85d75e55a6cbaae82547d0cc1707a5e2453d717a5e1bcd85457385d8e7c11a82f2eb59a21ae245f61f856f215868ab3f75a25ad50680b5d112e84a05235b83053a26eda28025445d255c890cf5de232c67f92e93234ba1014979611ae37ab65d9148bcbe4dabaf8f3efbe4071718efff07b1f47d37472b9dca5f1ad9642e91cfab5bc3bc6bc0122d073e23b920cf97f35abe140771281b732dc893cb8208c948dc5e1f094261e4f004b984ee1e5888850c6c0b25a05d680959780698df372605bbc91124dd7686fef885d1b140896972bd46b4514638e44a69b4c5b0704767cffe9a7776931d9b67bc6c69d965c982972767299b67c86644247d3546ccbe2d4b905726995e181827306e73d1170a971f5bd591997aef372eb73ca3abb0eb67ba9804db95ca252ae90ce599c9a5c647e6eb6e119beca649a06a562098473c75b424f9009063e03fff80baed366dc99c4b81154c6e485f203c357dc2c3ea4fc9a602263700b3c32921f327142f08113fe3e58f3981cd7965623fd4a3cb914ce956043753666907e86fff55dcbd6b66c3ff4b4d7356a558393272ff2cacbef505c9a63cdc002fd5d2add435731ba693b9aa635f1fb1f57be2e57a1bc17f90a9717c8c6911489e4e26c89bd072fb066b8134dd848dba4239f435104b94c9aa32726a9d567d8b0b627804f46ea5ea941c1217465037ec5f27e7dd105b5567547f1afc6686da6d71bd5cbe5328b8bf3589645229524a909d60c7633bf30bbca7640b95c66ef8163bcb0e718d34b123599c3326ae8f63257ae69e7e31fba91bebede668a3c05d582724143e1acdada902bf140b88732e3d7a4a29eddf13084a53a94d1029f6cee21ad94d26ae16809eb0e3c3138bc77d19ba1fc3c1981970d584923d0be37985896647eaec489e3339c1b9f435512a433dd4cce15989c99a770f13c9d831b686bcb376a0bf1adb98f876eec95b86e255e68ded52c0c4914c5097fe35fdf1daacf7bf1ab94af70693fb4ae6559bcfcc638e39345169797104a828d637da412150cd342513452a90c6fec3f4b6f57965c3685653a3e108d9155629a269aa6d2b46b112439348c36f24dd37476b262220d348df22ea206def038b91af35c78e582a35e5c7d6e4f7396016c969697e8e9eea6bba787a5a56514017d9d79ff70f34ac9344d5eddf3164fbd7e96fde3160bb52475132cdb405375d2c93ef69f9fe79503dfe7cb9fba8e1b6f0879713883b06c5e31f0beaf65db942b1524824c3a83aa8447791fceb2108a739904d2a6522963a3904ea7dc5d3fa7867abdc6a14387d8b97367c8a9345e645bad4811657d737ed47e910dec515d16a740e274de4aca8a2658d904e77dfa5678ed4813a27dc8bb56ca76affeaad52517a797999b2da12a2aa3a33d18a685695898a645b1d8c5d4d4454e9d9a62c78e1cd56a957add404fa648ea3a4195e7555b37ea1c3ef4363b76ec70bce91585b367c7a9542a5cb169532800645056829c5714850307f6d3d3dd436f5faf7f21c13fb67c05716b8e67b56469b9c2beb72739393e4357571beb467bb9fdfa026db914a5729df9c50af3f36526a72b8c9f9f63a43fcf0f1f7a88fbefff124e9c2267caf1ed071ee09e7beea1b3b3cbd1c0b8278c918d9b15dc7d55c53d9d6cdbce56f8f77ff07d6ebef91646864702d39540b771230184b62de39cfd3ca5e83b5c46baadb7ae1150908da0fe0eb764a302bf3ec51df952c914ddbdfd9c58ac73e85c910f74aaf475e5c8a4532b0a8065993cf6d48b7ce389e32cc83e8a650b453149a7d32454855ab5c6d4c51972d93c678c36fedb779ea5afaf87f5ebc61a9f2d70062f2a348aa6b2f7cdbd7cedebdfa0afaf9f0ddb6ee237eeb91569dbd8eea8c8ff4dde7b875b721d879dbfd3e9e677df7d3987c919988c9c0391093089012228910abb96b9f6b7962d7f9fecfdd67250b224af2d5114291120455204884c600022cc0c66000c26e79ce7e57473eceeb37ff40d7defbbefcd00a4fcedca071fdedceeae934fd5a9aa53a70acae1c083c110b7dcb081f7df7e8d77761d41f707b9f7de7b59bb7a79d9a9bca2a8b4b5b5173737f79cb8c6bd3cbcee16d5c2d4c2d78e945df95e3d39555fdccc5df5422f72b4d4224df5e5935af16dbe324ba996a19435ffce35e9b2f89f2d259665323339842a1ae8ee6aa25030314d1bd3b4c8e50a241259d2e91c53d35112f1089669f1277ff227086cb460075ffa95cfd1db1ec1b42c4a36868e8903b4b6b69539334d53397dfa341313e32c5dbab43c37b66d973d004859b9e5583243f9e0830fb9febaeb686b6f7336ade265f16afc728faa9803bf64595efdb8f85521f812adb4d0b3d90201af970dab1673fae2157ebee33823e3511ebb67054b063a89c6b3bcf3fe512e0dc758bf3a42478b8fb1d151ce9e39c75bafbd88ad68648d4eb6feeca70c0d0ff3e5cf3cccae8f76311435d970cb3d1cdbf9335a5b5ab01583f8e415a60b5eeebbef416217f7b0e7f815829d8b79fda7cf73f8f0117efbb77fdb896f2e4b3e5ddcab46ba3a5b49b58e14e65e3935a4bb66a9ba3d0fd4b067d808a42d49a592c45229b65e4e73316ad1a69b4e245ebf3bde5a759252f2ea9bdbf9bb2d9798b69ccb97ad6d8e8ff04c2683b49d7b4f9d9d9d9c3f7f8118123c83bcb96d2fbf35d85fd65b95c48352723bad0095582c4e6767176b57f4b2ebd05e78e476de79f75d3efc6837ab6fb89fe8a50364a2536cdf7d00afc74b6a669c83870e73ffe7be4c6af81401b5c07b3b76d2d8d8484b4b0b5bb76ec5300c1e79e491b25fa0fa1dac9e9bbae35b350dd573328be1777d2f5902d8a5b28babba1a1de61a939a265e6b996e5aea5a4ef52cd1e7226ab2c879485b52c8e7895f7e0fc5a7930fac23d0d083df6f50302da6ce253973668c70d84f7f5f331d1d110aa6493299e2c1fbefe49db7b73239368e39798a57dfda89d1d4cfd245831cd8fe3356ac594f329b63666a827c3286d23c48736388237bdfe7cf86865878fd1d2c09a7d8b2fd2302ed8b59d0dbc1e19d6f70e31df712088579f59597e85e7603390b462f9ce62fdefd39d213e02b5ffe328d8d8dae03895a2edd3d9f251c2989e173cc3ff3e357a92687632a72014240d06f10690c333a31ceb153231c3a318eaa287cfdf34dbcb5e338bb0f9ea5a1a101d32a20a5e3c06a726a92918ce0c9cfdccf33df7f96356baee3cb5f7992d3fb3ee2f9d777d0d3d9482655602a3ec57d4f7c89e77ef87d96afdd486b628c777ff62207f7efa1a5af9bfca55156ad5ccde34f3c4e7b7b0766dd3031f516bef33ccb38ae4e9e0a91bb8aa2a3ea5b055e20cb3b4c219d64455b88d1bc454166e86a0e11f07ae62ce9fcc5cbfcf8ad33ccd89de4f3793a3b3a989a9a02210804024829191919c1ebf3b160c120274f9e241868e5e0b9cb4c4fcf942f69222bee6d67f5b0e87ae4c2f9f37474f6f0e8673e4b3a36c5f4957324a68779ed1f9e211409f2d92f7d096f632b8d4d4d2c5dbe927d474f11f068fc6cfb07747675130a85c8154c7c1e95c3870fe3f57a79f8a1871c9fdfd41ea4d72ec2ca45cdd9dfa959b4d5dfabe0ddfdabbbaf3873536e8da806ac4f922af0572d733efa3b473bab92a86c2252da28aa4ea8e34646cfee60f8f47b34b4de82c7f0e2f5ea4c4dcf108d4d024d84420d140a947599fb0f9d60f58df73130d0c7fff883bfe152ce4639768ac4e41a72de6696ae59cbf7bef36da653593ef7c52f7264c7bb9c1a1634f4ade49edb36f0fc8b6ff0c1c41033aa1779fc0c334b57221a3a59b26c057bb7bd49219be0cde79e61f9ea95a43c30134fd0d4db07422fc67e733a7975fc2a11af8f8b5fb3df097094dfb665e3f3aa3436e8ec39749ab7779da0602b284270e0f8083fdd72882ddb8fd3e0375832d04c576bd0891b55dcc51776b6d0d53d80dfa713108277b76d635967130b7a5af03434b174713767ce64e86e6ec4e73158d6d7c5e8988aefca30ab96f633637b58b1a40f999ae1fd9d3be86c6f2bfac2ae6ef85ceab7ea9d6c76776bb521b5b12f846036be54d557842fb2b63e9f8f442cc6e29e26869a758c6c8c904fa321e0ad5b8e6559bcf5c171a66507a97486eeae2ec62726686c68c04c8e307e6c27c1a64e162cdaccb90b9749673284c361b2d902c3991c935333f474773a6d28897275ea711c8cd9dc7df75d7ce5cb5fa6502870fec411b6bdbf8b86f65e94f4380d010f8bbbdbc80db7f0de477b59d2df4d6f83ca9b5bdea4b1b98d505307838d1a6fecdcc1c18017dbb68a274445cb6d3772cfe2742a77cd4a90ee71acfd3d17bceb7339d3dcb6bf7528f4bc497ebc32eba5b93b54cd20ba14df524a221dbdf81a1ea571264a2a0de7ce8de3f5085a3b7c74762fe6c2b914a9549668348165b5d2dedece534f7d0dbfcf876ddb2c5dd247fcec28cddd1db4b736a0691a0d7e9fa39735731cfa680753891c8dcd9d74b5f8e8e81a405325cb97f4737838466b77272d4d411a1b1b51b1d9ba6d1b56a815c3ab20ad3c9e8608ad2d118e1c3d48fcfe3b0905bd655fe5f3e157a9db9f1cbf668fbc665b8e670143d759d81fe2f5f74e62498deeb6105e8f463667f1f23b4749666db2798bf66695aef6081278fcf1270887c37475752384e0739ffb3c3ec5e2fcd0184b562ee7a9ae6e86c6a6696d6be3baebaec7b26d1e7ce8619a224d3484c30cf4f7a152e0ccb94b787c01fada9b3973e1128ae2c45fab58e7d65f13f30d54ed005c0d762e98aafa847353dce331c864d2780b196e0f5c2131b39f7cf61eba5b1a66114d80a19151761e1e27996da0211422994c12f0fb498d1f67efcb7f44666608cd1766f367ff3dcdedab48259378bc5e52e93452a855e60125e577bd869a96c9ea356bc8e5f364b259a49474f60df0dbbff59bc42d0f0d411f3e43c5e70fb061f30df8420d049bda78f8f34f72ecf8092cd5cfd265cb082a79f46098ac12a439ec730e334a9e08cbd55594c5ee319abd63d6885055f0556100e69899aac267ef4af35530176c3d45d35c70b575d436b5de62ac916a6cab1257cee3f3d3e1733c80b6b587c9e7f3783d3e468652d8769a91d14906173927e19ffdece75014c5b10417827b9ff802fda7ce92cae4e9eaeec6e7f3a1e93a9ff9ece7f8e1f79f66c5820534dcbc80d6a630d22ae0310c3efbb9cfd31209b0f8d459b2798baeee2efcfe00aa6ef0e4d77e9db1781e5f204883df404a9b5038c2a6db3b696e6a2ce3e0b5d0fbfacaf0abc3cc85cf627474ccb92b67db9b4cd3e29df74ff3daf68b780c3fc180233ec49359a6a331960d78f9da6737d1da12464a47895ab27f92b6ac8400569c90c6cea94f25686649015712394ac27c391cb12dcb79cbc8578f3d9a33c90a79aeb2f4ab333a7395355f7dc2d107057c1e10122915da4271864fbc041d9fe7f0a5149b9755fbfc067865cb56beb56594d18442576727e3e313b4b7b7b0e785ffc4c8d1378a652bac7df4f76859722785421ea47382e74b1de7cf7ff751fafb7a999e9e2a8608f7549a262b0a5c21f3a8328d73bbbcb27fa99a5a567a4a64d9a198aa698e3f689bf2bd3ecbb690d2b9e727b0cb3b9d55743f5377585d8858d6cfcc8229cda798055f3f126f3dbeb70e75988f7b990bee6a69de325d2f6729a36af84129892773a8de164c77b41b577f85105cbe38cde54b094646a650f514b7deb692a6a64805775cac87aa96426fdbe5f9144270e4c861962d5f81e18a782491c53264d9377829ea762904b9db3d2ea2785065db73847393ae2e8afa63f38be097939cbb72b21489d7b65114c19d372ea4a73dc4d98b51d2198b82e99ca475b636b16e751fe186a218271dc33177e34a04a83c0516579f64e144082abdbfea0daeab0e86acf9b7f67bcdbff3955f43e24b44554a89d7e361726a8a96e62e7c0d03e4b0e86f6fa85b643491c652bcd8761655d3b06cc7e58474ddfb09b52fa1b5ff3a12c9244d9188e3db39e023397516646920a9ec60e53f45ae432a285602cdbc008aea80978ed60ad5dd2939a010591ba57447b2e829b43c54a53c451301a560222c0b3c9eb945ae521d661e3259642008aa520d2366c3cf224c6e194008b02d443687f4fb9c6fc5eb3ee873b832b64c6751195ee69ee86b48853cc2b29186e184cb05273083aa569ee7217852da78f052b09baba310b9b835e744db229d89d1d4a4d3d4d246301870dcf1d6e017803d4788ee952b5761db3685427520c2325350275f3d1ff5d74e6c647daef317c02f77d2ac62a86ab34c1d048b07dbe8ef6e24932d604b1b4357f1fbbc08a1cceaf82f25d5b2de9f642d5d2def7c037e8df509211c2b79e9ec40baa6914a9b049a97919e99a1a5a10f666d094e3ea5cc293a10f982c9aadb9f44377c2426ceb370e363d84604c5ca388b5282cc4d50481e9fe5bdd1f5c7f5af8da536636aad2893e75046b34e045d4538914d00695b50f22aa02a68fbf7a31e3c84b56c19d6c68d0ed7551439a4e2eccccaf9f3c8e66648a5508687b1d6af2f56572496a5c6d916457619fdc7df45bd324deed7be8edddaec1034400ac5098450e2684b84d976f4955211653fe4525110f118cac424d6403ffadef7b19b03588b16a24e5c06d3c45abebc242b39a2a6008440b93284323e86b97e03c2b691d246d83851559008db51483b2c82331ea21849049c3e206dbc3ffa1e567f3fe6da95d82d2da028787ef463ccebd6602d5b069659b6cf712fa5b23f265b92c8c4d12cc74ea98ccc558b035a5b830483bd8e478aa214627e5c3c9b0ffcaa1ce035a46bc1af7adf3f417d02d0f2f97c314478beba0e21d035e749e25cbff8b8f2e37cb01fa7ad73d1948f4383ea7dbfd672dda4a65028100c7810c28919178d46e9ebee459d3904d24630db21562193209f4e637842c46231dadbdbb972e58a73acffd0bfe0f8d6ef72e9d05ba8e105b4772f60787898c67090d4d04b74375b04fc014adb53e994a75e7238190bed67cf611c8a92fe3ffe25b2d98b72e522226761f72f40c4a7201e85502bc413884c1a6ba00f3933827aee32b2a313691868172f61b7f7607cef7bd88b1791bfe30eac9e4e18bb847a651cab7710cc2c223a89b034ecc141a457434c4fa3bfbf9fec377e0329d3a87bce237b0690328f32318aece84136451093938889118434b0162e40241368e72f6077f6227550a6c7d00e1f47db7780ec6f7c03abbd0ddf5ffd15f9fbeec55ab306e90d212e9f459988610f2e4424a6118928420960b7b660b5b6a09c3e8648a5914d5dd8cd3ed47317001f764b03b2a519a48d7ae62c4a328d35b81019f4001265780865228972ee22f99b6f44ca3ceaa1bda01a88b11148f6a29c3f8bddd48aed7789d5557301121bdb36c9662d72d9ac0b66360ba2a8cecab3a54d3a33dbbbc07cf855bb663feefefe8f855f1fa7aedaa4b5b63697e5553760266f629a124b4a345521e0d55084c034ede2a65bafb87fda490848269258a6632e110804989a9e2667ea18a1410ab685ce6cf1229f893175f130edab1fe3b1e2da790000200049444154ca9521162c5c486f5f2f93139348c056fccc5cdc4da46b09161aa18608766a2f21f111b7ddf0081d1d5de4f2b9e26a2f11279835058a8a18398512f5925fd98576e42456a71fefdf7d0f73711fc2d38b72e908766b23226562772f404c4ee0f9e10fb1750ba56090bffd16846da2bffc224ada8b18bb089a8a160aa15c3a0f6606213534b5097231849d459a16d6ba3bc83f7033229140199f408c5cc178e73514a9030d48b288e40cd9279fc46e6bc5fbf3b7d08e1fc30efa5157dd8ed91f447ff545848c6037f910f109d00d94d1119473e730b6bc8172f932ead97388581c12332833d3a0e9f0512f62f824b2398c88a6909d0b60e60aeaf008e68a4528132685252d68e786109904d6c042b24f7d1591cfa1eedf8bbe7b0ff6d29bc8fcda638889513c4f7f0f1a3b10d1713c2fbf8a15f6a2ef3f86b9f926c8e7d0df7815d9ba8cfca30f22fd1e4a77e29c45e2e2656d89611834954f9805d839b03245ae5145683ea4d0f98544ceff4fa75a5d4a25cd45c004a095f296ac48f3058bd397a3ec3e97e052d4c2547416b52af4862c5ac37926666658d036c0405f47f9a4e1eae96a1ab17fccfc9f8477ad5f9f7357aef85b3aca7fafc743329946f70449c7a2783db33d30747777909ffe0e66721d6deddd9c3f778ec64823cdcdcd288a86195b44b6d58b3af22c31e121b4a48746cfab74b684b8ebcec7303c06d95c6e56b972d60f1bede001d4d397a03b8872f65de4bd7720bb06c9df7f07de1fbc015260de711fcaeef75046861d3d54328992cd93fb8dff0d3ba0e2fbd67f77c4948bfb31d76ea070f73d4855a01ed80718e49e7c14efd3cf0136f94f3f0a9904dad113486ec2eaeea670dd75587d03e83b3e22f7eb9fc178e6598484fcfd9fc21a1828861eb7b1566dc06cd7d13f3a887e220a96857a6c3bf2fa0de4efbe0fd9da84f1da16cc1b6f44fff043ccd5abc93df020eaa91368674e83374cee913bf03ef32a0841ee89cfa3eedf8dbeef10a80a56671799af7d1dff9ffc29daf119ac9bee42c6cfa0cc144051514e1c413bb00f72099423ef21f9344a22852818641fb803ef85a390c9605fb70c339f43199d814206f5c83172bffd047653b0a2cbac5d326ef15b16d74b66182d731cd32e303393223a93c0ef0dd3bce0069460075c13dff34934ce574bffd8f855bfbd729efab41251925292cb5b1c3833c9a5bcc1a8f092b0ced1df91c36a8873399026dbaa3095cb108a86e8ef6daf529ed51daeb269ba03a728a27849503ac67a57e98f00e7d40039cba6e9da935b1773ad5c5e755d2505ade395d061554a2194745d279188d1d1d945369b25189aad005fb962157d6d92e8c8d304bb9ea4bb7b904422c9e8e8b803e06dc7d3bc9407d6ece3f8e5bfe7cc9e00de5e95c11b1f67e9f2f59536894a8baafc2c95de170a281949e65fff1bccee00c6cf5f431d9981cb47f1bc98c5bcfd6ef4b79e477bf53968eac7bc793dcac55348bf173b20f0feedb728dcb819bba101d5db86754337e6924ef4375fc35abb01ebfaeb906612eff77f8cb5ee666421811d0e223c1a764f97e3384f4aecfe7e647384c2ba85789ef921d6aa1b904a0ed91872743e8a02d8287bde456feba370d783a8bbb7800c51b8a913bb23826c6cc06a0c21d3d318afbe8ab56001b66ee1f9c98fb156acc4dcbc1e317a19ef8f5ec2bcfd5ec4c405a4cf8b6cedc05a98747456c59057f6e002ccfe668c1d3b512f8e52587fa3339e1e0fd2eb45b62f420634846d63b7b7622e6cc6f3ec1bc8d685d85d6d88824089a591ad1dd8912ef237ad413bbb1f754137564fa4e8c9b4e604d0f5434a9066162d750abd6505d3492f4385218e9c3f446c682f0fdc90a47be36790aa5b595f670dd6795f1ff6daf06baefcd5f5d54fb5b8fdcbc0afaa4391582ce6b52c6b9bb4e5a6c3a7c679fd78929db1062e67537c66c3f3740ece90cae6c86720173798bc94e5cb8b7e8d8dab56220458a5d0c7aa5a3c8a74948a02c771bf6916686c8c609926939393449a22c5a3cbab77c2b22ca2d128b66d17b98bda2b11d52ac7b907e7e30c5abdbc95ba52a914029b80dff1792e254c4c4e1089343131313e2b443838c7fedff9f61ff1c6cebf4146bac9c9eb91ea12841a46081bec18d317dec033f62e5f7f08a20978eb23415e5dcefacdf7f3d5a77e8d8e8e0ea233d39510e13523506ead5d92f124a80aeaa1c368a74e917bfc0900bcdffd2ef9c71ec56e6e014594bd7022808289505427fc906983aa3a0bc63411c5cbd51210a685d4b42a5d57492f59abc113a6892c5d6e96c505a869785e7915bbb50573c3c6cac99b651715d4a5b2281ed9e29c843983e9fc160e7113a6ed9cce9594d9c58acaab4414836816f278ffee7b2863d3e43ffbabe457763bef4dcb69945a3c14704e09cafd071c85bd652135ddd99014e128f48ba786f5562438caef543a4d4338829d4f10c87e086d3771e4e818478f1de7ca954b34cb69eee9cd13b9fb9be08de05edfaaaa96efab59d6b51280b95a533c84299e26d6aa6f6af3975c20cb9a712d959b4ea7b12d8b6043310cfb27c6b1592bd931172839894ba573ec3c30c2f3bbb39c6e08d1dd25b93476864c224493be9446b190a0bf832b33cf82946432695e7a6727b7de7233ed3ec9f6d79e6760cdedf4f7f5639a05345de7d8b1a31cd87f8075ebd7b161fd062e5eba4843388ca67b285def508a5e216de9d868509c0455538945a33cf3ccd3dc72cbad84c3617c3e6f71924ab1d8654dd724739b83c959a4ab760aeb92bcf20759f68b543ac596d2f1f46918068944a2fef12ba0691a0f3ff2652e9cf988b87902a5f5036ccf212cdb40d5c0635888ee2ce73fe8e4db2f4ef0d8ad26bfff0d85c3a78ef087df3fc7cdb7dcee8a642a2ac8368b303bf82a4b3db025f6f2e5e4972c29fb1ecb3df915308c8a8e50712d265daf94a9abe5314537aac7452f6d10357ea245e95954a075bdd23c219d7b9fa645e19ebb1d9d5889882a4ae508dedd354dabaea3ca444029b7b342145ded2c3d0b01ba87fce7bf80d4746428889045abf31a8f10b238884277bb70554155a9843fc731c928e6a83048d5f29bc3b43896dfb62db0eda3f894232ceedf40a3751c698cd176790f4abc8dac25112e0f96524a7efad3e7181f1fa763600577df76130d010355713604bb7892295c66d5524a144d05e9980728aa52c6174508462f9d66dbf69d64f071ebed77b0a0a71da12a28508eb482a2a0288243070f136e68a0afbfbfacd3b46d1b4d555054953dbb77138bc7f8f4a71f2fbb02769bcb96c7d2351f57c5aff2f89722f14ac94c224b46f773ff1d3d58170553b902e9b17eeebceb37e91fe82716cdf2e1fed3483c802093cdf193bffe160dc126d60dfaf8b36fbdc0fff97b0b4826930cf40f303c32c2d09521dedbb1835d1f7dc4535f7d8a48538413c78e929a19272efd74b53472e5f22506576ea4339867cfbec3f89afbb86e593fa78fece5e4508ae96802bfdf4f269be59d77de41f34758bf6e2d0d7e95eac3a9ab5ba8d6679267bf9b45fb8b0fa598f2422d1287a278150a86989a9976a2e5ceb16bf4f4f6f395affd7b76befb341363bbd044165bc9a25a0ade9c829d53e8ba7e350df7ddcef113e7f80f7ffb22666e9cdbee7c841b6fbca1729952b8b99352528afd2fa2a39b68699af37fe995d7376b042a04bbdef299832bad792c1302e12ab324d9884afed2c2c3305c7da804c614e5f1ae59e2aefed6e78ddd6350e7669710c8e6a6cadd2f778481aa325d25cbd20654d3c72a1d496d58844aa7a5a3b54016ed04a59945709ab0b740b8e94338741426c78977de836d53b43b730866c134d9b3672f8f3c70373ffff9cf19ecee6261b79ff777ed27d8d6cf60573bd94c8c6c761ad9d00bf104bd9d8d1c3e7484bc1e66f1e2855c3cb29b60b88955d7af271d9be4c5e77e42fbca5b190841213682d91a60df9e5d4ca505abd7ad67f4cc6152893832d4cd96579e23e4f7f2f8e38f131bbb42a021424f770bbbf61ca6a56f09a96c817c3e4f299277653cae45d8acf18c51c6afca77ad846cd296849bc36c5cb7187ddf084fefb942cad7c09199001d3d827d23266f9c2ad053dca12ccb66f9a2262e1cddcbc46949fb8aeb9152f2f2cb2ff3f5af7f9dddbb7773ecd831fc7e1f86e1c1e7f3f1f2cb2f138bc7e91e18446666d896d458b7a885179e7b8e6639cd89c904d98cc9f0e64d9c1fba4857771bf9748c175e78812f7ffe339c3f7d9c43c7ce605b0af7debe1ed3b6aa57e77ce4daf54e5283d7b394632eeed49d1f51a5632a25ddd0d1358d4c26836ee878bd5e0a85c22c5679e9b2d5b4b5ff5b8e1cfa80a18b0719be7c0204f42cb91e5fa08b058bd7d23fb000d3b4f870d713ecd9bd87871e7a80603088108258ac687353742353dd2d5144cd0ab257216f3d4a5bfb46cc46e9927feaca7b1757544d492adc4ff9d93dc0a2ea2451b8f295ebaa819fdd8f1a8ec8455bdc6dab8e06ecfe4e2558689d54cb6f51d5d6cabfe5b25c392a4bc5554a19e11c7f4cb665031a181b40b521ff21565a811313c8630730576e42a82aaae658e1271271de7a773bdee67e9a5b9a79e527df27136c65eac81b4c76747129769989e921ac603701a583016f9a5da7cf222d8b45cbd673f2d4017efdab5f0529998c2689591e9ebcf7367c458abbf7dd3778efc0719a1a0c4e9e1de5ccc93ddc73d7adecdefe22b168829ece76a6a7a6f9c10baff18da7beca2b3f790ed9dccde1d75fc50844e8ef8a146deeecea41a81eccbaf8e58c4b0d6c2d61b26d1b9f21081992e3c747d8fade59cc4c1cb55163d7f92c616d9267df1f27645d20d2e69c0e59a689a7b187854d31de9e6862495f07b665e1139203c74e70f9dc612c0b06fbfb91404b7b4739c8deddb7ddcef8e810a18b97b9f7fe4739f6e77fc6442a4eded2e9ed6c411705746f909eae560e1f70d8dbad5b5ee1c2c80ce9f818b1890b483614832fba7b2b9de72aca53526cb847495451e75a3e61d64096f00f59bceaa1526d2e21f0fbfdc4e3714cd3249fcf3bc100ebc8f0baa6b176fd6dac5a731396e558c5699a8eaaaa288a20934903828d1bd6b37edd5a0052a9245eafaf387efa2c530de1a2a2028a5e00a842d2ab2631fba79b9f292379c9f25cd4965d0af97db5f04c95abbdf3999cb8993ea58a739bbfcd55eda903eaf441d42d6eae92e6abcb593b62d698394bb0226299a6c5c8888168eb2018ea03bf85ad7760c66db4c11e52f634995daf115a750bb2218265593437b7f0eb5fff4dc28d11744d251a4fb360792f99c93182cd3a174e9fa46bc9afe03df3034e740ed09299219dcdd3d7d9464b838a5c30c8f56bd65030f384031efc32c3bbefeda22708c16080442a833f1ca1b3ddcfd0e171da5b9a78f08147b872f10a8d3e8d8eae2efc013f4b0607b87ecd1adedff22acbd6f691181b21994e63d9e162b4ec3af2c67ce2cb1cf8e516048b3ebf257e9f41bb2fc5cbef9ce6e8c1210606a7082939de3f38ccc123065dfe13acb8fd4d42c28ba6aae886c1baf51bd878e326d64a8d13c78fd1dad2c2bdb76fe6ed8ff6a38517b2617984a0d760f2d2593ed8b983b5ebd6619a260dc100b477e0f1f800c1c64d9b5936d0c6b69d7b48664d56ae5d0d87f673f0e424d76fbc9570c84fb3579051cfb160e95a162c5c88699a7506c4fd38cfb7ab0a7dd5a94cb884c331298a70ee14b9cc7e838120dd5ddd2413719289440d47308bf5aa4a3932356dab8573647c5555300c4f25bcb65bea70f5b78a34b8b6f9323f53cb11ced1b472bf4b9c8e2c2e9e928ce20ea523aa4384e38677f13bd22e0a5b3521c24b6d2cc15723ba8b83a9373ceeb6bad31cc33e274d9a6b9a4a6337474685eaddbfd496925869db12dbb2b872a519abfd4e16789b19991ce2c2e80a56a45334b4b4e3e50a4ab085d4d8107eaf1f45d5d9b46933a16010ad789fed530fdecd96ad1f10ea5eccaa1b6e202d1596ad5b4b62894a8f8cb0b96703e177b7333693a4bda383aeee2e0a853cb66de30935f1e0c38ff0eef69d5cc0cbed77decdbacdeb19dfb285d3970bdcffe8834c5e3a81659aac58b98ab02ed9b3ff00e150036bafbf1ecbb6b8ffc1bb7873fb47340fae64436f273a054cd3aaa35bfd64f8e51608c5e8e8b8d72c86084f65f27cf79d510e8f1e64f9ad1f307cb691975eb8819ce9e1faa56778ea71c122cf6a16b72fc1e7f394ef8e818b8d17c2b5ac4abbaba82214a58bbf4288e21d3da56817e4604cc9d36509b7dd115c1cbc902e27725749732ce44f92841064d2195455e2f3ba9cc25d2ba2d47cadfc7537b636770da653f358af6ff510ac16b6a6c88a4826e76e78712eea790d15c513013157ddc57f6471de287a489cd5d679f2cf1ad4f9e6f55ae0eac97af5f25cad4d73bc93b62493cd110836904fc638f7c1165ad7dd45476717fb76ece0ec963778e4d4117a57b550b8732143e17eb81c436c7c1c110a170f862a48af88caa55bbb7869dec195223f2f65196f4a9174ab4c7a84520e965a923694e229a82c2ad36ddb7682a1e26c1e656fa9c50bf88aa214b96647127194f0738c6f9d219d0f5f8bdf3f4272bbe3c1d276b4fc7eafc6176f8cd0339c46f52ec4cc0e70cbb230d333496eec59c53a5f179d6d6174432bcacbd792ae4e192ce9dcb3aaf677ef3e1e2d357b76c9b39fea60acacfd3e5f5be78629b90736541ddd70ae2fd4cb529acc924b6177abdcc015ed8dbbf65a8ae14056792b9a6767af4a57255aa2aaaa6b22f4ccc6c56bcb5716e0ea3675ee86ceb182a4ebbda803381fd1818a3457cb68d72bb3945c747b567b2a8c69b95c5bdae4f20507e9358396ce3ef4c4085903d4e8389dd3c34869625f4aa0ee9ba163a141323c4052d31d03d49a2a2cacaa5beee5000455ad99fb62aec49af5b51264a2528655aaa4aa01cefab3ad529d359daeee7ddd54eb7376f677d7d7e1e1516f215f0c112e1c367d726686582c4da6a03aca3899a3abad9150d0f11353d7fce19795ae153b3e49b9d429fb63d427842093c9d0d25a1322bce866249d49934ca68a935d347ff8a4a964d1597a94ceddbcc6c6086af1a85a8a8ab7e47a61c02bca57ea7c1354071798d5db79be7d0c98623f64b121b3f54a356c5371a72f5fbb29f6b304e9ee4f29f4b75b3d5e1993d970658e5ece51262e0eb6e8cfba16d6cd24cf0e8a4991d68b32673936368e109a7349de2c60c7c7b1b369928938563a4b58f3124c24101e83426b3b665b17d4b93df00ba57a0cf82f3bfd12f0ab981c3ba66c264b269ba1902f503ae9f1681a6d2d6157898ed89248c43f560dbfa814552fffb5f03dd756d62798212128e40b44220dc5c817cee24b2613e4f379d2a914e14813a150c8f1e3fdcba0e0d231b4f37abd4c4c8c93cd66f1f97c9495d0502140359e35a0b2fb97d442a56fcefb7a3b2e35401fa3a1f396536235eac96ff58aabf08f255b977ad2e69c9260cd98cc627caea14cd7274a5cebd560cb630de52004b97c8e5c2ee7103f2d08c1104aa80305482349155514424ac8e5a1cef5a3ba43c43f31fc72252ddc182260fab05cfe5aaa968e6ba0ff574f42403a9576e4f4e22dffe9e9194ccb229ab149a72d5ada1c2345bf3ff04bbbe86cdb364251505d2e6edd4642553a1f8735a1fc57b87f50e1482a60ccb9803ef6bccf578eacf3799e0adc8baed8fef26103c5e73297582134b3b9980a17567a2dafa14c593d784ed61ad86af64914db508129f9870f064373f8b0675e71f37fd52400cde3f1a0eb7ac5e214478ecc644da27113cbcad3d916c0d0f5d92c614d2a7f2a91cfab90dfaacf6e925b27ff5cd45dd47951635e531fb85c47f1c7b56ce4c239612919cfd9b64d2e9b251869e5f7bef30a99e40cdffebd2f203d5e87abf925a6783cee38fb7213a63206d5aeea4a4766736d25c4a9d65bd50e0d35efaf06570b3ffbbbacf7f2eaf04059ac95b51073b02e50d3ef1a8252a264f396298a4faec5586f2cdd7597ff2dad114741edf5f966cf83105879b3cc1d297e5f51b1ed6aa6abd8aae5f931f0a35c94fbe17f167eb93f5c233d10c5ff1d0f9656c548aa5030299820d10905748e1c9f647a728cd5ab16d6d149d4b26bf391ff7aacddc761f7ea953d579925b85f643b9a5db6108eab53a928e4f3796666a649a55304c2110c8f87c9a9abfadfac246973e1e2255e7ce5355074a46d13f47b78fcb187690885303cf523ae54c237951065ae31ac47b0dcdf6adeb88a29e1a59b01a81dc9f21aaba97ebe721cf86acec92ed287127cc52ca1a6b639a20557c3cdddbfcafb6b2db336f66e2d66d5e6ab512bcb8a7b1adb760e9832d90299ac858240397502cfd404c6a285e4f6ef27dfda44e08edbab828dfe72f06b2ef87af96b61ffe7e297bb3c4d16efe738fa12c8647234373793cfe73873e62ca14090e191499a8747e8eeeeaeb21d1282f2f1a15d2c4700966d3921876d1b5bcaa2ffe8ca12aac8f87256b364d50ff7b77a4bb09efa51baba38ff35956badafd45e216da40db16894a9a902fe4080a6a626bc9a424f5b84e1d191796aaba43367ceb265db3edef8e00c93591f8ad7e71cd11692bcb4f3af68d526f92fffe1f7686fef9895d71d22bcbae795378a2210a278a91a27d0a510544c3b14a53c37e5ac353b9e8252e50e56d6acd78ab2d8dd38d78b5a0255c35cd4a50f6eb5812ccdde5c24b1f6774da5b388c97c08ee86bd1a72cb1af8b95981d20622a50d4272fa6c9c57b64c12d0551ee4346b5786d1bd2a09bf97d1e904b9a9299a9a9aca77325555299be4d8b2c60f7e4d33a56d218a770de7c3afda910067c3750eb52ac692257eb1e47dd5b6ed2a0cfc24f8255d871f824ad8f4d245e5d2c5618140b3a5a3a4b3a5cdf0f004a74e0db169f31a32e928bb3ffa0045f5b3edbd9d6c6bf2f1cf7fe79fd3d2d25c2640b94c9273e7cea1f8c22ce8ef45571576bdfe2cef9fbcccbd37ace3eded3b5002119efad55f25140a95274b964e466ab6e3598bd63df0d49d8f8fc113cc037395fa6c285b57dbd2a66099f4f5f6130886189e98c4b62dda9a4318c61c3ea88b29934ef35fff9f6ff1e1993c71b51fd35885a514281415e99ad140b6610927468ff3affedd9ff287ffd7bfa4b3b3b3aa4da57040a5543d268eadc9d4d80817af8cd1d6d54763c8c3891327901242a120ba6e30353949a8a99dc1fe5e0c8d2afbb012220c8d0dd1dede4e29222ba28468ce81ffb3cf3ecbbdf7de5b0e8a28dc8da983e3556a1e598bc235f3508f639a2527d42306b51b955d17a67e99f3853aaf8dab564b9ce6a8bfc8353921b76da6a3265726041d110816a6d02ec5901e2fdaa1435c88a779e9c36db43637f3b5a7be465b6b2ba74e9d241a8d116eeea0afa713a3784793222706cea36d4b76eedcc1c68d9bf07abd4824d2a6cabea904ac08c1850b173876ec180f3df810966d91894d70fed230918e5e3a5ac3e5f117403a39c1682c4f4f67375ae974b268685c32222eaf8b128129b2c915fb4385a9e9290e1c38c0cccc348f3ffe04baa671f4c8612e5ebc88695a747575b161bd739b4362a3feeeeffe6bcdb6edafd9b6ec8ec7b3c4621966666698991923168f71e4f05e0e1df890cb17ceb074b0958e8e1e54cd836de679fb85bfe7bd4367397d782f29b58dae96004fffe0c7dcffd8131c3e740423dccc638f3c4ac0ef233a3d453496c0e733989e9a2491ce15a37d9458de0aeb8bac7d77f5ff4b88e5560e5f0b2cd7505f091e209fcb635b164d6ded6cbb9c60e7e518cdaa49360fa72f8ff3e00d8b310c476fe74ee9548afff4c77fcecbbb63d0b29e4c41100c04083786696868a0b1318ca6a98c8e8ed1d831c895b1286afa129b36ac4308412e972397cba2a91abaa696f7aaaabd5b0852e317f9c1f7ff9ef35786d9bbef10fea66e3ed8fe16cffdf4a7f4f5f6f1e28b2f9188cff0fefb1fd0d4d245677b134343c3647226aaae939c9964746c8cfffe977fc5a2858b68080598999a2496cce2f5fac867e24c4cc678f5b52dac5f771d8140600ef6a91ab75d3ae1abef325584a91e512a25b722a6c89db820e6e2b2eb9559694e3d02581df3aec44dd44b55244b4ab2d92cbae1c1344da62653240b3a8bbb04abc5150c4ccc4c966426c758264b6cdb3bec78f75d7ad6ad636070017ffcc77f84994ff3eeb69df4f42da4b9d1c7f8d818d9828dd76390884e311d4d635a16cd4d4df8bd06d39393a4b2269aae918c4e118dc6b0858eaac0e8c828d982c5f8f838870f1d62e3a68d20e1e51f3ecd8e034751ed1c8b162d2ec6c17388de8e17bfcd5fbcb083b5ab37d014d449c6a34c4c4ce23174d2c9381393d3f8bc06c95894e95812c3e325978a333e318e6d4bcc5c86f1f10974ddc0e7f3f2f65b6fb274f1120aa8441a1bb970e102d158949b6eba195dd790520e49c9f7cade0572b91ce7ce9de6f9e75f6666661c30c9676718ecf673c3ea36d6af5dc3b25ec1f1035b59b6ee7ef2991487ce8ff1b56ffe2b62170ff0ca5b3b58d2e961ffd1636cbc7491fd478ed1d8d8c8cb2fbfc4d2ee083b0f1ca7b3bb9f35fdcdbcb6fd2332b6c1438f7d811baf1bc4b2dc4cbb9cbdcfcd21fe5673b6d5c7e7f39d24daae25e8566fd6ac3cd773718117b9cb542a492299e44aaac05041612a6bd2dd1c24e0f3d451363be9675bdee4a50fc7695e7a1fd96c9ef6f636a2d128a974064508b2d92c91a646162d5ac8b973e7e8e85fcb4b6fbfc0af7c66948ece2ed7ca972e242ffd75104b51358e9fba80dad4c53ffbc657f987ef7f97e8f808bff22b5f209f2ff0d0430fb275eb56344d85a2eb8c5432c13ffcf8878c450bac59bb81bdefbd4a57570f070f1ee4f52d5bb879f5025e797b074953e38e3b3fc5e4c9ed5c48280c5db954d6395629a16be7a9f42c6b3ecdcd7494fb59bf3837575229c02104f5453759b7a2da06d62bb33608a7ac81ad2552a2fcd7766fb8c56b5f0b664eb022791c4fd2c6afd8a88d8d0e87eaf5d339719227a351ee54553cba8e256d4cd37145a2eb5e3455e1c3375fe2cd5d87b1f4080fdd7123bbdfff394902e452715a5a5ab86ea095ed074f82ea67d99a8decdef60a5ded2de43c3d3cf5f907f8e973ffc06834c792656bd054152921159d249eca32b068198b572c65cfdefdac58be1cc3eb213d7589e3d37eee59e6e3e089d33429edfcf0ef9f212dfcdc7bc35ab6eed801be46eedab09237dfddce74c6e6ba4d77337ee46d2ec42d1eb8f356f6ed7c9769dbcb8d1bd671f1e205c62726f8f18f9ec1f277d31e0930397a09cbb679e5e597f9d217bf54b654d74aca54d33479fbadd779e5951fd3d9d98590056edeb8943b6fbe8e154bba69f0e62914929c3a761e3dbc88feee2e846d32134b928acd602b06bd3dbd6cdeb499cd9b36934aa589441a3976ec187bf60cb170dd2d7cf6e1fbf8eb3ffc8f1c3f3f4247c44f72e232b61cac849811aee99535ae11e649b5cbad9e4d7abd72ca8ad7ab10b27219458a17f0fbc9a7125cd7decc48c1c622e32859cf0000200049444154496f934398eaadfd783cc6b3afefa679f19da43339dadbdb98989824d218c6ce4e2190b4b77573e9f210866ed0106a2093b7f136f462d594579a2fd75558d77bf0680ad9749a7822492e5740357c14f2794cd3a45030515595aeee7e6ebced532c5e38c0473f7f916422c1c563fbf1aa169d83cbf8df7ff3d749a6333cf5b55fe3a7dffd36fb4e5c62a033c2e59387181bcbf1d5dffc0a7ffd5fffb0ca966bce019f8b2baa7d9ea5b229712a50093b5ed67c94fbec3219addad2aac95085a054c8dafc65564706b65d2447569521abde5547262e5fe79036b669a2690ac1ce66d47c1e8e9f24feeaab988929e8eec2b72448e4862cea48806c388c653a11903bda5a29d81aaad7c71b6fee60a8206834929c381c8060179fbf7b2ddffbbb1f3013d5f868cf0437dcff2899a163ecdfb78fc6f61ebefaf5aff1dffefc2fd8b3f575128938974f1cc4236c3a3b5b4108ce9c3c455478b9b9dde0cfffcbff4d68d14d2c5eba028fb43976f000fbf61ea2abdd4ffe7c8216fd569256807ff62fbec981ad3f47043bf9addffa3aef3eff0fecd87b9c250b7b888f9c61e1c2854c1c3b4fdaf4b068d1420e9c1b672669118bcea036b4f1e817bfc20bcffc88cb710d640ea4241e8b152f04970853f154ced00dd6ad5fcf4b2fbf8ca6d87cf31b9f66d39a3ebc5a1645c991ca7b3872f41817ae8cb3cc32f105fcdcb47e153ffeceff40d37ddcfdc8e7b12c8b48c489d21b08f8f17abd3484c32c5ad2cb7b7b76f29d910bdc74f37a92b649a6004d4d21acf289a098bdabd659c7b357752dc92909c8a20aa6ae39bc74e1c0352451d4ef388ee1e20c34b5b2a9c524189bc650c334857c758b7ae5675b18ce3661e982a64884e9a9699a22612eed7b89b3bb7e826d59acbcebeb74adfe14535353844221128914e1402342a9716456244a25bd8e9bf1304d9325cb9772e8f041fee0f7ff2d7678807b3fbd022b3949535313d2b6e9e9e9e1a69b6ea4a931828d24168b92cc5a0cacd84c6b4b23ed6dad783595be069d6f7ffbafb977d32ac612511239c99225fd84b4147ffbbd67c9d050dc758b84693e86c43dc6f574c6b530e575502128b3094d2da722a95cf0a915b46a9faea5cc6aaeb4be22bd9a83aaada9bc89d812699a143efc90dce1c324021ad9b1dd141ab3443e1526dc97a0239225ec0ba25e0e30dee4c7b66cfafbfbb9e58efbb974e4038e1e3bcd030fdec5dbbb0e82a2b17af52276eddac50f7efc2af18cc6d2de66ae1b68e5ddb75e013dc8ca751bc94c5fc2637869696d732e97674c7a976da4b9a581868606cc8249574f17da8eadbcf6d6386ded83f4f4f622041472592e0f8df3abbff3bb6c1808f1fa2bcf93b754224686bff8d33fe253b76e42a446f86f7ff6a7dc7ff37aeeb9690de389026dedcd8c4d4d92cd644866b2249205b21927c2524b6b2bf92b9779f1074fa3340dd2d7e823199d00c0d075de7fff7d36143d9a8ab1d109af6916b659b6bdc9322dde78f30d9e79fa6fb8ef964136ac68a7bf7f01474f5de4b53776329309f0e9cf3ec99d77dd8da6e948699188c711aa8750d0b1dbc9e572188681699a4e5415cbc2d035d2a91405cb261c6e209d4c92cd1708068378e638169f37d5a347737da845826b61c16af317f3091c77c17eaf41369721dcd8846e9f63f2fc0e948ec779fbc0288fdeb0805043b56bdd3ff8e3bf64cbe93039e9a5a3a39de9e9285e1965fbd3dfc44c4f03d0b5ea3ed67ffadf313d3d8d3fe027994a134a1fe36fffe3afd2ddd5493c1e27168b62682a1e6fd137b4ac25be02a12814f239ae9c3ecc99098b3b6fdb84226df285021e8f875cd6991fa5e8b9d232f32412698466e0d1551445c1300cf2d934a94c96c6c630e9548a4c364f201040570589740e5d3708f83db3dcbfccb959d4fd524ba52a13e556ee96368f9282bd969eb92f0e5789f735cd10c572afa5cc5273dc0cdc9cb0ae7ec9527b8463e7168bc5f1787d58a64576669af45414bb7091eee1df25d2a9a3f5f762fa23c426a13091c24caba417ff67fc8d5de472590cc340488b5c4162180ac97882bc69d1d81866eb3b6fb163c77bf4aebc932f3f761b86ae924c244035f0fbbd58a6896118e47239340592a94c799e85104ed90272d90ca94c8e603088b424bae1780dcde5f2e81e0f8a80422187102ab6992799ce14095b9e4c2647381c269f73caf07a3c9896852d211008924ec641d108f8fdd8b689b44cf2f902ba3f802670ddb975367d9fcfe75ce295d845d79fce2dfffbefbb9f7c3ec773cffe88cb63593a9b47d8737088656b6ee1c9071f66d1a24528aa52befc176a70b4f8a5a8a186ae3b274cc568b07a316cb83f102a6beafd8110fe80b3a3cc7299306bd5d55905f3129959b2cfdcbad36ba9cb05578ec48be3e624994cd2d5dc86ae80c462a0235cb78c40a413cd00d314d89685ae6b98c90c56a1685ca779e958b4994c3683d7eb259dcee0d13592d31740564732ac3217708b5002542b8a9a1f451782a58b832c5f0c56fe3820f00232273114010559e98fa2e00b82fb3e8bcc83a1403000e4c7f01810f108600a6c9b12cd95a5f067d5cd004571026dbaad9d65fd49ab8becf5d8584571a2ab0065772b73c4d7a3e8e9a07c97f19a58e23a2c5cd9d5afacb4bf681e534d39eb7155ce5cf984822d079ccbdf8d113c4dcde4661452f9dbc8ab09f2b11e52f165a02e43eb0c63e79278bd616cdb2a1b3e4b1474cda926180a97cb5fb1720dbd038be9e8e9c1301cd8d2772925baa661db36baa18314343418c5d1905538abe95e1a75e7340f85f21a77ca7482afaaaa7398a3185e22860f89c4f0f8f178fc48241e6f008f3750350c124938dc586e8fa6ea6018787c94d770297479295b952857fe1fc7f5c1a73ef5004b972e636c6c0ccbb2b8e3a15e7a7b7bf1188e72d709375c91c95d33512d73bb740525697c569e9a54d12c94c4ad596faa815d0f952bad73c1cd2ea5aaf43990a7d2bdca899fa6a964665298adbdf8238b49d9267d6da1baf99c2377895928a06a3aa9e4047d3d2b5872eb57193ff321a1d67eda97dec64c3449734b33b1781c830cf9d8d1b26dc7aceeb8c6b624934a14a4f040312a6dc52545cdf994c041a86412118d82a2627775d6af432d8e69228148a6901d1df3ce1f006343a85746b156ac44fa4a1752e71e5b59f7b5ac1018cb42b93484ddd383541494e9699012bbb9a9e846d895844024929072da5a3aad9b2f39a3584398242843236059d8ad2d8e4b6201626c0c822164311885f3d2bdaedca2a01397b1e27ed646da165ab087fcc2df27534881e2c1e70da169ee535c59b639ab6d6845bc15b4b777d0211c7301cbb2cb98570697eefeb973bacb74806cc4ac29a81ddaca0c56087ee99783dfb3f1cbfd5e5e0dbf5cbfb57cc12497cb619a66a9e70821e8ebeba7b7b7cf591b086ccbb93d3f579a4bc550ef7d790aaf41bcba6ab97236db3ea7bae317ac0f9c637b9f4f4755353c1e83583c45a479298991614291a575a617b2f171840c635a16aaaa621806c3a3132cbbe52bb4f4ade6d85b7fc9c593fb195c791393131384020172636fa0333abb0bb2f84796fa5ce47e90584a004b0da31c7b07e3789cdcc30f23bd6ac571be550c11ae28a02ae8fb77a21e3841e1ce3bb08c054e2871cb31caa41815457fef3dac8141a4af11253b89e559e80c46891b521c37b014afcba028785e7a1e3bd8427e652fd2db08454f9d65aec7b6ab830f5896c3bda96a25d4b8aaa10c0fa19e3a4de1f65b51335994ad67306fba116119605ad89e814add4a25ca89888fa3e4a258de854e9b6cdbe19e8a2e6bb16525c479b19fe5f697fa246d7ccf3e4fe1d65bb1da7a91be46a4aae2dbf20e85cd9bb1d62e86427e5e9a276d9b8c1543c83cf97c9e127e0108a1a37822202505b340c19c1d7db7de1abc16deaf0ab6ee8efef1f2d7138be74c57a9ef5ae88400345511a80ad88aac01b2ab7c30979c13ce97e6fafe71df7f92fcb530572f7bee699eafbe7204296963e83ac9449ce6c6367463ca116fd5d921c2338909a2c32334f66de6f2a54b0c0e0e128dc5181b1fc7b40d32f171268fbc80bfa1155fb803913b8adfdec6aaeb361008b8b93087ab2d071a751d8fcb924c6425d176ec47b99c4459bd0e3b62a0eddc8ac849ac8db722864e23c686a1b91fa94a28e42097469cdc87f1fe3eccb5eb91a120face0fb0fb9661fcf019ecee0ef20f3f045e03e5c07be807ce60aebf09725194cb6711050fe6ad7760b585502f5ec078ef2332dffc1dc4e563182f1cc7bafe06a49d463973146bc34d58830368478fa01c3f882040e18ebb10c9298c6def612d5d8bf4da28678fa29d38877ae214d22e20d219bc4f3f4de1e4710ab7dc8c6cf0a3beff26dae951cc9b6e478c9e434c0c239446cce5cb213a85feeaf3884412d9b38ac2e208fa7b1f2064086b492fe6aa15206df4addb5087c729dc703b567f0b5879b4dd1fa29d9f41199f82420e71f92cfa6b8791be10a493101f437bf34dac55d7633787ca5c7d698ecad284b411c22ed260377e959049ce6d6c3acf1afcc780bd5afe5fb4acb9ca9debbd16690a63db0d1503c2bcb3bb4909baaea22a733b6fffa7913ec6962204c94402b3902b29ea48673264f2023dd04bae6056853a2a252b9f64eafc1bb40faec6f4f9397de60c91c646c20d0d143c1ae1b67efa3dbb183f14a4fbba9b8984df24e0133cf1c45384c3ae009a65a9a46888ea0e7a2941280acab9e36897a7b19b0cf4f7f75258d58df1e1117277acc378f625c4cc10e64d9b510eec02bd119188a2ffec35a455c0de742b566b13eab93328e74fa26fdf8d0cf831972f47c4e3686f7e08b68db5fe3a8c975e06338bddd783b467d0b66dc7fcc223d8c100765b9ba3a378fe75ac8d1bd05f7d15a4896c6ba5100e238582ba771fea4c02b33983f1ca5b1456b6a15c3a83f6e141ecde4e645323d6d26588541abbbb1bef77ff163bd284b97225cac54ba8e7cf404162ae5e8cfeec0b28b151cc4d1b10178fe3397316323328d371728fdc83fed66b887d7e44b8151247d066ae50b86e35223e8318b98cba770fca8549d2ffe6b71023a3185bb651b8f906543b8ebefd3dac9610fab1b3146ebe0b0a793c7fff23ccfbbe88e9f756f636b7d6bdb4594889aeeb3435b7549954643219273ea1109ffc00e8ff37e9e3b36c82b2cf6fabbc0b2793696c1b82413fd1688260d087aad4d173d488d4b34e3aae05d6dd98abe881dc1b523dd1adf4cd5d6e6d9b4ae554d64e7dd9ce0d275df509841378b0a8fe0081d7eb251e8b110c858827c6f17afdd4a6b6d636c2da25d2a3dfc5dffc39022ddda4b379b2d938aaa6d3d87713bde220b7766de7cd037bc8f9045d4d8b6868ec281f4a5c2d0940da05d47d7b918dfd588361b48387505b42485d73c418e9885052d39ca08d2eb14a4889d40d442a85f1f24be06b80f418d6e2eb41d3904229239fd40de7b7a652d8b41e914aa21d3a0c48ec7003566727764b0bd812a93b0a54a1080aebd620234d948ec6a45a6cd74c02e3a5f741f523a297a1334c61edadd8cd11d4e3471d9dd9ffcbde7b47d9759c079ebfbaf7befc5ee71cd00940236780604e124949a4484ad6285192adb12dcbdeb13deba0b1cffaecee1fb373d6b6d6338e63af4796694994488914258a048398418000082267a0bb01343aa797c3bdb7f68f1bdebdaf5f374049b367cfaceb9ceef75eddef567d15be50555f7d5f3c8e190b5bcb2cfb1042202010b0a2fb46c2146fbd05ed5000e5d0612b4478672bc53bef457bf730a298436a010868ee32523d7582c0defd100923a62f7876ec8415f2cab4025d9a03abd08d12da91a3c8880061221c9f49cec4f24e21cf6f29ad4d6667bf2f994c72f1e245344d430881aaaaf4f6f6da3eb616cf41efb6a0aca08145b09e678b4e243f207de12943f8003d54e3696375fa5abe3e2f7de1e1090289fa477ff4479a34e5afe40bc5cee9e90562b108a95496fafa1ad2e92c86a11308055c6b638fd02e7f710cfe1c694e7558cbb7777903b90c64dbe65479d7d73e07d6d9d0f4fcb68af3b33be941c07d2629db02614dc2a5ea2b9f804997289dbd02cb0d8cb5a394cea4a9a9a9656e7696582c86e34ac6497dfdfdbcf9ca1e6a629708272e12084ca21a49c2ea2c89f0302d6d630c0f8db2a62dc72f3f6092d0748e9dbcc6dffcc353b4b6b6b379f366f74a8aa22868aae62ead9d3fb0188d92d5297ee401f4ad1b90cd09c4541ae5f2494834a37fe8c3a8270e215513d9bf117df776cca606cc55abd037af2670e428b2a606b3b30d6ada30b6eda2b46d2deaf008b2ad0d73ed1a8c810eb433c394eeba17a3af0bb3bd0d198b415d1d66738bb519ad053006fa91cd31b43343e8b7df8dbeb207b3ad15198b82a2a01d3d8a98be028d2b28ddff21642c00b126f4edbbd1d7aec2e8ee4636d6c3dc14225bc0181cc458dd877ae122666f1fc6c675984d31b4e1494af73f80d1d98cece8847008d9d26cc1f4f522dbdb115a007dd726b4e347089c18c6ecdf82be71a5157dd73090bd1bd1376fb4b4bf58141931512fcf63acd984be610d221841994b616cbb097ddd20a57bef845c0aea5a90b1109523e1521a96b78e7038e25ef3b87cf932c16088952b57d2d0d0c8ecec1cc562919ada5a1f499429b882be1ce150953efcf355b1a39f4a69de387de131e0ad425f125c41e95e2173a9be92beca26b04bd29703576efca8947c53cccf2f844dd37c2393ceedba3a3a4520a09148c4686eaee7f2957122618dc6c67a24265e8f1556b75b3e8d552de0d7aa04be2005d2b424e6a993a758b97a15417bb953b9e1e5e22ca0c23b46f9b970c7c697ef6749155c587a73e5e2f7bcf5d920d5de174290496710a21c221c04939393246a6a989d9da1a5b56d518870d33479f9e517f9e6dfff071aba0ac43a6218214bfa0715931026e9e114afbe7895d6da145f7c5045a2f0bffcadcaeffff19ff19b5ffdaa65c7343f77fd10e1ce06b304340de5d245d4d1314a77df01c522c1e7f750baeb4e643c6ec179a2a8589b8d76e38515ed57da1bdac274a6a5b0a2f71a8685835386b03530845d8e09c2da649786614b51fbb4495309ecdb8f6c6ac258bb068a455b13b2119178daa0560cb8024ed82e61e1220cc3c6c9ae5378ecc14d3bd4772e4fe8bbdf4514a1f8d02318ad091b577b435c4a3be024e570e17826a162d52b1c625514ab6c0fa3a81c0bebfa52969ada3afbd44c303c324c2e97a3adad1580e44212a108bababb51f087ce14480ac52242d5d054cd6a0f8be9c3471b36328aa270eedc591a1b9ba8afaf5f4aa1b3b625751d530a029aeaa32f43d7d10d834020886a47f55514858b172f529348d0dcd2523d849aa7fcebd1973d2df0947000b8d3bdc45b2ae99d73732982c120a150887426cfdcd4148185bd848312116ca63c0460948aecf9c1b7f9e10b3fe5cad834037d7d84825638684dd378f38d37989b9b43d5545ed8b387f5eb3690cb5b86598b9626d26660ee6fe9d376ca5c984552c5352971ffa4479992be322aef5f49cf3bd2239d7ce05e0629ad89a20a2b2c3802f7e67d269bc5300c62f69e8157631242b072e52ae2352b387bec02a5c969ea4d833add409b2fb1309c22a075f3894fff0ef1a69bf8e6d357797acf389ffdc2eff0077ff007a8aa6a6b4c05ebee94a6d9757b10b03f856d112e040869427d3de68a15085d4700e6e06ad002369cb43e1d5e647af32498f633bb231c6211f6b2dfad0b0bc6f2238e1b7edb2ad3b9fa519eba424accee6e686840d84ccbaac7b4eaf2b54156fc9936be655c01fbfe9270074ee0783cb0294d5331b76c41dfb105190f79f036cb7d20aad569e3669a6e1b70fbc46d51792cbc7f525228150906c3ae76601a06b97c8e5c2e47369b450b68a88a8a22048160d09dd9524ade7ee1699e7cf679ce5dbc4c4f4f0fb1a8e76681c35ddc8d776723dd1e2569dd04387cf830f37373747577db5a5b39d43d426176ec328fffe3df71f0e41003fd7d4423614c695d51fbb33fff33f6edddcbfb67aed0df3f40226a990b158a4542e130a150d05a52db5d6cb91e166eaf98f63cf0eebfb997e23db4eba367183591dfd49096916330a0515717e3ea9549ae5e1d271284567d2fcd338f63665692efff7d824d1b5c9e9ecbe739f4fe1956efbe93ded61a140ccebcf706afee3b4abc7d357b7ffa3caa2cd1d0d8c0c993271142108bc578efe0013273e3cc16c37cf8c3f7337ef66d8e8d648846426ced6fe68d034758d1d7cfa38f7ec29ae8d2af267a46649146559e2a7e75abd2d6ca81f6feb708cd03bfc8aadabed4694b6ae1115dd148945c2e4f2814b242ec2ce152f7818f7c8cdd37dfc62bafbc4440d58984150a059354d6e0aebbeea5c3b625fadce73ecb1b6fbcc9adb7deec323845f1847d144e98a48a4d802a12c8ed0fcf864079ef40e0ed8d4558576f46b9b345a5f4f597e1c84ec7cc47482f1e0e2f151e7851ceaf6803c257ad07dfea7d505d87c16325eead77993ef0b6a3b2aeeb24e9b893b143840b2c0fa86d6d6da8aacafcfc3c42082b406a3e4f341ac39a7d12699a1c3c7482e6d59b18ec6a22a0482e9f798f3dafed2350bf820fdfbe83f7f7bec4d0d8026bd6aea5adad8d15dd2b78f3ad37999f1e271e0d138835f0e493df251a8d313f750919ece28e3b77f0f62baf31b8eb66ba1a6a191d1a663a1be0a1fbb6224b5952498d682c42a95422994cf1e8c7efe7273f798989b19b79ed8577104689faf62e8cdc2c356d1bd8b0b299b7f61f65f5c60dbcf0f453c45a06b8ffb62dbcfbe68b8ccda658d3df43dbca1db4d7a91c3a769e3beebe9d20d233472be9d9eae572887029696aac25118f502896485d7e97ba991fd0924852348e3135fc75b2faef126ed98840120a47f8d4673ec9b1132778f1cc453abb57f28d7ffc0e85782df9636769ebe864cb9675ace8ee26180a73cfddf7f0f7fff0f724d31976de7617b1d4242f3dfb3425bdc07d0f7e88ef3dfe4fd48af54c2da4e98d345b2b8a0a0a2bdf78f35f962c5fbaac3a3d5c18dce62f269fcae47714677f17b26a245e5553d034956432496b5bbb755a97cdfa4e629c140c06f8f8c71fb6caf3d0a9aeeb64321900dadbdbf8fce73f8b6118643219db6f749ce482359105628960b2fe1ca7a56e5f79e8ca11b6a222af5a4f54ed23ef06b40de690ae747f5779c7ee13e191ac8be13d88e16731c203bb34becb25ebb96ff9e0e53765e1be08afa5fbbbba88742f584bfbb233925028c4ecdc0cb5b5b53897e7c15aee979db159fdf3c8a73fc9d163c778e58d033477ace2d97f798aa14c09337b1c63769c64b1c8e71efb12efbcf153468a259a9b1a38fcde21e673257eedd77f83b75e7e9e8e8e4e76ecdcc58e1dbbf8c10f5fe070a4c4f0d41c9b03210af91cef1f3bc2ad77ede4bdfdfb79299765d7cefbb863d75a90d646fdde7d8759bfeb5e3a3ada78fc5b67f9f4635fe2c4c177a855d21cbff81663e73466b41e3aae5ca0944ff1fa734fa24f8e500c85f9a5cf7e89d4c8515edd7f90cd6d060bf4a2217dce2617d3b32c3326e756af0402418d403040b8773399fcbd24037ba8ad29d13a7b82d1337f415a7e8d58cb20c56289e34393a8c12085d4087aa9447f4f3b436993fe0d9d74d4d772e9c239da9a9a90f914c74f9d4211827030c0c6811ec627c28c8d8e82a173e2e459b2798396ee01ea474779fff0fb7ce4de5b5015ffe45d8a9dc88a9c2ac2d6a72e56fae9f1de2aa836d5dcefb6832c774fc543fa353535e4723952769870bda457e8743f7b528482a669140a0562b1a84dd465195fde9cf73742f1318d72129e2f956cc74f7ce59ef72e67ddbe127e92158e81a3b70889aba6f87455e1674e3e00cfcf6aed2897537d6ef8599c5387f43f137e68b7ac8a7c4feb1609b54565ba65db9a9f7d65c6b9f205100c0529164bcccccca0eb9651a7294d0cc32012b12ebe232d8bf1139726308486915f209fcdd0d3ddc6e4f024cd1dadacec6d65fffbc779f7dd7dd48614de3d7e8c89f12be4f3395a6aeb18e86c65afa6b1a2a591914be799d9b68dbb76aee61f9e7b8f7befb99fda88865e2a52c8e5387efc1c53678f326504b8ffc1160cc34037743a3a3af8ca577e83602848a958a22e166175771b270f099afb3660645ee789bdf3fcafbfff10af3ef1374ce615d4a0422222b83a3bcdc177dfe58e9b77d07df1599e392cf8775f5e8534ccaa02db9b63827d89d7b022f17a495c088562669ed4d96fd02d9fa3213345262d39d3f8db34edfc555421b9367281f3c3a33475ae64cd4037b9e438274f9ea768c2fa957d5cb87881b6ae15e4e667c84a95baba3a4cd3a4a3bdc3de33c9726de4222ffdf435168af57ce693f7323d354957df1a56f5b6fb74a0ea8ab9777a2ccd042adff396e52e6be4d230e582ac48bcb15888443ceeeb602140d70d2b6c530539f827b0bb28f4e15f6688d51614163350358d48386c39adf73659d8ef2df2615de612957eb57d9ab4835a4507f84ab37fb8a7aa55085d11ca228e516ebfb09728b636e10d11ee832ff74e5566b2f444589cfcddbefc7bd5a499e759a5d659092a2bba1d409a2673f34942e128866e808052a9c4e8e815745da7bebe81582cced5ab5750558568344673738bbb073b7d6d84d3e72f116fec62fd9a95c8c21c274e9c21952bb079e37ae6a7c719b936c3960d6bb83c324cca8cd2581b2118d0e8ebeb63747494b022b974e9128d1dddcc8d9fe7b9772ef1ef7eebd7688a684820333fc1b1136709d7b6d0529f209aa8a7a1368a61180c0f0fd3dbdb8b5054a434191e1aa2a7b79789890962b1188ab1c0a59922eb56ae647af82c97aecd128cd632d8dbccf8b5ab8ccf2459b97280d75efe1185daf57cf91377db871a72c969071c9070a7181f9f08eb25fd0dc330772d1a142128a4e65838fcdf689bff21b9428089fedfa16bebc72dbfd28a826afb8f360cebe44d555590609826aa1dc2d8d97b7036bedc70c3aac2c99327397aec186bb6ddc296d53da88a75d1d555f7aa7115df8cf0e26ccf3e3fa52f9e45d5ca5aa297bc304258de054cb3442818b41e49e95341969cfba2e287a349b8472c7663aae1e769e7e23a97c0d959f3546b88b7feea087a9e7b98a0a0cc8cdd476524dd30f1553b5fe01e65fbe0ab21efc5a7da149655da78bd815e563c2dcfb81c8ee4eb8fca31f0f6932d2aa544d70d6a6aea2ced086b79343d3d896198b4b5b55393a8617a7a8ab1f13122e130bd7dfdeec5562114eb34cca12f215054cb7fbba15b3ebe15456018968f7dd78fb64d638aaa58024d5549a753bcf0c28b0c6cdcc1e6955de525b562958934ad8d68d37499ac7559df74fb46511497769d362b58b42e5405d58e3ced841bd3149533674ef3fe8973dc79f73d34d784168d52157a3e00dc29c6ae8d874bba1d89b7da0b4250c82c307fe92025a9d2d0b79568a276f9b555e5782d35d7ecc6ab8a62f965aaf43450f9ce8dccc11b4dcbb74b1ed20000200049444154e1bb04ac13895744c268d1285e9f489534e26bb2a89cc70e33c223cd855b9e036fd5691729bd75d8442e6c566871ab45da4d657316d19ee747f94447fadb53a949ba1befb2dc0e5f1915fde001f16a1c6ef37d9a554572fac15e6b577b5e6698feb2dca5f65282ac22f9c02a0481e32070c954a1f581d56e694a8cd43c89489c927d2a9a4aa7b97ae53291688cce8e4e028100866130373f87aa58ab8aeb09c84575bb88566b8cf361290da669f8f678fe7bd397a228288a8261e8e573a7e5ebb322f15ad1424d0cdd5c04e1242d1ca369dddd2e0118fa070853749d641806d7bfbef8ff8d24842589a45030858274dd6e54705f5703a24c95a202c6fd101e0dd55b9937a392cb8825be7b7059a4bde08e9f9feb787181f2ae7a0567f464f971542a7e7b804545d95ea6e7055ec43d3d546e9b91884a3c1c1c2b3543e1d4232a98ab580cef703387623c787a05c6e2367bf0a8ec3f1f53b34c0cbcf4150e85e9e8ec2218b47c59399bdf7575967b106fe0d90f92aea7f00970ebfaa0efdf08dc52f9ba63c3f6019396cd17c8e772944a45df0670d53928fc73db2b0d2b39a19bed7dbe84f6ec9d37e0992b54990776e6a23da18a79e5e4b945576ade95a9927b2f01ac974a84a3515bf5f52221ddceb1f0b75a27ec4fe91285c4d7bb5eedc3dbb12e5cb5d1a822403c0d14ce1adea9cf07ee5505bc75543cf30e76b5ba2ad0b62ba6ace6807f63aba2f8caa6b8b87aeb2db7497ae09d5358b7cd0ebc47bbb2722a9f7b278e0757d760cd112a9e2e313d153b88fa5443e91f2a4f1ba49408d32097cb92cfe7710fc485a090cf91c79d1955a7df75a6e2f594a425670f5560972aa3f25935f8ca3a4445ae178fe5f0f5262dd6d442cc6bd58b00f75ed4d25ad4ff1f9310825c3a49ded031ec387cd646b2e30c1fabfb4c87294acfb2c7e105b2420b29efbbf886d24f89d673133b4cb5574a97bd553bef9838c854306baf50f03255293d1be2f626bab03ce9782d7617f1399b49b8e54379792b7089da4728ee1274b1f09215385b7cc2bf512a6d86eae2259d3e75f8853393e522deeb2e951dc6e5842372bbd453a8d3c7dee535d2d726bf7d9c972f39f341120a06696b6cf22d9f14140c0c0a14904212901a013c4edc964d95e4bd9cb8adf6fc17f9fe8da40f025f1e7fcdba36803b606a690445bf8221eb30025d106c442c8a32fa33e25bad4fae27166eb8f00f0a797de845a809619d5018baed1c51e2b82b7762cf49cf04858a800a2e51cbb2807661a58f9817892647107b99810debbfb0599ed85e2dd117634c0884227c7b7a0e015b4a4799404d878f4a8b052a8ab06db9ca7554566df944b33ca32aaaea579cec3e5214bb59b6fd8e7368e2f603d8b1d13cef3a5d276d1c7d7deac7c7e147e01f8f0a7e5c667695836d33448f3179590078dff1327b4fc5d2e96b4fa10228ca12273327399e3fceac3a8bd424b14294157205db13db690e37fbdae3eb584771f0f7088be7b0035f1939bb12f646def7d625abe455be5399aad1d7f5f1d54cb32c61c2c9678915fe2b81dc718c6c0d49e55e0a0d9fc3a8df85a26a7ef5cb2f28cb038cbfeb16a1213d4d5af4dd1f30c7abfe5593243f4bb72cc6c965158bf8e4a2211516d1b91714a5bf13fc13b89ce7d5faf1321f6f1d95955512bc0721e9cd033f33ab982fd6cd03c1d4e4244525487b631dc5850966e7d3b475f7b90ccb94b2ea77e9325f41313bc5e8749aceae1e820ab821e3a5b436c5b1363baf0c0d71e4e0013ababad97ad34dae066e2dadacd3b899e96942a110c56291e10b17d87ad36e24a63d0fca41134d6749ac083b70a474b5a365076b89aebceeb30a86e3ad47fa27e4d205b94cd0b94665994914cc222f5d79918ba921d636ac616b7c2b41192425525c4c5ee407579fe6be15f7d1dbd0bbc8d6c7d242e5128d590c5be6c6625159d77bbf5a7de54318d3d69ead89bcd882bb7a129e4264854b6457c3f64819cdb0b9a0d0e7894c7d8b80f126e3e7060868d0d8fa38b3e9434c16fe9e58fb6614afe80184a25a4792a6e96eda55434f5155dbbadca33fd88df6c32f33d3ae33f93ccd67e9d9b33879996159ae7946c3ed2b4b3d37ed49669ae525980f7d51c16cbc13dcc9938b9f57654495f98b91f7c37bcbf6c0688ac66b7bf670766881affdc96ff1f6733fe4c0e1d37cedcfbe4e6a769a64a6487d730ba56c12bd9027d1d04826394fae28696c6921a05a115c4fbef643bef5c6397efdb7fe9081ae3a5233e3148a06f1c666cc628e62360dc1180bc914d39393dcfea10f532c64999998221c4f100a8799999c245edfcc0bcf3c4d7d6323b7dc750fbd2b5792cbcc33333d4facbe094d9814d349f286a0aeb1093d3bcffc429aba8606e2899ac58476fd615ebe0fab492f6f9f568e45e57327991579b2cc944032961c47a455bed8fb05b488465aa631d0a90fd7b3be663d439121462646e84874d81e246c730169baee766ea44196e0b234e2743a4d4d8de5d3cb71b3e296e7499a6a9d8c4b1c7a355c97ea02eb2ea8a208229128baae935c58b04f106f443d80927db3414a495d6dade7bd32be3e7c74d3ea61ad304938bd9f4c2ecea586df25dc7d1313caff4dbf789cf9f3ff176f64fe9c9d6db5d447351421401a0c1dddcffb27ced3dabb8e5dbbb6120a6a98b63d130814454155554e1e3b426353334d2dad3837944dd372f3ead8be98d272d3601a862f04b6db607713c4c3bcbcfb2d95a2ce47a55554095f47da52b9dc4df66bd257a7106098d6f2c6f4dae42c357959a4202daebeda582e97e76d52256c25b1d89fa694a8c2249ebbc0bb7bdf65682a87116f61feda08cf7eef09d225681dd8c9b5b3efd2d8dcc4f64d83bcfeda5ba40a924db77e84fb3fbc8bc2c218a7c70ceed834c8d9b367089a9d7ceb6fff8a8ece36824d6bc84e5f4296b2e884e85cb9916c26cd8f9ffc2e1d75418e0f4db1fbb65b696e69e1b9a79e206dd43131729aa68638a17084a96b57a809185c1c9f2752b78248c064766c08a106e81edcc9f8f1d79835c23cf4e8c3acddb4b1bc5f5339a4be71b03b6229f5bd92992f475f95e3b4d494abccb36fde5b372b24f5a13a6ee9d9cd99ec198e4f1fc7081ba8410d9185fa621dbb1b76d3dab9c96568a3e78ff0ce7bc789b7f470fbee9dc4a3215445454afbc85f08a4345184eab977689db22b8a4226bdc0e38f3fce57bffa9b288acac2c465de7cfb1de2edabb97dd726eb66851024930bbc79e40c77dfbc8b8899e29db75e61edce7b696c68c0d07502c120efecddcbecdc1c5bb76e65a07f80b367cfb2eba65daefd9494a008cba60a9b013af6885a20c095cb233cf7dc4fd8b96b17dbb66db32ea24b13dd70b42ecfb514015a5197200c0c23ccdcc26a6a4b0759197b956ba1dd7c3ffb18bf1af909d989217e3039c3fef1008ff5436f6b826c2acd77ffe5bbf4ecbc93c2c21592b32dcccc95e85dd9c7d4c8302524935786c9e44bfcf485e7e8eeede3e14f7d9a62769ea191497ad66ea6303f467676929c5a43634d88f1f149fad66da3bdb98a545c5277f67000590dae0aec8d3eab948802745b53726e6a575d4e55a0b5489dae4a2ccefac4f3dd433caebabb084d3bb35213f324534aa41a6060b09f7daf7c97fa550fd0649e62f4ca387ab089871eb985a7ffe5790c21b9e7d14f73f6cd97397ae2027d7d9de4672e83b889a1332738f6de71da3aeb499fbc4a53c323280d1d3cf0a947f9fe377e405e16b9f5c18f93b97494f317ce8234999f9b6361acc0fdbff2557a5b6a78e15ffe115dd7b976ea2dd66ebb89adb7de4a6b4b0ba70e1f6246aa7cfccb5fe0857f79822903b6dc762fadf531de79f57556ad5bc7fba78649662d82f509ae4ac6ecf48a744eee287760e5382df1eea2bc6a53cfcb8c2a258f87e139d6ee8661120dc418c90e333631c66df5b7514b2d0133808c4aae729593d74e716befad961941a9c477bffd14b1fef5d4e4a6c967e6a000878f9c24d6d4457b4b0366314f4b4b2b43c317d08b3972c9390ac10636af5bc9950b27383f9a626a661e694a144de1ddb7dee6e4f024b737d663948a8840104581d9d939fef1cfbf4ee79f7d9d0639c1fff917ffcc9ffee78d4c4f4dd1d7d7c7f0f030939393bcf2ca2b1c3a74902f7ce18b34363571fae409720b73e403b534c634c6266759bd610b51b9c0f15317a8ef1860555703c7de3bc6a9e11952e90c4d8d8d2493490e1d3a44a2b1930d6b57110e08b75b9dbed5f2ba0198986a07b2e5d3d48d1ea22df70cb193c7f9ac524f933e4d97802dea258e682bf8f6f90c5f0e64a88906d9b67b076787cf91695acd2a1dde7ee9c764c4839cd9f73a7923c0b1836fb272d36ef22593a221191d19e2b927bf831e08117ce728a5ec385d7d7dcc8d5fc10837d35e27387ee60abffcab8fb91bb35e03435749aa3287fe5f4942208df2fda7455e08a497b950a1bd2c81b5f778dc7b945d6da9b014f3f1aecfabbc679a26f1440dadab7ae8db712b6aa28d23af8dd3d1db45f4d0db3cfdc433f4efb88bccc479c201c1daad1bb8e5da08b3a9120dcd75e8a5126357c678f0abbfc7cec156de7de9192e0f8d53b8768ee79ef81eed1b7671edf4bb1c79fe298835b37adb4ea6868f130c06e96c08f393c7ff9e2ddbb793cb6511e17abad76d63b0bf8343afee61f5d65d74f6f5521b34f8c137fe89c69e0db484a0a93e41289620d1d0c0f8428e62a988611ab6b6eaed80cacd373b4f82bbd3eeeb6fefa7f0ecc578faaeda36403581e03357a892a4ed60cd1662a63450720aea65957d07f691c966a8a9a9a1bbab8bcece4e6a62036e746384e0965b7772e8d405cee45ad8b42bc2ab4ffd33334a8cd481c3446a5b69ad0ff2918f7c8cef3ff52433f30b6cd9b28991e177183fdfcfa5cb97686c6da6944f2181d4ec1473c9057a7bdac9a9517efce28becda7e0bdd9d4d1886c9c6813887f7ed25225334afd9422197e3b99ffc84dffbbddfe7a5975f667c6ccc6ab229c96432fce8473f62767e9e35ebd63176650835d14e6bcce0c4996194b98b8ca48be44b413ebc7d0d6747c7888604c985599e7aeafb7cead1873876f800e746a6f9ca6ffc269bd7f7db4b4be98e9d962d9a366da9c8d87a4e86ee27262fd09b3d436f0872b9008772f7b369eb6aa622510e1dce72cf4492feae06cce6b56c6d5fc19ea79f65eed65dacdfba8ed77fb287bae62eb6edde402933cef0956b74ace8a77b703d861a6168e41aed83eb69aed1982906d971cfc73875702fa6d0d8b06d3b3ffef637994817f07ac7738593a8f80dbe8ba04258eaa4a5a196dd6d603ff35e1891ded9566d29e65bf5797ee82621d574a5b67547cde14f969d80bb71680af7f4c83aaa76b41bc768d02e41ba5ab8cdec2a1796c2f3dfbbd8b4ad9b9dd339ca660bee66a3b4d6f737df730f42a80402014c43a7e397fe0d81a0c6835ffa0a85a2412416c334b6a3a91a91ae553cfca55f279f2f120c85299992ed0f7c123510c014b0e3fe4f3274fe22fafc363ef66f3e472012e10793e7d87dc79db474f5120c6a18bb37811068aa60d5ee0c5a208876fb9de40b45542d4828a0b0e5ee3c6ac08a38a328928d77e5084563081cdf4e82fb1ffd248542015088c4a2e8ee5ea6b767f0d84a9699ba70c7c8634f262b5e72b551eb81e308aeac6579ee627aed9cbc0c4e94a1bc82caf5c1244d4cd3c0d00d8ebd778c7dfbdf415114babbbb894623e40b79d29934f5817a0ab922012d889412a3ae97dbef68e7b91f3ec3d591cdcccc6718bcfd26cebfb79f5c36c584a972eeec5152c959e2b11a1e7af0615e78fec78c5ebe4438d1c4fac15e86ce9fc5344d52c914a72e5de39e0fafe2a97ff80b8cee4decbef54318a689a1ebd475aca64e3fc33136b0b23d6d3977d44b9c3e7f8ec9abe73195186b57af269aa8a17b450fa552894838cc831f7d90b75e7f85584d3debd70cf2adc7ff9985b1314ab5cd7435c748a792d4b774d2d308a3a363944a455efef1d3cca4b2cc8e9d25393b8694fdf6496ff996a9faa5dffe9a664a7ec5c4ec2c68adcc86ee244b0733996b3c3bf7517e1c7a80c7b5dfe1bcd9cb8999200bb3296e6e28d1d21065ecec7b1c3e7898b6c19b58b56e1d91a8caeb6fbcc9c0ad1f43e6173871e234b55d83ac19ece3d8c1774874ae60c54037c98534d1fa46ea5b3b69eaea255f3208c56b0927eac9170a3476f7532c99140d93826952d04d8aa6f5bba85bbf0b86fda797fff286494e37c9954c72ba414e37c8970ceb7d43523224ba69a2bb9bd7d61c34ed096b4ae94a6413cadfa5056f02d228a12a26ba50717699bcf3d499abd251a03c93d774e677059c23e05d5b3fef6fca8557d6e32a491ec5cd3d28f4ac064de9f87312b6e5ba7def4982a26904ec88acaecb5440d10204c361544d03098aed61d26107f19a1a7a560e1289c71148bafb57d2d0dc620557b4ef7459977a1502a110aaa6215495403088a6a9967bdd60d0ca5714c08273ee605aa772024551098482048201d776b272255776d1eaef582945b93fdcf72a180bb23c4e15e3b6a8bfddb190ae76ebda667ae03dc614844d9d48308c694af2f93cef1ed8cff4f4344208b2d92c9393931886c1e0e020aaaa512ae9c46296f7d3a99133bcbd771f351d6bb869e776ba9ac3bcf5e6db849a7a79e0dedb981e3ec3e9ab29bababae9ebe9666060805c2ecfaa952b28a567387e699eee15bdac5fbb8650384458e478f7d049d66cbb95cd6bd6d0d5d94138a0522a953011dc71dfc36c5fb71a592ad0b362050d219db70e9c2058d3caea813e56f674919c18653a95a1bdad8db6d65606fafbd1758386fa7a6a6aeb90c05db76f27b99022188a70d71d3771e5d2592e4d1aac1ce8a7bbab93d6861a524541cfeaad6c5ab7dabddc6f1dbaca5129e537c5ab1766c212f10642eeb2f50ecc6286d4d4154e66eb3838aeb32fb082f9bc02c2e0cee913fcdaed2d34b458911f0c29314d28944abcfcbd6f520cb5f0e1873e8aa62ab624f1bbccb03c55da92cadebcf33b0f138b8e13af972a151edf56b787501d188170b52b2140150255b1342d27afda0d7f84825a4813d14a14d4804f77593c79ab2055f9ecba9a5a450b9783914be42f951cc5e246de59a25ee1ec9d0967dc649501b84e59d5caaed6ad4bf5e552f87bcba82cfb83bc5f659f71115c655bdcf74c1af43c8df15a74ddc0344dde7bef107bdf799b743a4d3a9d26180cb261c306366dda8c6198ac58b182442281e369d22a4a947fbb02c8f144591ec3f2055bcf751c9cc0a7c23eb42ab7c9f2058eab9d960d5cedfa1467b9eadd6e103edca4e38ad979ec4455f2480fe1add7edb772595ec35ae9dc95d37db63836cf0f448877ae61a7ae33d898a1e9ea24e9f424414d61e3aa00c1449c54bee4da69382371e7271e43d5025607d8c5393a85f05451fe6e9faf4aaf2abcd4487b935834b79c6b0a96654dd9ed8810958e44a48b876ed75fa21c2d5411c20aa22104aafddd61644889621a96f1a06a89e0aa187a89d39b5709b35c7eb542ab95ebed15ef50563e5bea35b9340d5683f5c3785e96552a5faeb01b815b6a2a2cd177d57888ac02f781eabe91f1592acfd1a4a4697bd9802d5bb7d2d8d4c8be7def303c3c4243433d9148144397ac58b1825834e6dee8ff59fc79557d4700a664a95b784bd6e3d50f9c3d82a538b9d3574bcd6b174ee2bf2be6c5a39c34cbe1a70de1b05969b92e3011441271eeebc96176b6a30502a89a8654548b1908e1658c042be363b9457af748caf8e1103c20ec7d178417cef346d51987e76eac70ed467dde1165b90e9f8a202bb5a2f277c30403892e24c2b0ca73352aa0240d8a25dd65acd587ab9a98adf4435349e695ae69cb126c292aadee08cdafb6947f495fbd8b3d3ff9e1ab6151ad65b222a7d28f52b9d4cab4943ab29ccae4c5b48cdfe296c88abef4fb4e28d7ecf7ff54ee2be1c3be7acdcefb95b8bb2a0926a61d7cd8a25a45087a7afa68a86f64e4f2088661d0d2dc424b4b33aaaa55f7b0f1f3242fc3b89ebcbf5e19c0921bfe95652f5bdff511d0227abaec724480211d5f4e96337615490210010549c18adc5a7286ceb92c2a417a030c385cc391a28aaf75ce2d7dc5174cd3b354a982f8f2d27cf1d3eb69eb1f686c44f98d92a9130a41402f2e6d512baad5ef27e1ea382ddd4abff45f46727123cfab157c83f93f775abe076e18efebbe574919d72b7739bcae57d732b001856cb6e2122f8010f4f4f4585052ba6e953f48bad1162e47034bf18ee568e6c6466ef90974bd5ed4d63686300cc33aae7334265b6b1236d7974280502a5a50a9b7091637d3935f61f066854faeaeb1fce229e2e7a73229248a844cae485d6d0d75b57e5b2b0118a6413e5f40d74b086c075cbfc0a4aa2ae150881bdb185a26492c0f923f6f39765937c223ad4d6259f6be795d78b934e3af52f72f8c8ffeacbcb14a324d93a9e969828110b178c4f3c4a7827cc00a3f08c3fd7919f6f5debf91f40119b99db468346e9dd448c8e773cccece92482428954a18ba417d433dcc5e43498f232514234d84dbfaec93147f61d5d3cfaa3f562b63b9727e91a27f89fa840091c2f21468e2dc702d954ae4f379e6e7e6088482844361f758fb179114fb742a9b9da7b1b1d11352bada32c38b7f3599686f989afe3ea9ae7356067df0977a63bd5d9153d12d37363a5e0cbc4b25cf12d9e7d26431b6fe055865abaa97b9f879254e15e5ba3fec1c29511585682c8ae30607a923cc349220880028812a3df04185f4cf2bd47f1efafa59d2f2f5094073ee7d954a45e6e7e729954a4c4c4c100a85505595d1e14bb466cfd25093472098181d2619489070e3b1579b0c4e85d50675a9c9b314f2d5c8c20bb3d4045a4e515d2a2d8faf108acdc4a53b0f33e934c9e4028160082d18a2aeae8e6834463e9fbfa11a2da6639d4e1866753c851044a35126c6c7300ca34293a8f6ce72cfaddfee5641b52eb4e12a4b91e0f712b944ed4b9553756a57642e3f5295b54a5f3dfe9717f7815ce659f532ab3d5ffc6c31b8d3c7b661a51dbe49295d2190fd219afe1246b1859cbc0959f7304aa4d95e9154cef5cad2ff47a1afe5eab3f2acf04df6a53e45512c029898201008108dc6181fb94453f13c9a9c86e22c723c4ca16527f18646c0ea7481b5347008a61ca207fb68117f3e0e412c96add8cfcac671ceb38adf4ed96e53fc134854e42eee180f1eee6be53216690702841386475a751b864132b94034d1c0dfffe800a9f959bef6c50f53d48a2412096e24cdcc17b87025496b4388dece9aaa30524ad2e934866d8456ed34703979b6ecf491766bbd26f5d23ee3141543e4fb2d3cdccdd3eb4b94e3c2785ff3212d7ce3e941efc6db5205ee83c07e10dde446601dc6645de4d509cc7c8f88f1750aa3263225a8a97b91d4ec2b245bff13354d0316f3f7087be1115abeb0dd6ebf95e9ccaed0a7b455f3500065da13089b6e2b220adb03f633d197b036f81dbee08cb9175f45b12e267b0da8cb3859399a6b3c6858113e62b118353535d6fa786a8a542a85cc9c81ec71282d60cef5204d49a9a4333f3f4b43432345bd443a9526140ab9be750e1e3cc8fcfc1c7575f5f4f7f7d3dadac2fcdc3c5746afb263fb0ecbb2d433c002bfb3c06a72de0b5fed74ba12fe7ab97269401f8c17ceb98a22a5a490cf93cfe789c425472f4cb030375d65efac7a1a9bcef2fafb33fce8509253531a1dca2cffd3c79ab8efb63e0201cd075bb611b225b0dd419544723d79bb48b696396e95fd1c89874658cca5ec123d4ce8bae5380328290783f4e9318b55a74a795d390f9692fb9517fdabf5c9f5ca047f9f5585adb20274dfb7fbc23425524f1148be4231a7737af64b845ab7d094788684f616e3437fc388fec70cd4d7120e286ed985f43c57c72608c4ea686f6d26e0da0895f11342904aa510403c1eb7e7a61f8fa568c734728c4fcf52d7d44654b5b6661455e185175e60f3e62db4b7b7bbbeb724d6a9f4befdfb191c1ca4bebe1e9064b2598ebcff3eb7dc72ab45c386c1ccdc1c0d8d8de53ef4e122999a9ca6b1a99113c74f505b57cb8a153d9e7aacd17343844b293be7e6e648a7d3a8aa650d3a3636465d2c4e8b7985588d0af14e527a3bc5d6dd9424fcf33fff33bb76ddc4f8d838cffcf01992c9058e1e39c2e0e020f14482175ed8c3bdf7dcc38f9f7b8e5c2e474f4f0f7575b5280acccf2f20150d451a2417e6c9e6f28482415c91ea953655fff0c121fd126ab9f76dd1e4fbbe7c7d65e9532a16310c9d647281f98505344d239188717c7896c9d9393e79d74682417f88702799a664682cc353af5fe36ff64cf3e2508854bc93584b1b0bd4f0fade618a73530cf6d5120e077def5ae1aef2685ac0be995d9e74decf4a96a8a84ad9acc3cb34cad453f1e99dcad5f2ab252f075ba61c9ff85c0ebe8a64aa786339d67fbd3eb9d1322bf3aca823d24768de0224f86cc924925c2e4f2010c42ca6090c7f0b2d3f8511db84baf257d8c3cd3434bc46eadc55be3e7a3f63c5389dc11289b08a699a3cf94fffc03bc7ce3179ed325d9ded285a004d51d18b454aba4e3e932693c9f2d2cb2f73e1e245060606308d12f3f30ba00630f412f94c8a4cbe04d224994c821a44532c8787a327dee63ffef55f136dd9c4aace3a8ac51cc95496e7f7bc4467473bf14888542607402a99c4142a75b5350402014ab92ca96c9e60304c6d4d0255c0fcc23c9353d37ce31bdf60eddab5b6c7d71442b14e2693a934c592c1dffeed5fb362450f4dcdcdd4d42428157224d3590281200a625422bfa94953daf1c715ea6aeb18bd7695603048b158445535bafbfa299c1f242d62604a1608120a45300c835c3eefde9ccea4d31c387090a1a14bd4d4d672e5f2653455e55bdffe16fbf6ede3fcb973a4536932a939e24a918367afd0d0bd9175cd0a2fbcfe166bd76fe40b9ffb1c5a40f30fbc7766f9669acd30843d9517a9b115b3cc23322ca7b10e9c5c3c292bd7459eeb07a62949a516a8afafa7b3b39b4c26832a04ad8d35a85af553382925672ea779fee0347b2f969815b5441b3b680f07415a765391502d99d856fedbbe939c1b7e977fffa58d0cf435572baccc50abe02c81925eb2dc4d681a674f9dc2300cfafa7a89c71365f5dc21206159f138a17fcac1341759d7799158e2bb37cfabbb78c1ac2f42080cbd84618216d0eca5ba87612dc103cbe35d06f35a22e3fdeea9d1379cbe6712848240ba73c181a86cf5b163c7e91fe827120ee30e810de4f4a9af67dc659cc4506a99a9fdb7b48cfe095dc5ef327f699646d6139acad35648d29a3ccd2b913e8c7c8a2fac15c4c22a52422291a0b9a38f806af2a3ef3ec1ae8f3cc2b513fb1999ce73fafdb709d5b63072e90202e86c6d6272e42c872f5ca3b97733417d8185a92be44d9570a219b213243ab7f0e5cf7c04d5c873e4cc30bb36decce8b9f749aeebe08d671ee7e8d50c57468678f5d59ff2e3e42c520da2449a0895a6c797d7b700002000494441541175aba809e4c9a593a417a629498ddeb537939fbd48a090e4c4e81c89488883070ed0ded141b19027393fc3673fff258e1f3fce818307d1c31d1cddff2ef17882e6e616daebc29c3b7f9e8954818dbbeee3e17b7759de1024e54b868aaa100804080683689a46281422184ba0f7dcc989dc06f64df6a00fdc47b4b60e614a64b1c46cb6403e3981aa25b8e5e69b79e0a30f72d34dbb99989cc0304d4a259dad5bb7f1e9cf3dc68a9e1e868746f8c1b33f25992b307ae63dc2e130ad4df5e48c30ba6d88e658ca3a61934dd3c4342abedbbfa5275f7a9e1b66f9aff27d695ae51bf667d5fa2aeb36cae587c361da3b3bb95610ec1bcbb290c9d1da10271a0efb2666513779effc02fffb13c37cedc9295e1cad41edec67457f2bcd8d416aa3108f48e211492c2ca9af8fd0ba6d2b6fcd75f0bbffe920afbf751ed373bae710a113d2dd59523a7f8aa270ecf871fef06bff81bffccbbf626a6a8a443cc14f9e7f9ea9c929eb1e9a637caa289c3e7d9affedafbf454e87e9e153fce57ffc63d2e92c50be44eb58bd5bb721a4e7192e8311c2badbe6b034e7b9f76e5b195f0085d1f327f89bfffce7fcc55ffd2d478e9f46b1cd082ca124dceb17ee6d08171fdc67524a8ac522dffef6b729160aa4d329befd9d27ac38678a83a32cbf2bacc30604362e267ff177ffc4ab472ea10a78ee9b5fe7e5175f44d334b7fddef79f7df6472c2c2ca0b87ec4caccc794feb1f09a3b98d244a210681c2495e8623e1ca47efa591e9dfd3fe81cbdcc44ba9307faa26cee0ff2ec4c9c1323730804bbee7b889b360f7278ff9b5c1dcfb166553b6fbef22a57af4db2727090ced666b4502d3b77dfce438f3ccae0e03a9e7ce66552b902d7ce1e666a7282ed773cc0ddb7ed0474bef46f7f8d894befa3974acc4d5ee6d557f7737ef802efbefe1aa72e5ee6e899313ef3b94fb1b23dc2dcdc0283db6ee5e31fbd9f5c668e5ffeb5af921e3fcbb5d12b4c4e4db376e79d3cf8d1fb387f7c2f3333b3b4b4b6110b87e85fb3839b6ebe99cf3df645b2f922b7dcf73061613274e618d9e414b323c7b8e9a6dd7ce997bf8c1070e4c84964bc9dcf7ef2a39c3af80e8669cd77576332ed3f8731e9ba8e10d62d6325de80debc92522849acb51b806834ccc68136feeb5fff17540cb6dff9285dd12c6fff740fa16090fafa06fb5e1cb4c702bcfc931fb26ef3363a3ada19ec6ee4c8d0242dcdcd149520854281dccc3486a163aa5514ef2ad25338d20e51f1dcd1a9bdabda2a3b08cb09e6a5eab327603693612193e3c54b2946164ad42a92cec638b168c4f7eec9e1147ffac36b146a3a8875c56989a8045450d5b27763c314e806947449a1245155156df31ac62ec4f8da7f39ccbf9f48f1a94737950901cf3e4ea5e2a2c2cccc34ed6d6d7cfce30f128fc7d8fbce3e0cc320333bca53df7a83f18ce09efb3ec686fe16e6e7e739ffd2f738f9e1db993f7b8c3d87aef16553e7d4a9d3bcb0670fbd1b6e21a164991a3ac97421c8873ff6096466823d2fbe44dfc65bb965752dcfbdf85352468cedeb7b486845de3e7c9e55db6e4726c798183ec3dd1f7d849e9e5e10a02a2a8669a0a882d327cf329915dc73c716ea631aef1f7e1f55d3e8eaeae2edb7f7b2303d4e2e9322d2b581fb6f5ec7ded75ee6f29cce4d77dccb997d7b48c4623cf0f02f21a5e4c2858b188641b158e2d2d025923313fce8e9ef339333f9c4c73ec4b9d3273873759e1db7dfc7c8b1b7508c120f3cf229123509868fec47314cd635ddc10fdebec2adb7b6909c18e2c9a77f4486381ff9e847983af30efbcf4c313c3a456a7284efecf931734694fb1ef828fdedb5389bd295d3c6ab3199a681115ec354fd9fa22fbc4731fe779c9b6d23198df3fdc06fd31db993b1d908d73206e3294b009e3b7582f3e7cf62a81122b1187dbd3bf8e9bbff48a4f70e76d7c749154d669393ac5fb181f7f7bd415d2cc2a31fbb93e39767686f6b431182f68604b95c809ed63922e1387575b548e0d2c9e36c7ee0337ce29eed1c7bf3592e5c1c656d7f334f7ce749e692829eee3aba1a6b89c4eae9696b26128e5157578f4462e83a9d8d35446209ea6ae38442611674857c364d369ba1512df1ed6f3d4e2c1aa1ad36463a9de2cae818b1967ee2a51cdd3541fee5f16f52535bcbda352b393f748927be3fc4c0c6dbd9b3670f67ce9cb67c7e3bc7998e1a7cedda3542a1901b793393c9108b5aa1876767662c3b1a45e3ae873ecda6d9398416a2a1a11ec5d4f9d5affe366a30c46db7dce2d24b5055d89d5c201489110804d014d8323b875054c2e1303dbdfdc46bea0968eacf6092bf94ceff41961e37969cc0878a22286553ac6a8a31563428c93c1d8d0962e120de0ddc854c89b964845bd6d4520c43d684a0060115149b9f1a069474c897049a0a6a095409ed5d5d8cccc0f3afece7817b7b50b5a0db2e598d0a7096340a274f9d22168bf1c8238f70e0c001a484375f7e83b74f5fa221114421c4a6af3e0608366f5bcddee7be4741a963dd86010ab92cb3572e905998e2d96fff133d7d2b58b97e3dfd5a81bdaf3ccfba9e46d2f313fcf03bffc4d486016a57ada73635c4be37dfe0e2f94bc4da5a3873ee32f50d09d66fdf415b6b2b20397af418070e1ce0431fba97bebe3e76dc7a0b6640e1d0bbfb98cfdf89c88e110c4768acafe5c081fd4ca50a7ce98b9fe6b5e75fe6e94ba779edd0219a1be3cc4ea7989a1be32b5ff90a414da3502ca008d0858242092154520b49ce9cbf4863ff16ce9cbac437bff32c1d5d2d8c8fcf93c9cff399cf3f463412c1d40d5abbdb4818337cf33b3f62c5e05ae2f108afbff4066a5d27dd22cd334f3c4d293bc57d8f7c8cc991a3ecf9d11edebd384a222049446b58f9d987d04b55e2b5d9eb4dafb9004a909a8e1d94ea7ab93cd4c8a1701f7bd24dbc175b47fa4a1c43950c2c4cd0dc97c39492db6fbb8d0d1b361188580ce0a7afbfc47452f2d8b6011aeaa37cf2973e433012a72e1e61ebaeed84a231b66cddc2f6997984aa128bc50887424809bdbdbd288ac2e73ef77904b06afbbdac0a5afb959bef7890b5454940dbc8b6f90c5a304c38a01008065114858f3ffc08a669f2e9cf7cc66d5ed07ef6d8635f4420c8e573ecbae956eaea1b90c5db49e78b44a351c2e130aa80dffd9fff9082548984020455c9423a4b2c1627140cb02397259dd7a96f68209b5a60ddda7568127b396387f5350dcb7f773e9f776d76a429dd13b75c2eef320f550bd2dcd26a616a9a2054ea9b9aab2ee81b9bc336f5581f2dad6d2e8873b4ee8623ae1ce04514b8ccb31b4e553659972acf56cc9c5bd7d1688cd4c202831df58ce64368a534b5b12035d1b07f7f594aa6e625ef9f822d83b0a215f2028b01d98ca96440b104c1126433509a2f51ba9624989ca63899245753a0582c12b119936f03bf124d699dae3e70fffd7ce1b1c7c86432d66e91943434d6d15c17a7beb985b52bdbdc656c4be7004df53aa9e61d94dede433a95e2f9e7f7206b9a4166d184c1d6c13e0cc3e4ecd91778fef421cc7803d2bc465d22c8c4b5abe8e95982c1103d9dcda4b438eb5775323b3fcfe6953d0483214cc3a0b9a989cd9b365193a80129199958602623498405b313d7d8d453c3cbef1ce2dae810c54201f42217cf9c266728b4b435d3da10a7b6a99d75839d9c3d9b66754f071208682afd0d51bef5e4d344f5696a5b0789d5353238b88afdc78ed257bf9baeb60622354dac1fece1dcf922ebfbbaad6372d3442a1176ed1ce4a573d3f436f7612627a9af8b73e6dc55e6459186e65e92a3139c3a7d9e64a6c4e655f5344cced1d4d4c4aade66cc4abb32efc9a3bbccf346993651c3f534af7984fb0b066bc6e77962768ab393234454833b1ba759d3d989619868a108cdadb6c5b869d0d53dc0e70736d2dd54832ab04ecdec521b9a5adcb9ead296bddc558440d5546bee46a2988649306cd1a315de3b48d8aea6b9d9aff54b24917004d33489462394572896088e462c172d91a8c7b23d5843382e5c216a0235f58de56539d01c89bbf846e3b544138094d4d6d5515b57e75fca298a42301446cd59c7e0adad6d48290904034c4f4f91496768696d2d9f825552c7a21d67bbe60fc0411641cb65deaf5cc25db71e2f4c55cab6bf545f4e4aac7e0a4502e4f339e24681bb13a364468f51ccdf457b538d7f63554a429a892ee0e430ac31a1bf1788e01e2f178a9031617ebcc8dcb505a24686f626852bba423e9582b8df54da7b42e86b86b022adae5db78ebe817e0a850242081e7df4514c53d2d5d1c89aad97b83c3e4b6b6b2b7a4967d5aa95b4b7b7d3d3d3632d1d9ac234b7b6f1f92f3cc6d5059d78fc61eae241dadadb41c2c38f7e824272966b499dd8471f666d5f13cf3cf32c8786a7b9fdee87f8d0ee1e0e1f3b473812a3a5b585f6f676cbf64a4a5a5b5b69b38f9f75dda4bfa389d46482dada9d6cdeba83c650919229491167c3c69dfcf0a96fd3525bcbaa4777b271652703ab7b191a9da2abab93f5ebd6e35ebc55351efccc6738f4de7174ad9d0776ec04b34853472f9f5ab393ed9b06d9b06915e786aed1dad2c2c68d1b090483f69e97e0d1471ea6afaf8fdfb929c8cccc34996c8ece965a64f43db244d9be7d0ba9b1959c1a9ae1539fff35b6ae5bc1c0c6b35c9b5ea0a1a9c98a2fe8a3e4f2c98bbbbf66d39877b004100b2aac5b51cf6f247224ebb2d44642c4a3ed44a216f3a84c7d7d7d80747d172d9ed3d593173fe7e0a73c87acf7975b4738ef7bff572bbb1a2e4e8ec4dffee56a0310972f8f868b85c21bbaaeef722a320ccbc64875ef7a497b82d9c7cf3f83aab25cf7f99f5547fe46d9cee237977fdfd981ba21e629a0902f505f970021118a46537496b1b33f86b64f736438c52debda49246a8846a3bc7e78823f79224567ef4a540d5445d2d120d8bc1aea1b607c4e7269a4c8fc4492da4091505030316770715ae3dad514e32787b8bd678cbff9fafd44a271e6e7e70868f67d39a7bdf689906546a4a350448872cc38d5f2dbe20a1e27108465506bed2e9bf6782baab594b69cbc39121f1c6338cbf19be50a464ac8e50bfce427cf5122c89df7dc437b5dd47636575ebeb893d93338c2de035455eb34ce300da4c4721a87a4502872e0c0416ebe65b7e5e0de345115d5dd5ac09ea3eeb008cbf9bd00744307049aad211886b5125015c53ef490788dfb5445b10f407037bc4d29d154d5aec7400815d5b5ce77fa4758ae7eab69f9cedc9226730b59a492a0582a2d21b8cbdba1ae5f06b948e42f294e2b4f0eaf977fa3a9725776a9b2ae5f8f9ff26e00df0302eed41cfb18bd545a8c48c9ff22802cf97fdf384ad77f5ead23aa3d5f2abfb2aecaf26e949d2ecb44edd3af6050637a768ea6fa4ec2896e8a98f4b4d62e820da8925814340d34559029c1e961d822e1c4c9399a2245dafb038cce05787dff15468e8ed0bc6a1566324d2c16f2a9bf76a12e432a4b3b0928a8c61c81d225cfc6bf37957b55013437ef674f71e0f30fad0109867111992b3f5316412f2d365cd882f51101eede518b993f0180ea79cb39f9d3a83e4e8ef5972c808240c56f0ee2f573e125f6a5beab1579aa8b85b4f15e9a84a594c44c492e5783522c5231925593a8f85ceaf9f5f296cbbfd12496f87e63f52ccdb26e045f2d1209db6bc77f4d379a829a8222ac585c99bc24d6b896dcc2022db59df8bad7940434d3624c017b6f4905a1c16c163423c38a15355c9833994866c82ea4a86f8a13cf4dd1512f18d69d50ed76f26d2d49ffa734d1d52674b57911c49293aa520c0bfbdf224332fc73ac1aa7f7de45ad56ce72926629aee07eadee1de9836d12f8d37f8f32bda5039852509a3b4277e6a55f48a9ffc3a46576539ca441c59ec5bfa6eb26ebfe9782a669cccfcdd3ddd1833a7714413b82b291a594105025d128040210d02ce614d0201a81003a815291c2549af4e81c5d7501fa363423c3759cbb5c24397411d1e0191be11c3f2f7d7259cd38c217a6dccd958b2746e576c1d295783eab48c6e5caa916836a09783fc358cc929742f3467732cacb78e77775b81bd1eaab69f35282340a98d9c965b5f9aa3857547c23ab0fa88e2be00bccb1087e9967d612b7fcc0e77c7299674be1e74f1ea78215386855e1ff352d9b9c93965834caecdc1c45234820d16705fbd3ca5751acfb8026d10804833663d22c93816804b2ff0f7b6f1a65c971dd77fe2233dffe5eed7b2f55dde80d20b6061a9b1a3bc00d20286e124971a748c996644b638fe563cf788ecfb18f64c9b6ce684692652d0445c91428922209803048500009922000122076a21be87defda5f55bd3533623ee416b9bcaaea223c638dde3da7ea6566dcbc712332e21f372223ef6db479fa47a769b415974cf62272133cff937966db8ad9b3cde4d60905e1a7331d666ca4775cd59163e3e44f242ffcae37867bd529f73af95703b6f5f268b3ea489a52b86fabeda6c61f85a2d5f35a9d37cdf488fbed8c1e25f9fdcdaad209394d43786b71719969f67a271d3a98bf09fdc3ddf67a5bea02d30628586f304d72b91ccb2b7532b91eea4b8be472f9806fd34891927d94f3a7cfb373cf08f91c981e3015f290ade4d9bca58c2a14397cb6c9771f3940f5c40c839353505d412ecd519eececd04dc50fc4daa355bcd98ad86f3c31723d96cf5a9d7c3d23fc7af9d3f4d547e9846e419ac79d021c7abe81ec14f44a742fef60553f87c14d2e3075149e46ebe25d9f2c21c07654b8eb3d9636bdd864b96133355a0a06bb578f2f33de9fa752b450abe9118984bd01fd4474b6a63f972e306d88c225ca4c2643757191b1f1719ad30dcae5d0ddc99eed7dfcafefdfc267bef60aafae2c70f58ddbe92959e44c28e5a0af20e8192c7174d161a556a7af6c91192a533bf21afd669537df98e7ad77eca2502845b3258c5717bdee52c7b6d46154d7dbab481c68a717b04cb2da52927f9c3afdd1154d01475ddf8ec040785f90b08aee913ae8004a91e354599a963aa37250769db5de64a74c707fea74e9481e79f2144f9fa831b5a9877bae1ee6a11f9ee583376fc2320c30c0542d2c656348f7c3700164550bc31128db4e085d4b8f378abac0b4111204564c215f60797925d8901a67dc77f91686fb0bfcf9175fe689076679cb3d9733b6a944c504abd524d36ab0726281e903e7a91d3ec9507685ab6e2871ebcd97b273e766060607c9e70b2c2d2fbb0dc7fb064ce9f1a842b5bc4ed6c126d07a72b293c53e7ef5d81318e75fd7df0e462ca8743b2a0d88d2f8fd683771200c78530028ed34d179f4f2a89826917ce22b47222a60d5bc44a49cfe9702d8ad3594ebd0d9bddb3b828196a0f46b1e356a36df7e6186cbae1866671f3c77709a3fffc611eaf52613fd396667eb6cd954a19c151c3b3acd0f4fb729e74db6f465285ed44b299b0dc23325f4d0aa27feae247026da292dad2cbe6c2f832e306d80c2cf55411890b12cd72d44eaa2b46072cb30fffc17f771df575fe0e1cf3dcebbde7d2553578d53b2e0f16fbeca91d7cf50b01778cf8d435c7ffd15ecd8b185dede3e72b95ce4ab79822fff7d8b29d20ddcff425fd28da4ac59aaf037ec84f18827513615b35ad2ec02cdf2890142da0cd58d9a1b53378909297a474144c4d3f4483d69809b7a67dc5e4ad6776455c7132e80702f9204a715a4859e105472192645a1a046136f4a7d088fdf1fe651c8483e7ceb103f3c5ce5ebc7053f77ed20976d2d72d7de5eee7dec0c939b2bd8768b475e5c4029b8f39a01ee7bf434870b5926872d462b04eb4ca98bd4daa0b45a1974848a6373701e3467f74a17983642226afa577a2acccdb99f65740280dede329ff8c03eb67ee7005fb9ef07bcf8bd414e9c9cc1695579d74d835c73cdc54c4e4ed0d3d34b26934d9501045fed4711c2a5a053c5e772fae09f32aff29d4e869d3f949dd6d622e011596f890d87415ac8a4747edd820bfaa90f22faa2914af226465e11ad839434bf3393027e611dc4e6bb6965d4ea21991701b3f03ba46c27068b24bc85e7faceab647a504ba9f2746ad9929fccb418ecb178e9d41245b39f818ce2c0e965b24271cda60cb3559b9c29711cc5d1f3755a8ea4282442daaede325d4f56d1119283a38add438772f8d405a68d90882e4867335932990c8d46834c26432e97c3b6edc4360cc334b8e3d65d4c6eeee7a557a6b9e58661b64d55a854dc2fb47d771bed763b7a9fe7f278a9bae8e56d107fd50dde23d77aacd705b544d27b917f8b88621780419857cc36d34671df5ad31130995738cdf42568fc426fe651d408771c857245f434a25ba7fd496e7944fa1a5c04e8d2eb2c305e0359fe7f451c68c2f2f9c7218f8aa5e97baa08ea3aecca71594978d0ef0ed3b2a6e0aab12c2f9e69f0f3378fb36528cbfbaf1fe6f892c3dbf70e32de9b65a09461bc2fc3f45c83fb7f3c47cbc8f1ae6b8719efcb216598579a1e6be9982caf88e8a74ff3e3d405a60d50e02f48bb52c8e7595c5c44791f6caeacac901eea5cb0695399ad5b2a48e50542544a0b5e100533a5c0b22c8ac56260a2c7476ea14fce4574248f76b69439529096f8497454e129a4bc9378c0d0b85e811513c5afb03375e0f76739ba3ea9e588198589e2e84657a24cfa0da4a4464776fd34feb240879508482acf579511f5669a828949f204a5a6c533ea7059003ba6fad9b51dd7599d848b770df226e106f8914ad1038c0d08169b82f1a1326fd9ddcfbeed25f719f85375956c39f1cc3aea49b25623fb9dd2109d2e306d8884811bbe4a6b18e54a8509c36071619eeae242386a8b680721751a129242e3f7ee510a66713775968a45cf319b764f6c5ed269d45ebb60746cec81eef8df86f93d5404d340235803f30ae10723d0dd4e2a6fec344454b740bec7a327f91974d02f90adf3a4f1fa9d5d449664889a501a1075ca2b761e7fd7e0eb2e95e1b613334308dc314a192b22bac5797535d2d2636dcb05208fd77237db4aff5e2f2f1bd8bb6380ab770dba00a6a279c56546c068351d3ba4c567eabaeebe45d505a60d50b3d9a2a5a286ac6f5314f285d5878f8d92d7391bcd26a14de425e9a3397adb0813922ac5cdead02a0ad661621ce047d4882be6ea2684a1719294ef7d40eb9e1a11ab33951f1ff6e2a548f225ea2496162f63384511893bd2a487f595d4214d53f7bf81ed4830b31a639883f080db053711d528914d4cb355644578238166e3d709d2dcadc00a8ca82e49e08935b64891d793466ca4d678840a92bac0b441f2a37cf8ddd7c50d6f8a17f4d5e85265f84c45a4dd45db60ec8a9f8f379ae8ce2b83c7dad19c16c16fb84e1476ce4e1b37f58949c24010668a02e924120d4f688152d7c1afdf1acb2c5e966819758ed0aad34911384e89c94cd72c7eacf32acf1a0a8c2f8db7458e398613658a29b3be6baba577b212d723ef7f9634ed7a17983640954a0fb96c2c0a8a52349a0d969757703cd71bbedb980070b4efc4f46dfba98014c8752d0ca9dc6d093d3dbd18a69100865092d0d67422578334f07d5faf676e914eabf58174392af0b0b91e0a2c2bafda62925c58894f0d2248adbd4e571a04890b9099528cf0e969bc00425f00770713375af365e4b65d05de674c71cb2efe08a4bf2ed5a982d3aeaffd3056a79ff6fe0b95b75ad93cea02d306c80d4ae0b80d1c585959a1d96cb0bcbc4c4f6f1f7d3d03341acd37ece368d334c86673cccdce90cd65c9e70bf88bd0bad9af67e72fbb47de2469d6961be4d23ffb1f31f78c939fcf7a5d27abe46c440708ad2c9032698b953b3e3d5b8fcc80d73b0ab63d68f212d33e81bbf915178894b010d91e6cdbe6ccd9f32c35b2b41c03db06db71ff7c1f7286013dd9792e9a1a755f76e87511ab9a886eda1eada427a7f09e50bf585a041d3bb559fdc694e961721c4a3e9375ea2be802d386488f3537bf304fabd9a6e118d4db82917c1ecbca502a8591365ce7691be9fcaeb335c771b02c0b2b93f1a2c8c43badf6e8bdb93ac41b6072c218b689d501f40d1ba495ec60a5a5f17a2ddddf60a4e26b38510ddcf2b8b2c33a49b34085fbb2209099d2a3822cbc74a577a158370b541161becab74edd63d7619d8d696628f66e45364cec96c26e29ea52d176bc4020288aaa866db790321fcaf7b38bd40f91e51ef727dc2891f66c22cf3c811629d73b50c0a26202d2f173157dd3f35374816943a47041494a49a35ea7dc37ccbffdc387a82fcdf307ffe2e7c86673148bae2fe4c3874ff2f0c30f93cd362f3817c72973cf3d773331314cb5bae48672522a68f0a117b9788b089fb64aa487c77a9bec3466fa3c6996c91ad6782c3dbdf1aece1f0248187a5c07a5ced641b26beae0a4c95010750ca3837c2c8fd4fc354b2206f4fee0a5a41b5a3e6bc18e29303d375b8e1701db711cd78ba7941c3fee6e769432f42a1a7acbecdcf305e0b4eaccce2f6066320c0c0cb02abaa4c8885cecf8716efcd60b189e3ab246f3eb5a4c1b26856ddb2c2e2e525ba951aad838ca606e25eaa5f0c08163fcf66fff166f7bebdf72ddde85c46be58e6482cac0b7be35c2bffdb72ff06ffecd6fd2df5ff672f6c337a9444748d3332d4da43429dd4d52dce78e7663a46f06b646d42009b24e9323844af26bfd5bff022732bc27dc0868b223664067bea8d5b33aaf4aadbb743b247d4a2283ef09a5e79257e10606f0bf3574836cba710d9567194be9046f3e9bf52acf3cfd24a7e76aecb9fc6a2eb968b31bd3ce1048c7715f5e1806c2dbdff6fd6f7c95479f7f95ddbbdfc47bdffb3e2ccb080632056e2836c3758f2c705d16fbb106a5e3446d4295f661536c23696c5c5c972d9c321afacfdabf5f8a2e305d30092158aa56a956abe472397a7a7bc9650cb68c0d7076fa5cc0d76e3b7ce6de3fe61d3ffbb7bcef1d33f05f81b975667229f01ef8e4a74f6366eee3decf8ef0ebfff45701c2e9817ba6dde41e0b6ffae37672916a3d041e70d2fb65d8d084814c44d28df2c4cdf58e3cdab11bb2dcb78688ce06742c4a1386ff7d9ebb7521b9273ddd3a5c1d90a2f7ac57a67e47c8ab5df79e55106dc8b7a0941fd649468e1d2fb8a9eb2fdde6dbf7dfc781a502174f8d3077e215e4d428a78e1fe6d89979b6edbe84667586dac20c75a3ccd62d5bf8ca634f71e75defe0e2ddbb58a99ee7c0c1a3a86c85e1de22b97c8ee1a1218e1e3b8ed3aad35c5962eb453b3877fa24b32b0e3b775f4c6f31132b57a430e171ea3a95668876aeaa6835c53c18eae36c17982e909452349a2dc6c727e8edebe3fcec1c28c9c840856c267cb08e54d4674e71eab1227ff09d298818530a6c9b9661319dcd336ab7b0f4a7780ef8aecbd76c4996add3e1a8a78d80101b8084a256af61db0e95529ef3d373f4f40f92cb9a414b8a76d514f3c6bb2e04dcffc003ecdfbf9ffefebea0ec618e61ce919ddd3139514472d3e7e7e729954a643319ed05410c0062b7f9645a263ffef173d8b6cd35fbf6613b7a51d0b95200002000494441541499f8aea4e81689b8f028af2474559604accebc51b9919c3410f2a3274b29114278d6910b46feb161b87bbb9454b45a6d9e3b749e0ffce37fc2d6fe1ea4544c9f3cc27d7ffd054a83033cf5e3d7993b7f88898951e666e7b8e2ea9b59aed5a9cecd72dfe73fcf547f9e334e819993af5328f5313535c5bbdef56eeebbeff3ccce2f70c96597b33c37cddf3efc288e21d873c56d7cf2036f0f22e1c6112652deb46f7a946f19c79f6714e4135678843f3cea02d30628635914ca3d3c716a999f9c59e2a66183f18132c54218225c1ab0f9788bf73f724673b6eb9191c5f9f08739746686df7ce52c7f74ea792688af41b90faa8ee20b1fb091de5bf660d4f51ebafee82dd3e4d9677fcc9993c7d83258e6b9e375def5eebbe969b99685615964b339daed36a6018d7a83b623e9a954585e594109834ab984b29bd41a6d7ef4ec73ecbdf20ab29689ad04a56291566319a5a0502c25714d42b35ec3910e855291daf20acab028978bd8ad062bb5268572997b3ffb596ebde5162ebfec324cd3444a45ab51a3dd6e63640b08a7455b0acae5224eabce4aa34da95c26236079a9c681d70e63998abd575cc642758562b94cd614a81858f8938f74cb2b5a77eeaf8c414b686125e5c679e3d2c34eaac796abd7ebdecb101256931fddc6912ef08d552c7ef8ec4b889d9b682ecf216d816d14b9f9a69fe18b7ff308866170f73b7e96179e791a6157b9f4d24bd9b57b37070e1ce0e4991a57bdfd67392ae6383f673333bfc8d123af525d98a150e8e1ed6fbb8b97bfff18c74e9f67d7aeed0ce4db6e5828e983b63e84a52dabaf3571d32cdce0ac9309955c5ee802d30668656599eaf212afceb738dc805db5361343654ac57c648b40564986476dccb796c012eeb35c92f03d8b276fba9197ab0dfef12d35b67eee28fd6f9a81818cdbc3a5826fd6e1b4431dc8442c09153678c25fb72398d8ed360f7ef90b5c7df727f8c807decda923aff19ffefcbf72ebad7770e2f4193efda94ff195af7e8d120d1e7fea59c6b76ee7131ffb305ffed2973874e21cb7dff90e968f7c9f17cf34387afc24270ffc98cf3ffd1cd57696abaebf95a71ef91bf6edbb8677bde7bd0861603b0e42b8de3c1b8d26bffd5bff9e9d3b77b077e766ee7ff407d85689b7bdf56e8e3efb08af9c9c233fb89d271e7b9c53a74e31f06bbfc6a64d132c2d2df37bfff93f32d45761ba9963ac37c3b9d925de72e75b39fae2b7397866911d97dfcca5030d1e7ae239ce9c9fe7e6ab2fe10b9ffd635e3a36cdb64b6fe463efb93df6c22f7dcae5b208a293e16827f4a127fd1d5767b9fa864f896f21857fee3434daa14dd3a456ab313d3d8d655954ab4b140b25300477defd4e1e7af811feea9927b8ea9afdecdfbb8b3d937d7cf56bdfe0eadbde4273f638c56c8691d1716fe3aaa2542cb17bcf1ef66ceae5a1bf7b8883874f73f71db7535b3cc9d7bff5345bb75fc2405f858c80abaebb9a772fce70f8cc02e54ad15d07f35cf7244bdc619eee517cc29b46692b079d26d55d60ba40124250281468d796b9626c80b36d89c30a9b07ca94f2317725023704d64987c06c6a289016d5f945fee0afbfc9dd77dcc0fe7ff62fe93ff21578ee29824886cde8aa4848c9a99c7735b85ea914a9cd9f63a15a67657999fe2dbbb8f1b63bf8cfbffb1fa9371b9c3971881d93938c0e0fe098150ebdf83c0b33e7387fec65befbb04d2e6bf1f15ffa289ffdc3dfe3db8f3dc953af9f64f37085a3af3c8b280df09677be1b210c1acd069ff9ccbd64b3593ef6b18f61b7dbd4a4c9ddeffd20f7dffb275c7dcbdb60ee088f3ef430d0e6539ffe287ff65f3ecfde2bafe4173ef441508adffaadffc02597eca1a12c3efca97fc41ffefeef71dd2d1f64e6f8419e78f461c816f9f4a73ecc9ffef11738673adcfaaef772f6c5bfe3f889d37cffa91f33b5e7228ebcf024cecfde12c4960b6b4a3f8a4eeee25ff427c312e8e0b51aaffb9b3e117465b996881bbbce34cd0438b9d19d8b98a6497f7f3fd95c0ec791f44d6ce7173efe69a4b731550878ebbb3ecc9ba5f2be357c130ab8ecf2cb3d499782824d9b3633bf308f78fc192677ece692eb6e666aac822335605440b1c03d3ff711a477ddf6defaeacd375a8fab53943f0a55fa7bccf5dcdf05a60d502e97637171816d93435c3504c5a52572993efacb85e4a2e09282975b61ad3b0aec1c8621585e5ee1be2f3dcc2b575ec2a7effc046f5bdc84f5d5bf055577ef4b21e94de3944aae9f2825b12c8bdbef7e37938379bef2c52fb3e74dbbd93636404f21cbf6a13cbfff477fc2f9d3d35cb4f3625a8e64fefc594e9db438756e8ec12d97303ed6478fd9e6737ff52566560c7efe2d7b69674c5aca62eb9651721928652ca4926433193efa918f005e604d60d3f0003d398bbd97efe4fe6f3f8c23b2dc7cd31d1c7be1313ef3e77fc9e0b63731612ef0c5bffe6f7cf8231fe5377efd9fb2bcb2c2c993a7e8aff4303c32c1447f85fac2205bb78eb23c3fc367eefd3c63bbaee4b281268f3e743fd5ea12d75fbe87be4a86c3d3352edabec5b31893f160bc9a49b9926e01c46127cd664a5b834acb255ce80edfbab5dbed602a0704eb4de7cf9fa7502851a9b8ae99a523a353652523f295e39d7558a72f97ca7cece3bf8895cd92cb66b06ddf124a695702cf53a5b6b0172f8fbf3814776baae51ddd3ad6a16e3a2c41c6f3eb02d30592528a5c368b659a88468debf327983bfb035ae577b279a437b6f8090c19f0beb21b774d0055090fb90f570881611abcf0dc2bfc6f474f72f8836fe61f3db08fec0ffe1cfed3cb703c6597b4d2d72efc4c5c6adb0e575eb917475e41a99063f39e0532b922425c868dc17b3ffa4bcc2cd6c8e60be42cc125975e4ea9d24f5f29cb55fb6f4159797a4a392c21995958219bcb33d85762e7de9f6169a5414f4f0f998c85137c9e2edcb5264f8b7ca1c8c73ffe09c0e0921bee6064c7e538668e91a101aeb96207330bcbf40f8d90a3cd3533b30c0c8f50c8e7c9e58b7cf4a31fc391f0fe0f7c9062a1404fef00575e7105ca6e31b7b842fff008054bb1fd8a591c33c7404f11e9b498999d771df4097713ab6f706a9f2ce2f7067d3dc9e78dbcf6f6aec7fb8cf21844284ab30a922fa242b7b202a584e7d74860db0ec78f9f88dca310d8761bcbca502e95dd69a0ef0955df4b147bd6b1a211f9c6c6632b160b2884b6ff298e02027d036bd2dc54f1fd1b9d303996eea154a262f4fb445486b608de5dfcde200904a57299a5a525c6fb07a8d2021ca6c6faa20fc3006624fcdf8b5101fdbd113ed334585a5ce20ffefc7e166bf7f0f313ff9cdd53f7c289c793234fb0b3389624048653a52c66c112a89662a422800540a09a8a4a4e50193340babe9f864b02984129d83a22806620b33222803a4ace33d607637d02d43c00b27d3e5123be428379816a4fa3846062508068815d259753f48e81522701981a1328791a9a0a4b08727950ed690672ee1a5bdedf2c6f097a0b803c010e6c1e12081a281650a6a06f42a0541dd53eb2be8717515b849518ef80eb9641c7f98952928c92d4eb43349b4d846106fd5505fd526159ee12c04aade6dfe9fd4f029f9f1a05d9a8c748a133fa7c5a7e2e8fe8787f9a0c1d473adaa431f0f653143edce8d752f4d5a80b4c1b20a514192bc3c2c222ced0668a7d1751933693a33d5146098c1af0fe0a64bcea5f94f0a048346621209bb1f8f6f79fe1f8c53bf8df3ff021267ff443081a6b90bb36786a4d548150120c1b84e1363bc709f2111ebb38378deaef07cb4a7e22609a60b89d55f9af8d1591cd9702628bcc0251af43b385eaeb75fbb5bfd663db18d3d36018c8de5e9465e9eae239717263af61204c031c2d32475a8757d10eb25a675995a4c49899458e8ea00063b10aa6892a15575f0849d1a7739a22eb2c52689ec2b1ed0b127ba1b49ec5e737e2fe9f369f34216932bbc0b401522837a65c364b75b94165700fcbe7cfd1dbb7333a3208e08c84bf5a8eae313915cdc850dee2234c6edbc2677ee57d141efd3b8a9fff4ba8d793792bff5f7c04543894311ef80ee69123a85289e6cfbd0f3538e4f278f316eb5c0d7b6827789fcce087e81190fddafd98a74e2137efa27dfb4da84ace052ba55cf0304cd7fa970e485096098681f5e29398070fd3fce847315ffd09d907bf8e2a5768bdeb9d18d37532dffe0eedf7bf1fb965b32bcb71c030300f1fc13a3a4debd6eb10d387b19e7882f6dbdf87cae7dc2f5a1dc755ccf02acb71f05e0186a06b9a5ef9bcf5251fdc5c6f7e1ed029579ec2fd9512ec36d6f93ae2c879da37ee27fbfd079043c3b46fbb01d16c785311c395afa45b7f96e9deabd5850efe68cf03bc10e1cd1f31bcf81d749b61b58ebdca12ccbad2d9c0f5373a4db7e6d60b6271de2e306d843c6b2593b1a8561719d83c46c69a753d0e986694af28607fde5d6342404dc2b3aec5241d494fb9c4e62de3fce495d7999e9ee3cc6b87b9f22fee85e9e9d48c150ae9ef9a8e2f41a0685f791999ef3d4ef33def86f9598ca519c4dc39d4e876c4ec022a9fc57cf565c4dc59443b877dcd75c8c112380ed68f7e48ebce9bc87ce7db18a383d857ec22f3e863d0338cb36d12e3f5e7112b2de4ce2b71860c323f7a1ed5bf09d16840ab8e1212e3b5832869d3bae11a642e83c865a05987da2cd6775e41b432d8fbae46f616318e1e22fb879fa57de9ef63fce887e4fee26bb4de7c0fc6ebc7b15e7811e7e2bde02c23ce1e47d839eceb6e40cc9cc47af1659c4baec219c992f9e1b3202a38dbc740d6310f9cc0b9f42a44f53ce2ec099c2baf410e0f631e7c155536314f9f436eda8698adc2c21cf97b3f8b387b1ab1bc8c79fa30626919e78a7d38a33d1873b398cf3c851a19470e95c93cf30a726a0ff6ce09ac677f885892d8d75d87ecd5ac2c0d39dcb5a936b2554b74bc70b2164ea692139ee8938f6fea8ca7fbf7773238e393a94e601997d5e9bed5d23ac98c5327b0ee02d306c877d8562c16a937e6a8b70556799256dbf100c823816b214d3b5e4d0ba84b682a2470cdf57b79df9dd773654f8edff8b3aff2e28b07b8eff81c7bde710ff97b3f939631045fac27471901c8c929e4e828ceaedd889f3c4bf6b96731a64fa1063783da02f55388da1272eb5654bb4666a18673d1282a9787da0a99471f47f56dc2d9bc0966cf61befe2ae6816fe05cb217f3c4415a37ec25fbe52f23f34dac5333d06ce3ecb91cd963b9f56208ace79f07c3a0f9bef792fdca570181f5c823645e3d0a28c46c8dc607df8e320cec1d65325f7f0856aac8dd7ba0ddc238731cf3b9a7c93cf102b227831a1d46b557c8d45a382379cc1f3f85f5839768ef18c4308b88f967305ec8619c3e8dc8e6c83cf932ca6c22a726b1afc9a0848178ee09b2e7cf619c39831a9b40a91d1847bf8fcae591fdfd98b51ac692833a7794ecd767a8fdd22f601c3b46eebf3f46fd931f257bdf97505bb7637dfd41c4d671cce969645f81ec57abd43ff16e84e3b8d0a1af5129dcd8db76a3a3e510bfbeeacc30f6acfd57ff4a9bdfaef77e5d90afb2a13bf8f63351e9f7ad31db5e3775e25d9fd7ae2e45c847792104f95c8e6a75895cae48abd988f129cc1af0dd063cd680c7eaf06413565a5cd157e05fed1ae63b7ff300bd9fff2bde7fe7f59896c5438f3ec9a9dbde0ce363808b67e94194b487aac213a524cab1516d1b67471fd6d103d857bd074e3d8d181e449902651ab46eba117bdfb588996318274e629c3d8beaeba3f1a94f53ff954fe04c0c907df07e8c73b388ea59c4ec71dabb77d17afb3ba1bd88989b075b22c78791152b9cd23892d65bde42fd977f09d9dbeb4d7d1cc4d20aa2d6440e0f23470a01af73d1c5507d0136bd0959c920e666c9dc7f3f488138f532a836ad9b6fc2de771dc6ebcf937df0419002e3d44b188b8bc89151e4600fc27130e6ab902de16ced874286d64d3f83eceb054722f754c8bc7a82f6fe7760bcf25d98dc841a18c09edc8c1c9f405926ed6baea67df31db078caad4c4762efd9857df1c5885a1b67eb24980ab1b0842af721c786114b558cf9796836311617630f066fdad87843ff84d3a051af71e8e42c874eceb1b45c73c390a7f277bade40d90d16169650ed06aa55e7ccb9798e9e59081c1e366a35c41bacfb7affba16d346c85ffd15826c364b756999de9e5e9aad16c107b20a4e17f2fcd5e8388612b0826b4d150025307effffe44cbdcdb3460f5f346aecbafb6dfceaafbd17cbb4581cede373231358d2a08564369b7547e2e095475a88707778130aec6bae85421e0a3b68def1b3b46fda8739f469c4c036d89443349bc8fe3e443e8f7dcd35b46fb81e61db800a16c68502e78acb11e2359c37edc3192ea3fa7a4108ec1baec7be689cccf77e88586ee04c6d8542116c1b3935899c184765dd609dedebae03a5b0776e463efb3cc6d93954b90852e26cde84ecebc1d9b503213258a506aaaf8ff6d55762d6b3386fba1ad95f42f6f5227259dad75e8b387b02b391c5b96c1fed2ba7c83efc28d68113b46fbe83d66dd793f9e12ba8be5edadbb7a17a2a086fc7b5da720dcdbb0ab46fbb1e259650bb2710a5eb5034c97cffbb383b7721b76c42952bd8575f0dd2418e8e605f7629c23469bdf376b2dffd21f28aeb685db583cca3dfc43ab140fbae37631d38803d358579fa0cf6de2bbdf52eaf9d2889b29ba98bf37e7cbcf8716a9323c43bc3143c77708ecf7ceb38178d16c857cafcfa5b27683b927a4b52cc5b98026a0d1b84a09033a9356c4ccb20631a386d87b6045bc1ff75ff217ee5ae290e1f99e76bcfcf31d093e3cd570cf1f2f125067bb2dc76f91028b04c41db96644c63036f1a424a1f6253ca7bf2e4e93cf01de0da8d67f70f8bb21903d308abf7fcf4343d3d7dcccece30323a4aa5d2836164f9cd7ff98bbcfd9e07d8d46f23fe04d473e0fc6b01db01e52e781bb89f848e8f0c333ada0764999b9fe3d889d3085370e890c553dfff30fffa5ffd3b96aaf358a6412e97ebf8362a78dbe5ef5d31bdc55ec3730284f0e67c523bf640cf30828e0ceeb9d25fa9a3dc74c388ec3ef737de093f1f34997e0c3c852b0b772a2afcc56541285f186e47f664085f76a0b7f78797df4a8dfce73e87680b5aeffd79ec4dfd9e3815e8108924ecbd0154fe02b8d03a59f0524185f5e7bf82f4ca8ce14dd5944279f70a19ddf8a84fe524068da3df66f4d89f263c6a46dd016b751c5bdd76c723bfccee8f65193cfac22c0ffe689abd93254e2dc1afde3ec297be7b9a5767dbecde31c8a52587af3c3fcf155315b6960d1e7a65915cb9c8ced13cafbc368b953199752c9e79f91cf75c33c29e810c3f3ed7e2e2ad152edd52e23f7df910b684f75c3fca72c3e183378ff1c70f9fe423b78e53ca9bba72091df5d5b084fe91b61ae573d9c4d3c02d5d8b6903e4c795f3ebb25828b0bcbc14fd4e2e6b72f555efe2a1afbdc4fff1af5f60f89fdaf08f701bdc656952abc1d140bffb77ec588e871fb88cbbee7a87eb5b47f8d6526ce931623ca9a0c100e1e8ad872f8ffb16f1e5e93b0e21dab18346e5839e8aada7789f3b443a986b3104a77a8415e1354aa5c9f576370bcf495a94bc72295f9a847c8ec6a77ed1050d21108e9657d0fbc33a12d25b420e3630ca68fee17c58030815583e484d96163350af327d2f85505e7dc8161081484f4cf27b3ce1fd4fe3c5efc88e01d2c6b16d9af526db37f772fcdc12ffedfbe7d93d55e2d503e73963c0db7e668cfd5b0bfcc61ffd8405cb223fd7c06a97181cc9f3cecb7af9a36f9ce1c63dbdfcd29bc768b524e3a3359e7a758167db0eb7bda997b1c11c938339bef8e434ed668313e79690f6203856b0054c25748cea4f2c2dbed8df89bac0b411f246527f7a552a9568349be4f339cd9daee0031fb89b66cbe63ffcfbffcac52f2fb8b57d1af8b3f565f3c20ba3dc7efbaf71cf3db7d368b85b077c5f447e03d67f201c91755d935655f48a37094cbe6b499d7f8419a9389b884a707589058314abf10bcd995eace10a92bc00a615e1492aab598951f553eb20e54ead4bad522f291458888eed1d6b69daaf48b9de5126a0905842b27f7785f75d33c017be37cd4aa5c23b2e2f73aa0e7b26726ccec37fffc119e6cf97b9eb8a1e1e3b56a7279f63bcd760b062d25330182c19141c87cf3d7a9abd53259e39b4c4cc729bad9b05c34583079e9de6ed570e60369afcde4327596e3afce8f5052edd52e2e0993ad7efac6018c130b0be3a59e55caf87ee546e0394cf5991a91c42303b3bcbf2f2329353dbe9ededa5d9748311d8b6c3e9333338fe23b0d79f4f2663303131442693219bcd72fad4490c4390cfe589efd5f5c753e810e2093af78055fb9b6649c46e57fe74d0e7d4802689009ac9eef146a447f8a39aaf568ea4cee9d0138ee5d13a5ae3b68e7985f5ed9e853a86f52531a81dfa16a387ffd0db792d02f95159fa47c210445cd176c0c6f7c7355a12db51940b262b0d1bc33471da3667176df25983b15e8bd3736d321983e18ac599f9164d473158ce90cd080a19836addc1548ad99ac3785f86996a9b3682f1fe1c96949c9a6fd257ce206dc97c5351cc1a580694f326cb0d8781b285eede395986649a4a4ce90461bc560574a7723f05254384f7542ad46a356ab515848056335c081fec2f75eaf5ab93725dac1886412693a5d56a512c14628122fd68b7defa887b11f05fb9c632167ad7813496e4a5a893b038b8045d52039ba80015c808822a8998dd1733d6fcbbdc7268c8a919402afdb6a01be89323233139d24ee30274908a65addb56d1a710072bcfc61206c28fc48b0e4251288b536887a4379c7cc14b57825229e34e2ff3597a7a0896e526c7f3ae14055bc7736eae2ac00afabd0f157afa4029c5e6421e4118b977723c1768d0afe5ad14e4f3c49cc225f5152420b7036778e64bec02d306c830a2811b0590cf17d834b189955a2d12223c95746488b375b089eb6a856c364b2e974b84d74e068a4c4ec744875e1c7e119eb48c822bde328b80d0af50f0dfe3150261a49459e9879e5704855b8678c414153d3482a3243069450b40225aa5dab43081941d9e8e2f5bab0fa1a5856fcde2b01d553ff80e4d19eef77166d6cd51a4c08c4a11909e4de7798f9f1cd1313aad0fbfcd8bf2ebb2b4a1cd2daf979668924abbb6868e89f1c9bfde01d3fc21b00b4c1ba0a5a565a463a77674bf01aeab9145867def44a4f078c7b2d562bed55c6d204dde97aa4c52ef046f24324998ac878e8a97ab5364df203ffc498f7b63477605e9111fb5ca58ab0e2e945693e7f750bd37c5bf9e0f7a77785d61a05a2d943089afebc56f8b1ea7a195dfcb3b8d681df45fad8edec0b4c0360a744c69c87af9e26b6e3110eb02d306a85ca96099beaf5bef62d02e55e04bc7308cb09d6aa352c47a21e5d8630cfa83967738578f3edb402e5ab310b173bd3f8b558041a7b52cbb4e401a67f786ef88a3b24ef72b0fc0748c8cb3c5b1c9c70abdfee27d5997114b4b1d27d0b048cb8318af5e8ea058cafd867bae3ac2d9fcd59d23ebc6a993f514a40715f4c6d06a7ae903e685a6d1496eec1eafa12aa522edb10b4c1ba06c2643369b89f404c7b6a92e55a9d71bf84dd6f0dc9dc69abc2725deb43bf56af7ba520ac3100c0e0e6159698f2d941baa9594af7bf9588f85b3a655b21eeb0dbf0deba3eaea7946a31847cbe19e891068132811abeb7888f0149961c649d04faaa9c2fc7d432a82946e9a5412b36f3be6d0c56fac75f70f80bac0b4010abc122a179016161650d2a1d56ad13f3044b952a1565b71bd066c34136d60344d9352a9c4d933a769b59a9886fb457dfa44c78fa612689b48031f53d3c0d13f1461a70bd23a98478945504d962fc7dbf019ddb0d9499e2b330a2f6139fc73bd2c71f5d3caed196d1d658a14999d0d8ad0fd4c44ae7f02ae474dffa5c41b65e1fc03a12e306d80fc1861524a66676731ac0caf9e5962a9bac02d0383b4db6d8ac5128661e0384e6cf4bf3072a388489acd2678f1d8dc694ed8b5421f6761d712f1346f1e920e4369faa994fe14e75beb5c93935a07abdc1f71ed929c62a5385888f0ebe5f6dd10c7e5f97c3a18c5ed5a5d6e647a9c92bf8a4db3e21e46bbb47eea02d306c81dd05d27f3ad56934aa9973ffcf23769accc73e315170190c964989f9f677a7a7addc014e7935292c964989a9a7201ce7368af7bb1d4d73dc2694eb4b3855ac78e626aadb5bcf1d3f1a8b48b017fe27264f7b5f713634cde130a8cd74982ad833aabf2faf9c78cbb68a63a30754169a3d405a60b243720a164656599f9f9791a8d26bdfd0e2383bd1c5e5e08f8a4949c3871828b2eba08c70be79c162143273d0e996ddbe472398e1f3fceb163c7181d1df5b9dc294270538a9c0b2d937f4f6c5d35be228608bf5a499b8cf979c7c1317a9c842bfd4a6425691d06596a592fa44ed62db3132aea6815bb45dbf3d5a50ba32e306d8066676769361b0c0e0ed2db0b59cb6062b88f23274e043cee62b541a3d1e0ab0f3cc0f8f8388d95155aad16a699088119dc032ef81d387080db6ebb8d9d3b7772fcf871464646029ece530481655aae5f7ec06edb317b21dab974834401cb2b2b140b45cf2f4f12641a8d06994c06c330b14c0bc370c374db9a17c7f8d42b4d0e4479d3b40b802905c78561621906528561b53bf12672d5f80cafa21c25dd282fca5db08e28a72f964714ee0c48c11d6af5f42e75a62e305d2029a5302d8bed9b2fc2c8e43972e63c83469b918132b95c2ec26b1806ad568ba5a525765d7209bd2323bcfae28bbcfe939f04a1a23b51b55a65717131b246e54f21230d5e7befada4e491c71ee3fcf9f36432196ebffd760607060090d2b5da94b7a8127c3ea214c230908ecd733f7e8e7dfbaea6e8b9dd752d3d03d370639afdf5bdf771fb1db7333535c9f7beff3d4e9c38c1c0d814d7eedb4b6f2983c08d242b3c7ee9394f334d23d05b08230815641926527a0ed63c7da4f7f6513a12898cc5b777b72e9e7aed059e79e9750637ed60df157bc8653348e9b8402340e0e6ef87bb360c33785961984610d4f1e4a99338b6c3d4b6290e1d3a4c3e9f636262139e225ed86ed7b5ae5b4fae1c378a490a122aa2fb0bbae6d286a90b4c1b20c7b1692b83ff7e70964333cbbc75d4607cd08fc41bf21986816118cccecc70e4c811f6df7a2b7333333cfee8a3b45b2da0f32b7ba514ed769be5e5e5c4f5c854cebde8fea0e8e9a9f0df3effd7dc75d7dbb10cc5e1832f335d6db16dc74ee64f1f453a36b9720fcdea1ccb32c7707f0fe7ce9d656ceb4e2627273977e60c8da579969c1cbbf7ec6671f634c78e9f60eb8e8b999d9ba3d56aa194e2c107bfced5575dc6138f3e40d6cab263eb000bd3e7d83cb59dd999b39c5f68b2ebe28bb15a0b1c387c1a335f61b027c7cadc347d23e318a6c5ebaf1f62626a27595aaccc9e65c9c9313ce0ea33ba65079b467a011716a8719e0000200049444154ccfc05f466a3c667feec730cedb912e42bac6c1fe7dcca0a1313139c3b7b9e56ab457d618665dbe0a2dd7bc8d8555e3d7894ded12d540a19e64e1da17f74139bb76ce1f9e75fa05eafb373d74e9e7cf24986474628674d5e39f83a95de3eb66d19e3d50387c8f58d32dcdfc3f4f1d7a90c0cb369cb9694f5a3e4a255c4354c972e88bac0b4016a361ad496ab2843b02c2caaed369b862a940bf9c8d4c9300ca494142a155aad16bfffbbbfcb81975fa6b6b212782180d00af2e3d72ba5585858e0ce3bef0ca72a3ef9ebab919dc7de1410d8b76f1f3b77fc1d37dd7413670f1fe44f3ef7d7d8c260cbce6b79ede527b8f38e3b78fdb583384a216493b956819d2359ce3ffe1ca63dcfd25295be817e5af53ae766ee60a8d0e6a1071fc4296ea56cd97ee6b45a4d5e7ae915daa2c8c0d0009ff9dc5f52acf471f3e23cdffcde93e48b399e7de928959543cc983d1c7df5058647269859acf2cb9ffc38f5a545bef1d0d7a819c3f4151560931136d38d1cbbc7f39cfdceb3fccb5fff24a03875fc38866132313181699aecbde2625e3d7d86f3995db4a4c9e73ef797fce6bff8173cfcf0373879f2040b2b75b68ef4f2cc4bc7c9cdbdcc8b67e67128b375cb38a74f1de1973ef1f1a831e36dee3384e0812fddc7632f1ce2ed6f790b2f7df7119e7cfd146d27cbaedd7b78f527cff2e98f7f8c4d9bb768566b7caa18eeb188bca4e8d20551d7b5ee0592108272b942637989cb864b0cf414500246fb8a6e88f098c5649a268f7df39bfc2fbffaabfced17bec0b973e7b866ff7eeeb8fb6e6eb8e5166cc761767696d9d959ce9d3bc7a953a73878f020c78e1dc3b6edc4942f0031bc5f2951d20736775da9dd6ee3d836a74e9de3b5a367c8174af45875060606b9ebeebbc966b3bceded7773ebcdb73235d6c7873ef2091af3c76936ea80e0aebbeee1969b6ee4f5e7bfc7b71ff9066de970f4a5efd06ad491d28dea522814b9fb1defe49ffcca2fb367fb268430b8e79e7bb01d41696082db6eba8eb3475ee7c4d92ab7dc762b9363155aad36fbf7dfc8d4e64d3cf2e057693992632f7f97667d85b7beed2e6ebfed0eb68e54f8d0473e49ab7a0adbb669b55a7ceb5b7fc7e38f3f8e741c240643bbafe5adb7dfc8a1e7bfcbf4b9f338ad16474f9d64e6cc216cdb61eca24bd87ffd559c3b7a981fbff81ab5360c14c1940d6ebae91676efd983edd80ce44c4e9c99e1f8a9e3cc9c3d8391ede3caabafe6a2f13e5e3f7a9ee75f7a9dc5ba4d5f51909135aed9772d7bafba0a29a5ab5bb345abd574d7f2fcc102197cb6d3b598364e5d8b690394c958cccf57991896dc34b84c66f604c832437da5e852b30728ed568b46bd8e659a9896c5334f3f4da158743767cecf53afd7711c778366a3d1607979994c26136c49d02900a4789357027f4166e7ae9d5896c5de6bf7f2fee953bc766a9efe815e4ae5dd18cae1a26ddb18ec29b36209766d9f4408933d17ef092cbcbe7211650fb1fda2ed9c3b7e18540f639b77323ad843b158442ac925975cccd4d4247dbd1540b17bc74ecab90ca397ede127075fe2fe6ffe805beff9592a4b0779e06feee3b543f3ecdf7f3d93e323082118191a44b68b5c3bb68d4dc3bd0cf55668b572ecdabe0d210cf6ecd903402e9be5939ffc0428703cffe14ba70ff2e8f32f33beeb2a2626c6b879ef0ebef8375f416487e92b389c7df909be35bf8d5bde710ffdcd8bf9e6f79ec3cce4989cdcc2e6d1211cbb8d2325975e7919878ebdce7ff9a33f616c6a0f975cba87a7befb2dea6d839d9b36f1ce1b2fe2e16f3f45d3864d9b27e8e9e9c169b741c0d9336799999dc53004fd7dfd6cd9bac51d20f4e794f666b14beba2ae3fa60d503e67b1b8304fa9dc4bd938c6b9437f07633fcff75e99e1adfb26a9547ac8e7f31c3b768c72b9cc873ef4219e7efa692a950ad96c16d334dd10e3de1a94949276bb4dabd5a2d96c52abd5504af13bbff33becdfbf9f56abc5ae5dbb585c5c206399e47379d2de6905133a6f76e14e0ba5fbed9ee17f2213ac954716953b9292384a611866b08b3a7587b727c75f50974a6165329c387e9cbff88b7b31ca137ce2231f647ca0e0869f021c47b97ead5276a0a7edbcd6ec461c29314c0bdf0ba62325d96c96c71e7b0c43086ebef966a49fe6382894fbe60dcde988e799d295e596cf91ae574bc334dcc57cc7412ae5bd00f06a401058457e75c7432bb9ebe792f98545f2f962e7faed529cbafe98364a4a41a95466697989bed14d64b2151c21991aeb8df0f98bdff97c9e52a944a552219fcf93c964c864324143f7ada566b3195c6fb7db0821926fefbcb58de88e01054260da3364eca3245fcceb2feec33481883a35102970e7dd12d9efd869bb35319e164cf6dafcb35fbc815cbe403ef712c4020ba7e61b299c0e5af16bb1e3b6e0f6abdcf85966ede998c0b47bd621b3d367333a2a2995c2e7825745e468b3872e5d1875816923a414a669d06e3569a9618afdbba8da2d360f4581c90714cbb2c866b364b359f2f93cb95c8e6c36eb791f50388e836559c1c277bbdd0e64c4a772a0f75bad432885342ab432db359bc0e748032611ed6310ed5ba99976e04b9baef83c1928165c9eb67f3d6d0353429eeee53a5cdcd7cb1375bae691e59e3b1df8e2324315d2d303477cc4dd9ea58054ac32a454d41bcd6e27db0075eb6c03a470f7e0e4b219161617191edc49f5c46be48bfd5ac3c5f33c99e1baebae636c6c8c52a9442e972393c94480c8711c9acd66f057abd568b7db0c0d0dd16eb723de04827d4cc128ed870a52283220faf03b89125ac75504d7134020a28769b8a156e349db0499c6e3abbc167f6085782791fe1f2b4b708f4a01d894b207a4cd157d933072b32211da44d7854e3a86a55686c256d56e27db0075eb6c23a44029493e9fa7babcccf0e00499e290eb3c4edbd5dd6c3629168bfcc66ffc068ee3e0380eb6edbd35f3ce1dc709def248298363ff7aad56239bcd06192b703728e2ff853a252025e8abb1359c8485a3528ed252d3ced3a06c9535df0e3e7c565d23d681a5d3eb77d5e1b82375022da9a5a5aca575921d29977b9fbb8bbcbbfabd11ea02d3064879467d369bc3346ad41a0e56718c46bd4136ebeefef6f7293dfffcf3c1a273b3d9c4344d7a7b7b13c0e4380ed56a955aad16792327a564dbb66dde422de134a7c37247278da3bfab73c565aa18836e482403f5ac451beda82960b64a1d8469fe2219b13a5a0dc9d2eb2b520ff1faf637b90ac2e0a45d4cda3075816903e437482104b96c96c58505fa070658985fa0502c0569939393944a25eaf53af57a9db9b9394cd3a452a9b8412bb58d958d4603cbb2b02c8b4aa5c2d8d818a669522e9719181848ec008ff48af80c23c692d6a156ed642959a4e5b3ea52534a5e1df93b2c79c5f349cca856a983d09d8908ce53f58ceb9ab65c14af9fb4faea304beed2c6a80b4c1ba120222ce4f379e617163c8f006df4666f9a26a3a3a3341a0d8e1f3fcefefdfb314d93b9b93984106432ee1ba466b3896ddbecdebd9be1e161ce9e3d4bbbdd667272329015ecf4f6778cc77b69ccac490510b19e6bf11ea6a2d7438d82c961ead2514a0fedc8dfa9376bcb3c015be45c939612635bf35b99b81e49d165ae82bcc26748b3848267102a2d447afe5d5a9bbac0b441f29b9b65b9d3aea56ab5a3ff9d56ab45b55aa55eaf93c964c8e572349b4d969797838f744ba512a66952afd7595959616666862d5bb604d3408048f0c8642f0d0f3a991cdaa18e63d1a959a7924629703c17010f91c8cbc5d31092a2809008b11971ea9644a5348d44f8dbc98c5947999253c055b83b81ee5a665c97d64d5d60da004542840be8a9f4505d5a723f364da14aa5c2e0e020cf3cf30cf97c9e9e1e7703a6ef9f494a49a3d1e0ecd9b3cccece62db36d75e7b6d1494002fee919777b40705d310fc913aaa71acfb87d6861ea32ea543c63b6a6818a8d082f064871d33bc4908fd25bb885815be0e9150541d3b72bc0c5e7d74a8834ee01224ab102c2332522345a41feae350aadedd35a60d5317983642fe94ca6b78f9429e5abde63a8333cc84bf252104dbb66da3bfbf9f93274f323d3d4da3d18838860337d4f8d4d4145bb76ea5542a4564589645104d4e08447c97a388763efdad7a742aa64f70346ba35351e349228107a1b45800ccc42450290dbc44ccc2882da3eb33b4a01cbeeee16f42b78e05f17e62d32d223275900c25a54e66e379254cd135f4e9d2aad405a60d90ee19005c8770966952ad56191b1f2797cbb1bcbc1cdb1c29b02c8bc9c949b66eddaaf95572d3fca825fe272ad56a35b83393c9502c165998376279eb949c93e9d33ebdbf18b8d15ba27d68bd5dc85bebf28124f2a64ec455703b7c504c117186178fe464e8325366687ab18d84beabace2eb14e89e0c14e1e79fb0aee8503f82a8d19500ecaec9b451ea02d346c89f8618e03b6aebedeba3ddb6999b9d657979d9fdeaff8dca0e108641a35ea7a7a787780824f763517d3a129d1a2517a7532c80f49e45a4c32b221e34237a78c01ab73754042f358b44847a46fb72aa4916c8884ddc627cc939e75acbcfa263ba480d2baed2cee285f67fa5e830c7ebd25ad405a60d9342697bf10c21181a1aa2d56e79de0e53aab653df8f8aed483d3d152ccb22fe894670b28ab8685f0f3389ae21453fd608e5abc050f2dd7bb8692ab8577800ad070f57ba900028949653c810294bdcf251be9ec25f4dd7b875292a728f9fef6a034462354ec3f8b06adcf2ebd77509090bcb034415fcebd2855217983640cbcbcbc8b803b7b548ef79d15ee89dc72fae45f14947daf14664adc5a93435c345a0e41ba90ef747d699d6ab5b1aff2ad6dd1b46eb91d78947d1f513b771ea02d3066864648c7c3ebb0a472af2c4ce61f5861fef9089b19d74a44b5b21b910993f2dad86beebe55d4b97d5ea72b53ae9747f27f4889bb89d56a03aebd768b4989b9bef20bf4b9da80b4c1b2077e1762de79ff1069bd680d75afdb890fb3792dfff88f58fd574fa69783bdd17bfb61e9917520f9de4ad7d8fef2ab94b174e5d60da009d3f5f45259c12752942173a33fdff1d09a46a32d05f0abc487469fdd405a60dd0f2729d5653fe1406c71bbd16f2ff3e5996c1e8681fd98c95c01fa514b3734b2c2fb93ec4ffa19261daf4f575bd576e84bac0b401ca64ba311c001a8d26fd0325acd886d2f9f925ec769b6c363db0e7df0ffa694d3e811217f882a44b0175816903649a826e80193732efb9b373f4f5572815f3b4db36d56a8df9f9254c5378f5f4f797e27ebc2ff0661cf9f7bbfcff5f9295f81eab4b6b52262330cd30065cf09e26ed6557f846dd3f0df6f704feb4fd7b44c813df1ce86fe389bcadd7f3409313cb4bdba614cd4bfb4dddb1a0eb9ec60fd8b6cdecec028e5da6566bd26cb4028bb2d3fbab54fd3bd451a43cfe3ea20e654cbb27a89bb41771fe3388cb48919daa770aafae6bcb3683ddfcdd35a60b23eb9147bec1ff4ceb007f1f565fd6dbc8d62a4ba7ceb09e7bd79b87cee7cb8fdf93f642bcd36683555f8e2b52373afff43bae2ee00e1f387d104bdcb10e59222d255673713015715e90ca2197cd7a515a3ae9b10e4adbf17141147551b3ba8c64e25af72436fcae43477d336ca40f7807d69ffee99f86a9291ae9564064c44a7d78a92292f57a01f76bba26f98384582e1df6dea9b04d856cab6d474993b59edeb4560fbe10e4ed50960b96b31eb93fadec0b1d553af00bdd63817b21d0cbdb60eef108fc64bf41f9d62622e4f165f86ce8e784df29eaf907f76adff4f99f220991cc3ff8bc26f2eb9623224bd3c1ffa4274c4fd44450263db0825f3e7d800cfa9516733048f701d40bc019c8f0cffda8c2dee7462148688155bd735f6e204fffe653e1f17b9aa6e61f5e0fd50fef4129941058ed762b865d7e09d30cf1f51ab67159eb4d5b2b4f5db70b31acd7abdf6ab64227d91bc92b4df65a3c22b81a777992d4317e7f3c3d3daf683c92b5ee5d2ddf4ecf7c7dc3bd1046688e04ee51a2faea1f33eb3bc945282400812840f9c93a184465e98011e4a3815de43aa13c1d94f4ef0823d763f7a4fe6a565970ae5541606d043f7a47d73bbe8a8245000c81a00830e9df41faf7fbd7c290e8da3d320cea19051e4d2680542e90ca200c680872fa71e8b7074b86b015963472ecd7884ce1e9644aa8185f9cdf4d0f1717e3df4af9140f5d1407a5f534f4b578562b7f1a80a4c9bb903cb473ffdbaf54fe4e65751ba9df2004686b43315909af8ebaacb86c6f4416043aad2a7bd532af95b61648c93063e595232e437931f1347009fe078a135a519df822e0a4a58be8f5c0d58a0f4e3af004968dfeabf923d0c1cf4fd774f0e3fbf9fc11200d10d12bb98a0f2b3e38687ba53c8090d20d762a95d4a2eb68c006a9601454b17e4dc5f2d465792afac09326270a40da73f4eb57189141c172236ea09556e08602f22fc71a85deae8295c3f09eb4f7185ab38f5dd79417c9f490517b1a8495a4e3461446d26d8aa4566b5118512ccc50e9c9299de602283128a4755815498e7cabe6d75b2715b4512e4a8208e87be508dba70b9871d92e9bc25f854fafe38eca68cf6db53a73a307affdfcd66381f9ad2eea8c2e5dcfb04c4a2aa474a21d28d07d75ad2e9c44ac286efdea634abca4ba067eb465c330314d37d2b04221bd883caef522235652a20c29fd494f5a73b963154a1bde23627ceb13b02cd38df82c0456e09c4386b7c6eb29f56d93d7e6fdc7193e5622cf31407aaf803ee206516063f23a165eeb63012e46464e4d5f5d5d1113a9920fb9530300ff31133ed8a8951d7a18882607c294761c1d41d3f30ad4d45a848ec9ee8f37d2806b5cf83c423b562af20c02156360aa8f31fab3a1836cf77a285b07af4833f1eb2932d2860c698d55c512559c57e8fa8b48bdc4870e21f40477ddc22fbfd065c594525ef82ca5a07f70844c3613b11810e07b114d3cc178074e6d80fa5a92d02f933c11a1b2c14fe8f7d32fd0c2cc391ab525cae53256c6423a0eb5560b84c1c0d008a6698465100460b021a409acc274fda3c3b8772ca2fa87a57055928ec3dcf953b4db4d2c0b0cc3c452ca379b7d36229f5b84a3688cfc07ee9f2a1d9a524c99182028df5c8f3fdf445e7a4b8ab2e8e662f456ad85a874f575140c4d5911932102f740d1797d58d161a35da5ce3437aecad329d2113d613a573caf481984ff9cc21c554afde80a4564c7468d00f3bdce1c35b5595376ca61ac7d24612851cff17bb57611d866e1838fb0e979c758c2ab713d23650c1ba81b4a4bd23f34c27537dfc6e8c426c0756b1392665df9eb3052125d1689d647e80c796d3070976fbc699894389e4e8e74b06dd712b26d9b56dba6dd6e912d14387de420b95c9672b94cbbdda6d56ad33b38c2fedbdf4c4f4f6f6c7d2bacb5b00c122975e785f1328406cbfacaa03cddfd29a5832325b62303fd6ddba66ddb34ea754ccbe4ecf143d88e8d25c052124273497fcce9dd39a66d878bb12693120c30d9d257cb4f905c6ff2e524436827754ab385dc74d5f12c1491763ddac1c3bc92de79e2d2556a6a671d525eac6a409a8eeaf1eb11b8eb9c5f5a675d53b64e9dcb9e7eeecb4aaff7244fb27d46ef4cb7795d4a6b27c9343fc69f99c952aaf4d03f38044204538c503d0552215518ff4f796b39ba9e9137d97a522ab98952292fe6a0ab8b1d044ab5316c1bda6d64cbc6b2da884c162b9303048542818181011a8d06d5ea12563647a5b79fbec1410c61200c432b43b8202e95f4a6af6e395c3b409f2910790c413162c6a05e3cbf5e42fd1dda5e199a6d1b5a6d64dbc6cad8643130335917d8a583320ccf628a884efc249e77c45f979fa49db856ae6e1678a38508b83dcf86dac897d69efc3e18db05276237a4dd1f2c262a50dafdc24b4b14cdd75bcb47a1d29c29462b433b131df28adfae4f27c2a7a93ff174d2ddc1eaf5e74e67a5a6bb8a2cffb14639e24346a4427dd9dea9d036ef24440a45ac5f46cba862458e3dd7006f3d657c7b2e6c6ba180c813885bb5fe65a10d2082481b719f8b8a5956203db011c2c0b61d9aad361826864102987c6b494a89928ebb2e850ab70528850f7a86b7982e1d374fc370a7520a852104b6a34018486520a5f2ac0b179cdab683ed48dab6a4dd56d88e4062a24c81c004c3402a45b15060707090959515ce9c3d074204d693304cf72f62f94950ae2523940bcaee42b90f4e0253784029bde7200c4f7fb7167c69a629f03d490b018ee382b41fd4b5654b5ab6a4d99634db0a5b0a94b0c03410960342b88be75efd5be1aa7c1ac55b8c3ff551a49adffea14a5e8b5c4f394fa89036587bc72a7e2df57ead1bc7f3899cebe54a0a4ccb2b201165d0a73cfabd31084dcaed54d624646850a2f9d28ef7547d7d49a5e417d3254d361d642b15d529555d1d9d62658c9ca6f105798af46a51f13a49f2fad7e3cf33e2e53b0e6e419d4a502eb8b41d8766cb06cb0312c3086e54caed404a499494a06c06fb7ac95816e767ce035029f7323ad88f42313bbf40757991f1e131f2b93c738b8bd45b2d86fbfa3879ee3c939bc63871769a46b3852d058e23b11de5fd42db01290da400651a08432194428976f00542a158646060906c264b26934120dca952dbc63005c274ddf5b860ad307137808e8f0e70fcf469a4b2c1c8b0757c1342081a8d2667a7cfd253e965a0af9746b3c5b1d3673185a26dc3f8f03095720921e0e499f3f4568a2860b956677cb88fa5951a7d3d1594522cd79bbc7ae4042d148e10609908a51028846d7b75efd7a772dfcae9efe0f487e4fec69b4727d3daa7847db08aec34def8b42fd939a3bc69c76bf1a4e9d7e9fa2af97644ad4e664327be4ef59796de01f53bd26ae5e8c4bb1ed99de4a6c9893f9bf8944cab4fa1f3ada66fa736ba96ce9ddb9c6f0549cf24b01d8746ab85908009783eb8a4bf1e23258e9218484cd566fb96cd0cf4947964e634a695e7ce1bf6f1c2c143380a6ebbee6a9e3b70982b775fc4b77ff43cf97c8181fe017ee6f23d1c3c7e1a21e0d563a7a8376dda52603bdeda92978f5b4481f1ff94766e4d72dcd61dff01dd33b3bb5c7149714991a642898e145d2c4b5129659713a5a2942a5579f457c85bbe535ef2e8a49237552a5589cb624a8962ba68258c54146d5d685e96cbabb497d999e96e007ec0eda0a7774955fa612e68e0e09c83833f8083836e15c0517970b1aef2715fce31994cd8d8380e386aef45a6693b164d8baa151840d93003b58c54c7898d0dde7dfb87fcc3bd6dbacef0e337dea2ae2b3efbf206efbdf3169f5c9ff0f62b7fc82f3ffd0d7bb38ef5f567d8db7bc8898d4ddefbd1db5cba7295e79f3bcd85736731d6b1685aaeff6e8b3f7fe74dfef1df3ee2a5674ff24717cef3cf3fffcfb44cd0daf3eba7b0ce2f339516715396da84f9979fe2d9d4d794ff28971dc41986bf94b899e727e5843adb59d9b9fae10162e52bfecb91dfa5b362b964c81b975d94fca6794cd1bf1dcb7dbf982b2c8fde7d191d69c976e89249048ba5ed2d5120d7d5eb54fdfba5a4699eea507ec44ce506c8a8c0732177a9449776b83268c432997659264ef3fd83d0dc92de7cd52ecf4ac2d232bf67a068440a85877c29962ad99de741850e1a8d3ae5efab2030b5049f41174e24269d3ac272c2d2b61d3bbbfb30d9817a8cab4638159759c67f0787eeb8b2ac8d2cd3d98cd5c9186b1658a7595b59e1d6f66dacb5fce487af33aa472cda963b776f609de1f4e6054e9f3cced6c36ff8d9bffe3bd674eccc2c8b8eb0a912658cb626d2009cc519c36cbea04bfd58a3c3726bb168f866678fb9aba09ee0748d43619c4539cbfad8321eafd0741d07f3039c997b9eef6db375ef068bf6754675cdca64c4d683c7bcf1d20b5cbf7193f9e200632c0ac59d7b37d1caf2fc9937b8f7f85ba6b3058f77f7e98c613a7dc8ddfbeb9c3d75929b777e47672c7bfb5e7752ae6e3e63b16892afcbd8b094f38d920121892eede7b041c965f8581adf03b01d3961883f7b83ea60f64378886064639db014a6b32c50623177a0786b6092a2029846df4e74cdb9426143185c32adfa752d0913aa4f750912c56e5ccfa37288c29cbc15e588e4921c2ec95cbae88765f0497d5e042c489e45e5ceaa340e0cca3e30014af88e94a547e0309b11a8d4df699479648a773c5b7efbd5d76c1d28461b9bd8d12ab69a60940e3b641db6336127cb707cb56273bde2fbcfbf48a535bfb8720dd4989fbeff3ebfbe7603630d7ffdee01d7bebec9996737f8f0cae73c7be2042f2e5679f8ed1e8fbfddc55acdcf2f5f65f7a0637fd679d02f80290e8a4e30edc01a9aed2f19cff758cc17eceeecb0bfbfcf743ae5cbeddbdc3e00bdb6811dad61aa311645670cb5b29c3b31e2e50b17f8e95ffe291f5ffd82bdfd1d5e7be94d6ede7dc82f7e758dbffac97b5cfbea26afbc709e0f7f75953f7beb550e66737efdd975ce9c9ef3fe8fdfe1a34f7ecb9ffca0e6e2f9e7b9b1750f6b1dd7bfbecd37bb532effdf759c1df3f2850bfcf7ff5ce360be60fbf14c0053b08b664ebbfd05ab66c1645481b354a736376be06f80f3838d7bc425178183cd7e540f1c2af85d2a3f8ce477a47368f665fbcd1d60a0537c97fa9e2acf21751dee0f5ca631bc9b287ef700e069455986ae216595df721773b89ea319f87f99c611836affb2c1e93cb79aae5e6341cdc2681656d17696aeed306d87e93a6cd762bb16650d1acbb19535ce9c3cc1f16327f8ead63dbeba7587d72e5ee4dce6261f5db9caa5cb57585f3dc68573df633e6bd97ef088d9bce1effee95f78f78f7fc0ff5ebfc1ceee1e4dd361bb0e6b0cce189cf133236bbc3f2b3a89b10e6b1ccdce034666c699cd67198fc7ececee70ebf61d1eedcfe946c798594d63348d85b635b46d8b35861a8b46f1bdcd53acafadd3b4f0e1e54f78fdfb2f7076f30cdbf71ff1c187ffc183c7bbbcf9f2453a63f8e5d5cfd9be7f8fadfbdf001517cf9fe7d4c6061f5cfa2fae7c7a8d17cf9de5dca9937c70e9636e6fdd016a8cb17cfcc9a71ccc5aa6b3c6cb2365e83a9add078c5c4b5da93b4aabbf57afbcfaea0ab84bc08f7cd30cf90c9ea6a59fe4cb91f7fad3a821bfca51f51ee57b1aaaefa8fb9286946ba88e27c97d143f4faaabcfefd3d675980e9f947f88f651e524ed27f91165bec3e41cfadfcff7a4eb696ca0cf4fbf6c59de1843d3344c99a04ffe01d5339be8c91aaa9ef8e5abb538dbe1acf1be1f6ba8351c5bd18c6b45ad355aab30d375e135ef0aad1c2be39ae9acc32985567199aaa8b462b6c8bb564d6b7af144c54bd68110a4a91458c7fed6e74ce68f78ede58b3cf7dc59e6b319bff9e24bb6f65a46a75ea43a76023d59837aec2759d6a031ac8d15935a512b47a521ed223aefecb7ceb136a9693a1f73d8853824ad551ac82623ff48b751a5a96bcda2b158c059cba8d6cce61d6de71f95103e78000008ea4944415498376f0c8b268726791934ae5db07fe71a6bdd2e935175b9aeabbfa89db52556f4c6c3fc3ae6bc159c5574d8a8290f01f48f2e1c3d8df253fd347f67c8786500627ed77cacb52c3314e287236c17e7b543e4371f2474cb662cfc5c390cc0957970bdba82cf463839525d4217f9768c5296feacd247e28a5726458a2163e01db20fa82ff732ed28944bfe9db8ad9c69071a4abe4d574c8154fe11dbd005269590b30c151f068ba2cdfaf2a72b6850aca5e559b77ebbe4b6cea9d9c6b31cf1e4bc529abaaaa9ab1ae56305427d360554e2fc728eceb298295cad3175d09bf3757a5cf25be9bbb6f1bb7b914f9797ea16e83a87b58e2ae83972571c3416e7f4fc4b571da3d567d0dd2efb7bfb68759fa669689ad6bf21ba1e51555590c10ba9f1fc2fe616a71de33ae82304588648069c53ecef35e8ca83a773d01a4bd75994d28c471adb7aa0990637aa3f1603c6785f910ab218ebb046535731962ac8a03c008e56d751d3fdb4f95047170388d817476e4ae51de2d9671015669703b7259ee0880ff05bf229a83e0eba4c36d611bda5614ded5470f626e3139d420455d92cc0e00029eb95efca55210627888e0a80127d282a58900dbca5971a1644bd60c9114f36fa70c03ad0cf0a712a8394f483280796b2ae5455a8c31f0d51825eae446eebe76554380ae472b948cb39151cd62ad34e289cdb0d115e52cc39d240586ed3bbd066ca5b7a01cb49574ae851349b68fee56351a5b10a8b8874cb19a0a37c467b1025d52d65d14aa19dc12ca65edf550ddaef7ea9aaa21e4da8c61374b592002b5e5da4ae3d80981471edc1cd0a90896d1ffbda0818c5b60d3b5438176667066b3a6cbbf04190ba4ae0351a4f500aa60753daaef3418d5d8b763566b68bed1a545d43d8fdd2754d359a508f27a86a441b3b44d08f014f5b69d4088c52d8f05fa318a7fb8aae38daa2e8622b041f5994415983361d2ec8e01ca84a7bbd68188dc7a88340d6919ddf657782e8384da3d652f33b912eada907423d23965821cf0f4b7bb3454fcc5c495e8ba73fc67a8b8ae52546f95897a2c0afa2b339d2ac24938f3b4b2ed7253b4b428c3c17927545bdc46c565096fca55417df8aeb72c78c0ee72c56e05704363ad966916ea6ede5c84193b95c0e647481483e412e684b5b7065f71713af251b489c275d089e020ffda7654a9b90c025afe2010a0556b95ea632a9a827d61fee68a518db05cdde3dccb48a4d84ae468cd6d6196d9c66757d85d1eaaa07ad12a203e8e8303bf201902a9eaf531ea0e45935170fed0284b8281b81c874d8b6c5b473baaea169f6b08b9907a6f864cc9ddb68b360b170344d1b62810c63d3d2ecdecde8ab14ba1e531d3bcee4e46956266bd42bab9e96904129e5878f102d1ef98fc01641a92f43e8a4850cc61a5cd7619b055ddbd1b50bcc6217db2ebcee94c69906b5b345e57c5c86710ebf944318a468b0d8c87ee64432c4a1032c88c6edefc8c83e6c65420f0ce4e5ebf58956818a07472320151d30d3cbc0a7848196a014c121d2e9b1b304944e7c17acc648d7c8690f0412bba22e991e7fc868f1f8ed7701336039a9f4c33aa0d4872428cae408693193128217bb6d79dab7bccb2969130699be228bba731ba499aacc27f53b603f43f9d3571f0887aea10caea49d015651d715956d71b6c9e5ed0c76766976efd2de0ad2f4e51dba86f208f055324df09ad5b9ac2f192251015a6bacf5be9ca8bf4ac3c41c88c149410b76f688e9c31b4cd5b0dd97cf3a2fdd2389df7ec192e1a5ab08b591c22885567ea9a8c263be9573d4c5cc676954144ab0e5ff8141a8371348a908d54a4e730e013436d415fc7a9942cf88626771e27e4976b9770cd8f500482a0f14bd7080dc603d652d512e16151990061b2bcbd1d745a250741886145cf6fd308a28c943485f9aa94506446366ee459c54df720778efa96410d0a00778b1fa621e9dab121f2231f0263aa683f2a8c56134053d95138a7bcbe9aaf81ea41312fb4f0d506581a7f81f3b609ff75e5ba6e432ce6fc9669cf383805c7ef7c23c720d65a72ffe3b57e61ce061f071d382277718eda40225ee431d7a41259d9a4323959c6d64c1960152da7a6262205f8fff44ac08dd28325150f236af84d0725a50f2cc513c4885c5c6929da7903dde53a8d0e3629143eb929d3afe5764a76da0977e2f01b018bfa45e7a327a15a80004f650398b3695c19f4ed2a108de94b4fbed59f01a0190604bbdc3dbc513320774e6ab898893ddd545e78fe5557c805b484f0ed5e0c38ae014f3209cc6814edf09ab5219f1d0b830a2a3947f2f4e2f5f544dca47ff499651809e135bc83a0c7ea2a38aced08f3b1cfc164bfefc744a826f31fa7dc8c0e1a27fd515bf938f2b829d4c0fb4971e4027692269ca3ac4fd9e41bbe0fbaf9d7516b80ace4423488f180a56eaa08cda4d409099f5761b8ccf45e8907b73fe232f09457a68dc1275734f1e5a024565f8a56dcfd76173ba1c7193c2a2c1d8444074b0dc63bc43580016f131284e1615f331694c81f758d72000c6bae2ee12f97f508a92fea354b827534c7636f39410265423f4eb626f95ebd8a484b25db24a3210abd4be3253ba21ca1654045047938dcce6b7cd24108c4c4bddbae84827d859de31069dfdd009e7e363fe021fc221952c50799f9b40d5d43923f0b960b8360163ae438a6a3356e5c4705c24aa1b95f98a3af376d6d36792ac30ce0430b9acd0b9f4418a8e9f3656a24d16e095ad3782502a1741a74faf0f4ce4ff7d60123894795099569635f1fa99025b3beb1a347feb63ad0208f554247593b6f2a1703a46f08adab7403c96100772791c211b29949dc17f2a25a3844b234dfd48f2824b0374ff999314469c1bb0df3885ad89e96ffc2f8ddc39957145c7ba5c229b402dea2c587ae251491d589cd3222d83a0dfdd90f41c3adecfd30192c12932c825432ce590b363ef64279db62f40279271cef3981c9c02d86246e7a4767c871460a754065f95f42e351f19ee1fc80d16e9f2522902552c659da34ac6aed01190e22098005351aa2c02561636d95c5a5eb9a4fbace7a89fa82f9d790b34157e074e236c2e8d729109df66b96c1cfd830d3b4953ee9a4abd047dc4a8fac20f93674809af73b142eb292f2e0d4136b6551a2843d984383d100af42310160b81988e4d3616fb46e4dbffb25641f37b2fd616edff3362d30000000049454e44ae426082</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="361475">789c44bdc7722c4b8f6e39afa7f8ad7256d696952ad4a007d47a53cbb61e84a4d69af7e56f30bf858f9ba3b34e864b000e87abfffd9fff9cededfce77ffef7bf5edfcab7ebfa3ff555f9f29fff69deefefbfffbffffffffd3ffff5df9374f69fe928f94f5a64c57fa6fffdfffcd77f0fbfa6ffa9ff3318cdfffd82c1f0600efa9f8dba3978df9c83d9b4a9f48bf2690ed251399ee9179dc0a42e277330589e83ccbff8a8e7209fcd48e3fd720e8a695356caf66d0eaa51334ee7e0f37a0e9a24ab6a7db227904e6bfde2e6780eba5956298d0f7dd2f5bfc894c6bc2ee3be6455ab829dccc1643c1b0bdc1ccdc174d6d56381c339480c3eb7e7204dc780e1700eb2713951e56e944b968cf8c5d7bc72e33c4d22db853928c6d52451a295c0aca0fa37fb02c984343e76e7a04c4695daf4660f308d92ea1775320394cd1c34e38e5c6efecd419b24fc6220d04da61315ac4d046655a9ce2ee7bf988c26e974aa344e04a64d4e7b6c092469146c2700b95cf3493169d4731f3773304ec615e59837d0643299518e9b6d8124238df73b405ecd3b7b38159866ed6c5ed2e16404e812caa182cd925c690cf7d7048a5e5255b9af394826bda42a9756603acd1b95745d60d6d22fef57024955d1a6736d98a449116d7a3a07d924a72e837d4041137ee8932c4b6b25faaca2674536919c0ed239c827cdb4502ecb0249df31021b802ab2cde6a09894d379c186c521a022dbc195818a7ef5269086ce3df3495e8e73e5a2ea97495d4b4daf4f014d81e0aa7265af94a5bae10950a723813d409b2241ea863a69e897c9a2403e4d6a7594b2adcbdee8e89387396892b4a0faab73d0262d698ccf05b234d527cf0702d508b3752529ec26f9b8900429972eab33a53153d1bb3ca7a4e5dc4a4d47d3e954e270b322908666dfcce6603c1b15eaa84f7d324e0b54fde509504f651d9e87026536454dcb39984c675395f4261198f53d219001a6b4fa4d6a80e9cb01b3021b54009242daf0be2f90b4952af7b423d097037d599a83e9ac2fda1cdc0e0059a192de0e0df4c96d09c87315fdb60214b9aa7f5b03ca5c2a76db02aa5c5d79db18480a6f3b409dabfab7578036576ddf6f04d286467efe16287364fd766e50a6b3fe13a5717922904e68a0ab33813ca9a52fb367409156928ffb00a451becf4132cd66d2862f152cc93a8d40c3b1124df22c2a371f81a6fd50904f24ebe339c8f3a640e81e016da66c27eafda24853c9693eb763d3b2ff53030dbe00f58cde9f0af49d2d397ddf0034a54ada29d132ad6b866812cd6602c3e92da0483395e30250a558cbf9f03aada6cd0c49568b55e96c82095e1728b250a0cf39a8a7ed8c44258575afa6ca76f62290d7997e315b03b4a9ea72cd2f8abcc955528954938f2463c3b17abfcd1369c3f0fe0a5034eadba9b4a12d46b4c7951aa89b8eb1b89f12cb2eef33d227fc22cf4b19a5fb6b40d9a8d5af5705caa4c59ece0b361ba519d6f2f34a209f60e83f3b402230bc7f03d48dcce76c1dd0c9280d3a7d32ee7d1a657bfb2a90370daec202a0d5f03a9c28db715146232b8d49da622e06f3dacea6b37e60937aac08f4e5528b4d1e05f2a6527b4c760d90d32581625aa22f392091fd1866735f6a36ff277d513966d9a442e8ce01298ee26703e8e4b10da795405e57c818a0e86b233b762b508d668c84f3ceeeab9626a8985aacf7033235d06c10a0d42ff6548ea418754ab4fb9883349b51fdd9864031ce54f47c3e88cfb2fe4fbf18ff08f403bf4a3a1b0af45e9e1a68ff1e9074ea86e17c689ce5b3de899356ea1779efa090ed21a0cc69e46f81bc527b0c3ed49579316e185e49a398b4528ffd0740d3a1846b02e528c73350ef17b31271e8aa0034e154fd5264bdbd54b6807cc6b83f3d1028461894d9266022451e4ebf00bd720bc42f66e8dca40664257afb0f101d35555716e58891f0fa1850b692b1e1dc48f735e9fd60fd429f946981c59d3c0b6455260f65ba66a09edbbf13c8b3965f8c04a27283cf3dc0b8d12fc6fb802ec58593f0577d393017aa5c6f2d330d27d52320cb698f0b813cc3c97bdf06e4988b3d7e51949dd2184a92eb594b2e1f6ab1ba5720ec980a561719694c4b0369c3746e60fba16222251cced4516ddae1057fee08e46d2df9f8542e6d31ae19f75f004943678f0119f291ab5fba5997d0a6d2972e1f5700c969579435765d8ddc95136ce160ae0dc92899e028cebe05fa0653d1a7fca2570f7eb12a506415c6e00150562ae9f81450617226ff0c548ee98e4039c675eae6fa928c67e5549f1407027dc1d4732b2f02594939260b027999e1c18e058aac21972d404d9b5eaf09945d8bff311f1bfad94a8377d1a602d914eff3f25aa0972012fd14289a1af3f91000c19d66801681c9e7f2914c7fff04b60d24da572a47ef06e574f691403e6628985d02920a9152c1fab121e6ea3f809cea8fbf0015fed87402a8e986096994498e22cf005958cbf9c097cc7a3555e566378002e19fa860bdaee38e7673ad4c922445a49246209b62c6c74381de4aab5f364e021088586d0169adf6c89546daff493eeece04b224bc4ff56d9aa70d0d54024a06e099c4212d46394ecd25a06c185f6e0135d94ea702e5a8a1812680181b86f3413ce98b916abc6db700bda22a0dc96996e5cc3d56af01ad46c2c1eaa2405f5b9574ef0c50b51298d99d4081b918ceee0384d04970b372a2820df7af00d9183f683e02f58e745baae85f2a473fac21419f9706324a1f5b001cc5c1cd1da0eb30d2fca264b6369cce00518ee900300df006282b25daca5c14698e717cbe10c8da84a8d386405e84094e04fa44717b1e01b3007b066ad3f12b2093bb31a8e6d3c8deb3cad55183e74f409310bb5003957978f4c93aa06466315b16e8550cb002b0047d08f4f37b94701790623fc62f808c4973361f5f92aaff5339d654b9aab7eb68e51b2093273dd828002d6ef1a68a5e1513da63b60428c33350d1ab326d24a7e30340c99cb0939ad6494300e0431254a76d29f9585767d71e5e5f6e001d21a49944bb9f6a309f4bae000516f75956aaae188106d7eb807ea8937ca8604dd2528e7607d0a5fc42f6b4e9bd713a4ac6a0c9ea1cb3f50e680b355029096a7a03cb2712fea69f9a4a2cf7cf002d2ecb846ccb5c2d36b896916eaa84e1a4536ddbde90095cbd006a0c7d7908e852668d3239fda41a176e2673d1d78438cc6c04e83d3275c336a0a2e7a68032e651cfb20efdec65a206ba923dedfa72288d6b998b2ead194d934ea0c0751a6c9e013a557f70a39276e5acc31636805233ad41371f81d2de99607652be08a4634d7887492b90b73157e793bc4382ae2b816252f1c90620c9a451f7af02e5a8a51cf780aac13a3c1910414b05aa1189e62ad8b8ffc36a6701e4c10e9e0230ad1e5c77802e93146ea860e33c651ab93a30404d8f0039d1c0cf5d81a266f4b85c15e887138a3e04c4ec359f0b5d3ae9fff094360532c22ec3d9b6409e940c161702bdaa6b241c1502e5087fecfe0530a609c7270066c0c3892a37a94612ba61a634a6fd1fb3b50f03345b059bf6161647f12c00e5989d1ba8c5364f05ca4994e31940287c380dd021ebd95c3dd259ffa76e28670259ade175b87f2d50e40ab90e9300fd54420a7425d08f0db252d37740c738f7a2ba24594ae8667a2c90f77da7d1e319906a623558db0354842a5ef84531a5a4ab0780546a3a9c9d028a88059702e5149373ff6c2039bd5e11a8c64448bab9f94c7bc748a1ac6121a1eb0b4eb467b80fc811ed6ba9479a8d90e4f6041023e16a2390e3d10f5e240ebda73443c6c60170e03f760095c6b9c1d33f4023f9183cdd015a0466ac464ecb98013fa9a37a7d4a34be5c1f028a9680991428ebbd3c75c38a8a9ef56e3105534765c53494700ac80a86e89300c43f922d409bb372462ebd0f433ce8065074c41cd50d5935c1d79e6c1b30d5d80094add2e8e60370fa1b1c658d4f762c4f8b8cbe5d16c8664c356689402f74aafea324a8f7b668c2d106a0244e37de06741894f1a701d326b5475e4d2969371f2bd3debe122c7f9a08a4846d079dd4a32f6725f9e8946d51c40acdbe24b92893960692b928fa411c6d90cef57e9182f6c3e3f978db6bcf6ccad02805eafda254e568f703d0409b3239651e81bb2bc9e9afb7a55f3caa4dcb724ccce02907f4f380397890e9eb7dcf1443af162beb199f74b230bdfb35558b6592e4aaff031c1b483dda4300251d4e65faaadef263fad4a6bdfbc592deca0a20c6a8d126a0914332f8a77ee91d34260107e780ac436fd5c8bd3f9649099fa5d975368e9ed3785bf7568ada6e00727ef1a0c1a22ea7547fa506642d038ec4b2778a59b27953e59a2c2b0556558e262f62a6259bdc14239cabc36f8132edf03e55b0a6f75811985540a170c7a09c3bbd7dd552e2fc335998b6571875c39e9ab02d13856e86874b80c8e5fe099047139e05e017479d81bae1f0c7401666a044bb6c4c98e1fa1a906592c2af5b815e1b54d203b5e9afa7a4826d6f00a2a4bb7ce2921e1d03b2a8cba2810a76540372f5fef0a831208d4b033e690d64508e4e016547c884baf4136035d0483dd75593585dc901110dbc3e00b42d1ecadca0f483c9888955b367208bbbf00998f08beb0120361e5c9d0ae4531620924740c678fbb80c28f1f9cb54a0186b32323c1809b891b7370169b429e5e8db54d6f2e8c440bfd8ba36509b6edd18a8b6db5b00b7fa95816a7b740628f8e4781150f28bc30503157d940b5423cde607eb73efb317b93173c291b21de715d6e1a101d4b8d6e38b0044aeaa754043e837515d7a0f86385db22dd04fded51edb012cb8a4f1d7a6352025f2bddd18d062ff00d16207a706caf6f0039093c6d6ae813ed9eb0cd462c74b80221af9da40c6e0e81c108d7cbc00a850e48f48b4c5d91c51b96a8241191f032ac9fa70b265a026cce7de562fc7132c6e736120b355358059a66e783b017404651375f6a4ef28a958520814b1cc3129015d21addc7e13e8bb41e5d87e05a448b2666b73a06ed8ae00198dbc7b688024bf1ba8fa072706988b1b801b39122dc3061d19a891ffad02a209c73b02d18483c77d817aca22c6d7dc8c67d3df3f35e110d0b27c7da9724cf3190efcd358a02899143d66808e88d1aa2a37ed2756125c4d357a1082fb6f64408b958068b1ad1d0344fbca80c162d9404277706ca026dc3d005892bf01054db8bb674040640b40e586274d80b01f5f066af5a7a85ccd2723d9e46995e4ea86d1c400d7693eb3c87aa7475edfb07810e8ffd8edf266a04f9af300f8c92fb702f984a171553df73bb152f5b7078068d3cd13032ceebe811a79f7ef13e4740d9077aacbd69e01fdb26da04fb62e0d68f51f4041ece2e0c840b5ddea0c28c7ae01a3e901a0a42e27ad817eb1bb6f80381c022ae60ddbe706ac6a54801a7dd9be00344a6370ad516c56b3f838b854a249d24d595a944825bdd7c79cf0133061dfc5cf1890d0958f25a0d21e81c19b2428c947ec1ebc6e00d39c00511d80d0cdfe252067e6996401d8cbb22a49ee67af28e136e508251c6c3c026259f0683f0001e6ed2120068bcd6303f4f6c540dd70fa04284260b60c185f5a035c498a5e9621969b06e47266c0a8fe658071a44dfbbe65274254ae61f4383a0cc027e33b818a09de7042397ae74ad9ee6bb0e8e7e6ec75ea3468a5bde6aa723f6f8034d4743f00db092b29503fe563c937559ba6c5ac60487a00f473abf927e54600d6f8925b40c34c6b45f6238d50c5e03105b05365b8bd1a00dff260cf00591f1928db951610b382933a00691c0d0d347afc2b0045f45c6b8056fe3350bf9c3e024acab13b34501a670f06c84702a8240e83a72f4058dcb37b40d3b1e54c83455a4d287a21b1fcfda7da0e2a404eb06b2cd397f51e1b2b341af87e977dd4c8ab32e3596f6019d63e0079380247068c62b70608ff32205aecdf85817ef1ef1c10c2bfb561409bde18b089f31fa066b57a2f0d10c39a7a3f6b2609812af93079ffc7326965205faa3908c0ae8a870d40c92faeef015d4e0c4546a9ff20277cbc072889a13cbf002a1cb44f69655eccd8ffb14a398ad829fb700b28f1c60fe55df493fb303994a3376c029bf18b22ccd6a1815afdf8d340edf18ff670ab1fec02aa7059360cb0a7a7064c460606ea86d36340cd2f4e8f000dbfd8979a166942d0be9b09f4430151b81bc018dfe1ed3000ebb7ab52d3c22db65a0272a6c4c91da0a191d754b9a28c29cfda152089c1620540b863b8f30f10b2beb56e808ffb09b0aa3f18a8b63b7b8050f59d5d0335d0c98101691c1ab015700750112cff17e5887ed989bad461d88e010d767d6f16806cf70f0d94e8589a5df443816a3b918752d4a38805ef0366ad0af6b4058825ce813c8332ab88b096eaca329fc8f20fde8e00d39260a8daa32c266c59dd7802cc2ac2e9f700d66f872712bade5f657bd4e66780304a6f80e8a8933d035aec1d10faf26fc5004b776e807aec1bc806bd94803225d1c8363a7bf7da807d0639a0a2914f4f0244395e0cb0966b062ac7bf33035998fd48a363dc1ff149956bfe32ccd540556c8f1a3c948008415fdf01ba8ceacb3a546ea0937d03443b7e11fee9766140d1570d54f4cd030399adb32d0349e176fc22dae3a4344092970c183d4e0d94c64e02a8a31cb9817e7152019a8819dc18b07f3dcad1d2c8c847558d423d68b1de4f96ce3d51fdbaca58c2d2985df77f846d5f0330be9427803889d19580965f541287daeb1e2f29a0d5e6c9e196b2adff46643e71bf6cad1920963b0688f68181fa767b1960cb9f1b20852706b47a645b87382c19288dbd4503a5b1330384513abb03b474c3ce25a0c30fba96c0d435ba3f7896fda89b8a617e579addfcae14aa4d25854defc1b2f9fa1a10adfe266bd9e469844cd4404d51133d5f5370a7e9fd004afa0888f9dce633205a7d2331a0099f00550c27ab06e8dcbe0193806703b5c7e91da0268ddd6d03da74c74052b81369c4ded19d2703ccd6b6017ddb19a01ed7064c3534ce35d5b86533d82520958f3bb8a44dabd81d36a2b655c13af2f83e40cd7022256cea9649e2b306e0a69fcfa86085ec581b666b981706f294f2da802d0107808ece7ed608d4e6b1ede4ea3c00d19e47b95f6d419861980e00d382cd933780381ff5b80dc8f864436ada7a043a4b00f6c73e0011db3aa5a47d670b6ccc0c10292a6715db383740821e0db0b84f0644374e0088c360e512d012305be90c24633b91681bf2716ca044bf642ebadf3f75431a003ff9696aa044bf6482bb7c44577e7d03c67cd20d0c70030f0093d80e94009238aa7203c8d80b974882baa2886530d5a52b4b569b561e0055807b001192c1ca1da009706ba08e5a3f0c10fd5219a85f362e0ce8970703023314fdaf1bae0dd4620b060477d6520335d0ca15a08b9e8b5cc27c3e6906dc5519fb0c466300c74c86a3c440693ccc7ff1db4d7454511ae06baf02720e197dac016a4e717edd09941ccd18ac3c01e886e1c6344034e1105087369c19a8601ba78068f5a33d40cb3c7b7ddf806e280dd40d6b09a00b35dd14a8467c32ea004989fd7814a847acf05e936d9db712fed5b946e5e364ca0277f92c904f22c0bc064872b5c7e30a00b3359cd50245cac6d88d8980078bf5074013ed710268a98ba63cbf93267eb17e6040a2030329f2da4c20aa3f7878058cd90d75f00f3061481ab580b2c0d06702f538f605538e7a125b016f006cd11c5c6f0368c2c1fa5cb4fbf69a60d7bfef0d2474c5a6017a2b299c1419db3cab0d400ce24f57802e53c1364602b6960b37809618cacf9601aabe674023936ddf84fac51abfe89b50adbeb66fc02713c098ae5c9b1aa0a61702cd441b538685647ddaff493e163e00b35c667c7868a07e290a40c23ee9a70e903134beec010a9af0690150337d431ca645ce51d9cd1b404123afa9b3a7e58463154f3f808ab36fa3cb009cc2da180362145bd80534d1846b00b7e93f0324b935a0099705fa4656032dde1a90c68a81d23821dbbed5f5c9da8e019f1c18d073178009eab13b0124adbae18646ae22d637969afe1ea05349279b80948d3ad794a377e9f13f5e0015f38667d268c7ec703f5503cdd28ce5a7ab0ed0b2d9e7725d209ba652a02f1994d9ef9fe4e3d940b5fd2a012943740a28c638466506e8b42f67784b1a7dcf492b6f9f0c50a06d0063d470e11f20fa7661cf805f1c182897453ee97b4eb92cde18288d9fd2009d1b19d07363032cff07203a7bf11a304109572251fa76383e12e86767ece9d51895e429035fbb0788b309d72da0a64d1319b6a418b139ff4a06362939d6393c7c0374f8da3f12cbc4b55dd837a0817601635a7d6d1130e193ef15039563f1ce80342e01d308dcdd021224791469c4a6e7d1a201a74ad4d9693ae68e886b8d95699e1072cdee01c8d8a0dc37d02f3e33401ca9fa3e03e46ce0ae241f6931e5c4e1da2da062b7eda14c5fea05998d1f801de74503e5724bd12dc91b0b067cb264a04f74b8a707e18ffd6c1a28db5b0ad677949470e1ca80cab58090c29d0e103db7f66e807aec1820da6f8069d8b12503d25830501a3f9501bd7f6fa0822d4649677806f7f18b9470c735e5a86b2ab7abeaff2e14299755a591a54942d4ba04146cbdbf944665bd82a809bf06802c67fbed92015befe39338af5e4982b2de539248bdc8a7cbca383cbab10c08d769e31310e2a0b36f3d08b375b66d80f7f96580387c1b20413b80f01d166e011dfdb2921890866c50667158c900633aea9b16fbeb6c4afad7d9af0674f69d813ef95e05c4269bfb1b40c69034960465751287e0ff01f2163b16a06699f45b0ec9ef3f34fbd0805b13b60cd4516ffb80129736d1609117ec871994b7002e38187ecae4f45f28e23cbc7d00c41cf97a0a88826dac18d02f94a3ef2889c3e5cc8041ebd540d95e2680d0ec9599c13cdbfdb76d4017894e0df4894e95cc0123e13f0335f219895623e60d9abdfe8228d83f032cffa581fa762535c0a07480706a16a87eb82cc3d50c30a5603bad0183456380045506785bcf805988e5bd817ef1531b10ca3a06b0b36b7013d93631be44b61dcbc63f528f224bb8bee0558a5cf47f6ab1af334085d33bd3d850149c461f7e4af87f0f17eb93ab3b4008cc650a08bdbdbd3740c6360074e5fe1bb9f4ad3e12d83750d1ef4a030486343c44dfde192897bbca0023fdf70973d3d4a055a25b80094df8bd61806bbd6dc0d1bf5dc014a766712f00697c1d1950b0d480a3908941ae723c016661836e0db063b50172ba6e803f760dc0ddd87f7b3620d11b039cbc2703125d03c4aae848a34751c786c30905eb7d6d8e63ab2bcbb4d05e96e1f121a0635127935d2f73ceef0f5e570c64d8eed58465ef27b37e2b252ccb4413cdc1ea17a0e024c6e7001083e7ed1b001b34d8bc02b4ecd7be9e0408191b1a309fbb0074844bcbcd0091cb1f98a891ff19482cafff7e4137ac1920c9b487cdd65d1d2012fd3150a22b5303125d048cb17477ad813e190c0c2496abaf0658a965038dfb6b0f8089b604ecbf6d0608f5f8030421f70d24daab6f0688f602601ababf6740a29706e8cb0c30a32e7753037d72971930f7383050c1ee7203caf102086f7cad31c026233055ec75da3f06149c6b7c9631289b027f6c45aa5e25b3295bab250e55ce453ec32c37d010fdfa1c00596748fa05dc4421f9e8ff3fe7a3b632c08c6820e18eaac8710476ee011cd71fac1e021a3cfaed9b003a6c3d40b4ab326ef7f82c0168d4002fb82a1b0ea25cdd07a009b5b529af3ccc37a780d09772c500391d18e0e21706a80745f750a0ad4d73c0a89e1a483eea3b03d463dd40f2516e19a4fac52e601c23d0b7817229d70d90c2ce40452f570d9845b706d2869fc680517dcd40fda2db817a30896c6706647b6940e50a039c9ac6806c0706cab69c003c461d1850b0750309ee0081e91588824d0d94c6a0315039b43d6a0eb00e870692b1bb28470c498bfb064c7952834cb57d05a47cb23a33e093c4005faa06c4a981d567035cb81703e285684345e06e389271acea719cd3a22e75c111c413a9479d4d88d3e9669fbcfefd93aabf0540d5bf6f0ca4eaf79581b2bdff0434b1d14f0dd47fc071fdad6540c28d3aba8229afff3cfa15401d9ed223c0332d4a6abdbddd3540c6560d98be3506ac7a7d033a86575d37f60bf00b173b0329b2ceadcd01d384cc40225593ad755f97decd814a5adf18603f7203ecc79901aa4e4759b36f33036a7b61802453f45e81b041db0668c3d800356d0c28d8b5013668cd009f6ec9a05039be00d3c8363140e78606d4363720ba7168a0ce5ee80c2441831a106abad01af08b287a12cec4aa0191bc5b405aa2a6c87ae8dc40fbc67b5032787e201f554bfce38616aba32bcf64b69a7ebaa2a0fdbd8adefcfecd3f59da08c01d22eb39a065d2fca45c9a72cc76c2d11560c2c6d8af53401bded68a816a7bf568c07a65060859d7268a5f40d1597f691c94bd7a306071a93550bf746ab1c6b2de1c1b2063cb062a58b761a05c6a8ade0baed2a8d70c1891cf0c182baf0cd0b96b0344eadc4045d715a13db0acef18e08f5d1950b07b03647d602009fa7a30507b0c68a05e4e51f575033cc7c480017864402e8b0692e49fa141a934908fbf612d3540f74b03ec4766808fbb67c0b4a93050b6c7ef8044fdb2ff363440e82a03fae5db0055bf3550c1562606aaed60cd8082ed1ad0a6d12f694c02a6068c95a5813eb91b0362f0dc3e32209727037d7214d9c626ce9d55406c8fbabf03541883d52858e84baecaf56acc3ec797cc404ad8b6065a4a1b2c023a56023a7565ff010ba93b9b80b884e756fdd23ac0dc6d01628c6a8e0cd42f8b0f06145d62d956238c41f71e2074eed0803961628031e80cd440badeb307b8a3c3f6d280a1e0c300091a1ba01e230355ae3931c0339819a82beb65c024129d1890c685019a7d6b80ce0d0d886efc034c43f86b03723932c07edc183005bc36c0957c3620a4b6602029fc7a346034a5e742d5f7df1a03746ec300472035c016be1b9068f49c87c61503d2f834208d0f0314e89f016a7a0f48a32b4b03f476c7400db414e588a3194b8d017765fd18a0ea95015a194d18e7b4965a031ce7b101450f192be2171b062c6149f8bbb4e498daa684aeebd5947d4a2a69ff9f80cf4d0386e809601cc3fc1a20e1d84d5a013236e86ea580b256bfac8f006d437047c35a5796accdbf904bc92d89c3cb004d74e532c091cd4f40980bd6703a9b8bdb0f03b29595eaaa1147eed6be02603fcaa50011f95e3660bcdd365023bfd0a6d5980ba6ebcb00c494744fef2f88c8d5ba015ef0860145df334009b70c586e712e31af7c034c305b834b0386d71f03447b6a809f9c18e08e220ebd222bd172c740895685018abc6880d93a37505d4e8600b6de0fdb3a4094343750a2e5b701e2f0684003ed1aa8e86ca1e9ec2a7c3d19d0d9192089f6680d706ace0db0b84b068cfb0f80346cd0b2013eccba019f2c19102258359031588a9ecb688fc19d01d51f1830137f34605a8d02d95cdc7f1bb072161d5550f4d553032ccc85810ab61a25659be7e0869eab91a0c123dd50b3e63978d1e8d135e3041b3417ba62f46b85e6209f0984c9190c5f0104dd06e5c0801b0f56015cbe37dcfa02e4dcc8b53506941cfefad803708666b8b3215026bc02f042c1ca4cd7af0dbeee01dc2e367821d1de4aa9d56fd700b1fa76590022c6f6c82f627565a89b7ce7407107edeee8c1b8c12d3e0d80b9f83a31603869013125ae370d30287fbf20463f31c033f8fb04fb41abff4d785f0c18b38f0db0525303a65e63033550b769a06c3fff7ea16c6b7aee4fd54f0d94e8cdbd01ad3e3350e59a918172d115f63d08cfa02c0c9468756f80fdb835c097ca0d885ac7276934d0d000d76964a034ea0703346adb0077e3119087877265c0a81e69c4307fff65c06e8625406cbe965b3c07647b668075383740b3434ed9cf3fb8a904eae8db23e9cb384b585c3afb02e4298afc2cd0ffa9d5bf0f0d94c6e6326086666bc3e1ef9e2c16c9b7d484e372ca3581d51b60c61ddddb2920e5e2bc97f8a4e026dfcf35404c68ee1b014fefb503600e887ee5068419e213b472f8b918207aff0f307a9c003cdefe0176002c18201f1d2074ae3b3720467f67c0fc65c98031ead980d8d69301eb2f1b0628e18f0111e75d03f6d25e19a8fa378f000fd19501d59f1950b033038cc18a0113897b0336eaec1810c88c6e48622e5619a0d9b5019a3d3040b3d70c688f6f03cc457c128aac4b34e68034de0db00e3f06d8d32f0302772152312b281f0df00c360d08ee3c1828d1c186011101b4a18a23ddba25600e707bc606ecaae80c30392185b1a16cf5de80822d1ae03b4449c3a09cdd1a703bd02b20ce03dda3ea551d1a7520505bc5f601e3007b0604fee9db3ae1de9eeb2200fa3242f7ebb850794c47d50dc7298fa54093349bb204ae9e9bf47f5c04766c80bbf166c0a6d62b00e7a20737930078178ad3fd26c973405792a0c9dfec44666b621b74bb6a208dd25561c5e4cfc22c1860a5c6066a209c9a89978d37a86d35c16cd55b01426f8f0d94a8ce89cf0141c82340d820bdb934078cfbfb06ecb6fd30907c9c3f1aa81c6d07f07cffc740d97e8e0c94c6cd132054fd6edd008dba30404d3f0cd40dddaa011a45dffea97a6980f0cf00a1b77ac9680e30b08d01b3a42303c958750b88d9bcde8098034a7a61c030bf6980deb6066ac2c114107a7bbf6a8023b062202f78108d1c9ec1fdba019abd664020620310e7b47622d18e63bf37b4584d570e6e90f59a80eae06660c0d503a84713170bec4a2ca7bf97aa680492fd98f67f52f5d781811c81a57503a9e9fdb68156242eaf00290b105a8cfd05eca67c90ac4fcb82458c8a6c7fcf30cf81ae1e287eaf4ca59135344eedc05fff01962828a9f5566768e6807d5b95016aba020835bdfd0a40df7ebc19483e3e5e0d24632d95fbf3d78f0c54b02a3740d633405c425cee1ae893fb3d0316a7ff00b3e8770309cc4d143d6cb28eaacc018b070b064404360d38887264a05c3e760dd8fd730f8879f6f5a201cef7a70173f5a1819a70a936e0a4df0b20e6d937cf06e8edab8112ad2a03e61e6303d4340184aaebf1b439d027d59d01fed8b20121e8286981d05537069cafdc3720aab06580a5db3660fe720d28e9a8c1c480267c3560227167c002c421208eeb6fa09555cb350ad7085d9db175e59992d6710ee75be59885de0e8b2fc00c55af241fb372c27d4a28e1ac4c884a6e7d06404d6f5597594c89071b1960ca3d13d70b01c2d7fe349048b55706247a60a0f6f89c1930be9c0242a3b43232070c9e7b0638ac87061cec3b3650cf5529209cde2a3160b7dca20151b84d0386d74303747f66c0aae89a81eaf2343160149b0262c25b6d1928979b1703727930400907069cd57834209700a173ba04700e182b9f0c68f50b03b5d8d282010b106f06d2a83aba3246e4aa35404d5f0c386fda18e07cc72f4209cbd68099c5830113ef5b039cef312054acba364091770c50e47f06a4f165c0546304886d27babaa4079c0918ac06e83896b5827cd4ac250d1ea4eab3261e617ab837d02f9e48a3e9b83ff94c063649d3b85e4b5e4e928d26dc40a56e48f2097b471f5497a4ff63aebe6fa0a171716a20e7fb87440b6ee11d6efd006aeef8df6a000dcface85aef22f91b1af70d54b0f6da80a9796da0cadd1e1aa095f18bd0db66db00593f018456ead2ff39402bb70df0b55b03d2280d548eeb9181cab1fe978bc4e1e613908631d83120db6303657b7563a06c7527e41c102fbc30908c5513408c95f5ae0175f967405d760c98efdf19e0e33606aacbc75f1a1a4dab25401e95eb0cb00e3f0628e1a38172b9ba35502e9f430355ee29408cb7e59d01bed4a5019ec187018a7c658022bf1b60a5e21731de7e7f1b30befc01eab26c40e02e7aae8a72ec1a70ec37e4b48e5f1c1a601d2e0c28e9a981ccc5036259a7bc46304a014dcba84edf361537e99d486fd37cca39cf07fde2f726741994f50d0362284706ca9638ee2f60cbc83980ebe707da2f3507b26354bf079c687fcc01059776af4bd57bebc1732f8c51bf4025c50f4acb595c83df0232ae6cbf7e06c416de6b7917a9a7d5574f064a43af41cf811a48eb8445fa67940e0c98263406ccb3570c94c6636d4048edd54032d6de01c2dd686f0c305b1b06cc2cf60d48e31ee075f5270365db6c1930229f01ec19dc186072160d28fac840d936fb065c0a706ac054631910972256ff0c18d5b70db0418f062aa9de8b9e030277f706ac8b1d1b60fad60179f841cb0618a5b101a18a55038ce39e810ad6be1950b07703660567062ad8d30010f7b0568b06b4c79301b9bc1a90cb8701f3b9bf5fe04c7c026c839e0db0dad173112258de3660aa11bd1fdb5e070706d8a03d03b28dde8f1b200667061c01c05cd4234e2caffc004282c67476dd11fcdb90c796361957e9ffa8917fdfb3509b16fb809cdb709e160125f6436bd1bd7de171dfe19586e8cc7a7bbd6f80eeff03cc184ef412fc1ce8171f85019add18301424066a8fc7ca804d8bdf8050d3f6c14089b6b70668c32920d4b47d346005efc2808e7a3660cda23140823e0d582b7803849aea81be39c006ed1830195932605a3d31502eddd8807943b47a28a1dee09e033c83250384ffce00153b37d038a7db5e7b106f955423031cc5250326cd0b0618b6cc40d9b62f0664fb6120e15fdc36d064b58eca95a1d90b0658ba67036abb62a05c4292ed3bacfcfd8263265340153baaa281e254c9e0c400ad3c3740d543c6621b9f1e1a9d039c094a5a371c317b7802c446e10704b79f6a28aa70a5513def279e784a12a93c4b1205ff16a540bfc72735aadf9d1b285122acbf801751fe010ae285c3a700cc2cb65597bc8ce7d4ab55c08c0dcbdb7b8078d6ec437d9b7b6a7e73644010e1db80186c6dc0e0f99706d1af1d4078f4cda5010ab46ac088bc6e80b9c80c381b79682019fb3a06c46dd1cd920175f93140c5560c18e6af0d18e73e0d30394f06ac8cfca5c1c6c7da4072da2c0262bcbdf936c0dbda34c0c25c1bd040ff0c18099f0c28c7b2015af969807abc0342f7db1f037cfe5d032ccc9201b3c6a8ad15f9c50073911af049d4b68a4fbe0cd0fd1f03caf16a402ce7ef1758cba84b8cc84bd7060ce25b068419423e42913701f598f3a6a30540c1b9b503096eafdacc0af6643e8bde85918cedcbfbec096fb4679f80029fffab359031181e19a0ea2303361c3e032a349b39d0ef3bcd5cd323cdfe7dca570da4ad8045f1b7d0be07f0d49c44ff5cda430362f407064a544f5fcd019b5bce00a140cdb20182bb6f80e0760608ee8201e6626aa09e7b1c02b8e060589f078835bed6805c760dc865d900f55835404d2b03d4340a16eee8cd8101eb9517066ce579354070f70c182b9f0d18f72706caf6fcc940bdff790a08156bbf0da8cb8601b2be69807a446d43c5ee4f0c08dabf01625a5dde1ad084ef06ac37848cc5e0b97261c010bd60c0fdda086e157798dd934b3d099da36feb78dc7744bfd4452c723d023a9e03da952b59fede4b33ffc5a5c4a1cca6badc6470ad5cca82476487f913808bbf87456520e77b3137502ed9810127c97700152372bb0ba8d1db77097ff9b733a300c4a0f5f965a08e7afe008446dd9e1b20ebb706b8d6a901abe6ef064c34cf0c98686e003ce05c1990cb8a01f3dbd48011f9ef13447bd18009efd440e578f8345039ce1f00a162f5c880d0de85019a7d634039ae0d58575f0084bedcec1b50972d03a5713932c0062506d8a0d2804933e2608d6abf0c688f4f03543d37c061ad0d48346a1b4ab83433603dfbc800cd0e8189cb6f966e0c28c7df2f48e310c0c58a836784bf1e859a52db9a7b03072b14bd8ebe1da340cd8803db87eaec2a6da66af503f97455c601f6c155807a26a1db9722f7669dcbf6f5786baf4f25fb6158f2adfa3f9563581b48e716330369e5d27b000266eb37803a426a7b01b8347353b382aa8c67ccd72f00358f415da92bab6aca967756012b4f78afa95c9530357fd80c40478d37002951b8fa2500693c6c1970d8face00fbb16fc05d483f80b00eb72303dcaf6d03d23834404d2397d0fdeec70017ffc2801daa6303a6b333039430aa6f451e1ba02f6b0628e1b90182bb644028ebc880505665c0321852d8ab2951fc89017b366f0db01f7b06ac48fc185097454038accd9a01267860a0441f360c302833032e24fb06c4f0fab06ec0278501f1f5a85c6876d919a0d9a706ca65a932e04cc01520a6b3e5a5012ecba701ab1a8501ad7e6080b968006ca11996e85ccd21b4c10a4d58b73835bb6a8f7a329bb011431e4afdfba711796820a7f77ecb402aa68b9de7409abd980420b6d59e19481cb69e000df6a353f5fb0f78e2607d0c88cbc3b735d3aaab094f1aea71aca2766cab3b0484eeb33fe8ef4cf35501b0af5d1aa062cb066af5876d400cf3ef8f06c49428fa5f80e8c2009dfb3060e0ab0cd0b97b0324a834c05558077892581a7094e9c180a37fe706ccd55b03f6c11e19a0b78883f5b65d37a091ef0d7047570df0823303e2b8cb061c870a5071d9ed63e4124f7035a5013db763808bbf674039560c3017213031885f6d1bb0b33c3390ac5f7f01e252b3e5ce8003b9e706cae57268802310bf08cd5e3933c033403daa3840565e1b60c77203c9fa924cf0efb979fca0c240bef6ca2ec08f962d0050f5c14aa4d1015ea85c53a7dcd8a661ad49f289baf25856bbc96b4ed95c4bc69aa2c4e7ffbc0634a1fb6900543ddf30d0fa9cae1ef8d57cbd63359cf14999f2528d6e6e299a6accca7b770488e897de792f7e8f30cb55b84a00e1af3f5c19a8d56f4e0dd8777103c831179fcf01629c3b306056f00e88b0edfd3f03c4e1da00233d345057b2e6d958c52e1f0d50b10503acc39d8112bdbc3190de5e45394281eac4004bb76580037f6f8087f260c07a766e809f7c65a06c9b01a08e6c5303d474d780a8e485018d7c6a408b9d1bb055740688d34fcdd080caed1890edb6014dd819a8f72f2f0de8b9da80da9e1aa81c1751171efa1a5e7f0608cf71cd806c2b0376b9d60688c32ac057fb6e183002d5068c0d67069c6e416feb31071d2f10877ac623b2872f01e26c64fc228923ee085dcd732f8395f885edc73200fb313c54eca29dd51cfbdd9324b729cfde0d163488b7bdaa6bc7eee2cc40c6409735cc0127fca562fd072ca32f5401888d6ff149d9e8e8ce705b8e625bcd08ba5d7d0062830cfbf9ff4e703f90c65f80b93260f03c3020a872098868f1d5cc0077343120b4f70a8821fafdc180f8e9b70193009ad0d6e1b632e05eb84d0396d2ce0c18a3960c90f55b0349b28efccf01e19f8181c23f974f80b00e9f2f06b8c54b064437160d7026324018833a37c026af1910d7be3260aefe6cc0e6b8130315fdeed840456751a7b575b83c33c0c03e1aa0621f06443643606210bfbc32c05cb406d8e4c680d9fca281d463258a1eaabef864401a0303021114ddf7e57c51b99a5bef87a3121037c58f2e001daf98e911c85ee2663399ad15d5b6cb78917e98a9a3badfbf39f8790a8003af3b98e740b3795dbe3707d26c4e0bfe0286f94f038c4167c04efb670375e5b7d4a3cf946c87cf069abf7cdc02662c923faba3badee757d12ff60029469a5303dddfd2730b0857e17a68a0f678a6a456f58f1f03c697330389c3fb3ba02036de3c05080fa53350b61fa9013eeed4805cce0d2430ef070612dce73740492e1f2303e61eef0678c1070638ce8901e3cb8e01f1c200e13be852b339c077383660dd636a80c31ab984abb0bc6380415934607fd0d4000bb364c061c923400ce2cbad019b174e0ca40d0f9d0157b9dc0142d59b1f032af76420c17d5e31d000fcbc64c05a41f44b78f47a097e0e48636cc0e47dd94063f6a534bbabe3c298257e517315c3e0e9d880c7a08e0c7883fb1130895c5a039e4958004c29fa08d10edf61f0b41700cf40b78af6a08cab2948b469793dec85daf6f655e6e272ee8f95a32c997089f9468008423680780d697f5f20e7c998e1de33601ccf56ad0bf47f80cc007763cd4036e867d10009da028cf9c5d3b2817ef133024ce4a10cbfcf01093771ea0dbb72e4c948b70388b0dcfb1d208cc1fb8e818afed618600c160cf01d9e0cd8c3ba6da0725c9f0242f7752f4bf97760fbf3c98018db87816adbd0c8bddeaa609fad014b144706e8cb83010665c38000e2cc80cbb3fe01c23358de30a091af0d94c6fab2015185bf4f688f0410d384e5c6808da057064ae3211a3954fde1d200f73cfab6c3ae5fed050817ffd48013a92303ece95420a27043bd273e077259965200bbc2078f6706d2dbc773031e4b575dc6fd982573713211c8539e8df8be1028784d7e78b408a8b81163e14be0f74f9d7d6fc061c95b03b9e7ba66740e381d7764c0236e01321e2e5afb06e49c9d5daf0125f7d2ea1ada1e54b5d278ca05bc31658b825559dc48fe1220f6c235062aa96e5cea414e00f17a10207cba3503b48136f5107ddd18f0c992016b7cdf06b870eb8050c2ebda804f2e0c90b16b40ccd52f170d88d16f1ba0625b062abaae5c9e0326efb50147552297d0b976d34089eade8d39e0e85f6aa0266c7700e1492fff3320c4d8196050a21c31bcbe46cf85be7cae1b10eabc346088460aff14e8c70083b26fc038776920f5b81f03e26ce433e2f0373452f45ec518f89e003356dfb477630ef845649b04404eeb14a00ddc3dc0411b603f265931e334e92ea09c08e8d0440f9a0947cba551133f39a5b34dfd801443d2e79d811a285b34d010fdb362c0c3564b80a4e45d9e1d40c38bc1eb9168d328979d75401b136f999c4935617dee3907849a3ead07402c9f29985debe72503823ba9017b585b40419ceeba0c1011f8770326bccb0698e028589c49dcbc30404ddf0d98265406ec307b33209715032af70aa8e216898101cb820b06cae5edc8001b7468a044af4f00b1a3eaaa35c0283d1bd01ec7060cc09901edb16dc07de3d11e0d3df711058b59f4d5c400fbb16bc051a63303ecc73f400cafafb70604cb0f0da4fbeff7061a2c56d60d34007fc627e15a3795817259be34506d5f770c94cbe3aa01f1f55b0365bb4013864119365f80b8697179c980b8250d54c7d5474b2b06ec64fa06c430ff7c6d201bf4f462c0bb097f9f48f8ab5340ecd75e5e3690aabf7606a4f163c0ac0081e9cd16b756af1960c71e0059c77975e9ed348d1794bf55db6956e2e26faa1ba6712def704f459f16630ef71c3e05603561415a39edffd41e4b9b06cc2c7601296b051b8f8092e9caadda63eadda5af7c62d7ba3b306054bf0684eedf1780f071df160d88287e1910fe5935c0fb7c36c087d9078456be9c1a702066cb007d390784cead5c1ba0737b0668766e80b93832a0607f89b26e3a0684563e9e1890e8be017ef21d20ae1b5bbe32607efbcf80515d0a3475e4aa690cd8b6766740490f0d50d34b0369e562241a3794753780785bf069d7405138747fea09ef5d8038cab4541a485fb4f1710e24b88b5b06d286d716308b00c09581d2783a3050b68f178084ba5c44394a3681afd073755c80b14af59b09b2be818c35154f099e68c099650d57c9fd68a635ebff54525d21dbff67a24368c3ad0450f0f6e4420928799d72955fc4eadb60736820ff43a7167b90f2fcde460188c7b1ae5e0320304f6b060476ff016298bfbe01f0a2e3f0750f10a1f0f7d6803bed970031597daf0d889e2f1a10417b366024cc001197d2f68639a060c78050c28fc68029e08601e6e2c700d18e5fc43b34da1131072ce75f182897d5a101f3864d03d4f4d84075f9de3150b68f5706ac13360632061f5f068cb751fdd0ecab9101d99e18b0d0fef70b626c74651d5797b487067828e70644e0770da80bfde24b9aaa23038a8eacc7d1f2e1c7b181123d8d72c4e6ebe6d30003fb6d400071d140f6e3aa34e0fd9748238e312eaf18b0d96760800d1a1b6898ef5e0d18a2ff12253eb66820fba160680f92f8e49f0183f8a5813e795d37e0ccd9bb018fa646b66984194606e4b269402e5b06e4b260a0445791f53a4ef93e622e9aa25037ec49b393693545e8241f49321b030e00f95805bb04e4a3a986f9b34f40cbeb1ddf6ad3a4e0aef061a66c93df3f59ba4d0376fd528e32de8bfe7e04f0c8ce607d15d03129bad22420f19d195b143d9e781cbe52524f359e8706ec0fea0ca4624f1b061c931f01aab085fb016269a0366025e0121076ece5cd40b2feb50588f8d8f71fc0f93e0278ebca9a016186130362f4a7803017edc880f5ec9901aed38f01c6b1366026fef78984ee796a40d47a62c0166f8d73491db79c2dfd3360b16dc100237d6240c15e0c50e4bf5fa8815e03c48d4bed8101899e1ae03a2d026256f03635d078db8e0db00e4f064c791098b052035d053507acf17d013c0938326025f1d840766cb135e07df52503b57a3b3190eff0bd6720177ff91b1027ca96170c98e09d18600b770d0844bc19a86fbb1703ccd6870127ecd60171c4ec2337c04a457b6461e9a25f8ad8fca4e94ad2ce3229f2b2b24dd374ca830eea97349b461ce60050cdd4c85aa1e941c73d24fb9a46a6655cf1b7b801482a7641af03524237596aa044efce0c240e44697b401a3a30f5fb013b22d21a901383dd5e00702bf1702d12ad2a365f6f021a8e5461e9d22ae5ada36e17102b125aa02affce673f658070aef4ba4b993accf07a6e8071a4b6bdc92142323420887064c09e2b9ad036e8fdc5001b340184c9597f34c06cdd19f04961805dff365013ea0daa32f5fc05354d6d5016de0cb01f0b066ad3e56b40f830ebaf06988b330395436ffbf420ee7778b83520f47b6480ce2580581a58290d08312e1848a39ee96cfb303f8f061cddf931402b2706928f6fe423547dc0b24f6a0f453bcbe700ad5c3520d167030c4a649bc67ceed540bf5842e8ea3843a3fd4173207d69ff003ecc9201d18d4303d5e52c8acef6970153e2f47707e61cac768018a35690a0661a16e609d0724662436376964eb4bd72b0f10e8818ca823cc72c1fa73cac2955cf8a8af7e6339523fbfd53abff01ae19dd33e0c0d428802e321eb0a6d57f50a91c0b434055c9315a537bf41f601dbe760069ad11e8966cadea4f8d818a8e939755f138a7eee99d0336f867066cf6690d889f2e0022fea1c718e60039ed0c942df3ecccf328dce2bf73e20b2f80b00e3f7b066c4dd0d89059d5570706fae46bdb80c5c74503f4b636e04a995b80e385b501c6e0c500fbf16ac042c8d840b53ddf3450bf5c7e03c21874d7064ae3f2cd80f0cf05206638ba4bbe0731ee77630336c646c162543f7f3650a2cb3303746ecf80f11609aae350cdf2aa017dbb628041290d54db9dca80b9c786811479310a96451ab581f4b67933c0282d1ac8cbd94192eb3c3ef96740e5ae0c28c7870111d63340c13b23a7d11e111e1c2163cda8c25ca86079d6ff13907ce4bf7794cd3fd9e517bfe19d39d8fa0694e8adde9eec41a5517da0fbe8cbdf974895c6269f54055b45bb3d8027232da0a23d1e77003188bfc52f22a2a81b1fcbdcd18dcb2d03827f850121934d03dce243408418179e0d50a0dc80c34e2f06146cc980bb1869b13a2e55bd4f0d548ed51303f6193c1928d1e55d408cd90b5303fca007032ed0f9324009df015e6b4c0c54d29f3b405cc174f965a044df3f0d48f4c30007fedb40faf2189fc45a41776520f5d0058f73a0ce6e22d1382afb31356042b364c079c2a181d25842601c44d011913950c19602c45b9c8b2b06e8dcab8154acd931900ff3180d6435dd35404daf0df4c94f744341a27adaa8073114e8e45259640d63b6debf2d8b7ca28d4bc3bd4900de1939d69054149344bff85657ce4f286b887e30e0c5e0570395e3a70cc045a43a7534075a19610bcdefa166e684bb80326e17fb09a0738d036d169c03de2a790434fc426fd7ce018fa76d05a871150680969747d7d50d45356924969b2340ecc6c6b72c1c6678dc366015907254f11429e6b3f81bc42f0c08314e0c9848d0511eb3df3b03caf10288f176e1d580f1f6c48015ef6703e241db0604ff6e00e18dffec1b30135f30d027e75b06083f3de7a8e4cab6014669c140fda2bbe57e43f6613e3f0d18c4730375d47205887b263ed60d94c6f3c88099e78201f36c7adfcef732dd60e77b796a209d7bff31c099783420903934e0846e149d2d0103dd383d075ccdf966a044593a2a3c0037a5012b34d12f7145f9616e80bf1e7529c3a08c0d38df10e21047225649b48985d4470d9e451b1b0e37d4eabff31565cbbca12cb87268b82f052acb71aedecfb60125d621fb36506d17d703e0afb79d012f095c032a2601bafef5173009d0fddabf4972d5e08f8682b21ad51c84bd05c4d4fc69d54043c1eb3d20ceadbd1e1ab09b61c58073d1c70644d0640b4b2f0d3cde1b30e06406928f771aa88ee7099e3303f4e5db80716e68c01cf906107afbb062c0ed62b9012fd57c01e2a6d6e5cc80d3933f06eab9c719204ea3eb6dc13960f05c3660f67a62c0e4bd309004add3511e80f520ee1cb02f78d38011791110b7592c6d19483e7477e91c68ccfe8c72c47ebaa5750336814f0d64729a6d03e6c851dbbc25e41a89c61adfd29a01e2f06cc06edb0703ace5b68154fd7d66c0ad5e51b0d807bb941ba83d16570da4518f7f9f705b4148611c51656768e98800abf7bf4069b02ff817a8608b97808a822d9c1ad040084c9384855137fc6e73949a6a737e5965ed98388c0c4ad5bb1b58981fc08c10c1be04a62a475369b6ae81eb01d6619827008e880cf4deeb1c48c58a2d0395949db295edc7d29b015bcefe016a3ed131b55f808579ac0cd4b7eb0da09377315c973f56f5c560ee411a7f0b98ff0c0833dc02629ad0e4061cbbe117f52821827618804fb47d7f0e305b6f066cd5a80c9856ef1be0e2770612ba4dfaa51eb351f87d394058cb3b032e893c36600d6760a06cd702c4e5ae0b13037db2fa63c02cfac6003b5602c28e3dbc1930794f01619456170111b8bb9b02e20ccdd79581b2fdf834a0a3560c50e47b40bc16fe9c1a48e72abad2c33c13bccaaafe8624d7dc5f386806066cb3981970b1c0c84072ba80d0fde9ed9901c6e00150c544223340f73f0c70e0c706ac154423b3b6367023371162fc30c01828db7a5c8e588050c1ea3c9f71418aa65e75598767701b20a6095706fac55a0e6809fefd5c1b302bf8fb05a7af65a4eb6ac41b436ba780298f20cc3e00390fafde4c0131dfd70328656d59d71bba7340483e31607efb0588c706757de31ca0407f009fffd580e1f50fb0a24903795add0d0cd0972303ce34bf1a483d568f01318b5efd30501aab9f06aacbcf8101f1d3121007d857df0dd8d29c1b4860869f0628e1be8104e6f90260259c1868f4b8dd34606188deafe3360bddbb3107b2da7a34640ed0db630389f6cf3d80417ca0db91e7809d191f064426be0c9406eb62b587e8e1a9019afd6cc09a0562e911b93b352092776c20a76671d340697c84d0b18c3e786d0c5497c71f03e5f2303620977703c6caf8451de33e7a1b9a3d589531a89bd822b12ea7a6f98ddacfc19e84ae2979746898ef021af66d61b67e8172c197fa0504ff16021044603bd02f506def3b03c9075b027e01919a2703653b26d12a8b319b4faa827542bdccf29b021b205e24c94d1def14613e1baf9aff5c1ab09ab00988618df3628d355b0f37cf0107fb4a404c9adfdf0c88d33d193009280c18f86e019e561f1b288d9f5303a609a90131c70d0302ff8706ca652d6a1b13efe527037d72f40f10d7d2ac560668e5a281b47299de8fd174f8961970dee3c680d9c91720ceaca6a70698be770346e41d030e094c0cb8e4fede8099f89681e45497aaf6204ec8ac9706ca7667d940255d583750b66fa90146e901c05efcc1e2b9813ed10bca7380317801b0f36fa03731e64045ff9e18a8e87567808afd00b83066f03031c0ff7833204410d56ff8c5c3c880a8e4a7019f4437c4e6960bb4a119d55ca043c19a70144f35c369b34a4fa40c0fd5b76d1eef262c9f00ea8c353e0d27ad77007c5d025a6605c98101a75a1f02c8c20cbf25c96d35e6d1541631da2a6d3885b504c86ab5ba6ebdef41412e937340c966d2ad05408d8561ff69ef9f70c7dd93c4a175cce087cad95ce879e8399048bd530eeffcfb4a0c70591e017e2fe9d240892efcfd42e673f865c0bd0a3f00bf75f46880fdc80ce427af7d02fc70d1d48030c3378018db9025acd631363d033807ec718ecaf978faa10163f682015bab6b006a3ab84a0cf864642029d4adb373209dbb5a3220d6b7622059bfcd0cd4b78fcb8032a20a8501b99c1b302ba80c88e2bf1848a44eaf011cbb19ac4c0d786973d14069e80d99395049d71a4068f6ebc440bfb81e1ab0c48968d74d84291f0d98267c1b288dab65032c4c88541bcec487817eb11c4d1897bcedcb1874499ab0c7680f9027847f640cbabce56cf5b284ae2b32de39db54e5badf3fd9c27f01d874b47861a08984ee329903822a7c524dd0ecf51c30e50ad9b52d40d290ed02a0c03ae019f4a0919aae6f1a30a15904943577876900eefee6d954ce9ec14b01886712d63b03161f570dd4620b0f061c45f803d21766af9de3eb1c01e8acfb0f4706d88fb1014b8b2520c67d04a6b3ee3f6f1a30889f0162dc5f1b1a30077a3750037551dbb8c5ea636c209dbb9b1948e7cabf5f48705f5e003188ef2c19e02adc18482cd313038cd2810137e74747c5b6571cf8cea3fadd8d81e483dd949dcdc5ed860116e6d4802d0101e24cc0e2990197bb1606ec851b18601c1b0349617d6b80dbf364a072ac3e1b101f8b460edfe1f5c4808d07a5018b1851f430286bad01f663c500bd9d02c27eac5e18a83d74316b35ca66330dd17a52a81ae57155fad9b780374eef6d01e23e58696535fafd9b7f92ed1ac83ae82196396017e3b781c4f26b09306155e3eb019072707c3d0314bcc05e6e035ace89bfac0978547fa4a4f6e81f5f0d18092b405c05f5b666a0720c5b0349b2f6d2f620b6aebc5c1830ccff0194f0d98065c1a1813afb83568ff72b876f6303ce47ed1910663832c03a3c1b70f0e2c54082fb3a03f8b5df5b03968e560dd889706dc02eb55303aec1ff00b03374f0f562401cf7d340b9d4db0692e47264a0f6581e006277e9e2ab81d258da32c0e4fc18e0f3bf1b304b8a56af623bd0b2016964062a989eef9c03d61bfe00aba208ae15b95e36c099680cb074eb06b8f8916828f2daa7811a39471b7abd55a25aa19903ac436e806710b9749128b2de8c228d5303e57230b7a7d5783a1e7351dca540329e12ed91048dd306ebb0b00068a7cce6558e71d610705f54038d8ba92e9e18eced0894331e5fdc4b00157b9cf706801a93a3fbf9fb7945dc059d8f0163363d2795814c8eee339803bcad25032e86bf0cc073eaab54aeb7412a7af16e2025dc9a00669c7d7b3e0764845cd75b0349e1da1aa0a895c676fca2615deca516f074e59ef6b0d97aa2a47fbb6ef60dd0fdf8241e4d7d7b31505db4cb750e88f53506eca45e31c00f5a379041795930e05cf41010eb846f5706e4d21ae0a16c1810201a1b7054f609e047ca0f0d28d8bd01173e7c19b0c9a634206c5b1bc8187c2c03e2da80c57303b68cfc01e5b2f668c07eba0b40b81b6bdb809859547f40d97edd027c71cd8e0113ab0b03d61b0e0cb0308b067839a981745f6be23d88e58566d380346a03acd48a81125d991960a522db365c963303a65e6b06783951b0d827fdf10708a82606245a1b60a5ce0c58c3b935502eba8fad1a37ec11187c9e1be0075197266ec2d22d343d883334ab7b80d8b3195ad9ceb8166f5f459fccea0917f74a7027c524e77ae000d35c52b8ff02e8786af2f546e0f76f0e1646069cbfbd30e098dac4400df4f66ec00d210166eccafa7e06240476d75600291b41b571ba0705d3a68b7d40c3d4ebeb9f81725953474dea49c379b10f801f93bb3160df456580d93a336017c1a9815aec63c58019ce23204ccec3b9011b42be0171b8f87dc300a37469c04ad195015db96fc0becfa1818a5e9c1bb0d7fa081056eae5cc8000f39d01966ed5007b3a326043d9c0802d56eb80b8cb6467d1002ff8dc80d9c9c480a9d78e8144fbee16105797bc1506c482270698bece007bda1860d8760cc8e50bc006ffc1e79d010eda8d013628aa1f0fd354a90187e0cf0c10cbda402d963f1ab0dc121d1566eb2a3520dbca00d3971860c77240dcb1fb5a1810932e0dd0cabf5f280d3d60504d7aa3c452ebb90131a5a9012e1cd93671a35f7b61c06b3733c0246abb0988ce5ecd0031033e91044d7bed502ce74d8a3ced959dba5c1828dbaf47034efb1c03a6ec1dd57b7c73208dca8706ea7d3df0390784c35e02b0bbf4a706ccb8e73b8d5f84d95a2f00bc903bfc7e31a0a4bb809cf0f1f406d0cab00dd725da7da65c88da91ad373eaec52f5236b56e6c04c0b97a79376037e58201c78f67068490ee0da440af2b80b0410f2706eca3af007143d9dba9011b420a0382c35f807059968f0cd8cc511870ddd8b181ecc7db1920ee4379f9366083ddbe0136e8ef138cc13f03f54bb962c07c7f13104badba4f690e944688651d479817d60cd8e5fa6680b9d83260913c5acc77fea506785be7063846d7061883bf4ff01da2a3e26adfcf7b039c9a250342f2898126560f33030233e706dcb814b58d0b407533c71ce0073d186061e8a8b0308325c4c1f663edc240692cc72fe25211dd9159fdde21c2093b253acb6bfc202d2c57b3a2898328325bb3df8b7ae689ea6ace1eb41c62d5f359bd7f32add4515f8706aadce6183063e928cf0df083360c64827547c41ca82e830e90c48c6f2700abd53a72f79b026ecfc60da06d79da485d39ab595b1b6e0e001376bbbcac03661883a71503765253973aee1b7f7c36e056af3b0316a89e00612ebe66807812e4fa15104195a50303ce9d6c193066e706d2fde74834ee22787a3650a26b0f0618a53f800f736e800ff363c066d2bf4f88195c19703aff1210f7a029903907f81fff0c6494d25d0334eada000bb36cc082cc1720ac43b96480a7343640f7a3a4e15de87af11ec45dbf835b03ecc79901d53f32c0bb583040d58f0da4b75da411b3a4efdc8069e4cc00c3766c402ea58172d1998039c099404d9bb814f1ebcd8071ffc680b9d8b901fec7c8001b7461c04c2b038c238d99817e7115bf0893731605f3252bb9813ed9a0b64d843bf6253089df29da7b02d4dc28bc216d48923491ffa12763aa242f5906dbd3d89094190f04efcd00394f80eea960493562839d5ea9eac10c87e4f30fa881b477740ed4405f0701885c2da480044fa91818a8a43f5303e6624d00d2485f01799cc3f90760a16ca04d693de8625d4cfaf27715c30db575b4e7f9c700ffe3dd804d9c7b8070599e4a03f6af8f0031a1b9dc31e06e5b8aee094df16d20291cfe018d0defeb80304a6fdf068cea9f06aadc6a6e80db7360a0826d3d002a5eb85c7a0a401ac5850137d7ae1b6050ae0c58053c038487f2fe6ec0004cefd70d038e8e52ff02b2cdd70c9813de19b0eb66d1005b78658031f831a0f7a3c5c28e7dbd1aa891b39901821b45b751fa3620dba901d6f2d0004bb762c09c90ea37deaab16c80f9fc30502e372303e5c2d240621b74991910ba411c9ab819fd6d68c0b52395018b6d030325fa7264c036e06d401cda7cc80c54f4e59901879dce0d94e877543f0c9bf6a0f56016fed88601f7afd3954dc63b67fb6ab1349bcdd8c9a434d23c4db0963b80de3ca8811a401dd67201d0a5cae55475498b9aa7d075957e3ff18a3b007401460f9258b05b03a461b6f20084d3597deb276fec2ddedc05946c07d23bbc3da809a7eb647d0f305b835540ef8fb1bf905cea31d3b7a70410416a5d2b51a58ef65c92ada74dafb9816aabc3b4bf2b8d28f2266d1af7f40e9fae0cd89c5f19b065f5cc8075c22920ee647a5d3660b636326007e29e010f6b7606eaec74db40edf1f205886b14de460652f5eb89013b108f0d30289706c4c63b03e61e0340dcbcf0383560e3e38e01b1f1ce8035be530396d23e0c24526fe78038e7b9b26bc004efcb001bf46d40287c1d10919afad280ed0d03034eb4cb2f4c9b783cedebc340e2904d0df02d6706528fdb670077330c189252fb417a58620e08102d1810b5be30c031ba018441b9db30e0c6947b03dcaf45405cf6f2b160800dfa0318367aae89a0eccec8809d9089019fd0ea4d9cf1deb935608e1c898677b1208dcab20937b69daa1bb27cc2cbb4c7e7808ef30d076ac2ac98e882d861a2e1248bf0cf60696880a1bf339031c807066ac2c14700acd47767201ba46711e740f6633b1265056fb0265faa4fa1c13a4c01e15c8d4e0171c9bdeed7ae7c69c4f0ed0010f3b9b5cc80abe30f01e1f6bc2f027cc95b69c0ed2fb7069c9ffbfb8460f926c097ac5c1be0c36c19a86f9f68b13a0e6cbf6f19b069f1c800fbf108b022ff013a6a6c20adbcfe03cc4e3e0d38c2fc97062785a3c538fc35f87a36e004c49201bed4bd8112cd570db0520b065cd93e3560485a3660109781cd9a519c395b37e018f4b78172d1d6d939502e3af43d074af43d0184cba24b23e680069a1ae03a6d1b602eae0d50e42f03ea726ac0f505a8691317e6de7d1b90cb96017579336077d8ab01e7b42a03c2e9914b5829ddbb3107b85f08bf6dd06b62c081874f03dc9e1c103b775611a9265645afd4ea79319eb1b35c9fe4e584d76d172bc0945b9b3e14eacc7b9784e76e5f005898c1db1f605bf40120c728bdaf19b089f3270007a692674081d9fa79315067bf3c1a70ccf52600b1adaf48b4c4dbfa1a1a1063db03542ce9fd4860f2de8ea93d9e3f0131145cd362f6a536ee00f174cde53f032edf5b0544b487a592de12c6c5ac77066cc25a35601a7961a0448bc680bb7f1600e1c30ccf0d641d56a260719d25eb0db927564bcf06d8b14303e61e1f06bc2f760a8813a96f170688c3cc4069dc2606cc921a032edf5b07c4a9f88f4503dc9e4f030ef48f0c94cbca9b01b9fc1810c626978643ac83b7450326783f066ce09e19e06d9d1aa095db06cc1a690f9badef918172b9bb33e03a87bf4f30288f064cf03e0c24526c2bc81b9ff44b0c48e3d980f67837a0a43303e6a69b80304a4ba901e7c53203fc2034aa89bbb21e8706ccf7d70d182cbe01e129e90aa6aac826191ba864d78b7256e07cff00121ed57d92b52c7e755b5df9604024efc940829b368022ccd6bd019f3c1bb0f7bc0a80a734c80db84a6ed380f5b92d40a9820def3f0c88e33e1ba8c5749fc16f29306cc302d0e07e4da87e3dad117e1aa89eb191fce21d9010ec7aa64d1db9baa6b69e023eef0262c5fb91bafc4dce3e0d58b01b027c83ff8701eed70d20aed37ebf36a0e80f06b263d9960113bc0503d6816e01611d960f0d48f4dc80fb717f0c08fff00b7b288335034259ad017b4812031ce70b0389f6cd970127975e00a1c83faf06c4e87f0cd8b4786820a1fb5c044494e532316037d48501aed387019bb0360c988c948038e9b73d3550a29fef066c3a7a35e0c58b3740a8bade029f03a66f2f069cd3a26f9b8470c7731e805c744d600fe224e88b26ab453bced95a2dffa3cc8a0c37505258e65d82ce69a6551629bb29375a40ceadb31b1a094bbfa3b9b70d48b44f69b0f702e01defc19b4c70f9ab86326c5d00dd1c37781c004a5c96bb7303b67af917d88ffb4f0342f25500d6d6f4acc8afb1c06549df0035e0333790686fef0760a635a5fabdb9908a3dec0162915c9787ff5e4481a3f84e2e11b61deabee0392030736fa04475e3740f2220b2706e40df2e18e0b08e001183d5f5387340b4e7c24095bba5096beeb81b0c1e0d883a4d0c48636ca0720c47063846b241a58dc1d7c480e16464c096b3a9013b986b0396f44a004710079f4b06dc72363260c0f9fb055764dc18d0849f061c1efd03b84eab80b83dfbe7d98059d29701eb512303aec34d0dc8e5c280e0ce31601a3edd9a01539e6f03e2b8ef06ec923f0284fd583a36c07e3c19600b51f5268efcaf9f18100a4f0cf4c94a7c123760ee445de29ebce54d03767522da6dce22d7a61cb46a5ae8e6ebc1a6fab69a4df438e7605325ade234fae0593d5745a477b018a00a7065405cea2e40ece87e33502e6565c01b323b809a99d6fa3da0e1d2aaaf730097570c773400f7497278f4f90b1027a7f53669f577ed88deb0fbcda4e505a1b5007160eade0063109f8431583a34c07718fd5ff6ceabcb911bf7db1fa6ee7194c3a53a772bb742ab7557513997e2a77f49e207f478edf1dabbe3fddbe71d9b678ee6992a168b0580600215604460a70079a04e430989595929c0a8f5bd020c88bc2b809a3e298019bf29c04ebf2e80980b0ea9eb00f623a70ae08fdd14c0e9650b13c81c8e77cc2bc090fca70274cebeae8033b1528070854b0570e11a0ab8e829be9cf42ce8480a600b1f14a0fb7654c04fa9a50af829654f01dcf3470089c459f90298589e28e02609fb0a02b51f4ff2721219ac325600ef22a300a3d65b0578db338044f45b641570392605059ce9e24901678af1c2209228bcf79e02ce637f518095d45500890c967a0a3052b35500197b5600f9680388c9b9de2b80c9e1562c88b10a9a3a2c96a158187ae08e66582ee659f7bb2c0ea15f2d73a6d853149a961f4f990004e89d70e45a03421c5c840d0f16b085b97e5d811340a60012efa23a1020a32c6380186b145f4e0089f44e582cc33003b335c615610953582f79009902dfbf02c8c0ee7aa500e182da00218e56dc0602a443d351806ec25a015652bf03c894cd7d5f01df7277528079b103800cca72b07d07b0f71edf25942080dba60298ad3b05d8aa925780154467053876a6a7006ee04d0184eea200238aaceaa17a28540010efa2fca60099d615f02d7c26a80390e4160086193c2c790fc5dda0d35c0117fd2d5180e1d29502b8817817b10e1e2d14a0a4a4007e504e01dcaf4001f6cd4ba6128b808f6a71002e4b5f01ba4d4705a8d396024c3d5f018a31c2039705402c4fef0af86d2f59051882f615e05dbef280437252001b84af1f6142d7bbf71560a0ea51013ff631a700c3614d05e858a50062949e360a7085bc8b442ad99f14a01b292f27bb8d5f1944d54215f3eaac2f919f413f8a8fb937e644463730d71805a11ca75e1200a3b47e01800df2ee660ab0cef155006eb9f415b0e9f37c05dcc3c17e310bd8c2e04345c66c61095e43015a53d697c8d831ecbf7d5600e71b2f677a5a580d25b7e42398be14a0823d237c9c7a1089a5f3e09044c6a2201adf528004e1d12be49c80a2028c168f14c085eb0044c874b31720660b756aec189cbc170588bb715480b19c1b80cc23afae0ad8a0ecd83d8fd40fe220090e605df0490174eeaa0026476e91a52b5452c0a2cd81d11c80a5ab2960bd2d0d00c465f1b60ad0279c28c020a4009d90c16788e48cb24b5101f6357e28c056d98c023824050550f589020c314ac12454e97d4d01d6d4f80a90c752017a49104bf550f8240107b02bfea60093e47285f8fcd70705b01f6f0a60b5ef14605bc51a40ccc57d51015f71902f27c14d3204e0473028521fd28a61a17014cb04f78425d9f4cd0a3c86f24a005185856ec09e41ece7ab2cc9c31d4080ddf96ffc2eb1ecd5a0a719803ca55503083016bc935b220cdd9c5f152070cd0b402cee5743000c0a7ae2167039b02fc90216ed55ac80f3084b0062942e2c52c6d7421ef4aa80bf9cb75700cd2e00c872640c97c66a61a44e65d8d6433f2a567381bd3cf1d73cf2540142da4d14a09bf0ae00e560cf20d6956e98058cbf56bae5147067844f893040ce24a72705985b9b2940c0a9b302b42f7d00d17d2a2a80db73af00f643808417af6614c0289501c4183c8c15a092330ab00fe7aa008d85bc9c2c91a8ae14f02daf3d051810c92a8067202f278ec0b1a480cbf1d253c09fa1f2a900ab6ef20aa0b743051843913a156370b755803cae0ad07dcb29e03c2e526312186dfdac0015945180f9b9ba026ced8256461224218d14c043e902c8f6e35d550156cb41d66384d9f05ed95c24c5048b05f970f020a92459007647936a091b403a6c7212bf88a3151f3b003e76e7b7d8c02601c28c52b10790602e69b5130083827d9e16701e58089aa8ffb10e14a09fcd429768c78ac3261a50857f8acd4ee68618271ad4156032650d20b1d43081994412eb77b6578076df0390c8a4bba6020c44d414a099bf2880bfde5280d51d3900e937d0a3020c992c15f0d75f4d146025c24d01beed3d800c536e060ad0eedf2980aa4b1ea2d92f810278f45f576022f541015eee5101c6505200e904f8570550f5850228d0a3020cb9be038847ff3a55805bf20ae04c7c0248abbee82a60b1ac16146086f74301ba91f2b125c2e1e34501bc8b67055888f1a000de855c21fb6f37770a30c6f6a8803f439314c0e2caa714cd7e0901247409b6205a806d9d10cb5886d4de9c810d33e56c99c70c3a01836a803194d6958176358e114082a18ad29681f99fc75038729c03ac621c9cd10156e4bbae0234f3a102cc131605f0f2398f5a0059dcc2c7981b9083bb917b07a862c5ddab144c6c211f4b64408411678e70681f0a63f030508043534b0264d5de0520c17a189e13b7008df8062f17e9b1222b0518e94525abb968de14c03a5c1560092f4a1ae524ced5bd028c5a6f0064029317b43b007331558066fe4e01d41435f6d5df9f01889abe3e2880412929c030c318409ad7eaab0268765101bc8bb902348df8b6919c11b29c2ac0978b15a023d15300b3b554009d93fa90186697aa0218b68102ccbf040af8292f3b05e86a4c15f0eb7fcac796bdf70f7505d0b94705f02e460ab08e5e5e5fe217a6b102e4b153c0b7bcb8363bccda63dcf98a05834a1571263a3780b8889347f30caa32a1fbca4a98d5634506fc2e595d61d6ba008847cf61f10c4800d811304a9a91956e2500391a9e37f73880462b15c021febcd5510197347f0750952b5a00720ad1bc2c00f1a57870d80051e4d9460056a9dda50ab0b00d35f6352a5963a08abc45a61142947b2b54a134afb445d12564081d3c0570596e0a30a2985380763f0b20e12daa2505d83570558076aea6806bbd2c99ca281cc7dc71006f3b5000b778ac008a2c7948108daabcad28e1dbbb02347c330570cf730a90a99454828971685f073066400a30a3d95780651607059c69f51940768355170a60c720a791ecc4e0e0ae0ef06339d48f038822b15000b3f59507bcf1570568913f0164bfe9f949011694dd29e0a27314ab30e7674b08ec7c0088f8b44eafcd963f179410c57b8f5ba479a5cb2b400e637d1c64c5011c1c100a408ccc46190071363d0f8f0dcbe823374e00556e1a29ff04e0a379ddc70058cd407b6e5e73da9d9d6d15b036f02cb1015968e5be21400ee94a00c4e97d190188c3ba6c2b60b1ac5c15605e0c15f4352ef5a9805fee73a400adc71740933403107774fea900425704907ee5e24101868f9f14c061bd0790666d9a550005fa02680a2600a21ebc47c201c8fa8b02d4c748015a5379acec9ebc7f500039fd02684ea40a453df8944c07e09f92028ca0e514200ff92e12e7eaa5a6009a7da700cdeb4101542cab004b248e0012d62a7d51c08fe5dda461be9a2920ae758181f43c3d8ed26c441ffa42b522401e1a553a2ae03caa1b053c1c16cd14b09a7a3b05089f54121061c0bd0e200ab4ed03c878f2bc0220d3607b9434d2e35eba0a309e8c3c8cbe402b0f0ab0d76bad004d52ac809b82d94e01a26ac853b4150b15405ff02eda9f5b4aa6a22f8bb602346b1f003265731929c0ea9f070568d6360ae0c28d01242e5c35a700456f29c0e2da4f055871f70650e1b51bdebdbc2dd67d7ac7be020447aa2ac01e091f4082bc5d3d0518a48e14c0950c156033ed4c01dcc08a02e8add4872f2bdc9f14c0b59e2b407fff4d011ae0920274bce51651420eecec00be5c47017aaf4f0aa0d9f700b27df0e5a20033891905b8e506204bdfde1e1460a01b57c462c679f2312c14fd0c2620b80a0b25d991dae1cf50a88625f6fa5ed8e72f88b349b71c400183c31c9dd001ecacdf2b40bce0ba00acc80cfb0045a87af0005042f3fafa01504167d55f0384686feb7b0508ff2a409ccd39cb5841357b3f0590f3e7d20e401e913978459503ac400b5280854b28472461470e73055c8ed25501543d5280f62506d0939c3f146059d25a01b74087ac026cbb91c76a9f30ab001d898c02be65be0190fe5c65a90006456e91a6f13850808d39230069e7162b0558c6972a40137d07206ee0f35601dacaaa0238f045057003217491c400b83c2ac08059490132ad2840bb2f4f91bd2bb79102b462a40093f59e026c45b85300f31900c8da8d875001ded6538089e59e0278b05f79c0f24bd16582ea994d702196b5a3bc96c501b663830380c6eee0c7166de02f6eb3d90d2c16aa794c50e18aa25fc49a6f6e1a8bd54a8e05b7cb46a9e8672bb00e3d805c19bbe2e7000504aaedde01c889393d2eba06f3a07615a08083791f070072f4156c50517c07ef195798ff7166db48014cce49011b946b4701bfdcaa2b00a13a569102ec8a973c4a18fd6ae604c0bb383700cac8347804a8ca968803400ca3b467152baac9d9bf29c016d521807a06370570e0a70a1050089f414dcea1ae00b74c14f05378239b7d57dcf2f9a9008a7c015073b1059066be8ab7d5d19eb7bd0278f43b059c474d5e4eccc5ea4e01a62820636a0c3834b803fcd80f797dd1fdfb5801863b5e15405fa43e44b34f1505b80252a86aba9a2a4039ca0aa0fb030598b1ca00c842d097b30298e0bd02bced0c401682720499b054aa94b0ff855bc25239c14192affc5d4a953c873bf5f8d0f6b0542d16b09e7f0a1014b9ade483df0d4878fa9afa5cc925bf8803b5dfb8c64aba6be0ccc6a064449725b98872d8ff59a3aa0ae0d36d14b058563b0a30bb5256c01677df1220074b5c017cacfa2d9c0102b4fbcf2b80082357d93940823cf880719ba5acebc32d5feaf1aa00db0751f4488f8d7857802ef14e01c6719f1460f8586e9100189b0c808cd4bcce14408150a7a240547a538098085905f0d7170a9087642a6ef171a8009de6b502b8a30f0ae0c0bf29c0d69d910238026300e9accece0ab01e66a4002bcb3f1540f8bf00e691f1b1556f4f1f0a601d4a00a2a66f7d00d14ade5deb00bcf1b202b4c8218068e5c34601a69f0a0ae0c00700b21a3b7d55007f1de588136c2ee68346c3723ecf6114bc57aea0b2cef0b6d80f2a578b88d7c7074887e500a7c95399bd9c7228a7321d7c0568c5da0ad05df902fc72b5070558cbf2242042a62b808af4b3470af8e5a20b00a2127b5e0120c606a12d9bbeb28e29ed1700128498378e87657569a1ea65192e257939191da57d1d40263196890296f58a642ad180d3b6027e4afd1e40627596b30022fcb393020416382a808a351460a4f715404636df9a0ae0167f2ac01cce9d027489ab00410c87f543007a16e59302ac2cdf28407d9002c8badc221eec355500c7b9ac00a20d3955053add2bc0d8272980ce49ad8bbecc3f14a01c8f0ad0ad961ad3662d558061a80f05ec28d6470ad09ab2c929c7baa7190213cbecfd1a054b325840f5c296ae52cdf2014a1eef8a0f2bbe0c54f5f9335444e7bcd73c80ccbd5ed941aba88a55ba001528216f31730067823e2b80127e016c787854c0ef72b71610613c39520035952baad854333e038812ee593d74d3378d2b00a6c7cf57f40144090f6f0a580a6f02243e0c9fa7e500024fec1570d1672980346bcb67052ceb5bb94282ac34af0a20da2300d1ca096a5d35eaada580dfa572af00fdca91028c4a6e01448116630570f27600e206decf14a039a929c084cc178002350074717e55017a9e4f0ad0e0ac14604788af002d2101888a1d2b0ab81c8d3680b4400f770ad044238f5836f7f0da4007b80a1b4505503154612c0b641e3f15c03f954c750fef3b808c5df4d8c0568bb91c8e42ef00548b587ecb6f5bad668b18cb1901a025f4786d7158f5b30528f206a0e063453737e2d5a08c430f8747001fbaff16038822f3ee2703e212f6df72d1ab3a265dc25342d9377f7f528069c196028cd43414708d1d240f1f4e6f660690404d9b6ce9aa3a2db83d2860f518bf0294e0f4ee6702a4f1dc03a09df39613052c1ffb2d80f4c5662305983c3829e02a6ca282b4259c7c2880468d01a4599b7c2ac02d0b05f0716b0aa02f11800ccc4c560a30c5d95680f986a602e421994a3b773e2be03c9296022e1807cf72005bcca60ad04679003a5cda50807539770a70cb3380a8e969a800cb6f8f0a30280bf5883008e9ad1e14c0fbcc2bc02dc8431bbe9793028c5cbd01c886bad34a01dafd3980ac63e333fd42bf50e4f3c5e89deda9e90162adc23b17ccaf660b2c1f1cd52bf4033986984f56b0928efe5ca724405ab1aa026e4e2a1d001fb7c0637367a173d3f8a400a33d9100ac44f0be003fe5b00408a0a6694300066660c6dde9cf0e70e45a0b104bfe8505d73c43e2398600e25b36470a30d28b77d1c1d0f95e01864c3e15c061fd0090ced9f2a0803f5482a27f4d40dc2b8068d71560d9eb5801e731c90088a3f870af00f31e730570695f0044a3266b0550f59d0268d45801d6087414a0b1904c65235b3551809670ad80334dda0a9069570167cae7ac1a20dbf5ef060ab0b0ed51013fa5b55480d7af2a808a41a4cc43b028beaf00870fec156069f54201f4f65d0174aeaa00456745f67529e069ad00b75414e09614401b60b9450281dded156070188f8d65610a9f5c1cdae8599802677361e35bb07a74f829815f92b8a37700498555ac751420ed2dfb0e813106ac2fb074418853bba8b80708a0d981a700cb5e570ae05c0d056070a7d35680558c6f0a70a27456016bd4610110ca4cd14e016254e505c03aa47a0b0e3cc59211534e5cf1f20a906011451def629a68b8d6730031177cccac0112729963ff38c09addad014888ae7d5b01faa69f0ad015ad28c068cf14405ad3a4a980f3989e15c05c641440a4460052634947800cbb7c0044e803952702c4187c2ac09a3cd458242176564f0ab09df2a8004b23fb0ad0ee3714a0a4cf00a284f78902ceb4df5480d5c7dc270c6422c4bbf31460a0ea5101bfcbed5d01dcf3af5be09e6f00a4797d3e2940492152b12c28eb95016478f09dcd7858cce458e8b024d1744e0b6cc75afc9450e3c3b4f9f5c32083eeec8e2b3914d1f6ae5d0518ecd22bd05672d06e07e07f9c1460a52ccaa103aabcf6dc2a478c55bf1e400ead7a6b0520272b60bd6518610b0075250f39f3a07451c08fddef1460fd69aa0003aa78396df8165705508fa6027efd640aa063287b0011ed4956014cf02740246b25b702a4019e2940d7eb00209db3ea9d02f492e40ad94afd9c2ac048cda70248615701675aaa288068b39a862a96f778db58f7243e288046d515c0831d02c83a94b78a0238bd5c74bb78903f43973f5454cd634aefa30a10e4398f01bb4e915fe13502d4f304f0ee38afc5ad5824c78a786d96f52894732379679b0172ced965ab00a6af2c008d45d852c079549b0a58f8319d6f018ecc3d2a606dd85715401be48a18d3829ea70027d4cd01124ce9b5b87f6bf7356233ed08a00c6d680e05c0f2b7b30012065f2a2892d003a59502086e4e0184bfa5003e5d022051efa71705fcd8cfa1026ccbba538051963e80ecd02d2d14c0d93c2880e9934c63f4912b520ee925ad360a30142e3526c27f3754c04fa9ad1460e21079a8d5ae2d15405fb20a30e38d3c628985747d5780700ea40073f34705784a5d0126fdc60aa095a820ed699d2e0af072270518fc230550e447005954524f15c02f44ad8b93e7ade4f565b94797f388f3259ece270e4519c6a57c965b8f57ce23ae642aece5dc782c38ae96798a8206ec16c7419e23d613fcb1587d3a8e2a6a4084d18d421740368f5e5702c4a76b29c0c8e64101377c77728becf7d8b3aa9b1c586f29d300c8cb5160cf02d046b51300592eb6a80248db707b0590f841952180a847f3a20003884b05581a29b744580a58b9294063d157801e4e4f011a9c3180d458d21520ddb79d025cf1ae00ef224f91e8eacdb302e4b1578031fabc02bc0b3bac712c81486b5b0518c66e2840dbf0a0006219008846d59a0ab0042fa3006b8c160a9007be5c2ccb91ef2e0a2074190528d84201864b9f146010a106202bdd1aa8a02f0582d0c5b2b678b306f0b1dca3cb1637918d17c421438c7060a51b95d600d8a7e5ddd5054488a9c25a994459f45f2eb102d6dbf10b4009a01500489c3cb88189ba4ead22804c1d75500e15dcf8ac008dc54d01d7471b2fa7c3d8c9400196ae90027eb9f80220fdecf8530126860e0ad024a500da8bde2a80eb345180ae396a2cce60af68f959802cd3da28c028fe93028ce4e51440705b0af0a1501f6af9af3d0091c25a5b01dacab902344992a96c33a90d14404de51611ba1a2a28965504f7787d35e3af5d00b8e75ecbd55894d1e026fd1780320c7dbfc62028973158be67a05df31e01c8c8f77d0a20eba56e55004c3d13b795c600cbe6c0e8aa809b936b5d017b4ae42b405fbda300a13abe32e5b7e505a936cb08a19f2f007904581ae35d8c7af0152d0f40d4a32579c89120ed9d0296e4561740025db75f1420535461243199ba370590f5a30296b1f8a48025b9252f273de0495e01f24815a007bc548021f93380c433e86615607cec5301dfd28a19c419593bba5780f1f58c02c8e95a01c4121f2a96bd916f630568d5470aa0402180447cbcf61570d15fdf14a087f3a1007e90145d764fdeda0ad0f1c6ebcb6c93579b2b4087660020eb6039e69f01b268a0eb9c89285ba814b04a2d62a06b9c1fb9c6b2d56c9185ae170354b1f77e882b82023a342796f5ac9543167e641ac90ebb30a30007279615a0adac29c0f04f51010699e429d2f1e625de0614384486172f01ca08acd82a0048548d280f20663c1902c8c04ce955016678c70a60820f00127327be2a401efc5db22274541928e077f9ac2ae04c47150015baac028c9ecf00b4dddf29e0cfd0682980487d288068770134c4f045017a27be02cea331560091ea03c8086b230110a1e320d50688d08da4e8baa31d054be440cb1ecb472e1f663181b961502a9658605e2300590af8c89f21572917d8e2b6582c73d50c82ce7c709de6fc0acfe1781cc629ca0585121bc70f367d39d3e222a40c7fa85c849da01e9f2262400eddeaf346010e4b9f29e0725c2305d815df5080f5eb78ac3af03c32e1007b4af9214005c2cf8e8001d5180b85f1fa911e3e20451707fead0810c9a4ce550086a15e0a0ab0d6290720c21fdd2be02a8c1e00c48789b20a30b2c9e622174be0def8a600c28ffa50f379bf001049aefb0a309287975339bd8b14a07ffb04807d05dea9a0005d0d4f01e4b40620fec7e90ca0db7ff0b163d93f77ca29c04026e791afe679f8c7eb704b98f7cb888d5d67cb9f575bc8936d068804f161a506e42141c750010f105dde14a07df902383b8e1470adf301b00e70c10e7b055c85410c807d27c4276d3a802dbb7245112027798858b605c8287e5b6e913868ad50013cfa0e4024d1915f00644e2b2a28e077896a0a2096f2722285c95c01bf5c74a7004d010b4c5e3b78d14a0144bb08205e705c53005b98028858de06007a28d58702bee28c7751e358eb03888cf18210db751791e2fa2814ca598c17b2a12f5473557658f9f88aa8e0e7790acb4bca00c5123bbd7c1c90f990f04fa9120314205241a0800decf945017ac025055cb0c3074011dee7b60320ee282f6a35a082b1bef64400e4e3fd0020e12dba1705f8d84f00e2f58d170af8bb4437051007b6eb056d4d2b35008d3e3703905e745452007f4cf2c88b17bc51806fbb5780a74c0164f54fa9ac00cb2cc60a6050f029d5e4dc860a200e7700b2eeb3f6ae008b9f50a7b1ccabf758928b19f31f83054090618382b6a198cd67794c9a436345c57282d8b63d366cc54a9047b05b2e695167575aecb2146dc789011e2b868d4a3180ec19892205581bb851c09f81e75e1de0a7ccef0448a06bb90223025ebc5180f5b87245198de776a5804d4ea1055005684f0588515a02a8d9220009d6d0f5006412237a66a09b8cbabe02ce74545500a3b45000f9d803483cfaee58015ad31180787df19d02b4a6728b6c4f6fdd29c0720fd4472cdb5d2a130578caa702c8fa4101fa1e108758a237f04e0c0770c516408690ce450510ed7b000d9022b7c8bed7c645015a752e58a9902d60d8f6042061dfa7acd9a56a8cf9fd3a3bf0258dffd1c22d5feded12a008c3c6e1f80d28495fbda100ad7aa8004ad804a8c60815f60c804514d4de2ae097ebb0612bc93635ea9e15f0d76f7f5d016b59019041fb68ad005f3f0090e0bf9f57059ce9a7af00e59828e03cde8f0ad0c391728861eb661460b8f40e40c4e1b65280a56f7d00594b5bff50c0edfef9aa00966eaf00222540e27f9c8e0a704b4f01be4b01408c63439e22cbf84e7900190a5fb3092e25392cc478e7af5fae06796c21628129fb19ec181ab07528db0897fcb66c3ecbd2bcd247a0809dabf60900c6910a6500d98a705d2be04fc93bc91d6081696c14e0d8992d00d64913075773009de692027e39dedd62b344988db194c3c7152db94516f8c70b008d60f7a400e3eb4d8038c629996cfaca6ad83a2b00895a1dbd28802bd957c0e5f83c28c0d805ea435be4a8ac00b77401649dc1670540452a051009baad15701eaf5f00b748397497ef4901c683860aa01e728bc4526b4c15c0b0c953641d0a47e48a2ae5521942c71fbbe267798da20749ae04a659e71ae397abc8803bf13e60f3a9659812a34e15ed593c2f0144e8f880f1c8466ec55ef350010b5d3daf00e714ad1560cfc8bd000438b89515f0637dc9a30ac10d7b0a20a70f0af85d78d7b37d28daeccd4901d798d7000890c7f35000a6c15a520e5900f13c0788714e730b752aad3a7559b32b6aa49b7d0069913f2f0af8dbb63300b289b57b52c0998e7a0ad8ae17730ae09048a6e27dbeef15c0e9ad2880e54f1540f8a5e812fb381c2ac02d27057c4ba60320abb14b3d05709ce5e5a477f2863a15f349032998066bc0a78c6525249f771255c53ff550a7d542097b349b6d803296bcc38c57652cc76b70c1aa41318036b0fda86a33dfdc0248e4053e8dd100d9a3c927b31880f95b2ab28752b5ff7325cf15b0e90bdb0ab84ea922204664b09e02443ac2538c9c42d6df156075ba27003eee3a0720a7bb64ce002140879d9aaaba0a9d370568d5ab006271474d0011bacfb3021687ce124082fe471b05c8b4a580553dac28c02e9b0840967a354f0af0d8a3024c827e288017bc5180bebadca2dbb13d05a8d3170528d84001b4a1a90072ba0790d5c7e79a022ed8073eb60aee1a9926050cdd34d9f4593f003236058833dc1434f9ebfbd94c16b2ce3566baea70269afcb6beca7a3304d0487a784a2983ee7d1d404261d380bf8baf3dadd70200ec3ab55f017c48f2255400ebd051c055c891382d80199f3c28e0d7df5714b05d5f4f152014f61e402499a3cfd987220f0cdb5ac01dcd560f408e25c21c9f5df58b25453b000928d47e04d0c329be0096bfbc28c010741f40e4b498558008104d05c83452007df9ba829fc247d6455f8b8dd1d5f063d9d6d93d2a80811d2bc04a95910218e996027e4a360190a8b3e1450184ff55013cd854010a860f15cb969933be8b7a286ff8fa6ac61b6c50822fabcdef12e8a6de6619a092c7ba0bdc22db2a3cdeea1605c6a5877ab0d005659f4364787c8c791454cc7f5ca76ca5822053e4823db23804b6c7cf79340060b589374abbb329b0c7fba8008de717408d751560aaa42d00721adc0384f02e38f4b3cd0182cb31881ce0a2e7a51c3184bfd51720634ac854bd8b720820de45e705407b6b75057037c6001211436a3d96a83cadb6028ca03d28c0c8c45601a65a7b0072b253f4aa006e4f4701acf68302b8e72980c8faa8a5004d415b01ba1af2721225a03553c079bc971540f89f01a44f186e14e0db9e15a029c82960d10edf0024b0c0c7044016840c216389cc1237d9c0861230c6e375f4918bbfc680bb4da10e55348b003254f1cabe948bf8e09e72875b4c2385232f79042df42b6516a921ae080bd81cd8e48e77a82e7efd1340a617ea2700b1fc6ff700500f2a740042a847e02be0faa83f2ae0fad84500d2056c3601623835e38b002850cc2da1f160c4d77e00100fa57d05100fa5bc5500338ed757a7b75301809c52db5780457a0b05988c4505a958160b0a10cc03df45852ed3560019ab2a40bf7200a052f8a100663cab8025285c0348af31bc2ae04cb352413299928d15603d4c1d40e4b4271524ab2a9a6ca522b5da0daeb1285bcac27cb2aabb510406fc6d2311296a97002258cbc54901d65d9c15b046915e81a9f8cd44013fb625b788c034b302e4f4b0b6021e43e18d7d6eb12dce79676310894879f11a40f6adf1ce7a072030cf002a41730069d55b0b05b085ef00b24fbc9555c04f197f28e00f552a2a407f6ea9809ff2da0028a193d8fa0270699f144070cf0a6060fb006508ffe85d019763842ad4a18ab0ae004326a400c631a300d34f3b0019aa0805c80aa28f16804c0a37b83ee22fa1cb03885bdce02a8c73951c5c05b6c9b186d76ab222c7464c316c3b07901500bc6edc80a804c1e5463c96c5601eaffc33050d7150f11bbf7e2c924c1ca0cdca2040f1a0005a595680c5936f0260faa8a9800bb6250518436903247004ea4b0538838aebd4380a7026b64b052c1f1c4edb2a0724b93d00504b375500d19e2940148910a08873f05a130510ed540176a67c5d0167e2a2007a5b019036bbfda900b7bc2980db7356c02585e7188b3b4aa57705f82e7905fcd8e2184062a7872705107e88839acfee4001346aaa00e3da1f0af0f5b70032381cee0164a3c10b0437d643fe2052a693c846a9c157245fdac05724d962166317fcb6492e9b83ab40001236a031040872d8c7c7af9f14cb45f6fa7a0076d49ef52514005fbbc11a95886bedc1b0251a69a0cd9f21097258e13ee43a4dc24a95dfa5790f2041015e9087781734c22dea5d74f20ad024b50044c5166780042ab64805a0e779d754c082cb270899bf66a140d07dbb981412f4ac00fa720310230d072d51235d7a5280f9db9102f8b83b05e847e1dbaaacf71a006293db2b05985a6c2a40833357c04f1975004470474705e802e233c4128775ec29c0c77696ce59609c45d162605a75b6853cac6f40806ed3b0c0c0fecf66eba8008b5a5f14b058b20d7200562a5480e584cf005918b6ec8b0244262d28e03c9a5fb7e0089daf5b5870eb78b938874c79d3840388f37d51003bd60150f9e802684f3c0190f6b6851ad30f35de2a803b7a52c0e230f601c406b5470ae0083c2840ef64052063d2414e018cd250018cd2124096d0bce1534a034c23e491c8028877d77d8bb39962863f65a3c1c0581c58980e4025cb95dce0cf90cd957318837d639037ffb322cf1914cd7f2c523306b226cf7bbd322867ca18339830a8f81534f3784ab55ce5a770a423032a559463c340377ef216000362c4a367cf31ceca414ed46b33080b72f6d300a082e3e6da770021b6dc75f0fa5119790c91a918256ae016fb3f1ba5960298cf2705ece3723c7a07b05cfd1e4004777354c06259bc01a8e7380410a16be3f5a5e1a376a400cd6b5e01c6940e006250fa7b0578ca8702cc01af1540e8240f8941140c14e096ad0236e341154076e905a8d358c28e8c4305984d902a94d6b4c16a9ad3c6931de73857ca2138239f2410e7fc928f0ecd12a0ecb331e01da906544b30d2538018820b739113d347c30700982defa9099043ef84839b38c05724a9022ec7baa300276fcc146069c218200f5b98192a40fcd3a202968f7506a000c356ac01c8447bf40150c61691a2642abd82e255017ffdcc4e013c7acd03dfa52840a27b44926915b1a0c7f70ad0295a29c0145641011aad470590a08d0238799f00d2ce8d760a704b49014cf01c406200047d0590c29e02ccf0b601424c5f07f272b22f3a24057ccb8b3c5696adf1f9950ef077f92c2b8024b3fdc87fb9812c74f9ac1c6ad7e04f99cf5573dc78f21ac538af2e1c0fdbc679b5a7ecc01b80e3b3bc264b615ed706f690875fe065d1d46d01c4459c5acead693ec8211663e31140ce2be0f05a715e36c4788d2380c4626cdc00642b24873a362046c8d43aeb6d5e6724ae6ca5f2ea193ce1b1aa51b796022e7ab10f007df1a250018e532f28c00ab38602ec5cca2b8012ae000ac80336c80228e1bd02feb67c389655520c338ce51631c1e3ac02f80e190510ed11809ae09a0238acf27222fcef2b0510fea502ccdf4a8d8968bf1715604ca904201bd9e0a0e51399befe44a689aca46ef0cb15be0497eba3a043487536f48552a984c11df6a50ac6758014726351f0c3223fb6c74a58088a087bd6c453748b7b03b7e8c866230090617d1e4e3720c25ef307d6a8827ab0cd3a00da6cba2b008848bd9f00c404f346142b0c1087c70f0568e6fb0a10f2f05e01d65a070a101b6aa500d192080012e435e48a129cdeacaf0096ff0bc08c9f0144c68a27059031a90fb5b839057c4be65d01763e6e00b467315600e7ea1540361a8c030510dc7b05e8d0ec01c461edef14b0610b260a20a77700b281accf8a5c4864934083f32866f258d4ca0706c5c56c358b8ef71620c8f2676870035c347760b0fc034006ed79bf585c2c1764b7205bba62502962c8b50900ef93fa6c718b61e0e353b2912eea2a82c62b8008ee0b0aa6eec6e8062032b63b28e08f7d9e001471453856c002537f5700b1bc53803dbc6f0ab0efe4190022e5710c449b0384ee6304a012340490885cef790510a9ad0254d01a2040d3d87b51805ed29d023c65a9008ee2a7023824f700b2bba5f7a60022952840a7081f2a96e80dbdba0294b402209bbf0690b12fe388a227b266e203e290e8fe289675eb9e22862aeb6da990c7be24de261f9774dd16472536a054861412801c55dbe903c4258ca170394adadef2aaacb8a4ebb61a190091423e6fcd7c6a7c7d8f8f26b10607eddc71a0808bcef3ea0ea035ad2be03c36af0a30ae3d032843703f7600e2d3152a0062618a4705fca13ea460b2833bb351801d8713057c4b7f05104aa768ad0022f505602def00648f370d14f02d1f3505dc24d15001c472a3006bd0e60032c33b3a28e0c7668b00b25901de4529c954b88d1a4d0174e54e4601160b3e036813cd4d4159477bdedf004a1934c06c1d4c9708e75934b960659d35e7c8e8e6bb953186328e15c0c75d296071e0d35d1cc0087c0220f663172ac0eb4f0174286b0220f6a3480a50c97905908f4f006970327b0508c2930590e5fb83470590a0a902aec25506208ab120f52c003334fdac02b4621b0570f24a0ab8a4d511807cfd6aa800252d2a802497016499f88855bd9cc892803701b224a05754009fae0e20d3f903649ac881c90dfeb695afe19f05007684780d2e69450fe6edb16857aa5559a4c7ed6dc5cff938cfb30350e5196f1ab031a8d805200cb8bdad8459388a757658bf16a4729411036470b8fe022083c36d1e11a8c459b9a20280a6913846a601257c4ad4584545fb8872a89c8e13052c30bc7dd001f8749e022e473d0750c52ddb9602c8584f008cc1c75e0104660420c25fa82a807acc1460f1e403402006f624005dd18fb302b61f85b602346b9a873ce55101a4505e4e9ad7f78502e4f1a4002d615e01f4f65901f43603202bbb3ec60af0949c02946309202d72ef5901863be4f5e5f4e3614601849f3dc74a226b253ffb0ab0b22b50002b5500d0761faf9fc892b3d10040562036583daa991c5b5cafce5f5fa3347bdd1240c0339a746583520d72e8cdd79b0065846d6e72f35ad52d55830140113ac7819d0d400c66af1e0088b359ef02c89c27c79435522a66fc290f50817a7c9414b048f1f11556d221ebef5305ac1e18d7b6803d83dd87022c09781190e06da51c3e7ad1db8502fe72f94701f850c3be02785b02441b0a910288e541800467944c4378c11f4701682c8abe020c978e1570a6c34401dc510f4024f9a3a00092bc0510cb3fbe0390a5e699a3027e4a3fa300ddfb9e026c5185382472bee9c74d01d66be36db5f5183415f0534613005975f39128e04f596771f0757a9277f8c7bedda6c7577063e157832ae7c141de623f082b2cc9efbe00ec90e1303db11f0618e77f6329f4d583ad7700449279cb8c918e02d6a1b4510e23c9ac62f53680c8291f3d61250c32c6db291de04c9fce0ae0d24e1570256f9e0540709b318008dda6270081afb25505f050d60a60712b0a60d777002296b9910088e5f00be0435d14c0994801c443193c2b80e0ce15a08d9a29809ce233a8cb923928c018fd2b40824acec87711c1cd3e2be0a70c2041896c64cbf415a0e8a8d304f12e683856801101142c91c560c3270059f8389e2940150e14206a02842e91c1f2069b8b4027b9ea5cb0a092ab20f037aea804797edb1be711f8121abc9305f07901370d16000956febdb1310802c473f4ba3d8048da06641a667010dcfb05a0524673c20e7ca0a3a3ed3c4041d463a980259937a01a50c21416cfefc7816a031f5c64e518925cbb2ae03cd08fb2806b8c148819cf0088e066bf00846e2040ec58570126db3e00c47ce6be00ba6f0505e8f2483962785bef5901f8d8f90705e8de2f14701e316b835dd589487a4d0528d8238098cfcc4001d6081414f0537a4f0ad08acd0064fb4f7eaa006f3b54009f1fefa2a23dac2b8068f715c08c8f156049e23380ac701fd514208fb302d42977bdc24c908153c3cd9a3bc89b3f36bf6d58295610289f4db00db00dd1662f380c8a881f04d13676bec8767d825b8200ad0707678c4323fc9ce9031b14bb9814b31a2c0ea13af04ff70022b87c16a70bb4c82ff7325700dd6f2be00fb54905f01496b7f515b0660f1700621c735700e9de0f870a60715f14f063731705b0745f79c0b03d0188f9ec3d2a80ab505480569d453b540f365b5600ab9d2a8087224024b99457004f7a0a205b87734705b0eb390568c52205d0970d802c35cf4f1440e84e0a60c69f016465c6e80bc07e6c15c01b2f2940cfa20120b3e6197cb94417e8421c125d1a3954008bcb3e4c640c3d37057c7c676c37d1b0d0f10128711454b0598103e818109531ebc5258dc23c4f3d7bbc98348e747f656b0810fa58d6c80213199bccfd97a7184024f9980590ddb5ad9e02cc469e15b022d70a02303bbb1e2b40732299c27c7a8d124002e77b3c1120568a1440d65f15401cb8ef11a958f60b0a30b8330010f399bf5780b902bc7e22bb27c73505dc008f7b0ae0c0470ae016a3e8899c093a4a14603ca8a800db194205d0db8302146ca400765d32557b9a2ac0c4b2e4214bce469f0a20963300d9ba53e782c55f9bbf0074810cafea8c8d2b5d429b7d0710f21485f7c6de671ce4038ce534012a388f8f774edb458c15b80a6ce8e3b0e8f315bc6c3e8ea33c16d974720072de09ef2a31e293414010de246080d8e4e11240bccf23f2d036fba5aa00833b0ae049af2f0a787eeee31540c472b056804ee2a702b8d63cec62b244a61f6f0ab869eca392550ab3a1027ca8028034e2e3a9024cf9f615402c4305b0c94b057048ea0022a79f3d055845102980279d5780824939c45a66b30a602d9f0064f7e4a0a000eec69d02ce63b055c079e47a0a3099f201207b68388a449c88587abcc6d980908f32f6a6fcb6495029a01c63802aaf61f5920a4080ad90130f2094b35a438008b7d4b98d4ac20c47f3f4ba4f00590423ac9f01e47ce4ce1d40a1825d3603001f5d515ee06f40ece39c00ae8f44057785c7aab57c1808805bdcd92a8009f614f060e8985b8f44c5721429803bba528035bdc8c38825673a7c53c02ecb2854801d43af0ae04cdc005470070a30ee505200097a0010b11c3d2ac090dabb02d8d3bc0234e22f0a508eaf5b20c992a99c04ffda5380f14248d097e0de2b80178caf9fc822ce9e93c244d7c17aefc4a0e2635298174f261935b01cf4df00bf8ab1ad37067e194bceea65001cdbed759b0c82a08ca51a788a115c446fe80344b26ced9381449df5f8240103f21558dc3940119dc4c683002cc3a9d70064473bef164c3251150b1feb28c7d768e033031d2119ae01c4fb1cae14f07739e619889c7aad8a026cee992960d1ae7e5dc1923c785300cb8fa2ab240f360af06d0300ed14f90ad022a33ebea470a2001d4d54a13a8a9f4500895254773a9764cbe532be3e7fdbac7c7d7abf31084a5840f57e6510e6f27cc5a00be0c3f4b55e014c2df37741a651b6ca8fddf387cac6e532ce5ec02d09023b7bbb910054e1b100801af3da3d056cd8362f0af8965557015bdcfe9b02b60e83ba02b495f2d81cbeedc3a7027efdcf9b02588744012a390690e9c92e972357cd603bc3bb0750cef3eb77df01421e65f1ba0f007228371f0b90e48212a6c0eb3700716a38069101724af7b4051022726dff0410a12b3aed2a80471f08808bdfb902c418c8e40876492eccb2cf4ff79f00259c43d3c2bb981e2fa6d18f0091cf2fd75e308844d5790faf012509a69e01f003ac71468de91ebc0e5edff413f0e5f8dbe6be06ed59d673fa296b5f80e5e3f35e01ac764d01be2dea5497378492876c78789b02c8f6b03a2b72be52468d75ab006271db1d063e8c2371cce1241f64e08ef2d237034a18fd6a9f017c6cfe6a370042118707015833f1f1081015b1e61b4f8972e2d24e010adc17a3b7042041d11b0706bae69b376f1810636a918fbe4af26ac78e25803cb49237803880358aa102968fed9302ce9402052ca76101a08cb50a7596a0820c537abce92a29d87027ac2f6c820b61b58a01f737001fe170fb678050569736006219c54f15c0ff60392d445919a9f954c042777f0128c0ebe3c35c92429cc3be133e59c1006981de2600a2b7bcdac5805896cdb336148c714497b80c8003b5bd08b768f7fe6d0620f3a65d7eb962a55ac177e1972bfa65ac40e4d3b12d40e79d57da1b9060a0aacd9fa12852481cdcd58008fe2907333520e13aa587b1005887ce9081a9530c98b175284618faf5da0490c3aec5267fece2575f9d6baca82d32871c32403607f209b9893d5e1dfa72af004b34cb0a7072e052014e11790790298a3adbc2d2d78ce606a05c40f8c625408285f55dfe0ca5c0c706f64106202860add3274052c6be246e924ac6c0b233d11b01944a90e41c4050c60e990240849d6d1d7edb5294a9a05fc94d925d3183c6134f910a223ea838b161cf61941a00b2a0acce7994edf1b6fc722c4165df747ad833c015411e4af8fe0c50c45c418f1b9c7258c23ebeee4240057afb0850aee080e02780b08a6e138b65392acb3054014066ce3a0f0009b6cc743e147039f84865a32d38a0cf8b6700b2f080432e1b200b64eaacd915dd985367e7aa221b2f88fb51492548d0bcb6f8cb55c20226b839ce6652b17b0eb91c6c3eed715a28fa460196ad0d15f0dbee9f01aaf8b61c4a2ea9fa15194fe697ab0619b4ea1c7ad1802a62880cb99dab86592c4cf9c02d610edb2939649901314a7a07605c3834c0598012761bb73e0022015d0570cff9db1ac387a5a21cded3349d32f2cd91f30d90837ab691026c0bcf03c809a8510220ab3bde9a003255c2e725192145ac2c7a0f004a50428e4f976840218fc32818809d07d4fb044850a7f5444080a7b004f95f1d1a642a47c353af0310e294dd7b6e81fca8e2c37eb0c0f8b10f4f894f88312080ac736034f3f2595cc151340dc8e1e54e78b944c21572583c07f829bba30228f21e2090f9b967055866310790a923de349104a6d3089f8ebf7e50cd61269157431950c016f7ee3d4080fd737516cb40bb9175ee02065f2eed1ec0882e5bba37008c7f50ff09005b99e87611208b4ab8b108340e5a7d0a20ddc8ce3b408077e180750684001d96e4c04605e02f370648d066ef518e385342ad37012ab0961d142c0ea5f5e0ee8a1520fe2edba2020427e801882477f9538695085b663a2c856135271d89294098878a719314fa3e82fe77d94887a68986d021d3308f5d8bddbc000e2547b71240b5825a3f0284924706209199007edb30ca634d6f370208b131678072c4250c326db93e427dfd2e324de4e0a2f6bb02cc04a0a44904c1e5fda649542960191fc7fd32a09c457d9401c22cfa1efcd8c8082e5c8503405e04b70d5010d19e0094312dc807c21850c9a1e835001fbbd1bb770022fc1c293e89fc0ca65b38ca880159448fea260a50f435405ec00aa082c1723edc26b111b820b8dcaa47a6018673550428a1efd17f06488af0a4f1b621a2ad51ff01a08a48146d4f01aa106f1b06b0963556f5c8341618b41f0314441cce02c41d6d01147145e71320c630651b951c67e019f47c802c5e7f8f92c645acd91c7404b0374e0f47802a8e576bcf017c69a3501f464d611dce0ad04d6077234a0a58cac387833b0039bd02c8c8d5169926b2923acc29403966003116c5bfb504480cd50040c6a5fadc36c461195b337a214055466ae40a7c39bae32f174725f4f87a7d00983eeab3dec6710edf25e466de0df5f2dbb20936ee471527a1b119b71616ee681b202e225a23fb30499829a2603e401e667c30578005769e020c433d0194c587b9010472aee80c200418561570dbf0f10010cb151505180dbc0224385565c8f591443988f60d5744058c8ef241701644c8b40c502d637c0c6f1b69fb921580a011c33340088ffee31e0033ab34182ac044882700dad0477d4431aee8b1c02471210fab7d155081917e054864d08d3d25fb1fe6c46305ee8a6e4addd473c9efa68124dfa5b09b46dd34eea649379d386e2e9b76d359379d77d345375dbadfab6ebaeea69b6eba95b4eba6fb6e7ae8a6a94bc76e7aeaa667978fc9e4d24dafddf4d64d6b2eddb9bf72ba77e9c1a547979ebae973377d71e9b59bbe75d37a376db8c43736dd0526b55ce27cda8e77ba69b79bbe77d35e37ed77d341371d76d38f6e3aeaa69f2e8dbb69a69b66bb69ae9be6bb69c15d63ae2c76d352372dbb54e9a655f2c824f7c333c9fdf0c90bbe93c26f52a4dc556624556a7f90179397b887229137f9264d5d9a7d93e62e2d7e33fdf2db7d25f2962ead5c5acb5f37e46dbf49bb6fd25ed2c125fd6b2a7f3d927722efec92f971f94eba927723afe69e653e9679977b57b15c3053930f2e3d72c9c97b22cf7c4793e18bb992bc57f2de5caa4b6a90d724af455e9bbc0e997e91f74e5ecffde893676a6fe8c8077923f23edd9fe6f75808ffce9097252f475e5e5281bc22792597cae455c8630d3495e5934b1ef9feb7c9c80af901f921f991ad177381b9cd8fc94fc89f903f257f46fe9cfc05f94bf257e4af6d322fe36f6c86f633b8e46fc9df91bf27ffe092c9ea48bed1962bf967f22fe45f25dd5caab97447fe3df90f2e3dbaf444bea9bbaad32b73d90bf9afe41b6d313fea4ed0c7ac1b46e0c86fb864326f92df22bf4d7e87fc2ef9efe4f7c8ef933f207f48fe07f923f28d9e94c81f3bf528383d2f596214c0cf909fd5e4cacc3f8ae4e7c8cfff562ab8549454e2245a11ab6e481a7c277d7b0d2b924b7ef93bc97c9daa4d0149f2dc5f7d9becf7f5dcb77729087ea11b41f895a012875f6ac88182c8fe35889d3e9c28482898d84f1f4cbf936614cc29307a5bb562172cad2099526939ed0f63c242f7c3a44f0a56f24fa6246b0a362e452e6ddc134d517714986298f2a42e1ddd9fa63c67f7a7f97df965baca8f1b05350aee28b897f4e0d2a34b4f929e297871ba61643a7875e94d525d52838226052d0ada147428e8baf44e418f823e05030a86147c5030a2c0bcd5d895d8a40c05590a7214e425155cb6450a4aeecfb295d4a04241d589e69842a2d073c9b71787018521851185b1bd324cac3a85130a4d9395a37046e1dc25f363e1f4a145e192c2954d10dc12856b97b3c97343e196c21d857b0a0f149aac8eeec789c2b37df1f062252fbc5278a3b06693b9d1142cbc73f9dcdb72860f143e52f8e47e707a16f59314be20996f6c950d6a40e12b92d158956ffbdbfed55e200dc52f15c3d4c3dbbf26bed254c86fa7bad3f9be53fe9e9880be330a3d0a1bb63ebf52c3a9c1f6b7d2feb753d8a4d054b5f9221d9bec57beb329ecfe76329a6354287cb7c9ea528cdf610f65e01286aec096b45d1a503874c97c8211859f148e5dca5098a5d00840de25533f4549e6339529acb83fcdef2a45449167ff34bf39d9df15fbaf912f39e4ed6f9b028a4297cc8f88ffea74238a294a5c9a4832bfa714cd289a53b4a06849d18aa235451b8ab614ed28da5374a028a5e848d189a23345178aae14dd5cc9cc236b14dd51744fd103458f143dd93fcd5b45cf2e99cc5f287a7522e852f426a94e51e3eb23454d8a5a14b529eab8d4b5ca13bd53d4a3a84fd180a2a14b1f148d28faa4c8d4e0d4a6284351d665681e6aca53a0a84891a9973245158aaa1413c51ec5be2da1b102714071487144710cf588adab633524f0d8d7a27862d22f9c1fab2d9c1ebe4ddcf8389573579a860b32fd60d50c9ac6e9e2f2ffd2074dae66fa144f7f2341747e95e219c5739716df24f3d725c52b8ad7ee43b8146fdc5f9b48f1f69bb4a3784ff1c11a69ab092dfbc3fcd5c254b46267cd767ca4f8e44cf577527ca6f8e2d2d5a59b2453bd7714df5b198b1fac85b2c4a4478a9fec878e9f297eb15217bf52fc4671dda586fb6d922970cba5b624734bf79bf44e714f92f9dd173270c95c30942b3b2e7d503ca2f893e231c5198ab384a028719ee2824b4549fcd712c565972a145729214a3c4a7c97024a424a224a624a124a26944c29995132a76441c9d2aab279b76445c9daa6c8bd73b2a1644bc9ce564ab2a7e4e0dc928b15f12475e948c9c9269680e44cc985922b25374a6a94dc51726fa5dc12f34fc6d132dd983c258ffc27254feec73325e6d1af94bc515277b6d63cb44149939216256d4a3a94742979a7a447499f12f3f4a1fd48c9072523242b670994c4b4ec4e5528f9b4c9fcd0c4e45bc8b7fc264473f44db2ade57752327629e31acf5fa6244b49eeb79311af246fc5ce9a0349f6af532453f3dfa6a420a98864bd03533f254aca36b126f06f0b2b3619594faa34219a7834f15d0abe93429a442ec534495c9ad0644a93194de63459485a3ab2722af14c93b54b1b9a6c9d4a94a11b939d93e3014df634395879337f4e52242b7e861c6972a2c999261797aedffcb8ba7b6f34a949ba3955e9e04f93ffe44e9ed271ba31b9a7c9834b8f347972e9d1fdd594f28526af3479a389295983264d9ab468d2a689c9a84b93779af468d2a78979e4d0e9cfc2a6c9074d4656e9279ff255cc5d639732d63299966192a5498e267949059a146952b2923d29d3a442932a4d89a61e4d7d9a06340d691ad134a66942d3094da7349dd1746e0577ba80a841375e68baa4e98aa66b9bdb7463956dbaa5e98ea67b9a1e689ad2f4485303cf5637a6179a5e697aa369cdaab1f936a6b4ac21267feb4534dd53e6eeaf3d976af8ebf44ed2bd4dc6739b3ed8a49ddae9a373e75c9a3e59a1775d1a284632767ffd457321e301aec1b13ede37495bd7e9f36f2714fbe55f937589357568fa8aa42aa15ac129fc4e3235337dc3a79cd6ad0b306d588947abfeebf4e0c4fd89a64d97cced6d9a762cb1f5ec7c0abe80ff6aadded57a2ed3ae358846438c4d9cbe5bc598f6ec0f9bcc271b40caa7439a7ed074e47e7cba3fcd6f53b68c6b1986f6c7344bd31c92f17d6c3e3dc92d4fd3024d8b342d5917c9882ba76999a63c6e37add28c68e6d1cca75940b3906611cd629a25349bd06c4ab319cde6345bd06c49b315cdd634dbd06c4bb31dcdf6343bd02ca5d99166279a9d6976a1d9956637eb3599d67c56b3b67f76e7fa55afb6673fbba7d903cd1e69f644b367975e68f64ab337ab15b33acd1a346bd2ac45b336cd3a34ebd2ec9d663d9af56936a0d990661f341bd1ec9366632ba933d357de5b819b656d1f6096a399533693e1ccfc59b4adc7ac443393798566559a13cd3d9afb340fac5d9887348f681ed33ca1f984e653fb55e6339b8cfa99be8ae974190fc47c30eb876c683ea7f9c2fdf94db22531ffb4b42e9c5192af2be7cecb97345f7137c626eb017ebaee93e944656510e2e41cc5017eccd73c70677f9b5733ce9be17a8d752cbf92cdc4345673f3dcad4dda6ad9bfee6c4fdafc39df7f25eb2ff1ab35adfe18b99f1fdc9fa9edf89a0bcc279b1f697e8275303db7f999e617fb67e02e9b5f5d67e0d3d555d7babe53a9379b5eac836a7c395339b63e6feeca1acdef687e6f1f6aaad1b4cff307f7d04797e193bdcbba580fb63056679eacc19a3fc30d99bfd0fc95e66f34afbb64aab4f9954c8fc21865a37b7393619be61dab90f3aed564d35d99bf3bf7fec17613e63d9af75d1a588713fdb48e7c29230c43d60d23251f341fd1dc147dec94f5ce96c694c0e8d93c43f32ccd7334cfd3bc40f322cd4b342fd3bc42f32a2d88161e2d7c5a182feb408b9016911d6e5ac4562817092d26b498da8ef262468b392d16b430bf57b458d362438b2d2d76b4d8d3c2dc9b76d3475a1c6971a2c5991617eb0b2d4c56cea22f4cbaa3c5bd5554f3dbe8fde28116e6fa275a3cd3e28516af5638166fb4a8d3a2418b262d5ab468d3a2438baeeddf9b3ebdf1d316efb4e8c19e59cb31a0459f16e6cf212d3e6831720eae799d4f9bac3971edde624c8b8c4b59d77579b215bac8b911619b6891b772bf28d0c2f46ac680c69d33e2be78b105e35ed0a2440be3a8acbae9d8d902a3b16fddd494bfe2869547b4a8d2925c32b55aa1a54fcbc0d6d8d2b7e372cbd00ecd2d235ac6b44c5c95ce6839b1c9fcf0c866be9cd2d2c0b9fd217f9521e9332d17dd748321c1f9ea9b266b60cd16b74ecba56d9a6c77cb58967bd7ca8d6ca3b45cd172ed4693c6b4dcd072eb5ace7bdb6c1aad0bcc8376760c73b9b7c353cb032d533b62b93cd2f2c40d262dcf922eb4bc5aeb10b8f128437824ca2bdafefaf26693250d497bdbef5fd65cbab3e2bbbcb77cf920b73cba54739d99abbbec09035cc628e0e9e6155edc8f93f5c097afb434c5abd3d2e4d334bebd1d2e5bb66c32966bd976bab1ecd0b24bcb77977ab4ecd37240cba16d5c96a6c1325f68f433fd4cffc06404786ca7138c7e06c6dc646899752947cb3c2d0bdfa4222d4bb42ccb5fcd0ff8544625aab4225a79b4f26915b814d22aa2556cbbbcab8456135a4d6935a3d59c560b5a2d69b5a2d59a561b5a6d69b5a3d5fe77d38156a9cbe148ab13adce3fd3cff457a69393b4c44e172e65ccc3b418ab0badaeb4bad919d5558d5677b4baa79591f0475a3dd1ea99562fb47aa59569cca74e3756755a35243569d5b2ad87f119566d3b43b7eafc50dd60c5e8fe4c3fd35f99583d8cdcbed3aa47abbef5b24c1f6965ba7043ccd218a76b35a4d507ad46b4faa495d19c0cadb2b4cad12a4f2b5e5cbc2ad2aa44ab32ad2ab4aadab129d3355f93edc51b373daaff50dd38d3daa3b5ff33fd4c7f650a9c7a24b40eadc4af233b27b88e6d07c14ea13cda91283bbbb0a3b5b96642eba99dfe5acf683da7f5c2a5a5d38df58ad66b5a6f68bda5b5b97a4feb03ad535a1f697da2f5f947ebc685d6d79fe967fa2bd34d74a346eb3b5adfd3fa81d68fb47e72e999d62fb47ec5b8dcd4fceb1badebb46ed0ba49eb16addb14b758373ab4eed2fa9dd63d5af7693da0f590d61fb41ed1fad30ee3fc60dd18d33af30f4f5997befdf1573fe867fa532927ba91a77581d6a64d28d1da341d155a576943b4f168e3db852ac9a71d9ede04b4096913d126a64d429b096db8bfb199d1664e9b056d96b459d1c65cbaa1cd96363bdaec6973f8c1bab1496973fc272516d0df24bffea7dfbff13f7ef47f90d5bfdcf2df17e69f944ed08d8d91b70b6daeb4b9d1a6469b3bdadcd3e681368fb479b2f38c9b673b666dd7ef9deda4a75db16254e085f8301edabcd2e68d3675da3468d3a44d8b366dbb2464d3a14d9736ef3f5a377ab4e9ff63122c370bd62fe1b73ffee08dffd9d3fff7f7fee3d3407463489b0fda8c68f3499b316d32b4317592a34d9e3605da146953a24dd9aecf8d4fb4a9d0a66a17956f89b69ed38dad4fdbc0b612db90b6116d63da26b49dd0764adb196de73f5837b6e6d9cb7f4cfa56c4ff057efbe33fbb51ffe90ff27f9bf36f5ef3fb39fcdb32fc26f9bba71574636ae4794ddb0d6db7b43512bea7ed81b6296d8fb43dd1d648e385b65737b768fef546db1a6def781901ebc63d6d1f68fb48db27da3ed3f685b6afb47da36d9db60dda367fb46eb468dbfe672408c4f77f7f0bfff88ddfcbe777f2fffd27fe7e217fbfcc7fbc0cdf3ee8ef9e3aa21bc6dc7769fb4e6ba31b3ddaf6693ba0ed90b61fb41dd1f693b663da669c7fb5766b55b676d5cfd6bc26ce63cfd3b640db226d4bb42dd3b642db2aed88761eed7cda053f58377621eda27f4662b1f89ddfdfc23f75e3efe7f36bfe6f9ff8039ff507dff16f9d62e84654a45d42bb09eda6b49bd16e4ebb05ed962ead68b7a6dd86765bdaed68b7a7dd817629ed8eb43bd1b4eb746367e4f542bb2bed6e76b1edae46bb3bdaddd3ee81768fb47bfad1baf16c87d8fe19894de9effcfe16fea91b7f3f9f5ff3df7fe22f7da4fff659df2bf66fbee9df32ed5ea4dde8d1ee95766fb4abd3cec87693762ddab569d7a15d9776efb43317f46937a0dd90761fb41bd1ee937663daf1d67fab0fc630e46897a75d817646d54ab42bdb1d0ebb0aedaa3f5837f6447bef1f90fe55e024e93f7dfbe3cfdef8ed957f84ffce13bf25dffbfda79ef59bb77fef65ffa6c9876eec03da87b48f681fd33eb1edc67e42fb29ed67b437bf17b45fd27e45fb35ed37b4dfd27e47fb3ded4d03d274bab14f697fa4fd89f646702fb4bfd2fe46fb9aed914f9e697ff7a375e39ef60fff800451f82df2eb1f7ff6c63fcb7fe789df92effdfe2fcbf0bdf7fafba647d18d27da1b197ea1fd2beddf685fa77d83f64ddab768dfa67dc7a52eeddf69dfa37d9ff60397cc6f5ea3beffb003b8fb11ed3fdd9f63da67686f6a2147fb3ced0b3f5a378ab42ffd031244e1b7c8af7ffca91b7fd19894fe3dff973cffededfff2dcdfcfe1d7cffaf55f7f9df3df3d95a11ba6abbdafd0be4a07a2834707dfeac621a0434887880e311d123a4c6c7b7298d261e6da939d6d400e73a71b87051d967458d161edfedcd0616b27c8cd9f871d1df63f58370e073aa4ff9f2696b03fce7fa6ff301da52f6eb4e244072375173a5ce970a3438d0e7774b8a7c3031d1ee9f04487673abc583dd90ee9f04a87373ad4e9d060dd68d2a14587361d3a74e8d2e19d0e3dab70873e1d067418fee8b93f93edc7ffa7093af087f9cff41fa61174e3f04987b15ddb71c8d0c1d470ceb51b793a14e850a443890e653a54e850a59428f5ace6a4be6d64528e2137bd511a521ad90da2696c2371a4ce514b27944e299dfde8f98d25a5f39fe967fa2bd302ba911a615bd941a6744de986d22da53b4af7941eecf6f1d8a334a5f448e989d233a517a724574a6fb47d77ba91d66c8086b841e91da5463d1e287da4d4e8c633a52f94befe60dd48df28adff4c3fd35f991aa21b074a9b94b6286d53daa1b44be93ba53d4afb940e281dda39eef483d211a59f948e29cd509ab55b36f61fac1b394af336f488b9c1b42173d38614282ddab1ddb44469f9c7ef6d3245ff997ea6bf2ee9dea6b44269958e64e7f88e1e1d7d3a06740ce918d131a663623b0ec7890d9d739cd27146c7391d17745c9a068363b799bface8b8a6a3b97f4bc71d1df7743cd031a5e3918ea79f7b627fa67f5a923db1c7b30d1075bcd0f14ac71b1d6b74bca3e33d1d1f6c98b5e3231d9fe8f84cc7173abed2f18d8e753a36e8d8a484e7378e2d3ab6edfaf563878e5d3abedbb6c6b418c71e1dfb7695ef0fd48da329e8d0a50f3a8e5cfaa4e3d8a50c1db32ee5dc8b19b5ccd3b1e052918e2597ca74acb854a513b9e4d1c97729f8997ea65f2423b7a7904e119d623b007b327f9dd0694aa7199de6745ad0694927c3d774dad0696bdb90ddcec628349d8bd3cee9c6694fa7834ba9d590d3d106cc9a1878a2d3d9fef953377ea67f62b2ba71a1d3954e37b7e2d0e840cdae2e3fddd1e99e4e0f76afebe9914e4f747aa6d30b9d5ee9f446a7ba0dea79e231dc53934e2d3ab5e9d4b1e1064f5d3abddb3859a71e9dfa741afc1fe886f9f334a4d3079df89a9fbaf133fdf96475e3934e631bc676fa4ea70c9d8c5ce5e894a79391fe229d4a56134e653a556c74c6b90bdcbc32cd4395223ef4255ed3996c50c0b347679fce019d433a473662f439a673f23fd58df384ce533acfe83ca7f382ce4b3aafe86c4ab871cdc84fddf899fe7032727bded2796723ed9ef776eff8f940e794ce471bbff47ca2f3d9f626ce173a5f6dfcb8e491ce373a9bcbeee87cef74e3fc60c3c7fbe652f36f4f747eb6db67cd3d49de86393cbffcef74e3fc4ae7373ad7e9dca07393ce2d3ab75d326fd2a5f3bb538f9fbaf133fdb16475a347e7be558cf380ce437bd2c0f983022357233a7fd2d98877c686bd3c675d8c43237b3917967f4c1efb549ed19bbc0d6e6563aa3e5add3817e85c7411b917360af7ff4637ce253a97e95ca173952e44178f2e3e5d02ba847489e812d325a1cb449a8e9fbaf133fdbb64e4f632a5cbcc4662bfcce9b2b021dc6d7891235d96b4cdd16565dd25d35c5cd674d9d0654b979d8bc85aeda6bc5ffcb2b7fb002f07baa47431b79dec0117f1d486a3bd9cad9efc0f74e372a1cb952e37bad4e8620a734f9707ba98423fd1e5992e2f2e991fafaed7f153377ea63f90ac6ebcd1a54e97065d9a7469d1a56df78587e677c71e41b128baf8c59f74e9d2e59d2e3d97faeed0bc3aebc6c085bcdeba30e05d1b96dcc6ee6fd950d897215d3efe27ba31a1cb882ea694e677862e59bae4ac7f6547abfe06e35497fcfffd97fe99fe6cb2ba51a04b912e25ba98a6a34297aadd149e8c6d54ef2bd9e6e2ea91ff4c579fae015d43ba46748de99ad075e274e33aa5eb8cae73ba2e6cff7bda7501d9dbf61c191bbebff6d7ea866931ae4bbaaee86a0abaa1eb96ae3bbaeee97aa06b4ad73faf1b468ebf4d3fa496ff0f75e3a75afec7c9c8edf544d7335d2ff634a6c808d8d58682bfdee85aa3eb9d4bf7747da0eb235d9fe86a94e485aeaf8ebcb16ed46dc837a355d7065d9bf6ec8f6bcb9ef4716dd3b543d7ee5fa81bd777baf6e86a9e38a0eb90ae1f7435d03c7a4cd70c5db374cdd135ffa775e387cbd64fddf8bba53f522d56374cfb50a46b89ae656bfaed01b06f7435a25eb55a7123ba79f62c8a9b4fb7806ea1f5a96e11f975bae108e9846e13bb99e936a5db8c6e73ba2de8b6a4db8a6e6bba6dfe42ddb86de9b6b30b606e7bba1de896d2ed48b713ddce74bbd0ed4ab71bdd6aff956e7c4b7edd9e7c7bf11fb9ec7bfff46bf82df97523f69fe5f333fd4b05fefe35466e6f7774333af040b7477b42ac3dbbf88d6e4f4e319ee9f642b757ba196294c10861936e2d5aacec4128373e7f6367feb943b72edddee966f4a64fb7815da67e1bdaf0b8b7bfb2bf7133e9936e63ba65e86694d3cdfaddf2742bd0ad48b712ddca74abd0adfa0374e337db935febc6ef5cf6bd7ffafd4cfef823bea7a8ffe782f8374c7fc46418b9ad11d53caaf9540ba816522da25a4cb5c4aa446de2d2d46a456d46b539d516562bcee6ca254d9e9c6ed456545b536d43b5ad8df959db516d4fb583f5b22657aaa57f6d7fa376a4da896a67aa5d302f5e330fbd51ad46b53baadd53ed816a8f547bfa4b74e3d7fffa1fe8c6efc33fa57eff8fbdf35a6e6349b6e8c7ecf71df0e6116de0bd07dee0bdf7f8fa9b554d52a4e8401d8192e6f6c40a440304883e9a5accca3259efdd9ecb4fdc1251d5bcb8349e046349c64486346319c6c4841c6379c60a8c15192b3156d6925418abaad3086235c6ea8c396bd463d2405b8cb519f330264dd3c7985f9dc0190ba8935da7893b8f53c97d04190b31167eb1662416612c4a833440a343a3fb1bdc78334d7fedc6ebb7fd7637defb8ad79f72dd78931be386d1a3d1a7315067401bf27444634c6342634a6346634e63a1543196345634d6343634b63476dc2fb41bc69ec681c691c689c659251ec685c695464c9d4da84ef4f8136b0d0d838649c3a261d388d348d048feceb8f1de4fdf7cdb5de3c69bdfebbaf13137e61b468a469a46864696464e8d4749ce2d8f469e468146914689469946854695468d469d4683469346cb596b2889b858d1567b6a0d8faa3662881e3e1a7e753a41efb7ee17ffd23a5c234023482344234c2342234a93bf3e4ef5deeb1f5c1f5fb666b74ff5f770cb3f8bb45b13343b34bb6a7988d9a3d9a739a0392ced97344734c7342734a7346734e76a3b86b9a0b9546cdada0d7345734d734373ab8b2f586a03945c9b3b75a4cde0de7daa0fd7a89b7b9a079a479a72df679a179ad75f9fdff8e0f58fdff6668feb83affb54bc8f3ff2fa53ae21bf80b4dbee51d548778e8a3563340d9a264d8ba6cd6e9d669c66826692668a669a6686665693e3c959876be66916d4fe71b348b344b34cb342b3aa4a239a359a7f2e6ea89585a247836693668ba6a8efa1e9a5e9fb8bd68cb8adf6af458d5349a3f773207f5e032acf3683344334c3342334a3b4480bb43ab4bab47aeccb639fd640251e96e38635a235a635a135a535a335a7b550a7d2584b5a2b5aeb3fbcb7c9dad0929bd9d1dad33ad03ad23ad13abb6eb87c82b45beb42eb4a2b46cba065d2b268d9b4e22a5658095589c74a72545571635ca79562bf482b4d2b43cb59873bf6d3cad1caab4d4f564175b12c79478956995685d66f3dd3ec57dca8d192fb6ed06ad26ad16ad3f2d0f2fe2d6eb8fcb528377caafea0252d5c1a5290568856589550b022fa314a9bb441bb43bb4bbb47bbcfbe97f680b61337ec11ed314773b5a4ca9ed096c719ed39ed05ed25ed7bce8bdfb827d65ed3ded0ded2ded1ded33ed03eaa312bd70d970f90766b9f689f695f54d0b0afb463b40d0e6a1c64689beab4d891b4768bb6adb2113bae561f5e076a4dee3ce4b891a09da49da29d561bfd6cf958560d0cdb39da79da853fefc62148bb48bb44bb4cbb42bb4abbe6c60d974f506ed415cb044712001ab49bb45bb4dbb43db4253ef808e9154b73f2732ea143fe0a4b4b0bd10ef3d271dc88d08eaaf9ef38951871a8f554f10ee35dc67b8cf7ff0a37e203c6878c8f181f333e514355ae1b2e1f23ed363e555c2e448ef119e73bc6e78c2f185f32be627ccdf886f12de7d2ba76bca419dfeb8d1c12379cbd4d97b3da631e3f681f8e8c9f183f337e61fcca788cf1efdaf7f7699d91b8c9b8c5b8edee6d72b909e5469cf104e349c653da0469fd1976faec92dd05e71203b29a5c692f2d3fcf7881f122d1293dd4c38d97182fab19f178450d526d3d8c57d5f181f11ae37575d6d35fe2865b67c4e54b28371a8c37196f69da8c4bdb9630e053938073b9f03f12605cfa262135472e5d2ca3c8b81337d444b87c26a2178cc82f8a2a241d4f9009285c375cfe45a4dd263a9aee23bd1fa8ded4236ac7df33127d41bb91182831d6fa789ae1401f75136762a8113d46ae1b2eff24ca8df14b269aa966f628439289f933168a4bcf7163f9e08688b1abea5365db3a6eac3474dd70f927516eac1fda7a62a3d932b16362af393ce3f81aa71e6e52f5a91467a58788b111c34eca0aa767f547dc489c99b8307175dd70f945941b31bd17dc66c2d0988f178e001613b626ae4928d4fe588573c6c0451fbd2cb126a9f448a4941e8e189b8d9a26ff336ea499c8309175dd70f945941bb91728491e238308a064c86b0a9a22132526ca0ece99669616a3c24495899a3e2436fed0a15a6eff8c1b893a130d269a4cb45c375c7e11e546fb254f5d26cf33bc4c4893f36b024c0435cebc7822acb27035865b5624224c4499a4064c76bed58dd885c92e933d26fb5a0cbfeb86cb2f22ed363978c10f011c07028f841e9508be742329bf62a476c32e370ab990a7d786223966f2b79ef7f7b11bc929933326e74c2ef41659371777f90f2837962ff821c3cf26bc7aeab831f031b96272cde446b3d665478aaa526272cbe4ee1bddd8337960f2a89e4aca913c3179665222c995c998eb86cbd778236e04dfb2e26d1c37e26a116ed260d2d4183fb0724c5adfe886cd649cc904934926534ca699cc30298aca6de4992c7cc18d5bea50b8fc6ff3e046f119254df911e769e5f1f1054e9faaca648dc9fa2b1a1c4adc687ea31b2d26db4cca85f4eb249af9990c30196432c46498c90893d19bdcf878cbabcbff0037ee1777ba52293e8297749ed1d5f49e706a459799ea333578c590a91153e36f722335616acad48ca939530ba6e43f69c5d49aa90d535ba6764ced993a7c5e47fd837fb50fb67abffee9eb37bcf94b5cfe0837d6197908178ff9c61b3238bce746eac8d4497366eac2d495a91853065326531653f6dddd48c5994a3095642ac5549aa90c5359a6724ce5992a305564aac494085c61aaca54edd7ddf8e93dffbd1a88cb9fe2c6fa54a93a530d4d533f3e5921adbfa57194686b5acf71dcf030e5d5f8347ea6024c053521c55ddd4885998a3015659a4c83e90ed35da67b4cf7991e303d647ac4f498e909d353a6674ccf995edceac67bff82ae1bff3ab7e493ca8de791e165d0482f995e3db27e8de34690e90dd35ba6779a3dd307a68f9a93e27e6ea4cf4c5f98be321d63da60da64da62da663ace7482e924d329a6d34c6798ce329d633acf7481e9e2efa915fda91befd5d7710df9e3dc1a373a6fd17de546e935da8d7499e98aa6ca748de93ad30da69b9a96e27e6e24e4bbda4c7b98f632ed63dacf7480e9a07623c47498e908d35166c80c98e930d365a6c74c5f858eff52d7f017e2c69bbfd3e54f7163bef19e18ca8dd52d6eb498193c326466c4cc989909335366668afbb9919933b36066c9cc8a9935331b66b6ccec98d9337360e6c8cc899933331766aeccc49831983199b198b1bf3c4ef51fdd70c7befe2a6e1ca77a3bf37ee94626ce4ce235da8d4c92999426cd4c86992c333966f2cc1498293273cfb3693265662acc5499a9315367a6c18cbc28aeb699f130e365c6c78c5fcd036602cc04990931136626a2067c6f9fdff8b53ed5ebf71f6f0be52e7f093fdc782586e4e23fc488bf1f373251d59bca5203663bcc7699ed69fa8abbe6e2d9015716b3436647cc8e999d303b6576c6ec9cd9855e7af8b86624196576c9ec4a8ff9baf3e22e9ff12317d7c3b2d9f5cf6e38627ce44676a393ef8aea5365b72a506477ccee3507c57ddd38f228669e983d337b61f6ca6c8c59439f34e0aea772f90fbc18a77a162b9c115b271777dcc89acfb01c1c376c66e5c709958267939a14b3696633cc6615f77523c76c9ed9820e1aa24791d992bbefcfe537f0b31b2ff36f152e1eaf7f88517ec271a3c2acfce5aea98d1dd93ab3628834d916b36d663dcc7aefeb86a41c591fb37e6603cc06990d311b76dd70f90d3ce41bcfba553f128cade2498f6c44137d8e762347e6c05c87b92e733de6fa449cb9017343e646ccdd7fcd486ec2dc94b9197373e616dc1d5c375c7e03d26e734be656ccad99db30b7fd315ceb0c46891eb99de24989dc5e73101c378ecc9d983b337761eeca5c8c39833993398b399bb9f8fddd483097642ec55c9ab98c4a365c375cfe3bca8dace2479729c25cee012750280df2cc151e293e9076d6e1e64acc9599ab305765aec65c9db906734de6a4d5b699f37cc75ac39c97391f737e1eeb6e9d1197df837223a094c8051f78e83b3dc7d1a3f0023d15eeb811622ecc9c2815659ecc83f90ef35de67bccf7991fb835785cfe49941bc117fc9c54e830921fbe16e3d18dfc88f931f313e6a7cccf989f33bf607ec9fc8af935f31bd70d977f1269b74e3fea213838dd277d21afe4b73f781223bf7b5a23e2b8b167fec0fc91f913f367e62fcc5f998f316f306f32ff8dfbfe5c375c7e233fdc780c17795b13673ef14892f9d4cf62a46bcc141d37d2cc6798cf322ff125cfbcbca9c87c89f932f315e6fff4b94dae1b2ebf86b4db7ced45f29daf33df60bef9c88ef9964289d17eb0222deff130dd7c72433a545ee67dccfb55faa1424780f920f3721d76dd70f927f9c90d955a449e5921441505fe10a30025869e0177dcf0b2d0518614ba2cf458e8aba4bc306061c8c288853bcf6f9c533c365c375c7e3f0f63b8b91fa352858966fa63e1b99ae66eea7051d3cbcfc76a6b86b85198396e1c5998b3b0d0622c5958a9c4a3b06661c3c296853bd7e029ec5938b07074dd70f9cd3ccfc51d0aa71f622819860ac70d470cc78dccf4d18dc299850b0b5716622c182c982c582cd82cc45948b090bcb31b2916246465783ebf7dbeb861281ef470dd70b91969b7852c0b39957c3fb8a1c528e4d59ada42415364a1c442595351a86d4b0ac78d2a0b35956614ea2c345890f6da62a1cd828705e96ef9ee9e6f14fc2c045808b2107a70a310664122609445b208163b2c7659ecb1d877dd70b915d5a7caa9fc5bed6cd509b713318a03bd814f531cfec0b1a2307be64651de316671c2e2f491198b7316172c2ed568d5bddd38c90dac585cb3b851f3e2c52d8b3b16f72c1e583cb27862f1cce285c52b8b319abeef73c3ddc3f44f23edb668b0683e64de45eb31cd183d6e6e1dff50c2b14228dace85e3469cc5048b4916532ca659ccb0986531c7625eb951b8f33a5c679caa5860b1c86289c5328b1516ab2cd658144f1a2c36596cb128eff1b0e865d1c7a2ff9bea1abef95957987f05e546400dd116832c86580c3fa619a317a985203e3c47870ec78d881623ca1259824e33d68a5287a52e4bbd6f1ac32df5591ab0346469c4d298a5094b5396662ccd595ab0b46469c592dcd586a5ed37d5357435f86bb971bfb8b8214a7ce0c653ac78b2c2e9531587da8dd24ee951dab37460e9c8d289a5334b17cd95a5d877b85132583259b258b2598ab3946029c9528aa5344b1996b22ce558cab35460a9c892defcf4d5da6d3fed117fbd11fc4b2f1edddde47f941beb8c94caaa2b256e942a0f6e3cf4a95ebaf1133fdc28f458aab25463a9ce5283a5264b2d96da3a6e7858ba7f9faae463c9cf528025f96f08b11466495c8db24c96c17287e52ecb3d96fb2c0f581eb23c6279fc2b6e7cd047fae9a71fbff8e6b7b84a7c2737d6a72a4fd4c2414936ca532589334e557cd4e371b8f68de8f1d0a72acf589eb3bc6079c9f28ae535cb1b96b72ccb6fdcb37ce7fde2e523cb2796cf2c5f58beb21c63d960d964d962d96639ce7282e524cb2996d32c6758ceb29c5363595fad6b78633cb9f145d78d3fcb2df9a47223cf7281e522cb2596cb2c5758ae2a2bca3596eb2c37589616d87a918897db2c7b9875ce502e7b59f6b1ec6739a00d09b21c6239cc7284e5a88a217775a34256c04a87952e2b3d56faac0c5819b2326265ccca8495292b3356e6ac2c5859b2b26265fd2b750d5f37f40fccf905378eef872697dfce8d71a3b26165cbca8e953d2b07568eac9c5471a9ca598d50552eac5c5989b162b0622a1e077059716a29546c56e2ac245849b2926225cd4a46252195acca402ab93bbb916745eeb5c84a8995322b1556aaacd458a9b3d26045ded062a5cd8a87152f2b3e56fcac04feab1b37566afbaa1befdd80cb6fe7c67ca3126425c44a9895082b5156c92a58edb0da65b5c76a9fd58166f8c888d531ab13569d3e5575a6dca8ce595db0ba6475c5ea5a23af6c58ddded78dea8ed53dab07568fac9e583db37a61f5ca6a8c55835593558b559b55b9c304ab495653fa835f1fa772ddf85fe2c671aa6a9ad50cab595673ace6592db05a64b5c46a99d50aab55566bacd6596d3c43da644b7ee4b8d166d5a395f0b2ea63d5cf6a80d520ab2156c3ac46eeec469435b206d63aac7559ebb1d6676da09f0e591bb136666dc2da94b5196b73d6165f3eb7e9c63ed59be34eafffff786f9cca1da4fadb90765b5bb2b6626dcdda86b52d6b3bd6f6ac1d583bb27662edccda85b52b6b318dc19aa97a5cf258706af0d42cd66c4d9cb5046b49d652aca559cbb09665edce7daa5a9e35b99b226b25d6caac5558abb25663adce5a833579438bb5366b1ed6bcac3905ddee302feeb6e9ff3d941b7e4d80b5206b21d6c2ac45588bb24ed6c17a87f52eeb3dd6fb6a55557da0281454e5db425ebb511fb23e627dccfa84f529eb33d6e7ac2f585fb2be627d7df731dcfa86f52deb3bd6f76acd48fdc0fa91f513eb67d62fac5f598fb16eb06eb26edd6b3d95ebc6ff1ed26eeb36eb71d613ac27594fb19e663dc37a96f51ceb79d60bac17592f3dac5477663f0aa2405970dca8b05e65bda622465d9a6683f5a636445a6d9bf5fbd719a97b59f7b1ee673da0d61ad683ac87580fb31e613dca06d9001b1d36baee3a5c972f20edb6d17b499f8d011b4375a24b63c4c6988d091b5336666cccd958b0b1541b651b2b369cb3691a1b36b66cecd8d8b37160e3c8c6898d331b1736ae6c7ccbbcb80484f2f1618dba25f763b061b261b161b31167436e37e9ae5177f91aafdd904ca19162431ec58d2c1b3936f26c14d828b25162a3cc46858d2a1b3536ea8e1b0d369a6cb4d868b3e161c3cb868f0d3f1b0136826a3bc737ef896d84d808b3116123ca26d984def9e4ee6d72f922afdd6876d8ecb229177d36076c0ed91cb1396673c2e694cd199b7336176c2ed95c69379a6bb567a3b96173cbe68ecdbdba5093802b360f6a47c7f7ef176f1ed93cb17966f3c2e6d5ddf7e7f22ba87c23f982668c4d834d934d8b4d9bcd389b093693ea9ceeac48926233ad569434336c669db58622538ecd3c9b05368b6c96d82caba705f97085cd3f5467445d78dc3db12ebfce1b6ed4d8acb3d95083574d89072d36db6c7ad8f4b2297f91e5c5009b4136436c869db8116153af0d69912d68e4a2a35e94c756d7ad33e2f24ff2da8d568fad3e5b03b6866c8dd81ab335616bcad68cad395b0bb6966cadd85ab3b5d16eb4b66cedd4ced8d69ead83e6c8d689adb3beb8b86eb8fc93bce1c6551363cb60cb64cb62cb662bce56822df9698aab265b69b632dc2f1c37b26ce53479b60a9aa2de162b32955c375cfe55a4ddb6cab751614b62438dad3a5b0db6c49096e3469b2d0f5bde0754e5cfdc032d9fda31ebbae1f22fa2dcf0df4680ad205b21b6c26c45d88ab24d678dfa866d280a16db1db5b8b01c501b9eda5db6e5f1ce6761bee9863cb6076c0fb521ae1b2ebfc4eb3ed57bb4476c8fd510567bc2f6549d48d3766a29b4e76a005794100a7db67511b7b29fed25db2bb6efbf66e4c90d436e4e44ddb2bd637bcff6816db9cb13db67b62fae1b2e5fe37637242f6f5f55cfaa1d635b1aa1c9b6b37fa33e56fbfedab62a86abdc886b31127aee2fa07ef43d6e282bc4e014db69b6336c67d9ceb19d67bbc07691ed9232c475c3e576a4ddb6cb37d16cb12d6254d9aea945e8ed3adb0d276e34d9969f49ebf4b02d9d191fdbe286bc23a8097d871bed30db11b6a3f4901ed0d3a1a74b4f8f9e3e3d037a86f48ce819d33371dd70b91569b79ee96dccd49a5acf9c9e856ef99275a7b51b9e253d2b7ad6ea25cf4619e2d9d2b3a3674fcf819ee3ddddf09ce839d373a1e74a4f8c1e831e931e8b1e9b9e383d097a92f4a4e849d393a127ebbae172135f7063aea247cd4f4f8e9e3c3d057a9cf3373c25e586ea47f9e829eb4751a5424f5553bbaf1b9e3a3d0d7ae4422469d323668aa2720f72a3017a82f484e809d313a1274a2fe905bd1dd70d97cfb93ddff076e9edd1db578b6bc50def805ea7064f7da6b6377947f48e3513b5a3a33a5335162a7165d25dddf04ee99dd13ba77741ef92de15bd6b7a37f46ee9ddd1bba7f740ef91de13bd677a2ff45ee98d7db25ffcd3fd77f7dbade1ee03f97bf8c23895ce3a1c37bc06bd26bdd6e37e71b5a56948afadc4f0ea1d4e2286374e6f425ddccf0daf289ba2374d6f86de2cbd397ac5da02bd457a4bf4caed56e8add25ba3b74e6f835ef9488bde36bd9e2fec177f8debc6bfce8dfbc56f7443850e69f03e7afdf406e80dd21bd26e78c36aab465dda5f446f7292b61855fb9c7c54b978c5bea31b3ed0d7a1af4b5f8fbe3e7d03fa86f48de81bd337a16f4adf8cbeb97e7d41df92be157d6bfa36f46d6f72e3cd9ddc6fee0b7f73a7f84f8faf4bb97dfa7b5ceec48d75466e14c3b7a36f4fdf81bea39a01f44927c5eff4a96cface0f6e3c1055bbff7c17e5462d754f37aef4c5e833e833e9b3e8933b89d397a04f6e37455f5a8b91a12f4b5f8ebe3c7d05fa8af495e82bdfeac69be545deab39727c69c207bfe4cd4fbd7edde54edc589fea46379ad2022b5a8fbdd2c357a5afa6ddf0d5e96b283754525e7a70c3d754381b65efe8468bbe367d1efabcf4f97470f0d317a02f489fe81ba62f425f947ed20ffa3bf477e9efd1dfa77ff085b8f1f1eb5f2ad8f3e61b3ef846973b714b887e634fec3bd457f40f3523fac7f44b5ae1ec6df2cc7569c347d4ced847540099ddd10dff94fe19fd73fa17f42fe9975b5cd3bfa17f4bff8efe3dfd072dc691fe13fd67fa2ff45fe98fd16ffc4e373e2ed8f34160f9b46c8fcb9df8bd7143651a3fa3ddf09bf45b2f509578347efbce6ec4e9976f49d29fa23f4d7f46c507e93ef9b3f4cb639efe02fd452d4689fe32fd15faabf4d7e8afdf2b6e7cfa8637e3c6c7bfcde5b7f36bf9c67b71e35d3724db56e3546f7177371af4cb638bfe36fd1efabdf4fbe8f7d31fa03f487f88fe30fd11faa30c900130d061a0cb408f81bedba7fa7fcdaf8d537dd90de947bde7c6bdfb544260c0c0908111036306260c4c199831306760c1c0928115036b06360c6c19d831b067e0c0c0f1d6f98df75af0f1e51f9e8fbb461f68f0666477c7a9fe127e831bd5b62e6d68e9226e3f51bbbf1b2706ce0c5c18b8321063c060c064c062c06620ce40828124032906d20c6418c832906320efce8bbb7cce6f702350d093e2a307439e70dc90d0712f37ea0c141928315066a0c24095811a03f262830171a6c5409b010f035e067c0cf8190830106420c440587f3ce2bae1f211bfc38d885a2ad2d8a8c740545911e4c3fa912018ecdccb8d639da715634106bb0cf618ec33386070c8e08841f9ea09835306670cce195c30b86470c5e09ac10d835b06778fc79ab96eb8bc83e3865a5dfb4870ff36efbad18e337860f0c8e04915710b9e19bc30786530c6a0c1e0dd6ab7c5c23ccb77898a362f7506e536120c26194c31986630c36096c11c8379060b0c16192c315866b0c28b3c56d56640d70d970f50eb70c587da0f3c5f40bb119476d96050ac68a92369826d063d0c7a19f431e8673070c77c43f40806794aa9169ff6f22adf1b62505e8c301865880c81a10e435d867a0cf59548a181fad421e0e61b2e9f20edf6b918bfe24668c8d08885054363559c2a346168cad08cb9164373861677debfd1e469a4fa48924584960cad185a33b46168cbd08ea13d4307258f285108a90faa1de461371777f99cdfe4c691a1932a51153a3374e121c6d09521793418fab67ab86d7dddf891a93fbca7a50b2cf8ddfde22e5fe3b91b214bf19e0921fb358e1b718612cc8b154986e42f749aa10c435986720ce5192ab835785cfe499edc70c4f81537941545864a0c9519aa3024d1a3a6ada833d460ffce6728bb6eb8dc09c78d27317e296e345591919064176d863c0c7979947cc3c7739efb30cf53d70d977f1269b7213f43811f3c6cf37e452df71ac78da026a44a448724218e301465980c838921c3779bdf70dd70b92b6a0cf7270d0e6f13eebec6a9f95960b8c7e284e13ec30386c58711c36386e59529c3775e33f2b91b0d354e159e33bce065c1f0d275c3e526941befc870ab1be115c36b86375a922dc33b86f70ccb078e3c4eb8fbf6739b54cd4f8f9af73827193e317c66f8c2f095e118c306c3a63b86eb7213bfc18d9287618b615b9d31108e332faa24189676297fadd30c67be6f0c37b8e329c47096e11cc37986c5d522c32586cb0c5718ae325c63b8ae3b57ae1b2e9ff13bfa54d2161b0c37352d86db0c8b2d5e867d0cfb19bee7bcb81094161f64589408331c6138ca081901231d46ba8cf418e9f36c31766064a0a38a9b6fb8dcc66f881b91212323cd989109235346668ccc195930b26464755f37226b46368c6c19d931b267441c38327262e4cc735c4d93ab77bab9b8cbd791765b9ddf46f8358e1b1746ae8cc49837d4dc5fc460c464c462c46624ce48e2ce6e2419912f4d33926124cb488e913c2305d5b98a14951b125522251d5b82ea6970ab3ff8fbdcb8eb3e247793d31f44adc3f5dcc4fb71a3cc4885912a233546ea8c3454872a22adb6c5489b11cf9ddd90eff231e26724c08868204a841989301265948c82d10ea3dd1f17d783fac8a7fbfe9eff1b7dbc11eff64de4bfc0c79bcb5deeca6b37a2bdb779376e44fb8c0e181d323a6274cc7d81d109a35346678cce19bdf35ac373428d4145976a002aba6274cde886d12da33b46f78c1ef4a3587164f4a439f332bfbb1bbf0bd78a3b71eb7ef1ffeac68551699d31460d46a5815a8cda8cc6194d309a64f49eb5db846383d134a31946b38ce618cd335ad01745464b8c9619ad305a65b4c6685dffb4a1b6437decc6f1558bff60fbf8eb9a3a1fbcf893666f6e19ffa0a2cf2d95635c6ee1c63a23efc9f033cdd7386eb4186d33ea51f977d4cbbdf45e7c8cfa190d301a64f4fee76fa4e5ebc25c94b83c73098dbe884698133fa53b45106007ec823db0fffbddf8e9a71f571bb9e5b77df0e29bafb87c891beb53ddeac61b2837c001cf2170088e1832c0313801a7e08c7b6994f73fb729ed0317e283a305577b2edbe00a5c831b700beea0943d40a9e0bae172735dc3ffecc60994767901af608c21131443e4d1026df0fee7c42a371260124c8169300366c11c98070b60515f94c0325801ab37b9f1f4cff7411bfdef6e7cd07d7aef2bdc6ed56fe117e386ee2f35774f80354dfd358e1b0db009b5e54ffe5a7ba04e7f91c6ea872a961604efdfa70a4aa30f434df845a13a4ff2bf0ed0057a401f18283d300446c01898fc456ebcf9ffd97b5ff1de6f73f9056ecc37d461aecf7895700353e1e7b709157da6193003e6ca0a2c80a55e5f281f5871dd02a45773e7797171e32c8d7e036c811db0070ec011380167e0025c81186000266001b6aa4e728b1b3ffd531e5fb5ce7bf7a97efa0ad78ddfc82dff80d26e2be917fc94703fc68dd7623cb9116744c44800c947126a5a234c3dfd77e7f98d073752401ac800592007e4810220e1a20494810a50056a401d68fcba1bc797b1f8975bf3c77da40fbec2ed537d27afdd68c4dee695184f6e349f8bc1a3fc859688d1d67868dfbb9682ce37e005e4d10f048020100224de4580283a543dac4e079d2e3a3d74faaa068fbb66c4e553549faafb82afbac1551b9dc1830676019d213a23cd58ef8ccddfdb0d7426e84cd199a133476781ce129d153a6b7436e86cd1d9a1b347e780ce119d133a675dd7d075c3e5335ec78d9f782bcd7819373a1774aee8c4d031d03119123d2c746c9ef3e8c485fbbb914027894e0a9d343a1974b2e8e4d0916f973b29a25342a78c4e059d2a3a3574dc35ea2eb7f1da0d277abcd6e32d739c71aa1913d2ec1a34bce834d191c62a91c4838e3cf509f777c38f4e009d203a2174c2e844d089a24b3552d5ed707140b78b6e4fde8c6e1fdd81bb0ed7e526a4dd16cc27d01db2ba11d01d090fafeb57f4d9b03fe3e41b09e54677ac992837ba53cd0cdd39baf7cf370e6d7497e8aed05da32bb7be457787ee1ed83dee171742e88a2447778dbacbadbc7443e1c9ff4c73a378d78dee09dd33ba17e586c48dee558b1143d7d06edc7f5e5cb9215a5be8dae8c6d14da09b4437856e5aef8f7daaa5e03cba6eb8dcc67b6e383e3ce73d372405d76e48d0c8a09b654e9a690edd3c8fa76f73e3f97e71740be816d12da15b667be8d61971f945a4dd4abb7f1625d0ad3c52d5d41ea9bfc6891b0d74255c4857aaad838647c4f8836eb835785c7e0f8e1bcff440d7fb0adf7b386ef8d10da01b4457faf461b5ac299614d08d387ab86eb8fc932c86e8461fe851f1990fafdce841b9d1eb283d7a5df47ae8f5d11ba037143714ae1b2eff22ca8d779b3ebde6131fb83152c9464f98a027597856bb311354cdcf43c575c3e59fe4b14f85de1cbd85c0f246406f89de4a1ef5f55a2317db1f92a8f7ef9cb9bf187a7ba58443efe088a150e947d675c3e59f44ad19e9a07764a9c6664940efa4ad38d33b141c43d0bbd02bbda48d3a7fe62998941c377a57f4620f41a3673c060d5363a1677faf1badc7175b8f2f7ab427ae1b2e5f44fa54bd38cb6101bd842629a8bacf1afd34a5911fa5d1cbb059502209ed8ee346d6718391951643c8d1480b5a92fe37bad1422f8f5e01bda246442fa35741afaadfe6bae1f215a4dd969a8a9634aa9ac0d65140afeea09fe604ad87849486d2a3d45001a4d074c6a9448ca6a0c6a67a2dc78a47375aea95ef7203bd367af2e8d548b7cf8f5e00bd207a21f4c2ae1b2e5f43c58d084b2d7520596ba790eb9f78b0450510b6e48f72147d0acc4f1d37b28e038abeda69c7eb5240bfa3f4e877bfcf8d7e0ffd3efa03e5467fa8c4e88fd01fa33f417feabae1f235a4ddb63a2c75d09fa13f477f21d70ee82f9fe34882fe4a1d25d02aa86e5828a8e7c597f2b7d9565da9fe1afd0dfa5b9a59f477e8ef95271240eeee863e0ef35043ffa0ba52e2861683d50cfa72c727f4cfe85ff4fa11efe3b291ffe0c64f7b65dd6d46ffaba85c5cacb8a21f43df40df44dfd2d8e8c785474f124e3168f4932ce6d93a08e8a774dce8a775e890df226d31abc96937f2e817540cb9f73a5c4ab810254ae89755a19d7e05fd2a53f228b6d4d16fa02ff7dd523fedb7d1f7dcb446fdbd1d76ef6ddffbe3ff47bafc76a44fd5970e884f2362f8992f3b6843028e219a20fa214dd8e96ba11f71dc883267ea89f0390654a50b725d0c3a18c8630f837be7e2750c06180c31186130e6ba80c104832906330ce47e16182c315861b0c66083c11683dde7f5706ff1e1f5db5cfe216edb2f8ec11e83030647cd0983f32317ad87f7c18dc1158398c66071a4f293524bbb313031b09804063606715a411ad25813182431488924778f1b833406190cb218e430c863207a1431286150c6a0824115839afe9158d4c0a0f949dcf8b896c27b3cbdedd3575cfe066eac33a20a9f3f23247f705b8f5c9e60c9cb48edc1907ed0e96b396eb4d59a918147a51c0371c88b814fdce03182815f5ddcdd0df9f62006210cc218c8974631a4aab933ec60d8c5b087615ffd6838c07088e1e8937ce3d35a0aefbdf8fa831fc41f973fcb6df5a9301cbf64228821af2469293d84504a3fbd62e88c530d6718ce315c60b8c47085e15ab931dc60b8c57027dcd50d0cf7181e303c6278c2f08ce10543b9b318860686268616863686710c131826314c6198fea44fe5baf1ff815be2b97223c3a8b4a22c86394d1ec30286454119a2ce0ea86258c2b08c6105c3aa526558c3b02e386e343094362aafb631f460e8d562881e7e873bbb11c03088610843890c110ca3185155691b7530ea62d4c3a88fd100a32146238cc6184d30d2e3b9dfe3c69b5d2f973fce8d716334c3688ed102a325c3d27e5618ad1522c96883d1f691dd8bae575152dc837663b4c7e880d111a31346678c2e185d318a6164a8c46374c7b33031b230b2318a6394c02889510aa33446198cb218e53092ff800246458c4a189531aa6054c5a886515d555ffffeb8e1f2f7705bbe815103236966ad67b4351e8df7253e2546abce88b47fbfe34600a32046218cc26a8ff82882511463ea47607cc75c1ce32ec63d8cfb180f301e623cc2788cf104e329c6338ce7182f305e62bcc2788df106e32dc63b8cf7181f7ee73895dba7fae7b8719c6a7c64aef50375848602e3d30f1c31c6276e4be206c667758c59beec9c31204df082f115e3180f158ce5c7f2610b635b4d930fef78de1fc6718c131827314e619cc638837116e31cc6798c0b1817312e615cc658eeaa8a710de33ac60d8ce583adbbcc6fb8e354ff4bbc7203e3f603aaaff58cb1c77143f275ddadba3ef6a9c6228d0f633fc601aec5a420c6218cc31847308e62c2bbb951c704987430e962d2c3a48fc900932126234cc6984c30996232c3648ec9029325262b4cd6986c30d962b25373e4ee9a11970f103726fb1771431d64a9c0e4a0393ea0855171c3091d2a2977dc989cf4d17e1e55d47072d63b6383985c30b96212c3c4b8931b98c82d5a98d898c431496092c42485491a930c26594c7298e431915b2a6252c2a48c4905932a26354c44aa863a52d975c3e5031edcb868312e8a95f74d3069aaa83269a9d031f2a931ab49db19a79226e8c144dee1c3c48f4940f4e0caa2b954151572d6dddc100343988431896012c594bade7b07d32ea63d4cfb980e301d623ac2748ce904d329a6334ce7982e305daa33635d375c3ee0871b0f60bac274fd8ccd0393bde881a9f4475aca8de9eec90d69767b4c0f981e313d617a56cbaba617e586dabfd153df31bd6a37f6bfec06a6b19fdd981a989a985a98da98c6314d609ac43485691ad30ca6720f394cf39816302d625ac2b48c6905d32aa6354cebea3065d70d970f78e5863e19dc612ebc7463ff961bd3869a10998a372d6e264ca45461dca9f4c062987ad00d6837bcbfdd0db6252cc87df8310d601ac434846918d308a651cca80e05997530eb62d6c3ac8fd900b3216623ccc6984d309baabd50ae1b2e1fa0daedfa25ad2718f5aa576633c1e977fde853cde6189cb41bb3859a0d992d315b319ce621a34a47cfe4958dda28db0dabef986dffab1bb3dd5b737f0dccf6981d145d31e12830286f3e09ac0798351447891255452cac57b3d73f9afb73717170dc989d7ff0ae1b2dc70dcc2e0f6eccae8e1b31cc0ccc4ccc2ccc6c466ccce29825304b6296c22cfde486fedbff7bdd706b29b8dc0dc993775e01b3cc232b25863c4a18f8e14656251b0af9510eb3fc73370a9815312b6156c6aca2f2f25915b31a6675cc1a5cd9ae1b2eff24aadd1634cd079ee2c60b37662ad9184b9fa5f54c8f0737da9879d4dcdf4c0c9380e2c72cc0ab8491206621ccc2ae1b2eff24aa4fd5d2dda2475ef7a91c3d9c5c5cdc98451edd886a37e6544acca13b515ecc3b987731ef61de57137f86dba772f93751ed36f61cee2e0e4a8ff9e0871ef321b719cc47cff47870638cf904f329e633cce76a79d57ca1c4982fd1df62be72dd70f92779cb0dccd70f7a70c288f5e8c646f4c07cabf490ced57c87f9de71e380b93c3f617ec6fc229906236dccafea4cb3790c73c375c3e59f44daeddc7c8985b9fda273352ba8e8318f3fea2124941ee3a3e34652951a1987304f619ec65c824b169d18cf695a36e6b96f74a3c5428885941ab45555455c375cfe03ca8dfc0bb006cd176ecc75a6aedc88ff7043ebe1b851c4bc8479591932af605ec5bc86ee991bf9641df3c637b951976f97bb942f95a8e5c1dcab3c71dd70f965941bbe17702430643ceb621534f1977a28431c37fc984bbb0cf22cf986448f30e611cca358100b60d1f9263722032cba58f4b0e86321d74386cb3c9f5d375c7e9177dc500164311294248e1b7af6c3990c51f3213a0971f636b5990d429afe6282c5148b1916732c16582cb1584135fdfbb811284af7494d81773b90df102862b185bc73b1c7e280c5118b1316676d91eb86cbd79176bbb83c8751cf831b4a8fabb8c1c8e5d9cce03343a25eedc6228685a176712c4c2c2c2c6c2ce25824b0486291c2e26e63b8f3164303c6425864b0c86291c342eeb880854852c2a28c45058b2a16352cea5834b06862d1d2d7421b0b773d95cb87bc72030baf7643e7e50b9fea592dfc8a977a38386e04d484c6cc062568480091c61ac6228245144b62897bb9112930b8e3a98c6507cb2e963d2cfb580eb01c6239c2728ce504cb2996332ce7582eb05c62b9c2728de506cb2d96bb8ff6c4deb859efc6ddb32eff22d26e977bcde1912396272ccf2fb96079fdc1e324ba766319c3d2c0d2542762cea4e55958da58c6194de88bc49ddcc032c9738a67f9961496692c335866b1cc6199c7b280651114194a588a3c152cab58d6b0ac63291f6c62d9c2b27d532d858f9bb8bb23fc1fe5c6fde2944e94879bacc343f4f829095179c8f839ce0488e386074b2f963e2cfd5806b00c6219c2328c6504cb2856bc971bb313835bac805507ab2e563dacfa580db01a6235c26a8cd504ab295633ace6582db05a62b5c26a8dd5062bf9e03b71e3bd7fb54ff782bf7efafcf1a728f47159c43fde74fee7b9b1cec89b6ebcd6e3a51b8e1eda8dd51eab035647ac4ebacea7b4d1335617acae58c5b0bad7dcdfa31b26561656365671b513d0e94aad125825b14a6195c62a835516ab1c6341acf25815b02a6255c2aafc2b35787e7afa699feab512ef7dca55e23bb9b13e9576e3490fac2a3f50fdab4756d5476a4f38b5a27758d5b16a60d5c4aa85551b2b0f565eac7c58f9b10adc2bdfa8071891562e2d3e845518ab085651ac8935b0ee60dd05b358f7b0ee633dc07a88f508eb31d613aca758cfb09e7f21dff82f6ebc7e83ebc61fe7c6ba868f6e3ca027259e6028e3000614bae53da16bf0e4ba582fb05e62bdc27a8df506eb2dd63bacf7581fb03eded78df509eb33d617acaf58c7b036b036b1b6b0b6b18e639d50c771ac253311675258a7b1ce602dcee4b0cedf344ef5babf748b33c7afbb717c15645ceec717e3c69b6e3ce9f1e0c64b3d74dc5817b096365a7a74a3ac4a7dae2b6205d655ac6bf772236b301cc4ba8e7503eb26d62dacdb587bb0f662edc35aee21a0cfa9d1ace59d21acc35847b08e62c32fbbf1c14fdf7cfa0b6ebcf9d4e51e7c25df7886efb51e8a27379ee9a1ddd8009b0e365d6c7ad8f4b1196033d48cb0196333b9a31ba1153653e5c66686cd1c9b05364b6ce4c535361b6cb6d8ec94189b3d3607d5bfda1cb1396173c6e6f2ae1b5ffd4bffe6eb1f7ff07552fede2f71b913378e53cd82d85c9f784aca7fe6b173f51cc78d183686c6c4c6c2c6e6b8884d1c9b043649e17e6e6093c2268d4d0692276d72d8e4b1296023df5ec2a68c4d059b2a36356cead834344d6c5ad8b4b1f17c2ddf78efc5e3abc6fde638d5ebff4bde1cd172fb547f1537bbf1663071dcf062e3c3c68f4d001bf95d216cc2d844b089624b2c52f772e3586768892db0ed60dbc5b6876d1fdb01b6436c47d88eb19d603bc57686ed9c69f9e902db25577b6c57d8aeb1ddfc2df3e2ae0f7f27b7bb217dad576837b65b742f98f819f663bbc3561adf01db23b6276ccfd85eeee706b6576c63d81ad89ad85ad8da8fc4b14d609bc436856d1adb0cb6596c736a84779b57a358db02b6c53fe9c62de3242e7f1669b7a284dadafdc8cfe9c7b33ce46d37200db1a47d28635b5107716cabd8d6b095b6db10ee183702616c9bd8ca37b6b1f560ebc5d6a71fc5d200b6416c43aae84e5a5e0c6b3d22d846b12376c0aef3b7c40d97bf93dfe0c6ae8b5d0fbb3ead38ad187692fb4eb01b6237c26e8cdddd727169f4d7267653ec66d8cdb15b60b7d4acf45387f5c30ea76019bb0d765bec76d8ed190bbaeb705d3ee177b871c0ee88dd494f6bc8c519bb0b7657ecc413033bf38efb370ad265baeaa79fee890d32280e5bd8d96a1596bb46dde553bee086f767e09c13bb8babad7fbb0476498c0c8573dedf2e855d1abbcc5fb35fdccf4891a795bb7fc3e526a4dd76622f78a904c3198787579e65edd8651d3772bafb24e4b12b285576713559decff1ba72ce17ff3bdc70f736b97c05679ceaadb8f164c5a76e1455c7499d989c526bab76255e97fac4a6067665f4be6b4faceb86cbefe52d377eb24291a83cb8f1f436e54645afa7ba149515bbaa5a81bbab6157c74eac902cb9855d1b3b8feb86cb3fc97f77033b2f8db40a143b1f767eec02da8a207621b5cf69e673dd70f92779633dd597fb5461ad843edd6fe0c12eaa0a8eeca9a63bf6105c375cfe49b41bafa6c0dff0e4e15ad5b9d5881b9d987663dfc1be8b7d0ffb3ef603ec87d88fb01f633f5185aaf6d3ef702310c65e849c63bfc07e89fd0afb35f61becb7d8efb0df637fc05e1dcdf1a887eb86cb673863b8fb931e96f5a9c7fd19fb8b7e94d763fa515d70dfc2dec0de04fdd85bd8dbd8c79dbd4d6975c6df3e817d12fb14f669ec33d867b1cf619fc728f40d6e605f60440428625fc25ee25505fb2af662661dfb06f64da8bb6fa37fd131c475c3e50654dcb83e46062f96474a13eac85f7f935645c0dea39f8a333eecc58a008f8658a477743cc48d20f6210ca581ca1fef08f6511c880358cde1d0c1a1fb1d6e1c7a18f6711006380c7118e130c66182c31487190e731c16382c7158e1b076dd70b90969b712010e1b1cb638ec70d8637e55859ead158fd2c60e381cd5b5258deac4580b87b3aa92beb9aa03930fce7ef1c31587187a5d0ca5091a3898cccacf2c1c6cfd18ff8e3e552184430287240e291cd2386470c8e22072e671909b29e250c2a18c43456726ae1b2e3720edf650c5a186c909873ad4d1c472d1d488096dfdd4a3f1e2e083e4b7478391b824e21839f5700f0195850f97e8067008e220cd348c430487288e14bec38dd30847e0d8c1b18b630fc73e8e0388dc47797d8ce304c7298e331ce7fab361d70d97cf91767b5ce0b8c471c5cc9ed9138e6b1c37fa718be30ec73d8e071c8f389e9895379f71bca8345b120f2c9d3a237e1caf6aeded31a6eaa88fe5a981a3a990f4e3687dcb38550b471bc7388e091c9338caf7a671cce098c53187631ec7028e451c4b6a97b9eb86cb2d2837ca385670acaa626bc71a8e751c1b2a92483c3936716ce957da387a70f4e2e8c3d1cf7418c70046733df7674afb0be218526e1c25e5c8333a57050e8f111ca3387d4bdc10a2799c805307a72e4e3d9cfa380d701a4242ca698cd304a7294e33f4a77a30f743377e6d7385bb13e37f0c69b7a7394e0bb592eab4c46985d31aa78d668bd30ea7bd3a4ee374c0e988d38961b938e374c1e98a93cec519f5e364e0642a261e9c2c55f6734b9c6c9ce238ddabaee14f6ee094c42985531aa70c4e72c7399cc496024e459c4a389571aae054c5a9a6673cde77e397776fbb6efc43dcb65f9c891a3a1eb5cee354c7491e9b38b530f030277f85db6aea622a0d4fdabc17279faa0a3d93a7a24300a7a0ee539d423885718aa88ba52811c599aa437506ce1d9cbf639c4ab971eee1dcc77980f310e711ce639c27384f719ee13cc77981f312e715cece8e8e9bdd78fde27b7bbe5f97e7f9f81577dfdf1fe4c63a23aa316f70ded292c6bcc3d4a3d67c9cf7381f703ed25e08389f703eabe98af305e7ab2a9a7e8e3132d56e9c0d957ccf8a58a47116252c9c6d9ce33827704ee27cb7fde23fbb21df9e5165a9ce599c7338cbbd16702ee25cc2b9ac22c6b9827315b3bd9ee2f8cf6ebc7edb9bfebcf7910fdeecf20ddc589fea5cc3b98e7303e726ce62455b1d6779f6302a8fe2804f21dda5b35f75b4ce018c038034fb20ce2167bff89e9116c6224d18e708ce515c880b70e9e0d2c5a5f72d6ed471e9e332c06588cb0897312e135ca6b8cc7099e3b2c06589ee41bf3ff0f918ee7b75468e2f83c6eb7fee37af5f7ff6e337bb7c03b7a494d26e2f2b5cd6b86c70d9e2b2537fee2f7b958e2fc2b848e820576d5c8eb89c54ee21c9f6e58ccb0597ab98e3aca7121962b8182a41b998aa8a827872b170b17189e3f21df9062e495c525a8f342e195cb2b8e430a8e192c7a5804b1197928e18de2faf19f949860f4a4bbd57b0e7a75a3b6fbef98fb795ff6fdc18372e655c2ab85471a929372ef227b8814b139716435e56730c8b18d2fc3c8a514829a086a3ba72a17371435aa417171f2e7e5c24ac447009e212c245348a607eb79a9f8e1b47b9dd28a3195c892b70ede0da0522b8f670ede33ac07588eb08d731ae13308c5efbf371aa9ffe119f5f7c102e3e6deeae1b7f0f37e61b8e039129aec20cd739ae0b5c970c85715db19562f8c09034b635ae1b5cb74a0fc9ce77155c773a6e5cf7b81e14bb12ae475c4fb89e71bde07ac5c044ef9eb9f8b1896b0c57035713574bf5a9aeb63ac3095b5ce3b826704de29ac2358dabc893c535a796965cf32a74fcc238d5c72ddeed53fd43dc364e856b01d722aed2b0cbb84a8bafb22926d4700a2aae7555a5eddac055da618b118f5a5265add498efb5edac35eca05f506228373c1aafe2e2a591c22a76af3306ae3e5cfdb8067095bb0ca903feae6175f2c655ee3e8a181103621dc4ba88f510eb2336406c88d808b1316293c7d0f195f98d377b4daf3ff8de2f71ddf8b790761b9b2236436c8ed802b125622b7dbd466ca393903a53f2e216b19d3acd6f56416cafd6edced692843fce8b3f28f18ad801b1bbf5a90a21c44e889d11bba87584b12b6231c40cc44cc42cc46c4673e8e5118b239600362aeb90c75812b1146269b5dfe3abf3e26e23fe7f85b4db6101b18c5a13181143b20c4b93ce21268d4a5e2f225642ac8c98285145acc65055a5e9d29789d571349edcf0be218684915803b1e6fdea5321d642acad766ec4e4a6bd88f910f323165047d2c482e8791f8aa86fea5cb655b5cfa5fcf7885161c422ba4bf615375c31febfa1e24614d386da7361502d9732a0128fa30f46472d12914cdde8c2e8a9045d65dd35180318f2a99964298f7daaf7e2862421c6e86ef986ae876b8c614c604c7992c7993a8f46dc58775fb861cc55315cd1467a5cc602867c6aa506b8dcf5542e1fa0d6a88b066b181b6588b185b183b18721adfa08e384e309860873817155ab458c180c438511c384613dbaf122d978967218368cbbad510f14612454be61242189cd320b23ad2206c572419ee660e43505f5ca4efec38afa47251865352be2bae1f2016a5e7cc9651067af5a6b6854700e2966869add3e5275b7ce351d46aa306a6ca560d46134186e4b12a2dd309aefc60da3855dfd5e6e04e586da303c581c542e6e888d61552fdd907bf5c308287316627310468861097f611811fd1885493592ebbae1f201ca0dbd68eab48309981d351d6e76d58a41b307b30f73a0d67f9843982398639813ccb230a78ccad39933f757823957a8d0e155a515cc05cc25cc959adf18ceef37860b732d9903cc0dcc2d1672bbf2dfb08779807954d572e5cdf2180bab4707e75afd12bfbb46dde513d4fc460ce6496d4f32cf302f30af3063585acc11a601d3846969616c9587c4a69266e074c2620d33fee8461faa5edbb0a1caa7f7ba188730b9a8df3b0a601fbeebdc9fd2c34cc04cc24c61308099d6553d7d6e9d1197ff8ab45b338379451d9e614a40c8c1ccab69bea5c48d825a27621631f3294c090f659815985546a66a50ebd27a3c43b99f56d37c4b13f309cc1acc3acc064c69b82dc1adc1e3f24fa2dc68c3f4c0f402d298c501912480731766502da032434a8cb1c413e92b45d4a60c33aaf6091e2c58d46e8c6d58c038a626ccad0e234db5ab691156585d58dfb3d6d075c3e577b318b215c56803abaff62dc5b26ae78535c029016ba88e613a6d55fd9093016ba4e2813586358135551bc22d27df18ce54f749de67cd55b85804612d5488b196aaa882b572dd70f92791766bad61891bd2b6770c8f60edd58af49d47b9f1b0a6d083594dad4eb70eb08e121b9421cb38ac937643120ceb0ceba2b213e98a2dd2b0ae6a35af158365881eae1b2eff24ca0d539514b124e18ea9696f15166cb5244422817494a61e5c776a05ee31a6fa57f383de22bb83256e249edc48c24ac14aab05ea56462dbd3a125656ad715f44ef9b8b5b3958798dc4a822ac9246a2560596fcc7d46049b06b3c22ef6fb96eb8dc84f4a936d27eda3c4e6149acf0aa9dde33bd81e972566ec8a3ca237cb0fcb0026a9b864ad0e59520f6792717bfc092e7925d48372b8a15615327ef4db519d0fe510f978bfd931bb03be206ec2eec9e7663f73e1fba61f7610f600f618f608f614f604f61cf60cb572c34f22d2bd86bd81bd85bd83bd70d979b90766bef9d626d7a69ed4e7599ec036671d595929ed5758bf95c55fbec36d44fc513fb88ce55315b6b376247359b21869cea3c2654b96895a67854fa619f609fefecc605f615760cb601db7c85f18805db861dd71d2dd70d971b506bd4e5ef69428138eca44a2d145e3539211d272700d829355425d9842017765a9371f66f5c14634b0d58f56cd5c51a8912aab49b3a43d9ce7d8b1b79d805d812a64a9ab2a602bbaab511316ab0ebb01b6ebee1722b2a6e48036b69dab03db0bdca04f1411f9ea14c70b07d6af04a908bb35755f7b49db3306d3f26c43cf9801d6044fa3041d8210923ccddbb4f15861d811d459ce236e21dc4bb88f710ef233e407c88f808f131e213c4a76e2eeef20524dfc834119fa9529df139e20bc497ea541933a8f2eaf84ab356a8393d8790ea34492a32766a454b57acd7476fa6983514f18d668bde80b9cedddd88ef10df237e40fce88c53217e42fc8cf805f12be231c40dc4cdbb8c53b90bd7ff879176db6da8fab6714b17843e60d8e4d5c23cf530f1278f82e4df93c00fe2b66212d06ec4e3eac938f4688824c7f28e84ea62492a32b6efeb463c89780af134e219c4b3e206e239c4f38817102f225e42bc8c78458fe4dee6c69776847f507cc4d5e65f47da6dbc8a9efc6dad29ec104661c5a9fd80986041e1a812afaba0b1d345d3b7ce7ef15902f186d243328db834d69642aed5d3b6707f373c888b12122eb288fb1117338388cbbd4a4889201ed59fba797ee34637de7cc5f5e15fe1c6fde2c3852af43c5caa2334c40a31645e51c53fb717cc3b989590a0daddb11843d2f5634dad63b7322ae54874b41b099d7c3bc45b5c069421899ea68fc4e0ee6e2486488c9090fb9b2031456286c41c8905124b2456dc4fbf36f7f79e006f16d4f9e9f1cd8a3bef55bb728b1afe416eac3322622837160f48a0981ff4306e058935121b24b648ec90d82371d08517a4f91d5599cf5951bb3168ab1ed470a68efc4b0c940cb90e122775bdf4e07ae731dcc419890b1257246248184898485848d8aa6795882391f8f2bcf8efed537d5a70c4e58f70637d2ac9aaf75db53c24915473e189942ab1a36ae07ad5e2c2595b6d2817126986c7eaacb2634bd5f54c48e870d61a26b24a0c35803b50cbd4e5c2f1449e8a36d637b8211ae491905b2c222161ae8c4485a7141255246aae1b2e6f705b5d43957927ea9282abc333b667356e6bc5d57447a281ce45cd94279aca90444ba9225813553a7d9182a56b29f0905155a6777eb50544c285732dc413ccb490b873be91f02021b7e843c28f4400892012212444f4088f0d9eca6a3fd39f75e37581c3a7d7ff7813f97fcb8d7143920ab5045d4ff0d9d2cca27a697917492209243b6af5a098204f4d4b155e3885f462755168a2e346b2abb680482e2e99bb4aea9b2a5f919e59af834d12bbfbbb91ec21d9477280e410c91192632427484e919c316821391737905c20b9447285e467e7fddd356ebcf79b5dbe991bf38de4063369605b75dc527287e41ec9832aa7903c227942f28ca4440fb9b8221943d250e9f822c56892d19473a6590b904ed8491d38ab0e0bfcbff6ceaba9755e0bc3f7e76fbcf71e6aca9c2b2004ab5885920077d44042a8010233e7bf1f494e8fed3881c0dedfa79967f6242e296c3d595a96b47ceebc69e0ec1aed065a0f4b9f4f15ee20340eec22ac22dc0bba469210a1b19922640839c208a14028112a841ae1feec5ad1391f2fd6a74a7beaf931f25da70aca2db7e4d5b4fb03e34950bc35c1217838b525a2c343b7770fe111c21a2a7bf68602c68db06efd69c77546c2e3a074673b5ecd130477b6ef159ed8418fbb4784e6255696efc66a50374d7f0de13ac20d84264a14101611961096410210809c819c835c805c825ccd1efb4b8bb919d7a9120f187da9e92dbfde443c19d85c7c0de4da5e96bd59b7fd2bd2c0cb4a503a05b9b1eb3476ea76d26047d85a24f71537a364d5ad983d36da3837c82d48d3565868b510dc5a9a27c1cb0748cbd23c59ae1be40ea41d1c72907b900790c75e0912f204f20cf202d201790579037907e982980ff6e9e78c786663eb8c547a13a88c06377676ada523dcaaef9a7ddc283836ed5e3bd7f0d34e437465126237b6ec6d3b9a8f20db683e21b801d901a9d829efc68da0b964377641aa207b202108c1851aac6d02a1200cc4681381081009a24034c8ac3e95c7f3e6fa54c5c00e6dc702c4560cf488c578feb053ce6dcafe3914c33d8dc7c54d707870e1e2c9def2cc74a5ac18abc60a9003b4d697ef86891247203590fae8ba3f10b3f704c4444063e92a88898feb2039ee4de3f1bcf5dd301ac458193686748a964ad5c593b531dc7cf5d80dde0b17dd4f904ddc99c65ab0e9786bdd9dbce4b986a4085202298306636b625feba0003d033d07bd00bd04bdf2f3703d7360daadfd718fabecd45c6a51ecc587987857fc20de12afe218bad174b9b88915f41ab461c568edc611c3e6ef8d8de5ba416f406f419beee9d87a71d016e81d681bf41ef401f4d1bbe19983381737e975771bf4c9b6f8783d533c02688835181832b0c5ed756ed06737de5171d9c50ee88b1d51efacd9bb8cd3cef2dd300ebc81be4fd75200ed827e807e826e819aafb7e3ddf0cc8169b76fa6d954ecc806ddb5b7e9ebaef6d630c50f2a37fd4cfdd8c596baa366f38d9e1bef15a3412236742c3bdfa055d0bdb43a23a0212801a5a0ccd719f1cc87addd766ba1bcc7b5008d2c8d473b7baad3dfd2bab7dc9adf68f354822a501dc78d7d9b5d2411948965996ef81a3c9e6561daedc00a83ad5958b3b5d7623e5e2df19676799c92211e173f44b3934cab6df06e78fe4a62378c12032adb3d9af521ae08dbd816877363e7d656b64a027781c1bbe1f92b31edb6bbe78a40f769d66d2d4263023db013d10df4b0f774c0a81b41a164ef339b4cc9e2ddf0fc8dd87c63448c578ca9621e77abc32d66ef800e33c4f5a9eed2dd708cbb017a045a1b7503b49ee9c60be8b177c3f3d398763bd2d62dcd177bdf197ae2ee19dbc73ca5a7a02b23ac1ae25cdce4dc8d44cc2ebbf7c7dca8ee80ae836e806e8216408ba025d032580006ef86673eac1b55773f8d3e27655b59dd347d763664e2691fd7a7320e8c6a34a6d4cfb901760e760176097605760dd600bb01bb056b82b5c0eef0eac7fe3cf360efdb748cedfa62f4dcf8f5b801d606bb077b007b047b027b067b713cbba71db0d7a0ba6bbb5bde0d4f4e4cbb5d548c3fc68dad2202132edec0dec1ba601f609f605b8e6db01db00ad82e58d5e801b6e7ddf0e4e2eb6e98bed32fba01168211300ac6c038580426827a014c1a6dccbf600a4c1b31c0f6c10ec00ec18efe756ef875540b30e6c6a5e31bdd30ddb58fe325bb5103ab83990727f68ee3ccf4af5646ee85b90e6652a53530f360036c13cc68539c6fbdf8d7dbdfcc857e89f516be11efc6020cddb85cdc8d54dc41cb7303ac0456060fc0017e66ba552e2f9fba867bfa017e0e7e017e097e057e0ddef83937d2569ce739f7bbf06e2cf007e9b971b918ce0d171c9259b61bfc06fc16bc09de02bf036fa78d6f80df833f803f823f813f83bfcce7c6ccda8419bffa0bbb91b8d07cfaac890f9078ba7723f16f9b7dcc74bec13bc97c24c496596e2cb94f05fe0afe06fe0ede05ffb0d976dad85fb805fe096efedd06df01af2c528367ba45661c96e7942fbee9a815798ef48cfe41f2d4a7cae9c6227163e96eecba865e05df030fddf5dcb471f17570024ec11938078f7eda8dece831fd1b3f971b39377a12ffe069c79876cbc528c1094f6432653761e4e3f7e3860457e01a7c1ffc00fc30336e1c81d7c08dfde6c493afbaf196a3c54f1f9ff32dd2ded4bbf15de48c1bfc748cd4ec623c651fb89135bee132f265bab102be0abe066ec2c206f8667abe51002f8297c0cb880244f80637269ee6ccc5d3528b3c6feaddf82e72e61bafd53132f3eaa4eb54f6e6e4c9f42459ea75aae80cd1b9e302d125a2abe4eb54d135a206a21b44b7889a885a7fbd1bf97b5f3e17cff3079fa67d3d316b165bed64122489f38dc6730641a1b5dcf18de80e511bd13da207448f7604307a1a7503d1b31bdf5843f482a883e815d1db8cf18dc40b44695b26fee2694d7fe2dc3cff55897de2e99c24bbcb97961d796662ef4d2347090a8789207a8f87b9fb7af47371ab5469c760d7cb3aece34e6457cd76f8f4fa8def76a38bc884854f445bc15b1dd136a21d3b8b24aa20da75e1a28a680f51689d795d414410d17fddb8b86701ecba3f35462c895b29de5b9b14c793ebfdd1c1ee61dcb0fb7a27cbd890a11bee85963d9f0a9189151c518448d8518e4822528834a27d4407888cd647886a88ea76566274ece753797231edc69815c3257dc68d580f541e7bd1e3e3b81f37cc7165f3836d9aa9697c2b43ae85e127e6a86f15839ae93ead22327da77544e6f126a2022213404a8e324400013f0fd79317d36ee362227d864b5927286fdbf65f79e921ce0c2edff85441a9159fd62f4c32de4bfba1b54d358873880b884b882b886b8806c40dc42d44d326e2a2e5d76f78e6c0e6e2531a1c4663c288bbf18e96cb408aaf68c7f5a95e31b63a7c60c8c0b665b951b74fdf1bc15b2d908540128836c43dc403c423c413c4338491b803f10af106f1eeeee174ea72f49277c333832937c66a8e8c96e799d6a3501ab89114687a1db2a5e5e2c60abe6d6f5cd6ed0685fbe09d048587a0a483ad4d882ec407c427c456b07960b6049b9560f319cf9fc18672526d7a373c33b06e8c5f8f1a756314b13da8d663038b5b62eedc689707ae4ca7294baea550778f5df43031c1606288036207cce52166973d26ee7dadb9118fcc39ea1e4fcc941b435c829114091c26c528c5f7a68963ca64d632728eaf33e2f91b316e1c46360ef4e3435068f5c6b5fb176d7b933f9286c6e3da6de50931066e2c39dff06e7896c920df70865846cb86b8423b3dd2dc984ebebd1b9e7f02d3b9787f1c6372d2606adc1095e92c3cfd3a557be006c42e441562cfb8615b7f0ade0dcfefe0dc184c9ab2637cd1fb907892c8d85491c4f5e27f861b10210419de7f43500806c12122ef86676eec3d941b1062d88f9ab5c475ca0dba3631be31ec4d25e4e2cb7203424228080db10f7100710871045183a8431c439c40986356bc1b9ebca4d552c8ef86ed75a58e6ffc901b10ab106b10eb101b109b100588222eaf204a1065c80012906790e7901790979057de0dcf0ce2ba86a3ed7ed632be5152fb543fe606e4356403f206f216b209d982bcb356c4c836e43de403e423e413e433e40b6407f2d5bbe199c137d46e13629e3aeadfe906e41be43b6417f203f213720b727b448c1dc80ae42e641572cf89114212480ac9beea469e254a7ed5c45fcd37d4fc74a380592ccf8dea3a24878c2005a4845490da59b10f791010a3c421e49169fe9035c83aa4d1e904f21472057275861bd92d3bbf1b7996edff24898bb73cd3fc9a1b726de046d07ece70a3476a9fcae8b101b90959802ce2d1c4871264192a8002d419d439d405d425d415d4355403ea06ea16aa99e5c6cce57233dd485ce5f727b4451fdc72f20d7daaede017ddb06b9b540bea0eaa0d750ff500f568c3857a827a867a81ea60ab08f50af506f50ed585fa80fa9cd1a74a5b6e9abd5c762e3766aebccd58109bfde2d96121637d79f62b4c7fd3b4b3e6fd3abfaec1b2dc505bbfe206d436d40e54056a17aa0ab50715429180ed43512806c5a122280125a114948632bb0ea00e675fc34dac4890479e9c6ecc7cb5e9c7394f991916323a7ef37ed36cfde6fa3a7f20d68d050b7ef6d7c4969a1325ae86388196e58649c4d511540dca78720c6502c829d40ad42ad41ad43ad406d4265401cac48d1254193a80c6ecf18dc55a73c689195165e1c634f1c1b23f67c696affc0aa4b5ef7f8c1b690d3b07bfe9c6b04fa5cfa0cfa12fa02fa1afa0afa11bd037d0b7d04de816f41d741bfa1efa01faf127dcc81340d2ba28391b53861bd3af3c71e2f4de6f7163aeaf3338fed71d48e3ef8d1b63637ffa09fa19fa05ba03fd0afd06fd0edd85fe80fe84de82de86de81ae40efe67223bbf52ce646da01d947e67cafec574e7b97996f9dfdeef93ff0ccd7ff03f9ba1b99b5102d3fe246157a0f3a8426d0149a4173e8085ad8310d2da115b486de873e98e146e26fe1f4ff6ec6c63ccde21bfb54f3b6bcafbbb140a0fb97ba31eba04937f421f4917543d7ac1bba3edb0d3dd30dd3b332ffae40af429b575e87de80de842e4017a14bd065ec07d807f6cfe67363a2414f378bb48d339b42fe8e4dc629696f91d6a14a6b8b795e61fa9b7ea54f95f109ff10bee8c6fffefb9fff03c5871f5d</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxStyleGroupBox</sender> + <signal>clicked(int)</signal> + <receiver>KbfxConfigDlgStyle</receiver> + <slot>KbfxStyleSelected(int)</slot> + </connection> +</connections> +<includes> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgstyle.ui.h</include> +</includes> +<slots> + <slot>KbfxStyleSelected( int )</slot> + <slot>ChangeForm()</slot> +</slots> +<layoutdefaults spacing="6" margin="0"/> +<includehints> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgstyle.ui.h b/configdialog/kbfxconfigdlgstyle.ui.h new file mode 100644 index 0000000..eb8001c --- /dev/null +++ b/configdialog/kbfxconfigdlgstyle.ui.h @@ -0,0 +1,30 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgStyle::KbfxStyleSelected ( int id ) +{ + if ( id == 0 ) ConfigInit().m_KbfxMenuType="spinx"; + if ( id == 1 ) ConfigInit().m_KbfxMenuType="kmenu"; + + kdDebug() << "Selected style: " << ConfigInit().m_KbfxMenuType << endl; +} + +void KbfxConfigDlgStyle::ChangeForm() +{ + if ( ConfigInit().m_KbfxMenuType == "spinx" ) + KbfxStyleGroupBox->setButton ( 0 ); + + if ( ConfigInit().m_KbfxMenuType == "kmenu" ) + KbfxStyleGroupBox->setButton ( 1 ); + + kdDebug() << "Style: " << ConfigInit().m_KbfxMenuType << endl; +} diff --git a/configdialog/kbfxconfigdlgthemes.ui b/configdialog/kbfxconfigdlgthemes.ui new file mode 100644 index 0000000..9378b6a --- /dev/null +++ b/configdialog/kbfxconfigdlgthemes.ui @@ -0,0 +1,1032 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgThemes</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgThemes</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>790</width> + <height>616</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="QGroupBox" row="1" column="0"> + <property name="name"> + <cstring>groupBox8</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Select default folder</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KURLRequester" row="1" column="0"> + <property name="name"> + <cstring>KbfxURLRequesterThemesPath</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="mode"> + <number>10</number> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Please select the target folder where your themes are.</string> + </property> + </widget> + </grid> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer11_3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>28</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="4" column="0"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QListBox"> + <item> + <property name="text"> + <string>SpixBar</string> + </property> + </item> + <property name="name"> + <cstring>KbfxThemeList</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="toolTip" stdset="0"> + <string>Installed Themes</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Here are listed all the installed KBFX Themes</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Selected Theme Preview</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer1_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>17</width> + <height>21</height> + </size> + </property> + </spacer> + <spacer row="0" column="1"> + <property name="name"> + <cstring>spacer1_2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <spacer row="2" column="1"> + <property name="name"> + <cstring>spacer1_2_2_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="1" column="1"> + <property name="name"> + <cstring>KbfxPixmapPreview</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>270</width> + <height>210</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>270</width> + <height>210</height> + </size> + </property> + <property name="pixmap"> + <pixmap>image0</pixmap> + </property> + <property name="scaledContents"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <spacer row="1" column="2"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>17</width> + <height>21</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout14</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout12</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxDeleteTheme</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Delete Selected</string> + </property> + <property name="toolTip" stdset="0"> + <string>Delete the Selected Theme</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will delete the currently selected theme. <br><b>Warning!</b> You cannot delete the installed system wide themes!</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxGetMoreThemes</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Get Themes</string> + </property> + <property name="toolTip" stdset="0"> + <string>Get More Themes from the Internet</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will launch konqueror and go to the KBFX Themes Section on www.kde-look.org</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout13</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxInstallTheme</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Install Theme</string> + </property> + <property name="toolTip" stdset="0"> + <string>Install New Theme from KBFX Theme Package</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will offer a dialog where you can choose KBFX Theme Package to install in your home folder</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxThemeInfoBtn</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Theme Info</string> + </property> + <property name="toolTip" stdset="0"> + <string>Show specific theme info</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will show you specific theme info</string> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox18</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Personal Image</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="6" column="2"> + <property name="name"> + <cstring>spacer9_3_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>7</height> + </size> + </property> + </spacer> + <widget class="QPushButton" row="5" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>KbfxDeleteDudeImage</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Theme's Default</string> + </property> + <property name="toolTip" stdset="0"> + <string>Set the Theme's Default Personal Image</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will delete the personal image you have selected and install the theme's default personal image</string> + </property> + </widget> + <widget class="QLabel" row="4" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Maxsize 48 x 48</string> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <widget class="QPushButton" row="3" column="1" rowspan="1" colspan="3"> + <property name="name"> + <cstring>KbfxSelectDudeImage</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Select New image</string> + </property> + <property name="toolTip" stdset="0"> + <string>Select a Personal Image</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Pressing the button will open a dialog to select your personal image</string> + </property> + </widget> + <spacer row="3" column="4" rowspan="3" colspan="1"> + <property name="name"> + <cstring>spacer9_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>18</width> + <height>54</height> + </size> + </property> + </spacer> + <spacer row="3" column="0" rowspan="3" colspan="1"> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>17</width> + <height>62</height> + </size> + </property> + </spacer> + <widget class="QFrame" row="2" column="2"> + <property name="name"> + <cstring>frame7</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>KbfxDudeImage</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>48</width> + <height>48</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>48</width> + <height>48</height> + </size> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </grid> + </widget> + <spacer row="2" column="0" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer11</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <spacer row="2" column="3" rowspan="1" colspan="2"> + <property name="name"> + <cstring>spacer11_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="QLabel" row="0" column="0" rowspan="1" colspan="5"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>This is your personal image displayed at the KBFX menu.</string> + </property> + <property name="alignment"> + <set>WordBreak|AlignCenter</set> + </property> + </widget> + <spacer row="1" column="2"> + <property name="name"> + <cstring>spacer9_3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>10</height> + </size> + </property> + </spacer> + </grid> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox4_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Misc Options</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer13</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>KbfxWatch</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Watch System Installs</string> + </property> + <property name="toolTip" stdset="0"> + <string>Watch for applications installs and reload KBFX if any occurs</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Watch for applications installs and reload KBFX if any occurs</string> + </property> + </widget> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>KbfxShowOldThemes</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Show Old Themes</string> + </property> + <property name="toolTip" stdset="0"> + <string>Show Old Themes</string> + </property> + </widget> + </grid> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <widget class="KActiveLabel" row="0" column="0"> + <property name="name"> + <cstring>kActiveLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image2</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Please select theme folder</p></h3></b></string> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + </widget> + <widget class="KActiveLabel" row="3" column="0"> + <property name="name"> + <cstring>kActiveLabel6_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image2</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Installed themes</p></h3></b></string> + </property> + <property name="wordWrap"> + <enum>WidgetWidth</enum> + </property> + </widget> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="88915">789ced7d5973e33ad2e57bff8a1badb72f26f4695f62621ebceffbee8979e0029014256fb2645b13f3df279127012e925dd5ae2add6a77f984441e2091000e565232f5dffff5d7f5f1c15ffff5dfff183f7bcf49f057107b4f7ffd5738198ddefef7fff95ffff71fffac775b7f35eab5bffa4d3afef37ffce39f61ffafe0af4a8dfeda1de63dc7bbccbb8ef798771cef336f3bee316f39ee336f3a1e306f381e32af3bae98d71cd7cc6f99d76bf54ecdf0a02ddc837dd0729ced83a6e59d3af3ae705fec1b96775acceb8e73fd4603f0a6f2387e9438dee6f2dc306fd41a529e8e705b9ebee3287fd572294f4fb82d8ff5177458afe0da71d62bb8759cf50a2e1d477d2f2cef727b0657c243b1af592ef1e78e737d8223c7b9fd8303c7b9fd837dc7599f60cf716eef60d77194f750b8127fa78ec3dfa6e3a8ff86e3a8cfbae53de8bbe638f45b751cf579731cedf9e238ea37751ce5d912ae25ff15cb25bde738d2571c477aed38ea93380e7d52c7797c04778e43af27c7d1ded23fea35e4e7f71d477eb1e3c82f721cf98d1c477e0f8e23bf89e3188fe85fcd5a53fae3b170dbfe678ec3ff8970db9edb8e43bf99e5a2dfabe3d06f47b8e8edb72c87bddf731cfe7dc751dfd0719467e838eafbe838ea3b769cebeba37f36eb35c97fc771ee6ffea9e5e86ffe99e3ac8f7fed38f737ffd2f126f386e3a84fd371b467d771d42f701cf5538ea37e03c751bf7bc751bf67c751bf2de175a9dfbee3a8dfb9e552bf23c751bf2bc751bf0bc7b97e23f4b7668b2630ee3fb06fd55a1dd8633e68397db71d47fe27964bfe078e23ff9ae3f077e338f4ed380e7ddb8e43df3be175f457ffc171d6cf7f749cf5f3c78e43bf37c779fef2678ef3fce96f388efa6d3a8efa1d5a2ef53b761cf5ab3b8efadd3a8efa45c21b988f7ded38ebed0f1c47fd868ea37ecf8ea37e2f8ea37e6b8ea37eeb8e63fd457f6ed3f28ff2613e6b53fd509ed8719427751ce579721cf94f1d47feab8e23ff15c7397fef5a78a3c3fa7a378eb3bedeade55dd6d36b3acee5f5ba8eb39e5ecf71f417e538ea133a8efa8c1c477dee1d87be13c751bf57c7b97ede99f0a694ffd27194bf66b994bfe538cadf771cfd21701cfb0ff48776abe961ff85f1d9a9753a6c5f1908d74d2e5f65e43897af82f6ecd46b127fe738eb5f8984d785bf58dee2f255a68e23bf99f086c4bf390efdaf2c173d2e1c871e75cb458fb6e3e87f55c7a187e738ebe1ad0a6f7678fef4561c677dbc2dc7b9fdbc0dc7b9fedea1e3dc1fbd3dc7d11fcf1d47f94f1d47f91b964bf93b8ea3fcbee3287fc57194ff55784bca3f751ce5df751ce55f771ce5df771ce53f761ce319e5efd6bad23f52e1b67fc48e73fa0ae693aeeb1ff78e737d2bdaf216cf6f1525dcf68f89e3c8efd971ae6fe555b8f48fca8ae3881f3bcee3b3123acee3b3f2e438eb55d9731cfd7bdf71d4675578b3c5fa55761c87fd96e3b0df701cfdffcaf236ea77e238faf78be5d27e33c7d17e2e3f69bf35c7d17e478ea3fd0e1c47fed6bed586de978ea33ce78ea33c56af16f673ded071cc2f89e3b07f709cf5f61e1d67bdbd89e3a8df9be3a8dfb6e3a8dfa6e3a8df89e3a85f55781bd77b5ec5718c2fdf725c4f799ee3a8cf9de3a84fec38eaf3e438eaf3ec38d76784f9b4db6a7bb85ec57cdda3ed18fa1fc65bcff5a76dc7d13f1e85dbfef4e038ec371d87fd81e35cbfcabae5d29ea78ea33d2f1cc7f890f2b9f63e761cf1d78ea3fc378e63fc1c3a8ef153779cdbaf52731cf5e93a8ef68b2c97f6508ea33dee1d477b0c1c47f98e84b7a53c0dc791ffade3c8bfef38fa7fcf71f40f6db99427701ce519398ef2a48e737942e8ddaff5d13f2a586ffa4e8f96e3284f47b82d6fd3718e1fa17ff65b5d0ff73bd0df3dda1eb37f8df9c4ebd4022e6f88f6f36bbef4478c07bfe579b81f02bd02ba9ec7fd16b45f48d7efe0e84faaa630fe86682fd50a3cccf798ff744d4b3ceaa75bcac3fd149e2febb57a0de335e4fe5ea73f8cd76113bc4d45e4789ebfea0d5aaf513f1e0ff526cd4fdcdf8735f076d367fd439e4feb2d3bde431e0ff536e9cf7c7803de6efb680fd6a7dea97764bde2f151efd2f6129ce73fda3cf7b0fe0e2fc1db5d9ffb7bc8f37bbd5fef633d0e793da97b750f7c780edef67cdcafe1f9b9eed7fd2eeac7f3593da80758bf87a7e0edc087debc5ed5c37a88f890e7fbbaaa2bacefc363f0b6f2b11fe3f5bbaeeb5ae20fc03b351f7af37cdaa00b7eec07429e9f48de3af603c31978a7e9e3fa9cd7c306fd213ee4f9add16c34b17f0d793ea2cd570bfbd7e13d78a7ed437f9e9f1aed461bf121e23b8d0eeebf0c3578a7eba37ff0fc4a9baf2ee2431e4f8d5ea387fd702500eff43c8c6fdf712e5fda11eef9680f5e7f1afd461ffbe78a07dee9e3fe59a522dcc3f564a5ea38e75fed0bf765bfcbe3b9e1353cf8abf6c0291ebc2b3cc0784caf2cc7f8ab7684871eeb5b6d3b0ebd78fe6af80d1ffbfb6a0bbca330beaa4dc759af6a43b8f6b8bed53a78d78e1f5e6f1b4123c0f541ba03de5101f78f6a0d9cecb97f556f85d77dc4df086f60bc54af1d67bdab57c29b321e783d6c848d10f9552fc1299ef5ae5e086ff9ac77f5dc71e87d26bc8dfe5c3d751cfd97d783866a285cbfa52fe0dd7a80f29d08efc0be7aec38f43c12de45ffae1e3acefeaa07c27b3ec63ffaa76e68e457dd07b7f1d53de17df4dfeaaee3688f1de19eccbfdcdf9ab5660dd79bc355f04e88f87400de6d06d0775bb817a07db684fbd27e9bc203a9ff86f010e943eeef345dcafd82ea3a38c5a33dd684ab00edb1ea38da6345b8163e731ce381c71f4d070df81ff4c0bb6df1f706deab05688f57c7d11e2fc2eb01da63ea38f49e086f80873cfe9bf487fb1dd567708a477b8c853703d4f7c971d83f0a6f85188f0f8e637ee5fd6bb3d56ce1fec910edd1a2fec57a0fae8477458f7bf05e1be9ab778ea37d46c23b21e65bdebfd072d586ffea10dcc60fb8ffd066de13bd52f05e17f1d581e3e81f3cbe9bdd5e0f7c00fd7ad41fa06f0c6ee3ab3c7e9afd5e5fece1cfa3f686fe1adcc65795704f38f4f18973ff49d13f022a2feb91a0fd036a3fb44720dc877d15fd25b43ce1f9b0a95c7b79c203c40fd1bf69bcc978c0f8d1bd50f2e7f9ba55a3f2737d932678af8df63e79161e86589fb83fb5ea545e4eaf86e03d85f884e7c3162d37684f950a97783510aec51fb76fab49e391ebaf12701b9ff0fcd96a919edc1f542c5ce253d6abd5a6f2f378521178bf16b2bf94e777bad8a9213eb9141ea03d9406b7f64a09af830f50bf2e7508d65785e0363ee5f9b7d5a3f6827ea7c215f4550178bf21fe58ff96e93fdc7f950f6ee395279c9a98fdf3786f79bd16fa5772044ef943cf8a70b157684fbfdf92f43c5e5b41af83f19fac835bfbd1ae706b0f7d435bdfd10e78bf2df6db8ef3f84ae05f593eda12de011f70ff6ce95e5ffc6d82dbf811cfb7ed5abf2bfe02c759cf01af47ed3ab517eb355a07b7f6a335e13de13cffb61bc4397d7c2bbc1f72fd075cbe7693fa33f7cfd10a38c5233feeef6dd3bfb8bf8d66e0363ede171e843c3e473c3fd3c584c48f5e857be029af87ed4ecf47fd933e38b537ee07be0817fb78265c853cfe463c1fb569390cd1feac7fbb47f6cc4713e1121fdf837b7505bd509f3e9517e9513e8f38eb31ba171e8a3f9ecf69b3203c467bf85e53617f8df60a7a21e6a744835379a12f8f7fea0c0dd1ef51b8c48f9e846bf048ecbdb6e2f979087bd553d25fc6e0d63eee817bb590e323e8abbd9ec2fe9bfb6f872e10317f0dde847764be63fd3b752a1feb33b813de437cb402ee798ac757c4f353a7e1050ae39df7939d268d1fd663e009f7643ee0f1d969f565fd4af6c1bd3afa4b1409570ae38df5ec74fab23e25286fc76ba27e29b74fa7db97f52719827b6df48f08f977fd9a42ffe1f14fbb795fa1bedc3e9d7e5fd69bb80d4e0b16973f827ddf6f2a6eef01eae7517f42fd4fc0a9bccc63de5f9addbae2fae92eb8df565cbf01cf879d80fa0feb11ed8053f9307f40efb0239f670f9fc0a97ed81f6c0ad7986fe22d70aa0feba351fed0ef29f40fb48f3260fb29389517e30b7a6903f69f8253ffe1f94237c17d4f61bc71ffe99a1baed8bf54c0fbb25e0c3438b50fc63baf075d73c1cb7aa6b7e07d595f9315701290e3e344b846fb440138e9c7faeb9af040637e42fee6828ef54977c1fbb29e8eb83edd6657ee4f473d70bf8efeaa6f842b8deb59eeffdd9601db5f82fb2d691f5e8fba6d03ceef19dc6b487b748487d21ed7e0414d63fc22be63c0e9e1cff467d63b3e04a7fe80fcb784d310e7f4dcffbafcc7f1c8bfeb77d1bf35cadb0d9a1afb1bd4b7d795ebdb01ea4b57b3689f21afffdd7e57ae5f07c8bf4f178cac773400f7fba2ff3978d0d6d89fa03d3d03e6684fcf93f57760790ff3d3107af806ec1ffdc3f77d8c0f7d0a1e7435eeeff0f5266d86035c1fc54370d203d7f77cbdd70d0d98233ef464bd1e44c27dcc17c9049cda1ffda129bc0b7df53178e069e8cde3b9abbaf2f9ff10fd5179b23e0f79bfded506dc9ed0577b76bd46ffd3347f707bea23f020d0d08be78f9eb9418bebb35370cfaecf7570ea7f684f4edf33378c303f6d82937ed0f34178a8582f7d001e680dfd79beed991b1e182febe09eac9731fc9b1b00685f9e6f7b4d03b61f83939e688f35709a6f58ef2811aea43df7c0c39a46fb70ffeab50cd85f04eec97e61c8f35faf6dc0edd706f742c4c74fe0341f717e7a073c6c6ab40fef4f7b1d034e8ffa773c8df5406f81872d8df6827f1e20ec5f83d37684db2fe5fed5e33ff6f702eed7e02fd913de95f9aa2b3cc4784c793fd2eb1b70f960dff764bf31809e7dbf81fd483213de83fe29cfd73dcf80d3bf827bb2ff1804e0beec3f928170bb3e5f08d7e81f29dac737607f29b827fb8f08fdc10fea68bf147a05066c1f8253fdb15ea33d82a021eb1bea1f1a70fa6b705fd6f7d8f210ed3740f99401db431fe537305e07685f6dc09cc76fdfdce0c678d904f79b688f01d7af6f6e9862bd817d9dc60ff633dc1e7d73c30efd3f00a7f904fa71f9fb4d03b6af83d378c0fae481074d8caf84fb4fbf65c0f647e0d47ed8df6c0897fd4c740c1ec87e2081ffb601a75f05a7f916fb9d27e11ae9139e6ffb1d03b67f00a706847d084eedc7fd2dda15dec17e207a15dec37a9ef07ac2d33fe6d33570bf237ac6c203cc5f710d9cda1bd773dc9edcbdb1fe1d80072df4b784dbb7cf7fec7f0a4ee305fd9de783be67c0e957c0491fe8cbf32b2d3f046e2fb48f4ffaa03d507f5a2fc41ee50f0c98f3feb01f1a707ae417fab25f8aa157487aa03d783dee2b03b6877f45ed87f502eda568438ffd14cff77d6dc0f1f0af031ffac6dc9f3df38109fadf2d7850c37c916c096f43cf685578a0a10fcf879eb9e18ffd34fcd5a97d71fdbf2abc23f3bfd80721f64731cfdf9eb9a18cfde30c9cda0fe923e13d491f0b57921efe9a06ccbbe0547fccffac97d732607e0e1e78d03392789aff39ff08f56f1bb0fd0e38e985fd2acfdf5ec780fb0bf431fd19fe5f8487d29f793de3ed07fa2fe2bbd63e427d7902e5f403f040a17d22de2f70f7c3786980d37ac9fa47bc1e78fcc7fc143cac439f88f79f34ddfab8df9ea23c7e20fb93f44d78073cd9111e8a3edbe06143f4b917de04d7bc7ff30203f6f7044efd1dfe9e85cb7a1ba5e0b4be717b295e5fe8e239c4fdfdd4030f64bd4e46c215f4d4c85f7972ff3f41fd54a0452fb48f0adb1af787501eedc9e70303d45f53fb633fb926dc97ebaf0bf0b00e7f9afb976f3e30c4f8b80777f6abe0a40fc76b9eef7df30117c643084e7ab2fe8aaf8f7df30107eb178fc0490fb6d7acb7df34e0f80a38d5077af37ce9b70c98737dfcb601f72fc49bfe8af97c0f3cec426fcde3dfef1870fc0b78d813bd783ee1ed2ffa6b021ec87e43f37e9097675cffd6c1a97db09fe0fd3d4f87d89f409f7e5893fd39ef57b93bc21ef5f76c7cdc10de113db83d7cfe637be8e153fbe07ec5b5f0868cf763e15d991fd685f7443f9eaffdc080e3c7e074c18af514e50f0d98a37c61d892f93412ee49ff457f5006ac670b3cf4a1a7e6f9c4d7061c7f031e0612cff50dcc07ce18cf1be06188eb23cdfe02f30129d67fd89b0fb4501fbe5e0b9a061c7f004ef9239eaf17839601b7e7367828ebbbe2f536681b70fc183cec207e18398ef1160b0f50ffb82f3c143d78bc041d034eef81875da44f9bc2e5fa3fbe14aea047c2fd8f2fa7303f9d8087b21f4867c2fbb27e6d0bd7481f3f82ab1af453dcbf797b88fdf8c071f4e791f03ee253949fae6e24bfd0728cef3805b7fe35cfcf26b5f84f1d87ff58785f7822dcc3fde601f4a0051ffe07a7c2e5fe8186fe9e49c15c0b97cf47b4721cfed07f3c9b7ef0245cd6dbe80c5c35707d1cad096f6adc6f407d7df287f96a2adc07d7bef000f7a307c89f0684ac0f1370e78ff7af64ecc35eaf0b97f4bae238aec7d05f42175f152ef72b55cf71dccfef0b97fb8d8ad77fc3e47eed39b8aacbfc86f1a209b06f3b8efd26fa9b267dd01f371d477fe2f118d642b93fa99a96cbe7010de175dc5f4c127025f73b14f737138bf818fe683780f6884f85cbfd0bcdf36b683e50c67ab1096ee3e389f00ef456b06f1af0f85b07a7fe8afc62e1d69ef7cb61cb80edabe0a417dab3235cee7744e7c27be08ae7b7b06dc0e3e50c9cf4c2f5f89af02678f428bc8ffb178ae743be9d88ebc914dcda0ffa8ea3fd505fbea1c2f1c7e0a41fe2515fbec0e378e4d723bd70fde20bef487bf0fa419b6fb1576bc2fbb83fa278fde2ed098f2fc5eb072d0e965f0ab7f7f777c1a97ed097d72feebed8ef8fc19587f844398efd8e27dc177d79ff14f21fb71ffc87b4e141f9a0b732e0f857701b1f2be1a1d8a3fd7428f71b22e8ab6d7c742d5ce1fe8fe2eb1d65bef084f5e94db8c46bd64b992fe4e0f3851de19ef45fa4375f58c0fdcb07e1123ff485fb62cff3bb6a1a707fa809f7a1573a141e88beb06f1970bc121e227e70e638fac3ab7005aeb97d55db80e3abc26d3ceacb37a899233ddf70e3f682ffaeae41bfe4d8715c7f4e85d7454fe8c33714b87d9ae0363e3e11de10bee138e66394872f0039fe19dcc6476de14d70cdeb1f6f97717d70046ee3a3b1f016eebf295e4f793b83fcf8fa86a753ccc7a80f7738e63c1e15ffb13dcf4f4a2bd98f6b2e9f365f88c3fd78cbdb523ece5f9b2f6ce17ec8b170891f348477a4feac87365f48c1f5e2ba701bcff5a3dac9fc91bc08efa17e49d571ac27bc1fa6dacbfc115f0997f8c8f2bed8f3fe8a4a27f34934156ee3793fce1f57e0f35dde7ff3ed57f4571ebf7cbb08fd8bd767be3cc77acef3155faea0bff07ac0db47d48ffb072f57682fe8c5039ad3f3f862f9f17d4de8cb7f869f3c572b04cfc127048c90a1089a1111624222181052c2903122dc39dc131e088f8227c298f0ec30214c092f8257c61b61c658a9ae12d608eb848dea26638bb0cdd8a9ee12f608fb8403c2610e478c6387931c4e19670ee7255c082e05570b71ed7023b82dc3e8cb8a667ae6d5ccb47c5fc9452a7ea460a69f5130d330d37143b4dc725aeeb0967ba2a55512fa658a7d5ba9efd168814a825a01f53934e6c1fa860b14cdeb99a999d7b2ac64a663b917e635b40a6ee67a63d623ad92792d6d6fcc94cc74bcc8a976fd813af39a2cd0e21d3417a0f5bd607d8b9ae6152dea392ef44aab6559c9b5b911bd39a761a6e0fcd83e2a69992999f5b81ba75b51ab6f29d076e82c40f7e783f5cd467d51d3bca2793dcbb3e35a69769c9f1fad8a87b9de789c9b0df323fba2a0e562259b39bde675e939f43f46a5fa797ccb37814ac0fa5a55f39a667db4a8e87bab4d79865cd417f3bdb138b2af7323bb56d0d2f6c576a187f572fa983f6f0e7e01c10fc397f70cf37916c17f46df4a5851155d892a7125210ce47d20ef79a4126aedb25786a4706e90ba70eb372d59260b7c0ce7c292dc3129f85c54e2a4e477be3683051ef3b52c5b2654a6791f8b6c4795bbca3da98affb779a83c569e2ae3ca7365c298e6de279517b29bf06b22c72c66920bc5fbab0b9b14d24de94c39bf8adea7ce2eef4f398b49c9dbb7f09a2bd3a274591955a136281b8e26dd5b21d52c17af2ac59aaa9c06aa52cc6d85145dad3cb0be6b95f5ca4665b3b255d926ad0d761838dbadecf1d1bcefbaf83d8edf91901d09376c2f973a9f1e1e1e24dd432e058e26deb23df7bec3717be2e5c179d89534bbb9d2ee32f225c9ce77a5c4bb39ebcc6366bf932bdb434e85ac3e7be2235ff21df18fbaedd36bab726074657d0f2b4795e3ca09e1948e67743caf5cd0eb92cecff81c61978473b6bbac5cd1eb542ccdbbb1bca030a4bf229cd1f915c79c70dc19a735298f39fe8a535e718a63ceef8aedaed8f2ccf93d97dc8ef968ce4ec4f705c79b3c6ca92e39f494de4fb974975cca4b0abb70799f738ec6e2422c4cd96077cc0a9cbbfa1cb3af334e79ca61c75237e3ff9c5f275c4694e02a57f26b52f586f5bdadd408f54a83ceea9526bd6a74d6a2e32d85d52a6d8eadf33b6c6b148ed8bac43424d5adb3a873ba9a7835b6f0035f0d797528a649614df1749bb3699105fc76e4bdc1a175f17feb2c6daab694a541fe50f6ba94c196b029e5ad494ab0963bb77541896d996f5dfd8d2dfcdd4a0ea8a92dbd2d0d80ff67ee11fa95be57a5779cf7e42c63fc4e8b62df9edb542e9d89cda531b6b0a7f89e79b10d9f0beb71cabe0d97b00a7c67de5c5c5fcefbf9dcc58be499f97135e8570a7540399df77cfee2954beeeae44adfcf7b9552169492daf4f325e6fb111e7ff4177821bd9b3ff3c185e729bee1e17168e045f87c976d3d0ab7963e87798e1b3bdf5906e2cbfab4219a59c07906025f2ce02992184d67f0e0b16ff8f2a46c997fedfc78ec554b9942a999f1143a2b73ab58e5d207ae2c1e973ecaf9575c827ce97dc93f608db2d2c05249e9b9dcac6f4c48bc011f075ecaef084378c261b1bc23dcd825fc42ca844353e72171b626fd5078169ae6de13496d30925c6d1962970f7284c7bb428ec863c021b6f4e6fc8e5ef79cbb4931608b584a6c73495caac4953c250c726548a41403b1193aadaccfd895cdfa363e287fd6f7c1e191df9f4afcc11be758f68e97b57972678f398ff9148f85b0a752d8638e3dbe93cae2a994cba32bf3239f3f2fc8fda954c3476fbea4e51c8ddd73ae74f3a5c9f235e74fa552f1fecc9b7853efc57bf5def838e1e32b696af1c2af29851b1b6042789577633f757c22f1334af5c66153c61b5bccd86285d3c0ee4dc2a6fc9a396e626ca94c8a1987db74c6f39463671c87942f9cabb59a49be6f52ca55b67d91f4537744acc9712c79bf49a96d3caca7acc244eab22afe4dd9569c47940ae5a230d677cd5ba7d706c39c6f32d6898d39669d8e9b2e16f16b1262b1295ed69da579df721ed7e5cc586ed3fb3ac5ade7f25ca7d0358edd60dfc86543d2c2eb8e0b5b636cf0f986e4087feb5ce64df1694b6b4bb529361b2e877529d99a94d9a6b4fe37a556c8d1a65f9374b6d6bb4ebf4c0313cafb5f6fcfdbf70ebc43c611bf1f50d821bdc6126a7bb2b13cf48e8521e6d09d191cb0854db5e7c24daafd9ca7438e3b747e0ddb279bbd82ef7df1b027f9eccfe5572c5fdee3612ef7ccee50ca82d063f1bc978bdb77b1fbb93a1cbad80329f92133bcefb9f343b139f44e8c25eb7bea9dd1eb9c7041c7533ebfa4f74bf278c5e1630ebde6a36126ec948e175c8e53b232ef17e4c7845d703c528fd9e7b9bcdbb4e7623f26ab4be71f3e519a338ebd70616361385eba143822d753f63e963a9c4a0d6eb82ed6ce1c6f9ccd58d2c0f29c4b7c21b53ce7d28d5d094e999b325c53e9ce5d89812bc72eb9ecc258df5b41cdabd3eb965f381b7b0dfe9ee798431b7444a8458d5e750aafe5c26cfaa6c48ff14d4f0ab9658e33841aeb0633e4dfe23435afcd1eb25c1b9c4f8dc36a923ecbcf7aab31b339d425079b2f4a5ee7d87c0d5007c494eb67429af26ab85cdaacc9adb006951ae56c88f78e5312cf47e97a3dafef57f91ddfebece1dba1e4d19cf5f9d8238bb18476e9bccb7163634da9104321b481add20691e3c8aacfa9c71cd7138ff064721cfbbec9958e48d1cbfcf079cfe667cec96f20f1f0d3675fbef5ca29fa6cd13725345f10826797cec45b8f6465cbe96a3a26cb9e78ebe6f3c69162336dbaa282ad37eb67e32506cf8b0b054a5ef63d248f7cce47cb2d53e628e79a8efc01381f433ff2e3cc8ecf94af4d78d163ceaf4915fb318744c62387c6928fe2f3c44fe8a84b25826562fdd81878b439e7f2b3b994eb9788375b072955ce9652a296ec85eb2d4a69a79d726a1a8b98f51df8a93ff447f43ef0efe87dc4e774249f230a1bf091c2f8989aa381b1a6f794d28c8c0d87dd71ca81b1374c4247ec75c061a93b720ee26988342ec50056363dfbb8874fc22097f24eca8572a62809ca644bca76b6fc2393de95cb966a20f535feee726990f35da60552481da1d548620c1ef8fc8e41e1acef23e1c91fd3eb99ce267c1c131ee938e558b009b3295b3d71ac394ef90cf1f0f3cc318f1c66429e38fdd8593f4a3cd24fe4f8223e8de5442c900f30c9f978f25f25fd337b37b113f230258cb91cb07cf2c0e067cc65799694593d5096672ec11387bdba1453b1183bdb09a77dcaa93361f64ae95fa4cec617fb657ddf1c66eeb8e2c256257cc6285a66ef33b19de5e2b314f0372bd85a3b6b352b789b49aad95c8ab7429ec5b46b251bbadae0b315e7bbec09a957e7ea3f2b84ac1742ca2a14cbb7923be7eb0b7fc3dff4b7fc6dc20661878e5b14b2edef32df66188b0d7f8f6336fd7db23296266c8bd3eff3d19e199b0dc62e87196f7b7cb6c7e73bec69432c7739d53e1d7739a70d872db6dfe2b03df1bfcdef48bbc7b96d4b982da3f1665edbe20d69f6d916fe325f9be21f25dee6941b52864db6db93106bb32f675b9cb351017e4c8d7639cf3da939c5b3be07fea17f44efc7743cf14ffd333a3b239c50a8c139c71cc9fb29591a1c9185893de15426355ee76461383c1df1d909879c71cc19871cb3dd21bdcee9dde67ccee10782632e89b135f9185b93e28c2c8c9743b63ee1d791f83b91721eb0ed01db1fcbfba1e47ec6e538e21a1c70e8017b3067c75cab53cee3987340fd6c094f2417137bcc79a096671c7ec6b53fe6ba421ddefffa17fea57fe55f17de6ffc6b9ee3af05b72684e200136f8e35bf4ed6b40be7b09a581abb1b97b2c6bc4e2157260dfbbc106fe675ebfc5c8bcf2b4963525f71c825a5a8b1458dcf50ca1afbb9143f97cee385cbf78253c3da94e19acb51130b84da5a5d116e50737e5db10dca99e57825beeb128bb2dbdcaf5c9d6bd080f56df0ffb6b4e8d5c8403a14385b3524accdef1db229db369935ca9030ca67815febb5e962da2eac51383368bd93da9eb7e7732fd8b55c6e36bcb320171bd2992b23de3b1f9423e789f535ffb9d3f47bf80f1ebf8f336f1c5425c4a047e1d6ae2776e6baa00b5b09efb125ff27129f75c5b6c996bda0e2f770e677838a78b4b9e6f3ea717a7b4e39b9b2345d698a365d97174a9a856476c68bd483cf7a2eb5396b06955c1e08ebd3795fea63f5b16565df815728b92d4f53f2c0f3e17dfc2f03ffc701ff1781e1d8039aff5990b328880da757182414ac5d4c627799e485d29b902074e98de7d8b1d8d99a9cb25c94f5207189f123e78a7c445c3a4a8fffd320ee73b829b596501c637ef7510bfc17061f23ae1d42e01171e05af209259de1a1a9b3f8342111a74ed85fcc1e7c4e017f9a4b82b4b1f5cdfa0ee82ca5f73418f2bb79913ef44e603d077c1c727d876c9792cf94951c22cef8e05608614921c61bde53e1a380f6e9ec3f45bb50486a7d1bbf8895b8289787c971c4eff9b20e383481c79c5d88b2b3c590c253173fa29084a0d816f6297b1b527ef61c5e8d9748e2524e9b728cb54825047128d7884b3912bf43d6f72eb827fe40b8a7f3077a11a85ed99162e8f8c0e78f0c1b66ce1e73b68f1cca5740d69358208db1b93779c19febcd776c7f0f4fd6838d335e2936650fe2874afce8fca772fe28ec8eeb646c1f3874c8210f391b29175bc0eed1797fccf1bb021e4b1e6c1a840c5d4e7792f31debfb54c2985ecfde182c7f94f389b55c64e3d8336b53b25ce86f2e6d392e18bb777b362ec4ccc3864fe6629eddd97cdc5842cb794f8279bff3394fe6cf59dff1829c1669372ed5799c8f2ba8f38c9238fb054a8b86253de7f5f5c6a88bf79e9279f5cb7a2f4a93b77b5e106b5b713ca7f2386753b6ca149ce4523ccdf5dfbc0e92524669a65ca1154a3a4dac3a92665cb49cefebc570782ac571ae5e59917ced27eef87e2be4551a2ff432afff7b21df82533ba76fb91dbe5dd2f76d30c6b2b1bc607ce4c65dd94bbef6b68f7c9cd3a2924c824cf18fea52ac09ac27c1a2d923f3972f5d5ebbb99ac8fc305fe78c3f3bcff91294cbf8be02c5148bdbefbd715c6e99c579408dc56d359f72524895852cea05939282e53a2c9ec173be64ff907e03c3021bbdc38605cb51c9c3c8ed74ca3e47b9b362aacc6e98db0b2d2ed547a52f5b663bb391db6b0d0b79974b5faec922cfc3a05c26ec1fcc5eba124c8397e035780b6684157abdc93bb0e2ceb2b0b79cd52c6733cbdefd56ce5ae0c2564ade8a3916739b954a302be4582cd7ca7b392fa84d2935a55a99b39bcd5966359cf3441e5e085382fc7f37d9ad066bc17ab0116ce6b0156c1336bf135b1f842df202dfeffbdf9e4bb91decbce36f3b97fb7629cdbce7b297ad92af8fcf1797d886eec8d906a9b946aaf2fd5f62bbc15eb01f1c0487c1510ec7eeec30c78e0b3659fc7caac538ce9d0147f23a96d0c305a94e3ec8e1d8a5fda83487efa49dcfad9ce65bb53a9cf3711a9c91a2bbc106ebbb1f9c0717c16570155c07377ff0c3b80e6e49cd0b52759ff5ad51483d6804cda0c54f45e9e0d92872d675cc867472569d528aa27519bd859eb274e5bc3a259ebdf79c874e29be7cde9d3b2ba7c87c641e7b731e8b5ee6f3caf2e9875552b34eaa5e187dc30ac32bc17ed01ce4f0bd7f6a0edffb6773f2f13c07069e8d1031e230210c086938248c0877e17df8c078243c11c68c67c2843065bc105ec337c68cb012ae32d608ebe1066333dc0ab7193be16eb8c7d80f0fc243c651781c9e104e0967e139e122bc0caf08d7e14d78cbe0a78ee05922f6f92054e66801740e9512ca6df1fd287bcae7522e41a6a551331535a1e7bde899696975b44a16b5ccd45ccfa959d47357f42c2a6a3585a299a699aab582aaac2b9ea622bf5f3058886401e2efc6a2d4494eaf79a40e43d7338d96e5de59d6d3f6cab28e7925d133ad967935d13f17e9995734eba7ef695a5095d0ca9e3f233599c7f0bb30725a7c1b7705dc3b3ccca138ce270535ad9ef93e99ef91791d8b4a16b5b4e3ddf6cf7c0fcdf7d1a2a2654d17a84a6867cfe75950bb1fc163094f0ee30578164c1ca6b9719e1fe5b66f2e9a2f7772f3657184177b65b967e6fb6651cdc57ace2bba40533cb9287b7ed1c27a7f1bcf054c162a342da8f5e266c64cb73c666e8c2f1ae5e5d9b2b8fa1c2d54b1ac63d62baf736bd27b5a2e5233af67a66841533ce9297bded387aa94d5296ab45827ab94d5caaa95614db02ed8c861b330ca773e5879ca6b79b12fdad972918a651dad921f69f9be9e0545093d817dde5555505908cf41be3c882703e5603761f64f971031624152c080913286194e9ef9a935d9136bf2cf57c99e54537c6ac5f73ca1a6f88c9ac9a79fb0b2f8f9203be5675bb0bedfa7dbf7aa36784f33a75aa5f4bc9feca93f56c7a296da6999149eaa925731ff849f45cff8c9149cd7705ec5f2936a163d6965819af3cf0a617d17f5bbbc7a8bfb5b4937a7dcb774cb9ef2933de927ffeca4fcd393cafd32d372f1d33fe69f9164d5837ec57e585630d3b0ac6251c7ec992b070b9fa7947b8e12eb1b2d54b1a0614ec145fa15b50b1728577ceed4fc1393ac8aa305fdb2ace534d70b8b4ffe785fb9c5dae5d5cbeb9757705ec3b28af67954a7f34fa3627d0b5abed313f32a8685b1bbe8b95defa9579c1bbf3d3b4e73cf50795bf08c9ff9274d95c7ee22dd1629577e9ed7fbeabdf78caa85cff2faf3fcb33fcf3ffbf3fcb33fcf3ffbf3fcb33fcf3ffbf3fcb33fcf3ffbccf3cfd448dda97bf5a01ed5931affc10fe389947c2045ef14ffff9b7a5613d278aa5e28e4f50f7e1877a4e494149da8673c3f5acdd40aa9bcaad6d4fa1ffc30d648c9675274a6def07c6ab5a9b6d436e9bcf3073f056fa4e616a9ba81e767ab3db5af0ed421e1e80f7e1846c70352744fede279e2ea8470fa073f1546d3633c8ffd0f7e15fee8fb6bf147df5f8b3ffafe5afcd1f7d7e28fbebf167ff4fdb5f89cbeea4c9dff8b382be1997121b8645cd175a5b94637b8e62bcd09e346dd12f8f7b8f0ab5b746ddfa097f9c5ac16ff8e554775558f5e7dfe98c0fc9690af0335a577f3c54c452fad231deb845e03f542efa97a31d0437a9910e27a84b045d077ea6c79faeafb9fd5befaa10cbadab13811c88e5d3f329e00baea34d79de6ca739faf3e0ff80a1457501b6a438f09cf066a534f1853ba6635d8d62f06f67e807ed56f166a66a133987b33affaee33f5fb64fffd49ea7e87c699cab92bccbcd2ac3394b66a5bad736a17f536b09a3bd5cd1d1851dee9cfd0ab6a45ad2c575f1af13353b6ff10aca9f325eb7b46adbaf59f029a21ce96acef33cd51dbfa553575f56b8356df6deabfcf4bd6f782e6fd175af39fbe3af43ad57385eafbb7e8abeff4c697c61df5e1175a6d96adef25cd496ff4be4965d8fab2d8a0fa55a99ee7a6272d55df559a937628d76d2ac3ce97c506d5af4af53ca3fa2e57df35da11be52aebb5486bd2f8b0daa5f95eaf9acd6fe267df7a90c075f161b7a5f75a99e174bd7779d76dc6fa4ef2195e1e8cb62431f92beb4cea8f5bf415f7337e681ca70fc65b1a11e48dfd5bf41df09cdf9331a3527a4efe997c5863e515daae7aa9a2c59df1bbaa231fa9e5119cebf2c36f419f55fa3efcdd2f5bd607d2fa80c975f161bfa42b54d3d97aeef2de9bb42fa5e5119aebf2c36f415e9bb42abcded92f5add1b585f936e03d95e1e6cb6243dd93be6bb4dad496aeafb9825bd7b7a46fedcb6243dfaae6dfa1afaed39c744eab6a83cad0fcb2d8d00dd5a47adee8fad2f55d677d5b5486f697c5866eb1beb7cbd6578d48df33d2b74365e87e596ce80ee97b46b3e16899faea1ee53a31ff57a0fb7a23aa7e5590be7daae9b3aad3fbd3f2f48d2a94df0dffdfc62be9eb2d843cbb3e0a224fce16dbfd4cc853f523f573fcd1fee195462af4fd84ba9fd657abb6d90193c677a4efe23ff9a5802889e4d7aadeb1fb997f36a7f4e7b8237def48df0b5a6dda4bd5774857e5b7ea92f47d217d470b21f355741fc973ec255cbe9b123d464f057b1b7a2fa946d1b3f330614e69a3692eed93b3e41ca29752095ea3370e1f4777cc1f993d472367fdc2674f73651790be2fa4ef25bdbabab7447d67ba6a76c0b46f8949df95855815dbb5685dce4ce846c1cf7acebe9cc766b42567e6b53d977633dae1a3c97f97cf565d8aed2cff5cc89ee4b925e55a89d6f86ceb9d1aacd0fc1b93b6abb4ba5523bd447df749df3aebab48df838590df6e8d8e22f93d560a3b91b3d3e88c8f6739fb230e3977d617d1652ec75397f63097f68a531c44a7c514647d10f1ef2745371277e5ac0e914374edf25c5c7e02e9abb4a96793f41d2e51df5bbdce5718b76a4afad616c2fd8a68d490632d6aca593d6af1b19db36f734827ea8a4d37921119f5e3ea3b69fb38c6150ee9b9140d8abbe2b3962d47d48b3d896b88e2b5b9329440f3c394ebd9d6ebd16c79fac63eff7fa2b9ebb1ae37e2602142672dbf7d436132c6e2308e50b7cc1efac6b1b3d1b1fcee4e3c608bd2f8e4b4a9f8b5c75c8ab9322731f7c0388ae5b72585c7ef949f40fd779dafa4ba6a1aed2f51df3badf8ff3f6f35ed11e3fb8590552d7e74a9ee63d943c60f318ecf397b5ecde289b3798aa7cefa3e4bebbc99b4bc3ec5d3f855b84df112cf7dc393acee258747d37b8d15f3f13be52790be55d27742ef2aba2d7bfc85fabed1bc6f76c0351a391bf16c2156c4d6ad3314b626672b31af79713e2daf5ef1a6b3598bb79cf5ac90b69447bcc66a6d13b729766219cdf17aa14c1b9ce7aeb1c60bb6ef81e68736e97b43bd388efd25eabb47fab659df26e9bbbf100762eb7ea39cc28ee4ec20e635263ec9d9f3fa159f3a9ba3f8cc59ef17d29ebbb41c26fc82b84d711ecb688e8f5dba338ae7f52f36ad71603c30bb7ea7fc04d2b7a9acbe4bbc3e8e69dfcb3b60735dbe11df2e84fca677ecc61585c95a13d7625e63e266cebec9212d67538fdbcedac4771cebbab4bc9ec5fc0bd67197b84d41e74995cf1ace5f9bc22a384f3ceb8dc23bef949f40fa8e48df5bf36c81f86d79fa263eebcbdfd7d71b49b0102154a03359dfe84cd6a8244af8ea2e89337be89b24895c832569223ba224648b2c2daf4f89e25052114a260362436723b9520ed69fa6b048cee3c4ad961cfe0e485ff3df0835a36fb2c4fe9bdc270fbc03a6bc49dfc785e0f52819d3995c87716852f033c9d9f3da94bcb8b8d7447a4cf22416cf85b4330ecbf80a319b6295ce0bfba9e499ad67b978c9ef9dd233485ffe8f0fad9287f86689faaea93bdeb9d0d8217dd71782d7ab6493ce64d5e1d0ed6447d86eb257b09f8a3d5b275b1422736892e5b005fd73690f5c99d67329b698ed25bba2e19658e73d1e88a7c5a56790be3407ea3aad3677c912d7b7e4d0e97b43fa1efd14f08a979cfc246f3f05a4ef8dd3f753ffd3f3697d5fcd1586d97b93bea73f0567ecf9fc2779fb29207dd7cd1a4eabcd6bb2b6447d2f749fae309ae6da91f4bdfcaa207dd7cc1e94569b7e72b5447daf75c7ec80cdbd0fd2f7e6ab82f45da519b84db3612739fcd775fab4beb74e5f6ae3a4f65541fa5e3a7daf97a86f3d69981d30e9bb42fa36bf2a48df67d2b74bb36f23692d51dfb66ef10e78a4cdfcdbf9aa207dcff81e569feabbc4fb3b495737cc0e8d5656d37f7bdf81be4d3ba81a3ea80aab0ce4d3cf814fa1eeaee22044ba81b2690672c53508accff7acadbf41c461f23960d26796bbcb89927c04d2f79cef3e747423a91735f895fa0e127dcb3bb4a6e9bf83eff94b73a987c4e51eece0cec60cee29d4fde2f4e051d23d4189ccc360ec7cbe639dcb29cdac06cf73e5a87eabd0a4ef0aed80a74943df26dd25ea3b29e83bfd0ef075d7e095dfdf88cb95ea60652057c483550a5db356837549b781103adb14bb17e7f3236bbeff3998d199dc1f1d6cb1c5bc970fa037f49ad577b0bd447d77d4bdec8067a4efee77803f5b1cf0f5e9e080b8ec76e85cee1f0e0e29f4386775c2e9f833b3c1199d9dbb14d6e747d66788a333eb1f16f35e3e00e93be3cf185bea7e907ca4c84fd6f76270c93bb4a632fa5e7d07787733e07b24835be272f772501fc8ba31a8516883d5a9c396d33545b1ab81acdf83b6f3f99175c3d9cabc39e8b0c5bc970f40f3c38c3f236f0c2e079325eadbd557bc436b6bbabe18f4be03b4be0d1a29af6a69c584c053eaa5767debd9d894efa4a481b14af92e67aae84c56a63482c7f7ad2d244c56c1346656f2f231a8ffaeaa897ad1b7fa6ab0b33c7dd3c4e9fba637d2c1b7c1a9523a1bd271c861bcd2a4a394efab7218df41491f52fec42e7d62ab522c9d8fc5e7bbd6b9723e5398f4bbf4314b252177df2a35e9fbe6f45de2fa964ef585d901d395cd0ee9fbf24df0ba96bed119af6be90a9df1ba93ce525ea5d2550ae135295d4f79c54bd738e54cf47d49e5db25269ef1a135e607f62a2b5afaca16b9efa850dedf2837cd0f3b6a42f5bcd717e9d612f5ddd66766074cfa9afebbf34df07dd8748fce78354a0fe86c4fb4e0cf1cd2430ae1352f3da233d3cb8f39e58958eda4b24ea5a7e2f3636b783db3f9d0f9395b94bd7c08d2d7f4df3b5a6dced225ae6fe9457ac93bb4aea6364eafbe89d2b57b7a4361bcaea5b5947701e935859476f06983c29a627595b67269afbe695d7367d7b9f8792f1f82e68717b5ae5ef5557a994e97a86f5b9f981d1a5d996f93be9d6fa23477a55d0a2b7c5f2eeda79d61b56835ac5018af7e439fece50a7018c0e7c7d643df9dc99a97f6385dc9cbc7a0febbadd669277aa14fd225ee7f87caeaab690f3ed4df047fae388ce98caf568789094d8f731e074359d9d99ed73e9a3a6c4adfa6a4f3217c7e683d80ef616463e97cc4b6252f1f83faefd4e97bb1447def58df0ee93b217defbf09be461d3ed2195fc10e1f3834f3f74c4cd6798ee1b1387cb1366cff98cb7ffc9175ce6e4a61af39fe9af7427cf271b949df8932771f8cbeed25eafba61e069774d558559ba4efec5b90542b742edfea19aed2b9fbc465b84e4c56f6e1269d6fb9501e95c39d2c9ef9f647d6ce6a9773d9cb85ec0d0bdf71e5d41f409b27d3af513dcfd4c370899fcf0ff7f5a1bed22d5dd5cfa4efc15705f55ff3648d16ade687c3257e7e313c227d2f8cbe6a83f43dfeaad0e6c97f56df257e7f6778a2f7cd0e58afab23d2f7f4ab82f43d227d1bea41ef0f97f8fdd4e199de257d6f49df43d2f7fcab82f43d54abb4d37fd0bbc39325ea7ba1b77907b1ae688e1a5e7e5590be076a95eab9afb7874bfc7c7e78ad37cd0e82f4dd277d6fbe2a48df7db54af5dcd59bc3b325ea7babeff4e1e0524dd52ee95bfbaa207d7759df6d7d375ce2e76fc3863663e64a4df513e9dbfcaaa0fdd913cdbf57ea51df0f97f8fd87614bf768cc5c90be8fa46ffbab82f47d5497b413bdd3bd616389fa7648df6da3afa23dccb0fb5541f3c3a9d1573d91be4bfcffcd613fd23466ceb452b4071f55bf2a48df63d2f74cdf477ab8c4efef8c2ad14c6fd2558dd20fa4aff75541f3c383baa47af6a2d96889dfaf267df7694e3ad1ca1b93bec15785def0cc93784f22aaef52f50d474adfd3554dccfaeaaf0ae8ab1e223d52c3febfaed3e7f58d7d3576fabef7effdfff670face627fa9fac631ed58f4a17a617d93af0ad677551f92be77cbd537b98b2a7a5ff41d7c5588befb23952c59df782fd27a3779f88fd07737ba8df746e9bfaed30fe87b130df5aebafb0fd0774defc67e7cb3547d87c97d34538feaf53f415ff518bf25f74bd6772ddab7fa7e6578e649dd8fc95db2b6547d47c921ed8037d5ebbf9ef6df0d6a5d6fc67b54dfca67527f5adf8bc8dc03ded7fd2f8f337d17df24174bd5f74e3dc43ee9fb1f82c44fae97acefa17dfe03ffff3e418de4171b9bfc8b8d5dd5955fa05ad7eb6aaaa65a31621d9bdf5b4c1e0cd41de1d5807b4ac72069240ddd223418b7fa56ddabfbc1a581be225c10ce0c5273e7e5449fa807037d48d827ec32b6f536ad0f8f7a93411afdc86f3c256bc9ed72f5d563fc8220ff72e0befb6d46f32b81f6f718a7f82546f32b8cfa957f8371957f757145afe935b5c2bfc9f92cbfbd697e7573ddfdd6269eb950e7f66a733b711b99d6312d835631edc12d216dc0ea5f58d559ef7dabb351583de9fbcf22b91aec8cc27f5da7cfff7fc020a136bda77103dce7b0e670e57098c385c3750ead1c6e1dea39b41dba1683ed1c1287490e3b0e179f46379da6dbcbfcff805f87746b78363cfa342e92aefed4f7487f157e377d93ab616f78f8695cc47b3f5e869f89df4ddfe17eba559837fe2550da4f7d0befd7e1b7d39766dd78efb3482e3ef72dd25f87df4b5ffd46fafaf1dd6791aca5176af7efae451ebf97beea6c7831523f8234d12b7f772df2f8bdf44d1ed27634fb110cbaea53ff27f1abf07be9ab1be95654f911d0eef9e1c7cbf1f3f07be96bf4f9b15f2ba6eb974f7d8fe957e137d3975637b97ff049449ffc9dab5f85df4bdf74aac6b893f359443afad47d985f85df4cdf2d7d66eeb07d1eeafe73cf81fb55f89df4d5b3c18e5a57173f8411cd309ffa259b5f83df4cdf6db5f1a388f7f46ff4a9d56fa56f9cdcf1dde01fc248a9e71f2fcbcfc2efa4af7a8defcc671b3f067daf3ff59f12bf06bf8bbefa49dd25177af3277c1e79a8efd5f9df5d1f8b9fadaf7ec0ebfd7803754c38c96116ed27f76a8c4fe57e147a5bf774434f0b399c983c91fbe74bff77ea5bd0edf43de43eb3b3d8a63dd53d5d17ecea93c125a9f363fb33f32ca213eac39b743537d5e35c3efb94ebae7ed28fef972edf0ebf8fbea22b69c7ca1da823c682b5dd7cfaa9276a0b9f7a9acf3dd559ec47157e5692fd24799d7f11e133a8535af3d9e71d797b5177fa423de835f3d9aac94bbd51ae5b7a4225182fdc79a0d407dc0aa60d58e7bf5f5f56f7844a649435cfa3d8a69ae0f3e279acea9936bf3b7ba156f933e3b5c1a5ee51cb3c50af3e349f3cff28c8c791da276fa6c58fc87b6c722198fc2ed439e93da3522c2a9b698737b54d3530ff15bb47353af971857f92bea7d4730f595da3e18a5ae1cfdf570a309fc79b4fe42fcdaf8d9bdec69fc2b7a221c51c53ea37bda27e18e463874a71c8a3e94cef6b857c784cdc50ce975402538ef9d2716abd4ae5300a1f528d4e7f1b7d3fdd7fcdb73fa37dbe773b24684685668c1ef56bf33bc0fcfd0373678cbf49c3df16e1ef8d6c13704f67ff0374a4f7fe1bf7df1f9b7f97837fe7f93753f993fb87e5e1df74ff5054f953fbdf65e0df7cfffb078bf047df5f8b3ffafe5afcd1f7d7c2e8fbad35ff0f3e055e53595ffb1de943fe8ef41ffc288c8e07d80fb2bee6298b5be6ba8bf7e17ff0e3a0eb405274536db0be6f6a4657dfcff22dfd3ff85198abf1675274a6de58df67355123f31b9ef61ee11ffc10cca75c53fefded67d6774421f7ea413daa27734fe50f7e104fa4e403297aa74646dfd13de3a1884403a3c71c9ebe13e3397c6f4ac98973b665b91f3d3b4c4653c20be175f44698115646aba335c63a6183b0c9d8226c137618bba35d5555158647f055c008090aff3ca62215ab843150a91a1a9c3c572b554fe05703424850fccf675135ae26844135ad0e19778cfbea43f5b1fa54e5fd1995f9f91bb82fe1e1d3287bfa28d74c4ba3e6aba8093d5745cf4c4baba355b2a865a6a6caa959d433859e2545ada65034d33453d53c6a2a539575ad3e1326d529ebfbb210d305987c3716a59ee6f49ac7abc39beb9946cb72ef2ceb697b6559c7bc92e89956cb9c9ad23f17e9995734eba7f39a9655655dab2f84d7ea2beb3b7b076fdf8599d3e2db582960d5616d0ec571be5d50d3ea99ef93f91e99d7b1a064494b3bde6dffccf7d07c1f2d2a8a7e6a35cdfaaa55d5e8fa569d1156aa2bacef7ced7e04eb256c386c2ec09660db61271be785516efbe6a2f97290cd9773233cdf2bcb3d33df378b6a2ed613bd34df4fcb9a1a5557096b8c75d67751bdbf8dad02b6172a94c72ec09a65bae5e1b931be68949767cb45ab4f59c5b28e59af1ce4d6a4a2964535b3515fd63353149aae594dab1b844dc256758bf5fd4895923a258d16eb6495b25a59b5328402fba773880aa37cf0c1ca535ecb8b7dd1ce96451517eb68955caca55533eba1853eca8a6e0ab618db8c9dea0eef7f3f522ad3ea736a1515cbcf8dd90c0905ddf87e57cbb29ae53527df0fdfd3b0ace2e44325cb5a5a35cb7ae614adee12f604fbaceff7e9f6bdaa0dded32cb7c2544af3a31dddd9f82eafe08bd69bbbb9151cea65fa3d3bfd3205e7359c5731d3f13d2517aac938201c0a8e58df8f4769fc4e7f2be9e694fb966ed9dc989f1fb319b2b8da0cdfd90d2dda0f59ed16a907fd8afdb0ac60a66159c5a28e7b4ec74c49d292714c387138657da3852a1634cc29b848bfa276e102e5a282728b66c7a17b2c6cb95f96b59ccead302bdf546eb17679f5f2fae5159cd7b0ac22e92838639c67607d0b5abed313cb6b73b8b0ef7d4bbde2dcf8edd931d3f22ddb53e65696dc4abd40b7dd77745ba45cbeff7dac5e413fc605e352709587d177c1aedb7fa73796751cbcb363fc9e15fa79e1da525ca7ed88ceafd1f9d5c4aa579ef7e6f55aa4d8d937147b4733876b871bc16d19fffc7ffff31fff1f031c5b9b</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxURLRequesterThemesPath</sender> + <signal>urlSelected(const QString&)</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxURLRequesterThemesPathUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxURLRequesterThemesPath</sender> + <signal>returnPressed(const QString&)</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxURLRequesterThemesPathUrlSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxThemeList</sender> + <signal>highlighted(const QString&)</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxThemeSelected(const QString&)</slot> + </connection> + <connection> + <sender>KbfxDeleteTheme</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxDeleteThemeClicked()</slot> + </connection> + <connection> + <sender>KbfxInstallTheme</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxInstallThemeClicked()</slot> + </connection> + <connection> + <sender>KbfxSelectDudeImage</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxSelectDudeImageClicked()</slot> + </connection> + <connection> + <sender>KbfxDeleteDudeImage</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxDeleteDudeImageClicked()</slot> + </connection> + <connection> + <sender>KbfxThemeInfoBtn</sender> + <signal>clicked()</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxThemeInfoClicked()</slot> + </connection> + <connection> + <sender>KbfxShowOldThemes</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxShowOldThemes_toggled(bool)</slot> + </connection> + <connection> + <sender>KbfxWatch</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgThemes</receiver> + <slot>KbfxWatch_toggled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>KbfxURLRequesterThemesPath</tabstop> + <tabstop>KbfxThemeList</tabstop> + <tabstop>KbfxDeleteTheme</tabstop> + <tabstop>KbfxInstallTheme</tabstop> + <tabstop>KbfxGetMoreThemes</tabstop> + <tabstop>KbfxThemeInfoBtn</tabstop> + <tabstop>KbfxSelectDudeImage</tabstop> + <tabstop>KbfxDeleteDudeImage</tabstop> + <tabstop>KbfxShowOldThemes</tabstop> + <tabstop>KbfxWatch</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="global" impldecl="in declaration">qstringlist.h</include> + <include location="global" impldecl="in declaration">kmessagebox.h</include> + <include location="global" impldecl="in declaration">kio/netaccess.h</include> + <include location="global" impldecl="in declaration">kfiledialog.h</include> + <include location="global" impldecl="in declaration">ktar.h</include> + <include location="global" impldecl="in declaration">kstandarddirs.h</include> + <include location="global" impldecl="in declaration">kbfxthemesdata.h</include> + <include location="local" impldecl="in declaration">kbfxthemeinfo.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgthemes.ui.h</include> +</includes> +<forwards> + <forward>class KbfxThemeInfo;</forward> +</forwards> +<variables> + <variable access="private">bool KbfxFormReady;</variable> + <variable access="private">QString KbfxInstallDialogURL;</variable> + <variable access="public">QStringList KbfxThemes;</variable> + <variable access="public">QPixmap img_nopreview;</variable> + <variable>static KbfxThemeInfo * _info_box;</variable> +</variables> +<signals> + <signal>KbfxThemeDoInstall( QString & installUrl )</signal> +</signals> +<slots> + <slot>KbfxURLRequesterThemesPathUrlSelected( const QString & path )</slot> + <slot>KbfxThemeSelected( const QString & name )</slot> + <slot>setKbfxThemePreview()</slot> + <slot>ChangeForm()</slot> + <slot>KbfxDeleteThemeClicked()</slot> + <slot>KbfxInstallThemeClicked()</slot> + <slot>KbfxThemeInstall( QString & installUrl )</slot> + <slot>KbfxSelectDudeImageClicked()</slot> + <slot>KbfxDeleteDudeImageClicked()</slot> + <slot>KbfxThemeInfoClicked()</slot> + <slot>KbfxShowOldThemes_toggled( bool )</slot> + <slot>KbfxWatch_toggled( bool )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgthemes.ui.h b/configdialog/kbfxconfigdlgthemes.ui.h new file mode 100644 index 0000000..fe28790 --- /dev/null +++ b/configdialog/kbfxconfigdlgthemes.ui.h @@ -0,0 +1,367 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +KbfxThemeInfo * KbfxConfigDlgThemes::_info_box = 0; + +void KbfxConfigDlgThemes::init() +{ + KbfxFormReady = FALSE; + img_nopreview = image0; + + connect ( this, SIGNAL ( KbfxThemeDoInstall ( QString & ) ), + this, SLOT ( KbfxThemeInstall ( QString & ) ) ); +} + +/* +void KbfxConfigDlgThemes::KbfxDudeAnimationButtonToggled(bool) +{ + if(KbfxAnimationButton->state() == 2) + { + KbfxAnimationButton->setText(tr2i18n("Animation is ON")); + KbfxAnimationButton->setPaletteBackgroundColor(QColor(0,255,0)); + ConfigInit().m_SpinxDudeBlink = TRUE; + } + + if(KbfxAnimationButton->state() == 0) + { + KbfxAnimationButton->setText(tr2i18n("Animation is OFF")); + KbfxAnimationButton->setPaletteBackgroundColor(QColor(221,223,228)); + ConfigInit().m_SpinxDudeBlink = FALSE; + } + + kdDebug() << "SpinxDudeBlink State is:" + << ConfigInit().m_SpinxDudeBlink + << endl; +} +*/ + +void KbfxConfigDlgThemes::KbfxURLRequesterThemesPathUrlSelected ( const QString &path ) +{ + QString tmppath = path; + + if ( tmppath.startsWith ( "file://" ) ) tmppath.remove ( "file://" ); + if ( !tmppath.endsWith ( "/" ) ) tmppath.append ( "/" ); + + QDir d ( tmppath ); + d.setFilter ( QDir::Dirs ); + if ( !d.exists() ) + { + kdDebug() << "Themes folder does not exist: " << tmppath << endl; + + KMessageBox::error ( 0, + tr2i18n ( "<p align='center'>Invalid user themes folder!</p>" + "<p align='center'>Will use default user themes folder.</p>" ), + tr2i18n ( "Error loading themes" ) ); + + tmppath = ConfigInit().m_UserSpinxThemeBasePathDefault; + } + + KbfxURLRequesterThemesPath->setURL ( tmppath ); + + KbfxThemeList->clear(); + KbfxThemeList->insertStringList ( KbfxThemesData().setThemeList ( tmppath ).keys() ); + KbfxThemeList->setCurrentItem ( 0 ); + + ConfigInit().m_SpinxThemeName = KbfxThemeList->currentText(); + ConfigInit().m_SpinxThemeBasePath = KbfxThemesData().setThemeList ( ConfigInit().m_UserSpinxThemeBasePath ) [ConfigInit().m_SpinxThemeName]; + ConfigInit().m_UserSpinxThemeBasePath = tmppath; + + setKbfxThemePreview(); +} + +void KbfxConfigDlgThemes::KbfxThemeSelected ( const QString &name ) +{ + if (KbfxFormReady) + { + ConfigInit().m_SpinxThemeName = name; + ConfigInit().m_SpinxThemeBasePath = KbfxThemesData().setThemeList ( ConfigInit().m_UserSpinxThemeBasePath ) [ConfigInit().m_SpinxThemeName]; + ConfigInit().readFontrc ( ConfigInit().m_SpinxThemeBasePath, + ConfigInit().m_SpinxThemeName ); + ConfigInit().readThemerc ( ConfigInit().m_SpinxThemeBasePath, + ConfigInit().m_SpinxThemeName ); + + kdDebug() << "Selected theme: " + << name + << endl + << "Base path: " + << ConfigInit().m_SpinxThemeBasePath + << endl; + + setKbfxThemePreview(); + } +} + +void KbfxConfigDlgThemes::setKbfxThemePreview() +{ + QString path = ConfigInit().m_SpinxThemeBasePath + ConfigInit().m_SpinxThemeName + "/preview.png"; + + QImage tmp ( path ); + if ( tmp.isNull() ) + { + kdDebug() << "No preview available for theme: " + << ConfigInit().m_SpinxThemeBasePath + ConfigInit().m_SpinxThemeName + << endl; + + // QString default_path = locate("data", "kbfx/images/nopreview.png"); + KbfxPixmapPreview->setPixmap ( img_nopreview ); + } + else + { + KbfxPixmapPreview->setPixmap ( path ); + } +} + +void KbfxConfigDlgThemes::ChangeForm() +{ + KbfxFormReady = FALSE; + KbfxURLRequesterThemesPath->setURL ( ConfigInit().m_UserSpinxThemeBasePath ); + KbfxThemeList->clear(); + + KbfxThemeList->insertStringList ( KbfxThemesData().setThemeList ( ConfigInit().m_UserSpinxThemeBasePath ).keys() ); + + kdDebug() << "Theme path: " + << KbfxThemesData().setThemeList ( ConfigInit().m_UserSpinxThemeBasePath ) [ConfigInit().m_SpinxThemeName] + << endl; + + KbfxThemeList->setSelected ( KbfxThemeList->findItem ( ConfigInit().m_SpinxThemeName ), TRUE ); + + setKbfxThemePreview(); + + KbfxDudeImage->setPixmap ( ConfigInit().m_SpinxDudeImage ); + + kdDebug() << "Dude image: " + << ConfigInit().m_SpinxDudeImage + << endl + << "Default dude image: " + << ConfigInit().m_SpinxDudeImageDefault + << endl; + + KbfxFormReady = TRUE; + + KbfxShowOldThemes->setChecked ( ConfigInit().m_KbfxShowOldThemes ); + KbfxWatch->setChecked ( ConfigInit().m_KbfxWatcher ); + + /* + if(ConfigInit().m_SpinxDudeBlink == TRUE && KbfxAnimationButton->state() == 0) + KbfxAnimationButton->toggle(); + + if(ConfigInit().m_SpinxDudeBlink == FALSE && KbfxAnimationButton->state() == 2) + KbfxAnimationButton->toggle(); + */ +} + +void KbfxConfigDlgThemes::KbfxDeleteThemeClicked() +{ + int messageBoxReturn; + int messageBoxUserResReturn; + QString KbfxThemeRcDestination = KGlobal::dirs()->saveLocation ( "data", QString ( "kbfx/themerc/" ), TRUE ); + KbfxThemeRcDestination.append( ConfigInit().m_SpinxThemeName ); + + messageBoxReturn = KMessageBox::warningContinueCancel ( 0, + tr2i18n ( "<p align='center'>Are you sure you want to uninstall the KBFX theme <strong>%1</strong>?</p>" ).arg ( ConfigInit().m_SpinxThemeName ), + tr2i18n ( "Uninstall KBFX theme" ), + tr2i18n ( "Uninstall" ) ); + + if ( messageBoxReturn == KMessageBox::Cancel ) return; + + messageBoxUserResReturn = KMessageBox::questionYesNo ( 0, + tr2i18n ( "<p align='center'>Do you want to keep your personal settings for theme <strong>%1</strong>?</p>" ).arg ( ConfigInit().m_SpinxThemeName ), + tr2i18n ( "Personal settings" ), + tr2i18n ( "Keep settings" ), + tr2i18n ( "Delete settings" ) ); + + if ( messageBoxUserResReturn == KMessageBox::No ) + { + if ( QFile::exists ( KbfxThemeRcDestination + "_fontrc" ) ) + { + QFile::remove ( KbfxThemeRcDestination + "_fontrc" ); + + kdDebug() << "Deleting user's fontrc file: " + << KbfxThemeRcDestination + "_fontrc" + << endl; + } + if ( QFile::exists ( KbfxThemeRcDestination + "_layoutrc" ) ) + { + QFile::remove ( KbfxThemeRcDestination + "_layoutrc" ); + kdDebug() << "Deleting user's layoutrc file: " + << KbfxThemeRcDestination + "_layoutrc" + << endl; + } + } + + kdDebug() << "Deleting theme: " + << ConfigInit().m_SpinxThemeName + << " - " + << ConfigInit().m_SpinxThemeBasePath + ConfigInit().m_SpinxThemeName + << endl; + + if ( !KIO::NetAccess::del ( ConfigInit().m_SpinxThemeBasePath+ConfigInit().m_SpinxThemeName, 0 ) ) + { + KMessageBox::sorry ( 0, + tr2i18n ( "<p align='center'>Could not uninstall this KBFX theme.</p>" + "<p align='center'>You may not have sufficient permissions to delete " + "the folder <strong>%1<strong>.</p>" ).arg ( ConfigInit().m_SpinxThemeBasePath + ConfigInit().m_SpinxThemeName ) ); + + return; + } + + ChangeForm(); +} + +void KbfxConfigDlgThemes::KbfxInstallThemeClicked() +{ + KFileDialog KbfxInstallDialog ( QString::null, + "*.tar *.tar.bz2 *.tar.gz *.kbfxtheme|" + tr2i18n ( "KBFX theme packages (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" ), + 0, + 0, + TRUE ); + KbfxInstallDialog.setCaption ( tr2i18n ( "Select KBFX theme package to install" ) ); + KbfxInstallDialog.setMode ( KFile::File | KFile::ExistingOnly ); + + if ( !KbfxInstallDialog.exec() ) return; + + KbfxInstallDialogURL = KbfxInstallDialog.selectedURL().path(); + + emit KbfxThemeDoInstall ( KbfxInstallDialogURL ); +} + +void KbfxConfigDlgThemes::KbfxThemeInstall ( QString &installUrl ) +{ + KTar KbfxThemeArchive ( installUrl ); + + if ( !KbfxThemeArchive.open ( IO_ReadOnly ) ) + { + KMessageBox::sorry ( 0, tr2i18n ( "<p align='center'>Could not read this KBFX theme package.</p>" ) ); + + kdDebug() << "Error reading archive: " << installUrl << endl; + + return; + } + + const QString KbfxThemeDestination = KGlobal::dirs()->saveLocation ( "data", + QString ( "kbfx/skins/" ), + TRUE ); + + kdDebug() << "Copying theme: " << KbfxThemeDestination << endl; + + const KArchiveDirectory *KbfxThemeArchiveDir = KbfxThemeArchive.directory(); + KbfxThemeArchiveDir->copyTo ( KbfxThemeDestination, TRUE ); + + ChangeForm(); +} + +void KbfxConfigDlgThemes::KbfxSelectDudeImageClicked() +{ + KFileDialog KbfxDudeImageDialog ( QString::null, + "image/jpeg image/png image/x-xpm image/gif ", + 0, + 0, + TRUE ); + + KbfxDudeImageDialog.setCaption ( tr2i18n ( "Select personal image" ) ); + KbfxDudeImageDialog.setMode ( KFile::File | KFile::ExistingOnly ); + + if ( !KbfxDudeImageDialog.exec() ) return; + + ConfigInit().m_SpinxDudeImage = KbfxDudeImageDialog.selectedURL().path(); + + QImage tmp ( ConfigInit().m_SpinxDudeImage ); + if ( tmp.isNull() ) + { + KMessageBox::error ( 0, + tr2i18n ( "<p align='center'>Image cannot be used as a personal image!</p>" + "<p align='center'>Will use default personal image.</p>" ), + tr2i18n ( "Error loading image" ) ); + + ConfigInit().m_SpinxDudeImage=ConfigInit().m_SpinxDudeImageDefault; + } + + KbfxDudeImage->setPixmap ( ConfigInit().m_SpinxDudeImage ); + + kdDebug() << "Dude image changed: " + << ConfigInit().m_SpinxDudeImage + << endl; +} + + +void KbfxConfigDlgThemes::KbfxDeleteDudeImageClicked() +{ + QString tmp_dude = ConfigInit().m_SpinxThemeBasePath + ConfigInit().m_SpinxThemeName + "/menu_top_image_person.png"; + QFile tmp ( tmp_dude ); + if ( tmp.exists() ) + { + ConfigInit().m_SpinxDudeImage = tmp_dude; + } + else + { + ConfigInit().m_SpinxDudeImage = locate ( "data","kbfx/skins/default/menu_top_image_person.png" ); + } + + KbfxDudeImage->setPixmap ( ConfigInit().m_SpinxDudeImage ); +} + + +void KbfxConfigDlgThemes::KbfxThemeInfoClicked() +{ + QPixmap _logo = QPixmap (ConfigInit ().m_SpinxThemeBasePath + ConfigInit ().m_SpinxThemeName + "/logo.png"); + + ConfigInit().readThemeInfo ( ConfigInit().m_SpinxThemeBasePath, ConfigInit().m_SpinxThemeName ); + _info_box = new KbfxThemeInfo (this,"infodlg",Qt::WType_Modal); + + if ( !_logo.isNull() ) + { + _info_box->KbfxThemeLogo->setPixmap( _logo ); + } + else + { + _info_box->KbfxThemeLogo->hide(); + _info_box->hideSpacer(); + } + _info_box->KbfxThemeName->setText( ConfigInit().m_SpinxThemeName ); + _info_box->KbfxThemeVersion->setText( ConfigInit().m_InfoVersion ); + _info_box->KbfxAuthorName->setText( ConfigInit().m_InfoAuthor ); + if ( ConfigInit().m_InfoEmail == ConfigInit().m_InfoEmailDefault ) + { + _info_box->KbfxAuthorEmail->setText( ConfigInit().m_InfoEmail ); + } + else + { + _info_box->KbfxAuthorEmail->setText( "<a href='mailto:" + ConfigInit().m_InfoEmail + "'>" + ConfigInit().m_InfoEmail + "</a>" ); + } + if ( ConfigInit().m_InfoUrl == ConfigInit().m_InfoUrlDefault ) + { + _info_box->KbfxThemeHomepage->setText( ConfigInit().m_InfoUrl ); + } + else + { + _info_box->KbfxThemeHomepage->setText( "<a href='" + ConfigInit().m_InfoUrl + "'>" + ConfigInit().m_InfoUrl + "</a>" ); + } + + _info_box->show(); + _info_box->update(); +} + + +void KbfxConfigDlgThemes::KbfxShowOldThemes_toggled( bool state ) +{ + ConfigInit().m_KbfxShowOldThemes = state; + kdDebug() << "Show Old Themes is: " << ConfigInit().m_KbfxShowOldThemes << endl; + + ChangeForm(); +} + + +void KbfxConfigDlgThemes::KbfxWatch_toggled( bool state ) +{ + ConfigInit().m_KbfxWatcher = state; + kdDebug() << "Watch for Installs is: " << ConfigInit().m_KbfxWatcher << endl; +} diff --git a/configdialog/kbfxconfigdlgtooltip.ui b/configdialog/kbfxconfigdlgtooltip.ui new file mode 100644 index 0000000..97d5218 --- /dev/null +++ b/configdialog/kbfxconfigdlgtooltip.ui @@ -0,0 +1,719 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxConfigDlgTooltip</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxConfigDlgTooltip</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>648</width> + <height>526</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>KBFX Control Center</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>10</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="KActiveLabel" row="0" column="0"> + <property name="name"> + <cstring>kActiveLabel37</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Tooltip ON or OFF</p></h3></b></string> + </property> + </widget> + <widget class="QGroupBox" row="1" column="0"> + <property name="name"> + <cstring>groupBox24</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Turn off or on the tooltip</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Turn your tooltip off or on. <br>You can see the current status of the tooltip to the right.</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer4_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>24</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxTooltipOnButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Turn the tooltip "OFF"</string> + </property> + <property name="toggleButton"> + <bool>true</bool> + </property> + <property name="on"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>KbfxTooltipOnPixmapLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>80</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>80</height> + </size> + </property> + <property name="frameShape"> + <enum>GroupBoxPanel</enum> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <widget class="QGroupBox" row="7" column="0"> + <property name="name"> + <cstring>groupBox3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Tooltip Text</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <widget class="QLayoutWidget" row="0" column="1"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel6</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Type the text which you want to be displayed in the tooltip.</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer9</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>19</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <widget class="KTextEdit" row="0" column="0"> + <property name="name"> + <cstring>KbfxTooltipTextEdit</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>100</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>100</height> + </size> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="vScrollBarMode"> + <enum>AlwaysOff</enum> + </property> + <property name="hScrollBarMode"> + <enum>AlwaysOff</enum> + </property> + <property name="textFormat"> + <enum>PlainText</enum> + </property> + </widget> + </grid> + </widget> + <widget class="KActiveLabel" row="6" column="0"> + <property name="name"> + <cstring>kActiveLabel37_2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Tooltip personal text</p></h3></b></string> + </property> + </widget> + <widget class="QGroupBox" row="4" column="0"> + <property name="name"> + <cstring>groupBox26</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>StyledPanel</enum> + </property> + <property name="title"> + <string>Tooltip animation</string> + </property> + <property name="alignment"> + <set>AlignVCenter</set> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout20</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>kActiveLabel5</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Turn your tooltip animation off or on. <br>You can see the current status of the tooltip to the right.</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Minimum</enum> + </property> + <property name="sizeHint"> + <size> + <width>26</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxTooltipAnimationButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Turn the animation "ON"</string> + </property> + <property name="toggleButton"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>KbfxTooltipAnimationPixmapLabel</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>120</width> + <height>80</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>120</width> + <height>80</height> + </size> + </property> + <property name="frameShape"> + <enum>GroupBoxPanel</enum> + </property> + <property name="pixmap"> + <pixmap>image2</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </grid> + </widget> + <spacer row="5" column="0"> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + <widget class="KActiveLabel" row="3" column="0"> + <property name="name"> + <cstring>kActiveLabel37_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>29</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>29</height> + </size> + </property> + <property name="paletteForegroundColor"> + <color> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </property> + <property name="paletteBackgroundPixmap"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>NoFocus</enum> + </property> + <property name="textFormat"> + <enum>AutoText</enum> + </property> + <property name="text"> + <string><b><h3><p align="center">Tooltip animation ON or OFF</p></h3></b></string> + </property> + </widget> + <spacer row="2" column="0"> + <property name="name"> + <cstring>spacer6_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>1</width> + <height>1</height> + </size> + </property> + </spacer> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="XPM.GZ" length="4075">789ced974b6fda401446f7fc0a8bec5095601eb64755174d7080a669d3b48b4a5517e33134a1101230e151f5bfd7f7bbc3f8510bb29a45d5b331e77e77c6c6067b7cd670bede5c3b8db3da3291c9bd72d49d5c388d78359b6dbf7d7ff3ab5677dda6d3124e2770dcfaab5afdd651ce4953785d11937e822acf63bd81c67bfd0c1d793eeb47ad8118917e20755d4f8a31e935d4f394c48ede4395df941dd277a4adaedf9501e995568f75001dfb9154a443ad8ab547da96412bc2cc97465ba4a1d636a77da348df9276ba818c3cd273a33ee985d688d30d69d7156e14916e8de230d65a5b9cee8c22fd028dfd91c05409ab08549374611407b9d42a387d328af459abe4746514e99cd40b645375491f8c62bf8f5a5d4e6746914e49fdb64c2f12e94fad3eeb049a9e7485eb7baf3566bd23a5b31ce3c4fe808aa813e3fa8ea02af263ec68ac35603d85c642ffea147494a6b80ab156c17a422a9afb34d22a631ca4d41ab19e5a058767157ce52a22a6322bb51debc95a69830b5445cc5466a5b6633d592b6df0fba962cc5466a5b6633d592b6df003b60afe4156c15ff810938c5ca9f4a16c93228509714b39c43423572a7d28dbb4486142dce2521e8acce78f9a3983da3c5f6152a7b17a8afdb042cb1c33cef6e0760d160ccbd290243a5824cb65be6cf449b35a9961cf29694752985383470fd86c36db941d581bb84a6cd6eb7cd9e82ea3d4b11fbacb83e7668173f07705a58b14aeec4378aeab3032ad16356dc753be17863d260cc34ba26f2a3daa6429d337a50c1a13f6fb61a99a178cc5aa63301c0e98a1fe3434952c435533a8e04094efc02ae8a55c8117b7578fc732cc2a58075a050b51ab60256c15acccad825703abfcdfe3bfb3c75babe045d52a78ddb34afdf7ebda1f4394dd1e</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="24290">789ced9ac97223390e86eff5148ee6ad6282ad5d99313107effbbe7b620e205392f75d96ec8e79f761823fac4c6a71754c3bfb20252efd89e0f203205272d7ef3fe7cef6b6e77efefee3e5955eafec9cbda4e7b99f49f7eeeefddffff9d71f3f7e2b574a735169ae12d7e72abffde3c76fd498b373aac44fcae68cb95cb2e00e38f14cf3e016f8c57319fef689b9526e820d38c27a3be018f34fc1062ce3588f763d5708eb6d32572b15f007b88af5851be01e18e731af9eab35f00db88efd2230e6d33e18f3690d0c3d84f5abd06357996b15c4c73e80dbe0c47355e27d012e83b7c1d06756c0a2cfc7b756833f55c1d0637d7eea5589d72b18f1b5976089afdfbf5ec77ee4e35b6f08bf81b1bf5d666ed4102f7b0f967c6bb0e4fb148cf3985d30ce6336c0526fcf9eeb327e0b96710596fa2b83115f3af2dc90719f8f4613f1a645b0d48fcf67b38e71fb089678c760a9970a18facd1158ea6bc17343eaaf0f96fa697a6e221e7406967c6c81e5bead8345cfbbe748f42c83253efe3e470da9a77330e2637c3d47120fb30516ff65b0e87f078bfe17b0e8bb068bfe042cf7fbc47324eceb378aa55f7499e386d4eb1558ead582110f5307231e06fe11ce47188fe53e1f82e57efa7a23c9875d01a35e6d0f2cfebede48f4185f4f14497d2e8125fe779e6339af3f3f91dcd703b0f4175f5f64249fbe7ec8caf93c9bcf7c1c7b8e251f3e7e86e47e19b0d48bd76712b9cfcf60b9bf9e6d84f3da3658eaa5e639967e54f24c523f876019f7fdce1aa9871658eadbdf1f6ba5df1f83e5bcbeffd944eea38f6f12497dbc83a57e7c7f4a3ef37b0b96784460c947152cfa7c3e1212f6f72d917c9845b0e8c37e56f81e2cf9b804cbfdd060399f7fdfb448f24b60a92f7f5f5a46780f2cf5b606163df36079bff8fbd996f3db3bb0f4bb0e58eaa909967e5606cbf9381e655790e045b0d44b1f2cf1e3fe59e68799f555f84959f37da8f2c37ce4b95602ef83cb9e89eba95aabb63cab75701b7ce559e6930213c68fc006fc01b6d80febd512701f8cfdf4a9e73ad623ce6fb5ee5e887ebd08dc04ef802370171c637edb7303fa540d5c015f80111fb50dae8157c175b006e33c5ad6c379f43118e7d177609c479d82259e4b9e9b389f7e07cbfad0df14bd2dcf91e4af0996f9bb60e8d325b0c4f7008cfd35f4c532ff0a8cf9e4b9d194f337c192ef5d30f2a97c3d3522c9c73258e6bf80a53e6ec032dfd75f2396f904c67efa042cf5137b2689f71918fbe96db0ccdf02637f8df391d4e71b58d6bff56ca59e3c3723a98f6330f2433e3feef585f10a58eaad0c967af3e76992d4e70a58fcdfc1b2df1d58ea31014b7df8fbd43492cfba672b8cf358e9071b60aca7d73c27d84f5f83a51e173cb7a43eb8bf55ddf70bec1f83259f0db0f49373b0d4ffa66789b77af66cc4bf0d967af5f73fb252cf55cf89dc8743b08cfbfee35eafe017b0c463052cf99f074bfe719eb6ac7703c679c8e7238ea59e7dbc63a937f2f18b251f64c1883f19b0e4770d8cf5c8d7bffbfa86f133b0d4cf2158ea611e2cf707fb25725f0fc012ef45cf2da9bf27b09ce7122cebe3bc2de977e760b95f7b60a98757b0e4fbdeb3c45f75c052ef0a2cf5d7004b7d5e8065ff1db0dcf74db0e4c3f73f4a84fdf9a825fd68032ce30b60c487fc79ddf737b0bf6f46e2451a2cf9a882255e2760e90fbe7edcd72f9c97d7af9553e3717e9fd7f8e1718e5fad951a8ff3fba2ce0f8f733eea36351ee7fbdfe087c7f9bc8d38353e0f7fdf6ef2c3feacdfb50f67eccff98feaa931737ea2666aeccfefd7881f668e6f6452e3f5f9fc7125359ecffd3caea796b2e1fcc4fcf07cae9fd8a6c6fe5cef544a8d99f7a34a6aeccfef5be287f7e37e4c496aeccff56c4aa931733d197e98397e26492d65cbf7d3b452e371eedf7c1c7f3eae17cb0f33f713db4e8df7e7f745d2488de7b37ef7f5d719fb73fe127e783f5ebf554a8dfd391f9c5eceb7e2f3b41aa971bcb8ffb5f8617f7e7fb4cba931f378bb965acafbbc5f9b1fcfd36533cdd36133cdd36133cdd36133cdd36133cdd36133cdd36133cdd36133cdd36133cdd3617f9d66ad3469a3eda7258e5b7fb7beefd2acdbbae3345eea2b7dad6f3eedd6f19dbed70fba3d71f6a37eca442ab527fd387146e7d77dbf47b3d374efd43d8fb11737f6aabb13e63fe9b760ce9b7e9ae0dfd3fd5ff5fd0ecd9ca377fda1e727da82cb77675cb6597338e34e2f4ed43cf02c58b35e72777659affc92ad8e53ed340fafb1e63ac3b818f5f47ac673b948cd2ec789ded09bbf6c4ef518cd5b23bd1f26681ef86d15a7d9f5ad27bdad77fe94ed8e523d669d3dbd3fba3bb1e681df76819a1ff4c1d0390fdd6747e8a7c7fa648492d3e17bea349f8d8cd0d9683581e6315e7fbd667793d7f5b9bec859c9f567d26578b4dcfd5dd795c0a7aacd48cd1723ad36aa93b1e6814f719a135dd78d9c35877b948b8cd1d1905ff0de729ae3c0472c1a8e10340f7ce26234eb25a555fea131fd6951af2b93f3b43af47952891af7b4863b59aa39e39114a439516dd5c9d8a5ba52d7637c1fd44dceb7a35aea36d07c1778e4560e3b196b1e78dc15a199f7bccfd9831afbfd4f975d3c9e72decf3a19d27c3fd6863405fb17a399d48b7acd5957bd8df7573dd50ffcafa4d341f37b66ec3df075abe73b99eea98fac7f219a8d9a570b195bd4f713fd955acaf92fa8654d39cd2b99b155b51678cfe73b196b1e8cae7cbf6657abeb6a23679baa3771467ac6fc8cdc7727a7792b33b6ad7602ef0db59bed64c17a057c0fd32d77aabd9ced67b33672cebd3ac8cd38cc668e350fc6b6034eedc0c5f9b3473acd4799b12234933a5627393bd5ea8b39469de5e7689bd37c9e19bb70515d57a5608ff2e05dc89a0723e7dfaf593daa8aaae6acf6d55f435c17ab07738ef4e77d709a1bf9d5dcfbad19f85755a497329a079f370ac8f3938a49e74ce989f779d49c6c9cf2a37e441ba26017236f38dd2395f12fe07b984ec8fa7f75f6695f6a568fd40ae6b4b39aa9138ee845ba0c662474e53b196b1e7cda2944f335dde4eceb3c13dd0673f29aef8647824f53bba787b493b1e6c1a7057c27a1477aa2e79cbdd05773baf416cce90dfa1ef5e97d78843e689e1682598b697dd3abdb71f0d93bf5bf5df3122dd34acebed4ac7ab41acc59cb695e1f35421bb419cc727ba95bd63cf864bd00cd7ddaa2ed9ced7c99e7e139bbb43766745f34ebb2b67410cc3b7475f6ea761c7cb2f5fd9a5dce8ee83867fb5fbd9f5d6d9c04734e0771729acf46af46e7b41fcc3ba60b2ab9d9033e2b20cf5d2afb7f4dfc6955aa7d31e791eac19c4666b44fcdcc48948d6030965aeceef969869bdfaf592b8a8cce99a2097fb14fcd9031b91936fb3d8cfa26198c059a3fe8d4b486f63bcd50f2fd9a4ddb74cc65ceae68e9ff99e1345f67c66ef2378536cc6d30dbf964fefbfafb35bb4c5b7367ee33f66026fe1f23aa99a79cffbd79ce5686d3fc92197bcd6bd6655725dd607e76ff97223453d73c9bb79cf5065d78d854cff403ff8ec9fcb5d0697ecf8cbd861d914ae635989fb502decfee0c7be6c3cce76c61d22f68f3681673de4b94ab0ba7793933ba32fc16083cf2b65c84e6b40f9b55b396b175d3a18f31be1b6623e7bbe6783350b49519dd1ea1f9c3ecb83dd6465a01ef67cedca6d9357b39db1fbd339dbbd31ee43c0f4df01706a7793f333e423347ee28d8f18b9dff6acddcc78ecd49ce4e7592fdcb1e9fb464ce86fda834a4f93c337e314a3377b252b092b7f3a234bbfc5d98726015f7a3b72bddc96cd292f3a9063eb5ec9bf953733de3315233c76f78c7d4ea45694e7f539a8669061699d89c512335f7b54385e396aca1f361cdd6667c9271df6469697845e76f8bd36c5bdadab6edfc29bba48d115afaf62ae33356b3bdb6c6de0cad79559ce6b4bedd196eeddd2fdb7dfeff5fe4340fbc1ec6ff62a10dfb38b46aa19ad33b669fecb37df9257b1dad983577337e1334a79dccbe05eb768bd59ce6da5578cff6bfb077fb314e316bceae30413347793e58bb57b466fee5d3b71f76c12e8eb125bbec7efb0f75ae9ce6958cffeae45fe3ae93e5f75a295e736af69a965ca75e73b69eb10dc79bee4dbe3979761a35dfeb531b5f0fd9bd32d61ff70df07b35a7a6cbd4d549709aeea4df1e7f9fcdfe8deb74d84cf374d84cf374d84cf374d84cf374d84cf374d84cf374d84cf374d8546afeef3f7ffc0fea16a67b</data> + </image> + <image name="image2"> + <data format="XPM.GZ" length="24050">789ced5ad96e1b3b127dcf5718e15b30e0d5be60300f71bcc471bcc64e6c0fe6a1c86e79b725cb6b2ee6df873ce5ae16db962cb6ef600690fae03e9c5b2cb24eb158a492fcf169e1607b63e1d31f1f86b7747b6a17ec09dd2c7c4aee2e2f9ffef9af7ffcf9e163b55659e854166afebf8f7ffbf091b616ec82aae0f3dc1c801b47abb037c06dc60d795ec5e7b935e02d67c77ca60ade16be02dec938fd062799ff0a5cd6b3e79ed7aa8ed761bf07c787f92ec01b32ff097853e6c77ab57cfd4df054e683be7a4df83a783d1baf2d73ffc17e032ef3db14dceb6962fe16785738f251f7eb353c576bccb3f934f25defc9fc3f3cf772381e8d7c34aa1e58af0feee36d812bf046c6e99cb9ffb0fe217833b31be86bb424be45f0b6f04770d1a3b0df8dae0b8fe3bf04a72c5ef55d38ec7a1fdc64767b0b9eb8f9dab0df81a71e58ef97e73e3cb69b6df0aac4db036f66f1d00373ffc18efd698a1e75cf3c8b878ec0458fde652ef9de01ef66fb63f6c0adc46b987b60fc003cc9c613afeff793d7ef82f784d73c6f55326eb09f2dd1a7b69867f19a53f07c7fef8577c1b17eab9e71dd619ef95be4abe5eba1037e229cc76f3397f138bfad66365e5f32cff263dae0adcc4e43e6fe03473db7f2faa909c778837a6e7584a35e5a5d592f61ee81f93e8393ecc79270ae0ff48b96c9b83a602ef9e5fc48bda965e692df33f034b3db4be1043bc7d3cbec04fd5ecef3f982beb6ec9f7e642ee719f96ed7a4be7e82d7253f47c259ef067843ea1b7adb52cf84f3d996fc2a5e0f1fec385fedfcbcf2fa721ecd03730fc487f3dc36723ed0afdaf9f95c672ef1f37c52df84fdebe4f5fb93b9d43bce53a726fb817ae9e47a117f47f4da6be1385f6a85b9f8a3df759a52ff67c279fc2df36cbc1e30f7c0789ccf8ecfa7c1f863e6d2af98b73db01ef2d3e964e3f50173c917c7830f76ce87f447cdf14b7f24239cfb19fa4fc764f5a66f98cbf86de61ee0e8a71de947664d38fb9f32977e5c11cefa797e5fcf0938ee4b7ffc9e39f477ab92cf6be6927ff4b36e4dec7de61e888fe7ab4bbfee08e7f19ab9d40fcf27fd884e994b7e504f5dd95fbdc35cf29f08e7f3c7f1363db01ece6bb795d909ef8f6ede8f7684733d3499cbfa388f5dd97ff315bc9be55bed3197fc3c31f71fecec4f62473febca7eab55e6725ed0cfbab25f6699b90738f6af9b88ff90b9f8e33c74e57c1adcffdd9e8c37ccc58ef78a6fa7cff5d3622ef54bcc3d301ef544d5ac5ef41e73d90fec37c9fda4d798cb7ba12e9cf7eb9eb90738fa1dc9fd45bc9ed487bd13dec3f845e6723f219fd4ccf6cb5e09e7f10fcce57cac0be77ac4fb83e47eb3a7c2e14f782f525e3f77c279bd4438de330af5401dc937ea93ba325e0bc778ea3177e3b99fa3de8864bda6701ecff9c7078ef71f19f1ff029ef78b7de1eccff14bbf374a38d70beb4f3c60c7fb84d26cffcd3770e9271af7bba978c08ef58df41383fe6ca41f18dcb726efdf37cca59ed1af4d4bf287fe6424df1af7af917e6c904f23f9d547cca5fef0fe35d27f09f934f979e4f88dd4a762ee3f70d497b1529f3c9fe44bb3dec4031cfdd0c8fb5e2d0ae77e3c64ee81f9701f989ef4c333e66e3cbfb7906f5b157bca5cecd06f6bb2ffe81f367fef35994b7e5bc2f9bec779b379fe8f8473be50cf56ce87423d59e99784fdb4f2be539bcc33bb423d5be9979ae3478303875e2bf79ffa2c9ccf27f26ff1c18efe66f3fe877e65f3fe76cfdc03f3e33e48e4fdad711f2472bf69c49bc87b45ed0ae7f723fa5392e7e35838c78f789396dcdf249cef8307e61ee0789f24d21f14f291487e544738bf2ffacc3d60e7f829b32bd46b92df27e8678995fdc57d9ae4f9da16cef572cddc7fb0a3de925e6637e8df69c50376d47b5a95f382fa48e5bdabee84b31de73f95dfcf0afd39cdebf182b90738fa699ad723fa63daf2c07c783fa46dd93f8e4ff2a9a13fcdeb0df7712af9d1d097ca79d6a8cf547e1f689c9f3495f3cef3e3831df7752abfd735ce73af221cf5d9cb7f0f1c32f700879e5ec3c3f31de4a7878ff96c61ae793630d73c1b986b9e0dcc35cf06e69a670373cdb381b9e6d9c05cf36c60ae79365046b3569ab4d15690389efeaf95fcb734eb9e3e761a4ff4a93ed3e7820bc72ff595bed6bd89de7d3d18c9d47418e8fe7b7ddfa3d969bad2377a3806b7ce76a7ef27f80ff4c358ef7178d083f7fa96d58c3c3fea27fd7b223ebbfd3e1eb7db6e86c537fc5f62513497f62da7597f716776492f4f859571aa5ddcd3ce9163493497f62da3d9ed71a257f5d7a9e1548fd53cfd2c8c51cd257de335bbbe35d06bfa5b14d65f535d629e6fce63f05edf129aaff577bd51c0a6fb7f5bcfdd715befbcb06fe85dfde315cd7baf8c9c8c3dd15cda3756b33bc9fbfaa7fe15e0c0f567d287cf2352777ef7f551614c459b57358f8ea946dc55eff08dd69ce89aae0768bcec512e3346375f8c2bdc5b2e865630a2adef26d7d85fe31ba7d969e9e8ee28941ed39f7ee87da58291548c4a0f94993c6292e6f2be919a1365553282546fa971b7efb53a0ec626ea449d16e23e0bece7519a4bfbc6685617ea525d05b856af9e104475e8f2310846dfe8a410f730b0c7692eed1ba35993ba557701eed5c3f8b9d4a37a0ac7bbde7e18c4fd3bb07f8ed25cda374ab3518beacb0896f4d5c4b8945a0ec67f512b9a82b85703ebd728cda57da7d7ac0fd59afa16605d3d4e9acb9d85ef058f8dd11bd2c5bd115837a33497f68dd09caa2db51d606774d75ef5b952bb81c78fd15bdac5bd1758f7a33497f68dd04ceaa7fa15e040ab372233ea30f4d1b610f7a8f528527349dfe935abbeaaa86a80da5b7f1ae2ba58bde0d35017237137035b6bc21baaf04bfc3dbe11fb3c506dd5093012ffd43edd3c4faf58c78274b88feff18dd09cd0f3bf8fcdbeb735ab3e99d087eca8664a68da2f2d6a2eef1ba5b947c7a398629f894e429f82e6d382753cce5e682eed3bbd663aa70bba0c7045d79335539f06059f9bbcefd1906e0bd6f1b8a3e04cbec73742f3033dd25380df6f69568ff4b9e0136a5e2c58c7e3cb0bcda57d23340f69899603bca9f9159f155a9d601d8faf2f3497f69d5eb3dbb335fa1660fdadfbd9d5c6f782cf489e5cdc1b816d93b6c6e29eb60b9a4bfb46ec739f766837c00fda7b43f339ed177cb682b87f06b65f93f7a3a0b9b4eff49ab5a2033a0c7044637f493e47764f95c0a33afa0e7371d7026b254a7369dfe935539d1ad40cd0a209bf24dff67071b7036b274a7369dfe935bb9db6d4357a04ca4cfc8d417bc604e3b5b1a39541439304d634467379df18cdd4373d731ce024efc22fa11ecd6938deed7b3d88fb2cb09f47692eed1ba579d55c98cb0057937e411b32d7c1e83e9d17e21e04f69b28cda57d6334fb3e6c86e6760477d43063d6320fe631187bebf85321eedf81fd7394e6d2be719acd9359345f022cd1f0d591cb66c5ac06235fbc0c5cdc4b93474cd45cda374eb3ef6366cd7c0bb0ae93d13fd94344db6eff5f8c2bbe0c5cdcdf83111b519a4bfbc66a76fbb769b60ad876f7703feb4ee6891edc989dc298ddd19b59e2fe118cd989d25cda3756b3ff4d69f6cc7e013fcd2f73c02f3d73688e5ed82ba66a965f89bb16ce12a5b9b46fbc665377f5dd30cd28b4cc2baf1717773b1815f52629ef1baf19f55d35dd887fbca2c2bfbfc8e3b6343ace74633497f72da3d9f7286bacb5c954485f578cb87bc1c8e328cda57dcb69f67badad3db1a76fe0cc9e8f538cb8c3192ea23497f62dabd9a9be77eb9edb4b7b3506d7b6ef4efe8bce15c43d083ca2de61e57dcb6bf6b0437aa02d7beb7037827bc7cf9ddea7c9de3e6b31bfedff2adff769f6d087d4d749b0fed0ddd6137e7bfcbf61fe6f5c670373cdb381b9e6d9c05cf36c60ae793630d73c1b986b9e0dcc35cf066652f3bffffee13f7e30472b</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxTooltipAnimationButton</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgTooltip</receiver> + <slot>KbfxTooltipAnimationButtonToggled(bool)</slot> + </connection> + <connection> + <sender>KbfxTooltipOnButton</sender> + <signal>toggled(bool)</signal> + <receiver>KbfxConfigDlgTooltip</receiver> + <slot>KbfxTooltipOnButtonToggled(bool)</slot> + </connection> + <connection> + <sender>KbfxTooltipTextEdit</sender> + <signal>textChanged()</signal> + <receiver>KbfxConfigDlgTooltip</receiver> + <slot>KbfxTooltipTextEditTextChanged()</slot> + </connection> +</connections> +<includes> + <include location="global" impldecl="in declaration">kbfxconfig.h</include> + <include location="global" impldecl="in declaration">kdebug.h</include> + <include location="local" impldecl="in implementation">kbfxconfigdlgtooltip.ui.h</include> +</includes> +<variables> + <variable access="public">QPixmap img_on;</variable> + <variable access="public">QPixmap img_off;</variable> +</variables> +<slots> + <slot>KbfxTooltipAnimationButtonToggled( bool )</slot> + <slot>KbfxTooltipTextEditTextChanged()</slot> + <slot>KbfxTooltipOnButtonToggled( bool )</slot> + <slot>ChangeForm()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="0"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>ktextedit.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxconfigdlgtooltip.ui.h b/configdialog/kbfxconfigdlgtooltip.ui.h new file mode 100644 index 0000000..196c2d9 --- /dev/null +++ b/configdialog/kbfxconfigdlgtooltip.ui.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ + +void KbfxConfigDlgTooltip::init() +{ + img_on = ConfigInit().KbfxOnImg; + img_off = ConfigInit().KbfxOffImg; +} + +void KbfxConfigDlgTooltip::KbfxTooltipAnimationButtonToggled ( bool ) +{ + if ( KbfxTooltipAnimationButton->state() == 2 ) + { + KbfxTooltipAnimationButton->setText ( tr2i18n ( "Turn the animation 'OFF'" ) ); + KbfxTooltipAnimationPixmapLabel->setPixmap ( img_on ); + ConfigInit().m_ToolTipAnimation = TRUE; + } + + if ( KbfxTooltipAnimationButton->state() == 0 ) + { + KbfxTooltipAnimationButton->setText ( tr2i18n ( "Turn the animation 'ON'" ) ); + KbfxTooltipAnimationPixmapLabel->setPixmap ( img_off ); + ConfigInit().m_ToolTipAnimation = FALSE; + } + + kdDebug() << "Tooltip animation state: " + << ConfigInit().m_ToolTipAnimation + << endl; +} + +void KbfxConfigDlgTooltip::KbfxTooltipTextEditTextChanged() +{ + ConfigInit().m_ToolTipText = KbfxTooltipTextEdit->text(); + + kdDebug() << "Tooltip text: " + << ConfigInit().m_ToolTipText + << endl; +} + +void KbfxConfigDlgTooltip::KbfxTooltipOnButtonToggled ( bool ) +{ + if ( KbfxTooltipOnButton->state() == 2 ) + { + KbfxTooltipOnButton->setText ( tr2i18n ( "Turn the tooltip 'OFF'" ) ); + KbfxTooltipOnPixmapLabel->setPixmap ( img_on ); + ConfigInit().m_ToolTip = TRUE; + } + + if ( KbfxTooltipOnButton->state() == 0 ) + { + KbfxTooltipOnButton->setText ( tr2i18n ( "Turn the tooltip 'ON'" ) ); + KbfxTooltipOnPixmapLabel->setPixmap ( img_off ); + ConfigInit().m_ToolTip = FALSE; + + } + + kdDebug() << "Tooltip state: " + << ConfigInit().m_ToolTip + << endl; +} + +void KbfxConfigDlgTooltip::ChangeForm() +{ + if ( ConfigInit().m_ToolTip == TRUE && KbfxTooltipOnButton->state() == 0 ) + KbfxTooltipOnButton->toggle(); + + if ( ConfigInit().m_ToolTip == FALSE && KbfxTooltipOnButton->state() == 2 ) + KbfxTooltipOnButton->toggle(); + + if ( ConfigInit().m_ToolTipAnimation == TRUE && KbfxTooltipAnimationButton->state() == 0 ) + KbfxTooltipAnimationButton->toggle(); + + if ( ConfigInit().m_ToolTipAnimation == FALSE && KbfxTooltipAnimationButton->state() == 2 ) + KbfxTooltipAnimationButton->toggle(); + + KbfxTooltipTextEdit->setText ( ConfigInit().m_ToolTipText ); +} diff --git a/configdialog/kbfxthemeinfo.ui b/configdialog/kbfxthemeinfo.ui new file mode 100644 index 0000000..69cd3e8 --- /dev/null +++ b/configdialog/kbfxthemeinfo.ui @@ -0,0 +1,603 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>KbfxThemeInfo</class> +<widget class="QWidget"> + <property name="name"> + <cstring>KbfxThemeInfo</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>332</width> + <height>299</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="caption"> + <string>Theme Info</string> + </property> + <property name="icon"> + <pixmap>image0</pixmap> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <property name="resizeMode"> + <enum>Minimum</enum> + </property> + <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>layout10</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>10</number> + </property> + <spacer> + <property name="name"> + <cstring>spacer1_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>54</width> + <height>6</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>KbfxOk</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>OK</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>54</width> + <height>6</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <spacer row="2" column="1"> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <spacer row="0" column="1"> + <property name="name"> + <cstring>spacer7_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget" row="1" column="1"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout11</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer3_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>10</width> + <height>49</height> + </size> + </property> + </spacer> + <widget class="QLabel"> + <property name="name"> + <cstring>KbfxThemeLogo</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + <property name="pixmap"> + <pixmap>image1</pixmap> + </property> + <property name="scaledContents"> + <bool>true</bool> + </property> + <property name="alignment"> + <set>AlignCenter</set> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>10</width> + <height>49</height> + </size> + </property> + </spacer> + </vbox> + </widget> + <spacer> + <property name="name"> + <cstring>KbfxSpacer</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <property name="spacing"> + <number>15</number> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout19</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>_KbfxThemeName</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p align="right"><b>Name:</b></p></string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>_KbfxThemeVersion</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p align="right"><b>Version:</b></p></string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>_KbfxAuthorName</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p align="right"><b>Author:</b></p></string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>_KbfxAuthorEmail</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p align="right"><b>Email:</b></p></string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>_KbfxThemeHomepage</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string><p align="right"><b>Homepage:</b></p></string> + </property> + </widget> + </vbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout20</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxThemeName</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>69</red> + <green>163</green> + <blue>225</blue> + </color> + </property> + <property name="font"> + <font> + <italic>1</italic> + </font> + </property> + <property name="text"> + <string>Test</string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxThemeVersion</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>69</red> + <green>163</green> + <blue>225</blue> + </color> + </property> + <property name="font"> + <font> + <italic>1</italic> + </font> + </property> + <property name="text"> + <string>Test</string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxAuthorName</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>131</red> + <green>187</green> + <blue>225</blue> + </color> + </property> + <property name="font"> + <font> + <italic>1</italic> + </font> + </property> + <property name="text"> + <string>Test</string> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxAuthorEmail</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>131</red> + <green>187</green> + <blue>225</blue> + </color> + </property> + <property name="font"> + <font> + <italic>1</italic> + </font> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Test</string> + </property> + <property name="linkUnderline"> + <bool>false</bool> + </property> + <property name="wordWrap"> + <enum>NoWrap</enum> + </property> + </widget> + <widget class="KActiveLabel"> + <property name="name"> + <cstring>KbfxThemeHomepage</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="paletteForegroundColor"> + <color> + <red>78</red> + <green>184</green> + <blue>255</blue> + </color> + </property> + <property name="font"> + <font> + <italic>1</italic> + </font> + </property> + <property name="focusPolicy"> + <enum>WheelFocus</enum> + </property> + <property name="text"> + <string>Test</string> + </property> + <property name="linkUnderline"> + <bool>false</bool> + </property> + <property name="wordWrap"> + <enum>NoWrap</enum> + </property> + </widget> + </vbox> + </widget> + </hbox> + </widget> + </hbox> + </widget> + <spacer row="1" column="2"> + <property name="name"> + <cstring>spacer8</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer8_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>MinimumExpanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>16</width> + <height>16</height> + </size> + </property> + </spacer> + </grid> +</widget> +<customwidgets> +</customwidgets> +<images> + <image name="image0"> + <data format="PNG" length="872">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000032f49444154388d6dd34d681c6500c6f1ffbc33b3d9dd24a6f9c2fab159d93692948a07535350682b01c1431585f420e41a042f856cf1a437bd945eac395941507368aa2018fca0899542032a2526a1b14dd7da6c3bc9ee6637bbb333fbeebc33f37a2bd5fabf3fbfdb6368ad7938c77144b3d93c1a45d184522adb6eb7e356abb5e9fbfef7b95cee8fe1e1e17f0d8c878162b1380e9c17c218532a64af56278a22ec8485ebbaba56ab2d7a9ef7eee4e4e4c62380e338a74cd3fcdcad373ab60a7791322095ee4463e0b5db581d16c98441ad56ad371a8d37a6a6a67e7e006c6f6f8f5b9675c5d92a76dcbb7397eeae4e2c5313449a2836086383d030915144cad6ec564a35d775c7a6a7a70ba252a90821c4f97ab5da7173758d8419225b5574586574bf448755dc6685c8df45fa92d25e9b542addabb53eeb791e220882a3a629c67ebb7a8d4836910d8767075b944a0e9da6c7813e49a9748f234312ed97a9d45ccaf500d31427676767872cadf5840a143f5efa163b2e934cfb4c9c7993e71eb758bcb6ca4e5db1536ed3f7520799748bab374c84297871a4cf84fa092b8aa26cd9d9e1cfeb6b0cf47a88649d2fe62e92eecff0d3bac49360ea340b57e0f28d905bf56e3c197268a81bc330b296522a8ea2182935510ccfecefe1bbe502774aeb64334ff1d1f4311e4b2739f7cd16eb8ec94ab98e8a34b11e0588ad2008367b077a098d2e4a55c907ef8c7238b78f7397d648d936b97d6d30423e3c95e4d78264e293909eae14dd691bdfd59ba2d56afd1028a5c75f3d46a3ddc3fb170a5cbe5e62e5b6c49716a04187681db37453934e2578f9f90ccda61b008ba2bfbf7fa5d1682cbe3dfd1676e669fe720739736197b5bfbb387c601080fb7b11a72f2a3efbbd8727fb52bc726488564b7e99cfe74b86d69aa5a5a5914422b15c742a3d1f7f3a4f1484885863d970f0098b8ddd2486dd49c216bc7efc10847e310882171e00000b0b0bc76ddbfe3a5051ef2fcbab6c14ee1321300c13cb14e432038c64fbf03db71804c16bf97c7ef59133cdcfcfe780b3428893a629ccbaeb132a856d19341a6e5b4af9551cc7efe5f3f9d2ffbe11c0f77de6e6e6869452279452d92008e2388e6f1b86b1383333b3c37ffa075ed9c8000f73ed450000000049454e44ae426082</data> + </image> + <image name="image1"> + <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data> + </image> +</images> +<connections> + <connection> + <sender>KbfxOk</sender> + <signal>clicked()</signal> + <receiver>KbfxThemeInfo</receiver> + <slot>close()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">kbfxthemeinfo.ui.h</include> +</includes> +<slots> + <slot>hideSpacer()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> +</functions> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> + <includehint>kactivelabel.h</includehint> +</includehints> +</UI> diff --git a/configdialog/kbfxthemeinfo.ui.h b/configdialog/kbfxthemeinfo.ui.h new file mode 100644 index 0000000..e67a134 --- /dev/null +++ b/configdialog/kbfxthemeinfo.ui.h @@ -0,0 +1,19 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you want to add, delete, or rename functions or slots, use +** Qt Designer to update this file, preserving your code. +** +** You should not define a constructor or destructor in this file. +** Instead, write your code in functions called init() and destroy(). +** These will automatically be called by the form's constructor and +** destructor. +*****************************************************************************/ +void KbfxThemeInfo::init() +{ +} + +void KbfxThemeInfo::hideSpacer() +{ + KbfxSpacer->changeSize(0,0); +} diff --git a/configdialog/main.cpp b/configdialog/main.cpp new file mode 100644 index 0000000..fe5e508 --- /dev/null +++ b/configdialog/main.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> + +#include <unistd.h> + +#include <kaboutdata.h> +#include <kapplication.h> +#include <kcmdlineargs.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kuniqueapplication.h> + +#include "kbfxconfigapp.h" + +static const char description[] = I18N_NOOP ( "KBFX Configuration Utility" ); +static const char version[] = APPLICATION_VERSION; +static const KCmdLineOptions options[] = + { + {"install <theme URL>", I18N_NOOP ( "Install KBFX theme from <URL>" ), 0}, + { "prepare <folder URL>", I18N_NOOP ( "Prepare KBFX theme from folder <URL>" ), 0 }, + { "about", I18N_NOOP ( "Show the About page" ), 0 }, + KCmdLineLastOption + }; + +static KbfxConfigApp *mainWin = 0; + +class KbfxConfigApplication : public KUniqueApplication +{ + public: + KbfxConfigApplication() { } + virtual ~KbfxConfigApplication() { } + + virtual int newInstance() + { + KCmdLineArgs* KbfxArgs = KCmdLineArgs::parsedArgs(); + + /* prepare kbfx theme cmdline option given */ + if ( KbfxArgs->isSet ( "prepare" ) ) + { + QString m_KbfxThemeFolderUrl = KbfxArgs->getOption ( "prepare" ); + if ( m_KbfxThemeFolderUrl.endsWith ( "/" ) ) m_KbfxThemeFolderUrl.truncate ( m_KbfxThemeFolderUrl.length()-1 ); + QString theme_name = m_KbfxThemeFolderUrl.section ( '/', -1 ); + QString archive_dir = m_KbfxThemeFolderUrl.section ( '/', 0, -2 ); + QString archive_name = archive_dir+"/"+ theme_name+".kbfxtheme"; + kdDebug() << "Prepare option arguments: " + << theme_name + << endl + << archive_dir + << endl + << archive_name + << endl; + + KTar ThemeArchive ( archive_name,"application/x-bzip" ); + + if ( !ThemeArchive.open ( IO_WriteOnly ) ) + { + KMessageBox::sorry ( 0, + tr2i18n ( "<p align='center'>Could not create this KBFX theme package.</p>" ) ); + + kdDebug() << "Error creating theme file: " + << archive_name + << endl; + } + else + { + ThemeArchive.addLocalDirectory ( m_KbfxThemeFolderUrl,theme_name ); + ThemeArchive.close (); + KMessageBox::information ( 0, + tr2i18n ( "<p align='center'>KBFX Theme <strong>%1</strong> prepared.</p>" ).arg ( theme_name ), + tr2i18n ( "KBFX Theme Ready" ) ); + kdDebug() << "KBFX theme file ready: " + << archive_name + << endl; + } + + kdDebug() << "KBFX theme prepared. Quitting..." << endl; + QTimer::singleShot ( 100, mainWin, SLOT ( deleteLater() ) ); + } + else + { + /* install kbfx theme cmdline option given */ + if ( KbfxArgs->isSet ( "install" ) ) + { + QString m_KbfxThemeUrl = KbfxArgs->getOption ( "install" ); + kdDebug() << "Install option argument: " + << m_KbfxThemeUrl + << endl; + + mainWin->lb_Main->setCurrentItem ( THEMES ); + mainWin->KbfxMenuItemChanged ( THEMES ); + mainWin->KbfxThemeInstall ( m_KbfxThemeUrl ); + } + + /* show the "About" page */ + if ( KbfxArgs->isSet ( "about" ) ) + { + kdDebug() << "About option argument given on command line." + << endl; + + mainWin->lb_Main->setCurrentItem ( ABOUT ); + mainWin->KbfxMenuItemChanged ( ABOUT ); + } + + mainWin->show(); + mainWin->browserInit(); + } + return KUniqueApplication::newInstance(); + } +}; + +int main ( int argc, char **argv ) +{ + KAboutData about ( "kbfxconfigapp", + I18N_NOOP ( "kbfxconfigapp" ), + version, + description, + KAboutData::License_GPL, + "(C) 2006 PhobosK", + 0, + 0, + "phobosk@mail.kbfx.org" ); + about.addAuthor ( "PhobosK", 0, "phobosk@mail.kbfx.org" ); + + KCmdLineArgs::init( argc, argv, &about ); + KUniqueApplication::addCmdLineOptions(); + KCmdLineArgs::addCmdLineOptions( options ); + + if (!KUniqueApplication::start()) + return 1; + + KbfxConfigApplication app; + + mainWin = new KbfxConfigApp(); +/* + Don't show initially untill found out if prepare option is given on the command line + mainWin->show(); +*/ + app.setMainWidget ( mainWin ); + + /* mainWin has WDestructiveClose flag by default, so it will delete itself */ + return app.exec(); +} diff --git a/configdialog/x-kbfxtheme.desktop b/configdialog/x-kbfxtheme.desktop new file mode 100644 index 0000000..1551b13 --- /dev/null +++ b/configdialog/x-kbfxtheme.desktop @@ -0,0 +1,20 @@ +[Desktop Entry] +Encoding=UTF-8 +Type=MimeType +MimeType=application/x-kbfxtheme +Icon=kbfxconfigapp +Patterns=*.kbfxtheme + +Comment=KBFX Theme Package +Comment[bg]=Пакет KBFX Theme +Comment[da]=KBFX-temapakke +Comment[de]=KBFX Theme-Paket +Comment[el]=Πακέτο θέματος KBFX +Comment[es]=Paquete con el tema KBFX +Comment[et]=KBFX teemapakett +Comment[fr]=Paquet des thèmes KBFX +Comment[ja]=KBFX テーマパッケージ +Comment[nl]=KBFX-themapakket +Comment[pt]=Pacote de Tema do KBFX +Comment[pt_BR]=Pacote do Tema KBFX +Comment[sv]=KBFX-temapaket diff --git a/doc/AUTHORS b/doc/AUTHORS new file mode 100755 index 0000000..af2e935 --- /dev/null +++ b/doc/AUTHORS @@ -0,0 +1,26 @@ +KBFX Team Managers +------------------ +Siraj Razick: <siraj@kdemail.net> +Mensur Zahirovic: <nookie@mail.kbfx.org> +PhobosK: <phobosk@kdemail.net> +Nathanael Gogniat: <nathanael@mail.kbfx.org> + + +Translations +------------ +Hungary (HU) Ferenc Stelcz <ferenc@stelcz.hu> +Italia (IT) Divilinux <divilinux@mail.kbfx.org> +Bulgaria (BG) Lexus <lexus@mail.kbfx.org> + PhobosK <phobosk@kdemail.net> +Netherlands (NL) Monkey 9 <monkey9@iae.nl> + + +Ideas and Guidence +------------------ +Aaron Seigo: <aseigo@kde.org> +Vandenoever: + + +Patches +------- +Darwin M. Bautista <djclue917@gmail.com> 001.patch diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..19a5cbc --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,17 @@ +SET(DOCFILES + AUTHORS +# ChangeLog +# COPYING + CREDITS + HACKING +# HOWTO +# INSTALL +# KNOWN_BUGS +# LICENSE +# NEWS +# README +# TODO + ) + +INSTALL(FILES ${DOCFILES} + DESTINATION ${SHARE_INSTALL_PREFIX}/doc/kbfx) diff --git a/doc/COPYING b/doc/COPYING new file mode 100755 index 0000000..bfefe24 --- /dev/null +++ b/doc/COPYING @@ -0,0 +1,346 @@ +This is A Recursive NOTE! + +All and All None Mentioned Files contained within the Source Package , Binary +or None Binary Follow the below Lincense . + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/doc/CREDITS b/doc/CREDITS new file mode 100644 index 0000000..32ac405 --- /dev/null +++ b/doc/CREDITS @@ -0,0 +1,11 @@ +Credits and Thanks go to: +========================= + +Revaline C. Regendra: For the Launch button in the default "KBFX Silk TTP" theme (version 0.4.9.3-20070117). +--------------------- Copyright (c) 2006. Revaline^Studio; Revaline's Launch Menu v4.0 + http://www.kde-look.org/content/show.php?content=36399 + regendra_mail7@yahoo.com + +Petri Damstn: For the KMFFontChooser class. +-------------- http://www.iki.fi/damu/software/kmediafactory/ + damu@iki.fi
\ No newline at end of file diff --git a/doc/ChangeLog b/doc/ChangeLog new file mode 100755 index 0000000..6fef33f --- /dev/null +++ b/doc/ChangeLog @@ -0,0 +1,123 @@ +0.4.9.3.1 +========= + - CHANGED layout and font configfile specs + - UPDATED help documentation + - ADDED fade transition effect on the KBFX Button + - ADDED install guides for using checkinstall + - ADDED Hungarian translation (thanks to Ferenc Stelcz for it) + - ADDED option to watch for KDE global changes like new installed applications + - ADDED option for Theme Info + - ADDED resizable configuration dialogs + - ADDED drag&drop hover, pressed and normal images over the KBFX button + - ADDED tooltip support for the KBFX button + - ADDED switch between KBFX and K Menu + - ADDED new two panel skin - "2panels" + - ADDED configurable middle background - middleboxbg.png + - ADDED fonts support in every part of the menu + - ADDED layout support in the KBFX Configurator + - ADDED support for the new versions of strigi + - ADDED support for use of strigi in Gentoo + - ADDED support for SVN version in Gentoo + - ADDED support for PCLinuxOS rpm build (thanks to @PaGal and @tom777 for the testing) + - ADDED support for future KDE4 (part 1) + - ADDED uninstall option for "build.sh" script + - FIXED cmake uninstall + - FIXED RPM .la issues + - FIXED some major bugs + - REMOVED Water effect (too much CPU time consuming and not a favorite one for our users) + +0.4.9.3-20070117 +================ + - Initial Release of the 0.4.9.3 Series - KBFX Silk (0.4.9.3) + - New Build system (cmake) + - Re-write of the data backend + - Re-write of the GUI + - Totally new theme + - Improved configuration dialog + +0.4.9.2rc4 +========== + - CHANGED some aspects of autoconf/automake behavior + - CHANGED "Toolbar Resize" behavior - turned off by default so kicker doesn't change its size anymore + - ADDED support for Mandriva 2007 compilation (no menudrake there by default) + - FIXED Search bar behavior (thanks @gropiuskalle) + - FIXED some minor bugs + +0.4.9.2rc3 +========== + - ADDED support for preparing .kbfxtheme files in Konqueror (look the explanation in HOWTO file) + - ADDED "--prepare" command line option to pack existing KBFX Skin Folders to .kbfxtheme files + - ADDED "Default Theme's Personal Image" to the "KBFX Configurator Application" + - ADDED "Toolbar Resize" option to the "KBFX Configurator Application" for the toolbar where the KBFX Button resides + - ADDED it, bg and nl translations + - FIXED some minor bugs + +0.4.9.2rc2 +========== + - CHANGED "KBFX Configurator Application" - rewritten from scratch and is no more part of "kcontrol" + - CHANGED "Tooltip Animation" behavior - turned off by default + - ADDED new Default Theme + - ADDED fonts configuration option to the "KBFX Configurator Application" + - ADDED Install/Delete Themes to the "KBFX Configurator Application" + - ADDED support for .kbfxtheme files in Konqueror (look the explanation in HOWTO file) + - ADDED possibility to change "dude" image to the "KBFX Configurator Application" + - ADDED Free-BSD Support + - FIXED font alignment problems + - FIXED long applications name problem + - FIXED some memory leaks + - FIXED some minor bugs + +0.4.9.2-20060708cvs +=================== + - UPDATED make system + +0.4.9.2-20060611cvs +=================== + - ADDED PC-BSD Support + - ADDED Drag and Drop Support + - FIXED a bug with showing icons in "Recently Used" items + - FIXED a bug with the placement of ".face.icon" (thanks @Nucc) + - Flicker Free KBFX Button + - Flicker Free KBFX SPINX Menu TOP + - Better scrolling + +0.4.9.2-20060528cvs +=================== + - ADDED support for Fedora rpm + - ADDED an option to disable tooltips (see HOWTO file) + - FIXED a problem with building SUSE rpm + +0.4.9.2rc1 +========== + - ADDED support for Buttons with Drop shadows + - ADDED Font settings as part of the Theme itself + - ADDED Kiosk mode support + - ADDED Handling of submenus + - FIXED make system for all distributions + - Better support for Mandriva distribution + - More applications for the menu + - Grouping header for each application group and sub groups + +0.4.9.1 +======= + - New HTML based Config + - Spinx Bar improved and redone for MAX icandy with better theme support + - Double buffered rendering for kbfx button + - image support + - Animated scrollbars like thing + - icons zoom + - Improved skin support + - themeable tooltip ( two types animated and none animated) + - KDE user icon support (KDM icons) + - user Name support (login name) + - Application Items are sorted + - Better user support and Help + - login and lock buttons are working now + - Mouse Cursor has more sense + - KControl Module uses HTML ..old config removed + - Automatic icons and theme installation with source code + - The applet is renamed , from kbfxvista to kbfxspinx + - Animated User Image + - Add more to Menu Action for Application List Better Customizations. + - 32x32 icons support + diff --git a/doc/HACKING b/doc/HACKING new file mode 100644 index 0000000..b2eb11e --- /dev/null +++ b/doc/HACKING @@ -0,0 +1,21 @@ +======================== +| Some syntax rules: | +======================== + +Variables: +---------- + + {prefix}_{variablename} + + Prefixes Use + "m_" for member variables + "p_" for pointer variables + "a_" for variables of argument functions + + +Comments: +--------- + + Please make small comments on important issues. + And TODOs also. +
\ No newline at end of file diff --git a/doc/HOWTO b/doc/HOWTO new file mode 100644 index 0000000..c254a02 --- /dev/null +++ b/doc/HOWTO @@ -0,0 +1,411 @@ +How to apply the Menu button +============================ + +The menu button is starting point for the menu. +It first has to be added to the panel. +To add the KBFX Menu to the panel, proceed as following: + Right-click on the panel, on which you want to place the KBFX button + Select "Add Applet to panel" in the context menu + Select "KBFX Spinx" +A tooltip appears "KBFX Spinx Added" +If you move your mouse over the button, a tooltip appears (turned off +in the default configuration). +If you want to, you can now remove the K-Menu button and move the KBFX +to the desired place on the panel. +To open the menu, just click on the button. + + + +How to create themes for KBFX 0.4.9.3 +===================================== + +So you want to create your own themes for KBFX 0.4.9.3? +The guide is done in a simple manner and we hope that you will easily and +simply create themes for KBFX 0.4.9.3. If you don't like something in this +guide, please feel free to contact us at IRC on irc.freenode.org +on channel #kbfx + +NOTE: - The values for Width and Height are only our suggested values. + You can use whatever values you feel are appropriate for your theme. + - If ANY of these images are missing KBFX will use the image with the + same name from the "default" theme. + - In order to be used by the Configurator and by KBFX, every theme for + 0.4.9.3 MUST HAVE a file in it's folder named "version-2" ! + + topbg.png + --------- + This is an image that is at the top of the menu. + Width = 504px + Height = 95px + + dudebox.png + ----------- + This is the background image where your personal image is displayed. + Width = 95px + Height = 88px + + menu_top_image_person.png + ------------------------- + This image is used for theme's default personal image. + Width = 48 px + Height = 48 px + + find.png + -------- + This is a small image displayed in the search field. + Width = 22px + Height = 21px + + rhstile.png + ----------- + This is normal image displayed in categories. + Width = 132px + Height = 23px + + rhshovertile.png + ---------------- + This is a hover image for categories.Used as hover image for rhstile.png + Width = 132px + Height = 23px + + scrollnormal.png / scrollnormalbot.png + -------------------------------------- + These images are used as top and bottom scrollbars. + Width = 240px + Height = 10px + + separator.png / indexseparator.png + ---------------------------------- + These are the separator images which separate your different subcategories. + Width = 240px + Height = 27px + + tilenormal.png + -------------- + This is the normal image where your applications are showed. + Width = 240px + Height = 46px + + tilehover.png + ------------- + This is the hover image where your applications are showed. + Width = 240px + Height = 46px + + listboxbg.png + ------------- + This is the background under the categories. It can be viewed on description + on both sides of the menu. + Width = 108px + Height = 23px + + middleboxbg.png + --------------- + This is the background of the middle part of the menu. + Width = 200px + Height = 270px + + botbg.png + --------- + This is the background image at the bottom of the menu. + Width = 504px + Height = 38px + + lock.png + -------- + This is the lock image. + Width = 84px + Height = 38px + + lockhover.png + ------------- + This is the lock hover image. + Width = 84px + Height = 38px + + logout.png + ---------- + This is the logout image. + Width = 84px + Height = 38px + + + logouthover.png + --------------- + This is the logout hover image. + Width = 84px + Height = 38px + + mask.png + -------- + This is deciding what size your menu will have when users install it + and which will be the transparent parts of the menu (through the alpha + mask of the png image). Of course the size can be controlled later by + the configuration of KBFX. + Width = 504px + Height = 513px + + logo.png + --------- + logo.png is used as a theme's or author's logo shown in the Information box of + the KBFX Configurator. You can put whatever image you want and it will be scaled + to 100px width by 100px height. + Width = up to 100 px + Height = up to 100 px + + preview.png + ----------- + preview.png should be a snapshot of the working KBFX theme. It is used in the + configuration application in order the user to see what the theme will look like. + Width = 170 px + Height = 205 px + + normal.png / hover.png / pressed.png + ------------------------------------ + These are the KBFX Buttons for the kicker panel that are used in the theme. + Width and Height - as you like, but preferably Height not to be too much. + + +More information can be found on: + http://www.kbfx.org/staticpages/index.php?page=howto0493 + + + +How to write theme's kbfxfontrc and kbfxlayoutrc files +====================================================== + + Every theme MAY have two configuration files named: + +kbfxfontrc - configures the fonts properties that the theme uses +kbfxlayoutrc - configures the layout of the theme, the KBFX button + and some other properties of the theme + + If one or both of these files don't exist, KBFX internal configuration +options will be used for fonts and layout. + All the properties and values are separated between different Sections +in the way showed below: + +[Section] +property = value + + When you want to prepare a theme, have in mind that every change that you +make in the "KBFX Configurator" is kept in files in your home KDE directory. +Usually these files are here: + ~/.kde/share/apps/kbfx/themerc +and are named: + THEMENAME_layoutrc + THEMENAME_fontrc +So if you want to ship your theme settings from the "KBFX Configurator", the best +thing to do is to use the buttons: "EXPORT KBFXFONTRC FILE" ("Fonts" section of the +Configurator) and "EXPORT KBFXLAYOUTRC FILE" ("Layout section" of the Configurator) +and put the exported files in your theme folder. + +NOTE: - Pay close attention to the case of the properties and Sections names + because the configuration is CASE SENSITIVE! + - The order of the sections in the file is not important! + - Have in mind that the Layout of the theme also depends on the sizes of + the images! + + + File kbfxfontrc + --------------- + It's best the colors to be represented in RGB format. + Font Properties should constrain to QFont class representation. + The values bellow are the default ones: + + [Fonts] + TooltipText=0,0,0 + TooltipTextFont=Arial,8,-1,5,50,0,0,0,0,0 + ApplicationText=0,0,0 + ApplicationTextFont=Arial,8,-1,5,50,0,0,0,0,0 + CommentText=128,125,0 + CommentTextFont=Arial,8,-1,5,50,0,0,0,0,0 + GroupText=0,0,0 + GroupTextFont=Arial,8,-1,5,50,0,0,0,0,0 + UserName=255,255,255 + UserNameFont=Arial,10,-1,5,75,0,0,0,0,0 + SeparatorColor=0,0,0 + SeparatorFont=Arial,8,-1,5,50,0,0,0,0,0 + PluginColor=0,0,0 + PluginFont=Arial,8,-1,5,50,0,0,0,0,0 + LineColor=255,220,125 + # This is if the font when you hover on an item will be bold + HoverBold = false + + File kbfxlayoutrc + ----------------- + The values bellow are the default ones: + + [KbfxButton] + # Time in msec for which the button + # to fade in/out + FadeTime=75 + # The three properties below describe the + # paths to the theme's buttons. + # KBFX uses the normal.png/hover.png/pressed.png + # that are in the theme's folder by default. + # So we recommend NOT to use the below three + # properties! + Normal = KBFX Normal Button Full Path + Hover = KBFX Hover Button Full Path + Press = KBFX Pressed Button Full Path + + [TopBar] + # Face Position X + DudeX=-1 + # Face Position Y + DudeY=-1 + # Face Box Height + FaceH=64 + # Face Box Width + FaceW=65 + # Face Box Position X + FaceX=27 + # Face Box Position Y + FaceY=8 + # User Name Position X + UserNameX=130 + # User Name Position Y + UserNameY=32 + # Hide User Name + DisableUserName=false + # Top Bar Height + Height=95 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Top Bar Width + Width=504 + # Top Bar Position X + X=0 + # Top Bar Position Y + Y=0 + + [BottomBar] + # Bottom Bar Height + Height=38 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Bottom Bar Width + Width=504 + # Bottom Bar Position X + X=0 + # Bottom Bar Position Y + Y=428 + + [Scrollbars] + # THIS SECTION IS NOT USED FOR NOW + # Bottom Scroll Bar Position X + ScrollBarBotX=108 + # Bottom Scroll Bar Position Y + ScrollBarBotY=95 + # Top Scroll Bar Position X + ScrollBarTopX=108 + # Top Scroll Bar Position Y + ScrollBarTopY=95 + + [ListBox] + # List Box Position X + X=0 + # List Box Position Y + Y=95 + # List Box Width + Width=132 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # List Box Height + Height=275 + + [SearchBox] + # Search Box Height + Height=22 + # Search Box Width + Width=240 + # Search Box Position X + X=130 + # Search Box Position Y + Y=48 + + [ItemView] + # Item Position X + X=132 + # Item Position Y + Y=95 + # Item Width + Width=240 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Item Height + Height=275 + + [ItemProperties] + # Comment Margin in Item + CommentMargin=66 + # Icon Size in Item + IconSize=32 + # No Comments in Item + NoComments=false + + [ToolBar] + # THIS SECTION IS NOT USED FOR NOW + # Tool Bar Button Normal Size + ButtonNormalSize=48 + # Tool Bar Button Pressed Size + ButtonPressedSize=48 + + [MainMenu] + # Main Menu Height + UserMenuHeight=513 + # Main Menu Width + UserMenuWidth=504 + # Contracted Menues + ContractedMenu=false + + File version-2 + -------------- + + This file is obligatory to exist, though it can be empty. + It is used to designate that the theme is in the new format and the + properties that are in the file are used in the KBFX Configurator for + showing the user some info about the theme. + The values in this file cannot be overwritten by the KBFX Configurator. + If existing, the file should contain information about the theme's version, + author's name, author's email and a homepage for the theme. + The unspecified fields are replaced with the string - "Not Specified". + The values bellow are self explanatory and are just an example: + + [ThemeGeneral] + ThemeVersion=0.51 + AuthorName=Nookie + AuthorEmail=nookie@no_spam.org + Homepage=http://www.kbfx.org + + + + How to create a ".kbfxtheme" file for 0.4.9.3 + ============================================= + +The ".kbfxtheme" file is a simple archive file (.tar.gz or .tar.bz2) that should +contain at least these elements: +- one or more theme folders with all the necessary images/files inside. Have in mind + that the name of the theme is the name of the folder. +- in the theme(s) folder(s) there should be an image named preview.png that serves + as a live preview of the look of the theme. +- in the theme(s) folder(s) there should be a file named version-2 +- the extension of the archive should be ".kbfxtheme" + +You can create ".kbfxtheme" file following these instructions (there is +an option in Konqueror's rightclick "Actions" menu for preparing KBFX Theme Package +OR you can create the ".kbfxtheme" file manually as described bellow): +- Create a folder with a name that is identical to the name you want for your theme. +- Put the necessary images/files inside it (see the above instructions for the images part). +- Create an archive of the folder (with ark/tar etc). +- Rename the archive file to ".kbfxtheme" and you are ready. + + + How to help us out + ================== + +You can help us for the KBFX releases with the translation of the interface. +For this purpose please download the kbfxconfigapp.pot file from SourceForge: +http://sourceforge.net/project/showfiles.php?group_id=141258&package_id=210120 . +Another way to get a .pot file is to use the command "make package-messages" +just after the configuration of the compilation process is done. +Then use KBabel (http://kbabel.kde.org/) or poEdit (http://www.poedit.org/) to make the translation. +Next send the .po file to my mail - phobosk@mail.kbfx.org +Thanks in advance for this help. diff --git a/doc/INSTALL b/doc/INSTALL new file mode 100755 index 0000000..6166e13 --- /dev/null +++ b/doc/INSTALL @@ -0,0 +1,203 @@ +############################################ +# # +# INSTALL file for KBFX > 0.4.9.2 # +# # +############################################ +Last update: 03/03/2007 + +Installation Notes by PhobosK + + + + +1. Requirements : +================= + +- Cmake ( http://www.cmake.org ) - min. version 2.4.2 +- KDE3 and Qt3 sources - header files/devel packages +- Strigi ( http://strigi.sf.net ) - header files/devel packages needed too + (optional package) + + + +2. Compilation Instructions : +============================= + + 2.1. Unpack the sources of KBFX with (x.y.z-XXXXXXXX represents the version of + the KBFX package, for example : 0.4.9.3-20070117): + + > tar xjvf kbfx-x.y.z-XXXXXXXX.tar.bz2 + + 2.2. Change into the new directory: + + > cd kbfx-x.y.z-XXXXXXXX/ + + 2.3. Start the configuration and the compilation using the command: + + > ./build.sh + + Note for Mandriva < 2007 users: + =============================== + The build script (by default) enables the use of "menudrake" + instead of "kmenuedit". If you want to prevent this behavior then + pass ONE of these options to the build script: + "--menudrake-off" OR "-m" + + Notes for other building options: + ================================= + "--prefix" OR "-p" to install KBFX in a different than the default folder + (default is KDE install folder) for example: + > ./build.sh -p /home/user + "--strigi" OR "-s" to enable Strigi support in KBFX + (default is no Strigi support) + "--kde4" OR "-k" to build KBFX for KDE4 + (default is for KDE3) + "--verbose" OR "-v" to make the build script give more verbose information + "--nocheck" OR "-n" to make the build script not to check if an old KBFX + version is installed (default is to check) + + + +3. Using the "checkinstall" application for building KBFX packages : +==================================================================== + +"checkinstall" DOES NOT work with cmake correctly up to this moment. :( +It can be used with additional commands in order to "work properly". +Here is the procedure to follow as user (NOT as ROOT) in order to obtain +the necessary distribution package. +NOTE: - x.y.z-XXXXXXXX represents the version of the KBFX package, + in this example it is: 0.4.9.3-20070117 + - in the example here the version string is replaced only in the + checkinstall comand but you have to do that everywhere the + "x.y.z-XXXXXXXX" string is met + + > cd /tmp + > tar xjvf kbfx-x.y.z-XXXXXXXX.tar.bz2 + > cd kbfx-x.y.z-XXXXXXXX/ + > mkdir -p build/package + > cd build + > export DESTDIR=/tmp/kbfx-x.y.z-XXXXXXXX/build/package + > cmake ../ -DCMAKE_INSTALL_PREFIX=`kde-config --prefix` + > make install DESTDIR=/tmp/kbfx-x.y.z-XXXXXXXX/build/package + > find package/|sed s#^package/#./# > installed_files.txt + > cd package/ + > su + > checkinstall -nodoc --pkgname="kbfx" --pkgversion="0.4.9.3" --pkgrelease="20070117" \ + --exclude="/" --include=../installed_files.txt --pakdir=/tmp/kbfx-0.4.9.3-20070117 sleep 1 + +When ready, "checkinstall" will show you the folder where the prepared package +is, like in this Mandriva Example: + +********************************************************************** + + Done. The new package has been saved to + + /tmp/kbfx-0.4.9.3-20070117/kbfx-0.4.9.3-20070117.i386.rpm + You can install it in your system anytime using: + + rpm -i kbfx-0.4.9.3-20070117.i386.rpm + +********************************************************************** + +Of course the best way to make RPM packages is to use the "kbfx.spec" file provided +in the KBFX sources like described bellow. + + + +4. RPM Building Instructions (Mandriva, Fedora, Suse) : +======================================================= + +If you prefer manipulate a RPM, you can build it with the following commands: + + 4.1. Build the RPM + + > rpmbuild -tb kbfx-x.y.z-XXXXXXXX.tar.bz2 + + or (for Mandriva) + + > rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-mdv20070.src.rpm + + or (for Fedora) + + > rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-FCx.src.rpm + + or (for SuSe) + + > rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-suseXXX.src.rpm + + 4.2. If succeed, you will found the rpm in /usr/src/rpm/RPMS (for Mandriva) + or /usr/src/redhat/RPMS (for Fedora) or /usr/src/packages/RPMS (for Suse) + according to the platform you have. + + 4.3. Install the rpm as usually by: + > rpm -Uvh kbfx-x.y.z-XXXXXXXX.rpm + + Notes for building RPM from KBFX SVN versions : + =============================================== + - Follow these commands in the sources directory: + > ./build.sh + > Answer "N" to the question if you want to install KBFX + > cd build + > make dist + - A file "kbfx-x.y.z-XXXXXXXX.tar.bz2" will be created in the build + directory. + - Proceed with the steps described in 4.1., 4.2., 4.3. + + + +5. Gentoo users: +================ + +In order to use the strigi engine in KBFX you have to do these steps: + - Copy the "strigi-X.X.X.ebuild" and the "kbfx-0.4.9.X.ebuild" (from the sources + directory) to your local portage tree as needed + OR use the "kbfx-0.4.9.X-portage-overlay.tar.bz2" + - Set the flag "strigi" for the kbfx ebuild + - Emerge "clucene" + - Emerge "kbfx" + +There is a Layman overlay resource on the SourceForge SVN. +You can add it by this command: + > layman -f -o https://kbfx.svn.sourceforge.net/svnroot/kbfx/layman/kbfx-overlay.xml \ + -a kbfx +After you add the "kbfx" overlay you can use it as usual. + + + +6. Getting SVN version: +======================= + +To download the latest development source, you need to go to KDE SVN +and download it from there. The current SVN address of the repository is: +svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma + +Here are the instructions on how to get a copy of the SVN Repository: + + 6.1. Install your distribution's package named "subversion" + OR download and install it from: http://subversion.tigris.org + + 6.2. Create a folder where you will compile/install KBFX and enter in it. + For example do this: + + > mkdir -p ~/usr/src/svn + > cd ~/usr/src/svn + + 6.3. Checkout the SVN version of KBFX in this way and proceed as follows: + + > svn co svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma + > cd kbfx_plasma + + 6.4. Proceed with the compilation/installation of KBFX as described in 2.3. + + > ./build.sh + + 6.5. If you want always to have the latest version of KBFX you may leave + the folder ~/usr/src/svn/kbfx_plasma intact for future use. + When you want to update the source files of KBFX you just need to do + "svn up" in this folder, delete the folder ~/usr/src/svn/kbfx_plasma/build + and do the step described in 2.3. i.e: + + > cd ~/usr/src/svn/kbfx_plasma + > svn up + > rm -fR build + > ./build.sh diff --git a/doc/KNOWN_BUGS b/doc/KNOWN_BUGS new file mode 100644 index 0000000..9491fb9 --- /dev/null +++ b/doc/KNOWN_BUGS @@ -0,0 +1 @@ +1. Global keybindings DOES NOT work diff --git a/doc/LICENSE b/doc/LICENSE new file mode 100644 index 0000000..628a8da --- /dev/null +++ b/doc/LICENSE @@ -0,0 +1,351 @@ +########### +# GPL-2 # +########### + +This is A Recursive NOTE! + +All and All None Mentioned Files contained within the Source Package , Binary +or None Binary Follow the below Lincense . + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/doc/NEWS b/doc/NEWS new file mode 100755 index 0000000..a78e19c --- /dev/null +++ b/doc/NEWS @@ -0,0 +1,37 @@ +"KBFX Silk" (0.4.9.3.1) +======================= + +Hello everyone, + +After a long silence from us now we are happy to announce that finally the +stable release of KBFX is ready. +We made a lot of changes to the KBFX Configurator and to KBFX Menu itself. +However we were not able to implement everything you proposed and everything we +wanted. So some of the features (see the TODO list in the source files) +in "KBFX Silk" (0.4.9.3.1) are still not ready. We are sure that they will +present in the next stable release which will be due just after KDE4 is +released. The menu itself, however, is fully functional. + +Thanks to all of you who gave us ideas and who tested the prerelease versions of +KBFX. + +All the best from your KBFX Team. :) + + +Note: Things to be considered before installing "KBFX Silk" +=========================================================== + +1.) To configure and compile "KBFX Silk" you need Cmake >= 2.4.2 from http://www.cmake.org + +2.) To configure, compile and install "KBFX Silk" simply run ./build.sh + +3.) Before the install of "KBFX Silk", please unload and uninstall any previous version of KBFX. + +4.) After the install of "KBFX Silk" please relogin KDE. + +5.) If you need file searching capabilities in KBFX, please download and install Strigi + from http://strigi.sf.net + +6.) To enable Strigi support in KBFX, please pass "--strigi" OR "-s" option to build.sh + i.e: ./build.sh --strigi + diff --git a/doc/README b/doc/README new file mode 100755 index 0000000..406bb02 --- /dev/null +++ b/doc/README @@ -0,0 +1,44 @@ + KBFX Preface: + ============ + KBFX is an alternative to the classical K-Menu button and it's menu. +It improves the user experience by enabling the user to set a bigger (and +thus more visible) start button and by finally replacing the Win95-like +K-Menu with the Spinx bar. +If you still want the old menu, because you're used to it, it is still +available as an option in KBFX. + + + Team/Credits + ============ +The KBFX team is small, but very active. The members are: + Siraj Razick: Maintainer, initiator of KBFX, Developer, Project Admin + Mensur Zahirovic (nookie): Web-development, Q&A, Graphics, Bug Hunter, + Project Admin + Nathanael Gogniat (dracor): Documentation + PhobosK: Package & Release Manager, Quality Assurance, Bug Hunter, + Mandriva Packages, Project Admin, Developer QT/C++ + Johnny Henry Sáenz Acuña (scarebyte): Developer QT4/C++, Debian Packages + Fathi Boudra (fabo): Developper QT/C++, Debian Packages + Pascal Jungblut (Jongking): Development support + +Special thanks goes to: + Akhmad Fathonih, Asif Ali Rizwaan, Dominik, Victor, Ron (bfman), Steady + +We would also like to thank everyone who has contributed to KBFX by using +it and sending feedback and bugs and everyone who has contributed button +designs or ideas. + + + Other Useful Info + ================= +For Installation Instructions: + see INSTALL +For useful howtoes: + see HOWTO +For known bugs: + see KNOWN_BUGS +Project Homepage: + http://www.kbfx.org +Project Releases: + http://sourceforge.net/project/showfiles.php?group_id=141258 + diff --git a/doc/TODO b/doc/TODO new file mode 100755 index 0000000..11bb1fa --- /dev/null +++ b/doc/TODO @@ -0,0 +1,62 @@ +############### +# # +# TODO List # +# # +############### + + + KEYS + ---- + * Completed + + Work In Progress + - Still Dreaming About It + ? What On The Earth Is This + ! Top Important - To Be Done As Soon As Possible + + + KBFX Cmake + ---------- +!+ # KDE4 Compatibility +!- # Auto Strigi Sensitive + + + KBFX Docs + --------- + - # Document Plugin Interface + + + KBFX App + -------- +!- # Implement A Recently Used Menu +!- # Rightclick On An App - Menu (Run, Edit, Properties etc.) +!- # Implement A "Switch User" Button (Like Logout And Lock Buttons) +!- # Customization Of The Logout And Lock Buttons Places +!- # To Implement Another Way Of Reloading KBFX Not Through Kicker DCOP Reload +!- # Rewrite the DCOP interface (in src/) to DBUS for KDE4 support. Should be done in a way to preserve KDE3 compatibility! +!- # Side Slider For The Programs In The Middle Part Except The Arrow Up/Down (@janet Proposal) + + # Make The Canvas Autoadjust On Group Fold + - # Add Config Interface For Each Plugin + - # Clean Plugin Interface + - # Write More Plugins + - # Some Tool-Tips Would Be Really Nice To Have, Especially The Cancel And Logout Buttons (@athleston Proposal) + - # Configurable Timeout When Clicking And Hovering Over A Group In The Menu (@ruffy Proposal) + - # Beryl Compatibility (@ruffy Proposal And Testing - http://img406.imageshack.us/img406/1554/snapshot207ed.png ) + - # Submenu Handling - See http://img211.imageshack.us/img211/2026/kbfxsubmenusweirdod7.jpg (@janet Proposal) + + + KBFX Config + ----------- + + + KBFX Design + ----------- + + + Remover + ------- + + + Public Relations + ---------------- + + # Talk To Heliocastro About Shifting To Extragears : emailTO helio@kde.org + + # Talk To SuSe People diff --git a/doc/common/CMakeLists.txt b/doc/common/CMakeLists.txt new file mode 100644 index 0000000..7871a0c --- /dev/null +++ b/doc/common/CMakeLists.txt @@ -0,0 +1,5 @@ +FILE(GLOB JPGFILES *.jpg ) +FILE(GLOB PNGFILES *.png ) + +INSTALL(FILES ${JPGFILES} ${PNGFILES} + DESTINATION ${HTML_INSTALL_DIR}/en/common) diff --git a/doc/common/kbfx-about.jpg b/doc/common/kbfx-about.jpg Binary files differnew file mode 100644 index 0000000..a349e7f --- /dev/null +++ b/doc/common/kbfx-about.jpg diff --git a/doc/common/kbfx-fonts.jpg b/doc/common/kbfx-fonts.jpg Binary files differnew file mode 100644 index 0000000..2dd0747 --- /dev/null +++ b/doc/common/kbfx-fonts.jpg diff --git a/doc/common/kbfx-layout.jpg b/doc/common/kbfx-layout.jpg Binary files differnew file mode 100644 index 0000000..9f8f65d --- /dev/null +++ b/doc/common/kbfx-layout.jpg diff --git a/doc/common/kbfx-maindescription.jpg b/doc/common/kbfx-maindescription.jpg Binary files differnew file mode 100644 index 0000000..6ae740d --- /dev/null +++ b/doc/common/kbfx-maindescription.jpg diff --git a/doc/common/kbfx-plugins.jpg b/doc/common/kbfx-plugins.jpg Binary files differnew file mode 100644 index 0000000..e9e3466 --- /dev/null +++ b/doc/common/kbfx-plugins.jpg diff --git a/doc/common/kbfx-startbutton.jpg b/doc/common/kbfx-startbutton.jpg Binary files differnew file mode 100644 index 0000000..e800577 --- /dev/null +++ b/doc/common/kbfx-startbutton.jpg diff --git a/doc/common/kbfx-style.jpg b/doc/common/kbfx-style.jpg Binary files differnew file mode 100644 index 0000000..85e580e --- /dev/null +++ b/doc/common/kbfx-style.jpg diff --git a/doc/common/kbfx-themes.jpg b/doc/common/kbfx-themes.jpg Binary files differnew file mode 100644 index 0000000..3d87682 --- /dev/null +++ b/doc/common/kbfx-themes.jpg diff --git a/doc/common/kbfx-tooltip.jpg b/doc/common/kbfx-tooltip.jpg Binary files differnew file mode 100644 index 0000000..fc45e44 --- /dev/null +++ b/doc/common/kbfx-tooltip.jpg diff --git a/doc/en/CMakeLists.txt b/doc/en/CMakeLists.txt new file mode 100644 index 0000000..3eff8c4 --- /dev/null +++ b/doc/en/CMakeLists.txt @@ -0,0 +1,2 @@ +KDE3_CREATE_HANDBOOK ( index.docbook ) +KDE3_INSTALL_HANDBOOK ( kbfxconfigapp ) diff --git a/doc/en/index.docbook.in b/doc/en/index.docbook.in new file mode 100644 index 0000000..102e11b --- /dev/null +++ b/doc/en/index.docbook.in @@ -0,0 +1,2456 @@ +<?xml version="1.0" ?> +<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [ + <!ENTITY kbfxconfigapp "<application>KBFX Configurator @APPLICATION_VERSION@</application>"> + <!ENTITY kappname "&kbfxconfigapp;"><!-- Do *not* replace kappname--> + <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc --> + <!ENTITY % addindex "IGNORE"> + <!ENTITY % English "INCLUDE"><!-- change language only here --> + + + <!-- Do not define any other entities; instead, use the entities + from kde-genent.entities and $LANG/user.entities. --> +]> + +<!-- ................................................................ --> + +<!-- The language must NOT be changed here. --> + +<book lang="&language;"> + +<bookinfo> + <title>The &kbfxconfigapp; Handbook</title> + + <authorgroup> + <author> + <firstname>Siraj</firstname> + <othername></othername> + <surname>Razick</surname> + <affiliation> + <address><email>siraj@kdemail.net</email></address> + </affiliation> + </author> + + <author> + <firstname></firstname> + <othername></othername> + <surname>PhobosK</surname> + <affiliation> + <address><email>phobosk@mail.kbfx.org</email></address> + </affiliation> + </author> + + <author> + <firstname>Mensur</firstname> + <othername>Nookie</othername> + <surname>Zahirovic</surname> + <affiliation> + <address><email>nookie@mail.kbfx.org</email></address> + </affiliation> + </author> + + <author> + <firstname>Nathanael</firstname> + <othername></othername> + <surname>Gogniat</surname> + <affiliation> + <address><email>nathanael@mail.kbfx.org</email></address> + </affiliation> + </author> + </authorgroup> + + <!-- TRANS:ROLES_OF_TRANSLATORS --> + + <copyright> + <year>2007</year> + <holder><link linkend="kbfx_team">KBFX Team</link></holder> + </copyright> + + <!-- Translators: put here the copyright notice of the translation --> + <!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook + and in the FDL itself on how to use it. --> + <legalnotice>&FDLNotice;</legalnotice> + + <!-- Date and version information of the documentation + Don't forget to include this last date and this last revision number, we + need them for translation coordination ! + Please respect the format of the date (YYYY-MM-DD) and of the version + (V.MM.LL), it could be used by automation scripts. + Do NOT change these in the translation. --> + + <date>@APPLICATION_DATE@</date> + <releaseinfo>@APPLICATION_VERSION@</releaseinfo> + + <!-- Abstract about this handbook --> + + <abstract> + <para> + KBFX is an alternative to the classical K-Menu button and it's menu. + </para> + + <para> + It improves the user experience by enabling the user to set a bigger (and + thus more visible) start button and by finally replacing the Win95-like K-Menu. + But if you still want the old menu, because you're used to it, it is still + available as an option in KBFX. We recommend, however, that you give the Spinx + bar a try. + </para> + </abstract> + + <!-- This is a set of Keywords for indexing by search engines. + Please at least include KDE, the KDE package it is in, the name + of your application, and a few relevant keywords. --> + + <keywordset> + <keyword>KDE</keyword> + <keyword>kbfxconfigapp</keyword> + <keyword>KBFX</keyword> + <keyword>Menu</keyword> + <keyword>Configurator</keyword> + </keywordset> +</bookinfo> + +<!-- The contents of the documentation begin here. --> + +<chapter id="introduction"> + <title>Introduction</title> + + <para> + KBFX is an alternative to the classical K-Menu button and it's menu. + It improves the user experience by enabling the user to set a bigger (and + thus more visible) start button and by finally replacing the Win95-like K-Menu. + But if you still want the old menu, because you're used to it, it is still + available as an option in KBFX. We recommend, however, that you give the Spinx + bar a try. + </para> + + <para> </para> + + <sect1 id="kbfx-features"> + <title>KBFX features</title> + + <para> + Main KBFX features: + </para> + + <orderedlist> + <listitem> + <para> + Using Plugins. + </para> + </listitem> + + <listitem> + <para> + Selecting an Application Group. + </para> + </listitem> + + <listitem> + <para> + Scroll up and down the application list. + </para> + </listitem> + + <listitem> + <para> + Type and locate an Application. + </para> + </listitem> + + <listitem> + <para> + Logout of the Desktop. + </para> + </listitem> + + <listitem> + <para> + Lock the Desktop. + </para> + </listitem> + + <listitem> + <para> + Launch the KBFX Configurator (the KBFX settings manager). + </para> + </listitem> + </orderedlist> + + <para> + Extra KBFX features: + </para> + + <orderedlist> + <listitem> + <para> + Double buffered Widgets to minimize flicker. + </para> + </listitem> + + <listitem> + <para> + Animated scroll bars. + </para> + </listitem> + + <listitem> + <para> + New Tooltip. + </para> + </listitem> + + <listitem> + <para> + New Control Manager. + </para> + </listitem> + + <listitem> + <para> + Drag & Drop Applications' Items support. + </para> + </listitem> + + </orderedlist> + </sect1> + + <sect1 id="kbfx-history"> + <title>KBFX History</title> + + <para> + KBFX was started on June 5th 2005 as a hobbyist project by Siraj Razick, born out of a spontaneous idea. + </para> + + <para> + The reason was that Siraj didn't like the old K-Menu, which was quite a clone of the old Win95 Start menu. So he started coding. + The first step provided merely the possibility to call the K-Menu via a button, that could have a different shape and size than the original K-Menu button, which has always been an icon of a square size. To change the default KBFX button, one still had to copy an image file to a certain location. + After the first post in mid-June 05, KBFX has spread rapidly and it was nice to see that until end of June, there were already a dozen posts on kde-look with buttons and builds. + </para> + + <para> + Mensur Zahirovic (called Nookie) joined Siraj on 5th of august, after Siraj met him on yahoo. Nookie is responsible for the Web-development and the Q&A. He also arranged the site www.kbfx.org, that replaces the previous site www.linuxlots.com/~siraj/plugin/kde. + </para> + + <para> + After that, things began to speed up. + Now KBFX is no longer just another button design for the K-Menu, but provides an alternative to it, that is in fact more sophisticated than the XP-Start menu. + </para> + </sect1> + + <sect1 id="kbfx-development"> + <title>KBFX Development</title> + + <para> + KBFX version 0.4.9.3 is a complete rewrite of the old KBFX code eliminating all the negative points of the previous versions. + </para> + + <para> + At the start we had a list of end requirements for version 0.4.9.3 and we developed each of the feature units, testing each and every class as it was developed. + Apart from unit testing, the quality assurance managers periodically checked the quality of the product and the new releases that were made to the KBFX source repository. + The Q&A always checked the product against the requirements that we had set to maximize quality. + This way of development helped us to discover tons of bugs and fix them instantly, and so we debut with a rather clean and bug free KBFX. + </para> + + <para> + It was really helpful to see many users around the world checking out the development release of KBFX from SVN, reporting and posting problems encountered and helping to add more stability and compatibility between distributions. + Because of this, we know the supported platforms even before KBFX is 0.4.9.3 is released. + </para> + + <para> + KBFX has been tested to work with all GCC3.x and GCC4.x compilers. + It has been tested on systems running the distributions of Gentoo, Debian, Ubuntu, Suse, Slackware, Mango, Mandrake, PCLinuxOS and Fedora core. + Unfortunately, compiling on FreeBSD systems is yet to be tested, but we plan to port KBFX to FreeBSD and PcBSD. + </para> + </sect1> + + <sect1 id="kbfx-concepts"> + <title>KBFX Concepts</title> + + <para> + The KBFX Spinx Menu does not try to copy the WinXP Start menu. + It is based on a different approach and concept. + Following, the concepts of the traditional hierarchical structure and the new, flat indexed menu are described and compared, although the new menu structure is quite intuitive. + </para> + + <para> </para> + + <sect2> + <title>Hierarchical (Traditional) menu structure</title> + + <para> + The KDE K-Menu is a good example of a flat hierarchical menu. + It organizes application shortcuts in a tree link structure, where it can expand and open a submenu, with entries displayed based on some logical order. + This order may be task oriented, type oriented or just ordered alphabetically. + To find and launch an application, the user needs to navigate through the submenus, until he reaches the leaf (leaf node). + This approach is a direct adoption of the Microsoft Windows Start Menu. They introduced it with Windows 95/98/ME/NT/2000. This was certainly a huge usability advantage compared to the Windows 3.1 System with the program manager, but a lot has changed since these days. The Windows XP Start Menu is still based on this concept, although it is enhanced by the functionalities to pin applications to the left column and the automatically pinned most used applications. + But still, a user must move the mouse over the half screen, if his menu has many submenus with other submenus, and the application is not one of his most used or pinned applications. + </para> + + <para> </para> + </sect2> + + + <sect2> + <title>Flat indexed menu structure</title> + + <para> + The KBFX Spinx Menu uses a different approach – the flat indexed menu. + With this type of menu it's very easy to navigate. + On the left hand side, you are given the application categories. + They can be task oriented or type oriented. On the right (middle) side of the menu, there are all the available applications listed that belong to the activated category. + The advantage is evident - the menu reduces the mouse paths, so you can locate your applications very fast. The user sees all the categories at a glance and he can pick it without having to travel along a long list until he finds the end leaf. + The speed of use is further enhanced by moving the most used and recently used applications on the top index, so that the most used applications are just one click away. + </para> + </sect2> + </sect1> +</chapter> + + +<chapter id="using-kbfx"> + <title>Using KBFX</title> + + <para> </para> + + <sect1 id="howto-button"> + <title>Starting KBFX</title> + + <para> + The KBFX menu button is a starting point for the menu. It first has to be added to a kicker's panel. + To add the KBFX Menu to a panel, proceed as following: + </para> + + <procedure> + <step> + <para> + Right-click on the kicker's panel, on which you want to place the KBFX button. + </para> + </step> + + <step> + <para> + Select "Add Applet to Panel..." in the context menu. + </para> + </step> + + <step> + <para> + Select "KBFX Spinx". + </para> + </step> + + <step> + <para> + A tooltip appears "KBFX Spinx Added". + </para> + </step> + + <step> + <para> + If you move your mouse over the button, a tooltip appears (turned off + in the default configuration). + </para> + </step> + + <step> + <para> + If you want to skin the KBFX Start Button see <link linkend="kbfx_button">this section</link>. + </para> + </step> + + <step> + <para> + If you want to, you can now remove the K-Menu button and move the KBFX to the desired place on the panel. To open the menu, just click on the button. + </para> + </step> + </procedure> + </sect1> + + <sect1 id="howto-menu"> + <title>Using the Spinx Menu</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Spinx Menu</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="preview.png" format="PNG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the the Spinx Menu</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + The Spinx Menu looks (depending on the skin) like the picture above. + It consists of following elements. + <orderedlist> + <listitem> + <para> + The picture in the upper left corner is your "dude" icon. + </para> + </listitem> + + <listitem> + <para> + In the left and right columns of the menu, the plugins are displayed. + Click on a plugin section, to display it's content in the middle column. + If you click on the plugin's name you can contract its sections. + </para> + </listitem> + + <listitem> + <para> + In the middle column of the menu, the menu items of the selected plugin section are displayed. + Usually the menu items are grouped. + If you click on a group it will contract. + There is an <link linkend="kbfx_layout">option</link> in the KBFX Configurator to start all these groups contracted. + </para> + <para> + You CAN drag and drop items FROM this part of the menu to your desktop, konqueror etc. + </para> + <para> + You CAN NOT drag and drop items TO this part of the menu. + </para> + </listitem> + + <listitem> + <para> + The arrows above and below the middle column are used to scroll up and down in the middle column. + </para> + </listitem> + + <listitem> + <para> + In the upper right corner, you find a search field, which can help you finding a menu item. + It is "search as you tipe" field. + If you want to clear the search (or the search term) double click on the search icon in the field. + If you type a command in the search field and press "Enter", the command will be started as if it has been typed in the "Run command..." dialog of K-menu. + </para> + </listitem> + + <listitem> + <para> + In the lower right corner, you find two buttons, one to log out and one to lock the desktop. + </para> + </listitem> + </orderedlist> + </para> + </sect1> + + <sect1 id="howto-configure"> + <title>How to configure KBFX</title> + + <para> + Here you can find how to use the KBFX Configurator. + </para> + + <para> </para> + + <sect2> + <title><anchor id="kbfx_themes" />Choose the KBFX Theme</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Themes Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-themes.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Themes Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + <variablelist> + <varlistentry> + <term>Select default folder</term> + <listitem> + <para> + Here you can select the folder in which you keep all your themes. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_button" />Skin the KBFX Button</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Start Button Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-startbutton.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Start Button Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can skin the button. There are three fields to fill. + The first field is the field for the path to the picture for the default button state (Normal). + The second field is for the picture of the button in pressed state (Pressed). + The third field is for the picture of the button in hovered state (Hover). + You can drag and drop images on the "Preview" place or on the file selector field of each button. + The selected design can be seen in the preview area. Press the "Apply" button to apply the selected look. + </para> + + <tip> + <para> + You can skin the KBFX Start Button by selecting three images (Normal, Pressed and Hover) in any file manager, drag and drop them on the KBFX Start Button. In order this to work the images have to have in their name the respective state of the button, i.e. "pressed", "hover" or "normal". Here is an example of valid file names for the button: my_hover_dButton.png, my_pressed_dButton.png, my_normal_dButton.png . + </para> + </tip> + + <variablelist> + <varlistentry> + <term>Button Fade Transition Effect</term> + <listitem> + <para> + This allows you to turn ON or OFF the fade effect for the KBFX button. This effect makes transitions between the three images (normal, hover, pressed) animated. Here you can set the time for the fade effect in msec. This time should be greater than 20 msec and less than 1000 msec. If set to 0 the effect will be disabled. + </para> + </listitem> + </varlistentry> + </variablelist> + + <para> </para> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_fonts" />Set the Fonts of the KBFX Theme</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Fonts Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-fonts.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Fonts Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can configure all the fonts (colors, points, style etc.) for the current theme. + </para> + + <para> + <variablelist> + <varlistentry> + <term>EXPORT KBFXFONTRC FILE</term> + <listitem> + <para> + Use this button to export your font settings in order to share it with other KBFX users or if you want to create a theme by yourself (how to create your own themes you can find out in <link linkend="howto-themes">this chapter</link>). + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <important> + <para> + In the font settings for the tooltip only "Font Name" and "Font Color" are used. + The other settings like "Font Style" and "Font size" are not used. + This may change in future versions. + </para> + </important> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_layout" />Set the Layout of the KBFX Theme</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Layout Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-layout.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Layout Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can configure all the layout options for the current theme. + </para> + + <para> + <variablelist> + <varlistentry> + <term>Make it 2/3 Panels buttons</term> + <listitem> + <para> + Use these buttons to force KBFX to auto-configure the current theme to the listed layouts. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>EXPORT KBFXLAYOUTRC FILE</term> + <listitem> + <para> + Use this button to export your layout settings in order to share it with other KBFX users or if you want to create a theme by yourself (how to create your own themes you can find out in <link linkend="howto-themes">this chapter</link>). + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_plugins" />Set the KBFX Plugins</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Plugins Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-plugins.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Plugins Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can configure the plugins KBFX will use and where to place them - on the left or on the right column of the KBFX Menu. + </para> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_tooltip" />Set the Tooltip of the KBFX Button</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Tooltip Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-tooltip.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Tooltip Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can select if the tooltip is on or off and if the tooltip animation is on or off. + In the field for the Tooltip text, you can change the tooltip text that will appear in the Tooltip balloon. + </para> + + <para> + The other options are self explanatory and have tooltips that can help you use them. + </para> + + <para> </para> + </sect2> + + <sect2> + <title><anchor id="kbfx_style" />Set the Style of the KBFX Menu</title> + + <screenshot> + <screeninfo>Here's a screenshot of the Menu Style Section of the KBFX Configurator</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-style.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of the Menu Style Section of the KBFX Configurator</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + Here you can select, whether you want to work with the KBFX SPINX or the KDE MENU. + You just have to select the according option and press the "Apply" button. + </para> + </sect2> + </sect1> +</chapter> + +<chapter id="faq"> + <title>Questions and Answers</title> + + <qandaset id="faqlist"> + <qandaentry> + <question> + <para> + I have a question that is not covered by this documentation. Where I can get an answer? + </para> + </question> + + <answer> + <para> + You can search the <ulink url="http://www.kbfx.org/forum">KBFX Forum</ulink> for an answer OR you can ask your question in the forum. + </para> + </answer> + </qandaentry> + + <qandaentry> + <question> + <para> + How can I contact you live? + </para> + </question> + + <answer> + <para> + Come to the #kbfx channel on irc.freenode.org + </para> + </answer> + </qandaentry> + </qandaset> +</chapter> + + +<chapter id="kbfx_about"> + <title>Authors, Credits and License</title> + + <para> + &kbfxconfigapp; + </para> + + <para> </para> + + <para> + Program Copyright (c) 2007 <link linkend="kbfx_team">KBFX Team</link>. + </para> + + <para> </para> + + <para> + <anchor id="kbfx_team" />KBFX Team Managers: + <itemizedlist> + <listitem> + <para> + Siraj Razick <email>siraj@kdemail.net</email> + </para> + </listitem> + + <listitem> + <para> + PhobosK <email>phobosk@kdemail.net</email> + </para> + </listitem> + + <listitem> + <para> + Mensur Zahirovic <email>nookie@mail.kbfx.org</email> + </para> + </listitem> + + + <listitem> + <para> + Nathanael Gogniat <email>nathanael@mail.kbfx.org</email> + </para> + </listitem> + </itemizedlist> + </para> + + <para> </para> + + <para> + Translations: + <itemizedlist> + <listitem> + <para> + Ferenc Stelcz <email>ferenc@stelcz.hu</email> - Hungary (HU) + </para> + </listitem> + + <listitem> + <para> + Divilinux <email>divilinux@mail.kbfx.org</email> - Italy (IT) + </para> + </listitem> + + <listitem> + <para> + Lexus <email>lexus@mail.kbfx.org</email> - Bulgaria (BG) + </para> + </listitem> + + <listitem> + <para> + PhobosK <email>phobosk@kdemail.net</email> - Bulgaria (BG) + </para> + </listitem> + + <listitem> + <para> + Monkey 9 <email>monkey9@iae.nl</email> - Netherlands (NL) + </para> + </listitem> + </itemizedlist> + </para> + + <para> </para> + + <para> + Contributors and Credits: + <itemizedlist> + <listitem> + <para> + Darwin M. Bautista <email>djclue917@gmail.com</email> - 001.patch + </para> + </listitem> + + <listitem> + <para> + Revaline C. Regendra <email>regendra_mail7@yahoo.com</email> - + Author of the Launch button in the default "KBFX Silk TTP" theme. + </para> + + <para> + Copyright (c) 2006 Revaline^Studio + + <ulink url="http://www.kde-look.org/content/show.php?content=36399"> + Revaline's Launch Menu v4.0 + </ulink> + </para> + </listitem> + + <listitem> + <para> + Petri Damstén <email>damu@iki.fi</email> - Author of the KMFFontChooser class. + <ulink url="http://www.iki.fi/damu/software/kmediafactory/">KMediaFactory</ulink> + </para> + </listitem> + </itemizedlist> + </para> + + <para> </para> + + <para> + Documentation Copyright (c) 2007 PhobosK <email>phobosk@mail.kbfx.org</email> + </para> + + <para> </para> + + <!-- TRANS:CREDIT_FOR_TRANSLATORS --> + + &underFDL; <!-- FDL: do not remove --> + + <para> </para> + + &underGPL; <!-- GPL License --> +</chapter> + +<appendix id="installation"> + <title>Installation</title> + + <sect1 id="getting-kbfxconfigapp"> + <title>How to obtain KBFX</title> + + <para> + KBFX can be downloaded from <ulink url="http://sourceforge.net/project/showfiles.php?group_id=141258">SourceForge project pages</ulink>. + </para> + + <para> + Sometimes development versions are uploaded in a <ulink url="http://kbfx.sourceforge.net/testing/">separate space on SourceForge</ulink>. + </para> + + <para> + The SVN address of the KBFX project is on the <ulink url="svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma">KDE SVN servers</ulink>. + </para> + </sect1> + + <sect1 id="requirements"> + <title>Requirements</title> + + <para> + In order to successfully compile and use KBFX, you need at least &kde; 3.4.X and also you need: + </para> + + <itemizedlist> + <listitem> + <para> + <ulink url="http://www.cmake.org">Cmake</ulink> - min. version 2.4.2 + </para> + </listitem> + + <listitem> + <para> + KDE3 and Qt3 sources - header files/devel packages + </para> + </listitem> + + <listitem> + <para> + <ulink url="http://strigi.sf.net">Strigi</ulink> -this package is OPTIONAL and is used for files inline search + </para> + </listitem> + </itemizedlist> + + <para> </para> + + <para> + You can find the most recent KBFX's list of changes at <ulink url="http://websvn.kde.org/trunk/playground/base/kbfx_plasma/doc/ChangeLog?view=markup">KDE SVN</ulink>. + </para> + </sect1> + + <sect1 id="compilation"> + <title>Compilation and Installation</title> + + <procedure> + <step> + <para> + Unpack the sources of KBFX with (x.y.z-XXXXXXXX represents the version of + the KBFX package, for example 0.4.9.3-20070117): + </para> + <screen> +> tar xjvf kbfx-x.y.z-XXXXXXXX.tar.bz2 + </screen> + </step> + + <step> + <para> + Change into the new directory: + </para> + + <screen> +> cd kbfx-x.y.z-XXXXXXXX/ + </screen> + </step> + + <step> + <para> + Start the configuration and the compilation using the command: + </para> + + <screen> +> ./build.sh + </screen> + </step> + </procedure> + + <para> </para> + + <note> + <title>Note for Mandriva < 2007 users:</title> + + <para> + The build script (by default) enables the use of <command>menudrake</command> + instead of <command>kmenuedit</command>. + If you want to prevent this behavior then pass ONE of these options to the build script: <command>--menudrake-off</command> OR <command>-m</command> + </para> + </note> + + <para> </para> + + <note> + <title>Other building options:</title> + + <itemizedlist> + <listitem> + <para> + <command>--prefix</command> OR <command>-p</command> to install KBFX in a different than the default folder (default is KDE install folder) for example: + <screen> +> ./build.sh -p /home/user + </screen> + </para> + </listitem> + + <listitem> + <para> + <command>--strigi</command> OR <command>-s</command> to enable Strigi support in KBFX (default is no Strigi support) + </para> + </listitem> + + <listitem> + <para> + <command>--kde4</command> OR <command>-k</command> to build KBFX for KDE4 (default is for KDE3) + </para> + </listitem> + + <listitem> + <para> + <command>--verbose</command> OR <command>-v</command> to make the build script give more verbose information + </para> + </listitem> + + <listitem> + <para> + <command>--nocheck</command> OR <command>-n</command> to make the build script not to check if an old KBFX version is installed (default is to check) + </para> + </listitem> + </itemizedlist> + </note> + </sect1> + + <sect1 id="checkinstall"> + <title>Using <command>checkinstall</command></title> + + <para> + <command>checkinstall</command> is an application used to build distribution specific packages from sources. + </para> + + <para> + <command>checkinstall</command> DOES NOT work with cmake correctly up to this moment. :( + </para> + + <para> + It can be used with additional commands in order to "work properly". + Here is the procedure to follow as user (NOT as ROOT) in order to obtain + the necessary distribution package. + </para> + + <note> + <itemizedlist> + <listitem> + <para> + x.y.z-XXXXXXXX represents the version of the KBFX package, in this example it is: 0.4.9.3-20070117 + </para> + </listitem> + + <listitem> + <para> + In the example here the version string is replaced only in the checkinstall command but you have to do that everywhere the "x.y.z-XXXXXXXX" string is met. + </para> + </listitem> + </itemizedlist> + <para> + </para> + </note> + + <screen> +> cd /tmp +> tar xjvf kbfx-x.y.z-XXXXXXXX.tar.bz2 +> cd kbfx-x.y.z-XXXXXXXX/ +> mkdir -p build/package +> cd build +> export DESTDIR=/tmp/kbfx-x.y.z-XXXXXXXX/build/package +> cmake ../ -DCMAKE_INSTALL_PREFIX=`kde-config --prefix` +> make install DESTDIR=/tmp/kbfx-x.y.z-XXXXXXXX/build/package +> find package/|sed s#^package/#./# > installed_files.txt +> cd package/ +> su +> checkinstall -nodoc --pkgname="kbfx" --pkgversion="0.4.9.3" \ +--pkgrelease="20070117" --exclude="/" --include=../installed_files.txt \ +--pakdir=/tmp/kbfx-0.4.9.3-20070117 sleep 1 + </screen> + + <para> + When ready, "checkinstall" will show you the folder where the prepared package is, like in this Mandriva Example: + </para> + + <screen> +********************************************************************** + +Done. The new package has been saved to + +/tmp/kbfx-0.4.9.3-20070117/kbfx-0.4.9.3-20070117.i386.rpm +You can install it in your system anytime using: + +rpm -i kbfx-0.4.9.3-20070117.i386.rpm + +********************************************************************** + </screen> + + <para> + Of course the best way to make RPM packages is to use the "kbfx.spec" file provided in the KBFX sources like described bellow. + </para> + </sect1> + + <sect1 id="rpmbuilding"> + <title>RPM Building Instructions (Mandriva, Fedora, Suse)</title> + + <para> + If you prefer manipulate a RPM, you can build it with the following commands: + </para> + + <procedure> + <step> + <para> + <anchor id="rpm_1" />Build the RPM: + </para> + + <screen> +> rpmbuild -tb kbfx-x.y.z-XXXXXXXX.tar.bz2 + </screen> + + <para>or (for Mandriva)</para> + + <screen> +> rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-mdv20070.src.rpm + </screen> + + <para>or (for Fedora)</para> + + <screen> +> rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-FCx.src.rpm + </screen> + + <para>or (for SuSe)</para> + + <screen> +> rpmbuild --rebuild kbfx-x.y.z-XXXXXXXX-suseXXX.src.rpm + </screen> + </step> + + <step> + <para> + <anchor id="rpm_2" />If succeed, you will found the rpm in /usr/src/rpm/RPMS (for Mandriva) or /usr/src/redhat/RPMS (for Fedora) or /usr/src/packages/RPMS (for Suse) according to the platform you have. + </para> + </step> + + <step> + <para> + <anchor id="rpm_3" />Install the rpm as usually by: + </para> + + <screen> +> rpm -Uvh kbfx-x.y.z-XXXXXXXX.rpm + </screen> + </step> + </procedure> + + <para> </para> + + <note> + <title>Building RPM from KBFX SVN versions:</title> + + <itemizedlist> + <listitem> + <para> + Follow these commands in the sources directory: + </para> + <screen> +> ./build.sh + </screen> + + <para> + Answer "N" to the question if you want to install KBFX. + </para> + + <screen> +> cd build +> make dist + </screen> + </listitem> + + <listitem> + <para> + A file "kbfx-x.y.z-XXXXXXXX.tar.bz2" will be created in the build directory. + </para> + </listitem> + + <listitem> + <para> + Proceed with the steps described in <link linkend="rpm_1">1.</link>, <link linkend="rpm_2">2.</link>, <link linkend="rpm_3">3</link>. + </para> + </listitem> + </itemizedlist> + </note> + </sect1> + + <sect1 id="gentoo"> + <title>Gentoo users</title> + + <para> + In order to use the strigi engine in KBFX you have to do these steps: + </para> + + <procedure> + <step> + <para> + Copy the "strigi-X.X.X.ebuild" and the "kbfx-0.4.9.X.ebuild" (from the sources directory) to your local portage tree as needed OR use the "kbfx-0.4.9.X-portage-overlay.tar.bz2" + </para> + </step> + + <step> + <para> + Set the flag "strigi" for the kbfx ebuild + </para> + </step> + + <step> + <para> + Emerge "clucene" + </para> + </step> + + <step> + <para> + Emerge "kbfx" + </para> + </step> + </procedure> + + <para> </para> + + <para> + There is a Layman overlay resource on the SourceForge SVN. + You can add it by this command: + </para> + + <screen> +> layman -f -o https://kbfx.svn.sourceforge.net/svnroot/kbfx/layman/kbfx-overlay.xml \ + -a kbfx + </screen> + + <para> + After you add the "kbfx" overlay you can use it as usual. + </para> + + </sect1> + + <sect1 id="svn"> + <title>SVN version</title> + + <para> + To download the latest development source, you need to go to <ulink url="svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma">KDE SVN</ulink> and download it from there. The current SVN address of the repository is: <ulink url="svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma">svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma</ulink> + </para> + + <para> + Here are the instructions on how to get a copy of the SVN Repository: + </para> + + <procedure> + <step> + <para> + Install your distribution's package named "subversion" OR download and install it from <ulink url="http://subversion.tigris.org">subversion's homepage</ulink> + </para> + </step> + + <step> + <para> + Create a folder where you will compile/install KBFX and enter in it. For example do this: + </para> + + <screen> +> mkdir -p ~/usr/src/svn +> cd ~/usr/src/svn + </screen> + </step> + + <step> + <para> + Checkout the SVN version of KBFX in this way and proceed as follows: + </para> + + <screen> +> svn co svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma +> cd kbfx_plasma + </screen> + </step> + + <step> + <para> + Proceed with the compilation/installation of KBFX: + </para> + + <screen> +> ./build.sh + </screen> + </step> + + <step> + <para> + If you want always to have the latest version of KBFX you may leave the folder "~/usr/src/svn/kbfx_plasma" intact for future use. + When you want to update the source files of KBFX you just need to do <command>svn up</command> in this folder, delete the folder "~/usr/src/svn/kbfx_plasma/build" and start the <command>./build.sh</command> script i.e: + </para> + + <screen> +> cd ~/usr/src/svn/kbfx_plasma +> svn up +> rm -fR build +> ./build.sh + </screen> + </step> + </procedure> + </sect1> +</appendix> + +<appendix id="kbfx-howto"> + <title>How To</title> + + + <sect1 id="kbfx-howto-themes"> + <title><anchor id="howto-themes" />How to create themes for KBFX</title> + + <para> + So you want to create your own themes for KBFX 0.4.9.3? + </para> + + <para> + The guide is done in a simple manner and we hope that you will easily and + simply create themes for KBFX 0.4.9.3. If you don't like something in this + guide, please feel free to contact us at IRC on irc.freenode.org + on channel #kbfx + </para> + + <important> + <itemizedlist> + <listitem> + <para> + The values for Width and Height are only our suggested values. + You can use whatever values you feel are appropriate for your theme. + </para> + </listitem> + + <listitem> + <para> + If ANY of these images are missing KBFX will use the image with the + same name from the "default" theme. + </para> + </listitem> + + <listitem> + <para> + In order to be used by the Configurator and by KBFX, every theme for + 0.4.9.3 MUST HAVE a file in it's folder named "version-2" ! + </para> + </listitem> + </itemizedlist> + </important> + + <para> </para> + + <sect2 id="kbfx-howto-images"> + <title>Images in KBFX</title> + + <screenshot> + <screeninfo>Here's a screenshot of all the images used in KBFX Menu</screeninfo> + + <mediaobject> + <imageobject> + <imagedata fileref="../common/kbfx-maindescription.jpg" format="JPG"/> + </imageobject> + + <textobject> + <phrase>Screenshot of all the images used in KBFX Menu</phrase> + </textobject> + </mediaobject> + </screenshot> + + <para> + This image is showing you all the images which are used in KBFX 0.4.9.3. + The most simple way to create a theme at this point is to take some of the images from the "default" theme and just change colors on some and see how that effects your menu. + </para> + + <important> + <para> + DO NOT EVER CHANGE ANY IMAGE IN THE DEFAULT FOLDER! + </para> + + <para> + The images there are used as fallback when there is a missing image in your own theme. + We suggest rather to work with a copy folder of the default theme (the name of the folder containing your theme of course should be not "default" ;) ). + </para> + </important> + + <para> </para> + + <variablelist> + <varlistentry> + <term>topbg.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="topbg.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>topbg.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is an image that is at the top of the menu. + </para> + + <para> + Width = 504px and Height = 95px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>dudebox.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="dudebox.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>dudebox.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the background image where your personal image is displayed. + </para> + + <para> + Width = 95px and Height = 88px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>menu_top_image_person.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="menu_top_image_person.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>menu_top_image_person.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This image is used for theme's default personal image. + </para> + + <para> + Width = 48px and Height = 48px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>find.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="find.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>find.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is a small image displayed in the search field. + </para> + + <para> + Width = 22px and Height = 21px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><anchor id="rhstile" />rhstile.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="rhstile.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>rhstile.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is normal image displayed in categories. + </para> + + <para> + Width = 132px and Height = 23px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>rhshovertile.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="rhshovertile.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>rhshovertile.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is a hover image for categories. Used as hover image for <link linkend="rhstile">rhstile.png</link> + </para> + + <para> + Width = 132px and Height = 23px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>scrollnormal.png / scrollnormalbot.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="scrollnormal.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>scrollnormal.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + These images are used as top and bottom scrollbars. + </para> + + <para> + Width = 240px and Height = 10px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>separator.png / indexseparator.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="separator.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>separator.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + These are the separator images which separate your different subcategories. + </para> + + <para> + Width = 240px and Height = 27px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>tilenormal.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="tilenormal.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>tilenormal.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the normal image where your applications are showed. + </para> + + <para> + Width = 240px and Height = 46px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>tilehover.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="tilehover.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>tilehover.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the hover image where your applications are showed. + </para> + + <para> + Width = 240px and Height = 46px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>listboxbg.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="listboxbg.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>listboxbg.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the background under the categories. + It can be viewed on description on both sides of the menu. + </para> + + <para> + Width = 108px and Height = 23px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>middleboxbg.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="middleboxbg.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>middleboxbg.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the background of the middle part of the menu. + </para> + + <para> + Width = 200px and Height = 270px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>botbg.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="botbg.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>botbg.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the background image at the bottom of the menu. + </para> + + <para> + Width = 504px and Height = 38px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>lock.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="lock.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>lock.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the lock image. + </para> + + <para> + Width = 84px and Height = 38px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>lockhover.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="lockhover.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>lockhover.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the lock hover image. + </para> + + <para> + Width = 84px and Height = 38px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>logout.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="logout.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>logout.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the logout image. + </para> + + <para> + Width = 84px and Height = 38px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>logouthover.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="logouthover.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>logouthover.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is the logout hover image. + </para> + + <para> + Width = 84px and Height = 38px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>mask.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="mask.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>mask.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is deciding what size your menu will have when users install it and which will be the transparent parts of the menu (through the alpha mask of the png image). + Of course the size can be controlled later by the configuration of KBFX. + </para> + + <para> + Width = 504px and Height = 513px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>logo.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="logo.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>logo.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This is used as a theme's or author's logo shown in the Information box of the KBFX Configurator. + You can put whatever image you want and it will be scaled to 100px width by 100px height. + </para> + + <para> + Width = 100px and Height = 100px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>preview.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="preview.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>preview.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + This should be a snapshot of the working KBFX theme. + It is used in the configuration application in order the user to see what the theme will look like. + </para> + + <para> + Width = 170px and Height = 205px + </para> + + <para> </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>normal.png / hover.png / pressed.png</term> + + <listitem> + <para> + <inlinemediaobject> + <imageobject> + <imagedata fileref="normal.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>normal.png</phrase> + </textobject> + </inlinemediaobject> + <inlinemediaobject> + <imageobject> + <imagedata fileref="hover.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>hover.png</phrase> + </textobject> + </inlinemediaobject> + <inlinemediaobject> + <imageobject> + <imagedata fileref="pressed.png" format="PNG" /> + </imageobject> + <textobject> + <phrase>pressed.png</phrase> + </textobject> + </inlinemediaobject> + </para> + + <para> + These are the KBFX Buttons for the kicker panel that are used in the theme. + Width and Height - as you like, but preferably Height not to be too much. + </para> + + <para> </para> + </listitem> + </varlistentry> + </variablelist> + + <para> + More information can be found on our homepage <ulink url="http://www.kbfx.org/staticpages/index.php?page=howto0493">here</ulink> + </para> + + <para> </para> + </sect2> + + <sect2 id="kbfx-howto-rcfiles"> + <title>"kbfxfontrc" and "kbfxlayoutrc" files</title> + + <para> + Every theme MAY have two configuration files named: + </para> + + <itemizedlist> + <listitem> + <para> + <link linkend="kbfx-kbfxfontrc">kbfxfontrc</link> - configures the fonts properties that the theme uses. + </para> + </listitem> + + <listitem> + <para> + <link linkend="kbfx-kbfxlayoutrc">kbfxlayoutrc</link> - configures the layout of the theme, the KBFX button and some other properties of the theme. + </para> + </listitem> + </itemizedlist> + + + <para> + If one or both of these files don't exist, KBFX internal configuration + options will be used for fonts and layout. + All the properties and values are separated between different Sections + in the way showed below: + </para> + + <literallayout> + [Section] + property = value + </literallayout> + + <para> + When you want to prepare a theme, have in mind that every change that you make in the "KBFX Configurator" is kept in files in your home KDE directory. + </para> + + <para> + Usually these files are in the folder <emphasis>~/.kde/share/apps/kbfx/themerc</emphasis> + and are named: + </para> + + <itemizedlist> + <listitem> + <para> + THEMENAME_layoutrc + </para> + </listitem> + + <listitem> + <para> + THEMENAME_fontrc + </para> + </listitem> + </itemizedlist> + + + <para> + So if you want to ship your theme settings from the "KBFX Configurator", the best + thing to do is to use the buttons: + "EXPORT KBFXFONTRC FILE" (<link linkend="kbfx_fonts">"Fonts" section of the Configurator</link>) + and + "EXPORT KBFXLAYOUTRC FILE" (<link linkend="kbfx_layout">"Layout section" of the Configurator</link>) + and put the exported files in your theme folder. + </para> + + <important> + <itemizedlist> + <listitem> + <para> + Pay close attention to the case of the properties and Sections names + because the configuration is CASE SENSITIVE! + </para> + </listitem> + + <listitem> + <para> + The order of the sections in the file is not important! + </para> + </listitem> + + <listitem> + <para> + Have in mind that the Layout of the theme also depends on the sizes of the images! + </para> + </listitem> + </itemizedlist> + </important> + + <para> </para> + + <sect3 id="kbfx-kbfxfontrc"> + <title>File kbfxfontrc</title> + + <important> + <itemizedlist> + <listitem> + <para> + It's best the colors to be represented in RGB format. + </para> + </listitem> + + <listitem> + <para> + Font Properties should constrain to QFont class representation. + </para> + </listitem> + + <listitem> + <para> + The values bellow are the default ones. + </para> + </listitem> + </itemizedlist> + </important> + + <literallayout> + [Fonts] + TooltipText=0,0,0 + TooltipTextFont=Arial,8,-1,5,50,0,0,0,0,0 + ApplicationText=0,0,0 + ApplicationTextFont=Arial,8,-1,5,50,0,0,0,0,0 + CommentText=128,125,0 + CommentTextFont=Arial,8,-1,5,50,0,0,0,0,0 + GroupText=0,0,0 + GroupTextFont=Arial,8,-1,5,50,0,0,0,0,0 + UserName=255,255,255 + UserNameFont=Arial,10,-1,5,75,0,0,0,0,0 + SeparatorColor=0,0,0 + SeparatorFont=Arial,8,-1,5,50,0,0,0,0,0 + PluginColor=0,0,0 + PluginFont=Arial,8,-1,5,50,0,0,0,0,0 + LineColor=255,220,125 + # This is if the font when you hover on an item will be bold + HoverBold = false + </literallayout> + + <para> </para> + </sect3> + + <sect3 id="kbfx-kbfxlayoutrc"> + <title>File kbfxlayoutrc</title> + + <important> + <itemizedlist> + <listitem> + <para> + The values bellow are the default ones. + </para> + </listitem> + </itemizedlist> + </important> + + <literallayout> + [KbfxButton] + # Time in msec for which the button + # to fade in/out + FadeTime=75 + # The three properties below describe the + # paths to the theme's buttons. + # KBFX uses the normal.png/hover.png/pressed.png + # that are in the theme's folder by default. + # So we recommend NOT to use the below three + # properties! + Normal = KBFX Normal Button Full Path + Hover = KBFX Hover Button Full Path + Press = KBFX Pressed Button Full Path + + [TopBar] + # Face Position X + DudeX=-1 + # Face Position Y + DudeY=-1 + # Face Box Height + FaceH=64 + # Face Box Width + FaceW=65 + # Face Box Position X + FaceX=27 + # Face Box Position Y + FaceY=8 + # User Name Position X + UserNameX=130 + # User Name Position Y + UserNameY=32 + # Hide User Name + DisableUserName=false + # Top Bar Height + Height=95 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Top Bar Width + Width=504 + # Top Bar Position X + X=0 + # Top Bar Position Y + Y=0 + + [BottomBar] + # Bottom Bar Height + Height=38 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Bottom Bar Width + Width=504 + # Bottom Bar Position X + X=0 + # Bottom Bar Position Y + Y=428 + + [Scrollbars] + # THIS SECTION IS NOT USED FOR NOW + # Bottom Scroll Bar Position X + ScrollBarBotX=108 + # Bottom Scroll Bar Position Y + ScrollBarBotY=95 + # Top Scroll Bar Position X + ScrollBarTopX=108 + # Top Scroll Bar Position Y + ScrollBarTopY=95 + + [ListBox] + # List Box Position X + X=0 + # List Box Position Y + Y=95 + # List Box Width + Width=132 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # List Box Height + Height=275 + + [SearchBox] + # Search Box Height + Height=22 + # Search Box Width + Width=240 + # Search Box Position X + X=130 + # Search Box Position Y + Y=48 + + [ItemView] + # Item Position X + X=132 + # Item Position Y + Y=95 + # Item Width + Width=240 + # THE PROPERTIES BELOW ARE NOT USED FOR NOW + # Item Height + Height=275 + + [ItemProperties] + # Comment Margin in Item + CommentMargin=66 + # Icon Size in Item + IconSize=32 + # No Comments in Item + NoComments=false + + [ToolBar] + # THIS SECTION IS NOT USED FOR NOW + # Tool Bar Button Normal Size + ButtonNormalSize=48 + # Tool Bar Button Pressed Size + ButtonPressedSize=48 + + [MainMenu] + # Main Menu Height + UserMenuHeight=513 + # Main Menu Width + UserMenuWidth=504 + # Contracted Menues + ContractedMenu=false + + </literallayout> + + <para> </para> + </sect3> + + </sect2> + + <sect2 id="kbfx-howto-versionfile"> + <title>"version-2" file</title> + + <important> + <itemizedlist> + <listitem> + <para> + This file is OBLIGATORY to exist, though it can be empty. + It is used to designate that the theme is in the new format and the properties that are in the file are used in the KBFX Configurator for showing the user some info about the theme. + </para> + </listitem> + + <listitem> + <para> + The values in this file cannot be overwritten by the KBFX Configurator. + </para> + </listitem> + + <listitem> + <para> + If existing, the file should contain information about the theme's version, author's name, author's email and a homepage for the theme. + </para> + </listitem> + + <listitem> + <para> + The unspecified fields are replaced with the string - "Not Specified". + </para> + </listitem> + + <listitem> + <para> + The values bellow are self explanatory and are just an example. + </para> + </listitem> + </itemizedlist> + </important> + + <literallayout> + [ThemeGeneral] + ThemeVersion=0.51 + AuthorName=Nookie + AuthorEmail=nookie@no_spam.org + Homepage=http://www.kbfx.org + </literallayout> + + <para> </para> + + <para> + Now we wish you all good luck when creating themes. + We are looking forward to all your good looking themes out there for the KBFX! + </para> + + <para> </para> + </sect2> + </sect1> + + <sect1 id="kbfx-howto-kbfxthemefile"> + <title>How to create a ".kbfxtheme" file</title> + + <para> + The ".kbfxtheme" file is a simple archive file (.tar.gz or .tar.bz2) that should contain at least these elements: + </para> + + <itemizedlist> + <listitem> + <para> + One or more theme folders with all the necessary images/files inside. + Have in mind that the name of the theme is the name of the folder. + </para> + </listitem> + + <listitem> + <para> + In the theme(s) folder(s) there should be an image named "preview.png" that serves as a live preview of the look of the theme. + </para> + </listitem> + + <listitem> + <para> + In the theme(s) folder(s) there should be a file named "version-2" + </para> + </listitem> + + <listitem> + <para> + The extension of the archive should be ".kbfxtheme" + </para> + </listitem> + </itemizedlist> + + <para> + You can create ".kbfxtheme" file following these instructions (there is an option in Konqueror's rightclick "Actions" menu for preparing KBFX Theme Package OR you can create the ".kbfxtheme" file manually as described bellow): + </para> + + <procedure> + <step> + <para> + Create a folder with a name that is identical to the name you want for your theme. + </para> + </step> + + <step> + <para> + Put the necessary images/files inside it (see the above instructions for the images part). + </para> + </step> + + <step> + <para> + Create an archive of the folder (with ark/tar etc). + </para> + </step> + + <step> + <para> + Rename the archive file to ".kbfxtheme" and you are ready. + </para> + </step> + </procedure> + </sect1> + + <sect1 id="kbfx-howto-helpus"> + <title>How to help us out for KBFX</title> + + <para> + You can help us for the KBFX releases with the translation of the interface. + For this purpose please download the <ulink url="http://prdownloads.sourceforge.net/kbfx/kbfxconfigapp.pot?download">kbfxconfigapp.pot</ulink> file from SourceForge and use <ulink url="http://kbabel.kde.org/">KBabel</ulink> or <ulink url="http://www.poedit.org/">poEdit</ulink> to make the translation. + </para> + + <para> + Next send the .po file to my mail <email>phobosk@mail.kbfx.org</email>. + </para> + + <tip> + <para> + Another way to get a .pot file is to use the command: <command>make package-messages</command> just after the configuration of the compilation process is done. + </para> + </tip> + + <para> </para> + + <para> + Thanks in advance for this help. + </para> + </sect1> +</appendix> + +<appendix id="kbfx-links"> + <title>Useful links</title> + + <para> + <ulink url="http://www.kbfx.org">KBFX Homepage</ulink> + </para> + + <para> + <ulink url="http://sourceforge.net/projects/kbfx">KBFX SourceForge project page</ulink> + </para> + + <para> + <ulink url="http://sourceforge.net/project/showfiles.php?group_id=141258">KBFX Releases</ulink> + </para> + + <para> + <ulink url="http://www.kbfx.org/forum/">KBFX Forum</ulink> + </para> + + <para> + <ulink url="http://bugs.kbfx.org">KBFX Bugs</ulink> + </para> +</appendix> +&documentation.index; +</book> + +<!-- +Local Variables: +mode: sgml +sgml-minimize-attributes:nil +sgml-general-insert-case:lower +sgml-indent-step:0 +sgml-indent-data:nil +End: + +vim:tabstop=2:shiftwidth=2:expandtab +--> + diff --git a/images/CMakeLists.txt b/images/CMakeLists.txt new file mode 100644 index 0000000..6482f38 --- /dev/null +++ b/images/CMakeLists.txt @@ -0,0 +1,5 @@ +IF (NOT USE_KDE4) + KDE3_INSTALL_ICONS(hicolor) +ELSE (NOT USE_KDE4) + KDE4_INSTALL_ICONS(hicolor) +ENDIF (NOT USE_KDE4) diff --git a/images/hi128-app-kbfx.png b/images/hi128-app-kbfx.png Binary files differnew file mode 100644 index 0000000..3986198 --- /dev/null +++ b/images/hi128-app-kbfx.png diff --git a/images/hi16-app-kbfxconfigapp.png b/images/hi16-app-kbfxconfigapp.png Binary files differnew file mode 100644 index 0000000..864d09c --- /dev/null +++ b/images/hi16-app-kbfxconfigapp.png diff --git a/images/hi32-app-kbfxconfigapp.png b/images/hi32-app-kbfxconfigapp.png Binary files differnew file mode 100644 index 0000000..7f71e8e --- /dev/null +++ b/images/hi32-app-kbfxconfigapp.png diff --git a/kbfx-0.4.9.3.1.ebuild b/kbfx-0.4.9.3.1.ebuild new file mode 100644 index 0000000..f8dbb73 --- /dev/null +++ b/kbfx-0.4.9.3.1.ebuild @@ -0,0 +1,31 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header + +inherit kde eutils +need-kde 3.3 + +MY_PN="${PN}-0.4.9.3.1" +S="${WORKDIR}/${MY_PN}" + +DESCRIPTION="KDE alternative K-Menu" +HOMEPAGE="http://www.kbfx.org/" +SRC_URI="mirror://sourceforge/${PN}/${MY_PN}.tar.bz2" + +SLOT="0" +LICENSE="GPL-2" +KEYWORDS="x86 ~ppc ~amd64" +IUSE="strigi" + +DEPEND=">=dev-util/cmake-2.4.2 + strigi? ( kde-misc/strigi )" + +export DESTDIR=${D} + +src_compile() { + cd ${S} + cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${KDEDIR} \ + -DUSE_STRIGI:BOOL=$( use strigi && echo ON || echo OFF ) \ + . || die +} diff --git a/kbfx-9999.ebuild b/kbfx-9999.ebuild new file mode 100644 index 0000000..6a8e498 --- /dev/null +++ b/kbfx-9999.ebuild @@ -0,0 +1,27 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header + +inherit kde eutils subversion +need-kde 3.3 + +DESCRIPTION="The SVN Version of the KDE alternative K-Menu KBFX" +HOMEPAGE="http://www.kbfx.org/" +ESVN_REPO_URI="svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma" + +SLOT="0" +LICENSE="GPL-2" +KEYWORDS="~x86 ~ppc ~amd64" +IUSE="strigi" + +DEPEND=">=dev-util/cmake-2.4.2 + strigi? ( kde-misc/strigi )" + +export DESTDIR=${D} + +src_compile() { + cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${KDEDIR} \ + -DUSE_STRIGI:BOOL=$( use strigi && echo ON || echo OFF ) \ + . || die +} diff --git a/kbfx-svn.ebuild.in b/kbfx-svn.ebuild.in new file mode 100644 index 0000000..6a8e498 --- /dev/null +++ b/kbfx-svn.ebuild.in @@ -0,0 +1,27 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header + +inherit kde eutils subversion +need-kde 3.3 + +DESCRIPTION="The SVN Version of the KDE alternative K-Menu KBFX" +HOMEPAGE="http://www.kbfx.org/" +ESVN_REPO_URI="svn://anonsvn.kde.org/home/kde/trunk/playground/base/kbfx_plasma" + +SLOT="0" +LICENSE="GPL-2" +KEYWORDS="~x86 ~ppc ~amd64" +IUSE="strigi" + +DEPEND=">=dev-util/cmake-2.4.2 + strigi? ( kde-misc/strigi )" + +export DESTDIR=${D} + +src_compile() { + cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${KDEDIR} \ + -DUSE_STRIGI:BOOL=$( use strigi && echo ON || echo OFF ) \ + . || die +} diff --git a/kbfx.ebuild.in b/kbfx.ebuild.in new file mode 100644 index 0000000..2eb54c3 --- /dev/null +++ b/kbfx.ebuild.in @@ -0,0 +1,31 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header + +inherit kde eutils +need-kde 3.3 + +MY_PN="${PN}-@VERSION@" +S="${WORKDIR}/${MY_PN}" + +DESCRIPTION="KDE alternative K-Menu" +HOMEPAGE="http://www.kbfx.org/" +SRC_URI="mirror://sourceforge/${PN}/${MY_PN}.tar.bz2" + +SLOT="0" +LICENSE="GPL-2" +KEYWORDS="@GENTOO_KEYWORDS@" +IUSE="strigi" + +DEPEND=">=dev-util/cmake-2.4.2 + strigi? ( kde-misc/strigi )" + +export DESTDIR=${D} + +src_compile() { + cd ${S} + cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${KDEDIR} \ + -DUSE_STRIGI:BOOL=$( use strigi && echo ON || echo OFF ) \ + . || die +} diff --git a/kbfx.spec b/kbfx.spec new file mode 100644 index 0000000..4916ec5 --- /dev/null +++ b/kbfx.spec @@ -0,0 +1,255 @@ +%define name kbfx +%define version 0.4.9.3.1 +%define kbfx_release 1 +%define is_stable 1 +%define debug_package %{nil} + +%define is_unknown %(test -e /etc/mandrake-release -o -e /etc/SuSE-release -o -e /etc/fedora-release -o -e /etc/pclinuxos-release && echo 0 || echo 1) +%define is_suse %(test -e /etc/SuSE-release && echo 1 || echo 0) +%define is_fedora %(test -e /etc/fedora-release && echo 1 || echo 0) +%define is_mandrake %(test -e /etc/mandrake-release && echo 1 || echo 0) +%define is_pclinuxos %(test -e /etc/pclinuxos-release && echo 1 || echo 0) + +%if %{is_suse} +%define prefix /opt/kde3 +Group: System/GUI/KDE +Release: %{kbfx_release}.suse%(echo "%{suse_version}" | %__sed -e 's/.$//') +Requires: kdelibs3 +BuildRequires: kdelibs3-devel kdebase3-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif + +%if %{is_fedora} +%define fedora_version %(rpm -q --queryformat '%{VERSION}' fedora-release) +%define fedora_vernum %(echo "%{fedora_version}" | tr -d '.') +%define prefix /usr +Group: System/GUI/KDE +Release: %{kbfx_release}.FC%{fedora_vernum} +Requires: kdebase +BuildRequires: kdebase-devel qt-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif + +%if %{is_mandrake} +%if %{is_pclinuxos} < 1 +%define prefix /usr +Group: Graphical desktop/KDE +Release: %{kbfx_release}.mdv%(echo "%{mdkversion}" | %__sed -e 's/.$//') +Requires: kdebase +BuildRequires: kdebase-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif +%endif + +%if %{is_pclinuxos} +%define prefix /usr +Group: Graphical desktop/KDE +Release: %{kbfx_release}.pclos%{product_version} +Requires: kdelibs +BuildRequires: cmake, automake, libtool +BuildRequires: kdelibs-devel +%endif + +%if %{is_unknown} +%define prefix %(kde-config --prefix) +Group: Graphical desktop/KDE +Release: %{kbfx_release} +BuildRequires: cmake, automake, libtool +%endif + + +Name: %{name} +Version: %{version} +License: GPL +URL: http://www.kbfx.org +Summary: An alternative to the classical K-Menu button and it's menu. +BuildRoot: %{_tmppath}/build-%{name}-%{version}-root +Packager: PhobosK <phobosk@mail.kbfx.org> +Vendor: KBFX TEAM +Provides: kbfx + +%if %{is_stable} < 1 +Source: %{name}-%{version}-%{kbfx_release}.tar.bz2 +%else +Source: %{name}-%{version}.tar.bz2 +%endif + +%description +KBFX is an alternative to the classical K-Menu button and it's menu. +It improves the user experience by enabling the user to set a bigger (and thus more visible) start button and by finally replacing the Win95-like K-Menu with the Spinx bar. +If you still want the old menu, because you're used to it, it is still available as an option in kbfx. + +Main features: + Spinx Bar has 6 Basic Functionalities. + 1.Selecting an Application Group + 2.Selecting an Application + 3.Type and locate an Application + 4.Logout of the Desktop + 5.Lock the Desktop + 6.Launch KBFX settings manager + 7.Scroll up and down the application list + +Extra features: + 1.Double buffered Widgets to minimize flicker. + 2.Animated scroll bars + 3.New Tooltip + 4.Gif/Mng File Support + 5.New Control Manager + +%prep + +%if %{is_stable} < 1 +%setup -n %{name}-%{version}-%{kbfx_release} +%else +%setup -n %{name}-%{version} +%endif + +rm -Rf build +mkdir build +cd build +export DESTDIR=${RPM_BUILD_ROOT} +cmake ../ -DCMAKE_INSTALL_PREFIX=%{prefix} + +%build +cd build + +%install +cd build +[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -Rf ${RPM_BUILD_ROOT}; +export DESTDIR=${RPM_BUILD_ROOT} +make install + +%if %{is_mandrake} +mkdir -p ${RPM_BUILD_ROOT}%{_menudir} +cat << EOF > ${RPM_BUILD_ROOT}%{_menudir}/%{name} +?package(%{name}): needs="kde" kde_filename="kbfxconfig" \ +section="System/Configuration/Other" title="KBFX Configurator" icon="kbfxconfigapp" \ +command="kbfxconfigapp" longtitle="KBFX Configuration Utility" \ +kde_opt="\\\\nEncoding=UTF-8\\\\nType=Application" +EOF +%endif + +%post +if [ -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi +/sbin/ldconfig + +%postun +if [ "$1" = "0" -a -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi +/sbin/ldconfig + + +%clean +[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -Rf ${RPM_BUILD_ROOT}; + +%files +%defattr(-, root, root) +%{prefix}/* + +%changelog + +* Wed May 16 2007 0.4.9.3.1 + - CHANGED layout and font configfile specs + - UPDATED help documentation + - ADDED fade transition effect on the KBFX Button + - ADDED install guides for using checkinstall + - ADDED Hungarian translation (thanks to Ferenc Stelcz for it) + - ADDED option to watch for KDE global changes like new installed applications + - ADDED option for Theme Info + - ADDED resizable configuration dialogs + - ADDED drag&drop hover, pressed and normal images over the KBFX button + - ADDED tooltip support for the KBFX button + - ADDED switch between KBFX and K Menu + - ADDED new two panel skin - "2panels" + - ADDED configurable middle background - middleboxbg.png + - ADDED fonts support in every part of the menu + - ADDED layout support in the KBFX Configurator + - ADDED support for the new versions of strigi + - ADDED support for use of strigi in Gentoo + - ADDED support for SVN version in Gentoo + - ADDED support for PCLinuxOS rpm build (thanks to @PaGal and @tom777 for the testing) + - ADDED support for future KDE4 (part 1) + - ADDED uninstall option for "build.sh" script + - FIXED cmake uninstall + - FIXED RPM .la issues + - FIXED some major bugs + - REMOVED Water effect (too much CPU time consuming and not a favorite one for our users) + +* Wed Jan 17 2007 0.4.9.3-20070117 + - Initial Release of the 0.4.9.3 Series - KBFX Silk (0.4.9.3) + - New Build system (cmake) + - Re-write of the data backend + - Re-write of the GUI + - Totally new theme + - Improved configuration dialog + +* Fri Nov 17 2006 0.4.9.2rc4 + - CHANGED some aspects of autoconf/automake behaviour + - CHANGED "Toolbar Resize" behaviour - turned off by default so kicker doesn't change its size anymore + - ADDED support for Mandriva 2007 compilation (no menudrake there by default) + - FIXED Searchbar behaviour (thanks @gropiuskalle) + - FIXED some minor bugs + +* Sun Nov 05 2006 0.4.9.2rc3 + - ADDED support for preparing .kbfxtheme files in konqueror (look the explanation in HOWTO file) + - ADDED "--prepare" commandline option to pack existing KBFX Skin Folders to .kbfxtheme files + - ADDED "Default Theme's Personal Image" to the "KBFX Configurator Application" + - ADDED "Toolbar Resize" option to the "KBFX Configurator Application" for the toolbar where the KBFX Button resides + - ADDED it, bg and nl translations + - FIXED some minor bugs + +* Mon Sep 19 2006 0.4.9.2rc2 + - CHANGED "KBFX Configurator Application" - rewritten from scratch and is no more part of "kcontrol" + - CHANGED "Tooltip Animation" behaviour - turned off by default + - ADDED new Default Theme + - ADDED fonts configuration option to the "KBFX Configurator Application" + - ADDED Install/Delete Themes to the "KBFX Configurator Application" + - ADDED support for .kbfxtheme files in konqueror (look the explanation in HOWTO file) + - ADDED possibility to change "dude" image to the "KBFX Configurator Application" + - ADDED Free-BSD Support + - FIXED font alignment problems + - FIXED long applications name problem + - FIXED some memory leaks + - FIXED some minor bugs + +* Sun Jun 18 2006 0.4.9.2-20060708cvs + - UPDATED make system + +* Sun Jun 11 2006 0.4.9.2-20060611cvs + - ADDED KNOWN_BUGS file in the project documents + - ADDED PC-BSD Support + - ADDED Drag and Drop Support + - FIXED a bug with showing icons in "Recently Used" items + - FIXED a bug with the placement of ".face.icon" (thanks @Nucc) + - Flicker Free KBFX Button + - Flicker Free KBFX SPINX Menu TOP + - Better scrolling + + +* Sun May 28 2006 0.4.9.2-20060528cvs + - ADDED suport for Fedora rpm + - ADDED an option to disable tooltip (see HOWTO file) + - FIXED a problem with building SUSE rpm + + +* Wed May 10 2006 0.4.9.2rc1 + - ADDED suport for SUSE rpm + - ADDED support for Buttons with Drop shadows + - ADDED Font settings as part of the Theme itself + - ADDED Grouping header for each application group and sub groups + - ADDED Kiosk mode support + - ADDED Handling of submenus + - FIXED a problem with make + - FIXED make system for all distributions + - Better support for Mandriva distribution + - More applications for the menu + + +* Sun Apr 16 2006 0.4.9.1-1 + Initial rpm release + - FIXED Kbfx configuration + - FIXED Slack 1.9 automake and compilation + - FIXED /tmp/.kbfx.html + diff --git a/kbfx.spec.in b/kbfx.spec.in new file mode 100644 index 0000000..030dab1 --- /dev/null +++ b/kbfx.spec.in @@ -0,0 +1,255 @@ +%define name @APPLICATION_NAME@ +%define version @APPLICATION_MAIN_VERSION@@APPLICATION_STABLE_RELEASE@ +%define kbfx_release @LIB_SUB_RELEASE@ +%define is_stable @APPLICATION_STABLE@ +%define debug_package %{nil} + +%define is_unknown %(test -e /etc/mandrake-release -o -e /etc/SuSE-release -o -e /etc/fedora-release -o -e /etc/pclinuxos-release && echo 0 || echo 1) +%define is_suse %(test -e /etc/SuSE-release && echo 1 || echo 0) +%define is_fedora %(test -e /etc/fedora-release && echo 1 || echo 0) +%define is_mandrake %(test -e /etc/mandrake-release && echo 1 || echo 0) +%define is_pclinuxos %(test -e /etc/pclinuxos-release && echo 1 || echo 0) + +%if %{is_suse} +%define prefix /opt/kde3 +Group: System/GUI/KDE +Release: %{kbfx_release}.suse%(echo "%{suse_version}" | %__sed -e 's/.$//') +Requires: kdelibs3 +BuildRequires: kdelibs3-devel kdebase3-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif + +%if %{is_fedora} +%define fedora_version %(rpm -q --queryformat '%{VERSION}' fedora-release) +%define fedora_vernum %(echo "%{fedora_version}" | tr -d '.') +%define prefix /usr +Group: System/GUI/KDE +Release: %{kbfx_release}.FC%{fedora_vernum} +Requires: kdebase +BuildRequires: kdebase-devel qt-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif + +%if %{is_mandrake} +%if %{is_pclinuxos} < 1 +%define prefix /usr +Group: Graphical desktop/KDE +Release: %{kbfx_release}.mdv%(echo "%{mdkversion}" | %__sed -e 's/.$//') +Requires: kdebase +BuildRequires: kdebase-devel +BuildRequires: cmake, automake, libtool +BuildRequires: glibc-devel, libstdc++-devel +%endif +%endif + +%if %{is_pclinuxos} +%define prefix /usr +Group: Graphical desktop/KDE +Release: %{kbfx_release}.pclos%{product_version} +Requires: kdelibs +BuildRequires: cmake, automake, libtool +BuildRequires: kdelibs-devel +%endif + +%if %{is_unknown} +%define prefix %(kde-config --prefix) +Group: Graphical desktop/KDE +Release: %{kbfx_release} +BuildRequires: cmake, automake, libtool +%endif + + +Name: %{name} +Version: %{version} +License: GPL +URL: http://www.kbfx.org +Summary: An alternative to the classical K-Menu button and it's menu. +BuildRoot: %{_tmppath}/build-%{name}-%{version}-root +Packager: PhobosK <phobosk@mail.kbfx.org> +Vendor: KBFX TEAM +Provides: kbfx + +%if %{is_stable} < 1 +Source: %{name}-%{version}-%{kbfx_release}.tar.bz2 +%else +Source: %{name}-%{version}.tar.bz2 +%endif + +%description +KBFX is an alternative to the classical K-Menu button and it's menu. +It improves the user experience by enabling the user to set a bigger (and thus more visible) start button and by finally replacing the Win95-like K-Menu with the Spinx bar. +If you still want the old menu, because you're used to it, it is still available as an option in kbfx. + +Main features: + Spinx Bar has 6 Basic Functionalities. + 1.Selecting an Application Group + 2.Selecting an Application + 3.Type and locate an Application + 4.Logout of the Desktop + 5.Lock the Desktop + 6.Launch KBFX settings manager + 7.Scroll up and down the application list + +Extra features: + 1.Double buffered Widgets to minimize flicker. + 2.Animated scroll bars + 3.New Tooltip + 4.Gif/Mng File Support + 5.New Control Manager + +%prep + +%if %{is_stable} < 1 +%setup -n %{name}-%{version}-%{kbfx_release} +%else +%setup -n %{name}-%{version} +%endif + +rm -Rf build +mkdir build +cd build +export DESTDIR=${RPM_BUILD_ROOT} +cmake ../ -DCMAKE_INSTALL_PREFIX=%{prefix} + +%build +cd build + +%install +cd build +[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -Rf ${RPM_BUILD_ROOT}; +export DESTDIR=${RPM_BUILD_ROOT} +make install + +%if %{is_mandrake} +mkdir -p ${RPM_BUILD_ROOT}%{_menudir} +cat << EOF > ${RPM_BUILD_ROOT}%{_menudir}/%{name} +?package(%{name}): needs="kde" kde_filename="kbfxconfig" \ +section="System/Configuration/Other" title="KBFX Configurator" icon="kbfxconfigapp" \ +command="kbfxconfigapp" longtitle="KBFX Configuration Utility" \ +kde_opt="\\\\nEncoding=UTF-8\\\\nType=Application" +EOF +%endif + +%post +if [ -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi +/sbin/ldconfig + +%postun +if [ "$1" = "0" -a -x /usr/bin/update-menus ]; then /usr/bin/update-menus || true ; fi +/sbin/ldconfig + + +%clean +[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d ${RPM_BUILD_ROOT} ] && rm -Rf ${RPM_BUILD_ROOT}; + +%files +%defattr(-, root, root) +%{prefix}/* + +%changelog + +* Wed May 16 2007 0.4.9.3.1 + - CHANGED layout and font configfile specs + - UPDATED help documentation + - ADDED fade transition effect on the KBFX Button + - ADDED install guides for using checkinstall + - ADDED Hungarian translation (thanks to Ferenc Stelcz for it) + - ADDED option to watch for KDE global changes like new installed applications + - ADDED option for Theme Info + - ADDED resizable configuration dialogs + - ADDED drag&drop hover, pressed and normal images over the KBFX button + - ADDED tooltip support for the KBFX button + - ADDED switch between KBFX and K Menu + - ADDED new two panel skin - "2panels" + - ADDED configurable middle background - middleboxbg.png + - ADDED fonts support in every part of the menu + - ADDED layout support in the KBFX Configurator + - ADDED support for the new versions of strigi + - ADDED support for use of strigi in Gentoo + - ADDED support for SVN version in Gentoo + - ADDED support for PCLinuxOS rpm build (thanks to @PaGal and @tom777 for the testing) + - ADDED support for future KDE4 (part 1) + - ADDED uninstall option for "build.sh" script + - FIXED cmake uninstall + - FIXED RPM .la issues + - FIXED some major bugs + - REMOVED Water effect (too much CPU time consuming and not a favorite one for our users) + +* Wed Jan 17 2007 0.4.9.3-20070117 + - Initial Release of the 0.4.9.3 Series - KBFX Silk (0.4.9.3) + - New Build system (cmake) + - Re-write of the data backend + - Re-write of the GUI + - Totally new theme + - Improved configuration dialog + +* Fri Nov 17 2006 0.4.9.2rc4 + - CHANGED some aspects of autoconf/automake behaviour + - CHANGED "Toolbar Resize" behaviour - turned off by default so kicker doesn't change its size anymore + - ADDED support for Mandriva 2007 compilation (no menudrake there by default) + - FIXED Searchbar behaviour (thanks @gropiuskalle) + - FIXED some minor bugs + +* Sun Nov 05 2006 0.4.9.2rc3 + - ADDED support for preparing .kbfxtheme files in konqueror (look the explanation in HOWTO file) + - ADDED "--prepare" commandline option to pack existing KBFX Skin Folders to .kbfxtheme files + - ADDED "Default Theme's Personal Image" to the "KBFX Configurator Application" + - ADDED "Toolbar Resize" option to the "KBFX Configurator Application" for the toolbar where the KBFX Button resides + - ADDED it, bg and nl translations + - FIXED some minor bugs + +* Mon Sep 19 2006 0.4.9.2rc2 + - CHANGED "KBFX Configurator Application" - rewritten from scratch and is no more part of "kcontrol" + - CHANGED "Tooltip Animation" behaviour - turned off by default + - ADDED new Default Theme + - ADDED fonts configuration option to the "KBFX Configurator Application" + - ADDED Install/Delete Themes to the "KBFX Configurator Application" + - ADDED support for .kbfxtheme files in konqueror (look the explanation in HOWTO file) + - ADDED possibility to change "dude" image to the "KBFX Configurator Application" + - ADDED Free-BSD Support + - FIXED font alignment problems + - FIXED long applications name problem + - FIXED some memory leaks + - FIXED some minor bugs + +* Sun Jun 18 2006 0.4.9.2-20060708cvs + - UPDATED make system + +* Sun Jun 11 2006 0.4.9.2-20060611cvs + - ADDED KNOWN_BUGS file in the project documents + - ADDED PC-BSD Support + - ADDED Drag and Drop Support + - FIXED a bug with showing icons in "Recently Used" items + - FIXED a bug with the placement of ".face.icon" (thanks @Nucc) + - Flicker Free KBFX Button + - Flicker Free KBFX SPINX Menu TOP + - Better scrolling + + +* Sun May 28 2006 0.4.9.2-20060528cvs + - ADDED suport for Fedora rpm + - ADDED an option to disable tooltip (see HOWTO file) + - FIXED a problem with building SUSE rpm + + +* Wed May 10 2006 0.4.9.2rc1 + - ADDED suport for SUSE rpm + - ADDED support for Buttons with Drop shadows + - ADDED Font settings as part of the Theme itself + - ADDED Grouping header for each application group and sub groups + - ADDED Kiosk mode support + - ADDED Handling of submenus + - FIXED a problem with make + - FIXED make system for all distributions + - Better support for Mandriva distribution + - More applications for the menu + + +* Sun Apr 16 2006 0.4.9.1-1 + Initial rpm release + - FIXED Kbfx configuration + - FIXED Slack 1.9 automake and compilation + - FIXED /tmp/.kbfx.html + diff --git a/kbfxlib/common/CMakeLists.txt b/kbfxlib/common/CMakeLists.txt new file mode 100644 index 0000000..f318f74 --- /dev/null +++ b/kbfxlib/common/CMakeLists.txt @@ -0,0 +1,48 @@ +SET(libkbfxcommonsrc + kbfxkiodownload.cpp + kbfxpixmaplabel.cpp + kbfxconfig.cpp + kbfxpushbutton.cpp + kbfxthemesdata.cpp + kbfxfontchooser.cpp + kbfxplasmapixmapprovider.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxcommonsrc}) + + ADD_LIBRARY(kbfxcommon SHARED ${libkbfxcommonsrc}) + SET_TARGET_PROPERTIES(kbfxcommon + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxcommon PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxcommon + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxcommon ${LIB_INSTALL_DIR}) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxcommonsrc}) + + KDE4_ADD_LIBRARY(kbfxcommon SHARED ${libkbfxcommonsrc}) + TARGET_LINK_LIBRARIES(kbfxcommon + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxcommon ${LIB_INSTALL_DIR}) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxcommon DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/common) diff --git a/kbfxlib/common/kbfxconfig.cpp b/kbfxlib/common/kbfxconfig.cpp new file mode 100644 index 0000000..15c2590 --- /dev/null +++ b/kbfxlib/common/kbfxconfig.cpp @@ -0,0 +1,862 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxconfig.h" + +KbfxConfig::KbfxConfig() +{ + /* set default configuration values */ + + /* KBFX internal settings */ + KbfxThemeRcDestination = KGlobal::dirs()->saveLocation ( "data", QString ( "kbfx/themerc/" ), TRUE ); + KbfxRcPath = KGlobal::dirs()->findResource ( "config", "kbfxrc" ); + m_KbfxDeleteOldConf = FALSE; + QString _unspecified = tr2i18n ( "Not Specified" ); + QString path = locate ( "data", "kbfx/skins/default/bg.png" ); + path.remove ( "default/bg.png" ); + + kdDebug() << "Configuration path skins: " + path << endl; + + /* KBFX general settings */ + m_KbfxGeneralVersionDefault = APPLICATION_INTERNAL_VERSION; + m_KbfxThemesVersion = "version-2"; + + m_KbfxHistoryDefault = ""; + + /* theme properties */ + m_SpinxThemeNameDefault = "default"; + m_SpinxThemeBasePathDefault = path; + m_UserSpinxThemeBasePathDefault = path; + + m_KbfxMenuTypeDefault = "spinx"; + m_ToolBarResizeDefault = FALSE; + m_KbfxWatcherDefault = TRUE; + m_KbfxShowOldThemesDefault = FALSE; + + /* user(dude) image properties */ + m_SpinxDudeBlinkDefault = FALSE; + KUser *user = new KUser(); + m_SpinxDudeImageDefault = locate ( "data", user->homeDir () + "/.face.icon" ); + delete user; + + /* tooltip properties */ + m_ToolTipDefault = FALSE; + m_ToolTipAnimationDefault = TRUE; + m_ToolTipTextDefault = "Application menu"; + m_ToolTipAvatarDefault = path + "default/butterfly.png"; + m_SpinxTooltipDudeboxDefault = path + "default/tooltip_dudebox.png"; + m_SpinxTooltipMaskDefault = path + "default/tooltip_mask.png"; + m_SpinxTooltipWindowDefault = path + "default/tooltip_window.png"; + m_SpinxTooltipLogoDefault = path + "default/tooltip_logo.png"; + + /* KBFX plugins */ + m_pluginsLeftDefault="Applications"; + m_pluginsRightDefault="Settings"; + + /* specific theme KBFX settings */ + + /* KBFX panel button */ + m_KbfxNormalButtonPathDefault = path + "default/normal.png"; + m_KbfxHoverButtonPathDefault = path + "default/hover.png"; + m_KbfxPressedButtonPathDefault = path + "default/pressed.png"; + + /* face properties */ + m_facePos_xDefault = -1; + m_facePos_yDefault = -1; + m_faceIconXDefault = 27; + m_faceIconYDefault = 8; + m_faceIconHDefault = 64; + m_faceIconWDefault = 65; + m_userNamePos_xDefault = 130; + m_userNamePos_yDefault = 32; + m_faceBoxHideTextDefault = FALSE; + + /* top bar properties */ + m_topBar_xDefault = 0; + m_topBar_yDefault = 0; + m_topBar_hDefault = 95; + m_topBar_wDefault = 504; //108+190+74; + + /* bottom bar properties */ + m_botBar_xDefault = 0; + m_botBar_yDefault = 428; + m_botBar_hDefault = 38; + m_botBar_wDefault = 504; //108+190+74; + + /* scroll bar properties */ + m_scrollBarBotYDefault = 95; + m_scrollBarBotXDefault = 108; + m_scrollBarTopXDefault = 108; + m_scrollBarTopYDefault = 95; + + /* listbox properties */ + m_listBox_xDefault = 0; + m_listBox_yDefault = m_topBar_hDefault; + m_listBox_wDefault = 132; + m_listBox_hDefault = 275; + + /* search box properties */ + m_searchBox_hDefault = 22; + m_searchBox_wDefault = 240; + m_searchBox_xDefault = 130; + m_searchBox_yDefault = 48; + m_searchBox_staticDefault = TRUE; + + /* item view properties */ + m_itemView_hDefault = 380; + m_itemView_wDefault = 240; + m_itemView_xDefault = 132; + m_itemView_yDefault = m_topBar_hDefault; + + /* toolbar properties */ + m_toolBarButtonNormalSizeDefault = 48; + m_toolBarButtonExpandSizeDefault = 48; + + /* KBFX misc properties */ + m_userMenuHeightDefault = 513; + m_userMenuWidthDefault = 504; + m_startHiddenDefault = FALSE; + m_fadeTimeDefault = 75; + m_noCommentsDefault = FALSE; + m_commentMargineDefault = 66; + m_iconSizeDefault = 32; + + /* set default fonts values */ + m_fontTooltipColorDefault = QColor ( 0,0,0 ); + m_fontTooltipFontDefault = QFont ( "Arial", 8, QFont::Normal ); + m_fontAppNameColorDefault = QColor ( 0,0,0 ); + m_fontAppNameFontDefault = QFont ( "Arial", 8, QFont::Normal ); + m_fontAppCommentColorDefault = QColor ( 128,125,0 ); + m_fontAppCommentFontDefault = QFont ( "Arial", 8, QFont::Normal ); + m_fontIndexColorDefault = QColor ( 0,0,0 ); + m_fontIndexFontDefault = QFont ( "Arial", 8, QFont::Normal ); + m_userNameColorDefault = QColor ( 255,255,255 ); + m_userNameFontDefault = QFont ( "Arial", 10, QFont::Bold ); + m_sepNameColorDefault = QColor ( 0,0,0 ); + m_sepNameFontDefault = QFont ( "Arial", 8, QFont::Bold ); + m_pluginNameColorDefault = QColor ( 0,0,0 ); + m_pluginNameFontDefault = QFont ( "Arial", 8, QFont::Normal ); + m_lineColorDefault = QColor ( 255,220,125 ); + m_fontHoverBoldDefault = FALSE; + + /* set default theme info values */ + m_InfoVersionDefault = _unspecified; + m_InfoAuthorDefault = _unspecified; + m_InfoEmailDefault = _unspecified; + m_InfoUrlDefault = _unspecified; + + read(); +} + +KbfxConfig& ConfigInit() +{ + static KbfxConfig _config; + return _config; +} + +void KbfxConfig::setDefault() +{ + /* set default configuration */ + m_KbfxHistory = m_KbfxHistoryDefault; + + m_SpinxThemeName = m_SpinxThemeNameDefault; + m_SpinxThemeBasePath = m_SpinxThemeBasePathDefault; + m_UserSpinxThemeBasePath = m_UserSpinxThemeBasePathDefault; + + m_KbfxMenuType = m_KbfxMenuTypeDefault; + m_ToolBarResize = m_ToolBarResizeDefault; + m_KbfxWatcher = m_KbfxWatcherDefault; + m_KbfxShowOldThemes = m_KbfxShowOldThemesDefault; + + m_SpinxDudeBlink = m_SpinxDudeBlinkDefault; + m_SpinxDudeImage = m_SpinxDudeImageDefault; + + m_ToolTip = m_ToolTipDefault; + m_ToolTipAnimation = m_ToolTipAnimationDefault; + m_ToolTipText = m_ToolTipTextDefault; + + m_pluginsLeft = m_pluginsLeftDefault; + m_pluginsRight = m_pluginsRightDefault; +} + +void KbfxConfig::setThemeInfoDefault() +{ + /* set default configuration */ + m_InfoVersion = m_InfoVersionDefault; + m_InfoAuthor = m_InfoAuthorDefault; + m_InfoEmail = m_InfoEmailDefault; + m_InfoUrl = m_InfoUrlDefault; +} + +void KbfxConfig::setThemeDefault() +{ + /* set default theme layout configuration */ + m_KbfxNormalButtonPath = m_KbfxNormalButtonPathDefault; + m_KbfxHoverButtonPath = m_KbfxHoverButtonPathDefault; + m_KbfxPressedButtonPath = m_KbfxPressedButtonPathDefault; + + m_ToolTipAvatar = m_ToolTipAvatarDefault; + m_SpinxTooltipDudebox = m_SpinxTooltipDudeboxDefault; + m_SpinxTooltipMask = m_SpinxTooltipMaskDefault; + m_SpinxTooltipWindow = m_SpinxTooltipWindowDefault; + m_SpinxTooltipLogo = m_SpinxTooltipLogoDefault; + + m_facePos_x = m_facePos_xDefault; + m_facePos_y = m_facePos_yDefault; + m_faceIconX = m_faceIconXDefault; + m_faceIconY = m_faceIconYDefault; + m_faceIconH = m_faceIconHDefault; + m_faceIconW = m_faceIconWDefault; + m_userNamePos_x = m_userNamePos_xDefault; + m_userNamePos_y = m_userNamePos_yDefault; + m_faceBoxHideText = m_faceBoxHideTextDefault; + + m_topBar_x = m_topBar_xDefault; + m_topBar_y = m_topBar_yDefault; + m_topBar_h = m_topBar_hDefault; + m_topBar_w = m_topBar_wDefault; + + m_botBar_x = m_botBar_xDefault; + m_botBar_y = m_botBar_yDefault; + m_botBar_h = m_botBar_hDefault; + m_botBar_w = m_botBar_wDefault; + + m_scrollBarBotY = m_scrollBarBotYDefault; + m_scrollBarBotX = m_scrollBarBotXDefault; + m_scrollBarTopX = m_scrollBarTopXDefault; + m_scrollBarTopY = m_scrollBarTopYDefault; + + m_listBox_x = m_listBox_xDefault; + m_listBox_y = m_listBox_yDefault; + m_listBox_w = m_listBox_wDefault; + m_listBox_h = m_listBox_hDefault; + + m_searchBox_h = m_searchBox_hDefault; + m_searchBox_w = m_searchBox_wDefault; + m_searchBox_x = m_searchBox_xDefault; + m_searchBox_y = m_searchBox_yDefault; + m_searchBox_static = m_searchBox_staticDefault; + + m_itemView_h = m_itemView_hDefault; + m_itemView_w = m_itemView_wDefault; + m_itemView_x = m_itemView_xDefault; + m_itemView_y = m_itemView_yDefault; + + m_toolBarButtonNormalSize = m_toolBarButtonNormalSizeDefault; + m_toolBarButtonExpandSize = m_toolBarButtonExpandSizeDefault; + + m_userMenuHeight = m_userMenuHeightDefault; + m_userMenuWidth = m_userMenuWidthDefault; + m_startHidden = m_startHiddenDefault; + m_fadeTime = m_fadeTimeDefault; + m_noComments = m_noCommentsDefault; + m_commentMargine = m_commentMargineDefault; + m_iconSize = m_iconSizeDefault; +} + +void KbfxConfig::setFontsDefault() +{ + /* set default fonts values */ + m_fontTooltipColor = m_fontTooltipColorDefault; + m_fontTooltipFont = m_fontTooltipFontDefault; + m_fontAppNameColor = m_fontAppNameColorDefault; + m_fontAppNameFont = m_fontAppNameFontDefault; + m_fontAppCommentColor = m_fontAppCommentColorDefault; + m_fontAppCommentFont = m_fontAppCommentFontDefault; + m_fontIndexColor = m_fontIndexColorDefault; + m_fontIndexFont = m_fontIndexFontDefault; + m_userNameColor = m_userNameColorDefault; + m_userNameFont = m_userNameFontDefault; + m_sepNameColor = m_sepNameColorDefault; + m_sepNameFont = m_sepNameFontDefault; + m_pluginNameColor = m_pluginNameColorDefault; + m_pluginNameFont = m_pluginNameFontDefault; + m_lineColor = m_lineColorDefault; + m_fontHoverBold = m_fontHoverBoldDefault; +} + +void KbfxConfig::readThemeInfo ( QString &themePath, QString &themeName ) +{ + setThemeInfoDefault(); + + QFileInfo * info_theme = new QFileInfo ( themePath + themeName + "/" + m_KbfxThemesVersion ); + KConfig * infoconfig = 0; + + if ( info_theme->exists() == TRUE ) + { + infoconfig = new KConfig ( info_theme->absFilePath() ); + infoconfig->setGroup ( "ThemeGeneral" ); + m_InfoVersion = infoconfig->readEntry ( "ThemeVersion", m_InfoVersionDefault ); + m_InfoAuthor = infoconfig->readEntry ( "AuthorName", m_InfoAuthorDefault ); + m_InfoEmail = infoconfig->readEntry ( "AuthorEmail", m_InfoEmailDefault ); + m_InfoUrl = infoconfig->readEntry ( "Homepage", m_InfoUrlDefault ); + } + +/* + kdDebug() << " m_InfoVersion: " << m_InfoVersion + << endl << " m_InfoAuthor: " << m_InfoAuthor + << endl << " m_InfoEmail: " << m_InfoEmail + << endl << " m_InfoUrl: " << m_InfoUrl + << endl; +*/ + + delete info_theme; + delete infoconfig; +} + +void KbfxConfig::read() +{ + /* read general configuration */ + KConfigSkeleton *confskel = new KConfigSkeleton ( QString::fromLatin1 ( "kbfxrc" ) ); + + KConfig *conf = confskel->config(); + + QString __default = KGlobal::iconLoader()->iconPath ( "kbfx", ( int ) KIcon::Desktop, FALSE ); + + conf->setGroup ( "KbfxGeneral" ); + m_KbfxGeneralVersion = conf->readNumEntry ( "Version", 0 ); + m_ToolBarResize = conf->readBoolEntry ( "ToolBarResize", m_ToolBarResizeDefault ); + m_KbfxMenuType = conf->readEntry ( "MenuType", m_KbfxMenuTypeDefault ); + m_KbfxWatcher = conf->readBoolEntry ( "KbfxWatcher", m_KbfxWatcherDefault ); + m_KbfxShowOldThemes = conf->readBoolEntry ( "KbfxShowOld", m_KbfxShowOldThemesDefault ); + + conf->setGroup ( "SpinxTheme" ); + m_UserSpinxThemeBasePath = conf->readEntry ( "UserThemePath", m_UserSpinxThemeBasePathDefault ); + /* if a new version use default theme */ + if ( m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + m_SpinxThemeName = m_SpinxThemeNameDefault; + m_SpinxThemeBasePath = m_SpinxThemeBasePathDefault; + } + else + { + m_SpinxThemeName = conf->readEntry ( "ThemeName", m_SpinxThemeNameDefault ); + m_SpinxThemeBasePath = conf->readEntry ( "ThemePath", m_SpinxThemeBasePathDefault ); + } + + conf->setGroup ( "UserImage" ); + m_SpinxDudeBlink = conf->readBoolEntry ( "DudeBlink", m_SpinxDudeBlinkDefault ); + + conf->setGroup ( "ToolTip" ); + m_ToolTip = conf->readBoolEntry ( "EnableToolTip", m_ToolTipDefault ); + m_ToolTipAnimation = conf->readBoolEntry ( "AnimatedTooltip", m_ToolTipAnimationDefault ); + m_ToolTipText = conf->readEntry ( "ToolTipText", m_ToolTipTextDefault ); + + conf->setGroup ( "Plugins" ); + m_pluginsLeft = conf->readListEntry ( "LoadedPluginsLeft", m_pluginsLeftDefault ); + m_pluginsRight = conf->readListEntry ( "LoadedPluginsRight", m_pluginsRightDefault ); + + conf->setGroup ( "Runtime" ); + m_KbfxHistory = conf->readEntry ( "History", m_KbfxHistoryDefault ); + + /* + kdDebug() << " m_KbfxGeneralVersion: " << m_KbfxGeneralVersion + << endl << " m_KbfxMenuType: " << m_KbfxMenuType + << endl << " m_KbfxWatcher: " << m_KbfxWatcher + << endl << " m_KbfxShowOldThemes: " << m_KbfxShowOldThemes + << endl << " m_ToolBarResize: " << m_ToolBarResize + << endl << " m_UserSpinxThemeBasePath : " << m_UserSpinxThemeBasePath + << endl << " m_SpinxThemeName: " << m_SpinxThemeName + << endl << " m_SpinxThemeBasePath: " << m_SpinxThemeBasePath + << endl << " m_SpinxDudeBlink: " << m_SpinxDudeBlink + << endl << " m_ToolTip: " << m_ToolTip + << endl << " m_ToolTipAnimation: " << m_ToolTipAnimation + << endl << " m_ToolTipText: " << m_ToolTipText + << endl << " m_KbfxHoverButtonPath: " << m_KbfxHoverButtonPath + << endl << " m_KbfxPressedButtonPath: " << m_KbfxPressedButtonPath + << endl << " m_pluginsLeft: " << m_pluginsLeft + << endl << " m_pluginsRight: " << m_pluginsRight + << endl << " m_KbfxHistory: " << m_KbfxHistory + << endl; + */ + + delete confskel; + + readFontrc ( m_SpinxThemeBasePath, m_SpinxThemeName ); + readThemerc ( m_SpinxThemeBasePath, m_SpinxThemeName ); + + if ( m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + m_KbfxGeneralVersion = m_KbfxGeneralVersionDefault; + m_KbfxDeleteOldConf = TRUE; + } +} + +void KbfxConfig::readFontrc ( QString & themePath, QString & themeName, bool user_rc ) +{ + setFontsDefault(); + + /* if a new version use default theme fonts */ + if ( m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + themePath = m_SpinxThemeBasePathDefault; + themeName = m_SpinxThemeNameDefault; + } + /* get some font settings from theme file or from theme section */ + QString _abs_path = ""; + QFileInfo * info = new QFileInfo ( themePath + themeName + "/kbfxfontrc" ); + QFileInfo * info_theme = new QFileInfo ( KbfxThemeRcDestination + "/" + themeName + "_fontrc" ); + KConfig * fontconfig = 0; + + /* if theme kbfxfontrc exists, make its configuration as default values - prefer users' configuration */ + if ( info_theme->exists() == TRUE || info->exists() == TRUE ) + { + if ( info_theme->exists() == TRUE && m_KbfxGeneralVersion >= m_KbfxGeneralVersionDefault && user_rc ) + { + _abs_path = info_theme->absFilePath(); + } + else if ( info->exists() == TRUE || m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + _abs_path = info->absFilePath(); + } + fontconfig = new KConfig ( _abs_path ); + + fontconfig->setGroup ( "Fonts" ); + m_fontTooltipColor = fontconfig->readColorEntry ( "TooltipText", &m_fontTooltipColorDefault ); + m_fontTooltipFont = fontconfig->readFontEntry ( "TooltipTextFont", &m_fontTooltipFontDefault ); + m_fontAppNameColor = fontconfig->readColorEntry ( "ApplicationText", &m_fontAppNameColorDefault ); + m_fontAppNameFont = fontconfig->readFontEntry ( "ApplicationTextFont", &m_fontAppNameFontDefault ); + m_fontAppCommentColor = fontconfig->readColorEntry ( "CommentText", &m_fontAppCommentColorDefault ); + m_fontAppCommentFont = fontconfig->readFontEntry ( "CommentTextFont", &m_fontAppCommentFontDefault ); + m_fontIndexColor = fontconfig->readColorEntry ( "GroupText", &m_fontIndexColorDefault ); + m_fontIndexFont = fontconfig->readFontEntry ( "GroupTextFont", &m_fontIndexFontDefault ); + m_userNameColor = fontconfig->readColorEntry ( "UserName", &m_userNameColorDefault ); + m_userNameFont = fontconfig->readFontEntry ( "UserNameFont", &m_userNameFontDefault ); + m_sepNameColor = fontconfig->readColorEntry ( "SeparatorColor", &m_sepNameColorDefault ); + m_sepNameFont = fontconfig->readFontEntry ( "SeparatorFont", &m_sepNameFontDefault ); + m_pluginNameColor = fontconfig->readColorEntry ( "PluginColor", &m_pluginNameColorDefault ); + m_pluginNameFont = fontconfig->readFontEntry ( "PluginFont", &m_pluginNameFontDefault ); + m_lineColor = fontconfig->readColorEntry ( "LineColor", &m_lineColorDefault ); + m_fontHoverBold = fontconfig->readBoolEntry ( "HoverBold",m_fontHoverBoldDefault ); + kdDebug() << "Read default font settings for theme: " + << themeName + << " from file: " + << _abs_path + << endl; + } + else + { + kdDebug() << "Left Default Font Values for theme: " + << themeName + << endl; + } + + /* + kdDebug() << "Font Values:" << endl + << m_fontTooltipColor << endl + << m_fontTooltipFont << endl + << m_fontAppNameColor << endl + << m_fontAppNameFont << endl + << m_fontAppCommentColor << endl + << m_fontAppCommentFont << endl + << m_fontIndexColor << endl + << m_fontIndexFont << endl + << m_userNameColor << endl + << m_userNameFont << endl + << m_sepNameColor << endl + << m_sepNameFont << endl + << m_pluginNameColor << endl + << m_pluginNameFont << endl + << m_fontHoverBold << endl + << m_lineColor << endl + ; + */ + + delete info; + delete info_theme; + delete fontconfig; +} + +void KbfxConfig::readThemerc ( QString &themePath, QString &themeName, bool user_rc ) +{ + /* if a new version use default theme layout */ + if ( m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + themePath = m_SpinxThemeBasePathDefault; + themeName = m_SpinxThemeNameDefault; + } + + /* load theme's on and off buttons if any */ + KbfxOnImg = QPixmap::QPixmap ( KbfxPlasmaPixmapProvider::PixmapPath ( "on", themePath, themeName ) ); + KbfxOffImg = QPixmap::QPixmap ( KbfxPlasmaPixmapProvider::PixmapPath ( "off", themePath, themeName ) ); + + /* use theme's default dude image if any */ + KConfigSkeleton *confskel = new KConfigSkeleton ( QString::fromLatin1 ( "kbfxrc" ) ); + KConfig *conf = confskel->config(); + QString __default = KGlobal::iconLoader()->iconPath ( "kbfx", ( int ) KIcon::Desktop, FALSE ); + + if ( m_SpinxDudeImageDefault == QString::null || !KStandardDirs::exists ( m_SpinxDudeImageDefault ) ) + { + m_SpinxDudeImageDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "menu_top_image_person", themePath, themeName ); + } + conf->setGroup ( "UserImage" ); + m_SpinxDudeImage = conf->readEntry ( "DudeImage", m_SpinxDudeImageDefault ); + delete confskel; + + /* load theme's default buttons if any */ + m_KbfxNormalButtonPathDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "normal", themePath, themeName ); + m_KbfxHoverButtonPathDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "hover", themePath, themeName ); + m_KbfxPressedButtonPathDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "pressed", themePath, themeName ); + + /* load theme's default tooltip images if any */ + m_ToolTipAvatarDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "butterfly", themePath, themeName ); + m_SpinxTooltipDudeboxDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "tooltip_dudebox", themePath, themeName ); + m_SpinxTooltipMaskDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "tooltip_mask", themePath, themeName ); + m_SpinxTooltipWindowDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "tooltip_window", themePath, themeName ); + m_SpinxTooltipLogoDefault = KbfxPlasmaPixmapProvider::PixmapPath ( "tooltip_logo", themePath, themeName ); + + setThemeDefault(); + + /* get some theme layout settings from theme file or from theme section */ + QString _abs_path = ""; + QFileInfo * info = new QFileInfo ( themePath + themeName + "/kbfxlayoutrc" ); + QFileInfo * info_theme = new QFileInfo ( KbfxThemeRcDestination + "/" + themeName + "_layoutrc" ); + KConfig *layoutconfig = 0; + + /* if theme kbfxlayoutrc exists, make its configuration as default values - prefer users' configuration */ + if ( info_theme->exists() == TRUE || info->exists() == TRUE ) + { + if ( info_theme->exists() == TRUE && m_KbfxGeneralVersion >= m_KbfxGeneralVersionDefault && user_rc ) + { + _abs_path = info_theme->absFilePath(); + } + else if ( info->exists() == TRUE || m_KbfxGeneralVersion < m_KbfxGeneralVersionDefault ) + { + _abs_path = info->absFilePath(); + } + + layoutconfig = new KConfig ( _abs_path ); + + layoutconfig->setGroup ( "KbfxButton" ); + m_KbfxNormalButtonPath = layoutconfig->readEntry ( "Normal", m_KbfxNormalButtonPathDefault ); + m_KbfxHoverButtonPath = layoutconfig->readEntry ( "Hover", m_KbfxHoverButtonPathDefault ); + m_KbfxPressedButtonPath = layoutconfig->readEntry ( "Press", m_KbfxPressedButtonPathDefault ); + m_fadeTime = layoutconfig->readNumEntry ( "FadeTime", m_fadeTimeDefault ); + + layoutconfig->setGroup ( "ToolTip" ); + m_ToolTipAvatar = layoutconfig->readEntry ( "Avatar", m_ToolTipAvatarDefault ); + m_SpinxTooltipDudebox = layoutconfig->readEntry ( "Dudebox", m_SpinxTooltipDudeboxDefault ); + m_SpinxTooltipMask = layoutconfig->readEntry ( "Mask", m_SpinxTooltipMaskDefault ); + m_SpinxTooltipWindow = layoutconfig->readEntry ( "Window", m_SpinxTooltipWindowDefault ); + m_SpinxTooltipLogo = layoutconfig->readEntry ( "Logo", m_SpinxTooltipLogoDefault ); + + layoutconfig->setGroup ( "TopBar" ); + m_facePos_x = layoutconfig->readNumEntry ( "DudeX", m_facePos_xDefault ); + m_facePos_y = layoutconfig->readNumEntry ( "DudeY", m_facePos_yDefault ); + m_faceIconX = layoutconfig->readNumEntry ( "FaceX",m_faceIconXDefault ); + m_faceIconY = layoutconfig->readNumEntry ( "FaceY",m_faceIconYDefault ); + m_faceIconH = layoutconfig->readNumEntry ( "FaceH",m_faceIconHDefault ); + m_faceIconW = layoutconfig->readNumEntry ( "FaceW",m_faceIconWDefault ); + m_userNamePos_x = layoutconfig->readNumEntry ( "UserNameX", m_userNamePos_xDefault ); + m_userNamePos_y = layoutconfig->readNumEntry ( "UserNameY", m_userNamePos_yDefault ); + m_faceBoxHideText= layoutconfig->readBoolEntry ( "DisableUserName", m_faceBoxHideTextDefault ); + m_topBar_h = layoutconfig->readNumEntry ( "Height", m_topBar_hDefault ); + m_topBar_w = layoutconfig->readNumEntry ( "Width", m_topBar_wDefault ); + m_topBar_x = layoutconfig->readNumEntry ( "X", m_topBar_xDefault ); + m_topBar_y = layoutconfig->readNumEntry ( "Y", m_topBar_yDefault ); + + layoutconfig->setGroup ( "BottomBar" ); + m_botBar_h = layoutconfig->readNumEntry ( "Height", m_botBar_hDefault ); + m_botBar_w = layoutconfig->readNumEntry ( "Width", m_botBar_wDefault ); + m_botBar_x = layoutconfig->readNumEntry ( "X", m_botBar_xDefault ); + m_botBar_y = layoutconfig->readNumEntry ( "Y", m_botBar_yDefault ); + + layoutconfig->setGroup ( "Scrollbars" ); + m_scrollBarBotX = layoutconfig->readNumEntry ( "ScrollBarBotX", m_scrollBarBotXDefault ); + m_scrollBarBotY = layoutconfig->readNumEntry ( "ScrollBarBotY", m_scrollBarBotYDefault ); + m_scrollBarTopX = layoutconfig->readNumEntry ( "ScrollBarTopX", m_scrollBarTopXDefault ); + m_scrollBarTopY = layoutconfig->readNumEntry ( "ScrollBarTopY", m_scrollBarTopYDefault ); + + layoutconfig->setGroup ( "ListBox" ); + m_listBox_h = layoutconfig->readNumEntry ( "Height", m_listBox_hDefault ); + m_listBox_w = layoutconfig->readNumEntry ( "Width", m_listBox_wDefault ); + m_listBox_x = layoutconfig->readNumEntry ( "X", m_listBox_xDefault ); + m_listBox_y = layoutconfig->readNumEntry ( "Y", m_listBox_yDefault ); + + layoutconfig->setGroup ( "SearchBox" ); + m_searchBox_h = layoutconfig->readNumEntry ( "Height", m_searchBox_hDefault ); + m_searchBox_w = layoutconfig->readNumEntry ( "Width", m_searchBox_wDefault ); + m_searchBox_x = layoutconfig->readNumEntry ( "X", m_searchBox_xDefault ); + m_searchBox_y = layoutconfig->readNumEntry ( "Y", m_searchBox_yDefault ); + m_searchBox_static = layoutconfig->readBoolEntry ( "FixedPos", m_searchBox_staticDefault ); + + layoutconfig->setGroup ( "ItemView" ); + m_itemView_h = layoutconfig->readNumEntry ( "Height", m_itemView_hDefault ); + m_itemView_w = layoutconfig->readNumEntry ( "Width", m_itemView_wDefault ); + m_itemView_x = layoutconfig->readNumEntry ( "X", m_itemView_xDefault ); + m_itemView_y = layoutconfig->readNumEntry ( "Y", m_itemView_yDefault ); + + layoutconfig->setGroup ( "ToolBar" ); + m_toolBarButtonNormalSize = layoutconfig->readNumEntry ( "ButtonNormalSize", m_toolBarButtonNormalSizeDefault ); + m_toolBarButtonExpandSize = layoutconfig->readNumEntry ( "ButtonPressedSize", m_toolBarButtonExpandSizeDefault ); + + layoutconfig->setGroup ( "MainMenu" ); + m_userMenuHeight = layoutconfig->readNumEntry ( "UserMenuHeight",m_userMenuHeightDefault ); + m_userMenuWidth = layoutconfig->readNumEntry ( "UserMenuWidth",m_userMenuWidthDefault ); + m_startHidden = layoutconfig->readBoolEntry ( "ContractedMenu", m_startHiddenDefault ); + + layoutconfig->setGroup ( "ItemProperties" ); + m_noComments = layoutconfig->readBoolEntry ( "NoComments",m_noCommentsDefault ); + m_commentMargine = layoutconfig->readNumEntry ( "CommentMargin",m_commentMargineDefault ); + m_iconSize = layoutconfig->readNumEntry ( "IconSize",m_iconSizeDefault ); + + kdDebug() << "Read default layout settings for theme: " + << themeName + << " from file: " + << _abs_path + << endl; + } + else + { + kdDebug() << "Left Default Layout Values for theme: " + << themeName + << endl; + } + + /* + kdDebug() << " m_KbfxNormalButtonPath: " << m_KbfxNormalButtonPath + << endl << " m_KbfxHoverButtonPath: " << m_KbfxHoverButtonPath + << endl << " m_KbfxPressedButtonPath: " << m_KbfxPressedButtonPath + << endl << " m_fadeTime: " << m_fadeTime + << endl << " m_SpinxDudeImage: " << m_SpinxDudeImage + << endl << " m_ToolTipAvatar: " << m_ToolTipAvatar + << endl << " m_SpinxTooltipDudebox: " << m_SpinxTooltipDudebox + << endl << " m_SpinxTooltipMask: " << m_SpinxTooltipMask + << endl << " m_SpinxTooltipWindow: " << m_SpinxTooltipWindow + << endl << " m_SpinxTooltipLogo: " << m_SpinxTooltipLogo + << endl << " m_facePos_x: " << m_facePos_x + << endl << " m_facePos_y: " << m_facePos_y + << endl << " m_faceIconX: " << m_faceIconX + << endl << " m_faceIconY: " << m_faceIconY + << endl << " m_faceIconH: " << m_faceIconH + << endl << " m_faceIconW: " << m_faceIconW + << endl << " m_userNamePos_x: " << m_userNamePos_x + << endl << " m_userNamePos_y: " << m_userNamePos_y + << endl << " m_faceBoxHideText: " << m_faceBoxHideText + << endl << " m_topBar_x: " << m_topBar_x + << endl << " m_topBar_y: " << m_topBar_y + << endl << " m_topBar_h: " << m_topBar_h + << endl << " m_topBar_w: " << m_topBar_w + << endl << " m_botBar_x: " << m_botBar_x + << endl << " m_botBar_y: " << m_botBar_y + << endl << " m_botBar_h: " << m_botBar_h + << endl << " m_botBar_w: " << m_botBar_w + << endl << " m_scrollBarBotY: " << m_scrollBarBotY + << endl << " m_scrollBarBotX: " << m_scrollBarBotX + << endl << " m_scrollBarTopX: " << m_scrollBarTopX + << endl << " m_scrollBarTopY: " << m_scrollBarTopY + << endl << " m_listBox_x: " << m_listBox_x + << endl << " m_listBox_y: " << m_listBox_y + << endl << " m_listBox_w: " << m_listBox_w + << endl << " m_listBox_h: " << m_listBox_h + << endl << " m_searchBox_h: " << m_searchBox_h + << endl << " m_searchBox_w: " << m_searchBox_w + << endl << " m_searchBox_x: " << m_searchBox_x + << endl << " m_searchBox_y: " << m_searchBox_y + << endl << " m_searchBox_static: " << m_searchBox_static + << endl << " m_itemView_h: " << m_itemView_h + << endl << " m_itemView_w: " << m_itemView_w + << endl << " m_itemView_x: " << m_itemView_x + << endl << " m_itemView_y: " << m_itemView_y + << endl << " m_toolBarButtonNormalSize: " << m_toolBarButtonNormalSize + << endl << " m_toolBarButtonExpandSize: " << m_toolBarButtonExpandSize + << endl << " m_userMenuHeight: " << m_userMenuHeight + << endl << " m_userMenuWidth: " << m_userMenuHeight + << endl << " m_startHidden: " << m_startHidden + << endl << " m_noComments: " << m_noComments + << endl << " m_commentMargine: " << m_commentMargine + << endl << " m_iconSize: " << m_iconSize + << endl; + */ + + checkValues(); + + delete info; + delete info_theme; + delete layoutconfig; +} + +void KbfxConfig::write() +{ + if ( m_KbfxDeleteOldConf && KbfxRcPath != QString::null ) + { + QFile::remove ( KbfxRcPath ); + kdDebug() << "Deleting general RC file: " << KbfxRcPath << endl; + } + + KConfigSkeleton *confskel = new KConfigSkeleton ( QString::fromLatin1 ( "kbfxrc" ) ); + + /* write general KBFX configuration options */ + KConfig *conf = confskel->config(); + + conf->setGroup ( "KDE Action Restrictions" ); + conf->writeEntry ( "warn_unwritable_config", FALSE ); + + conf->setGroup ( "KbfxGeneral" ); + conf->writeEntry ( "Version", m_KbfxGeneralVersion ); + conf->writeEntry ( "MenuType", m_KbfxMenuType ); + conf->writeEntry ( "ToolBarResize", m_ToolBarResize ); + conf->writeEntry ( "KbfxWatcher", m_KbfxWatcher ); + conf->writeEntry ( "KbfxShowOld", m_KbfxShowOldThemes ); + + conf->setGroup ( "SpinxTheme" ); + conf->writeEntry ( "UserThemePath", m_UserSpinxThemeBasePath ); + conf->writeEntry ( "ThemeName", m_SpinxThemeName ); + conf->writeEntry ( "ThemePath", m_SpinxThemeBasePath ); + + conf->setGroup ( "UserImage" ); + conf->writeEntry ( "DudeBlink", m_SpinxDudeBlink ); + conf->writeEntry ( "DudeImage", m_SpinxDudeImage ); + + conf->setGroup ( "ToolTip" ); + conf->writeEntry ( "EnableToolTip", m_ToolTip ); + conf->writeEntry ( "AnimatedTooltip", m_ToolTipAnimation ); + conf->writeEntry ( "ToolTipText", m_ToolTipText ); + + conf->setGroup ( "Plugins" ); + conf->writeEntry ( "LoadedPluginsLeft", m_pluginsLeft ); + conf->writeEntry ( "LoadedPluginsRight", m_pluginsRight ); + + conf->setGroup ( "Runtime" ); + conf->writeEntry ( "History", m_KbfxHistory ); + + conf->sync(); + + delete confskel; +} + +void KbfxConfig::writeFontrc ( QString & themeName ) +{ + /* write fonts KBFX configuration from theme name */ + KConfig *fontconfig = new KConfig ( KbfxThemeRcDestination + "/" + themeName + "_fontrc" ); + + fontconfig->setGroup ( "Fonts" ); + fontconfig->writeEntry ( "TooltipText", m_fontTooltipColor ); + fontconfig->writeEntry ( "TooltipTextFont", m_fontTooltipFont ); + fontconfig->writeEntry ( "ApplicationText", m_fontAppNameColor ); + fontconfig->writeEntry ( "ApplicationTextFont", m_fontAppNameFont ); + fontconfig->writeEntry ( "CommentText", m_fontAppCommentColor ); + fontconfig->writeEntry ( "CommentTextFont", m_fontAppCommentFont ); + fontconfig->writeEntry ( "GroupText", m_fontIndexColor ); + fontconfig->writeEntry ( "GroupTextFont", m_fontIndexFont ); + fontconfig->writeEntry ( "UserName", m_userNameColor ); + fontconfig->writeEntry ( "UserNameFont", m_userNameFont ); + fontconfig->writeEntry ( "SeparatorColor", m_sepNameColor ); + fontconfig->writeEntry ( "SeparatorFont", m_sepNameFont ); + fontconfig->writeEntry ( "PluginColor", m_pluginNameColor ); + fontconfig->writeEntry ( "PluginFont", m_pluginNameFont ); + fontconfig->writeEntry ( "LineColor", m_lineColor ); + fontconfig->writeEntry ( "HoverBold",m_fontHoverBold ); + fontconfig->sync(); + + delete fontconfig; +} + +void KbfxConfig::writeThemerc ( QString & themeName ) +{ + checkValues(); + + /* write layout theme configuration from theme name */ + KConfig *layoutconfig = new KConfig ( KbfxThemeRcDestination + "/" + themeName + "_layoutrc" ); + + layoutconfig->setGroup ( "KbfxButton" ); + layoutconfig->writeEntry ( "Normal", m_KbfxNormalButtonPath ); + layoutconfig->writeEntry ( "Hover", m_KbfxHoverButtonPath ); + layoutconfig->writeEntry ( "Press", m_KbfxPressedButtonPath ); + layoutconfig->writeEntry ( "FadeTime", m_fadeTime ); + + layoutconfig->setGroup ( "ToolTip" ); + layoutconfig->writeEntry ( "Avatar", m_ToolTipAvatar ); + layoutconfig->writeEntry ( "Dudebox", m_SpinxTooltipDudebox ); + layoutconfig->writeEntry ( "Mask", m_SpinxTooltipMask ); + layoutconfig->writeEntry ( "Window", m_SpinxTooltipWindow ); + layoutconfig->writeEntry ( "Logo", m_SpinxTooltipLogo ); + + layoutconfig->setGroup ( "TopBar" ); + layoutconfig->writeEntry ( "DudeX", m_facePos_x ); + layoutconfig->writeEntry ( "DudeY", m_facePos_y ); + layoutconfig->writeEntry ( "FaceX",m_faceIconX ); + layoutconfig->writeEntry ( "FaceY",m_faceIconY ); + layoutconfig->writeEntry ( "FaceH",m_faceIconH ); + layoutconfig->writeEntry ( "FaceW",m_faceIconW ); + layoutconfig->writeEntry ( "UserNameX", m_userNamePos_x ); + layoutconfig->writeEntry ( "UserNameY", m_userNamePos_y ); + layoutconfig->writeEntry ( "DisableUserName", m_faceBoxHideText ); + layoutconfig->writeEntry ( "Height", m_topBar_h ); + layoutconfig->writeEntry ( "Width", m_topBar_w ); + layoutconfig->writeEntry ( "X", m_topBar_x ); + layoutconfig->writeEntry ( "Y", m_topBar_y ); + + layoutconfig->setGroup ( "BottomBar" ); + layoutconfig->writeEntry ( "Height", m_botBar_h ); + layoutconfig->writeEntry ( "Width", m_botBar_w ); + layoutconfig->writeEntry ( "X", m_botBar_x ); + layoutconfig->writeEntry ( "Y", m_botBar_y ); + + layoutconfig->setGroup ( "Scrollbars" ); + layoutconfig->writeEntry ( "ScrollBarBotX", m_scrollBarBotX ); + layoutconfig->writeEntry ( "ScrollBarBotY", m_scrollBarBotY ); + layoutconfig->writeEntry ( "ScrollBarTopX", m_scrollBarTopX ); + layoutconfig->writeEntry ( "ScrollBarTopY", m_scrollBarTopY ); + + layoutconfig->setGroup ( "ListBox" ); + layoutconfig->writeEntry ( "Height", m_listBox_h ); + layoutconfig->writeEntry ( "Width", m_listBox_w ); + layoutconfig->writeEntry ( "X", m_listBox_x ); + layoutconfig->writeEntry ( "Y", m_listBox_y ); + + layoutconfig->setGroup ( "SearchBox" ); + layoutconfig->writeEntry ( "Height", m_searchBox_h ); + layoutconfig->writeEntry ( "Width", m_searchBox_w ); + layoutconfig->writeEntry ( "X", m_searchBox_x ); + layoutconfig->writeEntry ( "Y", m_searchBox_y ); + layoutconfig->writeEntry ( "FixedPos", m_searchBox_static ); + + layoutconfig->setGroup ( "ItemView" ); + layoutconfig->writeEntry ( "Height", m_itemView_h ); + layoutconfig->writeEntry ( "Width", m_itemView_w ); + layoutconfig->writeEntry ( "X", m_itemView_x ); + layoutconfig->writeEntry ( "Y", m_itemView_y ); + + layoutconfig->setGroup ( "ToolBar" ); + layoutconfig->writeEntry ( "ButtonNormalSize", m_toolBarButtonNormalSize ); + layoutconfig->writeEntry ( "ButtonPressedSize", m_toolBarButtonExpandSize ); + + layoutconfig->setGroup ( "MainMenu" ); + layoutconfig->writeEntry ( "UserMenuHeight",m_userMenuHeight ); + layoutconfig->writeEntry ( "UserMenuWidth",m_userMenuWidth ); + layoutconfig->writeEntry ( "ContractedMenu", m_startHidden ); + + layoutconfig->setGroup ( "ItemProperties" ); + layoutconfig->writeEntry ( "NoComments",m_noComments ); + layoutconfig->writeEntry ( "CommentMargin",m_commentMargine ); + layoutconfig->writeEntry ( "IconSize",m_iconSize ); + + layoutconfig->sync(); + + delete layoutconfig; +} + +void KbfxConfig::checkValues() +{ + /* Protect some of the values */ + m_fadeTime = ( m_fadeTime == 0 ) ? m_fadeTime: ( m_fadeTime < 20 ) ? 20: ( m_fadeTime > 1000 ) ? 1000: m_fadeTime; +} diff --git a/kbfxlib/common/kbfxconfig.h b/kbfxlib/common/kbfxconfig.h new file mode 100644 index 0000000..739524b --- /dev/null +++ b/kbfxlib/common/kbfxconfig.h @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_CONFIG_H +#define KBFX_CONFIG_H + +#include <config.h> + +#include <qcolor.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qfont.h> +#include <qpixmap.h> +#include <qstring.h> + +#include <kapplication.h> +#include <kconfig.h> +#include <kconfigskeleton.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kstandarddirs.h> +#include <kuser.h> + +#include <kbfxplasmapixmapprovider.h> + +class KbfxConfig +{ + public: + void read(); + void readFontrc ( QString &themePath, QString &themeName, bool user_rc=TRUE ); + void readThemerc ( QString &themePath, QString &themeName, bool user_rc=TRUE ); + void readThemeInfo ( QString &themePath, QString &themeName ); + void setDefault(); + void setThemeDefault(); + void setFontsDefault(); + void setThemeInfoDefault(); + void write(); + void writeFontrc ( QString &themeName ); + void writeThemerc ( QString &themeName ); + void checkValues(); + + /* Theme info resources */ + QString m_InfoVersion; + QString m_InfoVersionDefault; + QString m_InfoAuthor; + QString m_InfoAuthorDefault; + QString m_InfoEmail; + QString m_InfoEmailDefault; + QString m_InfoUrl; + QString m_InfoUrlDefault; + + /* kbfx_menu_button config items list */ + QString m_KbfxThemesVersion; + QString KbfxThemeRcDestination; + QString KbfxRcPath; + QPixmap KbfxOnImg; + QPixmap KbfxOffImg; + int m_KbfxGeneralVersion; + int m_KbfxGeneralVersionDefault; + QString m_KbfxNormalButtonPath; + QString m_KbfxNormalButtonPathDefault; + QString m_KbfxHoverButtonPath; + QString m_KbfxHoverButtonPathDefault; + QString m_KbfxPressedButtonPath; + QString m_KbfxPressedButtonPathDefault; + QString m_KbfxMouseOverAnimationPath; + QString m_KbfxMouseOverAnimationPathDefault; + QColor m_KbfxButtonColor; + QColor m_KbfxButtonColorDefault; + int m_KbfxButtonSize; + int m_KbfxButtonSizeDefault; + bool m_KbfxButtonGlow; + bool m_KbfxButtonGlowDefault; + bool m_KbfxButtonKikerResize; + bool m_KbfxButtonKikerResizeDefault; + QString m_KbfxMenuType; + QString m_KbfxMenuTypeDefault; + + /* spinx config items list */ + QString m_SpinxThemeBasePath; + QString m_SpinxThemeBasePathDefault; + QString m_UserSpinxThemeBasePath; + QString m_UserSpinxThemeBasePathDefault; + bool m_SpinxDudeBlink; + bool m_SpinxDudeBlinkDefault; + QString m_SpinxDudeImage; + QString m_SpinxDudeImageDefault; + QString m_SpinxThemeName; + QString m_SpinxThemeNameDefault; + bool m_ToolBarResize; + bool m_ToolBarResizeDefault; + bool m_KbfxWatcher; + bool m_KbfxWatcherDefault; + bool m_KbfxShowOldThemes; + bool m_KbfxShowOldThemesDefault; + + + /* tooltip options list */ + bool m_ToolTipAnimation; + bool m_ToolTipAnimationDefault; + bool m_ToolTip; + bool m_ToolTipDefault; + QString m_ToolTipText; + QString m_ToolTipTextDefault; + QString m_ToolTipAvatar; + QString m_ToolTipAvatarDefault; + QString m_SpinxTooltipDudebox; + QString m_SpinxTooltipDudeboxDefault; + QString m_SpinxTooltipMask; + QString m_SpinxTooltipMaskDefault; + QString m_SpinxTooltipWindow; + QString m_SpinxTooltipWindowDefault; + QString m_SpinxTooltipLogo; + QString m_SpinxTooltipLogoDefault; + + QString m_KbfxHistory; + QString m_KbfxHistoryDefault; + + /* font settings */ + QColor m_fontTooltipColor; + QColor m_fontTooltipColorDefault; + QFont m_fontTooltipFont; + QFont m_fontTooltipFontDefault; + QColor m_fontAppNameColor; + QColor m_fontAppNameColorDefault; + QFont m_fontAppNameFont; + QFont m_fontAppNameFontDefault; + QColor m_fontAppCommentColor; + QColor m_fontAppCommentColorDefault; + QFont m_fontAppCommentFont; + QFont m_fontAppCommentFontDefault; + QColor m_lineColor; + QColor m_lineColorDefault; + QColor m_fontIndexColor; + QColor m_fontIndexColorDefault; + QFont m_fontIndexFont; + QFont m_fontIndexFontDefault; + QColor m_userImageColor; + QColor m_userImageColorDefault; + QColor m_userNameColor; + QColor m_userNameColorDefault; + QFont m_userNameFont; + QFont m_userNameFontDefault; + QColor m_sepNameColor; + QColor m_sepNameColorDefault; + QFont m_sepNameFont; + QFont m_sepNameFontDefault; + QColor m_pluginNameColor; + QColor m_pluginNameColorDefault; + QFont m_pluginNameFont; + QFont m_pluginNameFontDefault; + bool m_fontHoverBold; + bool m_fontHoverBoldDefault; + + /* history */ + QStringList m_pluginsLeft; + QStringList m_pluginsLeftDefault; + QStringList m_pluginsRight; + QStringList m_pluginsRightDefault; + + /* layout */ + int m_facePos_x; + int m_facePos_xDefault; + int m_facePos_y; + int m_facePos_yDefault; + int m_userNamePos_x; + int m_userNamePos_xDefault; + int m_userNamePos_y; + int m_userNamePos_yDefault; + bool m_faceBoxHideText; + bool m_faceBoxHideTextDefault; + int m_userMenuHeight; + int m_userMenuHeightDefault; + int m_userMenuWidth; + int m_userMenuWidthDefault; + + int m_topBar_x; + int m_topBar_xDefault; + int m_topBar_y; + int m_topBar_yDefault; + int m_topBar_h; + int m_topBar_hDefault; + int m_topBar_w; + int m_topBar_wDefault; + + int m_botBar_x; + int m_botBar_xDefault; + int m_botBar_y; + int m_botBar_yDefault; + int m_botBar_h; + int m_botBar_hDefault; + int m_botBar_w; + int m_botBar_wDefault; + + int m_scrollBarTopX; + int m_scrollBarTopXDefault; + int m_scrollBarTopY; + int m_scrollBarTopYDefault; + int m_scrollBarBotX; + int m_scrollBarBotXDefault; + int m_scrollBarBotY; + int m_scrollBarBotYDefault; + + int m_listBox_x; + int m_listBox_xDefault; + int m_listBox_y; + int m_listBox_yDefault; + int m_listBox_w; + int m_listBox_wDefault; + int m_listBox_h; + int m_listBox_hDefault; + + int m_searchBox_x; + int m_searchBox_xDefault; + int m_searchBox_y; + int m_searchBox_yDefault; + int m_searchBox_w; + int m_searchBox_wDefault; + int m_searchBox_h; + int m_searchBox_hDefault; + bool m_searchBox_static; + bool m_searchBox_staticDefault; + + int m_itemView_x; + int m_itemView_xDefault; + int m_itemView_y; + int m_itemView_yDefault; + int m_itemView_h; + int m_itemView_hDefault; + int m_itemView_w; + int m_itemView_wDefault; + + int m_fadeTime; + int m_fadeTimeDefault; + + /* toolbar */ + int m_toolBarButtonNormalSizeDefault; + int m_toolBarButtonNormalSize; + int m_toolBarButtonExpandSizeDefault; + int m_toolBarButtonExpandSize; + + /* Face Icon */ + int m_faceIconX; + int m_faceIconXDefault; + int m_faceIconY; + int m_faceIconYDefault; + int m_faceIconH; + int m_faceIconHDefault; + int m_faceIconW; + int m_faceIconWDefault; + + /* element controll */ + int m_iconSize; + int m_iconSizeDefault; + bool m_noComments; + bool m_noCommentsDefault; + int m_commentMargine; + int m_commentMargineDefault; + /* states */ + bool m_startHidden; + bool m_startHiddenDefault; + + bool m_KbfxDeleteOldConf; + + private: + KbfxConfig(); + KbfxConfig ( const KbfxConfig& ); + + friend KbfxConfig& ConfigInit(); +}; + +KbfxConfig & ConfigInit(); + +#endif + diff --git a/kbfxlib/common/kbfxfontchooser.cpp b/kbfxlib/common/kbfxfontchooser.cpp new file mode 100644 index 0000000..c05a81e --- /dev/null +++ b/kbfxlib/common/kbfxfontchooser.cpp @@ -0,0 +1,79 @@ +//************************************************************************** +// Copyright (C) 2004, 2005 by Petri Damstn +// petri.damsten@iki.fi +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +//************************************************************************** + +#include "kbfxfontchooser.h" + +KBFXFontChooser::KBFXFontChooser ( QWidget *parent, const char *name ) + : QWidget ( parent, name ) +{ + QHBoxLayout* layout = new QHBoxLayout ( this, 0, KDialog::spacingHint() ); + + m_label = new QLabel ( this, "fontLabel" ); + m_label->setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Fixed, TRUE); +// m_label->setFrameShape ( QFrame::StyledPanel ); +// m_label->setFrameShadow ( QFrame::Sunken ); + + layout->addWidget ( m_label ); + + m_button = new QPushButton ( this, "fontButton" ); + m_label->setMaximumHeight ( m_button -> height() ); + m_label->setMinimumHeight ( m_button -> height() ); + QString fontText = i18n ( "Font..." ); +// m_button->setSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Minimum, TRUE); + m_button->setText ( fontText ); + QIconSet iconSet = SmallIconSet ( QString::fromLatin1 ( "fonts" ) ); + QPixmap pixmap = iconSet.pixmap ( QIconSet::Small, QIconSet::Normal ); + m_button->setIconSet ( iconSet ); + m_button->setFixedWidth ( m_button->fontMetrics().width ( fontText ) + + 3 * KDialog::spacingHint() + pixmap.width() ); + layout->addWidget ( m_button ); + + connect ( m_button, SIGNAL ( clicked() ), this, SLOT ( buttonClicked() ) ); + + updateFontLabel(); + + setFocusProxy ( m_button ); +} + +KBFXFontChooser::~KBFXFontChooser() +{} + +void KBFXFontChooser::setFont ( const QFont& font ) +{ + m_font = font; + updateFontLabel(); +} + +void KBFXFontChooser::updateFontLabel() +{ + QString s = QString ( "%1 (%2pt) " ).arg ( m_font.family() ).arg ( m_font.pointSize() ); + m_label->setFont ( m_font ); + m_label->setText ( s ); + m_label->setAlignment ( Qt::AlignLeft | Qt::AlignVCenter ); + emit FontChanged(); +} + +void KBFXFontChooser::buttonClicked() +{ + KFontDialog::getFont ( m_font ); + updateFontLabel(); +} + +#include "kbfxfontchooser.moc" diff --git a/kbfxlib/common/kbfxfontchooser.h b/kbfxlib/common/kbfxfontchooser.h new file mode 100644 index 0000000..639a674 --- /dev/null +++ b/kbfxlib/common/kbfxfontchooser.h @@ -0,0 +1,70 @@ +//************************************************************************** +// Copyright (C) 2004, 2005 by Petri Damstn +// petri.damsten@iki.fi +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +//************************************************************************** +#ifndef KBFX_FONT_CHOOSER_H +#define KBFX_FONT_CHOOSER_H + +#include <kdialog.h> +#include <kfontdialog.h> +#include <klocale.h> +#include <kiconloader.h> +#include <qwidget.h> +#include <qlabel.h> +#include <qpushbutton.h> +#include <qlayout.h> +#include <qfont.h> +#include <qsizepolicy.h> + +class QLabel; +class QPushButton; +class QFont; + +/** + @author Petri Damsten <petri.damsten@iki.fi> +*/ + +class KBFXFontChooser : public QWidget +{ + Q_OBJECT + Q_PROPERTY ( QFont font READ font WRITE setFont ) + public: + KBFXFontChooser ( QWidget *parent = 0, const char *name = 0 ); + ~KBFXFontChooser(); + + QFont font() const { return m_font; }; + + public slots: + void setFont ( const QFont& font ); + + protected: + void updateFontLabel(); + + protected slots: + void buttonClicked(); + + private: + QFont m_font; + QLabel* m_label; + QPushButton* m_button; + + signals: + void FontChanged(); +}; + +#endif diff --git a/kbfxlib/common/kbfxkiodownload.cpp b/kbfxlib/common/kbfxkiodownload.cpp new file mode 100644 index 0000000..ff6dccc --- /dev/null +++ b/kbfxlib/common/kbfxkiodownload.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxkiodownload.h" + +KbfxKioDownload::KbfxKioDownload ( QObject *parent, const char *name ) + : QObject ( parent, name ) +{ + m_KbfxBrowserError = 0; + m_KbfxBrowserErrorText = "No error"; + m_KbfxBrowserTmpFile = tmpF.name(); + + kdDebug() << "Created temp file for download transfer: " + << m_KbfxBrowserTmpFile + << endl; +} + +KbfxKioDownload::~KbfxKioDownload() +{} + +void KbfxKioDownload::KbfxKioDownloadStart ( QString &url ) +{ + KIO::Job *download_job = KIO::file_copy ( KURL ( url ), + KURL ( m_KbfxBrowserTmpFile ), + -1, + TRUE ); + connect ( download_job, SIGNAL ( result ( KIO::Job* ) ), + this, SLOT ( KbfxBrowserResult ( KIO::Job * ) ) ); +} + +void KbfxKioDownload::KbfxBrowserResult ( KIO::Job *download_job ) +{ + m_KbfxBrowserError = download_job->error(); + + if ( m_KbfxBrowserError ) + { + KbfxKioDownloadEnd(); + m_KbfxBrowserErrorText = download_job->errorString(); + } + else m_KbfxBrowserErrorText = "No error"; + + kdDebug() << "Download transfer error: " + << m_KbfxBrowserError + << " - " + << m_KbfxBrowserErrorText + << endl; + + emit KbfxKioDownloadReady(); +} + +void KbfxKioDownload::KbfxKioDownloadEnd() +{ + kdDebug() << "Deleting temp file for download transfer: " + << tmpF.name() + <<endl; + + tmpF.unlink(); + deleteLater(); +} +#include "kbfxkiodownload.moc" diff --git a/kbfxlib/common/kbfxkiodownload.h b/kbfxlib/common/kbfxkiodownload.h new file mode 100644 index 0000000..61efb91 --- /dev/null +++ b/kbfxlib/common/kbfxkiodownload.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_KIO_DOWNLOAD_H +#define KBFX_KIO_DOWNLOAD_H + +#include <kio/job.h> +#include <ktempfile.h> +#include <kdebug.h> + +/** + * @author PhobosK <phobosk@mail.kbfx.org> + */ +class KbfxKioDownload : public QObject +{ + Q_OBJECT + + public: + KbfxKioDownload ( QObject * parent = 0, const char * name = 0 ); + ~KbfxKioDownload(); + + /* KbfxKioDownload invocation - pass an url as QString */ + void KbfxKioDownloadStart ( QString &url ); + + /* return temp file name for the download */ + QString KbfxBrowserTmpFile() {return m_KbfxBrowserTmpFile;} + + /* return error number occured during download + * see definition in global.h + */ + int KbfxBrowserError() {return m_KbfxBrowserError;} + + /* return error text occured during download */ + QString KbfxBrowserErrorText() {return m_KbfxBrowserErrorText;} + + protected: + QString m_KbfxBrowserTmpFile; + int m_KbfxBrowserError; + QString m_KbfxBrowserErrorText; + + private: + KTempFile tmpF; + + public slots: + /* call when you are ready to delete the temp file for the download */ + virtual void KbfxKioDownloadEnd(); + + private slots: + /* current job is done here */ + virtual void KbfxBrowserResult ( KIO::Job * ); + + signals: + /* emitted when the download is ready */ + void KbfxKioDownloadReady(); +}; + +#endif diff --git a/kbfxlib/common/kbfxpixmaplabel.cpp b/kbfxlib/common/kbfxpixmaplabel.cpp new file mode 100644 index 0000000..a85627e --- /dev/null +++ b/kbfxlib/common/kbfxpixmaplabel.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxpixmaplabel.h" + +KbfxPixmapLabel::KbfxPixmapLabel ( QWidget *parent, const char *name, WFlags fl ) + : QLabel ( parent, name, fl ) +{ + // setFrameShape(QLabel::WinPanel); + // setFrameShadow(QLabel::Sunken); + setFrameShape ( QLabel::LineEditPanel ); + setFrameShadow ( QLabel::Plain ); + setScaledContents ( FALSE ); + setAlignment ( int ( QLabel::WordBreak | QLabel::AlignCenter ) ); + setMouseTracking ( TRUE ); +} + +KbfxPixmapLabel::~KbfxPixmapLabel() +{ +} + +/* normalize label */ +void KbfxPixmapLabel::normalize () +{ + setFrameShape ( QLabel::NoFrame ); + setFrameShadow ( QLabel::Plain ); + setScaledContents ( FALSE ); + setAlignment ( int ( QLabel::WordBreak | QLabel::AlignCenter ) ); +} + +/* processing drag events over label */ +void KbfxPixmapLabel::dragEnterEvent ( QDragEnterEvent *mouseDragEnterEvent ) +{ + kdDebug() << "Accepting drag..." << endl; + mouseDragEnterEvent->accept ( QTextDrag::canDecode ( mouseDragEnterEvent ) ); +} + +/* processing drop events over label */ +void KbfxPixmapLabel::dropEvent ( QDropEvent *mouseDropEvent ) +{ + QString text; + + if ( QTextDrag::decode ( mouseDropEvent,text ) ) + { + if ( text.startsWith ( "file://" ) ) text.remove ( "file://" ); + + kdDebug() << "Dropping drag..." << text << endl; + + emit targetDrop ( text ); + } +} + +/* processing mouse click events over label */ +void KbfxPixmapLabel::mousePressEvent ( QMouseEvent * e ) +{ + e->accept(); + ButtonState _btn = e->button(); + kdDebug() << "Mouse Clicked: " << _btn << endl; + emit clicked(); + emit mouseClicked (); + emit mouseClicked ( _btn ); +} + +/* processing mouse double click events over label */ +void KbfxPixmapLabel::mouseDoubleClickEvent ( QMouseEvent * e ) +{ + e->accept(); + ButtonState _btn = e->button(); + kdDebug() << "Mouse Double Clicked: " << _btn << endl; + emit mouseDoubleClicked (); + emit mouseDoubleClicked ( _btn ); +} + +#include "kbfxpixmaplabel.moc" diff --git a/kbfxlib/common/kbfxpixmaplabel.h b/kbfxlib/common/kbfxpixmaplabel.h new file mode 100644 index 0000000..1e20b99 --- /dev/null +++ b/kbfxlib/common/kbfxpixmaplabel.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PIXMAP_LABEL_H +#define KBFX_PIXMAP_LABEL_H + +#include <qlabel.h> +#include <kdebug.h> +#include <qdragobject.h> +#include <qtooltip.h> + +class KbfxPixmapLabel : public QLabel +{ + Q_OBJECT + + public: + KbfxPixmapLabel ( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); + ~KbfxPixmapLabel (); + + void dragEnterEvent ( QDragEnterEvent *mouseDragEnterEvent ); + void dropEvent ( QDropEvent *mouseDropEvent ); + void mousePressEvent ( QMouseEvent * e ); + void mouseDoubleClickEvent ( QMouseEvent * e ); + void normalize (); + + signals: + void targetDrop ( const QString & ); + void clicked(); + void mouseClicked (); + void mouseClicked ( const ButtonState & ); + void mouseDoubleClicked (); + void mouseDoubleClicked ( const ButtonState & ); +}; + +#endif // KBFX_PIXMAP_LABEL_H diff --git a/kbfxlib/common/kbfxplasmapixmapprovider.cpp b/kbfxlib/common/kbfxplasmapixmapprovider.cpp new file mode 100644 index 0000000..e505c62 --- /dev/null +++ b/kbfxlib/common/kbfxplasmapixmapprovider.cpp @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmapixmapprovider.h" + +int +KbfxPlasmaPixmapProvider::addPixmap ( QString pixmapname ) +{ + QString lFileName = PixmapPath( pixmapname ); + QPixmap * lPixmapPtr = 0; + + if ( ( lPixmapPtr = QPixmapCache::find ( pixmapname ) ) == NULL ) + { + lPixmapPtr = new QPixmap ( lFileName ); + QPixmapCache::insert ( pixmapname,lPixmapPtr ); + return ( lPixmapPtr->height() *lPixmapPtr->width() *lPixmapPtr->depth() ) /8; + } + return 0; +} + +QString +KbfxPlasmaPixmapProvider::PixmapPath ( QString pixmapName ) +{ + QString lFileName = ConfigInit ().m_SpinxThemeBasePath + ConfigInit ().m_SpinxThemeName + "/" + pixmapName + ".png"; + + if ( QPixmap::QPixmap ( lFileName ).isNull() ) + lFileName = locate ( "data", "kbfx/skins/default/" + pixmapName + ".png" ); + + return lFileName; +} + +QString +KbfxPlasmaPixmapProvider::PixmapPath ( QString pixmapName, QString themePath, QString themeName ) +{ + QString lFileName = themePath + themeName + "/" + pixmapName + ".png"; + + if ( QPixmap::QPixmap ( lFileName ).isNull() ) + lFileName = locate ( "data", "kbfx/skins/default/" + pixmapName + ".png" ); + + return lFileName; +} + +bool +KbfxPlasmaPixmapProvider::PixmapPathCheck ( QString pixmapPath ) +{ + if ( QPixmap::QPixmap ( pixmapPath ).isNull() ) + return FALSE; + + return TRUE; +} + +void +KbfxPlasmaPixmapProvider::deletePixmap ( const QString & key ) +{ + QPixmapCache::remove ( key ); +} + +void +KbfxPlasmaPixmapProvider::rebuildCache() +{ + QPixmapCache::clear (); + buildCache(); +} + +void KbfxPlasmaPixmapProvider::buildCache() +{ +//m_skinElements.append("topbg"); + QPixmapCache::setCacheLimit ( 1024*5 ); + static QStringList m_skinElements; + m_skinElements + <<"appfind" + <<"bg" + <<"botbg" + <<"butterfly" + <<"dudebox" + <<"find" + <<"hover" + <<"indexseparator" + <<"listboxbg" + <<"lock" + <<"lockhover" + <<"logout" + <<"logouthover" + <<"mask" + <<"menu_top" + <<"menu_top_image_person" + <<"middleboxbg" + <<"normal" + <<"off" + <<"on" + <<"pressed" + <<"preview" + <<"rhshovertile" + <<"rhstile" + <<"scrollnormal" + <<"separator" + <<"tabbg" + <<"tilehover" + <<"tilenormal" + <<"topbg" + <<"appviewbg" + ; + + for ( QStringList::Iterator it = m_skinElements.begin(); it != m_skinElements.end(); ++it ) + { + QPixmapCache::setCacheLimit ( KbfxPlasmaPixmapProvider::addPixmap ( *it ) +QPixmapCache::cacheLimit() ); + } + + +} + +QPixmap * +KbfxPlasmaPixmapProvider::pixmap ( const QString & key ) +{ + QPixmap* pp; + QPixmap p; + if ( ( pp=QPixmapCache::find ( key ) ) ) + { + return pp; + } + else + { + addPixmap ( key ); + return pixmap ( key ); + } + +} + diff --git a/kbfxlib/common/kbfxplasmapixmapprovider.h b/kbfxlib/common/kbfxplasmapixmapprovider.h new file mode 100644 index 0000000..00fd5b4 --- /dev/null +++ b/kbfxlib/common/kbfxplasmapixmapprovider.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_PIXMAP_PROVIDER_H +#define KBFX_PLASMA_PIXMAP_PROVIDER_H + + +#include <qfileinfo.h> +#include <qpixmapcache.h> +#include <qpixmap.h> +#include <qstring.h> +#include <qstringlist.h> + +#include <kbfxconfig.h> + +class KbfxPlasmaPixmapProvider +{ + + public: + + KbfxPlasmaPixmapProvider() + {} + ~KbfxPlasmaPixmapProvider() {} + + static int addPixmap ( QString ); + static void deletePixmap ( const QString & ); + static void rebuildCache(); + static void buildCache(); + static QPixmap* pixmap ( const QString & ); + static QString PixmapPath ( QString, QString, QString ); + static QString PixmapPath ( QString ); + static bool PixmapPathCheck ( QString ); +}; + +#endif diff --git a/kbfxlib/common/kbfxpushbutton.cpp b/kbfxlib/common/kbfxpushbutton.cpp new file mode 100644 index 0000000..e971993 --- /dev/null +++ b/kbfxlib/common/kbfxpushbutton.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxpushbutton.h" + +KbfxPushButton::KbfxPushButton ( QWidget *parent, const char *name ) + : KPushButton ( parent, name ) +{ + setText ( "P R E V I E W" ); + setToggleButton ( TRUE ); + setFocusPolicy ( QWidget::NoFocus ); +} + +KbfxPushButton::~KbfxPushButton() +{ +} + +/* process hover events */ +void KbfxPushButton::enterEvent ( QEvent * ) +{ + if ( this->state() == 0 ) this->setPixmap ( ConfigInit().m_KbfxHoverButtonPath ); +} + +void KbfxPushButton::leaveEvent ( QEvent * ) +{ + if ( this->state() == 2 ) this->setPixmap ( ConfigInit().m_KbfxPressedButtonPath ); + if ( this->state() == 0 ) this->setPixmap ( ConfigInit().m_KbfxNormalButtonPath ); +} + +#include "kbfxpushbutton.moc" diff --git a/kbfxlib/common/kbfxpushbutton.h b/kbfxlib/common/kbfxpushbutton.h new file mode 100644 index 0000000..3d90bf7 --- /dev/null +++ b/kbfxlib/common/kbfxpushbutton.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PUSH_BUTTON_H +#define KBFX_PUSH_BUTTON_H + +#include <kpushbutton.h> + +#include "kbfxconfig.h" + +class KbfxPushButton: public KPushButton +{ + Q_OBJECT + + public: + KbfxPushButton ( QWidget *parent = 0, const char *name = 0 ); + ~KbfxPushButton(); + + void enterEvent ( QEvent * ); + void leaveEvent ( QEvent * ); +}; + +#endif // KBFX_PUSH_BUTTON_H diff --git a/kbfxlib/common/kbfxthemesdata.cpp b/kbfxlib/common/kbfxthemesdata.cpp new file mode 100644 index 0000000..2ebaa10 --- /dev/null +++ b/kbfxlib/common/kbfxthemesdata.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxthemesdata.h" + +KbfxThemesData::KbfxThemesData() +{} + +KbfxThemesData::~KbfxThemesData() +{ + m_themesMap.clear(); +} + +ThemesMap KbfxThemesData::setThemeList ( QString path ) +{ + QString m_KbfxThemesVersion = ConfigInit().m_KbfxThemesVersion; + bool m_KbfxShowOldThemes = ConfigInit().m_KbfxShowOldThemes; + QFileInfo *fi=0, *f=0; + + m_themesMap.clear(); + + KStandardDirs *tmp = new KStandardDirs(); + + /* search themes in KDE Resource Folders and append user selected folder */ + QStringList skinsFolders = tmp->findDirs ( "data", "kbfx/skins" ); + if ( tmp->exists ( path ) ) + { + skinsFolders.append ( path ); + } + else + { + kdDebug() << "KbfxThemesData: Path doesn't exist! :" << path << endl; + } + + for ( QStringList::Iterator skinsIt = skinsFolders.begin(); skinsIt != skinsFolders.end(); ++skinsIt ) + { + QDir d ( *skinsIt ); + d.setFilter ( QDir::Dirs ); + + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it ( *list ); + + while ( ( fi = it.current() ) != 0 ) + { + if ( !fi->fileName().startsWith ( "." ) ) + { + f = new QFileInfo ( d, fi->fileName() + "/" + m_KbfxThemesVersion ); + if ( m_KbfxShowOldThemes ) + { + m_themesMap[fi->fileName() ] = ( fi->dirPath ( TRUE ) ).append ( "/" ); + } + else + { + if ( f->exists () ) + m_themesMap[fi->fileName() ] = ( fi->dirPath ( TRUE ) ).append ( "/" ); + } + } + ++it; + } + } + + /* kdDebug() << "Available Themes - " + * << m_themesMap.keys() + * << m_themesMap.values() + * << endl; + */ + + delete fi; + delete f; + delete tmp; + return m_themesMap; +} diff --git a/kbfxlib/common/kbfxthemesdata.h b/kbfxlib/common/kbfxthemesdata.h new file mode 100644 index 0000000..5dd0bf1 --- /dev/null +++ b/kbfxlib/common/kbfxthemesdata.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_THEMES_DATA_H +#define KBFX_THEMES_DATA_H + +#include <kdebug.h> +#include <qstringlist.h> +#include <kio/netaccess.h> +#include <kstandarddirs.h> +#include <qmap.h> +#include <qdir.h> +#include <qfileinfo.h> + +#include "kbfxconfig.h" + +typedef QMap<QString, QString> ThemesMap; + +/** + * @author PhobosK <phobosk@mail.kbfx.org> + */ +class KbfxThemesData +{ + public: + KbfxThemesData(); + ~KbfxThemesData(); + + ThemesMap setThemeList ( QString path ); + + private: + ThemesMap m_themesMap; +}; + +#endif diff --git a/kbfxlib/data/CMakeLists.txt b/kbfxlib/data/CMakeLists.txt new file mode 100644 index 0000000..676ef78 --- /dev/null +++ b/kbfxlib/data/CMakeLists.txt @@ -0,0 +1,48 @@ +SET(libkbfxdatasrc + kbfxdatagroup.cpp + kbfxdatagrouplist.cpp + kbfxdatasource.cpp + kbfxdatastack.cpp + kbfxplasmadataplugin.cpp + kbfxplasmapluginloader.cpp + kbfxplugin.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxdatasrc}) + + ADD_LIBRARY(kbfxdata SHARED ${libkbfxdatasrc}) + SET_TARGET_PROPERTIES(kbfxdata + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxdata PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxdata ${LIB_INSTALL_DIR}) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxdatasrc}) + + KDE4_ADD_LIBRARY(kbfxdata SHARED ${libkbfxdatasrc}) + TARGET_LINK_LIBRARIES(kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxdata ${LIB_INSTALL_DIR}) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxdata DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/data) diff --git a/kbfxlib/data/kbfxdatagroup.cpp b/kbfxlib/data/kbfxdatagroup.cpp new file mode 100644 index 0000000..5c097a6 --- /dev/null +++ b/kbfxlib/data/kbfxdatagroup.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxdatagroup.h" + +KbfxDataGroup::KbfxDataGroup() +{ + m_name = "Uknown Group"; + m_count = 0; +} + +KbfxDataGroup::~KbfxDataGroup() +{ + Data::Iterator it; + for ( it = m_data.begin();it!=m_data.end();++it ) + { + delete it.data(); + m_data.remove ( it ); + //delete *it; + } + m_data.clear(); +} + +KbfxDataSource::DataSourceList +KbfxDataGroup::lookup ( QString str ) +{ +//static KbfxDataGroup * _matching = new KbfxDataGroup(); + KbfxDataSource::DataSourceList _matching; + Data::Iterator it; + for ( it = m_data.begin();it!=m_data.end();++it ) + { + if ( ( *it )->lookup ( str ) == true ) + { + _matching.prepend ( * ( *it ) ); + } + } + + return _matching; +} + +void +KbfxDataGroup::addItem ( KbfxDataSource * item ) +{ + if ( item == 0 ) + return ; + m_data[item->name() ] = item; + m_index[m_count] = item; + m_count++; + +// qDebug("KbfxDataGroup.cpp::addItem("+item->name()+")"); +} + +KbfxDataSource* +KbfxDataGroup::itemAt(int index) +{ + if ( index < 0 || index > m_count) + return new KbfxDataSource(); + else + return m_index[index]; +} + + +KbfxDataSource * +KbfxDataGroup::getItem ( QString name ) +{ + return m_data[name]; +} + +KbfxDataGroup::Data +KbfxDataGroup::getData() +{ + return m_data; +} + diff --git a/kbfxlib/data/kbfxdatagroup.h b/kbfxlib/data/kbfxdatagroup.h new file mode 100644 index 0000000..7587502 --- /dev/null +++ b/kbfxlib/data/kbfxdatagroup.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_DATA_GROUP_H +#define KBFX_DATA_GROUP_H + +#include <qmap.h> +#include <qstringlist.h> +#include "kbfxdatasource.h" + +class KbfxDataGroup +{ + + public: + typedef QMap<QString,KbfxDataSource*> Data; + typedef QMap<int,KbfxDataSource*> Index; + + /** + * Construts a new data group and initialzes the group + * @return Constructs a new Datagroup + */ + KbfxDataGroup(); + /** + * De-allocates and frees the meomery when destroyed + * @return + */ + ~KbfxDataGroup(); + /** + * Adds a new DataSource to the Group + * null pointers and invalid datasources are handled + * internally no manal checking is needed + * @param item A pointer to a datasource valid or invalid + */ + void addItem ( KbfxDataSource * item ); + /** + * Sets a proper Name to the group. The default will be set to + * "Unknown Group" . it is recomended that a name is always set + * @param name The name that should be give to the group + */ + void setName ( QString name ) {m_name = name;} + /** + * To access a datasource give the name of the datasource + * @param The name othe datasource + * @return pointer to a valid datasource + */ + KbfxDataSource * getItem ( QString ); + /** + * use this to get all the items inside the datagroup + * @return a copy of the data Map (QMap<QString,KbfxDataSource*>) + */ + Data getData(); + /** + * searches and returns the list of matching datasources + * @param keyword to search for + * @return list of matching datasources + */ + KbfxDataSource::DataSourceList lookup ( QString ); + /** + * The name of the group + * @return Name of the group + */ + QString name() {return m_name;} + /** + * The number of datasources inside the datagroup + * @return number of datasources + */ + int count() {return m_count;} + /** + * + * + * + */ + KbfxDataSource * itemAt(int index); + + private: + Data m_data; + QString m_name; + int m_count; + Index m_index; +}; + +#endif diff --git a/kbfxlib/data/kbfxdatagrouplist.cpp b/kbfxlib/data/kbfxdatagrouplist.cpp new file mode 100644 index 0000000..5f89b5f --- /dev/null +++ b/kbfxlib/data/kbfxdatagrouplist.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxdatagrouplist.h" + +KbfxDataGroupList::KbfxDataGroupList() +{ + m_name="Unset"; + m_iconPath= ""; + m_count = 0; +//m_groupList.setAutoDelete(true); +} + +KbfxDataGroupList::~KbfxDataGroupList() +{ +} + +void +KbfxDataGroupList::addGroup ( KbfxDataGroup * group ) +{ + + + for ( int i =0; i < ( int ) m_groupList.count();i++ ) + { +// qDebug("Curent loop + "+m_groupList.at(i)->name()+"adding "+group->name()); + if ( m_groupList.at ( i ) == group ) + { + return ; + } + } +//above is to save from bad plugins + + m_groupList.append ( group ); + m_count++; +} + diff --git a/kbfxlib/data/kbfxdatagrouplist.h b/kbfxlib/data/kbfxdatagrouplist.h new file mode 100644 index 0000000..711b7af --- /dev/null +++ b/kbfxlib/data/kbfxdatagrouplist.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_DATA_GROUP_LIST_H +#define KBFX_DATA_GROUP_LIST_H + +#include <qptrlist.h> +#include "kbfxdatagroup.h" + +class KbfxDataGroupList +{ + public: + typedef QPtrList<KbfxDataGroup> GroupList; + KbfxDataGroupList(); + ~KbfxDataGroupList(); + //in + void addGroup ( KbfxDataGroup * group ); + void setName ( QString name ) { m_name = name;} + void setIcon ( QString path ) { m_iconPath = path;} + //out + QString name() {return m_name;} + GroupList getGroup() { return m_groupList;} + QString iconPath() { return m_iconPath;} + + int count() {return m_count;} + + private: + QString m_name; + QString m_iconPath; + GroupList m_groupList; + int m_count; +}; + +#endif diff --git a/kbfxlib/data/kbfxdatasource.cpp b/kbfxlib/data/kbfxdatasource.cpp new file mode 100644 index 0000000..8a44478 --- /dev/null +++ b/kbfxlib/data/kbfxdatasource.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxdatasource.h" +#include <kdesktopfile.h> +#include <kapplication.h> +#include <krun.h> + +KbfxDataSource::KbfxDataSource() +{ + m_type = NONDESKTOP; + m_keyWords=""; + m_command=""; + m_desktopPath="none"; + m_contentPath = "none"; +} + +KbfxDataSource::~KbfxDataSource() +{ +} + +bool +KbfxDataSource::lookup ( QString str ) +{ + if ( str.isNull() ) + return false; + + QString _searchStr = m_text+m_comment+m_description+m_keyWords; + + + if ( _searchStr.contains ( str,false ) > 0 ) + return true; + + return false; +} + +void +KbfxDataSource::loadDesktopFile() +{ + KDesktopFile * file = new KDesktopFile ( m_desktopPath ); + m_text = file->readName(); + m_comment= file->readComment(); + m_iconPath = file->readIcon(); + m_command = file->readEntry ( "Exec","none" ); + m_description = file->readGenericName () +file->readEntry ( "Categories","Application" ); + + setContentPath ( m_desktopPath ); + delete file; + +} + + +void +KbfxDataSource::exec() +{ + + if ( type() == KbfxDataSource::DESKTOP ) + { + QCString dcop; + int pid; + QString m_error; + KApplication::startServiceByDesktopPath ( desktopFile(), + QString::null, &m_error,&dcop,&pid,"",true ); + } + + else + { + KRun::runCommand ( m_command ); + } +} + diff --git a/kbfxlib/data/kbfxdatasource.h b/kbfxlib/data/kbfxdatasource.h new file mode 100644 index 0000000..aba89ad --- /dev/null +++ b/kbfxlib/data/kbfxdatasource.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_DATA_SOURCE_H +#define KBFX_DATA_SOURCE_H + +#include <qvaluelist.h> +#include <qstring.h> + +class KbfxDataSource +{ + + + public: + typedef enum + { DESKTOP = 0, NONDESKTOP } Type; + typedef QValueList < KbfxDataSource > DataSourceList; + /** + * Constructs a new DataSource. Data source is a simple class that holds + * a .desktop file and also you can include a custom commmand that can be + * exectuted + * @return a pointer to a new data source + */ + KbfxDataSource (); + virtual ~ KbfxDataSource (); + + /** + * Sets the name of a data source and should not be used if your dara is + * a desktop file use KbfxDataSource::setDesktopPath() functions instead + * @param name should be the name of the data source + */ + void setName ( QString name ) + { + m_text = name; + } + /** + * Sets the desktop file of for the data source. Note that u do not have to check + * parameters such as if the the desktop is kiosk allowed. the this function internally + * abstracts such functions. + * @param path should be the absolute path of a valid desktop file + */ + void setDesktopPath ( QString path ) + { + m_desktopPath = path; + m_type = DESKTOP; + loadDesktopFile (); + } + + virtual void setCommand ( QString cmd ) + { + m_command = cmd; + } + + + void setContentPath ( QString path ) + { + m_contentPath = path; + } + QString contentPath () + { + return m_contentPath; + } + + virtual void setType ( Type t ) + { + m_type = t; + } + + virtual void exec (); + + void setComment ( QString comment ) + { + m_comment = comment; + }; + + void setDescription ( QString desc ) + { + m_description = desc; + } + + void setIconPath ( QString path ) + { + m_iconPath = path; + } + + QString desktopFile () + { + return m_desktopPath; + } + //out + QString name () + { + return m_text; + } + QString icon () + { + return m_iconPath; + }; + QString command () + { + return m_command; + } + Type type () + { + return m_type; + } + /** + * Use this function to get the comment of the a data soruce. this + * functio will NOT return NULL so no checking needed + * @return the comment of the data source or empty string + */ + QString comment () + { + return m_comment; + } + bool lookup ( QString str ); + private: +//TODO +//MOve to private D + void loadDesktopFile (); + QString m_text; + QString m_desktopPath; + QString m_command; + QString m_iconPath; + QString m_comment; + QString m_description; + QString m_keyWords; + Type m_type; + QString m_contentPath; + + +}; +#endif diff --git a/kbfxlib/data/kbfxdatastack.cpp b/kbfxlib/data/kbfxdatastack.cpp new file mode 100644 index 0000000..2d84e02 --- /dev/null +++ b/kbfxlib/data/kbfxdatastack.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxdatastack.h" + +KbfxDataStack::KbfxDataStack() +{ + m_nameList.append ( "" ); + m_name = "Unset"; + m_count = 0; +} + +KbfxDataStack::~KbfxDataStack() +{ +//TODO: empty the list +} + +void +KbfxDataStack::addGroupList ( KbfxDataGroupList * list ) +{ + m_stack[list->name() ]=list; + m_nameList.append ( list->name() ); + m_dict[list->name() ]=m_count; + + KbfxPlasmaCanvasStackData stackinfo; + stackinfo.name = list->name(); + stackinfo.icon = list->iconPath(); + m_dataDict[m_count] = stackinfo; + + m_count++; + +} +QStringList +KbfxDataStack::getStackIndex() +{ + return m_nameList; +} + +KbfxDataGroupList * +KbfxDataStack::getStack ( QString name ) +{ + + + if ( m_nameList.contains ( name ) >0 ) + return m_stack[name]; + else + { + return NULL; + } +} + + +QString +KbfxDataStack::getSubGroupName ( uint id ) +{ + + Dict::Iterator it; + for ( it=m_dict.begin();it!=m_dict.end();++it ) + { + if ( it.data() == id ) + return it.key(); + + } + return QString ( "Empty" ); +} + diff --git a/kbfxlib/data/kbfxdatastack.h b/kbfxlib/data/kbfxdatastack.h new file mode 100644 index 0000000..6d65810 --- /dev/null +++ b/kbfxlib/data/kbfxdatastack.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_DATA_STACK_H +#define KBFX_DATA_STACK_H + +#include <qmap.h> +#include <qstring.h> +#include <qstringlist.h> +#include "kbfxdatagrouplist.h" +#include "kbfxplasmacanvasstackdata.h" //TODO:change the name here + +class KbfxDataStack +{ + + public: + typedef QMap<QString,KbfxDataGroupList*> StackMap; + typedef QMap<QString,uint> Dict; + typedef QMap<int,KbfxPlasmaCanvasStackData> DataDict; + + KbfxDataStack(); + ~KbfxDataStack(); + void setName ( QString name ) { m_name=name;} + void addGroupList ( KbfxDataGroupList * list ); + //out + KbfxDataGroupList * getGroupList ( QString name ); + QStringList getStackIndex(); + KbfxDataGroupList * getStack ( QString name ); + + Dict getDict() {return m_dict;} + DataDict getDataDict() { return m_dataDict;} + QString name() {return m_name;} + uint getIndex ( QString name ) { return m_dict[name];} + QString getSubGroupName ( uint id ); + int count() {return m_count;} + private: + StackMap m_stack; + QStringList m_nameList; + QString m_name; + Dict m_dict; + DataDict m_dataDict; + uint m_count; + +}; + +#endif diff --git a/kbfxlib/data/kbfxplasmadataplugin.cpp b/kbfxlib/data/kbfxplasmadataplugin.cpp new file mode 100644 index 0000000..d237d3a --- /dev/null +++ b/kbfxlib/data/kbfxplasmadataplugin.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmadataplugin.h" + +KbfxPlasmaCanvasStack * view() +{ + + return NULL; + +} diff --git a/kbfxlib/data/kbfxplasmadataplugin.h b/kbfxlib/data/kbfxplasmadataplugin.h new file mode 100644 index 0000000..82a812b --- /dev/null +++ b/kbfxlib/data/kbfxplasmadataplugin.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasstack.h" + + +extern "C" +{ + KbfxPlasmaCanvasStack * view(); +} + diff --git a/kbfxlib/data/kbfxplasmapluginloader.cpp b/kbfxlib/data/kbfxplasmapluginloader.cpp new file mode 100644 index 0000000..ebc992a --- /dev/null +++ b/kbfxlib/data/kbfxplasmapluginloader.cpp @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> + +#include "kbfxplasmapluginloader.h" +#include <qdir.h> +#include <qfileinfo.h> +#include <kstandarddirs.h> +#include <kdebug.h> + +KbfxPlasmaPluginLoader::KbfxPlasmaPluginLoader() +{ + m_plugin = 0; + init(); + +} + + +void +KbfxPlasmaPluginLoader::init() +{ + + QString libprefix = locate ( "lib","libkbfxdata.so" ); + libprefix.remove ( "libkbfxdata.so" ); +// QString libprefix = KBFX_LIB_INSTALL_DIR ; + kdDebug() << "KBFX plugins lib is: " << libprefix << endl; + QDir * _dir = new QDir ( libprefix+"/kbfx/plugins/" ); + QStringList plugins; + _dir->setFilter ( QDir::Files ); + _dir->setNameFilter ( "*.so" ); + if ( !_dir->exists() ) + { + kdDebug() << "Invalid Plugin Prefix: " << libprefix << "/kbfx/plugins/" << endl; + delete _dir; + return ;//QStringList("No Plugins found: Error in default Paths.Contact Package Manager"); + } + + const QFileInfoList *list = _dir->entryInfoList(); + QFileInfoListIterator it ( *list ); + QFileInfo *fi=0; + int _index =0; + while ( ( fi = it.current() ) != 0 ) + { + QString * path = new QString ( libprefix+"/kbfx/plugins/"+fi->fileName() ); + QLibrary * _l = new QLibrary ( *path ); + + typedef QString ( *getName ) (); + getName nameFunc; + nameFunc = ( getName ) _l->resolve ( "name" ); + if ( nameFunc ) + { + pluginMap() [nameFunc() ] = new KbfxPlugin ( nameFunc(),*path,_index++ ); + } + ++it; + _l->unload(); + delete _l; + delete path; + } + + delete _dir; +} + + +KbfxPlasmaPluginLoader::~KbfxPlasmaPluginLoader() +{ + // if(m_plugin!=0) +// delete m_plugin; + + // PluginMap::Iterator it; + // for ( it = pluginMap().begin(); it != pluginMap().end(); ++it ) { + // delete it.data(); + // pluginMap().remove(it); + // } + + +} + +KbfxDataStack * +KbfxPlasmaPluginLoader::getView ( QString name ) +{ + PluginMap::Iterator it; + for ( it = pluginMap().begin(); it != pluginMap().end(); ++it ) + { + pluginMap().remove ( it ); + } + init(); + KbfxDataStack * stack = pluginMap() [name]->data(); + + if (stack == 0 ) { + return new KbfxDataStack(); + } + + return stack; +} + +KbfxDataGroup * +KbfxPlasmaPluginLoader::search ( QString pname,QString keyword ) +{ + if ( pname == NULL ) + return NULL; + + KbfxDataGroup * group = pluginMap() [pname]->search ( keyword ); + if ( group == NULL ) + { + kdDebug() << "KbfxPlasmaaPluginLoader:109:Null pointer" << endl; + return NULL; + } + + return group; + +} + + +KbfxPlasmaPluginLoader::PluginMap& +KbfxPlasmaPluginLoader::pluginMap() +{ + static PluginMap * map = 0; + if ( !map ) + map = new PluginMap(); + return *map; +} + + + + +QStringList +KbfxPlasmaPluginLoader::scanPlugins() +{ + + init(); + QStringList plugins; + PluginMap::Iterator it; + + for ( it = pluginMap().begin(); it != pluginMap().end();++it ) + { + if ( it.data()->status() == false ) + plugins.append ( it.data()->name() ); + } + return plugins; +} + +#include "kbfxplasmapluginloader.moc" diff --git a/kbfxlib/data/kbfxplasmapluginloader.h b/kbfxlib/data/kbfxplasmapluginloader.h new file mode 100644 index 0000000..2ae2f54 --- /dev/null +++ b/kbfxlib/data/kbfxplasmapluginloader.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_PLUGIN_LOADER_H +#define KBFX_PLASMA_PLUGIN_LOADER_H + +#include <qlibrary.h> +#include "kbfxplasmacanvasstack.h" +#include "kbfxdatastack.h" +#include "kbfxplugin.h" +#include <qcanvas.h> + +class KbfxPlasmaPluginLoader:public QObject +{ + Q_OBJECT + + public: + typedef QMap<QString,KbfxPlugin*> PluginMap; + + /** + * + * @return + */ + KbfxPlasmaPluginLoader(); + /** + * + * @return + */ + ~KbfxPlasmaPluginLoader(); + /** + * + * @param name + * @return + */ + KbfxDataStack * getView ( QString name ); + /* + look for all installed Plugins. returns a list of installed plugins + */ + static QStringList scanPlugins(); + + /** + * Calls the search function of a given plugin and returns the result + * @param pluginName The name of the plugin to call + * @param keyword the keyword to pass to the plugin + * @return a valid KbfxDataGroup or -1 + */ + static KbfxDataGroup * search ( QString pluginName,QString keyword ); + + protected: + static void init(); + + private: + + QLibrary * m_plugin; + static PluginMap& pluginMap(); + QString m_prefix; + + +}; + +#endif diff --git a/kbfxlib/data/kbfxplugin.cpp b/kbfxlib/data/kbfxplugin.cpp new file mode 100644 index 0000000..ae53d67 --- /dev/null +++ b/kbfxlib/data/kbfxplugin.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplugin.h" + +KbfxPlugin::KbfxPlugin ( QString name,QString lib,uint id ) +{ + m_name = name; + m_libName = lib; + m_id = id; + m_loaded = false; +} + +KbfxPlugin::KbfxPlugin() +{ +} + +KbfxPlugin::~KbfxPlugin() +{ +// delete [] m_name; +// delete [] m_libName; +} + +QString +KbfxPlugin::name() +{ + return m_name; +} + +QString +KbfxPlugin::libName() +{ + return m_libName; +} + +uint +KbfxPlugin::id() +{ + return m_id; +} + +bool +KbfxPlugin::status() +{ + return m_loaded; +} + +KbfxDataStack * +KbfxPlugin::data() +{ + typedef KbfxDataStack * ( *KbfxPluginView ) (); + KbfxDataStack * m_stack =0; + KbfxPluginView m_hook; + QLibrary * m_plugin = new QLibrary ( m_libName ); + + if ( m_plugin == NULL ) + return new KbfxDataStack(); + + m_hook = ( KbfxPluginView ) m_plugin->resolve ( "view" ); + m_stack = m_hook(); + m_plugin->unload(); + delete m_plugin; + + if ( m_stack != NULL ) + return m_stack; + else + return new KbfxDataStack(); +} + +KbfxDataGroup * +KbfxPlugin::search ( QString keyword ) +{ + if ( keyword == 0 ) + return NULL;//new KbfxDataGroup(); + + if ( keyword.isNull() ) + return NULL;//KbfxDataGroup(); + + + typedef KbfxDataGroup * ( *KbfxPluginSearch ) ( QString key ); + KbfxDataGroup * m_group =0; + KbfxPluginSearch m_hook; + QLibrary * m_plugin = new QLibrary ( m_libName ); + m_hook = ( KbfxPluginSearch ) m_plugin->resolve ( "search" ); + m_group = m_hook ( keyword ); + m_plugin->unload(); + delete m_plugin; + if ( m_group != NULL ) + { + // qDebug("KbfxPlugin():search():103:return Valid Group "+m_group->name()); + return m_group; + } + else return NULL; +} + + +#include "kbfxplugin.moc" diff --git a/kbfxlib/data/kbfxplugin.h b/kbfxlib/data/kbfxplugin.h new file mode 100644 index 0000000..5868d14 --- /dev/null +++ b/kbfxlib/data/kbfxplugin.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLUGIN_H +#define KBFX_PLUGIN_H +//#include "kbfxplasmacanvasstack.h" +#include "kbfxdatastack.h" +#include <qobject.h> +#include <qstring.h> +#include <qlibrary.h> +/** +This class reprecentes a plugin +written for kbfx menu this +will be passed between the life time +of the menu +**/ + + +class KbfxPlugin:public QObject +{ + + Q_OBJECT + public: + + KbfxPlugin(); + KbfxPlugin ( QString Name,QString lib,uint id ); + ~KbfxPlugin(); + + void setStatus ( bool ); + + QString name(); + QString libName(); + uint id(); + bool status(); +// KbfxPlasmaCanvasStack * data(); + KbfxDataStack * data(); + KbfxDataGroup * search ( QString keyword ); + +// KbfxDataStack * data(); + + public slots: + void reload() {} + signals: + void loadComplete(); + + private: + QString m_name; + QString m_libName; + uint m_id; +// KbfxPlasmaCanvasStack * m_data; + KbfxDataStack m_data_R; +// QCanvas * m_canvas; + bool m_loaded; +}; + +#endif diff --git a/patches/001.patch b/patches/001.patch new file mode 100644 index 0000000..d07d523 --- /dev/null +++ b/patches/001.patch @@ -0,0 +1,14 @@ +--- kbfx-0.4.9.3-20070117.orig/CMakeLists.txt 2007-01-17 23:31:10.000000000 +0800 ++++ kbfx-0.4.9.3-20070117/CMakeLists.txt 2007-01-18 23:30:43.000000000 +0800 +@@ -8,7 +8,10 @@ + # Release (CMAKE_C_FLAGS_RELEASE or CMAKE_CXX_FLAGS_RELEASE) + # RelWithDebInfo (CMAKE_C_FLAGS_RELWITHDEBINFO or CMAKE_CXX_FLAGS_RELWITHDEBINFO + # MinSizeRel (CMAKE_C_FLAGS_MINSIZEREL or CMAKE_CXX_FLAGS_MINSIZEREL) +-SET(CMAKE_BUILD_TYPE RelWithDebInfo) ++if (NOT CMAKE_BUILD_TYPE) ++ SET(CMAKE_BUILD_TYPE RelWithDebInfo ++ CACHE STRING "Specify build type: None Debug Release RelWithDebInfo MinSizeRel." FORCE) ++endif (NOT CMAKE_BUILD_TYPE) + SET(CMAKE_COLOR_MAKEFILE ON CACHE STRING "Enable/Disable color output during build." FORCE) + #SET(CMAKE_VERBOSE_MAKEFILE OFF CACHE STRING "Enable/Disable cmake debug output during build." FORCE) + diff --git a/plugins/applications/CMakeLists.txt b/plugins/applications/CMakeLists.txt new file mode 100644 index 0000000..6a717fd --- /dev/null +++ b/plugins/applications/CMakeLists.txt @@ -0,0 +1,44 @@ +SET(libkbfxplasmadatastubsrc + kbfxplasmadataplugin.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxplasmadatastubsrc}) + + ADD_LIBRARY(kbfxplasmadatastub SHARED ${libkbfxplasmadatastubsrc}) + SET_TARGET_PROPERTIES(kbfxplasmadatastub + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxplasmadatastub PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxplasmadatastub + kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxplasmadatastub ${LIB_INSTALL_DIR}/kbfx/plugins) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxplasmadatastubsrc}) + + KDE4_ADD_LIBRARY(kbfxplasmadatastub SHARED ${libkbfxplasmadatastubsrc}) + TARGET_LINK_LIBRARIES(kbfxplasmadatastub + kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxplasmadatastub ${LIB_INSTALL_DIR}/kbfx/plugins) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxplasmadatastub DESTINATION ${LIB_INSTALL_DIR}/kbfx/plugins) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/applications/kbfxplasmadataplugin.cpp b/plugins/applications/kbfxplasmadataplugin.cpp new file mode 100644 index 0000000..cffb72f --- /dev/null +++ b/plugins/applications/kbfxplasmadataplugin.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <dcopref.h> +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <krun.h> +#include <kservice.h> +#include <kservicegroup.h> + +#include <kbfxconfig.h> + +#include <kbfxplasmadataplugin-common.h> + + +void +browseApp ( KServiceGroup::Ptr service, KbfxDataGroupList * glist, + KbfxDataGroup * appGroup ) +{ + if ( !service || !service->isValid () ) + return; + + + KServiceGroup::List list = service->entries ( true, true, false, true ); + + + if ( service->noDisplay () == true ) + return; + + /* + if (list.count () <= 0) + return; + */ + + appGroup = new KbfxDataGroup (); + appGroup->setName ( service->caption () ); + + for ( KServiceGroup::List::ConstIterator it = list.begin (); + it != list.end (); it++ ) + { + KSycocaEntry *p = ( *it ); + if ( p->isType ( KST_KService ) ) + { + KService *s = static_cast < KService * > ( p ); + KbfxDataSource *data = new KbfxDataSource (); + data->setDesktopPath ( s->desktopEntryPath () ); + appGroup->addItem ( data ); + } + else if ( p->isType ( KST_KServiceGroup ) ) + { + KServiceGroup *g = static_cast < KServiceGroup * > ( p ); + if ( g->childCount () > 0 ) + { + glist->addGroup ( appGroup ); + appGroup = new KbfxDataGroup (); + appGroup->setName ( g->caption () ); + browseApp ( g, glist, appGroup ); + } + + } + } + glist->addGroup ( appGroup ); + +} + + + + + + +KbfxDataStack * +view () +{ + KbfxDataGroup *appGroup = new KbfxDataGroup (); + KbfxDataGroupList *glist = new KbfxDataGroupList (); + KbfxDataStack *gstack = new KbfxDataStack (); + + KServiceGroup::Ptr service = KServiceGroup::group ( "/" ); + if ( service == NULL) + { + int messageBoxUserResReturn = KMessageBox::questionYesNo ( 0, + tr2i18n ( "<p align='center'>There is a problem in KDE Menu services!<br>KBFX can try to autorepair this problem.<br>Should KBFX autorepair this problem?</p>" ), + tr2i18n ( "Problem in KDE Menu Services" ), + tr2i18n ( "Do Autorepair" ), + tr2i18n ( "Do NOT Autorepair" ) ); + if ( messageBoxUserResReturn == KMessageBox::Yes ) + { + KRun::runCommand ( "kbuildsycoca" ); +// if ( ! ConfigInit().m_KbfxWatcher ) +// { + DCOPRef m_kickerPanel("kicker", "kicker"); + m_kickerPanel.call("restart()"); +// } + } + return new KbfxDataStack(); + } + + service->setShowEmptyMenu ( false ); + + glist->setName ( "Applications" ); + appGroup->setName ( service->caption () ); + + KServiceGroup::List list = service->entries ( true, true, false, false ); + + if ( list.count() <= 0) + { + return new KbfxDataStack(); + } + + + for ( KServiceGroup::List::ConstIterator it = list.begin (); + it != list.end (); it++ ) + { + KSycocaEntry *p = ( *it ); + if ( p->isType ( KST_KService ) ) + {} + else if ( p->isType ( KST_KServiceGroup ) ) + { + KServiceGroup *g = static_cast < KServiceGroup * > ( p ); + g->setShowEmptyMenu ( false ); + + if ( g->childCount () > 0 ) + { + glist = new KbfxDataGroupList (); + glist->setName ( g->caption () ); + glist->setIcon ( g->icon () ); + browseApp ( g, glist, appGroup ); + gstack->addGroupList ( glist ); + } + + } + } + + gstack->setName ( "Applications" ); + + + return gstack; + +} + +QString +name () +{ + return QString ( "Applications" ); +} + +QString +type () +{ + return QString ( "Stub Type" ); +} + + +uint +id () +{ + return 1; //TODO see what can be done... manybe rand()? +} + +#include <ktrader.h> + +KbfxDataGroup * +search ( QString _keyword ) +{ + + + KbfxDataGroup *g = new KbfxDataGroup (); + g->setName ( "Applications" ); + + + KTrader::OfferList offers = KTrader::self ()->query ( "Application" ); + + int *count = new int; + *count = 0; + QValueListIterator < KService::Ptr > s = offers.begin (); + + for ( ; s != offers.end (); ++s ) + { + if ( s == NULL ) + continue; + if ( (*s)->noDisplay () == true ) + continue; + + QString *sPtr = new QString (); + + ( *sPtr ) = ( *s )->name () + ( *s )->genericName () + ( *s )->comment (); + if ( ( !sPtr->isNull () ) && sPtr->contains ( _keyword, false ) > 0 ) + { + KbfxDataSource *data = new KbfxDataSource (); + data->setName ( ( *s )->name () ); + data->setDesktopPath ( ( *s )->desktopEntryPath () ); + + g->addItem ( data ); + ( *count ) ++; + if ( ( *count ) == 10 ) + break; + + } + if ( sPtr != 0 ) + delete sPtr; + } + delete count; + return g; +} diff --git a/plugins/common/CMakeLists.txt b/plugins/common/CMakeLists.txt new file mode 100644 index 0000000..96b4a77 --- /dev/null +++ b/plugins/common/CMakeLists.txt @@ -0,0 +1,3 @@ +FILE(GLOB HEADERS *.h) + +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/common/kbfxplasmadataplugin-common.h b/plugins/common/kbfxplasmadataplugin-common.h new file mode 100644 index 0000000..d446ef8 --- /dev/null +++ b/plugins/common/kbfxplasmadataplugin-common.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_DATA_PLUGIN_COMMON_H +#define KBFX_PLASMA_DATA_PLUGIN_COMMON_H + +#include "kbfxdatastack.h" + +extern "C" +{ +// static QString check = "Static Check for Plugin"; + KbfxDataStack * view(); + QString name(); //Name of the Plugin My Music .if TOM Create..Configure .. + QString type(); //Type of the plugin ex: Application : Amork : kio ..etc + uint id(); //A id for menus + KbfxDataGroup * search ( QString str ); +} + +#endif diff --git a/plugins/plasmoids/CMakeLists.txt b/plugins/plasmoids/CMakeLists.txt new file mode 100644 index 0000000..abb1167 --- /dev/null +++ b/plugins/plasmoids/CMakeLists.txt @@ -0,0 +1,44 @@ +SET(libkbfxplasmadataplasmoidsrc + kbfxplasmadatapluginplosmoid.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxplasmadataplasmoidsrc}) + + ADD_LIBRARY(kbfxplasmadataplasmoid SHARED ${libkbfxplasmadataplasmoidsrc} ) + SET_TARGET_PROPERTIES(kbfxplasmadataplasmoid + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxplasmadataplasmoid PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxplasmadataplasmoid + kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxplasmadataplasmoid ${LIB_INSTALL_DIR}/kbfx/plugins) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxplasmadataplasmoidsrc}) + + KDE4_ADD_LIBRARY(kbfxplasmadataplasmoid SHARED ${libkbfxplasmadataplasmoidsrc} ) + TARGET_LINK_LIBRARIES(kbfxplasmadataplasmoid + kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxplasmadataplasmoid ${LIB_INSTALL_DIR}/kbfx/plugins) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxplasmadataplasmoid DESTINATION ${LIB_INSTALL_DIR}/kbfx/plugins) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/plasmoids/kbfxplasmadatapluginplosmoid.cpp b/plugins/plasmoids/kbfxplasmadatapluginplosmoid.cpp new file mode 100644 index 0000000..998fafb --- /dev/null +++ b/plugins/plasmoids/kbfxplasmadatapluginplosmoid.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <kapplication.h> +#include <kservice.h> +#include <kservicegroup.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <qdir.h> +#include <qfileinfo.h> +#include <kbfxplasmadataplugin-common.h> + + + + + + + +KbfxDataStack * +view () +{ + + KbfxDataGroup *appGroup = new KbfxDataGroup (); + KbfxDataGroupList *glist = new KbfxDataGroupList (); + KbfxDataStack *gstack = new KbfxDataStack (); + + + glist->setName ( "Browse" ); + glist->setIcon ( "plasmagik" ); + appGroup->setName ( "Plasmoids" ); + + QString path = locate ( "data", "kicker/applets/lockout.desktop" ); + path.remove ( "lockout.desktop" ); + + + + QDir d ( path ); + d.setFilter ( QDir::Files | QDir::Hidden | QDir::NoSymLinks ); + d.setSorting ( QDir::Size | QDir::Reversed ); + d.setNameFilter ( "*.desktop" ); + + const QFileInfoList *list = d.entryInfoList (); + QFileInfoListIterator it ( *list ); + QFileInfo *fi; + while ( ( fi = it.current () ) != 0 ) + { + + KDesktopFile *desktop = new KDesktopFile ( fi->filePath () ); + + KbfxDataSource *src = new KbfxDataSource (); + + src->setName ( desktop->readName () ); + src->setContentPath ( fi->filePath () ); + src->setIconPath ( desktop->readIcon () ); + src->setCommand ( "dcop kicker Panel addApplet " + fi->filePath () ); + appGroup->addItem ( src ); + + + ++it; + } + + + gstack->setName ( "Plasmoids" ); + + glist->addGroup ( appGroup ); + gstack->addGroupList ( glist ); + return gstack; + + +} + +QString +name () +{ + return QString ( "Plasmoids" ); +} + +QString +type () +{ + return QString ( "Stub Type" ); +} + + +uint +id () +{ + return 1; //TODO see what can be done... manybe rand()? +} + + +#include <ktrader.h> + +KbfxDataGroup * +search ( QString _keyword ) +{ + KbfxDataGroup *appGroup = new KbfxDataGroup (); + + + QString path = locate ( "data", "kicker/applets/lockout.desktop" ); + path.remove ( "lockout.desktop" ); + + + + QDir d ( path ); + d.setFilter ( QDir::Files | QDir::Hidden | QDir::NoSymLinks ); + d.setSorting ( QDir::Size | QDir::Reversed ); + d.setNameFilter ( "*.desktop" ); + + const QFileInfoList *list = d.entryInfoList (); + QFileInfoListIterator it ( *list ); + QFileInfo *fi; + + while ( ( fi = it.current () ) != 0 ) + { + if ( fi->fileName ().contains ( _keyword ) > 0 ) + { + KDesktopFile *desktop = new KDesktopFile ( fi->filePath () ); + + KbfxDataSource *src = new KbfxDataSource (); + + src->setName ( desktop->readName () ); + src->setContentPath ( fi->filePath () ); + src->setIconPath ( desktop->readIcon () ); + src->setCommand ( "dcop kicker Panel addApplet " + fi->filePath () ); + appGroup->addItem ( src ); + } + + ++it; + } + + + return appGroup; +} diff --git a/plugins/recentstuff/CMakeLists.txt b/plugins/recentstuff/CMakeLists.txt new file mode 100644 index 0000000..787fbd8 --- /dev/null +++ b/plugins/recentstuff/CMakeLists.txt @@ -0,0 +1,44 @@ +SET(libkbfxplasmarecentstuffsrc + kbfxplasmarecentstuff.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxplasmarecentstuffsrc}) + + ADD_LIBRARY(kbfxplasmarecentstuff SHARED ${libkbfxplasmarecentstuffsrc} ) + SET_TARGET_PROPERTIES(kbfxplasmarecentstuff + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxplasmarecentstuff PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxplasmarecentstuff + kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxplasmarecentstuff ${LIB_INSTALL_DIR}/kbfx/plugins) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxplasmarecentstuffsrc}) + + KDE4_ADD_LIBRARY(kbfxplasmarecentstuff SHARED ${libkbfxplasmarecentstuffsrc} ) + TARGET_LINK_LIBRARIES(kbfxplasmarecentstuff + kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxplasmarecentstuff ${LIB_INSTALL_DIR}/kbfx/plugins) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxplasmarecentstuff DESTINATION ${LIB_INSTALL_DIR}/kbfx/plugins) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/recentstuff/kbfxplasmarecentstuff.cpp b/plugins/recentstuff/kbfxplasmarecentstuff.cpp new file mode 100644 index 0000000..b0c4f8c --- /dev/null +++ b/plugins/recentstuff/kbfxplasmarecentstuff.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <kapplication.h> +#include <kservice.h> +#include <kservicegroup.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <qdir.h> +#include <qfileinfo.h> +#include <kbfxplasmadataplugin-common.h> +#include <kstandarddirs.h> + +KbfxDataStack * +view () +{ + + KbfxDataGroup *appGroup = new KbfxDataGroup (); + KbfxDataGroupList *glist = new KbfxDataGroupList (); + KbfxDataStack *gstack = new KbfxDataStack (); + + + glist->setName ( "List" ); + glist->setIcon ( "newstuff" ); + appGroup->setName ( "RecentStuff" ); + + QString path = + KStandardDirs ().localkdedir () + "/share/apps/RecentDocuments/"; + + + + QDir d ( path ); + d.setFilter ( QDir::Files | QDir::Hidden | QDir::NoSymLinks ); + d.setSorting ( QDir::Size | QDir::Reversed ); + d.setNameFilter ( "*.desktop" ); + + const QFileInfoList *list = d.entryInfoList (); + QFileInfoListIterator it ( *list ); + QFileInfo *fi; + + while ( ( fi = it.current () ) != 0 ) + { + + KDesktopFile *desktop = new KDesktopFile ( fi->filePath () ); + + KbfxDataSource *src = new KbfxDataSource (); + + src->setName ( desktop->readName () ); + src->setContentPath ( fi->filePath () ); + src->setIconPath ( desktop->readIcon () ); + src->setCommand ( "kfmclient exec " + desktop->readEntry ( "URL" ) ); + + appGroup->addItem ( src ); + + delete desktop; + ++it; + } + + + gstack->setName ( "RecentStuff" ); + + glist->addGroup ( appGroup ); + gstack->addGroupList ( glist ); + return gstack; + + +} + +QString +name () +{ + return QString ( "RecentStuff" ); +} + +QString +type () +{ + return QString ( "Stub Type" ); +} + + +uint +id () +{ + return 1; //TODO see what can be done... manybe rand()? +} + + +#include <ktrader.h> + +KbfxDataGroup * +search ( QString _keyword ) +{ + KbfxDataGroup *appGroup = new KbfxDataGroup (); +// KbfxDataGroupList *glist = new KbfxDataGroupList (); +// KbfxDataStack *gstack = new KbfxDataStack (); + + + + QString path = + KStandardDirs ().localkdedir () + "/share/apps/RecentDocuments/"; + + QDir d ( path ); + d.setFilter ( QDir::Files | QDir::Hidden | QDir::NoSymLinks ); + d.setSorting ( QDir::Size | QDir::Reversed ); + d.setNameFilter ( "*.desktop" ); + + const QFileInfoList *list = d.entryInfoList (); + QFileInfoListIterator it ( *list ); + QFileInfo *fi; + + while ( ( fi = it.current () ) != 0 ) + { + if ( fi->fileName ().contains ( _keyword ) > 0 ) + { + KDesktopFile *desktop = new KDesktopFile ( fi->filePath () ); + + KbfxDataSource *src = new KbfxDataSource (); + + src->setName ( desktop->readName () ); + src->setContentPath ( fi->filePath () ); + src->setIconPath ( desktop->readIcon () ); + src->setCommand ( "kfmclient exec " + desktop->readEntry ( "URL" ) ); + appGroup->addItem ( src ); + delete desktop; + } + + ++it; + } + + return appGroup; +} diff --git a/plugins/settings/CMakeLists.txt b/plugins/settings/CMakeLists.txt new file mode 100644 index 0000000..2ef6f02 --- /dev/null +++ b/plugins/settings/CMakeLists.txt @@ -0,0 +1,44 @@ +SET(libkbfxplasmadatasettingssrc + kbfxplasmadatapluginsettings.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxplasmadatasettingssrc}) + + ADD_LIBRARY(kbfxplasmadatasettings SHARED ${libkbfxplasmadatasettingssrc}) + SET_TARGET_PROPERTIES(kbfxplasmadatasettings + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxplasmadatasettings PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxplasmadatasettings + kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxplasmadatasettings ${LIB_INSTALL_DIR}/kbfx/plugins) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxplasmadatasettingssrc}) + + KDE4_ADD_LIBRARY(kbfxplasmadatasettings SHARED ${libkbfxplasmadatasettingssrc}) + TARGET_LINK_LIBRARIES(kbfxplasmadatasettings + kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxplasmadatasettings ${LIB_INSTALL_DIR}/kbfx/plugins) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxplasmadatasettings DESTINATION ${LIB_INSTALL_DIR}/kbfx/plugins) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/settings/kbfxplasmadatapluginsettings.cpp b/plugins/settings/kbfxplasmadatapluginsettings.cpp new file mode 100644 index 0000000..bc02003 --- /dev/null +++ b/plugins/settings/kbfxplasmadatapluginsettings.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <dcopref.h> +#include <kapplication.h> +#include <kdebug.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <krun.h> +#include <kservice.h> +#include <kservicegroup.h> + +#include <kbfxconfig.h> + +#include <kbfxplasmadataplugin-common.h> + + +void +browseApp ( KServiceGroup::Ptr service, KbfxDataGroupList * glist, + KbfxDataGroup * appGroup ) +{ + if ( !service || !service->isValid () ) + return; + + + KServiceGroup::List list = service->entries ( true, true, false, true ); + + /* + if (service->noDisplay () == true) + return; + + + if (list.count () <= 0) + return; + */ + + appGroup = new KbfxDataGroup (); + appGroup->setName ( service->caption () ); + + for ( KServiceGroup::List::ConstIterator it = list.begin (); + it != list.end (); it++ ) + { + KSycocaEntry *p = ( *it ); + if ( p->isType ( KST_KService ) ) + { + KService *s = static_cast < KService * > ( p ); + KbfxDataSource *data = new KbfxDataSource (); + data->setDesktopPath ( s->desktopEntryPath () ); + appGroup->addItem ( data ); + } + else if ( p->isType ( KST_KServiceGroup ) ) + { + KServiceGroup *g = static_cast < KServiceGroup * > ( p ); + if ( g->childCount () > 0 ) + { + glist->addGroup ( appGroup ); + appGroup = new KbfxDataGroup (); + appGroup->setName ( g->caption () ); + browseApp ( g, glist, appGroup ); + } + + } + } +//if(appGroup->count() >0) + glist->addGroup ( appGroup ); + +} + + + + + + +KbfxDataStack * +view () +{ + KbfxDataGroup *appGroup = new KbfxDataGroup (); + KbfxDataGroupList *glist = new KbfxDataGroupList (); + KbfxDataStack *gstack = new KbfxDataStack (); + + KServiceGroup::Ptr service = KServiceGroup::baseGroup ( "settings" );//KServiceGroup::group ("/"); + if ( service == NULL) + { + int messageBoxUserResReturn = KMessageBox::questionYesNo ( 0, + tr2i18n ( "<p align='center'>There is a problem in KDE Menu services!<br>KBFX can try to autorepair this problem.<br>Should KBFX autorepair this problem?</p>" ), + tr2i18n ( "Problem in KDE Menu Services" ), + tr2i18n ( "Do Autorepair" ), + tr2i18n ( "Do NOT Autorepair" ) ); + if ( messageBoxUserResReturn == KMessageBox::Yes ) + { + KRun::runCommand ( "kbuildsycoca" ); +// if ( ! ConfigInit().m_KbfxWatcher ) +// { + DCOPRef m_kickerPanel("kicker", "kicker"); + m_kickerPanel.call("restart()"); +// } + } + return new KbfxDataStack(); + } + + service->setShowEmptyMenu ( false ); + + glist->setName ( "Settings" ); + appGroup->setName ( service->caption () ); + + + KServiceGroup::List list = service->entries ( true, true, false, false ); + + if ( list.count() <= 0) + { + return new KbfxDataStack(); + } + + for ( KServiceGroup::List::ConstIterator it = list.begin (); + it != list.end (); it++ ) + { + KSycocaEntry *p = ( *it ); + if ( p->isType ( KST_KService ) ) + {} + else if ( p->isType ( KST_KServiceGroup ) ) + { + KServiceGroup *g = static_cast < KServiceGroup * > ( p ); + g->setShowEmptyMenu ( false ); + + if ( g->childCount () > 0 ) + { + glist = new KbfxDataGroupList (); + glist->setName ( g->caption () ); + glist->setIcon ( g->icon () ); + browseApp ( g, glist, appGroup ); + gstack->addGroupList ( glist ); + } + + } + } + + gstack->setName ( "Settings" ); + + + return gstack; + +} + +QString +name () +{ + return QString ( "Settings" ); +} + +QString +type () +{ + return QString ( "Stub Type" ); +} + +uint +id () +{ + return 1; //TODO see what can be done... manybe rand()? +} + + + +KbfxDataGroup * +search ( QString _keyword ) +{ + _keyword = _keyword; + return new KbfxDataGroup(); + +} + diff --git a/plugins/strigi/CMakeLists.txt b/plugins/strigi/CMakeLists.txt new file mode 100644 index 0000000..29289b0 --- /dev/null +++ b/plugins/strigi/CMakeLists.txt @@ -0,0 +1,46 @@ +SET(libkbfxstrigiclientsrc + kbfxstrigiplugin.cpp + ) + +FILE(GLOB HEADERS *.h) + +IF (NOT USE_KDE4) + KDE3_AUTOMOC(${libkbfxstrigiclientsrc}) + + ADD_LIBRARY(kbfxstrigiclient SHARED ${libkbfxstrigiclientsrc}) + SET_TARGET_PROPERTIES(kbfxstrigiclient + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxstrigiclient PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxstrigiclient + kbfxdata + ${QT_AND_KDECORE_LIBS} + ${KDE3_KIO_LIBRARY} + ${KDE3_UI_LIBRARY} + ${KDE3_KHTML_LIBRARY} + ${M_LIBRARY} + ${STRIGICLIENT_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxstrigiclient ${LIB_INSTALL_DIR}/kbfx/plugins) +ELSE (NOT USE_KDE4) + KDE4_AUTOMOC(${libkbfxstrigiclientsrc}) + + KDE4_ADD_LIBRARY(kbfxstrigiclient SHARED ${libkbfxstrigiclientsrc}) + TARGET_LINK_LIBRARIES(kbfxstrigiclient + kbfxdata + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${KDE4_KDEUI_LIBS} + ${KDE4_KHTML_LIBS} + ${M_LIBRARY} + ${STRIGICLIENT_LIBRARY} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxstrigiclient ${LIB_INSTALL_DIR}/kbfx/plugins) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxstrigiclient DESTINATION ${LIB_INSTALL_DIR}/kbfx/plugins) +INSTALL(FILES ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/kbfx/plugins) diff --git a/plugins/strigi/kbfxstrigiplugin.cpp b/plugins/strigi/kbfxstrigiplugin.cpp new file mode 100644 index 0000000..dd9471b --- /dev/null +++ b/plugins/strigi/kbfxstrigiplugin.cpp @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <kapplication.h> +#include <kservice.h> +#include <kservicegroup.h> +#include <kdebug.h> +#include <qdir.h> +#include <qfileinfo.h> +#include <kurl.h> + +#include "kbfxstrigiplugin.h" + + + +bool +stopDaemon () +{ + return true; +} + +bool +startDaemon () +{ + stopDaemon (); + +// TODO: add the actual code to start the daemon process + return true; +} + +void +init () +{} + +void +poll () +{ +} + + +KbfxDataStack * +view () +{ + KbfxDataGroup *appGroup = new KbfxDataGroup (); + KbfxDataGroupList *glist = new KbfxDataGroupList (); + KbfxDataStack *gstack = new KbfxDataStack (); + + init (); + glist->setName ( "Configure" ); + appGroup->setName ( "Strigi Options" ); + KbfxDataSource *m_source = new KbfxDataSource (); + m_source->setName ( "Start Indexing" ); + m_source->setCommand ( "kfmclient exec strigi:/status/startindexing" ); + m_source->setComment ( "Starts Building an Index" ); + m_source->setIconPath ( "enhanced_browsing.png" ); + appGroup->addItem ( m_source ); + + m_source = new KbfxDataSource (); + m_source->setName ( "Stop Indexing" ); + m_source->setCommand ( "kfmclient exec strigi:/status/stopindexing" ); + m_source->setComment ( "Stop Index Building Process" ); + m_source->setIconPath ( "enhanced_browsing.png" ); + appGroup->addItem ( m_source ); + m_source = new KbfxDataSource (); + m_source->setName ( "Stop Daemon" ); + m_source->setCommand ( "kfmclient exec strigi:/status/stop" ); + m_source->setComment ( "Stop Search Engine" ); + m_source->setIconPath ( "enhanced_browsing.png" ); + appGroup->addItem ( m_source ); + + m_source = new KbfxDataSource (); + m_source->setName ( "Advanced Searching" ); + m_source->setCommand ( "kfmclient exec strigi:/" ); + m_source->setComment ( "Detailed Search Results" ); + m_source->setIconPath ( "enhanced_browsing.png" ); + appGroup->addItem ( m_source ); + m_source = new KbfxDataSource (); + m_source->setName ( "Start Daemon" ); + m_source->setCommand ( "kfmclient exec strigi:/status/start" ); + m_source->setComment ( "Start Search Engine" ); + m_source->setIconPath ( "enhanced_browsing.png" ); + appGroup->addItem ( m_source ); + + glist->addGroup ( appGroup ); + gstack->addGroupList ( glist ); + gstack->setName ( "Strigi" ); + + return gstack; +} + + +QString +name () +{ + return QString ( "Strigi" ); +} + +QString +type () +{ + return QString ( "Stub Type" ); +} + + +uint +id () +{ + return 1; //TODO see what can be done... maybe rand()? +} + + + +KbfxDataGroup * +search ( QString _keyword ) +{ + + KbfxDataGroup *datagroup = new KbfxDataGroup (); + datagroup->setName ( "Strigi" ); + + QString socketpath = QDir::homeDirPath () + "/.strigi/socket"; + startDaemon (); + kdDebug() << socketpath << endl; + AsyncSocketClient socket; + ClientInterface::Hits hits; + + + socket.setSocketPath ( ( const char * ) socketpath.utf8 () ); + bool ok = socket.query ( _keyword.ascii (), 5, 0 ); + + if ( ok == true ) + { + while ( !socket.statusChanged () ) + { + struct timespec sleeptime; + sleeptime.tv_sec = 0; + sleeptime.tv_nsec = 1; + nanosleep ( &sleeptime, 0 ); + } + hits = socket.getHits (); + + jstreams::IndexedDocument hit; +// int last = ( hits.hits.size () > 5 ) ? 5 : hits.hits.size (); + + + for ( uint i = 0; i < socket.getHits ().hits.size (); ++i ) + { + jstreams::IndexedDocument hit = hits.hits[i]; + KbfxDataSource *data = new KbfxDataSource (); + + QString name; + std::map < std::string, std::string >::const_iterator it = + hits.hits[i].properties.find ( "title" ); + + QString filename ( hits.hits[i].uri.c_str () ); + + if ( filename.contains ( ".tar." ) > 0 ) + { + filename = "tar:" + filename; + kdDebug() << filename << endl; + } + + if ( it != hits.hits[i].properties.end () ) + { + name = it->second; + } + else + { + uint pos = hits.hits[i].uri.rfind ( '/' ); + if ( pos == std::string::npos ) + { + name = hits.hits[i].uri; + } + else + { + name = hits.hits[i].uri.substr ( pos + 1 ); + } + } + + + data->setName ( name ); + + + + data->setCommand ( "kfmclient exec " + filename ); + + + + QString iconname = + KMimeType::mimeType ( hits.hits[i].mimetype.c_str () )-> + icon ( QString::null, 0 ); + data->setIconPath ( iconname ); + datagroup->addItem ( data ); + + } + } + else + { + KbfxDataSource *data = new KbfxDataSource (); + data->setName ( "Start Strigi" ); + data->setComment ( "Strigi Daemon down" ); + data->setCommand ( "strigidaemon &" ); + } + + return datagroup; + + +} diff --git a/plugins/strigi/kbfxstrigiplugin.h b/plugins/strigi/kbfxstrigiplugin.h new file mode 100644 index 0000000..a2e3137 --- /dev/null +++ b/plugins/strigi/kbfxstrigiplugin.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_STRIGI_PLUGIN_H +#define KBFX_STRIGI_PLUGIN_H + +//#include "kbfxplasmacanvasstack.h" +//#include "kbfxplasmacanvasitemwrapper.h" +#include "kbfxdatastack.h" +#include <asyncsocketclient.h> +#include <kiconloader.h> +#include <kmimetype.h> + +extern "C" +{ + KbfxDataStack * view(); + QString name(); //Name of the Plugin My Music .if TOM Create..Configure .. + QString type(); //Type of the plugin ex: Application : Amork : kio ..etc + uint id(); //A id for menus + KbfxDataGroup * search ( QString str ); +// KbfxPlasmaCanvasGroup * search(QString _keyword,QCanvas * canvas); //search and return a group +} + +#endif diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 0000000..7f31392 --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1 @@ +ADD_POFILES("kbfxconfigapp") diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..f77d285 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,1649 @@ +# translation of bg.po to Bulgarian +# Bulgarian translation for KBFX +# Copyright (c) 2007 KBFX Team +# This file is distributed under the same license as the KBFX package. +# +# Lexus <lexus@mail.kbfx.org>, 2006. +# PhobosK <phobosk@mail.kbfx.org>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: bg\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-03-04 15:53+0200\n" +"PO-Revision-Date: 2007-03-04 16:04+0200\n" +"Last-Translator: PhobosK <phobosk@mail.kbfx.org>\n" +"Language-Team: Bulgarian <bg@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Bulgarian\n" +"X-Poedit-Country: BULGARIA\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Lexus" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "lexus_t@abv.bg" + +#: kbfxlib/common/kbfxconfig.cpp:32 +msgid "Not Specified" +msgstr "Няма Информация" + +#: kbfxlib/common/kbfxfontchooser.cpp:38 +msgid "Font..." +msgstr "Шрифт..." + +#: configdialog/kbfxconfigapp.cpp:28 +msgid "<p align='center'>%1</p>" +msgstr "<p align='center'>%1</p>" + +#: configdialog/kbfxconfigapp.cpp:29 +msgid "You are running: <b>KBFX " +msgstr "Вие използвате: <b>KBFX" + +#: configdialog/kbfxconfigapp.cpp:30 +msgid "" +"<br><p align='center'><font color='#ff0000'>The connection to the KBFX News " +"Section on www.kbfx.org is broken.</font><br><br>If you want you can check " +"the latest news for KBFX from here:<br><a href='http://www.kbfx.org/'>KBFX " +"News</a></p>" +msgstr "" +"<br><p align='center'><font color='#ff0000'>Връзката към \"KBFX Новини\" не " +"може да се осъществи. </font><br><br>Ако желаете можете да проверите " +"последните новости за KBFX тук: <br><a href='http://www.kbfx.org/'>KBFX " +"Новини</a></p>" + +#: configdialog/kbfxconfigapp.cpp:35 +msgid "" +"<font size='+1'><b>KBFX start button</b><br></font><b>Tip! </b>You have 3 " +"options to select for your KBFX start button.You have to select <i>(Normal, " +"Pressed, Hover)</i> images. <br>Down below you can also see a preview of the " +"images you have selected." +msgstr "" +"<font size='+1'><b>KBFX старт бутон</b><br></font><b>Съвет!</b>Имате 3 " +"възможности за избор на KBFX старт бутон. Трябва да изберете изображения " +"за<i>(Нормален, Натиснат, Посочен)</i> бутон. <br>По-надолу можете да " +"разгледате изображенията които сте избрали." + +#: configdialog/kbfxconfigapp.cpp:40 +msgid "" +"<font size='+1'><b>About KBFX</b><br></font><b>Tip! </b>Here you can find " +"information about the KBFX Project and all the people involved in it." +msgstr "" +"<font size='+1'><b>Относно програмата KBFX</b><br></font><b>Съвет!</b>Тук " +"можете да намерите информация относно KBFX проекта и за всички участници в " +"него." + +#: configdialog/kbfxconfigapp.cpp:43 +msgid "" +"<font size='+1'><b>KBFX font settings</b><br></font><b>Tip! </b>Here you can " +"set the fonts of the current theme.<br>If you don't have any 'kbfxfontrc' " +"file don't worry about that.<br>When done just hit 'Apply' button and KBFX " +"will save the 'kbfxfontrc' file." +msgstr "" +"<font size='+1'><b>KBFX настройки на шрифта</b><br></font><b>Съвет!</b>Тук " +"можете да настроите шрифта на настоящата тема.<br>Ако нямате \"kbfxfontrc\" " +"файл, когато приключите, натиснете бутона \"Прилагане\" и \"kbfxfontrc\" ще " +"се създаде автоматично." + +#: configdialog/kbfxconfigapp.cpp:48 +msgid "" +"<font size='+1'><b>KBFX Layout</b><br></font><b>Tip! </b>Here you can " +"configure the Look and Feel of your KBFX menu.<br>The most important " +"settings that are used with the '<strong>Make it...</strong>' buttons are " +"marked with '<strong>*</strong>'<br>Have in mind that the Layout of the " +"theme also depends on the sizes of the images!<br>" +msgstr "" +"<font size='+1'><b>KBFX Изглед</b><br></font><b>Съвет! </b>Тук можете да " +"определите външния вид на вашето KBFX меню.<br>Най-важните настройки, които " +"могат да бъдат направени с бутоните'<strong>Направи...</strong>' са " +"отбелязани със'<strong>*</strong>'<br>Трябва да имате в предвид,че Изгледа " +"на темата също е свързан с размерите на изображенията!<br>" + +#: configdialog/kbfxconfigapp.cpp:53 +msgid "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip! </b>Here you can " +"select what plugins will be enabled and in which panel of the KBFX menu." +msgstr "" +"<font size='+1'><b>KBFX Приставки</b><br></font><b>Съвет! </b>Тук можете да " +"изберете каква приставка ще използвате и в кой панел на KBFX менюто." + +#: configdialog/kbfxconfigapp.cpp:56 +msgid "" +"<font size='+1'><b>Menu Type</b><br></font><b>Tip! </b>Please select which " +"kind of menu you would like to use." +msgstr "" +"<font size='+1'><b>Тип на Менюто</b><br></font><b>Съвет!</b>Моля изберете " +"вида на менюто, което искате да използвате." + +#: configdialog/kbfxconfigapp.cpp:59 +msgid "" +"<font size='+1'><b>KBFX Themes</b><br></font><b>Tip! </b>To keep it simple " +"place all your themes inside one folder.<br>Then create different folders " +"inside that folder with different names.<br>KBFX will then read those " +"folders as themes." +msgstr "" +"<font size='+1'><b>KBFX Теми</b><br></font><b>Съвет!</b>За да запазите " +"темите просто поставете всички ваши теми в една папка.<br>След това създайте " +"в нея други папки с различни имена.<br>KBFX ще разчита тези папки като теми." + +#: configdialog/kbfxconfigapp.cpp:64 +msgid "" +"<font size='+1'><b>KBFX tooltip settings</b><br></font><b>Tip! </b>Here you " +"can configure the behaviour of KBFX's own tooltip." +msgstr "" +"<font size='+1'><b>KBFX настройки на подсказките</b><br></font><b>Съвет! </" +"b>Тук можете да определите поведението на избрани от вас KBFX подсказки." + +#: configdialog/kbfxconfigapp.cpp:93 +msgid "Themes" +msgstr "Теми" + +#: configdialog/kbfxconfigapp.cpp:105 rc.cpp:230 +#, no-c-format +msgid "Start Button" +msgstr "Старт бутон" + +#: configdialog/kbfxconfigapp.cpp:121 rc.cpp:239 +#, no-c-format +msgid "Menu Style" +msgstr "Стил на менюто" + +#: configdialog/kbfxconfigapp.cpp:130 rc.cpp:242 +#, no-c-format +msgid "Tooltip" +msgstr "Подсказка" + +#: configdialog/kbfxconfigapp.cpp:141 +msgid "Layout" +msgstr "Изглед" + +#: configdialog/kbfxconfigapp.cpp:151 rc.cpp:248 +#, no-c-format +msgid "Plugins" +msgstr "Приставки" + +#: configdialog/kbfxconfigapp.cpp:240 +msgid "No default settings here ;)" +msgstr "Тук няма настройки по подразбиране ;)" + +#: configdialog/kbfxconfigapp.cpp:423 +msgid "<p align='center'>Could not create this KBFX theme package.</p>" +msgstr "<p align='center'>Пакета с KBFX темата не може да бъде създаден.</p>" + +#: configdialog/kbfxconfigapp.cpp:435 +msgid "<p align='center'>KBFX Theme <strong>%1</strong> prepared.</p>" +msgstr "<p align='center'>KBFX темата <strong>%1</strong> подготвена.</p>" + +#: configdialog/kbfxconfigapp.cpp:436 +msgid "KBFX Theme Ready" +msgstr "KBFX Темата е готова" + +#: configdialog/main.cpp:33 +msgid "KBFX Configuration Utility" +msgstr "KBFX Конфигуриратор" + +#: configdialog/main.cpp:39 +msgid "kbfxconfigapp" +msgstr "kbfxconfigapp" + +#: configdialog/main.cpp:52 +msgid "Install KBFX theme from <URL>" +msgstr "Инсталиране на KBFX тема от папка <URL>" + +#: configdialog/main.cpp:53 +msgid "Prepare KBFX theme from folder <URL>" +msgstr "Подготвяне на KBFX тема от папка <URL>" + +#: configdialog/main.cpp:54 +msgid "Show the About page" +msgstr "Покажи страницата \"Относно програмата KBFX\"" + +#: src/kbfxspinx.cpp:234 +msgid "This is a help box" +msgstr "Това е прозорец \"Помощ\"" + +#: src/kbfxspinx.cpp:358 +msgid "Remove KBFX from Pannel" +msgstr "Премахване на KBFX от панела" + +#: src/kbfxspinx.cpp:360 +msgid "Reload KBFX" +msgstr "Презареди KBFX" + +#: src/kbfxspinx.cpp:363 +msgid "Configure KBFX" +msgstr "Конфигурация на KBFX" + +#: src/kbfxspinx.cpp:365 +msgid "Edit Applications Menu" +msgstr "Редактиране на Менюто" + +#: src/kbfxspinxmenu.cpp:54 +msgid "Double click to clear..." +msgstr "Натисни два пъти за да изтриеш..." + +#: src/kbfxspinxmenu.cpp:66 +msgid "Type here to search..." +msgstr "Пишете тук за да търсите програми..." + +#: src/kbfxbutton.cpp:270 +msgid "" +"Invalid images were dropped!\n" +"Cannot set the KBFX button to use these images!" +msgstr "" +"Използвахте невалидни изображения!\n" +"Невъзможно е KBFX бутона да използва тези изображения!" + +#: src/kbfxbutton.cpp:272 +msgid "Error setting KBFX button images" +msgstr "Грешка при настройването на изображенията за KBFX бутона" + +#: rc.cpp:3 +#, no-c-format +msgid "KBFX Button" +msgstr "KBFX Бутон" + +#: rc.cpp:6 +#, no-c-format +msgid "" +"To change KBFX button skin, simply browse to the image you want OR just " +"Drag&Drop the images to their respective place." +msgstr "" +"За да промените изгледа на KBFX бутона просто изберете изображението, което " +"желаете ИЛИ Придърпайте и Пуснете изображението на съответветстващото му " +"място." + +#: rc.cpp:9 +#, no-c-format +msgid "Livepreview" +msgstr "Реален преглед" + +#: rc.cpp:12 +#, no-c-format +msgid "" +"<b>Tip!</b> To see live preview, hover or press the preview image with your " +"mouse." +msgstr "<b>Съвет!</b> За реалния изглед посочете/натиснете изображението за преглед." + +#: rc.cpp:15 +#, no-c-format +msgid "KBFX Button live preview" +msgstr "Реален бутон" + +#: rc.cpp:18 +#, no-c-format +msgid "Here you can see the live preview of the KBFX Button." +msgstr "Тук можете да проверите реалния изглед на KBFX бутона." + +#: rc.cpp:21 +#, no-c-format +msgid "Resize Panel" +msgstr "Големина на панела" + +#: rc.cpp:24 +#, no-c-format +msgid "" +"<b>Tip!</b> This button resizes the panel on which the KBFX button is to " +"button's height or width." +msgstr "" +"<b>Съвет!</b> Бутона променя размера на панела върху който се намира KBFX " +"бутона." + +#: rc.cpp:27 configdialog/kbfxconfigdlgbutton.ui.h:141 +#, no-c-format +msgid "Panel Resize is 'ON'" +msgstr "Оразмеряване на панела 'ВКЛ'" + +#: rc.cpp:32 +#, no-c-format +msgid "<h3><p align=\"center\">Preview of selected images</p></h3>" +msgstr "<h3><p align=\"center\">Преглед на избраните изображения</p></h3>" + +#: rc.cpp:35 +#, no-c-format +msgid "\"PRESSED\" IMAGE SELECTION" +msgstr "ИЗБОР НА ИЗОБРАЖЕНИЕ за \"НАТИСНАТ\" БУТОН" + +#: rc.cpp:38 +#, no-c-format +msgid "Please select \"pressed\" image." +msgstr "Моля изберете изображение за \"натиснат\" бутон." + +#: rc.cpp:41 rc.cpp:65 rc.cpp:89 +#, no-c-format +msgid "image/jpeg image/png image/x-xpm image/gif" +msgstr "image/jpeg image/png image/x-xpm image/gif" + +#: rc.cpp:44 +#, no-c-format +msgid "The Pressed Button Skin Image" +msgstr "Изображение за Натиснат бутон" + +#: rc.cpp:47 +#, no-c-format +msgid "Here you can choose the Pressed Button Skin Image" +msgstr "Тук можете да изберете изображение за изгледа на Натиснат бутон" + +#: rc.cpp:50 rc.cpp:74 rc.cpp:98 +#, no-c-format +msgid "Preview" +msgstr "Предварителен изглед" + +#: rc.cpp:53 +#, no-c-format +msgid "Pressed Button Skin" +msgstr "Изглед на Натиснат бутон" + +#: rc.cpp:56 +#, no-c-format +msgid "Here you can Drag&Drop the Pressed Button Skin Image." +msgstr "Тук можете да Придърпате и Пуснете изображението за Изглед на Натиснат Бутон." + +#: rc.cpp:59 +#, no-c-format +msgid "\"NORMAL\" IMAGE SELECTION" +msgstr "ИЗБОР НА ИЗОБРАЖЕНИЕ за \"НОРМАЛЕН\" БУТОН" + +#: rc.cpp:62 +#, no-c-format +msgid "Please select \"normal\" image." +msgstr "Моля изберете изображение за \"нормален\" бутон." + +#: rc.cpp:68 +#, no-c-format +msgid "The Normal Button Skin Image" +msgstr "Изображение за Нормален бутон" + +#: rc.cpp:71 +#, no-c-format +msgid "Here you can choose the Normal Button Skin Image" +msgstr "Тук можете да изберете изображение за изгледа на Нормалния бутон" + +#: rc.cpp:77 +#, no-c-format +msgid "Normal Button Skin" +msgstr "Изглед на Нормален бутон" + +#: rc.cpp:80 +#, no-c-format +msgid "Here you can Drag&Drop the Normal Button Skin Image." +msgstr "Тук можете да Придърпате и Пуснете изображението за Изглед на Нормален Бутон." + +#: rc.cpp:83 +#, no-c-format +msgid "\"HOVER\" IMAGE SELECTION" +msgstr "ИЗБОР НА ИЗОБРАЖЕНИЕ за \"ПОСОЧЕН\" БУТОН" + +#: rc.cpp:86 +#, no-c-format +msgid "Please select \"hover\" image." +msgstr "Моля изберете изображение за \"посочен\" бутон." + +#: rc.cpp:92 +#, no-c-format +msgid "The Hover Button Skin Image" +msgstr "Изображение за Посочен бутон" + +#: rc.cpp:95 +#, no-c-format +msgid "Here you can choose the Hover Button Skin Image" +msgstr "Тук можете да изберете изображение за изгледа на Посочения бутон" + +#: rc.cpp:101 +#, no-c-format +msgid "Hover Button Skin" +msgstr "Изглед на Посочен бутон" + +#: rc.cpp:104 +#, no-c-format +msgid "Here you can Drag&Drop the Hover Button Skin Image." +msgstr "Тук можете да Придърпате и Пуснете изображението за Изглед на Посочен Бутон." + +#: rc.cpp:107 +#, no-c-format +msgid "<h3><p align=\"center\">Please select KBFX button's images</p></h3>" +msgstr "<h3><p align=\"center\">Моля изберете изображенията за KBFX бутона</p></h3>" + +#: rc.cpp:110 rc.cpp:179 rc.cpp:296 rc.cpp:404 rc.cpp:440 rc.cpp:461 +#, no-c-format +msgid "KBFX Control Center" +msgstr "Контролен Панел на KBFX" + +#: rc.cpp:113 +#, no-c-format +msgid "<b><h3><p align=\"center\">Layout options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Свойства на Изгледа</p></h3></b>" + +#: rc.cpp:116 +#, no-c-format +msgid "EXPORT KBFXLAYOUTRC FILE" +msgstr "Експорт в KBFXLAYOUTRC файл" + +#: rc.cpp:119 +#, no-c-format +msgid "Export the kbfxlayoutrc file to a folder" +msgstr "Експорт на KBFXLAYOUTRC файла в папка" + +#: rc.cpp:122 rc.cpp:473 +#, no-c-format +msgid "Setup fonts for your KBFX" +msgstr "Настройка на шрифтовете на KBFX менюто" + +#: rc.cpp:125 rc.cpp:476 +#, no-c-format +msgid "Theme that is edited:" +msgstr "Тема която се конфигурира:" + +#: rc.cpp:128 rc.cpp:479 +#, no-c-format +msgid "<p align=\"left\"><b>default</b></p>" +msgstr "<p align=\"left\"><b>default</b></p>" + +#: rc.cpp:131 rc.cpp:482 +#, no-c-format +msgid "Please select the theme you want to edit" +msgstr "Моля изберете темата, която желаете да редактирате" + +#: rc.cpp:134 +#, no-c-format +msgid "Select the Layout property to change" +msgstr "Изберете свойството на Изгледа промяна" + +#: rc.cpp:137 +#, no-c-format +msgid "Make it 2 panels (Left \"ON\")" +msgstr "Направи 2 панелно меню (дясно)" + +#: rc.cpp:140 +#, no-c-format +msgid "Make it 2 panels (Right \"ON\")" +msgstr "Направи 2 панелно меню (ляво)" + +#: rc.cpp:143 +#, no-c-format +msgid "Make it 3 panels" +msgstr "Направи 3 панелно меню" + +#: rc.cpp:146 +#, no-c-format +msgid "textLabel1" +msgstr "textLabel1" + +#: rc.cpp:149 +#, no-c-format +msgid "textLabel2" +msgstr "textLabel2" + +#: rc.cpp:152 +#, no-c-format +msgid "textLabel3" +msgstr "textLabel3" + +#: rc.cpp:155 +#, no-c-format +msgid "textLabel4" +msgstr "textLabel4" + +#: rc.cpp:158 +#, no-c-format +msgid "checkBox1" +msgstr "checkBox1" + +#: rc.cpp:161 +#, no-c-format +msgid "textLabel5" +msgstr "textLabel5" + +#: rc.cpp:164 +#, no-c-format +msgid "textLabel6" +msgstr "textLabel6" + +#: rc.cpp:167 +#, no-c-format +msgid "textLabel7" +msgstr "textLabel7" + +#: rc.cpp:170 +#, no-c-format +msgid "textLabel8" +msgstr "textLabel8" + +#: rc.cpp:173 +#, no-c-format +msgid "checkBox2" +msgstr "checkBox2" + +#: rc.cpp:176 +#, no-c-format +msgid "C&ustom" +msgstr "Потребителски &настройки" + +#: rc.cpp:182 +#, no-c-format +msgid "<b><h3><p align=\"center\">Plugins options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Свойства на приставката</p></h3></b>" + +#: rc.cpp:185 +#, no-c-format +msgid "Select KBFX Panel" +msgstr "Избор на KBFX панел" + +#: rc.cpp:188 rc.cpp:191 +#, no-c-format +msgid "Plugin to configure" +msgstr "Приставка за конфигуриране" + +#: rc.cpp:194 +#, no-c-format +msgid "Please select the panel you want to configure: " +msgstr "Моля изберете панела който желаете да конфигурирате: " + +#: rc.cpp:197 +#, no-c-format +msgid "&Available Plugins:" +msgstr "&Налични приставки:" + +#: rc.cpp:200 +#, no-c-format +msgid "&Enabled Plugins:" +msgstr "&Активирани приставки:" + +#: rc.cpp:203 +#, no-c-format +msgid "&Configure Plugin" +msgstr "&Конфигуриране на приставките" + +#: rc.cpp:206 +#, no-c-format +msgid "Alt+C" +msgstr "Alt+C" + +#: rc.cpp:209 rc.cpp:212 +#, no-c-format +msgid "Configure the selected plugin" +msgstr "Конфигуриране на избраната приставка" + +#: rc.cpp:215 +#, no-c-format +msgid "&Plugin Information" +msgstr "&Информация за приставката" + +#: rc.cpp:218 +#, no-c-format +msgid "Alt+P" +msgstr "Alt+P" + +#: rc.cpp:221 rc.cpp:224 +#, no-c-format +msgid "Information about the selected plugin" +msgstr "Информация за избраната приставка" + +#: rc.cpp:227 +#, no-c-format +msgid "KBFX Configurator Application" +msgstr "KBFX Конфигуратор" + +#: rc.cpp:233 +#, no-c-format +msgid "KBFX Themes" +msgstr "KBFX Теми" + +#: rc.cpp:245 +#, no-c-format +msgid "Search Engine" +msgstr "Търсене" + +#: rc.cpp:251 +#, no-c-format +msgid "About KBFX" +msgstr "Относно KBFX" + +#: rc.cpp:254 +#, no-c-format +msgid "" +"<br><p align=\"center\"><br><br><br>If you want you can check the latest " +"news for KBFX from here:<br><a href=\"http://www.kbfx.org/\">KBFX News</a></" +"p>" +msgstr "" +"<br><p align=\"center\"><br><br><br>Ако желаете можете да проверите " +"последните новости за KBFX на адрес:<br><a href=\"http://www.kbfx.org/" +"\">KBFX Новини</a></p>" + +#: rc.cpp:260 +#, no-c-format +msgid "Alt+H" +msgstr "Alt+H" + +#: rc.cpp:263 +#, no-c-format +msgid "Open Help Documentation" +msgstr "Отваряне на документацията за Помощ" + +#: rc.cpp:266 +#, no-c-format +msgid "&Default" +msgstr "&Подразбиране" + +#: rc.cpp:269 +#, no-c-format +msgid "Alt+D" +msgstr "Alt+D" + +#: rc.cpp:272 +#, no-c-format +msgid "Apply the default configuration for this section only" +msgstr "Прилагане на настройките по подразбиране само за тази секция" + +#: rc.cpp:278 +#, no-c-format +msgid "Alt+A" +msgstr "Alt+A" + +#: rc.cpp:281 +#, no-c-format +msgid "Save the configuration and Apply it" +msgstr "Запазване и Прилагане на настройките" + +#: rc.cpp:287 +#, no-c-format +msgid "Alt+X" +msgstr "Alt+X" + +#: rc.cpp:290 +#, no-c-format +msgid "Exit the configuration without saving" +msgstr "Излизане от настройките без запазване" + +#: rc.cpp:293 +#, no-c-format +msgid "<font size=\"+2\"><b>Kbfx start button</b><br></font>" +msgstr "<font size=\"+2\"><b>KBFX старт бутон</b><br></font>" + +#: rc.cpp:299 +#, no-c-format +msgid "Select default folder" +msgstr "Избор на папка по подразбиране" + +#: rc.cpp:302 +#, no-c-format +msgid "Please select the target folder where your themes are." +msgstr "Моля изберете папка, в която се намират вашите KBFX теми." + +#: rc.cpp:305 +#, no-c-format +msgid "SpixBar" +msgstr "SpixBar" + +#: rc.cpp:308 +#, no-c-format +msgid "Installed Themes" +msgstr "Инсталирани Теми" + +#: rc.cpp:311 +#, no-c-format +msgid "Here are listed all the installed KBFX Themes" +msgstr "Тук можете да видите списъка на всички инсталирани KBFX Теми" + +#: rc.cpp:314 +#, no-c-format +msgid "Selected Theme Preview" +msgstr "Преглед на Избраната Тема" + +#: rc.cpp:317 +#, no-c-format +msgid "Delete Selected" +msgstr "Изтриване" + +#: rc.cpp:320 +#, no-c-format +msgid "Delete the Selected Theme" +msgstr "Изтрива Избраната Тема" + +#: rc.cpp:323 +#, no-c-format +msgid "" +"Pressing the button will delete the currently selected theme. <br><b>Warning!" +"</b> You cannot delete the installed system wide themes!" +msgstr "" +"Натискането на бутона ще изтрие избраната в момента тема. <br><b>Внимание!</" +"b>Не можете да изтриете теми, които са инсталирани за цялата система!" + +#: rc.cpp:326 +#, no-c-format +msgid "Get Themes" +msgstr "Изтегляне" + +#: rc.cpp:329 +#, no-c-format +msgid "Get More Themes from the Internet" +msgstr "Изтегляне на още теми от Интернет" + +#: rc.cpp:332 +#, no-c-format +msgid "" +"Pressing the button will launch konqueror and go to the KBFX Themes Section " +"on www.kde-look.org" +msgstr "" +"Натискането на бутона ще стартира Konqueror и ще ви отведе до KBFX Секцията " +"за Теми на адрес www.kde-look.org" + +#: rc.cpp:335 +#, no-c-format +msgid "Install Theme" +msgstr "Инсталиране" + +#: rc.cpp:338 +#, no-c-format +msgid "Install New Theme from KBFX Theme Package" +msgstr "Инсталиране на Нова Тема от KBFX Пакет за Теми" + +#: rc.cpp:341 +#, no-c-format +msgid "" +"Pressing the button will offer a dialog where you can choose KBFX Theme " +"Package to install in your home folder" +msgstr "" +"Натискането на бутона ще отвори диалог от където можете да изберете KBFX " +"Пакет за Тема, която да инсталирате във вашата домашна папка" + +#: rc.cpp:344 rc.cpp:583 +#, no-c-format +msgid "Theme Info" +msgstr "Информация" + +#: rc.cpp:347 +#, no-c-format +msgid "Show specific theme info" +msgstr "Показване на специфична за темата информация" + +#: rc.cpp:350 +#, no-c-format +msgid "Pressing the button will show you specific theme info" +msgstr "Този бутон ще Ви покаже специфична за темата информация" + +#: rc.cpp:353 +#, no-c-format +msgid "Personal Image" +msgstr "Персонална снимка" + +#: rc.cpp:356 +#, no-c-format +msgid "Theme's Default" +msgstr "Снимка на Темата" + +#: rc.cpp:359 +#, no-c-format +msgid "Set the Theme's Default Personal Image" +msgstr "Използване на Персонална Снимка на Темата по подразбиране" + +#: rc.cpp:362 +#, no-c-format +msgid "" +"Pressing the button will delete the personal image you have selected and " +"install the theme's default personal image" +msgstr "" +"Натискането на бутона ще изтрие персоналната снимка, която сте избрали и ще " +"я замени с персоналната снимка на темата по подразбиране" + +#: rc.cpp:365 +#, no-c-format +msgid "Maxsize 48 x 48" +msgstr "Макс. 48 x 48" + +#: rc.cpp:368 +#, no-c-format +msgid "Select New image" +msgstr "Нова снимка" + +#: rc.cpp:371 +#, no-c-format +msgid "Select a Personal Image" +msgstr "Избери Персонална Снимка" + +#: rc.cpp:374 +#, no-c-format +msgid "Pressing the button will open a dialog to select your personal image" +msgstr "" +"Натискането на бутона ще отвори диалог, чрез който можете да изберете вашата " +"персонална снимка" + +#: rc.cpp:377 +#, no-c-format +msgid "This is your personal image displayed at the KBFX menu." +msgstr "Това е Вашата персонална снимка, в KBFX менюто." + +#: rc.cpp:380 +#, no-c-format +msgid "Misc Options" +msgstr "Разни" + +#: rc.cpp:383 +#, no-c-format +msgid "Watch System Installs" +msgstr "Наблюдавай системните инсталации" + +#: rc.cpp:386 rc.cpp:389 +#, no-c-format +msgid "Watch for applications installs and reload KBFX if any occurs" +msgstr "Наблюдавай за инсталиране на софтуер и презареди KBFX менюто" + +#: rc.cpp:392 rc.cpp:395 +#, no-c-format +msgid "Show Old Themes" +msgstr "Покажи и старите теми" + +#: rc.cpp:398 +#, no-c-format +msgid "<b><h3><p align=\"center\">Please select theme folder</p></h3></b>" +msgstr "<h3><p align=\"center\">Моля изберете папка за Темите</p></h3>" + +#: rc.cpp:401 +#, no-c-format +msgid "<b><h3><p align=\"center\">Installed themes</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Инсталирани теми</p></h3></b>" + +#: rc.cpp:407 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Включване/Изключване на подсказката</p></h3></b>" + +#: rc.cpp:410 +#, no-c-format +msgid "Turn off or on the tooltip" +msgstr "Изключване или включване на подсказката" + +#: rc.cpp:413 +#, no-c-format +msgid "" +"Turn your tooltip off or on. <br>You can see the current status of the " +"tooltip to the right." +msgstr "" +"Включване/изключване подсказката. <br>Състоянието на подсказката в момента " +"е показано в дясно." + +#: rc.cpp:416 +#, no-c-format +msgid "Turn the tooltip \"OFF\"" +msgstr "Изключи подсказката" + +#: rc.cpp:419 +#, no-c-format +msgid "Tooltip Text" +msgstr "Текст на подсказката" + +#: rc.cpp:422 +#, no-c-format +msgid "Type the text which you want to be displayed in the tooltip." +msgstr "Въведете текста, за подсказката." + +#: rc.cpp:425 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip personal text</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Текст на подсказката</p></h3></b>" + +#: rc.cpp:428 +#, no-c-format +msgid "Tooltip animation" +msgstr "Анимация на подсказката" + +#: rc.cpp:431 +#, no-c-format +msgid "" +"Turn your tooltip animation off or on. <br>You can see the current status of " +"the tooltip to the right." +msgstr "" +"Включване/изключване анимацията за подсказката.<br>Състоянието на анимацията " +"в момента е показано в дясно." + +#: rc.cpp:434 +#, no-c-format +msgid "Turn the animation \"ON\"" +msgstr "Включи анимацията" + +#: rc.cpp:437 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip animation ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Анимиране на подсказката</p></h3></b>" + +#: rc.cpp:443 +#, no-c-format +msgid "<b><h3><p align=\"center\">Menu type</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Тип на менюто</p></h3></b>" + +#: rc.cpp:446 +#, no-c-format +msgid "Please select the menu style" +msgstr "Моля изберете стил за менюто" + +#: rc.cpp:449 rc.cpp:455 +#, no-c-format +msgid "KBFX MENU" +msgstr "KBFX МЕНЮ" + +#: rc.cpp:452 rc.cpp:458 +#, no-c-format +msgid "KDE MENU" +msgstr "KDE МЕНЮ" + +#: rc.cpp:464 +#, no-c-format +msgid "<b><h3><p align=\"center\">Font options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Настройка на шрифта</p></h3></b>" + +#: rc.cpp:467 +#, no-c-format +msgid "EXPORT KBFXFONTRC FILE" +msgstr "ЕКСПОРТ ВЪВ ФАЙЛ" + +#: rc.cpp:470 +#, no-c-format +msgid "Export the kbfxfontrc file to a folder" +msgstr "Експорт на kbfxfontrc файла в папка" + +#: rc.cpp:485 +#, no-c-format +msgid "Bold fonts on hover" +msgstr "Открояване под мишката" + +#: rc.cpp:488 rc.cpp:491 +#, no-c-format +msgid "Make fonts bolder when you hover the mouse over an item" +msgstr "Удебели шрифтовете при посочване с мишката на програмите" + +#: rc.cpp:494 +#, no-c-format +msgid "Application \"LINE\":" +msgstr "Линия на програмите:" + +#: rc.cpp:497 +#, no-c-format +msgid "Horizontal line color in the application area." +msgstr "Цвят на хоризонталната линия в зоната за програми." + +#: rc.cpp:500 +#, no-c-format +msgid "Application text :" +msgstr "Текст на Програмите:" + +#: rc.cpp:503 +#, no-c-format +msgid "Select the color of the \"application\" in the menu." +msgstr "Изберете цвят за \"програма\" в менюто." + +#: rc.cpp:506 +#, no-c-format +msgid "Comment text:" +msgstr "Текст на Коментара:" + +#: rc.cpp:509 +#, no-c-format +msgid "Color of the \"comments\" in the menu." +msgstr "Цвят за \"коментар\" в менюто." + +#: rc.cpp:512 +#, no-c-format +msgid "Name display:" +msgstr "Текст на Името:" + +#: rc.cpp:515 rc.cpp:527 rc.cpp:533 +#, no-c-format +msgid "The color of your login name in the menu." +msgstr "Цвета на вашето име в менюто." + +#: rc.cpp:518 +#, no-c-format +msgid "Category text:" +msgstr "Текст на Категориите:" + +#: rc.cpp:521 +#, no-c-format +msgid "Font color of the categoris in the menu." +msgstr "Цвят на шрифта за категориите в менюто." + +#: rc.cpp:524 +#, no-c-format +msgid "Separator:" +msgstr "Разделител:" + +#: rc.cpp:530 +#, no-c-format +msgid "Plugin:" +msgstr "Приставки:" + +#: rc.cpp:536 +#, no-c-format +msgid "Select font for the application's text" +msgstr "Избери шрифт за текста на приложенията" + +#: rc.cpp:539 +#, no-c-format +msgid "Select font for the comment's text" +msgstr "Избор на шрифт за текста на коментарите" + +#: rc.cpp:542 +#, no-c-format +msgid "Select font for the username's text" +msgstr "Избор на шрифт за текста на потребителското име" + +#: rc.cpp:545 +#, no-c-format +msgid "Select font for the category's text" +msgstr "Избор на шрифт за текста на категориите" + +#: rc.cpp:548 +#, no-c-format +msgid "Select font for the separator's text" +msgstr "Избор на шрифт за текста на разделителите" + +#: rc.cpp:551 +#, no-c-format +msgid "Select font for the plugins' text" +msgstr "Избор на шрифт за текста на плъгините" + +#: rc.cpp:554 +#, no-c-format +msgid "Form1" +msgstr "Form1" + +#: rc.cpp:557 +#, no-c-format +msgid "<b><h3><p align=\"center\">People behind KBFX</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Хората зад KBFX</p></h3></b>" + +#: rc.cpp:560 +#, no-c-format +msgid "You are running: <b>KBFX 0493</b>" +msgstr "Използвате: <b>KBFX 0493</b>" + +#: rc.cpp:563 +#, no-c-format +msgid "" +"Here are the people behind the KBFX application.\n" +"We would like to thank all people who have helped with KBFX or have donated " +"money to our project!\n" +"THANKS A LOT ALL OF YOU OUT THERE!!!" +msgstr "" +"Това са хората, които стоят зад проекта KBFX.\n" +"Искаме да благодарим на всички, които помогнаха с KBFX и на всички, които " +"дариха средства за нашия проект! МНОГО БЛАГОДАРИМ НА ВСИЧКИ!!!" + +#: rc.cpp:568 +#, no-c-format +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project " +"Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> Siraj Razick<br><br><strong>Страна:</strong> Шри " +"Ланка<br><br><strong>KBFX:</strong> Автор, поддръжка, разработка, " +"администратор на проекта<br><br><strong>Email:</strong> siraj@mail.kbfx.org" + +#: rc.cpp:571 +#, no-c-format +msgid "" +"<b>Tip!</b> Hover over the contact images to see each personal contact " +"information." +msgstr "" +"Посочете изображение за да видите персонална информация за участниците в " +"проекта." + +#: rc.cpp:574 +#, no-c-format +msgid "SPONSORS!" +msgstr "СПОНСОРИ!" + +#: rc.cpp:577 +#, no-c-format +msgid "" +"We would like to thank swedish computer company <b>PC Agenten</b> for " +"sponsoring us with a server and bandwidth." +msgstr "" +"Благодарим на шведската компания <b>PC Agenten </b> за предоставеният сървър " +"и интернет връзка." + +#: rc.cpp:580 +#, no-c-format +msgid "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE</a></u></b></p>" +msgstr "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE </a></u></b></p>" + +#: rc.cpp:589 +#, no-c-format +msgid "<p align=\"right\"><b>Name:</b></p>" +msgstr "<p align=\"right\"><b>Име:</b></p>" + +#: rc.cpp:592 +#, no-c-format +msgid "<p align=\"right\"><b>Version:</b></p>" +msgstr "<p align=\"right\"><b>Версия:</b></p>" + +#: rc.cpp:595 +#, no-c-format +msgid "<p align=\"right\"><b>Author:</b></p>" +msgstr "<p align=\"right\"><b>Автор:</b></p>" + +#: rc.cpp:598 +#, no-c-format +msgid "<p align=\"right\"><b>Email:</b></p>" +msgstr "<p align=\"right\"><b>Email:</b></p>" + +#: rc.cpp:601 +#, no-c-format +msgid "<p align=\"right\"><b>Homepage:</b></p>" +msgstr "<p align=\"right\"><b>Интернет Адрес:</b></p>" + +#: rc.cpp:604 rc.cpp:607 rc.cpp:610 rc.cpp:613 rc.cpp:616 +#, no-c-format +msgid "Test" +msgstr "Тест" + +#: configdialog/kbfxconfigdlgthemes.ui.h:61 +msgid "" +"<p align='center'>Invalid user themes folder!</p><p align='center'>Will use " +"default user themes folder.</p>" +msgstr "" +"<p align='center'>Невалидна папка с теми на потребителя!</p><p " +"align='center'>Ще бъде използвана папката с теми на потребителя по " +"подразбиране.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:63 +msgid "Error loading themes" +msgstr "Грешка при зареждането на темите" + +#: configdialog/kbfxconfigdlgthemes.ui.h:170 +msgid "" +"<p align='center'>Are you sure you want to uninstall the KBFX theme <strong>%" +"1</strong>?</p>" +msgstr "" +"<p align='center'>Сигурен ли сте, че искате да деинсталирате тази KBFX тема " +"<strong>%1</strong>?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:171 +msgid "Uninstall KBFX theme" +msgstr "Деинсталиране на KBFX тема" + +#: configdialog/kbfxconfigdlgthemes.ui.h:172 +msgid "Uninstall" +msgstr "Деинсталиране" + +#: configdialog/kbfxconfigdlgthemes.ui.h:177 +msgid "" +"<p align='center'>Do you want to keep your personal settings for theme " +"<strong>%1</strong>?</p>" +msgstr "" +"<p align='center'>Искате ли да запазите личните си настройки на темата " +"<strong>%1</strong>?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:178 +msgid "Personal settings" +msgstr "Персонални настройки" + +#: configdialog/kbfxconfigdlgthemes.ui.h:179 +msgid "Keep settings" +msgstr "Запази настройките" + +#: configdialog/kbfxconfigdlgthemes.ui.h:180 +msgid "Delete settings" +msgstr "Изтрий настройките" + +#: configdialog/kbfxconfigdlgthemes.ui.h:210 +msgid "" +"<p align='center'>Could not uninstall this KBFX theme.</p><p " +"align='center'>You may not have sufficient permissions to delete the folder " +"<strong>%1<strong>.</p>" +msgstr "" +"<p align='center'>KBFX темата не може да бъде деинсталирана.</p><p " +"align='center'>Вероятно нямате необходимите права, за да изтриете папката " +"<strong>%1<strong>.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:223 +msgid "KBFX theme packages (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" +msgstr " KBFX теми (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" + +#: configdialog/kbfxconfigdlgthemes.ui.h:227 +msgid "Select KBFX theme package to install" +msgstr "Избор на KBFX тема за инсталиране" + +#: configdialog/kbfxconfigdlgthemes.ui.h:243 +msgid "<p align='center'>Could not read this KBFX theme package.</p>" +msgstr "<p align='center'>Пакета с KBFX темата не може да бъде прочетен.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:270 +msgid "Select personal image" +msgstr "Избиране на Персонална Снимка" + +#: configdialog/kbfxconfigdlgthemes.ui.h:281 +msgid "" +"<p align='center'>Image cannot be used as a personal image!</p><p " +"align='center'>Will use default personal image.</p>" +msgstr "" +"<p align='center'>Изображението не може да бъде използвано като персонална " +"снимка!</p><p align='center'>Ще бъде използвана персоналната снимка по " +"подразбиране.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:283 +#: configdialog/kbfxconfigdlgbutton.ui.h:65 +#: configdialog/kbfxconfigdlgbutton.ui.h:86 +#: configdialog/kbfxconfigdlgbutton.ui.h:107 +msgid "Error loading image" +msgstr "Грешка при зареждането на изображението" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:23 +msgid "Turn the animation 'OFF'" +msgstr "Изключи анимацията" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:30 +msgid "Turn the animation 'ON'" +msgstr "Включи анимацията" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:53 +msgid "Turn the tooltip 'OFF'" +msgstr "Изключи подсказката" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:60 +msgid "Turn the tooltip 'ON'" +msgstr "Включи подсказката" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:122 +msgid "Select folder to export kbfxfontrc file" +msgstr "Изберете директория където да бъде запазен KBFXLAYOUTRC файла" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:151 +msgid "" +"<p align='center'>The Font configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>Настройките за Шрифт на KBFX темата <strong>%1</strong>са " +"успешно експортирани!</p>" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:152 +msgid "KBFX Font Export Ready" +msgstr "Експортирането на шрифта на KBFX е готово" + +#: configdialog/kbfxconfigdlgabout.ui.h:23 +msgid "" +"<strong>Name:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Country:</" +"strong> Sweden<br><br><strong>KBFX:</strong> co-author, Q/A, system design, " +"web designer, bug hunter, project administror<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Страна:</" +"strong> Швеция<br><br><strong>KBFX:</strong> Съавтор, Q/A, системен и уеб " +"дизайн, тестер, администратор на проекта<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:32 +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> author, maintainer, developer, project " +"administror<br><br><strong>Email:</strong> siraj@mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> Siraj Razick<br><br><strong>Страна:</strong> Шри " +"Ланка<br><br><strong>KBFX:</strong> Автор, поддръжка, разработка, " +"администратор на проекта<br><br><strong>Email:</strong> siraj@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:41 +msgid "" +"<strong>Name:</strong> Nathanael Dracor Gogniat<br><br><strong>Country:</" +"strong> Switzerland<br><br><strong>KBFX:</strong> project technical writer, " +"documentation manager, co-author<br><br><strong>Email:</strong> " +"nathanael@mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> Nathanael Dracor Gogniat<br><br><strong>Страна:</" +"strong> Швейцария<br><br><strong>KBFX:</strong> Теьническа доцументация, " +"съавтор<br><br><strong>Email:</strong> nathanael@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:50 +msgid "" +"<strong>Name:</strong> PhobosK<br><br><strong>Country:</strong> " +"Bulgaria<br><br><strong>KBFX:</strong> package & release manager, Q/A, bug " +"hunter, mandriva packages, project administrator, developer Qt/C+" +"+<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> PhobosK<br><br><strong>Страна:</strong> " +"България<br><br><strong>KBFX:</strong> Поддръжка пакети и версии, Q/A, " +"програмни грешки, пакети за mandriva, разработка с Qt/C++, администратор на " +"проекта<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:59 +msgid "" +"<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"developer Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" +msgstr "" +"<strong>Име:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Страна:</strong> Перу<br><br><strong>KBFX:</strong> " +"Разработчик с Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:68 +msgid "" +"<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"library developer for Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" +msgstr "" +"<strong>Име:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Страна:</strong> Швеция<br><br><strong>KBFX:</strong> " +"Разработчик на библиотеките за Raptor<br><br><strong>Email:</strong> " +"ephracis@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgbutton.ui.h:63 +msgid "" +"<p align='center'>Image cannot be used as a pressed button skin!</p><p " +"align='center'>Will use default pressed button skin.</p>" +msgstr "" +"<p align='center'>Изображението не може да бъде използвано като изглед за " +"натиснат бутон!</p><p align='center'>Ще бъде използван изгледа за натиснат " +"бутон по подразбиране.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:84 +msgid "" +"<p align='center'>Image cannot be used as a normal button skin!</p><p " +"align='center'>Will use default normal button skin.</p>" +msgstr "" +"<p align='center'>Изображението не може да бъде използвано като изглед за " +"нормален бутон!</p><p align='center'>Ще бъде използван изгледа за нормален " +"бутон по подразбиране.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:105 +msgid "" +"<p align='center'>Image cannot be used as a hover button skin!</p><p " +"align='center'>Will use default hover button skin.</p>" +msgstr "" +"<p align='center'>Изображението не може да бъде използвано като изглед за " +"посочен бутон!</p><p align='center'>Ще бъде използван изгледа за посочен " +"бутон по подразбиране.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:147 +msgid "Panel Resize is 'OFF'" +msgstr "Оразмеряване на панела 'ИЗКЛ'" + +#: configdialog/kbfxconfigdlglayout.ui.h:16 +msgid "User Properties" +msgstr "Потребителски настройки" + +#: configdialog/kbfxconfigdlglayout.ui.h:17 +msgid "* Top Bar Properties" +msgstr "* Свойства на Горната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:18 +msgid "* Bottom Bar Properties" +msgstr "* Свойства на Долната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:20 +msgid "* List Box Properties" +msgstr "* Свойства на Списъчното Поле" + +#: configdialog/kbfxconfigdlglayout.ui.h:21 +msgid "Search Box Properties" +msgstr "Свойства на Полето за Търсене" + +#: configdialog/kbfxconfigdlglayout.ui.h:22 +msgid "* Item Properties" +msgstr "* Свойства на Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:24 +msgid "* Main Menu Properties" +msgstr "* Свойства на Главното Меню" + +#: configdialog/kbfxconfigdlglayout.ui.h:25 +msgid "Water Effect Properties" +msgstr "Ефект тип вода" + +#: configdialog/kbfxconfigdlglayout.ui.h:209 +msgid "Face Position X" +msgstr "Позиция на Снимката X" + +#: configdialog/kbfxconfigdlglayout.ui.h:210 +msgid "Face Position Y" +msgstr "Позиция на Снимката Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:211 +msgid "User Name Position X" +msgstr "Позиция на Потребителското Име X" + +#: configdialog/kbfxconfigdlglayout.ui.h:212 +msgid "User Name Position Y" +msgstr "Позиция на Потребителското Име Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:213 +msgid "Face Box Position X" +msgstr "Позиция на Полето за Снимка X" + +#: configdialog/kbfxconfigdlglayout.ui.h:214 +msgid "Face Box Position Y" +msgstr "Позиция на Полето за Снимка Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:215 +msgid "Face Box Height" +msgstr "Височина на Полето за Снимка" + +#: configdialog/kbfxconfigdlglayout.ui.h:216 +msgid "Face Box Width" +msgstr "Ширина на Полето за Снимка" + +#: configdialog/kbfxconfigdlglayout.ui.h:217 +msgid "Hide User Name" +msgstr "Скриване на Потребителското Име" + +#: configdialog/kbfxconfigdlglayout.ui.h:235 +msgid "* Top Bar Height" +msgstr "* Височина на Горната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:241 +msgid "Top Bar Width" +msgstr "Ширина на Горната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:266 +msgid "* Bottom Bar Height" +msgstr "* Височина на Долната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:272 +msgid "Bottom Bar Width" +msgstr "Ширина на Долната Лента" + +#: configdialog/kbfxconfigdlglayout.ui.h:322 +msgid "* List Box Position X" +msgstr "* Позиция на Списъчното Поле X" + +#: configdialog/kbfxconfigdlglayout.ui.h:323 +msgid "* List Box Position Y" +msgstr "* Позиция на Списъчното Поле Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:326 +msgid "List Box Height" +msgstr "Височина на Списъчното Поле" + +#: configdialog/kbfxconfigdlglayout.ui.h:327 +msgid "* List Box Width" +msgstr "* Ширина на Списъчното Поле" + +#: configdialog/kbfxconfigdlglayout.ui.h:345 +msgid "Search Box Position X" +msgstr "Позиция на Полето за Търсене X" + +#: configdialog/kbfxconfigdlglayout.ui.h:346 +msgid "Search Box Position Y" +msgstr "Позиция на Полето за Търсене Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:349 +msgid "Search Box Height" +msgstr "Височина на Полето за Търсене" + +#: configdialog/kbfxconfigdlglayout.ui.h:350 +msgid "Search Box Width" +msgstr "Ширина на Полето за Търсене" + +#: configdialog/kbfxconfigdlglayout.ui.h:368 +msgid "* Item Position X" +msgstr "* Позиция на Приложенията X" + +#: configdialog/kbfxconfigdlglayout.ui.h:369 +msgid "* Item Position Y" +msgstr "* Позиция на Приложенията Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:370 +msgid "Icon Size in Item" +msgstr "Големина на иконата в Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:372 +msgid "Item Height" +msgstr "Височина на Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:373 +msgid "* Item Width" +msgstr "* Ширина на Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:374 +msgid "Comment Margin in Item" +msgstr "Граница на Коментара в Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:376 +msgid "No Comments in Item" +msgstr "Без коментари в Приложенията" + +#: configdialog/kbfxconfigdlglayout.ui.h:417 +msgid "* Main Menu Height" +msgstr "* Височина на Главното Меню" + +#: configdialog/kbfxconfigdlglayout.ui.h:421 +msgid "* Main Menu Width" +msgstr "* Ширина на Главното Меню" + +#: configdialog/kbfxconfigdlglayout.ui.h:425 +msgid "Contracted Menues" +msgstr "Намалени Менюта" + +#: configdialog/kbfxconfigdlglayout.ui.h:441 +msgid "Water Effect Frame Rate" +msgstr "Честота на ефекта тип вода" + +#: configdialog/kbfxconfigdlglayout.ui.h:450 +msgid "Enabled Water Effect" +msgstr "Активиран ефект тип вода" + +#: configdialog/kbfxconfigdlglayout.ui.h:495 +msgid "Select folder to export kbfxlayoutrc file" +msgstr "Изберете папка където да бъде експортиран KBFXLAYOUTRC файла" + +#: configdialog/kbfxconfigdlglayout.ui.h:583 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>Настройките на Изгледа на KBFX темата<strong>%1</strong> " +"бяха експортирани успешно!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:584 +msgid "KBFX Layout Export Ready" +msgstr "Експорта на KBFX Изгледа е готов" + +#: configdialog/kbfxconfigdlglayout.ui.h:651 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> is ready!</p><p align='center'>Be sure to click the <strong>Apply</" +"strong> button in order the changes to become active!</p>" +msgstr "" +"<p align='center'>Конфигурирането на Изгледа на KBFX Темата <strong>%1</" +"strong> е завършено!</p><p align='center'>Натиснете бутона " +"<strong>Прлилагане</strong>за да се активират извършените промени!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:652 +msgid "KBFX Layout Ready" +msgstr "KBFX Изгледа е готов" + +#: configdialog/kbfxconfigdlglayout.ui.h:658 +msgid "" +"<p align='center'>KBFX will calculate the necessary values using the present " +"values for:</p><p align='center'><strong>* Main Menu Height</strong> and " +"<strong>* Main Menu Width</strong><br><strong>* Bottom Bar Height</strong> " +"and <strong>* Top Bar Height</strong><br></p><p align='center'>So be sure " +"that you have entered their values as you desire!</p><p " +"align='center'><strong>NOTE:</strong> Have in mind that the Layout of the " +"theme also depends on the sizes of the images! So if the theme does not look " +"like as you desire either change the images' sizes to smaller width OR " +"change <strong>* Main Menu Width</strong> to higher value!</p>" +msgstr "" +"<p align='center'>KBFX ще пресметне необходимите стойности използвайки:</" +"p><p align='center'><strong>* Височина на Главното Меню</strong> и <strong>* " +"Ширина на Главното Меню</strong><br><strong>* Височина на Долната Лента</" +"strong> и <strong>* Височина на Горната Лента</strong><br></p><p " +"align='center'>Така че, моля уверете се, че сте въвели стойностите, които " +"желаете!</p><p align='center'><strong>ЗАБЕЛЕЖКА:</strong> Трябва да се има " +"предвид, че Изгледа на темата е също свързан с размерите на изображенията! " +"Ето защо, ако темата не изглежда както желаете или променете ширината на " +"изображенията ИЛИ заменете стойностите за <strong>*Ширина на Главното Меню</" +"strong> с по-големи!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:664 +msgid "Prepare Layout for the KBFX theme" +msgstr "Подготвяне на Изглед за KBFX тема" + +#: configdialog/kbfxconfigdlglayout.ui.h:665 +msgid "Prepare" +msgstr "Подготви" + +#: configdialog/kbfxconfigdlgplugins.ui.h:15 +msgid "Left Panel" +msgstr "Ляв Панел" + +#: configdialog/kbfxconfigdlgplugins.ui.h:16 +msgid "Right Panel" +msgstr "Десен Панел" + +#: configdialog/kbfxconfigdlgplugins.ui.h:79 +#: configdialog/kbfxconfigdlgplugins.ui.h:85 +msgid "<p align='center'>Not Implemented yet.</p>" +msgstr "<p align='center'>В процес на разработка.</p>" + +#: configdialog/kbfxconfigdlgmain.ui.h:34 +msgid "<p align='center'>Not implemented yet.</p>" +msgstr "<p align='center'>В процес на разработка.</p>" + +#~ msgid "Convert Theme" +#~ msgstr "Конвертиране на Темата" + +#~ msgid "Convert a theme to the new format" +#~ msgstr "Конвертира темата в новият формат" + +#~ msgid "" +#~ "Pressing the button will open dialog for converting old themes to the new " +#~ "specifications" +#~ msgstr "" +#~ "Натискането на бутона ще отвори диалог, чрез който можете да конвертирате " +#~ "темата в новият формат" + +#~ msgid "This is an about box" +#~ msgstr "Това е прозорец „Относно програмата“" + +#~ msgid "Resize Toolbar" +#~ msgstr "Размер на лентата" + +#~ msgid "Toolbar Resize is 'ON'" +#~ msgstr "Промяна размера на лентата 'ВКЛ'" + +#~ msgid "<b>Installed Themes</b>" +#~ msgstr "<b>Инсталирани Теми</b>" + +#~ msgid "Nookie" +#~ msgstr "Nookie" + +#~ msgid "Enkelhet" +#~ msgstr "Enkelhet" + +#~ msgid "Plugin color:" +#~ msgstr "Цвят на приставката" + diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..817e378 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,1616 @@ +# translation of hu.po to Hungarian +# Hungarian translation for KBFX +# Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 +# This file is distributed under the same license as the KBFX package. +# +# Ferenc Stelcz <ferenc@stelcz.hu>, 2007. +# PhobosK <phobosk@mail.kbfx.org>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: hu\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-03-04 15:53+0200\n" +"PO-Revision-Date: 2007-03-04 17:39+0100\n" +"Last-Translator: Ferenc Stelcz <ferenc@stelcz.hu>\n" +"Language-Team: Hungarian <hu@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Rosetta-Export-Date: 2007-02-07 06:34+0000\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Stelcz Ferenc" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "ferenc@stelcz.hu" + +#: kbfxlib/common/kbfxconfig.cpp:32 +msgid "Not Specified" +msgstr "Nincs megadva" + +#: kbfxlib/common/kbfxfontchooser.cpp:38 +msgid "Font..." +msgstr "Betűtípus..." + +#: configdialog/kbfxconfigapp.cpp:28 +msgid "<p align='center'>%1</p>" +msgstr "<p align='center'>%1</p>" + +#: configdialog/kbfxconfigapp.cpp:29 +msgid "You are running: <b>KBFX " +msgstr "KBFX verziója: <b>KBFX " + +#: configdialog/kbfxconfigapp.cpp:30 +msgid "" +"<br><p align='center'><font color='#ff0000'>The connection to the KBFX News " +"Section on www.kbfx.org is broken.</font><br><br>If you want you can check " +"the latest news for KBFX from here:<br><a href='http://www.kbfx.org/'>KBFX " +"News</a></p>" +msgstr "" +"<br><p align='center'><font color='#ff0000'>A KBFX híroldal a www.kbfx.org " +"szerverrel való kapcsolat hibájából eredően nem elérhető.</font><br><br>Ha " +"szeretnél a legújabb KBFX-szel kapcsolatos hírekről olvasni, akkor a " +"következő hivatkozáson próbáld:<br><a href='http://www.kbfx.org/'>KBFX " +"Hírek</a></p>" + +#: configdialog/kbfxconfigapp.cpp:35 +msgid "" +"<font size='+1'><b>KBFX start button</b><br></font><b>Tip! </b>You have 3 " +"options to select for your KBFX start button.You have to select <i>(Normal, " +"Pressed, Hover)</i> images. <br>Down below you can also see a preview of the " +"images you have selected." +msgstr "" +"<font size=\"+2\"><br></font><font size=\"+3\"><b>Kbfx start gomb</b></" +"font><br><b>Tipp!</b> \n" +"Saját KBFX gombodat 3 opcióval szabhatod testre. Válassz egy <i>(Normál, " +"Lenyomott, Fókuszált)</i> <br>állapothoz tartozó képet. Lejjebb láthatod a " +"választott képekkel készült előnézetet." + +#: configdialog/kbfxconfigapp.cpp:40 +msgid "" +"<font size='+1'><b>About KBFX</b><br></font><b>Tip! </b>Here you can find " +"information about the KBFX Project and all the people involved in it." +msgstr "" +"<font size=\"+2\"><br></font><font size=\"+3\"><b>A KBFX névjegye</b></" +"font><br><b>Tipp!</b> \n" +"Itt találhatsz bővebb információt a KBFX Projektről <br>és a benne résztvevő " +"emberekről." + +#: configdialog/kbfxconfigapp.cpp:43 +msgid "" +"<font size='+1'><b>KBFX font settings</b><br></font><b>Tip! </b>Here you can " +"set the fonts of the current theme.<br>If you don't have any 'kbfxfontrc' " +"file don't worry about that.<br>When done just hit 'Apply' button and KBFX " +"will save the 'kbfxfontrc' file." +msgstr "" +"<font size=\"+2\"><br></font><font size=\"+3\"><b>Kbfx betűtípus " +"beállítások</b></font><br><b>Tipp!</b> \n" +"Itt állíthatod be az aktuális témához tartozó betűtípusokat.<br> Amennyiben " +"még nincs \"kbfxfontrc\" fájlod, ne aggódj.<br>Amennyiben kész vagy, csak " +"kattints az \"Alkalmazás\" gombra <br> és a KBFX automatikusan elkészíti " +"neked a kbfxfontrc fájlt." + +#: configdialog/kbfxconfigapp.cpp:48 +msgid "" +"<font size='+1'><b>KBFX Layout</b><br></font><b>Tip! </b>Here you can " +"configure the Look and Feel of your KBFX menu.<br>The most important " +"settings that are used with the '<strong>Make it...</strong>' buttons are " +"marked with '<strong>*</strong>'<br>Have in mind that the Layout of the " +"theme also depends on the sizes of the images!<br>" +msgstr "" +"<font size='+1'><b>KBFX elrendezés</b><br></font><b>Tipp! </b>Itt szabhatod " +"testre a KBFX menü megjelenését.<br>A <strong>Tedd...</strong>' gombbal " +"jelölt beállítások között a legfontosabbakat '<strong>*</strong>'-gal " +"jelöltük.<br>Vedd figyelembe, hogy a téma elrendezése függ a képek méretétől " +"is!<br>" + +#: configdialog/kbfxconfigapp.cpp:53 +msgid "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip! </b>Here you can " +"select what plugins will be enabled and in which panel of the KBFX menu." +msgstr "" +"<font size='+1'><b>KBFX modulok</b><br></font><b>Tipp! </b>Itt választhatod " +"ki, hogy melyik modulok legyenek engedélyzve és, hogy a KBFX menü mely " +"paneljén." + +#: configdialog/kbfxconfigapp.cpp:56 +msgid "" +"<font size='+1'><b>Menu Type</b><br></font><b>Tip! </b>Please select which " +"kind of menu you would like to use." +msgstr "" +"<font size=\"+2\"><br></font><font size=\"+3\"><b>Menü típusa</b></" +"font><br><b>Tipp!</b>\n" +"Válaszd ki milyen típusú menüt szeretnél használni. <br>KBFX menü vagy KDE " +"Menü." + +#: configdialog/kbfxconfigapp.cpp:59 +msgid "" +"<font size='+1'><b>KBFX Themes</b><br></font><b>Tip! </b>To keep it simple " +"place all your themes inside one folder.<br>Then create different folders " +"inside that folder with different names.<br>KBFX will then read those " +"folders as themes." +msgstr "" +"<font size=\"+2\"><br></font><font size=\"+3\"><b>Kbfx Témák</b></" +"font><br><b>Tipp!</b> \n" +"Hogy egyszerűvé tedd a témakezelést, helyezz minden témát egy könyvtáron " +"belül alkönyvtárakba.<br>A KBFX ezekután minden könyvtárat külön témaként " +"kezel." + +#: configdialog/kbfxconfigapp.cpp:64 +msgid "" +"<font size='+1'><b>KBFX tooltip settings</b><br></font><b>Tip! </b>Here you " +"can configure the behaviour of KBFX's own tooltip." +msgstr "" +"<font size='+1'><b>KBFX eszköztipp beállítások</b><br></font><b>Tipp!</b>Itt " +"állíthatod be a KBFX saját eszköztippjeinek viselkedését." + +#: configdialog/kbfxconfigapp.cpp:93 +msgid "Themes" +msgstr "Témák" + +#: configdialog/kbfxconfigapp.cpp:105 rc.cpp:230 +#, no-c-format +msgid "Start Button" +msgstr "Start gomb" + +#: configdialog/kbfxconfigapp.cpp:121 rc.cpp:239 +#, no-c-format +msgid "Menu Style" +msgstr "Menü stílus" + +#: configdialog/kbfxconfigapp.cpp:130 rc.cpp:242 +#, no-c-format +msgid "Tooltip" +msgstr "Eszköztipp" + +#: configdialog/kbfxconfigapp.cpp:141 +msgid "Layout" +msgstr "Elrendezés" + +#: configdialog/kbfxconfigapp.cpp:151 rc.cpp:248 +#, no-c-format +msgid "Plugins" +msgstr "Modulok" + +#: configdialog/kbfxconfigapp.cpp:240 +msgid "No default settings here ;)" +msgstr "Itt nincsenek alapértelmezett beállítások ;)" + +#: configdialog/kbfxconfigapp.cpp:423 +msgid "<p align='center'>Could not create this KBFX theme package.</p>" +msgstr "<p align='center'>Nem sikerült létrehozni ezt a KBFX témacsomagot.</p>" + +#: configdialog/kbfxconfigapp.cpp:435 +msgid "<p align='center'>KBFX Theme <strong>%1</strong> prepared.</p>" +msgstr "<p align='center'>A(z) <strong>%1</strong> KBFX téma elkészítve.</p>" + +#: configdialog/kbfxconfigapp.cpp:436 +msgid "KBFX Theme Ready" +msgstr "KBFX téma kész" + +#: configdialog/main.cpp:33 +msgid "KBFX Configuration Utility" +msgstr "KBFX Beállító Segédprogram" + +#: configdialog/main.cpp:39 +msgid "kbfxconfigapp" +msgstr "kbfxconfigapp" + +#: configdialog/main.cpp:52 +msgid "Install KBFX theme from <URL>" +msgstr "KBFX téma telepítése saját <URL> címről" + +#: configdialog/main.cpp:53 +msgid "Prepare KBFX theme from folder <URL>" +msgstr "KBFX téma előkészítése a következő <URL>-en található könyvtárból" + +#: configdialog/main.cpp:54 +msgid "Show the About page" +msgstr "Névjegy mutatása" + +#: src/kbfxspinx.cpp:234 +msgid "This is a help box" +msgstr "Ez egy súgó doboz" + +#: src/kbfxspinx.cpp:358 +msgid "Remove KBFX from Pannel" +msgstr "KBFX eltávolítása a Panelről" + +#: src/kbfxspinx.cpp:360 +msgid "Reload KBFX" +msgstr "KBFX újratöltése" + +#: src/kbfxspinx.cpp:363 +msgid "Configure KBFX" +msgstr "KBFX beállítása" + +#: src/kbfxspinx.cpp:365 +msgid "Edit Applications Menu" +msgstr "Alkalmazások menü szerkesztése" + +#: src/kbfxspinxmenu.cpp:54 +msgid "Double click to clear..." +msgstr "Törléshez kattints kétszer..." + +#: src/kbfxspinxmenu.cpp:66 +msgid "Type here to search..." +msgstr "Keresendő kifejezés..." + +#: src/kbfxbutton.cpp:270 +msgid "" +"Invalid images were dropped!\n" +"Cannot set the KBFX button to use these images!" +msgstr "" +"Érvénytelen képeket helyeztél el!\n" +"Nem lehet beállítani a KBFX gombot ezen képek használatára!" + +#: src/kbfxbutton.cpp:272 +msgid "Error setting KBFX button images" +msgstr "Hiba a KBFX gomb képeinek beállításakor" + +#: rc.cpp:3 +#, no-c-format +msgid "KBFX Button" +msgstr "KBFX gomb" + +#: rc.cpp:6 +#, no-c-format +msgid "" +"To change KBFX button skin, simply browse to the image you want OR just " +"Drag&Drop the images to their respective place." +msgstr "" +"A KBFX gomb kinézetének megváltoztatásához egyszerűen csak nyisd meg a " +"használni kívánt képet VAGY \"húzd és ejtsd\" a képeket a megfelelő helyre." + +#: rc.cpp:9 +#, no-c-format +msgid "Livepreview" +msgstr "Élőkép" + +#: rc.cpp:12 +#, no-c-format +msgid "" +"<b>Tip!</b> To see live preview, hover or press the preview image with your " +"mouse." +msgstr "" +"<b>Tipp!</b> Az élő előnézeti kép megtekintéséhez vidd az egérkurzort az " +"előnézeti kép fölé vagy kattints rajta." + +#: rc.cpp:15 +#, no-c-format +msgid "KBFX Button live preview" +msgstr "KBFX gomb élő előnézet" + +#: rc.cpp:18 +#, no-c-format +msgid "Here you can see the live preview of the KBFX Button." +msgstr "Itt láthatod a KBFX gomb valósidejű előnézeti képét." + +#: rc.cpp:21 +#, no-c-format +msgid "Resize Panel" +msgstr "Panel átméretezése" + +#: rc.cpp:24 +#, no-c-format +msgid "" +"<b>Tip!</b> This button resizes the panel on which the KBFX button is to " +"button's height or width." +msgstr "" +"<b>Tipp!</b> Ez a gomb átméretezi a KBFX gombot tartalmazó eszköztárt saját " +"magasságára, illetve szélességére." + +#: rc.cpp:27 configdialog/kbfxconfigdlgbutton.ui.h:141 +#, no-c-format +msgid "Panel Resize is 'ON'" +msgstr "Eszköztár átméretezés \"BE\"" + +#: rc.cpp:32 +#, no-c-format +msgid "<h3><p align=\"center\">Preview of selected images</p></h3>" +msgstr "<h3><p align=\"center\">Választott képek előnézete</p></h3>" + +#: rc.cpp:35 +#, no-c-format +msgid "\"PRESSED\" IMAGE SELECTION" +msgstr "\"LENYOMOTT\" KÉP VÁLASZTÁS" + +#: rc.cpp:38 +#, no-c-format +msgid "Please select \"pressed\" image." +msgstr "Válaszd ki a \"Lenyomott\" állapothoz tartozó képet." + +#: rc.cpp:41 rc.cpp:65 rc.cpp:89 +#, no-c-format +msgid "image/jpeg image/png image/x-xpm image/gif" +msgstr "Képek/jpeg Képek/png Képek/x-xpm Képek/gif" + +#: rc.cpp:44 +#, no-c-format +msgid "The Pressed Button Skin Image" +msgstr "A \"Lenyomott\" állapothoz tartozó kép" + +#: rc.cpp:47 +#, no-c-format +msgid "Here you can choose the Pressed Button Skin Image" +msgstr "Itt választhatod ki a \"Lenyomott\" állapotú gombhoz tartozó képet" + +#: rc.cpp:50 rc.cpp:74 rc.cpp:98 +#, no-c-format +msgid "Preview" +msgstr "Előnézet" + +#: rc.cpp:53 +#, no-c-format +msgid "Pressed Button Skin" +msgstr "Lenyomott állapotú gomb képe" + +#: rc.cpp:56 +#, no-c-format +msgid "Here you can Drag&Drop the Pressed Button Skin Image." +msgstr "Ide ejtheted a \"Lenyomott\" állapotú gomb képét." + +#: rc.cpp:59 +#, no-c-format +msgid "\"NORMAL\" IMAGE SELECTION" +msgstr "\"NORMÁL\" KÉP VÁLASZTÁS" + +#: rc.cpp:62 +#, no-c-format +msgid "Please select \"normal\" image." +msgstr "Válaszd ki a \"normál\" állapothoz tartozó képet." + +#: rc.cpp:68 +#, no-c-format +msgid "The Normal Button Skin Image" +msgstr "A \"Normál\" állapotú gomb képe" + +#: rc.cpp:71 +#, no-c-format +msgid "Here you can choose the Normal Button Skin Image" +msgstr "Itt választhatod ki a \"Normál\" állapothoz tartozó képet" + +#: rc.cpp:77 +#, no-c-format +msgid "Normal Button Skin" +msgstr "\"Normál\" állapotú gomb képe" + +#: rc.cpp:80 +#, no-c-format +msgid "Here you can Drag&Drop the Normal Button Skin Image." +msgstr "Ide ejtheted a \"Normál\" állapotú gomb képét." + +#: rc.cpp:83 +#, no-c-format +msgid "\"HOVER\" IMAGE SELECTION" +msgstr "\"FÓKUSZÁLT\" KÉP VÁLASZTÁS" + +#: rc.cpp:86 +#, no-c-format +msgid "Please select \"hover\" image." +msgstr "Válaszd ki a \"Fókuszált\" állapothoz tartozó képet." + +#: rc.cpp:92 +#, no-c-format +msgid "The Hover Button Skin Image" +msgstr "A \"Fókuszált\" állapotú gombhoz tartozó kép" + +#: rc.cpp:95 +#, no-c-format +msgid "Here you can choose the Hover Button Skin Image" +msgstr "Itt választhatod ki a \"Fókuszált\" állapotú gombhoz tartozó képet" + +#: rc.cpp:101 +#, no-c-format +msgid "Hover Button Skin" +msgstr "\"Fókuszált\" állapotú gomb képe" + +#: rc.cpp:104 +#, no-c-format +msgid "Here you can Drag&Drop the Hover Button Skin Image." +msgstr "Ide ejtheted a \"Fókuszált\" állapotú gomb képét." + +#: rc.cpp:107 +#, no-c-format +msgid "<h3><p align=\"center\">Please select KBFX button's images</p></h3>" +msgstr "<h3><p align=\"center\">Válaszd ki a KBFX gomb képeit</p></h3>" + +#: rc.cpp:110 rc.cpp:179 rc.cpp:296 rc.cpp:404 rc.cpp:440 rc.cpp:461 +#, no-c-format +msgid "KBFX Control Center" +msgstr "KBFX vezérlőpult" + +#: rc.cpp:113 +#, no-c-format +msgid "<b><h3><p align=\"center\">Layout options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Elrendezés beállítások</p></h3></b>" + +#: rc.cpp:116 +#, no-c-format +msgid "EXPORT KBFXLAYOUTRC FILE" +msgstr "KBFXLAYOUTRC FÁJL EXPORTÁLÁSA" + +#: rc.cpp:119 +#, no-c-format +msgid "Export the kbfxlayoutrc file to a folder" +msgstr "kbfxlayoutrc fájl exportálása könyvtárba" + +#: rc.cpp:122 rc.cpp:473 +#, no-c-format +msgid "Setup fonts for your KBFX" +msgstr "KBFX betűtípusainak testreszabása" + +#: rc.cpp:125 rc.cpp:476 +#, no-c-format +msgid "Theme that is edited:" +msgstr "Szerkesztett téma:" + +#: rc.cpp:128 rc.cpp:479 +#, no-c-format +msgid "<p align=\"left\"><b>default</b></p>" +msgstr "<p align=\"left\"><b>alapértelmezés</b></p>" + +#: rc.cpp:131 rc.cpp:482 +#, no-c-format +msgid "Please select the theme you want to edit" +msgstr "Válaszd ki a szerkeszteni kívánt témát" + +#: rc.cpp:134 +#, no-c-format +msgid "Select the Layout property to change" +msgstr "Válaszd ki a szerkeszteni kívánt elrendezési tulajdonságot" + +#: rc.cpp:137 +#, no-c-format +msgid "Make it 2 panels (Left \"ON\")" +msgstr "Váltás 2 paneles módba (Baloldali \"BE\")" + +#: rc.cpp:140 +#, no-c-format +msgid "Make it 2 panels (Right \"ON\")" +msgstr "Váltás 2 paneles módba (Jobboldali \"BE\")" + +#: rc.cpp:143 +#, no-c-format +msgid "Make it 3 panels" +msgstr "Váltás 3 paneles módba" + +#: rc.cpp:146 +#, no-c-format +msgid "textLabel1" +msgstr "textLabel1" + +#: rc.cpp:149 +#, no-c-format +msgid "textLabel2" +msgstr "textLabel2" + +#: rc.cpp:152 +#, no-c-format +msgid "textLabel3" +msgstr "textLabel3" + +#: rc.cpp:155 +#, no-c-format +msgid "textLabel4" +msgstr "textLabel4" + +#: rc.cpp:158 +#, no-c-format +msgid "checkBox1" +msgstr "checkBox1" + +#: rc.cpp:161 +#, no-c-format +msgid "textLabel5" +msgstr "textLabel5" + +#: rc.cpp:164 +#, no-c-format +msgid "textLabel6" +msgstr "textLabel6" + +#: rc.cpp:167 +#, no-c-format +msgid "textLabel7" +msgstr "textLabel7" + +#: rc.cpp:170 +#, no-c-format +msgid "textLabel8" +msgstr "textLabel8" + +#: rc.cpp:173 +#, no-c-format +msgid "checkBox2" +msgstr "checkBox2" + +#: rc.cpp:176 +#, no-c-format +msgid "C&ustom" +msgstr "Egyéni" + +#: rc.cpp:182 +#, no-c-format +msgid "<b><h3><p align=\"center\">Plugins options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Modul beállítások</p></h3></b>" + +#: rc.cpp:185 +#, no-c-format +msgid "Select KBFX Panel" +msgstr "KBFX panel kiválasztása" + +#: rc.cpp:188 rc.cpp:191 +#, no-c-format +msgid "Plugin to configure" +msgstr "Beállítandó modul" + +#: rc.cpp:194 +#, no-c-format +msgid "Please select the panel you want to configure: " +msgstr "Válaszd ki, melyik panelt szeretnéd beállítani: " + +#: rc.cpp:197 +#, no-c-format +msgid "&Available Plugins:" +msgstr "Elérhető modulok:" + +#: rc.cpp:200 +#, no-c-format +msgid "&Enabled Plugins:" +msgstr "Engedélyezett modulok:" + +#: rc.cpp:203 +#, no-c-format +msgid "&Configure Plugin" +msgstr "Modul beállítása" + +#: rc.cpp:206 +#, no-c-format +msgid "Alt+C" +msgstr "Alt+C" + +#: rc.cpp:209 rc.cpp:212 +#, no-c-format +msgid "Configure the selected plugin" +msgstr "Választott modul beállítása" + +#: rc.cpp:215 +#, no-c-format +msgid "&Plugin Information" +msgstr "Modul Információ" + +#: rc.cpp:218 +#, no-c-format +msgid "Alt+P" +msgstr "Alt+P" + +#: rc.cpp:221 rc.cpp:224 +#, no-c-format +msgid "Information about the selected plugin" +msgstr "Választott modul részletei" + +#: rc.cpp:227 +#, no-c-format +msgid "KBFX Configurator Application" +msgstr "KBFX Beállító Alkalmazás" + +#: rc.cpp:233 +#, no-c-format +msgid "KBFX Themes" +msgstr "KBFX témák" + +#: rc.cpp:245 +#, no-c-format +msgid "Search Engine" +msgstr "Keresőmotor" + +#: rc.cpp:251 +#, no-c-format +msgid "About KBFX" +msgstr "A KBFX névjegye" + +#: rc.cpp:254 +#, no-c-format +msgid "" +"<br><p align=\"center\"><br><br><br>If you want you can check the latest " +"news for KBFX from here:<br><a href=\"http://www.kbfx.org/\">KBFX News</a></" +"p>" +msgstr "" +"<br><p align=\"center\"><br><br><br>A KBFX-szel kapcsolatos legfrissebb " +"hírekért látogass el ide: <br><a href=\"http://www.kbfx.org/\">KBFX Hírek</" +"a></p>" + +#: rc.cpp:260 +#, no-c-format +msgid "Alt+H" +msgstr "Alt+H" + +#: rc.cpp:263 +#, no-c-format +msgid "Open Help Documentation" +msgstr "Súgó megnyitása" + +#: rc.cpp:266 +#, no-c-format +msgid "&Default" +msgstr "Alapértelmezett" + +#: rc.cpp:269 +#, no-c-format +msgid "Alt+D" +msgstr "Alt+D" + +#: rc.cpp:272 +#, no-c-format +msgid "Apply the default configuration for this section only" +msgstr "Alapértelmezett beállítások alkalmazása csak erre a szakaszra" + +#: rc.cpp:278 +#, no-c-format +msgid "Alt+A" +msgstr "Alt+A" + +#: rc.cpp:281 +#, no-c-format +msgid "Save the configuration and Apply it" +msgstr "Beállítások mentése és alkalmazása" + +#: rc.cpp:287 +#, no-c-format +msgid "Alt+X" +msgstr "Alt+X" + +#: rc.cpp:290 +#, no-c-format +msgid "Exit the configuration without saving" +msgstr "Kilépés a beállításokból mentés nélkül" + +#: rc.cpp:293 +#, no-c-format +msgid "<font size=\"+2\"><b>Kbfx start button</b><br></font>" +msgstr "<font size=\"+2\"><b>KBFX start gomb</b><br></font>" + +#: rc.cpp:299 +#, no-c-format +msgid "Select default folder" +msgstr "Alapértelmezett könyvtár kiválasztása" + +#: rc.cpp:302 +#, no-c-format +msgid "Please select the target folder where your themes are." +msgstr "Válaszd ki a témákat tartalmazó könyvtárat." + +#: rc.cpp:305 +#, no-c-format +msgid "SpixBar" +msgstr "SpixBar" + +#: rc.cpp:308 +#, no-c-format +msgid "Installed Themes" +msgstr "Telepített témák" + +#: rc.cpp:311 +#, no-c-format +msgid "Here are listed all the installed KBFX Themes" +msgstr "Itt vannak felsorolva a telepített KBFX témák" + +#: rc.cpp:314 +#, no-c-format +msgid "Selected Theme Preview" +msgstr "Választott téma előnézete" + +#: rc.cpp:317 +#, no-c-format +msgid "Delete Selected" +msgstr "Kijelöltek törlése" + +#: rc.cpp:320 +#, no-c-format +msgid "Delete the Selected Theme" +msgstr "Kiválasztott téma törlése" + +#: rc.cpp:323 +#, no-c-format +msgid "" +"Pressing the button will delete the currently selected theme. <br><b>Warning!" +"</b> You cannot delete the installed system wide themes!" +msgstr "" +"A gomb lenyomásával az éppen kijelölt téma törlésre kerül. <br><b>Figyelem!</" +"b> Az egész rendszerre érvényes témákat nem lehet törölni!" + +#: rc.cpp:326 +#, no-c-format +msgid "Get Themes" +msgstr "Témák beszerzése" + +#: rc.cpp:329 +#, no-c-format +msgid "Get More Themes from the Internet" +msgstr "További témák beszerzése az Internetről" + +#: rc.cpp:332 +#, no-c-format +msgid "" +"Pressing the button will launch konqueror and go to the KBFX Themes Section " +"on www.kde-look.org" +msgstr "" +"A gomb megnyomásával egy Konqueror ablak nyílik a www.kde-look.org KBFX téma " +"szekciójával" + +#: rc.cpp:335 +#, no-c-format +msgid "Install Theme" +msgstr "Téma telepítése" + +#: rc.cpp:338 +#, no-c-format +msgid "Install New Theme from KBFX Theme Package" +msgstr "Új téma telepítése KBFX Témacsomagból" + +#: rc.cpp:341 +#, no-c-format +msgid "" +"Pressing the button will offer a dialog where you can choose KBFX Theme " +"Package to install in your home folder" +msgstr "" +"A gomb megnyomásával kiválaszthatod hogy megy KBFX témacsomag kerüljön " +"telepítésre a saját könyvtáradba" + +#: rc.cpp:344 rc.cpp:583 +#, no-c-format +msgid "Theme Info" +msgstr "Téma Info" + +#: rc.cpp:347 +#, no-c-format +msgid "Show specific theme info" +msgstr "Témaspecifikus információ megjelenítése" + +#: rc.cpp:350 +#, no-c-format +msgid "Pressing the button will show you specific theme info" +msgstr "A gomb megnyomásával megtekintheted a témaspecifikus információkat" + +#: rc.cpp:353 +#, no-c-format +msgid "Personal Image" +msgstr "Saját kép" + +#: rc.cpp:356 +#, no-c-format +msgid "Theme's Default" +msgstr "Téma alapértelmezése" + +#: rc.cpp:359 +#, no-c-format +msgid "Set the Theme's Default Personal Image" +msgstr "Téma alapértelmezett saját képének beállítása" + +#: rc.cpp:362 +#, no-c-format +msgid "" +"Pressing the button will delete the personal image you have selected and " +"install the theme's default personal image" +msgstr "" +"A gomb megnyomásával a beállított saját kép törlődik és helyette a témában " +"beállítottalapértelmezett kép kerül telepítésre" + +#: rc.cpp:365 +#, no-c-format +msgid "Maxsize 48 x 48" +msgstr "Maximális méret 48 x 48" + +#: rc.cpp:368 +#, no-c-format +msgid "Select New image" +msgstr "Új kép kiválasztása" + +#: rc.cpp:371 +#, no-c-format +msgid "Select a Personal Image" +msgstr "Saját kép kiválasztása" + +#: rc.cpp:374 +#, no-c-format +msgid "Pressing the button will open a dialog to select your personal image" +msgstr "A gomb megnyomásával kiválaszthatod a saját személyes képed" + +#: rc.cpp:377 +#, no-c-format +msgid "This is your personal image displayed at the KBFX menu." +msgstr "Ez a saját kép mely a KBFX menü bal felső sarkában kerül megjelenítésre." + +#: rc.cpp:380 +#, no-c-format +msgid "Misc Options" +msgstr "Egyéb beállítások" + +#: rc.cpp:383 +#, no-c-format +msgid "Watch System Installs" +msgstr "Rendszertelepítések figyelése" + +#: rc.cpp:386 rc.cpp:389 +#, no-c-format +msgid "Watch for applications installs and reload KBFX if any occurs" +msgstr "Alkalmazás telepítések figyelése és KBFX újratöltése szükség esetén" + +#: rc.cpp:392 rc.cpp:395 +#, no-c-format +msgid "Show Old Themes" +msgstr "Régi témák megjelenítése" + +#: rc.cpp:398 +#, no-c-format +msgid "<b><h3><p align=\"center\">Please select theme folder</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Válassz téma könyvtárat</p></h3></b>" + +#: rc.cpp:401 +#, no-c-format +msgid "<b><h3><p align=\"center\">Installed themes</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Telepített témák</p></h3></b>" + +#: rc.cpp:407 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Eszköztipp KI/BEkapcsolása</p></h3></b>" + +#: rc.cpp:410 +#, no-c-format +msgid "Turn off or on the tooltip" +msgstr "Eszköztipp ki/bekapcsolása" + +#: rc.cpp:413 +#, no-c-format +msgid "" +"Turn your tooltip off or on. <br>You can see the current status of the " +"tooltip to the right." +msgstr "" +"Eszköztipp ki/bekapcsolása. <br>Az eszköztipp aktuális állapota jobboldalt " +"látható." + +#: rc.cpp:416 +#, no-c-format +msgid "Turn the tooltip \"OFF\"" +msgstr "Eszköztipp \"KI\"" + +#: rc.cpp:419 +#, no-c-format +msgid "Tooltip Text" +msgstr "Eszköztipp szövege" + +#: rc.cpp:422 +#, no-c-format +msgid "Type the text which you want to be displayed in the tooltip." +msgstr "Írd be az eszköztippben megjeleníteni kívánt szöveget." + +#: rc.cpp:425 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip personal text</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Személyes eszköztipp szövege</p></h3></b>" + +#: rc.cpp:428 +#, no-c-format +msgid "Tooltip animation" +msgstr "Eszköztipp animáció" + +#: rc.cpp:431 +#, no-c-format +msgid "" +"Turn your tooltip animation off or on. <br>You can see the current status of " +"the tooltip to the right." +msgstr "" +"Eszköztipp animációjának ki/bekapcsolása. <br>Az animáció aktuális állapota " +"jobboldalt látható." + +#: rc.cpp:434 +#, no-c-format +msgid "Turn the animation \"ON\"" +msgstr "Animáció \"BE\"" + +#: rc.cpp:437 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip animation ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Eszköztipp animáció KI/BEkapcsolása</p></h3></b>" + +#: rc.cpp:443 +#, no-c-format +msgid "<b><h3><p align=\"center\">Menu type</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Menü típusa</p></h3></b>" + +#: rc.cpp:446 +#, no-c-format +msgid "Please select the menu style" +msgstr "Válaszd ki a menü stílusát" + +#: rc.cpp:449 rc.cpp:455 +#, no-c-format +msgid "KBFX MENU" +msgstr "KBFX MENÜ" + +#: rc.cpp:452 rc.cpp:458 +#, no-c-format +msgid "KDE MENU" +msgstr "KDE MENÜ" + +#: rc.cpp:464 +#, no-c-format +msgid "<b><h3><p align=\"center\">Font options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Betűtípus beállítások</p></h3></b>" + +#: rc.cpp:467 +#, no-c-format +msgid "EXPORT KBFXFONTRC FILE" +msgstr "KBFXFONTRC FÁJL EXPORTÁLÁSA" + +#: rc.cpp:470 +#, no-c-format +msgid "Export the kbfxfontrc file to a folder" +msgstr "kbfxfontrc fájl exportálása könyvtárba" + +#: rc.cpp:485 +#, no-c-format +msgid "Bold fonts on hover" +msgstr "Félkövér betűk fókusznál" + +#: rc.cpp:488 rc.cpp:491 +#, no-c-format +msgid "Make fonts bolder when you hover the mouse over an item" +msgstr "A betűk legyenek félkövérek, ha az egér egy elem fölött van" + +#: rc.cpp:494 +#, no-c-format +msgid "Application \"LINE\":" +msgstr "Alkalmazás \"SOR\":" + +#: rc.cpp:497 +#, no-c-format +msgid "Horizontal line color in the application area." +msgstr "Vízszintes vonal színe az alkalmazásterületen." + +#: rc.cpp:500 +#, no-c-format +msgid "Application text :" +msgstr "Alkalmazás szövege:" + +#: rc.cpp:503 +#, no-c-format +msgid "Select the color of the \"application\" in the menu." +msgstr "Válaszd ki a menüben lévő \"alkalmazás\" színét." + +#: rc.cpp:506 +#, no-c-format +msgid "Comment text:" +msgstr "Megjegyzés szövegének színe:" + +#: rc.cpp:509 +#, no-c-format +msgid "Color of the \"comments\" in the menu." +msgstr "A menüben lévő \"megjegyzések\" színe." + +#: rc.cpp:512 +#, no-c-format +msgid "Name display:" +msgstr "Név megjelenítés:" + +#: rc.cpp:515 rc.cpp:527 rc.cpp:533 +#, no-c-format +msgid "The color of your login name in the menu." +msgstr "Menüben megjelenő bejelentkezési név színe." + +#: rc.cpp:518 +#, no-c-format +msgid "Category text:" +msgstr "Kategória szövege:" + +#: rc.cpp:521 +#, no-c-format +msgid "Font color of the categoris in the menu." +msgstr "Kategóriák betűszíne." + +#: rc.cpp:524 +#, no-c-format +msgid "Separator:" +msgstr "Elválasztó:" + +#: rc.cpp:530 +#, no-c-format +msgid "Plugin:" +msgstr "Modul:" + +#: rc.cpp:536 +#, no-c-format +msgid "Select font for the application's text" +msgstr "Add meg az alkalmazások betűtípusát" + +#: rc.cpp:539 +#, no-c-format +msgid "Select font for the comment's text" +msgstr "Add meg a megjegyzések betűtípusát" + +#: rc.cpp:542 +#, no-c-format +msgid "Select font for the username's text" +msgstr "Add meg a felhasználónév betűtípusát" + +#: rc.cpp:545 +#, no-c-format +msgid "Select font for the category's text" +msgstr "Add meg a kategória szövegének betűtípusát" + +#: rc.cpp:548 +#, no-c-format +msgid "Select font for the separator's text" +msgstr "Add meg az elválasztók szövegének betűtípusát" + +#: rc.cpp:551 +#, no-c-format +msgid "Select font for the plugins' text" +msgstr "Válaszd ki a modulok szöveg betűtípusát" + +#: rc.cpp:554 +#, no-c-format +msgid "Form1" +msgstr "Form1" + +#: rc.cpp:557 +#, no-c-format +msgid "<b><h3><p align=\"center\">People behind KBFX</p></h3></b>" +msgstr "<b><h3><p align=\"center\">A KBFX mögött álló emberek</p></h3></b>" + +#: rc.cpp:560 +#, no-c-format +msgid "You are running: <b>KBFX 0493</b>" +msgstr "A <b>KBFX 0493</b> verzióját futtatod" + +#: rc.cpp:563 +#, no-c-format +msgid "" +"Here are the people behind the KBFX application.\n" +"We would like to thank all people who have helped with KBFX or have donated " +"money to our project!\n" +"THANKS A LOT ALL OF YOU OUT THERE!!!" +msgstr "" +"Itt olvashatsz a kbfx mögött álló emberekről.\n" +"Szeretnénk köszönetet mondani mindazoknak, akik segítettek a KBFX\n" +"fejlesztésében és akik adományukkal segítették a projektet! KÖSZÖNET\n" +"MINDANNYIÓTOKNAK ODAKINN!!!" + +#: rc.cpp:568 +#, no-c-format +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project " +"Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> Siraj Razick<br><br><strong>Ország:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Szerző, Karbantartó, Fejlesztő, " +"Projektvezető<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" + +#: rc.cpp:571 +#, no-c-format +msgid "" +"<b>Tip!</b> Hover over the contact images to see each personal contact " +"information." +msgstr "" +"<b>Tipp!</b>Húzd az egeret a képek fölé, hogy megtekinthesd minden személy " +"kapcsolati adatait." + +#: rc.cpp:574 +#, no-c-format +msgid "SPONSORS!" +msgstr "TÁMOGATÓK!" + +#: rc.cpp:577 +#, no-c-format +msgid "" +"We would like to thank swedish computer company <b>PC Agenten</b> for " +"sponsoring us with a server and bandwidth." +msgstr "" +"Szeretnénk köszönetet mondani a svéd <b>PC Agenten</b> számítástechnikai " +"cégnek hogy egy szerverrel és sávszélességgel támogatott bennünket." + +#: rc.cpp:580 +#, no-c-format +msgid "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE</a></u></b></p>" +msgstr "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE </a></u></b></p>" + +#: rc.cpp:589 +#, no-c-format +msgid "<p align=\"right\"><b>Name:</b></p>" +msgstr "<p align=\"right\"><b>Név:</b></p>" + +#: rc.cpp:592 +#, no-c-format +msgid "<p align=\"right\"><b>Version:</b></p>" +msgstr "<p align=\"right\"><b>Verzió:</b></p>" + +#: rc.cpp:595 +#, no-c-format +msgid "<p align=\"right\"><b>Author:</b></p>" +msgstr "<p align=\"right\"><b>Szerző:</b></p>" + +#: rc.cpp:598 +#, no-c-format +msgid "<p align=\"right\"><b>Email:</b></p>" +msgstr "<p align=\"right\"><b>Email:</b></p>" + +#: rc.cpp:601 +#, no-c-format +msgid "<p align=\"right\"><b>Homepage:</b></p>" +msgstr "<p align=\"right\"><b>Weboldal:</b></p>" + +#: rc.cpp:604 rc.cpp:607 rc.cpp:610 rc.cpp:613 rc.cpp:616 +#, no-c-format +msgid "Test" +msgstr "Test" + +#: configdialog/kbfxconfigdlgthemes.ui.h:61 +msgid "" +"<p align='center'>Invalid user themes folder!</p><p align='center'>Will use " +"default user themes folder.</p>" +msgstr "" +"<p align='center'>Érvénytelen felhasználói témakönyvtár!</p><p " +"align='center'>Az alapértelmezettet fogom használni.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:63 +msgid "Error loading themes" +msgstr "Hiba a témák betöltésekor" + +#: configdialog/kbfxconfigdlgthemes.ui.h:170 +msgid "" +"<p align='center'>Are you sure you want to uninstall the KBFX theme <strong>%" +"1</strong>?</p>" +msgstr "<p>Biztosan törölni szeretnéd a(z) <strong>%1</strong> témát?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:171 +msgid "Uninstall KBFX theme" +msgstr "KBFX téma eltávolítása" + +#: configdialog/kbfxconfigdlgthemes.ui.h:172 +msgid "Uninstall" +msgstr "Eltávolítás" + +#: configdialog/kbfxconfigdlgthemes.ui.h:177 +msgid "" +"<p align='center'>Do you want to keep your personal settings for theme " +"<strong>%1</strong>?</p>" +msgstr "<p>Szeretnéd megtartani a(z) <strong>%1</strong> témához tartozó személyes beállításaid?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:178 +msgid "Personal settings" +msgstr "Személyes beállítások" + +#: configdialog/kbfxconfigdlgthemes.ui.h:179 +msgid "Keep settings" +msgstr "Beállítások megtartása" + +#: configdialog/kbfxconfigdlgthemes.ui.h:180 +msgid "Delete settings" +msgstr "Beállítások törlése" + +#: configdialog/kbfxconfigdlgthemes.ui.h:210 +msgid "" +"<p align='center'>Could not uninstall this KBFX theme.</p><p " +"align='center'>You may not have sufficient permissions to delete the folder " +"<strong>%1<strong>.</p>" +msgstr "" +"<p align='center'>Nem sikerült eltávolítani ezt a KBFX témát.</p><p " +"align='center'>Valószínűleg nincs elegendő jogosultságod a(z) <strong>%1</" +"strong> könyvtár törléséhez.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:223 +msgid "KBFX theme packages (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" +msgstr "KBFX témacsomagok (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" + +#: configdialog/kbfxconfigdlgthemes.ui.h:227 +msgid "Select KBFX theme package to install" +msgstr "Válaszd ki a telepíteni kívánt témacsomagot" + +#: configdialog/kbfxconfigdlgthemes.ui.h:243 +msgid "<p align='center'>Could not read this KBFX theme package.</p>" +msgstr "<p align='center'>Nem sikerült olvasni ezt a KBFX témacsomagot.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:270 +msgid "Select personal image" +msgstr "Személyes kép kiválasztása" + +#: configdialog/kbfxconfigdlgthemes.ui.h:281 +msgid "" +"<p align='center'>Image cannot be used as a personal image!</p><p " +"align='center'>Will use default personal image.</p>" +msgstr "" +"<p align='center'>A választott kép nem használható mint személyes kép!</p><p " +"align='center'>Az alapértelmezett képet fogom használni.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:283 +#: configdialog/kbfxconfigdlgbutton.ui.h:65 +#: configdialog/kbfxconfigdlgbutton.ui.h:86 +#: configdialog/kbfxconfigdlgbutton.ui.h:107 +msgid "Error loading image" +msgstr "Hiba a kép betöltésekor" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:23 +msgid "Turn the animation 'OFF'" +msgstr "Animáció \"KI\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:30 +msgid "Turn the animation 'ON'" +msgstr "Animáció \"BE\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:53 +msgid "Turn the tooltip 'OFF'" +msgstr "Eszköztippek \"KI\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:60 +msgid "Turn the tooltip 'ON'" +msgstr "Eszköztipp \"BE\"" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:122 +msgid "Select folder to export kbfxfontrc file" +msgstr "Válaszd ki a kbfxfontrc fájl exportjának célkönyvtárát" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:151 +msgid "" +"<p align='center'>The Font configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>A(z) <strong>%1</strong> KBFX témához tartozó betűtípus " +"beállítások exportja sikeresen megtörtént!</p>" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:152 +msgid "KBFX Font Export Ready" +msgstr "KBFX betűtípus export kész" + +#: configdialog/kbfxconfigdlgabout.ui.h:23 +msgid "" +"<strong>Name:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Country:</" +"strong> Sweden<br><br><strong>KBFX:</strong> co-author, Q/A, system design, " +"web designer, bug hunter, project administror<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Ország:</" +"strong> Svédország<br><br><strong>KBFX:</strong> Társszerző, " +"minőségbiztosítás (Q/A), rendszerterv, weblaptervező, hibavadász, projekt " +"adminisztrátor<br><br><strong>Email:</strong> nookie@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:32 +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> author, maintainer, developer, project " +"administror<br><br><strong>Email:</strong> siraj@mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> Siraj Razick<br><br><strong>Ország:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Szerző, karbantartó, fejlesztő, projekt " +"adminisztrátor<br><br><strong>Email:</strong> siraj@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:41 +msgid "" +"<strong>Name:</strong> Nathanael Dracor Gogniat<br><br><strong>Country:</" +"strong> Switzerland<br><br><strong>KBFX:</strong> project technical writer, " +"documentation manager, co-author<br><br><strong>Email:</strong> " +"nathanael@mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> Nathanael Dracor Gogniat<br><br><strong>Ország:</" +"strong> Svájc<br><br><strong>KBFX:</strong> technikai szakíró, " +"dokumentációkezelő, társszerző<br><br><strong>Email:</strong> nathanael@mail." +"kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:50 +msgid "" +"<strong>Name:</strong> PhobosK<br><br><strong>Country:</strong> " +"Bulgaria<br><br><strong>KBFX:</strong> package & release manager, Q/A, bug " +"hunter, mandriva packages, project administrator, developer Qt/C+" +"+<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> PhobosK<br><br><strong>Ország:</strong> " +"Bulgária<br><br><strong>KBFX:</strong> csomag és kiadás felelős, " +"minőségbiztosítás (Q/A), hibavadász, Mandriva csomagok, projekt " +"adminisztrátor, Qt/C++ fejlesztő<br><br><strong>Email:</strong> phobosk@mail." +"kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:59 +msgid "" +"<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"developer Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" +msgstr "" +"<strong>Név:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Ország:</strong> Peru<br><br><strong>KBFX:</strong> Qt4/C++ " +"fejlesztő<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:68 +msgid "" +"<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"library developer for Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" +msgstr "" +"<strong>Név:</strong> Christofer Brodd-Reijer (Ephracis)" +"<br><br><strong>Ország:</strong> Svédország<br><br><strong>KBFX:</strong> " +"Raptor könyvtár fejlesztője<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" + +#: configdialog/kbfxconfigdlgbutton.ui.h:63 +msgid "" +"<p align='center'>Image cannot be used as a pressed button skin!</p><p " +"align='center'>Will use default pressed button skin.</p>" +msgstr "" +"<p align='center'>A választott kép nem használható mint lenyomott állapotú " +"gomb képe!</p><p align='center'>Az alapértelmezettet fogom használni.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:84 +msgid "" +"<p align='center'>Image cannot be used as a normal button skin!</p><p " +"align='center'>Will use default normal button skin.</p>" +msgstr "" +"<p align='center'>A választott kép nem használható mint normál állapotú gomb " +"képe!</p><p align='center'>Az alapértelmezettet fogom használni.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:105 +msgid "" +"<p align='center'>Image cannot be used as a hover button skin!</p><p " +"align='center'>Will use default hover button skin.</p>" +msgstr "" +"<p align='center'>A választott kép nem használható mint fókuszált állapotú " +"gomb képe!</p><p align='center'>Az alapértelmezettet fogom használni.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:147 +msgid "Panel Resize is 'OFF'" +msgstr "Eszköztár átméretezés \"KI\"" + +#: configdialog/kbfxconfigdlglayout.ui.h:16 +msgid "User Properties" +msgstr "Felhasználó tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:17 +msgid "* Top Bar Properties" +msgstr "* Felső sáv tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:18 +msgid "* Bottom Bar Properties" +msgstr "* Alsó sáv tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:20 +msgid "* List Box Properties" +msgstr "* Lista doboz tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:21 +msgid "Search Box Properties" +msgstr "Keresődoboz tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:22 +msgid "* Item Properties" +msgstr "* Elemek tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:24 +msgid "* Main Menu Properties" +msgstr "* Főmenü tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:25 +msgid "Water Effect Properties" +msgstr "Víz effektus tulajdonságai" + +#: configdialog/kbfxconfigdlglayout.ui.h:209 +msgid "Face Position X" +msgstr "Arckép X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:210 +msgid "Face Position Y" +msgstr "Arckép Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:211 +msgid "User Name Position X" +msgstr "Felhasználónév X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:212 +msgid "User Name Position Y" +msgstr "Felhasználónév Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:213 +msgid "Face Box Position X" +msgstr "Arckép doboz X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:214 +msgid "Face Box Position Y" +msgstr "Arckép doboz Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:215 +msgid "Face Box Height" +msgstr "Arckép doboz magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:216 +msgid "Face Box Width" +msgstr "Arckép doboz szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:217 +msgid "Hide User Name" +msgstr "Felhasználónév elrejtése" + +#: configdialog/kbfxconfigdlglayout.ui.h:235 +msgid "* Top Bar Height" +msgstr "* Felső sáv magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:241 +msgid "Top Bar Width" +msgstr "Felső sáv szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:266 +msgid "* Bottom Bar Height" +msgstr "* Alsó sáv magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:272 +msgid "Bottom Bar Width" +msgstr "Alsó sáv szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:322 +msgid "* List Box Position X" +msgstr "* Lista doboz X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:323 +msgid "* List Box Position Y" +msgstr "* Lista doboz Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:326 +msgid "List Box Height" +msgstr "Lista doboz magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:327 +msgid "* List Box Width" +msgstr "* Lista doboz szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:345 +msgid "Search Box Position X" +msgstr "Keresődoboz X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:346 +msgid "Search Box Position Y" +msgstr "Keresődoboz Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:349 +msgid "Search Box Height" +msgstr "Keresődoboz magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:350 +msgid "Search Box Width" +msgstr "Keresődoboz szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:368 +msgid "* Item Position X" +msgstr "* Elem X pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:369 +msgid "* Item Position Y" +msgstr "* Elem Y pozíciója" + +#: configdialog/kbfxconfigdlglayout.ui.h:370 +msgid "Icon Size in Item" +msgstr "Elem ikonjának mérete" + +#: configdialog/kbfxconfigdlglayout.ui.h:372 +msgid "Item Height" +msgstr "Elem magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:373 +msgid "* Item Width" +msgstr "* Elem szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:374 +msgid "Comment Margin in Item" +msgstr "Megjegyzés margó az elemben" + +#: configdialog/kbfxconfigdlglayout.ui.h:376 +msgid "No Comments in Item" +msgstr "Nincs megjegyzés az elemben" + +#: configdialog/kbfxconfigdlglayout.ui.h:417 +msgid "* Main Menu Height" +msgstr "* Főmenü magassága" + +#: configdialog/kbfxconfigdlglayout.ui.h:421 +msgid "* Main Menu Width" +msgstr "* Főmenü szélessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:425 +msgid "Contracted Menues" +msgstr "Összevont menük" + +#: configdialog/kbfxconfigdlglayout.ui.h:441 +msgid "Water Effect Frame Rate" +msgstr "Víz effektus képkockasebessége" + +#: configdialog/kbfxconfigdlglayout.ui.h:450 +msgid "Enabled Water Effect" +msgstr "Víz effektus engedélyezve" + +#: configdialog/kbfxconfigdlglayout.ui.h:495 +msgid "Select folder to export kbfxlayoutrc file" +msgstr "Add meg a kbfxlayoutrc fájl exportjának célkönyvtárát" + +#: configdialog/kbfxconfigdlglayout.ui.h:583 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>A(z) <strong>%1</strong> téma elrendezésének beállítása " +"sikeresen exportálva!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:584 +msgid "KBFX Layout Export Ready" +msgstr "KBFX elrendezés exportja kész" + +#: configdialog/kbfxconfigdlglayout.ui.h:651 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> is ready!</p><p align='center'>Be sure to click the <strong>Apply</" +"strong> button in order the changes to become active!</p>" +msgstr "" +"<p align='center'>A(z) <strong>%1</strong> téma elrendezése kész!</p><p " +"align='center'>Feltétlenül nyomd meg az <strong>Alkalmazás</strong> gombot, " +"hogy érvényesítsd a változtatásokat!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:652 +msgid "KBFX Layout Ready" +msgstr "KBFX elrendezés kész" + +#: configdialog/kbfxconfigdlglayout.ui.h:658 +msgid "" +"<p align='center'>KBFX will calculate the necessary values using the present " +"values for:</p><p align='center'><strong>* Main Menu Height</strong> and " +"<strong>* Main Menu Width</strong><br><strong>* Bottom Bar Height</strong> " +"and <strong>* Top Bar Height</strong><br></p><p align='center'>So be sure " +"that you have entered their values as you desire!</p><p " +"align='center'><strong>NOTE:</strong> Have in mind that the Layout of the " +"theme also depends on the sizes of the images! So if the theme does not look " +"like as you desire either change the images' sizes to smaller width OR " +"change <strong>* Main Menu Width</strong> to higher value!</p>" +msgstr "" +"<p align='center'>A KBFX a jelenlegi értékek alapján beállítja a " +"következőket:</p><p align='center'><strong>* Főmenü magassága</strong> és " +"<strong>* Főmenü szélessége</strong><br><strong>* Alsó sor magassága</" +"strong> és <strong>* Felső sor magassága</strong><br></p><p " +"align='center'>Győződj meg róla, hogy mindennek a kívánt értéket adtad meg!</" +"p><p align='center'><strong>Figyelem:</strong>Vedd figyelembe, hogy a téma " +"elrendezése a használt képek méretétől is függ! Tehát, ha a téma nem úgy néz " +"ki, ahogy szeretted volna, akkor állítsd a képeket kisebb méretűre VAGY " +"állítsd a <strong>* Főmenü magasságát</strong> nagyobbra!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:664 +msgid "Prepare Layout for the KBFX theme" +msgstr "Elrendezés előkészítése a KBFX témához" + +#: configdialog/kbfxconfigdlglayout.ui.h:665 +msgid "Prepare" +msgstr "Elkészítés" + +#: configdialog/kbfxconfigdlgplugins.ui.h:15 +msgid "Left Panel" +msgstr "Bal panel" + +#: configdialog/kbfxconfigdlgplugins.ui.h:16 +msgid "Right Panel" +msgstr "Jobb panel" + +#: configdialog/kbfxconfigdlgplugins.ui.h:79 +#: configdialog/kbfxconfigdlgplugins.ui.h:85 +msgid "<p align='center'>Not Implemented yet.</p>" +msgstr "<p align='center'>Még nincs implementálva.</p>" + +#: configdialog/kbfxconfigdlgmain.ui.h:34 +msgid "<p align='center'>Not implemented yet.</p>" +msgstr "<p align='center'>Még nincs implementálva.</p>" + diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..32c6508 --- /dev/null +++ b/po/it.po @@ -0,0 +1,1591 @@ +# translation of it.po to Italian +# Italian translation for KBFX +# Copyright (c) 2007 KBFX Team +# This file is distributed under the same license as the KBFX package. +# +# Divilinux <divilinux@mail.kbfx.org>, 2006. +# dyve <divilinux@gmail.com>, 2007. +# PhobosK <phobosk@mail.kbfx.org>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: it\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-03-04 15:53+0200\n" +"PO-Revision-Date: 2007-03-04 21:41+0200\n" +"Last-Translator: dyve <divilinux@gmail.com>\n" +"Language-Team: <it@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: _translatorinfo.cpp:1 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Divilinux" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "divilinux@mail.kbfx.org" + +#: kbfxlib/common/kbfxconfig.cpp:32 +msgid "Not Specified" +msgstr "Non specificato" + +#: kbfxlib/common/kbfxfontchooser.cpp:38 +msgid "Font..." +msgstr "Font..." + +#: configdialog/kbfxconfigapp.cpp:28 +msgid "<p align='center'>%1</p>" +msgstr "<p align='center'>%1</p>" + +#: configdialog/kbfxconfigapp.cpp:29 +msgid "You are running: <b>KBFX " +msgstr "Stai usando KBFX: <b>" + +#: configdialog/kbfxconfigapp.cpp:30 +msgid "" +"<br><p align='center'><font color='#ff0000'>The connection to the KBFX News " +"Section on www.kbfx.org is broken.</font><br><br>If you want you can check " +"the latest news for KBFX from here:<br><a href='http://www.kbfx.org/'>KBFX " +"News</a></p>" +msgstr "" +"<br><p align='center'><font color='#ff0000'>La connessione alle news KBFX " +"non e' attiva.</font><br><br>Controlla lo stesso a questo url: <br><a " +"href='http://www.kbfx.org/'>News KBFX</a></p>" + +#: configdialog/kbfxconfigapp.cpp:35 +msgid "" +"<font size='+1'><b>KBFX start button</b><br></font><b>Tip! </b>You have 3 " +"options to select for your KBFX start button.You have to select <i>(Normal, " +"Pressed, Hover)</i> images. <br>Down below you can also see a preview of the " +"images you have selected." +msgstr "<font size='+1'><b>Bottone start KBFX</b></font><b> NotaBene!</b>Si puo' scegliere fra 3 tipi diversi di bottone<i>(Normale, Pressed, Hover)</i>.<br>In basso verra' visualizzata l'anteprima dell'immagine selezionata." + +#: configdialog/kbfxconfigapp.cpp:40 +msgid "" +"<font size='+1'><b>About KBFX</b><br></font><b>Tip! </b>Here you can find " +"information about the KBFX Project and all the people involved in it." +msgstr "<font size='+1'><b>About KBFX</b><br></font><b>NotaBene!</b>Qui puoi trovare informazioni riguardo al progetto KBFX, e tutte le persone che lo hanno reso possibile." + +#: configdialog/kbfxconfigapp.cpp:43 +msgid "" +"<font size='+1'><b>KBFX font settings</b><br></font><b>Tip! </b>Here you can " +"set the fonts of the current theme.<br>If you don't have any 'kbfxfontrc' " +"file don't worry about that.<br>When done just hit 'Apply' button and KBFX " +"will save the 'kbfxfontrc' file." +msgstr "<font size='+1'><b>Impostazioni font kbfx</b><br></font><b>NotaBene!</b>E' possibile selezionare vari fonts e colori per personalizzare il menu KBFX. Se non hai il file kbfxfontrc,<br>all'interno dei tuoi temi,e' sufficiente selezionare e poi premere \"Apply\" per salvare il file." + +#: configdialog/kbfxconfigapp.cpp:48 +msgid "" +"<font size='+1'><b>KBFX Layout</b><br></font><b>Tip! </b>Here you can " +"configure the Look and Feel of your KBFX menu.<br>The most important " +"settings that are used with the '<strong>Make it...</strong>' buttons are " +"marked with '<strong>*</strong>'<br>Have in mind that the Layout of the " +"theme also depends on the sizes of the images!<br>" +msgstr "" +"<font size='+1'><b>KBFX Layout</b><br></font><b>Tip! </b>Configura l'aspetto " +"del tuo kbfx menu.<br>Le impostazioni importanti usate col bottone " +"'<strong>Crea...</strong>'sono marcate con '<strong>*</strong>'<br>Ricorda " +"che il layout dipende dalla grandezza dell'immagine<br>" + +#: configdialog/kbfxconfigapp.cpp:53 +msgid "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip! </b>Here you can " +"select what plugins will be enabled and in which panel of the KBFX menu." +msgstr "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip! </b>Seleziona i " +"plugins da abilitare per i vari pannelli." + +#: configdialog/kbfxconfigapp.cpp:56 +msgid "" +"<font size='+1'><b>Menu Type</b><br></font><b>Tip! </b>Please select which " +"kind of menu you would like to use." +msgstr "<font size='+1'><b>Stile Menu</b><br></font><b>NotaBene!</b>Seleziona lo stile preferito per il menu: KBFX menu o KDE menu(classico)." + +#: configdialog/kbfxconfigapp.cpp:59 +msgid "" +"<font size='+1'><b>KBFX Themes</b><br></font><b>Tip! </b>To keep it simple " +"place all your themes inside one folder.<br>Then create different folders " +"inside that folder with different names.<br>KBFX will then read those " +"folders as themes." +msgstr "<font size='+1'><b>Temi KBFX</b><br></font><b>NotaBene!</b>Inserisci i tuoi temi in un unica directory, scompattali e crea <br> per ognuno una subdirectory. I temi verranno cosi' caricati senza problemi da KBFX." + +#: configdialog/kbfxconfigapp.cpp:64 +msgid "" +"<font size='+1'><b>KBFX tooltip settings</b><br></font><b>Tip! </b>Here you " +"can configure the behaviour of KBFX's own tooltip." +msgstr "" +"<font size='+1'><b>KBFX tooltip Impostazioni</b><br></font><b>Tip! </" +"b>Configura il comportamento dei \"tooltips\"." + +#: configdialog/kbfxconfigapp.cpp:93 +msgid "Themes" +msgstr "Temi" + +#: configdialog/kbfxconfigapp.cpp:105 rc.cpp:230 +#, no-c-format +msgid "Start Button" +msgstr "Pulsante Start" + +#: configdialog/kbfxconfigapp.cpp:121 rc.cpp:239 +#, no-c-format +msgid "Menu Style" +msgstr "Stile Menu" + +#: configdialog/kbfxconfigapp.cpp:130 rc.cpp:242 +#, no-c-format +msgid "Tooltip" +msgstr "Suggerimento" + +#: configdialog/kbfxconfigapp.cpp:141 +msgid "Layout" +msgstr "Layout" + +#: configdialog/kbfxconfigapp.cpp:151 rc.cpp:248 +#, no-c-format +msgid "Plugins" +msgstr "Plugins" + +#: configdialog/kbfxconfigapp.cpp:240 +msgid "No default settings here ;)" +msgstr "Nessuna impostazione di default qui " + +#: configdialog/kbfxconfigapp.cpp:423 +msgid "<p align='center'>Could not create this KBFX theme package.</p>" +msgstr "<p align='center'>Impossibile installare il tema da pacchetto.</p>" + +#: configdialog/kbfxconfigapp.cpp:435 +msgid "<p align='center'>KBFX Theme <strong>%1</strong> prepared.</p>" +msgstr "<p align='center'>Tema KBFX <strong>%1</strong> si è preparata.</p>" + +#: configdialog/kbfxconfigapp.cpp:436 +msgid "KBFX Theme Ready" +msgstr "Tema KBFX pronto" + +#: configdialog/main.cpp:33 +msgid "KBFX Configuration Utility" +msgstr "Utility di configurazione KBFX" + +#: configdialog/main.cpp:39 +msgid "kbfxconfigapp" +msgstr "kbfxconfigapp" + +#: configdialog/main.cpp:52 +msgid "Install KBFX theme from <URL>" +msgstr "Installa il tema KBFX da <URL>" + +#: configdialog/main.cpp:53 +msgid "Prepare KBFX theme from folder <URL>" +msgstr "Prepari il tema KBFX dalla directory <URL>" + +#: configdialog/main.cpp:54 +msgid "Show the About page" +msgstr "Mostra la pagina informativa" + +#: src/kbfxspinx.cpp:234 +msgid "This is a help box" +msgstr "Help" + +#: src/kbfxspinx.cpp:358 +msgid "Remove KBFX from Pannel" +msgstr "Rimuovi KBFX dal pannello" + +#: src/kbfxspinx.cpp:360 +msgid "Reload KBFX" +msgstr "Ricarica KBFX" + +#: src/kbfxspinx.cpp:363 +msgid "Configure KBFX" +msgstr "Configura KBFX" + +#: src/kbfxspinx.cpp:365 +msgid "Edit Applications Menu" +msgstr "Modifica il menu' applicazioni" + +#: src/kbfxspinxmenu.cpp:54 +msgid "Double click to clear..." +msgstr "Doppio click per ripulire..." + +#: src/kbfxspinxmenu.cpp:66 +msgid "Type here to search..." +msgstr "Digita qui per la ricerca..." + +#: src/kbfxbutton.cpp:270 +msgid "" +"Invalid images were dropped!\n" +"Cannot set the KBFX button to use these images!" +msgstr "" +"Le immagini non valide verranno scartate!\n" +"Impossibile usare l'immagine per il bottone KBFX!" + +#: src/kbfxbutton.cpp:272 +msgid "Error setting KBFX button images" +msgstr "Errore impostazione immagine KBFX" + +#: rc.cpp:3 +#, no-c-format +msgid "KBFX Button" +msgstr "Bottone KBFX" + +#: rc.cpp:6 +#, no-c-format +msgid "" +"To change KBFX button skin, simply browse to the image you want OR just " +"Drag&Drop the images to their respective place." +msgstr "" +"Per cambiare il tema del bottone KBFX seleziona l'immagine oppure,piu' " +"semplicemente,\"trascina\" l'immagine sopra il campo desiderato." + +#: rc.cpp:9 +#, no-c-format +msgid "Livepreview" +msgstr "Anteprima Live" + +#: rc.cpp:12 +#, no-c-format +msgid "" +"<b>Tip!</b> To see live preview, hover or press the preview image with your " +"mouse." +msgstr "" +"<b>NotaBene!</b> Per vedere l'anteprima,clicca sull'immagine direttamente " +"oppure passa sopra col mouse." + +#: rc.cpp:15 +#, no-c-format +msgid "KBFX Button live preview" +msgstr "KBFX Anteprima Live" + +#: rc.cpp:18 +#, no-c-format +msgid "Here you can see the live preview of the KBFX Button." +msgstr "Qui puoi vedere l'anteprima del bottone KBFX." + +#: rc.cpp:21 +#, no-c-format +msgid "Resize Panel" +msgstr "Ridimensiona pannello" + +#: rc.cpp:24 +#, no-c-format +msgid "" +"<b>Tip!</b> This button resizes the panel on which the KBFX button is to " +"button's height or width." +msgstr "" +"<b>NotaBene!</b> Questo bottone ridimensiona la toolbar dove si trova la " +"applet KBFX(normalmente la kickbar) per adattarla al pulsante KBFX scelto." + +#: rc.cpp:27 configdialog/kbfxconfigdlgbutton.ui.h:141 +#, no-c-format +msgid "Panel Resize is 'ON'" +msgstr "Ridimensiona barra \"ON\"" + +#: rc.cpp:32 +#, no-c-format +msgid "<h3><p align=\"center\">Preview of selected images</p></h3>" +msgstr "<h3><p align=\"center\">Anteprima immagine selezionata</p></h3>" + +#: rc.cpp:35 +#, no-c-format +msgid "\"PRESSED\" IMAGE SELECTION" +msgstr "\"PRESSED\" SELEZIONA IMMAGINE" + +#: rc.cpp:38 +#, no-c-format +msgid "Please select \"pressed\" image." +msgstr "Seleziona immagine \"pressed\"." + +#: rc.cpp:41 rc.cpp:65 rc.cpp:89 +#, no-c-format +msgid "image/jpeg image/png image/x-xpm image/gif" +msgstr "Immagine/jpeg immagine/png immagine/x-xpm immagine/gif" + +#: rc.cpp:44 +#, no-c-format +msgid "The Pressed Button Skin Image" +msgstr "Immagine bottone \"pressed\"" + +#: rc.cpp:47 +#, no-c-format +msgid "Here you can choose the Pressed Button Skin Image" +msgstr "Qui puoi scegliere l'immagine per il bottone\"pressed\"" + +#: rc.cpp:50 rc.cpp:74 rc.cpp:98 +#, no-c-format +msgid "Preview" +msgstr "Anteprima Live" + +#: rc.cpp:53 +#, no-c-format +msgid "Pressed Button Skin" +msgstr "Immagine bottone \"pressed\"" + +#: rc.cpp:56 +#, no-c-format +msgid "Here you can Drag&Drop the Pressed Button Skin Image." +msgstr "Drag&Drop immagine bottone \"pressed\"." + +#: rc.cpp:59 +#, no-c-format +msgid "\"NORMAL\" IMAGE SELECTION" +msgstr "\"NORMALE\" SELEZIONA IMMAGINE" + +#: rc.cpp:62 +#, no-c-format +msgid "Please select \"normal\" image." +msgstr "Seleziona immagine \"normale\"." + +#: rc.cpp:68 +#, no-c-format +msgid "The Normal Button Skin Image" +msgstr "Immagine bottone \"normale\"" + +#: rc.cpp:71 +#, no-c-format +msgid "Here you can choose the Normal Button Skin Image" +msgstr "Qui puoi scegliere l'immagine per il bottone \"normale\"" + +#: rc.cpp:77 +#, no-c-format +msgid "Normal Button Skin" +msgstr "Tema bottone \"normale\"" + +#: rc.cpp:80 +#, no-c-format +msgid "Here you can Drag&Drop the Normal Button Skin Image." +msgstr "Drag&Drop Immagine bottone \"normale\"." + +#: rc.cpp:83 +#, no-c-format +msgid "\"HOVER\" IMAGE SELECTION" +msgstr "\"HOVER\" SELEZIONA IMMAGINE" + +#: rc.cpp:86 +#, no-c-format +msgid "Please select \"hover\" image." +msgstr "Seleziona immagine \"hover\"." + +#: rc.cpp:92 +#, no-c-format +msgid "The Hover Button Skin Image" +msgstr "Tema bottone \"HOVER\"" + +#: rc.cpp:95 +#, no-c-format +msgid "Here you can choose the Hover Button Skin Image" +msgstr "Qui puoi scegliere l'immagine per il bottone \"hover\"" + +#: rc.cpp:101 +#, no-c-format +msgid "Hover Button Skin" +msgstr "Tema bottone \"hover\"" + +#: rc.cpp:104 +#, no-c-format +msgid "Here you can Drag&Drop the Hover Button Skin Image." +msgstr "Drag&Drop immagine bottone \"hover\"." + +#: rc.cpp:107 +#, no-c-format +msgid "<h3><p align=\"center\">Please select KBFX button's images</p></h3>" +msgstr "<h3><p align=\"center\">Anteprima immagine selezionata</p></h3>" + +#: rc.cpp:110 rc.cpp:179 rc.cpp:296 rc.cpp:404 rc.cpp:440 rc.cpp:461 +#, no-c-format +msgid "KBFX Control Center" +msgstr "Centro controllo KBFX" + +#: rc.cpp:113 +#, no-c-format +msgid "<b><h3><p align=\"center\">Layout options</p></h3></b>" +msgstr "<h3><p align=\"center\">Anteprima immagine selezionata</p></h3>" + +#: rc.cpp:116 +#, no-c-format +msgid "EXPORT KBFXLAYOUTRC FILE" +msgstr "ESPORTA FILE KBFXFONTRC" + +#: rc.cpp:119 +#, no-c-format +msgid "Export the kbfxlayoutrc file to a folder" +msgstr "Esporta il file kbfxfontrc in una directory" + +#: rc.cpp:122 rc.cpp:473 +#, no-c-format +msgid "Setup fonts for your KBFX" +msgstr "Seleziona i font per il tuo tema KBFX" + +#: rc.cpp:125 rc.cpp:476 +#, no-c-format +msgid "Theme that is edited:" +msgstr "Tema modificato:" + +#: rc.cpp:128 rc.cpp:479 +#, no-c-format +msgid "<p align=\"left\"><b>default</b></p>" +msgstr "<p align=\"left\"><b>default</b></p>" + +#: rc.cpp:131 rc.cpp:482 +#, no-c-format +msgid "Please select the theme you want to edit" +msgstr "Seleziona il tema da modificare" + +#: rc.cpp:134 +#, no-c-format +msgid "Select the Layout property to change" +msgstr "Seleziona propieta' layout" + +#: rc.cpp:137 +#, no-c-format +msgid "Make it 2 panels (Left \"ON\")" +msgstr "Crea 2 pannelli (sx \"ON\")" + +#: rc.cpp:140 +#, no-c-format +msgid "Make it 2 panels (Right \"ON\")" +msgstr "Crea 2 pannelli (dx \"ON\")" + +#: rc.cpp:143 +#, no-c-format +msgid "Make it 3 panels" +msgstr "Crea 3 pannelli" + +#: rc.cpp:146 +#, no-c-format +msgid "textLabel1" +msgstr "textLabel1" + +#: rc.cpp:149 +#, no-c-format +msgid "textLabel2" +msgstr "textLabel2" + +#: rc.cpp:152 +#, no-c-format +msgid "textLabel3" +msgstr "textLabel3" + +#: rc.cpp:155 +#, no-c-format +msgid "textLabel4" +msgstr "textLabel4" + +#: rc.cpp:158 +#, no-c-format +msgid "checkBox1" +msgstr "checkBox1" + +#: rc.cpp:161 +#, no-c-format +msgid "textLabel5" +msgstr "textLabel5" + +#: rc.cpp:164 +#, no-c-format +msgid "textLabel6" +msgstr "textLabel6" + +#: rc.cpp:167 +#, no-c-format +msgid "textLabel7" +msgstr "textLabel7" + +#: rc.cpp:170 +#, no-c-format +msgid "textLabel8" +msgstr "textLabel8" + +#: rc.cpp:173 +#, no-c-format +msgid "checkBox2" +msgstr "checkBox2" + +#: rc.cpp:176 +#, no-c-format +msgid "C&ustom" +msgstr "&Modificato" + +#: rc.cpp:182 +#, no-c-format +msgid "<b><h3><p align=\"center\">Plugins options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Opzioni plugins:</p></h3></b>" + +#: rc.cpp:185 +#, no-c-format +msgid "Select KBFX Panel" +msgstr "Seleziona pannello kbfx" + +#: rc.cpp:188 rc.cpp:191 +#, no-c-format +msgid "Plugin to configure" +msgstr "Configura plugins" + +#: rc.cpp:194 +#, no-c-format +msgid "Please select the panel you want to configure: " +msgstr "Seleziona il pannello da configurare" + +#: rc.cpp:197 +#, no-c-format +msgid "&Available Plugins:" +msgstr "Plugins &disponibili:" + +#: rc.cpp:200 +#, no-c-format +msgid "&Enabled Plugins:" +msgstr "Plugins &abilitati:" + +#: rc.cpp:203 +#, no-c-format +msgid "&Configure Plugin" +msgstr "&Configura plugins" + +#: rc.cpp:206 +#, no-c-format +msgid "Alt+C" +msgstr "Alt+C" + +#: rc.cpp:209 rc.cpp:212 +#, no-c-format +msgid "Configure the selected plugin" +msgstr "Configura il plugin selezionato" + +#: rc.cpp:215 +#, no-c-format +msgid "&Plugin Information" +msgstr "&Info plugin" + +#: rc.cpp:218 +#, no-c-format +msgid "Alt+P" +msgstr "Alt+P" + +#: rc.cpp:221 rc.cpp:224 +#, no-c-format +msgid "Information about the selected plugin" +msgstr "Info sul plugin selezionato" + +#: rc.cpp:227 +#, no-c-format +msgid "KBFX Configurator Application" +msgstr "KBFX applicazione di configurazione" + +#: rc.cpp:233 +#, no-c-format +msgid "KBFX Themes" +msgstr "Temi KBFX" + +#: rc.cpp:245 +#, no-c-format +msgid "Search Engine" +msgstr "Motore di ricerca" + +#: rc.cpp:251 +#, no-c-format +msgid "About KBFX" +msgstr "Info KBFX" + +#: rc.cpp:254 +#, no-c-format +msgid "" +"<br><p align=\"center\"><br><br><br>If you want you can check the latest " +"news for KBFX from here:<br><a href=\"http://www.kbfx.org/\">KBFX News</a></" +"p>" +msgstr "" +"<br><p align=\"center\"><br><br><br>Puoi trovare le ultime informazioni e " +"lenews KBFX da qui:<br><a href=\"http://www.kbfx.org/\">KBFX News</a></p>" + +#: rc.cpp:260 +#, no-c-format +msgid "Alt+H" +msgstr "Alt+H" + +#: rc.cpp:263 +#, no-c-format +msgid "Open Help Documentation" +msgstr "Apri documentazione" + +#: rc.cpp:266 +#, no-c-format +msgid "&Default" +msgstr "&Default" + +#: rc.cpp:269 +#, no-c-format +msgid "Alt+D" +msgstr "Alt+D" + +#: rc.cpp:272 +#, no-c-format +msgid "Apply the default configuration for this section only" +msgstr "Applica la configurazione di default solo per questa sezione" + +#: rc.cpp:278 +#, no-c-format +msgid "Alt+A" +msgstr "Alt+A" + +#: rc.cpp:281 +#, no-c-format +msgid "Save the configuration and Apply it" +msgstr "Salva e applica configurazione" + +#: rc.cpp:287 +#, no-c-format +msgid "Alt+X" +msgstr "Alt+X" + +#: rc.cpp:290 +#, no-c-format +msgid "Exit the configuration without saving" +msgstr "Esci senza salvare le impostazioni" + +#: rc.cpp:293 +#, no-c-format +msgid "<font size=\"+2\"><b>Kbfx start button</b><br></font>" +msgstr "<font size=\"+2\"><b>Kbfx bottone start</b><br></font>" + +#: rc.cpp:299 +#, no-c-format +msgid "Select default folder" +msgstr "Seleziona directory di default" + +#: rc.cpp:302 +#, no-c-format +msgid "Please select the target folder where your themes are." +msgstr "Seleziona la directory dei tuoi temi KBFX." + +#: rc.cpp:305 +#, no-c-format +msgid "SpixBar" +msgstr "SpixBar" + +#: rc.cpp:308 +#, no-c-format +msgid "Installed Themes" +msgstr "Temi installati" + +#: rc.cpp:311 +#, no-c-format +msgid "Here are listed all the installed KBFX Themes" +msgstr "Lista temi KBFX installati" + +#: rc.cpp:314 +#, no-c-format +msgid "Selected Theme Preview" +msgstr "Seleziona anteprima tema" + +#: rc.cpp:317 +#, no-c-format +msgid "Delete Selected" +msgstr "Rimuovi selezionato" + +#: rc.cpp:320 +#, no-c-format +msgid "Delete the Selected Theme" +msgstr "Rimuovi il tema selezionato" + +#: rc.cpp:323 +#, no-c-format +msgid "" +"Pressing the button will delete the currently selected theme. <br><b>Warning!" +"</b> You cannot delete the installed system wide themes!" +msgstr "" +"Premendo il bottone verra' rimosso il tema corrente <br><b>ATTENZIONE! </" +"b>Questa azione non rimuovera' il tema dal vostro sistema!" + +#: rc.cpp:326 +#, no-c-format +msgid "Get Themes" +msgstr "Scarica temi" + +#: rc.cpp:329 +#, no-c-format +msgid "Get More Themes from the Internet" +msgstr "Scarica altri temi da internet" + +#: rc.cpp:332 +#, no-c-format +msgid "" +"Pressing the button will launch konqueror and go to the KBFX Themes Section " +"on www.kde-look.org" +msgstr "" +"Premi il bottone per lanciare konqueror all'indirizzo:www.kde-look.org," +"sezione temi KBFX" + +#: rc.cpp:335 +#, no-c-format +msgid "Install Theme" +msgstr "Installa Tema" + +#: rc.cpp:338 +#, no-c-format +msgid "Install New Theme from KBFX Theme Package" +msgstr "Installa tema KBFX da pacchetto" + +#: rc.cpp:341 +#, no-c-format +msgid "" +"Pressing the button will offer a dialog where you can choose KBFX Theme " +"Package to install in your home folder" +msgstr "" +"Premendo il bottone verra' mostrata una finestra di dialogo dove sara' " +"possibile selezionare il tema KBFX(in formato compresso)e installarlo nella " +"home directory" + +#: rc.cpp:344 rc.cpp:583 +#, no-c-format +msgid "Theme Info" +msgstr "Info temi" + +#: rc.cpp:347 +#, no-c-format +msgid "Show specific theme info" +msgstr "Mostra le info specifiche del tema" + +#: rc.cpp:350 +#, no-c-format +msgid "Pressing the button will show you specific theme info" +msgstr "Premi il bottone per le info sul tema" + +#: rc.cpp:353 +#, no-c-format +msgid "Personal Image" +msgstr "Immagine personale" + +#: rc.cpp:356 +#, no-c-format +msgid "Theme's Default" +msgstr "Tema di default" + +#: rc.cpp:359 +#, no-c-format +msgid "Set the Theme's Default Personal Image" +msgstr "Seleziona immagine personale da tema di default" + +#: rc.cpp:362 +#, no-c-format +msgid "" +"Pressing the button will delete the personal image you have selected and " +"install the theme's default personal image" +msgstr "" +"Premi il bottone per rimuovere l'immagine personale selezionata e installare " +"quella del tema di default" + +#: rc.cpp:365 +#, no-c-format +msgid "Maxsize 48 x 48" +msgstr "Dimensione massima 48x48" + +#: rc.cpp:368 +#, no-c-format +msgid "Select New image" +msgstr "Seleziona nuova immagine" + +#: rc.cpp:371 +#, no-c-format +msgid "Select a Personal Image" +msgstr "Seleziona immagine personale" + +#: rc.cpp:374 +#, no-c-format +msgid "Pressing the button will open a dialog to select your personal image" +msgstr "" +"Premendo il bottone verra' mostrata una finestra di dialogo dove sara' " +"possibile selezionare la propia immagine personale" + +#: rc.cpp:377 +#, no-c-format +msgid "This is your personal image displayed at the KBFX menu." +msgstr "Questa e' la tua immagine personale che potra' essere visualizzata nella barra superiore del menu KBFX." + +#: rc.cpp:380 +#, no-c-format +msgid "Misc Options" +msgstr "Opzioni varie" + +#: rc.cpp:383 +#, no-c-format +msgid "Watch System Installs" +msgstr "Guarda installazione di sistema" + +#: rc.cpp:386 rc.cpp:389 +#, no-c-format +msgid "Watch for applications installs and reload KBFX if any occurs" +msgstr "Guarda le applicazioni installate e ricarica il kbfx" + +#: rc.cpp:392 rc.cpp:395 +#, no-c-format +msgid "Show Old Themes" +msgstr "Mostra i temi vecchi" + +#: rc.cpp:398 +#, no-c-format +msgid "<b><h3><p align=\"center\">Please select theme folder</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Seleziona una directory per i temi</p></h3></b>" + +#: rc.cpp:401 +#, no-c-format +msgid "<b><h3><p align=\"center\">Installed themes</p></h3></b>" +msgstr "<h3><p align=\"center\">Temi installati</p></h3>" + +#: rc.cpp:407 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Tooltip ON - OFF</p></h3></b>" + +#: rc.cpp:410 +#, no-c-format +msgid "Turn off or on the tooltip" +msgstr "Disattiva suggerimento" + +#: rc.cpp:413 +#, no-c-format +msgid "" +"Turn your tooltip off or on. <br>You can see the current status of the " +"tooltip to the right." +msgstr "" +"Attiva/Disattiva il <br> suggerimento Controlla lo stato attuale sulla " +"destra." + +#: rc.cpp:416 +#, no-c-format +msgid "Turn the tooltip \"OFF\"" +msgstr "Suggerimento \"OFF\"" + +#: rc.cpp:419 +#, no-c-format +msgid "Tooltip Text" +msgstr "Testo suggerimento" + +#: rc.cpp:422 +#, no-c-format +msgid "Type the text which you want to be displayed in the tooltip." +msgstr "Scrivi il messaggio che verra' visualizzato nel suggerimento." + +#: rc.cpp:425 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip personal text</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Tooltip testo personale</p></h3></b>" + +#: rc.cpp:428 +#, no-c-format +msgid "Tooltip animation" +msgstr "Animazione suggerimento" + +#: rc.cpp:431 +#, no-c-format +msgid "" +"Turn your tooltip animation off or on. <br>You can see the current status of " +"the tooltip to the right." +msgstr "" +"Attiva/Disattiva animazione <br> suggerimento Controlla lo stato attuale " +"sulla destra ." + +#: rc.cpp:434 +#, no-c-format +msgid "Turn the animation \"ON\"" +msgstr "Animazione \"ON\"" + +#: rc.cpp:437 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip animation ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Tooltip animazione ON - OFF</p></h3></b>" + +#: rc.cpp:443 +#, no-c-format +msgid "<b><h3><p align=\"center\">Menu type</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Tipo di Menu'</p></h3></b>" + +#: rc.cpp:446 +#, no-c-format +msgid "Please select the menu style" +msgstr "Seleziona lo stile del Menu" + +#: rc.cpp:449 rc.cpp:455 +#, no-c-format +msgid "KBFX MENU" +msgstr "KBFX MENU" + +#: rc.cpp:452 rc.cpp:458 +#, no-c-format +msgid "KDE MENU" +msgstr "MENU KDE" + +#: rc.cpp:464 +#, no-c-format +msgid "<b><h3><p align=\"center\">Font options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Font opzioni</p></h3></b>" + +#: rc.cpp:467 +#, no-c-format +msgid "EXPORT KBFXFONTRC FILE" +msgstr "ESPORTA FILE KBFXFONTRC" + +#: rc.cpp:470 +#, no-c-format +msgid "Export the kbfxfontrc file to a folder" +msgstr "Esporta il file kbfxfontrc in una directory" + +#: rc.cpp:485 +#, no-c-format +msgid "Bold fonts on hover" +msgstr "Ingrandisci font al passaggio" + +#: rc.cpp:488 rc.cpp:491 +#, no-c-format +msgid "Make fonts bolder when you hover the mouse over an item" +msgstr "Ingrandisci i fonts quando passi col mouse su un oggetto" + +#: rc.cpp:494 +#, no-c-format +msgid "Application \"LINE\":" +msgstr "\"LINEA\" applicazioni:" + +#: rc.cpp:497 +#, no-c-format +msgid "Horizontal line color in the application area." +msgstr "Colore linea orizzontale dell'area-applicazioni." + +#: rc.cpp:500 +#, no-c-format +msgid "Application text :" +msgstr "Testo applicazioni:" + +#: rc.cpp:503 +#, no-c-format +msgid "Select the color of the \"application\" in the menu." +msgstr "Seleziona il colore \"applicazioni\" del menu." + +#: rc.cpp:506 +#, no-c-format +msgid "Comment text:" +msgstr "Testo \"commenti\":" + +#: rc.cpp:509 +#, no-c-format +msgid "Color of the \"comments\" in the menu." +msgstr "Colore dei \"commenti\" del menu." + +#: rc.cpp:512 +#, no-c-format +msgid "Name display:" +msgstr "Nome del display:" + +#: rc.cpp:515 rc.cpp:527 rc.cpp:533 +#, no-c-format +msgid "The color of your login name in the menu." +msgstr "Colore del nome_utente nel menu." + +#: rc.cpp:518 +#, no-c-format +msgid "Category text:" +msgstr "Testo \"categorie\":" + +#: rc.cpp:521 +#, no-c-format +msgid "Font color of the categoris in the menu." +msgstr "Colore font del menu." + +#: rc.cpp:524 +#, no-c-format +msgid "Separator:" +msgstr "Separatore:" + +#: rc.cpp:530 +#, no-c-format +msgid "Plugin:" +msgstr "Plugin:" + +#: rc.cpp:536 +#, no-c-format +msgid "Select font for the application's text" +msgstr "Seleziona font per testo applicazione" + +#: rc.cpp:539 +#, no-c-format +msgid "Select font for the comment's text" +msgstr "Seleziona font per i commenti" + +#: rc.cpp:542 +#, no-c-format +msgid "Select font for the username's text" +msgstr "Seleziona font per il nome utente" + +#: rc.cpp:545 +#, no-c-format +msgid "Select font for the category's text" +msgstr "Seleziona font per le categorie" + +#: rc.cpp:548 +#, no-c-format +msgid "Select font for the separator's text" +msgstr "Seleziona font per il separatore" + +#: rc.cpp:551 +#, no-c-format +msgid "Select font for the plugins' text" +msgstr "Seleziona font per i plugins" + +#: rc.cpp:554 +#, no-c-format +msgid "Form1" +msgstr "Form1" + +#: rc.cpp:557 +#, no-c-format +msgid "<b><h3><p align=\"center\">People behind KBFX</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Persone che lavorano al progetto KBFX</p></h3></b>" + +#: rc.cpp:560 +#, no-c-format +msgid "You are running: <b>KBFX 0493</b>" +msgstr "Stai usando <b>KBFX 0493</b>" + +#: rc.cpp:563 +#, no-c-format +msgid "" +"Here are the people behind the KBFX application.\n" +"We would like to thank all people who have helped with KBFX or have donated " +"money to our project!\n" +"THANKS A LOT ALL OF YOU OUT THERE!!!" +msgstr "" +"Queste persone rappresentano il team di KBFX Vorremmo ringraziare tutti " +"coloro che ci hanno aiutati economicamente o semplicemente col propio " +"supporto, con la realizzazione dei temi e della documentazione.\n" +"GRAZIE DI CUORE A TUTTI QUANTI!!!" + +#: rc.cpp:568 +#, no-c-format +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project " +"Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project " +"Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" + +#: rc.cpp:571 +#, no-c-format +msgid "" +"<b>Tip!</b> Hover over the contact images to see each personal contact " +"information." +msgstr "" +"Passa il mouse sopra l'immagine personale per scoprire ulteriori " +"informazioni su ogni team member." + +#: rc.cpp:574 +#, no-c-format +msgid "SPONSORS!" +msgstr "SPONSORS!" + +#: rc.cpp:577 +#, no-c-format +msgid "" +"We would like to thank swedish computer company <b>PC Agenten</b> for " +"sponsoring us with a server and bandwidth." +msgstr "" +"Un grazie particolare alla compagnia di computer Svedesi <b>PC Agenten</b> " +"per il supporto e lo spazio web." + +#: rc.cpp:580 +#, no-c-format +msgid "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE</a></u></b></p>" +msgstr "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE</a></u></b></p>" + +#: rc.cpp:589 +#, no-c-format +msgid "<p align=\"right\"><b>Name:</b></p>" +msgstr "<p align=\"right\"><b>Nome:</b></p>" + +#: rc.cpp:592 +#, no-c-format +msgid "<p align=\"right\"><b>Version:</b></p>" +msgstr "<p align=\"right\"><b>Versione:</b></p>" + +#: rc.cpp:595 +#, no-c-format +msgid "<p align=\"right\"><b>Author:</b></p>" +msgstr "<p align=\"right\"><b>Autore:</b></p>" + +#: rc.cpp:598 +#, no-c-format +msgid "<p align=\"right\"><b>Email:</b></p>" +msgstr "<p align=\"right\"><b>Email:</b></p>" + +#: rc.cpp:601 +#, no-c-format +msgid "<p align=\"right\"><b>Homepage:</b></p>" +msgstr "<p align=\"right\"><b>Homepage:</b></p>" + +#: rc.cpp:604 rc.cpp:607 rc.cpp:610 rc.cpp:613 rc.cpp:616 +#, no-c-format +msgid "Test" +msgstr "Test" + +#: configdialog/kbfxconfigdlgthemes.ui.h:61 +msgid "" +"<p align='center'>Invalid user themes folder!</p><p align='center'>Will use " +"default user themes folder.</p>" +msgstr "" +"<p align='center'>Directory dei temi errata!</p><p " +"align='center'>Verra'usata la directory di default.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:63 +msgid "Error loading themes" +msgstr "Errore nel caricamento temi" + +#: configdialog/kbfxconfigdlgthemes.ui.h:170 +msgid "" +"<p align='center'>Are you sure you want to uninstall the KBFX theme <strong>%" +"1</strong>?</p>" +msgstr "" +"<p align='center'>Vuoi disinstallare il tema di KBFX? <strong>%" +"1</strong>?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:171 +msgid "Uninstall KBFX theme" +msgstr "Disinstalla tema KBFX" + +#: configdialog/kbfxconfigdlgthemes.ui.h:172 +msgid "Uninstall" +msgstr "Disinstalla" + +#: configdialog/kbfxconfigdlgthemes.ui.h:177 +msgid "" +"<p align='center'>Do you want to keep your personal settings for theme " +"<strong>%1</strong>?</p>" +msgstr "" +"<p align='center'>Vuoi mantenere le impostazioni personali del tema?" +"<strong>%1</strong>?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:178 +msgid "Personal settings" +msgstr "IMpostazioni personali" + +#: configdialog/kbfxconfigdlgthemes.ui.h:179 +msgid "Keep settings" +msgstr "Mantieni impostazioni" + +#: configdialog/kbfxconfigdlgthemes.ui.h:180 +msgid "Delete settings" +msgstr "Rimuovi impostazioni" + +#: configdialog/kbfxconfigdlgthemes.ui.h:210 +msgid "" +"<p align='center'>Could not uninstall this KBFX theme.</p><p " +"align='center'>You may not have sufficient permissions to delete the folder " +"<strong>%1<strong>.</p>" +msgstr "" +"<p align='center'>Impossibile disinstallare il tema.</p><p " +"align='center'>Permessi insufficienti per rimuovere il tema<strong>%" +"1<strong>.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:223 +msgid "KBFX theme packages (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" +msgstr "KBFX temi (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" + +#: configdialog/kbfxconfigdlgthemes.ui.h:227 +msgid "Select KBFX theme package to install" +msgstr "Seleziona il tema da installare" + +#: configdialog/kbfxconfigdlgthemes.ui.h:243 +msgid "<p align='center'>Could not read this KBFX theme package.</p>" +msgstr "<p align='center'>Impossibile leggere il tema KBFX.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:270 +msgid "Select personal image" +msgstr "Seleziona immagine personale" + +#: configdialog/kbfxconfigdlgthemes.ui.h:281 +msgid "" +"<p align='center'>Image cannot be used as a personal image!</p><p " +"align='center'>Will use default personal image.</p>" +msgstr "" +"<p align='center'>Impossibile usare immagine per l'avatar personale!</p><p " +"align='center'>Verra' usato l'avatar di default.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:283 +#: configdialog/kbfxconfigdlgbutton.ui.h:65 +#: configdialog/kbfxconfigdlgbutton.ui.h:86 +#: configdialog/kbfxconfigdlgbutton.ui.h:107 +msgid "Error loading image" +msgstr "Errore caricamento immagine" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:23 +msgid "Turn the animation 'OFF'" +msgstr "Animazione \"OFF\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:30 +msgid "Turn the animation 'ON'" +msgstr "Animazione \"ON\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:53 +msgid "Turn the tooltip 'OFF'" +msgstr "Suggerimento \"OFF\"" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:60 +msgid "Turn the tooltip 'ON'" +msgstr "Suggerimento \"ON\"" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:122 +msgid "Select folder to export kbfxfontrc file" +msgstr "Seleziona directory per esportare il file kbfxfontrc" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:151 +msgid "" +"<p align='center'>The Font configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>La configurazione font del tema KBFX <strong>%1</" +"strong> e' stata esportata con successo</p>" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:152 +msgid "KBFX Font Export Ready" +msgstr "KBFX font pronto" + +#: configdialog/kbfxconfigdlgabout.ui.h:23 +msgid "" +"<strong>Name:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Country:</" +"strong> Sweden<br><br><strong>KBFX:</strong> co-author, Q/A, system design, " +"web designer, bug hunter, project administror<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Country:</" +"strong> Sweden<br><br><strong>KBFX:</strong> co-author, Q/A, system design, " +"web designer, bug hunter, project administror<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:32 +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> author, maintainer, developer, project " +"administror<br><br><strong>Email:</strong> siraj@mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> author, maintainer, developer, project " +"administror<br><br><strong>Email:</strong> siraj@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:41 +msgid "" +"<strong>Name:</strong> Nathanael Dracor Gogniat<br><br><strong>Country:</" +"strong> Switzerland<br><br><strong>KBFX:</strong> project technical writer, " +"documentation manager, co-author<br><br><strong>Email:</strong> " +"nathanael@mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> Nathanael Dracor Gogniat<br><br><strong>Country:</" +"strong> Switzerland<br><br><strong>KBFX:</strong> project technical writer, " +"documentation manager, co-author<br><br><strong>Email:</strong> " +"nathanael@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:50 +msgid "" +"<strong>Name:</strong> PhobosK<br><br><strong>Country:</strong> " +"Bulgaria<br><br><strong>KBFX:</strong> package & release manager, Q/A, bug " +"hunter, mandriva packages, project administrator, developer Qt/C+" +"+<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> PhobosK<br><br><strong>Country:</strong> " +"Bulgaria<br><br><strong>KBFX:</strong> package & release manager, Q/A, bug " +"hunter, mandriva packages, project administrator, developer Qt/C+" +"+<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:59 +msgid "" +"<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"developer Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" +msgstr "" +"<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"developer Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:68 +msgid "" +"<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"library developer for Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" +msgstr "" +"<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"library developer for Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" + +#: configdialog/kbfxconfigdlgbutton.ui.h:63 +msgid "" +"<p align='center'>Image cannot be used as a pressed button skin!</p><p " +"align='center'>Will use default pressed button skin.</p>" +msgstr "<p align='center'>Impossibile caricare immagine per il bottone \"pressed\"</p><p align='center'>Verra' usata l'immagine di default.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:84 +msgid "" +"<p align='center'>Image cannot be used as a normal button skin!</p><p " +"align='center'>Will use default normal button skin.</p>" +msgstr "" +"<p align='center'>Impossibile caricare immagine per il bottone \"normal\"</" +"p><p align='center'>Verra' usata l'immagine di default</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:105 +msgid "" +"<p align='center'>Image cannot be used as a hover button skin!</p><p " +"align='center'>Will use default hover button skin.</p>" +msgstr "" +"<p align='center'>Impossibile caricare immagine per il bottone \"hover\"</" +"p><p align='center'>Verra' usata l'immagine di default</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:147 +msgid "Panel Resize is 'OFF'" +msgstr "Ridimensiona pannello \"OFF\"" + +#: configdialog/kbfxconfigdlglayout.ui.h:16 +msgid "User Properties" +msgstr "Propieta' utente" + +#: configdialog/kbfxconfigdlglayout.ui.h:17 +msgid "* Top Bar Properties" +msgstr "Propieta' barra superiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:18 +msgid "* Bottom Bar Properties" +msgstr "Propieta' barra inferiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:20 +msgid "* List Box Properties" +msgstr "Propieta' lista" + +#: configdialog/kbfxconfigdlglayout.ui.h:21 +msgid "Search Box Properties" +msgstr "Propieta' ricerca" + +#: configdialog/kbfxconfigdlglayout.ui.h:22 +msgid "* Item Properties" +msgstr "Propieta' oggetto" + +#: configdialog/kbfxconfigdlglayout.ui.h:24 +msgid "* Main Menu Properties" +msgstr "Propieta' menu' principale" + +#: configdialog/kbfxconfigdlglayout.ui.h:25 +msgid "Water Effect Properties" +msgstr "Propieta' effetto acqua" + +#: configdialog/kbfxconfigdlglayout.ui.h:209 +msgid "Face Position X" +msgstr "Posizione X" + +#: configdialog/kbfxconfigdlglayout.ui.h:210 +msgid "Face Position Y" +msgstr "Posizione Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:211 +msgid "User Name Position X" +msgstr "Posizione utente X" + +#: configdialog/kbfxconfigdlglayout.ui.h:212 +msgid "User Name Position Y" +msgstr "Posizione utente Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:213 +msgid "Face Box Position X" +msgstr "Lato posizione X" + +#: configdialog/kbfxconfigdlglayout.ui.h:214 +msgid "Face Box Position Y" +msgstr "Lato posizione Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:215 +msgid "Face Box Height" +msgstr "Lato altezza" + +#: configdialog/kbfxconfigdlglayout.ui.h:216 +msgid "Face Box Width" +msgstr "Lato larghezza" + +#: configdialog/kbfxconfigdlglayout.ui.h:217 +msgid "Hide User Name" +msgstr "Nascondi nome utente" + +#: configdialog/kbfxconfigdlglayout.ui.h:235 +msgid "* Top Bar Height" +msgstr "Altezza barra superiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:241 +msgid "Top Bar Width" +msgstr "Larghezza barra inferiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:266 +msgid "* Bottom Bar Height" +msgstr "Altezza barra inferiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:272 +msgid "Bottom Bar Width" +msgstr "Larghezza barra inferiore" + +#: configdialog/kbfxconfigdlglayout.ui.h:322 +msgid "* List Box Position X" +msgstr "List box posizione X" + +#: configdialog/kbfxconfigdlglayout.ui.h:323 +msgid "* List Box Position Y" +msgstr "List box posizione Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:326 +msgid "List Box Height" +msgstr "Altezza list box" + +#: configdialog/kbfxconfigdlglayout.ui.h:327 +msgid "* List Box Width" +msgstr "Larghezza list box" + +#: configdialog/kbfxconfigdlglayout.ui.h:345 +msgid "Search Box Position X" +msgstr "Posizione campo di ricerca X" + +#: configdialog/kbfxconfigdlglayout.ui.h:346 +msgid "Search Box Position Y" +msgstr "Posizione campo di ricerca Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:349 +msgid "Search Box Height" +msgstr "Altezza campo di ricerca" + +#: configdialog/kbfxconfigdlglayout.ui.h:350 +msgid "Search Box Width" +msgstr "Larghezza campo di ricerca" + +#: configdialog/kbfxconfigdlglayout.ui.h:368 +msgid "* Item Position X" +msgstr "Posizione oggetto X" + +#: configdialog/kbfxconfigdlglayout.ui.h:369 +msgid "* Item Position Y" +msgstr "Posizione oggetto Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:370 +msgid "Icon Size in Item" +msgstr "Dimensione icona oggetto" + +#: configdialog/kbfxconfigdlglayout.ui.h:372 +msgid "Item Height" +msgstr "Altezza oggetto" + +#: configdialog/kbfxconfigdlglayout.ui.h:373 +msgid "* Item Width" +msgstr "Larghezza oggetto" + +#: configdialog/kbfxconfigdlglayout.ui.h:374 +msgid "Comment Margin in Item" +msgstr "Margine commento" + +#: configdialog/kbfxconfigdlglayout.ui.h:376 +msgid "No Comments in Item" +msgstr "Nessun commento" + +#: configdialog/kbfxconfigdlglayout.ui.h:417 +msgid "* Main Menu Height" +msgstr "ALtezza menu' principale" + +#: configdialog/kbfxconfigdlglayout.ui.h:421 +msgid "* Main Menu Width" +msgstr "Larghezza menu' principale" + +#: configdialog/kbfxconfigdlglayout.ui.h:425 +msgid "Contracted Menues" +msgstr "Menu' contratti" + +#: configdialog/kbfxconfigdlglayout.ui.h:441 +msgid "Water Effect Frame Rate" +msgstr "Frame rate effetto acqua" + +#: configdialog/kbfxconfigdlglayout.ui.h:450 +msgid "Enabled Water Effect" +msgstr "Abilita effetto acqua" + +#: configdialog/kbfxconfigdlglayout.ui.h:495 +msgid "Select folder to export kbfxlayoutrc file" +msgstr "Seleziona directory per esportare il file kbfxlayoutrc" + +#: configdialog/kbfxconfigdlglayout.ui.h:583 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>La configurazione layout del tema KBFX <strong>%1</" +"strong> e' stata esportata con successo</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:584 +msgid "KBFX Layout Export Ready" +msgstr "KBFX layout pronto" + +#: configdialog/kbfxconfigdlglayout.ui.h:651 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> is ready!</p><p align='center'>Be sure to click the <strong>Apply</" +"strong> button in order the changes to become active!</p>" +msgstr "" +"<p align='center'>Configurazione layout del tema KBFX<strong>%1</strong> " +"pronta!</p><p align='center'>Clicca sul bottone <strong>Applica</strong>per " +"attivare i cambiamenti</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:652 +msgid "KBFX Layout Ready" +msgstr "Layout KBFX pronto" + +#: configdialog/kbfxconfigdlglayout.ui.h:658 +msgid "" +"<p align='center'>KBFX will calculate the necessary values using the present " +"values for:</p><p align='center'><strong>* Main Menu Height</strong> and " +"<strong>* Main Menu Width</strong><br><strong>* Bottom Bar Height</strong> " +"and <strong>* Top Bar Height</strong><br></p><p align='center'>So be sure " +"that you have entered their values as you desire!</p><p " +"align='center'><strong>NOTE:</strong> Have in mind that the Layout of the " +"theme also depends on the sizes of the images! So if the theme does not look " +"like as you desire either change the images' sizes to smaller width OR " +"change <strong>* Main Menu Width</strong> to higher value!</p>" +msgstr "" +"<p align='center'>KBFX calcolera' i valori necessari per:</p><p " +"align='center'><strong>*Altezza menu' principale</strong>e <strong>* Menu' " +"principale Larghezza</strong><br><strong>*Barra inferiore Altezza</strong> e " +"<strong>*Altezza barra superiore</strong><br></p><p " +"align='center'>assicurati di avere questi valori attivi</p><p " +"align='center'><strong>NOTA:</strong> Ricarda che il layout del tema dipende " +"dalla grandezza dell'immagine..quindi se i temi non sono esattamente come li " +"volevi,cambia la grandezza dell'immagine <strong>* Larghezza menu' " +"principale</strong>ad un valore piu' alto</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:664 +msgid "Prepare Layout for the KBFX theme" +msgstr "Prepara il layout per il tema KBFX" + +#: configdialog/kbfxconfigdlglayout.ui.h:665 +msgid "Prepare" +msgstr "Prepara" + +#: configdialog/kbfxconfigdlgplugins.ui.h:15 +msgid "Left Panel" +msgstr "Pannello sx" + +#: configdialog/kbfxconfigdlgplugins.ui.h:16 +msgid "Right Panel" +msgstr "Pannello dx" + +#: configdialog/kbfxconfigdlgplugins.ui.h:79 +#: configdialog/kbfxconfigdlgplugins.ui.h:85 +msgid "<p align='center'>Not Implemented yet.</p>" +msgstr "<p align='center'>Non implementatot.</p>" + +#: configdialog/kbfxconfigdlgmain.ui.h:34 +msgid "<p align='center'>Not implemented yet.</p>" +msgstr "<p align='center'>Non implementato</p>" + diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..edfcb19 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1551 @@ +# translation of nl.po to +# translation of kbfxconfigapp.po to +# translation of kbfx.po to +# This file is put in the public domain. +# +# Monkey 9 <monkey9@iae.nl>, 2006, 2007. +msgid "" +msgstr "" +"Project-Id-Version: nl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-03-01 11:46+0200\n" +"PO-Revision-Date: 2007-03-06 21:47+0100\n" +"Last-Translator: Monkey 9 <monkey9@iae.nl>\n" +"Language-Team: <nl@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#: _translatorinfo.cpp:1 +#, fuzzy +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Monkey 9" + +#: _translatorinfo.cpp:3 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "monkey9@iae.nl" + +#: kbfxlib/common/kbfxfontchooser.cpp:38 +msgid "Font..." +msgstr "Lettertype..." + +#: configdialog/kbfxconfigapp.cpp:28 +msgid "<p align='center'>%1</p>" +msgstr "<p align='center'>%1</p>" + +#: configdialog/kbfxconfigapp.cpp:29 +msgid "You are running: <b>KBFX " +msgstr "U gebruikt: <b>KBFX " + +#: configdialog/kbfxconfigapp.cpp:30 +msgid "" +"<br><p align='center'><font color='#ff0000'>The connection to the KBFX News " +"Section on www.kbfx.org is broken.</font><br><br>If you want you can check " +"the latest news for KBFX from here:<br><a href='http://www.kbfx.org/'>KBFX " +"News</a></p>" +msgstr "" +"<br><p align='center'><font color='#ff0000'>De verbinding naar de KBFX Niews " +"Sectie op www.kbfx.org is kapot.</font><br><br>Als je wilt kun je vanaf hier " +"het laatste nieuws voor KBFX controleren:<br><a href='http://www.kbfx." +"org/'>KBFX News</a></p>" + +#: configdialog/kbfxconfigapp.cpp:35 +msgid "" +"<font size='+1'><b>KBFX start button</b><br></font><b>Tip! </b>You have 3 " +"options to select for your KBFX start button.You have to select <i>(Normal, " +"Pressed, Hover)</i> images. <br>Down below you can also see a preview of the " +"images you have selected." +msgstr "" +"<font size='+1'><b>KBFX start knop</b><br></font><b>Tip! </b>Er zijn 3 " +"opties om je KBFX startknop te selecteren. Je dient <i>(Normaal, " +"Ingedrukt, Muis-over)</i> afbeeldingen te kiezen.<br>Hier beneden kun je ook een voorbeeld zien van de afbeeldingen, die je hebt gekozen." + +#: configdialog/kbfxconfigapp.cpp:40 +msgid "" +"<font size='+1'><b>About KBFX</b><br></font><b>Tip! </b>Here you can find " +"information about the KBFX Project and all the people involved in it." +msgstr "" +"<font size='1'><b>Over KBFX</b><br></font><b>Tip!</b>Hier kun je informatie " +"vinden over het KBFX Project en alle betrokkenen." + +#: configdialog/kbfxconfigapp.cpp:43 +msgid "" +"<font size='+1'><b>KBFX font settings</b><br></font><b>Tip! </b>Here you can " +"set the fonts of the current theme.<br>If you don't have any 'kbfxfontrc' " +"file don't worry about that.<br>When done just hit 'Apply' button and KBFX " +"will save the 'kbfxfontrc' file." +msgstr "" +"<font size='+1'><b>Kbfx lettertype instellingen</b><br></font><b>Tip!</b>Hier kan men " +"de lettertypen. voor het huidige thema instellen.<br>Als je geen 'kbfxfontrc' hebt " +"maak je daarover dan niet bezorgd.<br>Wanneer gereed enkel op 'Toepassen'klikken en KBFX " +"zal de kbfxfontrc opslaan." + +#: configdialog/kbfxconfigapp.cpp:48 +msgid "" +"<font size='+1'><b>KBFX Layout</b><br></font><b>Tip! </b>Here you can " +"configure the Look and Feel of your KBFX menu.<br>The most important " +"settings that are used with the '<strong>Make it...</strong>' buttons are " +"marked with '<strong>*</strong>'<br>Have in mind that the Layout of the " +"theme also depends on the sizes of the images!<br>" +msgstr "" +"<font size='+1'><b>KBFX Opmaak</b><br></font><b>Tip! </b>Hier kun je " +"het uiterlijk en thema van je KBFX menu instellen <br>De belangrijkste instellingen " +"die gebruikt worden met de '<strong>Maken...</strong>' knoppen zijn " +"gemarkeerd met '<strong>*</strong>'<br>Houd in gedachten dat de opmaak van het " +"thema ook afhangt van de afmetingen van de plaatjes!<br>" + +#: configdialog/kbfxconfigapp.cpp:53 +msgid "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip! </b>Here you can " +"select what plugins will be enabled and in which panel of the KBFX menu." +msgstr "" +"<font size='+1'><b>KBFX Plugins</b><br></font><b>Tip!</b>Hier kun je " +"kiezen welke plugins gebruikt zullen worden en in welk paneel van het KBFX menu" + +#: configdialog/kbfxconfigapp.cpp:56 +msgid "" +"<font size='+1'><b>Menu Type</b><br></font><b>Tip! </b>Please select which " +"kind of menu you would like to use." +msgstr "" +"<font size='+1'><b>Menu Type</b><br></font><b> Tip!</b>Kies " +"welk soort menu je wilt gebruiken." + +#: configdialog/kbfxconfigapp.cpp:59 +msgid "" +"<font size='+1'><b>KBFX Themes</b><br></font><b>Tip! </b>To keep it simple " +"place all your themes inside one folder.<br>Then create different folders " +"inside that folder with different names.<br>KBFX will then read those " +"folders as themes." +msgstr "" +"<font size='+1'><b>Kbfx Thema's</b><br></font><br><b> Tip!</b>Voor alle eenvoud " +"plaats je alle thema's in een map in aparte mappen <br>met " +"eigen naam. KBFX zal die dan lezen als thema's." + +#: configdialog/kbfxconfigapp.cpp:64 +msgid "" +"<font size='+1'><b>KBFX tooltip settings</b><br></font><b>Tip! </b>Here you " +"can configure the behaviour of KBFX's own tooltip." +msgstr "" +"<font size='+1'><b>KBFX hulpballon instellingen</b><br></font>Tip! </b>Hier " +"kun je het gedrag van KBFX's eigen hulpballon instellen." + +#: configdialog/kbfxconfigapp.cpp:93 +msgid "Themes" +msgstr "Thema's" + +#: configdialog/kbfxconfigapp.cpp:105 rc.cpp:230 +#, no-c-format +msgid "Start Button" +msgstr "Start Knop" + +#: configdialog/kbfxconfigapp.cpp:121 rc.cpp:239 +#, no-c-format +msgid "Menu Style" +msgstr "Menu Stijl" + +#: configdialog/kbfxconfigapp.cpp:130 rc.cpp:242 +#, no-c-format +msgid "Tooltip" +msgstr "Tooltip" + +#: configdialog/kbfxconfigapp.cpp:141 +msgid "Layout" +msgstr "Opmaak" + +#: configdialog/kbfxconfigapp.cpp:151 rc.cpp:248 +#, no-c-format +msgid "Plugins" +msgstr "Plugins" + +#: configdialog/kbfxconfigapp.cpp:240 +msgid "No default settings here ;)" +msgstr "geen standaard instellingen hier;)" + +#: configdialog/kbfxconfigapp.cpp:412 +msgid "<p align='center'>Could not create this KBFX theme package.</p>" +msgstr "<p align='center'>Kon dit KBFX thema pakket niet aanmaken.</p>" + +#: configdialog/kbfxconfigapp.cpp:424 +msgid "<p align='center'>KBFX Theme <strong>%1</strong> prepared</p>." +msgstr "<p align='center'>KBFX Thema <strong>%1</strong> voorbereid</p>." + +#: configdialog/kbfxconfigapp.cpp:425 +msgid "KBFX Theme Ready" +msgstr "KBFX Thema klaar" + +#: configdialog/main.cpp:33 +msgid "KBFX Configuration Utility" +msgstr "KBFX Configuratie Programma" + +#: configdialog/main.cpp:39 +msgid "kbfxconfigapp" +msgstr "kbfxconfiguratieprogramma" + +#: configdialog/main.cpp:52 +msgid "Install KBFX theme from <URL>" +msgstr "Installeer KBFX thema van <URL>" + +#: configdialog/main.cpp:53 +msgid "Prepare KBFX theme from folder <URL>" +msgstr "Bereid KBFX thema uit map voor <URL>" + +#: src/kbfxspinx.cpp:228 +msgid "This is an about box" +msgstr "Dit is een informatievenster" + +#: src/kbfxspinx.cpp:233 +msgid "This is a help box" +msgstr "Dit is een helpvenster" + +#: src/kbfxspinx.cpp:357 +msgid "Remove KBFX from Pannel" +msgstr "Verwijder KBFX uit het paneel" + +#: src/kbfxspinx.cpp:359 +msgid "Reload KBFX" +msgstr "Herlaad KBFX" + +#: src/kbfxspinx.cpp:362 +msgid "Configure KBFX" +msgstr "Stel KBFX in" + +#: src/kbfxspinx.cpp:364 +msgid "Edit Applications Menu" +msgstr "Bewerk toepassingen menu" + +#: src/kbfxbutton.cpp:270 +msgid "" +"Invalid images were dropped!\n" +"Cannot set the KBFX button to use these images!" +msgstr "" +"Ongeldige plaatjes niet gebruikt!\n" +"Kan de KBFX knop niet instellen om deze plaatjes te gebruiken!" + +#: src/kbfxbutton.cpp:272 +msgid "Error setting KBFX button images" +msgstr "Foute instelling KBFX knop plaatjes" + +#: rc.cpp:3 +#, no-c-format +msgid "KBFX Button" +msgstr "KBFX Knop" + +#: rc.cpp:6 +#, no-c-format +msgid "" +"To change KBFX button skin, simply browse to the image you want OR just " +"Drag&Drop the images to their respective place." +msgstr "" +"Om de 'Skin' van de KBFX knop te veranderen: blader naar de afbeelding die " +"je wilt gebruiken OF Drag&Drop de afbeeldingen naar hun respectievelijke " +"plaatsen." + +#: rc.cpp:9 +#, no-c-format +msgid "Livepreview" +msgstr "'Live'voorbeeld" + +#: rc.cpp:12 +#, no-c-format +msgid "" +"<b>Tip!</b> To see live preview, hover or press the preview image with your " +"mouse." +msgstr "" +"<b> Tip!</b> Om het 'live' voorbeeld te zien, mouse-over of druk de " +"voorbeeld afbeelding in met je muis." + +#: rc.cpp:15 +#, no-c-format +msgid "KBFX Button live preview" +msgstr "KBFX Knop 'live' voorbeeld" + +#: rc.cpp:18 +#, no-c-format +msgid "Here you can see the live preview of the KBFX Button." +msgstr "'Live' voorbeeld van de KBFX Knop." + +#: rc.cpp:21 +#, no-c-format +msgid "Resize Panel" +msgstr "Grootte Werkbalk Wijzigen" + +#: rc.cpp:24 +#, no-c-format +msgid "" +"<b>Tip!</b> This button resizes the panel on which the KBFX button is to " +"button's height or width." +msgstr "" +"<b>Tip!</b> Deze knop wijzigt de hoogte van de werkbalk tot de hoogte " +"van de KBFX knop." + +#: rc.cpp:27 configdialog/kbfxconfigdlgbutton.ui.h:141 +#, no-c-format +msgid "Panel Resize is 'ON'" +msgstr "Werkbalk formaat wijzigen 'AAN'" + +#: rc.cpp:32 +#, no-c-format +msgid "<h3><p align=\"center\">Preview of selected images</p></h3>" +msgstr "<h3><p align=\"center\"> Voorbeeld van de geselecteerde afbeeldingen</p></h3>" + +#: rc.cpp:35 +#, no-c-format +msgid "\"PRESSED\" IMAGE SELECTION" +msgstr "\"INGEDRUKT\"AFBEELDING SELECTIE" + +#: rc.cpp:38 +#, no-c-format +msgid "Please select \"pressed\" image." +msgstr "Selecteer \"ingedrukt\"afbeelding." + +#: rc.cpp:41 rc.cpp:65 rc.cpp:89 +#, no-c-format +msgid "image/jpeg image/png image/x-xpm image/gif" +msgstr "afbeelding/jpeg afbeelding/png afbeelding/x-xpm afbeelding/gif" + +#: rc.cpp:44 +#, no-c-format +msgid "The Pressed Button Skin Image" +msgstr "Ingedrukte Knop Skin Afbeelding" + +#: rc.cpp:47 +#, no-c-format +msgid "Here you can choose the Pressed Button Skin Image" +msgstr "Ingedrukte Knop Skin Afbeelding kiezen" + +#: rc.cpp:50 rc.cpp:74 rc.cpp:98 +#, no-c-format +msgid "Preview" +msgstr "Voorbeeld" + +#: rc.cpp:53 +#, no-c-format +msgid "Pressed Button Skin" +msgstr "Ingedrukte Knop Skin" + +#: rc.cpp:56 +#, no-c-format +msgid "Here you can Drag&Drop the Pressed Button Skin Image." +msgstr "Hier kun je Drag&Drop de Ingedrukte Knop Skin Afbeelding." + +#: rc.cpp:59 +#, no-c-format +msgid "\"NORMAL\" IMAGE SELECTION" +msgstr "\"NORMAAL\" AFBEELDINGS KEUZE" + +#: rc.cpp:62 +#, no-c-format +msgid "Please select \"normal\" image." +msgstr "selecteer \"normaal\" afbeelding." + +#: rc.cpp:68 +#, no-c-format +msgid "The Normal Button Skin Image" +msgstr "Normaal Knop Skin Afbeelding" + +#: rc.cpp:71 +#, no-c-format +msgid "Here you can choose the Normal Button Skin Image" +msgstr "Normaal Knop Skin Afbeelding kiezen" + +#: rc.cpp:77 +#, no-c-format +msgid "Normal Button Skin" +msgstr "Normaal knop skin" + +#: rc.cpp:80 +#, no-c-format +msgid "Here you can Drag&Drop the Normal Button Skin Image." +msgstr "Drag&Drop de Normaal Knop Skin Afbeelding." + +#: rc.cpp:83 +#, no-c-format +msgid "\"HOVER\" IMAGE SELECTION" +msgstr "\"MOUSE-OVER\" AFBEELDINGS KEUZE" + +#: rc.cpp:86 +#, no-c-format +msgid "Please select \"hover\" image." +msgstr "selecteer \"mouse-over\" afbeelding." + +#: rc.cpp:92 +#, no-c-format +msgid "The Hover Button Skin Image" +msgstr "De Mouse-Over Knop Skin Afbeelding" + +#: rc.cpp:95 +#, no-c-format +msgid "Here you can choose the Hover Button Skin Image" +msgstr "Mouse-Over Knop Skin Afbeelding kiezen" + +#: rc.cpp:101 +#, no-c-format +msgid "Hover Button Skin" +msgstr "Mouse-over Knop Skin" + +#: rc.cpp:104 +#, no-c-format +msgid "Here you can Drag&Drop the Hover Button Skin Image." +msgstr "Drag&Drop de Mouse-over Knop Skin Afbeelding." + +#: rc.cpp:107 +#, no-c-format +msgid "<h3><p align=\"center\">Please select KBFX button's images</p></h3>" +msgstr "<h3><p align=\"center\">Selecteer afbeelding voor de KBFX knop</p></h3>" + +#: rc.cpp:110 rc.cpp:179 rc.cpp:296 rc.cpp:404 rc.cpp:440 rc.cpp:461 +#, no-c-format +msgid "KBFX Control Center" +msgstr "KBFX Configuratie Centrum" + +#: rc.cpp:113 +#, no-c-format +msgid "<b><h3><p align=\"center\">Layout options</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Opmaak opties</p></h3></b>" + +#: rc.cpp:116 +#, no-c-format +msgid "EXPORT KBFXLAYOUTRC FILE" +msgstr "EXPORT KBFXOPMAAKRC BESTAND" + +#: rc.cpp:119 +#, no-c-format +msgid "Export the kbfxlayoutrc file to a folder" +msgstr "Exporeer het kbfxopmaakrc bestand naar een map" + +#: rc.cpp:122 rc.cpp:473 +#, no-c-format +msgid "Setup fonts for your KBFX" +msgstr "Stel de lettertypen voor je KBFX in" + +#: rc.cpp:125 rc.cpp:476 +#, no-c-format +msgid "Theme that is edited:" +msgstr "Thema wat bewerkt is" + +#: rc.cpp:128 rc.cpp:479 +#, no-c-format +msgid "<p align=\"left\"><b>default</b></p>" +msgstr "<p align=\"left\"><b>standaard</b></p>" + +#: rc.cpp:131 rc.cpp:482 +#, no-c-format +msgid "Please select the theme you want to edit" +msgstr "Selecteer het thema om te bewerken" + +#: rc.cpp:134 +#, no-c-format +msgid "Select the Layout property to change" +msgstr "Selekteer de opmaakeigenschappen om te veranderen" + +#: rc.cpp:137 +#, no-c-format +msgid "Make it 2 panels (Left \"ON\")" +msgstr "Maak 2 panelen (Links \"AAN\")" + +#: rc.cpp:140 +#, no-c-format +msgid "Make it 2 panels (Right \"ON\")" +msgstr "Maak 2 panelen (Rechts \"AAN\")" + +#: rc.cpp:143 +#, no-c-format +msgid "Make it 3 panels" +msgstr "Maak 3 panelen" + +#: rc.cpp:146 +#, no-c-format +msgid "textLabel1" +msgstr "tekstLabel1" + +#: rc.cpp:149 +#, no-c-format +msgid "textLabel2" +msgstr "tekstLabel2" + +#: rc.cpp:152 +#, no-c-format +msgid "textLabel3" +msgstr "tekstLabel3" + +#: rc.cpp:155 +#, no-c-format +msgid "textLabel4" +msgstr "tekstLabel4" + +#: rc.cpp:158 +#, no-c-format +msgid "checkBox1" +msgstr "Keuzevakje1" + +#: rc.cpp:161 +#, no-c-format +msgid "textLabel5" +msgstr "tekstLabel5" + +#: rc.cpp:164 +#, no-c-format +msgid "textLabel6" +msgstr "tekstLabel6" + +#: rc.cpp:167 +#, no-c-format +msgid "textLabel7" +msgstr "tekstLabel7" + +#: rc.cpp:170 +#, no-c-format +msgid "textLabel8" +msgstr "tekstLabel8" + +#: rc.cpp:173 +#, no-c-format +msgid "checkBox2" +msgstr "Keuzevakje2" + +#: rc.cpp:176 +#, no-c-format +msgid "C&ustom" +msgstr "&Aanpassen" + +#: rc.cpp:182 +#, no-c-format +msgid "<b><h3><p align=\"center\">Plugins options</p></h3></b>" +msgstr "<h3><p align=\"center\"> Voorbeeld van de geselecteerde afbeeldingen</p></h3></b>" + +#: rc.cpp:185 +#, no-c-format +msgid "Select KBFX Panel" +msgstr "Kies KBFX paneel" + +#: rc.cpp:188 rc.cpp:191 +#, no-c-format +msgid "Plugin to configure" +msgstr "Plugin om in te stellen" + +#: rc.cpp:194 +#, no-c-format +msgid "Please select the panel you want to configure: " +msgstr "Selecteer het paneel om te bewerken: " + +#: rc.cpp:197 +#, no-c-format +msgid "&Available Plugins:" +msgstr "Beschikb&are plugins:" + +#: rc.cpp:200 +#, no-c-format +msgid "&Enabled Plugins:" +msgstr "Plugins di&e aanstaan:" + +#: rc.cpp:203 +#, no-c-format +msgid "&Configure Plugin" +msgstr "&Bewerk plugin" + +#: rc.cpp:206 +#, no-c-format +msgid "Alt+C" +msgstr "Alt+C" + +#: rc.cpp:209 rc.cpp:212 +#, no-c-format +msgid "Configure the selected plugin" +msgstr "Bewerk de geselecteerde plugin" + +#: rc.cpp:215 +#, no-c-format +msgid "&Plugin Information" +msgstr "&Plugin informatie" + +#: rc.cpp:218 +#, no-c-format +msgid "Alt+P" +msgstr "Alt+P" + +#: rc.cpp:221 rc.cpp:224 +#, no-c-format +msgid "Information about the selected plugin" +msgstr "Informatie over de geselecteerde plugin" + +#: rc.cpp:227 +#, no-c-format +msgid "KBFX Configurator Application" +msgstr "KBFX Configuratie Programma" + +#: rc.cpp:233 +#, no-c-format +msgid "KBFX Themes" +msgstr "KBFX Thema's" + +#: rc.cpp:245 +#, no-c-format +msgid "Search Engine" +msgstr "Zoekmachine" + +#: rc.cpp:251 +#, no-c-format +msgid "About KBFX" +msgstr "Info over KBFX" + +#: rc.cpp:254 +#, no-c-format +msgid "" +"<br><p align=\"center\"><br><br><br>If you want you can check the latest " +"news for KBFX from here:<br><a href=\"http://www.kbfx.org/\">KBFX News</a></" +"p>" +msgstr "" +"<br><p align=\"center\"><br><br><br> Als je het laatste nieuws van KBFX wilt " +"zien van hier:<br><a href=\"http://www.kbfx.org/\">KBFX Nieuws</a></p>" + +#: rc.cpp:260 +#, no-c-format +msgid "Alt+H" +msgstr "Alt+H" + +#: rc.cpp:263 +#, no-c-format +msgid "Open Help Documentation" +msgstr "Help Documentatie Openen" + +#: rc.cpp:266 +#, no-c-format +msgid "&Default" +msgstr "Stan&daard" + +#: rc.cpp:269 +#, no-c-format +msgid "Alt+D" +msgstr "Alt+D" + +#: rc.cpp:272 +#, no-c-format +msgid "Apply the default configuration for this section only" +msgstr "Standaard configuratie alleen voor deze sectie toepassen" + +#: rc.cpp:278 +#, no-c-format +msgid "Alt+A" +msgstr "Alt+A" + +#: rc.cpp:281 +#, no-c-format +msgid "Save the configuration and Apply it" +msgstr "Sla de configuratie op en pas deze toe" + +#: rc.cpp:287 +#, no-c-format +msgid "Alt+X" +msgstr "Alt+X" + +#: rc.cpp:290 +#, no-c-format +msgid "Exit the configuration without saving" +msgstr "Configuratie afsluiten zonder op te slaan" + +#: rc.cpp:293 +#, no-c-format +msgid "<font size=\"+2\"><b>Kbfx start button</b><br></font>" +msgstr "<font size=\"=2\"><b>KBFX start knop</b><br></font>" + +#: rc.cpp:299 +#, no-c-format +msgid "Select default folder" +msgstr "Selecteer de standaard map" + +#: rc.cpp:302 +#, no-c-format +msgid "Please select the target folder where your themes are." +msgstr "selecteer de map waarin je thema's zijn." + +#: rc.cpp:305 +#, no-c-format +msgid "SpixBar" +msgstr "SpixBalk" + +#: rc.cpp:308 +#, no-c-format +msgid "Installed Themes" +msgstr "Geïnstalleerde Thema's" + +#: rc.cpp:311 +#, no-c-format +msgid "Here are listed all the installed KBFX Themes" +msgstr "Alle geïnstalleerde KBFX Thema's" + +#: rc.cpp:314 +#, no-c-format +msgid "Selected Theme Preview" +msgstr "Geselecteerd Thema Voorbeeld" + +#: rc.cpp:317 +#, no-c-format +msgid "Delete Selected" +msgstr "Selectie verwijderen" + +#: rc.cpp:320 +#, no-c-format +msgid "Delete the Selected Theme" +msgstr "Geselecteerd Thema Verwijderen" + +#: rc.cpp:323 +#, no-c-format +msgid "" +"Pressing the button will delete the currently selected theme. <br><b>Warning!" +"</b> You cannot delete the installed system wide themes!" +msgstr "" +"Als je de knop indrukt wordt het huidig geselecteerde thema verwijdert. " +"<br><b> Waarschuwing!</b> U kunt de systeem breed geïnstalleerde thema's " +"niet verwijderen!" + +#: rc.cpp:326 +#, no-c-format +msgid "Get Themes" +msgstr "Thema's Ophalen" + +#: rc.cpp:329 +#, no-c-format +msgid "Get More Themes from the Internet" +msgstr "Meer Thema's van het Internet Ophalen" + +#: rc.cpp:332 +#, no-c-format +msgid "" +"Pressing the button will launch konqueror and go to the KBFX Themes Section " +"on www.kde-look.org" +msgstr "" +"Het indrukken van de knop start konqueror op, die vervolgens naar de KBFX " +"Thema Sectie van www.kde-look.org gaat" + +#: rc.cpp:335 +#, no-c-format +msgid "Install Theme" +msgstr "Installeer Thema" + +#: rc.cpp:338 +#, no-c-format +msgid "Install New Theme from KBFX Theme Package" +msgstr "Installeer Nieuw Thema van KBFX Thema Pakket" + +#: rc.cpp:341 +#, no-c-format +msgid "" +"Pressing the button will offer a dialog where you can choose KBFX Theme " +"Package to install in your home folder" +msgstr "" +"Wanneer de knop wordt ingedrukt zal er een dialoogvenster verschijnen waarin " +"je het KBFX Thema Pakket kunt kiezen om te installeren in je home map" + +#: rc.cpp:344 +#, no-c-format +msgid "Convert Theme" +msgstr "Converteer thema " + +#: rc.cpp:347 +#, no-c-format +msgid "Convert a theme to the new format" +msgstr "Converteer een thema naar het nieuwe formaat" + +#: rc.cpp:350 +#, no-c-format +msgid "" +"Pressing the button will open dialog for converting old themes to the new " +"specifications" +msgstr "" +"Wanneer de knop wordt ingedrukt zal er een dialoogvenster verschijnen waarin " +"je oude thema's naar de nieuwe specificaties kunt converteren" + +#: rc.cpp:353 +#, no-c-format +msgid "Personal Image" +msgstr "Persoonlijke Afbeelding" + +#: rc.cpp:356 +#, no-c-format +msgid "Theme's Default" +msgstr "Thema s Standaard" + +#: rc.cpp:359 +#, no-c-format +msgid "Set the Theme's Default Personal Image" +msgstr "Instellen van Thema s Standaard Persoonlijke Afbeelding" + +#: rc.cpp:362 +#, no-c-format +msgid "" +"Pressing the button will delete the personal image you have selected and " +"install the theme's default personal image" +msgstr "" +"Wanneer de knop wordt ingedrukt zal de persoonlijke afbeelding die je hebt " +"gekozen worden verwijderd, en zal de afbeelding van het standaard thema " +"worden geinstalleerd." + +#: rc.cpp:365 +#, no-c-format +msgid "Maxsize 48 x 48" +msgstr "Maximum grootte 48 x 48" + +#: rc.cpp:368 +#, no-c-format +msgid "Select New image" +msgstr "Kies Nieuwe afbeelding" + +#: rc.cpp:371 +#, no-c-format +msgid "Select a Personal Image" +msgstr "Kies een Persoonlijke Afbeelding" + +#: rc.cpp:374 +#, no-c-format +msgid "Pressing the button will open a dialog to select your personal image" +msgstr "" +"Wanneer de knop wordt ingedrukt zal er een dialoogvenster verschijnen waarin " +"je een persoonlijke afbeelding kunt kiezen" + +#: rc.cpp:377 +#, no-c-format +msgid "This is your personal image displayed at the KBFX menu." +msgstr "Dit is je persoonlijke afbeelding getoond in het KBFX menu." + +#: rc.cpp:380 +#, no-c-format +msgid "Misc Options" +msgstr "Diverse opties" + +#: rc.cpp:383 +#, no-c-format +msgid "Watch System Installs" +msgstr "Systeem installaties bekijken" + +#: rc.cpp:386 rc.cpp:389 +#, no-c-format +msgid "Watch for applications installs and reload KBFX if any occurs" +msgstr "Kijk naar programma installaties en herlaad KBFX als die zich voordoen" + +#: rc.cpp:392 rc.cpp:395 +#, no-c-format +msgid "Show Old Themes" +msgstr "Laat oude thema's zien" + +#: rc.cpp:398 +#, no-c-format +msgid "<b><h3><p align=\"center\">Please select theme folder</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Selecteer de thema map</p></h3></b>" + +#: rc.cpp:401 +#, no-c-format +msgid "<b><h3><p align=\"center\">Installed themes</p></h3></b>" +msgstr "<b><h3><p align=\"center\"> Geinstalleerde thema's</p></h3></b>" + +#: rc.cpp:407 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Hulpballon AAN of UIT</p></h3>" + +#: rc.cpp:410 +#, no-c-format +msgid "Turn off or on the tooltip" +msgstr "Zet de hulpballon uit of aan" + +#: rc.cpp:413 +#, no-c-format +msgid "" +"Turn your tooltip off or on. <br>You can see the current status of the " +"tooltip to the right." +msgstr "" +"Zet de hulpballon uit of aan<br> U kunt de huidige status van de hulpballon " +"aan de rechterkant zien." + +#: rc.cpp:416 +#, no-c-format +msgid "Turn the tooltip \"OFF\"" +msgstr "Zet hulpballon animatie \"UIT\"" + +#: rc.cpp:419 +#, no-c-format +msgid "Tooltip Text" +msgstr "Hulpballon Tekst" + +#: rc.cpp:422 +#, no-c-format +msgid "Type the text which you want to be displayed in the tooltip." +msgstr "Type de tekst in die moet worden getoond in de hulpballon" + +#: rc.cpp:425 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip personal text</p></h3></b>" +msgstr "<b><h3><p align=\"center\">Hulpballon met persoonlijke tekst</p></h3></b>" + +#: rc.cpp:428 +#, no-c-format +msgid "Tooltip animation" +msgstr "Hulpballon animatie" + +#: rc.cpp:431 +#, no-c-format +msgid "" +"Turn your tooltip animation off or on. <br>You can see the current status of " +"the tooltip to the right." +msgstr "" +"Zet hulpballon animatie uit of aan. <br> U kunt de huidige status van de " +"hulpballon aan de rechterkant zien." + +#: rc.cpp:434 +#, no-c-format +msgid "Turn the animation \"ON\"" +msgstr "Animatie \"AAN\"" + +#: rc.cpp:437 +#, no-c-format +msgid "<b><h3><p align=\"center\">Tooltip animation ON or OFF</p></h3></b>" +msgstr "<b><h3><p align=\"center\"> Hulpballon animatie AAN of UIT</p></h3></b>" + +#: rc.cpp:443 +#, no-c-format +msgid "<b><h3><p align=\"center\">Menu type</p></h3></b>" +msgstr "<b><h3><p align=\"center\"> Menu type</p></h3></b>" + +#: rc.cpp:446 +#, no-c-format +msgid "Please select the menu style" +msgstr "Kies de menu stijl" + +#: rc.cpp:449 rc.cpp:455 +#, no-c-format +msgid "KBFX MENU" +msgstr "KBFX MENU" + +#: rc.cpp:452 rc.cpp:458 +#, no-c-format +msgid "KDE MENU" +msgstr "KDE MENU" + +#: rc.cpp:464 +#, no-c-format +msgid "<b><h3><p align=\"center\">Font options</p></h3></b>" +msgstr "<b><h3><p align=\"center\"> Lettertype opties</p></h3></b>" + +#: rc.cpp:467 +#, no-c-format +msgid "EXPORT KBFXFONTRC FILE" +msgstr "EXPORT KBFXFONTRC BESTAND" + +#: rc.cpp:470 +#, no-c-format +msgid "Export the kbfxfontrc file to a folder" +msgstr "Exporeer het kbfxfontrc bestand naar een map" + +#: rc.cpp:485 +#, no-c-format +msgid "Bold fonts on hover" +msgstr "Vette letters bij muisover" + +#: rc.cpp:488 rc.cpp:491 +#, no-c-format +msgid "Make fonts bolder when you hover the mouse over an item" +msgstr "Maak de letters vetter als je met de muis over een item gaat" + +#: rc.cpp:494 +#, no-c-format +msgid "Application \"LINE\":" +msgstr "Toepassing \"REGEL\":" + +#: rc.cpp:497 +#, no-c-format +msgid "Horizontal line color in the application area." +msgstr "Horizontale regel kleur in de toepassing." + +#: rc.cpp:500 +#, no-c-format +msgid "Application text :" +msgstr "Programma tekst :" + +#: rc.cpp:503 +#, no-c-format +msgid "Select the color of the \"application\" in the menu." +msgstr "Selecteer de kleur van het \"programma\" in het menu." + +#: rc.cpp:506 +#, no-c-format +msgid "Comment text:" +msgstr "Toelichtings tekst :" + +#: rc.cpp:509 +#, no-c-format +msgid "Color of the \"comments\" in the menu." +msgstr "Kleur van de commentaren in het menu." + +#: rc.cpp:512 +#, no-c-format +msgid "Name display:" +msgstr "Naam venster :" + +#: rc.cpp:515 rc.cpp:527 rc.cpp:533 +#, no-c-format +msgid "The color of your login name in the menu." +msgstr "De kleur van je login naam in het menu." + +#: rc.cpp:518 +#, no-c-format +msgid "Category text:" +msgstr "Categorie tekst :" + +#: rc.cpp:521 +#, no-c-format +msgid "Font color of the categoris in the menu." +msgstr "Lettertype kleur van de categorien in het menu." + +#: rc.cpp:524 +#, no-c-format +msgid "Separator:" +msgstr "Scheidingslijn :" + +#: rc.cpp:530 +#, no-c-format +msgid "Plugin:" +msgstr "Plugin:" + +#: rc.cpp:536 +#, no-c-format +msgid "Select font for the application's text" +msgstr "Selecteer het lettertype van de programma tekst" + +#: rc.cpp:539 +#, no-c-format +msgid "Select font for the comment's text" +msgstr "Kies het lettertype voor de tekst van het commentaar" + +#: rc.cpp:542 +#, no-c-format +msgid "Select font for the username's text" +msgstr "Kies het lettertype voor de gebruikersnaam" + +#: rc.cpp:545 +#, no-c-format +msgid "Select font for the category's text" +msgstr "Kies het lettertype voor categorie tekst" + +#: rc.cpp:548 +#, no-c-format +msgid "Select font for the separator's text" +msgstr "Kies het lettertype voor scheidingslijn tekst" + +#: rc.cpp:551 +#, no-c-format +msgid "Select font for the plugins' text" +msgstr "Kies het lettertype voor de plugins tekst" + +#: rc.cpp:554 +#, no-c-format +msgid "Form1" +msgstr "Formulier1" + +#: rc.cpp:557 +#, no-c-format +msgid "<b><h3><p align=\"center\">People behind KBFX</p></h3></b>" +msgstr "<b><h3><p align=\"center\"> Mensen achter KBFX</p></h3></b>" + +#: rc.cpp:560 +#, no-c-format +msgid "You are running: <b>KBFX 0493</b>" +msgstr "U draait: <b>KBFX 0493</b>" + +#: rc.cpp:563 +#, no-c-format +msgid "" +"Here are the people behind the KBFX application.\n" +"We would like to thank all people who have helped with KBFX or have donated " +"money to our project!\n" +"THANKS A LOT ALL OF YOU OUT THERE!!!" +msgstr "" +"Hier zijn de mensen achter het KBFX programma.\n" +"We willen alle mensen bedanken die hebben geholpen met KBFX en degenen die " +"geld hebben gedoneerd voor ons project!\n" +"BEDANKT ALLEMAAL!!!" + +#: rc.cpp:568 +#, no-c-format +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> Author, Maintainer, Developer, Project " +"Admin<br><br><strong>Email:</strong> siraj(a)mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> Siraj Razick<br><br><strong> Land:</strong> Sri " +"Lanka<br><br><strong>KBFX</strong> Auteur Onderhouder Ontwikkelaar Project " +"Admin<br><br><strong> E-mail</strong> siraj(a)mail.kbfx.org" + +#: rc.cpp:571 +#, no-c-format +msgid "" +"<b>Tip!</b> Hover over the contact images to see each personal contact " +"information." +msgstr "" +"<b>Tip!</b>Beweeg de muis-pijl over de contact afbeeldingen om de persoonlijke contact " +"informatie zichtbaar te maken." + +#: rc.cpp:574 +#, no-c-format +msgid "SPONSORS!" +msgstr "DONATEURS!" + +#: rc.cpp:577 +#, no-c-format +msgid "" +"We would like to thank swedish computer company <b>PC Agenten</b> for " +"sponsoring us with a server and bandwidth." +msgstr "" +"We willen de Zweedse computer firma <b>PC Agenten</b> bedanken voor het " +"verstrekken van een server en bandbreedte." + +#: rc.cpp:580 +#, no-c-format +msgid "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'>HTTP://WWW." +"PCAGENTEN.SE</a></u></b></p>" +msgstr "" +"<p align=\"right\"><u><b><a href='http://www.pcagenten.se'> HTTP://WWW. " +"PCAGENTEN.SE </a></u></b></p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:59 +msgid "" +"<p align='center'>Invalid user themes folder!</p><p align='center'>Will use " +"default user themes folder.</p>" +msgstr "" +"<p align='center'>Onbruikbare gebruikers thema map!</p><p align='center'>Standaard " +"gebruikers thema map wordt gebruikt</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:61 +msgid "Error loading themes" +msgstr "Fout! Thema niet geladen" + +#: configdialog/kbfxconfigdlgthemes.ui.h:164 +msgid "" +"<p align='center'>Are you sure you want to uninstall the KBFX theme <strong>%" +"1</strong>?</p>" +msgstr "" +"<p align='center'>Weet U zeker dat U het KBFX thema wilt verwijderen <strong>% " +"1</strong>?</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:165 +msgid "Uninstall KBFX theme" +msgstr "Verwijder KBFX thema " + +#: configdialog/kbfxconfigdlgthemes.ui.h:166 +msgid "Uninstall" +msgstr "Verwijder" + +#: configdialog/kbfxconfigdlgthemes.ui.h:179 +msgid "" +"<p align='center'>Could not uninstall this KBFX theme.</p><p " +"align='center'>You may not have sufficient permissions to delete the folder " +"<strong>%1<strong>.</p>" +msgstr "" +"<p align='center'>Kon de installatie van dit KBFX thema niet ongedaan maken.</p><p " +"align='center'>Misschien heeft U niet voldoende rechten om de map te verwijderen " +"<strong>%1<strong>.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:192 +msgid "KBFX theme packages (*.tar, *.tar.bz2, *.tar.gz, *.kbfxtheme)" +msgstr "KBFX thema pakketten (*.tar, *.tar.bz2, *tar.gz, *.kbfxtheme)" + +#: configdialog/kbfxconfigdlgthemes.ui.h:196 +msgid "Select KBFX theme package to install" +msgstr "Kies het KBFX thema pakket om te installeren" + +#: configdialog/kbfxconfigdlgthemes.ui.h:212 +msgid "<p align='center'>Could not read this KBFX theme package.</p>" +msgstr "<p align='center'>Kon dit KBFX thema pakket niet lezen.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:239 +msgid "Select personal image" +msgstr "Kies een persoonlijke afbeelding" + +#: configdialog/kbfxconfigdlgthemes.ui.h:250 +msgid "" +"<p align='center'>Image cannot be used as a personal image!</p><p " +"align='center'>Will use default personal image.</p>" +msgstr "" +"<p align='center'>Afbeelding kan niet als persoonlijke afbeelding gebruikt worden!</p><p " +"align='center'>De standaard persoonlijke afbeelding wordt gebruikt.</p>" + +#: configdialog/kbfxconfigdlgthemes.ui.h:252 +#: configdialog/kbfxconfigdlgbutton.ui.h:65 +#: configdialog/kbfxconfigdlgbutton.ui.h:86 +#: configdialog/kbfxconfigdlgbutton.ui.h:107 +msgid "Error loading image" +msgstr "Fout! Afbeelding niet geladen" + +#: configdialog/kbfxconfigdlgthemes.ui.h:284 +#: configdialog/kbfxconfigdlgmain.ui.h:34 +msgid "<p align='center'>Not implemented yet.</p>" +msgstr "<p align='center'>Nog niet geimplementeerd</p>" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:23 +msgid "Turn the animation 'OFF'" +msgstr "Animatie 'UIT'" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:30 +msgid "Turn the animation 'ON'" +msgstr "Animatie 'AAN'" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:53 +msgid "Turn the tooltip 'OFF'" +msgstr "Zet hulpballon 'UIT'" + +#: configdialog/kbfxconfigdlgtooltip.ui.h:60 +msgid "Turn the tooltip 'ON'" +msgstr "Zet hulpballon 'AAN'" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:122 +msgid "Select folder to export kbfxfontrc file" +msgstr "Kies de map waar het kbfxfontrc bestand naartoe geexporteerd moet worden" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:151 +msgid "" +"<p align='center'>The Font configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>Lettertype instelling voor het KBFX thema <strong>%1</" +"strong>is met succes geexporteerd!</p>" + +#: configdialog/kbfxconfigdlgfonts-old.ui.h:152 +msgid "KBFX Font Export Ready" +msgstr "KBFX lettertype export gereed" + +#: configdialog/kbfxconfigdlgabout.ui.h:23 +msgid "" +"<strong>Name:</strong> Mensur Zahirovic (Nookie)<br><br><strong>Country:</" +"strong> Sweden<br><br><strong>KBFX:</strong> co-author, Q/A, system design, " +"web designer, bug hunter, project administror<br><br><strong>Email:</strong> " +"nookie@mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> Mensur Zahirovic (Nookie)<br><br><strong> Land:</ " +"strong> Sweden<br><br><strong>KBFX</strong> co auteur, Q/A, systeem ontwerp, " +"web designer, bug hunter, project administrator<br><br><strong> E-mail</strong> " +"nookie@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:32 +msgid "" +"<strong>Name:</strong> Siraj Razick<br><br><strong>Country:</strong> Sri " +"Lanka<br><br><strong>KBFX:</strong> author, maintainer, developer, project " +"administror<br><br><strong>Email:</strong> siraj@mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> Siraj Razick<br><br><strong> Land:</strong> Sri " +"Lanka<br><br><strong>KBFX</strong> auteur onderhouder ontwikkelaar project " +"administrator<br><br><strong> E-mail</strong> siraj@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:41 +msgid "" +"<strong>Name:</strong> Nathanael Dracor Gogniat<br><br><strong>Country:</" +"strong> Switzerland<br><br><strong>KBFX:</strong> project technical writer, " +"documentation manager, co-author<br><br><strong>Email:</strong> " +"nathanael@mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> Nathanael Dracor Gogniat<br><br><strong> Land:</ " +"strong> Switzerland<br><br><strong>KBFX</strong> technisch project schrijver, " +"documentatie manager, co auteur<br><br><strong> E-mail</strong> " +"nathanael@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:50 +msgid "" +"<strong>Name:</strong> PhobosK<br><br><strong>Country:</strong> " +"Bulgaria<br><br><strong>KBFX:</strong> package & release manager, Q/A, bug " +"hunter, mandriva packages, project administrator, developer Qt/C+" +"+<br><br><strong>Email:</strong> phobosk@mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> PhobosK<br><br><strong> Land:</strong> " +"Bulgarije<br><br><strong>KBFX</strong> pakket en release manager, Q/A, bug " +"hunter, mandriva pakketten, project administrator, ontwikkelaar Qt/C+" +"+<br><br><strong> E-mail</strong> phobosk@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:59 +msgid "" +"<strong>Name:</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"developer Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" +msgstr "" +"<strong> Naam</strong> Johnny Henry Saenz Acuna (scarebyte)" +"<br><br><strong>Country:</strong> Peru<br><br><strong>KBFX:</strong> " +"ontwikkelaar Qt4/C++<br><br><strong>Email:</strong> saenzac@mail.kbfx.org" + +#: configdialog/kbfxconfigdlgabout.ui.h:68 +msgid "" +"<strong>Name:</strong> Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"library developer for Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" +msgstr "" +"<strong> Naam</strong>Christoffer Brodd-Reijer (Ephracis)" +"<br><br><strong>Country:</strong> Sweden<br><br><strong>KBFX:</strong> " +"bibliotheek ontwikkelaar voor Raptor<br><br><strong>Email:</strong> ephracis@mail." +"kbfx.org" + +#: configdialog/kbfxconfigdlgbutton.ui.h:63 +msgid "" +"<p align='center'>Image cannot be used as a pressed button skin!</p><p " +"align='center'>Will use default pressed button skin.</p>" +msgstr "" +"<p align='center'>Afbeelding kan niet gebruikt worden als ingedrukte knop skin!</p><p " +"align='center'>De standaard ingedrukte knop skin wordt gebruikt.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:84 +msgid "" +"<p align='center'>Image cannot be used as a normal button skin!</p><p " +"align='center'>Will use default normal button skin.</p>" +msgstr "" +"<p align='center'>Afbeelding kan niet gebruikt worden als normale knop skin!</p><p " +"align='center'>De standaard normale knop skin wordt gebruikt.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:105 +msgid "" +"<p align='center'>Image cannot be used as a hover button skin!</p><p " +"align='center'>Will use default hover button skin.</p>" +msgstr "" +"<p align='center'>Afbeelding kan niet gebruikt worden als muisover knop skin!</p><p " +"align='center'>De standaard muisoverknop skin word gebruikt.</p>" + +#: configdialog/kbfxconfigdlgbutton.ui.h:147 +msgid "Panel Resize is 'OFF'" +msgstr "Werkbalk Grootte wijzigen 'UIT'" + +#: configdialog/kbfxconfigdlglayout.ui.h:16 +msgid "User Properties" +msgstr "Gebruikers eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:17 +msgid "* Top Bar Properties" +msgstr "* Bovenbalk eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:18 +msgid "* Bottom Bar Properties" +msgstr "* Bodembalk eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:20 +msgid "* List Box Properties" +msgstr "* Eigenschappen van lijstveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:21 +msgid "Search Box Properties" +msgstr "Eigenschappen van zoekveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:22 +msgid "* Item Properties" +msgstr "* Item eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:24 +msgid "* Main Menu Properties" +msgstr "* Hoofdmenu eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:25 +msgid "Water Effect Properties" +msgstr "Water effect eigenschappen" + +#: configdialog/kbfxconfigdlglayout.ui.h:209 +msgid "Face Position X" +msgstr "Gezichts positie X" + +#: configdialog/kbfxconfigdlglayout.ui.h:210 +msgid "Face Position Y" +msgstr "Gezichts positie Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:211 +msgid "User Name Position X" +msgstr "Gebruikersnaam positie X" + +#: configdialog/kbfxconfigdlglayout.ui.h:212 +msgid "User Name Position Y" +msgstr "Gebruikersnaam positie Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:213 +msgid "Face Box Position X" +msgstr "Positie X van vensterweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:214 +msgid "Face Box Position Y" +msgstr "Positie Y van vensterweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:215 +msgid "Face Box Height" +msgstr "Hoogte van vensterweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:216 +msgid "Face Box Width" +msgstr "Breedte van vensterweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:217 +msgid "Hide User Name" +msgstr "Verberg gebruikersnaam" + +#: configdialog/kbfxconfigdlglayout.ui.h:235 +msgid "* Top Bar Height" +msgstr "* Hoogte van de bovenbalk" + +#: configdialog/kbfxconfigdlglayout.ui.h:241 +msgid "Top Bar Width" +msgstr "Breedte van de bovenbalk" + +#: configdialog/kbfxconfigdlglayout.ui.h:266 +msgid "* Bottom Bar Height" +msgstr "*Hoogte van de onderbalk" + +#: configdialog/kbfxconfigdlglayout.ui.h:272 +msgid "Bottom Bar Width" +msgstr "Breedte van de onderbalk" + +#: configdialog/kbfxconfigdlglayout.ui.h:322 +msgid "* List Box Position X" +msgstr "Positie X van lijstweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:323 +msgid "* List Box Position Y" +msgstr "Positie Y van lijstweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:326 +msgid "List Box Height" +msgstr "Hoogte van lijstweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:327 +msgid "* List Box Width" +msgstr "Breedte van lijstweergave" + +#: configdialog/kbfxconfigdlglayout.ui.h:345 +msgid "Search Box Position X" +msgstr "Positie X van zoekveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:346 +msgid "Search Box Position Y" +msgstr "Positie Y van zoekveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:349 +msgid "Search Box Height" +msgstr "Hoogte van zoekveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:350 +msgid "Search Box Width" +msgstr "Breedte van zoekveld" + +#: configdialog/kbfxconfigdlglayout.ui.h:368 +msgid "* Item Position X" +msgstr "* Item positie X" + +#: configdialog/kbfxconfigdlglayout.ui.h:369 +msgid "* Item Position Y" +msgstr "* Item positie Y" + +#: configdialog/kbfxconfigdlglayout.ui.h:370 +msgid "Icon Size in Item" +msgstr "Icoon formaat in item" + +#: configdialog/kbfxconfigdlglayout.ui.h:372 +msgid "Item Height" +msgstr "Item hoogte" + +#: configdialog/kbfxconfigdlglayout.ui.h:373 +msgid "* Item Width" +msgstr "* Item breedte" + +#: configdialog/kbfxconfigdlglayout.ui.h:374 +msgid "Comment Margin in Item" +msgstr "Ruimte voor commentaar in item" + +#: configdialog/kbfxconfigdlglayout.ui.h:376 +msgid "No Comments in Item" +msgstr "Geen commentaar in item" + +#: configdialog/kbfxconfigdlglayout.ui.h:417 +msgid "* Main Menu Height" +msgstr "* Hoogte hoofdmenu" + +#: configdialog/kbfxconfigdlglayout.ui.h:421 +msgid "* Main Menu Width" +msgstr "* Breedte hoofdmenu" + +#: configdialog/kbfxconfigdlglayout.ui.h:425 +msgid "Contracted Menues" +msgstr "Gecontracteerde menu's" + +#: configdialog/kbfxconfigdlglayout.ui.h:441 +msgid "Water Effect Frame Rate" +msgstr "Framesnelheid van watereffect" + +#: configdialog/kbfxconfigdlglayout.ui.h:450 +msgid "Enabled Water Effect" +msgstr "Water effect aan" + +#: configdialog/kbfxconfigdlglayout.ui.h:495 +msgid "Select folder to export kbfxlayoutrc file" +msgstr "Kies een map om het kbfxopmaak bestand naartoe te exporteren" + +#: configdialog/kbfxconfigdlglayout.ui.h:580 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> has been exported successfully!</p>" +msgstr "" +"<p align='center'>De opmaak instelling voor het KBFX thema opslaan <strong>%1</" +"strong>?is met succes geexporteerd!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:581 +msgid "KBFX Layout Export Ready" +msgstr "KBFX opmaak exporteren gereed" + +#: configdialog/kbfxconfigdlglayout.ui.h:648 +msgid "" +"<p align='center'>The Layout configuration of the KBFX Theme <strong>%1</" +"strong> is ready!</p><p align='center'>Be sure to click the <strong>Apply</" +"strong> button in order the changes to become active!</p>" +msgstr "" +"<p align='center'>De opmaak instelling van het KBFX thema<strong>%1</strong> " +"is gereed!</p><p align='center'>Vergeet niet om de <strong>toepassen</strong> knop te gebruiken om de wijzigingen te aktiveren!</p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:649 +msgid "KBFX Layout Ready" +msgstr "KBFX opmaak gereed" + +#: configdialog/kbfxconfigdlglayout.ui.h:655 +msgid "" +"<p align='center'>KBFX will calculate the necessary values using the present " +"values for:</p><p align='center'><strong>* Main Menu Height</strong> and " +"<strong>* Main Menu Width</strong><br><strong>* Bottom Bar Height</strong> " +"and <strong>* Top Bar Height</strong><br></p><p align='center'>So be sure " +"that you have entered their values as you desire!</p><p " +"align='center'><strong>NOTE:</strong> Have in mind that the Layout of the " +"theme also depends on the sizes of the images! So if the theme does not look " +"like as you desire either change the images' sizes to smaller width OR " +"change <strong>* Main Menu Width</strong> to higher value!</p>" +msgstr "" +"<p align='center'>KBFX zal door gebruik te maken van de huidige waarden, de noodzakelijke " +"waarden voor de:</p><p align='center'><strong>* hoogte van het Hoofdmenu</strong> en de " +"<strong>*breedte van het Hoofdmenu</strong><br><strong>hoogte van de Onderbalk</strong> " +"en van de <strong>hoogte van de Bovenbalk</strong><br></p><p align='center'>Wees er dus " +"zeker van de waarden die je wenst te hebben ingevuld!</p><p " +"align='center'><strong>LET OP:</strong>Houd in gedachten dat de opmaakvan het thema " +"ook afhangt van de afmetingen van de afbeeldingen! Dus als het thema er niet uitziet " +"zoals je wilt, verklein dan de afmetingen van de afbeeldingen, OF " +"vergroot de <strong>breedte van het Hoofdmenu</strong></p>" + +#: configdialog/kbfxconfigdlglayout.ui.h:661 +msgid "Prepare Layout for the KBFX theme" +msgstr "Opmaak voor het KBFX thema voorbereiden" + +#: configdialog/kbfxconfigdlglayout.ui.h:662 +msgid "Prepare" +msgstr "Voorbereiden" + +#: configdialog/kbfxconfigdlgplugins.ui.h:15 +msgid "Left Panel" +msgstr "Linker paneel" + +#: configdialog/kbfxconfigdlgplugins.ui.h:16 +msgid "Right Panel" +msgstr "Rechter paneel" + +#: configdialog/kbfxconfigdlgplugins.ui.h:79 +#: configdialog/kbfxconfigdlgplugins.ui.h:85 +msgid "<p align='center'>Not Implemented yet.</p>" +msgstr "<p align='center'>Nog niet geimplementeerd.</p>" + diff --git a/skin/raster/2panels/CMakeLists.txt b/skin/raster/2panels/CMakeLists.txt new file mode 100644 index 0000000..107e44d --- /dev/null +++ b/skin/raster/2panels/CMakeLists.txt @@ -0,0 +1,4 @@ +FILE(GLOB PNGFILES *.png kbfxlayoutrc kbfxfontrc version-2 ) + +INSTALL(FILES ${PNGFILES} + DESTINATION ${DATA_INSTALL_DIR}/kbfx/skins/2panels) diff --git a/skin/raster/2panels/appfind.png b/skin/raster/2panels/appfind.png Binary files differnew file mode 100644 index 0000000..2919054 --- /dev/null +++ b/skin/raster/2panels/appfind.png diff --git a/skin/raster/2panels/bg.png b/skin/raster/2panels/bg.png Binary files differnew file mode 100644 index 0000000..b383c0f --- /dev/null +++ b/skin/raster/2panels/bg.png diff --git a/skin/raster/2panels/bg_sidebar.png b/skin/raster/2panels/bg_sidebar.png Binary files differnew file mode 100644 index 0000000..d10c7f4 --- /dev/null +++ b/skin/raster/2panels/bg_sidebar.png diff --git a/skin/raster/2panels/botbg.png b/skin/raster/2panels/botbg.png Binary files differnew file mode 100644 index 0000000..7951a91 --- /dev/null +++ b/skin/raster/2panels/botbg.png diff --git a/skin/raster/2panels/butterfly.png b/skin/raster/2panels/butterfly.png Binary files differnew file mode 100644 index 0000000..70fb383 --- /dev/null +++ b/skin/raster/2panels/butterfly.png diff --git a/skin/raster/2panels/dudebox.png b/skin/raster/2panels/dudebox.png Binary files differnew file mode 100644 index 0000000..749464d --- /dev/null +++ b/skin/raster/2panels/dudebox.png diff --git a/skin/raster/2panels/fancymenuitem.png b/skin/raster/2panels/fancymenuitem.png Binary files differnew file mode 100644 index 0000000..44dd8d1 --- /dev/null +++ b/skin/raster/2panels/fancymenuitem.png diff --git a/skin/raster/2panels/find.png b/skin/raster/2panels/find.png Binary files differnew file mode 100644 index 0000000..47bdd18 --- /dev/null +++ b/skin/raster/2panels/find.png diff --git a/skin/raster/2panels/hover.png b/skin/raster/2panels/hover.png Binary files differnew file mode 100644 index 0000000..ff00ee1 --- /dev/null +++ b/skin/raster/2panels/hover.png diff --git a/skin/raster/2panels/indexseparator.png b/skin/raster/2panels/indexseparator.png Binary files differnew file mode 100644 index 0000000..58b9208 --- /dev/null +++ b/skin/raster/2panels/indexseparator.png diff --git a/skin/raster/2panels/kbfxfontrc b/skin/raster/2panels/kbfxfontrc new file mode 100644 index 0000000..06c6b79 --- /dev/null +++ b/skin/raster/2panels/kbfxfontrc @@ -0,0 +1,15 @@ +[Fonts] +ApplicationText=0,0,0 +ApplicationTextFont=Arial,8,-1,5,50,0,0,0,0,0 +CommentText=47,63,85 +CommentTextFont=Arial,8,-1,5,50,0,0,0,0,0 +GroupText=0,0,0 +GroupTextFont=Arial,8,-1,5,50,0,0,0,0,0 +HoverBold=false +LineColor=47,63,85 +PluginColor=47,63,85 +PluginFont=Arial,8,-1,5,50,0,0,0,0,0 +SeparatorColor=47,63,85 +SeparatorFont=Arial,8,-1,5,75,0,0,0,0,0 +UserName=255,255,255 +UserNameFont=Arial,10,-1,5,75,0,0,0,0,0 diff --git a/skin/raster/2panels/kbfxlayoutrc b/skin/raster/2panels/kbfxlayoutrc new file mode 100644 index 0000000..96d4589 --- /dev/null +++ b/skin/raster/2panels/kbfxlayoutrc @@ -0,0 +1,66 @@ +[BottomBar] +Height=38 +Width=410 +X=0 +Y=428 + +[ItemProperties] +CommentMargin=66 +IconSize=32 +NoComments=false + +[ItemView] +Height=467 +Width=256 +X=0 +Y=95 + +[KbfxButton] +FadeTime=75 + +[ListBox] +Height=100 +Width=154 +X=256 +Y=95 + +[MainMenu] +ContractedMenu=false +UserMenuHeight=600 +UserMenuWidth=410 + +[Scrollbars] +ScrollBarBotX=0 +ScrollBarBotY=51 +ScrollBarTopX=0 +ScrollBarTopY=62 + +[SearchBox] +FixedPos=true +Height=22 +Width=193 +X=20 +Y=570 + +[ToolBar] +ButtonNormalSize=48 +ButtonPressedSize=48 + +[TopBar] +DisableUserName=false +DudeX=311 +DudeY=0 +FaceH=52 +FaceW=52 +FaceX=8 +FaceY=7 +Height=95 +UserNameX=292 +UserNameY=84 +Width=410 +X=0 +Y=0 + +[WaterEffect] +EnableWater=false +FrameRate=20 diff --git a/skin/raster/2panels/listboxbg.png b/skin/raster/2panels/listboxbg.png Binary files differnew file mode 100644 index 0000000..ef36f77 --- /dev/null +++ b/skin/raster/2panels/listboxbg.png diff --git a/skin/raster/2panels/lock.png b/skin/raster/2panels/lock.png Binary files differnew file mode 100644 index 0000000..3700c9d --- /dev/null +++ b/skin/raster/2panels/lock.png diff --git a/skin/raster/2panels/lockhover.png b/skin/raster/2panels/lockhover.png Binary files differnew file mode 100644 index 0000000..49896aa --- /dev/null +++ b/skin/raster/2panels/lockhover.png diff --git a/skin/raster/2panels/logo.png b/skin/raster/2panels/logo.png Binary files differnew file mode 100644 index 0000000..febf230 --- /dev/null +++ b/skin/raster/2panels/logo.png diff --git a/skin/raster/2panels/logout.png b/skin/raster/2panels/logout.png Binary files differnew file mode 100644 index 0000000..e69b6a3 --- /dev/null +++ b/skin/raster/2panels/logout.png diff --git a/skin/raster/2panels/logouthover.png b/skin/raster/2panels/logouthover.png Binary files differnew file mode 100644 index 0000000..3f70ba3 --- /dev/null +++ b/skin/raster/2panels/logouthover.png diff --git a/skin/raster/2panels/mask.png b/skin/raster/2panels/mask.png Binary files differnew file mode 100644 index 0000000..8247417 --- /dev/null +++ b/skin/raster/2panels/mask.png diff --git a/skin/raster/2panels/menu_main_white_bg.png b/skin/raster/2panels/menu_main_white_bg.png Binary files differnew file mode 100644 index 0000000..f4bd15f --- /dev/null +++ b/skin/raster/2panels/menu_main_white_bg.png diff --git a/skin/raster/2panels/menu_top.png b/skin/raster/2panels/menu_top.png Binary files differnew file mode 100644 index 0000000..fc20f95 --- /dev/null +++ b/skin/raster/2panels/menu_top.png diff --git a/skin/raster/2panels/menu_top_image_person.png b/skin/raster/2panels/menu_top_image_person.png Binary files differnew file mode 100644 index 0000000..c8be5ed --- /dev/null +++ b/skin/raster/2panels/menu_top_image_person.png diff --git a/skin/raster/2panels/middleboxbg.png b/skin/raster/2panels/middleboxbg.png Binary files differnew file mode 100644 index 0000000..6ff4019 --- /dev/null +++ b/skin/raster/2panels/middleboxbg.png diff --git a/skin/raster/2panels/mystatus_bg.png b/skin/raster/2panels/mystatus_bg.png Binary files differnew file mode 100644 index 0000000..f769313 --- /dev/null +++ b/skin/raster/2panels/mystatus_bg.png diff --git a/skin/raster/2panels/normal.png b/skin/raster/2panels/normal.png Binary files differnew file mode 100644 index 0000000..02ef4ee --- /dev/null +++ b/skin/raster/2panels/normal.png diff --git a/skin/raster/2panels/off.png b/skin/raster/2panels/off.png Binary files differnew file mode 100644 index 0000000..3398502 --- /dev/null +++ b/skin/raster/2panels/off.png diff --git a/skin/raster/2panels/on.png b/skin/raster/2panels/on.png Binary files differnew file mode 100644 index 0000000..93b8cad --- /dev/null +++ b/skin/raster/2panels/on.png diff --git a/skin/raster/2panels/pressed.png b/skin/raster/2panels/pressed.png Binary files differnew file mode 100644 index 0000000..36103b5 --- /dev/null +++ b/skin/raster/2panels/pressed.png diff --git a/skin/raster/2panels/preview.png b/skin/raster/2panels/preview.png Binary files differnew file mode 100644 index 0000000..c18c154 --- /dev/null +++ b/skin/raster/2panels/preview.png diff --git a/skin/raster/2panels/rhshovertile.png b/skin/raster/2panels/rhshovertile.png Binary files differnew file mode 100644 index 0000000..cd0097a --- /dev/null +++ b/skin/raster/2panels/rhshovertile.png diff --git a/skin/raster/2panels/rhstile.png b/skin/raster/2panels/rhstile.png Binary files differnew file mode 100644 index 0000000..e47f09a --- /dev/null +++ b/skin/raster/2panels/rhstile.png diff --git a/skin/raster/2panels/scrollnormal.png b/skin/raster/2panels/scrollnormal.png Binary files differnew file mode 100644 index 0000000..1828a3c --- /dev/null +++ b/skin/raster/2panels/scrollnormal.png diff --git a/skin/raster/2panels/scrollnormalbot.png b/skin/raster/2panels/scrollnormalbot.png Binary files differnew file mode 100644 index 0000000..1828a3c --- /dev/null +++ b/skin/raster/2panels/scrollnormalbot.png diff --git a/skin/raster/2panels/separator.png b/skin/raster/2panels/separator.png Binary files differnew file mode 100644 index 0000000..485b5f9 --- /dev/null +++ b/skin/raster/2panels/separator.png diff --git a/skin/raster/2panels/separator2.png b/skin/raster/2panels/separator2.png Binary files differnew file mode 100644 index 0000000..9d778b4 --- /dev/null +++ b/skin/raster/2panels/separator2.png diff --git a/skin/raster/2panels/sidebar_top.png b/skin/raster/2panels/sidebar_top.png Binary files differnew file mode 100644 index 0000000..9910c68 --- /dev/null +++ b/skin/raster/2panels/sidebar_top.png diff --git a/skin/raster/2panels/tabbg.png b/skin/raster/2panels/tabbg.png Binary files differnew file mode 100644 index 0000000..8f0bd5a --- /dev/null +++ b/skin/raster/2panels/tabbg.png diff --git a/skin/raster/2panels/tilehover.png b/skin/raster/2panels/tilehover.png Binary files differnew file mode 100644 index 0000000..11ec7bc --- /dev/null +++ b/skin/raster/2panels/tilehover.png diff --git a/skin/raster/2panels/tilenormal.png b/skin/raster/2panels/tilenormal.png Binary files differnew file mode 100644 index 0000000..5f1131f --- /dev/null +++ b/skin/raster/2panels/tilenormal.png diff --git a/skin/raster/2panels/toolbuttonnormal.png b/skin/raster/2panels/toolbuttonnormal.png Binary files differnew file mode 100644 index 0000000..685b696 --- /dev/null +++ b/skin/raster/2panels/toolbuttonnormal.png diff --git a/skin/raster/2panels/top_bg.png b/skin/raster/2panels/top_bg.png Binary files differnew file mode 100644 index 0000000..a360785 --- /dev/null +++ b/skin/raster/2panels/top_bg.png diff --git a/skin/raster/2panels/topbg.png b/skin/raster/2panels/topbg.png Binary files differnew file mode 100644 index 0000000..1410d6b --- /dev/null +++ b/skin/raster/2panels/topbg.png diff --git a/skin/raster/2panels/version-2 b/skin/raster/2panels/version-2 new file mode 100644 index 0000000..58bb335 --- /dev/null +++ b/skin/raster/2panels/version-2 @@ -0,0 +1,5 @@ +[ThemeGeneral] +ThemeVersion=1.0 +AuthorName=Nookie +AuthorEmail=nookie@mail.kbfx.org +Homepage=http://www.kbfx.org diff --git a/skin/raster/default/CMakeLists.txt b/skin/raster/default/CMakeLists.txt new file mode 100644 index 0000000..b30b0ac --- /dev/null +++ b/skin/raster/default/CMakeLists.txt @@ -0,0 +1,4 @@ +FILE(GLOB PNGFILES *.png kbfxlayoutrc kbfxfontrc version-2 ) + +INSTALL(FILES ${PNGFILES} + DESTINATION ${DATA_INSTALL_DIR}/kbfx/skins/default) diff --git a/skin/raster/default/appfind.png b/skin/raster/default/appfind.png Binary files differnew file mode 100644 index 0000000..2919054 --- /dev/null +++ b/skin/raster/default/appfind.png diff --git a/skin/raster/default/appviewbg.png b/skin/raster/default/appviewbg.png Binary files differnew file mode 100644 index 0000000..ef36f77 --- /dev/null +++ b/skin/raster/default/appviewbg.png diff --git a/skin/raster/default/bg.png b/skin/raster/default/bg.png Binary files differnew file mode 100644 index 0000000..b383c0f --- /dev/null +++ b/skin/raster/default/bg.png diff --git a/skin/raster/default/botbg.png b/skin/raster/default/botbg.png Binary files differnew file mode 100644 index 0000000..2cd4072 --- /dev/null +++ b/skin/raster/default/botbg.png diff --git a/skin/raster/default/butterfly.png b/skin/raster/default/butterfly.png Binary files differnew file mode 100644 index 0000000..70fb383 --- /dev/null +++ b/skin/raster/default/butterfly.png diff --git a/skin/raster/default/dudebox.png b/skin/raster/default/dudebox.png Binary files differnew file mode 100644 index 0000000..ea8ba61 --- /dev/null +++ b/skin/raster/default/dudebox.png diff --git a/skin/raster/default/find.png b/skin/raster/default/find.png Binary files differnew file mode 100644 index 0000000..0c3776c --- /dev/null +++ b/skin/raster/default/find.png diff --git a/skin/raster/default/hover.png b/skin/raster/default/hover.png Binary files differnew file mode 100644 index 0000000..d09d1ad --- /dev/null +++ b/skin/raster/default/hover.png diff --git a/skin/raster/default/indexseparator.png b/skin/raster/default/indexseparator.png Binary files differnew file mode 100644 index 0000000..74f7d0a --- /dev/null +++ b/skin/raster/default/indexseparator.png diff --git a/skin/raster/default/kbfxfontrc b/skin/raster/default/kbfxfontrc new file mode 100644 index 0000000..70605de --- /dev/null +++ b/skin/raster/default/kbfxfontrc @@ -0,0 +1,15 @@ +[Fonts] +ApplicationText=0,0,0 +ApplicationTextFont=Arial,8,-1,5,50,0,0,0,0,0 +CommentText=128,125,0 +CommentTextFont=Arial,8,-1,5,50,0,0,0,0,0 +GroupText=0,0,0 +GroupTextFont=Arial,8,-1,5,50,0,0,0,0,0 +HoverBold=false +LineColor=255,220,125 +PluginColor=0,0,0 +PluginFont=Arial,8,-1,5,50,0,0,0,0,0 +SeparatorColor=0,0,0 +SeparatorFont=Arial,8,-1,5,75,0,0,0,0,0 +UserName=255,255,255 +UserNameFont=Arial,10,-1,5,75,0,0,0,0,0 diff --git a/skin/raster/default/kbfxlayoutrc b/skin/raster/default/kbfxlayoutrc new file mode 100644 index 0000000..6870947 --- /dev/null +++ b/skin/raster/default/kbfxlayoutrc @@ -0,0 +1,26 @@ +[MainMenu] +UserMenuHeight=513 +UserMenuWidth=504 + +[BotBar] +Height=38 +Width=504 + +[SearchBox] +Width=240 +x=130 + +[TopBar] +Height=95 +Width=504 +DudeY=-1 +DudeX=-1 +UserNameX=130 +UserNameY=32 + +[ListBox] +Width=132 + +[ItemView] +Width=240 +x=132 diff --git a/skin/raster/default/listboxbg.png b/skin/raster/default/listboxbg.png Binary files differnew file mode 100644 index 0000000..ef36f77 --- /dev/null +++ b/skin/raster/default/listboxbg.png diff --git a/skin/raster/default/lock.png b/skin/raster/default/lock.png Binary files differnew file mode 100644 index 0000000..3700c9d --- /dev/null +++ b/skin/raster/default/lock.png diff --git a/skin/raster/default/lockhover.png b/skin/raster/default/lockhover.png Binary files differnew file mode 100644 index 0000000..49896aa --- /dev/null +++ b/skin/raster/default/lockhover.png diff --git a/skin/raster/default/logo.png b/skin/raster/default/logo.png Binary files differnew file mode 100644 index 0000000..febf230 --- /dev/null +++ b/skin/raster/default/logo.png diff --git a/skin/raster/default/logout.png b/skin/raster/default/logout.png Binary files differnew file mode 100644 index 0000000..e69b6a3 --- /dev/null +++ b/skin/raster/default/logout.png diff --git a/skin/raster/default/logouthover.png b/skin/raster/default/logouthover.png Binary files differnew file mode 100644 index 0000000..3f70ba3 --- /dev/null +++ b/skin/raster/default/logouthover.png diff --git a/skin/raster/default/mask.png b/skin/raster/default/mask.png Binary files differnew file mode 100644 index 0000000..6226958 --- /dev/null +++ b/skin/raster/default/mask.png diff --git a/skin/raster/default/menu_top.png b/skin/raster/default/menu_top.png Binary files differnew file mode 100644 index 0000000..fc20f95 --- /dev/null +++ b/skin/raster/default/menu_top.png diff --git a/skin/raster/default/menu_top_image_person.png b/skin/raster/default/menu_top_image_person.png Binary files differnew file mode 100644 index 0000000..c8be5ed --- /dev/null +++ b/skin/raster/default/menu_top_image_person.png diff --git a/skin/raster/default/middleboxbg.png b/skin/raster/default/middleboxbg.png Binary files differnew file mode 100644 index 0000000..6ff4019 --- /dev/null +++ b/skin/raster/default/middleboxbg.png diff --git a/skin/raster/default/normal.png b/skin/raster/default/normal.png Binary files differnew file mode 100644 index 0000000..25fd568 --- /dev/null +++ b/skin/raster/default/normal.png diff --git a/skin/raster/default/off.png b/skin/raster/default/off.png Binary files differnew file mode 100644 index 0000000..3398502 --- /dev/null +++ b/skin/raster/default/off.png diff --git a/skin/raster/default/on.png b/skin/raster/default/on.png Binary files differnew file mode 100644 index 0000000..93b8cad --- /dev/null +++ b/skin/raster/default/on.png diff --git a/skin/raster/default/pressed.png b/skin/raster/default/pressed.png Binary files differnew file mode 100644 index 0000000..a260d45 --- /dev/null +++ b/skin/raster/default/pressed.png diff --git a/skin/raster/default/preview.png b/skin/raster/default/preview.png Binary files differnew file mode 100644 index 0000000..2c991be --- /dev/null +++ b/skin/raster/default/preview.png diff --git a/skin/raster/default/rhshovertile.png b/skin/raster/default/rhshovertile.png Binary files differnew file mode 100644 index 0000000..156b9cc --- /dev/null +++ b/skin/raster/default/rhshovertile.png diff --git a/skin/raster/default/rhstile.png b/skin/raster/default/rhstile.png Binary files differnew file mode 100644 index 0000000..148551b --- /dev/null +++ b/skin/raster/default/rhstile.png diff --git a/skin/raster/default/scrollnormal.png b/skin/raster/default/scrollnormal.png Binary files differnew file mode 100644 index 0000000..2f27b5d --- /dev/null +++ b/skin/raster/default/scrollnormal.png diff --git a/skin/raster/default/scrollnormalbot.png b/skin/raster/default/scrollnormalbot.png Binary files differnew file mode 100644 index 0000000..2f27b5d --- /dev/null +++ b/skin/raster/default/scrollnormalbot.png diff --git a/skin/raster/default/separator.png b/skin/raster/default/separator.png Binary files differnew file mode 100644 index 0000000..c483387 --- /dev/null +++ b/skin/raster/default/separator.png diff --git a/skin/raster/default/tabbg.png b/skin/raster/default/tabbg.png Binary files differnew file mode 100644 index 0000000..8f0bd5a --- /dev/null +++ b/skin/raster/default/tabbg.png diff --git a/skin/raster/default/tilehover.png b/skin/raster/default/tilehover.png Binary files differnew file mode 100644 index 0000000..1beb0ff --- /dev/null +++ b/skin/raster/default/tilehover.png diff --git a/skin/raster/default/tilenormal.png b/skin/raster/default/tilenormal.png Binary files differnew file mode 100644 index 0000000..bfa01bb --- /dev/null +++ b/skin/raster/default/tilenormal.png diff --git a/skin/raster/default/tooltip_dudebox.png b/skin/raster/default/tooltip_dudebox.png Binary files differnew file mode 100644 index 0000000..9812d73 --- /dev/null +++ b/skin/raster/default/tooltip_dudebox.png diff --git a/skin/raster/default/tooltip_logo.png b/skin/raster/default/tooltip_logo.png Binary files differnew file mode 100644 index 0000000..51b9cf2 --- /dev/null +++ b/skin/raster/default/tooltip_logo.png diff --git a/skin/raster/default/tooltip_mask.png b/skin/raster/default/tooltip_mask.png Binary files differnew file mode 100644 index 0000000..48ef8bb --- /dev/null +++ b/skin/raster/default/tooltip_mask.png diff --git a/skin/raster/default/tooltip_window.png b/skin/raster/default/tooltip_window.png Binary files differnew file mode 100644 index 0000000..99b827a --- /dev/null +++ b/skin/raster/default/tooltip_window.png diff --git a/skin/raster/default/topbg.png b/skin/raster/default/topbg.png Binary files differnew file mode 100644 index 0000000..c2b621b --- /dev/null +++ b/skin/raster/default/topbg.png diff --git a/skin/raster/default/version-2 b/skin/raster/default/version-2 new file mode 100644 index 0000000..58bb335 --- /dev/null +++ b/skin/raster/default/version-2 @@ -0,0 +1,5 @@ +[ThemeGeneral] +ThemeVersion=1.0 +AuthorName=Nookie +AuthorEmail=nookie@mail.kbfx.org +Homepage=http://www.kbfx.org diff --git a/skin/vector/CMakeLists.txt b/skin/vector/CMakeLists.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/skin/vector/CMakeLists.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..3e76368 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,62 @@ +SET(libkbfxspinxsrc + kbfxbutton.cpp + kbfxplasmacanvasabstractitem.cpp + kbfxplasmacanvasgroup.cpp + kbfxplasmacanvasgroupview.cpp + kbfxplasmacanvasitem.cpp + kbfxplasmacanvasitem_events.cpp + kbfxplasmacanvasitemwrapper.cpp + kbfxplasmacanvasstack.cpp + kbfxplasmacanvasview.cpp + kbfxplasmaindexitem.cpp + kbfxplasmaindexview.cpp + kbfxspinx.cpp + kbfxspinxmenu.cpp + kbfxspinxpopup.cpp + kbfxspinxscrollbar.cpp + kbfxspinxtoolbar.cpp + kbfxspinxtoolbutton.cpp + kbfxspinxtop.cpp + kbfxspinxview.cpp + kbfxtooltip.cpp + ) + +IF (NOT USE_KDE4) + KDE3_ADD_DCOP_SKELS(libkbfxspinxsrc kbfxspinx.h) + KDE3_AUTOMOC(${libkbfxspinxsrc}) + + ADD_LIBRARY(kbfxspinx MODULE ${libkbfxspinxsrc}) + SET_TARGET_PROPERTIES(kbfxspinx + PROPERTIES + COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) + # SET_TARGET_PROPERTIES(kbfxspinx PROPERTIES + # SOVERSION ${LIB_MAJOR} + # VERSION ${APPLICATION_VERSION}) + TARGET_LINK_LIBRARIES(kbfxspinx + kbfxdata + kbfxcommon + ${QT_AND_KDECORE_LIBS} + ${KDE3_UI_LIBRARY} + ) + + KDE3_INSTALL_LIBTOOL_FILE(kbfxspinx ${PLUGIN_INSTALL_DIR}) +ELSE (NOT USE_KDE4) + # TODO: Have to rewrite it for DBUS. + # Rewrite the DCOP interface (in src/) to DBUS for KDE4 support. + # Should be done in a way to preserve KDE3 compatibility! + KDE4_ADD_DCOP_SKELS(libkbfxspinxsrc kbfxspinx.h) + KDE4_AUTOMOC(${libkbfxspinxsrc}) + + KDE4_ADD_LIBRARY(kbfxspinx MODULE ${libkbfxspinxsrc}) + TARGET_LINK_LIBRARIES(kbfxspinx + kbfxdata + kbfxcommon + ${KDE4_KDECORE_LIBS} + ${KDE4_KDEUI_LIBS} + ) + + KDE4_INSTALL_LIBTOOL_FILE(kbfxspinx ${PLUGIN_INSTALL_DIR}) +ENDIF (NOT USE_KDE4) + +INSTALL(TARGETS kbfxspinx DESTINATION ${PLUGIN_INSTALL_DIR}) +INSTALL(FILES kbfxspinx.desktop DESTINATION ${DATA_INSTALL_DIR}/kicker/applets) diff --git a/src/kbfxbutton.cpp b/src/kbfxbutton.cpp new file mode 100644 index 0000000..5d3f8fd --- /dev/null +++ b/src/kbfxbutton.cpp @@ -0,0 +1,417 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> + +#include "kbfxbutton.h" + + +bool KbfxButton::m_sizeHeight = TRUE; +int KbfxButton::m_size = 0; + +KbfxButton::KbfxButton ( QWidget * parent, const char *name) : + QLabel ( parent,name,Qt::WStaticContents | Qt::WNoAutoErase |Qt::WPaintDesktop ) +{ + setLineWidth ( 0 ); + setScaledContents ( false ); + setAcceptDrops ( true ); + m_dcopClient = new DCOPClient (); + m_dcopClient->attach (); + m_fadeTime = ConfigInit().m_fadeTime; + + /* Init normal size first */ + m_kicker_auto_adjust = TRUE; + loadSkins(); + m_kicker_auto_adjust = ConfigInit().m_ToolBarResize; + + m_toggle = false; + QTimer * timer = new QTimer ( this,"Update Timer" ); + connect ( timer,SIGNAL ( timeout() ),this,SLOT ( update() ) ); + timer->start ( 25,false ); + + fade_timer = new QTimer ( this,"Fade Timer" ); + connect ( fade_timer,SIGNAL ( timeout() ),this,SLOT ( fade() ) ); +} + +KbfxButton::~KbfxButton() +{ +} + +void KbfxButton::loadSkins() +{ + QImage _tmpHover, _tmpPressed, _tmpNormal; + _tmpHover = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxHoverButtonPath ) ) ? + QImage ( ConfigInit ().m_KbfxHoverButtonPath ) + : QImage ( ConfigInit ().m_KbfxHoverButtonPathDefault ); + _tmpPressed = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxPressedButtonPath ) ) ? + QImage ( ConfigInit ().m_KbfxPressedButtonPath ) + : QImage ( ConfigInit ().m_KbfxPressedButtonPathDefault ); + _tmpNormal = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_KbfxNormalButtonPath ) ) ? + QImage ( ConfigInit ().m_KbfxNormalButtonPath ) + : QImage ( ConfigInit ().m_KbfxNormalButtonPathDefault ); + + QSize _sizeNormal = _tmpNormal.size(); + _tmpHover = _tmpHover.smoothScale ( _sizeNormal, QImage::ScaleFree ); + _tmpPressed = _tmpPressed.smoothScale ( _sizeNormal, QImage::ScaleFree ); + + + if ( !m_kicker_auto_adjust ) + { + if ( m_sizeHeight ) + { + _tmpHover = _tmpHover.smoothScale ( _tmpHover.width(), m_size, QImage::ScaleMin ); + _tmpPressed = _tmpPressed.smoothScale ( _tmpPressed.width(), m_size, QImage::ScaleMin ); + _tmpNormal = _tmpNormal.smoothScale ( _tmpNormal.width(), m_size, QImage::ScaleMin ); + } + else + { + _tmpHover = _tmpHover.smoothScale ( m_size, _tmpHover.height(), QImage::ScaleMin ); + _tmpPressed = _tmpPressed.smoothScale ( m_size, _tmpPressed.height(), QImage::ScaleMin ); + _tmpNormal = _tmpNormal.smoothScale ( m_size, _tmpNormal.height(), QImage::ScaleMin ); + } + } + m_over_skin = QPixmap ( _tmpHover ); + m_normal_skin = QPixmap ( _tmpNormal ); + m_pressed_skin = QPixmap ( _tmpPressed ); + m_current_skin = m_normal_skin; + this->resize ( m_current_skin.width(),m_current_skin.height() ); + this->repaint(); +} + +QCString KbfxButton::findPanel() +{ + QCString m_AppletPanel = QCString ("kicker"); + QCStringList objects=m_dcopClient->remoteObjects("kicker"); + + for( QCStringList::ConstIterator it = objects.begin(); + it != objects.end(); + ++it) + { + if ( (*it).contains ( "Panel" ) > 0 ) + { + DCOPRef _dcop_obj ( "kicker", (*it) ); + QStringList _dcop_obj_applets =_dcop_obj.call ( "listApplets()" ); + + for ( QStringList::Iterator _it = _dcop_obj_applets.begin(); + _it != _dcop_obj_applets.end(); + _it++ ) + { + if ( ( *_it ).contains ( "kbfx" ) ) + { + m_AppletPanel = (*it); + break; + } + } + } + } + kdDebug () << "KBFX resides on panel: " << m_AppletPanel << endl; + return m_AppletPanel; +} + +void KbfxButton::readjust( bool _how ) +{ + /* _how = TRUE is for height, _how = FALSE is for width readjust */ + QCString _panel = findPanel(); + int _tmp_size; + if ( _how ) + { + _tmp_size = this->height (); + kdDebug () << "Readjusting " << _panel << " to height: " << _tmp_size << endl; + } + else + { + _tmp_size = this->width (); + kdDebug () << "Readjusting " << _panel << " to width: " << _tmp_size << endl; + } + QByteArray data; + QDataStream arg ( data, IO_WriteOnly ); + arg << _tmp_size ; + if ( !m_dcopClient->send ( "kicker", _panel, "setPanelSize(int)", data ) ) + kdWarning () + << "Could not send DCOP command to:" + << _panel + << endl; +} + +void KbfxButton::enterEvent ( QEvent * e ) +{ + e = e; + if ( m_toggle == true ) + { +// m_current_skin = m_pressed_skin; // no fade code + m_fadePix = m_pressed_skin; + } + else + { +// m_current_skin = m_over_skin; // no fade code + m_fadePix = m_over_skin; + + emit showToolTip (); + } + fade(); +} + +void KbfxButton::fade ( ) +{ + if ( m_fadeTime == 0 ) + { + m_current_skin = m_fadePix; + } + else + { + QImage _final = m_fadePix.convertToImage (); + QImage _current = m_current_skin.convertToImage (); + + if ( !fade_timer->isActive ()) + { + m_opacity = 0; + fade_timer->start( m_fadeTime, false); + } + if ( m_opacity > 0.9 ) + fade_timer->stop(); + m_opacity += 0.1; + + KImageEffect::blend ( _final, _current, m_opacity); + m_current_skin = QPixmap ( _current ); + } + this->resize ( m_current_skin.size() ); + this->update(); +} + +void KbfxButton::leaveEvent ( QEvent * e ) +{ + e = e; + + if ( m_toggle ) + { +// m_current_skin = m_pressed_skin; // no fade code + m_fadePix = m_pressed_skin; + } + else + { +// m_current_skin = m_normal_skin; // no fade code + m_fadePix = m_normal_skin; + } + fade(); + emit leave (); +} + +void KbfxButton::toggle() +{ + if (this->hasMouse() ) { + m_fadePix = m_over_skin; + }else { + + m_fadePix = m_normal_skin; + m_toggle = false; + } + fade(); +} + +void KbfxButton::toggleKMenu() +{ +// m_current_skin = m_normal_skin; + m_fadePix = m_normal_skin; + fade(); + m_toggle = false; +} + +void KbfxButton::mousePressEvent ( QMouseEvent * e ) +{ + e->accept(); + if ( e->button() == QMouseEvent::LeftButton ) + { + if ( m_toggle == false ) + { +// m_current_skin = m_pressed_skin; // no fade code + m_toggle = true; + m_fadePix = m_pressed_skin; + fade(); + emit pressed(); + } + else + { +// m_current_skin = m_normal_skin; // no fade code + m_toggle = false; + if (hasMouse() ) { + m_fadePix = m_over_skin; + }else { + + m_fadePix = m_normal_skin; + } + + fade(); + emit hideMenu(); + } + emit clicked (); + } + + if ( e->button() == QMouseEvent::RightButton ) + { + m_fadePix = m_normal_skin; + fade(); + m_toggle = false; + + QPopupMenu *popup = new QPopupMenu(); + + popup->insertItem ( SmallIcon ( "remove" ), i18n ( "Remove KBFX from Pannel" ), + this, SLOT ( selfDeleter() ) ); + popup->insertItem ( SmallIcon ( "reload" ),i18n ( "Reload KBFX" ), + this, SLOT ( reloadConfig() ) ); + popup->insertSeparator(); + popup->insertItem ( SmallIcon ( "kbfxconfigapp" ), i18n ( "Configure KBFX" ), + this, SLOT ( openConfigDialog() ) ); + popup->insertItem ( SmallIcon ( "kmenuedit" ),i18n ( "Edit Applications Menu" ), + this, SLOT ( openKmenuEdit() ) ); + popup->exec ( e->globalPos() ); + delete popup; + } +} + +void KbfxButton::reloadConfig() +{ +/* + DCOPRef m_kickerkbfxDevelnterface ( "kicker","KBFXInterface" ); + m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" ); + m_kickerkbfxDevelnterface.call ( "notifyConfigChange()" ); +*/ + + DCOPRef m_kickerPanel("kicker", findPanel()); + m_kickerPanel.call("restart()"); +} + +void KbfxButton::selfDeleter() +{ + DCOPRef m_kickerPanel ( "kicker", findPanel() ); + QStringList returnQStringList =m_kickerPanel.call ( "listApplets()" ); + int _myIndex = 0; + + QStringList::Iterator it; + + for ( it = returnQStringList.begin();it != returnQStringList.end();it++ ) + { + if ( ( *it ).contains ( "kbfx" ) ) + { + break; + } + else + _myIndex++; + } + + m_kickerPanel.call ( "removeApplet(int)", _myIndex ); +} + +void KbfxButton::openKmenuEdit() +{ +#ifdef HAVE_MANDRAKE + KRun::runCommand ( "menudrake" ); +#else + KRun::runCommand ( "kmenuedit" ); +#endif +} + +void KbfxButton::openConfigDialog() +{ + KRun::runCommand ( "kbfxconfigapp" ); +} + +void KbfxButton::paintEvent ( QPaintEvent * pe ) +{ + + QPainter p; + if ( !m_current_skin.isNull () ) + { + QRect r = QRect ( pe->rect().x(),pe->rect().y(),m_current_skin.width(),m_current_skin.height() ); + m_buffer = new QPixmap(); + m_buffer->resize ( r.size() ); + m_buffer->fill ( this, r.topLeft() ); + + p.begin ( m_buffer,this ); + p.translate ( -r.x(), -r.y() ); + p.drawPixmap ( r,m_current_skin ); + p.end (); + bitBlt ( this, r.x(), r.y(),m_buffer, 0, 0,m_current_skin.width(), m_current_skin.height() ); + delete m_buffer; + } + +} + +void KbfxButton::dragEnterEvent ( QDragEnterEvent * e ) +{ + e->accept ( QUriDrag::canDecode ( e ) ); + kdDebug() << "Accepting KBFX button drag..." << endl; +} + +void KbfxButton::dropEvent ( QDropEvent * e ) +{ + QStringList filelist; + QString _hover, _normal, _pressed, _tmp; + QImage _hover_pix, _normal_pix, _pressed_pix; + QUriDrag::decodeLocalFiles ( e, filelist ); + + for ( QStringList::Iterator it = filelist.begin(); it != filelist.end(); ++it ) + { + _tmp = ( *it ); + kdDebug() << "KBFX button dropped file: " << _tmp << endl; + if ( _tmp.contains ( "hover", FALSE ) > 0 ) + { + _hover = _tmp; + _hover_pix = QImage ( _tmp ); + } + if ( _tmp.contains ( "normal", FALSE ) > 0 ) + { + _normal = _tmp; + _normal_pix = QImage ( _tmp ); + } + if ( _tmp.contains ( "pressed", FALSE ) > 0 ) + { + _pressed = _tmp; + _pressed_pix = QImage ( _tmp ); + } + } + + kdDebug() << "KBFX button hover: " << _hover << endl + << "KBFX button normal: " << _normal << endl + << "KBFX button pressed: " << _pressed << endl; + + if ( _hover_pix.isNull () || + _normal_pix.isNull () || + _pressed_pix.isNull () ) + { + KMessageBox::error ( 0, + tr2i18n ( "Invalid images were dropped!" + "\nCannot set the KBFX button to use these images!" ), + tr2i18n ( "Error setting KBFX button images" ) ); + return; + } + + ConfigInit ().m_KbfxNormalButtonPath = _normal; + ConfigInit ().m_KbfxHoverButtonPath = _hover; + ConfigInit ().m_KbfxPressedButtonPath = _pressed; + ConfigInit().writeThemerc ( ConfigInit().m_SpinxThemeName ); + + /* Init normal size first */ + m_kicker_auto_adjust = TRUE; + loadSkins(); + m_kicker_auto_adjust = ConfigInit().m_ToolBarResize; +} + +#include "kbfxbutton.moc" diff --git a/src/kbfxbutton.h b/src/kbfxbutton.h new file mode 100644 index 0000000..d4ece12 --- /dev/null +++ b/src/kbfxbutton.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_BUTTON_H +#define KBFX_BUTTON_H + +#include <qdragobject.h> +#include <qimage.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qtimer.h> + +#include <dcopclient.h> +#include <dcopref.h> +#include <kdebug.h> +#include <kimageeffect.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kpopupmenu.h> +#include <krun.h> + +#include <kbfxconfig.h> +#include <kbfxplasmapixmapprovider.h> + + +class QPixmap; +class QLabel; + +class KbfxButton:public QLabel +{ + Q_OBJECT + + public: + KbfxButton ( QWidget * parent, const char * name = 0 ); + ~KbfxButton(); + void kbfx_vista_button_setFx ( bool choice ); + virtual void paintEvent ( QPaintEvent *pe ); + virtual void enterEvent ( QEvent * e ) ; + virtual void leaveEvent ( QEvent * e ); + virtual void mousePressEvent ( QMouseEvent * e ); + virtual void dropEvent ( QDropEvent *e ); + virtual void dragEnterEvent ( QDragEnterEvent *e ); + static bool m_sizeHeight; + static int m_size; + QCString findPanel(); + void readjust( bool ); + + public slots: + void loadSkins(); + void toggle(); + void toggleKMenu(); + void fade(); + void reloadConfig(); + void openKmenuEdit(); + void selfDeleter(); + void openConfigDialog(); + + signals: + void pressed(); + void hideMenu(); + void leave (); + void clicked (); + void showToolTip (); + + protected: + QPixmap m_over_skin; + QPixmap m_pressed_skin; + QPixmap m_release_skin; + QPixmap m_normal_skin; + QPixmap m_current_skin; + +// mng support ??? + QPixmap * m_buffer; + QTimer * m_anime_timer; + QMovie * m_normal_anime; + QMovie * m_pressed_anime; + QMovie * m_hover_anime; + QMovie * m_current_anime; + QString m_normal_path; + QString m_over_path; + QString m_pressed_path; + bool m_anime_on; + bool m_kicker_auto_adjust; + DCOPClient * m_dcopClient; + + /* state of the button */ + bool m_toggle; + QTimer * fade_timer; + float m_opacity; + QPixmap m_fadePix; + int m_fadeTime; +}; + +#endif diff --git a/src/kbfxplasmacanvasabstractitem.cpp b/src/kbfxplasmacanvasabstractitem.cpp new file mode 100644 index 0000000..4655765 --- /dev/null +++ b/src/kbfxplasmacanvasabstractitem.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// +// C++ Implementation: kbfxplasmacanvasabstractitem +// +// Description: +// +// +// Author: Siraj Razick <siraj@kdemail.net>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + + +#include "kbfxplasmacanvasabstractitem.h" + + +KbfxPlasmaCanvasAbstractItem::KbfxPlasmaCanvasAbstractItem ( QCanvasPixmapArray * a, QCanvas * canvas ) + : QCanvasSprite ( a,canvas ) +{ + + m_source=0; +} + + +KbfxPlasmaCanvasAbstractItem::~KbfxPlasmaCanvasAbstractItem() +{} + +// void +// KbfxPlasmaCanvasAbstractItem::setSelected() +// { +// +// } + +void KbfxPlasmaCanvasAbstractItem::setCurrent ( bool state ) +{ + m_current = state; +} + + +bool +KbfxPlasmaCanvasAbstractItem::isCurrent() +{ + return m_current; +} + +void +KbfxPlasmaCanvasAbstractItem::mousePressEvent ( QMouseEvent * e ) +{ + e = e; +} +void +KbfxPlasmaCanvasAbstractItem::mouseMoveEvent ( QMouseEvent * e ) +{ + e = e; +} + +void +KbfxPlasmaCanvasAbstractItem::enterEvent ( QEvent * e ) +{ + e =e ; +} + + +void KbfxPlasmaCanvasAbstractItem::mouseReleaseEvent ( QMouseEvent * e ) +{ + e =e ; + emit clicked(); +} + +void KbfxPlasmaCanvasAbstractItem::exec() +{ + if ( m_source == 0 ) + return; + + + m_source->exec(); +} + + +void KbfxPlasmaCanvasAbstractItem::hideit() +{ + this->hide(); +} + +void +KbfxPlasmaCanvasAbstractItem::draw ( QPainter& pe ) +{ + this->drawContent ( &pe ); +} + + +void KbfxPlasmaCanvasAbstractItem::setLabelText ( QString s ) +{ + s = s; +} + +QPixmap +KbfxPlasmaCanvasAbstractItem::dragPixmap() +{ + return QPixmap(); +} + +void +KbfxPlasmaCanvasAbstractItem::drawContent ( QPainter * p ) +{ + p = p ; +} + +#include "kbfxplasmacanvasabstractitem.moc" diff --git a/src/kbfxplasmacanvasabstractitem.h b/src/kbfxplasmacanvasabstractitem.h new file mode 100644 index 0000000..7110486 --- /dev/null +++ b/src/kbfxplasmacanvasabstractitem.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_ABSTRACT_ITEM_H +#define KBFX_PLASMA_CANVAS_ABSTRACT_ITEM_H + +#include <qcanvas.h> +#include <qpainter.h> +#include "kbfxplasmacanvasrtti.h" +#include <qtimer.h> +#include <kdesktopfile.h> +#include <kstandarddirs.h> +#include <kiconloader.h> +#include "kbfxdatasource.h" +#include <krun.h> + +class KbfxPlasmaCanvasAbstractItem:public QObject,public QCanvasSprite +{ + + Q_OBJECT + + public: + typedef enum {EXECUTABLE=0,SEPARATOR,INDEX,OTHER} Type; +// typedef enum {RASTER=0,VECTOR,NATIVE} SkinMode; + + KbfxPlasmaCanvasAbstractItem ( QCanvasPixmapArray * a, QCanvas * canvas ); + virtual ~KbfxPlasmaCanvasAbstractItem (); + + void setCurrent ( bool ); + virtual Type type() { return m_type; } + virtual void setType ( Type t ) { m_type = t;} + + QString name() { if ( m_source != 0 ) return m_source->name(); else return QString ( "Not Set" );}; + + void setSource ( KbfxDataSource src ); + bool isCurrent(); + virtual int height() { return m_height;} + + virtual int width() { return m_width;} + + virtual bool lookup ( QString str ) {str = str ; return false;} + + virtual int rtti() const { return CANVASITEM;} + + virtual void draw ( QPainter & pe ); + + virtual void drawContent ( QPainter * pe ); + + virtual QPixmap dragPixmap(); + + +//Event Handling + virtual void mousePressEvent ( QMouseEvent * e ); + virtual void mouseMoveEvent ( QMouseEvent * e ); + virtual void enterEvent ( QEvent * e ); + virtual void mouseReleaseEvent ( QMouseEvent * e ); + + + virtual void setLabelText ( QString s ); + + public slots: + virtual void hideit(); + virtual void exec(); + signals: + void clicked(); + void leave(); + void selected ( KbfxPlasmaCanvasAbstractItem* ); + + private: + +// KbfxPlasmaCanvasAbstractItem (const KbfxPlasmaCanvasItem &t); + KbfxDataSource * m_source; + Type m_type; + int m_height; + int m_width; + bool m_current; + + + + +} +;//C.G + +#endif //M.I.G + diff --git a/src/kbfxplasmacanvasgroup.cpp b/src/kbfxplasmacanvasgroup.cpp new file mode 100644 index 0000000..044fc18 --- /dev/null +++ b/src/kbfxplasmacanvasgroup.cpp @@ -0,0 +1,330 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasgroup.h" + +KbfxPlasmaCanvasGroup::KbfxPlasmaCanvasGroup () +{ + + m_height = 0; + m_id = 0; +// m_count = 0; + m_name = QString ( "Unknown" ); +// bool m_visible = true; + m_shaded = false; +} + +KbfxPlasmaCanvasGroup::~KbfxPlasmaCanvasGroup () +{ + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { +//qDebug("Trying to delete Item from Rgoup================"); +// if(*it) +// delete (*it); +// itemListMap ().remove (*it); + if ( ( *it ) != 0 ) + if ( deleteItem ( ( *it ) ) == false ) + { + qDebug ( "Deleting failed" ); + } + } + + +} + +KbfxPlasmaCanvasGroup::ItemListMap & KbfxPlasmaCanvasGroup::itemListMap () +{ + static ItemListMap * + map = 0; + if ( !map ) + map = new ItemListMap (); + return *map; +} + +bool +KbfxPlasmaCanvasGroup::deleteItem ( KbfxPlasmaCanvasAbstractItem * it ) +{ +//qDebug("Removing Item from Group"); +// itemListMap ().remove (it); + //delete it; +//return true; + for ( ItemListIter iti ( m_itemList ); *iti; ++iti ) + { + if ( iti == it ) + { + itemListMap ().remove ( *iti ); + if ( m_itemList.removeRef ( it ) ) + { + if ( m_itemList.isEmpty () ) + delete this; + return true; + } + else + { + qDebug ( "deleting Item failed" ); + return false; + } + } + } + return false; +} + +bool +KbfxPlasmaCanvasGroup::addItem ( KbfxPlasmaCanvasAbstractItem * it ) +{ + + if ( it->name().isEmpty() ) + { + qDebug ( "Adding Failed bcos Name Missing" ); + return false; + } + ItemListMap::ConstIterator itn = itemListMap ().find ( it ); + if ( itn != itemListMap ().end () ) + { + qDebug ( "Adding Failed Due to Item not end" ); + return false; + } + for ( ItemListIter itr ( m_itemList ); *itr; ++itr ) + { + if ( ( *itr )->lookup ( it->name() ) == true ) + { + qDebug ( "Adding Failed Due to Item already exisits" ); + return false; + } + } + + + int _x = 0; + int _y = this->boundingRect ().height (); + KbfxPlasmaCanvasGroup *&group = itemListMap () [it]; + if ( group ) + { + if ( group == this ) + return true; + group->m_itemList.removeRef ( it ); + if ( group->m_itemList.isEmpty () ) + delete group; + } + m_itemList.prepend ( it ); + m_height += it->height(); + m_width = it->width(); + it->move ( _x, _y ); + group = this; + + if ( it->type() == KbfxPlasmaCanvasAbstractItem::SEPARATOR ) + m_sepheight = it->height(); + m_count++; + return true; +} + + +void +KbfxPlasmaCanvasGroup::move ( int x, int y ) +{ + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + ( *it )->move ( ( *it )->x () + x, ( *it )->y () + y ); + } + + +} + +void +KbfxPlasmaCanvasGroup::moveBy ( int x, int y ) +{ + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + ( *it )->move ( x, y ); + } +} + +void +KbfxPlasmaCanvasGroup::hide() +{ + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { +// if(*it) + ( *it )->hide(); + } + m_visible = false; + + +} + +void +KbfxPlasmaCanvasGroup::setGroupName ( QString name ) +{ + m_name = name; + delete [] name; +} + +QString +KbfxPlasmaCanvasGroup::name() +{ + return m_name; +} + +void +KbfxPlasmaCanvasGroup::showAll() +{ + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + if ( ( *it )->type() == KbfxPlasmaCanvasAbstractItem::SEPARATOR || m_shaded == false ) + ( *it )->show(); + } + +} + +void +KbfxPlasmaCanvasGroup::show() +{ + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + if ( ( *it )->type() == KbfxPlasmaCanvasAbstractItem::SEPARATOR || m_shaded == false ) + ( *it )->show(); + } + m_visible = true; +} + +void +KbfxPlasmaCanvasGroup::shade () +{ + if ( m_shaded == false ) + { + emit this->groupShade ( this->groupID() ); + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + // (*it)->move ((*it)->x (), 0); + if ( ( *it )->type() != KbfxPlasmaCanvasAbstractItem::SEPARATOR ) + ( *it )->hide(); + } + m_shaded = true; + return; + } + else if ( m_shaded == true ) + { + int _shadeby = 0; + int _firstItemHeight=0; + + emit this->groupUnShade ( this->groupID() ); + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + if ( ( *it )->type() != KbfxPlasmaCanvasAbstractItem::SEPARATOR ) + { +// (*it)->move ((*it)->x (), _shadeby); + ( *it )->show(); + _shadeby += ( *it )->height (); + } + else + { + _shadeby = ( *it )->height (); + _firstItemHeight = _shadeby; + + } + } + m_shaded = false; + } +} + +void +KbfxPlasmaCanvasGroup::moveUp ( int y ) +{ + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + ( *it )->move ( ( *it )->x (), ( ( *it )->y () +m_sepheight ) - y ); + } + + +} + +void +KbfxPlasmaCanvasGroup::moveDown ( int y ) +{ + + for ( ItemListIter it ( m_itemList ); *it; ++it ) + { + ( *it )->move ( ( *it )->x (), ( ( *it )->y () - m_sepheight ) + y ); + } +} + +QRect +KbfxPlasmaCanvasGroup::boundingRect () +{ + if ( this->count () == 0 ) + return QRect ( 0, 0, 0, 0 ); + + QRect r; + for ( ItemListIter it ( m_itemList ); *it; ++it ) + r |= ( *it )->boundingRect (); + return r; +} + +int +KbfxPlasmaCanvasGroup::count () +{ + + return m_itemList.count(); +} + +int +KbfxPlasmaCanvasGroup::height () +{ + + return m_height ; +} + +int +KbfxPlasmaCanvasGroup::width () +{ + + return m_width; +} + + +KbfxPlasmaCanvasGroup * +KbfxPlasmaCanvasGroup::groupContaining ( KbfxPlasmaCanvasAbstractItem * item ) +{ + ItemListMap::ConstIterator it = itemListMap ().find ( item ); + if ( it == itemListMap ().end () ) + return 0; + else + return *it; +} + +uint +KbfxPlasmaCanvasGroup::groupID() +{ + return m_id; +} + + +void KbfxPlasmaCanvasGroup::setGroupID ( uint e_id ) +{ + m_id = e_id; +} + +#include "kbfxplasmacanvasgroup.moc" diff --git a/src/kbfxplasmacanvasgroup.h b/src/kbfxplasmacanvasgroup.h new file mode 100644 index 0000000..1d6e2da --- /dev/null +++ b/src/kbfxplasmacanvasgroup.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_GROUP_H +#define KBFX_PLASMA_CANVAS_GROUP_H + +#include <qmap.h> +#include <qptrlist.h> +#include "kbfxplasmacanvasabstractitem.h" +#include <qobject.h> +class QCanvasItem; +class QRect; + +class KbfxPlasmaCanvasGroup:public QObject +{ + + Q_OBJECT + public: + typedef QPtrList<KbfxPlasmaCanvasAbstractItem> ItemList; + typedef QPtrListIterator<KbfxPlasmaCanvasAbstractItem> ItemListIter; + //a Global mapof Groups + typedef QMap<KbfxPlasmaCanvasAbstractItem*,KbfxPlasmaCanvasGroup*> ItemListMap; + + KbfxPlasmaCanvasGroup(); + virtual ~KbfxPlasmaCanvasGroup(); + + bool addItem ( KbfxPlasmaCanvasAbstractItem * ); + bool deleteItem ( KbfxPlasmaCanvasAbstractItem * ); + void move ( int x,int y ); + void moveBy ( int x,int y ); + QString name(); + QRect boundingRect(); + int count(); + int height(); + int width(); + static KbfxPlasmaCanvasGroup * groupContaining ( KbfxPlasmaCanvasAbstractItem * ); + QString groupName(); + uint groupID(); + void setGroupName ( QString name ); + void setGroupID ( uint ); + bool isShaded() {return m_shaded;}; + virtual int rtti() { return 1005;} + void showAll(); + + public slots: + void moveUp ( int ); + void moveDown ( int ); + void shade();//folding action + void hide(); + void show(); + signals: + void groupShade ( uint id ); + void groupUnShade ( uint id ); + + + + private : + ItemList m_itemList; + static ItemListMap& itemListMap(); + int m_x; + int m_y; + int m_height; + int m_width; +//state variables + bool m_shaded; + bool m_visible; + QString m_name; + uint m_id; + int m_sepheight; + int m_count; + + +}; + + + +#endif diff --git a/src/kbfxplasmacanvasgroupview.cpp b/src/kbfxplasmacanvasgroupview.cpp new file mode 100644 index 0000000..04c7f8e --- /dev/null +++ b/src/kbfxplasmacanvasgroupview.cpp @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasgroupview.h" + +KbfxPlasmaCanvasGroupView::KbfxPlasmaCanvasGroupView () +{ + m_groupChain.setAutoDelete ( true ); + m_count = 0; + m_height = 0; + m_width = 0; + m_name = QString ( "Unkown" ); + m_fullExpand = false; + +} + +KbfxPlasmaCanvasGroupView::~KbfxPlasmaCanvasGroupView () +{ +// delete [] m_name; + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + m_groupChain.at ( i )->~KbfxPlasmaCanvasGroup(); + m_groupChain.remove ( m_groupChain.at ( i ) ); + } + +} + +void +KbfxPlasmaCanvasGroupView::addGroup ( KbfxPlasmaCanvasGroup * gPtr ) +{ + if ( gPtr == NULL ) + { + qDebug + ( "KbfxPlasmaCanvasGroupView.cpp:39:Null Pointer Passed to addGroup()" ); + return; + } + else + { + gPtr->setGroupID ( ( uint ) m_count ); + m_height+= gPtr->height(); + m_width = gPtr->width(); + gPtr->move ( 0,m_height-gPtr->height() ); + m_groupChain.append ( gPtr ); +// gPtr->show(); +// qDebug("adding Groupy"); + m_count++; + connect ( gPtr, SIGNAL ( groupShade ( uint ) ), this, + SLOT ( foldGroup ( uint ) ) ); + connect ( gPtr, SIGNAL ( groupUnShade ( uint ) ), this, + SLOT ( unFoldGroup ( uint ) ) ); + + + } + + +} + +KbfxPlasmaCanvasGroupView * +KbfxPlasmaCanvasGroupView::contains ( KbfxPlasmaCanvasGroup * ) +{ +//maybe I don't need this + return 0; + +} + +void +KbfxPlasmaCanvasGroupView::setName ( QString name ) +{ + m_name = name; + //delete [] name; +} + +QString +KbfxPlasmaCanvasGroupView::name() +{ + return m_name; +} + + +void +KbfxPlasmaCanvasGroupView::foldGroupAll () +{ +///not too many groups and needs fast shading so ...this + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + if ( m_groupChain.at ( i ) ) + if ( !m_groupChain.at ( i )->isShaded() ) + m_groupChain.at ( i )->shade (); + } + + m_fullExpand = true; +} + +void +KbfxPlasmaCanvasGroupView::unfoldGroupAll () +{ +///not too many groups and needs fast shading so ...this + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + if ( m_groupChain.at ( i ) ) + if ( m_groupChain.at ( i )->isShaded() ) + m_groupChain.at ( i )->shade (); + } + + m_fullExpand = true; +} + +void +KbfxPlasmaCanvasGroupView::hide () +{ + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + if ( m_groupChain.at ( i ) ) +// if( m_groupChain.at (i)->isShaded()) + m_groupChain.at ( i )->hide(); + } + +} + + +void +KbfxPlasmaCanvasGroupView::show() +{ + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { +// if (m_groupChain.at (i)) +// if( m_groupChain.at (i)->isShaded()) +/// unFoldGroup(i); + + m_groupChain.at ( i )->show(); + ///qDebug("Showing group %d",i); + } + +} + + +void +KbfxPlasmaCanvasGroupView::foldGroup ( uint e_id ) +{ + + KbfxPlasmaCanvasGroup *_it; + KbfxPlasmaCanvasGroup *_et = m_groupChain.at ( e_id ); + if ( _et == NULL ) + return; + + int _height = _et->height (); + //int _shadestate = _et->isShaded (); + + for ( _it = m_groupChain.first (); _it; _it = m_groupChain.next () ) + { + if ( e_id != _it->groupID () ) + { + if ( _it->groupID () > e_id ) + { + _it->moveUp ( _height ); + + } + + } + } + +} + +void +KbfxPlasmaCanvasGroupView::unFoldGroup ( uint e_id ) +{ + KbfxPlasmaCanvasGroup *_it; + KbfxPlasmaCanvasGroup *_et = m_groupChain.at ( e_id ); + if ( _et == NULL ) + { + qDebug ( "OOps no such groups can't unfold" ); + return; + } + + int _height = _et->height (); + //int _shadestate = _et->isShaded (); + + for ( _it = m_groupChain.first (); _it; _it = m_groupChain.next () ) + { + if ( e_id != _it->groupID () ) + { + if ( _it->groupID () > e_id ) + { + _it->moveDown ( _height ); + } + + } + } +} + +#include "kbfxplasmacanvasgroupview.moc" diff --git a/src/kbfxplasmacanvasgroupview.h b/src/kbfxplasmacanvasgroupview.h new file mode 100644 index 0000000..2f79e2c --- /dev/null +++ b/src/kbfxplasmacanvasgroupview.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_GROUP_VIEW_H +#define KBFX_PLASMA_CANVAS_GROUP_VIEW_H + +#include <qobject.h> +#include <qptrlist.h> +#include "kbfxplasmacanvasgroup.h" + +/** +This class will manager a list of Groups. +**/ + + +class KbfxPlasmaCanvasGroupView:public QObject +{ + + Q_OBJECT + + public: + typedef QPtrList<KbfxPlasmaCanvasGroup> groupPtrList; + + KbfxPlasmaCanvasGroupView(); + virtual ~KbfxPlasmaCanvasGroupView(); + + void addGroup ( KbfxPlasmaCanvasGroup* ); + void deleteGroup ( KbfxPlasmaCanvasGroup* ); + KbfxPlasmaCanvasGroupView* contains ( KbfxPlasmaCanvasGroup* ); + virtual int rtti() {return 1006;} + void predend ( KbfxPlasmaCanvasGroup* ); + void append ( KbfxPlasmaCanvasGroup * ); + int height() + { + return m_height; + } + int width() + { + return m_width; + } + void setName ( QString name ); + QString name(); + bool expanded() { return m_fullExpand;} + public slots: + void foldGroupAll(); + void unfoldGroupAll(); + void hide(); + void show(); + void foldGroup ( uint id ); + void unFoldGroup ( uint id ); + + private: + int m_x; + int m_y; + int m_z; //depth index : not Z axis + int m_count; + int m_height; + int m_width; + bool m_fullExpand; + QString m_name; + QString m_iconPath; + KbfxPlasmaCanvasGroup * m_current; + groupPtrList m_groupChain; + //state variables + +}; + +#endif diff --git a/src/kbfxplasmacanvasitem.cpp b/src/kbfxplasmacanvasitem.cpp new file mode 100644 index 0000000..4a5824f --- /dev/null +++ b/src/kbfxplasmacanvasitem.cpp @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasitem.h" + +KbfxPlasmaCanvasItem::KbfxPlasmaCanvasItem ( QCanvasPixmapArray * a , QCanvas * canvas ) :KbfxPlasmaCanvasAbstractItem ( a, canvas ) +{ + this->setItemMode ( 1 ); + setAnimated ( false ); + m_desktopFile = 0L; + m_isCurrent = false; +// m_pixmapArray = a; + QPixmap * _img = this->image ( 0 ); + m_commentText ="No Comment Set By Plugin"; + m_height =_img->height(); + m_width =_img->width(); + connect ( this,SIGNAL ( clicked() ),this,SLOT ( exec() ) ); + m_type = OTHER; +// ConfigInit().read(); + m_noComments = ConfigInit().m_noComments; + m_source = 0; + m_margin = ConfigInit().m_commentMargine; + m_lineColor = ConfigInit().m_lineColor; + m_iconSize = ConfigInit().m_iconSize; + m_commentColor = ConfigInit().m_fontAppCommentColor; + m_commentFont = ConfigInit().m_fontAppCommentFont; + m_fontAppNameColor = ConfigInit().m_fontAppNameColor; + m_fontAppNameFont = ConfigInit().m_fontAppNameFont; + m_sepNameFont = ConfigInit().m_sepNameFont; + m_boldFonts = ConfigInit().m_fontHoverBold; + +} + +KbfxPlasmaCanvasItem::~KbfxPlasmaCanvasItem() +{ + setCanvas ( 0L ); +} +/* +QCanvasPixmapArray * KbfxPlasmaCanvasItem::getPixmapArray() +{ + return m_pixmapArray; + +} +*/ +void +KbfxPlasmaCanvasItem::setLabelText ( QString str ) +{ + + QFont * _font = new QFont ( m_fontAppNameFont ); + + QFontMetrics fm ( *_font ); + + int _commentWidth = fm.width ( str+"..." ); + int _strLen = str.length(); + if ( _commentWidth > ( this->width() - m_margin ) ) + { + + for ( int i = 0; i < _strLen /*&& ( fm.width(str+"...") < width()-40 )*/ ;i++ ) + { + str.truncate ( str.length()-2 ); + if ( fm.width ( str+"..." ) < width() - m_margin ) + break; + + } + str+="..."; + } + + m_labelText = str ; +} + + +bool +KbfxPlasmaCanvasItem::lookup ( QString str ) +{ + + if ( str.isNull() ) + return false; + + if ( m_type == SEPARATOR || m_type == INDEX ) + return false; + + if ( m_labelText.contains ( str,false ) > 0 ) + return true; + if ( m_commentText.contains ( str,false ) > 0 ) + return true; + if ( m_exec.contains ( str,false ) >0 ) + return true; + + + return false; +} + +void +KbfxPlasmaCanvasItem::setExec ( QString desktopfile ) +{ + m_desktopFile = new KDesktopFile ( desktopfile ); + m_desktopFilePath = desktopfile; + bool check = m_desktopFile->isAuthorizedDesktopFile ( desktopfile ); + + setLabelText ( m_desktopFile->readName() ); + setComment ( m_desktopFile->readComment() ); + setIconPath ( m_desktopFile->readIcon() ); + + if ( check == 0 ) + { + m_restricted = true; + m_error = "Adiministrator Blocked"; + delete m_desktopFile; + return ; + } + delete m_desktopFile; +} + +void +KbfxPlasmaCanvasItem::setIconPath ( QString str ) +{ + KIconLoader *iconload = KGlobal::iconLoader (); + m_iconPath = iconload->iconPath ( str, KIcon::Desktop, false ); +// m_icon.load(m_iconPath); + QImage _img ( m_iconPath ); + + if ( _img.height() > 128 ) + { + _img = _img.smoothScale ( 32,32 ); + + } + + m_icon.convertFromImage ( _img ); + +} + +void +KbfxPlasmaCanvasItem::setIcon ( QPixmap pixmap ) +{ + m_icon = pixmap; + +} + + +void +KbfxPlasmaCanvasItem::setSource ( KbfxDataSource src ) +{ + + + m_source = new KbfxDataSource(); + *m_source = src; + if ( src.type() == KbfxDataSource::DESKTOP ) + { + this->setExec ( src.desktopFile () ); + } + else + { + setLabelText ( src.name() ); + setName ( src.name() ); + setComment ( src.comment() ); + setIconPath ( src.icon() ); + + } + +} + +void +KbfxPlasmaCanvasItem::hideit () +{ + + m_hidden = 0; + this->hide (); +} + + +void +KbfxPlasmaCanvasItem::setType ( Type t ) +{ + m_type = t; +} + +bool KbfxPlasmaCanvasItem::itemMode () +{ + return m_skined; +} + +void +KbfxPlasmaCanvasItem::setItemMode ( bool mode ) +{ + m_skined = mode; +} + + + +void +KbfxPlasmaCanvasItem::drawBackDrop ( QPainter * pe,QRect & r ) +{ + r = r ; + if ( pe == NULL ) + return ; +} + + + + +/* +void +KbfxPlasmaCanvasItem::drawText(QPainter * pe,QString str) +{ + + +} +*/ + +void +KbfxPlasmaCanvasItem::draw ( QPainter & pe ) +{ + drawContent ( &pe ); +} + +QPixmap +KbfxPlasmaCanvasItem::dragPixmap() +{ + double _x = x(); + double _y = y(); + setX ( 0.0 ); + setY ( 0.0 ); + QPixmap dragpixmap ( this->width(),this->height() ); + dragpixmap.fill ( QColor ( 255,255,255 ) ); + QPainter p; + p.begin ( &dragpixmap ); + this->drawContent ( &p ); + p.end(); + setX ( _x ); + setY ( _y ); + return dragpixmap; + +} + +void +KbfxPlasmaCanvasItem::drawContent ( QPainter * pe ) +{ + if ( m_isCurrent ) + { + this->setFrame ( 1 ); + } + else + { + this->setFrame ( 0 ); + } +//int _currentFrame = + QCanvasPixmap *cp = this->image ( this->frame () ); + m_height = cp->height(); + m_width = cp->width(); +//Draw the Background + if ( m_skined == true ) + { + + pe->drawPixmap ( this->boundingRect (), *cp ); + + } + else + { + pe->setPen ( QColor ( 91,178,62 ) ); + pe->drawRect ( this->boundingRect() ); + pe->setPen ( QColor ( 0,10,0 ) ); + } + + + /** + We will split the Item box into two + **/ + + QRect tmp ( 0,0,0,0 ); +//TODO: Should be read from kbfxconfig.cpp + + + +// + + QRect * rectTop = new QRect ( m_margin, ( int ) y(), cp->width() - m_margin, cp->height() /2 ); + QRect * rectBot = new QRect ( m_margin, ( int ) y() + rectTop->height(), cp->width() - m_margin, cp->height() /2 ); + + +///Draw Icon + +//TODO::remover hard coded icon size : read from config + + if ( !m_isCurrent ) + pe->drawPixmap ( QRect ( ( m_margin-m_iconSize ) /2, ( int ) y() + ( cp->height()-m_iconSize ) /2,m_iconSize,m_iconSize ),m_icon ); + else + pe->drawPixmap ( QRect ( ( m_margin-m_iconSize ) /2, ( int ) y() + ( cp->height()-m_iconSize ) /2,m_iconSize+2,m_iconSize+2 ),m_icon ); +//End of DrawIcon + + + QFont * _font = new QFont ( m_fontAppNameFont ); + QFont * _font_comment = new QFont ( m_commentFont ); + QFont * _font_separator = new QFont ( m_sepNameFont ); + pe->setFont ( *_font ); + + if ( this->type() == EXECUTABLE ) + { + pe->setPen ( m_fontAppNameColor ); + if ( m_noComments == false ) + { + if ( m_isCurrent && m_boldFonts == true ) { _font->setBold ( true );pe->setFont ( *_font ); } + pe->drawText ( *rectTop, Qt::AlignLeft| Qt::AlignBottom ,QString ( m_labelText ), -1, &tmp,0 ); + pe->setPen ( m_lineColor ); + pe->drawLine ( m_margin, ( int ) y() + rectTop->height(), ( int ) cp->width() - 2, ( int ) y() + rectTop->height() ); + pe->setFont ( *_font_comment ); + pe->setPen ( m_commentColor ); + pe->drawText ( *rectBot, Qt::AlignLeft| Qt::AlignTop ,QString ( m_commentText ), -1, &tmp,0 ); + } + else + { + pe->drawText ( QRect ( m_margin+1, ( int ) y()+1,cp->width(),cp->height() ), Qt::AlignLeft | Qt::AlignVCenter ,QString ( m_labelText ), -1, &tmp,0 ); +// pe->drawText ( QRect ( m_margin, ( int ) y(),cp->width(),cp->height() ), Qt::AlignLeft | Qt::AlignVCenter ,QString ( m_labelText ), -1, &tmp,0 ); + } + } + else + { + if ( this->type() == SEPARATOR ) + { + pe->setFont ( *_font_separator ); + pe->setPen ( ConfigInit().m_sepNameColor ); + } + else + { + pe->setPen ( m_fontAppNameColor ); + } + pe->drawText ( QRect ( ( int ) x(), ( int ) y(),cp->width(),cp->height() ), Qt::AlignCenter ,QString ( m_labelText ), -1, &tmp,0 ); + + } + +///Draw the line + + + delete rectTop; + delete rectBot; + delete _font; + delete _font_comment; + delete _font_separator; +} + + +void::KbfxPlasmaCanvasItem::setComment ( QString str ) +{ + + + QFont * _font = new QFont ( m_commentFont ); + + QFontMetrics fm ( *_font ); + + int _commentWidth = fm.width ( str+"..." ); + int _strLen = str.length(); + if ( _commentWidth > ( this->width()-m_margin ) ) + { + + for ( int i = 0; i < _strLen /*&& ( fm.width(str+"...") < width()-40 )*/ ;i++ ) + { + str.truncate ( str.length()-2 ); + if ( fm.width ( str+"..." ) < width()-m_margin ) + break; + + } + str+="..."; + } + + m_commentText = str; +} + + +void +KbfxPlasmaCanvasItem::advance ( int phase ) +{ + if ( phase == 0 ) + { + setXVelocity ( 0 ); + setYVelocity ( yVelocity () * 1 - 0.001 ); + } + else + { + move ( x () + xVelocity (), y () + yVelocity () ); + } +} + +#include "kbfxplasmacanvasitem.moc" + diff --git a/src/kbfxplasmacanvasitem.h b/src/kbfxplasmacanvasitem.h new file mode 100644 index 0000000..92f1047 --- /dev/null +++ b/src/kbfxplasmacanvasitem.h @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_ITEM_H +#define KBFX_PLASMA_CANVAS_ITEM_H + +#include <qcanvas.h> +#include <qfont.h> +#include <qfontinfo.h> +#include <qimage.h> + +#include <kapplication.h> +#include <kdebug.h> +#include <kdesktopfile.h> + +#include <kbfxconfig.h> +#include <kbfxplasmapixmapprovider.h> + +#include "kbfxplasmacanvasabstractitem.h" + + +class KbfxPlasmaCanvasItem:public KbfxPlasmaCanvasAbstractItem +{ + + Q_OBJECT + + public: + +// typedef enum {EXECUTABLE=0,SEPARATOR,INDEX,OTHER} Type; + typedef enum {RASTER=0,VECTOR,NATIVE} SkinMode; + + + KbfxPlasmaCanvasItem ( QCanvasPixmapArray * a, QCanvas * canvas ); + KbfxPlasmaCanvasItem ( const KbfxPlasmaCanvasItem &t ); + KbfxPlasmaCanvasItem &operator = ( const KbfxPlasmaCanvasItem &t ); + virtual ~KbfxPlasmaCanvasItem (); + + bool itemMode(); + void setItemMode ( bool mode=true ); + void setType ( Type ); + void setCurrent ( bool ); + void setExec ( QString desktopfile ); + QString name() {return m_labelText;}; + QString desktopFile() { return m_desktopFilePath;} + + + KbfxDataSource * source() { return m_source;} + void setSource ( KbfxDataSource src ); + void setCommand ( QString cmd ); + void setComment ( QString comment ); + void setIcon ( QPixmap pixmap ); + void setIconPath ( QString path ); + bool isCurrent(); + int height() { return m_height;} + int width() { return m_width;} + Type type() { return m_type;} + bool lookup ( QString str ); + virtual void advance ( int phase ); + virtual int rtti() const { return CANVASITEM;} + virtual void draw ( QPainter & pe ); + virtual void drawContent ( QPainter * pe ); + virtual QPixmap dragPixmap(); + +// virtual void drawText(QPainter *pe,QString str); + virtual void drawBackDrop ( QPainter * pe,QRect & rect ); + + /* Event Handling */ + virtual void mousePressEvent ( QMouseEvent * e ); + virtual void mouseMoveEvent ( QMouseEvent * e ); + virtual void enterEvent ( QEvent * e ); + virtual void mouseReleaseEvent ( QMouseEvent * e ); + + + void setLabelText ( QString s ); + + public slots: + void updateAngle() {} + void hideit(); + void exec(); + signals: + void leave(); + void selected ( KbfxPlasmaCanvasItem* ); + + private: + + + void drawStar ( QPainter * pe ); + + int m_frameCount; + int m_textWidth; + QString m_exec; + QString m_desktopFilePath; + QString m_labelText; + QString m_commentText; + QPixmap m_icon; + QString m_iconPath; + KDesktopFile * m_desktopFile; + KbfxDataSource * m_source; + + /* Theming stuff */ + QColor m_fontAppNameColor; + QFont m_fontAppNameFont; + QColor m_commentColor; + QFont m_commentFont; + QColor m_lineColor; + QFont m_sepNameFont; + bool m_boldFonts; + bool m_skined; + bool m_restricted ; //KDE kiosk + Type m_type; + bool m_hidden; + QString m_error; + bool m_isCurrent; + bool m_noComments; + int m_margin; + int m_height; + int m_width; + int m_iconSize; +} +;//C.G + +#endif //M.I.G + diff --git a/src/kbfxplasmacanvasitem_events.cpp b/src/kbfxplasmacanvasitem_events.cpp new file mode 100644 index 0000000..d268a9e --- /dev/null +++ b/src/kbfxplasmacanvasitem_events.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasitem.h" +#include <kapplication.h> +#include <kdesktopfile.h> +#include <kiconeffect.h> + +void KbfxPlasmaCanvasItem::mousePressEvent ( QMouseEvent * e ) +{ + e = e; +//TODO: +//implement this class + //emit clicked(); +//qDebug("Recive Mouse Press Event"); +} + +void +KbfxPlasmaCanvasItem::mouseReleaseEvent ( QMouseEvent * e ) +{ + e = e; + // QPixmap pix = labelIcon(); + emit clicked(); +} + +void KbfxPlasmaCanvasItem::mouseMoveEvent ( QMouseEvent * e ) +{ + e=e; +//qDebug("Item revices Mouse Event"); + +} + +void KbfxPlasmaCanvasItem::enterEvent ( QEvent * e ) +{ + e=e; +//qDebug("Mouse Enters"); +} + +void +KbfxPlasmaCanvasItem::exec() +{ + + if ( m_source == 0 ) + return; + + +// KIconEffect::visualActivate(new QWidget(), this->boundingRect()); + m_source->exec(); + +} + +bool +KbfxPlasmaCanvasItem::isCurrent() +{ + return m_isCurrent; +} + +void +KbfxPlasmaCanvasItem::setCurrent ( bool state ) +{ + m_isCurrent = state; +} + diff --git a/src/kbfxplasmacanvasitem_events.h b/src/kbfxplasmacanvasitem_events.h new file mode 100644 index 0000000..7f3dfaf --- /dev/null +++ b/src/kbfxplasmacanvasitem_events.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasitem.h" + diff --git a/src/kbfxplasmacanvasitemwrapper.cpp b/src/kbfxplasmacanvasitemwrapper.cpp new file mode 100644 index 0000000..1c244f4 --- /dev/null +++ b/src/kbfxplasmacanvasitemwrapper.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasitemwrapper.h" +#include <qptrlist.h> +#include <kbfxplasmapixmapprovider.h> + +KbfxPlasmaCanvasItemWrapper::KbfxPlasmaCanvasItemWrapper ( QCanvas * canvas ) +{ + m_canvas = canvas; +} + +KbfxPlasmaCanvasItemWrapper::~KbfxPlasmaCanvasItemWrapper () +{} + +QCanvasItem * +KbfxPlasmaCanvasItemWrapper::item ( KbfxPlasmaCanvasItem::Type __type ) +{ + QPixmap _img_sep = ( *KbfxPlasmaPixmapProvider::pixmap ( "separator" ) ); + QImage _tmp_img = _img_sep.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_itemView_w, _img_sep.height (),QImage::ScaleFree ); + _img_sep = QPixmap ( _tmp_img ); + + QPixmap _img_tnorm = ( *KbfxPlasmaPixmapProvider::pixmap ( "tilenormal" ) ); + _tmp_img = _img_tnorm.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_itemView_w, _img_tnorm.height (),QImage::ScaleFree ); + _img_tnorm = QPixmap ( _tmp_img ); + + QPixmap _img_thov = ( *KbfxPlasmaPixmapProvider::pixmap ( "tilehover" ) ); + _tmp_img = _img_thov.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_itemView_w, _img_thov.height (),QImage::ScaleFree ); + _img_thov = QPixmap ( _tmp_img ); + + if ( __type == KbfxPlasmaCanvasItem::SEPARATOR ) + { + QValueList<QPixmap> list; + list.append ( _img_sep ); + KbfxPlasmaCanvasItem *_ret = + new KbfxPlasmaCanvasItem ( new QCanvasPixmapArray ( list ),m_canvas ); + _ret->setType ( __type ); + return ( QCanvasItem * ) _ret; + } + + if ( __type == KbfxPlasmaCanvasItem::EXECUTABLE ) + { + + QValueList<QPixmap> list; + list.append ( _img_tnorm ); + list.append ( _img_thov ); + + QCanvasPixmapArray * _pArray = new QCanvasPixmapArray ( list ); + + KbfxPlasmaCanvasItem *_ret = new KbfxPlasmaCanvasItem ( _pArray, + m_canvas ); + + _ret->setType ( __type ); + return ( QCanvasItem * ) _ret; + } + + + return 0; +} + + +QCanvasItem * +KbfxPlasmaCanvasItemWrapper::itemIndex ( KbfxPlasmaCanvasItem::Type __type ) +{ + QPixmap _img_isep = ( *KbfxPlasmaPixmapProvider::pixmap ( "indexseparator" ) ); + QImage _tmp_img = _img_isep.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_listBox_w, _img_isep.height (),QImage::ScaleFree ); + _img_isep = QPixmap ( _tmp_img ); + + QPixmap _img_r = ( *KbfxPlasmaPixmapProvider::pixmap ( "rhstile" ) ); + _tmp_img = _img_r.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_listBox_w, _img_r.height (),QImage::ScaleFree ); + _img_r = QPixmap ( _tmp_img ); + + QPixmap _img_rhov = ( *KbfxPlasmaPixmapProvider::pixmap ( "rhshovertile" ) ); + _tmp_img = _img_rhov.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_listBox_w, _img_rhov.height (),QImage::ScaleFree ); + _img_rhov = QPixmap ( _tmp_img ); + + if ( __type == KbfxPlasmaCanvasItem::SEPARATOR ) + { + QValueList<QPixmap> list; + list.append ( _img_isep ); + KbfxPlasmaIndexItem *_ret = + new KbfxPlasmaIndexItem ( new QCanvasPixmapArray ( list ),m_canvas ); + _ret->setType ( __type ); + return ( QCanvasItem * ) _ret; + } + if ( __type == KbfxPlasmaCanvasItem::INDEX ) + { + QValueList<QPixmap> list2; + list2.append ( _img_r ); + list2.append ( _img_rhov ); + KbfxPlasmaIndexItem *_ret = new KbfxPlasmaIndexItem ( new QCanvasPixmapArray ( list2 ), + m_canvas ); + + _ret->setType ( __type ); + return ( QCanvasItem * ) _ret; + + } + return 0; +} + +#include "kbfxplasmacanvasitemwrapper.moc" diff --git a/src/kbfxplasmacanvasitemwrapper.h b/src/kbfxplasmacanvasitemwrapper.h new file mode 100644 index 0000000..54e70b2 --- /dev/null +++ b/src/kbfxplasmacanvasitemwrapper.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_ITEM_WRAPPER_H +#define KBFX_PLASMA_CANVAS_ITEM_WRAPPER_H + +#include "kbfxplasmacanvasitem.h" +#include "kbfxplasmaindexitem.h" +#include <qcanvas.h> + + +class KbfxPlasmaCanvasItemWrapper:public QObject +{ + + Q_OBJECT + public: + + KbfxPlasmaCanvasItemWrapper ( QCanvas * canvas ); + ~KbfxPlasmaCanvasItemWrapper(); + QCanvasItem* item ( KbfxPlasmaCanvasItem::Type __type ); + QCanvasItem* itemIndex ( KbfxPlasmaCanvasItem::Type __type ); + + private: + + QCanvas * m_canvas; + +//none + +}; + +#endif diff --git a/src/kbfxplasmacanvasrtti.h b/src/kbfxplasmacanvasrtti.h new file mode 100644 index 0000000..9f2d9be --- /dev/null +++ b/src/kbfxplasmacanvasrtti.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +enum {CANVASITEM=1003,CANVASBUTTON}; diff --git a/src/kbfxplasmacanvasstack.cpp b/src/kbfxplasmacanvasstack.cpp new file mode 100644 index 0000000..bfe5b36 --- /dev/null +++ b/src/kbfxplasmacanvasstack.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasstack.h" + +KbfxPlasmaCanvasStack::KbfxPlasmaCanvasStack() +{ + + m_current= 0;//set to NULL + m_count = 0; + m_height = 0; + m_width = 0; + m_groupChain.setAutoDelete ( TRUE ); + m_name = "Unset:Faulty plugin"; +} + +KbfxPlasmaCanvasStack::~KbfxPlasmaCanvasStack() +{ +//TODO: needs to manage memory here + + + for ( uint i = 0; i < ( uint ) m_count; ++i ) + { + + m_groupChain.at ( i )->~KbfxPlasmaCanvasGroupView(); + m_groupChain.remove ( m_groupChain.at ( i ) ); + + } + + Dict::Iterator it; + + for ( it = m_dict.begin();it != m_dict.end();++it ) + { + m_dict.remove ( it ); + } + + delete m_current; + +} + + +void +KbfxPlasmaCanvasStack::raise ( uint id ) +{ + + KbfxPlasmaCanvasGroupView * _gvPtr = m_groupChain.at ( id ); + + if ( !_gvPtr ) + qDebug ( "Error item not in Stack" ); + else + { + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + m_groupChain.at ( i )->hide(); + } + m_height = _gvPtr->height(); + _gvPtr->show(); + } + + +} + + + +bool +KbfxPlasmaCanvasStack::contains ( QString name ) +{ +//FIXME:Depricated Data Structure Needs fixing + if ( m_dict.contains ( name ) == true ) + return true; + else + return false; + +} + + +void +KbfxPlasmaCanvasStack::addGroup ( KbfxPlasmaCanvasGroupView * gPtr ) +{ + if ( gPtr == NULL ) + { + qDebug + ( "KbfxPlasmaCanvasStack.cpp:34:Null Pointer Passed to addGroup()" ); + return; + } + else + { + m_groupChain.append ( gPtr ); + m_height = gPtr->height(); + m_width = gPtr->width(); + // KbfxPlasmaDataStack stackinfo; +/// stackinfo + m_dict[gPtr->name() ] = m_count; + + m_count++; + } +} + +KbfxPlasmaCanvasStack::Dict +KbfxPlasmaCanvasStack::getDict() +{ + return m_dict; +} + +void +KbfxPlasmaCanvasStack::hide() +{ + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + m_groupChain.at ( i )->hide(); + } +} + + +void +KbfxPlasmaCanvasStack::raiseByName ( QString name ) +{ + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + m_groupChain.at ( i )->hide(); + } + + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + if ( m_groupChain.at ( i )->name() == name ) + { + m_groupChain.at ( i )->show(); + m_height = m_groupChain.at ( i )->height(); + } + } + +} + + + + +KbfxPlasmaCanvasGroupView * +KbfxPlasmaCanvasStack::activeViewByName ( QString name ) +{ + + + for ( uint i = 0; i < m_groupChain.count (); ++i ) + { + if ( m_groupChain.at ( i )->name() == name ) + { + return m_groupChain.at ( i ); + } + } + + return new KbfxPlasmaCanvasGroupView(); +} + + +QString +KbfxPlasmaCanvasStack::getItemName ( int id ) +{ + return m_groupChain.at ( id )->name(); +} + +#include "kbfxplasmacanvasstack.moc" diff --git a/src/kbfxplasmacanvasstack.h b/src/kbfxplasmacanvasstack.h new file mode 100644 index 0000000..91ad67c --- /dev/null +++ b/src/kbfxplasmacanvasstack.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_STACK_H +#define KBFX_PLASMA_CANVAS_STACK_H + +#include <qobject.h> +#include <qptrlist.h> +#include <kbfxplasmacanvasstackdata.h> +//#include "kbfxplasmacanvasgroup.h" +#include "kbfxplasmacanvasgroupview.h" + +/** +This class will manager a list of Grouplists. +**/ + + +class KbfxPlasmaCanvasStack:public QObject +{ + + Q_OBJECT + + public: + typedef QPtrList<KbfxPlasmaCanvasGroupView> groupPtrList; + typedef QMap<QString,uint> Dict;//DEPRECATED + typedef QMap<KbfxPlasmaCanvasStackData,uint> DataDict; + + KbfxPlasmaCanvasStack(); + virtual ~KbfxPlasmaCanvasStack(); + void addGroup ( KbfxPlasmaCanvasGroupView* ); + void deleteGroup ( KbfxPlasmaCanvasGroupView* ); + KbfxPlasmaCanvasStack* contains ( KbfxPlasmaCanvasGroupView* ); + QString getItemName ( int ); + virtual int rtti() {return 1006;} + void predend ( KbfxPlasmaCanvasGroupView* ); + void append ( KbfxPlasmaCanvasGroupView* ); + Dict getDict(); + void hide(); + int count() { return m_count;} + int height() + { + return m_height; + } + int width() + { + return m_width; + } + QString name() {return m_name;} + void setName ( QString name ) { m_name = name;} + bool contains ( QString ); + KbfxPlasmaCanvasGroupView * activeViewByName ( QString name ); + public slots: + void raise ( uint id ); + void raiseByName ( QString name ); + private: + int m_x; + int m_y; + int m_z; //depth index : not Z axis + int m_count; + int m_height; + int m_width; + KbfxPlasmaCanvasGroupView * m_current; + groupPtrList m_groupChain; + Dict m_dict; + DataDict m_dataDict; + QString m_name; +//state variables + +}; + +#endif diff --git a/src/kbfxplasmacanvasstackdata.h b/src/kbfxplasmacanvasstackdata.h new file mode 100644 index 0000000..1783b77 --- /dev/null +++ b/src/kbfxplasmacanvasstackdata.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_STACK_DATA_H +#define KBFX_PLASMA_CANVAS_STACK_DATA_H + + +class KbfxPlasmaCanvasStackData +{ + + public: + KbfxPlasmaCanvasStackData() {} + ~KbfxPlasmaCanvasStackData() {} + QString name; + QString icon; + int id; + +}; +#endif + diff --git a/src/kbfxplasmacanvasview.cpp b/src/kbfxplasmacanvasview.cpp new file mode 100644 index 0000000..013458e --- /dev/null +++ b/src/kbfxplasmacanvasview.cpp @@ -0,0 +1,665 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmacanvasview.h" + +KbfxPlasmaCanvasView::KbfxPlasmaCanvasView ( QWidget * parent, + const char *name, WFlags fl ) : + QCanvasView ( parent, name,fl ) +{ + + viewport ()->setMouseTracking ( TRUE ); + viewport ()->setAcceptDrops ( true ); + this->setVScrollBarMode ( QScrollView::AlwaysOff ); + this->setHScrollBarMode ( QScrollView::AlwaysOff ); + setFrameShape ( QFrame::NoFrame ); + m_currentItem = 0L; + m_stack = 0; + m_currentView = new KbfxPlasmaCanvasGroupView (); + m_lastSignalData = ""; + gstack = 0; + m_exeCandidate = 0; + m_findDone = true; + m_selectedItem = 0L; + m_search = new QCanvas ( this->width (), this->height () ); + + m_scrollbar_top = new KbfxSpinxScrollBar ( this ); + m_scrollbar_bot = new KbfxSpinxScrollBar ( this,"bottom",1); + m_scrollbar_top->setType ( KbfxSpinxScrollBar::UP ); + m_scrollbar_bot->setType ( KbfxSpinxScrollBar::DOWN ); + + connect ( m_scrollbar_top, SIGNAL ( scroll ( int, int ) ), this, + SLOT ( scrollBy ( int, int ) ) ); + connect ( m_scrollbar_bot, SIGNAL ( scroll ( int, int ) ), this, + SLOT ( scrollBy ( int, int ) ) ); + + placeScrollBars (); +} + +void +KbfxPlasmaCanvasView::placeScrollBars () +{ + m_scrollbar_top->move ( 0, 0 ); + m_scrollbar_bot->move ( 0, ( this->height () + 1 ) - m_scrollbar_bot->height () ); +} + +KbfxPlasmaCanvasView::~KbfxPlasmaCanvasView () +{ +} + +void +KbfxPlasmaCanvasView::keyPressEvent ( QKeyEvent * ke ) +{ + qDebug ( "QCanvasView got Key events" ); + ke->ignore(); +} + +void +KbfxPlasmaCanvasView::execFirst () +{ + //if ( m_search->allItems ().count () < 1 ) +// { +// return; +// } +qDebug("_____----------------------------------------"); + if ( m_exeCandidate != 0 ) + m_exeCandidate->exec (); +} + +void +KbfxPlasmaCanvasView::clearAllButOne ( KbfxPlasmaCanvasItem * i ) +{ + i = i; + + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + if ( *it != m_selectedItem ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setCurrent ( false ); + } + } + } + canvas ()->update (); +} + +void +KbfxPlasmaCanvasView::execAt ( int i ) +{ + int e = i - 48; + int e_count = m_search->allItems ().count (); + + if ( e_count < 2 ) + { + return; + } + if ( e >= e_count - 1 ) + return; + + KbfxPlasmaCanvasItem *tmp = m_searchMap[e]; + if ( tmp == 0 ) + return; + else + tmp->exec (); +} + +void +KbfxPlasmaCanvasView::leaveEvent ( QEvent * e ) +{ + e = e; + clearAllButOne ( m_currentItem ); +} + +void +KbfxPlasmaCanvasView::enterEvent ( QEvent * e ) +{ + e = e; + clearAllButOne ( m_currentItem ); +} + +void +KbfxPlasmaCanvasView::mouseMoveEvent ( QMouseEvent * me ) +{ + QPoint p = inverseWorldMatrix ().map ( viewportToContents ( me->pos () ) ); + if ( canvas () == NULL ) + return; + +// KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( p ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( *it == 0 ) + return; + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaCanvasItem *t = ( KbfxPlasmaCanvasItem * ) ( *it ); + t->mouseMoveEvent ( me ); + if ( m_currentItem != NULL ) + { + m_currentItem->setCurrent ( false ); + } + m_currentItem = t; + t->setCurrent ( true ); + } + } + canvas ()->update (); +} + +void +KbfxPlasmaCanvasView::contentsMouseMoveEvent ( QMouseEvent * me ) +{ + if ( canvas () == NULL ) + return; + + if ( me->state () & LeftButton ) + { + int distance = ( me->pos () - m_dragPos ).manhattanLength (); + if ( distance > QApplication::startDragDistance () ) + this->startDrag (); + } + QScrollView::contentsMouseMoveEvent ( me ); + + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + + if ( l.count () <= 0 ) + return; + + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( *it == 0 ) + return; + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaCanvasItem *t = ( KbfxPlasmaCanvasItem * ) ( *it ); + t->mouseMoveEvent ( me ); + if ( m_currentItem != NULL ) + { + m_currentItem->setCurrent ( false ); + } + m_currentItem = t; + t->setCurrent ( true ); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); + } + } + canvas ()->update (); +} + + +void +KbfxPlasmaCanvasView::contentsMousePressEvent ( QMouseEvent * me ) +{ + KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaCanvasItem *t = ( KbfxPlasmaCanvasItem * ) ( *it ); + t->mousePressEvent ( me ); + if ( t->type () == KbfxPlasmaCanvasItem::SEPARATOR ) + tmp = KbfxPlasmaCanvasGroup::groupContaining ( t ); + } + } + if ( tmp != 0 ) + tmp->shade (); + m_clickPos = me->pos (); + + if ( me->button () == LeftButton ) + m_dragPos = me->pos (); + QScrollView::contentsMousePressEvent ( me ); + canvas ()->update (); +} + +void +KbfxPlasmaCanvasView::startDrag () +{ + if ( m_currentItem != 0 ) + { + KbfxDataSource *src = new KbfxDataSource (); + src = m_currentItem->source (); + if ( src == 0 ) + { + qDebug ( "null source" ); + return; + } + QUriDrag *drag = + new QUriDrag ( QStrList ( src->contentPath () ), this, + src->name ().ascii () ); + drag->setFileNames ( QStringList ( src->contentPath () ) ); + drag->setPixmap ( m_currentItem->dragPixmap () ); + drag->drag (); + emit clicked (); + } +} + +void +KbfxPlasmaCanvasView::resizeEvent ( QResizeEvent * ) +{ + placeScrollBars (); +} + +/* +void +KbfxPlasmaCanvasView::enterEvent ( QEvent * e ) +{ + e = e; + if ( canvas () == 0 ) + return; + +// KbfxPlasmaCanvasGroup *tmp = 0; + QPoint _mPos = QCursor::pos (); + QCanvasItemList l = canvas ()->collisions ( this->mapFromGlobal ( _mPos ) ); + + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( *it == 0 ) + break; + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaCanvasItem *t = ( KbfxPlasmaCanvasItem * ) ( *it ); +// t->enterEvent ( e); + m_currentItem = t; + } + } +} +*/ + +void +KbfxPlasmaCanvasView::reload() +{ + clearAll(); + clearSearch(); + m_appletMap.clear(); +} + +void +KbfxPlasmaCanvasView::clearAll () +{ + if ( canvas() != m_search ) + return ; + + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { +// KbfxPlasmaCanvasItem *t = (KbfxPlasmaCanvasItem *) (*it); + m_search->removeItem ( ( *it ) ); + ( *it )->setCanvas ( 0L ); +// delete (*it); + } + } + canvas()->update(); +} + +void +KbfxPlasmaCanvasView::setKbfxCanvas ( QCanvas * cnv ) +{ + m_default = cnv; + setCanvas ( m_default ); + // canvas ()->setBackgroundPixmap ( ( *KbfxPlasmaPixmapProvider::pixmap ( "appviewbg" )) ); + QPixmap * pixmap = KbfxPlasmaPixmapProvider::pixmap ( "middleboxbg" ); + if ( pixmap != NULL ) + { + QImage img = pixmap->convertToImage(); + img = img.smoothScale ( this->width(),pixmap->height(),QImage::ScaleFree ); + pixmap->convertFromImage ( img ); + this->canvas ()->setBackgroundPixmap ( *pixmap ); + } +} + +void +KbfxPlasmaCanvasView::expandAll () +{ + if ( m_currentView != 0 ) + { + if ( ConfigInit ().m_startHidden == false ) + m_currentView->unfoldGroupAll (); + scroll ( 0, 0 ); + } +} + +void +KbfxPlasmaCanvasView::handleLoadRequest ( KbfxSignal signal ) +{ + QString tm = signal.name (); + + KbfxDataStack *_stack = m_dataStack[signal.name () ]; + if ( _stack == 0 ) + { + qDebug ( "Empty Stack" ); + return; + } + + QString _activateGroup = _stack->getSubGroupName ( signal.id () ); + + KbfxDataGroupList *_dataList = _stack->getStack ( _activateGroup ); + KbfxPlasmaCanvasGroupView *gview = new KbfxPlasmaCanvasGroupView (); + KbfxPlasmaCanvasStack *v_stack = m_appletMap[signal.name () ]; + + if ( m_currentView->name () == _activateGroup && canvas() != m_search) + { + return; + } + setCanvas ( m_default ); + + scrollBy ( 0, - ( canvas ()->height () ) ); + + stackMap::Iterator it; + for ( it = m_appletMap.begin (); it != m_appletMap.end (); ++it ) + { + ( *it )->hide (); + } + + if ( m_appletMap[signal.name () ]->contains ( _activateGroup ) != true ) + { + loadGroup ( _dataList, gview ); + m_currentView = gview; + m_appletMap[signal.name () ]->setName ( signal.name () ); + m_appletMap[signal.name () ]->addGroup ( gview ); + m_appletMap[signal.name () ]->raiseByName ( _activateGroup ); + int _height = + v_stack->height () + m_scrollbar_top->height () + + m_scrollbar_bot->height (); + if ( _height > this->visibleHeight () ) + canvas ()->resize ( v_stack->width (), _height ); + else + canvas ()->resize ( v_stack->width (), this->visibleHeight () ); + canvas()->update(); + repaint(); + // return; + } + else + { + m_appletMap[signal.name () ]->raiseByName ( _activateGroup ); + m_currentView = + m_appletMap[signal.name () ]->activeViewByName ( _activateGroup ); + int _height = + m_appletMap[signal.name () ]->height () + m_scrollbar_top->height () + + m_scrollbar_bot->height (); + if ( _height > this->visibleHeight () ) + canvas ()->resize ( m_appletMap[signal.name () ]->width (), _height ); + else + canvas ()->resize ( m_appletMap[signal.name () ]->width (), + this->visibleHeight () ); + canvas()->update(); + repaint(); + } + +} + + +void +KbfxPlasmaCanvasView::contentsMouseReleaseEvent ( QMouseEvent * me ) +{ +// KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaCanvasItem *t = ( KbfxPlasmaCanvasItem * ) ( *it ); + t->mouseReleaseEvent ( me ); + if ( t->type () != KbfxPlasmaCanvasItem::SEPARATOR ) + emit clicked (); + } + } +} + + +void +KbfxPlasmaCanvasView::clearSearch () +{ + searchMap::Iterator it; + for ( it = m_searchMap.begin (); it != m_searchMap.end (); ++it ) + { + if ( it != 0 ) + m_searchMap.remove ( it ); + } +} + + +void +KbfxPlasmaCanvasView::search_R ( const QString name ) +{ + gstack = new KbfxPlasmaCanvasStack (); + KbfxPlasmaCanvasGroup *visualGroup = new KbfxPlasmaCanvasGroup (); + KbfxPlasmaCanvasGroupView *glist = new KbfxPlasmaCanvasGroupView (); + KbfxPlasmaCanvasItem *box = 0; + KbfxPlasmaCanvasItemWrapper *boxwrapper = 0; + + glist->setName ( "Search Result" ); + + this->setCanvas ( m_search ); + + QPixmap * pixmap = KbfxPlasmaPixmapProvider::pixmap ( "middleboxbg" ); + if ( pixmap != NULL ) + { + QImage img = pixmap->convertToImage(); + img = img.smoothScale ( this->width(),pixmap->height(),QImage::ScaleFree ); + pixmap->convertFromImage ( img ); + this->canvas ()->setBackgroundPixmap ( *pixmap ); + } + + this->setCursor ( QCursor ( Qt::BusyCursor ) ); + + clearAll (); + dataStack::Iterator sit; + + for ( sit = m_dataStack.begin (); sit != m_dataStack.end (); ++sit ) + { + if ( sit == NULL ) + continue; + + visualGroup = new KbfxPlasmaCanvasGroup (); + KbfxDataGroup *appGroup = + KbfxPlasmaPluginLoader::search ( sit.key (), name ); + + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( m_search ); + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + item ( KbfxPlasmaCanvasItem::SEPARATOR ); + + if ( appGroup != NULL ) + box->setLabelText ( "Hits for " + sit.key () ); + + if ( appGroup == NULL ) + { + qDebug ( "Null Search Group" ); + continue; + } + + + if ( appGroup->count () <= 0 ) + continue; + + if ( visualGroup->addItem ( box ) == false ) + {} + + + KbfxDataGroup::Data dat = appGroup->getData (); + KbfxDataGroup::Data::Iterator it; + + KbfxDataSource * firstItem = appGroup->itemAt(0); + + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( m_search ); + m_exeCandidate = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + item ( KbfxPlasmaCanvasItem::EXECUTABLE ); + + m_exeCandidate->setSource ( *firstItem ); + + for ( it = dat.begin(); it != dat.end (); it++ ) + { + qApp->processEvents (); + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( m_search ); + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + item ( KbfxPlasmaCanvasItem::EXECUTABLE ); + box->setSource ( * ( it.data () ) ); + if ( visualGroup->addItem ( box ) == true ) + { + } + } + visualGroup->move ( 0, m_scrollbar_top->height () ); + + glist->addGroup ( visualGroup ); + } + + gstack->addGroup ( glist ); + gstack->raise ( 0 ); + if ( gstack->height() < this->visibleHeight() ) + m_search->resize ( gstack->width(),this->visibleHeight() ); + else + m_search->resize ( gstack->width (), + gstack->height () + m_scrollbar_top->height () + + m_scrollbar_bot->height () ); + m_search->update (); + + this->setCursor ( QCursor ( Qt::ArrowCursor ) ); +} + + +void +KbfxPlasmaCanvasView::search ( const QString & str ) +{ + if ( str.isEmpty () ) + return; + + if ( str == "" ) + return; + + search_R ( str ); +} + + + +void +KbfxPlasmaCanvasView::addStack ( KbfxPlasmaCanvasStack * stak, QString name ) +{ + if ( m_appletMap.contains ( name ) ) + { + return; + } + m_appletMap[name] = stak; +} + +void +KbfxPlasmaCanvasView::addStack ( KbfxDataStack * stak, QString name ) +{ + if ( m_dataStack.contains ( name ) ) + { + return; + } + m_dataStack[name] = stak; + addStack ( new KbfxPlasmaCanvasStack (), name ); +} + +void +KbfxPlasmaCanvasView::loadGroup ( KbfxDataGroupList * src, + KbfxPlasmaCanvasGroupView * dest ) +{ + if ( src == 0 ) + return ; + + KbfxDataGroupList::GroupList list = src->getGroup (); + dest->setName ( src->name () ); + KbfxPlasmaCanvasItem *box = 0; + KbfxPlasmaCanvasItemWrapper *boxwrapper = 0; + KbfxPlasmaCanvasGroup *appGroup = 0; //new KbfxPlasmaCanvasGroup (); + QString l_lastAdd = ""; + for ( int i = 0; i < src->count (); i++ ) + { + if ( list.at ( i ) != 0 ) + { + if ( list.at ( i )->count () <= 0 ) + continue; + + appGroup = new KbfxPlasmaCanvasGroup (); + + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( m_default ); + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + item ( KbfxPlasmaCanvasItem::SEPARATOR ); + + if ( list.at ( i )->name ().compare ( l_lastAdd ) == 0 ) + { + box->setLabelText ( src->name () ); + } + else + { + l_lastAdd = list.at ( i )->name () ; + box->setLabelText ( list.at ( i )->name () ); + } + + appGroup->addItem ( box ); + + KbfxDataGroup::Data::Iterator git; + KbfxDataGroup::Data data; + data = list.at ( i )->getData (); + + for ( git = data.begin (); git != data.end (); git++ ) + { + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( m_default ); + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + item ( KbfxPlasmaCanvasItem::EXECUTABLE ); + box->setSource ( * ( git.data () ) ); + appGroup->addItem ( box ); + } + if ( appGroup->count () > 0 ) + { + dest->addGroup ( appGroup ); + appGroup->move ( 0, m_scrollbar_top->height () ); + } + } + } + if ( ConfigInit ().m_startHidden ) + { + dest->foldGroupAll (); + } + else + { + dest->unfoldGroupAll (); + } +} + + +void +KbfxPlasmaCanvasView::contentsDragLeaveEvent ( QDragEnterEvent * event ) +{ + event->accept ( true ); +} + +void +KbfxPlasmaCanvasView::contentsDragEnterEvent ( QDragEnterEvent * event ) +{ + event->accept ( true ); +} + +#include "kbfxplasmacanvasview.moc" diff --git a/src/kbfxplasmacanvasview.h b/src/kbfxplasmacanvasview.h new file mode 100644 index 0000000..80c8a99 --- /dev/null +++ b/src/kbfxplasmacanvasview.h @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_CANVAS_VIEW_H +#define KBFX_PLASMA_CANVAS_VIEW_H + +#include <qcanvas.h> +#include <qcursor.h> +#include <qdragobject.h> +#include <qpainter.h> + +#include <kimageeffect.h> + +#include <kbfxconfig.h> +#include <kbfxdatastack.h> +#include <kbfxplasmapixmapprovider.h> +#include <kbfxplasmapluginloader.h> + +//#include "kbfxplasmacanvasrtti.h" +#include "kbfxplasmacanvasgroup.h" +#include "kbfxplasmacanvasgroupview.h" +#include "kbfxplasmacanvasitem.h" +#include "kbfxplasmacanvasitemwrapper.h" + +#include "kbfxplasmacanvasstack.h" +#include "kbfxplasmacanvasview.h" +#include "kbfxsignal.h" +#include "kbfxspinxscrollbar.h" + + +class QCanvasView; + + +class KbfxPlasmaCanvasView : public QCanvasView +{ + Q_OBJECT + + public: + typedef QMap<QString,KbfxPlasmaCanvasStack*> stackMap; + typedef QMap<QString,KbfxDataStack*> dataStack; + typedef QMap<int,KbfxPlasmaCanvasItem*> searchMap; + + KbfxPlasmaCanvasView ( QWidget * parent = 0, const char * name = 0, WFlags f = 0 ); + virtual ~KbfxPlasmaCanvasView(); + void addStack ( KbfxPlasmaCanvasStack*stk,QString name ); + void addStack ( KbfxDataStack*stk,QString name ); + + void setKbfxCanvas ( QCanvas*cnv ); + void loadGroup ( KbfxDataGroupList * src,KbfxPlasmaCanvasGroupView * dest ); + void contentsDragLeaveEvent ( QDragEnterEvent *event ); + void contentsDragEnterEvent ( QDragEnterEvent *event ); + + + public slots: + + void clearAll(); + virtual void contentsMousePressEvent ( QMouseEvent * me ); + virtual void contentsMouseMoveEvent ( QMouseEvent * e ); + virtual void contentsMouseReleaseEvent ( QMouseEvent * e ); + virtual void mouseMoveEvent ( QMouseEvent * me ); + virtual void enterEvent ( QEvent * e ); + virtual void keyPressEvent ( QKeyEvent * ke ); + virtual void emulatedKeyPress ( QKeyEvent * k ) {keyPressEvent ( k );} + virtual void resizeEvent ( QResizeEvent * ) ; + virtual void leaveEvent ( QEvent * e ); +// virtual void leaveEvent(QEvent e ); + void handleLoadRequest ( KbfxSignal ); + void search ( const QString & ); + void search_R ( const QString key ); + void execFirst(); + void execAt ( int i ); + void expandAll(); + void reload(); + signals: + void clicked(); + protected: + void clearAllButOne ( KbfxPlasmaCanvasItem * i ); + + private: + void clearSearch(); + void startDrag(); + void placeScrollBars(); + + QPoint m_clickPos; + KbfxPlasmaCanvasItem * m_currentItem; + KbfxPlasmaCanvasStack * m_currentStack; + KbfxPlasmaCanvasStack * m_stack; + QString m_lastSignalData; + stackMap m_appletMap; + dataStack m_dataStack; + searchMap m_searchMap; + KbfxPlasmaCanvasStack * gstack ; + KbfxPlasmaCanvasItem * m_exeCandidate; + QCanvas * m_default; + QCanvas * m_search; + bool m_findDone; + KbfxSpinxScrollBar * m_scrollbar_top; + KbfxSpinxScrollBar * m_scrollbar_bot; + QPoint m_dragPos; + KbfxPlasmaCanvasGroupView * m_currentView; + QString m_currentViewName; + KbfxPlasmaCanvasItem * m_selectedItem; +}; + +#endif + diff --git a/src/kbfxplasmaindexitem.cpp b/src/kbfxplasmaindexitem.cpp new file mode 100644 index 0000000..cbbfe91 --- /dev/null +++ b/src/kbfxplasmaindexitem.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmaindexitem.h" +#include <kdesktopfile.h> +#include <kapplication.h> +#include <kbfxconfig.h> + +KbfxPlasmaIndexItem::KbfxPlasmaIndexItem ( QCanvasPixmapArray * a, QCanvas * canvas ) :KbfxPlasmaCanvasAbstractItem ( a,canvas ) +{ +//this->setItemMode (1); + setAnimated ( false ); + setCurrent ( false ); + m_isSelected = false; + QPixmap * _img = this->image ( 0 ); + m_height =_img->height(); + m_width= _img->width(); + +} + + + +KbfxPlasmaIndexItem::~KbfxPlasmaIndexItem() +{} + +void +KbfxPlasmaIndexItem::setIcon ( QString str ) +{ + KIconLoader *iconload = KGlobal::iconLoader (); + m_iconPath = iconload->iconPath ( str, KIcon::Desktop, false ); + + m_icon.load ( m_iconPath ); +} + +void +KbfxPlasmaIndexItem::setText ( QString text ) +{ + m_text = text; +} + +void +KbfxPlasmaIndexItem::setSelected ( bool stat ) +{ + m_isSelected = stat; + +} + +bool +KbfxPlasmaIndexItem::selected() +{ + return m_isSelected; +} + + +void +KbfxPlasmaIndexItem::drawContent ( QPainter * pe ) +{ + + if ( this->isCurrent() || m_isSelected ) + { + this->setFrame ( 1 ); + } + else + { + this->setFrame ( 0 ); + } + + QCanvasPixmap *cp = this->image ( this->frame () ); + m_height = cp->height(); + m_width = cp->width(); + + pe->drawPixmap ( this->boundingRect (), *cp ); + + QRect r ( ( int ) x(), ( int ) y(), m_width, m_height ); + QRect textRect ( m_height+1, ( int ) y(), m_width,m_height ); + + QFont * _font_plugin = new QFont ( ConfigInit().m_pluginNameFont ); + QFont * _font_index = new QFont ( ConfigInit().m_fontIndexFont ); + + if ( this->type() != KbfxPlasmaIndexItem::SEPARATOR ) + { + pe->setFont ( *_font_index ); + pe->setPen ( ConfigInit().m_fontIndexColor ); + } + else + { + pe->setFont ( *_font_plugin ); + pe->setPen ( ConfigInit().m_pluginNameColor); + } + + pe->drawText ( textRect, Qt::AlignVCenter | Qt::AlignLeft ,QString ( m_text ), -1, &r,0 ); + pe->drawPixmap ( QRect ( ( int ) x() +5 , ( int ) y() +6,m_height-12,m_height-12 ),m_icon ); + + delete _font_plugin; + delete _font_index; + +} + +int +KbfxPlasmaIndexItem::height() +{ + return m_height; +} + +void +KbfxPlasmaIndexItem::setId ( int id ) +{ + m_id = id; +} + + +void +KbfxPlasmaIndexItem::draw ( QPainter & p ) +{ + drawContent ( &p ); +} + +void +KbfxPlasmaIndexItem::setLabelText ( QString str ) +{ + QFont * _font = new QFont(ConfigInit().m_fontIndexFont); + + QFontMetrics fm ( *_font ); + + int _commentWidth = fm.width ( str+"..." ); + int _strLen = str.length(); + int _margin = height();; + if ( _commentWidth > ( m_width -_margin ) ) + { + + for ( int i = 0; i < _strLen /*&& ( fm.width(str+"...") < width()-40 )*/ ;i++ ) + { + str.truncate ( str.length()-2 ); + if ( fm.width ( str+"..." ) < m_width-_margin ) + break; + + } + str+="..."; + } + + setText ( str ); +} + + +QString +KbfxPlasmaIndexItem::belongsTo() +{ + + return m_parent; +} + +void +KbfxPlasmaIndexItem::setBelongsTo ( QString parent ) +{ + m_parent = parent; +} + + +void KbfxPlasmaIndexItem::mousePressEvent ( QMouseEvent * e ) +{ + e = e; +} + +#include "kbfxplasmaindexitem.moc" diff --git a/src/kbfxplasmaindexitem.h b/src/kbfxplasmaindexitem.h new file mode 100644 index 0000000..9b68da8 --- /dev/null +++ b/src/kbfxplasmaindexitem.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_INDEX_ITEM_H +#define KBFX_PLASMA_INDEX_ITEM_H + +#include "kbfxplasmacanvasabstractitem.h" + +class KbfxPlasmaIndexItem : public KbfxPlasmaCanvasAbstractItem +{ + Q_OBJECT + + public: + + KbfxPlasmaIndexItem ( QCanvasPixmapArray * a, QCanvas * canvas ); + virtual ~KbfxPlasmaIndexItem(); + + void setIcon ( QString path ); + void setText ( QString text ); + void setId ( int id ); + //void setName(QString name); + void setLabelText ( QString text ); + void setBelongsTo ( QString parent ); + QString belongsTo(); + int height(); + void setSelected ( bool select ); + bool selected(); + int Id() { return m_id;} + + virtual void drawContent ( QPainter * pe ); + virtual void draw ( QPainter & pe ); + virtual void mousePressEvent ( QMouseEvent * e ); + + private: + int m_id; + QString m_name; + QString m_text; + QString m_iconPath; + QPixmap m_icon; + QString m_parent; + bool m_isCurrent; + int m_height; + int m_width; + bool m_isSelected; + + +}; + + +#endif diff --git a/src/kbfxplasmaindexview.cpp b/src/kbfxplasmaindexview.cpp new file mode 100644 index 0000000..ee50c9e --- /dev/null +++ b/src/kbfxplasmaindexview.cpp @@ -0,0 +1,436 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmaindexview.h" + +KbfxPlasmaIndexView::KbfxPlasmaIndexView ( QWidget * parent, const char *name, + WFlags l ) : + QCanvasView ( parent, name, l ) +{ + m_itemGroup = new KbfxPlasmaCanvasGroup (); + m_itemGroupList = new KbfxPlasmaCanvasGroupView (); + m_itemStack = new KbfxPlasmaCanvasStack (); + m_pluginLoaded = ""; + m_itemStack->addGroup ( m_itemGroupList ); + viewport ()->setMouseTracking ( TRUE ); + + m_currentPos = QPoint ( 0, 0 ); + m_mousePollTimer = new QTimer ( this ); + + m_pluginList = KbfxPlasmaPluginLoader::scanPlugins (); + viewport ()->setAcceptDrops ( true ); + this->setVScrollBarMode ( QScrollView::AlwaysOff ); + this->setHScrollBarMode ( QScrollView::AlwaysOff ); + setFrameShape ( QFrame::NoFrame ); + m_currentItem = 0L; + m_selectedItem = 0L; +// m_pluginList = ""; + connect ( this, SIGNAL ( clicked ( KbfxPlasmaIndexItem * ) ), this, + SLOT ( slotClicked ( KbfxPlasmaIndexItem * ) ) ); + m_currentView = 0; + setDragAutoScroll ( true ); +} + + +KbfxPlasmaIndexView::~KbfxPlasmaIndexView () +{ +} + +void +KbfxPlasmaIndexView::checkMousePos () +{ + KbfxPlasmaCanvasGroup *tmp = 0; + if ( QCursor::pos () == mapToGlobal ( contentsToViewport ( m_currentPos ) ) ) + { + QMouseEvent me ( QEvent::MouseButtonPress, + this->mapToGlobal ( m_currentPos ), Qt::LeftButton, + Qt::LeftButton ); + + clearAll (); + + QCanvasItemList l = canvas ()->collisions ( m_currentPos ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + + if ( t->type () != KbfxPlasmaCanvasItem::SEPARATOR ) + { + emit clearSelected(); + t->mousePressEvent ( &me ); + m_selectedItem = t; + t->setSelected ( true ); + emit clicked ( t ); + } + + if ( t->type () == KbfxPlasmaCanvasItem::SEPARATOR ) + tmp = KbfxPlasmaCanvasGroup::groupContaining ( t ); +// groupContaining ((KbfxPlasmaCanvasItem *) l.first ()); + } + } + + } +// if (tmp != 0) +// tmp->shade(); +} + + +void +KbfxPlasmaIndexView::setView ( KbfxPlasmaCanvasView * view ) +{ + if ( view == NULL ) + return; + m_currentView = view; +} + +void +KbfxPlasmaIndexView::clearAllButOne ( KbfxPlasmaIndexItem * i ) +{ + i = i; + + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + if ( *it != m_selectedItem ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setCurrent ( false ); + } + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::clearSelection () +{ + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setCurrent ( false ); + t->setSelected ( false ); + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::leaveEvent ( QEvent * e ) +{ + e = e; + clearAllButOne ( m_currentItem ); + emit expand (); +} + +void +KbfxPlasmaIndexView::contextMenuSlot ( int id ) +{ + id = id; +/* + m_pluginList.remove ( m_pluginList.at ( id - 1 ) ); + if ( m_currentView != 0 ) + emit pluginRequest ( m_pluginMenu->text ( id ), m_currentView ); +*/ +} + +void +KbfxPlasmaIndexView::contentsContextMenuEvent ( QContextMenuEvent * event ) +{ + event = event; +/* + m_pluginMenu = new KPopupMenu ( this );; + connect ( m_pluginMenu, SIGNAL ( activated ( int ) ), this, + SLOT ( contextMenuSlot ( int ) ) ); + + m_pluginMenu->insertTitle ( "Insert Plugin", 0, 0 ); + int _index = 1; + + for ( QStringList::Iterator it = m_pluginList.begin (); + it != m_pluginList.end (); ++it ) + { + + m_pluginMenu->insertItem ( *it, _index, _index ); + _index++; + } + + m_pluginMenu->exec ( event->globalPos () ); +*/ +} + +void +KbfxPlasmaIndexView::loadList ( KbfxDataStack * stkPtr ) +{ + if ( stkPtr == NULL ) + { + kdDebug() << "Loading Stack Failed:KbfxListBox->loadList()" << endl; + return; + } + + int _height = 0; + + KbfxPlasmaCanvasItem *box = 0; + KbfxPlasmaCanvasItemWrapper *boxwrapper = 0; + + KbfxPlasmaCanvasItemWrapper *indexitemwrap = + new KbfxPlasmaCanvasItemWrapper ( canvas () ); + + m_itemGroup = new KbfxPlasmaCanvasGroup (); + + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( canvas () ); + + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + itemIndex ( KbfxPlasmaCanvasItem::SEPARATOR ); + + box->setLabelText ( stkPtr->name () ); + m_itemGroup->addItem ( box ); + + _height += box->height (); + + KbfxDataStack::DataDict _dict = stkPtr->getDataDict (); + KbfxDataStack::DataDict::Iterator it; + for ( it = _dict.begin (); it != _dict.end (); ++it ) + { + KbfxPlasmaIndexItem *item = + ( KbfxPlasmaIndexItem * ) indexitemwrap-> + itemIndex ( KbfxPlasmaCanvasItem::INDEX ); + + if ( item == 0 ) + return; + + item->setType ( KbfxPlasmaCanvasItem::INDEX ); + item->setText ( it.data ().name ); + item->setName ( it.data ().name ); + item->setLabelText ( it.data ().name ); + item->setIcon ( it.data ().icon ); + item->setId ( it.key () ); + + m_itemGroup->addItem ( item ); + + item->setBelongsTo ( stkPtr->name () ); + } + + m_itemGroupList->addGroup ( m_itemGroup ); + + if ( m_itemGroupList->height () > this->height () ) + canvas ()->resize ( this->width (), m_itemGroupList->height () ); + canvas ()->update (); + + m_itemStack->raise ( 0 ); + + for ( QStringList::Iterator it = m_pluginList.begin (); + it != m_pluginList.end (); ++it ) + { + if ( *it == stkPtr->name() ) + { + m_pluginList.remove ( it ); + break; + } + } +} + +void +KbfxPlasmaIndexView::setKbfxCanvas ( QCanvas * cnv ) +{ + setCanvas ( cnv ); + + canvas ()->setBackgroundPixmap ( ( *KbfxPlasmaPixmapProvider::pixmap ( "listboxbg" )) ); + + canvas ()->update (); +} + + +void +KbfxPlasmaIndexView::loadPlugin ( QString name, KbfxPlasmaCanvasView * view ) +{ + if ( m_pluginList.contains ( name ) <= 0 ) + { + KbfxPlasmaPluginLoader *m_loader = new KbfxPlasmaPluginLoader (); + KbfxDataStack *m_stack_R = m_loader->getView ( name ); + + if ( m_stack_R == NULL ) + return; + + if ( m_currentView != 0 ) + view->addStack ( m_stack_R, name ); + + this->loadList ( m_stack_R ); + canvas ()->update (); + m_pluginLoaded += name; + + delete m_loader; + return; + } + else + { + kdDebug() << "Plugin already loaded" << endl; + return; + } +} + + +void +KbfxPlasmaIndexView::mouseMoveEvent ( QMouseEvent * me ) +{ + me = me; +} + + + +void +KbfxPlasmaIndexView::contentsMouseMoveEvent ( QMouseEvent * me ) +{ + if ( canvas () == NULL ) + return; + + m_currentPos = me->pos (); + +// TODO: Get wait time from config + + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); + + QTimer::singleShot ( 800, this, SLOT ( checkMousePos () ) ); + + if ( contentsToViewport ( me->pos () ).y () < this->height () / 5 ) + { + scrollBy ( -10, -10 ); + } + else if ( contentsToViewport ( me->pos () ).y () > ( ( this->height () * 2 ) / 3 ) ) + { + scrollBy ( 10, 10 ); + } + + QScrollView::contentsMouseMoveEvent ( me ); + + +// KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + + if ( l.count () <= 0 ) + return; + + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( *it == 0 ) + return; + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->mouseMoveEvent ( me ); + if ( m_currentItem != NULL ) + { + if ( !m_currentItem->isSelected () ) + m_currentItem->setCurrent ( false ); + } + m_currentItem = t; + t->setCurrent ( true ); + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::contentsMousePressEvent ( QMouseEvent * me ) +{ + if ( me->button () == RightButton ) + return; + + clearAll (); + + this->setCursor ( QCursor ( Qt::WaitCursor ) ); + + KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + + if ( t->type () != KbfxPlasmaCanvasItem::SEPARATOR ) + { + t->mousePressEvent ( me ); + m_selectedItem = t; + t->setSelected ( true ); + emit clicked ( t ); + } + + if ( t->type () == KbfxPlasmaCanvasItem::SEPARATOR ) + tmp = KbfxPlasmaCanvasGroup::groupContaining ( t ); +// groupContaining ((KbfxPlasmaCanvasItem *) l.first ()); + } + } + if ( tmp != 0 ) + tmp->shade (); + +// m_clickPos = me->pos (); + + QScrollView::contentsMousePressEvent ( me ); + + canvas ()->update (); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); +} + +void +KbfxPlasmaIndexView::slotClicked ( KbfxPlasmaIndexItem * it ) +{ + if ( it == NULL ) + return; + + KbfxPlasmaIndexItem *_it = ( KbfxPlasmaIndexItem * ) it; + + KbfxSignal signal ( _it->belongsTo (), _it->Id () ); + + this->setCursor ( QCursor ( Qt::WaitCursor ) ); + emit loadRequest ( signal ); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); +} + +void +KbfxPlasmaIndexView::clearAll () +{ + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setSelected ( false ); + } + } + + canvas ()->update (); +} + + +#include "kbfxplasmaindexview.moc" diff --git a/src/kbfxplasmaindexview.h b/src/kbfxplasmaindexview.h new file mode 100644 index 0000000..ebda368 --- /dev/null +++ b/src/kbfxplasmaindexview.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_PLASMA_INDEX_VIEW_H +#define KBFX_PLASMA_INDEX_VIEW_H + +#include <qcanvas.h> + +#include <kdebug.h> +#include <kpopupmenu.h> + +#include <kbfxdatastack.h> +#include <kbfxplasmapixmapprovider.h> +#include <kbfxplasmapluginloader.h> + +#include "kbfxplasmacanvasitemwrapper.h" +#include "kbfxplasmacanvasstack.h" +#include "kbfxplasmacanvasview.h" +#include "kbfxplasmaindexitem.h" +#include "kbfxsignal.h" + + + +class KbfxPlasmaIndexView : public QCanvasView +{ + + Q_OBJECT + + public: + + KbfxPlasmaIndexView ( QWidget * parent = 0, const char * name = 0, WFlags l = 0 ); + virtual ~KbfxPlasmaIndexView(); + void loadList ( KbfxDataStack * stkPtr ); + int count() { return m_itemGroup->count() ; } + void setView ( KbfxPlasmaCanvasView * view ); + virtual void contentsMouseMoveEvent ( QMouseEvent * e ); + virtual void contentsMousePressEvent ( QMouseEvent * me ); + virtual void contentsContextMenuEvent ( QContextMenuEvent * e ) ; + virtual void mouseMoveEvent ( QMouseEvent * e ); + virtual void leaveEvent ( QEvent * e ); + void setKbfxCanvas ( QCanvas * cnv ); + void clearAll(); + + public slots: + void slotClicked ( KbfxPlasmaIndexItem * ); + void contextMenuSlot ( int id ); + void loadPlugin ( QString name,KbfxPlasmaCanvasView * ); + void checkMousePos(); + void clearSelection(); + + signals: + void loadRequest ( KbfxSignal signal ); + void pluginRequest ( QString pluginName,KbfxPlasmaCanvasView * ); + void clicked ( KbfxPlasmaIndexItem * item ); + void expand(); + void clearSelected(); + + protected: + void clearAllButOne ( KbfxPlasmaIndexItem * i ); + + private: + + KbfxPlasmaCanvasGroup * m_itemGroup; + KbfxPlasmaCanvasGroupView * m_itemGroupList; + KbfxPlasmaCanvasStack * m_itemStack; + KbfxPlasmaIndexItem * m_currentItem; + KbfxPlasmaIndexItem * m_selectedItem; + QStringList m_pluginList; + QStringList m_pluginLoaded; + KPopupMenu * m_pluginMenu; + KbfxPlasmaCanvasView * m_currentView; + QPoint m_currentPos; + QTimer * m_mousePollTimer; +}; + +#endif diff --git a/src/kbfxsignal.h b/src/kbfxsignal.h new file mode 100644 index 0000000..6f2dfd0 --- /dev/null +++ b/src/kbfxsignal.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SIGNAL_H +#define KBFX_SIGNAL_H + +class KbfxSignal +{ + public: + KbfxSignal() {m_name="";} + KbfxSignal ( QString name,uint id ) { m_name = name;m_id = id;} + ~KbfxSignal() {} + QString name() {return m_name;} + uint id() {return m_id;} + private: + QString m_name; + uint m_id; +}; + +#endif diff --git a/src/kbfxspinx.cpp b/src/kbfxspinx.cpp new file mode 100644 index 0000000..4208b21 --- /dev/null +++ b/src/kbfxspinx.cpp @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <config.h> + +#include "kbfxspinx.h" + +bool KbfxSpinx::m_horizontal_position = TRUE; + +KbfxSpinx::KbfxSpinx ( const QString& configFile, Type type, int actions, QWidget *parent, const char *name ) + : KPanelApplet ( configFile, type, actions, parent, name ),DCOPObject ( "KBFXInterface" ) +{ + m_parent = parent; + createKbfx(); +} + +KbfxSpinx::~KbfxSpinx() +{ +} + +void KbfxSpinx::dirtyReaload(const QString & dir) +{ + QString _dir=dir; + notifyConfigChange(); +} + +void KbfxSpinx::createKbfx() +{ + m_menu = 0; // Set to NULL + m_tooltip = ConfigInit().m_ToolTip; + m_kicker_auto_adjust = ConfigInit().m_ToolBarResize; + m_KbfxWatcher = ConfigInit().m_KbfxWatcher; + m_dcopClient = new DCOPClient (); + m_dcopClient->attach (); + + kbfxBtn = new KbfxButton ( this,"Kbfx Button" ); + if ( ConfigInit ().m_KbfxMenuType == "kmenu" ) + { + kbfxBtn->show(); + kbfxBtn->repaint(); + } + else + { + createRMenu(); + connect ( m_menu,SIGNAL ( aboutToHide () ),kbfxBtn,SLOT ( toggle() ) ); + } + + kmenu_timer = new QTimer ( this,"Fade Timer" ); + connect ( kmenu_timer, SIGNAL ( timeout() ), kbfxBtn, SLOT ( toggleKMenu () ) ); + + connect ( kbfxBtn , SIGNAL ( pressed() ),this,SLOT ( showKbfxMenu() ) ); + connect ( kbfxBtn , SIGNAL ( showToolTip() ),this,SLOT ( ToolTip() ) ); + + if ( m_kicker_auto_adjust ) + m_parent->resize ( m_parent->width(),kbfxBtn->height() ); + resizeRequest(); + + if (m_KbfxWatcher) + { + l_watch = new KDirWatch(this,"SyscocaWatch"); + KUser * l_user = new KUser(); + QString l_path("/var/tmp/kdecache-"); + l_path.append(l_user->loginName()); + l_path.append("/"); + l_watch->addDir(l_path); + l_watch->startScan( TRUE, FALSE); + connect ( l_watch, SIGNAL ( dirty(const QString&) ), + this, SLOT ( dirtyReaload(const QString&) ) ); + delete l_user; + } +} + +void KbfxSpinx::notifyConfigChange() +{ + kdDebug() << "Got DCOP Call notifyConfigChange" + << endl; +/* + FIXME + The delete here does not reload everything. + Only the button and the parent menu. + Carefull memory de-allocation is needed before deleteing further :-( + Else be ready for a nice backtrace. + Memleak is obvious. +*/ + +/* + bool _KbfxButton_m_sizeHeight = KbfxButton::m_sizeHeight; + int _KbfxButton_m_size = KbfxButton::m_size; + + zap ( l_watch ); + zap ( kmenu_timer ); + zap ( kbfxBtn ); + zap ( m_menu ); + zap ( m_dcopClient ); + ConfigInit().read(); + KbfxPlasmaPixmapProvider::rebuildCache(); + createKbfx(); + + KbfxButton::m_sizeHeight = _KbfxButton_m_sizeHeight; + KbfxButton::m_size = _KbfxButton_m_size; + kbfxBtn->loadSkins(); +*/ + + kbfxBtn -> reloadConfig(); +} + +void KbfxSpinx::createRMenu() +{ + m_menu = new KbfxSpinxPopUp ( this,"KbfxOpop" ); + m_menuWidget = new KbfxSpinxMenuWidget ( m_menu,"KbfxSpinxMenu" ); + m_menu->addItem ( m_menuWidget,0 ); + kbfxBtn->show(); + kbfxBtn->repaint(); + menuPosition(); +} + +void KbfxSpinx::showKbfxMenu() +{ + if ( ConfigInit ().m_KbfxMenuType == "kmenu" ) + { + showKmenu (); + } + else + { + m_menu->popup ( menuPosition() ); + } +} + +void KbfxSpinx::ToolTip () +{ + if ( !m_tooltip ) + return; + + KbfxToolTip *tooltip = new KbfxToolTip (); + + QPoint xpoint = ( this->mapToGlobal ( QPoint ( 0, 0 ) ) ); + int popx = xpoint.x (); + int popy = xpoint.y (); + + if ( position () == pTop ) + { + popy += this->height(); + } + if ( position () == pBottom ) + { + popy -= tooltip->height(); + } + if ( position () == pLeft ) + { + popx += this->width(); + } + if ( position () == pRight ) + { + popx -= tooltip->width(); + } + + connect ( kbfxBtn, SIGNAL ( leave () ), tooltip, SLOT ( hideToolTip () ) ); + connect ( kbfxBtn, SIGNAL ( clicked () ), tooltip, SLOT ( hideToolTip () ) ); + tooltip->setStartPos ( popx, popy ); + tooltip->show (); +} + +void KbfxSpinx::showKmenu() +{ + /* Import of old KBFX code */ + /** + Note that there is no real way to know the + height of the K-menu + **/ + + this->setCursor ( Qt::BlankCursor ); + + QByteArray data, rdata; + QDataStream arg ( data, IO_WriteOnly ); + QCString replytype; + QPoint _tmp ( QCursor::pos () ); + + if ( position () == pTop || position () == pBottom ) + { + if ( _tmp.y () > 128 ) + { + QCursor::setPos ( this->mapToGlobal ( QPoint ( 0, 0 ) ) ); + } + else + { + QCursor::setPos ( this->mapToGlobal ( this->geometry ().bottomLeft () ) ); + } + } + else + { + if ( _tmp.x () > 128 ) + { + QCursor::setPos ( this->mapToGlobal ( QPoint ( 0, 0 ) ) ); + } + else + { + QCursor::setPos ( this->mapToGlobal ( this->geometry ().topRight () ) ); + } + } + + arg << QPoint ( QCursor::pos () ); + + if ( !m_dcopClient-> + call ( "kicker", "kicker", "popupKMenu(QPoint)", data, replytype, rdata, + FALSE, -1 ) ) + { + kdWarning () + << "**KBFX-APPLET-FATAL_ERROR:Could not send DCOP command" + << endl; + } + + this->setCursor ( Qt::ArrowCursor ); + QCursor::setPos ( _tmp ); + if ( !kmenu_timer->isActive ()) + kmenu_timer->start(5000,true); + kdDebug () << "Kmenu Called" << endl; +} + +void KbfxSpinx::showMenu() +{ + showKbfxMenu(); +} + +void KbfxSpinx::about() +{ +// KMessageBox::information ( 0, i18n ( "This is an about box" ) ); + KRun::runCommand ( "kbfxconfigapp --about" ); +} + +void KbfxSpinx::help() +{ + kapp->invokeHelp ( "", "kbfxconfigapp" ); +} + +void KbfxSpinx::preferences() +{ + KRun::runCommand ( "kbfxconfigapp" ); +} + +int KbfxSpinx::widthForHeight ( int height ) const +{ + static int width_for_height = 0; + if ( width_for_height != height || !m_horizontal_position ) + { + if ( m_kicker_auto_adjust ) + kbfxBtn->readjust( TRUE ); // Readjust for height + KbfxButton::m_sizeHeight = TRUE; + KbfxButton::m_size = height; + kbfxBtn->loadSkins(); + width_for_height = height; + } + m_horizontal_position = TRUE; + return kbfxBtn->width(); +} + +int KbfxSpinx::heightForWidth ( int width ) const +{ + static int height_for_width = 0; + if ( height_for_width != width || m_horizontal_position) + { + if ( m_kicker_auto_adjust ) + kbfxBtn->readjust( FALSE ); // Readjust for width + KbfxButton::m_sizeHeight = FALSE; + KbfxButton::m_size = width; + kbfxBtn->loadSkins(); + height_for_width = width; + } + m_horizontal_position = FALSE; + return kbfxBtn->height(); +} + +QPoint KbfxSpinx::menuPosition() +{ + QPoint xpoint = ( this->mapToGlobal ( QPoint ( 0, 0 ) ) ); + int popx = xpoint.x (); + int popy = xpoint.y (); + + if ( position () == pTop ) + { + return QPoint ( popx, ( popy + this->height() ) ); + } + if ( position () == pBottom ) + { + return QPoint ( popx, ( popy - m_menuWidget->height() ) ); + } + if ( position () == pLeft ) + { + return QPoint ( ( popx + this->width() ), popy ); + } + if ( position () == pRight ) + { + return QPoint ( ( popx - m_menuWidget->width() ), popy ); + } + + return xpoint; // Should never be reached? +} + +extern "C" +{ + KPanelApplet* init ( QWidget *parent, const QString& configFile ) + { + KGlobal::locale()->insertCatalogue ( "KbfxSpinx" ); + return new KbfxSpinx ( configFile, KPanelApplet::Normal, + KPanelApplet::About | KPanelApplet::Help | KPanelApplet::Preferences, + parent, "KbfxSpinx" ); + } +} + +#include "kbfxspinx.moc" diff --git a/src/kbfxspinx.desktop b/src/kbfxspinx.desktop new file mode 100644 index 0000000..01153d6 --- /dev/null +++ b/src/kbfxspinx.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=KBFX Spinx +Comment=K-Menu Replacement +Comment[de]=K-Menü- Nachfolger +Comment[el]=Αντικαταστάτης του K-Μενού +Comment[et]=K-menüü asendus +Comment[fr]=Remplacement du menu K +Comment[nl]=K-Menu-vervanging +Comment[pt]=Substituto do Menu K +Comment[pt_BR]=Substituto do Menu K +Comment[sv]=Ersättning av K-menyn +Icon=kbfx +X-KDE-Library=libkbfxspinx +X-KDE-UniqueApplet=true + + diff --git a/src/kbfxspinx.h b/src/kbfxspinx.h new file mode 100644 index 0000000..3111cb2 --- /dev/null +++ b/src/kbfxspinx.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_H +#define KBFX_SPINX_H + +#define zap(x) if(x){delete(x); x=0;} + +#include <config.h> + +#include <qbitmap.h> +#include <qlabel.h> +#include <qlcdnumber.h> +#include <qpoint.h> +#include <qpopupmenu.h> +#include <qstring.h> +#include <qtimer.h> + +#include <dcopclient.h> +#include <dcopobject.h> +#include <dcopref.h> +#include <kapplication.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kdirwatch.h> +#include <kglobal.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kpanelapplet.h> +#include <kpopupmenu.h> +#include <krun.h> +#include <kuser.h> + +#include <kbfxconfig.h> +#include <kbfxplasmapixmapprovider.h> + +#include "kbfxbutton.h" +#include "kbfxspinxmenu.h" +#include "kbfxspinxpopup.h" +#include "kbfxspinxview.h" +#include "kbfxtooltip.h" + + +class KbfxSpinx : public KPanelApplet,public DCOPObject +{ + K_DCOP + Q_OBJECT + + public: + KbfxSpinx ( const QString& configFile, Type t = Normal, int actions = 0, + QWidget *parent = 0, const char *name = 0 ); + + ~KbfxSpinx(); + virtual int widthForHeight ( int height ) const; + virtual int heightForWidth ( int width ) const; + virtual void about(); + virtual void help(); + virtual void preferences(); + QPoint menuPosition(); + void resizeRequest() { emit(updateLayout()); } + k_dcop: + ASYNC showMenu(); + ASYNC notifyConfigChange(); + + public slots: + void showKbfxMenu(); + void showKmenu(); + void ToolTip(); + void dirtyReaload(const QString&); + + protected: + void createRMenu(); + void createKbfx(); + bool m_tooltip; + + private: + KConfig *ksConfig; + KbfxButton * kbfxBtn; + KbfxSpinxMenuWidget * m_menuWidget; + KbfxSpinxPopUp * m_menu; + QWidget * m_parent; + bool m_kicker_auto_adjust; + bool m_KbfxWatcher; + static bool m_horizontal_position; + DCOPClient * m_dcopClient; + QTimer * kmenu_timer; + KDirWatch * l_watch; +}; + +#endif diff --git a/src/kbfxspinxmenu.cpp b/src/kbfxspinxmenu.cpp new file mode 100644 index 0000000..0d016ac --- /dev/null +++ b/src/kbfxspinxmenu.cpp @@ -0,0 +1,513 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxmenu.h" + +KbfxSpinxMenuWidget::KbfxSpinxMenuWidget ( QWidget * parent, const char *name, + WFlags fl ) : + QWidget ( parent, "MenuWidget", + fl | Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_StaysOnTop ) +{ + m_parent = parent; + QString _name=name; + init(); + +} + +void +KbfxSpinxMenuWidget::reinit() +{ + emit refresh(); + init(); + +} + +void +KbfxSpinxMenuWidget::init() +{ + createMask (); + + QWidget *main = new QWidget ( this ); + + m_kbfxSpinxTop = new KbfxSpinxTop ( main ); + m_toolBarBot = new KbfxSpinxToolBar ( main ); + m_toolBarBot->setMinimumHeight ( ConfigInit ().m_botBar_h ); + m_toolBarBot->setMaximumHeight ( ConfigInit ().m_botBar_h ); + m_kbfxSpinxTop->setMaximumHeight ( ConfigInit ().m_topBar_h ); + m_kbfxSpinxTop->setMinimumHeight ( ConfigInit ().m_topBar_h ); + + QWidget *middle = new QWidget ( main ); + + middle->setPalette ( QPalette ( QColor ( 24, 233, 233 ) ) ); + +// m_middleFrame = new QHBoxLayout(middle); + + m_canvasView = new KbfxPlasmaCanvasView ( this ); + m_indexView = new KbfxPlasmaIndexView ( this ); + m_indexLeftView = new KbfxPlasmaIndexView ( this ); + + /* Search Box */ + m_searchTag = new KbfxPixmapLabel ( this, "Search:" ); + QToolTip::add( m_searchTag, tr2i18n( "Double click to clear..." ) ); + m_searchTag->normalize (); + m_searchTag->move ( ConfigInit ().m_searchBox_x, + ConfigInit ().m_searchBox_y ); + + QPixmap m_searchPixmap = ( *KbfxPlasmaPixmapProvider::pixmap ( "find" ) ); + + m_searchTag->setPixmap ( m_searchPixmap ); + + m_searchTag->resize ( m_searchPixmap.width (), ConfigInit ().m_searchBox_h ); + + m_search = new QLineEdit ( this, "Search BOX" ); + QToolTip::add( m_search, tr2i18n( "Type here to search..." ) ); + m_search->setFrameShape ( QFrame::NoFrame ); + m_search->setFocusPolicy ( QWidget::StrongFocus ); + m_search->move ( ConfigInit ().m_searchBox_x + m_searchTag->width (), + ConfigInit ().m_searchBox_y ); + m_search->resize ( ConfigInit ().m_searchBox_w - m_searchTag->width (), + ConfigInit ().m_searchBox_h ); + + connect (m_searchTag, SIGNAL (mouseDoubleClicked ( const ButtonState & )), this, + SLOT (search_clear ( const ButtonState & ))); + + int frameHeight = ConfigInit().m_listBox_h; + + if (frameHeight <= (this->height () - ( m_kbfxSpinxTop->height () + m_toolBarBot->height ()) ) ) { + frameHeight = (this->height () - ( m_kbfxSpinxTop->height () + + m_toolBarBot->height ()) ); + } + +// m_middleFrame->addWidget(middleleft); + m_canvasView->setMaximumHeight ( ConfigInit().m_itemView_h ); + m_canvasView->setMinimumHeight ( ConfigInit().m_itemView_h ); + m_canvasView->setMaximumWidth ( ConfigInit ().m_itemView_w ); + m_canvasView->setMinimumWidth ( ConfigInit ().m_itemView_w ); + m_appCanvas = new QCanvas ( m_canvasView->width (), m_canvasView->height () ); + m_canvasView->setKbfxCanvas ( m_appCanvas ); + m_appCanvas->setDoubleBuffering ( true ); + + m_indexView->setMaximumHeight ( frameHeight ); + m_indexView->setMinimumHeight ( frameHeight ); + m_indexView->setMaximumWidth ( ConfigInit ().m_listBox_w ); + m_indexView->setMinimumWidth ( ConfigInit ().m_listBox_w ); + m_indexCanvas = new QCanvas ( m_indexView->width (), m_indexView->height () ); + m_indexView->setKbfxCanvas ( m_indexCanvas ); + m_indexCanvas->setDoubleBuffering ( true ); + m_indexView->setView ( m_canvasView ); + + m_indexLeftView->setMaximumHeight ( frameHeight ); + m_indexLeftView->setMinimumHeight ( frameHeight ); + m_indexLeftView->setMaximumWidth ( ConfigInit ().m_listBox_w ); + m_indexLeftView->setMinimumWidth ( ConfigInit ().m_listBox_w ); + m_indexLeftCanvas = + new QCanvas ( m_indexLeftView->width (), m_indexLeftView->height () ); + m_indexLeftView->setKbfxCanvas ( m_indexLeftCanvas ); + m_indexLeftCanvas->setDoubleBuffering ( true ); + m_indexLeftView->setView ( m_canvasView ); + + + m_canvasView->move ( ConfigInit ().m_itemView_x, ConfigInit ().m_itemView_y ); + m_indexView->move ( ConfigInit ().m_listBox_x, ConfigInit ().m_listBox_y ); + m_indexLeftView->move ( ConfigInit ().m_listBox_w + ConfigInit ().m_itemView_w, + ConfigInit ().m_listBox_y ); + + m_fixedFrame = new QVBoxLayout ( main ); + m_fixedFrame->setResizeMode ( QLayout::Minimum ); + m_fixedFrame->addWidget ( m_kbfxSpinxTop ); + m_fixedFrame->addWidget ( middle ); + m_fixedFrame->addWidget ( m_toolBarBot ); + + m_loadedListLeft = " "; + m_loadedListRight = " "; + + main->resize ( this->size () ); + + loadHistory (); + + connect ( m_indexView, SIGNAL ( loadRequest ( KbfxSignal ) ), m_canvasView, + SLOT ( handleLoadRequest ( KbfxSignal ) ) ); + + connect ( m_indexLeftView, SIGNAL ( loadRequest ( KbfxSignal ) ), m_canvasView, + SLOT ( handleLoadRequest ( KbfxSignal ) ) ); + + connect ( m_canvasView, SIGNAL ( clicked () ), this, SLOT ( hideMenu () ) ); + + connect ( m_search, SIGNAL ( textChanged ( const QString & ) ), m_canvasView, + SLOT ( search ( const QString & ) ) ); + + connect ( m_indexView, + SIGNAL ( pluginRequest ( QString, KbfxPlasmaCanvasView * ) ), + m_indexView, SLOT ( loadPlugin ( QString, KbfxPlasmaCanvasView * ) ) ); + + connect ( m_indexLeftView, + SIGNAL ( pluginRequest ( QString, KbfxPlasmaCanvasView * ) ), + m_indexLeftView, + SLOT ( loadPlugin ( QString, KbfxPlasmaCanvasView * ) ) ); + + connect ( m_indexView, + SIGNAL ( clearSelected() ), + m_indexLeftView, SLOT ( clearSelection() ) ); + + connect ( m_indexLeftView, + SIGNAL ( clearSelected() ), + m_indexView, + SLOT ( clearSelection() ) ); + + connect (this,SIGNAL(refresh()),m_canvasView,SLOT(reload())); + connect (this,SIGNAL(runItem()),m_canvasView,SLOT(execFirst())); + + KbfxSpinxToolButton *logout = new KbfxSpinxToolButton ( m_toolBarBot ); + KbfxSpinxToolButton *lock = new KbfxSpinxToolButton ( m_toolBarBot ); + + lock ->setPixmaps ( ( *KbfxPlasmaPixmapProvider::pixmap ( "lock" ) ), + ( *KbfxPlasmaPixmapProvider::pixmap ( "lockhover" ) ) ); + + logout ->setPixmaps ( ( *KbfxPlasmaPixmapProvider::pixmap ( "logout" ) ), + ( *KbfxPlasmaPixmapProvider::pixmap ( "logouthover" ) ) ); + + KbfxDataSource *logoutSrc = new KbfxDataSource (); + logoutSrc->setCommand ( "dcop kdesktop KDesktopIface logout" ); + logoutSrc->setName ( "Logout" ); + + KbfxDataSource *lockSrc = new KbfxDataSource (); + lockSrc->setCommand ( "dcop kdesktop KScreensaverIface lock" ); + lockSrc->setName ( "logout" ); + + logout->setDataSource ( logoutSrc ); + lock ->setDataSource ( lockSrc ); + + delete logoutSrc; + delete lockSrc; + m_toolBarBot->addButton ( logout ); + m_toolBarBot->addButton ( lock ); + + connect ( logout,SIGNAL ( clicked() ),this , SLOT ( hideMenu() ) ); + connect ( lock ,SIGNAL ( clicked() ),this , SLOT ( hideMenu() ) ); +} + + +KbfxSpinxMenuWidget::~KbfxSpinxMenuWidget () +{ +} + +void +KbfxSpinxMenuWidget::search_clear ( const ButtonState & _btn ) +{ + if ( _btn == Qt::LeftButton ) + { + /* Clear the search box */ + m_search->clear(); + /* Clear the search canvas */ + m_canvasView->clearAll (); + } +} + +/* +void +KbfxSpinxMenuWidget::changeHeight (int het) +{ + +} +*/ + +void +KbfxSpinxMenuWidget::createMask () +{ + QPixmap maskpng = ( *KbfxPlasmaPixmapProvider::pixmap ( "mask" ) ); + QImage rawimg = maskpng.convertToImage (); + + rawimg = + rawimg.smoothScale ( ConfigInit ().m_userMenuWidth, + ConfigInit ().m_userMenuHeight, + QImage::ScaleFree ); + + maskpng.convertFromImage ( rawimg ); + + setMinimumWidth ( maskpng.width () ); + setMinimumHeight ( maskpng.height () ); +// setMaximumWidth ( maskpng.width () ); +// setMaximumHeight ( maskpng.height () ); + if ( !maskpng.mask () ) + if ( rawimg.hasAlphaBuffer () ) + { + QBitmap bm; + bm = rawimg.createAlphaMask (); + maskpng.setMask ( bm ); + } + else + { + QBitmap bm; + bm = rawimg.createHeuristicMask (); + // maskpng.setMask ( bm ); + } + + if ( maskpng.mask () && m_parent ) + m_parent->setMask ( *maskpng.mask () ); +} + +void +KbfxSpinxMenuWidget::resizeContent () +{} + +void +KbfxSpinxMenuWidget::loadHistory () +{ + QStringList::Iterator it; + for ( it = ConfigInit ().m_pluginsLeft.begin (); + it != ConfigInit ().m_pluginsLeft.end (); ++it ) + { + if ( (*it) != NULL) + this->loadPluginLeft ( ( *it ) ); + } + for ( it = ConfigInit ().m_pluginsRight.begin (); + it != ConfigInit ().m_pluginsRight.end (); ++it ) + { + if ( (*it) != NULL) + this->loadPluginRight ( ( *it ) ); + } +} + +void +KbfxSpinxMenuWidget::enterPressed () +{ + kdDebug() << "TODO: Implement Enter Presed" << endl; +} + +/* +void +KbfxSpinxMenuWidget::propergateMove (QMouseEvent * me) +{ +} +*/ + +void +KbfxSpinxMenuWidget::hideMenu () +{ + emit nowHidden (); + m_parent->hide (); +} + +/* +void +KbfxSpinxMenuWidget::mouseMoveEvent (QMouseEvent * me) +{ +// m_listBox->setFocus(); +} +*/ + +void +KbfxSpinxMenuWidget::loadPluginLeft ( QString name ) +{ + if (name == NULL) { + return; + } + if ( m_loadedListLeft.contains ( name ) <= 0 ) + { + m_loader = new KbfxPlasmaPluginLoader (); + m_stack_R = m_loader->getView ( name ); + + if ( m_stack_R == NULL ) + return; + + m_canvasView->addStack ( m_stack_R, name ); + m_indexView->loadList ( m_stack_R ); + delete m_loader; + m_loadedListLeft += name; + return; + } + else + { + kdDebug() << "Plugin already loaded" << endl; + return; + } +} + +void +KbfxSpinxMenuWidget::loadPluginRight ( QString name ) +{ +if ( m_loadedListRight.contains ( name ) <= 0 ) + { + m_loader = new KbfxPlasmaPluginLoader (); + m_stack_R = m_loader->getView ( name ); + + if ( m_stack_R == NULL ) + return; + + m_canvasView->addStack ( m_stack_R, name ); + m_indexLeftView->loadList ( m_stack_R ); + delete m_loader; + m_loadedListRight += name; + return; + } + else + { + kdDebug() << "Plugin already loaded" << endl; + return; + } +} + +/* +void +KbfxSpinxMenuWidget::focusInEvent (QFocusEvent * te) +{ + kdDebug() << "TODO: Handle Focus Event" << endl; +} +*/ + +void +KbfxSpinxMenuWidget::keyPressEvent ( QKeyEvent * e ) +{ + if ( e->key () == Qt::Key_Backspace ) + { + m_search->backspace (); + return; + } + + else if ( e->key () == Qt::Key_Escape ) + { + hideMenu (); + return; + } + + else if ( e->key() == Qt::Key_Return ) + { + hideMenu (); + m_canvasView->setFocus (); + KRun::runCommand ( m_search->text ()); + return; + } + + else if ( e->key () == Qt::Key_Up ) + { + m_search->setFocus (); + return; + } + + else if ( e->key () == Qt::Key_Down ) + { + m_canvasView->setFocus (); + return; + } + + else if ( e->key () == Qt::Key_Control + || e->key () == Qt::Key_Alt + || e->key () == Qt::Key_Pause + || e->key () == Qt::Key_Print + || e->key () == Qt::Key_SysReq + || e->key () == Qt::Key_Meta + || e->key () == Qt::Key_CapsLock + || e->key () == Qt::Key_NumLock + || e->key () == Qt::Key_ScrollLock + || e->key () == Qt::Key_F1 + || e->key () == Qt::Key_F2 + || e->key () == Qt::Key_F3 + || e->key () == Qt::Key_F4 + || e->key () == Qt::Key_F5 + || e->key () == Qt::Key_F6 + || e->key () == Qt::Key_F7 + || e->key () == Qt::Key_F8 + || e->key () == Qt::Key_F9 + || e->key () == Qt::Key_F10 + || e->key () == Qt::Key_F11 + || e->key () == Qt::Key_F12 + || e->key () == Qt::Key_F13 + || e->key () == Qt::Key_F14 + || e->key () == Qt::Key_F15 + || e->key () == Qt::Key_F16 + || e->key () == Qt::Key_F17 + || e->key () == Qt::Key_F18 + || e->key () == Qt::Key_F19 + || e->key () == Qt::Key_F20 + || e->key () == Qt::Key_Super_L + || e->key () == Qt::Key_Super_R + || e->key () == Qt::Key_Menu + || e->key () == Qt::Key_Hyper_L + || e->key () == Qt::Key_Hyper_R + || e->key () == Qt::Key_Help + || e->key () == Qt::Key_Back + || e->key () == Qt::Key_Forward + || e->key () == Qt::Key_Stop + || e->key () == Qt::Key_Refresh + || e->key () == Qt::Key_VolumeDown + || e->key () == Qt::Key_VolumeMute + || e->key () == Qt::Key_VolumeUp + || e->key () == Qt::Key_BassBoost + || e->key () == Qt::Key_BassUp + || e->key () == Qt::Key_BassDown + || e->key () == Qt::Key_TrebleUp + || e->key () == Qt::Key_TrebleDown + || e->key () == Qt::Key_MediaPlay + || e->key () == Qt::Key_MediaStop + || e->key () == Qt::Key_MediaPrev + || e->key () == Qt::Key_MediaNext + || e->key () == Qt::Key_MediaRecord + || e->key () == Qt::Key_HomePage + || e->key () == Qt::Key_Favorites + || e->key () == Qt::Key_Search + || e->key () == Qt::Key_Standby + || e->key () == Qt::Key_OpenUrl + || e->key () == Qt::Key_LaunchMail + || e->key () == Qt::Key_LaunchMedia + ) + { + hideMenu (); + e->ignore(); + return; + } + +/* + else if ( e->key() == Qt::Key_Alt ) + { + hideMenu (); + m_canvasView->setFocus (); + emit runItem (); + return; + } + + + else if ( e->key () == Qt::Key_Tab ) + { +// m_listBox->setFocus (); + return; + } + + else if ( e->key () >= Qt::Key_0 && e->key () <= Qt::Key_9 ) + { + printf ( "%d \n", e->key () ); + emit runItemAt ( e->key () ); + return; + } + + else if ( e->key () == Qt::Key_Left ) + { + m_canvasView->setFocus (); + m_canvasView->emulatedKeyPress ( e ); + return; + } +*/ + + m_search->show (); + m_search->setText ( m_search->text () + e->text () ); + e->ignore(); +} + +#include "kbfxspinxmenu.moc" diff --git a/src/kbfxspinxmenu.h b/src/kbfxspinxmenu.h new file mode 100644 index 0000000..19986cc --- /dev/null +++ b/src/kbfxspinxmenu.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_MENU_WIDGET_H +#define KBFX_SPINX_MENU_WIDGET_H + +#include <qapplication.h> +#include <qbitmap.h> +#include <qcanvas.h> +#include <qframe.h> +#include <qhbox.h> +#include <qimage.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qpixmap.h> +#include <qstringlist.h> +#include <qvbox.h> +#include <qwidget.h> + +#include <kdebug.h> +#include <klocale.h> + +//#include <kbfxdatasource.h> +#include <kbfxconfig.h> +#include <kbfxdatastack.h> +#include <kbfxpixmaplabel.h> +#include <kbfxplasmapixmapprovider.h> +#include <kbfxplasmapluginloader.h> + +//#include "kbfxplasmalistview.h" +//#include "kbfxplasmalistbox.h" +#include "kbfxplasmacanvasgroup.h" +#include "kbfxplasmacanvasview.h" +#include "kbfxplasmaindexview.h" +#include "kbfxsignal.h" +#include "kbfxspinxscrollbar.h" +#include "kbfxspinxtoolbar.h" +#include "kbfxspinxtoolbutton.h" +#include "kbfxspinxtop.h" +#include "kbfxspinxview.h" + + +class KbfxSpinxMenuWidget:public QWidget +{ + Q_OBJECT + public : + KbfxSpinxMenuWidget ( QWidget * parent = 0, const char * name = 0,WFlags fl =0 ); + virtual ~KbfxSpinxMenuWidget(); +// virtual void mouseMoveEvent(QMouseEvent * me); +// virtual void focusInEvent ( QFocusEvent * ) ; + virtual void keyPressEvent ( QKeyEvent * e ) ; + void grabEvent ( QKeyEvent * e ) { keyPressEvent ( e );} + void loadHistory(); + void resizeContent(); + void reinit(); + public slots: + void hideMenu(); +// void propergateMove(QMouseEvent * me); + void loadPluginLeft ( QString name ); + void loadPluginRight ( QString name ); + void enterPressed(); + void search_clear ( const ButtonState & ); +// void changeHeight(int h); + signals: + void nowHidden(); + void runItem(); + void runItemAt ( int i ); + void leads(); + void refresh(); + + private: + void init(); + QPoint menuPosition(); + void createMask(); + KbfxPlasmaCanvasView * m_canvasView; +// KbfxPlasmaCanvasView * m_indexView; + QCanvas * m_canvas ; +// KbfxPlasmaListBox * m_listBox; + KbfxPlasmaPluginLoader * m_loader; + KbfxSpinxTop * m_menuTop; + QString m_loadedListLeft; + QString m_loadedListRight; +// FIXME: canvasstack is depricated Interface + KbfxPlasmaCanvasStack * m_stack; + KbfxDataStack * m_stack_R; + QWidget * m_parent; + QLineEdit * m_search; + KbfxPixmapLabel * m_searchTag; + KbfxSpinxToolBar * m_toolBarBot; + KbfxSpinxToolBar * m_toolBarSide; + int m_h; + +/* SUPER NEW LAYOUT FIX HERE */ + + QBoxLayout * m_fixedFrame; + QBoxLayout * m_middleFrame; + QCanvas * m_appCanvas; + QCanvas * m_indexCanvas; + QCanvas * m_indexLeftCanvas; + + KbfxPlasmaIndexView * m_indexView; + + KbfxPlasmaIndexView * m_indexLeftView; + KbfxSpinxTop * m_kbfxSpinxTop; +}; + +#endif diff --git a/src/kbfxspinxpopup.cpp b/src/kbfxspinxpopup.cpp new file mode 100644 index 0000000..2270eb8 --- /dev/null +++ b/src/kbfxspinxpopup.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// +// C++ Implementation: kbfxspinxpopup +// +// Description: +// +// +// Author: Siraj Razick <sirajr@gmail.com>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "kbfxspinxpopup.h" + +KbfxSpinxPopUp::KbfxSpinxPopUp ( QWidget * parent, const char * name ) :QPopupMenu ( parent,name ) +{ + m_mainItem = 0L; +} + + +KbfxSpinxPopUp::~KbfxSpinxPopUp() +{ +} + +void +KbfxSpinxPopUp::keyPressEvent ( QKeyEvent * e ) +{ +/* + if ( e->key() == Qt::Key_Tab ) + { + return ; + } + if ( e->key() == Qt::Key_Up ) + { + m_mainItem->grabEvent ( e ); +// e->ignore(); + return ; + } +*/ + m_mainItem->grabEvent ( e ); +} + +void +KbfxSpinxPopUp::addItem ( QWidget * item,int index ) +{ + m_mainItem = ( KbfxSpinxMenuWidget* ) item; + this->insertItem ( item,index ); + +} +#include "kbfxspinxpopup.moc" diff --git a/src/kbfxspinxpopup.h b/src/kbfxspinxpopup.h new file mode 100644 index 0000000..882d665 --- /dev/null +++ b/src/kbfxspinxpopup.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// +// C++ Interface: kbfxspinxpopup +// +// Description: +// +// +// Author: Siraj Razick <sirajr@gmail.com>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#ifndef KBFX_SPINX_POP_UP_H +#define KBFX_SPINX_POP_UP_H + +#include <qpopupmenu.h> +#include "kbfxspinxmenu.h" + + + +/** + @author Siraj Razick <sirajr@gmail.com> +*/ +class KbfxSpinxPopUp : public QPopupMenu +{ + Q_OBJECT + + public: + KbfxSpinxPopUp ( QWidget * parent = 0, const char * name = 0 ) ; + + ~KbfxSpinxPopUp(); + virtual void keyPressEvent ( QKeyEvent * ke ); + void addItem ( QWidget * item,int index ); + private: + KbfxSpinxMenuWidget * m_mainItem; +}; + +#endif diff --git a/src/kbfxspinxscrollbar.cpp b/src/kbfxspinxscrollbar.cpp new file mode 100644 index 0000000..6fcff50 --- /dev/null +++ b/src/kbfxspinxscrollbar.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxscrollbar.h" + +KbfxSpinxScrollBar::KbfxSpinxScrollBar ( QWidget * parent, const char *name, int type ) : + QWidget ( parent, name ) +{ + if (type == 0){ + m_normal = ( *KbfxPlasmaPixmapProvider::pixmap ( "scrollnormal" ) ); + } else { + m_normal = ( *KbfxPlasmaPixmapProvider::pixmap ( "scrollnormalbot" ) ); + } + QImage _tmp_img = m_normal.convertToImage(); + _tmp_img = _tmp_img.smoothScale ( ConfigInit().m_itemView_w, m_normal.height (),QImage::ScaleFree ); + m_normal = QPixmap ( _tmp_img ); + + this->resize ( m_normal.width (), m_normal.height () ); + + _x = this->x () /40; + _y = this->y (); + w = this->width () / 40; + h = this->height () / 2; + _x += ( this->width () - w ) / 2; + _y += ( this->height () - h ) / 2; + m_triAngle = QPointArray ( 3 ); + m_dir = DOWN; + m_timer = new QTimer ( this,"ScrollTimer" ); + connect ( m_timer,SIGNAL ( timeout() ),this,SLOT ( timeoutslot() ) ); + m_pressed = false; + +} + +KbfxSpinxScrollBar::~KbfxSpinxScrollBar () +{} + +void +KbfxSpinxScrollBar::paintEvent ( QPaintEvent * pe ) +{ + QRect r = pe->rect(); + QPainter p; + p.begin ( this ); + p.drawPixmap ( QRect ( 0, 0, m_normal.width (), m_normal.height () ), + m_normal ); + p.setPen ( QColor ( 255,255,255 ) ); + if ( m_pressed == false ) + p.setBrush ( QColor ( 255,255,255 ) ); + else + p.setBrush ( QColor ( 0,0,0 ) ); + + p.drawPolygon ( m_triAngle ); + p.end (); + +} + +void +KbfxSpinxScrollBar::setType ( Direction dir ) +{ + if ( dir == DOWN ) + { + m_triAngle.setPoint ( 0, _x, _y ); + m_triAngle.setPoint ( 1, _x + w, _y ); + m_triAngle.setPoint ( 2, _x + w / 2, _y + h ); + + } + else if ( dir == UP ) + { + m_triAngle.setPoint ( 0, _x, _y + h ); + m_triAngle.setPoint ( 1, _x + w, _y + h ); + m_triAngle.setPoint ( 2, _x + w / 2, _y ); + } + m_dir = dir; +} + + +void +KbfxSpinxScrollBar::mousePressEvent ( QMouseEvent * me ) +{ + me = me; + m_pressed = true; + m_timer->start ( 50,false ); + update(); +} + +void +KbfxSpinxScrollBar::mouseReleaseEvent ( QMouseEvent * me ) +{ + me = me; + m_pressed = false; + m_timer->stop(); + update(); +} + + +void +KbfxSpinxScrollBar::enterEvent ( QEvent * e ) +{ + e = e; + m_pressed = true; + m_timer->start ( 50,false ); + update(); +} + +void +KbfxSpinxScrollBar::leaveEvent ( QEvent *e ) +{ + e =e ; + m_pressed = false; + m_timer->stop(); + update(); + +} + + +void +KbfxSpinxScrollBar::timeoutslot() +{ + if ( m_dir == DOWN ) + emit scroll ( 0,20 ); + else if ( m_dir == UP ) + emit scroll ( 0,-20 ); +} + +#include "kbfxspinxscrollbar.moc" diff --git a/src/kbfxspinxscrollbar.h b/src/kbfxspinxscrollbar.h new file mode 100644 index 0000000..c159bc3 --- /dev/null +++ b/src/kbfxspinxscrollbar.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_SCROLL_BAR_H +#define KBFX_SPINX_SCROLL_BAR_H + +#include <qimage.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qpointarray.h> +#include <qtimer.h> +#include <qwidget.h> + +#include <kbfxplasmapixmapprovider.h> + + +class QWidget; + +class KbfxSpinxScrollBar:public QWidget +{ + + Q_OBJECT + public: + typedef enum {UP,DOWN,LEFT,RIGHT} Direction; + KbfxSpinxScrollBar ( QWidget * parent = 0,const char * name = 0,int type = 0 ); + ~KbfxSpinxScrollBar(); + virtual void paintEvent ( QPaintEvent * ev ); + virtual void mousePressEvent ( QMouseEvent * me ); + virtual void mouseReleaseEvent ( QMouseEvent * me ); + virtual void enterEvent ( QEvent * e ); + virtual void leaveEvent ( QEvent * e ); + void setType ( Direction dir ); + public slots: + void timeoutslot(); + + signals: + void scrollUp(); + void scrollDown(); + void scroll ( int , int ); + + private: + QPixmap m_normal; + QPixmap m_hover; + QPixmap m_presseod; + QPointArray m_triAngle; + Direction m_dir; + QTimer * m_timer; + bool m_pressed; + + + // + int _x; + int _y; + int w; + int h; +}; + +#endif diff --git a/src/kbfxspinxtoolbar.cpp b/src/kbfxspinxtoolbar.cpp new file mode 100644 index 0000000..8a35f15 --- /dev/null +++ b/src/kbfxspinxtoolbar.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxtoolbar.h" + +KbfxSpinxToolBar::KbfxSpinxToolBar ( QWidget * parent , const char * name , WFlags l ) :QWidget ( parent,name,l ) +{ + + _y = 0; + m_bg = ( *KbfxPlasmaPixmapProvider::pixmap ( "botbg" ) ); +// _x = m_bg.width(); + _x = ConfigInit().m_botBar_w; +} + + +KbfxSpinxToolBar::~KbfxSpinxToolBar() +{} + +void +KbfxSpinxToolBar::setSize ( QSize size ) +{ + this->resize ( size ); + _x = size.width(); + _y = size.height(); + +} + + +void KbfxSpinxToolBar::addButton ( KbfxSpinxToolButton * btn ) +{ +// KbfxSpinxToolButton * _btn = btn; + _x -= btn->width(); +// btn->resize(this->height()-10,this->height()-10); + btn->move ( _x, ( this->height()-btn->height() ) /4 ); + btn->show(); + btn->update(); +} + +void KbfxSpinxToolBar::paintEvent ( QPaintEvent * pe ) +{ + pe = pe ; + QPainter p; + p.begin ( this ); + p.drawPixmap ( QRect ( 0,0,ConfigInit().m_botBar_w,ConfigInit().m_botBar_h ),m_bg ); + p.end(); +} + + +#include "kbfxspinxtoolbar.moc" diff --git a/src/kbfxspinxtoolbar.h b/src/kbfxspinxtoolbar.h new file mode 100644 index 0000000..7ad8539 --- /dev/null +++ b/src/kbfxspinxtoolbar.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_TOOL_BAR_H +#define KBFX_SPINX_TOOL_BAR_H + +#include <qpainter.h> +#include <qpixmap.h> +#include <qstring.h> +#include <qwidget.h> + +#include <kbfxconfig.h> +#include <kbfxplasmapixmapprovider.h> + +#include "kbfxspinxtoolbutton.h" + +class KbfxSpinxToolBar:public QWidget +{ + + Q_OBJECT + public: + KbfxSpinxToolBar ( QWidget * parent = 0, const char * name = 0, WFlags f = 0 ); + virtual ~KbfxSpinxToolBar(); + virtual void paintEvent ( QPaintEvent * pe ); + + void addButton ( KbfxSpinxToolButton * btn ); + void setSize ( QSize s ); + + private: + int _x; + int _y; + int m_buttonWidth; + int m_buttonHeight; + QPixmap m_bg; + + +}; + +#endif diff --git a/src/kbfxspinxtoolbutton.cpp b/src/kbfxspinxtoolbutton.cpp new file mode 100644 index 0000000..3230e14 --- /dev/null +++ b/src/kbfxspinxtoolbutton.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxtoolbutton.h" + +KbfxSpinxToolButton::KbfxSpinxToolButton ( QWidget * parent , const char * name ) :QLabel ( parent,name,Qt::WStaticContents | Qt::WNoAutoErase |Qt::WPaintDesktop ) +{ + m_dataSource = 0; + m_dataGroup = 0; + m_fadeTime = ConfigInit().m_fadeTime; + + fade_timer = new QTimer ( this,"Fade Timer" ); + connect ( fade_timer,SIGNAL ( timeout() ),this,SLOT ( fade() ) ); +} + + +KbfxSpinxToolButton::~KbfxSpinxToolButton() +{} + +void KbfxSpinxToolButton::fade ( ) +{ + if ( m_fadeTime == 0 ) + { + m_current = m_fadePix; + } + else + { + QImage _final = m_fadePix.convertToImage (); + QImage _current = m_current.convertToImage (); + + if ( !fade_timer->isActive ()) + { + m_opacity = 0; + fade_timer->start( m_fadeTime, false); + } + if ( m_opacity > 0.9 ) + fade_timer->stop(); + m_opacity += 0.1; + + KImageEffect::blend ( _final, _current, m_opacity); + m_current = QPixmap ( _current ); + } + this->resize ( m_current.size() ); + this->update(); +} + +void +KbfxSpinxToolButton::enterEvent ( QEvent * e ) +{ + e = e; + m_fadePix = m_hover; + fade(); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); +} + +void +KbfxSpinxToolButton::leaveEvent ( QEvent * e ) +{ + e = e; + m_fadePix = m_normal; + fade(); + this->setCursor ( QCursor ( Qt::ArrowCursor ) ); +} + +void +KbfxSpinxToolButton::setPixmaps ( QPixmap normal, QPixmap hover ) +{ + QSize _sizeNormal = normal.size(); + QImage _tmpHover = hover.convertToImage (); + _tmpHover = _tmpHover.smoothScale ( _sizeNormal, QImage::ScaleFree ); + + m_normal = normal; + m_hover = QPixmap ( _tmpHover ); + m_current = m_normal; + + resize ( m_current.size () ); + this->repaint(); + this->update(); +} + + +void +KbfxSpinxToolButton::setDataSource ( KbfxDataSource * src ) +{ + m_name = src->name(); + m_icon = src->icon(); + m_exe = src->command(); + m_dataSource = new KbfxDataSource(); + *m_dataSource = *src; // copy + KIconLoader *iconload = KGlobal::iconLoader (); + QString m_iconPath = iconload->iconPath ( m_icon, KIcon::Desktop, false ); + m_iconPixmap = QPixmap ( m_iconPath ); +} + +void +KbfxSpinxToolButton::paintEvent ( QPaintEvent * e ) +{ + QRect r = e->rect(); + QPainter p; + QPixmap buffer ( m_current.size() ); + buffer.fill(); + p.begin ( this ); + p.setPen ( QColor ( 255,255,255 ) ); + p.drawPixmap ( QRect ( 0, 0, m_current.width(), m_current.height() ), m_current ); + p.end(); +} + + +void +KbfxSpinxToolButton::mouseReleaseEvent ( QMouseEvent * me ) +{ + me = me; + if ( m_dataSource == 0 ) + return; + else + KRun::runCommand ( m_dataSource->command() ); + + emit clicked(); +} + +#include "kbfxspinxtoolbutton.moc" diff --git a/src/kbfxspinxtoolbutton.h b/src/kbfxspinxtoolbutton.h new file mode 100644 index 0000000..2c3d9bf --- /dev/null +++ b/src/kbfxspinxtoolbutton.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_TOOL_BUTTON_H +#define KBFX_SPINX_TOOL_BUTTON_H + +#include <qcursor.h> +#include <qimage.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qtimer.h> +#include <qtoolbutton.h> +#include <qwidget.h> + +#include <kiconloader.h> +#include <kimageeffect.h> +#include <krun.h> + +#include <kbfxconfig.h> +#include <kbfxdatagroup.h> +#include <kbfxdatasource.h> +#include <kbfxplasmapixmapprovider.h> + +class KbfxSpinxToolButton:public QLabel +{ + + Q_OBJECT + public: + typedef enum{SINGLE=0,EXPANDABLE} ButtonType; + + KbfxSpinxToolButton ( QWidget * parent = 0, const char * name = 0 ); + virtual ~KbfxSpinxToolButton(); + virtual void paintEvent ( QPaintEvent * pe ); + + virtual void enterEvent ( QEvent * e ); + virtual void leaveEvent ( QEvent * l ); + virtual void mouseReleaseEvent ( QMouseEvent * me ); + /* + virtual void mousePressEvent(QMouseEvent * me); + */ + void setDataSource ( KbfxDataSource * src ); +// void setDataGroup(KbfxDataGroup * gsrc); + void setName ( QString name ) {m_name =name;} + void setExec ( QString cmd ) { m_exe = cmd;} + void setType ( KbfxSpinxToolButton::ButtonType type ) { m_type = type;} + void setIcon ( QString path ); + void setPixmaps ( QPixmap , QPixmap ); + + public slots: + void fade(); + + signals: + void clicked(); + private: + QString m_name; + QString m_exe; + QString m_icon; + QString m_tooltip; + + QPixmap m_normal; + QPixmap m_pressed; + QPixmap m_hover; + QPixmap m_current; + QPixmap m_iconPixmap; + KbfxDataSource * m_dataSource; + KbfxDataGroup * m_dataGroup; + ButtonType m_type; + bool m_statePressed; + QTimer * fade_timer; + float m_opacity; + QPixmap m_fadePix; + int m_fadeTime; +}; + +#endif diff --git a/src/kbfxspinxtop.cpp b/src/kbfxspinxtop.cpp new file mode 100644 index 0000000..617e884 --- /dev/null +++ b/src/kbfxspinxtop.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxtop.h" + +KbfxSpinxTop::KbfxSpinxTop ( QWidget * parent,const char * name ) :QWidget ( parent,name,Qt::WNoAutoErase | WStaticContents | Qt::WPaintClever | Qt::WNoAutoErase ) +{ + + m_background = ( *KbfxPlasmaPixmapProvider::pixmap ( "topbg" ) ); + m_currentTextBuffer = ""; + + this->resize ( ConfigInit().m_topBar_w,ConfigInit().m_topBar_h ); +// this->resize(m_background.size()); + loadFaceIcon(); + createDudeBox(); + m_userName=getUserName(); + +} + +KbfxSpinxTop::~KbfxSpinxTop() +{} + +void +KbfxSpinxTop::mousePressEvent ( QMouseEvent * e ) +{ + e = e; + emit sizeChange ( 10 ); +} + +void +KbfxSpinxTop::createDudeBox() +{ + m_dudeBox = ( *KbfxPlasmaPixmapProvider::pixmap ( "dudebox" ) ); +// int padding = ((m_dudeBox.height()-m_faceIcon.height()))/2; + + QPainter p; + p.begin ( &m_dudeBox ); +// p.drawPixmap(QRect(padding,padding,m_faceIcon.width(),m_faceIcon.height()),m_faceIcon); + p.drawPixmap ( QRect ( ConfigInit().m_faceIconX,ConfigInit().m_faceIconY,ConfigInit().m_faceIconW,ConfigInit().m_faceIconH ),m_faceIcon ); + p.end(); + +} + + +QString +KbfxSpinxTop::getUserName () +{ + KUser *user = new KUser (); + QString logInName ( user->fullName () ); +// Nookie says some might find it discriminating... We don't want that. + if ( logInName == "root" ) + logInName = QString ( "Administrator" ); + delete user; + return logInName.upper (); +} + + + +void +KbfxSpinxTop::loadFaceIcon() +{ + QImage UserImage ( ConfigInit().m_SpinxDudeImage ); + UserImage = UserImage.smoothScale ( 48, 48 ); + m_faceIcon = QPixmap ( UserImage ); +} + + +void +KbfxSpinxTop::paintEvent ( QPaintEvent * pe ) +{ + pe = pe; + QRect * r = new QRect ( 0,0,ConfigInit().m_topBar_w,ConfigInit().m_topBar_h ); + + m_pixmapbuff = new QPixmap(); + m_pixmapbuff->resize ( r->size() ); + m_pixmapbuff->fill ( this, r->topLeft() ); + + QPainter p; + p.begin ( m_pixmapbuff,this ); +// Draw commands are here + p.drawPixmap ( *r,m_background ); + p.setPen ( QColor ( ConfigInit().m_userNameColor ) ); + + p.drawPixmap ( QRect ( ConfigInit().m_facePos_x,ConfigInit().m_facePos_y,m_dudeBox.width(),m_dudeBox.height() ),m_dudeBox ); + if ( !ConfigInit().m_faceBoxHideText ) + { + QFont * _font = new QFont(ConfigInit().m_userNameFont); + p.setFont ( *_font ); +// p.setPen(QColor(199,187,206)); +// p.drawText(ConfigInit().m_userNamePos_x+1,ConfigInit().m_userNamePos_y+2,m_userName); + p.setPen ( QColor ( ConfigInit().m_userNameColor ) ); + p.drawText ( ConfigInit().m_userNamePos_x,ConfigInit().m_userNamePos_y,m_userName ); + delete _font; + } + p.end(); + + bitBlt ( this, r->x(), r->y(),m_pixmapbuff, 0, 0, + r->width(), r->height() ); + +// delete [] pe; + delete m_pixmapbuff; + delete r; +} + +#include "kbfxspinxtop.moc" diff --git a/src/kbfxspinxtop.h b/src/kbfxspinxtop.h new file mode 100644 index 0000000..b6cf811 --- /dev/null +++ b/src/kbfxspinxtop.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_TOP_H +#define KBFX_SPINX_TOP_H + +#include <qimage.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qwidget.h> + +#include <kiconloader.h> +#include <klineedit.h> +#include <kuser.h> + +#include <kbfxconfig.h> +#include <kbfxplasmapixmapprovider.h> + +class KbfxSpinxTop:public QWidget +{ + Q_OBJECT + + public: + KbfxSpinxTop ( QWidget * parent = 0,const char * name = 0 ); + virtual ~KbfxSpinxTop(); + + virtual void paintEvent ( QPaintEvent * ); + virtual void mousePressEvent ( QMouseEvent * e ) ; + + public slots: + + signals: + void textChanged ( QString ); + void sizeChange ( int ); + + private: + void loadFaceIcon(); + void createDudeBox(); + QString getUserName(); + + QPixmap m_background; + QPixmap * m_pixmapbuff; + QPixmap m_faceIcon; + QPixmap m_dudeBox; + QString m_currentTextBuffer; + QString m_userName; + QPixmap m_iconPixmap; + QTimer * m_fadeTimer; + + +}; + +#endif diff --git a/src/kbfxspinxview.cpp b/src/kbfxspinxview.cpp new file mode 100644 index 0000000..65c01bc --- /dev/null +++ b/src/kbfxspinxview.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxspinxview.h" + +KbfxSpinxView::KbfxSpinxView ( QWidget * parent , const char * name,WFlags flag ) :QFrame ( parent,name,flag ) +{ + setMinimumWidth ( 300 ); + setMinimumHeight ( 365 ); + setMouseTracking ( true ); +} + +KbfxSpinxView::~KbfxSpinxView() +{} + +#include "kbfxspinxview.moc" + diff --git a/src/kbfxspinxview.h b/src/kbfxspinxview.h new file mode 100644 index 0000000..42d1cb6 --- /dev/null +++ b/src/kbfxspinxview.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_SPINX_VIEW_H +#define KBFX_SPINX_VIEW_H + +#include <qframe.h> + +class KbfxSpinxView:public QFrame +{ + + Q_OBJECT + + public: + KbfxSpinxView ( QWidget * parent = 0, const char * name = 0, WFlags f = 0 ); + ~KbfxSpinxView(); + + public slots: + + private: +}; + +#endif diff --git a/src/kbfxtooltip.cpp b/src/kbfxtooltip.cpp new file mode 100644 index 0000000..bce755c --- /dev/null +++ b/src/kbfxtooltip.cpp @@ -0,0 +1,306 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include "kbfxtooltip.h" + +KbfxToolTip::KbfxToolTip ( QWidget * parent, const char *name, WFlags fl ) : + QWidget ( parent, name, + fl | WStyle_Customize | WRepaintNoErase | WStyle_NoBorder | + WDestructiveClose | Qt::WPaintDesktop | Qt::WType_Popup | Qt:: + WPaintClever | Qt::WNoAutoErase | Qt::WResizeNoErase | Qt:: + WStaticContents | Qt::WNoAutoErase ) +{ + _animate = ConfigInit ().m_ToolTipAnimation; + m_fontTooltipFont = ConfigInit ().m_fontTooltipFont; + + logo = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit().m_SpinxTooltipLogo ) ) ? + QImage ( ConfigInit().m_SpinxTooltipLogo ) + : QImage ( ConfigInit().m_SpinxTooltipLogoDefault ); + + tooltip_win = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_SpinxTooltipWindow ) ) ? + QImage ( ConfigInit ().m_SpinxTooltipWindow ) + : QImage ( ConfigInit ().m_SpinxTooltipWindowDefault ); + + tooltip_mask = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit().m_SpinxTooltipMask ) ) ? + QImage ( ConfigInit().m_SpinxTooltipMask ) + : QImage ( ConfigInit().m_SpinxTooltipMaskDefault ); + + dude_img = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_SpinxDudeImage ) ) ? + QImage ( ConfigInit ().m_SpinxDudeImage ) + : QImage ( ConfigInit ().m_SpinxDudeImageDefault ); + + setUserImage (); + setBoundBox (); + setBackground ( QPixmap () ); + setWindow ( QPixmap () ); + KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_ToolTipAvatar ) ? + setAnimationImage ( ConfigInit ().m_ToolTipAvatar ) + : setAnimationImage ( ConfigInit ().m_ToolTipAvatarDefault ); + + _hide_timer = new QTimer ( this ); + _update_timer = new QTimer ( this ); + _move_timer = new QTimer ( this ); + + connect ( _hide_timer, SIGNAL ( timeout () ), this, SLOT ( hide () ) ); + connect ( _hide_timer, SIGNAL ( timeout () ), _agent, SLOT ( hide () ) ); + connect ( _update_timer, SIGNAL ( timeout () ), this, SLOT ( logoMove () ) ); + + QCursor kbfxCursor; + kbfxCursor.setShape ( Qt::PointingHandCursor ); + this->setCursor ( ( const QCursor ) kbfxCursor ); +} + +KbfxToolTip::~KbfxToolTip () +{ + delete _hide_timer; + delete _move_timer; + delete _update_timer; + delete _window; + delete _agent; + delete _agent_anim; +} + +void +KbfxToolTip::setWindow ( QPixmap win ) +{ + QImage m_win_img; + + ( win.isNull () ) ? + m_win_img = tooltip_win + : m_win_img = win.convertToImage (); + + m_win_img = m_win_img.smoothScale ( _bg.width (), 13 ); +// _window = new QLabel (this, "", Qt::WStaticContents | Qt::WNoAutoErase); + _window = new QLabel ( this, "" ); + _window->resize ( _bg.width (), 13 ); + _window->setBackgroundPixmap ( m_win_img ); + if ( _animate ) + _window->show (); + else + _window->hide (); +} + +void +KbfxToolTip::setAnimationImage ( QString path ) +{ + /* + _agent = new QLabel (this, "", + Qt::WStaticContents | + Qt::WNoAutoErase | Qt::WPaintDesktop); + */ + _agent = new QLabel ( this,"" ); + _agent->resize ( 100, 100 ); + + _agent_anim = new QMovie ( path ); + QPixmap agent_mask = _agent_anim->framePixmap (); + _agent->setBackgroundPixmap ( agent_mask ); + if ( agent_mask.mask () ) + _agent->setMask ( *agent_mask.mask () ); + _agent->repaint (); + + /*FIXME:Need to remove Hard Coded Values */ + _agent->move ( 200, 0 ); + + if ( _animate ) + _agent->show (); + else + _agent->close (); +} + + +void +KbfxToolTip::setBackground ( QPixmap bg ) +{ + + ( bg.isNull () ) ? + _bg = tooltip_mask + : _bg = bg.convertToImage (); + + /* animation check : Auto streatch */ + if ( _animate ) + { + QImage m_tmp = _bg; + _bg = m_tmp.smoothScale ( _bg.width () + 100, _bg.height () ); + } + + this->setBackgroundPixmap ( _bg ); + + QPixmap m_tmp ( _bg ); + if ( m_tmp.mask () ) + this->setMask ( ( *m_tmp.mask () ) ); + this->resize ( _bg.width (), _bg.height () ); + _maxW = _bg.width (); +} + +void +KbfxToolTip::setStartPos ( int _x_, int _y_ ) +{ + _x = _x_; + _y = _y_; + _logo_move_x = 100; + if ( _animate ) + { + _logo_move_x = 0; + _hide_timer->start ( 10000, TRUE ); + _move_timer->start ( _agent_anim->speed (), FALSE ); + _update_timer->start ( 2, FALSE ); + } + + move ( _x, _y ); +} + +void +KbfxToolTip::logoMove () +{ + QPainter p; + + if ( _logo_move_x < _bg.width () - 68 ) + { + _logo_move_x += 1; + _window->repaint (); + + p.begin ( _window ); + p.drawPixmap ( QRect ( _logo_move_x, 0, logo.width (), logo.height () ), + QPixmap ( logo ) ); + p.end (); + } + else + { + p.begin ( _window ); + p.drawPixmap ( QRect ( _bg.width () - 68, 0, logo.width (), logo.height () ), + QPixmap ( logo ) ); + p.end (); + } + + QPixmap agent_mask = _agent_anim->framePixmap (); + _agent->setBackgroundPixmap ( agent_mask ); + if ( agent_mask.mask () ) + _agent->setMask ( *agent_mask.mask () ); + _agent->repaint (); +} + +void +KbfxToolTip::setAnimated ( bool b ) +{ + _animate = b; +} + + +void +KbfxToolTip::setLabelText ( QString str ) +{ + _label_text = str; +} + +void +KbfxToolTip::setHeadingText ( QString str ) +{ + _heading_text = str; +} + +void +KbfxToolTip::setVersionText ( QString str ) +{ + _version_text = str; +} + +void +KbfxToolTip::hideToolTip () +{ + _move_timer->stop (); + _hide_timer->stop (); + + _agent->close (); + this->hide (); + this->close (); +} + + +void +KbfxToolTip::setUserImage () +{ + QImage userimage = dude_img; + userimage = userimage.smoothScale ( 48, 48 ); + _dude = QPixmap ( userimage ); +} + +void +KbfxToolTip::setBoundBox () +{ + _dude_box = ( KbfxPlasmaPixmapProvider::PixmapPathCheck ( ConfigInit ().m_SpinxTooltipDudebox ) ) ? + QPixmap ( ConfigInit ().m_SpinxTooltipDudebox ) + : QPixmap ( ConfigInit ().m_SpinxTooltipDudeboxDefault ); +} + + +void +KbfxToolTip::paintEvent ( QPaintEvent * pe ) +{ + + const QRect r = pe->rect (); + QFont *let = new QFont (m_fontTooltipFont); + + QPainter p; + p.begin ( this ); + p.setBackgroundMode ( Qt::TransparentMode ); + p.drawPixmap ( QRect ( 7, 16, _dude_box.width (), _dude_box.height () ), + _dude_box ); + int _paddingX = ( ( _dude_box.height () - _dude.height () ) / 2 ) + 16; + p.drawPixmap ( QRect + ( _paddingX - ( 55 - 48 ), _paddingX, _dude.width (), + _dude.height () ), _dude ); + + if ( _animate ) + {} + else + { + + p.drawPixmap ( QRect ( 126, 0, logo.width (), logo.height () ), + QPixmap ( QImage (ConfigInit ().m_SpinxTooltipLogo ) ) ); + } + + let->setBold ( TRUE ); + let->setPointSize ( 10 ); + p.setFont ( *let ); + p.setPen ( QColor ( 61, 94, 129 ) ); + p.drawText ( _dude_box.width () + 15, 30, "KBFX" ); + + p.setPen ( QColor ( 0, 0, 0 ) ); + let->setBold ( FALSE ); + let->setPointSize ( 8 ); + p.setFont ( *let ); + p.drawText ( ( _animate ) ? _dude_box.width () + 50 : _dude_box.width () + 4, + _dude_box.height () + 30, QString ( "Version " ).append ( APPLICATION_VERSION ) ); + + p.setPen ( ConfigInit ().m_fontTooltipColor ); + let->setBold ( TRUE ); + let->setPointSize ( 8 ); + p.setFont ( *let ); + + + p.drawText ( _dude_box.width () + 15, 43, ConfigInit ().m_ToolTipText ); + p.end (); + delete let; +} + +#include "kbfxtooltip.moc" diff --git a/src/kbfxtooltip.h b/src/kbfxtooltip.h new file mode 100644 index 0000000..b358f5a --- /dev/null +++ b/src/kbfxtooltip.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * 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 Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KBFX_TOOL_TIP +#define KBFX_TOOL_TIP + +#include <qcursor.h> +#include <qimage.h> +#include <qlabel.h> +#include <qmovie.h> +#include <qpainter.h> +#include <qpixmap.h> +#include <qtimer.h> +#include <qwidget.h> + +#include <kdebug.h> +#include <kiconloader.h> +#include <kicontheme.h> +#include <kstandarddirs.h> +#include <ktip.h> +#include <kuser.h> + +#include <kbfxconfig.h> + +#include <kbfxplasmapixmapprovider.h> + +class KbfxToolTip:public QWidget +{ + + Q_OBJECT + public: + KbfxToolTip ( QWidget * parent=0,const char * name=0,WFlags fl=WType_TopLevel ); + ~KbfxToolTip(); + void setStartPos ( int x=0, int y=0 ); + virtual void paintEvent ( QPaintEvent *pe ); + void setBackground ( QPixmap bg ); + void setAnimationImage ( QString path ); + void setWindow ( QPixmap win ); + + public slots: + void hideToolTip(); + void logoMove(); + void setUserImage(); + void setBoundBox(); + void setAnimated ( bool ); + void setLabelText ( QString ); + void setHeadingText ( QString ); + void setVersionText ( QString ); + + private: + QTimer * _hide_timer; + QTimer * _move_timer; + QTimer * _update_timer; + int _x,_y; + int _maxW; + int _width; + int _height; + int _logo_move_x; + QPixmap _dude; + QPixmap _dude_box; + QImage _bg; + QLabel * _window; + QLabel * _agent; + QMovie * _agent_anim; + bool _animate; + QString _label_text; + QString _heading_text; + QString _version_text; + QFont m_fontTooltipFont; + QImage logo; + QImage tooltip_win; + QImage tooltip_mask; + QImage dude_img; +}; +#endif diff --git a/strigi-0.3.11.ebuild b/strigi-0.3.11.ebuild new file mode 100644 index 0000000..ab0dc51 --- /dev/null +++ b/strigi-0.3.11.ebuild @@ -0,0 +1,91 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: + +inherit eutils multilib + +DESCRIPTION="Fast crawling Desktop-Searchengine with (optional) QT4 GUI" +HOMEPAGE="http://www.vandenoever.info/software/strigi" +SRC_URI="http://www.vandenoever.info/software/${PN}/${P}.tar.bz2" + +LICENSE="GPL-2" + +SLOT="0" +KEYWORDS="~amd64 ~ppc ~x86" +IUSE="xercesc clucene hyperestraier sqlite3 xml xattr qt4 log dbus inotify" + +DEPEND=" + >=dev-util/cmake-2.4.2 + >=sys-libs/zlib-1.2.3 + >=app-arch/bzip2-1.0.3 + dev-libs/openssl + virtual/libiconv + dev-libs/expat + xercesc? ( >=dev-libs/xerces-c ) + clucene? ( >=dev-cpp/clucene-0.9.16 ) + hyperestraier? ( app-text/hyperestraier ) + sqlite3? ( =dev-db/sqlite-3* ) + xml? ( dev-libs/libxml2 ) + xattr? ( sys-apps/attr ) + qt4? ( >=x11-libs/qt-4.2.1-r1 ) + log? ( >=dev-libs/log4cxx-0.9.7 ) + dbus? ( sys-apps/dbus )" + # For most optional dependancies the use flags will be ignored, + # useage will be determined by the pressence of the library instead. + # This is a problem with the upstream build file. + +pkg_setup() { + + if !(use clucene) && !(use hyperestraier) && !(use sqlite3) ; then + echo "" + echo "ERROR:" + eerror "You must enable one of the supported backends: " + eerror "clucene, hyperestraier and sqlite3" + eerror "If you are unsure, select cluencene" + echo "" + die + fi + + if use dbus && use qt4 && !(built_with_use ">=x11-libs/qt-4.2.0" dbus); then + echo "" + echo "ERROR:" + eerror "You are building Stingi with qt4 and dbus, but qt4 wasn't built with dbus." + eerror "Please reemerge qt4 with dbus, or disable dbus in Stingi." + echo "" + die + fi + + if use qt4 && !(use dbus); then + echo "" + echo "WARNING:" + ewarn "You are building Stingi with qt4 but without dbus." + ewarn "Strigiclient won't be able to detect a running Strigi daemon." + ewarn "To avoid this, please enable both qt4 and dbus." + echo "" + fi + + # inotify still in development and unstable + if use inotify; then + echo "" + echo "WARNING:" + ewarn "Inotify support in stingi is still unstable" + ewarn "If you get problems, please rebuild stringi without inotify" + echo "" + fi +} + +src_compile() { + cmake \ + -DENABLE_INOTIFY:BOOL=$( use inotify && echo ON || echo OFF ) \ + -DENABLE_DBUS:BOOL=$( use dbus && echo ON || echo OFF ) \ + -DENABLE_LOG4CXX:BOOL=$( use log && echo ON || echo OFF ) \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr \ + -DLIB_DESTINATION:PATH=$(get_libdir) \ + . || die + + emake || die +} + +src_install() { + emake install DESTDIR=${D} || die +} diff --git a/strigi.ebuild.in b/strigi.ebuild.in new file mode 100644 index 0000000..ab0dc51 --- /dev/null +++ b/strigi.ebuild.in @@ -0,0 +1,91 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: + +inherit eutils multilib + +DESCRIPTION="Fast crawling Desktop-Searchengine with (optional) QT4 GUI" +HOMEPAGE="http://www.vandenoever.info/software/strigi" +SRC_URI="http://www.vandenoever.info/software/${PN}/${P}.tar.bz2" + +LICENSE="GPL-2" + +SLOT="0" +KEYWORDS="~amd64 ~ppc ~x86" +IUSE="xercesc clucene hyperestraier sqlite3 xml xattr qt4 log dbus inotify" + +DEPEND=" + >=dev-util/cmake-2.4.2 + >=sys-libs/zlib-1.2.3 + >=app-arch/bzip2-1.0.3 + dev-libs/openssl + virtual/libiconv + dev-libs/expat + xercesc? ( >=dev-libs/xerces-c ) + clucene? ( >=dev-cpp/clucene-0.9.16 ) + hyperestraier? ( app-text/hyperestraier ) + sqlite3? ( =dev-db/sqlite-3* ) + xml? ( dev-libs/libxml2 ) + xattr? ( sys-apps/attr ) + qt4? ( >=x11-libs/qt-4.2.1-r1 ) + log? ( >=dev-libs/log4cxx-0.9.7 ) + dbus? ( sys-apps/dbus )" + # For most optional dependancies the use flags will be ignored, + # useage will be determined by the pressence of the library instead. + # This is a problem with the upstream build file. + +pkg_setup() { + + if !(use clucene) && !(use hyperestraier) && !(use sqlite3) ; then + echo "" + echo "ERROR:" + eerror "You must enable one of the supported backends: " + eerror "clucene, hyperestraier and sqlite3" + eerror "If you are unsure, select cluencene" + echo "" + die + fi + + if use dbus && use qt4 && !(built_with_use ">=x11-libs/qt-4.2.0" dbus); then + echo "" + echo "ERROR:" + eerror "You are building Stingi with qt4 and dbus, but qt4 wasn't built with dbus." + eerror "Please reemerge qt4 with dbus, or disable dbus in Stingi." + echo "" + die + fi + + if use qt4 && !(use dbus); then + echo "" + echo "WARNING:" + ewarn "You are building Stingi with qt4 but without dbus." + ewarn "Strigiclient won't be able to detect a running Strigi daemon." + ewarn "To avoid this, please enable both qt4 and dbus." + echo "" + fi + + # inotify still in development and unstable + if use inotify; then + echo "" + echo "WARNING:" + ewarn "Inotify support in stingi is still unstable" + ewarn "If you get problems, please rebuild stringi without inotify" + echo "" + fi +} + +src_compile() { + cmake \ + -DENABLE_INOTIFY:BOOL=$( use inotify && echo ON || echo OFF ) \ + -DENABLE_DBUS:BOOL=$( use dbus && echo ON || echo OFF ) \ + -DENABLE_LOG4CXX:BOOL=$( use log && echo ON || echo OFF ) \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr \ + -DLIB_DESTINATION:PATH=$(get_libdir) \ + . || die + + emake || die +} + +src_install() { + emake install DESTDIR=${D} || die +} |