From 0305274a135a7c01a0ec8dce490274e77a1d891f Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 05:08:26 +0000 Subject: [PATCH 01/43] Updated ignores for Gradle --- .mtn-ignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.mtn-ignore b/.mtn-ignore index 7fa21008e..4bb2dae0c 100644 --- a/.mtn-ignore +++ b/.mtn-ignore @@ -28,9 +28,9 @@ web-fragment.xml web-out.xml # Temporary/build dirs -^build +^build$ ^pkg-temp -/build +/build$ /classes /dist ^installer/resources/locale/mo From da777c1d7d464e912fca684df0e2e8dbd91a1186 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 05:18:16 +0000 Subject: [PATCH 02/43] Initial set of Gradle build scripts for core and router --- build.gradle | 15 +++++++++++++++ core/build.gradle | 18 ++++++++++++++++++ router/build.gradle | 17 +++++++++++++++++ settings.gradle | 1 + 4 files changed, 51 insertions(+) create mode 100644 build.gradle create mode 100644 core/build.gradle create mode 100644 router/build.gradle create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..acc6d8696 --- /dev/null +++ b/build.gradle @@ -0,0 +1,15 @@ +subprojects { + apply plugin: 'java' + + sourceCompatibility = 1.5 + version = '0.9.13-8' + jar { + manifest { + attributes 'Implementation-Version': version + } + } + + repositories { + mavenCentral() + } +} diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 000000000..009cd301f --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,18 @@ +archivesBaseName = 'i2p' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test/junit' + } + } +} + +dependencies { + testCompile 'junit:junit:4.+' +} diff --git a/router/build.gradle b/router/build.gradle new file mode 100644 index 000000000..d90a1068e --- /dev/null +++ b/router/build.gradle @@ -0,0 +1,17 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test/junit' + } + } +} + +dependencies { + compile project(':core') + testCompile 'junit:junit:4.+' +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..3fc89764e --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include 'core', 'router' From 0919fa06f6417ecffc6b644c63b8b3ad956a0bd6 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 05:36:49 +0000 Subject: [PATCH 03/43] Don't set version (so .jars don't contain version) --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index acc6d8696..14e2e73e1 100644 --- a/build.gradle +++ b/build.gradle @@ -2,10 +2,9 @@ subprojects { apply plugin: 'java' sourceCompatibility = 1.5 - version = '0.9.13-8' jar { manifest { - attributes 'Implementation-Version': version + attributes 'Implementation-Version': '0.9.13-8' } } From 7ca735bfb288948c0b739963026a1e6e23437311 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 05:37:53 +0000 Subject: [PATCH 04/43] Gradle build scripts for ministreaming and streaming --- apps/ministreaming/build.gradle | 19 +++++++++++++++++++ apps/streaming/build.gradle | 18 ++++++++++++++++++ settings.gradle | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 apps/ministreaming/build.gradle create mode 100644 apps/streaming/build.gradle diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle new file mode 100644 index 000000000..43ecb50b3 --- /dev/null +++ b/apps/ministreaming/build.gradle @@ -0,0 +1,19 @@ +archivesBaseName = 'mstreaming' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test/junit' + } + } +} + +dependencies { + compile project(':core') + testCompile 'junit:junit:4.+' +} diff --git a/apps/streaming/build.gradle b/apps/streaming/build.gradle new file mode 100644 index 000000000..2d67f24aa --- /dev/null +++ b/apps/streaming/build.gradle @@ -0,0 +1,18 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test/junit' + } + } +} + +dependencies { + compile project(':core') + compile project(':apps:ministreaming') + testCompile 'junit:junit:4.+' +} diff --git a/settings.gradle b/settings.gradle index 3fc89764e..c516ef9fc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router' +include 'core', 'router', 'apps:ministreaming', 'apps:streaming' From 957eb1f7abbfa03860562a88d1df930d7795f17b Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 11:25:02 +0000 Subject: [PATCH 05/43] Jetty build.gradle --- apps/jetty/build.gradle | 22 ++++++++++++++++++++++ settings.gradle | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 apps/jetty/build.gradle diff --git a/apps/jetty/build.gradle b/apps/jetty/build.gradle new file mode 100644 index 000000000..d303d31fc --- /dev/null +++ b/apps/jetty/build.gradle @@ -0,0 +1,22 @@ +archivesBaseName = 'jetty-i2p' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +jettyVersion = '8.1.15.v20140411' +dependencies { + compile project(':core') + compile 'commons-logging:commons-logging:1.0.4' + compile 'org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158' + compile 'org.eclipse.jetty:jetty-http:' + jettyVersion + compile 'org.eclipse.jetty:jetty-io:' + jettyVersion + compile 'org.eclipse.jetty:jetty-security:' + jettyVersion + compile 'org.eclipse.jetty:jetty-server:' + jettyVersion + compile 'org.eclipse.jetty:jetty-util:' + jettyVersion + compile 'org.eclipse.jetty:jetty-xml:' + jettyVersion +} diff --git a/settings.gradle b/settings.gradle index c516ef9fc..7614e3158 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'apps:ministreaming', 'apps:streaming' +include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty' From 593904cc44699c3fef8e2cb5c7ab2f998b09fc1d Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 22:48:05 +0000 Subject: [PATCH 06/43] Started build script for routerconsole, broken --- apps/jetty/build.gradle | 8 ++++++++ apps/routerconsole/build.gradle | 20 ++++++++++++++++++++ settings.gradle | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 apps/routerconsole/build.gradle diff --git a/apps/jetty/build.gradle b/apps/jetty/build.gradle index d303d31fc..c6c57d16d 100644 --- a/apps/jetty/build.gradle +++ b/apps/jetty/build.gradle @@ -19,4 +19,12 @@ dependencies { compile 'org.eclipse.jetty:jetty-server:' + jettyVersion compile 'org.eclipse.jetty:jetty-util:' + jettyVersion compile 'org.eclipse.jetty:jetty-xml:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-continuation:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-deploy:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-jmx:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-rewrite:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-servlet:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-servlets:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-start:' + jettyVersion + runtime 'org.eclipse.jetty:jetty-webapp:' + jettyVersion } diff --git a/apps/routerconsole/build.gradle b/apps/routerconsole/build.gradle new file mode 100644 index 000000000..394b77f6f --- /dev/null +++ b/apps/routerconsole/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') + compile project(':router') + providedCompile project(':apps:jetty') +} + +war { + from 'jsp' + webXml = file('jsp/web.xml') +} diff --git a/settings.gradle b/settings.gradle index 7614e3158..192abc168 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty' +include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty', 'apps:routerconsole' From 8ea4d893f6dd7ba0feb016f487d580cdcefb39be Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 22:59:23 +0000 Subject: [PATCH 07/43] BOB and SAM build scripts --- apps/BOB/build.gradle | 12 ++++++++++++ apps/sam/build.gradle | 18 ++++++++++++++++++ settings.gradle | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 apps/BOB/build.gradle create mode 100644 apps/sam/build.gradle diff --git a/apps/BOB/build.gradle b/apps/BOB/build.gradle new file mode 100644 index 000000000..309b5768e --- /dev/null +++ b/apps/BOB/build.gradle @@ -0,0 +1,12 @@ +sourceSets { + main { + java { + srcDir 'src' + } + } +} + +dependencies { + compile project(':core') + compile project(':apps:ministreaming') +} diff --git a/apps/sam/build.gradle b/apps/sam/build.gradle new file mode 100644 index 000000000..d6fc75672 --- /dev/null +++ b/apps/sam/build.gradle @@ -0,0 +1,18 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test' + } + } +} + +dependencies { + compile project(':core') + compile project(':apps:ministreaming') + testCompile 'junit:junit:4.+' +} diff --git a/settings.gradle b/settings.gradle index 192abc168..c75e9b780 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty', 'apps:routerconsole' +include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty', 'apps:routerconsole', 'apps:BOB', 'apps:sam' From 61285435e8d62e35d53efcb56de39f6a4ff89cf2 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 23:16:47 +0000 Subject: [PATCH 08/43] Fixed deprecation --- apps/jetty/build.gradle | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/jetty/build.gradle b/apps/jetty/build.gradle index c6c57d16d..3758441a3 100644 --- a/apps/jetty/build.gradle +++ b/apps/jetty/build.gradle @@ -8,23 +8,23 @@ sourceSets { } } -jettyVersion = '8.1.15.v20140411' dependencies { + ext.jettyVersion = '8.1.15.v20140411' compile project(':core') compile 'commons-logging:commons-logging:1.0.4' compile 'org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158' - compile 'org.eclipse.jetty:jetty-http:' + jettyVersion - compile 'org.eclipse.jetty:jetty-io:' + jettyVersion - compile 'org.eclipse.jetty:jetty-security:' + jettyVersion - compile 'org.eclipse.jetty:jetty-server:' + jettyVersion - compile 'org.eclipse.jetty:jetty-util:' + jettyVersion - compile 'org.eclipse.jetty:jetty-xml:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-continuation:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-deploy:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-jmx:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-rewrite:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-servlet:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-servlets:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-start:' + jettyVersion - runtime 'org.eclipse.jetty:jetty-webapp:' + jettyVersion + compile 'org.eclipse.jetty:jetty-http:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-io:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-security:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-server:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-util:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-xml:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-continuation:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-deploy:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-jmx:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-rewrite:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-servlet:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-servlets:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-start:' + ext.jettyVersion + runtime 'org.eclipse.jetty:jetty-webapp:' + ext.jettyVersion } From d97c9876e82fa046d887f95ad44b73fb846cf2f3 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 23:26:51 +0000 Subject: [PATCH 09/43] desktopgui and systray build scripts, fixed routerconsole --- apps/desktopgui/build.gradle | 13 +++++++++++++ apps/routerconsole/build.gradle | 4 ++++ apps/systray/build.gradle | 12 ++++++++++++ installer/build.gradle | 12 ++++++++++++ settings.gradle | 2 +- 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 apps/desktopgui/build.gradle create mode 100644 apps/systray/build.gradle create mode 100644 installer/build.gradle diff --git a/apps/desktopgui/build.gradle b/apps/desktopgui/build.gradle new file mode 100644 index 000000000..36f8eaaed --- /dev/null +++ b/apps/desktopgui/build.gradle @@ -0,0 +1,13 @@ +sourceSets { + main { + java { + srcDir 'src' + } + } +} + +dependencies { + compile project(':core') + compile project(':router') + compile project(':installer') +} diff --git a/apps/routerconsole/build.gradle b/apps/routerconsole/build.gradle index 394b77f6f..2b154819c 100644 --- a/apps/routerconsole/build.gradle +++ b/apps/routerconsole/build.gradle @@ -11,7 +11,11 @@ sourceSets { dependencies { compile project(':core') compile project(':router') + compile project(':installer') + providedCompile project(':apps:desktopgui') + providedCompile project(':apps:systray') providedCompile project(':apps:jetty') + providedCompile files('../jrobin/jrobin-1.5.9.1.jar') } war { diff --git a/apps/systray/build.gradle b/apps/systray/build.gradle new file mode 100644 index 000000000..035b394f0 --- /dev/null +++ b/apps/systray/build.gradle @@ -0,0 +1,12 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') + compile files('java/lib/systray4j.jar') +} diff --git a/installer/build.gradle b/installer/build.gradle new file mode 100644 index 000000000..28055eb49 --- /dev/null +++ b/installer/build.gradle @@ -0,0 +1,12 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') + runtime files('lib/wrapper/all/wrapper.jar') +} diff --git a/settings.gradle b/settings.gradle index c75e9b780..f581786b2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'apps:ministreaming', 'apps:streaming', 'apps:jetty', 'apps:routerconsole', 'apps:BOB', 'apps:sam' +include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:routerconsole', 'apps:BOB', 'apps:sam' From bab02a62e9f02d676b42daece0cfe4f4fabcb10e Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 24 Jun 2014 23:41:55 +0000 Subject: [PATCH 10/43] Gradle wrapper and instructions --- README.txt | 11 ++ gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 164 +++++++++++++++++++++++ gradlew.bat | 90 +++++++++++++ 4 files changed, 270 insertions(+) create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat diff --git a/README.txt b/README.txt index d115a6dbf..1f6932ec3 100644 --- a/README.txt +++ b/README.txt @@ -6,6 +6,17 @@ Prerequisites to build from source: from the GNU gettext package http://www.gnu.org/software/gettext/ To build: + Full builds are not yet possible, but the command is: + ./gradlew assemble + + gradlew will download dependencies over the clearnet by default, including + Gradle itself. To download over Tor, create a gradle.properties file + containing: + systemProp.socksProxyHost=localhost + systemProp.socksProxyPort=9150 + +Old build system: +(This will be deprecated once the Gradle build system is fully functional) On x86 systems do: ant pkg diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..f29ede564 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-1.12-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 000000000..91a7e269e --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..aec99730b --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 3c8862763bac9a86de309ff33c72f7e168c8f52d Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 25 Jun 2014 02:04:06 +0000 Subject: [PATCH 11/43] Gradle build scripts for remaining apps --- apps/addressbook/build.gradle | 18 ++++++++++++++++++ apps/i2psnark/build.gradle | 26 ++++++++++++++++++++++++++ apps/i2ptunnel/build.gradle | 27 +++++++++++++++++++++++++++ apps/susidns/build.gradle | 20 ++++++++++++++++++++ apps/susimail/build.gradle | 27 +++++++++++++++++++++++++++ settings.gradle | 2 +- 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 apps/addressbook/build.gradle create mode 100644 apps/i2psnark/build.gradle create mode 100644 apps/i2ptunnel/build.gradle create mode 100644 apps/susidns/build.gradle create mode 100644 apps/susimail/build.gradle diff --git a/apps/addressbook/build.gradle b/apps/addressbook/build.gradle new file mode 100644 index 000000000..72c4e6f48 --- /dev/null +++ b/apps/addressbook/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') + providedCompile project(':apps:jetty') +} + +war { + webXml = file('web.xml') +} diff --git a/apps/i2psnark/build.gradle b/apps/i2psnark/build.gradle new file mode 100644 index 000000000..15c3fbec8 --- /dev/null +++ b/apps/i2psnark/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') + providedCompile project(':apps:ministreaming') + providedCompile project(':apps:jetty') +} + +war { + into '.icons', { + from 'icons' + } + webInf { + into 'classes/org/klomp/snark/web' + from 'mime.properties' + } + webXml = file('web.xml') +} diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle new file mode 100644 index 000000000..1b5dde3ba --- /dev/null +++ b/apps/i2ptunnel/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'java/src' + } + } + test { + java { + srcDir 'java/test/junit' + } + } +} + +dependencies { + compile project(':core') + providedCompile project(':apps:ministreaming') + providedCompile project(':apps:jetty') + testCompile 'junit:junit:4.+' +} + +war { + from 'jsp' + exclude 'jsp/web.xml' + webXml = file('jsp/web.xml') +} diff --git a/apps/susidns/build.gradle b/apps/susidns/build.gradle new file mode 100644 index 000000000..103163af7 --- /dev/null +++ b/apps/susidns/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'src/java/src' + } + } +} + +dependencies { + compile project(':core') + providedCompile project(':apps:jetty') +} + +war { + from 'src/jsp' + from 'src/index.html' + webXml = file('src/WEB-INF/web-template.xml') +} diff --git a/apps/susimail/build.gradle b/apps/susimail/build.gradle new file mode 100644 index 000000000..7cb5787fc --- /dev/null +++ b/apps/susimail/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'war' + +sourceSets { + main { + java { + srcDir 'src/src' + } + } +} + +dependencies { + compile project(':core') + providedCompile project(':apps:jetty') +} + +war { + from 'src' + exclude 'WEB-INF/web.xml' + exclude 'LICENSE' + exclude 'src' + exclude 'susimail.properties' + webInf { + into 'classes' + from 'src/susimail.properties' + } + webXml = file('src/WEB-INF/web.xml') +} diff --git a/settings.gradle b/settings.gradle index f581786b2..9138c7c50 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:routerconsole', 'apps:BOB', 'apps:sam' +include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:routerconsole', 'apps:addressbook', 'apps:susidns', 'apps:susimail', 'apps:i2psnark', 'apps:i2ptunnel', 'apps:BOB', 'apps:sam' From f6108b51a2d51d760a3d5f0471282c8c9911328e Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 25 Jun 2014 02:07:00 +0000 Subject: [PATCH 12/43] Missing Gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 51348 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..0087cd3b18659b5577cf6ad3ef61f8eb9416ebba GIT binary patch literal 51348 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

