diff --git a/.env b/.env
index c9d5d9c5..34d924dc 100644
--- a/.env
+++ b/.env
@@ -1,4 +1,4 @@
-CHANGELOG_START_TAG=mstor-1.0.0
+CHANGELOG_START_TAG=mstor-1.0.2
CHANGELOG_END_TAG=HEAD
-GRADLE_VERSION=6.9.1
+GRADLE_VERSION=7.6
diff --git a/.github/workflows/publish-site.yml b/.github/workflows/publish-site.yml
new file mode 100644
index 00000000..eb8018a6
--- /dev/null
+++ b/.github/workflows/publish-site.yml
@@ -0,0 +1,17 @@
+name: publish-site
+on:
+ push:
+ branches:
+ - master
+ - feature/refactor
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ with:
+ python-version: 3.x
+ - run: pip install mkdocs-material
+ - run: mkdocs gh-deploy --force
+
\ No newline at end of file
diff --git a/.github/workflows/publish-snapshots.yml b/.github/workflows/publish-snapshots.yml
index b50940dc..60d39a96 100644
--- a/.github/workflows/publish-snapshots.yml
+++ b/.github/workflows/publish-snapshots.yml
@@ -4,6 +4,7 @@ on:
push:
branches:
- 'develop'
+ - 'feature/refactor'
jobs:
gradle:
diff --git a/.gitignore b/.gitignore
index c7d0376f..0a7ccb8a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,9 @@
-/target
+target
/.settings
/.classpath
/.project
-/build
-/.gradle
+build
+.gradle
/bin
.idea
mstor.iml
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 16a02859..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-#before_cache:
-# - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
-# - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
-cache:
- directories:
- #- $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
-sudo: false
-dist: trusty
-language: java
-jdk:
- - oraclejdk8
- - openjdk8
-env:
- - GRADLE_OPTS="-Xmx512m -XX:MaxPermSize=256m"
-script:
- - ./gradlew build jacocoTestReport
-after_success:
- - bash <(curl -s https://codecov.io/bash)
-deploy:
- provider: script
- script: ./gradlew -Prelease.customUsername=$GIT_USER -Prelease.customPassword=$GIT_PASSWORD -Prelease.disableChecks -Prelease.pushTagsOnly release bintrayUpload
- on:
- branch: master
- jdk: oraclejdk8
diff --git a/Makefile b/Makefile
index 30ba62fd..f107470b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
SHELL:=/bin/bash
include .env
+NEXT_VERSION=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
+
.PHONY: all gradlew clean build changelog currentVersion markNextVersion verify release publish
all: test
@@ -25,7 +27,6 @@ currentVersion:
./gradlew -q currentVersion
markNextVersion:
- NEXT_VERSION=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
./gradlew markNextVersion -Prelease.version=$(NEXT_VERSION)
verify:
diff --git a/build.gradle b/build.gradle
index 26995754..5dc21c52 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,13 +5,13 @@ buildscript {
}
plugins {
+ id 'java'
+ id 'java-library'
id 'pl.allegro.tech.build.axion-release' version '1.13.3'
- id "nebula.provided-base" version "3.0.3"
+ id "nebula.provided-base" version "7.0.0"
id "biz.aQute.bnd.builder" version "$bndVersion"
}
-apply plugin: 'java'
-apply plugin: 'java-library'
apply plugin: 'eclipse'
apply plugin: 'groovy'
//apply plugin: 'checkstyle'
@@ -46,7 +46,7 @@ repositories {
}
dependencies {
- api "com.sun.mail:jakarta.mail:$jakartaMailVersion",
+ api "jakarta.mail:jakarta.mail-api:$jakartaMailVersion",
"org.slf4j:slf4j-api:$slf4jVersion"
implementation "org.apache.commons:commons-lang3:$commonsLangVersion",
@@ -62,13 +62,13 @@ dependencies {
"cglib:cglib:$cglibVersion",
"org.slf4j:jul-to-slf4j:$slf4jVersion", "org.slf4j:jcl-over-slf4j:$slf4jVersion",
"org.apache.jackrabbit:jackrabbit-jcr-rmi:$jackrabbitVersion"
-
+
implementation "org.jparsec:jparsec:$jparsecVersion", optional
// used in javadoc generation..
compileOnly 'biz.aQute.bnd:bndlib:2.4.0'
- runtime "commons-logging:commons-logging:$commonsLoggingVersion"
+ runtimeOnly "commons-logging:commons-logging:$commonsLoggingVersion"
testImplementation "org.apache.jackrabbit:jackrabbit-core:$jackrabbitVersion",
"junit:junit:$junitVersion",
@@ -80,6 +80,15 @@ dependencies {
// spock
testImplementation platform("org.spockframework:spock-bom:2.0-M4-groovy-3.0"),
"org.spockframework:spock-core"
+
+ // testcontainers
+ testImplementation "org.testcontainers:testcontainers:$testcontainersVersion",
+ "org.testcontainers:spock:$testcontainersVersion"
+}
+
+java {
+ withJavadocJar()
+ withSourcesJar()
}
jacocoTestReport {
@@ -98,35 +107,22 @@ javadoc {
}
}
-task javadocJar(type: Jar, dependsOn: javadoc) {
- archiveClassifier.set('javadoc')
- from 'build/docs/javadoc'
-}
-
-task sourcesJar(type: Jar) {
- from sourceSets.main.allSource
- archiveClassifier.set('sources')
-}
-
-artifacts {
- archives jar
- archives javadocJar
- archives sourcesJar
-}
-
scmVersion {
tag {
prefix = 'mstor-'
}
versionCreator 'versionWithBranch'
- branchVersionCreator = ['master': 'simple']
+ branchVersionCreator = [
+ 'master': 'simple',
+ 'feature/refactor': 'simple'
+ ]
nextVersion {
suffix = 'pre'
separator = '-'
}
}
-group = 'org.mnode.mstor'
+group = 'org.mstor'
description = '''
An mbox provider for JavaMail
'''
@@ -137,6 +133,8 @@ ext {
}
test {
+ useJUnitPlatform()
+
include '**/*Test.class'
include '**/*Spec.class'
@@ -159,8 +157,6 @@ publishing {
publications {
mstor(MavenPublication) {
from components.java
- artifact javadocJar
- artifact sourcesJar
pom.withXml {
asNode().appendNode('name', project.name)
asNode().appendNode('description', project.description)
@@ -186,7 +182,7 @@ publishing {
repositories {
maven {
name = "OSSRH"
- url = !isReleaseVersion ? "https://oss.sonatype.org/content/repositories/snapshots/" : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
+ url = !isReleaseVersion ? "https://s01.oss.sonatype.org/content/repositories/snapshots/" : "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
credentials {
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 00000000..44fa03c1
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+www.mstor.org
\ No newline at end of file
diff --git a/docs/images/cherry.png b/docs/images/cherry.png
new file mode 100644
index 00000000..5d157c46
Binary files /dev/null and b/docs/images/cherry.png differ
diff --git a/docs/images/mnode_logo.png b/docs/images/mnode_logo.png
new file mode 100644
index 00000000..5d3e2404
Binary files /dev/null and b/docs/images/mnode_logo.png differ
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..fd79d479
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,31 @@
+# mStor - Universal message archival and storage
+
+mStor is a Java library that supports persistence of various forms of digital communications, such as Email
+and Instant Messaging.
+
+## Overview
+
+Messaging specifications typically define encoding and metadata, but are relatively agnostic to the content.
+So too is mStor, which focuses on supporting persistence of metadata and a suitably encoded message body.
+
+## JavaMail
+
+The origins of mStor are as a JavaMail provider for the unofficial mbox specification. JavaMail is still
+supported, however the intention is to also support storage of other communications such as Instant
+Messaging via a universal API. This would theoretically allow messages to be stored and retrieved as either
+Email or Instant Messaging interchangeably.
+
+## JMAP
+
+JMAP is a relatively new API from Fastmail, designed to support Web-based Email clients.
+
+## Tinkerpop
+
+Tinkerpop is an open API for interacting with graph databases. This is potentially useful for capturing
+relationships between messages, senders and recipients, and can support powerful analytics and reporting
+on large data sets.
+
+## DynamoDB
+
+DynamoDB is a highly scalable NoSQL database from AWS. It can efficiently store large amounts of metadata
+and efficiently query on a well-designed schema.
diff --git a/docs/javamail.md b/docs/javamail.md
new file mode 100644
index 00000000..d66f7b3f
--- /dev/null
+++ b/docs/javamail.md
@@ -0,0 +1,2 @@
+# MStor Javamail Provider
+
diff --git a/etc/plugin.xml b/etc/plugin.xml
deleted file mode 100644
index 05ecc31c..00000000
--- a/etc/plugin.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 50a0acff..f0fbba3e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,20 +1,22 @@
-jakartaMailVersion = 1.6.7
-slf4jVersion = 1.7.32
-groovyVersion = 3.0.8
+jakartaMailVersion = 2.1.1
+slf4jVersion = 2.0.7
+groovyVersion = 3.0.17
commonsLangVersion = 3.12.0
commonsNetVersion = 3.8.0
commonsIoVersion = 2.11.0
commonsLoggingVersion = 1.2
cglibVersion = 3.3.0
jdomVersion = 1.1
-xstreamVersion = 1.4.18
+xstreamVersion = 1.4.19
jyamlVersion = 1.3
jcrVersion = 2.0
jcromVersion = 2.2.0
ehcacheVersion = 2.6.11
jparsecVersion = 3.1
-bndVersion = 6.1.0
-jackrabbitVersion = 2.21.9
+jackrabbitVersion = 2.21.10
logbackVersion = 1.2.10
junitVersion = '4.13'
+
+testcontainersVersion = 1.16.2
+bndVersion = 6.3.1
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 62d4c053..e708b1c0 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 3ab0b725..070cb702 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index fbd7c515..4f906e0c 100755
--- a/gradlew
+++ b/gradlew
@@ -130,7 +130,7 @@ fi
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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
diff --git a/gradlew.bat b/gradlew.bat
index 5093609d..107acd32 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -54,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -64,21 +64,6 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_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=%*
-
:execute
@rem Setup the command line
@@ -86,7 +71,7 @@ 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%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy b/src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy
similarity index 95%
rename from src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy
index fc1d8cd1..db739372 100644
--- a/src/main/groovy/net/fortuna/mstor/InternetAddressFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/InternetAddressFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor
+package org.mstor.provider.mail
-import javax.mail.Message.RecipientType
-import javax.mail.internet.InternetAddress
+import jakarta.mail.Message.RecipientType
+import jakarta.mail.internet.InternetAddress
class InternetAddressFactory extends AbstractFactory {
diff --git a/src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy b/src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy
rename to src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy
index 5e77b5aa..4252a0bb 100644
--- a/src/main/groovy/net/fortuna/mstor/MessageBuilder.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/MessageBuilder.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor
+package org.mstor.provider.mail
-import javax.mail.Message.RecipientType
+import jakarta.mail.Message.RecipientType
class MessageBuilder extends FactoryBuilderSupport {
diff --git a/src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy b/src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy
similarity index 95%
rename from src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy
index 635c58fc..1db4bd03 100644
--- a/src/main/groovy/net/fortuna/mstor/MimeMessageFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/MimeMessageFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor
+package org.mstor.provider.mail
-import javax.mail.Session
-import javax.mail.internet.MimeMessage
+import jakarta.mail.Session
+import jakarta.mail.internet.MimeMessage
class MimeMessageFactory extends AbstractFactory {
diff --git a/src/main/groovy/net/fortuna/mstor/SessionFactory.groovy b/src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/SessionFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy
index 5b814d8c..2e3c9ff2 100644
--- a/src/main/groovy/net/fortuna/mstor/SessionFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/SessionFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor
+package org.mstor.provider.mail
-import javax.mail.Session
+import jakarta.mail.Session
class SessionFactory extends AbstractFactory {
diff --git a/src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy
similarity index 95%
rename from src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy
index 18316238..1f9af610 100644
--- a/src/main/groovy/net/fortuna/mstor/search/AndTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/AndTermFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.AndTerm
-import javax.mail.search.SearchTerm
+import jakarta.mail.search.AndTerm
+import jakarta.mail.search.SearchTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy
index 6d521418..125369e0 100644
--- a/src/main/groovy/net/fortuna/mstor/search/BodyTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/BodyTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.BodyTerm
+import jakarta.mail.search.BodyTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy
similarity index 95%
rename from src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy
index 95309500..aabaebe4 100644
--- a/src/main/groovy/net/fortuna/mstor/search/FlagTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/FlagTermFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.Flags
-import javax.mail.search.FlagTerm
+import jakarta.mail.Flags
+import jakarta.mail.search.FlagTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy
index baba0e64..6243d393 100644
--- a/src/main/groovy/net/fortuna/mstor/search/FromStringTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/FromStringTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.FromStringTerm
+import jakarta.mail.search.FromStringTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy
similarity index 93%
rename from src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy
index 8bb9a650..cf58c70a 100644
--- a/src/main/groovy/net/fortuna/mstor/search/FromTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/FromTermFactory.groovy
@@ -29,11 +29,11 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.Address
-import javax.mail.internet.InternetAddress
-import javax.mail.search.FromTerm
+import jakarta.mail.Address
+import jakarta.mail.internet.InternetAddress
+import jakarta.mail.search.FromTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy
index 3afb6847..ad4b2077 100644
--- a/src/main/groovy/net/fortuna/mstor/search/HeaderTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/HeaderTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.HeaderTerm
+import jakarta.mail.search.HeaderTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy
index ff436e5b..d432e174 100644
--- a/src/main/groovy/net/fortuna/mstor/search/InReplyToTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/InReplyToTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import net.fortuna.mstor.model.MStorMessage
+import org.mstor.provider.mail.MStorMessage
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy
index e87e7457..63705227 100644
--- a/src/main/groovy/net/fortuna/mstor/search/MessageIDTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/MessageIDTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.MessageIDTerm
+import jakarta.mail.search.MessageIDTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy
index 0a91897a..1e42ede1 100644
--- a/src/main/groovy/net/fortuna/mstor/search/MessageNumberTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/MessageNumberTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.MessageNumberTerm
+import jakarta.mail.search.MessageNumberTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy
index 4436dc24..52d17de3 100644
--- a/src/main/groovy/net/fortuna/mstor/search/NotTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/NotTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.NotTerm
+import jakarta.mail.search.NotTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy
similarity index 95%
rename from src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy
index b3f030fd..5a5a07fc 100644
--- a/src/main/groovy/net/fortuna/mstor/search/OrTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/OrTermFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.OrTerm
-import javax.mail.search.SearchTerm
+import jakarta.mail.search.OrTerm
+import jakarta.mail.search.SearchTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy
index f63bdf16..a89cceee 100644
--- a/src/main/groovy/net/fortuna/mstor/search/ReceivedDateTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/ReceivedDateTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.ReceivedDateTerm
+import jakarta.mail.search.ReceivedDateTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy
similarity index 94%
rename from src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy
index 008740ec..b125eab3 100644
--- a/src/main/groovy/net/fortuna/mstor/search/RecipientStringTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/RecipientStringTermFactory.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.Message.RecipientType
-import javax.mail.search.RecipientStringTerm
+import jakarta.mail.Message.RecipientType
+import jakarta.mail.search.RecipientStringTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy
similarity index 91%
rename from src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy
index 5deb4a1d..118bb7d5 100644
--- a/src/main/groovy/net/fortuna/mstor/search/RecipientTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/RecipientTermFactory.groovy
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.Address
-import javax.mail.Message.RecipientType
-import javax.mail.internet.InternetAddress
-import javax.mail.search.RecipientTerm
+import jakarta.mail.Address
+import jakarta.mail.Message.RecipientType
+import jakarta.mail.internet.InternetAddress
+import jakarta.mail.search.RecipientTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy
index 830bee0f..1ac6a23f 100644
--- a/src/main/groovy/net/fortuna/mstor/search/ReferencesTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/ReferencesTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import net.fortuna.mstor.model.MStorMessage
+import org.mstor.provider.mail.MStorMessage
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy b/src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy
similarity index 97%
rename from src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy
index 0d181fa2..4a7588f9 100644
--- a/src/main/groovy/net/fortuna/mstor/search/SearchTermBuilder.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/SearchTermBuilder.groovy
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.Message.RecipientType
-import javax.mail.search.ComparisonTerm
+import jakarta.mail.Message.RecipientType
+import jakarta.mail.search.ComparisonTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy
index e0d2cf5a..81f957ae 100644
--- a/src/main/groovy/net/fortuna/mstor/search/SentDateTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/SentDateTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.SentDateTerm
+import jakarta.mail.search.SentDateTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy
index a8024787..8f113287 100644
--- a/src/main/groovy/net/fortuna/mstor/search/SizeTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/SizeTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.SizeTerm
+import jakarta.mail.search.SizeTerm
/**
* @author Ben
diff --git a/src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy b/src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy
similarity index 96%
rename from src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy
rename to src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy
index 306ef339..99d724b1 100644
--- a/src/main/groovy/net/fortuna/mstor/search/SubjectTermFactory.groovy
+++ b/src/main/groovy/org/mstor/provider/mail/search/SubjectTermFactory.groovy
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search
+package org.mstor.provider.mail.search
-import javax.mail.search.SubjectTerm
+import jakarta.mail.search.SubjectTerm
/**
* @author Ben
diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java b/src/main/java/org/mstor/connector/jcr/JcrConnector.java
similarity index 85%
rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java
rename to src/main/java/org/mstor/connector/jcr/JcrConnector.java
index 6bcd9e26..ffdbf156 100644
--- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrConnector.java
+++ b/src/main/java/org/mstor/connector/jcr/JcrConnector.java
@@ -29,18 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
-import net.fortuna.mstor.connector.AbstractProtocolConnector;
-import net.fortuna.mstor.model.MStorFolder;
-import net.fortuna.mstor.model.MStorStore;
+import jakarta.mail.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.jackrabbit.rmi.client.ClientRepositoryFactory;
import org.jcrom.Jcrom;
+import org.mstor.provider.mail.AbstractProtocolConnector;
+import org.mstor.provider.mail.MStorStore;
import javax.jcr.Session;
import javax.jcr.*;
-import javax.mail.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
@@ -62,13 +61,13 @@ public class JcrConnector extends AbstractProtocolConnector {
private Session session;
- private final javax.mail.Session mailSession;
+ private final jakarta.mail.Session mailSession;
/**
* @param url
* @param store
*/
- public JcrConnector(URLName url, MStorStore store, javax.mail.Session session) {
+ public JcrConnector(URLName url, MStorStore store, jakarta.mail.Session session) {
super(url, store);
this.mailSession = session;
@@ -138,28 +137,28 @@ public void disconnect() {
/**
* {@inheritDoc}
*/
- public Folder getDefaultFolder() throws MessagingException {
- JcrFolder delegate = jcrom.fromNode(JcrFolder.class, getNode());
- delegate.setConnector(this);
- if (!delegate.exists()) {
- delegate.create(Folder.HOLDS_FOLDERS);
- }
- return new MStorFolder(store, delegate);
- }
+// public Folder getDefaultFolder() throws MessagingException {
+// JcrFolder delegate = jcrom.fromNode(JcrFolder.class, getNode());
+// delegate.setConnector(this);
+// if (!delegate.exists()) {
+// delegate.create(Folder.HOLDS_FOLDERS);
+// }
+// return new MStorFolder(store, delegate);
+// }
/**
* {@inheritDoc}
*/
- public Folder getFolder(String name) throws MessagingException {
- return getDefaultFolder().getFolder(name);
- }
+// public Folder getFolder(String name) throws MessagingException {
+// return getDefaultFolder().getFolder(name);
+// }
/**
* {@inheritDoc}
*/
- public Folder getFolder(URLName url) throws MessagingException {
- return getDefaultFolder().getFolder(url.getFile());
- }
+// public Folder getFolder(URLName url) throws MessagingException {
+// return getDefaultFolder().getFolder(url.getFile());
+// }
/**
* @return the jcrom instance
@@ -216,4 +215,24 @@ private Node getNode() throws MessagingException {
throw new MessagingException("Unexpected error", e);
}
}
+
+ @Override
+ public boolean isProtocolSupported(String protocol) {
+ return false;
+ }
+
+ @Override
+ public Folder getDefaultFolder() throws MessagingException {
+ return null;
+ }
+
+ @Override
+ public Folder getFolder(String name) throws MessagingException {
+ return null;
+ }
+
+ @Override
+ public Folder getFolder(URLName url) throws MessagingException {
+ return null;
+ }
}
diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java b/src/main/java/org/mstor/connector/jcr/JcrFolder.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java
rename to src/main/java/org/mstor/connector/jcr/JcrFolder.java
index 3ef59fb2..aa26f366 100644
--- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolder.java
+++ b/src/main/java/org/mstor/connector/jcr/JcrFolder.java
@@ -29,24 +29,24 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.util.MessageUtils;
+import jakarta.mail.Flags.Flag;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.jcrom.AbstractJcrEntity;
import org.jcrom.JcrMappingException;
import org.jcrom.annotations.JcrProperty;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
+import org.mstor.provider.mail.MessageUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
-import javax.mail.Flags.Flag;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
@@ -65,7 +65,7 @@
*/
public class JcrFolder extends AbstractJcrEntity implements FolderDelegate {
- private static final Log LOG = LogFactory.getLog(JcrFolder.class);
+ private static final Logger LOG = LoggerFactory.getLogger(JcrFolder.class);
/**
*
diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java b/src/main/java/org/mstor/connector/jcr/JcrFolderDao.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java
rename to src/main/java/org/mstor/connector/jcr/JcrFolderDao.java
index a0d910c7..588bad73 100644
--- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrFolderDao.java
+++ b/src/main/java/org/mstor/connector/jcr/JcrFolderDao.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
import org.jcrom.Jcrom;
import org.jcrom.dao.AbstractJcrDAO;
diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java b/src/main/java/org/mstor/connector/jcr/JcrMessage.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java
rename to src/main/java/org/mstor/connector/jcr/JcrMessage.java
index 34048273..f5866d6f 100644
--- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessage.java
+++ b/src/main/java/org/mstor/connector/jcr/JcrMessage.java
@@ -29,11 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.model.MStorMessage;
-import net.fortuna.mstor.util.MessageUtils;
+import jakarta.mail.*;
+import jakarta.mail.Flags.Flag;
+import jakarta.mail.internet.InternetHeaders;
+import jakarta.mail.internet.MimeMessage;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.jcrom.AbstractJcrEntity;
@@ -43,18 +44,16 @@
import org.jcrom.annotations.JcrFileNode;
import org.jcrom.annotations.JcrProperty;
import org.jcrom.annotations.JcrReference;
+import org.mstor.provider.mail.MessageDelegate;
+import org.mstor.provider.mail.MessageUtils;
-import javax.mail.*;
-import javax.mail.Flags.Flag;
-import javax.mail.internet.InternetHeaders;
-import javax.mail.internet.MimeMessage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
-import static net.fortuna.mstor.util.MessageUtils.getFlag;
-import static net.fortuna.mstor.util.MessageUtils.getFlagName;
+import static org.mstor.provider.mail.MessageUtils.getFlag;
+import static org.mstor.provider.mail.MessageUtils.getFlagName;
/**
* @author Ben
@@ -349,9 +348,8 @@ private void appendAttachments(final Part part) throws MessagingException, IOExc
Message attachedMessage;
if (part.getContent() instanceof Message) {
attachedMessage = (Message) part.getContent();
- }
- else {
- attachedMessage = new MStorMessage(null, (InputStream) part.getContent());
+ } else {
+ attachedMessage = new MimeMessage(null, (InputStream) part.getContent());
}
jcrMessage.setFlags(attachedMessage.getFlags());
jcrMessage.setHeaders(attachedMessage.getAllHeaders());
diff --git a/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java b/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java
new file mode 100644
index 00000000..e6de3f48
--- /dev/null
+++ b/src/main/java/org/mstor/connector/jcr/JcrMessageCollection.java
@@ -0,0 +1,61 @@
+package org.mstor.connector.jcr;
+
+import org.mstor.filter.FilterExpression;
+import org.mstor.model.Message;
+import org.mstor.model.MessageCollection;
+
+import java.util.List;
+import java.util.Set;
+
+public class JcrMessageCollection implements MessageCollection {
+
+ @Override
+ public void addLabel(String label) {
+
+ }
+
+ @Override
+ public void removeLabel(String label) {
+
+ }
+
+ @Override
+ public Set getLabels() {
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ return null;
+ }
+
+ @Override
+ public MessageCollection getParent() {
+ return null;
+ }
+
+ @Override
+ public List getCollections() {
+ return null;
+ }
+
+ @Override
+ public int getMessageCount() {
+ return 0;
+ }
+
+ @Override
+ public Iterable listMessages(int offset, int length) {
+ return null;
+ }
+
+ @Override
+ public Iterable query(FilterExpression filterExpression) {
+ return null;
+ }
+
+ @Override
+ public Message getMessage(String messageId) {
+ return null;
+ }
+}
diff --git a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java b/src/main/java/org/mstor/connector/jcr/JcrMessageDao.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java
rename to src/main/java/org/mstor/connector/jcr/JcrMessageDao.java
index 0795df8d..ce3cd562 100644
--- a/src/main/java/net/fortuna/mstor/connector/jcr/JcrMessageDao.java
+++ b/src/main/java/org/mstor/connector/jcr/JcrMessageDao.java
@@ -29,15 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
-import net.fortuna.mstor.util.MessageUtils;
+import jakarta.mail.Flags.Flag;
import org.jcrom.Jcrom;
import org.jcrom.dao.AbstractJcrDAO;
import org.jcrom.util.NodeFilter;
+import org.mstor.provider.mail.MessageUtils;
import javax.jcr.Session;
-import javax.mail.Flags.Flag;
import java.util.List;
/**
diff --git a/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java b/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java
new file mode 100644
index 00000000..315175fb
--- /dev/null
+++ b/src/main/java/org/mstor/connector/jcr/JcrMessageStore.java
@@ -0,0 +1,29 @@
+package org.mstor.connector.jcr;
+
+import org.mstor.model.MessageCollection;
+import org.mstor.model.MessageStore;
+
+import java.util.List;
+
+public class JcrMessageStore implements MessageStore {
+
+ @Override
+ public void connect() {
+
+ }
+
+ @Override
+ public void disconnect() {
+
+ }
+
+ @Override
+ public List getCollections() {
+ return null;
+ }
+
+ @Override
+ public MessageCollection getCollection(String collectionId) {
+ return null;
+ }
+}
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java b/src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java
rename to src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java
index 12e5e5ca..36f5b3be 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/AbstractMetaFolder.java
+++ b/src/main/java/org/mstor/connector/mbox/AbstractMetaFolder.java
@@ -29,15 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.AbstractFolderDelegate;
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import org.mstor.provider.mail.AbstractFolderDelegate;
+import org.mstor.provider.mail.DelegateException;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java b/src/main/java/org/mstor/connector/mbox/MboxConnector.java
similarity index 90%
rename from src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java
rename to src/main/java/org/mstor/connector/mbox/MboxConnector.java
index 1b44acb7..390cdf09 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/MboxConnector.java
+++ b/src/main/java/org/mstor/connector/mbox/MboxConnector.java
@@ -29,16 +29,16 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.AbstractProtocolConnector;
-import net.fortuna.mstor.model.MStorFolder;
-import net.fortuna.mstor.model.MStorStore;
-import net.fortuna.mstor.util.Configurator;
+import jakarta.mail.Folder;
+import jakarta.mail.Session;
+import jakarta.mail.URLName;
+import org.mstor.provider.mail.AbstractProtocolConnector;
+import org.mstor.provider.mail.MStorFolder;
+import org.mstor.provider.mail.MStorStore;
+import org.mstor.util.Configurator;
-import javax.mail.Folder;
-import javax.mail.Session;
-import javax.mail.URLName;
import java.io.File;
/**
@@ -145,4 +145,9 @@ else if (MetadataStrategy.NONE.equals(metadataStrategy)) {
public Folder getFolder(URLName url) {
return getFolder(url.getFile());
}
+
+ @Override
+ public boolean isProtocolSupported(String protocol) {
+ return "mstor".equalsIgnoreCase(protocol);
+ }
}
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java b/src/main/java/org/mstor/connector/mbox/MboxFolder.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java
rename to src/main/java/org/mstor/connector/mbox/MboxFolder.java
index 76c98e68..1d76da75 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/MboxFolder.java
+++ b/src/main/java/org/mstor/connector/mbox/MboxFolder.java
@@ -29,19 +29,19 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.AbstractFolderDelegate;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.data.MboxFile;
-import net.fortuna.mstor.util.CapabilityHints;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import org.mstor.data.MboxFile;
+import org.mstor.provider.mail.AbstractFolderDelegate;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
+import org.mstor.util.CapabilityHints;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@@ -75,7 +75,7 @@ else if (pathname.getName().endsWith(DIR_EXTENSION)) {
|| pathname.length() < 0 || MboxFile.isValid(pathname);
};
- private final Log log = LogFactory.getLog(MboxFolder.class);
+ private final Logger log = LoggerFactory.getLogger(MboxFolder.class);
private final File file;
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java b/src/main/java/org/mstor/connector/mbox/MetaFolder.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java
rename to src/main/java/org/mstor/connector/mbox/MetaFolder.java
index cdc6ce72..28b87b27 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/MetaFolder.java
+++ b/src/main/java/org/mstor/connector/mbox/MetaFolder.java
@@ -29,17 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.data.xml.DocumentBinding;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
import org.jdom.Element;
import org.jdom.Namespace;
+import org.mstor.data.xml.DocumentBinding;
+import org.mstor.provider.mail.DelegateException;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
@@ -125,7 +125,7 @@ public MetaFolder[] list(String pattern) {
/*
* (non-Javadoc)
*
- * @see net.fortuna.mstor.data.MetaFolder#setName(java.lang.String)
+ * @see org.mstor.mail.data.MetaFolder#setName(java.lang.String)
*/
/*
private final void setName(final String name) {
@@ -189,7 +189,7 @@ private void addMessage(final MessageDelegate message) {
/*
* (non-Javadoc)
*
- * @see net.fortuna.mstor.data.MetaFolder#removeMessage(java.lang.String)
+ * @see org.mstor.mail.data.MetaFolder#removeMessage(java.lang.String)
*/
/*
private final MessageDelegate removeMessage(final int messageNumber) {
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java b/src/main/java/org/mstor/connector/mbox/MetaMessage.java
similarity index 93%
rename from src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java
rename to src/main/java/org/mstor/connector/mbox/MetaMessage.java
index cc7f6a83..3fbe8513 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/MetaMessage.java
+++ b/src/main/java/org/mstor/connector/mbox/MetaMessage.java
@@ -29,24 +29,24 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
-
-import net.fortuna.mstor.connector.AbstractMessageDelegate;
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.data.MboxFile;
-import net.fortuna.mstor.data.xml.ElementBinding;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+package org.mstor.connector.mbox;
+
+import jakarta.mail.Flags;
+import jakarta.mail.Flags.Flag;
+import jakarta.mail.Header;
+import jakarta.mail.internet.InternetHeaders;
import org.jdom.Element;
import org.jdom.IllegalDataException;
import org.jdom.IllegalNameException;
import org.jdom.Namespace;
+import org.mstor.data.MboxFile;
+import org.mstor.data.xml.ElementBinding;
+import org.mstor.provider.mail.AbstractMessageDelegate;
+import org.mstor.provider.mail.DelegateException;
+import org.mstor.provider.mail.MessageDelegate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.Flags;
-import javax.mail.Flags.Flag;
-import javax.mail.Header;
-import javax.mail.internet.InternetHeaders;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -55,8 +55,8 @@
import java.util.List;
import java.util.Locale;
-import static net.fortuna.mstor.util.MessageUtils.getFlag;
-import static net.fortuna.mstor.util.MessageUtils.getFlagName;
+import static org.mstor.provider.mail.MessageUtils.getFlag;
+import static org.mstor.provider.mail.MessageUtils.getFlagName;
/**
* A JDOM-based implementation of a meta message.
@@ -99,7 +99,7 @@ public class MetaMessage extends AbstractMessageDelegate {
private static final DateFormat MESSAGE_DATE_FORMAT = new SimpleDateFormat(
META_DATE_PATTERN, Locale.US);
- private final Log log = LogFactory.getLog(MetaMessage.class);
+ private final Logger log = LoggerFactory.getLogger(MetaMessage.class);
private final ElementBinding binding;
@@ -328,7 +328,7 @@ public final void setHeaders(final Enumeration headers) {
log.warn("Invalid header (ignored): " + header.getName() + "="
+ header.getValue());
if (log.isDebugEnabled()) {
- log.debug(ine);
+ log.debug("Unexpected exception", ine);
}
}
}
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java b/src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java
rename to src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java
index aea5bc6e..76514434 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaFolder.java
+++ b/src/main/java/org/mstor/connector/mbox/YamlMetaFolder.java
@@ -29,19 +29,19 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.data.yaml.FolderExt;
-import net.fortuna.mstor.data.yaml.MessageExt;
+import jakarta.mail.Flags;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
import org.ho.yaml.Yaml;
import org.ho.yaml.YamlDecoder;
+import org.mstor.data.yaml.FolderExt;
+import org.mstor.data.yaml.MessageExt;
+import org.mstor.provider.mail.DelegateException;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
-import javax.mail.Flags;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
diff --git a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java b/src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java
similarity index 93%
rename from src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java
rename to src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java
index a1471e91..57223387 100755
--- a/src/main/java/net/fortuna/mstor/connector/mbox/YamlMetaMessage.java
+++ b/src/main/java/org/mstor/connector/mbox/YamlMetaMessage.java
@@ -29,16 +29,16 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.connector.AbstractMessageDelegate;
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.data.yaml.MessageExt;
+import jakarta.mail.Flags;
+import jakarta.mail.Header;
+import jakarta.mail.internet.InternetHeaders;
+import org.mstor.data.yaml.MessageExt;
+import org.mstor.provider.mail.AbstractMessageDelegate;
+import org.mstor.provider.mail.DelegateException;
+import org.mstor.provider.mail.MessageDelegate;
-import javax.mail.Flags;
-import javax.mail.Header;
-import javax.mail.internet.InternetHeaders;
import java.io.InputStream;
import java.util.Date;
import java.util.Enumeration;
diff --git a/src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java b/src/main/java/org/mstor/connector/nntp/NntpConnector.java
similarity index 81%
rename from src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java
rename to src/main/java/org/mstor/connector/nntp/NntpConnector.java
index 9f3fa12c..bac212dc 100644
--- a/src/main/java/net/fortuna/mstor/connector/nntp/NntpConnector.java
+++ b/src/main/java/org/mstor/connector/nntp/NntpConnector.java
@@ -29,15 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.nntp;
+package org.mstor.connector.nntp;
-import net.fortuna.mstor.connector.AbstractProtocolConnector;
-import net.fortuna.mstor.model.MStorStore;
+import jakarta.mail.Folder;
+import jakarta.mail.MessagingException;
+import jakarta.mail.URLName;
import org.apache.commons.net.nntp.NNTPClient;
+import org.mstor.provider.mail.AbstractProtocolConnector;
+import org.mstor.provider.mail.MStorStore;
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.URLName;
import java.io.IOException;
/**
@@ -54,7 +54,8 @@
public class NntpConnector extends AbstractProtocolConnector {
private final NNTPClient client;
-
+
+
/**
* @param url
* @param store
@@ -65,7 +66,7 @@ public NntpConnector(URLName url, MStorStore store) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.ProtocolConnector#connect(java.lang.String, int, java.lang.String, java.lang.String)
+ * @see org.mstor.mail.connector.ProtocolConnector#connect(java.lang.String, int, java.lang.String, java.lang.String)
*/
public boolean connect() {
/*
@@ -89,7 +90,7 @@ public boolean connect() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.ProtocolConnector#disconnect()
+ * @see org.mstor.mail.connector.ProtocolConnector#disconnect()
*/
public void disconnect() throws MessagingException {
try {
@@ -101,7 +102,7 @@ public void disconnect() throws MessagingException {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.ProtocolConnector#getDefaultFolder()
+ * @see org.mstor.mail.connector.ProtocolConnector#getDefaultFolder()
*/
public Folder getDefaultFolder() {
// TODO Auto-generated method stub
@@ -109,7 +110,7 @@ public Folder getDefaultFolder() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.ProtocolConnector#getFolder(java.lang.String)
+ * @see org.mstor.mail.connector.ProtocolConnector#getFolder(java.lang.String)
*/
public Folder getFolder(String name) {
// TODO Auto-generated method stub
@@ -117,11 +118,15 @@ public Folder getFolder(String name) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.ProtocolConnector#getFolder(javax.mail.URLName)
+ * @see org.mstor.mail.connector.ProtocolConnector#getFolder(jakarta.mail.URLName)
*/
public Folder getFolder(URLName url) {
// TODO Auto-generated method stub
return null;
}
+ @Override
+ public boolean isProtocolSupported(String protocol) {
+ return false;
+ }
}
diff --git a/src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java b/src/main/java/org/mstor/connector/nntp/NntpFolder.java
similarity index 73%
rename from src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java
rename to src/main/java/org/mstor/connector/nntp/NntpFolder.java
index 44242def..bd8948cb 100644
--- a/src/main/java/net/fortuna/mstor/connector/nntp/NntpFolder.java
+++ b/src/main/java/org/mstor/connector/nntp/NntpFolder.java
@@ -29,16 +29,16 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.nntp;
+package org.mstor.connector.nntp;
-import net.fortuna.mstor.connector.AbstractFolderDelegate;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
import org.apache.commons.net.nntp.NNTPClient;
import org.apache.commons.net.nntp.NewsgroupInfo;
+import org.mstor.provider.mail.AbstractFolderDelegate;
+import org.mstor.provider.mail.FolderDelegate;
+import org.mstor.provider.mail.MessageDelegate;
-import javax.mail.Folder;
-import javax.mail.Message;
import java.io.InputStream;
/**
@@ -67,7 +67,7 @@ public NntpFolder(NewsgroupInfo newsgroupInfo, NNTPClient client) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.AbstractFolderDelegate#createMessage(int)
+ * @see org.mstor.mail.connector.AbstractFolderDelegate#createMessage(int)
*/
protected MessageDelegate createMessage(int messageNumber) {
// TODO Auto-generated method stub
@@ -75,7 +75,7 @@ protected MessageDelegate createMessage(int messageNumber) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.AbstractFolderDelegate#setLastUid(long)
+ * @see org.mstor.mail.connector.AbstractFolderDelegate#setLastUid(long)
*/
protected void setLastUid(long uid) throws UnsupportedOperationException {
// TODO Auto-generated method stub
@@ -83,7 +83,7 @@ protected void setLastUid(long uid) throws UnsupportedOperationException {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#appendMessages(javax.mail.Message[])
+ * @see org.mstor.mail.connector.FolderDelegate#appendMessages(jakarta.mail.Message[])
*/
public void appendMessages(Message[] messages) {
// TODO Auto-generated method stub
@@ -91,7 +91,7 @@ public void appendMessages(Message[] messages) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#close()
+ * @see org.mstor.mail.connector.FolderDelegate#close()
*/
public void close() {
// TODO Auto-generated method stub
@@ -99,7 +99,7 @@ public void close() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#create(int)
+ * @see org.mstor.mail.connector.FolderDelegate#create(int)
*/
public boolean create(int type) {
// TODO Auto-generated method stub
@@ -107,7 +107,7 @@ public boolean create(int type) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#delete()
+ * @see org.mstor.mail.connector.FolderDelegate#delete()
*/
public boolean delete() {
// TODO Auto-generated method stub
@@ -115,7 +115,7 @@ public boolean delete() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#exists()
+ * @see org.mstor.mail.connector.FolderDelegate#exists()
*/
public boolean exists() {
// TODO Auto-generated method stub
@@ -123,7 +123,7 @@ public boolean exists() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#expunge(javax.mail.Message[])
+ * @see org.mstor.mail.connector.FolderDelegate#expunge(jakarta.mail.Message[])
*/
public void expunge(Message[] deleted) {
// TODO Auto-generated method stub
@@ -131,7 +131,7 @@ public void expunge(Message[] deleted) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getFolder(java.lang.String)
+ * @see org.mstor.mail.connector.FolderDelegate#getFolder(java.lang.String)
*/
public FolderDelegate getFolder(String name) {
// TODO Auto-generated method stub
@@ -139,7 +139,7 @@ public FolderDelegate getFolder(String name) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getFullName()
+ * @see org.mstor.mail.connector.FolderDelegate#getFullName()
*/
public String getFullName() {
// TODO Auto-generated method stub
@@ -147,7 +147,7 @@ public String getFullName() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getLastModified()
+ * @see org.mstor.mail.connector.FolderDelegate#getLastModified()
*/
public long getLastModified() throws UnsupportedOperationException {
// TODO Auto-generated method stub
@@ -155,7 +155,7 @@ public long getLastModified() throws UnsupportedOperationException {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getLastUid()
+ * @see org.mstor.mail.connector.FolderDelegate#getLastUid()
*/
public long getLastUid() throws UnsupportedOperationException {
// TODO Auto-generated method stub
@@ -163,7 +163,7 @@ public long getLastUid() throws UnsupportedOperationException {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getMessage(int)
+ * @see org.mstor.mail.connector.FolderDelegate#getMessage(int)
*/
public MessageDelegate getMessage(int messageNumber) {
// TODO Auto-generated method stub
@@ -171,7 +171,7 @@ public MessageDelegate getMessage(int messageNumber) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getMessageAsStream(int)
+ * @see org.mstor.mail.connector.FolderDelegate#getMessageAsStream(int)
*/
public InputStream getMessageAsStream(int index) {
// TODO Auto-generated method stub
@@ -179,21 +179,21 @@ public InputStream getMessageAsStream(int index) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getMessageCount()
+ * @see org.mstor.mail.connector.FolderDelegate#getMessageCount()
*/
public int getMessageCount() {
return newsgroupInfo.getArticleCount();
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getFolderName()
+ * @see org.mstor.mail.connector.FolderDelegate#getFolderName()
*/
public String getFolderName() {
return newsgroupInfo.getNewsgroup();
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getParent()
+ * @see org.mstor.mail.connector.FolderDelegate#getParent()
*/
public FolderDelegate getParent() {
// TODO Auto-generated method stub
@@ -201,7 +201,7 @@ public FolderDelegate getParent() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getSeparator()
+ * @see org.mstor.mail.connector.FolderDelegate#getSeparator()
*/
public char getSeparator() {
// TODO Auto-generated method stub
@@ -209,14 +209,14 @@ public char getSeparator() {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getType()
+ * @see org.mstor.mail.connector.FolderDelegate#getType()
*/
public int getType() {
return Folder.HOLDS_MESSAGES;
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#getUidValidity()
+ * @see org.mstor.mail.connector.FolderDelegate#getUidValidity()
*/
public long getUidValidity() throws UnsupportedOperationException {
// TODO Auto-generated method stub
@@ -224,7 +224,7 @@ public long getUidValidity() throws UnsupportedOperationException {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#list(java.lang.String)
+ * @see org.mstor.mail.connector.FolderDelegate#list(java.lang.String)
*/
public FolderDelegate[] list(String pattern) {
// TODO Auto-generated method stub
@@ -232,7 +232,7 @@ public FolderDelegate[] list(String pattern) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#open(int)
+ * @see org.mstor.mail.connector.FolderDelegate#open(int)
*/
public void open(int mode) {
// TODO Auto-generated method stub
@@ -240,7 +240,7 @@ public void open(int mode) {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.connector.FolderDelegate#renameTo(java.lang.String)
+ * @see org.mstor.mail.connector.FolderDelegate#renameTo(java.lang.String)
*/
public boolean renameTo(String name) {
// TODO Auto-generated method stub
diff --git a/src/main/java/net/fortuna/mstor/data/MboxEncoder.java b/src/main/java/org/mstor/data/MboxEncoder.java
similarity index 99%
rename from src/main/java/net/fortuna/mstor/data/MboxEncoder.java
rename to src/main/java/org/mstor/data/MboxEncoder.java
index 38c2e94e..f0949cb2 100755
--- a/src/main/java/net/fortuna/mstor/data/MboxEncoder.java
+++ b/src/main/java/org/mstor/data/MboxEncoder.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
+package org.mstor.data;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
diff --git a/src/main/java/net/fortuna/mstor/data/MboxFile.java b/src/main/java/org/mstor/data/MboxFile.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/data/MboxFile.java
rename to src/main/java/org/mstor/data/MboxFile.java
index a5a49eb2..ba90c371 100755
--- a/src/main/java/net/fortuna/mstor/data/MboxFile.java
+++ b/src/main/java/org/mstor/data/MboxFile.java
@@ -29,14 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
+package org.mstor.data;
-import net.fortuna.mstor.util.CacheAdapter;
-import net.fortuna.mstor.util.CapabilityHints;
-import net.fortuna.mstor.util.Configurator;
-import net.fortuna.mstor.util.EhCacheAdapter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.mstor.util.CacheAdapter;
+import org.mstor.util.CapabilityHints;
+import org.mstor.util.Configurator;
+import org.mstor.util.EhCacheAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.ByteBuffer;
@@ -153,7 +153,7 @@ public enum BufferStrategy {
private static final Charset charset = Charset.forName(Configurator.getProperty(
"mstor.mbox.encoding", "ISO-8859-1"));
- private final Log log = LogFactory.getLog(MboxFile.class);
+ private final Logger log = LoggerFactory.getLogger(MboxFile.class);
private final CharsetDecoder decoder = charset.newDecoder();
@@ -551,7 +551,7 @@ public static boolean isValid(final File file) {
return line == null || VALID_MBOX_PATTERN.matcher(line).matches();
}
catch (Exception e) {
- Log log = LogFactory.getLog(MboxFile.class);
+ Logger log = LoggerFactory.getLogger(MboxFile.class);
log.info("Not a valid mbox file [" + file + "]", e);
}
diff --git a/src/main/java/net/fortuna/mstor/data/MessageAppender.java b/src/main/java/org/mstor/data/MessageAppender.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/data/MessageAppender.java
rename to src/main/java/org/mstor/data/MessageAppender.java
index 20d0156f..7046da89 100755
--- a/src/main/java/net/fortuna/mstor/data/MessageAppender.java
+++ b/src/main/java/org/mstor/data/MessageAppender.java
@@ -29,11 +29,11 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
+package org.mstor.data;
-import net.fortuna.mstor.util.Configurator;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.mstor.util.Configurator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -77,7 +77,7 @@ public class MessageAppender {
private static final String FROM__DATE_PATTERN = "EEE MMM d HH:mm:ss yyyy";
- private final Log log = LogFactory.getLog(MessageAppender.class);
+ private final Logger log = LoggerFactory.getLogger(MessageAppender.class);
private final CharsetDecoder decoder;
diff --git a/src/main/java/net/fortuna/mstor/data/MessageInputStream.java b/src/main/java/org/mstor/data/MessageInputStream.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/data/MessageInputStream.java
rename to src/main/java/org/mstor/data/MessageInputStream.java
index af0ee41f..562a1743 100755
--- a/src/main/java/net/fortuna/mstor/data/MessageInputStream.java
+++ b/src/main/java/org/mstor/data/MessageInputStream.java
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
+package org.mstor.data;
-import net.fortuna.mstor.util.Configurator;
+import org.mstor.util.Configurator;
import java.io.InputStream;
import java.nio.ByteBuffer;
diff --git a/src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java b/src/main/java/org/mstor/data/xml/DocumentBinding.java
similarity index 99%
rename from src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java
rename to src/main/java/org/mstor/data/xml/DocumentBinding.java
index 359e110f..898b6a84 100755
--- a/src/main/java/net/fortuna/mstor/data/xml/DocumentBinding.java
+++ b/src/main/java/org/mstor/data/xml/DocumentBinding.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.xml;
+package org.mstor.data.xml;
import org.jdom.Document;
import org.jdom.Element;
diff --git a/src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java b/src/main/java/org/mstor/data/xml/ElementBinding.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java
rename to src/main/java/org/mstor/data/xml/ElementBinding.java
index 59e2853f..c90f5478 100755
--- a/src/main/java/net/fortuna/mstor/data/xml/ElementBinding.java
+++ b/src/main/java/org/mstor/data/xml/ElementBinding.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.xml;
+package org.mstor.data.xml;
import org.jdom.Element;
import org.jdom.Namespace;
diff --git a/src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java b/src/main/java/org/mstor/data/xml/XmlBinding.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java
rename to src/main/java/org/mstor/data/xml/XmlBinding.java
index 9c3d6cac..ace95323 100755
--- a/src/main/java/net/fortuna/mstor/data/xml/XmlBinding.java
+++ b/src/main/java/org/mstor/data/xml/XmlBinding.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.xml;
+package org.mstor.data.xml;
import org.jdom.Namespace;
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java b/src/main/java/org/mstor/data/yaml/FlagWrapper.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java
rename to src/main/java/org/mstor/data/yaml/FlagWrapper.java
index f7390377..6ebf18ab 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/FlagWrapper.java
+++ b/src/main/java/org/mstor/data/yaml/FlagWrapper.java
@@ -29,10 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
-
-import javax.mail.Flags.Flag;
+package org.mstor.data.yaml;
+import jakarta.mail.Flags.Flag;
import org.ho.yaml.wrapper.DelayedCreationBeanWrapper;
/**
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java b/src/main/java/org/mstor/data/yaml/FlagsWrapper.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java
rename to src/main/java/org/mstor/data/yaml/FlagsWrapper.java
index ecc0595e..c88f4283 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/FlagsWrapper.java
+++ b/src/main/java/org/mstor/data/yaml/FlagsWrapper.java
@@ -29,11 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
-
-import javax.mail.Flags;
-import javax.mail.Flags.Flag;
+package org.mstor.data.yaml;
+import jakarta.mail.Flags;
+import jakarta.mail.Flags.Flag;
import org.ho.yaml.wrapper.DelayedCreationBeanWrapper;
/**
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java b/src/main/java/org/mstor/data/yaml/FolderExt.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java
rename to src/main/java/org/mstor/data/yaml/FolderExt.java
index 6b8573aa..3207a471 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/FolderExt.java
+++ b/src/main/java/org/mstor/data/yaml/FolderExt.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
+package org.mstor.data.yaml;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java b/src/main/java/org/mstor/data/yaml/HeaderWrapper.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java
rename to src/main/java/org/mstor/data/yaml/HeaderWrapper.java
index 33484803..b92db37e 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/HeaderWrapper.java
+++ b/src/main/java/org/mstor/data/yaml/HeaderWrapper.java
@@ -29,12 +29,11 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
+package org.mstor.data.yaml;
+import jakarta.mail.Header;
import org.ho.yaml.wrapper.DelayedCreationBeanWrapper;
-import javax.mail.Header;
-
/**
* @author Ben
*
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java b/src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java
rename to src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java
index 0513bf35..750ce429 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/InternetHeadersWrapper.java
+++ b/src/main/java/org/mstor/data/yaml/InternetHeadersWrapper.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
+package org.mstor.data.yaml;
+import jakarta.mail.Header;
+import jakarta.mail.internet.InternetHeaders;
import org.ho.yaml.wrapper.DelayedCreationBeanWrapper;
-import javax.mail.Header;
-import javax.mail.internet.InternetHeaders;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
diff --git a/src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java b/src/main/java/org/mstor/data/yaml/MessageExt.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java
rename to src/main/java/org/mstor/data/yaml/MessageExt.java
index 5523c276..a309c0cc 100755
--- a/src/main/java/net/fortuna/mstor/data/yaml/MessageExt.java
+++ b/src/main/java/org/mstor/data/yaml/MessageExt.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data.yaml;
+package org.mstor.data.yaml;
-import java.util.Date;
+import jakarta.mail.Flags;
+import jakarta.mail.internet.InternetHeaders;
-import javax.mail.Flags;
-import javax.mail.internet.InternetHeaders;
+import java.util.Date;
/**
* @author Ben
diff --git a/src/main/java/org/mstor/filter/FilterExpression.java b/src/main/java/org/mstor/filter/FilterExpression.java
new file mode 100644
index 00000000..b392b456
--- /dev/null
+++ b/src/main/java/org/mstor/filter/FilterExpression.java
@@ -0,0 +1,95 @@
+package org.mstor.filter;
+
+import org.mstor.filter.expression.*;
+
+import java.time.LocalDate;
+import java.time.temporal.Temporal;
+import java.util.Collection;
+import java.util.List;
+
+public interface FilterExpression {
+
+ enum Op {
+ // comparison operators..
+ equalTo, notEqualTo, in, notIn,
+ greaterThan, greaterThanEqual, lessThan, lessThanEqual, between,
+ // object matching operators..
+ exists, notExists,
+ // value matching operators..
+ contains, matches,
+ // logical operators..
+ and, or, not
+ }
+
+ static FilterExpression equalTo(String target, String value) {
+ return new BinaryExpression(new TargetExpression(target), Op.equalTo, new StringExpression(value));
+ }
+
+ static FilterExpression equalTo(String target, List attributes, String value) {
+ return new BinaryExpression(new TargetExpression(target, attributes), Op.equalTo, new StringExpression(value));
+ }
+
+ static FilterExpression equalTo(String target, LocalDate value) {
+ return new BinaryExpression(new TargetExpression(target), Op.equalTo, new DateExpression(value));
+ }
+
+ static FilterExpression equalTo(String target, Integer value) {
+ return new BinaryExpression(new TargetExpression(target), Op.equalTo, new NumberExpression(value));
+ }
+
+ static FilterExpression in(String target, Collection> value) {
+ return new BinaryExpression(new TargetExpression(target), Op.in, new CollectionExpression(value));
+ }
+
+ static FilterExpression greaterThan(String target, Temporal value) {
+ return new BinaryExpression(new TargetExpression(target), Op.greaterThan, new StringExpression(value.toString()));
+ }
+
+ static FilterExpression greaterThan(String target, Number value) {
+ return new BinaryExpression(new TargetExpression(target), Op.greaterThan, new StringExpression(value.toString()));
+ }
+
+ static FilterExpression greaterThanEqual(String target, Temporal value) {
+ return new BinaryExpression(new TargetExpression(target), Op.greaterThanEqual, new TemporalExpression(value));
+ }
+
+ static FilterExpression lessThan(String target, Temporal value) {
+ return new BinaryExpression(new TargetExpression(target), Op.lessThan, new TemporalExpression(value));
+ }
+
+ static FilterExpression lessThanEqual(String target, String value) {
+ return new BinaryExpression(new TargetExpression(target), Op.lessThanEqual, new StringExpression(value));
+ }
+
+ static FilterExpression contains(String target, String value) {
+ return new BinaryExpression(new TargetExpression(target), Op.contains, new StringExpression(value));
+ }
+
+ static FilterExpression matches(String target, String value) {
+ return new BinaryExpression(new TargetExpression(target), Op.matches, new StringExpression(value));
+ }
+
+ default FilterExpression and(FilterExpression expression) {
+ return new BinaryExpression(this, Op.and, expression);
+ }
+
+ default FilterExpression or(FilterExpression expression) {
+ return new BinaryExpression(this, Op.or, expression);
+ }
+
+ static FilterExpression not(FilterExpression expression) {
+ return new UnaryExpression(Op.not, expression);
+ }
+
+ static FilterExpression exists(String target) {
+ return new UnaryExpression(Op.exists, new TargetExpression(target));
+ }
+
+ static FilterExpression notExists(String target) {
+ return new UnaryExpression(Op.notExists, new TargetExpression(target));
+ }
+
+ static FilterExpression parse(String filterExpression) {
+ return new FilterExpressionParser().parse(filterExpression);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/FilterExpressionParser.java b/src/main/java/org/mstor/filter/FilterExpressionParser.java
new file mode 100644
index 00000000..ed225711
--- /dev/null
+++ b/src/main/java/org/mstor/filter/FilterExpressionParser.java
@@ -0,0 +1,217 @@
+package org.mstor.filter;
+
+import org.jparsec.*;
+import org.mstor.filter.FilterExpression.Op;
+import org.mstor.filter.expression.BinaryExpression;
+import org.mstor.filter.expression.NumberExpression;
+import org.mstor.filter.expression.StringExpression;
+import org.mstor.filter.expression.TargetExpression;
+
+import java.time.*;
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalAdjusters;
+import java.time.temporal.TemporalAmount;
+import java.time.temporal.WeekFields;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * Support for parsing a query string to produce a {@link FilterExpression} instance.
+ */
+public class FilterExpressionParser {
+
+ private static final String[] OPERATORS = {
+ ">", "<", "=", ">=", "<=", "<>", ".", "(", ")", "[", "]", ":", ","
+ };
+
+ private static final String[] KEYWORDS = {
+ "by", "order", "asc", "desc",
+ "and", "or", "not", "in", "exists", "between", "is", "null", "like",
+ "contains", "matches"
+ };
+
+ private static final String[] FUNCTION_NAMES = {
+ "now", "startOfDay", "endOfDay", "startOfWeek", "endOfWeek", "startOfMonth", "endOfMonth",
+ "startOfYear", "endOfYear", "startOfWeek", "endOfWeek", "startOfMonth", "endOfMonth",
+ };
+
+ private static final Terminals TERMS = Terminals.operators(OPERATORS)
+ .words(Scanners.IDENTIFIER).caseInsensitiveKeywords(Arrays.asList(KEYWORDS))
+ .keywords(FUNCTION_NAMES).build();
+
+ private static final Parser> TOKENIZER = Parsers.or(
+ Terminals.IntegerLiteral.TOKENIZER, Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER,
+ TERMS.tokenizer());
+
+ static final Parser ATTRIBUTE_PARSER = Parsers.sequence(Terminals.Identifier.PARSER,
+ term(":"), Terminals.Identifier.PARSER, (name, x, value) -> new FilterTarget.Attribute(name, value))
+ .or(Terminals.Identifier.PARSER.map(FilterTarget.Attribute::new));
+
+ static final Parser> ATTRIBUTE_LIST_PARSER = ATTRIBUTE_PARSER
+ .between(term("["), term("]")).sepBy(term(","));
+
+ static final Parser NUMBER = Terminals.IntegerLiteral.PARSER.map(NumberExpression::new);
+
+ static final Parser STRING = Terminals.StringLiteral.PARSER.map(StringExpression::new);
+
+ static final Parser NAME = Parsers.sequence(
+ Terminals.Identifier.PARSER, ATTRIBUTE_LIST_PARSER, TargetExpression::new)
+ .or(Terminals.Identifier.PARSER.map(TargetExpression::new));
+// static final Parser NAME = Terminals.Identifier.PARSER
+// .map(SpecificationExpression::new);
+
+ static final Parser IGNORED = Parsers.or(
+ Scanners.JAVA_LINE_COMMENT,
+ Scanners.JAVA_BLOCK_COMMENT,
+ Scanners.WHITESPACES).skipMany();
+
+ static final Parser> COLLECTION_PARSER = Terminals.StringLiteral.PARSER
+ .between(term("("), term(")")).sepBy(term(",")).from(TOKENIZER, IGNORED);
+
+// static final Parser STRING = Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER.map(StringExpression::new);
+
+// static final Parser TEMPORAL = Terminals.StringLiteral.PARSER.map(TemporalExpression::new);
+
+ static Parser> term(String... names) {
+ return TERMS.token(names);
+ }
+
+ static Parser op(String name, T value) {
+ return term(name).retn(value);
+ }
+
+ private static final Map> FUNCTIONS = new HashMap<>();
+ static {
+ FUNCTIONS.put("now", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return Instant.now().plus(temporalAmount);
+ }
+ return Instant.now();
+ });
+ FUNCTIONS.put("startOfDay", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return LocalDate.now().atStartOfDay().plus(temporalAmount);
+ }
+ return LocalDate.now().atStartOfDay();
+ });
+ FUNCTIONS.put("endOfDay", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return LocalDate.now().atTime(23, 59).plus(temporalAmount);
+ }
+ return LocalDate.now().atTime(23, 59);
+ });
+ FUNCTIONS.put("startOfWeek", (Function) s -> {
+ DayOfWeek first = WeekFields.ISO.getFirstDayOfWeek();
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return LocalDate.now().with(TemporalAdjusters.previousOrSame(first)).plus(temporalAmount);
+ }
+ return LocalDate.now().with(TemporalAdjusters.previousOrSame(first));
+ });
+ FUNCTIONS.put("endOfWeek", (Function) s -> {
+ DayOfWeek last = DayOfWeek.of(WeekFields.ISO.getMinimalDaysInFirstWeek());
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return LocalDate.now().with(TemporalAdjusters.nextOrSame(last)).plus(temporalAmount);
+ }
+ return LocalDate.now().with(TemporalAdjusters.nextOrSame(last));
+ });
+ FUNCTIONS.put("startOfMonth", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return YearMonth.now().atDay(1).atStartOfDay().plus(temporalAmount);
+ }
+ return YearMonth.now().atDay(1).atStartOfDay();
+ });
+ FUNCTIONS.put("endOfMonth", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return YearMonth.now().atEndOfMonth().atTime(23, 59).plus(temporalAmount);
+ }
+ return YearMonth.now().atEndOfMonth().atTime(23, 59);
+ });
+ FUNCTIONS.put("startOfYear", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return Year.now().atMonth(1).atDay(1).atStartOfDay().plus(temporalAmount);
+ }
+ return Year.now().atMonth(1).atDay(1).atStartOfDay();
+ });
+ FUNCTIONS.put("endOfYear", (Function) s -> {
+ if (!s.isEmpty()) {
+ TemporalAmount temporalAmount = Duration.parse(s);
+ return Year.now().atMonth(12).atEndOfMonth().atTime(23, 59).plus(temporalAmount);
+ }
+ return Year.now().atMonth(12).atEndOfMonth().atTime(23, 59);
+ });
+ }
+
+ public FilterExpression parse(String filterExpression) {
+ FilterExpression expression = null;
+ for (String part : filterExpression.split("\\s*and\\s*")) {
+ if (part.matches("[\\w-]+\\s*>=\\s*\\w+")) {
+ String[] greaterThanEqual = part.split("\\s*>=\\s*");
+ expression = FilterExpression.greaterThanEqual(greaterThanEqual[0], resolveValue(greaterThanEqual[1]));
+ } else if (part.matches("[\\w-]+\\s*<=\\s*\\w+")) {
+ String[] lessThanEqual = part.split("\\s*<=\\s*");
+ expression = FilterExpression.lessThanEqual(lessThanEqual[0], resolveValue(lessThanEqual[1]));
+ } else if (part.matches("[\\w-]+\\s*=\\s*[^<>=]+")) {
+ String[] equalTo = part.split("\\s*=\\s*");
+ expression = FilterExpression.equalTo(equalTo[0], (String) resolveValue(equalTo[1]));
+ } else if (part.matches("[\\w-]+\\s*>\\s*\\w+")) {
+ String[] greaterThan = part.split("\\s*>\\s*");
+ expression = FilterExpression.greaterThan(greaterThan[0], (Integer) resolveValue(greaterThan[1]));
+ } else if (part.matches("[\\w-]+\\s*<\\s*\\w+")) {
+ String[] lessThan = part.split("\\s*<\\s*");
+ expression = FilterExpression.lessThan(lessThan[0], resolveValue(lessThan[1]));
+ } else if (part.matches("[\\w-]+\\s+in\\s+\\[[^<>=]+]")) {
+ String[] in = part.split("\\s*in\\s*");
+ List items = Arrays.asList(in[1].replaceAll("[\\[\\]]", "")
+ .split("\\[?\\s*,\\s*]?"));
+ expression = FilterExpression.in(in[0], items);
+ } else if (part.matches("[\\w-]+\\s+contains\\s+\".+\"")) {
+ String[] contains = part.split("\\s*contains\\s*");
+ expression = FilterExpression.contains(contains[0], contains[1].replaceAll("^\"?|\"?$", ""));
+ } else if (part.matches("[\\w-]+\\s+exists")) {
+ String[] exists = part.split("\\s*exists");
+ expression = FilterExpression.exists(exists[0]);
+ } else if (part.matches("[\\w-]+\\s+not exists")) {
+ String[] notExists = part.split("\\s*not exists");
+ expression = FilterExpression.notExists(notExists[0]);
+ } else {
+ throw new IllegalArgumentException("Invalid filter expression: " + filterExpression);
+ }
+ }
+ return expression;
+ }
+
+ private T resolveValue(String valueString) {
+ if (valueString.matches("\\w+\\(.*\\)")
+ && FUNCTIONS.containsKey(valueString.replaceAll("\\(.*\\)", ""))) {
+ return (T) FUNCTIONS.get(valueString.replaceAll("\\(.*\\)", ""))
+ .apply(valueString.split("[()]")[1]);
+ } else if (valueString.matches("\\d+")) {
+ return (T) Integer.valueOf(valueString);
+ } else {
+ return (T) valueString;
+ }
+ }
+
+ public static Parser newInstance() {
+ Parser.Reference ref = Parser.newReference();
+ Parser unit = ref.lazy().between(term("("), term(")"))
+ .or(NUMBER).or(NAME).or(STRING); //.or(TEMPORAL);
+ Parser parser = new OperatorTable()
+ .infixl(op("=", (l, r) -> new BinaryExpression(l, Op.equalTo, r)), 10)
+ .infixl(op("<>", (l, r) -> new BinaryExpression(l, Op.notEqualTo, r)), 10)
+ .build(unit);
+ ref.set(parser);
+ return parser.from(TOKENIZER, IGNORED);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/FilterTarget.java b/src/main/java/org/mstor/filter/FilterTarget.java
new file mode 100644
index 00000000..0a987d33
--- /dev/null
+++ b/src/main/java/org/mstor/filter/FilterTarget.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package org.mstor.filter;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+public class FilterTarget {
+
+ private final String name;
+
+ private final Optional value;
+
+ private final List attributes;
+
+ public FilterTarget(String spec) {
+ this(spec, Collections.emptyList());
+ }
+
+ public FilterTarget(String spec, List attributes) {
+ this.name = spec.split(":")[0].replace("_", "-");
+ this.value = Optional.ofNullable(spec.split(":").length > 1 ? spec.split(":")[1] : null);
+ this.attributes = attributes;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Optional getValue() {
+ return value;
+ }
+
+ public List getAttributes() {
+ return attributes;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FilterTarget that = (FilterTarget) o;
+ return name.equals(that.name) && Objects.equals(value, that.value) && Objects.equals(attributes, that.attributes);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, value, attributes);
+ }
+
+ public static class Attribute {
+
+ private final String name;
+
+ private String value;
+
+ public Attribute(String name) {
+ this.name = name;
+ }
+
+ public Attribute(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Attribute attribute = (Attribute) o;
+ return name.equals(attribute.name) && Objects.equals(value, attribute.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, value);
+ }
+
+ public static Attribute parse(String string) {
+ String name = string.split(":")[0];
+ String value = string.contains(":") ? string.split(":")[1] : null;
+ return new Attribute(name, value);
+ }
+ }
+}
diff --git a/src/main/java/org/mstor/filter/MessageFilter.java b/src/main/java/org/mstor/filter/MessageFilter.java
new file mode 100644
index 00000000..8b6d96dc
--- /dev/null
+++ b/src/main/java/org/mstor/filter/MessageFilter.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package org.mstor.filter;
+
+import jakarta.mail.search.SearchTerm;
+import org.mstor.filter.expression.BinaryExpression;
+import org.mstor.filter.expression.LiteralExpression;
+import org.mstor.filter.expression.TargetExpression;
+import org.mstor.filter.expression.UnaryExpression;
+
+public class MessageFilter implements PredicateFactory {
+
+ protected V literal(FilterExpression expression) {
+ if (expression instanceof BinaryExpression && ((BinaryExpression) expression).right instanceof LiteralExpression) {
+ return ((LiteralExpression) ((BinaryExpression) expression).right).getValue();
+ }
+ throw new IllegalArgumentException("Not a valid filter");
+ }
+
+ protected FilterTarget target(FilterExpression expression) {
+ if (expression instanceof UnaryExpression
+ && ((UnaryExpression) expression).operand instanceof TargetExpression) {
+ return ((TargetExpression) ((UnaryExpression) expression).operand).getValue();
+ } else if (expression instanceof BinaryExpression
+ && ((BinaryExpression) expression).left instanceof TargetExpression) {
+ return ((TargetExpression) ((BinaryExpression) expression).left).getValue();
+ }
+ throw new IllegalArgumentException("Not a valid filter");
+ }
+
+ public SearchTerm predicate(UnaryExpression expression) {
+ switch (expression.operator) {
+ case not:
+ return not(predicate(expression.operand));
+ }
+ throw new IllegalArgumentException("Not a valid filter");
+ }
+
+ public SearchTerm predicate(BinaryExpression expression) {
+ switch (expression.operator) {
+ case and:
+ return and(predicate(expression.left), predicate(expression.right));
+ case or:
+ return or(predicate(expression.left), predicate(expression.right));
+ }
+ throw new IllegalArgumentException("Not a valid filter");
+ }
+}
diff --git a/src/main/java/org/mstor/filter/PredicateFactory.java b/src/main/java/org/mstor/filter/PredicateFactory.java
new file mode 100644
index 00000000..e5359f01
--- /dev/null
+++ b/src/main/java/org/mstor/filter/PredicateFactory.java
@@ -0,0 +1,36 @@
+package org.mstor.filter;
+
+import jakarta.mail.search.AndTerm;
+import jakarta.mail.search.NotTerm;
+import jakarta.mail.search.OrTerm;
+import jakarta.mail.search.SearchTerm;
+import org.mstor.filter.expression.BinaryExpression;
+import org.mstor.filter.expression.UnaryExpression;
+
+public interface PredicateFactory {
+
+ default SearchTerm predicate(FilterExpression expression) {
+ if (expression instanceof UnaryExpression) {
+ return predicate((UnaryExpression) expression);
+ } else if (expression instanceof BinaryExpression) {
+ return predicate((BinaryExpression) expression);
+ }
+ throw new IllegalArgumentException("Not a valid filter");
+ }
+
+ SearchTerm predicate(UnaryExpression expression);
+
+ SearchTerm predicate(BinaryExpression expression);
+
+ default SearchTerm and(SearchTerm...predicates) {
+ return new AndTerm(predicates);
+ }
+
+ default SearchTerm or(SearchTerm...predicates) {
+ return new OrTerm(predicates);
+ }
+
+ default SearchTerm not(SearchTerm predicate) {
+ return new NotTerm(predicate);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/BinaryExpression.java b/src/main/java/org/mstor/filter/expression/BinaryExpression.java
new file mode 100644
index 00000000..d19497a8
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/BinaryExpression.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import org.mstor.filter.FilterExpression;
+
+import java.util.Objects;
+
+public class BinaryExpression implements FilterExpression {
+
+ public final FilterExpression left;
+
+ public final FilterExpression.Op operator;
+
+ public final FilterExpression right;
+
+ public BinaryExpression(FilterExpression left, FilterExpression.Op operator, FilterExpression right) {
+ this.left = left;
+ this.operator = operator;
+ this.right = right;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ BinaryExpression that = (BinaryExpression) o;
+ return left.equals(that.left) && operator == that.operator && right.equals(that.right);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(left, operator, right);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/CollectionExpression.java b/src/main/java/org/mstor/filter/expression/CollectionExpression.java
new file mode 100644
index 00000000..6de933a9
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/CollectionExpression.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.util.Collection;
+import java.util.Objects;
+
+public class CollectionExpression implements LiteralExpression> {
+
+ private final Collection> value;
+
+ public CollectionExpression(Collection> value) {
+ this.value = value;
+ }
+
+ @Override
+ public Collection> getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CollectionExpression that = (CollectionExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/DateExpression.java b/src/main/java/org/mstor/filter/expression/DateExpression.java
new file mode 100644
index 00000000..153bf8f3
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/DateExpression.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.text.ParseException;
+import java.time.LocalDate;
+import java.util.Objects;
+
+public class DateExpression implements LiteralExpression {
+
+ private final LocalDate value;
+
+ public DateExpression(String value) throws ParseException {
+ this(LocalDate.parse(value));
+ }
+
+ public DateExpression(LocalDate value) {
+ this.value = value;
+ }
+
+ @Override
+ public LocalDate getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DateExpression that = (DateExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/FunctionExpression.java b/src/main/java/org/mstor/filter/expression/FunctionExpression.java
new file mode 100644
index 00000000..16aa98f5
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/FunctionExpression.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.time.temporal.Temporal;
+import java.util.Objects;
+import java.util.function.Function;
+
+public class FunctionExpression implements LiteralExpression> {
+
+ private final Function value;
+
+ public FunctionExpression(Function value) {
+ this.value = value;
+ }
+
+ @Override
+ public Function getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FunctionExpression that = (FunctionExpression) o;
+ return Objects.equals(value, that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/LiteralExpression.java b/src/main/java/org/mstor/filter/expression/LiteralExpression.java
new file mode 100644
index 00000000..98a8eb6a
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/LiteralExpression.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package org.mstor.filter.expression;
+
+import org.mstor.filter.FilterExpression;
+
+public interface LiteralExpression extends FilterExpression {
+
+ T getValue();
+}
diff --git a/src/main/java/org/mstor/filter/expression/NumberExpression.java b/src/main/java/org/mstor/filter/expression/NumberExpression.java
new file mode 100644
index 00000000..1ad750cb
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/NumberExpression.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.util.Objects;
+
+public class NumberExpression implements LiteralExpression {
+
+ private final Number value;
+
+ public NumberExpression(String value) {
+ this(Integer.valueOf(value));
+ }
+
+ public NumberExpression(Number value) {
+ this.value = value;
+ }
+
+ @Override
+ public Number getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ NumberExpression that = (NumberExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/StringExpression.java b/src/main/java/org/mstor/filter/expression/StringExpression.java
new file mode 100644
index 00000000..080f43c0
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/StringExpression.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.util.Objects;
+
+public class StringExpression implements LiteralExpression {
+
+ public final String value;
+
+ public StringExpression(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ StringExpression that = (StringExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/TargetExpression.java b/src/main/java/org/mstor/filter/expression/TargetExpression.java
new file mode 100644
index 00000000..4de038d1
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/TargetExpression.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import org.mstor.filter.FilterExpression;
+import org.mstor.filter.FilterTarget;
+
+import java.util.List;
+import java.util.Objects;
+
+public class TargetExpression implements FilterExpression {
+
+ public final FilterTarget value;
+
+ public TargetExpression(String value) {
+ this.value = new FilterTarget(value);
+ }
+
+ public TargetExpression(String value, List attributes) {
+ this.value = new FilterTarget(value, attributes);
+ }
+
+ public FilterTarget getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TargetExpression that = (TargetExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/TemporalExpression.java b/src/main/java/org/mstor/filter/expression/TemporalExpression.java
new file mode 100644
index 00000000..6618c679
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/TemporalExpression.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import java.time.Instant;
+import java.time.temporal.Temporal;
+import java.util.Objects;
+
+public class TemporalExpression implements LiteralExpression {
+
+ private final Temporal value;
+
+ public TemporalExpression(String value) {
+ //TODO: implement parsing
+ this(Instant.now());
+ }
+
+ public TemporalExpression(Temporal value) {
+ this.value = value;
+ }
+
+ @Override
+ public Temporal getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TemporalExpression that = (TemporalExpression) o;
+ return value.equals(that.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(value);
+ }
+}
diff --git a/src/main/java/org/mstor/filter/expression/UnaryExpression.java b/src/main/java/org/mstor/filter/expression/UnaryExpression.java
new file mode 100644
index 00000000..7bb55bcc
--- /dev/null
+++ b/src/main/java/org/mstor/filter/expression/UnaryExpression.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2004-2021, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package org.mstor.filter.expression;
+
+import org.mstor.filter.FilterExpression;
+
+import java.util.Objects;
+
+public class UnaryExpression implements FilterExpression {
+
+ public final FilterExpression.Op operator;
+
+ public final FilterExpression operand;
+
+ public UnaryExpression(FilterExpression.Op operator, FilterExpression operand) {
+ this.operator = operator;
+ this.operand = operand;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ UnaryExpression that = (UnaryExpression) o;
+ return operator == that.operator && operand.equals(that.operand);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(operator, operand);
+ }
+}
diff --git a/src/main/java/org/mstor/model/ConstraintViolationException.java b/src/main/java/org/mstor/model/ConstraintViolationException.java
new file mode 100644
index 00000000..ff8521e6
--- /dev/null
+++ b/src/main/java/org/mstor/model/ConstraintViolationException.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2012, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.mstor.model;
+
+/**
+ * $Id$
+ *
+ * Created on 02/03/2008
+ *
+ * Indicates the violation of a constraint imposed by a relevant specification.
+ * @author Ben
+ *
+ */
+public class ConstraintViolationException extends RuntimeException {
+
+ private static final long serialVersionUID = 6728653187698888940L;
+
+ /**
+ * Default constructor.
+ */
+ public ConstraintViolationException() {
+ }
+
+ /**
+ * @param message an error message
+ */
+ public ConstraintViolationException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/org/mstor/model/Content.java b/src/main/java/org/mstor/model/Content.java
new file mode 100644
index 00000000..20b3172f
--- /dev/null
+++ b/src/main/java/org/mstor/model/Content.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2012, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.mstor.model;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * $Id$
+ *
+ * Created: 12/10/2004
+ *
+ * Base class for calendar content in the form of
+ * properties and parameters.
+ *
+ * @author Ben Fortuna
+ */
+public abstract class Content implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -2892694760294583989L;
+
+ /**
+ * @return the cotent name
+ */
+ public abstract String getName();
+
+ /**
+ * @return the content value
+ */
+ public abstract String getValue();
+
+ public static abstract class Factory implements Serializable {
+
+ private final List supportedNames;
+
+ public Factory(String... supportedNames) {
+ this.supportedNames = Arrays.asList(supportedNames);
+ }
+
+ public final boolean supports(String name) {
+ return supportedNames.contains(name);
+ }
+ }
+}
diff --git a/src/main/java/org/mstor/model/ContentCollection.java b/src/main/java/org/mstor/model/ContentCollection.java
new file mode 100644
index 00000000..b44a9272
--- /dev/null
+++ b/src/main/java/org/mstor/model/ContentCollection.java
@@ -0,0 +1,58 @@
+package org.mstor.model;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Implementors of this interface support the immutable collection contract specified by this interface.
+ *
+ * The contract states that any mutation function will not modify the underlying collection, but rather
+ * will return a copy of the collection with the applied mutation.
+ *
+ * @param
+ */
+public interface ContentCollection extends Serializable {
+
+ ContentCollection add(T content);
+
+ ContentCollection addAll(Collection content);
+
+ ContentCollection remove(T content);
+
+ ContentCollection removeAll(String... name);
+
+ ContentCollection replace(T content);
+
+ List getAll();
+
+ /**
+ * Return a list of elements filtered by name. If no names are specified return all elements.
+ * @param names a list of zero or more names to match
+ * @param content type
+ * @return a list of elements less than or equal to the elements in this collection
+ */
+ @SuppressWarnings("unchecked")
+ default List get(String... names) {
+ if (names.length > 0) {
+ List filter = Arrays.stream(names).map(String::toUpperCase).collect(Collectors.toList());
+ return getAll().stream().filter(c -> filter.contains(c.getName())).map(c -> (R) c).collect(Collectors.toList());
+ } else {
+ return (List) getAll();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ default Optional getFirst(String name) {
+ return (Optional) getAll().stream().filter(c -> c.getName().equalsIgnoreCase(name)).findFirst();
+ }
+
+ @SuppressWarnings("unchecked")
+ default R getRequired(String name) throws ConstraintViolationException {
+ return (R) getFirst(name).orElseThrow(() -> new ConstraintViolationException(
+ String.format("Missing required %s", name)));
+ }
+}
diff --git a/src/main/java/org/mstor/model/FluentMessage.java b/src/main/java/org/mstor/model/FluentMessage.java
new file mode 100644
index 00000000..8ce1da92
--- /dev/null
+++ b/src/main/java/org/mstor/model/FluentMessage.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2022, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package org.mstor.model;
+
+/**
+ * Provide fluent API support for {@link Message}
+ */
+public interface FluentMessage {
+
+ C getFluentTarget();
+
+ default FluentMessage withProperty(Property property) {
+ getFluentTarget().add(property);
+ return getFluentTarget();
+ }
+}
diff --git a/src/main/java/org/mstor/model/LabelSupport.java b/src/main/java/org/mstor/model/LabelSupport.java
new file mode 100644
index 00000000..b69889f8
--- /dev/null
+++ b/src/main/java/org/mstor/model/LabelSupport.java
@@ -0,0 +1,12 @@
+package org.mstor.model;
+
+import java.util.Set;
+
+public interface LabelSupport {
+
+ void addLabel(String label);
+
+ void removeLabel(String label);
+
+ Set getLabels();
+}
diff --git a/src/main/java/org/mstor/model/MboxMessageCollection.java b/src/main/java/org/mstor/model/MboxMessageCollection.java
new file mode 100644
index 00000000..fc0bb641
--- /dev/null
+++ b/src/main/java/org/mstor/model/MboxMessageCollection.java
@@ -0,0 +1,59 @@
+package org.mstor.model;
+
+import org.mstor.filter.FilterExpression;
+
+import java.util.List;
+import java.util.Set;
+
+public class MboxMessageCollection implements MessageCollection {
+
+ @Override
+ public void addLabel(String label) {
+
+ }
+
+ @Override
+ public void removeLabel(String label) {
+
+ }
+
+ @Override
+ public Set getLabels() {
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ return null;
+ }
+
+ @Override
+ public MessageCollection getParent() {
+ return null;
+ }
+
+ @Override
+ public List getCollections() {
+ return null;
+ }
+
+ @Override
+ public int getMessageCount() {
+ return 0;
+ }
+
+ @Override
+ public Iterable listMessages(int offset, int length) {
+ return null;
+ }
+
+ @Override
+ public Iterable query(FilterExpression filterExpression) {
+ return null;
+ }
+
+ @Override
+ public Message getMessage(String messageId) {
+ return null;
+ }
+}
diff --git a/src/main/java/org/mstor/model/MboxMessageStore.java b/src/main/java/org/mstor/model/MboxMessageStore.java
new file mode 100644
index 00000000..3b4afc21
--- /dev/null
+++ b/src/main/java/org/mstor/model/MboxMessageStore.java
@@ -0,0 +1,26 @@
+package org.mstor.model;
+
+import java.util.List;
+
+public class MboxMessageStore implements MessageStore {
+
+ @Override
+ public void connect() {
+
+ }
+
+ @Override
+ public void disconnect() {
+
+ }
+
+ @Override
+ public List getCollections() {
+ return null;
+ }
+
+ @Override
+ public MessageCollection getCollection(String collectionId) {
+ return null;
+ }
+}
diff --git a/src/main/java/org/mstor/model/Message.java b/src/main/java/org/mstor/model/Message.java
new file mode 100644
index 00000000..b67e6261
--- /dev/null
+++ b/src/main/java/org/mstor/model/Message.java
@@ -0,0 +1,41 @@
+package org.mstor.model;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+public class Message implements PropertyContainer, FluentMessage {
+
+ private PropertyList propertyList;
+
+ private final byte[] content;
+
+ public Message(byte[] content) {
+ this.content = content;
+ }
+
+ public byte[] getContent() {
+ return content;
+ }
+
+ InputStream getContentAsStream() {
+ return new ByteArrayInputStream(content);
+ }
+
+// Iterable getReferences();
+
+
+ @Override
+ public Message getFluentTarget() {
+ return this;
+ }
+
+ @Override
+ public PropertyList getPropertyList() {
+ return propertyList;
+ }
+
+ @Override
+ public void setPropertyList(PropertyList properties) {
+ this.propertyList = properties;
+ }
+}
diff --git a/src/main/java/org/mstor/model/MessageCollection.java b/src/main/java/org/mstor/model/MessageCollection.java
new file mode 100644
index 00000000..535e525a
--- /dev/null
+++ b/src/main/java/org/mstor/model/MessageCollection.java
@@ -0,0 +1,22 @@
+package org.mstor.model;
+
+import org.mstor.filter.FilterExpression;
+
+import java.util.List;
+
+public interface MessageCollection extends LabelSupport {
+
+ String getName();
+
+ MessageCollection getParent();
+
+ List getCollections();
+
+ int getMessageCount();
+
+ Iterable listMessages(int offset, int length);
+
+ Iterable query(FilterExpression filterExpression);
+
+ Message getMessage(String messageId);
+}
diff --git a/src/main/java/org/mstor/model/MessageReference.java b/src/main/java/org/mstor/model/MessageReference.java
new file mode 100644
index 00000000..53617d8b
--- /dev/null
+++ b/src/main/java/org/mstor/model/MessageReference.java
@@ -0,0 +1,25 @@
+package org.mstor.model;
+
+public class MessageReference {
+
+ public enum ReferenceType {
+ InReplyTo;
+ }
+
+ private final Message message;
+
+ private final ReferenceType referenceType;
+
+ public MessageReference(Message message, ReferenceType referenceType) {
+ this.message = message;
+ this.referenceType = referenceType;
+ }
+
+ public Message getMessage() {
+ return message;
+ }
+
+ public ReferenceType getReferenceType() {
+ return referenceType;
+ }
+}
diff --git a/src/main/java/org/mstor/model/MessageStore.java b/src/main/java/org/mstor/model/MessageStore.java
new file mode 100644
index 00000000..1d66b6cd
--- /dev/null
+++ b/src/main/java/org/mstor/model/MessageStore.java
@@ -0,0 +1,14 @@
+package org.mstor.model;
+
+import java.util.List;
+
+public interface MessageStore {
+
+ void connect();
+
+ void disconnect();
+
+ List getCollections();
+
+ MessageCollection getCollection(String collectionId);
+}
diff --git a/src/main/java/org/mstor/model/Property.java b/src/main/java/org/mstor/model/Property.java
new file mode 100644
index 00000000..bbf7e9d4
--- /dev/null
+++ b/src/main/java/org/mstor/model/Property.java
@@ -0,0 +1,14 @@
+package org.mstor.model;
+
+public class Property extends Content {
+
+ @Override
+ public String getName() {
+ return null;
+ }
+
+ @Override
+ public String getValue() {
+ return null;
+ }
+}
diff --git a/src/main/java/org/mstor/model/PropertyContainer.java b/src/main/java/org/mstor/model/PropertyContainer.java
new file mode 100644
index 00000000..e182f150
--- /dev/null
+++ b/src/main/java/org/mstor/model/PropertyContainer.java
@@ -0,0 +1,81 @@
+package org.mstor.model;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+public interface PropertyContainer {
+
+ PropertyList getPropertyList();
+
+ void setPropertyList(PropertyList properties);
+
+ default List getProperties(final String... name) {
+ return getPropertyList().get(name);
+ }
+
+ default Optional getProperty(final String name) {
+ return getPropertyList().getFirst(name);
+ }
+
+ /**
+ * Convenience method for retrieving a required named property.
+ *
+ * @param name name of the property to retrieve
+ * @return the first matching property in the property list with the specified name
+ * @throws ConstraintViolationException when a property is not found
+ */
+ default T getRequiredProperty(String name) throws ConstraintViolationException {
+ return getPropertyList().getRequired(name);
+ }
+
+ /**
+ * Add a property to the container.
+ * @param property the property to add
+ * @return a reference to the container to support method chaining
+ */
+ default PropertyContainer add(Property property) {
+ setPropertyList((PropertyList) getPropertyList().add(property));
+ return this;
+ }
+
+ /**
+ * Add multiple properties to the container.
+ * @param properties a collection of properties to add
+ * @return a reference to the container to support method chaining
+ */
+ default PropertyContainer addAll(Collection properties) {
+ setPropertyList((PropertyList) getPropertyList().addAll(properties));
+ return this;
+ }
+
+ /**
+ * Remove a property from the container.
+ * @param property the property to remove
+ * @return a reference to the container to support method chaining
+ */
+ default PropertyContainer remove(Property property) {
+ setPropertyList((PropertyList) getPropertyList().remove(property));
+ return this;
+ }
+
+ /**
+ * Remove all properties with the matching name.
+ * @param name name of the properties to remove
+ * @return a reference to the container to support method chaining
+ */
+ default PropertyContainer removeAll(String... name) {
+ setPropertyList((PropertyList) getPropertyList().removeAll(name));
+ return this;
+ }
+
+ /**
+ * Add a property to the container whilst removing all other properties with the same property name.
+ * @param property the property to add
+ * @return a reference to the container to support method chaining
+ */
+ default PropertyContainer replace(Property property) {
+ setPropertyList((PropertyList) getPropertyList().replace(property));
+ return this;
+ }
+}
diff --git a/src/main/java/org/mstor/model/PropertyList.java b/src/main/java/org/mstor/model/PropertyList.java
new file mode 100644
index 00000000..c0328a8c
--- /dev/null
+++ b/src/main/java/org/mstor/model/PropertyList.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2012, Ben Fortuna
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * o Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * o Neither the name of Ben Fortuna nor the names of any other contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.mstor.model;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * $Id$ [Apr 5, 2004]
+ *
+ * Accessor implementation for a list of iCalendar properties.
+ * @author Ben Fortuna
+ */
+public class PropertyList implements ContentCollection {
+
+ private final List properties;
+
+ /**
+ * Default constructor.
+ */
+ public PropertyList() {
+ this(Collections.emptyList());
+ }
+
+ /**
+ * Creates an unmodifiable copy of the specified property list.
+ * @param properties a property list
+ */
+
+ public PropertyList(List properties) {
+ this.properties = Collections.unmodifiableList(properties);
+ }
+
+ @Override
+ public ContentCollection add(Property content) {
+ List copy = new ArrayList<>(properties);
+ copy.add(content);
+ return new PropertyList(copy);
+ }
+
+ @Override
+ public ContentCollection addAll(Collection content) {
+ List copy = new ArrayList<>(properties);
+ copy.addAll(content);
+ return new PropertyList(copy);
+ }
+
+ @Override
+ public ContentCollection remove(Property content) {
+ List copy = new ArrayList<>(properties);
+ if (copy.remove(content)) {
+ return new PropertyList(copy);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public ContentCollection removeAll(String... name) {
+ List names = Arrays.asList(name);
+ List copy = new ArrayList<>(properties);
+ if (copy.removeIf(p -> names.contains(p.getName()))) {
+ return new PropertyList(copy);
+ } else {
+ return this;
+ }
+ }
+
+ @Override
+ public ContentCollection replace(Property content) {
+ List copy = new ArrayList<>(properties);
+ copy.removeIf(p -> p.getName().equals(content.getName()));
+ copy.add(content);
+ return new PropertyList(copy);
+ }
+
+ @Override
+ public List getAll() {
+ return properties;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public final String toString() {
+ return properties.stream().map(Property::toString).collect(Collectors.joining(""));
+ }
+
+ /**
+ * Returns the first property of specified name.
+ * @param aName name of property to return
+ * @return a property or null if no matching property found
+ *
+ * @deprecated use {@link PropertyList#getFirst(String)}
+ */
+ @Deprecated
+ public final Optional getProperty(final String aName) {
+ return getFirst(aName);
+ }
+
+ /**
+ * Returns a list of properties with the specified name.
+ * @param name name of properties to return
+ * @return a property list
+ *
+ * @deprecated use {@link PropertyList#get(String...)}
+ */
+ @Deprecated
+ public final List getProperties(final String name) {
+ return get(name);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PropertyList that = (PropertyList) o;
+ return Objects.equals(properties, that.properties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(properties);
+ }
+}
diff --git a/src/main/java/org/mstor/model/property/Bcc.java b/src/main/java/org/mstor/model/property/Bcc.java
new file mode 100644
index 00000000..ad28a783
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Bcc.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Bcc extends Recipient {
+}
diff --git a/src/main/java/org/mstor/model/property/Cc.java b/src/main/java/org/mstor/model/property/Cc.java
new file mode 100644
index 00000000..364dcf7a
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Cc.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Cc extends Recipient {
+}
diff --git a/src/main/java/org/mstor/model/property/Comments.java b/src/main/java/org/mstor/model/property/Comments.java
new file mode 100644
index 00000000..5d87eb35
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Comments.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Comments {
+}
diff --git a/src/main/java/org/mstor/model/property/DateProperty.java b/src/main/java/org/mstor/model/property/DateProperty.java
new file mode 100644
index 00000000..84107d67
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/DateProperty.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public abstract class DateProperty {
+}
diff --git a/src/main/java/org/mstor/model/property/Forwarded.java b/src/main/java/org/mstor/model/property/Forwarded.java
new file mode 100644
index 00000000..ba3953bf
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Forwarded.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Forwarded extends DateProperty {
+}
diff --git a/src/main/java/org/mstor/model/property/InReplyTo.java b/src/main/java/org/mstor/model/property/InReplyTo.java
new file mode 100644
index 00000000..d9c5b88d
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/InReplyTo.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class InReplyTo {
+}
diff --git a/src/main/java/org/mstor/model/property/Keywords.java b/src/main/java/org/mstor/model/property/Keywords.java
new file mode 100644
index 00000000..d69eceb8
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Keywords.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Keywords {
+}
diff --git a/src/main/java/org/mstor/model/property/Received.java b/src/main/java/org/mstor/model/property/Received.java
new file mode 100644
index 00000000..4c45ea7b
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Received.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Received extends DateProperty {
+}
diff --git a/src/main/java/org/mstor/model/property/Recipient.java b/src/main/java/org/mstor/model/property/Recipient.java
new file mode 100644
index 00000000..3252d1ac
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Recipient.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public abstract class Recipient {
+}
diff --git a/src/main/java/org/mstor/model/property/Sender.java b/src/main/java/org/mstor/model/property/Sender.java
new file mode 100644
index 00000000..9621bf91
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Sender.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Sender {
+}
diff --git a/src/main/java/org/mstor/model/property/Sent.java b/src/main/java/org/mstor/model/property/Sent.java
new file mode 100644
index 00000000..45fb44d7
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Sent.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Sent extends DateProperty {
+}
diff --git a/src/main/java/org/mstor/model/property/Subject.java b/src/main/java/org/mstor/model/property/Subject.java
new file mode 100644
index 00000000..facdf1ee
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Subject.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Subject {
+}
diff --git a/src/main/java/org/mstor/model/property/To.java b/src/main/java/org/mstor/model/property/To.java
new file mode 100644
index 00000000..1da18d2f
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/To.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class To extends Recipient {
+}
diff --git a/src/main/java/org/mstor/model/property/Uid.java b/src/main/java/org/mstor/model/property/Uid.java
new file mode 100644
index 00000000..15ba0da4
--- /dev/null
+++ b/src/main/java/org/mstor/model/property/Uid.java
@@ -0,0 +1,4 @@
+package org.mstor.model.property;
+
+public class Uid {
+}
diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java b/src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java
rename to src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java
index 40fdb58b..f3bdc255 100755
--- a/src/main/java/net/fortuna/mstor/connector/AbstractFolderDelegate.java
+++ b/src/main/java/org/mstor/provider/mail/AbstractFolderDelegate.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
/**
* @param the type of message delegate supported
diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java b/src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java
rename to src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java
index d2fee316..b4684aa3 100755
--- a/src/main/java/net/fortuna/mstor/connector/AbstractMessageDelegate.java
+++ b/src/main/java/org/mstor/provider/mail/AbstractMessageDelegate.java
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import javax.mail.internet.InternetHeaders;
+import jakarta.mail.internet.InternetHeaders;
/**
diff --git a/src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java b/src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java
rename to src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java
index fafc090c..096d17db 100755
--- a/src/main/java/net/fortuna/mstor/connector/AbstractProtocolConnector.java
+++ b/src/main/java/org/mstor/provider/mail/AbstractProtocolConnector.java
@@ -29,11 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.model.MStorStore;
-
-import javax.mail.URLName;
+import jakarta.mail.URLName;
/**
* @author Ben
diff --git a/src/main/java/net/fortuna/mstor/util/Cache.java b/src/main/java/org/mstor/provider/mail/Cache.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/util/Cache.java
rename to src/main/java/org/mstor/provider/mail/Cache.java
index 7639b79c..dd7cd694 100755
--- a/src/main/java/net/fortuna/mstor/util/Cache.java
+++ b/src/main/java/org/mstor/provider/mail/Cache.java
@@ -29,14 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.provider.mail;
+
+import jakarta.mail.Message;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
-import javax.mail.Message;
-
/**
* Implements a very rudimentary cache.
*
diff --git a/src/main/java/net/fortuna/mstor/connector/DelegateException.java b/src/main/java/org/mstor/provider/mail/DelegateException.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/connector/DelegateException.java
rename to src/main/java/org/mstor/provider/mail/DelegateException.java
index 7404ce02..0f57cc03 100755
--- a/src/main/java/net/fortuna/mstor/connector/DelegateException.java
+++ b/src/main/java/org/mstor/provider/mail/DelegateException.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
/**
* An exception used to indicate an unhandled situation in a delegate.
diff --git a/src/main/java/net/fortuna/mstor/connector/FolderDelegate.java b/src/main/java/org/mstor/provider/mail/FolderDelegate.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/connector/FolderDelegate.java
rename to src/main/java/org/mstor/provider/mail/FolderDelegate.java
index 2f25d7ac..a3d7c444 100755
--- a/src/main/java/net/fortuna/mstor/connector/FolderDelegate.java
+++ b/src/main/java/org/mstor/provider/mail/FolderDelegate.java
@@ -29,17 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.model.MStorFolder;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
/**
- * Implementors support delegation of specific functions from {@link MStorFolder}.
+ * Implementors support delegation of specific functions from {@link Folder}.
*
* @param the type of message delegate supported
* @author Ben
@@ -77,8 +77,8 @@ public interface FolderDelegate {
/**
* @return the type of folder this delegate represents.
- * @see javax.mail.Folder#HOLDS_FOLDERS
- * @see javax.mail.Folder#HOLDS_MESSAGES
+ * @see jakarta.mail.Folder#HOLDS_FOLDERS
+ * @see jakarta.mail.Folder#HOLDS_MESSAGES
*/
int getType();
@@ -126,8 +126,8 @@ public interface FolderDelegate {
/**
* Open the folder delegate.
* @param mode the mode to open the folder
- * @see javax.mail.Folder#READ_ONLY
- * @see javax.mail.Folder#READ_WRITE
+ * @see jakarta.mail.Folder#READ_ONLY
+ * @see jakarta.mail.Folder#READ_WRITE
*/
void open(final int mode);
diff --git a/src/main/java/org/mstor/provider/mail/IndexedMessageList.java b/src/main/java/org/mstor/provider/mail/IndexedMessageList.java
new file mode 100644
index 00000000..9a1f7437
--- /dev/null
+++ b/src/main/java/org/mstor/provider/mail/IndexedMessageList.java
@@ -0,0 +1,37 @@
+package org.mstor.provider.mail;
+
+import jakarta.mail.Header;
+import jakarta.mail.Message;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Support for indexing messages by message header.
+ */
+public class IndexedMessageList {
+
+ private final Map> indexMap;
+
+ public IndexedMessageList(List messages, Header...headers) {
+ this.indexMap = new ConcurrentHashMap<>();
+ messages.forEach(message -> add(message, headers));
+ }
+
+ private void add(Message message, Header... headers) {
+ Arrays.stream(headers).forEach(header -> {
+ if (indexMap.containsKey(header)) {
+ indexMap.get(header).add(message.getMessageNumber());
+ } else {
+ indexMap.put(header, Collections.singletonList(message.getMessageNumber()));
+ }
+ });
+ }
+
+ List getMessages(Header header) {
+ return indexMap.get(header);
+ }
+}
diff --git a/src/main/java/net/fortuna/mstor/model/MStorFolder.java b/src/main/java/org/mstor/provider/mail/MStorFolder.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/model/MStorFolder.java
rename to src/main/java/org/mstor/provider/mail/MStorFolder.java
index dadf7ee0..2d08e559 100755
--- a/src/main/java/net/fortuna/mstor/model/MStorFolder.java
+++ b/src/main/java/org/mstor/provider/mail/MStorFolder.java
@@ -29,20 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
-
-import net.fortuna.mstor.connector.DelegateException;
-import net.fortuna.mstor.connector.FolderDelegate;
-import net.fortuna.mstor.connector.MessageDelegate;
-import net.fortuna.mstor.util.CacheAdapter;
-import net.fortuna.mstor.util.Configurator;
-import net.fortuna.mstor.util.EhCacheAdapter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.*;
-import javax.mail.event.ConnectionEvent;
-import javax.mail.event.FolderEvent;
+package org.mstor.provider.mail;
+
+import jakarta.mail.*;
+import jakarta.mail.event.ConnectionEvent;
+import jakarta.mail.event.FolderEvent;
+import org.mstor.util.CacheAdapter;
+import org.mstor.util.Configurator;
+import org.mstor.util.EhCacheAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -64,7 +61,7 @@
*/
public final class MStorFolder extends Folder implements UIDFolder {
- private static final Log LOG = LogFactory.getLog(MStorFolder.class);
+ private static final Logger LOG = LoggerFactory.getLogger(MStorFolder.class);
private static final String INVALID_FOLDER_TYPE_MESSAGE = "Invalid folder type";
@@ -357,7 +354,7 @@ public synchronized int getDeletedMessageCount() throws MessagingException {
return delegate.getDeletedMessageCount();
}
catch (UnsupportedOperationException e) {
- LOG.debug(e.getMessage());
+ LOG.debug("Unexpected error", e);
}
return super.getDeletedMessageCount();
}
diff --git a/src/main/java/net/fortuna/mstor/model/MStorMessage.java b/src/main/java/org/mstor/provider/mail/MStorMessage.java
similarity index 97%
rename from src/main/java/net/fortuna/mstor/model/MStorMessage.java
rename to src/main/java/org/mstor/provider/mail/MStorMessage.java
index 4a29db3c..68910ea6 100755
--- a/src/main/java/net/fortuna/mstor/model/MStorMessage.java
+++ b/src/main/java/org/mstor/provider/mail/MStorMessage.java
@@ -29,16 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.connector.MessageDelegate;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import jakarta.mail.*;
+import jakarta.mail.Flags.Flag;
+import jakarta.mail.internet.InternetHeaders;
+import jakarta.mail.internet.MimeMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.*;
-import javax.mail.Flags.Flag;
-import javax.mail.internet.InternetHeaders;
-import javax.mail.internet.MimeMessage;
import java.io.InputStream;
import java.io.Serializable;
import java.util.*;
@@ -57,7 +56,7 @@
*/
public final class MStorMessage extends MimeMessage implements Serializable, Taggable {
- private final Log log = LogFactory.getLog(MStorMessage.class);
+ private final Logger log = LoggerFactory.getLogger(MStorMessage.class);
/**
* Delegate for providing additional functions not supported by MimeMessage.
diff --git a/src/main/java/net/fortuna/mstor/model/MStorStore.java b/src/main/java/org/mstor/provider/mail/MStorStore.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/model/MStorStore.java
rename to src/main/java/org/mstor/provider/mail/MStorStore.java
index 85c7c8a3..360c0e02 100755
--- a/src/main/java/net/fortuna/mstor/model/MStorStore.java
+++ b/src/main/java/org/mstor/provider/mail/MStorStore.java
@@ -29,12 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.connector.ProtocolConnector;
-import net.fortuna.mstor.connector.ProtocolConnectorFactory;
-
-import javax.mail.*;
+import jakarta.mail.*;
/**
* Implementation of a javamail store for the mstor provider.
diff --git a/src/main/java/net/fortuna/mstor/connector/MessageDelegate.java b/src/main/java/org/mstor/provider/mail/MessageDelegate.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/connector/MessageDelegate.java
rename to src/main/java/org/mstor/provider/mail/MessageDelegate.java
index 015a85a7..f1a673fa 100755
--- a/src/main/java/net/fortuna/mstor/connector/MessageDelegate.java
+++ b/src/main/java/org/mstor/provider/mail/MessageDelegate.java
@@ -29,20 +29,20 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.model.MStorMessage;
+import jakarta.mail.Flags;
+import jakarta.mail.Header;
+import jakarta.mail.Message;
+import jakarta.mail.internet.InternetHeaders;
-import javax.mail.Flags;
-import javax.mail.Header;
-import javax.mail.internet.InternetHeaders;
import java.io.InputStream;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
/**
- * Implementors support delegation of specific functions from {@link MStorMessage}.
+ * Implementors support delegation of specific functions from {@link Message}.
*
* @author Ben
*
diff --git a/src/main/java/net/fortuna/mstor/util/MessageUtils.java b/src/main/java/org/mstor/provider/mail/MessageUtils.java
similarity index 95%
rename from src/main/java/net/fortuna/mstor/util/MessageUtils.java
rename to src/main/java/org/mstor/provider/mail/MessageUtils.java
index e413a68a..7b1ffb04 100644
--- a/src/main/java/net/fortuna/mstor/util/MessageUtils.java
+++ b/src/main/java/org/mstor/provider/mail/MessageUtils.java
@@ -29,13 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.provider.mail;
-import javax.mail.Flags;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Flags.Flag;
-import javax.mail.internet.MimeMessage;
+import jakarta.mail.Flags;
+import jakarta.mail.Flags.Flag;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.internet.MimeMessage;
/**
* @author Ben
diff --git a/src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java b/src/main/java/org/mstor/provider/mail/ProtocolConnector.java
similarity index 89%
rename from src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java
rename to src/main/java/org/mstor/provider/mail/ProtocolConnector.java
index 6ca725ab..8b20ec7a 100755
--- a/src/main/java/net/fortuna/mstor/connector/ProtocolConnector.java
+++ b/src/main/java/org/mstor/provider/mail/ProtocolConnector.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import javax.mail.AuthenticationFailedException;
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.URLName;
+import jakarta.mail.AuthenticationFailedException;
+import jakarta.mail.Folder;
+import jakarta.mail.MessagingException;
+import jakarta.mail.URLName;
/**
* Implementors provide protocol-specific storage support.
@@ -82,4 +82,11 @@ public interface ProtocolConnector {
* @throws MessagingException where an error occurs retrieving the folder
*/
Folder getFolder(URLName url) throws MessagingException;
+
+ /**
+ * Indicate the supported protocol string(s).
+ * @param protocol
+ * @return
+ */
+ boolean isProtocolSupported(String protocol);
}
diff --git a/src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java b/src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java
similarity index 73%
rename from src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java
rename to src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java
index 0d6076d9..7dac92a0 100755
--- a/src/main/java/net/fortuna/mstor/connector/ProtocolConnectorFactory.java
+++ b/src/main/java/org/mstor/provider/mail/ProtocolConnectorFactory.java
@@ -29,14 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
+package org.mstor.provider.mail;
-import net.fortuna.mstor.connector.jcr.JcrConnector;
-import net.fortuna.mstor.connector.mbox.MboxConnector;
-import net.fortuna.mstor.model.MStorStore;
+import jakarta.mail.Session;
+import jakarta.mail.URLName;
-import javax.mail.Session;
-import javax.mail.URLName;
+import java.util.ServiceLoader;
/**
* @author Ben
@@ -52,7 +50,17 @@
public class ProtocolConnectorFactory {
private static final ProtocolConnectorFactory instance = new ProtocolConnectorFactory();
-
+
+ protected transient ServiceLoader factoryLoader;
+
+ public ProtocolConnectorFactory() {
+ this(ServiceLoader.load(ProtocolConnector.class, ProtocolConnector.class.getClassLoader()));
+ }
+
+ public ProtocolConnectorFactory(ServiceLoader factoryLoader) {
+ this.factoryLoader = factoryLoader;
+ }
+
/**
* @param url a URL location of a connector-specific store
* @param store a store instance to associate with the connector
@@ -60,10 +68,16 @@ public class ProtocolConnectorFactory {
* @return a new implementation-specific connector for the specified URL
*/
public ProtocolConnector create(URLName url, MStorStore store, Session session) {
- if (session.getProperty("mstor.repository.name") != null) {
- return new JcrConnector(url, store, session);
+ for (ProtocolConnector p : factoryLoader) {
+ if (p.isProtocolSupported(url.getProtocol())) {
+ return p;
+ }
}
- return new MboxConnector(url, store, session);
+// if (session.getProperty("mstor.repository.name") != null) {
+// return new JcrConnector(url, store, session);
+// }
+// return new MboxConnector(url, store, session);
+ return null;
}
/**
diff --git a/src/main/java/net/fortuna/mstor/model/Taggable.java b/src/main/java/org/mstor/provider/mail/Taggable.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/model/Taggable.java
rename to src/main/java/org/mstor/provider/mail/Taggable.java
index 02e05869..87a02d85 100755
--- a/src/main/java/net/fortuna/mstor/model/Taggable.java
+++ b/src/main/java/org/mstor/provider/mail/Taggable.java
@@ -29,9 +29,9 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
/**
* Implementors support tagging.
diff --git a/src/main/java/net/fortuna/mstor/model/Tags.java b/src/main/java/org/mstor/provider/mail/Tags.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/model/Tags.java
rename to src/main/java/org/mstor/provider/mail/Tags.java
index 114cc75d..a5187155 100755
--- a/src/main/java/net/fortuna/mstor/model/Tags.java
+++ b/src/main/java/org/mstor/provider/mail/Tags.java
@@ -29,11 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+
+import jakarta.mail.Flags;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
-import javax.mail.Flags;
-import javax.mail.Message;
-import javax.mail.MessagingException;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
diff --git a/src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java
similarity index 86%
rename from src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java
rename to src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java
index 473d3eee..ffac1c09 100644
--- a/src/main/java/net/fortuna/mstor/search/InReplyToSearchTerm.java
+++ b/src/main/java/org/mstor/provider/mail/search/InReplyToSearchTerm.java
@@ -29,14 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
-import net.fortuna.mstor.model.MStorMessage;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.Message;
-import javax.mail.search.SearchTerm;
+import jakarta.mail.Message;
+import jakarta.mail.search.SearchTerm;
+import org.mstor.provider.mail.MStorMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @author Ben
@@ -56,7 +55,7 @@ public class InReplyToSearchTerm extends SearchTerm {
*/
private static final long serialVersionUID = -4186790883587837877L;
- private static final Log LOG = LogFactory.getLog(InReplyToSearchTerm.class);
+ private static final Logger LOG = LoggerFactory.getLogger(InReplyToSearchTerm.class);
private final MStorMessage message;
@@ -68,7 +67,7 @@ public InReplyToSearchTerm(MStorMessage message) {
}
/* (non-Javadoc)
- * @see javax.mail.search.SearchTerm#match(javax.mail.Message)
+ * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message)
*/
@Override
public boolean match(Message msg) {
diff --git a/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java
new file mode 100644
index 00000000..ca514212
--- /dev/null
+++ b/src/main/java/org/mstor/provider/mail/search/PredicateSearchTerm.java
@@ -0,0 +1,23 @@
+package org.mstor.provider.mail.search;
+
+import jakarta.mail.Message;
+import jakarta.mail.search.SearchTerm;
+
+import java.util.function.Predicate;
+
+/**
+ * A search term backed with a functional predicate.
+ */
+public class PredicateSearchTerm extends SearchTerm {
+
+ private final Predicate messagePredicate;
+
+ public PredicateSearchTerm(Predicate messagePredicate) {
+ this.messagePredicate = messagePredicate;
+ }
+
+ @Override
+ public boolean match(Message msg) {
+ return messagePredicate.test(msg);
+ }
+}
diff --git a/src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java b/src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java
similarity index 86%
rename from src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java
rename to src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java
index 0e8b7eec..95af0f95 100644
--- a/src/main/java/net/fortuna/mstor/search/ReferencesSearchTerm.java
+++ b/src/main/java/org/mstor/provider/mail/search/ReferencesSearchTerm.java
@@ -29,14 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
-import net.fortuna.mstor.model.MStorMessage;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.Message;
-import javax.mail.search.SearchTerm;
+import jakarta.mail.Message;
+import jakarta.mail.search.SearchTerm;
+import org.mstor.provider.mail.MStorMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @author Ben
@@ -56,7 +55,7 @@ public class ReferencesSearchTerm extends SearchTerm {
*/
private static final long serialVersionUID = 6818650576380745976L;
- private static final Log LOG = LogFactory.getLog(ReferencesSearchTerm.class);
+ private static final Logger LOG = LoggerFactory.getLogger(ReferencesSearchTerm.class);
private final MStorMessage message;
@@ -68,7 +67,7 @@ public ReferencesSearchTerm(MStorMessage message) {
}
/* (non-Javadoc)
- * @see javax.mail.search.SearchTerm#match(javax.mail.Message)
+ * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message)
*/
@Override
public boolean match(Message msg) {
diff --git a/src/main/java/net/fortuna/mstor/search/SearchTerms.java b/src/main/java/org/mstor/provider/mail/search/SearchTerms.java
similarity index 96%
rename from src/main/java/net/fortuna/mstor/search/SearchTerms.java
rename to src/main/java/org/mstor/provider/mail/search/SearchTerms.java
index 55f5b12a..cbabcfa1 100755
--- a/src/main/java/net/fortuna/mstor/search/SearchTerms.java
+++ b/src/main/java/org/mstor/provider/mail/search/SearchTerms.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
+import jakarta.mail.search.SearchTerm;
-import javax.mail.search.SearchTerm;
import java.io.Reader;
import java.io.Writer;
diff --git a/src/main/java/net/fortuna/mstor/search/TagsTerm.java b/src/main/java/org/mstor/provider/mail/search/TagsTerm.java
similarity index 86%
rename from src/main/java/net/fortuna/mstor/search/TagsTerm.java
rename to src/main/java/org/mstor/provider/mail/search/TagsTerm.java
index 95808905..eb706608 100755
--- a/src/main/java/net/fortuna/mstor/search/TagsTerm.java
+++ b/src/main/java/org/mstor/provider/mail/search/TagsTerm.java
@@ -29,16 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
-import net.fortuna.mstor.model.Taggable;
-import net.fortuna.mstor.model.Tags;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.search.SearchTerm;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.search.SearchTerm;
+import org.mstor.provider.mail.Taggable;
+import org.mstor.provider.mail.Tags;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* A Search Term that matches all messages with a given set of tags.
@@ -54,7 +53,7 @@
*/
public class TagsTerm extends SearchTerm {
- private final Log log = LogFactory.getLog(TagsTerm.class);
+ private final Logger log = LoggerFactory.getLogger(TagsTerm.class);
private static final long serialVersionUID = 7893903141033644620L;
@@ -79,7 +78,7 @@ public TagsTerm(final Tags tags) {
/*
* (non-Javadoc)
*
- * @see javax.mail.search.SearchTerm#match(javax.mail.Message)
+ * @see jakarta.mail.search.SearchTerm#match(jakarta.mail.Message)
*/
public final boolean match(final Message m) {
try {
diff --git a/src/main/java/net/fortuna/mstor/util/CacheAdapter.java b/src/main/java/org/mstor/util/CacheAdapter.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/util/CacheAdapter.java
rename to src/main/java/org/mstor/util/CacheAdapter.java
index 60a2e01e..71262a29 100644
--- a/src/main/java/net/fortuna/mstor/util/CacheAdapter.java
+++ b/src/main/java/org/mstor/util/CacheAdapter.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.util;
/**
diff --git a/src/main/java/net/fortuna/mstor/util/CapabilityHints.java b/src/main/java/org/mstor/util/CapabilityHints.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/util/CapabilityHints.java
rename to src/main/java/org/mstor/util/CapabilityHints.java
index d9ef7f9e..963e033c 100755
--- a/src/main/java/net/fortuna/mstor/util/CapabilityHints.java
+++ b/src/main/java/org/mstor/util/CapabilityHints.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.util;
import java.util.HashMap;
import java.util.Map;
diff --git a/src/main/java/net/fortuna/mstor/util/Configurator.java b/src/main/java/org/mstor/util/Configurator.java
similarity index 93%
rename from src/main/java/net/fortuna/mstor/util/Configurator.java
rename to src/main/java/org/mstor/util/Configurator.java
index ada34a09..7d756ae6 100755
--- a/src/main/java/net/fortuna/mstor/util/Configurator.java
+++ b/src/main/java/org/mstor/util/Configurator.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.util;
-import java.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.util.Properties;
/**
* Provides configuration properties specified either as system properties
@@ -52,7 +52,7 @@
*/
public final class Configurator {
- private static final Log LOG = LogFactory.getLog(Configurator.class);
+ private static final Logger LOG = LoggerFactory.getLogger(Configurator.class);
private static final Properties CONFIG = new Properties();
diff --git a/src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java b/src/main/java/org/mstor/util/EhCacheAdapter.java
similarity index 98%
rename from src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java
rename to src/main/java/org/mstor/util/EhCacheAdapter.java
index 3bb73627..91ae9f54 100644
--- a/src/main/java/net/fortuna/mstor/util/EhCacheAdapter.java
+++ b/src/main/java/org/mstor/util/EhCacheAdapter.java
@@ -29,7 +29,7 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.util;
+package org.mstor.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
diff --git a/src/main/resources/META-INF/javamail.providers b/src/main/resources/META-INF/javamail.providers
index b7526074..4b00a72d 100755
--- a/src/main/resources/META-INF/javamail.providers
+++ b/src/main/resources/META-INF/javamail.providers
@@ -1 +1 @@
-protocol=mstor; type=store; class=net.fortuna.mstor.model.MStorStore; vendor=Ben Fortuna;
\ No newline at end of file
+protocol=mstor; type=store; class=org.mstor.provider.mail.MStorStore; vendor=Micronode;
diff --git a/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector b/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector
new file mode 100644
index 00000000..b6564c26
--- /dev/null
+++ b/src/main/resources/META-INF/services/org.mstor.provider.mail.ProtocolConnector
@@ -0,0 +1 @@
+#org.mstor.connector.mbox.MboxConnector
diff --git a/src/main/resources/jyaml.yml b/src/main/resources/jyaml.yml
index 10934acc..fe324a30 100755
--- a/src/main/resources/jyaml.yml
+++ b/src/main/resources/jyaml.yml
@@ -3,11 +3,11 @@ indentAmount: " "
suppressWarnings: true
encoding: "ISO-8859-1"
transfers:
- folder: net.fortuna.mstor.data.yaml.FolderExt
- message: net.fortuna.mstor.data.yaml.MessageExt
- header: javax.mail.Header
+ folder: org.mstor.mbox.data.yaml.FolderExt
+ message: org.mstor.mbox.data.yaml.MessageExt
+ header: jakarta.mail.Header
handlers:
- javax.mail.Flags: net.fortuna.mstor.data.yaml.FlagsWrapper
- javax.mail.Flags$Flag: net.fortuna.mstor.data.yaml.FlagWrapper
- javax.mail.internet.InternetHeaders: net.fortuna.mstor.data.yaml.InternetHeadersWrapper
- javax.mail.Header: net.fortuna.mstor.data.yaml.HeaderWrapper
+ jakarta.mail.Flags: org.mstor.mbox.data.yaml.FlagsWrapper
+ jakarta.mail.Flags$Flag: org.mstor.mbox.data.yaml.FlagWrapper
+ jakarta.mail.internet.InternetHeaders: org.mstor.mbox.data.yaml.InternetHeadersWrapper
+ jakarta.mail.Header: org.mstor.mbox.data.yaml.HeaderWrapper
diff --git a/src/main/resources/net/fortuna/mstor/util/package-info.java b/src/main/resources/net/fortuna/mstor/util/package-info.java
deleted file mode 100644
index 71c1172e..00000000
--- a/src/main/resources/net/fortuna/mstor/util/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Contains utility types.
- */
-@Version("1.0.0")
-package net.fortuna.mstor.util;
-
-import aQute.bnd.annotation.Version;
\ No newline at end of file
diff --git a/src/main/resources/net/fortuna/mstor/data/package-info.java b/src/main/resources/org/mstor/data/package-info.java
similarity index 79%
rename from src/main/resources/net/fortuna/mstor/data/package-info.java
rename to src/main/resources/org/mstor/data/package-info.java
index 9756d70b..cdf11bd4 100644
--- a/src/main/resources/net/fortuna/mstor/data/package-info.java
+++ b/src/main/resources/org/mstor/data/package-info.java
@@ -2,6 +2,6 @@
* Contains underlying mbox and metadata implementations.
*/
@Version("1.0.0")
-package net.fortuna.mstor.data;
+package org.mstor.mbox.data;
import aQute.bnd.annotation.Version;
\ No newline at end of file
diff --git a/src/main/resources/net/fortuna/mstor/data/xml/package-info.java b/src/main/resources/org/mstor/data/xml/package-info.java
similarity index 77%
rename from src/main/resources/net/fortuna/mstor/data/xml/package-info.java
rename to src/main/resources/org/mstor/data/xml/package-info.java
index dd143610..539ba4f2 100644
--- a/src/main/resources/net/fortuna/mstor/data/xml/package-info.java
+++ b/src/main/resources/org/mstor/data/xml/package-info.java
@@ -2,6 +2,6 @@
* Contains XML binding classes used for metadata persistence.
*/
@Version("1.0.0")
-package net.fortuna.mstor.data.xml;
+package org.mstor.data.xml;
import aQute.bnd.annotation.Version;
\ No newline at end of file
diff --git a/src/main/resources/net/fortuna/mstor/package-info.java b/src/main/resources/org/mstor/package-info.java
similarity index 84%
rename from src/main/resources/net/fortuna/mstor/package-info.java
rename to src/main/resources/org/mstor/package-info.java
index 0170d3a3..9b211bb1 100644
--- a/src/main/resources/net/fortuna/mstor/package-info.java
+++ b/src/main/resources/org/mstor/package-info.java
@@ -2,6 +2,6 @@
* Contains JavaMail implementations and metadata definitions for this provider.
*/
@Version("1.0.0")
-package net.fortuna.mstor;
+package org.mstor.mbox;
import aQute.bnd.annotation.Version;
\ No newline at end of file
diff --git a/src/main/resources/net/fortuna/mstor/search/package-info.java b/src/main/resources/org/mstor/search/package-info.java
similarity index 76%
rename from src/main/resources/net/fortuna/mstor/search/package-info.java
rename to src/main/resources/org/mstor/search/package-info.java
index 35b1e64d..ccafcfd6 100644
--- a/src/main/resources/net/fortuna/mstor/search/package-info.java
+++ b/src/main/resources/org/mstor/search/package-info.java
@@ -2,6 +2,6 @@
* Contains JavaMail search terms and utilities.
*/
@Version("1.0.0")
-package net.fortuna.mstor.search;
+package org.mstor.mbox.search;
import aQute.bnd.annotation.Version;
\ No newline at end of file
diff --git a/src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy b/src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy
similarity index 78%
rename from src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy
rename to src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy
index 63494f29..731c033d 100644
--- a/src/test/groovy/net/fortuna/mstor/connector/jcr/JcrMessageSpec.groovy
+++ b/src/test/groovy/org/mstor/connector/jcr/JcrMessageSpec.groovy
@@ -29,25 +29,20 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr
+package org.mstor.connector.jcr
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-import javax.mail.Authenticator;
-import javax.mail.Flags;
-import javax.mail.Flags.Flag;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.PasswordAuthentication;
-import javax.mail.internet.MimeMessage;
-import javax.naming.InitialContext;
-import org.apache.jackrabbit.core.TransientRepository;
-import org.apache.jackrabbit.core.config.RepositoryConfig;
-import org.apache.jackrabbit.core.jndi.RegistryHelper;
+import jakarta.mail.Flags.Flag
+import jakarta.mail.Folder
+import jakarta.mail.Message
+import jakarta.mail.internet.MimeMessage
+import org.apache.jackrabbit.core.jndi.RegistryHelper
+import spock.lang.Shared
+import spock.lang.Specification
-import spock.lang.Shared;
-import spock.lang.Specification;
+import javax.jcr.Session
+import javax.jcr.SimpleCredentials
+import javax.naming.InitialContext
class JcrMessageSpec extends Specification {
@@ -55,7 +50,7 @@ class JcrMessageSpec extends Specification {
@Shared Session session
- @Shared javax.mail.Session mailSession
+ @Shared jakarta.mail.Session mailSession
def setupSpec() {
// def configFile = JcrMessageSpec.getResource('/repository.xml').toURI()
@@ -77,8 +72,8 @@ class JcrMessageSpec extends Specification {
mailSessionProps.setProperty('mstor.repository.create', 'true')
mailSessionProps.setProperty('mail.store.protocol', 'mstor')
- mailSession = javax.mail.Session.getInstance(mailSessionProps,
- { new PasswordAuthentication('admin', '') } as Authenticator)
+ mailSession = jakarta.mail.Session.getInstance(mailSessionProps,
+ { new java.net.PasswordAuthentication('admin', '') } as java.net.Authenticator)
}
def cleanupSpec() {
@@ -107,7 +102,8 @@ class JcrMessageSpec extends Specification {
inbox.appendMessages([message] as Message[])
expect:
- def messageNode = session.rootNode.mail.folders.inbox.messages.nodes.next()
- messageNode.flags?.values.collect { it.string } == ['deleted']
+ groovy.util.Node messageNode = session.rootNode.getNode('mail').getNode('folders')
+ .getNode('inbox').getNode('messages').nodes.nextNode()
+ messageNode.getProperty('flags').values.collect { it.string } == ['deleted']
}
}
diff --git a/src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy b/src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy
similarity index 76%
rename from src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy
rename to src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy
index c89cc11f..a8b9cef4 100644
--- a/src/test/groovy/net/fortuna/mstor/connector/mbox/MboxMessageSpec.groovy
+++ b/src/test/groovy/org/mstor/connector/mbox/MboxMessageSpec.groovy
@@ -29,29 +29,29 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox
+package org.mstor.connector.mbox
import groovy.util.logging.Slf4j
-
-import javax.mail.Folder;
-import javax.mail.Store
-import javax.mail.URLName
-
+import jakarta.mail.Folder
+import jakarta.mail.Store
+import jakarta.mail.URLName
import spock.lang.Shared
import spock.lang.Specification
+import java.nio.file.FileSystems
+
@Slf4j
class MboxMessageSpec extends Specification {
- @Shared javax.mail.Session mailSession
+ @Shared jakarta.mail.Session mailSession
def setupSpec() {
- mailSession = javax.mail.Session.getInstance(new Properties())
+ mailSession = jakarta.mail.Session.getInstance(new Properties())
}
def 'assert read messages from mbox file'() {
setup: 'construct a local store'
- def filename = new File(path).absolutePath
+ def filename = FileSystems.getDefault().getPath(path).toAbsolutePath()
Store localStore = mailSession.getStore(new URLName("mstor:$filename"))
localStore.connect()
@@ -69,11 +69,11 @@ class MboxMessageSpec extends Specification {
where:
path | messageCount
- 'etc/samples/mailboxes/contenttype-semis.mbox' | 1
-// 'etc/samples/mailboxes/imagined.mbox' | 223
- 'etc/samples/mailboxes/parseexception.mbox' | 1
- 'etc/samples/mailboxes/received-0xc.mbox' | 1
- 'etc/samples/mailboxes/samples.mbx' | 2
- 'etc/samples/mailboxes/subject-0x1f.mbox' | 1
+ 'src/test/resources/samples/mailboxes/contenttype-semis.mbox' | 1
+// 'src/test/resources/samples/mailboxes/imagined.mbox' | 223
+ 'src/test/resources/samples/mailboxes/parseexception.mbox' | 1
+ 'src/test/resources/samples/mailboxes/received-0xc.mbox' | 1
+ 'src/test/resources/samples/mailboxes/samples.mbx' | 2
+ 'src/test/resources/samples/mailboxes/subject-0x1f.mbox' | 1
}
}
diff --git a/src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy b/src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy
similarity index 94%
rename from src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy
rename to src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy
index ab692b09..7ba9fae8 100644
--- a/src/test/groovy/net/fortuna/mstor/MessageBuilderTest.groovy
+++ b/src/test/groovy/org/mstor/provider/mail/MessageBuilderTest.groovy
@@ -29,14 +29,11 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor;
+package org.mstor.provider.mail
-import javax.mail.Session;
-import javax.mail.internet.InternetAddress;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
+import jakarta.mail.Session
+import jakarta.mail.internet.InternetAddress
+import org.junit.Test
class MessageBuilderTest {
diff --git a/src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy b/src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy
similarity index 91%
rename from src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy
rename to src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy
index 4f1fe70e..9d44ce83 100644
--- a/src/test/groovy/net/fortuna/mstor/search/SearchTermBuilderTest.groovy
+++ b/src/test/groovy/org/mstor/provider/mail/search/SearchTermBuilderTest.groovy
@@ -29,19 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
-import javax.mail.Address;
+package org.mstor.provider.mail.search
-
-import javax.mail.Message;
-import javax.mail.Message.RecipientType;
-import javax.mail.search.FromTerm;
-import javax.mail.search.RecipientTerm;
-import javax.mail.internet.InternetAddress;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
+import jakarta.mail.Address
+import jakarta.mail.Message
+import jakarta.mail.Message.RecipientType
+import jakarta.mail.internet.InternetAddress
+import jakarta.mail.search.FromTerm
+import jakarta.mail.search.RecipientTerm
+import org.junit.Test
class SearchTermBuilderTest {
diff --git a/src/test/java/net/fortuna/mstor/model/StoreLifecycle.java b/src/test/java/org/mstor/connector/StoreLifecycle.java
similarity index 95%
rename from src/test/java/net/fortuna/mstor/model/StoreLifecycle.java
rename to src/test/java/org/mstor/connector/StoreLifecycle.java
index 162491b4..5c9cd56a 100755
--- a/src/test/java/net/fortuna/mstor/model/StoreLifecycle.java
+++ b/src/test/java/org/mstor/connector/StoreLifecycle.java
@@ -29,10 +29,10 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.connector;
-import javax.mail.NoSuchProviderException;
-import javax.mail.Store;
+import jakarta.mail.NoSuchProviderException;
+import jakarta.mail.Store;
/**
* @author Ben
diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java b/src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java
similarity index 98%
rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java
rename to src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java
index 0af68acb..41bc2c52 100644
--- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/jcr/JcrMStorFolderIntegrationTest.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
import junit.framework.TestSuite;
-import net.fortuna.mstor.model.MStorFolderTest;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.MStorFolderTest;
import java.io.File;
import java.util.Properties;
@@ -65,7 +65,7 @@ public static TestSuite suite() {
defaultProps.setProperty("mstor.repository.path", "mail");
defaultProps.setProperty("mstor.repository.create", "true");
- File initMboxDir = new File("etc/samples/mailboxes/MboxFile");
+ File initMboxDir = new File("src/test/resources/samples/mailboxes/MboxFile");
String repoName = "JcrMStorFolderTest.testExists";
Properties p = new Properties(defaultProps);
diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java b/src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java
similarity index 95%
rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java
rename to src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java
index bc5ad747..4c39b650 100644
--- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/jcr/JcrMStorStoreIntegrationTest.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
import junit.framework.TestSuite;
-import net.fortuna.mstor.model.MStorStoreTest;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.MStorStoreTest;
import java.io.File;
import java.util.Properties;
@@ -65,7 +65,7 @@ public static TestSuite suite() {
defaultProps.setProperty("mstor.repository.path", "mail");
defaultProps.setProperty("mstor.repository.create", "true");
- File initMboxDir = new File("etc/samples/mailboxes/MboxFile");
+ File initMboxDir = new File("src/test/resources/samples/mailboxes/MboxFile");
String repoName = "JcrMStorStoreTest.testGetDefaultFolder";
Properties p = new Properties(defaultProps);
diff --git a/src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java b/src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java
similarity index 95%
rename from src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java
rename to src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java
index 8f13c5fc..4b8e5650 100755
--- a/src/test/java/net/fortuna/mstor/connector/jcr/JcrStoreLifecycle.java
+++ b/src/test/java/org/mstor/connector/jcr/JcrStoreLifecycle.java
@@ -32,16 +32,16 @@
/**
*
*/
-package net.fortuna.mstor.connector.jcr;
+package org.mstor.connector.jcr;
-import net.fortuna.mstor.model.StoreLifecycle;
+import jakarta.mail.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.time.DurationFormatUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.apache.jackrabbit.core.jndi.RegistryHelper;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.io.File;
@@ -53,7 +53,7 @@
*/
public class JcrStoreLifecycle implements StoreLifecycle {
- private static final Log LOG = LogFactory.getLog(JcrStoreLifecycle.class);
+ private static final Logger LOG = LoggerFactory.getLogger(JcrStoreLifecycle.class);
private static final String BASE_TEST_DIR = System.getProperty("java.io.tmpdir")
+ File.separator + JcrStoreLifecycle.class.getSimpleName() + File.separator;
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java
similarity index 94%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java
index f028c65d..cb6e6e07 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxMStorFolderIntegrationTest.java
@@ -29,15 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy;
-import net.fortuna.mstor.model.MStorFolderTest;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.connector.mbox.MboxConnector.MetadataStrategy;
+import org.mstor.provider.mail.MStorFolderTest;
import java.io.File;
import java.io.FileFilter;
@@ -66,9 +66,9 @@ public static TestSuite suite() {
Properties p = new Properties();
p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString());
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java
similarity index 88%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java
index b9636b49..1c7a891c 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxMStorMessageIntegrationTest.java
@@ -29,15 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy;
-import net.fortuna.mstor.model.MStorMessageTest;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.MStorMessageTest;
import java.io.File;
import java.io.FileFilter;
@@ -64,11 +63,11 @@ public static TestSuite suite() {
TestSuite suite = new TestSuite(MboxMStorMessageIntegrationTest.class.getSimpleName());
Properties p = new Properties();
- p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString());
+ p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString());
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java
similarity index 91%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java
index 280a4cee..82cbf8f2 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxMStorStoreIntegrationTest.java
@@ -29,14 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.model.MStorStoreTest;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.MStorStoreTest;
import java.io.File;
import java.io.FileFilter;
@@ -64,9 +64,9 @@ public static TestSuite suite() {
Properties p = new Properties();
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java
similarity index 90%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java
index 473f5e30..46f04bd2 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxMessedUpCacheIntegrationTest.java
@@ -29,12 +29,12 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.model.MessedUpCacheTest;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.MessedUpCacheTest;
import java.util.Properties;
@@ -62,9 +62,9 @@ public static TestSuite suite() {
suite.addTest(new MessedUpCacheTest("testMessedUpCache",
new MboxStoreLifecycle("testMessedUpCache", p, null), null, null));
-// File[] samples = new File("etc/samples/mailboxes").listFiles(
+// File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
// (FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
// for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java b/src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java
similarity index 95%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java
rename to src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java
index e5eb1811..7f04af35 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxStoreLifecycle.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxStoreLifecycle.java
@@ -29,14 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
-import net.fortuna.mstor.model.StoreLifecycle;
+import jakarta.mail.Session;
+import jakarta.mail.Store;
+import jakarta.mail.URLName;
import org.apache.commons.io.FileUtils;
+import org.mstor.connector.StoreLifecycle;
-import javax.mail.Session;
-import javax.mail.Store;
-import javax.mail.URLName;
import java.io.File;
import java.util.Properties;
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java
similarity index 87%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java
index e58d378a..69b29578 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxTagIntegrationTest.java
@@ -29,15 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy;
-import net.fortuna.mstor.model.TagTest;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.provider.mail.TagTest;
import java.io.File;
import java.io.FileFilter;
@@ -64,11 +63,11 @@ public static TestSuite suite() {
TestSuite suite = new TestSuite(MboxTagIntegrationTest.class.getSimpleName());
Properties p = new Properties();
- p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString());
+ p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString());
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java
similarity index 87%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java
index 8cea5168..ce79875d 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxTagsTermIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxTagsTermIntegrationTest.java
@@ -29,20 +29,18 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.Properties;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
-import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy;
-import net.fortuna.mstor.search.TagsTermTest;
+import org.mstor.provider.mail.search.TagsTermTest;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
+import java.io.File;
+import java.io.FileFilter;
+import java.util.Properties;
/**
* @author Ben
@@ -65,11 +63,11 @@ public static TestSuite suite() {
TestSuite suite = new TestSuite(MboxTagsTermIntegrationTest.class.getSimpleName());
Properties p = new Properties();
- p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString());
+ p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MboxConnector.MetadataStrategy.YAML.toString());
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java b/src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java
similarity index 91%
rename from src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java
rename to src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java
index 37386986..673af264 100755
--- a/src/test/java/net/fortuna/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java
+++ b/src/test/java/org/mstor/connector/mbox/MboxUIDFolderIntegrationTest.java
@@ -29,15 +29,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector.mbox;
+package org.mstor.connector.mbox;
import junit.framework.TestSuite;
-import net.fortuna.mstor.connector.mbox.MboxConnector.MetadataStrategy;
-import net.fortuna.mstor.model.UIDFolderTest;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.junit.runner.RunWith;
import org.junit.runners.AllTests;
+import org.mstor.connector.mbox.MboxConnector.MetadataStrategy;
+import org.mstor.provider.mail.UIDFolderTest;
import java.io.File;
import java.io.FileFilter;
@@ -66,9 +66,9 @@ public static TestSuite suite() {
Properties p = new Properties();
p.setProperty(MboxConnector.KEY_METADATA_STRATEGY, MetadataStrategy.YAML.toString());
- File[] samples = new File("etc/samples/mailboxes").listFiles(
+ File[] samples = new File("src/test/resources/samples/mailboxes").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
- //File[] samples = new File[] {new File("etc/samples/mailboxes/samples.mbx")};
+ //File[] samples = new File[] {new File("src/test/resources/samples/mailboxes/samples.mbx")};
for (int i = 0; i < samples.length; i++) {
// log.info("Sample [" + samples[i] + "]");
diff --git a/src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java b/src/test/java/org/mstor/data/MboxEncoderTest.java
similarity index 91%
rename from src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java
rename to src/test/java/org/mstor/data/MboxEncoderTest.java
index 01e79c04..d0f2618d 100755
--- a/src/test/java/net/fortuna/mstor/data/MboxEncoderTest.java
+++ b/src/test/java/org/mstor/data/MboxEncoderTest.java
@@ -29,14 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
-
-import java.io.IOException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+package org.mstor.data;
import junit.framework.TestCase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
/**
* @author Ben Fortuna
@@ -52,7 +51,7 @@
*/
public class MboxEncoderTest extends TestCase {
- private static Log log = LogFactory.getLog(MboxEncoderTest.class);
+ private static Logger log = LoggerFactory.getLogger(MboxEncoderTest.class);
/**
* @throws IOException
diff --git a/src/test/java/net/fortuna/mstor/data/MboxFileTest.java b/src/test/java/org/mstor/data/MboxFileTest.java
similarity index 93%
rename from src/test/java/net/fortuna/mstor/data/MboxFileTest.java
rename to src/test/java/org/mstor/data/MboxFileTest.java
index 05dadbbc..b50fa4e5 100755
--- a/src/test/java/net/fortuna/mstor/data/MboxFileTest.java
+++ b/src/test/java/org/mstor/data/MboxFileTest.java
@@ -29,26 +29,25 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
+package org.mstor.data;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
-import net.fortuna.mstor.data.MboxFile.BufferStrategy;
-import net.fortuna.mstor.util.CapabilityHints;
+import org.mstor.data.MboxFile.BufferStrategy;
+import org.mstor.util.CapabilityHints;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.shaded.org.apache.commons.io.FileUtils;
+import org.testcontainers.shaded.org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.testcontainers.shaded.org.apache.commons.io.filefilter.NotFileFilter;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
/**
- * Unit tests for {@link net.fortuna.mstor.data.MboxFile}.
+ * Unit tests for {@link MboxFile}.
*
* @author Ben Fortuna
*
@@ -61,7 +60,7 @@
*/
public class MboxFileTest extends TestCase {
- private static Log log = LogFactory.getLog(MboxFileTest.class);
+ private static Logger log = LoggerFactory.getLogger(MboxFileTest.class);
private String filename;
@@ -121,7 +120,7 @@ public MboxFileTest(String method, String filename, BufferStrategy bufferStrateg
*/
protected final void setUp() throws Exception {
super.setUp();
- // File f = new File("etc/samples/mailboxes/MboxFile/Inbox");
+ // File f = new File("src/test/resources/samples/mailboxes/MboxFile/Inbox");
testFile = createTestHierarchy(new File(filename));
mbox = new MboxFile(testFile, MboxFile.READ_WRITE);
@@ -278,13 +277,13 @@ public static Test suite() {
// suite.addTest(new MboxFileTest("testGetMessageCount", "/tmp/Inbox"));
suite.addTest(new MboxFileTest("testGetMessageCount",
- "etc/samples/mailboxes/foxmail/in.BOX",
+ "src/test/resources/samples/mailboxes/foxmail/in.BOX",
BufferStrategy.DEFAULT, false, true));
suite.addTest(new MboxFileTest("testGetMessageCount",
- "etc/samples/mailboxes/foxmail/NEWBO2.BOX",
+ "src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX",
BufferStrategy.DEFAULT, false, true));
- File[] testFiles = new File("etc/samples/mailboxes")
+ File[] testFiles = new File("src/test/resources/samples/mailboxes")
.listFiles((FileFilter) new NotFileFilter(
DirectoryFileFilter.INSTANCE));
for (int i = 0; i < testFiles.length; i++) {
diff --git a/src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java b/src/test/java/org/mstor/data/MessageInputStreamTest.java
similarity index 88%
rename from src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java
rename to src/test/java/org/mstor/data/MessageInputStreamTest.java
index 19628c41..efee127c 100755
--- a/src/test/java/net/fortuna/mstor/data/MessageInputStreamTest.java
+++ b/src/test/java/org/mstor/data/MessageInputStreamTest.java
@@ -29,22 +29,21 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.data;
+package org.mstor.data;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.testcontainers.shaded.org.apache.commons.io.FileUtils;
+import org.testcontainers.shaded.org.apache.commons.io.IOUtils;
+import org.testcontainers.shaded.org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.testcontainers.shaded.org.apache.commons.io.filefilter.NotFileFilter;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.ByteBuffer;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
/**
* @author Ben
*
@@ -95,7 +94,7 @@ public static Test suite() {
TestSuite suite = new TestSuite(MessageInputStream.class.getSimpleName());
- File[] testFiles = new File("etc/samples/messages").listFiles(
+ File[] testFiles = new File("src/test/resources/samples/messages").listFiles(
(FileFilter) new NotFileFilter(DirectoryFileFilter.INSTANCE));
for (int i = 0; i < testFiles.length; i++) {
diff --git a/src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java b/src/test/java/org/mstor/provider/mail/AbstractMStorTest.java
similarity index 96%
rename from src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java
rename to src/test/java/org/mstor/provider/mail/AbstractMStorTest.java
index 88d4b0d1..4f5c55cd 100755
--- a/src/test/java/net/fortuna/mstor/model/AbstractMStorTest.java
+++ b/src/test/java/org/mstor/provider/mail/AbstractMStorTest.java
@@ -29,12 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+import jakarta.mail.Folder;
+import jakarta.mail.Store;
import junit.framework.TestCase;
+import org.mstor.connector.StoreLifecycle;
-import javax.mail.Folder;
-import javax.mail.Store;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/test/java/net/fortuna/mstor/model/MStorFolderTest.java b/src/test/java/org/mstor/provider/mail/MStorFolderTest.java
similarity index 98%
rename from src/test/java/net/fortuna/mstor/model/MStorFolderTest.java
rename to src/test/java/org/mstor/provider/mail/MStorFolderTest.java
index 06c9de7d..14c65eef 100755
--- a/src/test/java/net/fortuna/mstor/model/MStorFolderTest.java
+++ b/src/test/java/org/mstor/provider/mail/MStorFolderTest.java
@@ -29,13 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+import jakarta.mail.*;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.*;
import java.io.IOException;
import java.util.Arrays;
@@ -55,7 +56,7 @@ public class MStorFolderTest extends AbstractMStorTest {
// private static final int INITIAL_MESSAGE_COUNT = 1;
- private static Log log = LogFactory.getLog(MStorFolderTest.class);
+ private static Logger log = LoggerFactory.getLogger(MStorFolderTest.class);
// private static Properties p = new Properties();
// static {
diff --git a/src/test/java/net/fortuna/mstor/model/MStorMessageTest.java b/src/test/java/org/mstor/provider/mail/MStorMessageTest.java
similarity index 96%
rename from src/test/java/net/fortuna/mstor/model/MStorMessageTest.java
rename to src/test/java/org/mstor/provider/mail/MStorMessageTest.java
index 1d31f2b5..43528bac 100755
--- a/src/test/java/net/fortuna/mstor/model/MStorMessageTest.java
+++ b/src/test/java/org/mstor/provider/mail/MStorMessageTest.java
@@ -29,12 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import jakarta.mail.*;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.*;
import java.util.Enumeration;
/**
@@ -51,7 +52,7 @@
*/
public class MStorMessageTest extends AbstractMStorTest {
- private static Log log = LogFactory.getLog(MStorFolderTest.class);
+ private static Logger log = LoggerFactory.getLogger(MStorFolderTest.class);
// private String testFolder;
diff --git a/src/test/java/net/fortuna/mstor/model/MStorStoreTest.java b/src/test/java/org/mstor/provider/mail/MStorStoreTest.java
similarity index 90%
rename from src/test/java/net/fortuna/mstor/model/MStorStoreTest.java
rename to src/test/java/org/mstor/provider/mail/MStorStoreTest.java
index ee4aa1c6..6387f9af 100755
--- a/src/test/java/net/fortuna/mstor/model/MStorStoreTest.java
+++ b/src/test/java/org/mstor/provider/mail/MStorStoreTest.java
@@ -29,14 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.URLName;
+import jakarta.mail.Folder;
+import jakarta.mail.MessagingException;
+import jakarta.mail.URLName;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -51,7 +51,7 @@
*/
public class MStorStoreTest extends AbstractMStorTest {
- private static Log log = LogFactory.getLog(MStorStoreTest.class);
+ private static Logger log = LoggerFactory.getLogger(MStorStoreTest.class);
/**
* Default constructor.
diff --git a/src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java b/src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java
similarity index 95%
rename from src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java
rename to src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java
index 26167a98..52fe15e3 100755
--- a/src/test/java/net/fortuna/mstor/model/MessedUpCacheTest.java
+++ b/src/test/java/org/mstor/provider/mail/MessedUpCacheTest.java
@@ -29,11 +29,13 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+
+import jakarta.mail.*;
+import jakarta.mail.internet.InternetAddress;
+import jakarta.mail.internet.MimeMessage;
+import org.mstor.connector.StoreLifecycle;
-import javax.mail.*;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
import java.util.Random;
/**
diff --git a/src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java b/src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java
similarity index 77%
rename from src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java
rename to src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java
index e265b69d..18c22b80 100755
--- a/src/test/java/net/fortuna/mstor/connector/ProtocolConnectorFactoryTest.java
+++ b/src/test/java/org/mstor/provider/mail/ProtocolConnectorFactoryTest.java
@@ -29,16 +29,14 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.connector;
-
-import java.util.Properties;
-
-import javax.mail.Session;
-import javax.mail.URLName;
+package org.mstor.provider.mail;
+import jakarta.mail.Session;
+import jakarta.mail.URLName;
import junit.framework.TestCase;
-import net.fortuna.mstor.connector.jcr.JcrConnector;
-import net.fortuna.mstor.connector.mbox.MboxConnector;
+import org.junit.Ignore;
+
+import java.util.Properties;
/**
* @author Ben
@@ -50,22 +48,23 @@
*
*
*/
+@Ignore
public class ProtocolConnectorFactoryTest extends TestCase {
/**
- * Test method for {@link ProtocolConnectorFactory#create(URLName, net.fortuna.mstor.MStorStore, Session)}.
+ * Test method for {@link ProtocolConnectorFactory#create(URLName, MStorStore, Session)}.
*/
public void testCreate() {
Properties p = new Properties();
URLName urlName = new URLName("mstor", null, -1, "/tmp/mbox", null, null);
- assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p))
- instanceof MboxConnector);
+ assertNotNull(ProtocolConnectorFactory.getInstance().create(urlName, null,
+ Session.getDefaultInstance(p)));
urlName = new URLName("mstor", "localhost", -1, "/tmp/mbox", "test", null);
- p.setProperty("mstor.repository.name", "test");
- assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p))
- instanceof JcrConnector);
+// p.setProperty("mstor.repository.name", "test");
+// assertTrue(ProtocolConnectorFactory.getInstance().create(urlName, null, Session.getDefaultInstance(p))
+// instanceof JcrConnector);
}
}
diff --git a/src/test/java/net/fortuna/mstor/model/TagTest.java b/src/test/java/org/mstor/provider/mail/TagTest.java
similarity index 94%
rename from src/test/java/net/fortuna/mstor/model/TagTest.java
rename to src/test/java/org/mstor/provider/mail/TagTest.java
index f8935a90..a803f191 100755
--- a/src/test/java/net/fortuna/mstor/model/TagTest.java
+++ b/src/test/java/org/mstor/provider/mail/TagTest.java
@@ -29,16 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.Store;
import junit.framework.TestCase;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Store;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -57,7 +58,7 @@
*/
public class TagTest extends TestCase {
- private static final Log LOG = LogFactory.getLog(TagTest.class);
+ private static final Logger LOG = LoggerFactory.getLogger(TagTest.class);
// private String testFolder;
diff --git a/src/test/java/net/fortuna/mstor/model/TagsTest.java b/src/test/java/org/mstor/provider/mail/TagsTest.java
similarity index 82%
rename from src/test/java/net/fortuna/mstor/model/TagsTest.java
rename to src/test/java/org/mstor/provider/mail/TagsTest.java
index 31c95d60..b4f2ae5f 100755
--- a/src/test/java/net/fortuna/mstor/model/TagsTest.java
+++ b/src/test/java/org/mstor/provider/mail/TagsTest.java
@@ -29,20 +29,20 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
+import jakarta.mail.Flags;
import junit.framework.TestCase;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.Flags;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
- * Unit tests for {@link net.fortuna.mstor.model.Tags}.
+ * Unit tests for {@link Tags}.
*
* @author Ben Fortuna
*
@@ -55,7 +55,7 @@
*/
public class TagsTest extends TestCase {
- private static final Log LOG = LogFactory.getLog(TagsTest.class);
+ private static final Logger LOG = LoggerFactory.getLogger(TagsTest.class);
private Flags flags;
@@ -75,7 +75,7 @@ protected void setUp() throws Exception {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.size()'
+ * Test method for 'org.mstor.mail.Tags.size()'
*/
public void testSize() {
assertEquals(4, tags.size());
@@ -83,7 +83,7 @@ public void testSize() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.isEmpty()'
+ * Test method for 'org.mstor.mail.Tags.isEmpty()'
*/
public void testIsEmpty() {
tags.clear();
@@ -92,7 +92,7 @@ public void testIsEmpty() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.contains(Object)'
+ * Test method for 'org.mstor.mail.Tags.contains(Object)'
*/
public void testContains() {
assertTrue(tags.contains("Work"));
@@ -100,7 +100,7 @@ public void testContains() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.iterator()'
+ * Test method for 'org.mstor.mail.Tags.iterator()'
*/
public void testIterator() {
Iterator i = tags.iterator();
@@ -111,7 +111,7 @@ public void testIterator() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.toArray()'
+ * Test method for 'org.mstor.mail.Tags.toArray()'
*/
public void testToArray() {
Object[] array = tags.toArray();
@@ -119,7 +119,7 @@ public void testToArray() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.toArray(T[]) '
+ * Test method for 'org.mstor.mail.Tags.toArray(T[]) '
*/
public void testToArrayTArray() {
String[] array = (String[]) tags.toArray(new String[tags.size()]);
@@ -127,7 +127,7 @@ public void testToArrayTArray() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.add(String)'
+ * Test method for 'org.mstor.mail.Tags.add(String)'
*/
public void testAdd() {
tags.add("mstor");
@@ -136,7 +136,7 @@ public void testAdd() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.remove(Object)'
+ * Test method for 'org.mstor.mail.Tags.remove(Object)'
*/
public void testRemove() {
tags.remove("Work");
@@ -145,7 +145,7 @@ public void testRemove() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.containsAll(Collection>)'
+ * Test method for 'org.mstor.mail.Tags.containsAll(Collection>)'
*/
public void testContainsAll() {
Set set = new HashSet();
@@ -155,7 +155,7 @@ public void testContainsAll() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.addAll(Collection extends String>)'
+ * Test method for 'org.mstor.mail.Tags.addAll(Collection extends String>)'
*/
public void testAddAll() {
Set set = new HashSet();
@@ -167,7 +167,7 @@ public void testAddAll() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.retainAll(Collection>)'
+ * Test method for 'org.mstor.mail.Tags.retainAll(Collection>)'
*/
public void testRetainAll() {
Set set = new HashSet();
@@ -180,7 +180,7 @@ public void testRetainAll() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.removeAll(Collection>)'
+ * Test method for 'org.mstor.mail.Tags.removeAll(Collection>)'
*/
public void testRemoveAll() {
Set set = new HashSet();
@@ -195,7 +195,7 @@ public void testRemoveAll() {
}
/*
- * Test method for 'net.fortuna.mstor.Tags.clear()'
+ * Test method for 'org.mstor.mail.Tags.clear()'
*/
public void testClear() {
tags.clear();
diff --git a/src/test/java/net/fortuna/mstor/model/UIDFolderTest.java b/src/test/java/org/mstor/provider/mail/UIDFolderTest.java
similarity index 93%
rename from src/test/java/net/fortuna/mstor/model/UIDFolderTest.java
rename to src/test/java/org/mstor/provider/mail/UIDFolderTest.java
index ad6d4972..aaf4d242 100755
--- a/src/test/java/net/fortuna/mstor/model/UIDFolderTest.java
+++ b/src/test/java/org/mstor/provider/mail/UIDFolderTest.java
@@ -29,15 +29,16 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.model;
+package org.mstor.provider.mail;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.UIDFolder;
+import org.mstor.connector.StoreLifecycle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.UIDFolder;
import java.util.ArrayList;
import java.util.List;
@@ -55,7 +56,7 @@
*/
public class UIDFolderTest extends AbstractMStorTest {
- private static final Log LOG = LogFactory.getLog(UIDFolderTest.class);
+ private static final Logger LOG = LoggerFactory.getLogger(UIDFolderTest.class);
/*
private static Properties p = new Properties();
@@ -81,7 +82,7 @@ public UIDFolderTest(String method, StoreLifecycle lifecycle,
/*
* (non-Javadoc)
*
- * @see net.fortuna.mstor.model.AbstractMStorTest#setUp()
+ * @see org.mstor.mail.model.AbstractMStorTest#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
@@ -96,7 +97,7 @@ protected void setUp() throws Exception {
}
/* (non-Javadoc)
- * @see net.fortuna.mstor.model.AbstractMStorTest#tearDown()
+ * @see org.mstor.mail.model.AbstractMStorTest#tearDown()
*/
protected void tearDown() throws Exception {
for (int i = 0; i < uidFolders.length; i++) {
diff --git a/src/test/java/net/fortuna/mstor/search/SearchTermsTest.java b/src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java
similarity index 87%
rename from src/test/java/net/fortuna/mstor/search/SearchTermsTest.java
rename to src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java
index 9e8f3524..695a1482 100755
--- a/src/test/java/net/fortuna/mstor/search/SearchTermsTest.java
+++ b/src/test/java/org/mstor/provider/mail/search/SearchTermsTest.java
@@ -29,17 +29,17 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
+import jakarta.mail.search.AddressStringTerm;
+import jakarta.mail.search.FromStringTerm;
+import jakarta.mail.search.OrTerm;
import junit.framework.TestCase;
-import net.fortuna.mstor.model.Tags;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.junit.Ignore;
+import org.mstor.provider.mail.Tags;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import javax.mail.search.AddressStringTerm;
-import javax.mail.search.FromStringTerm;
-import javax.mail.search.OrTerm;
import java.io.StringReader;
import java.io.StringWriter;
@@ -56,7 +56,7 @@
@Ignore
public class SearchTermsTest extends TestCase {
- private static final Log LOG = LogFactory.getLog(SearchTermsTest.class);
+ private static final Logger LOG = LoggerFactory.getLogger(SearchTermsTest.class);
/**
* Test save method.
diff --git a/src/test/java/net/fortuna/mstor/search/TagsTermTest.java b/src/test/java/org/mstor/provider/mail/search/TagsTermTest.java
similarity index 92%
rename from src/test/java/net/fortuna/mstor/search/TagsTermTest.java
rename to src/test/java/org/mstor/provider/mail/search/TagsTermTest.java
index 7ebecb68..daaa5a9d 100755
--- a/src/test/java/net/fortuna/mstor/search/TagsTermTest.java
+++ b/src/test/java/org/mstor/provider/mail/search/TagsTermTest.java
@@ -29,29 +29,29 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package net.fortuna.mstor.search;
+package org.mstor.provider.mail.search;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
+import jakarta.mail.Folder;
+import jakarta.mail.Message;
+import jakarta.mail.MessagingException;
+import jakarta.mail.Store;
+import jakarta.mail.search.AddressStringTerm;
+import jakarta.mail.search.FromStringTerm;
+import jakarta.mail.search.OrTerm;
import junit.framework.TestCase;
-import net.fortuna.mstor.model.StoreLifecycle;
-import net.fortuna.mstor.model.Taggable;
-import net.fortuna.mstor.model.Tags;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Store;
-import javax.mail.search.AddressStringTerm;
-import javax.mail.search.FromStringTerm;
-import javax.mail.search.OrTerm;
+import org.mstor.connector.StoreLifecycle;
+import org.mstor.provider.mail.Taggable;
+import org.mstor.provider.mail.Tags;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.ArrayList;
import java.util.List;
/**
- * Unit tests for {@link net.fortuna.mstor.search.TagsTerm}.
+ * Unit tests for {@link TagsTerm}.
*
* @author Ben Fortuna
*
@@ -64,7 +64,7 @@
*/
public class TagsTermTest extends TestCase {
- private static final Log LOG = LogFactory.getLog(TagsTermTest.class);
+ private static final Logger LOG = LoggerFactory.getLogger(TagsTermTest.class);
private String tag = "Test 1";
diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties
index 34ac7c91..a12da07a 100755
--- a/src/test/resources/log4j.properties
+++ b/src/test/resources/log4j.properties
@@ -32,26 +32,26 @@
## set root logging preferences..
log4j.rootLogger=info, stdout
-#log4j.logger.net.fortuna.mstor=debug, stdout
-#log4j.additivity.net.fortuna.mstor=false
+#log4j.logger.org.mstor.mbox=debug, stdout
+#log4j.additivity.org.mstor.mbox=false
log4j.logger.net.sf.ehcache=info, stdout
log4j.additivity.net.sf.ehcache=false
-log4j.logger.net.fortuna.mstor.data.MboxFile=warn, stdout
-log4j.additivity.net.fortuna.mstor.data.MboxFile=false
+log4j.logger.org.mstor.data.MboxFile=warn, stdout
+log4j.additivity.org.mstor.data.MboxFile=false
-log4j.logger.net.fortuna.mstor.delegate.MetaMessage=debug, stdout
-log4j.additivity.net.fortuna.mstor.delegate.MetaMessage=false
+log4j.logger.org.mstor.mbox.delegate.MetaMessage=debug, stdout
+log4j.additivity.org.mstor.mbox.delegate.MetaMessage=false
-log4j.logger.net.fortuna.mstor.data.MboxEncoderTest=debug, stdout
-log4j.additivity.net.fortuna.mstor.data.MboxEncoderTest=false
+log4j.logger.org.mstor.mbox.data.MboxEncoderTest=debug, stdout
+log4j.additivity.org.mstor.mbox.data.MboxEncoderTest=false
-log4j.logger.net.fortuna.mstor.data.MboxFileTest=info, stdout
-log4j.additivity.net.fortuna.mstor.data.MboxFileTest=false
+log4j.logger.org.mstor.mbox.data.MboxFileTest=info, stdout
+log4j.additivity.org.mstor.mbox.data.MboxFileTest=false
-log4j.logger.net.fortuna.mstor.util.Configurator=warn, stdout
-log4j.additivity.net.fortuna.mstor.util.Configurator=false
+log4j.logger.org.mstor.util.Configurator=warn, stdout
+log4j.additivity.org.mstor.util.Configurator=false
## appender: stdout..
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
diff --git a/src/test/resources/logback.groovy b/src/test/resources/logback.groovy
index a59bd63a..f42a2097 100644
--- a/src/test/resources/logback.groovy
+++ b/src/test/resources/logback.groovy
@@ -29,9 +29,8 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import ch.qos.logback.classic.Level
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder
-import ch.qos.logback.core.ConsoleAppender
+
+import Level
appender("CONSOLE", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
diff --git a/etc/samples/mailboxes/MboxFile/Inbox b/src/test/resources/samples/mailboxes/MboxFile/Inbox
similarity index 100%
rename from etc/samples/mailboxes/MboxFile/Inbox
rename to src/test/resources/samples/mailboxes/MboxFile/Inbox
diff --git a/etc/samples/mailboxes/Store/Inbox b/src/test/resources/samples/mailboxes/Store/Inbox
similarity index 100%
rename from etc/samples/mailboxes/Store/Inbox
rename to src/test/resources/samples/mailboxes/Store/Inbox
diff --git a/etc/samples/mailboxes/Tags/Inbox b/src/test/resources/samples/mailboxes/Tags/Inbox
similarity index 100%
rename from etc/samples/mailboxes/Tags/Inbox
rename to src/test/resources/samples/mailboxes/Tags/Inbox
diff --git a/etc/samples/mailboxes/Tags/Inbox.emf b/src/test/resources/samples/mailboxes/Tags/Inbox.emf
similarity index 100%
rename from etc/samples/mailboxes/Tags/Inbox.emf
rename to src/test/resources/samples/mailboxes/Tags/Inbox.emf
diff --git a/etc/samples/mailboxes/TagsTerm/Inbox b/src/test/resources/samples/mailboxes/TagsTerm/Inbox
similarity index 100%
rename from etc/samples/mailboxes/TagsTerm/Inbox
rename to src/test/resources/samples/mailboxes/TagsTerm/Inbox
diff --git a/etc/samples/mailboxes/TagsTerm/Inbox.emf b/src/test/resources/samples/mailboxes/TagsTerm/Inbox.emf
similarity index 100%
rename from etc/samples/mailboxes/TagsTerm/Inbox.emf
rename to src/test/resources/samples/mailboxes/TagsTerm/Inbox.emf
diff --git a/etc/samples/mailboxes/UIDFolder/Inbox b/src/test/resources/samples/mailboxes/UIDFolder/Inbox
similarity index 100%
rename from etc/samples/mailboxes/UIDFolder/Inbox
rename to src/test/resources/samples/mailboxes/UIDFolder/Inbox
diff --git a/etc/samples/mailboxes/UIDFolder/Inbox.emf b/src/test/resources/samples/mailboxes/UIDFolder/Inbox.emf
similarity index 100%
rename from etc/samples/mailboxes/UIDFolder/Inbox.emf
rename to src/test/resources/samples/mailboxes/UIDFolder/Inbox.emf
diff --git a/etc/samples/mailboxes/contenttype-semis.mbox b/src/test/resources/samples/mailboxes/contenttype-semis.mbox
similarity index 100%
rename from etc/samples/mailboxes/contenttype-semis.mbox
rename to src/test/resources/samples/mailboxes/contenttype-semis.mbox
diff --git a/etc/samples/mailboxes/foxmail/NEWBO2.BOX b/src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX
similarity index 98%
rename from etc/samples/mailboxes/foxmail/NEWBO2.BOX
rename to src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX
index 2128d2e7..3f2cfec1 100644
--- a/etc/samples/mailboxes/foxmail/NEWBO2.BOX
+++ b/src/test/resources/samples/mailboxes/foxmail/NEWBO2.BOX
@@ -1,592 +1,592 @@
-S
-Date:
-From: "Foxmail¿ª·¢×é"
-To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
-Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
-Message-ID: <200906261059103758227@foxmail.com>
-X-mailer: Foxmail 6, 15, 201, 21 [cn]
-Mime-Version: 1.0
-Content-Type: multipart/related;
- boundary="=====002_Dragon172714510278_=====";
- type="multipart/alternative"
-
-This is a multi-part message in MIME format.
-
---=====002_Dragon172714510278_=====
-Content-Type: multipart/alternative;
- boundary="=====003_Dragon172714510278_====="
-
-
---=====003_Dragon172714510278_=====
-Content-Type: text/plain;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
-49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
-wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
-18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
-sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
-uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
-tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
-tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
-DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
-tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
-r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
-t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
-0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
-wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
-xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
-7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
-YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
-zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
-yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
-09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
-1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
-vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
-97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
-08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
-4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
-0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
-q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
-T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
-zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
-ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
-0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
-xOo21MINCg==
-
---=====003_Dragon172714510278_=====
-Content-Type: text/html;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
-L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
-IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
-ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
-KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
-bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
-dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
-bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
-eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
-cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
-IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
-Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
-R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
-dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
-R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
-TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
-Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
-OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
-Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
-cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
-MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
-CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
-OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
-VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
-SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
-Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
-eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
-LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
-OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
-VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
-ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
-RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
-eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
-VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
-MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
-U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
-UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
-bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
-MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
-bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
-bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
-dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
-uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
-L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
-xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
-cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
-VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
-PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
-tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
-y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
-PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
-zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
-dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
-ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
-Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
-yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
-vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
-p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
-08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
-xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
-o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
-o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
-PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
-b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
-Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
-RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
-dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
-UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
-oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
-IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
-DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
-cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
-987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
-0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
-tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
-oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
-ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
-Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
-TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
-8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
-Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
-PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
-L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
-/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
-1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
-PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
-DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
-VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
-vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
-xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
-JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
-QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
-x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
-yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
-u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
-PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
-bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
-IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
-
---=====003_Dragon172714510278_=====--
-
---=====002_Dragon172714510278_=====
-Content-Type: image/jpeg;
- name="banner(06-26-10-58-52).jpg"
-Content-Transfer-Encoding: base64
-Content-ID: <__0@Foxmail.net>
-
-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
-3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
-J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
-cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
-XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
-Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
-1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
-nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
-HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
-BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
-80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
-KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
-t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
-580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
-wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
-el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
-y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
-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
-cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
-8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
-/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
-4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
-fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
-yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
-e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
-57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
-3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
-zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
-zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
-FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
-uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
-IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
-xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
-Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
-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
-lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
-9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
-5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
-l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
-desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
-HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
-JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
-mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
-fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
-4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
-/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
-Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
-x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
-nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
-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
-b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
-+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
-mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
-Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
-Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
-tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
-bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
-lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
-walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
-guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
-ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
-m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
-M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
-9ar+x//Z
-
---=====002_Dragon172714510278_=====
-Content-Type: image/gif;
- name="bot(06-26-10-58-52).gif"
-Content-Transfer-Encoding: base64
-Content-ID: <__1@Foxmail.net>
-
-R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
-7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
-AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
-gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
-
---=====002_Dragon172714510278_=====--
+S
+Date:
+From: "Foxmail¿ª·¢×é"
+To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
+Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
+Message-ID: <200906261059103758227@foxmail.com>
+X-mailer: Foxmail 6, 15, 201, 21 [cn]
+Mime-Version: 1.0
+Content-Type: multipart/related;
+ boundary="=====002_Dragon172714510278_=====";
+ type="multipart/alternative"
+
+This is a multi-part message in MIME format.
+
+--=====002_Dragon172714510278_=====
+Content-Type: multipart/alternative;
+ boundary="=====003_Dragon172714510278_====="
+
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/plain;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
+49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
+wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
+18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
+sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
+uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
+tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
+tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
+DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
+tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
+r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
+t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
+0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
+wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
+xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
+7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
+YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
+zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
+yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
+09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
+1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
+vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
+97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
+08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
+4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
+0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
+q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
+T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
+zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
+ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
+0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
+xOo21MINCg==
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/html;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
+L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
+IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
+ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
+KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
+bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
+dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
+bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
+eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
+cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
+IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
+Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
+R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
+dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
+R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
+TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
+Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
+OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
+Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
+cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
+MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
+CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
+OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
+VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
+SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
+Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
+eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
+LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
+OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
+VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
+ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
+RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
+eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
+VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
+MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
+U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
+UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
+bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
+MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
+bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
+bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
+dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
+uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
+L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
+xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
+cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
+VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
+PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
+tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
+y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
+PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
+zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
+dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
+ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
+Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
+yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
+vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
+p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
+08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
+xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
+o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
+o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
+PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
+b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
+Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
+RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
+dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
+UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
+oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
+IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
+DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
+cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
+987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
+0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
+tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
+oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
+ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
+Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
+TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
+8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
+Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
+PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
+L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
+/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
+1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
+PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
+DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
+VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
+vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
+xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
+JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
+QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
+x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
+yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
+u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
+PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
+bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
+IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
+
+--=====003_Dragon172714510278_=====--
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/jpeg;
+ name="banner(06-26-10-58-52).jpg"
+Content-Transfer-Encoding: base64
+Content-ID: <__0@Foxmail.net>
+
+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
+3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
+J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
+cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
+XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
+Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
+1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
+nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
+HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
+BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
+80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
+KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
+t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
+580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
+wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
+el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
+y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
+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
+cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
+8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
+/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
+4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
+fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
+yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
+e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
+57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
+3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
+zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
+zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
+FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
+uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
+IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
+xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
+Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
+eFmi+/HVOGBFGI4YP8GYG+Ff+KJof0c8Bln0UqgifQEfKH1Vy5cuX4ly5SXxL8Fykv6i/BcpLgy+
+N+JcHgOAN8GOGDjctLmJiVKl2IkqV4Qmiav0xbCXjgSsRMSpyhxNymjwMCMOJfp4RxJz8LOfA5hC
+usYfRFUeHKVxHwDpDJ9OzWMVKlSoQpwA+qUeCpUrw1K4VKleKpXCvrVK+nXGpRKleBwwfSqDIJwY
+lUeiayv6UMYdPp14QqVE8HV8Ff0J4VHr/wCGong68CV/RWEr/wAKQeC/FSUlJSUlJSUlJSUlJSUl
+JSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIiUlkslk
+slkslkslkslkslkslkslkslksg4Bqzelesr1/wDnv//aAAgBAwMBPyH+nVKlSpXjT+n1KlcK4KlS
+voP9LqVxqVKly2ZmZb9An9HqVK8FSuKwivAk0mviH9DqV4aleFYHjSaeNP6AeKvGsD6L4z4so1Mn
+tymxK9Jbj6YjlFwZrg9Rqz1Qhf8AJ5Fg9A7L/YQLmVwbv/GeRYEv0l/4fwBxqV9Fh9F+raORXkwC
+6zEEAu44iXUI8hEKEsF8N0Ee8UawV1mJekGrpwzXdO9Fov4gZn6MZ3yiVpGUjXPRl9mrZlg/wBA+
+mx1h9J+qs1KcyUCwhzOUlM0LBHo4TlRD+WDN9JzEzogonrKruhru4ULq8/uFuHGJUOHNlkKyxp6J
+gCLe4uXj/Akv6brD6T9X0446Ex0OFz043wx0JjoT08GqEm792H0j6wKiDuzNqpu/dglKfV/gx9Qf
+S5x/oxDjf0Eh9FYY/UqVK4VKleGuFSpUqV4alSvr1KlSpXGvDXCpUqVE4HA+kIPjuazT/wAAS+D4
+GjwEuEeI54nhfEcXgI8H6a4R4PAh9Ri5fguawKjE+pfgvhfhuXxv+HuXwvwn0riGWmZmWhw3xT+j
+kPq3L4l8L/pQf+UfEX/WR8GrjTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZ
+TKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZTKZUplSpUplSmVKZTKZTKZTKZTKZ
+TwHg3lLS0t/89//aAAwDAQACEQMRAAAQkkkkkkkkkkkkkkkkkkkkkkgbJSvUfGOR4/GOh4SeWOeO
+cttkkkkkkkkkkkkkkkkkkkkkkmbIXqVcDOFU5jqhW+s8KTHEltJJJJJJJJJJJJJJJJJJJJJJB2t6
+B9HNVeHOVPbqy0/lt4B4tAAAAAAAAAAAAAAAAAAAAAApP0n4GpwPGdGGf8WSHlxfC0Otkkkkkkkk
+kkkkkkkkkkkkkkkH8kzKxPA4li0j2xKB6gwI2GVJJJJpJJJJJJJJJJJJJJJJJIiTtyJ/A9Kpe7Gq
+rnWMB22mNeJJs74JJJJJjWmzmpJJJJJJJiSl/wAA/QnMlHYXnW7+2YqppiwABeS4QcBTvQ9lf6AA
+AAAAAKW9JP7EnRHEDeX7CK2/I8xg3P8A/ldQ3M1VZnvNVjf/AP8A/wD/APfQkDbMSBv0nOiwE4Jk
+VCVV1r622cIK1UjxuW1tfoe222222gED/tGVtyCqD82WpCqerpz9dy2222222222222222222222
+gkD/ALZl7UhEAej3/WGElZ5thpds2yUCNmtGW9s69f0v325kxRLB7QTGBOOV3QyWSUdqE3S/fdsE
+dUYNqtX8/oynsDQYIvstOhzPVN+JkNdINksm9Gr6ppNyts3CfotnzrNjtzIZfW6efm7O+O7emFQS
+I6hsIJMKHFp1fbsNtttttttttttttttttttttpBA/wC2bW1IDwZSD9/+H/QK0CAnbbbbbbbbbbbb
+bbbbbbbbbaQQP+2bW1ITn/om21JJIH406UTbbbbbbbbbbbbbbbbbbbbbaQQP+2bWlKT+JztiSRBf
+/SOk6222222222222222222222221JbA3/QDukLEW9v0SBZOpWHv8AAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAASOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2gAI
+AQEDAT8Q/jmMWMYxjGPAxjGMYxjGMYxjGMYxnIFzoo3gf5QzVrBl13tZrMHnohmvcdPadCKdYDch
+ELmbexA7hrFVGHR4bly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cUikWLF
+ikWLFixYsWLFixYsWMWMWMYxjmakRWWCajlDCA9IfYLD7wdbpyMHuzRy86LL10FFypBV8y/zKIY8
+z9ly+k7YyKA1cvadJj2CLu5c4qEsY6vVlbfyIAAAAAAAuMMLGFixYsWLFixYsWLFixYsWLFiwxgs
+zqU3g+Y9CaMX1YoaYiNhbEVmj0Mso6JtbDt1l0Juie3+EsW3qVB3cvskNst1R/KgDKt1fipYsTko
+fildXlNBva/s+kvQJtK6tL0+CJiOo7gNRImh1PVYIHIl8LLacoK1oyMRIUmE/jwAAAAAAB4DCxYv
+AsWLFixYsWLFixYsWLHM19rryjdHYZmvlurKxkdidSJWsnIJn3cznG7mCY+A8tT2gWQJV+h2hsmL
+ylnJ82/QaIgMVQ9IKBY5PwEMrsQgRQ3RDC2z5BWn2jYZ6lMvxzFHI5JzImq6yLmeeYe5Oe0D2C6/
+9eAOr115y7Xj+RAAAAAAAAwxfEWLFixYsWLFixYsH03YXM6AxnlXQxNDzdyxkjVg8sxikr0HuweY
+ef8AtAqY9T7w5c+mce01NfJlfolW7yrZ6b3lAFZmjKWcwcbs9JnYer9EwjB0CddE6TniIHJBXENs
+Q2Vog09uTzIusfSLK2bf9MR5zTiyKyI3o6RijZ/HAAAAAAADwHiGGGGGFixYsWLFixJG+gdAJY0A
+dAlHOC532iOhMAPSLmdTcz7Jmcfy1ACsDoYiK62gW+01ku8jfQSkBOupd1zEQpiuOcMN1z+gCm8f
+wGDoCsfiCOJyiWygTYh0zYlrK1/EJouynzasQaT7NRV6gj2JaqBHVQW55sPNHi9subQ1BLlWqq8I
+VwkM7NycJesXHZSZCOvhI+YSWSDVsS9XrUt3q0CwcHSF2MqwBsLgCxEwiP0gAmg/eiCegQ2psdWg
+xVSlmpWQJi5uraQOt0RexZR1AauYyd5FWOwRBgREzLALDQa8CLroFt5PsAa4uBAIc1YANVjV/wBh
+wjegThVF6cCKtWaroZK3Zoxr9YABfAseAwwsWMLFixYsWLFglJRqakb/ANJEarPKUaz7SVCukxBG
+ibK+8IKod5lWuTfvKDeXn1jqtBNXuuWAWgIi0PVALIV6eWB9wGM+wPvBCYARwyrgbQQQRJkb4l/F
+637nq5hXEvrf6VJmZxNK1DdR9IYYZYMcF5yt+y14Q5IDpS/IwAbNrQviO71AXSimgnRqDWvZGVUt
+7SqyYRlitpeseAukCsbxgHP0bWrkukAZZMaYap50O5M2rWj2gqyqg6GJ+olm84AanpbVy0wwUjrR
+XSBjEsocs3J2FautTGSWlMABFxcLjOasChdpbsPR2lsppEDdqVcxzjt1Kw3WogNa1o5zEg1dRTQs
+0aI0kTLCzQpJQQYGGNI92tgsrr7oLtAG8gTHerWLa3ZLIo6oC8kSGQ00BnWCeyDC+ZDVYUgfBDUO
+wGaTnTUWs0cRt+hBxvDAMeDA3GnKc4xSLq3I2FU1laAggQm2Rzoj/wCAAAPAYYWMLFixYsWLFixZ
+W3o4mbqS9mFdVXefeOa5moPoTswOdd3Qj5ha3/n/ABNvIjXu84Zao3iWB6olbV3gTOmgfdWHnCbb
+OHvcoQXGHGkFBAYEyiW9fhC/TWAaaKhn2mxgUcb/AD8wPD2K4uB7S5cuXLhoR+NSu32J7RlEAZGA
+QFn1gB1rwqxZXXtDd0m0wqtCUAg5xCA2aiPaKDxCyqKNNgU0c0B0BWzYq0oNBXRjSOCDmhCULsBy
+aLxZBeLm6RkzooeqWlI0eiPR7kOOksiJt/PuYgd4NUJ1eSHaHtf0gK2yGXMuAc1L5SKBQqKCCqQl
+ob6z0lDuvAKXAaF7xiil7LWvsZcpnYALLqzpKet5cxrdsJRDNCDqKoE5XUcoODGgWan3Q9CpMAtD
+ZSVxMtE9zJ2mzJHwKlIVqKvlWKGNgKtpejFy5cuXLly5cuXLly5cWXFixZcuLFixYsWLFixYcmiU
+87NGIORq5KnXeRgR5roTE6no+vUysKNAohtqiYAer/IvZbvAgQgL8gb2X/UUvrKbqPvfCHYgxAgQ
+7QWolUekq9Q+R6H5lF3mrG+oIu1QP8bQPzh8PHEcPi7xBzukXdiWVsKaWsVWIgYpEsRiinWVXVeb
+DLcEoDYgsZgv4HCFQLwC6TOkmrRsYekXVLntXAdUYY4VbVUYMaazDVNOiqp3RylGGt6YEzQYIwrG
+tPXaodGLqrrlV3gRMMnR7WO1TRglnixGBiKxGCC6myStJllu/AAkX5obOJ5P/Utt4qnnUouDhvDB
+8MK8ViUUJEHXMCj0nk/9R4m223UBiGULVbVyq8//AAPBj4GMYxjGMYwcnc/cc1iEh0RIZGjmi9bW
+OLQbI/iWhhuxG0r1eAQIEDpHq50+uO9yU/Lc6wDd9hLMkqI4QgVo1hBvzmvbPSIlHld5aQiLoqD2
+qW9C+l3EXZcaVwj1GGHHHwvEdH8e8GPgYx1jrGMYxjNoXPaI5WfT0MNDC5DpfMiNYBY2JWvXSD1M
+3X/kFr7h+hn4xWn7wEusdRnM2RPJAdG5SBf/AGo6WuPGWH6u+Qv+cQDETuMUGYmQdMOiQdDEQc5c
+TP3r+7UIOkUf3Hde3eD3OkvPHrKuyLheKqmJzMiaKHHHHHiLh4AVoy9JTdOvSXK5M/vFZn2TTihd
+BN0xZesy1uMACKoLoUjF0aVTgqigoVWC+crO7LWRMNlg1GbRMiwvF8Z00FEW+Yga5mgHdKjC/EAr
+QW9Dgl2Bm4S2HNFyK5oq0hVSCYoStaGPmlxrwOCk1GsiZeEI4t7ToakxK1TEzyTW9AFCYYVZbHSN
+bo7jATlGlpiqTJQS20MFtUPFEBTDowgwhVSCYoStaGFW0YXoaADB4WMfZ67UFjgDhSpe/p78sVmf
+ZNOA1BEG+S2KKcLRowagiDfJLEFOFo0eIagiDfJbFFOFo0YfpIAMzG0q3NDokEtBmDW0AKFxANiY
+SUymIrLRQGN3M6ejc4IjSU9GaQbk1VAWAs0bh6MeSk8gIZt0QMMDbINMHDTeCi5ytqgu75SJ1Ryl
+2pspB6CbBkcpp8M/1fC2wGjWDvtfe7PatXiCVtDwoQ1aGTZWvBlgoKGrygoFmClMABaukGuwtxUR
+dww1JOrRhf1yVQRp1Iqb9IqRFKQdllLUzA8PqBoQc2U4cjKirYQaEI1B83MmClG9y5OLFNkdA3Td
+3TWLu2CFVeGAPOH9UsnSUdGs9Yg1Va5ycS6DztekCZBjp19I61nqqftOQHd/a4fZjfqoe/dPyuUo
+ESkoKfUhMDIkczSpcdwrnDksLaF2ryE3vs6S/NHRuFGanVQMTLiZGxXy/wCjmNofoBFpmfcF6apA
+yc1MLe1WTQViyKsGkfCccWIuHgu9pATSuQJ9VSgh3BTSwyIoHvElQIkdCqg0QWWrCPw6zavKPMpq
+0wT4tnQBVfCj4QPOkyBQpoTCOWBJYt8Qa2Z41VyHHfW3BWswMMLXJjC2PO5XQR4ZJoPVmKjiwIDo
+PUKqIuXK4NGsZlsQUPcZKp0CUv7IZ40MYTLbqBHQfGQalcBBi3riV3cGqVVtVyiGtSNtkA1yNMUV
+7qMbhl3OIxuchQtW2KwCwcIPqoaC0+tJzkjD46cu00zjaaMjBcKmPFrMOKaS2gTkNWTr3mDc1gH+
+RGlsLHcEtW0kwOd3hSxdy0N2hU3nC2QPpGwq87FMDqmMMJberaZz7ouQvu1pVahAvNAErn3LI09H
+PVeWNKy4UI53DrffK+cGi3kjDGvMbzZi1pVVsBEowFRMYqyiw3zFclKgkRe1gLPRTvHTgQbrfRJr
+NaSrMWOq8M6ooROUTJmi9GU4ktAdzrV2RyxHFLhDRxMQIM1xE1/zDotU2sSwaCuHtasJvITjJb0y
+VkVoBV6kLqEZkFQgH0dmGSc9XO+HSxnCKCRMbVXm1O52BFrjWlD7DABbCNuM13izCwssZUiISdtF
+inXDbDKaTrFuZnVpBOxckgoCX8HQDzaZ3NNPycwt5PgxOLBkjIQTchLLe+YGVc0EIpEZbZCAInla
+GSFC/pVQlinLcloylvxiWlQgmssy2jLDkFncnQg7byYAXFOydPVBldUd/wDswU6msGDBly5cHprb
+nSPQdANmqLUdS00YuiDNH0o0ENE9GzVJQpSIixFsYMx6C/IhnrKH2Rn4AUPzHVgKcAD03hWgCC4S
+EiFav3nXkMWBvceiWwVtXnVdWFmkasqrwtODp0DEe641nW+j/v718FUYRweAUuuZTudIq1bpg2IE
+FF372WEIXEqCiUwyxNqVkpZUBlHk6Q/0BdzU8rh+whaFoYFYzPVRdM4EDABAMKSzwQX0v9MBopJr
+XElKIUAnGW0nNqcmoA0irUmuZwIaiMUK5JNbt0uzNhospukEdEAcLgViFAz4DboUXaGBRWkKQvxq
+DfNRJMGFoUS4FbQ1ECqiLWt0UFRXWVGVKJq7iN0hoDyLaGTgpdr+SuvWElsV8DRS01MlNWELKg7Q
+sUNjGoojmUBAURMIAABAIih3bW8RaaAmzAJQLiEVSCsBStLWED0GKMoKEmlrVTWs2P6pBaKjViP8
+CWhMRQF60EDoAgPVJaihwNGrAlcBBjcLC7c0GgRHuBLQmIoC9aCJTagKsZkNbrrJyKNnvRKspnga
+CBQliIudkE0nUZ5XXYL9R9JwFVqnqS2g5NDkdiFBAoONDJM9y1AjQEAQSQtEYQKBZnYhrAWVeTYB
+CGd2IawCzbybAIQ/k478gASI5tyQXgdPdPlO4mgLwVM+b7p8h2E0AONNUj7F610l02azIhDjQ3xF
+WCCApS3GAaGNpSAACgD1y3YAWtAARSEgxbBforgYVkSmymc+u/cStIERsbW4KREFIKBjI68kUVls
+K38yogTEN1VwCBoljOQA7A0Zrc34hlNuff8A7LCXL8IclryMWN5YJ12DZzQrmasvaYqlHKxqur3Z
+onyJ3kau1oZtNYDZ2gvTrtPTtaIJRzfUoe1xu1dV3YBYBff3l2w8Wlbxap726U9qhKYNbI9GHVxm
+lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
+9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
+5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
+l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
+desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
+HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
+JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
+mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
+fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
+4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
+/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
+Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
+x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
+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
+b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
+mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
+Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
+Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
+tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
+bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
+lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
+walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
+guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
+ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
+m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
+M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
+9ar+x//Z
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/gif;
+ name="bot(06-26-10-58-52).gif"
+Content-Transfer-Encoding: base64
+Content-ID: <__1@Foxmail.net>
+
+R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
+7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
+AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
+gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
+
+--=====002_Dragon172714510278_=====--
diff --git a/etc/samples/mailboxes/foxmail/in.BOX b/src/test/resources/samples/mailboxes/foxmail/in.BOX
similarity index 98%
rename from etc/samples/mailboxes/foxmail/in.BOX
rename to src/test/resources/samples/mailboxes/foxmail/in.BOX
index 63aa4861..99bdb624 100644
--- a/etc/samples/mailboxes/foxmail/in.BOX
+++ b/src/test/resources/samples/mailboxes/foxmail/in.BOX
@@ -1,1266 +1,1266 @@
-S
-Date:
-From: "Foxmail¿ª·¢×é"
-To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
-Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
-Message-ID: <200906261059103758227@foxmail.com>
-X-mailer: Foxmail 6, 15, 201, 21 [cn]
-Mime-Version: 1.0
-Content-Type: multipart/related;
- boundary="=====002_Dragon172714510278_=====";
- type="multipart/alternative"
-
-This is a multi-part message in MIME format.
-
---=====002_Dragon172714510278_=====
-Content-Type: multipart/alternative;
- boundary="=====003_Dragon172714510278_====="
-
-
---=====003_Dragon172714510278_=====
-Content-Type: text/plain;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
-49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
-wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
-18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
-sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
-uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
-tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
-tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
-DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
-tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
-r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
-t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
-0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
-wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
-xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
-7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
-YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
-zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
-yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
-09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
-1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
-vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
-97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
-08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
-4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
-0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
-q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
-T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
-zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
-ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
-0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
-xOo21MINCg==
-
---=====003_Dragon172714510278_=====
-Content-Type: text/html;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
-L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
-IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
-ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
-KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
-bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
-dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
-bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
-eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
-cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
-IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
-Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
-R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
-dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
-R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
-TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
-Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
-OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
-Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
-cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
-MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
-CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
-OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
-VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
-SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
-Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
-eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
-LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
-OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
-VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
-ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
-RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
-eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
-VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
-MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
-U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
-UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
-bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
-MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
-bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
-bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
-dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
-uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
-L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
-xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
-cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
-VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
-PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
-tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
-y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
-PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
-zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
-dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
-ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
-Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
-yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
-vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
-p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
-08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
-xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
-o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
-o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
-PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
-b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
-Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
-RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
-dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
-UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
-oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
-IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
-DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
-cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
-987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
-0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
-tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
-oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
-ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
-Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
-TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
-8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
-Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
-PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
-L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
-/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
-1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
-PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
-DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
-VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
-vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
-xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
-JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
-QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
-x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
-yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
-u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
-PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
-bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
-IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
-
---=====003_Dragon172714510278_=====--
-
---=====002_Dragon172714510278_=====
-Content-Type: image/jpeg;
- name="banner(06-26-10-58-52).jpg"
-Content-Transfer-Encoding: base64
-Content-ID: <__0@Foxmail.net>
-
-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
-3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
-J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
-cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
-XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
-Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
-1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
-nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
-HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
-BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
-80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
-KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
-t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
-580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
-wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
-el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
-y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
-BX1+xMec135Rn2Pe63uIkSCJUyHMlN9UuXLlw4CZwJuqrpUeNset0hzEnlz9RSxz6IXiNCLQAt8i
-admOvWWaiI5EyIy5cuXLly5cuU6JvTBbMdmzgMlI8uk/0PEwXVppLLeS8MKO9omQsJiLpNGtUrPP
-ges7GARrdjrNzJX3gZxVbALa02NeB6stqCW2FLl+kuXLly5cuXLly5cvhfC5cuXxv6O1JbRwzLnN
-EodcJmLHTlDTJ2RpG6p6ZM15S1hVAQzWf9kZLcxmORd55/EI3SGI14EIcBidJ/sEqwx+pkfiI04o
-dl+JYxhjiJ6CXLly50n9otfbbrwurlET5rAfSi/tRCOUJtot9hKw5DVXKz5DQqN2MHLCuhyCJhZT
-BbSMNY5aMpwejod6jFesQGAD7hOvKP8A2FAqxlBWjm1RCqBQlRoG1wDAmwq3VMoFB95RcPNpybNo
-Iv0GEHU3OspN4KXermcEzvAUGubVZaQKzrIYZ9yyXzlKsveQ1MwA6SwVbip/yesqj+N1QW1rjSdU
-cgQl+yCq4jUDqlLViKlmtZc2FQinNvRZDFdoizjfN1lKNXOGnSXLly5cuXLly5cuXLly5cuXwv6a
-pn3TbE65dXMZFM5NqeYd3gpAbQTWXftFdXCqQXOtPoQ0k5QlQ41L6tXuMoA6Q1tEj9UX0iMY8BnP
-xPtX3QfyRNF5qpcVD1JnIWcOqu8UxZgPirPTeQAXW33Rib7W4BtS+kX03jyFPsBjGrhJrqY9Xm6w
-tNQ11GfqBGIa5q+xUHi+ylSvtIC1Ka5y/uJQ1KlUxl2y3B0wr8ikDhoD7xpA0ui3OiwtkuS2ANNL
-FGCAC3Nnj7nAcqRpeVUZLylY5mnao2djUF1j83D6xKIAMXY7zFdUSzitfeXqRorga0lDI9Ddv6l3
-0Da/3P4Gh1YsgJtbWks1Xse8MYOgQTWM/tFXLxqY7Vf5D3LPRlgIaQ8BmOCP1Q90SAU6WgSv3SIx
-jxK8RuBWavVUgVuuWBBAqBYj1IrnJ5uUA5TCD1qBzNRWvdJYkgyjsckbd/dXtRqPMj9DLWq1LJiD
-GhU5WxRQhYXluRRN5wTnNRknlL9Tz5+pZ2wTlyF6ByIfUNmwLoS7j4RabaDq8KfsgHa+CPJ0v3qJ
-pnnkTplmXg3RN9ngiDDdAT1gV/AvWMBriv8AIEwarYzHliOwq6+JqZm9dzJCXcH3VT9hMBLCHEhi
-Cy0FsDk69vrFh6QL79BY1bjL3H4+6MYx/oRQMuk5NH1nRLRNEHUTqnpAc7O5B+SEggnWBMI1yISH
-ik9Ue1kpBALmMKVhUomDgsBzX2E5j0hJBKzPa2D0M+sJ7HQ6lD2iWdbjGMfoBah2hoK/B6CuT0nN
-qWDVW9wDZjsxM2FI3axOgGAGhKqlKrrOOsXao8dWBWGYRYUTk02RbntRETJYVRcpMTpcCVp0DovP
-Sl8ARWyiWrAvUxfd1MFFalSWatGcMv67io3UGaiJqVpSkNaoCCMHTFi8zOBAHoDwFMJllmXGoxR0
-J5XNqc0j4ssa5poN50u/ARUqVJZq0ZwwrVyTJDzHJHKzrCsT6ATSNUZMwvcyk0Ffg9BXJ6SwDWEw
-VEnRtXZggGsJgqJOjauzxsA1hMFRJ0bV2Yi87y1BR6NB7MqEpAZ1AImo8X/iNyy3Vo01cu54KCk5
-kiywOjcA9Vo+mmVz1XWUIDP6Yln9LMDpQZ2AnmFbQSkSQVgRyvVMDLGFW7GWjLUfQFGtussXLh8i
-Dg0u3bZWONMFSCzqBVdAmsxAfuCTm3ktYIkv4zRPTTThrDM9AEdwC9OrcjZVVuYl4aejA+AVOMEs
-KufyKnOQfAVS6OSFWmLYFaLZxF5Lgpkg4TGeDxvZhvfe3NJy+bA6MwBqyShlupOiV2lH/RKdC9yV
-6l7NS1V6TMv0ZRrV1/YhnSzHma+vlBQgMDjssps07CGGsB1exeb1djnG6OXpffqtYYxYx8RbMEN0
-6ak5awxnRzNxbqETcL0N6QFn3AjMUOBM0lFOQC4wLdOpalMVLaL6FGQtvAmmSVVLB6ynPBcULZmo
-rOraqlsbX3g8rYZe3xHSAUUiFHHV+J9KRnzTao2VSxDuCT1LOcY0ppk2sa45QGkDKzscyAairVga
-lCCaUc3ScWjSjmRUS8w02veXxpBrcquKPgULCdKxK/azlKI/aYK2YtfO59E+hVwmVcuBFTSnUpj7
-zplgb3KOlSlLlG6m8alpmB0JFiS5xt94QgnKSDNY3EAQ2sYEZkbCDMBEZeHKxk6lBsLZuQnPTtGk
-wIbdclZCzJF4XL3HkQeBpIFEKDL3EiJ15Qnml6qoMLXrm0axefWKWGvSK5UNkircYhgSmsbytJp3
-aJarKosrDqoz2MJSIv8Am51LneVtNmsAFiwnMhRCFlBRUwWsKPs82WaHQtPd4NSHQLK/1KxYGRp0
-C7azGZrwJI6kdBTlUQlO8Zuo2ga6c6IvtKsLJ2giYKtyOmSeWZozVbLQvwIUmVW3SUnJLm4LdXg1
-AZGQckvfmVBt7wWVyFjL3LC66TGs52pLBVZzXVeAoJyprY5rlx1oDbDAa3wWWmpqW3/UGeZoXWdg
-0UQwfjWicBuqrBkLArQQHdkFddrSgJMITCl1LawR30xHB12OeQc1d9wgWWwHVrlZdzig1xKsOqzM
-gCxavOHfhVuQp7FmL/uesdDli8aVGGqWL8tWNr8nrB2isW/bybxgerI3Sp+3D/IBqXsyhovvKNCX
-zQaDpHIqbC/d6EptXQA1PToQYCsi1iGcwsWLFi8YIlZRaE5LaqnHKo0Xqwo3a5q6GhbU8s4WTYu7
-mUlKpZ0WU6PKEMqRenOAAbBUSdE0FU16LDaPO5iN36cpNMKDCWOrfD8Q0oESpJWEEdxuXwZaWxY5
-GkdmGOUgAJRaVrdwZS/wpYtLlUUViA0VoAXUgpUlsAUK1AWgKqjSQQKQ7CkBieAMADLJt5qqWsVw
-InSjXUssvTNavG331hcmyXTTUazpdTARzgzcrXalCMLVDDguoQUASCmtAQbBcmx9S6DjmAQdQhLD
-NWHGWYQ8qJQBgYtu69ZdkmqO22ihq3FFuFYWLoGcECAVJMrUL0LV3YY+ixTQs9WgdiKLMKwsXQM4
-JiWRHQXQtoV7vWWaruCWD9IZcsShTMUfI3S7CE3Z7K63P7vpjThppPxAdVCC9vCrQOvVlBXYZdeS
-BVBYDuxsFLOpVHoABoAMARsFLOpoegAGgAwBFAXFYrTTmZdMSmC3gHI9eqLZThp2XAOA6dAGwHG3
-XTTgoxaiZRoC8wsijqykczoDosVqCUIJkIK0Dqqx92hdUs0VZmecg7xotWqcRc4sASujZTVW2Hxs
-UOVKUWXmxcyA1OatQVUOCt6K4DSPTgyXn+5ET0F3Iap0YPG5cuXMgxyQFMfPMPTV2xBNj4PyG+Ch
-zmr/AC+yD2H6/wARBmr2t+I8aHop7yvCthqF9n4IfVH/AEbTv7ZZJbQaXQ1t9aS/JSdSlt7nn00I
-G66vsd+jzmRYxNqMWLimb/oVlOk9jHvLI1jHbAp5OkFMMuXLly5cuFU2TVrcb2mMtbdXzXKong8i
-/wAn6xyqzZf1gDrSgvvf7ymGOY/NMT0mlUYBRz0r1fqPwRT4bP3GReQzoA5NRnGqJD0f0zAMd6P+
-cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
-8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
-/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
-4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
-fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
-yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
-e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
-57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
-3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
-zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
-zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
-FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
-uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
-IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
-xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
-Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
-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
-lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
-9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
-5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
-l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
-desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
-HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
-JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
-mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
-fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
-4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
-/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
-Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
-x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
-nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
-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
-b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
-+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
-mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
-Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
-Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
-tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
-bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
-lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
-walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
-guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
-ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
-m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
-M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
-9ar+x//Z
-
---=====002_Dragon172714510278_=====
-Content-Type: image/gif;
- name="bot(06-26-10-58-52).gif"
-Content-Transfer-Encoding: base64
-Content-ID: <__1@Foxmail.net>
-
-R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
-7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
-AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
-gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
-
---=====002_Dragon172714510278_=====--
-S
-X-Uidl: GmailId12a6707d170a511c&&pop.gmail.com
-Return-Path:
-Received: from Antoni-Windows7 (ita250.internetdsl.tpnet.pl [79.190.233.250])
- by mx.google.com with ESMTPS id a48sm2388387eei.6.2010.08.12.09.00.18
- (version=SSLv3 cipher=RC4-MD5);
- Thu, 12 Aug 2010 09:00:19 -0700 (PDT)
-Date: Thu, 12 Aug 2010 18:00:25 +0200
-From: "johnnybravo159"
-To: "johnnybravo159"
-Subject: Test mail from Foxmail.
-Message-ID: <201008121800258604089@gmail.com>
-X-mailer: Foxmail 6, 15, 201, 22 [en]
-
-This mail was sent by Foxmail where testing your SMTP setting.
-
-S
-X-Uidl: GmailId12a670cec752827c&&pop.gmail.com
-Delivered-To: johnnybravo159@gmail.com
-Received: by 10.227.143.6 with SMTP id s6cs144098wbu;
- Thu, 12 Aug 2010 09:05:55 -0700 (PDT)
-Received: by 10.213.5.5 with SMTP id 5mr385907ebt.72.1281629155351;
- Thu, 12 Aug 2010 09:05:55 -0700 (PDT)
-Return-Path:
-Received: from mail-ey0-f177.google.com (mail-ey0-f177.google.com [209.85.215.177])
- by mx.google.com with ESMTP id w46si4044334eeh.87.2010.08.12.09.05.54;
- Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
-Received-SPF: pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) client-ip=209.85.215.177;
-Authentication-Results: mx.google.com; spf=pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) smtp.mail=antoni.mylka@gmail.com; dkim=pass (test mode) header.i=@gmail.com
-Received: by mail-ey0-f177.google.com with SMTP id 10so855513eyd.36
- for ; Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
- d=gmail.com; s=gamma;
- h=domainkey-signature:received:received:message-id:date:from
- :user-agent:mime-version:to:subject:references:in-reply-to
- :content-type:content-transfer-encoding;
- bh=PivaTP4ZM6VG0cBqUIcNpNqEdDuLIjYl/ub0gtahuU4=;
- b=kB1U6Pp8EVDMWEUl+n8BsD9BYFi6u1qaIgnTBqUwhZ57uso0t11pVp+noSS7Wfxm9u
- S3wH8uM/NcGLcBE29cfDvEe4s43j+bF04RnBIYM6S+ExHB5EQ3hqCeHlHfAgKCNCM9+/
- yVE5v9w+G8N8wCkMD2jnMCG1G7P9ah49E7n5E=
-DomainKey-Signature: a=rsa-sha1; c=nofws;
- d=gmail.com; s=gamma;
- h=message-id:date:from:user-agent:mime-version:to:subject:references
- :in-reply-to:content-type:content-transfer-encoding;
- b=qfpJCkETuSk1g6LVXFfQcRvXyRW87IoqKy8sj+TY75VYLlQHUR1fMBw33QPR+QppH3
- duzZ33oOqNwcGsG/GYOHeWWfK7e7+PAWYM/Cq8+r6TiJVgT3EpqP7vySPS0tOYBBDfHQ
- mXGCJdkpd1wNqklEtCqzHvBxSB3kpx1jrRiqI=
-Received: by 10.213.28.194 with SMTP id n2mr7432209ebc.10.1281629154117;
- Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
-Return-Path:
-Received: from [192.168.0.4] (ita250.internetdsl.tpnet.pl [79.190.233.250])
- by mx.google.com with ESMTPS id v59sm2397289eeh.10.2010.08.12.09.05.52
- (version=SSLv3 cipher=RC4-MD5);
- Thu, 12 Aug 2010 09:05:52 -0700 (PDT)
-Message-ID: <4C641BDC.9080504@gmail.com>
-Date: Thu, 12 Aug 2010 18:05:48 +0200
-From: Antoni Mylka
-User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.11) Gecko/20100711 Lightning/1.0b1 Thunderbird/3.0.6
-MIME-Version: 1.0
-To: johnnybravo159
-Subject: Re: A test email from Foxmail
-References: <201008121803499552355@gmail.com>
-In-Reply-To: <201008121803499552355@gmail.com>
-Content-Type: text/plain; charset=UTF-8; format=flowed
-Content-Transfer-Encoding: 7bit
-
-W dniu 2010-08-12 18:03, johnnybravo159 pisze:
-> Hello everyone, I succesfully installed Foxmail,
-> I wonder if it makes any sense to use mstor for this. It seems like a
-> huge overkill.
-> Or should we rather settle on implementing an incomplete javamail driver
-> with very limited functionality. single-folder, without properly
-> supporting those standard-violating 8bit characters in emails.
-> This might become a problem though. This is a Chineese program, popular
-> in china. The majority of customers who would like to use it, will
-> probably use it on chinese content. This means that my driver pretty
-> much has to support CJK characters properly. Otherwise it's as good as
-> useles..
-
-Hello, anybody there?
-
-Antoni
-S
-Date:
-From: "Foxmail¿ª·¢×é"
-To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
-Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
-Message-ID: <200906261059103758227@foxmail.com>
-X-mailer: Foxmail 6, 15, 201, 21 [cn]
-Mime-Version: 1.0
-Content-Type: multipart/related;
- boundary="=====002_Dragon172714510278_=====";
- type="multipart/alternative"
-
-This is a multi-part message in MIME format.
-
---=====002_Dragon172714510278_=====
-Content-Type: multipart/alternative;
- boundary="=====003_Dragon172714510278_====="
-
-
---=====003_Dragon172714510278_=====
-Content-Type: text/plain;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
-49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
-wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
-18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
-sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
-uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
-tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
-tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
-DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
-tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
-r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
-t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
-0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
-wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
-xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
-7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
-YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
-zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
-yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
-09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
-1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
-vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
-97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
-08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
-4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
-0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
-q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
-T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
-zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
-ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
-0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
-xOo21MINCg==
-
---=====003_Dragon172714510278_=====
-Content-Type: text/html;
- charset="gb2312"
-Content-Transfer-Encoding: base64
-
-PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
-L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
-IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
-ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
-KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
-bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
-dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
-bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
-eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
-cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
-IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
-Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
-R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
-dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
-R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
-TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
-Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
-OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
-Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
-cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
-MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
-CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
-OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
-VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
-SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
-Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
-eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
-LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
-OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
-VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
-ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
-RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
-eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
-VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
-MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
-U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
-UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
-bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
-MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
-bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
-bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
-dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
-uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
-L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
-xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
-cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
-VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
-PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
-tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
-y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
-PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
-zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
-dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
-ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
-Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
-yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
-vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
-p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
-08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
-xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
-o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
-o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
-PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
-b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
-Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
-RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
-dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
-UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
-oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
-IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
-DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
-cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
-PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
-RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
-987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
-0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
-tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
-oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
-ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
-Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
-TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
-8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
-Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
-PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
-L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
-/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
-1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
-PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
-DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
-VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
-vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
-xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
-JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
-bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
-QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
-x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
-dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
-d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
-Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
-yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
-u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
-PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
-bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
-IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
-
---=====003_Dragon172714510278_=====--
-
---=====002_Dragon172714510278_=====
-Content-Type: image/jpeg;
- name="banner(06-26-10-58-52).jpg"
-Content-Transfer-Encoding: base64
-Content-ID: <__0@Foxmail.net>
-
-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
-3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
-J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
-cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
-XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
-Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
-1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
-nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
-HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
-BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
-80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
-KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
-t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
-580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
-wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
-el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
-y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
-BX1+xMec135Rn2Pe63uIkSCJUyHMlN9UuXLlw4CZwJuqrpUeNset0hzEnlz9RSxz6IXiNCLQAt8i
-admOvWWaiI5EyIy5cuXLly5cuU6JvTBbMdmzgMlI8uk/0PEwXVppLLeS8MKO9omQsJiLpNGtUrPP
-ges7GARrdjrNzJX3gZxVbALa02NeB6stqCW2FLl+kuXLly5cuXLly5cvhfC5cuXxv6O1JbRwzLnN
-EodcJmLHTlDTJ2RpG6p6ZM15S1hVAQzWf9kZLcxmORd55/EI3SGI14EIcBidJ/sEqwx+pkfiI04o
-dl+JYxhjiJ6CXLly50n9otfbbrwurlET5rAfSi/tRCOUJtot9hKw5DVXKz5DQqN2MHLCuhyCJhZT
-BbSMNY5aMpwejod6jFesQGAD7hOvKP8A2FAqxlBWjm1RCqBQlRoG1wDAmwq3VMoFB95RcPNpybNo
-Iv0GEHU3OspN4KXermcEzvAUGubVZaQKzrIYZ9yyXzlKsveQ1MwA6SwVbip/yesqj+N1QW1rjSdU
-cgQl+yCq4jUDqlLViKlmtZc2FQinNvRZDFdoizjfN1lKNXOGnSXLly5cuXLly5cuXLly5cuXwv6a
-pn3TbE65dXMZFM5NqeYd3gpAbQTWXftFdXCqQXOtPoQ0k5QlQ41L6tXuMoA6Q1tEj9UX0iMY8BnP
-xPtX3QfyRNF5qpcVD1JnIWcOqu8UxZgPirPTeQAXW33Rib7W4BtS+kX03jyFPsBjGrhJrqY9Xm6w
-tNQ11GfqBGIa5q+xUHi+ylSvtIC1Ka5y/uJQ1KlUxl2y3B0wr8ikDhoD7xpA0ui3OiwtkuS2ANNL
-FGCAC3Nnj7nAcqRpeVUZLylY5mnao2djUF1j83D6xKIAMXY7zFdUSzitfeXqRorga0lDI9Ddv6l3
-0Da/3P4Gh1YsgJtbWks1Xse8MYOgQTWM/tFXLxqY7Vf5D3LPRlgIaQ8BmOCP1Q90SAU6WgSv3SIx
-jxK8RuBWavVUgVuuWBBAqBYj1IrnJ5uUA5TCD1qBzNRWvdJYkgyjsckbd/dXtRqPMj9DLWq1LJiD
-GhU5WxRQhYXluRRN5wTnNRknlL9Tz5+pZ2wTlyF6ByIfUNmwLoS7j4RabaDq8KfsgHa+CPJ0v3qJ
-pnnkTplmXg3RN9ngiDDdAT1gV/AvWMBriv8AIEwarYzHliOwq6+JqZm9dzJCXcH3VT9hMBLCHEhi
-Cy0FsDk69vrFh6QL79BY1bjL3H4+6MYx/oRQMuk5NH1nRLRNEHUTqnpAc7O5B+SEggnWBMI1yISH
-ik9Ue1kpBALmMKVhUomDgsBzX2E5j0hJBKzPa2D0M+sJ7HQ6lD2iWdbjGMfoBah2hoK/B6CuT0nN
-qWDVW9wDZjsxM2FI3axOgGAGhKqlKrrOOsXao8dWBWGYRYUTk02RbntRETJYVRcpMTpcCVp0DovP
-Sl8ARWyiWrAvUxfd1MFFalSWatGcMv67io3UGaiJqVpSkNaoCCMHTFi8zOBAHoDwFMJllmXGoxR0
-J5XNqc0j4ssa5poN50u/ARUqVJZq0ZwwrVyTJDzHJHKzrCsT6ATSNUZMwvcyk0Ffg9BXJ6SwDWEw
-VEnRtXZggGsJgqJOjauzxsA1hMFRJ0bV2Yi87y1BR6NB7MqEpAZ1AImo8X/iNyy3Vo01cu54KCk5
-kiywOjcA9Vo+mmVz1XWUIDP6Yln9LMDpQZ2AnmFbQSkSQVgRyvVMDLGFW7GWjLUfQFGtussXLh8i
-Dg0u3bZWONMFSCzqBVdAmsxAfuCTm3ktYIkv4zRPTTThrDM9AEdwC9OrcjZVVuYl4aejA+AVOMEs
-KufyKnOQfAVS6OSFWmLYFaLZxF5Lgpkg4TGeDxvZhvfe3NJy+bA6MwBqyShlupOiV2lH/RKdC9yV
-6l7NS1V6TMv0ZRrV1/YhnSzHma+vlBQgMDjssps07CGGsB1exeb1djnG6OXpffqtYYxYx8RbMEN0
-6ak5awxnRzNxbqETcL0N6QFn3AjMUOBM0lFOQC4wLdOpalMVLaL6FGQtvAmmSVVLB6ynPBcULZmo
-rOraqlsbX3g8rYZe3xHSAUUiFHHV+J9KRnzTao2VSxDuCT1LOcY0ppk2sa45QGkDKzscyAairVga
-lCCaUc3ScWjSjmRUS8w02veXxpBrcquKPgULCdKxK/azlKI/aYK2YtfO59E+hVwmVcuBFTSnUpj7
-zplgb3KOlSlLlG6m8alpmB0JFiS5xt94QgnKSDNY3EAQ2sYEZkbCDMBEZeHKxk6lBsLZuQnPTtGk
-wIbdclZCzJF4XL3HkQeBpIFEKDL3EiJ15Qnml6qoMLXrm0axefWKWGvSK5UNkircYhgSmsbytJp3
-aJarKosrDqoz2MJSIv8Am51LneVtNmsAFiwnMhRCFlBRUwWsKPs82WaHQtPd4NSHQLK/1KxYGRp0
-C7azGZrwJI6kdBTlUQlO8Zuo2ga6c6IvtKsLJ2giYKtyOmSeWZozVbLQvwIUmVW3SUnJLm4LdXg1
-AZGQckvfmVBt7wWVyFjL3LC66TGs52pLBVZzXVeAoJyprY5rlx1oDbDAa3wWWmpqW3/UGeZoXWdg
-0UQwfjWicBuqrBkLArQQHdkFddrSgJMITCl1LawR30xHB12OeQc1d9wgWWwHVrlZdzig1xKsOqzM
-gCxavOHfhVuQp7FmL/uesdDli8aVGGqWL8tWNr8nrB2isW/bybxgerI3Sp+3D/IBqXsyhovvKNCX
-zQaDpHIqbC/d6EptXQA1PToQYCsi1iGcwsWLFi8YIlZRaE5LaqnHKo0Xqwo3a5q6GhbU8s4WTYu7
-mUlKpZ0WU6PKEMqRenOAAbBUSdE0FU16LDaPO5iN36cpNMKDCWOrfD8Q0oESpJWEEdxuXwZaWxY5
-GkdmGOUgAJRaVrdwZS/wpYtLlUUViA0VoAXUgpUlsAUK1AWgKqjSQQKQ7CkBieAMADLJt5qqWsVw
-InSjXUssvTNavG331hcmyXTTUazpdTARzgzcrXalCMLVDDguoQUASCmtAQbBcmx9S6DjmAQdQhLD
-NWHGWYQ8qJQBgYtu69ZdkmqO22ihq3FFuFYWLoGcECAVJMrUL0LV3YY+ixTQs9WgdiKLMKwsXQM4
-JiWRHQXQtoV7vWWaruCWD9IZcsShTMUfI3S7CE3Z7K63P7vpjThppPxAdVCC9vCrQOvVlBXYZdeS
-BVBYDuxsFLOpVHoABoAMARsFLOpoegAGgAwBFAXFYrTTmZdMSmC3gHI9eqLZThp2XAOA6dAGwHG3
-XTTgoxaiZRoC8wsijqykczoDosVqCUIJkIK0Dqqx92hdUs0VZmecg7xotWqcRc4sASujZTVW2Hxs
-UOVKUWXmxcyA1OatQVUOCt6K4DSPTgyXn+5ET0F3Iap0YPG5cuXMgxyQFMfPMPTV2xBNj4PyG+Ch
-zmr/AC+yD2H6/wARBmr2t+I8aHop7yvCthqF9n4IfVH/AEbTv7ZZJbQaXQ1t9aS/JSdSlt7nn00I
-G66vsd+jzmRYxNqMWLimb/oVlOk9jHvLI1jHbAp5OkFMMuXLly5cuFU2TVrcb2mMtbdXzXKong8i
-/wAn6xyqzZf1gDrSgvvf7ymGOY/NMT0mlUYBRz0r1fqPwRT4bP3GReQzoA5NRnGqJD0f0zAMd6P+
-cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
-8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
-/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
-4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
-fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
-yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
-e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
-57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
-3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
-zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
-zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
-FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
-uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
-IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
-xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
-Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
-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
-lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
-9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
-5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
-l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
-desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
-HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
-JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
-mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
-fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
-4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
-/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
-Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
-x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
-nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
-Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
-/wD/2gAIAQIDAT8Q/ptyvCwyzcuXLilzkf09Bw2lxJGLS3EuXLly4MuPBUqVKlSpUqVKlSpUqVKl
-SpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUr/AMthKy8XggjCnhAesscpsy+LymSXFLlwZUwf
-6MgjC3jcRFsuBcI3qlURLWFwUeIGM4OIMGDBnL41KlSpUqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVK
-lSpUqVKlSpUqVKlSpUrhUr6qhERUVfAkj0Rb4MZQhaWR8Fw4NA1EVTBgwYQZcf0BrrwVFDWJ5Rbw
-qIIt8LWuCpfC5cuDFwMVwYQhCVMvFypUqVLulwIFLzm09pbhFdovNHPzfaDcqVKlSpUqVKljTWN1
-qdMvxGBAF1m+3eGkKxBdI+e83f2hClHnuxAtl1BfPebv7RUFHnvKlSpUqVKlSpUqVK4VwqVKlSuF
-fRBm2VEovlFvh1OIk0irrx1Q0LHHxEIpVhwEIQhBxXhejFcENHJb32IlLpzQMuduVRW8Dnf/AGCh
-IWc1npj2lgVKuQMWxdnK+TDti4TOo94IWtyGvIdfiHrBs4dDlKORRbvdGPvGEUi6sBLZF9RjFwCV
-b63+hMbo1/0I/LYUXpWiOuWVIrWvEa4VlZ0x6GXh3RG7Abr8EAxGpqlvW9SUOC+0GsfwAsjWzVOF
-THLiINEVdfDr49+gHjEIQh42N+v6lrMJ/n4Iv8CztmFDWkX2M/5CV81HpHq/S3ID/sGHAXz07Rzk
-8m3lpAUNKPxCx+g9Nf1LAdR/L94Sa0P0Lz9jGp0sGOR6dqgNxzQXfrEo+Q/l+82w3q+WGVy/f/jh
-bTpMucsValArpDBZrLM4mnyv/gQWmdBiNUawt68K8OrhmPjIa8GsEIQh4wKDOlqgAURtPnUSUubq
-VaA6ChK6mvXn7ygt6yZYes0JOikmDE6CCYNi3d3eb63Hy06qfMp8yllTvOFr1iZRLrSz3mbVVXmt
-vBCxNr8f5G7CWRMwWkm1+P8AIpYfiBX8CecN1GLEp+gNY7Egica4hCCDazVCEIQ/oIslWVCTPKZq
-YjqRhZyiV4b18USVKlSoHC1lYGGiEIQh46XAsrUaFyt1K1cp4WkQa8CsBEEA+BBrwESl1Ll8bl8L
-408CSCSsBMQMsupZdSt14FqINZSoDEEBjyR+TgKZqOTKmDZLl+vC3hL6JUU6y0qW4bwKlSpXDUuZ
-m5hCEIQ8JJ15fuE7WY3+eBWW0bkI+WItiIviNtLv7QhGj9xEcfqBRDow2kS/P+Q1yhzpwKsvSBd1
-2RIDesFynz8TBbjdtS1LJeU2qFg95XKBgiYXpG5ekPy/XAmr6d594Id4YDAlyrDu/uZsWZq68/EL
-brSBXBpWqrPfvNGJTR5/ULRcMitczJ08+0wTz+pZdOn5gzff88BzguNBzIYiSpXCpUqVNIWGrgPH
-k2QG3WOrYklmGEIQh49qAEoqolyspVRDxqVKyso0lJWIlF3xqJcpVSkQYh1gBAqAGnEA0lEqIMrj
-UpdxF3ACAEAIl8KrjRwpVSiAaxLqQLQiHWAG+CWQwwaE5ho8KlSpUqVKlRjH8pqmIK0SY8yPNXG0
-FSlWxoy4l5Jfh4HA/oZzBZ2mZaVUqVKlSpUqVKjDwLwkJwWROFDOVxEtX9COODRhsipUqVKlSpUq
-VKlSpUqVGL+LmU4iyAP6IkFkw7Ro1KlSpUqVKlSpUqVKlSpXAtyeDnPJx3CbhNwm4TcJuE3CbhNw
-m4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3CbhNwm4TcJuE3Cbh
-Nwm4TcJuE3CbhNwm4TcJuE3CbpN0m6TdJuk3yb5N895vnvN895vnvOpJuk3iLGpN4m8TeJvE3ibx
-N4m8TeJvE3ibxN4m8TeJvE3yPUIeonBLadrmw95svebL3/rV/wBj/9oACAEDAwE/EP6bUtwHEVKl
-SpUqc7+n24KSoNhFeIkqVKlSokFP9Kp4aSuAmEkJJdpMpUUQ6pQxJUqVKlh/R7cNONQkBKmkVwcM
-JKJiIcEWBBEleDmf0KlhIZXgEwMqVKjiXNcA8FROAWpqcHiyh/oAx4QWEgHGuNXCDhXGpUSCLlE4
-sYLJWa8Jmsq1Y8sfmYrZAA5t/wCTee8p0+6B1nX/AGJX0hbAwWe0psda5R1hw7Sg3gsY46jph/af
-PSPMt6Xf/REVEesnWWX1qHz0qiyNFb7/AJv4BS+A4A8FeB0muCHjeDRjGMYxlZ8O5BANK/iZzOuL
-ziEgKzK9F1/2VtfNaEbrV6DBPR7aSigDr51j6ijaYEX2hSqAbRLTS60mLgG2JeQr2I2ovQ9YtsMO
-QGWXLocKh6B9Wh+b9IAGrdLDyHo594uGBrQzrzmty09potRfRuaj0KumctOte0pBYbx66a9oiUU6
-b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
-+gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
-mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
-Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
-Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
-tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
-bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
-lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
-walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
-guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
-ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
-m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
-M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
-9ar+x//Z
-
---=====002_Dragon172714510278_=====
-Content-Type: image/gif;
- name="bot(06-26-10-58-52).gif"
-Content-Transfer-Encoding: base64
-Content-ID: <__1@Foxmail.net>
-
-R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
-7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
-AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
-gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
-
---=====002_Dragon172714510278_=====--
+S
+Date:
+From: "Foxmail¿ª·¢×é"
+To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
+Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
+Message-ID: <200906261059103758227@foxmail.com>
+X-mailer: Foxmail 6, 15, 201, 21 [cn]
+Mime-Version: 1.0
+Content-Type: multipart/related;
+ boundary="=====002_Dragon172714510278_=====";
+ type="multipart/alternative"
+
+This is a multi-part message in MIME format.
+
+--=====002_Dragon172714510278_=====
+Content-Type: multipart/alternative;
+ boundary="=====003_Dragon172714510278_====="
+
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/plain;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
+49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
+wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
+18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
+sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
+uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
+tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
+tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
+DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
+tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
+r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
+t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
+0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
+wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
+xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
+7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
+YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
+zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
+yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
+09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
+1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
+vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
+97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
+08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
+4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
+0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
+q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
+T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
+zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
+ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
+0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
+xOo21MINCg==
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/html;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
+L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
+IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
+ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
+KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
+bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
+dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
+bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
+eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
+cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
+IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
+Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
+R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
+dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
+R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
+TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
+Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
+OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
+Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
+cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
+MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
+CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
+OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
+VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
+SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
+Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
+eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
+LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
+OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
+VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
+ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
+RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
+eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
+VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
+MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
+U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
+UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
+bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
+MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
+bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
+bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
+dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
+uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
+L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
+xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
+cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
+VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
+PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
+tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
+y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
+PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
+zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
+dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
+ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
+Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
+yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
+vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
+p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
+08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
+xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
+o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
+o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
+PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
+b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
+Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
+RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
+dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
+UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
+oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
+IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
+DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
+cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
+987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
+0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
+tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
+oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
+ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
+Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
+TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
+8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
+Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
+PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
+L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
+/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
+1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
+PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
+DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
+VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
+vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
+xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
+JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
+QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
+x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
+yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
+u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
+PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
+bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
+IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
+
+--=====003_Dragon172714510278_=====--
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/jpeg;
+ name="banner(06-26-10-58-52).jpg"
+Content-Transfer-Encoding: base64
+Content-ID: <__0@Foxmail.net>
+
+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
+3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
+J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
+cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
+XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
+Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
+1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
+nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
+HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
+BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
+80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
+KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
+t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
+580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
+wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
+el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
+y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
+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
+cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
+8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
+/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
+4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
+fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
+yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
+e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
+57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
+3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
+zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
+zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
+FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
+uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
+IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
+xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
+Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
+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
+lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
+9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
+5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
+l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
+desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
+HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
+JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
+mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
+fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
+4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
+/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
+Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
+x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
+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
+b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
+mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
+Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
+Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
+tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
+bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
+lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
+walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
+guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
+ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
+m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
+M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
+9ar+x//Z
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/gif;
+ name="bot(06-26-10-58-52).gif"
+Content-Transfer-Encoding: base64
+Content-ID: <__1@Foxmail.net>
+
+R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
+7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
+AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
+gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
+
+--=====002_Dragon172714510278_=====--
+S
+X-Uidl: GmailId12a6707d170a511c&&pop.gmail.com
+Return-Path:
+Received: from Antoni-Windows7 (ita250.internetdsl.tpnet.pl [79.190.233.250])
+ by mx.google.com with ESMTPS id a48sm2388387eei.6.2010.08.12.09.00.18
+ (version=SSLv3 cipher=RC4-MD5);
+ Thu, 12 Aug 2010 09:00:19 -0700 (PDT)
+Date: Thu, 12 Aug 2010 18:00:25 +0200
+From: "johnnybravo159"
+To: "johnnybravo159"
+Subject: Test mail from Foxmail.
+Message-ID: <201008121800258604089@gmail.com>
+X-mailer: Foxmail 6, 15, 201, 22 [en]
+
+This mail was sent by Foxmail where testing your SMTP setting.
+
+S
+X-Uidl: GmailId12a670cec752827c&&pop.gmail.com
+Delivered-To: johnnybravo159@gmail.com
+Received: by 10.227.143.6 with SMTP id s6cs144098wbu;
+ Thu, 12 Aug 2010 09:05:55 -0700 (PDT)
+Received: by 10.213.5.5 with SMTP id 5mr385907ebt.72.1281629155351;
+ Thu, 12 Aug 2010 09:05:55 -0700 (PDT)
+Return-Path:
+Received: from mail-ey0-f177.google.com (mail-ey0-f177.google.com [209.85.215.177])
+ by mx.google.com with ESMTP id w46si4044334eeh.87.2010.08.12.09.05.54;
+ Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
+Received-SPF: pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) client-ip=209.85.215.177;
+Authentication-Results: mx.google.com; spf=pass (google.com: domain of antoni.mylka@gmail.com designates 209.85.215.177 as permitted sender) smtp.mail=antoni.mylka@gmail.com; dkim=pass (test mode) header.i=@gmail.com
+Received: by mail-ey0-f177.google.com with SMTP id 10so855513eyd.36
+ for ; Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
+ d=gmail.com; s=gamma;
+ h=domainkey-signature:received:received:message-id:date:from
+ :user-agent:mime-version:to:subject:references:in-reply-to
+ :content-type:content-transfer-encoding;
+ bh=PivaTP4ZM6VG0cBqUIcNpNqEdDuLIjYl/ub0gtahuU4=;
+ b=kB1U6Pp8EVDMWEUl+n8BsD9BYFi6u1qaIgnTBqUwhZ57uso0t11pVp+noSS7Wfxm9u
+ S3wH8uM/NcGLcBE29cfDvEe4s43j+bF04RnBIYM6S+ExHB5EQ3hqCeHlHfAgKCNCM9+/
+ yVE5v9w+G8N8wCkMD2jnMCG1G7P9ah49E7n5E=
+DomainKey-Signature: a=rsa-sha1; c=nofws;
+ d=gmail.com; s=gamma;
+ h=message-id:date:from:user-agent:mime-version:to:subject:references
+ :in-reply-to:content-type:content-transfer-encoding;
+ b=qfpJCkETuSk1g6LVXFfQcRvXyRW87IoqKy8sj+TY75VYLlQHUR1fMBw33QPR+QppH3
+ duzZ33oOqNwcGsG/GYOHeWWfK7e7+PAWYM/Cq8+r6TiJVgT3EpqP7vySPS0tOYBBDfHQ
+ mXGCJdkpd1wNqklEtCqzHvBxSB3kpx1jrRiqI=
+Received: by 10.213.28.194 with SMTP id n2mr7432209ebc.10.1281629154117;
+ Thu, 12 Aug 2010 09:05:54 -0700 (PDT)
+Return-Path:
+Received: from [192.168.0.4] (ita250.internetdsl.tpnet.pl [79.190.233.250])
+ by mx.google.com with ESMTPS id v59sm2397289eeh.10.2010.08.12.09.05.52
+ (version=SSLv3 cipher=RC4-MD5);
+ Thu, 12 Aug 2010 09:05:52 -0700 (PDT)
+Message-ID: <4C641BDC.9080504@gmail.com>
+Date: Thu, 12 Aug 2010 18:05:48 +0200
+From: Antoni Mylka
+User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.11) Gecko/20100711 Lightning/1.0b1 Thunderbird/3.0.6
+MIME-Version: 1.0
+To: johnnybravo159
+Subject: Re: A test email from Foxmail
+References: <201008121803499552355@gmail.com>
+In-Reply-To: <201008121803499552355@gmail.com>
+Content-Type: text/plain; charset=UTF-8; format=flowed
+Content-Transfer-Encoding: 7bit
+
+W dniu 2010-08-12 18:03, johnnybravo159 pisze:
+> Hello everyone, I succesfully installed Foxmail,
+> I wonder if it makes any sense to use mstor for this. It seems like a
+> huge overkill.
+> Or should we rather settle on implementing an incomplete javamail driver
+> with very limited functionality. single-folder, without properly
+> supporting those standard-violating 8bit characters in emails.
+> This might become a problem though. This is a Chineese program, popular
+> in china. The majority of customers who would like to use it, will
+> probably use it on chinese content. This means that my driver pretty
+> much has to support CJK characters properly. Otherwise it's as good as
+> useles..
+
+Hello, anybody there?
+
+Antoni
+S
+Date:
+From: "Foxmail¿ª·¢×é"
+To: "=?gb2312?B?1/C+tLXERm94bWFpbNPDu6c=?="
+Subject:=?gb2312?B?u7bTrcq508MgRm94bWFpbCA2LjUgo6E=?=
+Message-ID: <200906261059103758227@foxmail.com>
+X-mailer: Foxmail 6, 15, 201, 21 [cn]
+Mime-Version: 1.0
+Content-Type: multipart/related;
+ boundary="=====002_Dragon172714510278_=====";
+ type="multipart/alternative"
+
+This is a multi-part message in MIME format.
+
+--=====002_Dragon172714510278_=====
+Content-Type: multipart/alternative;
+ boundary="=====003_Dragon172714510278_====="
+
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/plain;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+IEZveG1haWwgNi41INX9yr2w5iC1xNfu0MK4xL34IA0K0MLU9rT9sOzKws/uuabE3CANCg0Kt72x
+49PDu6exuM38oaLH4cvJudzA7bj3uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgDQrQ
+wtT2w/fQxcasuabE3CANCg0KzOG5qbbg1tbA4NDNus2357jxtcTD99DFxqyjrLe9sePTw7unuPjH
+18XzusPT0dbCvdrI1c7KuvKhoyANCtDC1Pa7u7f0uabE3CANCg0KzOG5qbbg1tbGpLf0xeTJq7e9
+sLi6zbXXzsajrLKix9LWp7PW08O7p9fUtqjS5cakt/TR1cmroaMgDQrIq87Ey9HL97j8zsi2qKGi
+uPzXvMi3IA0KDQrIq87Ey9HL97XEy/fS/b2owaLL2bbItPO088zhyf2jrNW808PXytS0w/fP1L21
+tc2jrMvRy/e4/M7Itqihorj817zIt6GjIA0KyPS4ybjEvfgNCg0KMS4g08W7r8HLRm94bWFpbMb0
+tq+6zbnYsdXL2bbIo7sgDQoyLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sg
+DQozLiC808e/wctWaXN0Yc+1zbO1xMr9vt285sjd0NSjuyANCjQuILzTx7/By0ZveG1haWzK/b7d
+tqrKp7XEt8DT+aO7IA0KNS4g08W7r8HL0MK9qNXLusW1xNfUtq/J6NbDuabE3KO7IA0KNi4g08W7
+r8HLtPLTobmmxNyjuyANCjcuINPFu6/By7GjtOa087i9vP61xMvZtsijuyANCjguINPFu6+2wMGi
+t6LLzdPKvP65psTco7sgDQo5LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszio7sgDQoxMC4g
+0N64xMHLuPax8Mfpv/bPwtPKvP7K1cihuvOz9s/W08q8/raqyqe1xM7KzOKjuyANCjExLiDQ3tX9
+wcvI9LjJYnVnoaMNCg0KDQoNCkZveG1haWwgNi41INX9yr2w5rbUIDYuMNX9yr2w5iC1xNb30qq4
+xL34DQog1Pa80yLTyrz+tbWwuCK5psTcDQoNCtDC1Pa1xNPKvP61tbC4uabE3KOsv8nS1MjDxPq/
+7MvZseO93bXY1dK1vcT6z+vSqrXE0MXPoqGjIA0KINans9ZJTUFQ1cq7p7ncwO0NCg0KtNNGb3ht
+YWlsIDYuNSBCZXRhMiC/qsq8o6xGb3htYWlsIMirw+bWp7PWSU1BUNXKu6e1xLncwO2hoyAgDQog
+zOG5qbHjvd21xMvRy/fOxLz+vNANCg0Ky9HL987EvP680LKiw7vT0NXm1f205rSiyM66zrXn19PT
+yrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+tcTK0828o6zL/L2rvODK08v5
+09DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMysoaMgDQog1Pa8087EvP7W0Neq
+1b65psTcDQoNCs7EvP7W0Neq1b6w79b6xPrU2rK7zay158TUvOTXqtLGzsS8/qOs0tTBtL3T0M7K
+vc/yyM7S4tPKz+S3osvNMUe1xLOstPO4vbz+oaMgDQog1Pa807i9vP653MDtxvcgDQoNCrXju/fW
+97LLtaW1xKGwuaS+36GxtcShsLi9vP653MDtobG/ydLUtPK/qri9vP653MDtxve1xLbUu7C/8qOs
+08O7p7/J0tS3vbHjtcS53MDtw7+49tXLu6e1xLi9vP6hoyANCiDQwtT2ttSxvrXY08q8/sno1sPM
+4dDRtcS5psTcIA0KDQrE+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPKvP7J6NbDzOHQ0aGjzOHQ
+0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1xNPKvP6hoyANCtDC1PbX
+q9C0u+HS6cfrx/O5psTcIA0KDQrE+r/J0tS63Le9seO12Ner0LS74dLpx+vH86GjvObI3U9VVExP
+T0u1xLvh0unH68fzo6yyotans9azrM7Esb7E2sjdtcS74dLpx+vH86GjIA0K0MLU9iK2wMGit6LL
+zSK5psTcIA0KDQrI57n7ssnTw6GwtsDBoreiy82hsbXEt73Kvb340NC3osvN08q8/sqxo6zDv7j2
+ytW8/sjL1MS2wdPKvP7Ksbvhv7S1vdXit+LTyrz+ysfOqNK7t6LLzbj419S8urXEoaMgDQq4/Lbg
+0MLM5dHptci0/cT6o6HU2bTOuNDQu8T6tcTKudPDo6ENCg0KRm94bWFpbCC/qrei1+kgDQoyMDA5
+xOo21MINCg==
+
+--=====003_Dragon172714510278_=====
+Content-Type: text/html;
+ charset="gb2312"
+Content-Transfer-Encoding: base64
+
+PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
+L0VOIj4NCjxIVE1MPjxIRUFEPjxUSVRMRT67ttOtyrnTw2ZveG1haWw8L1RJVExFPg0KPFNUWUxF
+IHR5cGU9dGV4dC9jc3M+QGltcG9ydCB1cmwoIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcT3du
+ZXJcTG9jYWwgU2V0dGluZ3NcVGVtcG9yYXJ5IEludGVybmV0IEZpbGVzXHNjcm9sbGJhci5jc3Mg
+KTsNCjwvU1RZTEU+DQoNCjxTVFlMRSB0eXBlPXRleHQvY3NzPkBpbXBvcnQgdXJsKCBDOlxEb2N1
+bWVudHMgYW5kIFNldHRpbmdzXE93bmVyXExvY2FsIFNldHRpbmdzXFRlbXBvcmFyeSBJbnRlcm5l
+dCBGaWxlc1xzY3JvbGxiYXIuY3NzICk7DQo8L1NUWUxFPg0KDQo8TUVUQSBodHRwLWVxdWl2PUNv
+bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9R0IyMzEyIj4NCjxTVFlMRSB0
+eXBlPXRleHQvY3NzPkJPRFkgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElORy1MRUZUOiAw
+cHg7IFBBRERJTkctQk9UVE9NOiAwcHg7IE1BUkdJTjogMHB4OyBGT05UOiAxMnB4IFZlcmRhbmE7
+IFBBRERJTkctVE9QOiAwcHgNCn0NCiNjbnQgew0KCVBBRERJTkctUklHSFQ6IDBweDsgUEFERElO
+Ry1MRUZUOiAwcHg7IFBBRERJTkctQk9UVE9NOiAyMHB4OyBXSURUSDogNzUwcHg7IExJTkUtSEVJ
+R0hUOiAyNXB4OyBQQURESU5HLVRPUDogMjBweDsgVEVYVC1BTElHTjogbGVmdA0KfQ0KLnN1YmNu
+dCB7DQoJTUFSR0lOLUJPVFRPTTogMjVweA0KfQ0KSDEgew0KCUZPTlQtU0laRTogMTRweDsgTUFS
+R0lOOiAxNXB4IDVweCAzNXB4IDIwcHgNCn0NCkgyIHsNCglGT05ULVNJWkU6IDE0cHg7IFBBRERJ
+TkctQk9UVE9NOiA1cHg7IE1BUkdJTjogMTVweCAwcHggMTBweDsgQ09MT1I6ICMwMzk7IEJPUkRF
+Ui1CT1RUT006ICNhYmJjZGQgMXB4IHNvbGlkDQp9DQpIMiBTUEFOIHsNCglQQURESU5HLVJJR0hU
+OiAxMHB4OyBQQURESU5HLUxFRlQ6IDEwcHg7IEJBQ0tHUk9VTkQ6ICNlOGVkZjY7IFBBRERJTkct
+Qk9UVE9NOiA1cHg7IFBBRERJTkctVE9QOiA1cHgNCn0NCkgzIHsNCglQQURESU5HLVJJR0hUOiAw
+cHg7IFBBRERJTkctTEVGVDogNTBweDsgRk9OVC1TSVpFOiAxNHB4OyBQQURESU5HLUJPVFRPTTog
+MHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkctVE9QOiA1cHgNCn0NCkg0IHsN
+CglQQURESU5HLVJJR0hUOiAwcHg7IFBBRERJTkctTEVGVDogMjBweDsgRk9OVC1TSVpFOiAxMnB4
+OyBQQURESU5HLUJPVFRPTTogMHB4OyBNQVJHSU46IDBweDsgQ09MT1I6ICMzMzM7IFBBRERJTkct
+VE9QOiAwcHgNCn0NClVMIHsNCglQQURESU5HLUxFRlQ6IDIwcHg7IE1BUkdJTjogMHB4DQp9DQpM
+SSB7DQoJTUFSR0lOLUxFRlQ6IDUwcHg7IENPTE9SOiAjNDQ0OyBMSVNULVNUWUxFLVRZUEU6IGRl
+Y2ltYWwNCn0NCiNjbnQgUCB7DQoJUEFERElORy1SSUdIVDogNXB4OyBQQURESU5HLUxFRlQ6IDVw
+eDsgUEFERElORy1CT1RUT006IDVweDsgTUFSR0lOOiAwcHggNXB4IDBweCA0NXB4OyBQQURESU5H
+LVRPUDogNXB4DQp9DQpCIHsNCglDT0xPUjogIzAzOQ0KfQ0KLnNpZ24gew0KCUZPTlQtV0VJR0hU
+OiBib2xkZXI7IE1BUkdJTjogMzBweCAzMHB4IDE1cHggNTBweA0KfQ0KLnNpZ24gQiB7DQoJRk9O
+VC1TSVpFOiAxNHB4DQp9DQojZm9vdGVyIHsNCglCT1JERVItVE9QOiAjYzlkY2Y4IDNweCBzb2xp
+ZDsgQkFDS0dST1VORDogI2RkZThmODsgT1ZFUkZMT1c6IGhpZGRlbjsgV0lEVEg6IDc1MHB4OyBI
+RUlHSFQ6IDI1cHgNCn0NCi50MSB7DQoJRk9OVC1TSVpFOiAxMnB4OyBMSU5FLUhFSUdIVDogMjBw
+eA0KfQ0KLnQxIEIgew0KCUZPTlQtU0laRTogMTRweDsgQ09MT1I6ICMzMzMNCn0NCkJMT0NLUVVP
+VEUgew0KCU1BUkdJTi1UT1A6IDBweDsgTUFSR0lOLUJPVFRPTTogMHB4OyBNQVJHSU4tTEVGVDog
+MmVtDQp9DQpPTCB7DQoJTUFSR0lOLVRPUDogMHB4OyBNQVJHSU4tQk9UVE9NOiAwcHgNCn0NCjwv
+U1RZTEU+DQoNCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI5MDAuNTUxMiIgbmFtZT1HRU5F
+UkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8Q0VOVEVSPjxJTUcgc3JjPSJjaWQ6X18wQEZveG1haWwu
+bmV0Ij4gDQo8RElWIGlkPWNudD4NCjxIMiBjbGFzcz1zdWJjbnQ+PFNQQU4+PElNRyBoZWlnaHQ9
+MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiANCndpZHRoPTE5PkZveG1haWwmbmJzcDs2LjUm
+bmJzcDvV/cq9sOYmbmJzcDu1xNfu0MK4xL34IDwvU1BBTj48L0gyPg0KPERJViBjbGFzcz1zdWJj
+bnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lk
+dGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9rT9sOzKws/uuabE3CZuYnNwOzwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+t72x49PDu6exuM38oaLH4cvJudzA7bj3
+uPbKws/uo6yyor/JttTW2NKqysLP7sno1sPM4dDRoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9sP30MXGrLmmxNwmbmJzcDs8
+L0I+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQPszhuam24NbWwODQzbrNt+e48bXEw/fQ
+xcaso6y3vbHj08O7p7j4x9fF87rD09HWwr3ayNXOyrryoaMgPC9QPjwvRElWPg0KPERJViBjbGFz
+cz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8
+VEQgd2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9ru7t/S5psTcJm5ic3A7
+PC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7M4bmptuDW1sakt/TF5Mmrt72wuLrN
+tdfOxqOssqLH0tans9bTw7un19S2qNLlxqS39NHVyauhoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT48L1REPg0KICAgIDxURCBjbGFzcz10MT4NCiAgICAgIDxESVY+PEI+yKvOxMvR
+y/e4/M7Itqihorj817zItyA8L0I+PC9ESVY+PC9URD48L1RSPjwvVEJPRFk+PC9UQUJMRT4NCjxQ
+PsirzsTL0cv3tcTL99L9vajBosvZtsi087TzzOHJ/aOs1bzTw9fK1LTD98/UvbW1zaOsy9HL97j8
+zsi2qKGiuPzXvMi3oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lk
+dGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+PC9URD4NCiAg
+ICA8VEQgY2xhc3M9dDE+DQogICAgICA8RElWPjxCPsj0uMm4xL34PC9CPjwvRElWPjwvVEQ+PC9U
+Uj48L1RCT0RZPjwvVEFCTEU+DQo8UD4xLiZuYnNwO9PFu6/By0ZveG1haWzG9Lavus252LHVy9m2
+yKO7IDxCUj4yLiC1pbj2sb612NPKvP680LTmtKLI3cG/tNMyR8Cp1bm1vTRHo7sgPEJSPjMuIA0K
+vNPHv8HLVmlzdGHPtc2ztcTK/b7dvObI3dDUo7sgPEJSPjQuILzTx7/By0ZveG1haWzK/b7dtqrK
+p7XEt8DT+aO7IDxCUj41LiDTxbuvwcvQwr2o1cu6xbXE19S2r8no1sO5psTco7sgPEJSPjYuIA0K
+08W7r8HLtPLTobmmxNyjuyA8QlI+Ny4g08W7r8HLsaO05rTzuL28/rXEy9m2yKO7IDxCUj44LiDT
+xbuvtsDBoreiy83Tyrz+uabE3KO7IDxCUj45LiDQ3rjEwcu49rHw08q8/rP2z9bC0sLrtcTOyszi
+o7sgPEJSPjEwLiANCtDeuMTBy7j2sfDH6b/2z8LTyrz+ytXIobrzs/bP1tPKvP62qsqntcTOyszi
+o7sgPEJSPjExLiDQ3tX9wcvI9LjJYnVnoaM8L1A+PEJSPjxCUj4NCjxIMiBjbGFzcz1zdWJjbnQ+
+PFNQQU4+PElNRyBoZWlnaHQ9MTEgc3JjPSJjaWQ6X18xQEZveG1haWwubmV0IiB3aWR0aD0xOT5G
+b3htYWlsIA0KNi41Jm5ic3A71f3KvbDmttQgNi4w1f3KvbDmJm5ic3A7tcTW99KquMS9+DwvU1BB
+Tj48L0gyPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJP
+RFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQgY2xhc3M9
+dDE+PEI+1Pa80yLTyrz+tbWwuCK5psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8
+UD7QwtT2tcTTyrz+tbWwuLmmxNyjrL/J0tTIw8T6v+zL2bHjvd212NXStb3E+s/r0qq1xNDFz6Kh
+oyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQog
+IDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7Wp7PWSU1BUNXKu6e53MDtPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+
+DQo8UD6000ZveG1haWwmbmJzcDs2LjUmbmJzcDtCZXRhMiZuYnNwO7+qyryjrEZveG1haWwmbmJz
+cDvIq8Pm1qez1klNQVDVyruntcS53MDtoaMmbmJzcDsgDQo8L1A+PC9ESVY+DQo8RElWIGNsYXNz
+PXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAwJSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxU
+RCB3aWR0aD00NT4mbmJzcDs8L1REPg0KICAgIDxURCBjbGFzcz10MT48Qj7M4bmpseO93bXEy9HL
+987EvP680DwvQj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+y9HL987EvP680LKiw7vT
+0NXm1f205rSiyM66zrXn19PTyrz+o6zL/MrH08PAtM/Uyr7Su8Dgt/u6z8zYtqjM9bz+tcTTyrz+
+tcTK0828o6zL/L2rvODK08v509DOxLz+vNCjrMvRy/fOxCC8/rzQu+HKvNbVsaOz1tfu0MLXtMys
+oaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1zdWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0K
+ICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQgd2lkdGg9NDU+Jm5ic3A7PC9URD4NCiAgICA8VEQg
+Y2xhc3M9dDE+PEI+1Pa8087EvP7W0Neq1b65psTcPC9CPjwvVEQ+PC9UUj48L1RCT0RZPjwvVEFC
+TEU+DQo8UD7OxLz+1tDXqtW+sO/W+sT61Nqyu82stefE1Lzk16rSxs7EvP6jrNLUwbS909DOyr3P
+8sjO0uLTys/kt6LLzTFHtcSzrLTzuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250
+Pg0KPFRBQkxFIHdpZHRoPSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRo
+PTQ1PiZuYnNwOzwvVEQ+DQogICAgPFREIGNsYXNzPXQxPjxCPtT2vNO4vbz+udzA7cb3IDwvQj48
+L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+teO799b3ssu1pbXEobC5pL7fobG1xKGwuL28
+/rncwO2hsb/J0tS08r+quL28/rncwO3G97XEttS7sL/yo6zTw7unv8nS1Le9seO1xLncwO3Dv7j2
+1cu7p7XEuL28/qGjIDwvUD48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFRBQkxFIHdpZHRo
+PSIxMDAlIj4NCiAgPFRCT0RZPg0KICA8VFI+DQogICAgPFREIHdpZHRoPTQ1PiZuYnNwOzwvVEQ+
+DQogICAgPFREIGNsYXNzPXQxPjxCPtDC1Pa21LG+tdjTyrz+yejWw8zh0NG1xLmmxNwgPC9CPjwv
+VEQ+PC9UUj48L1RCT0RZPjwvVEFCTEU+DQo8UD7E+r/J0tS21NDo0qq52NeitcShorT9sOy1xNPK
+vP7J6NbDzOHQ0aGjzOHQ0bW9wLS1xMqxuvKjrNTazOHQ0bSwv9rW0KOsxNy/7MvZtPK/qs/g06a1
+xNPKvP6hoyA8L1A+PC9ESVY+DQo8RElWIGNsYXNzPXN1YmNudD4NCjxUQUJMRSB3aWR0aD0iMTAw
+JSI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCB3aWR0aD00NT48L1REPg0KICAgIDxURCBj
+bGFzcz10MT48Qj7QwtT216vQtLvh0unH68fzuabE3CA8L0I+PC9URD48L1RSPjwvVEJPRFk+PC9U
+QUJMRT4NCjxQPsT6v8nS1Lrct72x47XY16vQtLvh0unH68fzoaO85sjdT1VUTE9PS7XEu+HS6cfr
+x/OjrLKi1qez1rOszsSxvsTayN21xLvh0unH68fzoaMgPC9QPjwvRElWPg0KPERJViBjbGFzcz1z
+dWJjbnQ+DQo8VEFCTEUgd2lkdGg9IjEwMCUiPg0KICA8VEJPRFk+DQogIDxUUj4NCiAgICA8VEQg
+d2lkdGg9NDU+PC9URD4NCiAgICA8VEQgY2xhc3M9dDE+PEI+0MLU9iK2wMGit6LLzSK5psTcIDwv
+Qj48L1REPjwvVFI+PC9UQk9EWT48L1RBQkxFPg0KPFA+yOe5+7LJ08OhsLbAwaK3osvNobG1xLe9
+yr29+NDQt6LLzdPKvP7KsaOsw7+49srVvP7Iy9TEtsHTyrz+yrG74b+0tb3V4rfi08q8/srHzqjS
+u7eiy824+NfUvLq1xKGjIDwvUD48L0RJVj48L0RJVj4NCjxESVYgY2xhc3M9c3ViY250Pg0KPFA+
+PEI+uPy24NDCzOXR6bXItP3E+qOh1Nm0zrjQ0LvE+rXEyrnTw6OhPC9CPjxCUj48QlI+Rm94bWFp
+bCC/qrei1+kgPEJSPjIwMDnE6jbUwjwvUD48L0RJVj48L0RJVj4NCjxESVY+PC9ESVY+DQo8RElW
+IGlkPWZvb3Rlcj48L0RJVj4NCjxESVY+PC9ESVY+PC9DRU5URVI+PC9CT0RZPjwvSFRNTD4NCg==
+
+--=====003_Dragon172714510278_=====--
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/jpeg;
+ name="banner(06-26-10-58-52).jpg"
+Content-Transfer-Encoding: base64
+Content-ID: <__0@Foxmail.net>
+
+/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4AJkFkb2JlAGTAAAAAAQMA
+FQQDBgoNAAAUGgAAJRsAADuoAABYaf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoI
+CQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQU
+FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8IAEQgAoALuAwERAAIR
+AQMRAf/EAPEAAQACAwEBAQAAAAAAAAAAAAABAgMEBgUHCAEBAQEBAQEBAAAAAAAAAAAAAAECAwQF
+BhAAAQQBAwMEAQQCAwEAAAAAAgABAwQREhMFECAhMGAUBjFAUEEicBUyQiMWEQACAQIDBQMHCAcI
+AwEBAAABAgMAESExEkGRMhMEUWEiECBxgUIjFDBgobHB0VIF8GKCkjOTNFDh8XKi0kMkQFNj4kQS
+AAIBAwMDBQEAAAAAAAAAAAARARAhMTBgkPBxgSBAAhIyIhMBAAIBAgQFBAMBAQEAAAAAAQARITFh
+EEFRcSDwgZHxMKGxwVBg0eFAcP/aAAwDAQACEQMRAAAB+39+QAAAAAAAAAAAAAAAAAAAAAAhIIqC
+CCtkEFahKkVUiypBWypFVSpFVIsqVqEqRUEFotLeXJm5JbykpUWadXTW6ZwbwAO38PrAAAAAAAAA
+AAAAAAAAAAAAAgJBFQQVSKggrZBWoIStVIqqQVqqRVSErUFahJltLeLS2lx51rZuNdlNszWRZhrV
+smos0O3OlyB23i9QAAAAAAAAAAAAAAAAAAAAAEEEEWQQQRUJUioKpFVIK2QVIqqRVSCtgtm5Jbyh
+LlzdXOuV3NfpnYSDTXUxfb566+zDZFRZSzDrOh35wg7Tx+oAAAAAAAAAAAAAAAAAAAAAQggggioI
+SCKgqRZBUioSpFVIStQTLklvm3ipUyTWfFtL4Vcx359ZL0Hn6bWdQmnqeJ358dvPl8On0Kt1KWY9
+Stmj0xq9eY7HyekAAAAAAAAAAAAAAAAAAAAACAQkEVBBBCRUFSLIKkVBVC3lyZt5ZihSpl2MXPnV
+S0vn2cJ6eXbc9e5x6TGMgVi1PO6Y4frnx/P0+r2UspZi1Mdnmd+WPWev8voAAAAAAAAAAAAAAAAA
+AAAAAggEEJFQQQRZBUgioKpFbPPebGq2UKFVz5u1jWSXCZDYzcZ8z7c/c656nz9MuNYyxYsLNXU8
+Dtj5gfROWui1KWY9ZwamDWfO7c+s8/YAct8/9Fodufk/c/MwVPqPzPSsAAAAS8l6ueGzs/J1rnfO
+eP7np68u118uz28nM+L7/p68ux08+16fCAAAAAAIIBBBFQkEEEVBCVIqCC+dXzpLlzdrGs+bEYNM
+su1lWNZfIs4L1cfoPPXq8t1ltFi5YVr6njdM8d25+N5uv1jecdmPUxWYdZ1d597GwBbGvnvv4aep
+2nh7/O/p+b3fN0zS856+O/y3pdM+95eup0z4vo5/R/k+vmPZx8rtjzeuPP7Y+7/D9vK/P/Q8r4/u
+9L6fjdP7vg0z0+ffL/XdD6fke36/k+j38YAAAAAAghBBBBFQQQkEVBBBCVqZra5dPQ47tLjMOmeN
+rFrGvWGIOe1OX9XL6Fx3v89ovFixJNaepq6zzvo5/LfN1+77zjsx6mO5wamDU9jNAA+T/T4dn4O+
+KzjPdx2833PN0+efU8v0P5Xr+dfV8nS+Xr7vl6/NPr+T0eWvX4dPJ7Y2sXqfN07/AMXXgvkfsfe9
+Px+S8P6Tq/Z+f3Ovlzb48V879V2X0fy3pejwgAAAAACARUEAhIIIqCCCKhKkEGzy7Z8bnLal2+do
+a5hBJJy1nN+rl9C479Dnq8tixJYsebqTrPOejn8h83X77vOPWcdmOzDqYNT1s0ASaNu7IXz9S0uS
+M0a9KkzZYaxakGXNkzGVMPPvgx2ya5zF9Y18d73O128gAAAAAAUIIBCQQRUAqCtkEEEEVl572OfX
+d56z4uBMIWYksSc/Z8/9PL6XjXq8t5ovLKSuSyh52pk1OD78+M8vX7V0xj1MdmLUxWYdT1c0AAAA
+AAAAAAAAAAAAAAAAAKEEAhIIIqCCAVSKgggiku3x60usmbjsvi5M3LlaLljVPifTP0/tz9/j03MX
+KtokGhqTWj0x8Ur6Dy12O847MepisxamHWfWxoCQeRm7FYjdMRhNWX29ZEg0pcteblvVqRcz1uWC
+TXPNzd2tQ9WwXBQFyhcGuudJBoS6pslasmehrRt6kAoeXm7+pijEusWKp6O5s8t5cdMuNVJyiopE
+klo+enNd+f1U9PlvYi8orZpVXU4ztz+W+Tt+i+uKWY7MVmPUxWYdT18aA83tmDi/J29ezyzeJPR1
+OVxr6d15jxvRja5657z9Pc3nQzcJz+dbKejqdfvNa531cug8nXk+e92zn866recZqR6Opgl1Y9Cv
+Elykxns6bedLpNPpm/l66xzWL7WprrZMJuV7+8ZK571c/Z8nXi+W93WdKWF8iOh1L2dN1xkxrPjd
+8a2cawl4Ekkg1z45GL0c/pepv41nysuOzX3nltz4h4+/6Il9LeN/rjHZjsx2YtTDZ7ONASDxpfRs
+oZTSly1WN+wSUPKlym1ZiXFGUzWZwSa5hUZkwrlS5QzAwlTKYjKZSQaJC5UGMy1kTCZKgRFaMZKg
+1ihs2YTbqDb5by42lyZsRJNCQSasfLJeH1Oz7Y6PWcteXm8Jy3o8t9XHPy/V9T3N42+3PHZhrDZj
+1Pd56AAAAAAAAAAAAAAAAAAAAACoBAISCCKggggiyCCCCKgqmxjd86vm58axliQgkAqeQvB5vOZu
+I9au+3n2bPnGNfJ8a35fsFdP15278qWVsw6nQctgAAAAAAAAAAAAAAAAAAAABUAgEJBBFQQQQRZB
+BBBFVIS8uXGs+NYqz41FkgAEgAAVCVPEl+eY18y579WX6edh2519XDX3mlnUefqAAAAAAAAAAAAA
+AAAAAAAAFQCAQkEEVBBBBFkEEEFaghINjG5ltF5YiwFQAAAQggrVK5rN4Llv59z36Mv0I7b3eWO3
+IdZ5u4AAAAAAAAAAAAAAAAAAAAAEAEEECoSCCCCKEFUFaEEF82TNnWKzLmwSCBQgAEAhKVjMRzmb
+wvPp8/56+mdef0X1+cDt/m+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADVKnMp2KyA
+bAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//aAAgBAQABBQL2dpdba0stCYFp
+bphYRdDH2fpd1tutDLC0unKMUV2EU1+FNeidDLHIsLCNM2ejsibS/srQS21pZumHdNE6mnigaTkJ
+p3apZmTcSn4hkfGzAtdqBVeWdRSRzAaZsNjoY5b2Npd1tLQPY0ZOmiFllmVy80QjFLcKvRQVoxWk
+GT6UccTqaqDq3x2FWuzVZIJo7Q4WE7dJQ9h7ZLbZYZumVlMJkmgTCIpyTRmSuTBXCJiuTV4GFD4b
+Utaz0IVJGuSpZbi+Q+JY6YTsnbKIdL/v4C2FlZWpeXTQE6aIBWU5pojJMIgjNhHkpymOlAwsDYTv
+0wsLCwjZWQyuVr7EvB2/l0Oj9JB1N28hz1fjrI/aKxR//b1E/wB3rM3DfbWmf0ssyofZOO5K1D9o
+4+xdTkIDDz1KzL80lFNus3lNz9A7HzSUU+6/69idlrWUMZkmgFl4ZalrymhIkzCCck8iuyaYof8A
+2uwDhv47jTtqfmYNdb6pYxc6v00/37NRL7byM9Sp9f5Ua9GDmuOsyv8AZOUv8tzNvk+Lp8ByfIcp
+Qo/aLkV+tzXMcxd5b7LyFPkuVucpxdDguR5jlxL7JykfK2ZDabluTtcfVh+w3ZeD4W/I1b6jBucm
+y+xWNnjPrm/GrfONRkgljnittKdXiuM5Dj7NvmCoKnahu1/17Jh3HYABZTmy1uTtA7ptIs5J5F+e
+nJlgeL8lF6Ez4HR/S6OY/rxaOc6un7/sFljvxcTTOvPRocdB9dgge79okhmOgVbhOK5KCXki4C1X
+/wBfx9R7vNfbSeZ+Fj/1vCcZWNrf1+kB8l9n+PMVuuEHEHBFV4D6xUjgqrn5GebjWiiqX5vk35eR
+q0HschBVaG1Xnj5mwMlmlFs1/wBgEnZNM61EaGuvAs5J5O3l/wDjxDqJ/QP+x/8AW8+A+u/3+wdX
+Tr+e0qdQyT4dvgUUNKmDyVq8r6B0jUqggq1onkq1Zi2o3AKtaJfAor4FFHUqyIqtY2CMI2UkUUq+
+HUQQQxuUEBkcYSN8OohrVwf9hBC+FDJGMetk59/Kx64eLl02oSQv3G+GH8H4bm59ur9Mh3eQ7HX8
+/v7Ph0TOz6C0sTrcWtllZ62Q1xWtVC9VlGQAdN2ZUxZTeFNJhvtF9fV+PehxPY6/ntPlOPjniuV5
+pnv12hnlGvAVmIZvn1Nr/bVO2a1FAUs8NcW5bjXP5MJIeSqGrN+Co0VmOYuss8Fcf9txryPah2T5
+Tj45tQ6tQ6umodTELuhITHo80TF1kvUYTg5Tj7AlcrA9S7WuxjbqGJSRiW5HuFbqBL1JxEZeRqQD
+GYTDHNHKjtRRnDyEE4vdi3ILb2Og+Wb+wxEiHSS0stsVodYNZNbi5ynuhwvJbJRSoZExrUtS1JiZ
+yOVcryQVYuEoHz/K9rr+et2Z4AoSyTRWRs7dLDTyVpD4bkap/wCqKhIzvK8vEUnojN0vWHgesc0l
+Ww1urPVqvHELvIfKVd+1W4+wNrlKscKpV4Pkos6a9uSWzIJGEcVp7XMwtLCQ8kDV2P51j5Bzvckl
+rU2sRkbWX5ITsQAIbVqtBppSiQQ8nPMwERFeVqQooaE5zvdGyw8ZFIADFPBPxQXYpCiGeJ9x59dn
+ZjKaaWMNuNWbcgTSCZhHHcmgrtPZoxU3ilvxvYn4wQikt5ns04AGygfznBF/V/8AmLd80TSjzfEH
+GXFc0LKOXLDIa3jXyEU+U8mluR5aCmNy7Py1ijTocLxFa0M49jrPntPiuNkaOCKFfGh+NLGE0ZUY
+TJ6kDwS0ak7dSbWL8bWJ/gwaSggKIKkAF8CtpkqQSvsRb/WWEZhenVeL4kGJIIpSmp1LBRQQQNHF
+HCEMEFcdI6mEReGCCuI1awG8UbtJVrSntR6upVIDlKpAUsUEUAxQRQDHWrQtJHHKyCOOJumej1YN
+l4YnFoYmlsUqlpQ0KVdSxBMI1a4H0fywvrGMsIvz3zQjK3LfXNwo73JcOdX7PXNBzVEk/L0lP9hp
+RNd+1SSKtwnI8kXwuN4sQ5f/AN4JYrscFhpBTp3Tv7DB/AvgpPCZ9Teg7MSscfDONr6fSkc/p1hk
+30++Sg+jRO9DgON49TwCQcnxzWhliKMqlvQ9KavJFFM0gu/T8LV59gi/l0L6mB9Lv6OVlZWVlZWV
+bgyuT4/faSNxejeOA6nIDIozGYXNO+fYovhzZCWW9HKysrKysp1ai0PyVDcUkbi9S24vR5F2fcaX
+roNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDW
+g1oNaDWg1oNaDWg1oNaDWg1oNaDWg1oNaDWg1tmts1tyLbkW3ItuRbci25FtyLakW1ItqVbUq2pV
+tSralW1KtmVDFKtqVaJHZo5WJ45FtyLbkW3ItuRbci25FtyLbkW3KtuRbcq25VtyrblTxzIq8ptL
+UlAuT4mUVJG7PwPD2pY/jzr486+POsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEs
+EsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEs
+EsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEsEjgcnasv8A5Xivk6XWCWCWC9v/
+AP/aAAgBAgABBQL2y3tTPtvPTCwvHXHs/PbnswnJZ7M+g3sPKz3Z7WTv7Vz3sn9Fk/qFLhRFrL47
+r4zqSDHqFEQs8JMyd8LdWtCWem6taYs/smfRb9PhQAzvKGXeN2WyIjGIk8oMLlC2CjEGjhZxjESe
+UBBbI6WUYMTvE2uQfNh/6qZ/EaeXCF8o/wACLsnkdkBZ/Zs/om9WFvGt1l3Uz+IEWTIH0qVnyZaQ
+rqV9Rm/iYv6wIXyecyTPl1L+Y/DF5fXpTyYTGjfyDeP2HCws/pG9Xz1y689fPbl1l+1xZ1oZaGWh
+k4stDLQ37E/R/SZP6beysLCx3Mn9FkXq57s9+emVnuz0z+gz6eeuVlZ7X7M9zP6P49QUXpCi/Pou
+3jo/rMi7G72btdN0bo/qsSx24X4Tvnoz+yn9PK1MvHTLLX2s/tXCwsLHez+32f22/YP46ZWVlZWV
+lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
+lZWVlZWf0r9BZZZZWf8AHv8A/9oACAEDAAEFAv8AFuPcWfbOPVf/ABu3qQ03kGxV2h3GW4hP1GJn
+WpujNlypkLbDIw09PhEzbDI42H2JlG/gX8alrd3J3ZC+Uxpid0R+Sd2YXd1rfKJ8LX4F1H+VRDMl
+3S6jp62MNLwuzFYnjkGOq0imieMvYhrC8IEabwz+UH4ZsvIh8MKBvJp/x/1H8KkP9bGSOEdEY1yl
+QV3NHCQvUDAzFqP2sJkK3zTyE6aUmTG7LfNPKb/sTeo/ulvaj/pXTek6b9Y3pv8Ap8e38LHXCx7c
+ys97t7fdvb5e3XWFhY/x7//aAAgBAgIGPwLg5RkyfzqMez7QYHIlR/EvkciVGYMEQRG0VR0+p39C
+rMnbaWdHJnn4/9oACAEDAgY/AuDhjdb+wczEH6jrwZdHNj9R14MxOy7ltPsREyhxIiGJlvkLZb1H
+S59iwts2Ml5Eyxkzz2//2gAIAQEBBj8C+bN/mpiawtWw+Twt6vLar/M/Hy4VjX21bp1v+tsr3kh9
+C1jc+k1hXgY14xcVZ/Ev01rjNx8zcfN7Kxx8h2Ctc3B7Mf31l91Y41gKyrK3ortrXFga7/aXYRSy
+R8O3uPm3+YmPm4CvEawFd9Y+EfTWlc9prnN/DB92O/t+RMiYEVaTCF/DIOw9vzGufNwrHCu3yWGJ
+7BXj8I7BnXhFFjsoRKfFIbeqhhgMB8jp7a1jhbCl1G8kXu39WX0edbzT0rQtI6gFiDbOppPhmCwp
+rPiHaFA3mv6N/wB8UdHRtr9m7i16HTfmxCv7HVZD9r7/AJMsxsoxJ7hSdH08c4ke9iwTTgL42al6
+GKGZneTlh/DpztfPKsKZ3OlFGpmOwCjD0sPUTuMfAq5duLCv6Hqt0f8AvokwywWtbm6cb9mknyfD
+QJN1EmQ5SrY29JFf0PVbo/8AfRB6eaGwvql029GDH+wMPLlvrxG9YYeSy4mveGw7BVlFvJhXpp22
+ILD10PkS3qFOdoxHqqfptkiax6VP9/nA+bnUEUErRzSvfUh0nSg7vTXN/NOubmTuTFzmZ/AmGF77
+b0sEHVh5X4VH+FL0fQusMDyctDpDHT+LHfQ6lfzDWzOEVTFGL11DTMonVtEM2n2rXxFN035yQIhq
+VyFsVYeimX8tC9P0CcUjrqsO/vPZT9J0jK6RaUOpQdT2xyr4p+sVp9Spo5S6dRxNSvJ1CxRxkKCI
+gSSa+DWRJ4hNyuADV4tOyiF/MEgH/qKxkjea50P5ik0pYKseiP7DXW9T1IQyqwhibSLNrzBGWVfm
+PXvHCnw8OmNo4Y4zzJMsVAoznLp0LD/M3hH1+RkHFOwT1Zn6qnlj6YzarJq1BALY2xoR9T0bKzDU
+LOrYeqknj4ZFDC+eNTpB/GdCqXwzo9RJ03M8JVQJEGJ9dJ8T0RUPw+8U5eik6mIEK18GzBH9ggb6
+wHlsguavIfUKsot5MPKKlbtf7B8j35DyMK6dPxBx/oJ+z5TlbIlC+s41CnUQB3jQLjf0n6TU3WQd
+OqTIjaWF73ItRnChTEh0nvbCoOmJuIwXNjtbD7Ki53hLXk0e0Wb+6pPzYx8uEkLcZdnr9NCLBW6U
+eO2Fx+L76SaRr6pTO/qOqum6YNbTeVh/mwH21zDxWedvs+gU3VltTQI8/wC0Bh/qIrn9Q4flhn8e
+1jht9N6g6eFlGi7PoAzOWVdF0Wo+8LdS/rwX6Kjgx/7kvMbt0p+gqSVBjM/0J/efJFEwuFXVj+t/
+hUQuow1HLNqZY/FiI0tS9O+pmVQPDb76QzXHMxGFCVCAp7cDSxL4ggt24mo47WKriO84n+wdQrEV
+ZRc1eQ/sirLgPJh5t6lHZJ9g+RtsX6/I3oqA/hV2P7hH2/KGR+mhZziWMYJ8ljiDmDX9JB/LWtSd
+NCrDIrGoNapYY5HHtOgY1oIBTLTbw29FHR08S6hpayAXB2GtUMEUbZakQKbVrlgikfLU6BjXKZFM
+VtPLt4bDZajyoIo9Qs2hALjsr+kg/lrX9JB/KWhzOnifSNK6kBsBspVkgidUwQMgIUd1BI1CIMkQ
+aQPJ72NJLZa1DV/TQ/yxV4okjPaigGtbRRs/42UE1plRZB2OL1/TQ/yxWqOGNG/EqAH+wrUaAvjt
+rOsPPPop0/GNQ/Z/x+Qv2V3nySnaRpHpNdX1fsxpyx6XP/5+Y96w21qGNZeTPzT3VqHsHWveppXU
+3VhcHzwnbnV/JyFOWJ9JqPmC00/vpP2shu+U+HfqYw/i1XdbKUIFjjnjRgjYmQa80dR7ttLWJFjY
+9lNPjpCSzKLYtHCbFhsscCMcb1LO99ESM7WzsovSwf8AKzaLdl0Z747PCcRtpJ1fXFIxjjMatJqZ
+b3sFB/CalLCZVhNnYwS24Q34cM9vm6X7NTkZIn4m7B+mQNtc8qxJe2p2Ci/rp0+LiGm2JkSxB7Df
+9N1QGNhInUOY43QhluFZs/2TSlS2hxEUfQ1jz2ZV2XGK5nDKpDIsp5S6m0wyMMBfitp+mtKCQG1/
+HFJGN7qPM1zypEl7anYKL+umj+Li8KhtfMTSdV8Ab5i2NL1CMJYmZUVoyGF3cJ9ZrkP1MYezavGt
+lKECxxzxopcawASu2xy+qilxrABK7bHL6vKUuNYAJXbY5fVRAIJXBgNhtf7fIHQ6kYXVhiCD5Qmo
+a2blgZ+PTrt+7j5hjm6qKOQZo7qpHqJqMp1MeuUDTEXXXdtlr51LzpFhWJxEWkIUFigfC/caEnTy
+K1wrMgILLq2NbI0HTqI2Rm5asHUgufZ9PdSRs4Ekl9Ck4tbOwrk6xzra+Xfxacr27K5DTxifAcou
+Ndzlh5hdyFRcWY4AAUrTuImcrpjchX0s2kNpJy2+ihJCwkjOTqbj6KwwOqRQpz90+hjvoowluPww
+yuN6qRUbIs3vbFbwyW8X62m3rvamgjSWSdf+NY2H+p9K2wON8aUr00qxNlK3L0/Q5OOyw8ttorH1
+13eZgxrOsqxU1rjHvUxXvHZXwkp8DH3R7D2eeX3eQuT4vYFc+cX6KA65SfaOwev6vk1axMd/Hb6K
+LPw38BPZXUFZEEfK/M7KUJOnnDUL68zsNsO+nAcSfEzdRDKi3EkYSSVr3U4Dxdl7tnkKEzQxTxjo
+V5ZkaxitFiVGhvF33GzsvXURDo+ngQBpLxWcLpRiWsyJibBLjHG+yghimIQm3w69GsNiGGAcA2s7
+YNfPbnUE0qc6eWJPYLeKRMT4Y5LYE+zbZQKwJNddOHTyqQjgM7DTG2u4cDEIOwAN5VuDyyNmHioM
+cJTfQzC/oJGFRxwN1WmaSzuvwp1nlE4a8b+HbhbAbKMchLwOAF6eQJ4F04r4cM792wYVD0Tvrhif
++Mb+9MOIW/4lOLY46f8AMF6P3MB1SaedKvMOEch0lMMNvHnsqLpynu4TF7vWngWBmYPf4cXDasLG
+5xvt0kx9Gr6WfqppZI4XLpq1t/yI9l1ZWxwGWaD4LkTQXfnqsK3cixQ8otYWcFQTc+rGjpxax0jv
+pEUN/wDW+NFUcxsfbW1x+8CPooxfGyfGWCzye40GOPEaV0Z+PL2b438OqIchJG5sQ5sgDBNUqDLM
+32jDDbXMjfQ/TOvSBeZH4RK8eAA6YDEaSOz6KkEmMg6bp9Zzx1S9y/UK6uOBjzEghkhS9gZA8pt6
+G0gN3V1H5h0j3iYxx9Ox8KcsEB5MQbEFnuSMlGFSRT6QoCskfNadxe97s6qbYYXvtqb4eRE9xDq5
+iGT25ex1r8wZnXm/ERh5VXSFRkhDNYlraVxxwr4RHdoZImaXVI7MhuAtmJ1DV4tuzDbX5UqSyp8R
+y+baR+H4d2sLk2H+W31V+Yus0v8A0tXww5jYEQrJjj48T7d66qeHwr0a6dbTNEBLpDiyKtn4lwc9
+1u0Am4XrbKOwfBX+3ya1BNiNds9NSHHkjhvjjXPh6lokjF5EHKAKi9/FIpsfSbejOsJ3fo1HKgik
+CXATC50qDfC1jltxwE83Swp0t51hsnLRk5kcekE8qTMkYLke0YiXp5nv0/TWhjTUrW8CMMokJwOd
+/Vtrp4nuA3XdV4hxA/8AYsR3jMV0nWddZHWUx9iqscEutvFkGa5vtULXxHwM/P5/xOr3d9F9NtOu
+9+T4bWz78a64QJDL08si+8diRZoI/ZC2YW/WF6SPUX0ALqfFjbafI0VmEmrwW/DswqwVTJ4T48VD
+DG/qzFdMBJZeoCTqOYqXlwmb/wDnf2rtbV9FdO/XCKVGtPNJOFdFj0bBZLHHvsL4100nSQww9S8f
+VTKJI8g0iFFOmxBAbT3Y0kr9OebykWRShlCnFrA/DTD2swa/L5GiI1WCusdsWiOZ+HW/8w9uNSxr
+08ksTfCxuxSye7nYtxWuLH2QRSSxQqg/7cbNGgUeGdQgOkdg8lqvsNathwNd/wAhbbspup6dcM5Y
+x9YoQ9U3+WX/AHffV1fDfWYNZViDVl31ajqa7/hq1/B7TbAKjPTPq1C5ce21d/yj6+ljYyFi7FfF
+dzc+LPbRMa6SxJY7Tdi31sa+D0/9fRytFzwW02vnlTwyC8cgKuO44Gixea5N8J5gNwek6bSeRGAF
+TU1rKLWOOI7jTLNEJA7iVg2PjUAA7hbzCpv4hY2JB3ilLGYlTdb9RNgbW/H30UJkdCQWV5pXBtsO
+pjhjiMjXIaNTBYDlEDTYZYUjhSZEwV3ZnbbtYntNuy57aC2YEEnmCRxIb9r31HIZnYOymLgnXbX4
+mxCi2k48P6uVDqdI54Ux69ukm9vM0uWAvfwO0Z3oRSwclREhuiqNOlu1bZHvFRgqX5Ruhdmds75s
+STjY49g7BSPIupozdT+noB9IB2Vr6jp45XAsGdAxt66tDGsYtbwALhcnZ6TQjhQRxjJFFh9FaII1
+iQm+lAFF/VRew1kAFtthl9dEgWLG7HtNrfZWjp41iQm+lAFF/VRkSFFkY62cKAS2OPpxNOpQESfx
+Bbiwtj24YVzJYUeS2jWygnSdnoxrVoGq+u9sdVtN/TbDzOdIC7ggqHZmQEZEKTpB7wK59istwWZG
+ZNVstWkjV+1WiFdC3vYfp6h2DCtEK6Fvew/T1DsGFBYYUjAOsBVA8VrXw22wrTKgcdjC+Yt9Rt5L
+RIEHYotkLfULeanT2IjisI9LEMukWwYG+WGdImnwRkFEGCjTlh3bKMwX3rYFv09A3Dso/EQJIbad
+TAardxzpTD08aMmCuFGrszzrRJcpmVuQD3G2Y7jhQkjTQww8HhBAFhcDOwyvl5lj6DWk5ir/ACH6
+3bRm6X3U21fYb7q5UylB+FsUPo/ur3qlT+riPvr+MPXh9dfx131gxb0YfXatHTYXy04nfXO68np+
+nz0njPq++mJkCp/6+KXd99RmFdPSxH3cLY76+M6I2k/5Iu+u8Zj5kdxrWPX8lY0VZQyn2WFxV4w0
+J/8AmcNxvXuusNuwr/fWPWf6T99X6meST0WX76vDCof8ebbzXhGIrUuHULl391EgWYcS0Nq7R20J
+ekOlhxKTeu8Zr8ydO6r/APga19dc6Ie/GY/FWtM/aWg6H00JFNm21qXi2r8x/TVxn/4VxlR6iEeP
+217e+uZHntFXBoG9cwC18/LwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ
+3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1c
+J3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwndXCd1cJ3VwHdXAd1
+cB3VwHdXAd1cB3VwNurgbdXA26uBt1cDbq4G3VwNurgbdXAd1cDWPdXAd1cB3VwHdXAd1cB3VwHd
+XAd1cB3VwHdXAd1cDbq4G3VwNurgbdXA241/DbcasY2t6KtobdTdTFE2nOQW+muZHntFL1k8T8ps
+Yk0nHv8ARX8J/wB01/Cf901/Cf8AdNZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ
+1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1nWdZ1
+nWdZ1nWdZ1nWdZ1nWdZ1nWdXvWNfE8s56uTf3d/RWdZ1nWfzf//aAAgBAQMBPyH+Yf8Ay0sH5Q6m
+HKILngluh6sq3YnC0LgtrmyrJVj6/wBPNAQ5mIHvKGhLC3B1Zz/mAQ9YJ1Tqs1/7NzSBfQ8TRFh9
+BKpgJMJy5eC5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cvhcvhf/lpdINtA
+80NEcDAFzmNRY2Kc0dsOlse7/IlcAL5B7zl1dpkz+t/m4t0vma+0BSctHT56MEF5/UejOd5uCUhG
+KrE79ErDxuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly/Bf8A4TREFzVA
+t5g0IsvpmcjpvOoEcP7Eblo92Z6i8n+IdBSj0EP+xoQ0aek6ofSdduuEJSgRW4npOizh/K2Yrd1w
+580e0YeIox9eNy5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXL4XL+rS6F
+wTXHeBarhpiXGGfyNOd6RNADeANGegyzIPYhDgZvVNVNLqjyqAFmec0BgjWKl2awWC3CJau4wtZt
+el6Oe0qJGKIAqNRy4XLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLl
+y5cv6PPK5g0xGExgvrJ6EzWP7zlVurHogX9xJkF5BmFVRvzmmgLnMgJ01L7SoqBT0CVuBVwg4DGO
+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
+cHLGor/QlXdM5qvPD3iO+89L1gy5cuXLly/GAxUT7IbUB7A/fSPww9T/ALK4fIck6MFqjRzJy99D
+8kIi/wBEXZcxPL8oicjkgXdZo1Lly5cuXLl+MBCI6TqvnKFyf2N/zP8AYD/7AVLrBXl0iUwG9z14
+/OJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ8
+4nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifOJ84nzifPJ8+nz6fLp8unyafJp8mnzafMp86nzq
+fKp8qnyKfJJ80nzSfNZ89ny2UKfexq5nLKF4i90wruTDEHN7p8qnyqfKp8qnyqfKp8qnyqfIp8on
+yCfIJ80jGvKL8RTeN8SH3sLGHV6Opxp1n+6HAXgGYPJ49HXtr5w/U8ofqeUP1N57zee83nvN57ze
+e83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN
+57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee8
+3nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvN57
+zee83nvN57zee83nvN57zee83nvN57zee83nvN57zee83nvM6L7w+dTpAf8Auhcl1tdbVAShVN57
+zee83nv/AF//2gAIAQIDAT8h/p1y5cuX4Tgv6fcuXwvguXLl+Mf6XcvjfBcGynBZKI8Z4B/o98F+
+FfEprwF8RYRrErxL+kl+BcIKz4y4M1mniH+gL418b4mKPjIofEPisVEq8cNR7P8APpsvCvvLCThQ
+uFtCX6efeJyRxKXRL9PPvHWn8AkrhZ4FS/AcD9EmpD6dYxswTG4jpCrY5ytT9zGF605kVLzLjqYn
+IZ3lEBfrBOVi9Zp5veUBQd2CBprD1eXquJRTq8KKSxkLiaiUrgXCMXU1wlG/4Bl1FXjU2eIhpH6B
+xc/qavrMqjVsHibFj49YHPVLGu0KtrYa/ltMQdKgq30mC7E9co8+kpoc5ctm2GIJnoi09P3wUIgo
+Vw4A0l0VfwJIzhNn0CGkfp+f1BHN9+FTce8tc33hZopKirm+8VdVfWCminrKjbqr6zde83XvBTRf
+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
+lVFS91eLfNKMAAINgaEA4WhgF2O+5XrcuZsIjnH24Yk6UvlUP2/j3gxjHgx4MY8GMYxmRa4+jME4
+9EGjAHck6/8AEzRYWtuUQdYw/QBuxvyZqpC49xT7RF8eotwobOGmPNDR5RrI+Vc+zCs3UjuJpO1t
+5U8WofrlEeghK4kvQshw2h8Bzf8Alydo9942QpQ5Dmc5bQqW0M2BlWvcKDnumMB/kQJ0iapzPKu2
+l/OPbOsZdXrGjnHXl/GvB4MY6R4vBjHgxjGMwbpjBTGvJ3NIB63B2RAsFptzJVD4ktPqnwvAhkDk
+desB1gvFbTtNXPTpT+RnBSjVDkOfWOOWp7oJj4ctydHqdGVtKLzr2f17QzDfQP8AZrzR0P454PBj
+HSMeDwYx4MYxjLRE1NJjjmXLO9afb/sJYFt3OXrDfIMnR5kt6Tl2+qPgwwddopHpHQ7zm20HKQQd
+JqBy8z8tVodQ6byHnowPyJKGVi7RNzMkoXUG/wB3PHyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8
+mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8m
+fqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/U8mfqeTP1PJn6nkz9TyZ+p5M/UfNn
+4nmT9R8wfiecP1PKH6j5Q/EfJH4j5o/E80/qeWf1Hyr+J5n/AFHzP+I+V/xPL/6nm/8AUfMf4j5T
+/EfKf4j55/EfNP4j5N/ECgK0vm+kaqqZXPPSCEwyJo+0VWsrVfsc4MSl5dIVeX9p5n/U8z/qPnf8
+Tzv+p5//AFPP/wCp5/8A1PN/6nnv9TzX+p5r/UfIf4nL+c2i4j1cUfxMBs+XEOLSUxMg0c3TrpdJ
+x6w0PU3ltuhF89Sanu5IpwVcVy5fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+
+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6f
+Pp8+nz6fPp8+nz6fPp8+nz6fPp8+nz6ILq1FQGssLVEeTMjJiZRbLrme35EGAgoBQAnz6fPp8+/r
+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
+b5/gHmWQK8FeLR9IMeHlweDHx+jETAsQl1QQgrTkSnZgDo57x1rRFA9X+ypXrf7ip6nvKJ7/AOIt
++gvn1htsqzK6DGtQ+p/CJI6r9oaJzfjgwTlV7Fw22C5Hlj83B5APm7VLRATVeuwwJY3pz3/yI1ZO
+mTrrEeYu2DH5uV22XjsYPsfwL4DMr6D9IMeF04sY+NRbRfaLbcGpX/BCmgekUdQXcl4IaD2ghoB2
+Io6g9ydhXTlBDQD0lf8ABK/4Io6h9Io6g+kXlocBK7ap+GeRv3KwDdP5ZtFAA9rqO2Fsp+J5G/cr
+Tuin5f4JRXBK4X42DNxQfGxmtOF4PB/oKpimeUbqW6S5fiuIoMv6FZmLPhfHeKJaBfBaX8JAXLy0
+tC8aeALl5aXr6deATFEtFEtKxKlq8AQbKYoheLOGjnwWINkXgrwXwoycAZcuXLlxgF1HCjxPhVG0
+bWYf5GDmLMIDMtxddpalwpIuYxURwiixrxZH3hFxpHUsjpDlKzXBZU5zeLrOZBHTz14NDEa30i4L
+lZdXOVExpcaKjwTe8NZZGrxHDMwPP+zS+f3DBrHj24OKXT9C5fBjJCCLly4wC8QxBcryeF8dpcvN
+walpbLeC5aWly2WlsvjcGpbLZcFJfBb4rctly2X4LZbLuLcVl8F43wt1ly4I0imDUtwGuA2RcvBf
+guXDgBLSUOU7ILB5ywwQ4NJzz+jrEUcZl8Lly5fG5cuHDpwKZcOK5zDwX/QlwuDWJcuXLly5cuXL
+ly5cuXLgyjwX5Isf6KGMG+F+G5cuXLly5fC4M5T4EaeO1NqbU2ptTam1NqbU2ptTam1NqbU2ptTa
+m1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1Npm0zaZt
+M2mbTNpm0zaZtM2mHSZtS3SAOkt0lukt0mxLdJsS3SbE2JsTYmxNibE2JsTYgPSNonDRBmyzYZsP
+9ar+x//Z
+
+--=====002_Dragon172714510278_=====
+Content-Type: image/gif;
+ name="bot(06-26-10-58-52).gif"
+Content-Transfer-Encoding: base64
+Content-ID: <__1@Foxmail.net>
+
+R0lGODlhEwALAMQdAAY4m/Dz+U5xuAM1mgw9ntLb7ZOp1MnU6UtvtxVEoTZerxhGoz9lsrrI49jg
+7/b4+zxjsfz9/s/Z7B5LpQk6ncDN5qW324qh0FF0ucPP52OCwZ+y2QAzmf///wAAAAAAACH5BAEA
+AB0ALAAAAAATAAsAAAVPYNcVyMItyCGurGgAXBwPV8tmg6xzjS0KsoZCx/B1ErJAxzKJASI+nbLz
+gMSmLeS1IxlyAEZgzKEhGg85DmFXMXY2lB3A4BY5MGuCoFAPAQA7
+
+--=====002_Dragon172714510278_=====--
diff --git a/etc/samples/mailboxes/imagined.mbox b/src/test/resources/samples/mailboxes/imagined.mbox
similarity index 100%
rename from etc/samples/mailboxes/imagined.mbox
rename to src/test/resources/samples/mailboxes/imagined.mbox
diff --git a/etc/samples/mailboxes/parseexception.mbox b/src/test/resources/samples/mailboxes/parseexception.mbox
similarity index 100%
rename from etc/samples/mailboxes/parseexception.mbox
rename to src/test/resources/samples/mailboxes/parseexception.mbox
diff --git a/etc/samples/mailboxes/received-0xc.mbox b/src/test/resources/samples/mailboxes/received-0xc.mbox
similarity index 100%
rename from etc/samples/mailboxes/received-0xc.mbox
rename to src/test/resources/samples/mailboxes/received-0xc.mbox
diff --git a/etc/samples/mailboxes/samples.mbx b/src/test/resources/samples/mailboxes/samples.mbx
similarity index 100%
rename from etc/samples/mailboxes/samples.mbx
rename to src/test/resources/samples/mailboxes/samples.mbx
diff --git a/etc/samples/mailboxes/subject-0x1f.mbox b/src/test/resources/samples/mailboxes/subject-0x1f.mbox
similarity index 100%
rename from etc/samples/mailboxes/subject-0x1f.mbox
rename to src/test/resources/samples/mailboxes/subject-0x1f.mbox
diff --git a/etc/samples/messages/sample1.msg b/src/test/resources/samples/messages/sample1.msg
similarity index 100%
rename from etc/samples/messages/sample1.msg
rename to src/test/resources/samples/messages/sample1.msg
diff --git a/etc/samples/messages/sample2.msg b/src/test/resources/samples/messages/sample2.msg
similarity index 100%
rename from etc/samples/messages/sample2.msg
rename to src/test/resources/samples/messages/sample2.msg
diff --git a/etc/samples/messages/sample3.msg b/src/test/resources/samples/messages/sample3.msg
similarity index 100%
rename from etc/samples/messages/sample3.msg
rename to src/test/resources/samples/messages/sample3.msg