CflOl1i4(-2^1KXo)&I5QlgjRKFQgM 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 z zP_KwBCnXDLTSTI9$@zwgB(mp+)3lmOadZUKrV}r{V0`rAEHnwtTEst z{4z0MSwpdQle8@5Cr`lrN1_3bylt;)N9&*~)gHbkdj(`lYv4CIH6^j#3e+ZN*%r4p zZg$33*(p2*DA2_e+L+R85%=iUhDr-Ak=`KHpT6$$)x0z)t*Wza(?xB!Uz?RtEWN@j zf{`@lyD5Z42Y)%{=&Gwb2}W~lWv>b>)MjtCk*UE$ZcCZ&<7y#k9%H8r=Ii#}wD+9> z5&9`Cth7|LQFxV41b(DYezS@klgX;JxGI$xqv)ubwbFxi3}wTj^1*&ORQ>_^3YtUe zM!K5(sy9qL^?RqS@`KaD+8`s1CUVtJAqqdr@QW5PKGAg7v}bjvyUQrxv_p2MJ8e!2 zh_m#N@=Y2uW;mEd%>!>Bgr;dq@CLYneRnDu$Aed*H~6=rDE^7nyoTr=V&w&irh}Ql z4v{;o(x~nPx*ECV+QP&ciGt8*HMbDgk^}lT>Mmb%R3tlI3Q4b{-JMEp(6J)Y@9mrF z(Wf2Dh&=`H0>yiF9zJj}(=ye&amdHeww4(t`eEi0G`v-3712txxwF(459yYM74O^< zT1VQn3LZ-B%|%4~oMmV)pZLU?(Xr?D68Vg-ih6_0j<`1mHS@K@ks$NTCpJAMT=QcR z{XB@n+n^nOl`Wz-`e*dQx_xPmpNa$hH+PI5#e4mVYTq@~(PXOcF#(FG%4Ld26dNp- zL%G#_&KHwUE8o1T)`Zn1BfBs#5VKhvH=0`IFUf=raf;WE#rgsleAsulIiBw-v)cWJ z>pANb$6ne-^PTKbh>P63e!xC6faID_UfUh9N9xrR4=5itQxpOcfl4*-i_) z_bowR)7#XH=bMxVIQ=TNlQUBm>nJZen)M9TMlSsvRUf$MQO+BDNZY`A`?6smIS2&K zt0@h&9Y52chtkO!u6fLIaQN53Hy90}I!}Z2xSFdBxB+!=-)gIz@Xhba4uQV=Yloa* z3=*mcYpoKFyw=+EMxRr9pU-vT-+s^Nl=)n$MogGa-KKA~%}!IVW_Thy>q+Fy4LDES z^VEVd=IQiDX;K(Bm19Z|pUe=jL~k@;PTOY*zSR@EgO9x*0czd(#7XPWS;WD;Bhgj^ z#iW^FLvX8146_iq8?4h@j2bP>2Wv2}(I=93K^#W16`xO#z!Nmaj_t(#v$=6AtbCw{ zH)k-xlFF6WV9F$G{0^fgbEx88x4x}?ewA}_lXG)3lGDSy)uVc|lQFweIf+wSxaeX*WRPsMr2-`c z6$DvDb&RIc+{ZY^0r}Ld5*hdqZkbxTrE775-x4#H#T~w6I-@1c-^a((_K0T|X);1v z-FF4HVh`GV*jaU;#UpTR_xyep%AfVIh3{ko=@B}zGFmcKOqw~erE8;316`_>)_jBi zGPm-|o3UXle#Aqv0-yxvWRh<5@hdJBgHrEem^3VHpX)))^5q$XR0T-jU@i|j7x*$~ z5o9ouEmXE-BlOY-6^)J(<`9g0nN`l;5fpM1$-vTr5zS%D;DN#_Iee3|6<>}4+z+jl%JPEgyQ8G*%XGEL08BhdLkVKl5_0HP!}%zd+RHFA$~r&p`BFzrXz( zj{a9}{=fKaaG(EzqJ0`K6Q|Ax<8n5j2NaQ!>NtV~0yYpBnI z`Q8`;9z~*~@V2UnVos;_L7hAbg3v3N(O0@R^$~^BSG{NT(H&vGlMNirG4AQQ6E9$!mm#z6wU|49Xemsf z(%R#1V1H|1lFuKn>?%ov+2jtP(%d2s@%AxIX{Uo2NgBKFa*$wny#hZ1>zRwWa){iC zn*2z!U_Ljh1e8To%8H!Z@Kn)`$Y*r!>>P%=b1w7R)kMgfTI|yc(g#$v3HM9-HoI1v zdARCT15Kf6yvtSEpkoS=c}RWq08Bk?PLmA%Iz2H71#pB(wu@hEr;>A93iGp}Kw;K` z2knL#8IqTiGzHhy140FtH8~uTgx!XEo57F96gzU^QxO!vx5IW=VVaX$Ox*+LJeygy zKK{zJ0!brte1+b2>|md?b9rfGL)_3k1Mm=3{fho1=>>-ai`B{L z_ocFO$s}a8H8q>_y^NQPYrLbVC7q!?z3bv+HA|@Za!X1Bq*0A)q~s9XEjBg|e`@n{ zk!Rq@n(T#|vl^wTAd)EIQH6 zVAzzfiu0)jOCxPz_WPSE&C3|goIfia+FgrBSD7W!tUlnos&~AwyJPSmvp@Wef>uCl0}3`iJaLepUPKZ$153@d0?h zQt0r|Ii`#oc6pLwvOZ9h7j!ub_s`oEwXWeu%qFifR<74~R3;_r>ot>ZQ;#Ua)8JD9!Z|QWU6Wd{(tpDVU$5e6(WzAl39)vMf90jjz)Fu8Z}&4ktSqJlhbSr zN!%wfAsS1>BD*Z5=)1J6fIKw<6^QHW#bmirKpC7WG5=Fwp(9^%VzE5mY#G{k5T?;3 zyp);&A-Zk`cTP#X>?K#}Dy=9IhtoM5v5{GhOnn>)D7!p$7-UF(+)2ZJ3N=HFHB9B@ zx(35ZQ$Qn4kv5A$n3H`#39Bcnid-dHM3yO{uqR|>5-mh=t`e$XH5)NnYCNh!k;()4 zjV4;XFsy07Tm4!N{G^kYanfr9eQcA&YagxhVk26;BGRNWHjPXuTD>|9wpAVx%f!0a zC^L3=lIS~enGAE6sB>>;=*b;Ct7d98(lOrjlM7@-qCO|5Xdu?O$J*poxtb|S9#ibg zweZm1crG_)wuq*DlHHi8SsP=+n{kQT42GMbyVay?+=E=T2|ZLy zCUe~bC?Xy2VCo{ZwMIUzk_sFyDD`x+?pmN&#kvyshQkM${C$ScA8GGe?F={X7dP=< zy$ABLBhhHb#oPY1`)1xnPWM1S& zek0?JnD2}kPo(!R%J7P9oX7U88kb5{3|MlmVp<}`5x%?`d=8yH_K3??TbdqI(=?B6 zsSQzFC;tpuTIaG%6WicUBL~HB%3{FHVkv|wkHnhu$b8gTRM7!jt04tKV#%B5TIcC> z>@kc<@lfbv{&URGNrY1y>gmZ0tCebQK5IBKJntx%`T8-8Zx=5VRI`Gf2B zAk1ttM!0Q%mP_LzY@R|{G2{f>p;T??o*u>9HlX-0uYc^hR?M`2pco7~&b!h@o52-< z>xD4i$;%V+2fP5RhY{EwWeA`CYNDKDTa!NJi;Lhu({JBLq3<2ihl=Zn;L24kyRUAH zpn8y4Y|^-Ak-f*3rMg#fbZ~M{!@sO>v%}XoZVE&R+WrQHF5kfcS9!BLmk!AI*No~5 z{Cfh5-`TB%E^8n|SY;AW$%aUnvywm8?S63DQE<-2&_Tc6^JG=&X?lKK^W7RE0XrxQf7TikpEtBdKUCkp)sn z@+Uoi1pR>K1to2Dm)cSGz&jC z7u;;dp`{b>RBqN6Ct#M}B!<(Zp%lf&6kzKRH+D{odTWO{J;l?NM<5eBTfjZzN_y{$ z=arDP5yCnt*RlOBM7F*B&K`90wjZekw9^}|;Ixs*@G~H7+HetBecwguu<>wK!_ z<`4-i4uJ<}=y9Fl5$`FqhijY9Q|F;gb?@f6?A(P#=|c@tMmUjtjbJiQ+h({Zr@pw>5kdc;15jDHw9p3uF<~mfMd>$={LN8)sss+{auK0I_>-BPz2D+}>LYC?gE)!d8q2!_Yyp5A?@< zWH>yy9f++eDA~L662O65bG+=^U3I){ByzlkNR9q*iy;D@I&HSXp3D&jYdNTMmDJ-X zKw~SU`2?8^8>ortNvkfp!;|E;ZB|m$v^j|D>$6;uBAMUWmD)75#0IOkb{k6u!O(E4 z8iWLwb|Gm_%>8;Dq?-#_CVtU7(!np8;gb%U%YVSht5hPn)39cLuBKt0Bs}s~#dueQ z)>iPOSKV_{DW#SJ058DKC%RPRktDV`m9=JdH#t`_8h0<#fVr!mOcDGjd3CTEYC0fPFo{-U^#Wq)0v9U-APT=k|r zeEEjcxU846dJlSfc^3x7cCRwLrPV#d_P%W&cQShA{H8L_T|TVn1P|V1zs7L~{JrTOEoB-r)VM)- zJKL#<6&plyc9d+3GQ@g%u>e+5QBpIa0z~t`l}v@GhD+@-dGG_FiIHbDd0Zu!7H3I; z=kzX9id*wFJ~__e0C)1Vq{nQwRC;c(HNARh#9G%~WFs|F**x-G?C7x7ll^q$2cbz3 zIZ_gm)FXVL5WfPJ8Fi?_Bl-|USJ(1eW^ z&?I@U3~qwTW9W%9C~kD|&A?Ccnv$0MCr^qMCPNXo0GPcw;7-HwC!rczouU@Lu!zn=XMCHlh0it*90kIY54&_&mP=GFR0HgbTr`53?SBf#}4)O=Cvz}JPjGzNJaBYdpT$ZCb4 z^NADzv>$%>q{nYdiyY-CQ`H8E>b!?lJy`nnk;Kx(f~FMKH@j!bWOLDJv9-(WoJPVsbbVaqG(!QtNDiEmocCFeD+79Tq#cVi zeP1NSQ#~&29lP_KpH~qI|Hq`f1W^DgeVyp*+ka2t;Z}flx03i792g1K1s)AI^ zHL<>9r()viv)>^J`npIQq&<-f5*tG?nM}+`q(NXsWO3sbXRuSi`XUTtlY^p+jw17U zCy5NFB8lZz>-Lp08ZDuC-j5x)54sO1>uoM@2|XU#y*9^djwkB-?&IvXuh;2KIDp7q zJkD1FLiB-r>|`g{am+hT+MWDxe^?X|98@bDl1^eUu`7FLH}ZRi5L&E99OPJ|#u`HFG0;G%dO7eMHGMg>xSiVSc zd9Jh9)k4|m>iy}$szf+!6O|d0RFVHfVoQ~I13B_QF>Pwf#H_zLO;j-tnJo=YL9PCJ zr=8aKE=bOVru%iPzfjnl^;OElG!?ka3dfLH#+ar-yOtLG6x5MmZ;XZMWMAj$!C^Zk zw8yx6ey!`6OR{JRHj^rRK?+VWVdiYYqj7~^1_x;inWbjLOHn;hbN_zHYJ6;5lhz`C zZ?{Ez@{Q=RiQ=Nt{o_fQm%y`mxe4ttcuHM?W(#6}rd?O3@*kW{iwgdn&Uh4(GAHGC zVSzW3mBd4cVMeHlk_+T!j_iEn#tX>ff%sAdQ8%=)hzNgRu&F2}k_xR%6vmI{ctg6; z3(|{vC&|8?0@aQSij(R?$Ks2mG2A>flen#bfzX$$HN+$qgRn~JWG+DWGuNdHMU?{g z$OEHska;A>40XyA$p^Lylq}#y3*i*3qoAaOq_y_C(sItTau12sD^V0ts}^~;zERqF z^)*^9b%H#TAX}B5&<8{OFnb^|yM-Pk2lgNSsM?R6bK(*zK@*yTvM}$^e5!WuKTw*! zzVJ9PtVIUtpgV(Fl;7uiYHlone)rnKWDZH7{ARj=t!`ju+r@rrLv9n*5EnE2!(49U zyFI=ONBL>Cqy0YGqn=3we8&^)4XE_K+M{bX(W7fGH24$fde;_Ir-w#mAT)d(lu}LE zez<4bez^xz1*TF;%?nqQR#}~)yn=Gg8f)A@JAdse^sph{v023GwetbnP7JQKD-7t0 z;p_Kr{V^iBnm8sXG&NhwEw-BsNQu?5H7X z#vYYHz%rN{ik-Jo+~joE_>NrTuh!hxmztba-N**>)oE{t|1dih(!6=$i5e!=-WazR z_w!(#KTaB|T?_8+4Qg%Ke{8wB%nLMyP=LF$!u<-+?}Bh9zOoIz6}~T4kgc+qz88hB z@=%qp_0$Zd!71rz3*HP~nFvoAyJ&RQ$@jVpE-u{33x3*KtK!TET?NGX?H!DGJoKg* zRb>+#$jV>?KVMF)+GwGI1Ds!hAqdTC4-9>0C?2&#&NBD-GPVVib8tt3? zvPnNY|J?e^`s|^f;!_$F`exWi8^$%fqo|q+wLRd5M|e5cBvIMS6~1gZ;*}RKDEQ;S zVJ61VYDIaUJheySDw+4VRrAUgtDL_k_s^hTZ=N#x`sSbcO@QM781t6JIh%gs1jYAN zCb#5dim8A^?%|iyNxd;Xh(TD3r6h9_49rSBF~-hdGZPqV3{h)ckzprpEdgo_;@~U^ z7TieZ!9_@yp#T&oG9jFhwdJNlRF3>%A^R%-5XKlWK->K~8*kGCUONw~ss_PR)tq_bu z5oxC2GbYDi1ZE4^eWc1$@Gia}^};+UP>YSK>QI-8?9=M8IzzYWQ-Tl9kxOC_ z*YptDH@h&g%xPlLPUA=Lxi;`-%cWQYV!2=cmR*WiHq(~>UT``y6V+{%c?!PwB)+|KE5KZ7Nv&ZeIpTG;hd5F;j-27uRIc1Br93jMpU5i{E0ya6`_Mp5A`GHBme)^Z5F=fo! znH^U(;?)-hnbDd@p@(0Iq1fL}qW<;x-%tF1QM_>9pZ^AlHMBDS7jEufUk|;y(>wl# zKE-}(Cx-v}bpeCFLb!%bLble{-vAwHa~tDt_>;>wQ}#dOxJk;^vPjAE_VEa{ zynMkQagS>X{33--5CoVKl!)fy?`~b$$8nF6)vAenySBY_B(no}J28w?S6NLDGURye zOk8YC(@YHw>$<;xe*xD<*F$4e$Ris?>M0MAFSRyLHNkXq?~c!tXN%Nf3_1pjk2Xq| zOu$Q;Mxz&Qs%V?0mZm0mZ<{YUb(Ak*8l{ytGB?>5u90qgijKY*HDlZ*C0ipyYgVy6 z_%G2zaWyp?R-`wqTd*ouOeI`4S1NA0ICYHBdvh$Wj&6Hlu}LVEt3()&p)P7c32|z3 zsK_n~3N=Oc;kMmW4oc_TYG0}?V?)L(t>Yhs z=NV=s6SR)ibep|~88%nCAZtPwgcR$S$qX0o-3uL$${j*yoC-Mj%Xh^X*j;w#zuQAo z^&6paHv@HCfx#Xi+MnP%g-omVEXM+|7LyBqSIm-uD~XXW*VZS{uM{A!yL zlD^I$D0VG{NJ2g7N)$j6xwcFt#zCsuZ(JuBZB=dqcoUTbM`{!ew1-S+9MT5cDCV&{ zjwca_pB??Fh%M_X$|&q`1SZO>h5w*3>P$eo>^&>M4PWYFa;K# zg@V0t;Sduby^417_PgE~&K=%Xeuu{0O;bwZR_kl{fN#V_B>uUID5694AUE`SI?`k>ue*Ifw^RFWNTeZmPJA9*J|I^kCiWK+@IW6*K)}#UDa@Zbf zDKssI3@p-%G~iN7V-6_s$BvfUHv~~ptKE+Go)6Dt>-@tFa0EUCTu3MyBX0EyYLM|eSJy&=@?{~d-eQP;VRQuHWlYkx9K`>hp;~Ib;R?DZu{VNLKw44 zXdJPmhLTAyIb^?qTg#2VK0jY!asyFN7!H&N*MJOhP8L$RfKnK^H zVWfl^hUp(x5_0U;XD?w=IyeI!`N21JnA-MFVEeUJ>njG!C#i~cHW;Gz(v>Uh?CQ2Pa&@%U{L2zn!~f7)Ovz`+t- zK?Tg=xErxY6O{AbHEY9^Yg}ZDh{;ltDDT_0IL}!v{}Pk0KTLT?p-b0NiomM=X*1qN z6HMPy!T6hq4kJFQKromZXOfgIE*x*BVVw|)GfD?o8lGmKTgY@nKAkS-;tnaNbcm&%B zmvq_{UGF-t9*$kYw4j?qCJtCOUQKk_JQ8H42%!7`%2~LZ#SQX6;g{7OIZU)a6Z^Tn znH1oZP`E4xe%hCx9S%@X8E4|Pb*n5c?Ijkg-6#MVNm3#FC>lMkuPrFV5J{>-WU~+- z+abCw|9%wqd@FJ;DmM?meDw5Zi)_->1(d->MaaCD5MB!4Pkln)4TAC7?OLGPk7gqs zHszI#+HsxzA}5dp9TD|uCNUNu3}G{N5;KGsBr1L2J2aI(kvXOZVamt9X`H_*ptJHP zW88NI1b_el@ceHo;2%R@@!MmvG5xL&JN<7`;(r3yvy`U4*GuG2lXhc$>%6-Hy(WK+ zJUJr@d~wOp!Z3(B1SIINt>VjKXmyv-tK{dJp3w|2&s)GS(xHZLm-mHcpcv~sW?&FP3<20?NT zpWe)v&87i*nfS2BB6qdM7M6Sy1*3+&Wgjnmw$dAUDM-kisrYpk@SO7_kSu3Zy{8u; zH$p3}kioJ&b&VC&b_;lmx_wvh>W%Pb^F%t$&puqJlIrv>)NEV#wyh*dXb+kV`S~`l zL-9<=c~qHxD^`C>yFil>wdKq~H14Q>wdDLOFAf!6<*V2s4 zHQ;qyfxo0-hrz3WC`S~<<8sV^?6CIb97XPgL-+_p?e$9R{8Ar(v_B$fSb5%FZ?-4% z1Tf@f5lv~XIv!>dR5x`CdXCc~(7}7;E}DDgd@IeYoT zWUW`C9#1Y4G8vzkp+e8XBES2yo;yC_PcqXcs1xK+nO^iA12^n#Ln@RtuAvbVGM?a% zf&(7>hz0yjy&tl%FMo@G{WaE4h+yu-zLm4o_jvzr^x)rS`|p|E+4}o7fp5~Z@qbM9 z|Cr*F;wB}57?6WxUzrM;nl-Gc&ibwzmBE&i{6qceTWgEnoG^>y(u5hA&Mey~TW@}N zkuyk0q0soNZyaQAylo=gecrx;?m$l>Las3CuZwJo1oUtm`+A#~KNOY)B1zIOEWRqe#h@+8LsjFf%Lrtp(qh;`UYyO)ANo_OfKhkgJ|A@uvs{ zxTt$Vsi(T_cKvmHrR+zde4wFVQ0{$24Yiq|D;P~TPcYoOIxeSfk=t@=c{Uqu z^}!nIK_;^LC(6QMEbZrAmU;h8Z}6d+eGPvr^pNk{F#cCFkd)2$Wf%XLhW?>I{Zz02fpUvCy6N7xu8><|7R&*_UqC8mD~GuJEw}r)WoGBW3x7l@9j9_KI?j; z+wpDcYVa%j*AITKt)w~-*Xmpnf&wH%L}?5HwMdD(J9ix`9c&$~Vp$1vI77ic1dQdK zQfLrYhKC^fZZ$u;-EnEB7U{j;ee0gYUdlrrUObVW##a5_jNN{=ccU#vURc}ueb>Ra zJVP70e%Je8o$qpeG0)HJczpQ#=(veDh8WJZea{fT$lTq@BXjPa^f6*~Or_uMA>RR? zq@GDC+?D!jh%@2kDhn;uj(jb#jzR+y0#{Rl@~msj&s<~$9kDkN%q|-);+7CJBgh_> z)cVXW>xPDynYK(*UwtOO+Xm8%Um^T$H3BOpnNj&|g;OEwZCBxnu_sOH z^eCB@QV&QX8r8E_*?HmYtm#NIRS7wcvv}z(fI%ri*LZ5JQ-3JJI|2_81I53y{RMZb zp4q-BwHr@l-Pw3Q*E^1?!|A>{=B)=|K&}V$y`_7~hMswJerKk^ZU*_7tJ(|G`i+gXpTXq#{KpWdkF4MuWTCm#ZpRCkvcMbTcfFCC)wOq%IlS zlnw307^(kvNlz~cJJHvzPB{=&qnfm9X8Pk4tHmmh)KU@#0HmA4Zqc0%4kpy7`Dw{R zGhj5`XX9ZMNCZ!hQg^gH+UZ6oGbm%U0V{fBW87=-d!CCSY3V6%63Rv`LL~fy*&)4Y z6l$Coweeu-(anYsXvUVQwYQLug8j(e?aOX)xK$gknSjwptVxEB_7S70K|JE!=2bx2;L#ybB&L8&`F|bHty7@Sx!b57!VaM!@j8EJv zF=?Z+gP84LRVQ-q28YZmW$?uAVjyU3GY8WVq2qF!N|;(!MsVR}1rTKu{*=_IX9}da zp?2+6x&}CRKTg2B-kL+lS_6XFIqL1htIO`QT1ZH_VJat-ns_&;k&nKYavSG)BVrT>ivbcFJifDxISlO&`>BfBAw#OF7diwC@m4o^aMJ?_P3y< zgBfmWok0nE)>?=uH`#7rUkKL<)Sp)zoe>+qG96q}>+_MH^pI=@1>!$&L3WvRg1-VN z2Z!VC1A3fh(Vx{fK;O)8AEu4b|m+aE>o{^|?H1DEU2SvurKOqr(VqKscdqdci z&{6iQ$!^#9eVKCw4-4LX{acrgZHZbp`K{U3zq@p{|9y}0@7>8?Zr;2cvX9O3tUM>W zt>O)cFf^8}u`fO}LZ$&K8hskUts%xF^{K|3%RtU9+-`(!kGR3}MGRr~I;&%?~fNP5;cqtlH+Sex))kedMD9{~?ndy+0e1o24# zzWUt2IsBCJC+}G!@r~6JnFRJfZlSou?#S9{2`;BxN|y$q3ZJ_@ZG^c4yw<{(B7o5t z$Y-*Edt=(M=|kk(9>8Nh5-N8fBsT6jvJE1=N=^*+iNn&YIX4?_obW~kJH=(Ewen4q zvzf?C;#9HWe5>@#rQtd5izMO$p`X!%1}qyP^{3RFrs{v>ilh?vVXq>Mygi#wJfBnJ z&TtC2ODj^;C$6G35+)EvN%GapzY3J84W8)!t7ms$ut>K1T_HB#I-2i)Qz6PWmj8o_ z?ou9C`0nF*ct(l!8TrBCZ-YX~N8!PD^9Vx;i;9$yHG=B(mWdVjPmF@or4w~;bhX4$ zVkpske7|;vmiwZx*xGA5dD0*e1WD|7kG8JXpEA3>uO<&Zu3N4F4(v4rp!Xp;>1PEh zGU*fg4hDM@{mmzY?ODPtp&eHDvvCKph29Zd$J;wd0in-;)|WPoBT~ja()0}m?V~bx z@A8X|A(PWIT_j0t&{U;0YxYFXcJ84Gt}vlTlT6=1rqwrC9W1jg*FbRwp+eMxcMB$X zW$U7I@Z&({S-V6)dAu|0I0QTgO_wnG#%1Ed&rvBVlIDu9c#krYX>|^eTbrh|6)ytx zRy-}@#erlmj+^i2d|D6FqCZkHX%g)aQ?s{?Pqw^ubR422C0ckC*s@l0YYi2H&#TVX zx8h?x8MDk=WWx>d=C;gpZPp_hboPlHz5@tO38F)AB#c3^|bYq9{FP$tF6(ZHSc~@XG`RQo{A2MeB0+NKp$~2kD=t z=X>cFk=Fqh=JAuQ#f)BeS<%AvnKvz%g41Ds2$9jDUfX!m>K>~EJ$^(DHT_tuqhb)o z>w|q&3ywvG$x~Kn9C=zGxkC`o_hzp9Xr!8@mG0Ix1dDB~;|XlM!0lUm#y!B{jEyDC z@Rw%#L|}Xa4)PXdd-LagL@7Cuu0YfSFa`KULTmIXsYUTZB`+PCZ)#85$|(UhbBVit{*wf5Ybs~t+1G~8R zzJ^E}sDO!ua^Nle;=Y9vLb)P!%3?}!TIxr0Z(Scyoex!qMR1LZeT5TFuLDA+uVk-6 zYd&HsMyvHw#R*|k*^AkmwywWv3(J^gx>gJrui5 zkk|p;Lu?Gt+`35(twU@CQyL10@!L^6mqEP@DO;iksHV>CgglVixrC?%sZduntd^;C6QOq4d$K4vpo zxSKbfe)#;*lB-r6uE${6qdvRn%SJP-tjUX!5|s6}YwiJ>p^ibtnW$b>Ss>6^$Q)G$ zv=)a8ByX&dUnaCNkf+IcY$ehs$03~R(KvJ9c9My;{3-S}Z^@_#$e!jvcF%`Jd{w;Y zbzX+m)Z{RzXQC-+JFVnYkP89oH0PStP;gpX!;&YBxMbd6dj(S0Tmr_9tNEd-3NB8E zq0vL!&8e>;&}YKdax*}&pj$e*BG=k)nO<+y?nmt}D>nbtpCUCtQDJc0bl;xqDLZl& zdsDuHZ#CD5x|^?|V}uOCRVO8??ibJn`4}oDYDNipwU-_F28pXD-TU^;FX(D0YvfhB zL*z99yQCF!ZrseZn7qv^F^h^UhPSW4aV!Ui&Ph2r?{Wd0E~UebGPHkkg6^97kD-WU{bVZ{FOT$3|X= zDZ;A(5}N?lF}A88Ssy+jw-9Q4DY>!()8+oYBVhZLJl@|} zub|bkp!+BMF zJ^|u;rX?PM#^SgJs!)km2RjfPL|g-`pw@x=u&@cbQ0QuY^Ztv1U!SjGTWfLqj&KHE zSA}25?K2U$NA($M!C{BoMGP99!V%Ck!Erm+X&>BaM;WSisn4O1V)VeRb28W@cZP{5 z)yk9hd^M^RS-B||DjZjVlbk;;>nvj(BghlqHgc88&N~5=$%q!Zf)lb6EVV$uITBEk z+%Aq$To-}3GwrqiC{21*)-R`Fs^pzM)nz;McTSanJ4Rya&&REX4p`(i^XCe2XG7^- z-2h6kZ!V0!n#jO*Jg0MT1jtX1=IHdTF*((rYVTL-JUNo9*U=jGQ!gJl7B-BpJmc)G zUUeH=rB9NwMY#5npF)n}PP6`j?}}>fsvc!*UI56(C+SrgS{b0d@>mVgrk?R}F^I*$ z)z7X$I8y)A9^%jn38t0U8VQj|)$ zdqMc3;q1~!<-+C|=^)b`g6$qC{uToxoB_Gev0n33bmX(rf~WDEW_@<-aDNb=cW{)p zF^M{ga}zK1CXIQ=KbkgzR46!QGoOapL-gi0VYnm78o@0B#i zqT2pR_ph2L(@JZ)~S8~&-afH z=pA@nFQeMi{=wpq_z>&hi!!CTOa`NJPixQ?gePF3Zi=MugBDzZ+xIfUX@e#khw>Sg z=GXg$mffR)`n!*#BWj!WS>T(D8#6TZ~FbjtQY26+uCrx;XW62*X5=Y+D_5%cOo*7;Cw{HeARWc}jhWw1uxaD^pENYaZ z=-$U(fpAO}SP}}_HG5U2N7m79zvK?5g?VwtOhF$@5Ys3BN!Ui>(MNlc5@cvfsLIn0 z5@^I=^7yOwMZzy&HPOiX%MT9uSQPmA8N9WTmAbGsRF;BPpJOn85{=r?nA%71Byw=| z_h1B3pE!4vN?metRmnSy1>BhNiIx7;pExpVcpp+>{l|Z^`iYo>9Xg}o>kh15|bXzfI{^F-wRoG0s_?j!$#9ts&d1ghuGrMPD8O&(wn9%AfTk!5y~XPfh!}$qcu;dHq~MaT|5ovZ5&g2uvy5)igF7(A$VH;|UafbAkfybNBhgj7 zGR%ziy{z_PbxH+WC;`Z*3g(jPxe_+q3|@z)M?Q5>uEoWOiW2qJ+Mmy>NoX(>fnVJw z9Y?}N&w>Z*~+q|kXM#h7L&@c7EJ8&4PzpTi7HLyB{U_HG>7@6R`8uY zusG{=HhSGSQld>;vYt$rnEex?B~!x2UDe5B%+ALW9a^ktByECC9absD6D$oItplTa z#vrRbXzRJ$nAl9{$AdJL3wams?GK64PYcNe@ue-2_vjoOF0C-W+M;#jJlSkxERI;! zs~NK_*WO@%&I9?day_4PzW8>|qT38=(*C#wSO<{wa5*lTT&6deWj7C4%QUy)AxNCN zq1(pI{ER1!Iz!|`<&4H(e)Jd87Q=-jUuk$T=(CS>?yZUjyTwJ(oxgSV5*lQ4_JUG% z?u@df65pmVMzu5zJb8xguGsT@x3MbH9(;0s2jEk(o5AxeIPJBd-F)puFr^tfMonI= z;hZv%9FDm$^pR;!1J3+vYmCm>DZvI7;+)!nz`^SYaejx!qV%cW4`8p^M|&n2cAW1z z4kE`m^Z+fXrcUQQ`oJxIn9*}4*RI=in(dS>97K>$1wr{eXAgtL=@SLT=@S5TDcoFF zh@XjYDBC!VGo>>ArBz3yaV0u$NEneABfymRf- z5ka?+s#+i7!4rrc9MCfWl+-T;80Y&QM1MV(CKQllt9K};6jq9MYEIJIqHNACaHFuh{IWI0$V^SgC4 z#1-tP&8Xizg%#?Q4p2S%Q`cMXr=z%jd#Vz0OdW%BzDN`JcfG4;3*$ZN$4)=(<4W)8 zsImK^&BUPD!_yH&iIwt50Hgl;9h2{iZo&}Az&-X0fHcf2Ga2C%#jTDEohYQ_U_G`c z5{Vr`{FEV+P^^UFT&pW#7_0K9!k*JkLZ*F`M3$3*?SriNR7k@>;nqO+>Psj*3&H1) zx9zxQz@!pB{Dwd8B_AsU3?-c!JKI`@S~=ZO$fFk-(UG2kF`~fQ@na!@2Z|UxH>{0X zd)Zj6uCyua_$f+_=4iOvt@lqGFb}^Qg0`W*h%kenRY{0C$cAAt2!6RcJOIq%5)FYd zOe)6RvNw$Fz(0Z1r|&4zqa&oTqI+R7#rLw)Oz%n%&Ym1oWQSy^p=dO~sO01gK%6&t z1e4`c@~jfE+1bg+Nj{vyikeJSm6NZb>%H;xaY~4wCMOBSEqtDu0 zUg+@tv$e^TU_6c69&UE9Hk9=%sD`Cg60z!}n)k>hv=vmXjG!K0(Dbx11|rON53~qN zn`J}X6#c$+WlnkTKmq70g#6ZVf4^oRs?X>ej-l=9bYr{rixu<;DF9*BQcT!% zb71%P0qZ&y0m9TRq*gBXG%?*M@qBiFaUi!(yIb18Ah^5_>hz2BA&DcuQsd3imUnfT zYeBaV-1nJ1=GvVCw~3m3+D!OCIdI2o8;Tu5&)O9w{;s&(DOV7T0`U1KwOgo_?Y{BI zlbFm*7K~u__B7iRVC}tj;$x96jfa`gc{4Y7He4tY^5 zSb#>sdr73+E74q=Q=OZ3V(ZGkpH%v5V?9EE#mehjYC(NVEzbYiK+8GUS{NHTeZSd# zhbzsE9sjoQ{#)WQD_%;rj~_W`8U$F_i%+gU|Dp#N6Ulj>NIsG(pBVi~h%1@FIs_UB z;!9GMl=l6{C;2{dIm3$ZKK0dUCdc-JOR?=WT@AovohCmjmb=waU6L3@$R)N5_$m?t zq_?QJs-Q zL7OUfeq3wfIaD;yxfB7uK{kz+ioryN4$jhQf1XXvyylk$g9D>1s{ZtdPCTlgtm0G& zpQN2k#hj2VOFwUrBqA+=MkC%v2SsC3hUkWs9(M8lSqkMOCk)~CTMIP!CAk>&2!V!E zU9}SKbZ2s|Ln-ytx`+e0-Bb*tro457snUfLS+HSFkIV3D#1f{j_ZMuG9eY5QE0{*z zHoFqN=@lO)hTMaG@l-~dbz;JK`u*p*Tjks-W4fC}CYz1~rroffKi}}!eeoJ=sO^-* zoAz@LL(7Y>Jen%MD(XI&K&Ay{KJe)j9dj7tgkJPOuJ$3FHc!f_AY&*~tI4>@L-8UZ zjw|(Ct&+SqbwKK9xUz;k%qVoVW5~C+&oXS_$-_{S;~ZF8Br((1Lj4{Ce({#(7g5FO z{0BPzU?gTCiI>)&hbwPCGiu4`(~%%1z6 z`yy%|>Y=n}v~}=w7^J28Y#TPRedau&UT}JIQ=LW!c|sYwpSy^!Ui#t$Gt$-ElP+d8 z6tiq{mr>gd0ZqiRr9Ml;WfRj9@}wtAIa;d3E%1UB+$mbcuxcd!3^kQbm#JM{5b-)& zbsM!7c!@IF9J7uIA-aMQvu52Mfhn>aQ9@VQk+iGANS6^etaiGGlXJK}F{Fp(1(Rd} z6Vl9}QD+co=fH^+ReV4}yH;w01=i$saMogWg{G{lO(=%6%4u&-Vm0$h7!Do#fQGMe z^^g^WysSHWWc$penR&CMBwzf(Ob$w&FcPM4V(*7Y+s@P1l@+E`pZDmqY2KDEnS}O~ z0MsvsgTM3ZU~`NdjQ7MpwiG_W;asA`J~H0vyS{9q+A6&F9I z8Yn6=ViyFdo6j5-vKS!B38FEC2F-WU9!s5~$MR`fI(U=Lp<4te4V1DoYeaH4%{^c+ zWSc9p`Un>3oYofB*3TnW6eba^Q3}^7u6@vlZZe{93S%XToGZOOu_)?cKtp;13_Il% z*G4Ztr(@q+VjzD5+{EiNH@3osT_h)fwXO~0^MzuPBxc=YcYe*cfkmfd{h?>gh`k|Z zKwhpfZ9pB(wBogD!1UO3#dJ^^62Dmu<&2roO!8^@odbBwz$JZm!tL|M`LxJG@d+Ca z!T}Gk1|Nx5Db-HqHoc9vRB>Atxz}}iW{@v#hCyCcR6t{8d=6S3R-(k$t^p&#P@p0R zG-7W)gdr*4pvz-=U)_7bHxEMVLABr=;?<-~SgliVjWW~}KxbSw|Jt^kb?e}e!B0TT ziIb6d6sz|9Vri8SY?3gZX9W%K^5|)p&d|pgBJX{*kIGTF2Vtb3NP%rwGC-h$x0)v1nAY29^qlo z68EPd-&k6`JM|_t^&YYf2=i)<;eLk_IUc?AV-Og$_&}YZC6=fGZOShNOq{7fjq^)p zB#4vS!)e3J*?LCs>uhOsli(` zMRr0fN}ZTY*gH-ud{jOnf`c!MI%3#)9?|bW+ZFM>$>B;M&2cI_5_51M(Uu=ND6bo1 z*B-m#Fdic~>U@tIF}nP$8whNa3F%MO3NWeBsU9Vp@x&iv3c*$uuYIqZTwSN}F4QbWvgys&+$8vMgQ=eoAG51AJl&U`X z>c|`9EG`(Hc1Pf{>1K%`Y8>Qun_RlF$%e56L`)IPibkaYeY(~@$B3DIuu^kYIf6Ec znX`O6dMC?wBtFLo0!u@67;bp0mM0)?`5kZ*%iyoN-^^TV``{s1G`zr$F#^ZiD$CI! zz-lD1YmMFfWN$s>?UT3#Q{{kFFB)i%7dxs9`+)f>Zep_Ie8-`P1SkId{lLqs2ZNK1 zyVr4)HK+CSH2HqL(uDMsL9n-A_YRJ{zlsyh0v)qK8QbC@v-I2Yh~#gNm+fq}oG!(gAm31IQy+X>I+86Y2hR&8zo zYHy(oF|un18&)}_)Z(-i(*1GWDr+tT|34yC6(h7a zs>eWF+?raqB(P?DN~B6MS|sUI@3hpavc<_@^P?*GvP7NH9js5=0G;VwkY2Y(UTD{6 z73^T4#^7Y#@f?gW{;?4UCMf&$wXO9n2d82Tf;e8cL9N1hM%x)O@Zv+a&^IjCEC_l! z19|$ctoB;6SU{^SSd%S-G|59^upX(ap0e*lNS2^SFr$q6<9+-D0E%WromT71_kmu< zNBM31un7kT2#KlcH$S^WtRG-o zWWVT2h!&`OX^v?-SjJ+xyi9ClK#i@BDUI*P>JFo2is~m2X@CZ$f>1q7uM70=s&CLt z!IH2umt@aWSE!t*S;8e4PtEKkp{2ZIVl$hqONbmX(9!!s%H)c!{E(6lOM`7*;V`tk z3LUEy6t3J@lt)D^r#eu*G|ZCjaO}2iC8mMTrrTCPTkDCSyh27Xl=DHlcjD?CQF&ar zR#h~H4P<@a!5Fy$wDt~xY9Y={SsM!Eb6*y0h0&lFSP)}wFI42{Bq_<Kw+~ zOcOS^7Z#xM>Mv)e8wjYsq8jk~yfhVA8ph^4PlX)ji<`>)uyr?A%!+sedd=6kBSU`A zPR~izcPJbeIS*-sbzw#|4mcL7b-}rrsN)qZ>2FN(=uo7dX!yBZuZ3dfRFt=q4(N+c zmJ#rrN6UTKy724^ysspBpHT3bK>aiC}UGHP-yl{-I#72K#LO zb?D$H(syXUdDSX`R!b(L055u=M*2(^B8_R-JEW+UO*%X~%)<;)!m~-xf~fJKXe>^K z<-FUvjaRh$h3|N4{A}XMDADQS`R{PS)HH@q?-4y{24p)LofX-7}G+r5g^`Qq7Sf~4~Nu)9(V$~$#sO8iE6z^8OvVMUxM3=!^x z29#yo#tqF|9Vb=Hkm^C#9QVb$-DOcYo%ik+@a`D4wPVgflqyOdAwrj9AMz*6?!}s? zF^av7mH1o|a69g_F9i3?K0OLtkURSpY(Kjp$1`ibR~Va;&Q2aoBay~KVf->d(ZZb9 znjVxiNLe4>%Nlbv&aPqIOkjx@YRK7dDN5IUVV@+kQ3P}2vNPp#=hUyvUh$q3C&$|( zX^B`opBa10m0n{>ARi~^c?Qf4@5`F^dDGVd54cG$yt(lcG9eB8+`zEunt%Xc)WDHVgIN4WD&~5``p5BUde-DE8Y;s zd4A}nGkJgK&P)Xd#H8eOlZq2-cahfBBqSe`B+yV+nO@j#$(GDoIef9 z?}f{Gj*sFGOkqy|wT$0&j_Eetk(H59e9NcytmH)eB1tvduxbh?&LwHH+5eu8$8CMH zs~V>AvwqP2N4z`?fdP`&jW+Xl{#|&Zr3aZ{D2URyDAK|ofLBAAao4y*S>q+?N`Ex_7 znsLH5N#>I6h)!^L#k_-}@{TYmN`ig6nlVY0JG*Nh2?3`_P!>q`&i8*ERAne zc=L{y+FC)5do+1a-~!j*t)BVBGD5vCB6spSeoA<>W9yzGKvrSYP`@bDiZ0__ik2O( zA+8YdMhzofEd|yyV63_$Z+HkMD{=9S86ZbgXCIX%5Y(&2^11hV?*CzkIaa_xK{+eX0C4%R-kd(`f{Bwh&0RT=M=PjDlQNJE{JCG4vfb-5 zw(>y`a=J`Q?_Tk2WAM9kz(N~3D1H|ugeFsT&=9wWz%MmHu3thbY3bBDmTMLD%GQctjN&kT#ftTW~PUF zM)+jO+M({=A;O3?4oukQOa{4mOHcP1Y1Y845s1@bHs>(4=(VV10_K}dlXH10D7wp5 zUP(!)4B0)_%P}GH>T<%|QPK}`pks>~P6Z_~bivI7`&QLxY4r%&^_#nPkXm8wh!M{T zy#z$oY$PZM0#hcyf8 z1BIG1=o9QUDj~6iI*$FYI|qi2UD-wc%eCV?mQY{Mws_o#E0Gx zy<1yQ)OW9DsiM!skkXdhNVW^`MqxisW>e_bo+adli`aaBQq1yeuIaz)!sY`D=JXNlrk3gRQFhR(3!`cJYj=xv~dbnAj(VH zdu(puPWnL{*KCDJcc^aPWY=Uq2zVYK+=hZw9+rm~xi>eru3yVZ*VOfM?eZ-s%6?8& z-;nR$vo(p7c~!%TQp@rDlj%#L!xm&AKO)gq8kRPIVH#4fn-PZ_nfvotw~g_oE708R z)npVY1-ENKRV%-jG^vMlsYHII^1x<^2toT-6p%h~meBUAaAyApP?5&~)UkB!U@ETP z?K;v1b2kV!eqCQ}I!a+{PJIl2_*9wjzJlrCOW#HA2en~%Np?Sn3mI&cBW?+;Q6>eY z1a_eTL-MogLIUt0Uz5-MZWj+Z4!4l1H0T^bjaHgS9U}rwSjx2))$!SyVV6+Vu46}F z;iDNXayQlxhv$2CEDNUeJQ#-_)#-w+G+V)A9xo2e(&qOw07nK5Fi)Q*ayQq8yfan9?JrQibZ&H=S{>N>(@39VRe+L|kJYW>s zn-@AJGb?~W)(vvtHIiLmGlQck&U7h@qu?pgwWb?EpjcKQUOSxr%etcM%1CbpNtaQM ztEE+r?G@X_^tRUfXEMD(;3$)rl?l6KqRI?K1fkBbq^Jrpiqwps_dKcwxQo`ESi78h z&|s?w>Ngh*mhC^1X;hn;+OHb=5!eo$rhH=U`fOMERU($4WltTHPNeJBp~@gQzj-T4 zzkYqTL4C6`(nU`KLR~7D;N715bR(KQUcQTeTsdZ z=(e(XEFd(##eRB5P3N9fo5@YBt|ds{4HhK>Rtz}}W<49tXc&-IG=UHGo%B<2i?YUy z8JMiD5w6{0v{}J4SF7P?qc2Iy>E8Y9LmN^3L^2}e0|GwT(jMF?vk=Hr!CLe zYmdTqrqV0v-=O;izw5xdHeLJldYO-n-B}qUuTkov{G5{HhQV!TdjBy~d%fhkY}cVD z7waR<{(}_0Q*6`XB>|onrPxK!NB-K!@&k&f+l+o5qM>KTaH8@?A9u~*f-KzlOyU*5 zd@gWb2Pw^r_3e!%_yNxgEgq4tgTjj;4()IRMnX2e&c2Y7!{aK3`Ah=Psg8LeKrmDg z!Qfwouz^sLu|w`AeA|%uPDspP?rQg0IR>z}`Rt2wc%WRnFk-*Y=k@5B$3iToQ6_GJ zLaX^EHvZ4`RH@<$X9!HqZDdh-a8HjS!$Z=?L%GYBK`>ea^b>Zi80(QOl4D5eF%0ZD zG&lswz;^7UC}ChCXN@sOb2j0|+QBfznX?jd-(`4l7_~idrxYGHIEVuD`4oWV;9vFm z@7?{o!Qh7@hWw$_HwWZNxZ0Q+&B1u`ByYt98hwg&vVdMpBqAUr81P5fLzOr)$K>Un zo$PDShuGKnIdAj$rR=c#3ot-^m?;q%EiZZ4!)0Z$L#zLXM0QY>#Z~!`?00VU=^zM11& zTuYyI4!#XR6~Fh*<1gDVb?SfSKZ`cu%#&W2BzQ3C&8%pQiUEbz!2omWq6x~E*;vhc zqIMd!_Z3Rg(&ej%W^?uCSf4B9NAZ9#ZFEi>^vJEqFlrbbtpX#bVqFX>7^LOg^y5V- zfosmRw~BqR5)9=*VfzUaCo!2e6nike0LN1<*DPGdk14O1T!sWWEV7evc3Lov=P*c#pNe|cXIb3cPF8PhAOB_)+OlQS4PmW-8a zl$^z0qI!;QUF8GNv(loMGOs zkR-1Qi%ie@$WHU6U2UQD#zbSo1j(WahL4o$-8qd>=*vgk8iJT?#(t5v(0?~K+&2gk zRRBaD2>?NVxqctk|B5X0Z!DfAO3TVvg2<1OmD*jEn?$VmG`TUr;3A^xU?!PHPzpL- z@AJH?QJRRwRWKbkj{L#f_WGKR(>9vQZli*5x!o_1PmX1d&El8`dRaFUQkWdKMpC)j zzBVyAUXHfCy9a4Uaidy;K_py>9SdG;78O(J4f0hiK3#KdzG@AK@l_%wUh05AoT(W1 zhpU+PZ>sN0{>tY@-0{8ypT|M~4)?^XGuixzn1-+`mr_UgbzG*t(j<#(SO*@4rXl=R zXvpALjDsGFF zk|gG3i9%W|=8`pAq4(~BqgHk2{vNzy(<$0JgN1!U?~9z(ne6;0Bga3d*<^Iv1f_-M zn#oUA=`HLtXv&xi4i#Ydw}RU$Elg>ImlzAIj#q+3btv(v%S!}XSre+ANu_I_ z^jzwh*Q;}nHim>0FWP;P<*zdnlt#)b-Ee}gjSHrsa;`LzG*;ED!0Dd+a$cq7(wxL` zMwmCGz_fJn`jB^2Av3uEWDRU{6f4FoE~D#2hFe3~2F$)9flYD9h98b)Fi9FKD@3V5 zOlBQr@l#Hq{zNf&vGX{C$jzYfIz%{8T8a;;+R@!9zM|5FN7IK{%Yu~bMZbLgGA6RCHAI^yyDP)>2Ie?Q=Md2V!P(+I z5K`VBO#L-qFA#1Z`5=3DJ|mAnibX#xM*0Rcc>gtGxW1cTne%yQ2stf7N+AJ%uReT7 zG#O=Pcb|ApyQ!u=3R{(*yJ8(xewy|t!Ps!LeAks~z*j72`o`TgNrWTHK0501O{R!^ z*rKtbm8DDFydb0v`RjzJb#$V__5%~avH z+L$jTfSkGZpa*q#UI@wx{=465|>ewTeSQz^bwj@~^ z|6T!Y`mLe@-|V)pZr4DDi9nO}t9P==xK~#fHPF$=0hr#5GL#`SO?7tn9d{)`TZ{$pIwZT|lC`8{_#q z6l>GHxP!Z~l;tEJo61S3-&TO~?0WMYlZ?ilN!aJx@($?#Y zK(UC|?f{2?(F59CWKp-oRF1Cz1M4aWQ`@84BhXs}DhfRr8Cie_6hGW8eR|fWe^9b0 zbxwq5S}zSXskOSt@rQbrP+y{iVO1MJiQPnoP=;p!y}D zZ+2y-epE2PlUcd0A-T$ouCD9SDNOY%$0H+kKfgRBu89+9)Jx1xQRmWeM(%NDXHUE5 zYMr``FPEiQVoqOo$x|3zKK45M>+8D4&wh9xKN9AD6hO5C)}o#t>rW+IvBGhSA8RLU z{8rNk>T#g8s8iFFxy4;#B6(oUC(CPqcEZt93IT>t%GHFUB%VS}D8_*|&j~WuDWrdf zAnOgn*Msb`G0If}av~uPqH2JYaH-DJHeOdvL=lD!4N4n3IMeY9(|r`Ur$zgAQIG3UUt*}& zAo97QHneTVBCvZ%8Bo-mgb<9CqlwRjcS1keJ5p^$ka7^U%HUz04Ju;6;|Zsqq8_I*(R`%RPjrb1_*&H!Lh?<(V;m zc6u@POnHt^zBkdbiTf46{ai6IK!st`dW3WND}A zyndO166>Z;KazX=5B&}pjNw|har-|nA z7tczbl7o7dfraXs6C?MIYC#5(Uv*fO${0fc6Q_l)LQhs033ZXmctsG4zn{!zs9`Hb zE%n;XrV@(?6U-H~cnuc}6WPYgmw1>7D~Dn)7HWFrMjHHr|`DwP3zd#fo6E znYF+*#!{KIHOgM#G;Ww`S-}matk*2Oaqa>KIE)Z7j=5w^Q_gqXau6a1;H8%p*#)BD zwE^tvdlNJccEMg2ptFlC8}+<1_?yJ;Z$_vPIES!HDbA>(1=8T3SAwm#2%_#@TmF3s zOk6K__Y&aqrwZ`-qxgN`|HVJ-iHl!ol%{wWJ+i;FL0#hwOWUbhx6=4tDB3=HzYH=I z6b&E{0t|*Zr7Gv0xz;tvovcnAKLxGNW!`}Ed8_mbvR7?yR-aix_pxHnSp~F*+47L_ z6I!Lb4ceX)XUJcvA_kV0TW_jaAJP-k*(KWHcI*8tP?<7n#?C(mi?OMK>WyE|*aKr) zBLj#Y^y+MxTuv2)$RW|BxnEK@K_|AEi>x2)%ZGMRv1WGt6)IGwsE~8&u9wfz-;7^4 zBV`M{WMQ8#?+6B$RW#LP8FCc*f<6)#!V)|J-}*H#k0%6t=u@Qip0-v%!plm9&Gf1D z-c2OJb(b}MtHvY^9Ko^2a9*p11t&VANCeuV_*p*B46xuba{?6*@xuiZ!vYrwvl^3* zMx{pZ-27NrpUQ$*8lTFN7@VDbd)0YA?)%k8kiR#9z&PsG9-#W&p#Np`I(~fvOB;P5 zV;fsLd3&87P4xYXyGO}f9w18MVNq#iU1cN!8(TXk;=`*2$ydY+4~-Ck7-$~DI#(yD zGC8d`J8xF_F7s99W9LY}8Nn1x%2EdLk)nl@(rVDu9pvA zjxFh)Ty}U;?#mG2|R92BQ+k40!p7wR|r) zPb@=#WLQcFd@cJKb{)p;;qez2JAZ9zL$z3i9y!M%wL*<)dDSW<`OxJQ3!^&4qEb~1 ze!4w>3p$2kX_u}y!t7hitQrO;$$W!JO_*I6+H)pTVoCPGG>QX=gNgbzjU{T032dQJ z8AI?|<44JHwR!6HO=ILN?u_JE{+X)tg=%G{pvmXN7>9cSQkdj;yiEa<&Zz!;ljL)S z`rCN(jmB1PBlMrcmQ|{aqRUbTmO#EhuqY~qiWR<9Z-PlCgcv9ep4HL!&2EaUX(z#o1n|XgtN-rR6R+la&6zKdGOSh&n*I zMrbi2NZPxPGzrt;bN4YG*GNBkgA0sOj8G?Wt#CV%HJp9S>I!Tvey=N*tq7t8-bR4- zl@iS%eP%YQfwV`*u9kEDensGhH#(~;C4Y++r7BH)jSDv?n?U@&9Nd-jVCZ!D7n8lX zTM^_@0dPt^lwpJVIjPCv7-iQ*NeGxNFrQN`^aHDiG%ta@hdIgEIvJM*Q@gSx@HdA1 zC@FGPc~R8onocWRS_MiqFC6Eo*6+{3_2)KbKi$J!w{=UVbW;&tWI#=Fg@E~FHBa`# zrGL1*xN-?MU;`NTwE}zI`O%?DA9Or24ZAy~FHGu$Y6{?~^LuLcLFi%Sv2^OjxOHL3 z){tOz3D?hE+_Hg>3Afb36`)I(b6=SEcz7LS+#-#3xL<>SKu-i*kWG}{Oi4o?3eff% zV+J5-IX8xP==*>@!G=^ShE%W+ z&v7!E`K$zUynoP-R|#(Qe=dP&&XAN92?un5?+=RO9`jjL2U8B7Shdl){$+{Cl&vt0 zLxxhDRTpY1Jpdck`7FX^H@Zj$$GQFnNMA48&_aV36p-M#~?UO0Xq#^s%D z?exw6%|1qI)R0&gFS7sWT#J!OWFvMMvSVjnP<+O>BJGKqx6rfaLmg+7}DfeubO^05r2E*YpQhUJ! zp^ZP@g0v(|fB~*~)HsDD9PH4*CQlfI1k8e^uLEW2K2R^5F+TG(+)haHy-O`egtv2T zWvz#bD>;R&mBd>%ecEzRaV2WlYXudjfvlh}Z7~L~!4xu{2?FN`XJB{B^eH2IZ2*ax zml}Cgmh|E=bMPISIF;0lm&2A!+IATMqRkjiC1zQ`v)}cx6fA0H&o^{WS30;ynDIvoAxdEJO6K_{zjJoY2&F!n3^k^z3c!OTWpVYL#{;m{vpylrMOMbSkt~x935t&p#!x8%1xu42n?@$Zl_Uz$s&7}#z3`7Tw+WEQzZ2FxWs z;^!7|wn7TT!>KRxhNeU!3ar|Lw{F{cpQ`j{mPUM5%%52F?No8wZ89s^*^&PY7FDiw zoE9v;cFiA_qLuTK!-P%hxhh>Vl<0Go32MW2NGh)s{;G0ua?)Gam3-Tvj}%SysTgKk z5zwEt@yq&KQ)fpfY@t3Y^mB1kj}d#y6w&!}8tt27rKckmJ|an$yLR|t)*o}XT!$tm z#95HTL92QzzC&WYRF{Nybw0>8$`qVa&*MHiTJ;RO-9Ex6Y*z6&^DXHaUM7z-^KnHF zHnPg2v(iWKR$XhO0=ZYAzkqal?l@`~u_2!f$em+A^zhFscPRl^d=MLSdvx?Wppx`Oc?y2U;_Ww$aSM{3U zE85??l~66@6*pkDG5GwCd!D~{tN)m?{>x%xUv5$c{y|C|G6zTuteZ&Rjv+KZibFk zO&o0xZeL&E`wJor2QW_{qKtb7h*a{?`CEy%mwPU1Fj4ZiCwOuJ_X;{$OZx_V1;&LG zp`S{&oZ`nH97~-D)gU(PFLEY{8ZL^=X{{hIEuv7AN7c*DK)0^MRc4uP?xUaHH+v}a zBhjL%2)?3WaEiJu>>TR^J6Fe|3OZHL8i?*rpQy6&5M@;4`h@`;O}MC}Gck;0V;qBimxN_fVd--b#_EM; zcN7ZAPM7&)wdmEs$mZfrLX1h78jWU+iR}Yt4Az@ZaiQ4K8W_0l9Ltqt`C|OyX!_Hw zE#^pQClNp}`-W$0sa?UUJ!>v#o8lpKJ}_QtBMbo;?nC{Q(UfHgVT{Q@X}HflQldWz z6nP3Gk}{CIRqKSoWwPVY_tE}19%;DHm}hC)7sG2v66-5o{}CrSd%?c>Z7r~yFp1#1 zP!|1J7<>8MxF(j-c;>E?f`!7kgaa(3#mY?V(1IwPlh5w_n@1XgioxxyS)9>TssMGN z5TOFG_a;UmJWWh>5-fO$(QG$U?1ULFMkq)Hq<14k%8DseZ6D1FMB0Hv3yCsYURgA! z@NvbBB&sDl*5=77Q!O0J!=&w@Xbm^Be|b>e>m=h7M7!Tq-{Ed|4=jlR$@pD{z5OGCYFgD-ftPSA21l5Y;gBaix5x!&(5BBUC*CWK}LTMZp zy7vTk3Ly1P|8xs1eNDBeaqV?`^N@aW%%}1qGLN9&VZ6Qy!a8yBu%ihZDq3W3Rhjh= zyMBG!^MFHb9=f_pA9RjtC^f@<+>7hEhA>-0M*~)O1Nja)aQ*YT@azjzO$m9UyPUT@ zA7AK}Zoi-Be_n6(j5Z_uQ$i0|$p;QJ{<%SuHa`YW=+|WAAj22yd&C2ZS+g$*T>?61 zdC7Fpf!>+)z>~Ga?`WO~tHB`Qq8S9{yYA*~J4uAoO|1U5z;z3cz>MFDY7nr1)Ni|CkUEs`QtH-y)^|B1P~+AL2IvBX2!}Y`{;a z0XNZ)_wbK=SvzYrXg* zfwGOZ72p6QU^~RX*w7vjHX9H^{?B=rb;mK@1XKwI;0>eyE8~D?wbyfmKSDokPZ5Bg zh1q}0xWztx7bd_T#Tt;!Z)c_cx~jciqW%&6Zz^+t&hho~M&JnmFBKnP3it~U@T~Sq z!uca6;H03Pwwc+V(U#jK0=og_j|Ge+f3MnpfQ{h~-GblJ((ap>hn1wZu?1i&^{0f# z(^l&c#2*v@RBH{OsN{dk=q$q@p?|cRpp(9?{r?3ze~Rid$5H_gKs5uPQvMC~EkIV_ z4;lX6kAGl)%k-Zs;;FdoU(nTF^+JEd{ZXy|ZNzvgDfkl)QSy&?e{1^xCNTK4HlFI$ z{ba!cNa_5cHvV~#cq+s56E0fm|0cX2gYF+EylK(yNU+x6IEU};LsXm2&s^ReyK2ZI) zy!`_E#TIurp)XZ5Q_!BeWI zLE(Q=>FWFw)qe>Q{}lddbn~C^H@g1>|Dz@TDc1Q@s;6O6e^OzY{R^t^mG-}?>uIFP zpCsIt|AOS7<4!&;(bK?uKgnEe{)y~YBlAZtPg$PE zANt86gf2BU@-Y#5d1ny{ka5B-OPRxl%)Me z@YgKyZ#HY6mgK1y$4{a+9*>$4?@*y8l}k{= literal 0 HcmV?d00001 From aa3ac75470f28ce4292e6c3fbb8a6427472a6d32 Mon Sep 17 00:00:00 2001 From: str4d Date: Wed, 25 Jun 2014 02:50:24 +0000 Subject: [PATCH 13/43] Gradle test config improvements --- apps/i2ptunnel/build.gradle | 1 - apps/ministreaming/build.gradle | 13 ++++++++++++- apps/sam/build.gradle | 1 - apps/streaming/build.gradle | 2 +- build.gradle | 13 +++++++++---- core/build.gradle | 12 ++++++++++-- router/build.gradle | 2 +- 7 files changed, 33 insertions(+), 11 deletions(-) diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index 1b5dde3ba..54de8d7f1 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -17,7 +17,6 @@ dependencies { compile project(':core') providedCompile project(':apps:ministreaming') providedCompile project(':apps:jetty') - testCompile 'junit:junit:4.+' } war { diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle index 43ecb50b3..4152fecf7 100644 --- a/apps/ministreaming/build.gradle +++ b/apps/ministreaming/build.gradle @@ -15,5 +15,16 @@ sourceSets { dependencies { compile project(':core') - testCompile 'junit:junit:4.+' +} + +configurations { + tests +} +task testJar(type: Jar) { + baseName = 'mstreaming-test' + dependsOn classes + from sourceSets.test.output +} +artifacts { + tests testJar } diff --git a/apps/sam/build.gradle b/apps/sam/build.gradle index d6fc75672..c3bf372a7 100644 --- a/apps/sam/build.gradle +++ b/apps/sam/build.gradle @@ -14,5 +14,4 @@ sourceSets { dependencies { compile project(':core') compile project(':apps:ministreaming') - testCompile 'junit:junit:4.+' } diff --git a/apps/streaming/build.gradle b/apps/streaming/build.gradle index 2d67f24aa..2f6d9199e 100644 --- a/apps/streaming/build.gradle +++ b/apps/streaming/build.gradle @@ -14,5 +14,5 @@ sourceSets { dependencies { compile project(':core') compile project(':apps:ministreaming') - testCompile 'junit:junit:4.+' + testCompile project(path: ':apps:ministreaming', configuration: 'tests') } diff --git a/build.gradle b/build.gradle index 14e2e73e1..0bf1b1182 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,19 @@ subprojects { apply plugin: 'java' + repositories { + mavenCentral() + } + + + dependencies { + testCompile 'junit:junit:4.+' + } + sourceCompatibility = 1.5 jar { manifest { attributes 'Implementation-Version': '0.9.13-8' } } - - repositories { - mavenCentral() - } } diff --git a/core/build.gradle b/core/build.gradle index 009cd301f..912866f74 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -13,6 +13,14 @@ sourceSets { } } -dependencies { - testCompile 'junit:junit:4.+' +configurations { + tests +} +task testJar(type: Jar) { + baseName = 'i2p-test' + dependsOn classes + from sourceSets.test.output +} +artifacts { + tests testJar } diff --git a/router/build.gradle b/router/build.gradle index d90a1068e..b7cc9ffa8 100644 --- a/router/build.gradle +++ b/router/build.gradle @@ -13,5 +13,5 @@ sourceSets { dependencies { compile project(':core') - testCompile 'junit:junit:4.+' + testCompile project(path: ':core', configuration: 'tests') } From 8de0c0bd889f6b66f76649b5cd2fef7faea76a21 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 26 Jun 2014 00:00:38 +0000 Subject: [PATCH 14/43] Correct Jar/War split for addressbook, snark and i2ptunnel --- apps/addressbook/build.gradle | 4 ++++ apps/i2psnark/build.gradle | 23 ++++++++++++++++++++++- apps/i2ptunnel/build.gradle | 26 ++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/apps/addressbook/build.gradle b/apps/addressbook/build.gradle index 72c4e6f48..ff0625c61 100644 --- a/apps/addressbook/build.gradle +++ b/apps/addressbook/build.gradle @@ -13,6 +13,10 @@ dependencies { providedCompile project(':apps:jetty') } +jar { + exclude { it.name == 'Servlet.class' } +} + war { webXml = file('web.xml') } diff --git a/apps/i2psnark/build.gradle b/apps/i2psnark/build.gradle index 15c3fbec8..0c4e1f701 100644 --- a/apps/i2psnark/build.gradle +++ b/apps/i2psnark/build.gradle @@ -4,16 +4,37 @@ sourceSets { main { java { srcDir 'java/src' + include 'org/klomp/snark/web/**' + } + } + jar { + java { + srcDir 'java/src' + exclude 'org/klomp/snark/web' } } } dependencies { - compile project(':core') + jarCompile project(':core') + jarCompile project(':apps:ministreaming') + providedCompile sourceSets.jar.output providedCompile project(':apps:ministreaming') providedCompile project(':apps:jetty') } +task i2psnarkJar(type: Jar) { + from sourceSets.jar.output + manifest { + attributes 'Main-Class': 'org.klomp.snark.Snark' + attributes 'Class-Path': 'i2p.jar mstreaming.jar streaming.jar' + } +} + +artifacts { + archives i2psnarkJar +} + war { into '.icons', { from 'icons' diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index 54de8d7f1..fa266835b 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -4,6 +4,15 @@ sourceSets { main { java { srcDir 'java/src' + include 'net/i2p/i2ptunnel/web/EditBean.java' + include 'net/i2p/i2ptunnel/web/IndexBean.java' + } + } + jar { + java { + srcDir 'java/src' + exclude 'net/i2p/i2ptunnel/web/EditBean.java' + exclude 'net/i2p/i2ptunnel/web/IndexBean.java' } } test { @@ -14,11 +23,24 @@ sourceSets { } dependencies { - compile project(':core') - providedCompile project(':apps:ministreaming') + jarCompile project(':core') + jarCompile project(':apps:ministreaming') + providedCompile sourceSets.jar.output providedCompile project(':apps:jetty') } +task i2ptunnelJar(type: Jar) { + from sourceSets.jar.output + manifest { + attributes 'Main-Class': 'net.i2p.i2ptunnel.I2PTunnel' + attributes 'Class-Path': 'i2p.jar mstreaming.jar' + } +} + +artifacts { + archives i2ptunnelJar +} + war { from 'jsp' exclude 'jsp/web.xml' From 367ab2870635dc62d6a25def4a5090337f6bd1fd Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 26 Jun 2014 03:26:32 +0000 Subject: [PATCH 15/43] Corrected contents of i2p.jar router.jar utility.jar --- core/build.gradle | 4 ++++ installer/build.gradle | 10 ++++++++++ router/build.gradle | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/core/build.gradle b/core/build.gradle index 912866f74..85fd25a0b 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -5,6 +5,10 @@ sourceSets { java { srcDir 'java/src' } + resources { + srcDir 'java/src' + include 'gnu/getopt/*.properties' + } } test { java { diff --git a/installer/build.gradle b/installer/build.gradle index 28055eb49..469ff1134 100644 --- a/installer/build.gradle +++ b/installer/build.gradle @@ -10,3 +10,13 @@ dependencies { compile project(':core') runtime files('lib/wrapper/all/wrapper.jar') } + +jar { + baseName 'utility' + from project(':core').sourceSets.main.output + include 'net/i2p/installer/**' + include 'net/i2p/util/FileUtil.class' + manifest { + attributes 'Main-Class': 'net.i2p.installer.Main' + } +} diff --git a/router/build.gradle b/router/build.gradle index b7cc9ffa8..86ac0fa99 100644 --- a/router/build.gradle +++ b/router/build.gradle @@ -15,3 +15,10 @@ dependencies { compile project(':core') testCompile project(path: ':core', configuration: 'tests') } + +jar { + manifest { + // so people with very old wrapper.config files will still work with Jetty 6 + attributes 'Class-Path': 'jetty-i2p.jar jetty-java5-threadpool.jar jetty-rewrite-handler.jar jetty-sslengine.jar jetty-start.jar jetty-util.jar' + } +} From 2ef203246b54c05937d9a966113f9e343ef51295 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 26 Jun 2014 22:37:42 +0000 Subject: [PATCH 16/43] Routerconsole build script fixes --- apps/routerconsole/build.gradle | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/routerconsole/build.gradle b/apps/routerconsole/build.gradle index 2b154819c..9a773a360 100644 --- a/apps/routerconsole/build.gradle +++ b/apps/routerconsole/build.gradle @@ -18,7 +18,22 @@ dependencies { providedCompile files('../jrobin/jrobin-1.5.9.1.jar') } +jar { + manifest { + // Top level installer will rename to jrobin.jar + // DTG added in 0.8.4, not in the classpath for very old installs, + // before we changed wrapper.config to specify * + // very old installs don't have i2psnark,jstl,standard in the classpath... + // not added in WebAppConfiguration any more + // All new jetty 7 jars should have been in 0.9.6, added in 0.9.7 + attributes 'Class-Path': 'i2p.jar router.jar jrobin.jar desktopgui.jar i2psnark.jar jstl.jar standard.jar jetty-continuation.jar jetty-http.jar jetty-io.jar jetty-security.jar jetty-servlet.jar jetty-servlets.jar jetty-util.jar jetty-webapp.jar' + } +} + war { from 'jsp' + // Remove classes from the classpath, they are in the jar. + // If we return to precompiling jsps this needs to change. + classpath = [] webXml = file('jsp/web.xml') } From 3c383ca8748737df6d24ca1bae2362c704c6579c Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 29 Dec 2015 21:16:42 +0000 Subject: [PATCH 17/43] Update router and Java versions in build.gradle after prop --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 0bf1b1182..d8ef522a6 100644 --- a/build.gradle +++ b/build.gradle @@ -10,10 +10,10 @@ subprojects { testCompile 'junit:junit:4.+' } - sourceCompatibility = 1.5 + sourceCompatibility = 1.6 jar { manifest { - attributes 'Implementation-Version': '0.9.13-8' + attributes 'Implementation-Version': '0.9.23-18' } } } From 0bfe45bebe24fb79a34dbac857c0e5f9a34efa2e Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 29 Dec 2015 21:18:53 +0000 Subject: [PATCH 18/43] Start of buildscript for generating updates --- build.gradle | 2 ++ gradle/update.gradle | 78 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 gradle/update.gradle diff --git a/build.gradle b/build.gradle index d8ef522a6..2f8a41dff 100644 --- a/build.gradle +++ b/build.gradle @@ -17,3 +17,5 @@ subprojects { } } } + +//apply from: file('gradle/update.gradle') diff --git a/gradle/update.gradle b/gradle/update.gradle new file mode 100644 index 000000000..fc4cdc391 --- /dev/null +++ b/gradle/update.gradle @@ -0,0 +1,78 @@ +task prepUpdateRouter(type: Copy) { + dependsOn ':core:jar', ':router:jar' + // Pass in paths as a closure, so they are not executed during configuration + from {[ + project(':core').jar.archivePath, + project(':router').jar.archivePath + ]} + into 'pkg-temp/lib' +} + +task prepUpdateSmall(type: Copy) { + dependsOn prepUpdateRouter + dependsOn ':apps:ministreaming:jar', ':apps:streaming:jar' + dependsOn ':apps:routerconsole:jar', ':apps:i2ptunnel:i2ptunnelJar' + dependsOn ':apps:routerconsole:war', ':apps:i2ptunnel:war' + dependsOn ':apps:addressbook:war' + // Base dir + into 'pkg-temp' + into('lib') { + from {[ + project(':apps:ministreaming').jar.archivePath, + project(':apps:streaming').jar.archivePath, + project(':apps:routerconsole').jar.archivePath, + project(':apps:i2ptunnel').i2ptunnelJar.archivePath, + ]} + // pulled out of routerconsole.jar in 0.7.12, someday we can take out of updater + // name without version so we can overwrite if we upgrade + from('apps/jrobin/jrobin-1.5.9.1.jar') { + rename { 'jrobin.jar' } + } + } + into('webapps') { + from {[ + project(':apps:routerconsole').war.archivePath, + project(':apps:i2ptunnel').war.archivePath, + project(':apps:addressbook').war.archivePath, + ]} + } +} + +task prepUpdate(type: Copy) { + dependsOn prepUpdateSmall + dependsOn ':apps:BOB:jar', ':apps:sam:jar' + dependsOn ':apps:i2psnark:i2psnarkJar', ':apps:systray:jar' + //dependsOn ':apps:desktopgui:jar' + dependsOn ':apps:susidns:war', ':apps:susimail:war' + dependsOn ':apps:i2psnark:war' + // Base dir + into 'pkg-temp' + into('lib') { + from {[ + project(':apps:BOB').jar.archivePath, + project(':apps:sam').jar.archivePath, + project(':apps:i2psnark').i2psnarkJar.archivePath, + // include systray changes in 0.7.5 + project(':apps:systray').jar.archivePath, + // removed from updater in 0.9 + //project(':apps:desktopgui').jar.archivePath, + ]} + // as of 0.7.12; someday, we can remove these from the updater + from 'apps/susidns/src/WEB-INF/lib/jstl.jar' + from 'apps/susidns/src/WEB-INF/lib/standard.jar' + } + into('webapps') { + from {[ + project(':apps:susidns').war.archivePath, + project(':apps:susimail').war.archivePath, + project(':apps:i2psnark').war.archivePath, + ]} + } + from('history.txt') { + filter(org.apache.tools.ant.filters.HeadFilter, lines:1500) + } + doLast { + String more = '\n\n----------------\n\nEARLIER HISTORY IS AVAILABLE IN THE SOURCE PACKAGE' + ant.concat(more, append: 'true', destfile: 'pkg-temp/history.txt') + } +} From 6468e9e317e8bb0eb21f1b0fd4a761db866bd378 Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 10 Jul 2016 14:32:53 +0000 Subject: [PATCH 19/43] Update router version in build.gradle after prop --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2f8a41dff..ce9f97b61 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ subprojects { sourceCompatibility = 1.6 jar { manifest { - attributes 'Implementation-Version': '0.9.23-18' + attributes 'Implementation-Version': '0.9.26-3' } } } From 6d55f5bacf4f7e1b0ed0c40b284087a4f46a60e5 Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 10 Jul 2016 14:34:16 +0000 Subject: [PATCH 20/43] Update Jetty version after prop --- apps/jetty/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/jetty/build.gradle b/apps/jetty/build.gradle index 3758441a3..7920dad05 100644 --- a/apps/jetty/build.gradle +++ b/apps/jetty/build.gradle @@ -9,7 +9,7 @@ sourceSets { } dependencies { - ext.jettyVersion = '8.1.15.v20140411' + ext.jettyVersion = '8.1.17.v20150415' compile project(':core') compile 'commons-logging:commons-logging:1.0.4' compile 'org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158' From 7b221fa239e6094d1dbbe9e3154f9aabe134ebb4 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 04:32:08 +0000 Subject: [PATCH 21/43] Update router version in build.gradle after prop --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ce9f97b61..5de3e25b1 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ subprojects { sourceCompatibility = 1.6 jar { manifest { - attributes 'Implementation-Version': '0.9.26-3' + attributes 'Implementation-Version': '0.9.31-7' } } } From 72081a8647cfc9b123d0fa2239fd6141227702a5 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 06:12:50 +0000 Subject: [PATCH 22/43] Upgrade Gradle & wrapper to 4.3 --- gradle/wrapper/gradle-wrapper.jar | Bin 51348 -> 54727 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 110 ++++++++++++----------- gradlew.bat | 14 +-- 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 0087cd3b18659b5577cf6ad3ef61f8eb9416ebba..27768f1bbac3ce2d055b20d521f12da78d331e8e 100644 GIT binary patch delta 39489 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%0D0!TzxX$Txox`9-hhh~i0DaJ% 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 +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730b..e95643d6a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From 041f5478a4ad8a85bcc23d42522996f5326ec8bf Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 06:13:12 +0000 Subject: [PATCH 23/43] Use JCenter repository (which pulls from Maven Central) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5de3e25b1..8b6a1576c 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ subprojects { apply plugin: 'java' repositories { - mavenCentral() + jcenter() } From c78af828acf866bac274db0626f7c29f16200d99 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 06:13:24 +0000 Subject: [PATCH 24/43] Add missing test dependency --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 8b6a1576c..4a96ae77f 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ subprojects { dependencies { testCompile 'junit:junit:4.+' + testCompile 'org.hamcrest:hamcrest-library:1.3' } sourceCompatibility = 1.6 From 2ca658174ad1bb1a2c4d2848da66fdc84021d57f Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 07:14:39 +0000 Subject: [PATCH 25/43] Set Java 7 build target for all projects --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4a96ae77f..fd7f17aea 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ subprojects { testCompile 'org.hamcrest:hamcrest-library:1.3' } - sourceCompatibility = 1.6 + sourceCompatibility = 1.7 jar { manifest { attributes 'Implementation-Version': '0.9.31-7' From 113f2c4d1428a52e9b7469c71a6359c6e2e242a6 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 07:16:07 +0000 Subject: [PATCH 26/43] Gradle build script for JRobin --- apps/jrobin/build.gradle | 11 +++++++++++ apps/routerconsole/build.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 apps/jrobin/build.gradle diff --git a/apps/jrobin/build.gradle b/apps/jrobin/build.gradle new file mode 100644 index 000000000..5efcf77b9 --- /dev/null +++ b/apps/jrobin/build.gradle @@ -0,0 +1,11 @@ +sourceSets { + main { + java { + srcDir 'java/src' + } + } +} + +dependencies { + compile project(':core') +} diff --git a/apps/routerconsole/build.gradle b/apps/routerconsole/build.gradle index 9a773a360..000fa5cc8 100644 --- a/apps/routerconsole/build.gradle +++ b/apps/routerconsole/build.gradle @@ -15,7 +15,7 @@ dependencies { providedCompile project(':apps:desktopgui') providedCompile project(':apps:systray') providedCompile project(':apps:jetty') - providedCompile files('../jrobin/jrobin-1.5.9.1.jar') + providedCompile project(':apps:jrobin') } jar { diff --git a/settings.gradle b/settings.gradle index 9138c7c50..4c8f7e820 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:routerconsole', 'apps:addressbook', 'apps:susidns', 'apps:susimail', 'apps:i2psnark', 'apps:i2ptunnel', 'apps:BOB', 'apps:sam' +include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:jrobin', 'apps:routerconsole', 'apps:addressbook', 'apps:susidns', 'apps:susimail', 'apps:i2psnark', 'apps:i2ptunnel', 'apps:BOB', 'apps:sam' From 62d34f51cb9a59369dd3f9bfc8808bf70ae0209c Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 08:14:21 +0000 Subject: [PATCH 27/43] Addressbook has moved from war to jar --- apps/addressbook/build.gradle | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/apps/addressbook/build.gradle b/apps/addressbook/build.gradle index ff0625c61..184c59c9a 100644 --- a/apps/addressbook/build.gradle +++ b/apps/addressbook/build.gradle @@ -1,5 +1,3 @@ -apply plugin: 'war' - sourceSets { main { java { @@ -10,13 +8,5 @@ sourceSets { dependencies { compile project(':core') - providedCompile project(':apps:jetty') -} - -jar { - exclude { it.name == 'Servlet.class' } -} - -war { - webXml = file('web.xml') + compile project(':apps:jetty') } From a0b316e56d51b9dfb558b4b988e9e1050e6c257a Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 08:15:10 +0000 Subject: [PATCH 28/43] Update Jetty version after prop --- apps/jetty/build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/jetty/build.gradle b/apps/jetty/build.gradle index 7920dad05..ef13b9c2f 100644 --- a/apps/jetty/build.gradle +++ b/apps/jetty/build.gradle @@ -9,7 +9,8 @@ sourceSets { } dependencies { - ext.jettyVersion = '8.1.17.v20150415' + ext.jettyVersion = '9.2.21.v20170120' + ext.tomcatVersion = '8.0.33' compile project(':core') compile 'commons-logging:commons-logging:1.0.4' compile 'org.eclipse.jetty.orbit:javax.servlet.jsp:2.2.0.v201112011158' @@ -17,14 +18,17 @@ dependencies { compile 'org.eclipse.jetty:jetty-io:' + ext.jettyVersion compile 'org.eclipse.jetty:jetty-security:' + ext.jettyVersion compile 'org.eclipse.jetty:jetty-server:' + ext.jettyVersion + compile 'org.eclipse.jetty:jetty-servlet:' + ext.jettyVersion compile 'org.eclipse.jetty:jetty-util:' + ext.jettyVersion compile 'org.eclipse.jetty:jetty-xml:' + ext.jettyVersion + runtime 'org.eclipse.jetty:apache-jsp:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-continuation:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-deploy:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-jmx:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-rewrite:' + ext.jettyVersion - runtime 'org.eclipse.jetty:jetty-servlet:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-servlets:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-start:' + ext.jettyVersion runtime 'org.eclipse.jetty:jetty-webapp:' + ext.jettyVersion + runtime 'org.mortbay.jasper:apache-el:' + ext.tomcatVersion + runtime 'org.mortbay.jasper:apache-jsp:' + ext.tomcatVersion } From bf4cb419a16fc2cbc5a1f52a543c74cfe63d73a3 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 08:15:51 +0000 Subject: [PATCH 29/43] Update i2psnark Gradle build script --- apps/i2psnark/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/i2psnark/build.gradle b/apps/i2psnark/build.gradle index 0c4e1f701..8dac33f36 100644 --- a/apps/i2psnark/build.gradle +++ b/apps/i2psnark/build.gradle @@ -10,6 +10,7 @@ sourceSets { jar { java { srcDir 'java/src' + exclude 'org/klomp/snark/standalone' exclude 'org/klomp/snark/web' } } @@ -18,6 +19,7 @@ sourceSets { dependencies { jarCompile project(':core') jarCompile project(':apps:ministreaming') + jarCompile project(':apps:systray') providedCompile sourceSets.jar.output providedCompile project(':apps:ministreaming') providedCompile project(':apps:jetty') From 3eef793bda3c9e460ba99956916111aea9000f5f Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 08:35:04 +0000 Subject: [PATCH 30/43] Add bootstrap classpath JARs if necessary --- build.gradle | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fd7f17aea..d75b497c9 100644 --- a/build.gradle +++ b/build.gradle @@ -11,12 +11,19 @@ subprojects { testCompile 'org.hamcrest:hamcrest-library:1.3' } - sourceCompatibility = 1.7 jar { manifest { attributes 'Implementation-Version': '0.9.31-7' } } + + sourceCompatibility = 1.7 + // Set bootClasspath=/path/to/rt.jar:/path/to/jce.jar in gradle.properties if needed + if (bootClasspath) { + tasks.withType(AbstractCompile, { AbstractCompile ac -> + ac.options.bootstrapClasspath = files(bootClasspath) + }) + } } //apply from: file('gradle/update.gradle') From 76629741f1eed38512cb0be800a5859e426419e3 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 31 Oct 2017 12:50:30 +0000 Subject: [PATCH 31/43] Add EdDSA test vectors to test resources --- core/build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/build.gradle b/core/build.gradle index 85fd25a0b..76a211b4a 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -14,6 +14,12 @@ sourceSets { java { srcDir 'java/test/junit' } + resources { + srcDir 'java/test/junit' + include 'net/i2p/crypto/eddsa/test.data' + include 'net/i2p/crypto/eddsa/math/baseDblPrecmp' + include 'net/i2p/crypto/eddsa/math/basePrecmp' + } } } From a3df4a399cdb9cd8bdc00a6edd6ca68d5bf775aa Mon Sep 17 00:00:00 2001 From: zab2 Date: Thu, 2 Nov 2017 19:04:40 +0000 Subject: [PATCH 32/43] eclipse users rejoice --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index d75b497c9..1e8af45e0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ subprojects { apply plugin: 'java' + apply plugin: 'eclipse' repositories { jcenter() From 69bd0571d4cf88046e411b54a5363bd9a27f2dfb Mon Sep 17 00:00:00 2001 From: zab2 Date: Thu, 2 Nov 2017 19:57:21 +0000 Subject: [PATCH 33/43] add mockito --- apps/ministreaming/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle index 4152fecf7..978d9377c 100644 --- a/apps/ministreaming/build.gradle +++ b/apps/ministreaming/build.gradle @@ -15,6 +15,8 @@ sourceSets { dependencies { compile project(':core') + + testCompile 'org.mockito:mockito-core:2.11.0' } configurations { From bf639478c7d0281e118b1847884ae1d537aa9c2b Mon Sep 17 00:00:00 2001 From: zab2 Date: Thu, 2 Nov 2017 20:15:48 +0000 Subject: [PATCH 34/43] add mockito to top level --- apps/ministreaming/build.gradle | 2 -- build.gradle | 12 +++++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle index 978d9377c..4152fecf7 100644 --- a/apps/ministreaming/build.gradle +++ b/apps/ministreaming/build.gradle @@ -15,8 +15,6 @@ sourceSets { dependencies { compile project(':core') - - testCompile 'org.mockito:mockito-core:2.11.0' } configurations { diff --git a/build.gradle b/build.gradle index 1e8af45e0..f17811d9a 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ subprojects { dependencies { testCompile 'junit:junit:4.+' testCompile 'org.hamcrest:hamcrest-library:1.3' + testCompile 'org.mockito:mockito-core:2.11.0' } jar { @@ -20,11 +21,12 @@ subprojects { sourceCompatibility = 1.7 // Set bootClasspath=/path/to/rt.jar:/path/to/jce.jar in gradle.properties if needed - if (bootClasspath) { - tasks.withType(AbstractCompile, { AbstractCompile ac -> - ac.options.bootstrapClasspath = files(bootClasspath) - }) - } +// Please check if you forgot to check in gradle.properties --zab +// if (bootClasspath) { +// tasks.withType(AbstractCompile, { AbstractCompile ac -> +// ac.options.bootstrapClasspath = files(bootClasspath) +// }) +// } } //apply from: file('gradle/update.gradle') From ab69fab3e49baf5dae1b2d7fb798ad2944a1b035 Mon Sep 17 00:00:00 2001 From: zab2 Date: Thu, 2 Nov 2017 20:23:32 +0000 Subject: [PATCH 35/43] add mini-streaming to testCompile dependencies as well --- apps/i2ptunnel/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index fa266835b..306268a8a 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -25,6 +25,7 @@ sourceSets { dependencies { jarCompile project(':core') jarCompile project(':apps:ministreaming') + testCompile project(':apps:ministreaming') providedCompile sourceSets.jar.output providedCompile project(':apps:jetty') } From d3cdf3c7d7dadaab55ca4c2077357ea29e04bd93 Mon Sep 17 00:00:00 2001 From: zab2 Date: Fri, 3 Nov 2017 00:11:51 +0000 Subject: [PATCH 36/43] switch to single source multiple jar approach --- apps/i2ptunnel/build.gradle | 40 +++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index 306268a8a..b55278b16 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -4,15 +4,6 @@ sourceSets { main { java { srcDir 'java/src' - include 'net/i2p/i2ptunnel/web/EditBean.java' - include 'net/i2p/i2ptunnel/web/IndexBean.java' - } - } - jar { - java { - srcDir 'java/src' - exclude 'net/i2p/i2ptunnel/web/EditBean.java' - exclude 'net/i2p/i2ptunnel/web/IndexBean.java' } } test { @@ -23,23 +14,41 @@ sourceSets { } dependencies { - jarCompile project(':core') - jarCompile project(':apps:ministreaming') - testCompile project(':apps:ministreaming') - providedCompile sourceSets.jar.output + compile project(':core') + compile project(':apps:ministreaming') providedCompile project(':apps:jetty') } task i2ptunnelJar(type: Jar) { - from sourceSets.jar.output + from sourceSets.main.output + exclude '**/ui/*.class' + exclude '**/EditBean.class' + exclude '**/IndexBean.class' manifest { attributes 'Main-Class': 'net.i2p.i2ptunnel.I2PTunnel' attributes 'Class-Path': 'i2p.jar mstreaming.jar' } } +task tempBeansJar(type: Jar) { + from sourceSets.main.output + include '**/EditBean.class' + include '**/ui/*.class' + include '**/IndexBean.class' + baseName = 'temp-beans' +} + +task uiJar(type: Jar) { + baseName = 'i2ptunnel-ui.jar' + from sourceSets.main.output + include '**/ui/*.class' + manifest { + attributes 'Class-Path' : 'i2p.jar mstreaming.jar i2ptunnel.jar' + } +} + artifacts { - archives i2ptunnelJar + archives i2ptunnelJar, tempBeansJar, uiJar } war { @@ -47,3 +56,4 @@ war { exclude 'jsp/web.xml' webXml = file('jsp/web.xml') } + From 6cd560ff1b5e8c25f1389eecc399f40c78c6f508 Mon Sep 17 00:00:00 2001 From: zab2 Date: Fri, 3 Nov 2017 00:33:09 +0000 Subject: [PATCH 37/43] fix name --- apps/i2ptunnel/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index b55278b16..d19c2dc44 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -39,7 +39,7 @@ task tempBeansJar(type: Jar) { } task uiJar(type: Jar) { - baseName = 'i2ptunnel-ui.jar' + baseName = 'i2ptunnel-ui' from sourceSets.main.output include '**/ui/*.class' manifest { From e34ab0b7a8b26323a3a7fd242787a720fc471b8a Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 3 Nov 2017 00:53:36 +0000 Subject: [PATCH 38/43] Indentation --- apps/i2ptunnel/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/i2ptunnel/build.gradle b/apps/i2ptunnel/build.gradle index d19c2dc44..527f5135b 100644 --- a/apps/i2ptunnel/build.gradle +++ b/apps/i2ptunnel/build.gradle @@ -48,7 +48,7 @@ task uiJar(type: Jar) { } artifacts { - archives i2ptunnelJar, tempBeansJar, uiJar + archives i2ptunnelJar, tempBeansJar, uiJar } war { From 49d970c5bc58e0361ced6b006f9b22cfca6f4c97 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 3 Nov 2017 01:05:37 +0000 Subject: [PATCH 39/43] Fix compilation without bootstrap classpath set --- build.gradle | 13 ++++++------- gradle.properties | 2 ++ 2 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 gradle.properties diff --git a/build.gradle b/build.gradle index f17811d9a..8ccdfd252 100644 --- a/build.gradle +++ b/build.gradle @@ -20,13 +20,12 @@ subprojects { } sourceCompatibility = 1.7 - // Set bootClasspath=/path/to/rt.jar:/path/to/jce.jar in gradle.properties if needed -// Please check if you forgot to check in gradle.properties --zab -// if (bootClasspath) { -// tasks.withType(AbstractCompile, { AbstractCompile ac -> -// ac.options.bootstrapClasspath = files(bootClasspath) -// }) -// } + // Set i2pBootClasspath=/path/to/rt.jar:/path/to/jce.jar in ~/.gradle/gradle.properties if needed + if (i2pBootClasspath) { + tasks.withType(AbstractCompile, { AbstractCompile ac -> + ac.options.bootstrapClasspath = files(i2pBootClasspath) + }) + } } //apply from: file('gradle/update.gradle') diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..63fe06e83 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +# Override these in ~/.gradle/gradle.properties if necessary +i2pBootClasspath= From 3f4daede8fdf43c5b7189cbce6c8a5e9c08831a4 Mon Sep 17 00:00:00 2001 From: zab2 Date: Fri, 3 Nov 2017 18:23:49 +0000 Subject: [PATCH 40/43] switch to a single sourceSet. This fixes the last remaining problem with one-click import in eclipse --- apps/i2psnark/build.gradle | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/apps/i2psnark/build.gradle b/apps/i2psnark/build.gradle index 8dac33f36..23137a085 100644 --- a/apps/i2psnark/build.gradle +++ b/apps/i2psnark/build.gradle @@ -4,35 +4,29 @@ sourceSets { main { java { srcDir 'java/src' - include 'org/klomp/snark/web/**' - } - } - jar { - java { - srcDir 'java/src' - exclude 'org/klomp/snark/standalone' - exclude 'org/klomp/snark/web' } } } dependencies { - jarCompile project(':core') - jarCompile project(':apps:ministreaming') - jarCompile project(':apps:systray') - providedCompile sourceSets.jar.output + compile project(':core') + compile project(':apps:systray') providedCompile project(':apps:ministreaming') providedCompile project(':apps:jetty') } task i2psnarkJar(type: Jar) { - from sourceSets.jar.output + from sourceSets.main.output + exclude 'org/klomp/snark/standalone/**' + exclude 'org/klomp/snark/web/**' manifest { attributes 'Main-Class': 'org.klomp.snark.Snark' attributes 'Class-Path': 'i2p.jar mstreaming.jar streaming.jar' } } +// TODO: standalone jar. This is rather involved! + artifacts { archives i2psnarkJar } From 3acb7a5c28d73f61ac8de7c7d4b70a2efbdad71c Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 26 Nov 2017 23:20:24 +0000 Subject: [PATCH 41/43] Apply java-library plugin to published libraries --- apps/ministreaming/build.gradle | 4 +++- apps/streaming/build.gradle | 8 +++++--- core/build.gradle | 2 ++ router/build.gradle | 6 ++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/ministreaming/build.gradle b/apps/ministreaming/build.gradle index 4152fecf7..ee5001ea1 100644 --- a/apps/ministreaming/build.gradle +++ b/apps/ministreaming/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'java-library' + archivesBaseName = 'mstreaming' sourceSets { @@ -14,7 +16,7 @@ sourceSets { } dependencies { - compile project(':core') + api project(':core') } configurations { diff --git a/apps/streaming/build.gradle b/apps/streaming/build.gradle index 2f6d9199e..45bd7e1ee 100644 --- a/apps/streaming/build.gradle +++ b/apps/streaming/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'java-library' + sourceSets { main { java { @@ -12,7 +14,7 @@ sourceSets { } dependencies { - compile project(':core') - compile project(':apps:ministreaming') - testCompile project(path: ':apps:ministreaming', configuration: 'tests') + api project(':core') + api project(':apps:ministreaming') + testImplementation project(path: ':apps:ministreaming', configuration: 'tests') } diff --git a/core/build.gradle b/core/build.gradle index 76a211b4a..5f37909d8 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'java-library' + archivesBaseName = 'i2p' sourceSets { diff --git a/router/build.gradle b/router/build.gradle index 86ac0fa99..e38bb9688 100644 --- a/router/build.gradle +++ b/router/build.gradle @@ -1,3 +1,5 @@ +apply plugin: 'java-library' + sourceSets { main { java { @@ -12,8 +14,8 @@ sourceSets { } dependencies { - compile project(':core') - testCompile project(path: ':core', configuration: 'tests') + api project(':core') + testImplementation project(path: ':core', configuration: 'tests') } jar { From 89f2a7640956e358146b9411a5ec1ed78eaf40be Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 26 Nov 2017 23:27:59 +0000 Subject: [PATCH 42/43] Update README --- README.md | 16 +++++++++++++++- README.txt | 21 ++++++++++----------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b95d853d1..06abba8f6 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ To get development branch from source control: https://geti2p.net/newdevelopers http://www.gnu.org/software/gettext/ - Build environment must use a UTF-8 locale. -### Build process +### Ant build process On x86 systems do: @@ -46,6 +46,20 @@ On non-x86, use one of the following instead: Run 'ant' with no arguments to see other build options. +### Gradle build process + +Full builds of installers or updates are not yet possible, but the code can be +compiled with: + + ./gradlew assemble + +This will download dependencies over the clearnet by default, including Gradle +itself. To download through a SOCKS proxy (e.g. Tor), add the following lines to +your `~/.gradle/gradle.properties`: + + systemProp.socksProxyHost=localhost + systemProp.socksProxyPort=9150 + ## Contact info Need help? See the IRC channel #i2p on irc.freenode.net diff --git a/README.txt b/README.txt index 786c09138..c13095993 100644 --- a/README.txt +++ b/README.txt @@ -8,17 +8,6 @@ Prerequisites to build from source: Build environment must use a UTF-8 locale. To build: - Full builds are not yet possible, but the command is: - ./gradlew assemble - - gradlew will download dependencies over the clearnet by default, including - Gradle itself. To download over Tor, create a gradle.properties file - containing: - systemProp.socksProxyHost=localhost - systemProp.socksProxyPort=9150 - -Old build system: -(This will be deprecated once the Gradle build system is fully functional) On x86 systems do: ant pkg @@ -30,6 +19,16 @@ Old build system: Run 'ant' with no arguments to see other build options. See INSTALL.txt or https://geti2p.net/download for installation instructions. +Gradle build system: + Full builds are not yet possible, but the command is: + ./gradlew assemble + + gradlew will download dependencies over the clearnet by default, including + Gradle itself. To download over Tor, create a gradle.properties file + containing: + systemProp.socksProxyHost=localhost + systemProp.socksProxyPort=9150 + Documentation: https://geti2p.net/how API: http://docs.i2p-projekt.de/javadoc/ From 27d8b0ee3d2ea2726e3a48273ba476c3432870d3 Mon Sep 17 00:00:00 2001 From: str4d Date: Mon, 27 Nov 2017 00:34:02 +0000 Subject: [PATCH 43/43] Make settings.gradle more readable --- settings.gradle | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 4c8f7e820..580063a4c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,17 @@ -include 'core', 'router', 'installer', 'apps:ministreaming', 'apps:streaming', 'apps:desktopgui', 'apps:systray', 'apps:jetty', 'apps:jrobin', 'apps:routerconsole', 'apps:addressbook', 'apps:susidns', 'apps:susimail', 'apps:i2psnark', 'apps:i2ptunnel', 'apps:BOB', 'apps:sam' +include 'apps:addressbook' +include 'apps:BOB' +include 'apps:desktopgui' +include 'apps:i2psnark' +include 'apps:i2ptunnel' +include 'apps:jetty' +include 'apps:jrobin' +include 'apps:ministreaming' +include 'apps:routerconsole' +include 'apps:sam' +include 'apps:streaming' +include 'apps:susidns' +include 'apps:susimail' +include 'apps:systray' +include 'core' +include 'installer' +include 'router'