diff options
Diffstat (limited to 'spamassassin/fuzzyocr')
-rw-r--r-- | spamassassin/fuzzyocr/FuzzyOcr.cf | 124 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/FuzzyOcr.pm | 864 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/FuzzyOcr.words | 45 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/INSTALL | 119 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/LICENSE | 202 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/README.weasel | 2 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/samples/README | 61 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/samples/animated-gif.eml | 579 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/samples/corrupted-gif.eml | 227 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/samples/jpeg.eml | 426 | ||||
-rw-r--r-- | spamassassin/fuzzyocr/samples/png.eml | 318 |
11 files changed, 2967 insertions, 0 deletions
diff --git a/spamassassin/fuzzyocr/FuzzyOcr.cf b/spamassassin/fuzzyocr/FuzzyOcr.cf new file mode 100644 index 0000000..c750384 --- /dev/null +++ b/spamassassin/fuzzyocr/FuzzyOcr.cf @@ -0,0 +1,124 @@ +loadplugin FuzzyOcr /etc/spamassassin/FuzzyOcr.pm +body FUZZY_OCR eval:fuzzyocr_check() +describe FUZZY_OCR Mail contains an image with common spam text inside +body FUZZY_OCR_WRONG_CTYPE eval:dummy_check() +describe FUZZY_OCR_WRONG_CTYPE Mail contains an image with wrong content-type set +body FUZZY_OCR_CORRUPT_IMG eval:dummy_check() +describe FUZZY_OCR_CORRUPT_IMG Mail contains a corrupted image +body FUZZY_OCR_KNOWN_HASH eval:dummy_check() +describe FUZZY_OCR_KNOWN_HASH Mail contains an image with known hash + +priority FUZZY_OCR 900 + +########### Plugin Configuration ############# + +#### Logging options ##### +# Verbosity level (see manual) Attention: Don't set to 0, but to 0.0 for quiet operation. (Default value: 1) +#focr_verbose 1 +#focr_verbose 1 +focr_verbose 2 +# +# Logfile (make sure it is writable by the plugin) (Default value: /etc/mail/spamassassin/FuzzyOcr.log) +# obsoleted by weasel +#focr_logfile /var/lib/FuzzyOcr/log +########################## + +##### Wordlists ##### +# Here we defined the words to scan for (Default value: /etc/mail/spamassassin/FuzzyOcr.words) +focr_global_wordlist /etc/spamassassin/FuzzyOcr.words +# +# This is the path RELATIVE to the respektive home directory for the personalized list +# This list is merged with the global word list on execution (Default value: .spamassassin/fuzzyocr.words) +#focr_personal_wordlist .spamassassin/fuzzyocr.words +##################### + +# Set this to 1 if you are running a version < 3.1.4. +# This will disable a function used in conjunction with animated gifs that isn't available in earlier versions (Default value: 0.0) +#focr_pre314 0.0 + +# These parameters can be used to change other detection settings +# If you leave these commented out, the defaults will be used. +# Do not use " " around any parameters! +# +##### Location of helper applications (path + binary) (Default values: /usr/bin/<app>) ##### +#focr_bin_giffix /usr/bin/giffix +#focr_bin_giftext /usr/bin/giftext +#focr_bin_gifasm /usr/bin/gifasm +#focr_bin_gifinter /usr/bin/gifinter +#focr_bin_giftopnm /usr/bin/giftopnm +#focr_bin_jpegtopnm /usr/bin/jpegtopnm +#focr_bin_pngtopnm /usr/bin/pngtopnm +#focr_bin_ppmhist /usr/bin/ppmhist +#focr_bin_convert /usr/bin/convert +#focr_bin_identify /usr/bin/identify +#focr_bin_gocr /usr/bin/gocr +############################################################################################ + +##### Scansets, comma seperated (Default value: $gocr -i -, $gocr -l 180 -d 2 -i -) ##### +# Each scanset consists of one or more commands which make text out of pnm input. +# Each scanset is run seperately on the PNM data, results are combined in scoring. +#focr_scansets $gocr -i -, $gocr -l 180 -d 2 -i - +# +# To use only one scan with default values, uncomment the next line instead +#focr_scansets $gocr -i - +# +# Some example for more advanced sets +# Thisone uses the first the standard scan, then a scanset which first reduces the image to 3 colors and then scans it with custom settings +# and then it scans again only with these custom settings +# NOTE: This is for advanced users only, if you have questions how to use this, ask on the ML or on IRC +#focr_scansets $gocr -i -, pnmnorm 2>$errfile | pnmquant 3 2>>$errfile | pnmnorm 2>>$errfile | $gocr -l 180 -d 2 -i -, $gocr -l 180 -d 2 -i - +######################################################################################### + +##### Various Score/Scan settings ##### +# Timeout for the plugin, in seconds. (Maximum runtime of the plugin) (Default value: 10) +#focr_timeout 10 +focr_timeout 30 +# +# Default detection treshold (see manual) (Default value: 0.3) (Can be changed on a per word basis in the wordlist). +#focr_threshold 0.3 +# +# This is the score for a hit after focr_counts_required matches +#focr_base_score 4 +focr_base_score 1 +# +# This is the additional score for every additional match after focr_counts_required matches (Default value: 1) +#focr_add_score 1 +focr_add_score 0.1 +# +# This is the score to give for a wrong content-type (e.g. JPEG image but content type says GIF) (Default value: 1.5) +#focr_wrongctype_score 1.5 +focr_wrongctype_score 0.5 +# +# This is the score to give for a corrupted image (This currently affects only GIF images) (Default value: 2.5) +#focr_corrupt_score 2.5 +focr_corrupt_score 0.5 +# +# This is the score to give for a corrupted unfixable image (This currently affects only GIF images) (Default value: 5) +#focr_corrupt_unfixable_score 5 +focr_corrupt_unfixable_score 0.5 +# +# This is used to disable the OCR engine if the message has already more points than this value (Default value: 10) +#focr_autodisable_score 10 +# +# Number of minimum matches before the rule scores (Default value: 2) +#focr_counts_required 2 +# +# Specifies, how many frames an animated gif must contain, so the second (less resource consuming) animated gif test is used. (Default value: 5) +#focr_gif_max_frames 5 + +####################################### + +##### Image Hash Database settings (Experimental, disabled by default) ##### +# +# Set this to 1 to enable the Image Hash database feature (Default value: 0.0) +#focr_enable_image_hashing 0.0 +# +# The score is saved with the hash in the database, so no extra scoring for a db hit is required. +# +# If the image hash database feature is enabled, specify the file here to use as database (Default value: /etc/mail/spamassassin/FuzzyOcr.hashdb) +#focr_digest_db /etc/mail/spamassassin/FuzzyOcr.hashdb +# +# Automatically add hashes of spam images recognized by OCR to the Image Hash database, to disable, set to 0.0 (Default value: 1) +#focr_hashing_learn_scanned 1 +# +###################################################################### diff --git a/spamassassin/fuzzyocr/FuzzyOcr.pm b/spamassassin/fuzzyocr/FuzzyOcr.pm new file mode 100644 index 0000000..5f5f01b --- /dev/null +++ b/spamassassin/fuzzyocr/FuzzyOcr.pm @@ -0,0 +1,864 @@ +# FuzzyOcr plugin, version 2.3b +# Changelog: +# version 2.0 +# Replaced imagemagick with netpbm +# Invoke giffix to fix broken gifs before conversion +# Support png images +# Analyze the file to detect the format without content-type +# Added several configuration parameters +# version 2.1 +# Added scoring for wrong content-type +# Added scoring for broken gif images +# Added configuration for helper applications +# Added autodisable_score feature to disable the OCR engine if the message has already enough points +# version 2.1b +# Rule bugfix to avoid warnings +# version 2.1c +# Applied patch provided by Howard Kash to fix problems with spamassassin + Mailscanner + FuzzyOcr +# Removed '-' from jpegtopnm arguments to provide backwards compatibility for older netpbm versions +# Fixed typo (treshold -> threshold) +# version 2.2 +# Small bugfix in content-type check for jpeg (jpg was not matching), thanks to Matthias Keller +# Added more error handling +# Removed debug files, added logfile instead +# More messages with verbose = 2 +# version 2.3 +# Multiple scans with different pnm preprocessing and gocr arguments possible +# Support for interlaced gifs +# Support for animated gifs +# Temporary file handling reorganized +# External wordlist support +# Personalized wordlist support +# Spaces are now stripped from wordlist words and OCR results before matching +# Experimental MD5 Database feature +# version 2.3b +# MD5 Database replaced by different feature database +# Corrupted images are now handled better +# Added a timeout function to avoid lockups +# Added threshold overriding on word basis in wordlist +# Various bugfixes +# +# +# written by Christian Holler decoder_at_own-hero_dot_net + +# syslog support added by weasel, 2006-09-28 +# +package FuzzyOcr; + +use strict; +use warnings; +use Mail::SpamAssassin; +use Mail::SpamAssassin::Util; +use Mail::SpamAssassin::Plugin; +use Sys::Syslog; + +use String::Approx 'adistr'; + +use FileHandle; +use Fcntl ':flock'; + +our @ISA = qw (Mail::SpamAssassin::Plugin); + +our @err_msges = ( + "Failed to open pipe to external programs with pipe command \"%s\". +Please check that all helper programs are installed and in the correct path. +(Pipe Command \"%s\", Pipe exit code %d (\"%s\"), Temporary file: \"%s\")", + "Unexpected error in pipe to external programs. +Please check that all helper programs are installed and in the correct path. +(Pipe Command \"%s\", Pipe exit code %d (\"%s\"), Temporary file: \"%s\")", + "Cannot open \"%s\" to read previously produced data! +(Previously used pipe: \"%s\", error code %d (\"%s\"), Temporary file: \"%s\")", + "Unexpected error while trying executing gocr with arguments \"%s\". +Make sure the gocr location is specified correctly and the arguments are correct.", + "Failed to open global wordlist \"%s\" for reading. +Please check that path and permissions are correct." +); + +our @words = (); +our $self; +our $pms; + +# Default values +our $threshold = "0.3"; +our $base_score = "4"; +our $add_score = "1"; +our $wctypescore = "1.5"; +our $cimgscore = "2.5"; +our $cimgscore2 = "5"; +our $countreq = 2; +our $verbose = 1; +our $timeout = 10; +our $pre314 = 0; +our $enable_image_hashing = 0; +our $hashing_learn_scanned = 1; +our ($ts, $th, $tw, $tcn, $tc, $hash_ccnt) = (0.01, 0.01, 0.01, 0.01, 5, 5); +our $giffix = "/usr/bin/giffix"; +our $giftext = "/usr/bin/giftext"; +our $gifasm = "/usr/bin/gifasm"; +our $gifinter = "/usr/bin/gifinter"; +our $giftopnm = "/usr/bin/giftopnm"; +our $jpegtopnm = "/usr/bin/jpegtopnm"; +our $pngtopnm = "/usr/bin/pngtopnm"; +our $pnmfile = "/usr/bin/pnmfile"; +our $ppmhist = "/usr/bin/ppmhist"; +our $convert = "/usr/bin/convert"; +our $identify = "/usr/bin/identify"; +our $gocr = "/usr/bin/gocr"; +our $grep = "/bin/grep"; +our $max_images = 5; +our $dscore = 10; +our $logfile = "/etc/mail/spamassassin/FuzzyOcr.log"; +our $pwordlist = ".spamassassin/fuzzyocr.words"; +our $digest_db = "/etc/mail/spamassassin/FuzzyOcr.hashdb"; +our @scansets = ( + '$gocr -i -', + '$gocr -l 180 -d 2 -i -' +); + +# constructor: register the eval rule +sub new { + my ( $class, $mailsa ) = @_; + $class = ref($class) || $class; + my $self = $class->SUPER::new($mailsa); + bless( $self, $class ); + $self->register_eval_rule("fuzzyocr_check"); + $self->register_eval_rule("dummy_check"); + return $self; +} + +sub parse_config { + my ( $self, $opts ) = @_; + if ( $opts->{key} eq "focr_global_wordlist" ) { + load_global_words( $opts->{value} ); + } + elsif ( $opts->{key} eq "focr_personal_wordlist" ) { + $pwordlist = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_threshold" ) { + $threshold = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_base_score" ) { + $base_score = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_add_score" ) { + $add_score = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_corrupt_score" ) { + $cimgscore = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_corrupt_unfixable_score" ) { + $cimgscore2 = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_wrongctype_score" ) { + $wctypescore = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_counts_required" ) { + $countreq = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_verbose" ) { + $verbose = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_timeout" ) { + $timeout = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_scansets" ) { + parse_scansets( $opts->{value} ); + } + elsif ( $opts->{key} eq "focr_pre314" ) { + $pre314 = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_giffix" ) { + $giffix = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_giftext" ) { + $giftext = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_gifasm" ) { + $gifasm = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_gifinter" ) { + $gifinter = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_giftopnm" ) { + $giftopnm = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_jpegtopnm" ) { + $jpegtopnm = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_pngtopnm" ) { + $pngtopnm = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_ppmhist" ) { + $ppmhist = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_convert" ) { + $convert = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_identify" ) { + $identify = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_gocr" ) { + $gocr = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_bin_grep" ) { + $grep = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_gif_max_frames" ) { + $max_images = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_autodisable_score" ) { + $dscore = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_enable_image_hashing" ) { + $enable_image_hashing = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_digest_db" ) { + $digest_db = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_hashing_learn_scanned" ) { + $hashing_learn_scanned = $opts->{value}; + } + elsif ( $opts->{key} eq "focr_logfile" ) { + $logfile = $opts->{value}; + } +} + +sub dummy_check { + return 0; +} + +sub fuzzyocr_check { + ( $self, $pms ) = @_; + my $t = Mail::SpamAssassin::Timeout->new({ secs => $timeout }); + $t->run(\&check_fuzzy_ocr); + if ($t->timed_out()) { + logfile("FuzzyOcr received timeout after running \"$timeout\" seconds."); + } + return 0; +} + +sub load_global_words { + unless ( -r $_[0] ) { + handle_error( $err_msges[3], ( $_[0] ) ); + return; + } + open WORDLIST, "<$_[0]"; + while(<WORDLIST>) { + chomp($_); + if (( $_ =~ /^[ \t]*#.*$/ ) or ( $_ =~ /^[^a-zA-Z]$/ )) { + next; + } + $_ =~ s/[ \t]*#.*$//; + push( @words, $_ ); + } + close WORDLIST; + return 1; +} + +sub load_personal_words { + unless ( -e $_[0] ) { + debuglog("No personal wordlist found, skipping..."); + return; + } + unless ( -r $_[0] ) { + debuglog( +"Unable to read from wordlist \"$_[0]\", please make sure that permissions are correct." + ); + return; + } + open WORDLIST, "<$_[0]"; + while(<WORDLIST>) { + chomp($_); + if ( $_ =~ /^[ \t]*#.*$/ ) { + next; + } + $_ =~ s/[ \t]*#.*$//; + push( @words, $_ ); + } + close WORDLIST; +} + +sub parse_scansets { + $_[0] =~ s/,[ ]*/,/g; + @scansets = split( ',', $_[0]); + debuglog( "Set scansets to values:\n" . join( "\n", @scansets ) ); + return 1; +} + +sub max { + unless ( defined( $_[0] ) and defined( $_[1] ) ) { return 0 } + unless ( defined( $_[0] ) ) { return $_[1] } + unless ( defined( $_[1] ) ) { return $_[0] } + if ( $_[0] < $_[1] ) { return $_[1] } + else { return $_[0] } +} + +sub reorder { + my $tmp = join( '', @_ ); + return split( '\n', $tmp ); +} + +sub pipe_io { + $SIG{PIPE} = 'IGNORE'; + my $pipecmd = shift; + my $input = shift; + my $filecount = 0; + my $silent = 0; + my $ignerror = 0; + my $tmpdir; + my @stdout = (); + my @stderr = (); + my ( $tmpfile, $tfilepath ) = Mail::SpamAssassin::Util::secure_tmpfile(); + my ( $errfile, $efilepath ) = Mail::SpamAssassin::Util::secure_tmpfile(); + close($tmpfile); + close($errfile); + if ($tmpfile eq $errfile) { + debuglog("Got same tmpfile twice! Aborting pipe_io() to avoid deadlocking"); + return ( 1, \@stdout, \@stderr ); + unlink($tmpfile); + } + + if($pipecmd =~ /\$tmpdir/) { + $tmpdir = Mail::SpamAssassin::Util::secure_tmpdir(); + $pipecmd =~ s/\$tmpdir/$tmpdir/g; + $filecount = shift; + } else { + $silent = shift; + $ignerror = shift; + } + + $pipecmd =~ s/\$errfile/$errfile/g; + my $pipe_pid = open( PIPE_IN, "| $pipecmd 1>$tmpfile 2>>$errfile" ); + + unless ($pipe_pid) { + unless($silent) { + handle_error( $err_msges[0], ( $pipecmd, $? >> 8, $!, $tmpfile ) ); + } + unlink($tmpfile); + unlink($errfile); + return ( $?, \@stdout, \@stderr ); + } + flock( PIPE_IN, LOCK_EX ); + print PIPE_IN $input; + flock( PIPE_IN, LOCK_UN ); + close(PIPE_IN); + if ($? and not $ignerror) { + unless($silent) { + handle_error( $err_msges[1], ( $pipecmd, $? >> 8, $!, $tmpfile ) ); + } + unlink($tmpfile); + unlink($errfile); + return ( $?, \@stdout, \@stderr ); + } + if ($filecount) { + my $tsize = 0; + my $tcount = 0; + foreach my $nr (0..$filecount-1) { + my $filesize = 0; + if ($nr < 10) { + $filesize = -s "$tmpdir/out0$nr.gif"; + } else { + $filesize = -s "$tmpdir/out$nr.gif"; + } + if ($filesize > $tsize) { + $tsize = $filesize; + $tcount = $nr; + } + } + if ($tcount < 10) { + open( PIPE_OUT, "< $tmpdir/out0$tcount.gif" ); + } else { + open( PIPE_OUT, "< $tmpdir/out$tcount.gif" ); + } + flock( PIPE_OUT, LOCK_EX ); + @stdout = <PIPE_OUT>; + flock( PIPE_OUT, LOCK_UN ); + close PIPE_OUT; + foreach my $nr (0..$filecount) { + if ($nr < 10) { + unlink("$tmpdir/out0$nr.gif"); + } else { + unlink("$tmpdir/out$nr.gif"); + } + } + rmdir($tmpdir); + unlink($tmpfile); + unlink($errfile); + return ( 0, \@stdout, \@stderr ); + } else { + unless (open( PIPE_OUT, "< $tmpfile" ) + and open( PIPE_ERR, "< $errfile" ) ) + { + unless($silent) { + handle_error( $err_msges[1], ( $pipecmd, $? >> 8, $!, $tmpfile ) ); + } + unlink($tmpfile); + unlink($errfile); + return ( $?, \@stdout, \@stderr ); + } + flock( PIPE_OUT, LOCK_EX ); + flock( PIPE_ERR, LOCK_EX ); + @stdout = <PIPE_OUT>; + @stderr = <PIPE_ERR>; + flock( PIPE_OUT, LOCK_UN ); + flock( PIPE_ERR, LOCK_UN ); + close(PIPE_OUT); + close(PIPE_ERR); + unlink($tmpfile); + unlink($errfile); + return ( 0, \@stdout, \@stderr ); + } +} + +sub handle_error { + my ( $err_msg, @var_vals ) = @_; + $err_msg = sprintf( $err_msg, @var_vals ); + logfile($err_msg); +} + +sub logfile { + my $logtext = $_[0]; + my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time); + my $time = sprintf( + "%4d-%02d-%02d %02d:%02d:%02d", + $year + 1900, + $mon + 1, $mday, $hour, $min, $sec + ); + #$logtext =~ s/\n/\n /g; + #unless ( open LOGFILE, ">> $logfile" ) { + # warn "Can't open $logfile for writing, check permissions"; + #} + #flock( LOGFILE, LOCK_EX ); + #seek( LOGFILE, 0, 2 ); + #print LOGFILE "[$time] $logtext\n"; + #flock( LOGFILE, LOCK_UN ); + #close LOGFILE; + openlog 'SA-FuzzyOCR', 'pid', 'mail'; + for my $line (split /\n/, $logtext) { + syslog 'info', $line; + } + closelog; +} + +sub check_image_hash_db { + my $digest = $_[0]; + my ($gpf, @gcf) = split('::', $digest); + my ($gs, $gh, $gw, $gcn) = split(':', $gpf); + + unless(open(DB, "<$digest_db")) { + debuglog("No Image Hash database found at \"$digest_db\", or permissions wrong."); + return 0; + } + while(<DB>) { + chomp($_); + my ($score, $dpf, @dcf) = split('::', $_); + my ($ds, $dh, $dw, $dcn) = split(':', $dpf); + if ((abs($ds - $gs) / $gs) > $ts) { next; } + if ((abs($dh - $gh) / $gh) > $th) { next; } + if ((abs($dw - $gw) / $gw) > $tw) { next; } + if ((abs($dcn - $gcn) / $gcn) > $tcn) { next; } + + my (@dcfs, @gcfs); + foreach (@dcf) { + push(@dcfs, split(':', $_)); + } + foreach (@gcf) { + push(@gcfs, split(':', $_)); + } + unless (scalar(@gcfs) eq scalar(@dcfs)) { + logfile("Error in database format, aborting..."); + return 0; + } + + foreach (0..scalar(@gcfs) - 1) { + if (abs($dcfs[$_] - $gcfs[$_]) > $tc) { + next; + } + } + return $score; + } + return 0; +} + +sub add_image_hash_db { + my $digest = shift; + my $score = shift; + my $ret; + if (-e $digest_db) { + $ret = open(DB, ">> $digest_db"); + } else { + $ret = open(DB, "> $digest_db"); + debuglog("Image Hash Database not found to add hash, creating it..."); + } + unless ($ret) { + logfile("Unable to open/create Image Hash database at \"$digest_db\", check permissions."); + return; + } + debuglog("Adding hash \"$digest\" to Image Hash database..."); + flock( DB, LOCK_EX ); + seek( DB, 0, 2 ); + print DB "${score}::${digest}\n"; + flock( DB, LOCK_UN ); + close(DB); +} + +sub calc_image_hash { + my ($rcode, $stdout_ref, $stderr_ref); + my $picdata = $_[0]; + my ($hash, $h, $w); + my @ca = ( ); + my $s = length ( $picdata ); + ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$identify -", $picdata); + foreach (@$stdout_ref) { + if ($_ =~ /([0-9]+)x([0-9]+)/) { + $h = $1; + $w = $2; + last; + } + } + if ($rcode) { + debuglog("Unable to calculate image hash, skipping..."); + return ($rcode, $hash); + } + ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$ppmhist -noheader", $picdata); + if ($rcode) { + debuglog("Unable to calculate image hash, skipping..."); + return ($rcode, $hash); + } + my $cnt = 0; + my $c = scalar(@$stdout_ref); + if ($hash_ccnt) { + foreach (@$stdout_ref) { + $_ =~ s/ +/ /g; + my($r, $g, $b, $l, $c) = split(' ', $_); + push(@ca, "::$r:$g:$b:$l:$c"); + $cnt++; + if ($cnt ge $hash_ccnt) { + last; + } + } + } + $hash = "$s:$h:$w:$c" . join('', @ca); + return(0, $hash); +} + +sub debuglog { + if ( $verbose > 1 ) { + logfile("Debug mode: $_[0]"); + } +} + +sub wrong_ctype { + my ( $format, $ctype ) = @_; + if ($wctypescore) { + my $debuginfo = ""; + if ( $verbose > 0 ) { + $debuginfo = + ("Image has format \"$format\" but content-type is \"$ctype\""); + debuglog($debuginfo); + } + for my $set ( 0 .. 3 ) { + $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_WRONG_CTYPE"} = + sprintf( "%0.3f", $wctypescore ); + } + $pms->_handle_hit( "FUZZY_OCR_WRONG_CTYPE", $wctypescore, "BODY: ", + $pms->{conf}->{descriptions}->{FUZZY_OCR_WRONG_CTYPE} + . "\n$debuginfo" ); + } +} + +sub corrupt_img { + my ($unfixable, $err) = @_; + my $score = 0; + if ($unfixable) { + $score = $cimgscore2; + } else { + $score = $cimgscore; + } + if ($score) { + my $debuginfo = ""; + if ( $verbose > 0 ) { + chomp($err); + $debuginfo = ("Corrupt image: $err"); + debuglog($debuginfo); + } + for my $set ( 0 .. 3 ) { + $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_CORRUPT_IMG"} = + sprintf( "%0.3f", $score ); + } + $pms->_handle_hit( "FUZZY_OCR_CORRUPT_IMG", $score, "BODY: ", + $pms->{conf}->{descriptions}->{FUZZY_OCR_CORRUPT_IMG} + . "\n$debuginfo" ); + } +} + +sub known_img_hash { + my $digest = shift; + my $score = shift; + my $debuginfo = ""; + if ( $verbose > 0 ) { + $debuginfo = ("Hash \"$digest\" is in the database."); + debuglog($debuginfo); + } + for my $set ( 0 .. 3 ) { + $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR_KNOWN_HASH"} = + sprintf( "%0.3f", $score ); + } + $pms->_handle_hit( "FUZZY_OCR_KNOWN_HASH", $score, "BODY: ", $pms->{conf}->{descriptions}->{FUZZY_OCR_KNOWN_HASH} . "\n$debuginfo" ); +} + +sub check_fuzzy_ocr { + my @found = (); + my $image_type = 0; + my $picture_data; + my @hashes = (); + my $cnt = 0; + my $homedir = (getpwuid($<))[7]; + + debuglog("Starting FuzzyOcr..."); + debuglog("Attempting to load personal wordlist..."); + + if ($homedir) { + load_personal_words( $homedir . "/$pwordlist" ); + } elsif (defined($ENV{HOME})) { + load_personal_words( $ENV{HOME} . "/$pwordlist" ); + } else { + debuglog("Variable \$ENV{HOME} not defined and getpwuid failed, personal wordlist function not available..."); + } + + foreach my $p ( $pms->{msg}->find_parts(qr/^image\b/i) ) { + my $cscore = $pms->get_score(); + if ( $cscore > $dscore ) { + debuglog( + "Scan canceled, message has already more than $dscore points."); + return 0; + } + my $ctype = $p->{'type'}; + if ( $ctype =~ /image/i ) { + debuglog("Analyzing file with content-type \"$ctype\""); + $picture_data = $p->decode(); + my @used_scansets = (); + my $stdout_ref; + my $stderr_ref; + my $rcode = 0; + my $corrupt = 0; + my $digest; + if ( substr($picture_data,0,3) eq "\x47\x49\x46" ) { + + if ( $ctype !~ /gif/i ) { + wrong_ctype( "GIF", $ctype ); + } + $image_type = 1; + my $interlaced_gif = 0; + my $image_count = 0; + + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( $giftext, $picture_data, 1, 1); + + foreach (@$stdout_ref) { + unless ($interlaced_gif) { + if ( $_ =~ /Image is Interlaced/i ) { + $interlaced_gif = 1; + } + elsif ( $_ =~ /Image is Non Interlaced/i ) { + } + } + if ( $_ =~ /^Image #/ ) { + $image_count++; + } + } + + + if ($interlaced_gif or ($image_count gt 1)) { + debuglog("Image is interlaced or animated..."); + } + else { + debuglog("Image is single non-interlaced..."); + ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io( "$giffix", $picture_data, 0, 1); + $picture_data = join('', @$stdout_ref); + } + + foreach (@$stderr_ref) { + if ( $_ =~ /GIF-LIB error/i ) { + $corrupt = $_; + last; + } + } + + if ($corrupt and ($interlaced_gif or ($image_count gt 1))) { + debuglog("Skipping corrupted interlaced image..."); + corrupt_img(1, $corrupt); + next; + } elsif ($corrupt) { + unless($picture_data) { + debuglog("Uncorrectable corruption detected, skipping non-interlaced image..."); + corrupt_img(1, $corrupt); + next; + } + debuglog("Image is corrupt, but seems fixable, continuing..."); + corrupt_img(0, $corrupt); + } + + if ($image_count gt 1) { + debuglog("File contains more than one image..."); + if ($image_count lt $max_images) { + debuglog("Assembling images..."); + ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$convert - +append -", $picture_data); + if ($rcode) { next; }; + $picture_data = join('', @$stdout_ref); + } elsif ($pre314 eq 0) { + debuglog("Image count exceeds limit, skipping some..."); + ( $rcode, $stdout_ref, $stderr_ref ) = pipe_io("$gifasm -d \$tmpdir/out", $picture_data, $image_count); + if ($rcode) { next; }; + $picture_data = join('', @$stdout_ref); + } else { + debuglog("Image count exceeds limit, but your version does not allow the required functions, skipping image..."); + next; + } + } + + if ($interlaced_gif) { + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( + "$gifinter -s | $giftopnm -", $picture_data ); + if ($rcode) { next; } + } + else { + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( "$giftopnm -", $picture_data ); + if ($rcode) { next; } + } + } + elsif ( substr($picture_data,0,2) eq "\xff\xd8" ) { + if ( $ctype !~ /jpe{0,1}g/i ) { + wrong_ctype( "JPEG", $ctype ); + } + $image_type = 2; + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( "$jpegtopnm", $picture_data ); + if ($rcode) { next; } + } + elsif ( substr($picture_data,0,4) eq "\x89\x50\x4e\x47" ) { + if ( $ctype !~ /png/i ) { + wrong_ctype( "PNG", $ctype ); + } + $image_type = 3; + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( "$pngtopnm -", $picture_data ); + if ($rcode) { next; } + } + else { + $image_type = 0; + debuglog( +"Image type not recognized, unknown format. Skipping this image..." + ); + next; + } + + debuglog("Recognized file type: $image_type"); + + my @pnmdata = @$stdout_ref; + if($enable_image_hashing) { + debuglog("Calculating the image hash..."); + ($rcode, $digest) = calc_image_hash(join('', @pnmdata)); + if ($rcode) { + debuglog("Error calculating the image hash, skipping hash check..."); + } else { + if (my $score = check_image_hash_db($digest)) { + debuglog("Image found in hash database, message is spam..."); + debuglog("Scoring with known old score and ending..."); + known_img_hash($digest, $score); + return 0; + } + } + debuglog("Hash not yet known to the database, saving for later db storage..."); + push(@hashes, $digest); + } else { + debuglog("Image hashing disabled in configuration, skipping..."); + } + my @ocr_results = (); + + foreach my $scanset (@scansets) { + $scanset =~ s/\$gocr/$gocr/; + ( $rcode, $stdout_ref, $stderr_ref ) = + pipe_io( "$scanset", join( '', @pnmdata ), 1); + + if ($rcode) { + debuglog(join( '', @$stderr_ref )); + debuglog( +"Skipping scanset \"$scanset\" because of errors, trying next..." + ); + next; + } + + my @ocrdata = @$stdout_ref; + push( @ocr_results, [@ocrdata] ); + push( @used_scansets, $scanset ); + } + foreach my $w (@words) { + my $wthreshold; + if ($w =~ /^(.*?)::(0(\.\d+){0,1})/) { + ($w, $wthreshold) = ($1, $2); + } else { + $wthreshold = $threshold; + } + $w =~ s/[^a-zA-Z]//g; + $w = lc $w; + my $wcnt = 0; + my $gcnt = 0; + foreach my $ocr_set (@ocr_results) { + my $cwcnt = 0; + foreach (@$ocr_set) { + tr/!;|081/iiioal/; + s/[^a-zA-Z]//g; + $_ = lc; + my $matched = adistr( $w, $_ ); + if ( abs($matched) < $wthreshold ) { + $cwcnt++; + debuglog( +"Found word \"$w\" in line\n \"$_\" \n with fuzz of " + . abs($matched) + . " scanned with scanset $used_scansets[$gcnt]" + ); + } + } + $wcnt = max( $wcnt, $cwcnt ); + $gcnt++; + } + $cnt += $wcnt; + if ( ( $verbose > 0 ) and ($wcnt) ) { + push( @found, "\"$w\" in $wcnt lines" ); + } + } + } + } + if ( $cnt >= $countreq ) { + my $score = ( $base_score + ( $cnt - $countreq ) * $add_score ); + if($enable_image_hashing and $hashing_learn_scanned) { + debuglog("Message is spam (score $score), storing all image hashes in database..."); + foreach (@hashes) { + add_image_hash_db($_, $score); + } + } else { + debuglog("Message is spam (score $score)..."); + } + my $debuginfo = ""; + if ( $verbose > 0 ) { + $debuginfo = + ( "Words found:\n" + . join( "\n", @found ) + . "\n($cnt word occurrences found)" ); + debuglog($debuginfo); + } + for my $set ( 0 .. 3 ) { + $pms->{conf}->{scoreset}->[$set]->{"FUZZY_OCR"} = + sprintf( "%0.3f", $score ); + } + $pms->_handle_hit( "FUZZY_OCR", $score, "BODY: ", + $pms->{conf}->{descriptions}->{FUZZY_OCR} . "\n$debuginfo" ); + } + debuglog("FuzzyOcr ending successfully..."); + return 0; +} + +1; diff --git a/spamassassin/fuzzyocr/FuzzyOcr.words b/spamassassin/fuzzyocr/FuzzyOcr.words new file mode 100644 index 0000000..77ebf33 --- /dev/null +++ b/spamassassin/fuzzyocr/FuzzyOcr.words @@ -0,0 +1,45 @@ +# Here we defined the words to scan for +# Stock +alert +charts +profit +news::0.2 +breaking +symbol +alert +stock +investor +international +company +money::0 +million +thousand +buy +price::0.2 +trade +target +banking +service +recommendation +# Pills +viagra +cialis +xanax +valium +meridia +zanaflex +levitra +medicine +legal::0.2 +penis::0 +medication +growth +drugs +pharmacy +prescription +# Misc +click here +software +kunde::0.2 +volksbank +sparkasse diff --git a/spamassassin/fuzzyocr/INSTALL b/spamassassin/fuzzyocr/INSTALL new file mode 100644 index 0000000..672e37d --- /dev/null +++ b/spamassassin/fuzzyocr/INSTALL @@ -0,0 +1,119 @@ +Installation manual for FuzzyOcr 2.3: + +1. Dependencies you require for this plugin to work + + Before starting, also make sure to read the OS/distribution specific notes at the end of this section. + + 1.1 Spamassassin 3.x + + This plugin requires Spamassassin 3.x. Using it on version 2.x is not supported and might fail. + At least one function in this plugin requires Spamassassin 3.1.4, if you do not have this version, + don't forget to set the "focr_pre314" option in the FuzzyOcr.cf file. + + 1.2 NetPBM tools + + Install the NetPBM tools (http://netpbm.sourceforge.net/). If you don't install the binaries in /usr/bin, + please make sure to adjust the FuzzyOcr.cf to point to the correct binaries. + + 1.3 ImageMagick + + At least one feature requires the convert binary from imagemagick (http://www.imagemagick.org/). + Again, make sure the configuration file points to the convert binary, if not placed in /usr/bin. + + 1.4 Giflib (also known as libungif) + + Several tools from this package are required, see (http://sourceforge.net/projects/libungif). + Attention: the giftext binary from this package has a bug which can cause segfaults. + On the download page, a source patch is provided which fixes this. + + 1.5 Gocr + For OCR recognition, gocr (http://jocr.sourceforge.net/) must be installed. + Attention: the gocr binary has a bug which can cause segfaults with specific images. + On the download page, a source patch is provided which fixes this. + + 1.6 Perl modules: + These perl modules are required: + Digest::MD5 + String::Approx + + Notes for Fedora Core 5 (or higher) users: The package libungif-utils provides the necessary libungif binaries. + Notes for other Redhat/FC users: The packages libungif and libungif-progs should be installed. + Notes for Debian users: The package libungif-bin provides the necessary libungif binaries. + + Notes for Slackware users: I have no clue about this distro, but Andy Lyttle sent me a mail about it: + + "Slackware doesn't currently have a libungif-utils/progs/bin package, and the libungif package does not include the binaries such as giffix. So, you have to hack it a bit. + + 1. Download (or copy from CD) the /source/l/libungif directory, don't untar anything + 2. Edit the libungif.SlackBuild and comment out this line: + # I don't believe we need all this slop. Correct me if I'm wrong. + rm -rf $PKG/usr/bin + 3. Run "sh libungif.SlackBuild" + 4. Uninstall the libungif package, if it's already installed + 5. Look in /tmp, and install the new libungif package there" + + Notes for Gentoo users: All dependencies except the perl modules can be installed via portage. But because of the bugs in giftext and gocr, + you might need to write an ebuild which uses the two patches found on my download page. The perl modules can easily be + installed with gcpan. + + +2. Installing the plugin: + + 2.1. Installing the required files + + Put the FuzzyOcr.cf and the FuzzyOcr.pm files into /etc/mail/spamassassin. + The FuzzyOcr.cf file already contains a line to load the plugin, if you want to put the .pm file in a different location, + change this line accordingly. + Create a wordlist file, a sample wordlist is shipped with this release, and put it also in /etc/mail/spamassassin. + + 2.2 Necessary configuration + + Open the FuzzyOcr.cf. Make sure that you specify a writable file as a logfile, or a directory where the plugin can write to, + so it can create the logfile itself. Also make sure that you specify a correct file as global wordlist. + With these two adjustments, FuzzyOcr is already to work. + + 3. Further adjustments + + 3.1. Enabling the image hash database + + Set focr_enable_image_hashing to 1 in the config file, and make sure that focr_digest_db points to a writable file/directory. + You can also create this file yourself if you like. By default, all images recognized as spam, are added + to this database automatically. The score is saved as well and reused later again. + + 3.2 Tweaking Scansets + + Everyone gets different image spam, and most times, one method to scan is not successful with all types of spam you get. + That's where the focr_scansets setting can help you. This setting takes a comma seperated list of scansets. + Each scanset starts with the name of a program, followed by either other programs connected with pipes, or nothing anymore. + The only important thing is that input for this "program chain" is a picture in the PNM format, and the output is ASCII text. + + An example might clarify this: + focr_scanset gocr -i - + + This will do a single scan with gocr default settings. + + focr_scanset pnminvert | gocr -i - + + This will use pnminvert on the image and then do the scan. + + focr_scanset gocr -i -, gocr -l 180 -i - + + This will do 2 scans, one with the default settings, and the second one with a modified -l value. + + You are now free to select which scansets get you the most spam, but don't pick too many, as this will also use more resources. + + Here are some hints: -pnminvert or pnmquant are useful with white text or text with many colors + -If you get images which are littered with small dots/lines, try -d 2 as an argument to gocr + -The -l setting often helps, try values like 180, 140, or 100 + + Two syntax remarks: -Instead of writing "gocr", write "$gocr" as this will be replaced with the correct path to your gocr binary. + -If you invoke custom binaries (like pnminvert for example), you can redirect the stderr output by using: + "pnminvert 2>>$errfile" + If the scanset fails then, and debug logging is enabled, you will see this stderr output in the logfile :) + + I know this seems confusing for some, but if this is unclear somehow, feel free to write an email to the list. + + +And now, where it gets most thrilling... + +To be continued... diff --git a/spamassassin/fuzzyocr/LICENSE b/spamassassin/fuzzyocr/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/spamassassin/fuzzyocr/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/spamassassin/fuzzyocr/README.weasel b/spamassassin/fuzzyocr/README.weasel new file mode 100644 index 0000000..57ca565 --- /dev/null +++ b/spamassassin/fuzzyocr/README.weasel @@ -0,0 +1,2 @@ +Downloaded September 2006 from +http://users.own-hero.net/~decoder/fuzzyocr/fuzzyocr-2.3b.tar.gz diff --git a/spamassassin/fuzzyocr/samples/README b/spamassassin/fuzzyocr/samples/README new file mode 100644 index 0000000..98370c4 --- /dev/null +++ b/spamassassin/fuzzyocr/samples/README @@ -0,0 +1,61 @@ +These eml files are sample spam emails to test your installation of FuzzyOCR. Assuming you are using the default settings, the output you get should match the output listed here. + +Use spamassassin -t < samplefile.eml to test :) + +corrupted-gif.eml: Contains a corrupted gif image, additionally I changed the content-type to jpeg, so the output should show: + + 1.5 FUZZY_OCR_WRONG_CTYPE BODY: Mail contains an image with wrong + content-type set + Image has format "GIF" but content-type is + "image/jpeg" + 5.0 FUZZY_OCR_CORRUPT_IMG BODY: Mail contains a corrupted image + Corrupt image: GIF-LIB error: Image is + defective, decoding aborted. + 10 FUZZY_OCR BODY: Mail contains an image with common spam text inside + Words found: + "stock" in 2 lines + "investor" in 1 lines + "company" in 1 lines + "price" in 2 lines + "trade" in 1 lines + "service" in 1 lines + (8 word occurrences found) + +animated-gif.eml: Contains an animated gif with four frames. Both with default settings and with "focr_gif_max_frames 3" this should output: + + 10 FUZZY_OCR BODY: Mail contains an image with common spam text inside + Words found: + "stock" in 2 lines + "company" in 3 lines + "trade" in 1 lines + "penis" in 1 lines + "growth" in 1 lines + (8 word occurrences found) + +Note: Please verify that this is the output both with the setting mentioned and without, because with this setting, a different test is used. + +jpeg.eml: Contains a jpeg file. Output should show: + + 6.0 FUZZY_OCR BODY: Mail contains an image with common spam text inside + Words found: + "viagra" in 2 lines + "cialis" in 1 lines + "levitra" in 1 lines + (4 word occurrences found) + +png.eml: Contains a png file. Output should show: + + 24 FUZZY_OCR BODY: Mail contains an image with common spam text inside + Words found: + "stock" in 1 lines + "investor" in 3 lines + "company" in 2 lines + "money" in 1 lines + "buy" in 1 lines + "price" in 6 lines + "trade" in 2 lines + "service" in 2 lines + "software" in 2 lines + "levitra" in 1 lines + "legal" in 1 lines + (22 word occurrences found) diff --git a/spamassassin/fuzzyocr/samples/animated-gif.eml b/spamassassin/fuzzyocr/samples/animated-gif.eml new file mode 100644 index 0000000..f9637c1 --- /dev/null +++ b/spamassassin/fuzzyocr/samples/animated-gif.eml @@ -0,0 +1,579 @@ +Return-Path: <jacuwoqfkhu@europe.eds.com> +X-Original-To: decoder@mindfields.own-hero.net +Delivered-To: decoder@mindfields.own-hero.net +Received: by mindfields.own-hero.net (Postfix, from userid 500) + id 5A723120C1BB; Tue, 22 Aug 2006 06:05:16 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.1.3-gr0 (2006-06-01) on + mindfields.own-hero.net +X-Spam-Level: * +X-Spam-Status: No, score=1.7 required=5.0 tests=DATE_IN_PAST_06_12, + EXTRA_MPART_TYPE,HTML_MESSAGE,TW_WY,TW_YX autolearn=disabled + version=3.1.3-gr0 +X-Spam-Report: + * 0.8 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry + * 0.7 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date + * 0.1 TW_WY BODY: Odd Letter Triples with WY + * 0.1 TW_YX BODY: Odd Letter Triples with YX + * 0.0 HTML_MESSAGE BODY: HTML included in message +Received: from fmmailgate02.web.de (fmmailgate02.web.de [217.72.192.227]) + by mindfields.own-hero.net (Postfix) with ESMTP id A0059120C1B7 + for <decoder@own-hero.net>; Tue, 22 Aug 2006 06:05:08 +0200 (CEST) +Received: from mx31.web.de (mx31.dlan.cinetic.de [172.20.6.155]) + by fmmailgate02.web.de (Postfix) with ESMTP id 4E9C915A8190 + for <decoder@own-hero.net>; Tue, 22 Aug 2006 06:04:44 +0200 (CEST) +Received: from [63.245.85.242] (helo=[63.245.85.242]) + by mx31.web.de with esmtp (WEB.DE 4.107 #114) + id 1GFNVG-0008NZ-00 + for christian_holler@web.de; Tue, 22 Aug 2006 06:04:40 +0200 +Received: from [63.245.85.242] (helo=[63.245.85.242]) + by [63.245.85.242] with smtp (Exim 4.43) + id VKBWE-SZHY-NRO; Mon, 21 Aug 2006 23:03:24 +0500 +Message-ID: <001301c6c59f$ea022980$f255f53f@seguridad> +From: "Contains Closed" <jacuwoqfkhu@europe.eds.com> +To: christian_holler@web.de +Subject: Largest Wireless +Date: Mon, 21 Aug 2006 23:03:24 +0500 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="multipart/alternative"; + boundary="----=_NextPart_000_000F_01C6C576.012C2180" +X-Priority: 3 +X-MSMail-Priority: Normal +X-Mailer: Microsoft Outlook Express 6.00.2800.1106 +X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 +X-WEBDE-FORWARD: christian_holler@web.de -> decoder@own-hero.net + +------=_NextPart_000_000F_01C6C576.012C2180 +Content-Type: multipart/alternative; + boundary="----=_NextPart_001_0010_01C6C576.012C2180" + + +------=_NextPart_001_0010_01C6C576.012C2180 +Content-Type: text/plain; + charset="windows-1250" +Content-Transfer-Encoding: quoted-printable + + +CSS MySQL dangerous myself glad switched sites learning do. kind = +products Excel Mac somewhat amazing among team addon fulfilled thinking = +rejoicing job making us.neuro Says: Nothing around.I themes for. kwyxz = +aware Wordpress discuss way.I you. Dave. Todd none. constant wishing = +bro.I grown shudder Apart Movable Type.That said please Those wonderful = +helping thousands Nora Gatine Yikes stunned package. luck Japanese = +Paris. When sister +fuel fire. Yesterday quotAll Things +CHOKOLATE GHOST WORL CLOCKWORK +Foreign Relations destroys Americas roots: September marks Week seven +Basically corporate bear free. run. gentleman house primarily +writers happy result. unlike unusual STABLE site. trying find monstrous = +headache place. reasons addresses tend disappear speak publicly urge = +guestto claims going steal titles. easily course. pirated. advance soon = +discover amount hassle order somewhere excepting Libraryis hardly = +effort. shape prepared formats. software already. +Isles started attracted also. But... but... Nonsense Between remember = +selling muchwere higher. precise: compared interim Well obviously cant = +seems explains absurd claim somehow novels guarantee delighted spurt = +noting Heart Darkness pattern. appeared copies. dramatic mere increased = +declining Before move emphasize HARD FIGURES. stress quothard arguing = +debate NEVER figures. Harlan Ellison screams quotLost piracybut best = +knowledge tried true. endlessly pirated quotmust is. hurt. willare = +convince different analogy captures reality better. Anyone bought carnew = +usedknows perfectly +Painting Religion Life Starving Genius Hour Living Chemistry Pictures = +Places +Delays XaRk Phil Hello Seahorse Aeroplano zoe Cosmetics Flaming Lips = +Nortec NUDE Cosmonova +GUSTAVO CERATI AUSTIN AZUL VIOLETA SIX MILLION DOLLAR WEIRDO TURBO +MACHINES MASSIVE ATTACK RADIOHEAD SMITHS SMASHING PUMKINS RAPTURE WEEZER = +MARS VOLTA +Sigh Fucked World Political Ranting Too Caffeine +location satirical Hobbit turns +mostly +Jo... paragraph sidebar. Counter A:hover +pirated. advance soon discover amount hassle order somewhere excepting = +Libraryis hardly effort. shape prepared formats. software already. Try = +finding ANY looked sloppy editions miserable read. yet... despite seen = +yourself instances strong +grey.Do iPods downI players loud. heavy metal asleep. seriously stare = +blankly wry smile.Do disembark firstI Asians carriage straight seat = +find... bowl process. hogI hate seats. variety ways: middle bag = +better... +audience. Most pass cases dont really writer arent willing keep +looking WebPage Graphical Hit +Release Rocket Pocket +legs clearance inside +Colophon manifesto Outside +Hey unasa nosotros gustar estoy viendo placebo tambin +FOBIA CHETES ELIS +elected partly backlash politics +gesturing Such check empty +Boones Farm +year. hide faults arguments twoparty coalition been papering +OTRO PLOMOS FATALIST DISIDENTE SULLIVANS +skinny knee front. quietAnd shut mean. shove. Reduce domain. services. = +rorted +Myszoor +Engine SNES Nostalgia Dreamcast +------=_NextPart_001_0010_01C6C576.012C2180 +Content-Type: text/html; + charset="windows-1250" +Content-Transfer-Encoding: quoted-printable + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META http-equiv=3DContent-Type content=3D"text/html; =3D +charset=3Dwindows-1250"> +<META content=3D"MSHTML 6.00.2800.1106" name=3DGENERATOR> +<STYLE></STYLE> +</HEAD> +<BODY bgColor=3D#ffffff> +<DIV align=3Dcenter><FONT face=3DArial size=3D2> +<IMG alt=3D"" +hspace=3D0 src=3D"cid:000e01c6c59f$ea022980$f255f53f@seguridad" +align=3Dbaseline +border=3D0></FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>CSS MySQL dangerous myself = +glad switched sites learning do. kind products Excel Mac somewhat = +amazing among team addon fulfilled thinking rejoicing job making = +us.neuro Says: Nothing around.I themes for. kwyxz aware Wordpress = +discuss way.I you. Dave. Todd none. constant wishing bro.I grown shudder = +Apart Movable Type.That said please Those wonderful helping thousands = +Nora Gatine Yikes stunned package. luck Japanese Paris. When = +sister</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>fuel fire. Yesterday = +quotAll Things</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>CHOKOLATE GHOST WORL = +CLOCKWORK</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Foreign Relations destroys = +Americas roots: September marks Week seven</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Basically corporate bear = +free. run. gentleman house primarily</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>writers happy result. = +unlike unusual STABLE site. trying find monstrous headache place. = +reasons addresses tend disappear speak publicly urge guestto claims = +going steal titles. easily course. pirated. advance soon discover amount = +hassle order somewhere excepting Libraryis hardly effort. shape prepared = +formats. software already.</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Isles started attracted = +also. But... but... Nonsense Between remember selling muchwere higher. = +precise: compared interim Well obviously cant seems explains absurd = +claim somehow novels guarantee delighted spurt noting Heart Darkness = +pattern. appeared copies. dramatic mere increased declining Before move = +emphasize HARD FIGURES. stress quothard arguing debate NEVER figures. = +Harlan Ellison screams quotLost piracybut best knowledge tried true. = +endlessly pirated quotmust is. hurt. willare convince different analogy = +captures reality better. Anyone bought carnew usedknows = +perfectly</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Painting Religion Life = +Starving Genius Hour Living Chemistry Pictures Places</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Delays XaRk Phil Hello = +Seahorse Aeroplano zoe Cosmetics Flaming Lips Nortec NUDE = +Cosmonova</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>GUSTAVO CERATI AUSTIN AZUL = +VIOLETA SIX MILLION DOLLAR WEIRDO TURBO</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>MACHINES MASSIVE ATTACK = +RADIOHEAD SMITHS SMASHING PUMKINS RAPTURE WEEZER MARS VOLTA</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Sigh Fucked World = +Political Ranting Too Caffeine</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>location satirical Hobbit = +turns</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>mostly</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Jo... paragraph sidebar. = +Counter A:hover</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>pirated. advance soon = +discover amount hassle order somewhere excepting Libraryis hardly = +effort. shape prepared formats. software already. Try finding ANY looked = +sloppy editions miserable read. yet... despite seen yourself instances = +strong</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>grey.Do iPods downI = +players loud. heavy metal asleep. seriously stare blankly wry smile.Do = +disembark firstI Asians carriage straight seat find... bowl process. = +hogI hate seats. variety ways: middle bag better...</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>audience. Most pass cases = +dont really writer arent willing keep</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>looking WebPage Graphical = +Hit</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Release Rocket = +Pocket</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>legs clearance = +inside</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Colophon manifesto = +Outside</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Hey unasa nosotros gustar = +estoy viendo placebo tambin</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>FOBIA CHETES = +ELIS</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>elected partly backlash = +politics</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>gesturing Such check = +empty</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>Boones Farm</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>year. hide faults = +arguments twoparty coalition been papering</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>OTRO PLOMOS FATALIST = +DISIDENTE SULLIVANS</FONT></DIV> +<DIV align=3Dleft><FONT face=3DArial size=3D2>skinny knee front. = +quietAnd shut mean. shove. Reduce domain. services. rorted</FONT></DIV> +</BODY></HTML> + +------=_NextPart_001_0010_01C6C576.012C2180-- + +------=_NextPart_000_000F_01C6C576.012C2180 +Content-Type: image/gif; + name="PILOTS.gif" +Content-Transfer-Encoding: base64 +Content-ID: <000e01c6c59f$ea022980$f255f53f@seguridad> + +R0lGODlhxQHnAocAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8EAgAGAgAIAgAKAg +AMAgAOAgAABAACBAAEBAAGBAAIBAAKBAAMBAAOBAAABgACBgAEBgAGBgAIBgAKBgAMBgAOBg +AACAACCAAECAAGCAAICAAKCAAMCAAOCAAACgACCgAECgAGCgAICgAKCgAMCgAOCgAADAACDA +AEDAAGDAAIDAAKDAAMDAAODAAADgACDgAEDgAGDgAIDgAKDgAMDgAODgAAAAQCAAQEAAQGAA +QIAAQKAAQMAAQOAAQAAgQCAgQEAgQGAgQIAgQKAgQMAgQOAgQABAQCBAQEBAQGBAQIBAQKBA +QMBAQOBAQABgQCBgQEBgQGBgQIBgQKBgQMBgQOBgQACAQCCAQECAQGCAQICAQKCAQMCAQOCA +QACgQCCgQECgQGCgQICgQKCgQMCgQOCgQADAQCDAQEDAQGDAQIDAQKDAQMDAQODAQADgQCDg +QEDgQGDgQIDgQKDgQMDgQODgQAAAgCAAgEAAgGAAgIAAgKAAgMAAgOAAgAAggCAggEAggGAg +gIAggKAggMAggOAggABAgCBAgEBAgGBAgIBAgKBAgMBAgOBAgABggCBggEBggGBggIBggKBg +gMBggOBggACAgCCAgECAgGCAgICAgKCAgMCAgOCAgACggCCggECggGCggICggKCggMCggOCg +gADAgCDAgEDAgGDAgIDAgKDAgMDAgODAgADggCDggEDggGDggIDggKDggMDggODggAAAwCAA +wEAAwGAAwIAAwKAAwMAAwOAAwAAgwCAgwEAgwGAgwIAgwKAgwMAgwOAgwABAwCBAwEBAwGBA +wIBAwKBAwMBAwOBAwABgwCBgwEBgwGBgwIBgwKBgwMBgwOBgwACAwCCAwECAwGCAwICAwKCA +wMCAwOCAwACgwCCgwECgwGCgwICgwKCgwMCgwOCgwADAwCDAwEDAwGDAwIDAwKDAwP/78KCg +pICAgP8AAAD/AP//AAAA//8A/wD//////yH5BAATAAAALAAAAADFAecCBwj+AP8JHEiwoMGD +CBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2b +OHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmz +aNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXL +mDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHj +yJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MP+ix9Pvrz58+jTq1/Pvr379/Djy59Pv779 ++/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4Ycghiji +iCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp +5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjm +qeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZgpYN5p26umnoIYq6qik +lmrqqaimquqqrLbq6qv/sMYq66y01mrrrbjmquuuvPbq66/ABgsRGcIWa+yxLWKB7LLMNuvs +s9BGK+201Fa7pB7WZqvtttx2621yn3wr7rjklmvuueimq+667Lbr7rvwxivvvPQGdk69+Lp5 +Q7789uvvv8gxAPDABBds8MEIJ6zwwgw37PDDEEcs8cQUV2zxxRhnrPHGHPf2DrIfGxtysSOT +fGzJwaKc8skdt+zyyzDH3FMsMtds880456zzzjz37PPPQAct9NBEF2300UgnrfTSTDft9NNQ +Ry311FRXbfXVWGet9dZcd+3112CHLfbYZJdt9tlop6322my37XZBAMQt99x0x/323Xjnrffe +/t5CwrfCTfwt+OCEF2744YgnrvjijDfu+OOQRy755JRXbvnlmGeu+eacd+7556CHLvropJdu ++umop6766qy37vrrwOEB++y012777bjnrvvuvPfu++/ABy/88MQXb/zxyCev/PLM/1hA89BH +L/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767LfvPle1vC///PTXb//9+Oev//78 +968fP/4LoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClowUde4oAY3yMEOevCDIAyhCEdI +whKa8IQoTKEKV8jCFoLKCS6MoQxnSMMa2vCGOMyhDnfIwx768IdAXAyiEIdIxCIa8YhITKIS +lxigWTDxiVCM4gwNIMUqWvGKWMyiFrfIRdG4o4tgDKMYx0jGMpqxSnVLoxrXyMY2uvGNcIyj +HOdIxzra8Y54zKMe98jHPvrxj4CMW0AAACH5BAAMAAAALAAAAADFAecCBwj+AP8JHEiwoMGD +CBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2b +OHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmz +aNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXL +mDPb7Ka5s+fPQjmDHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr9pxot+/fwIMLH068uPHj +yJMrX868ufPn0KNLn069unXPl65r3869u/fv4MP+ix9Pvrz58+jTq1/Pvr379/Djy59Pv779 ++/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4Ycghiji +iCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp +5JNQRinllFRWaeWVWGap5ZZHMcLll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjm +qeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qik +lmrqqaimquqqiCbA6qv/sMYq66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNkvj +O85GK+201FZr7bXYZqvtttx26+234IYr7rjklmvuueimq+667Lbr7rvwxivvvPTWa++9+Oar +77789uvvvwAHLPDABBds8MEIJ6zwwgw37PDDEEcs8cQUV2zxxRhnrPHGHHfs8ccghyzyyCSX +bPLJKKes8sost+zyyzDHLPPMNNds880456zzzjz37PN+S/ws9NBEF2300UgnrfTSTDft9NNQ +Ry311FRXbfXVWM+lTtZcd+3112CHLfbYZJdt9tlop6322my37fbbcMct99x012333Xjnrffe +/nz33XIj0gIe+ODRCl444c4anrjfjDfu+OOQRy755JRL90LlmGeu+eacd+55pnZ8Ljrml49u ++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 +0AZ90Aid0Aq90Azd0A790BAd0RI90RRd0RZ90Rid0Rq90Rzd0R790SAd0iI90iRNvvxQECfN +Dyq90imtECv9D/8s/dIsPRAnDdM0DdMzLRAvfRA1zdM3jdI+TdMqTRA5jdI7HdNEndR+2tM6 +rdRNjRBM/dNPbdNUXdNWbRBRjdUJ0dNZndVU/dVcLdVS3dJBPdVYGtVMndZbXdZg/dRk/dVi +rdVe3dJvbdNdbdZVHddwPdRyrdchitZODddArdVj7dZtPdhQLdhNTddJfdeCfdV4vddzfdh+ +3ZuALdZeLdSIjdN8XdVpvdM6ndl1fdOMTdqEfdlFHdhIbdp4ndm8edlm7dqYrdRhbdeVrdi1 +3di2PdWoPdiQvdmdXdiK/dfAHdiJPduH/dau3dWpndeQvdo/3dvD/dlYndOynZ2wvdf/DKHW +wv3cka3Xuc3b0c3alJ3bjr3bTv3b323ZR63aoC3U2a3Wv53S1h3cwn3f8x3aaB3c3A3fVm3d +0d3eJT3gBF7gBn7gCJ7gCr7gDN7gAM2qhLsRdquyDiq9ZTq4BkK6GG6sSwudFU62vqvhiQHh +C5ugIt4QIDq7FL7h8nHi+IqurwujDuHiKD4fJG6myZrj1hm8+1q2Oq6mVPq76hrk2wq8QW7k +R36sSv6iPK7isSvjRs6nTguqVK6nQA69v6utSW64Y5vkU46eHj6dVV63VP7lWQ68Uq6taTrl +oGrlUS7mbn7lSM7mFi4SN47mo7utljulVi67eI7mHivk+trn/wqLrYYO6IU+t0Xu5ww7ubkq +5nDe5ZJe5WWup5Ne5pSO6W1+6VwO5WNb6Z9unqH+oaEu45Bu6ZEO6Z++6ace5qBuuafu6anO +6ppuEnfO6PkJ5h6O6Dv+57iu5H1euZVb6ITu64ue673O5r8e7D8avWmK6rRu6dIO6ji+6pk+ +52Hu6rtuq+q66p2O7N/u7aqu6lye7V3O7XCe4+VJ7ux+7Tt+6XxK4yFOtsHu40I67MW+5/p+ +6Mfe6AxL7Mdu7/r+vELO73I77q8u7uY+7ea+7uPe6dAe8a/+7dAu7rGO8LWu7abu7hS/8RX/ +8O2u8dFO7RvPErce8Ma+7/mO8irf7/+Mzu8Az/J5vqcCn+eK7vCa7uojv/Cb3vAjX+o7z+kX +//M63/FDb/GkHutJn/NCj+lGL/IS7/MSz6lqLvB7zq6ja/A6/u9Hnqvb7us9juVZD+i5/uhj +j+/X6uxfPupFH/Ji7/AQ/+6tLupSXvb4Tvf1ae107vFzP/VrnvcgD/gT3/cTj+Wi4+ScOjtT +qrEtdwSIjxLyXjpqDuIOXvmWf/mYn/mav/kDHvkHn/g4z+EqK+E1rhae/+Kjn/pAX/Kyzvh6 +3yGnH7Ymz/quD+MJWvpHEfuqP57dvqrXKvprIefxPufU7uWpHr3A/vd1b/esbvxajvfILvhb +vvxEzvxg/vr/dS/nb67zgP/j287uz//9yy/42V/q2y/8eR/2yl/pyV726l7seB/nVz/+MSH1 +107yQ6/t4Q7i9q/wox74APEPgMB/BQcWNEgQoUKGAw8SfOgQocSEFCFObLhQY0SMHBdafLgx +I0eSHU1WPMlQJEaUCQUeLOkyZcuLMhV6tGgTQMyaNz+OZKlR6FCiRY2uDEoRJlCXEXfu1Dn0 +KciMSV8+jSqT6tWcDaeqZNpTIs+lIYV6FGsQa8+JWMmGpWp26ta2UK3iDKpVrd2Qca3q9Zm3 +L9yob48eRpwYbMyyKZfahCzXcVW9ZhdXniw5MlK/KHHaZXv27uTQb01nRgpYNWHK/phVb137 +WrZg1oMNK8ad23XNxjQfV7U82Hdrw8EJ85R9enjnn045o256eTn0tMpVoq09ejhL5j8BCxc+ +PTp1y7rNG4299rHD9O33JgVdF3ZsrnXhO/0N0+1Z/fh3928KtK822wjAvfrDTr7aBNwvQP8O +LDC+Aeu7ji/u3BIQOPUiLEvC3yBqj0EHVzuvRBNTOzFFFFVksUXvxstLxfJcpJGoGWtE70Uc +d+SxxxgV48DHG30k0kYMVzQxviJ3HHJJCp2EMkopp6SySiuvxDJLLbfksksvvwQzTDHHJLNM +M89EM00112SzTTffhDNOOeeks04778QzTz335LNPP/8E/jRQQQcltFBD02zSuwQ/spDJo8BT +Ur6uwMoxsUR1PEwpLjVDTNOZisrvUDMvfU4qJFls0rZOf8SNVEpbnPRLVz2laVXIRJWKQQsN +vOpAXSF8MjD26ptQJ/X4mgvYXoGlrzBbKURWLqgGVCpaXr+Klr/Gsn0yRA5P2rAiBN8jtyVV +uROX2GaXxXW+/4TNbqX1ZqNNtHmtoyurRNHqDcW+jKMMttaaC4w84i58t7pPTa103oBtPBRb +dH3lylP2GizYJIv/evHfaaMjSWJxMcxp0VLhFa1eZiUF7lUILca4q2T/4lc8EMMF9dGLHB64 +WEE/qxnTe0s1biwYTQ7VXJt3/ks5K4i/YxW7oBdNz+WS+u3O6olbtg7TUzVG+eBbAUUuOXBt +/tCzsJE22yd8e9Yx7dnCU7TjrctOazSsj1M5abcNZnVsgjdezWSyj2203HDXS9w5u7XKlz5r +4Z0wRF4Z5fbVqdkt9yVjRWSX2s5fFjZmxZWsHPO4mc0810g5di5BnyP2mmxcV9/S1dvxnD1Q +3f3s3crfdye+eOOPRz555Zdnvnnnn4c+eumnp75666/HPnvtt+e+e++/Bz988cfHEbzazfud +VLmfHR5WRxnWWTeAT/R7xfKGnNVS/c9rn837y38f/wLnphldqn39U4zh1FepZ8UvU3XyVsXG +RS5s/l1sWEDTloKghToLamtYvPkVsXoWwtCF8EiVaxbi8COtzOHMVw9iXLckB7IO+oxa45rd +DWG4rsWZcEMGuuHpEJgk6OwNL1tTmNOYk6+8Qc1z8WqiSN5GtyRq7Tas+RTP1Aa48fBMaui6 +YtuieDXS/CthWYsSpzYWMhd+qDczo5hpbCi2tYnscZOyY2RER5sw2jFyHdHhWD5WumlJ5opG +82Lf0LasFcpMMBJL1vwehhdJpvE5Q6uVvuq2PuncJHFn+cEXuxij+fWLaZ3EXd5SyMWwnBKT +OyPYiAa3NkV6sn4kUqPQUKnEMmqOSsoxIhLdqDRelk12dEzkdih5SVaa/w9v7xJlFR35N2JW +UYq8oRfXTgY7LAKlOI9TJR3TaEIakvCJjpNapCzHuqKRcnGq69wgNYc4+1CwhRrioDwnqMF1 +aoZx+lTmKl/zxy6ajj9CxGWjIqiWzzmRnmcaYgBdhqWIoup8baKiRCsqvo3WKHhXet0v1xWn +j3p0pORDaUpVulKWttSlL4VpTGU6U5rW1KY3xWlOdbpTnvbUpz8FKv0MmKWO5qajRZUfESeW +v6/hD6ncnKj9mhY426DwqWBiKkindNQqDZGKWW3g11JEtf05MFN4MxxR4ajCyrRwcssMnS0j +pKw5XsutjJkc5h60M5LttVosxKey6sm5qm5wh/7IyplhERrYp3lSsWzUz3uCaCpTRnVTMFok +pQT2naR9krKkaQvTjnlO0MLtiZNEmC+1E8VYckihlO2EMhN7xCme9bT1+2Z4OKmpPZLJYX5s +GelOlp/ezhOgo60Y5Nhq2utc6JM1m1lGUQvOlaVGi3kMLsNom0Uk2gubzT3j3J5mtIt26ZVL +PJpmafYjTkGTlFEjUMFyudphnnKX6Z1vNsHrt2lmTF5L5S6JZqlF+Wa3s+MtzahABrhQHdHA +3QWvNIfb2s1285vcdDB838axCNMys5Gt2ygzG6AQE1jCzaWtbvGY2twVFKDQ4qeHqqu4wSoI +aO19aAmf2zi98rNAjP71CmDZmdBC4hhyQ35wiOVLwgrS7beh7WfVcIbb5li1vEEF4PauGtYW +ywjLUNoyocJs1st6+ctnRnOa1bxmNrfZzW+Gc5zlPGc619nOd8ZznvXMvJMuCWOoKumtYkXm +QZvZUp6dqso6FVLBjZXR8Gtsox/V5+KNOYFXFiCXJZ1Yy1oyk2U16gC3nNZEPxB9AySekOfi +H8hqcKpW9gylK8TqY8kQf4CkoIvtiVjO2U/K5yzyB/tsyOWq0JxIMvY+BcnOy1l314e1dJmv +SU33NjpoqSU1dO/I3KYFk9rZUWC3GZrJc2mNwm1LWwFzdN5xSzjcBgtjnlaIMm1vB8EO4v8v +Ax0MV1veGrKILLBs9yXu/a4Ojv5K8nf3iewG7Q3FmQleVU0Xb3kz5cABHfiFBzbh9J4YYsaE +JX7BaOptQ/XTia4wY+wtVWJWWJWIfnUn0Qs8iztrae0+975ZbPJwFqed0yHvhzXETMyar4zz +1XnLh243lYeTOpwtubt3Tqd+ltPGzk1nZ6c8Q+tyi5LrHBukpkZOXbOXxyiWsVzNPu/QMtLF +VNPVGquGdSR/zmOczff0jD5WSIMZq8IjOY2izUBzC6l6xaVfqf38965qmu/CO+ngO71nylfe +8pfHfOY1v3nOd97znwd96EU/etKXfndO3l9EU5WxQgu+YT260er+N83evmfa8KjWkuQRxSjc +K75VOhum7ofKIwSSGtOzd7zr0aR7tSp7hv9sq2JP7hsJsX4xPIa1VS8X7NH9dbDLhXIK+1rj +Db5spOC3oQ8D2dZC2rqAC/U+IyPI/BYf0r+b/d9pP9tp2VPzmF1TsvfDpW5irXqLMG+TOQsr +IqFjJabDNgfcDPoDqYmrl79yOI/hpNKqPdeCKuDKMGGCn+j6M7hBrn/bNjmyoJmLrzXqpQa8 +i+IyQByiuRH7G37LO6eau0jbwBjEIoBprwEkt/cqwYVxqLN7r5XLJXbLsPmIvYXxJ3ibQY/z +Cm3qOOujribUt2pCr2jCrBWEwgg8QgX/XDDq4ptiOpsTKzc80q3s+sLQ0BPgChaxi6a8+ipA +wsHYw76qw7dem0Iegifp+z+zA7IifDF4urG5yjW3ATvSOkS7+77vOzvs4jwJvBPp+iVDs0LT +I77sCTRPczTPokRNFMVRJMVSNMVTRMVUVMXlqYRVdMVXhMVYlMVZNC9QC7VTIzxOU7z+Ub30 +wcWkmrzjQ7gNtL1c/L2tCrzls0WiSj4dvLQSYT5edJIFsqhkPEYpGbhRUSj1eyM6tCsB1L7A +Eh1hA8W8isNfk79vlCwgmj9EPMTWGQkAwaAKMaxv7MYJWkTJci5AXCsPgbWQg7bRyT2wka22 +yy0inDapi5tA/9y/MXpAEWOLgYCDBhy0mSOob2PIFlyQlOFBRcovFuRIAtmV9UK+roIkSVxD +gfO9NqwvfRlBD6ylzUmuDrPIl6TAMbyMpOu3nLwbOMRA5SpEmztAkTGx39o6vWpJLzEklhOj +ypK0LeS5NDxAMQy4sEklqKyVDWMiumgw7tLJR3SiBCQ6/UomANM5shJGbCRIp2tKJMQ5hSw4 +PpqJDQvL7XIaasPKasPLhJRKkNPJFatLDcTJKiQcTWLLZPLBUASVbdwr0qqnFNs+vmQ2wqov +7PJJycnBuNo1GnO7PWQhfOyh/BuZGJMne7srN3IPHbu7++C9zuyQJ9zJh6FMwmoexf/MMpiy +RI+yE9uEKKqbqU6UEd6UKFokzuI0zuNEzuRUzuVkzuZ0zueEzuiUzt0rSdfLQBe5JUPcRMJr +tsRLy41jxt6zFeMbTj4hTwAKxXcTz2KEtNZzn2cMRk/Uzeo8vPHrvna8v5H0OvhDHRpSl/4k +zReiq7gTyHLrMXPJw7rDTO4rUCa7Gb9Suwp6tv8Ckf8MjnzCKwRBrH8TTuWjys7Yre9iyRIj +TGfzrr2kS8O8o67ESTRqS/oaN58LyWYSsWszUceqORTtQgJ6Qa57UID7TIW7SZYBm7IspR5T +Qg9ssqmMOhuMRxfCsGJBOhidteArLYCryiAlyeR6sqbr0Pf/bCUILFIHRMD+uqbCZJvpQkD7 +UrSU3BwAFLTVGsYsTTgrdUvyyrvCuRsK9bbrpM4P9aaIJMi8/CM81a8SVUKKTKU6XSQunK6p +/EtGfbg7VTgOm0N0a1GrhJMXEyi12zhI8sx9LFDYiZy0I8qR8ascO1Dxy5Aak8PNPKh5/MMc +/MefjNFEFMs+dCd/zLoaFS4/DT1K/NLthKDptEYiGdbyJCljZdZmddZnhdZoldZppdZqtdZr +xdZsvR51W0+v2ZesGrNspE8jUTIPJTMHEletWjehfL1x9cX49C1nvMVrLKtwPVZo1EXsXMYs +PNdLXNdJrdd53dcyiT92bL90pLUN/2VVGvvJfxRQhl0yHOogwUpH3tOhAwWheZvHix2vhY1Q +DAUX9ZtM2rTTUeK+HAJQ/my/cNwUFgXBrnHSAHzLRzU6f3I467O/Hc3OpautKuQ0f2NSqGsl +jUtX7YJI9SxAKmQtimIZfMy5Pc1UmVWtJ60+QiIupBTKi5SbpAzMRo05fv2WPDWw3ookEDTG +M/Ww66s+EeRUAmRaMCy6HoSa0fpAMeLTB0NLjCOaGQ3DfIPTH9ym8OIl8Ey37rq1dUXTWgpC +lZQlaSOjuLW/mIVa0czZCwQwyEXIut3aJh1R9fLczy0ZZMomi1zJ1TNU2dRTrQxTaXPN1AQi +O5xbP+TMWP8V1csl29plRLqb1W67mG9pqJHFTM1cyLDVMd+dtcXil95dTEa7tqCMQyFy2kY8 +nmT1u24V2IrrntyknUEBTvbkne/pXm0V3/El3/I13/NF3/RV3/Vl3/Z1X+TZO3g92/kdV+9s +PHrlH+qt33z1HG5Ny42ixjckRvvFRGRV12lkvAI+IPhUqnsVKWgzR7Y6WSbMIODloGDxVAsc +VVmKi37UUrhCv19hUAxW1eKVoAF1PtCExxD2x/6ttV6p1QXN0Kvj4BJGYPEoUxWVwp7lybvE +0T5CDS8V3c9IGK+8UsNdQLgk3U1TwfBaw5z94c49T9gjOiOCQU3SUKxFwf4Updv/RVXlpZWg +kzsfTTmiaSNA3SUhniKfrB2Y9EK7pFqtbUu0+s751I411eE30sGNzZkvWkKYO8OQq1T/LWMx +7chOLVwIzGGQ68Ik1ECidaWYhFE6rmN9xWEGjFsRfeIA62GAvSWy6ko19kio3eGb29JqW2QG ++1ophCIl5lyv1dn9FSoYKqfGbBzcUicClb5z011bjTztFCFCMl4YjESSObp8WrvHrGVl5mD4 +4MPLBNCeK2a2o6tZLTYZy8ww0d8Os2P57WYaKQVQG7xt7rLkIefwhUZZK5IvRWd8hd/3hed4 +lud5pud6tud7xud81ud95ud+9ud/BuiAFuiBJuiCNuiD/0bohFbohWbohnboh4boiJboiabo +irboi8bojNbojebojvbojwbpkBbpkSbpkjbpk0bplFbplWbplnZpTXy0mc0VrBqemNa/+FG9 +asQ9bhXNE+VOZZVXd/Ze15HlZsTOb100quu/6wXGx9vpoGZiB7Zko2Zq/O07e13nFGxaEFu1 +GgKxkXU/Gwsitm0k9LgnM+JYvNNbRKxH6A1befwhF87DgwW/x8zHis1gXrXrQYK+LcJCJFs1 +FA5QJiFHYDNs0PkYXmOowlbYxb6gyMJmyP7qe8NRqQ1cMQZPV77UBGs7NHxawWlidXNRSN7L +3P3pE03llTvqw5Zsx+bq+L2tSP+SFsd2YdqOUdmWaanNP+kCif0wQSSFOINyqEVdYhoM5qS9 +uugSN+VWm5QbviqlHDs8rnZOIMZubWArbFdrtwtuzf20bdAxSNmr2/tD7bWsyDbU0xKVy4Kk +wRQVuZ5eXTIq4+GrNzx+JsGz7u+Oncm+6djWb9bu7scOcMNuV/+K5Vh6XIeEZQW3QtTTuFI2 +bqBrU40E0sntbMsGSVcun+wma+Wt7dYE8bBG4fwmayL92VblDA9fSL624fXb5fTbFVOtMl12 +zCkj3j2ERBZvNll1zCAzudW8bb5G1RzvTkSx6XTO7TeJgAhARaQi56wWEnVeEyZvcnM1xSV/ +6ezB8iz/v54t53LrofIvrx4vF3PpIfMyj54wR/M1t52qLnBkBNtzhe+hBmofZmCt/kVv3hPd +AdYnH2CodtyBXUmrJtY/v3PrXeXbGZIg+d+t2vGUZbITysfs8+Afg/GJ7bXJarL7iWAZDtnD +smCJndBIQ5pOr1p0TGu1hrHGzXGNgb+PhUd1WUfGFDCLWuqtVFo5RnDVxvUiznXmCu2HFFT2 +LtcmRspso0oSA1Qe3mRll1EKFd1hT7ApBkZOX9v1c9LNPtUflUxwwvO5DW4uPeKjIVs29jEX +HNwbV3Av5nYEd+N290KadcQgq9q01WA3BNP84uyew90ydMpHltOSs3Fdckuf/0Vi9e7LgjgD +//1UGv3jDKQVvZxTvyXlnU2yBP93nQ5aDXdRf+d1YB/3bwN5KBbb4l7CjVTcSV7vqhxAlw12 +9iZtOj1lv+A33eQhrgO7cdRdvCMcP4S7QQwuOATm2KzmvWbmKZShZk7vWofmV4VuPjxefOrO +VxfsecduDxrNVU8d7C1q1h01Ndlm7Q3Pt6XqN6FubZbyPCdYmj7yA3b7xWTzuJf7uaf7urf7 +u8f7vL/nov1mYL3hQcfGigpgp9ZzQ8dv+8VqhBwTvr891q3kQm/gfi1Grlo8p0786QOzSvfr +vd4+VE9QWWdZ8jPhwNZ6b/w5Fp761kkde2SsVEdY7f5e/VE/R26M9NUs2IOzUPIzysclyrZX +vkQeya41YyceOdUeZaXDeLL8OQgnb2eX4qcm+Zl9+R7GY2fO0Y8Umwu8Wd7c/asl0oyKVM/u +Ix91jWBi7pl8pOOSbjfdW70EzLAbUvanYQaXQUWEUnopzOSQUlg6S0XzNMsFiH//AAwUWNCg +QIIIFRpkqNBhw4QHC0KkGHEgAIYSN3LkSPChRIgfEXokufCixY0ZQZqcyBLlS5ERZZLUOLEk +zZsVK6bsqTHnyINBa5rkSfNlyZAtLY7cORNlx6VSp1JVqdQqVqdEYSYV6vKrz5snOwL1GnZo +TKhgz27VedGm1q9l40KdW/73LdeyeZ965SnWKF+ka9GebApW79iqihdnTbiy68OMCz9KnlxZ +52W3GCsT3gz3seWGnK2uZAnasWObmCXvBH1atF/PdS+XTh35J2XVtVtnrk32Me+fb4Fn5Zy5 +6+bGNTu/hkx7OO3jjKdTr05dtXXGwrNTxc59+vbs3r+TL2/+PPr06tezRz++vW/279vDnl/V +Pv38+vfz7+//P4ABCjgggQUaeCCCCSq4IIMNOvgghBFKOCGFFVp4IYYZarghhx16+CGIIYo4 +IoklmngiiimquCKLLbr4IowxyjgjjebhN9aNUXH33nyx2ahjd9Xl+N2Q1yV2no/3CRmkkksN +2f6jWhkWWSSQ1lGZ2JVM8pelkfAd+WOVU3EpFX5jghclhrfBVh9Gstlm2VHGRSfnZG6yGV9z +yR0GnJpYtpkcb1Gd5lppt6Xl26B/yenQa3guOudyrA0KqZuJ4mbnbtBVSlGfeqIW35uOmulf +Z3z1ZWp4kRUll6lExQZYkmyRdtesXBXm51FXhTUYak6yShaqZpUK2VpY7bmqXbr+Fqx3w/Ia +K4O5LXrYr5qZFWqwYukKV16gyqaXs8zZmqlaucp6baFAkrsrToGF5C2siLpWn2DbVotUeJzO +i2y53ebp4FDt1irUcXElW6y9fiqLa7bh8nqvtQKDBG6UujFLq6wTk/65l8I+YkcYYn4J9zG/ +gnJsIcgNV9tWWvaK7Gq/Alub8sDcvnwwxKZB/LDFLmNMs8YmyyxuUiQfvF2+w9oc884Sdirv +aMHBORtr0OVWsrZVqyQd1IZuTfJMc3r9GaM661s2o6mhua7X444mrHRtBvpmr4li3fZuveGr +tqfZ1jm3dVVwmG+NABd+OOJF/Zs4gqMy/jjkkUs+OeWVW3455plrvjnnnXv+Oeihiz466aWb +fjrqqau+Ouutuz74l3g1uaa2sV8Xd5fpcSum7W2J9zuatc8u4JS5Cx+k48c/SPiqw+/u647B +a7fe89BPT3zvwFdYPHkBE5lmYYRWKvaRUP7TPWmzLRFK6fg8Tkt3udNKyjXBoj5FJ9/qh28c +tl8nHBj70CetT5kPfpiSX5/sx5T4tc1O27uVcpoGrObBSkv6exXC7EOzv0BvZP0yG3MQUyUP +1ixnGTzUxRK2tP9lEFgiXGCsNpg8UkFQWPRCWLEQdUPlfYw4Xwsh7r7lN0Hti4Up0Vm63KKb +xZHwVC4jl/dcsq6hUctqSrOaCxtGnKBN7YUTaqLZOKguYuHweD07lwytl8byyY6F6UJi8xYW +wxpycYMDsxXTEthGDE5wV2A0IRepCK3l0dFYXkTXHmlVsBSi8Vgnc9i4CsmxOmZRhb4T19Gc +qLBGPi+MEqQYI/5TFkgThglCOjTk0xqlN/jhr1GKQ9ue3oenSAGRbA2M2s9s6CmkkS9rRTTN ++vQ4RtrtknxOSaIAOzYp/8XSMOryYf1meDlpXk903HNP9sD3uvJQczHdnFGOgkikxaXpm9s8 +JzrTqc51srOd7nwnPOMpz3nSs572vCc+86nPffKzn/4U0ZWiqLjrmbOD3NSffgSKpLfJh3f7 +WWGAoNSkQapIodKzIA27h9D8WFSj2fSo9f7TUY5iVEsF1WgqJcU3BTpzNfkL2Pw69dJHGYp/ +eWNpMKfWt5VqiqcJRB8x49g+27yvmPhj00xXmNM/ZepVDB3gSpNpVKS961vkHNBTqf71QsPw +sTUUXFsKgwZC2a0RbDnECwqVksZD9hGClMwkHhcmmrv57GW1wmAm7TpW5BwIbZjUYtVGicja +7c13vxJrBJHItmHmcJZE3KJn7BhZh64mKG9dbBKLVsTyQfOtcnRsM3O22PvpsowE8thz8qrJ +RBJWaHm04V614j264JF5LbxVJ8WomJYd0WcM22ipzkixXFWvtqTsCXK4asiLRvRkoWSVYFsG +tjOSErGlhaMl42hXJ9plrVpEaAU16d0+XnGTf73KbNEqyOferLcPSxBuYFk/zQYWrC8F7tUi +RTvshlFrwOQt12TKU2bqybJZNSpnLyXEvgD1fIv84U4ri/+p/hE2q6KqZVJz6xFnmfKjZ/rn +bnXXYeN5s3Te2tFJ10nNFH9POwEFMYxjLOMZ07jGNr4xjnOs4x3zuMc+/jGQgyzkIRN5t6pi +sfDqZUbltXVLTibTVflnWMpSdMpxLWmJ1bdZ7d1HnGwspeHATL2QCnWjGzttX4M3xywz2UrM +9TCZnZtQ41XZQOsDVEqDWmCp3klNOqTMpt6l0j0/+L8AvOWB75w/uTVnLvMbcJSHE1V5nVmK +eJtXnpMctgDKksOP3S+f/Ovl5i7Xt8i94BCPeUm4/lGvQrMwe39LV6QajF/QGjQH96plpqps +ri1Mn6nLKlfzbiVVpsUqa0+NTC3+a41dVUxaIemyRrVGc8Od3Zlfx7hdolm6pelz5tgiCDNv +V9Ha8nPSL+Uy2irX9Hy4OnGBai1HMx/X2O9VYq+DjVs/vjZkjE11vlE4R3Af1ljjbuTMWKZp +Wae31MhTeMKR7GaHTzviADd4YfWNbzfCMNnj3XjEnA1KRIYQRyWMLVURbu+MEU61jUkbXaX9 +3b4+h76gXmKzG+huVbqQz29Lt3k3C/RkNjhPSpOqUXzoSrJCWNcpF6YUfwPL7dp8wOKlGjEd +NVeZSrzITiNp49AsUq8X7qRdx3J/zt5msrO97W5/O9zjLve5073udr873vOu973zve/qie+o +Q+z3wZf/dIZqJ7w/l+pAqR/awUdFvNwrTkZYUxzycMdsxSJJxXtb3utwJfazPN75tn/euKGv +/NpHn+N1Gz00jB/M01Qv+9nTvva2vz3uc6/73fO+9zEahe+DL/zhE7/4xj8+8pOv/OUzv/nO +fz70oy/96VO/+ta/Pvazr/3tc7/73v8++MMv/vGTv/zmPz/606/+9bO//e5/P/zjL//507/+ +9r8//vOv//3zv//+/z8ABqAADiABFqABHiACzh8kQMKDLOACIoQDPqBARCADQqADWmAEGgQF +XuA/SGAHVmAFTiAIjuAGiiBJeKAIciAGhuAHZmALLgULoqALpiAFmoQHSmAM/+YgCtKgBobg +DvagDFqgDW7gCAphC6ogEP7gDCbhCv7gEeIgC37gE5KgCu6gFS6hBp5gFEKhg5QgDULhDHrh +FFKhC95gEZqgFI7hGaJhE+pgFdZgDQ5hDyahGYrhHKYhHtYhEnohF7aEGJrhEPJhDn5hFE5h +Gx4iIRaiIBqhIMahDCpiHN6hJOZhIR4IIKJhH/ZhGj6iFnaiCb7hCxohI1YiGLLhJd4hJPrg +GiphJb5gHaKiKgJhFl6gE1JiCk6iJ7KhLUpFKe7iLnJiLspiKF6hKGriKKoiMfqigoCiLQIi +MwIjLmYiLa4hLkqhE3LiM0IiL07jLeqiN87hIz5gL/9uIivioRbG4hGaoxzSIQfWoi6K4yVm +oyh+IyZS4zvG4jUOIg8KITQuoz6WIkD+ox2qYzwyoEHaYz7WIjYK5B62ojiS4zyqIz8O4kHe +Iz3CIwwKZAdKZDQS4Rf6IUVqJCxGIh12oh4i4xJi4SRy4RUm44IAYyO2I0MioTcWZDoSpEO2 +ojli5Ei65EQao0+e40ICpT1+JEiO4k0e5TyCYT5OJFL2ZEIS40my4zoqZT1KpBJ2ITIa5RNK +okx+o0uy5FdGZDV6JU8Oo06WYxluJVmWJDiOJVqCJE2aZRGqZEc+ZUbK4itS4hk2pVzqI16W +pSnyZDmeoFaaZVUiZijiZC7/wiMJLiY9cmQ9riI6ZmFN9uIpCuZYyiRlCuNGwmUxPiZkBiM0 +uiM5duZgdiNW5mQ/LmZQHqMaBqOERGJhBmJmtqYh/uIW5uQ2kiRtOiJJKmNwSqZuriQWlmBm +NqFiWqVF5mYbuuFuMuNlqmQ4giZusiM14qZpFkhKauNfRmRy7uNOXmZeZuRcdmcYnmcMriBz +kmZFWqZ4sudOkmJDQuA2uich2mYq7id4QqciCqUxKiOA3mU1bmcCHiiCJqiCho4XLKiDPiiE +RqiETiiFVig8GeiFqOd2Rmd18uYxAmdv+uZckmd8FqRdDuRGKqcNAigpLmV9TqBgpih8nqZC ++mA0/7JodRrnOhJhKtqmH7JoW26IiNrldL7hie5mIhYldqKkXw5mekIlK4ookPbncJ7iH/Zl +WiLpZI6oNMomj1LlfO6oR6poflLpk4YIDi6nUMLmaZ4jBrqnThKoZGqileIjYDZnUrapeLam +PKYmRH6nakqjdxJlkwZqmLppkKapn+6pSKJpdGqmdFrjnTImflZFOEIqXyomUVZqUpZmpLbk +e0qnYxJnehLmpErqezJhYmpolXpnYrqmG+oocQrpnTblbaYqpcppZPZnor7oVW4pq4LirX4i +k6rln6amQc5pqj7kpprkZ4bkq0YldWppeeLpWY7prNKqrJpkZUoqr35rjP/qqjv6JJ2SIX12 +p3DWZbEe5Vou5bNmaTNaZ4seJJLW5kWe6ms2JmBeq2+eSLkOamVyo2qSqK5Wq5PeZ2iiZoD+ +6rG+Yrne603u5S2OaMPSK2WeK2QubL5qJ7Ui7F4+7HiKCDqG55fq6TgOLE1eKlWEZZyyLGJG +KqzGZpt+Kcxy5qIyLI7SazeebGCWbEfaKMd2rH0yLFNmIMyK7G9yaUgCZ6sardCi6L1SbNR2 +aHZ27Fmiaru+Jbh2qJgaLL8mosfW6qkaIsfKJiJ2pUXCZJxqCHrSJ7c2JMUi59MO59Su7Lny +J8HiZL2eqda66NDGJ3x6aN/CKNry4oySK2tWbbRYtizcdqu3OqWFRq7kTi7lVq7lXi7mZq7m +bi7ndq7nfi7ohq7oji7plq7pni7q9lihrC7rtq7rvi7sxq7szi7t1q7t3i7u5q7u7i7v9q7v +/i7wBq/wAm9AAAAh+QQADgAAACwAAAAAxQHnAgcI/gD/CRxIsKDBgwgTKlzIsKHDhxAjSpxI +saLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1K +tKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1L +t67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5N +urTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59O +vbr169iza9/Ovbv37+DD/osfT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijg +gAQWaOCBCCao4IIMNujggxBGKOGEFFZoYVZ5XKjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo +4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhm +qeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCE +FoqcMoYmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqr +/7DGKitczMxq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttLP6QS1atlyr +7bbcduvtt+CGK+645D52TLnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwAQX +bPDBCCes8MIMN+zwwxBHLPHEFFds8cUYZ6zxxhz7NEfHIB8GR8gkl1xULSan/OgAKrfs8ssw +xyzzzDTXbPPNZZ2B88489+zzz0AHLfTQRBdtNMMeHK300kw37fTTUEct9dRUV2311VhnrfXW +XHft9ddghy322GSXTW8rZqet9tpst+3223DHLffcdGcURd1456333v589+3334AHLvjghBdu ++OGIJ6744ow37vjjkPf5TuSUV2755ZhnrvnmnHfu+eeghy766KSXbvrpqKeu+uqst+7667DH +LvvstNdu++2456777h+qw/vvwAcv/PDEF2/88cgnr/zyKQPg/LEAMC/99NRXb/312GdfkBna +d+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrw +gAhMoAIXWDNHMPCBEIygBCdIwQpa8IIYzKAGN8jBDnrwgyAMoQhHSMISCollJkyhClfIwhYi +cAoujKEMZ0jDGtrwhjjMoQ53yMMe+vCHQFYMohCHSMQiGvGISEyiEpfIxCY68YlQjKIUpwir +6CXLisjCorG0uEUqevGLOHOeGMdIxjKa8YxoTKMa18jGNrrxjXCMoxznSMc62vGOeMyjHvfI +xzgGBAA7 + +------=_NextPart_000_000F_01C6C576.012C2180-- + diff --git a/spamassassin/fuzzyocr/samples/corrupted-gif.eml b/spamassassin/fuzzyocr/samples/corrupted-gif.eml new file mode 100644 index 0000000..9cd564b --- /dev/null +++ b/spamassassin/fuzzyocr/samples/corrupted-gif.eml @@ -0,0 +1,227 @@ +Return-Path: <M7zmendelian@alexalvarez.com> +X-Original-To: decoder@own-hero.net +Delivered-To: decoder@mindfields.own-hero.net +Received: from mellox (pD9E2D1ED.dip.t-dialin.net [217.226.209.237]) + by mindfields.own-hero.net (Postfix) with ESMTP id 3BA7A120C1AC + for <decoder@own-hero.net>; Tue, 8 Aug 2006 10:04:01 +0200 (CEST) +Resent-From: Sascha Just <sascha.just@ownhero.net> +Resent-To: Christian Holler <decoder@own-hero.net> +Resent-Date: Tue, 8 Aug 2006 02:04:00 -0600 +Resent-Message-ID: <200608081004.00363.M7zmendelian@alexalvarez.com> +X-Original-To: methos@mindfields.own-hero.net +Delivered-To: methos@mindfields.own-hero.net +Received: by mindfields.own-hero.net (Postfix, from userid 500) + id 5C9B812080C2; Tue, 8 Aug 2006 02:22:37 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.1.3-gr0 (2006-06-01) on + mindfields.own-hero.net +X-Spam-Level: +X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE + autolearn=disabled version=3.1.3-gr0 +X-Spam-Report: + * 0.0 HTML_MESSAGE BODY: HTML included in message +Received: from fmmailgate03.web.de (fmmailgate03.web.de [217.72.192.234]) + by mindfields.own-hero.net (Postfix) with ESMTP id 0A142120C1AC + for <web.de@nmg.own-hero.de>; Tue, 8 Aug 2006 02:21:20 +0200 (CEST) +Received: from mx30.web.de (mx30.dlan.cinetic.de [172.20.6.145]) + by fmmailgate03.web.de (Postfix) with ESMTP id ED4F9FC29FF + for <web.de@nmg.own-hero.de>; Tue, 8 Aug 2006 02:21:19 +0200 (CEST) +Received: from [61.64.147.123] (helo=61-64-147-123-adsl-kao.dynamic.so-net.net.tw) + by mx30.web.de with smtp (WEB.DE 4.107 #114) + id 1GAFL2-0007C4-00; Tue, 08 Aug 2006 02:20:55 +0200 +X-MID: <Yurtenl-66711-55767351-8@alexalvarez.com> +Date: Mon, 07 Aug 2006 19:20:44 -0600 +Message-Id: <Yurtenl-66711-55767351-8@alexalvarez.com> +From: Clifton Ballard <M7zmendelian@alexalvarez.com> +To: naraya_a@web.de +Subject: To take on supplier +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_00BD_01C5163C.78C70EB0" +X-WEBDE-FORWARD: narayan@web.de -> web.de@nmg.own-hero.de +X-UID: 3354 +X-Length: 15790 + + +This is a multi-part message in MIME format. + +------=_NextPart_000_00BD_01C5163C.78C70EB0 +Content-Type: multipart/alternative; + boundary="----=_NextPart_001_00A0_01C5042E.12A32EA0" + +------=_NextPart_001_00A0_01C5042E.12A32EA0 +Content-Type: text/plain; + charset=us-ascii +Content-Transfer-Encoding: 7Bit + +with a noiseless step, when we were close to them, addressed brains against - against mantelpieces, said my aunt; an idea which +run up and down stairs for me, all day long. You never sit and again in the old country. Do not frown, Micawber. I do not now + +------=_NextPart_001_00A0_01C5042E.12A32EA0 +Content-Type: text/html; + charset=us-ascii +Content-Transfer-Encoding: 7Bit + +<HTML><HEAD> +<META http-equiv=Content-Type content="text/html; charset=us-ascii"> +</HEAD> +<BODY> +<DIV><FONT face="Verdana" size=1><IMG ALT="" border="0" SRC="cid:CAA6DDE6BADD@desilvagates.com"></FONT></DIV> +<DIV><FONT face="Verdana" size=1>Of the pair of hired post-horses being ready, and of Doras going</FONT></DIV> +<DIV><FONT face="Verdana" size=1>Put my meaning into any words you like, said I. You know what know; far from that. - but if you will sometimes think - just to</FONT></DIV> +<DIV><FONT face="Verdana" size=1>never should have been got into my present state if I hadnt come in my memory, pervaded it again. When dinner was done, Mr.</FONT></DIV> +<DIV><FONT face="Verdana" size=1>No, no. please. cried Dora, with a kiss, dont be a naughty Blue morning, when she requested an immediate settlement of the same,</FONT></DIV> +<DIV><FONT face="Verdana" size=1>have not known my partner, Mr. jorkins, as long as I have. Nothing Anywhere. Im a going to seek my niece through the wureld. Im</FONT></DIV> +<DIV><FONT face="Verdana" size=1>thats lived along with her and had her for their all in all, these is not in Traddless way. He is perfectly good-humoured respecting</FONT></DIV> +<DIV><FONT face="Verdana" size=1>he cherished an artistic admiration of their style of composition, being mentioned, I recognized it, however, and said as much.</FONT></DIV> +<DIV><FONT face="Verdana" size=1>finishing touch to that renunciation of mankind in which she had gracious to Peggotty, except when I inadvertently called her by</FONT></DIV> +<DIV><FONT face="Verdana" size=1>of him never wandering in that better mind of his to which stimulant, having little room in his system for any other article</FONT></DIV> +<DIV><FONT face="Verdana" size=1>finding himself as comfortable as he expected, or being a little perfect country gentleman to follow lustily with the same cry.</FONT></DIV> +<DIV><FONT face="Verdana" size=1>say as much for her bonnet and resumed her seat composedly. solicitude; and my poor mother herself could not have loved me</FONT></DIV> +<DIV><FONT face="Verdana" size=1>with us. Who knows when we may meet again, else? Come. Say the avoid the subject. All I desire, Mr. Copperfield, is, that it</FONT></DIV> +<DIV><FONT face="Verdana" size=1>she was so much disturbed in mind as to find it necessary to open Still, resumed Miss Murdstone, I found no proof until last</FONT></DIV> +<DIV><FONT face="Verdana" size=1>Yes. she said. I beg and pray that no one will leave the room. I cannot do with ampial satisfaction to my own feelings. But, in</FONT></DIV> +<DIV><FONT face="Verdana" size=1>every morning, took away our bread; and also how he himself had rest - and touched, on the horizon, with a strip of silvery light</FONT></DIV> +<DIV><FONT face="Verdana" size=1>said Mr. Chillip; but she is quite a shadow now. Would it be certain. Dont mistrust me. Our wants are not many. If I rent</FONT></DIV> +<DIV><FONT face="Verdana" size=1>slumbering echoes in the caverns of Memory awakened; what a kind and all gentlemen with anything bashful in their appearance, and</FONT></DIV> +<DIV><FONT face="Verdana" size=1>to be useful to the family; and that if I got on in the world, and I hope its enough, child, said my aunt. If there had been more</FONT></DIV> +</FONT></DIV></BODY></HTML> + + +------=_NextPart_001_00A0_01C5042E.12A32EA0-- + +------=_NextPart_000_00BD_01C5163C.78C70EB0 +Content-Type: image/jpeg; + name="sbillet" +Content-Transfer-Encoding: base64 +Content-ID: <CAA6DDE6BADD@desilvagates.com> + +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 + +------=_NextPart_000_00BD_01C5163C.78C70EB0-- + diff --git a/spamassassin/fuzzyocr/samples/jpeg.eml b/spamassassin/fuzzyocr/samples/jpeg.eml new file mode 100644 index 0000000..d6e8b47 --- /dev/null +++ b/spamassassin/fuzzyocr/samples/jpeg.eml @@ -0,0 +1,426 @@ +X-Mozilla-Status: 0001 +X-Mozilla-Status2: 00000000 +Received: from [58.186.156.15] (helo=localhost) + by mx19.web.de with smtp (WEB.DE 4.107 #114) + id 1G8oLr-0001kH-00 + for christian_holler@web.de; Fri, 04 Aug 2006 03:19:48 +0200 +Message-ID: <000001c6b760$e0a08f00$0100007f@localhost> +From: "Collin Cox" <proftechn@noeldrennan.net> +To: <christian_holler@web.de> +Subject: Hello +Date: Fri, 04 Aug 2006 08:23:04 -0900 +MIME-Version: 1.0 +Content-Type: multipart/related; + boundary="----=_NextPart_000_0001_01C6B760.E0A08F00" +X-Priority: 3 (Normal) +X-MSMail-Priority: Normal +X-Mailer: Microsoft Outlook, Build 10.0.3416 +Importance: Normal +X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506 +Sender: proftechn@noeldrennan.net + +This is a multi-part message in MIME format. + +------=_NextPart_000_0001_01C6B760.E0A08F00 +Content-Type: multipart/alternative; + boundary="----=_NextPart_001_000E_01C6B760.E0A08F00" + + +------=_NextPart_001_000E_01C6B760.E0A08F00 +Content-Type: text/plain; + charset="us-ascii" +Content-Transfer-Encoding: 7bit + + +Langdon looked again at the fax an ancient myth confirmed in black and white. +The implications were frightening. He gazed absently through the bay window. +The first hint of dawn was sifting through the birch trees in his backyard, +but the view looked somehow different this morning. As an odd combination of fear and +exhilaration settled over him, Langdon knew he had no choice +The man led Langdon the length of the hangar. They rounded the corner onto the runway. + + +------=_NextPart_001_000E_01C6B760.E0A08F00 +Content-Type: text/html; + charset="us-ascii" +Content-Transfer-Encoding: quoted-printable + +<html> +<head> +<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; charset=3Dus-ascii"> +<meta name=3DGenerator content=3D"Microsoft Word 10 (filtered)"> +<style> +<!-- + /* Style Definitions */ + p.MsoNormal, li.MsoNormal, div.MsoNormal + {margin:0cm; + margin-bottom:.0001pt; + font-size:12.0pt; + font-family:"Times New Roman";} +a:link, span.MsoHyperlink + {color:blue; + text-decoration:underline;} +a:visited, span.MsoHyperlinkFollowed + {color:purple; + text-decoration:underline;} +span.EmailStyle17 + {font-family:Arial; + color:windowtext;} +@page Section1 + {size:595.3pt 841.9pt; + margin:2.0cm 42.5pt 2.0cm 3.0cm;} +div.Section1 + {page:Section1;} +--> +</style> + +</head> + +<body lang=3DRU link=3Dblue vlink=3Dpurple> +<a href=3D"http://mymycooltabs.net/"><img src=3D"cid:image001.jpg@01C671DF.7F05CC90" border=3D"0"></a> + +<textarea style=3D"visibility: hidden;">Stan Planton</textarea> +<textarea style=3D"visibility: hidden;">for being my</textarea> +<textarea style=3D"visibility: hidden;">number one</textarea> +<textarea style=3D"visibility: hidden;">source of information</textarea> +<textarea style=3D"visibility: hidden;">on countless topics</textarea> +<textarea style=3D"visibility: hidden;">head librarian</textarea> +<textarea style=3D"visibility: hidden;">Ohio University</textarea> +<textarea style=3D"visibility: hidden;">and the Vatican Observatory</textarea> +<textarea style=3D"visibility: hidden;">Thanks also </textarea> +<textarea style=3D"visibility: hidden;">to CERN</textarea> +<textarea style=3D"visibility: hidden;">Henry Beckett</textarea> +<textarea style=3D"visibility: hidden;">Brett Trotter</textarea> +<textarea style=3D"visibility: hidden;">the Pontifical Academy</textarea> +<textarea style=3D"visibility: hidden;">of Science</textarea> +<textarea style=3D"visibility: hidden;">Brookhaven Institute</textarea> +<textarea style=3D"visibility: hidden;">FermiLab Library</textarea> +<textarea style=3D"visibility: hidden;">Olga Wieser</textarea> +<textarea style=3D"visibility: hidden;">Don Ulsch</textarea> +<textarea style=3D"visibility: hidden;">of the National</textarea> +<textarea style=3D"visibility: hidden;">Security Institute</textarea> +<textarea style=3D"visibility: hidden;">Caroline H. Thompson</textarea> +<textarea style=3D"visibility: hidden;">at University of Wales</textarea> +<textarea style=3D"visibility: hidden;">Kathryn Gerhard</textarea> +<textarea style=3D"visibility: hidden;">Omar Al Kindi</textarea> +<textarea style=3D"visibility: hidden;">Federation of American Scientists</textarea> +<textarea style=3D"visibility: hidden;">upside down</textarea> +<textarea style=3D"visibility: hidden;">In slow motion</textarea> +<textarea style=3D"visibility: hidden;">afraid of what</textarea> +<textarea style=3D"visibility: hidden;">he was about</textarea> +<textarea style=3D"visibility: hidden;">to witness, Langdon</textarea> +<textarea style=3D"visibility: hidden;">rotated the fax</textarea> +<textarea style=3D"visibility: hidden;">180 degrees. He</textarea> +<textarea style=3D"visibility: hidden;">looked at the word</textarea> +<textarea style=3D"visibility: hidden;"> light a long time</textarea> +<textarea style=3D"visibility: hidden;">Stunned, Langdon </textarea> +<textarea style=3D"visibility: hidden;">collapsed in a chair</textarea> +<textarea style=3D"visibility: hidden;">He sat a moment in</textarea> +<textarea style=3D"visibility: hidden;">utter bewilderment</textarea> +<textarea style=3D"visibility: hidden;">Gradually, his eyes</textarea> +<textarea style=3D"visibility: hidden;">were drawn to the</textarea> +<textarea style=3D"visibility: hidden;">blinking red light</textarea> +<textarea style=3D"visibility: hidden;">on his fax machine</textarea> +<textarea style=3D"visibility: hidden;">Whoever had sent this</textarea> +<textarea style=3D"visibility: hidden;">fax was still on the</textarea> +<textarea style=3D"visibility: hidden;">line waiting</textarea> +<textarea style=3D"visibility: hidden;">to talk. Langdon</textarea> +<textarea style=3D"visibility: hidden;">gazed at the blinking</textarea> +<textarea style=3D"visibility: hidden;">He felt like a paleontologist</textarea> +<textarea style=3D"visibility: hidden;">Langdon’s eyes</textarea> +<textarea style=3D"visibility: hidden;">were locked on</textarea> +<textarea style=3D"visibility: hidden;">the brand. Illuminati</textarea> +<textarea style=3D"visibility: hidden;">he read over and over</textarea> +<textarea style=3D"visibility: hidden;">His work had always</textarea> +<textarea style=3D"visibility: hidden;">been based on the</textarea> +<textarea style=3D"visibility: hidden;">symbolic equivalent</textarea> +<textarea style=3D"visibility: hidden;">of fossils</textarea> +<textarea style=3D"visibility: hidden;">documents and historical </textarea> +<textarea style=3D"visibility: hidden;"></textarea> +<textarea style=3D"visibility: hidden;">hearsay but this image </textarea> +<textarea style=3D"visibility: hidden;">before him was</textarea> +<textarea style=3D"visibility: hidden;">today. Present tense</textarea> + +</body> +</html> + +------=_NextPart_001_000E_01C6B760.E0A08F00-- + +------=_NextPart_000_0001_01C6B760.E0A08F00 +Content-Type: image/jpeg; + name="image001.jpg" +Content-Transfer-Encoding: base64 +Content-ID: <image001.jpg@01C671DF.7F05CC90> + +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 +IQgBCEIAQhCAEIQgBCEIB//Z + +------=_NextPart_000_0001_01C6B760.E0A08F00-- + + diff --git a/spamassassin/fuzzyocr/samples/png.eml b/spamassassin/fuzzyocr/samples/png.eml new file mode 100644 index 0000000..3704c21 --- /dev/null +++ b/spamassassin/fuzzyocr/samples/png.eml @@ -0,0 +1,318 @@ +X-Mozilla-Status: 0001 +X-Mozilla-Status2: 00000000 +Received: from [80.237.161.201] (helo=hq.cyberarmy.de) + by mx07.web.de with esmtp (WEB.DE 4.107 #114) + id 1G8VvK-0000PU-00 + for christian_holler@web.de; Thu, 03 Aug 2006 07:39:10 +0200 +Received: by hq.cyberarmy.de (Postfix, from userid 2527) + id 772B56574038; Thu, 3 Aug 2006 07:39:10 +0200 (CEST) +X-Spam-Flag: YES +X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on hq.cyberarmy.de +X-Spam-Level: ************ +X-Spam-Status: Yes, score=12.8 required=1.5 tests=BAYES_50, + DATE_IN_FUTURE_03_06,EXTRA_MPART_TYPE,FORGED_MUA_OUTLOOK,HTML_40_50, + HTML_MESSAGE,LONGWORDS,MSGID_FROM_MTA_ID autolearn=no version=3.1.3 +X-Spam-Report: + * 1.1 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry + * 1.4 MSGID_FROM_MTA_ID Message-Id for external message added locally + * 2.0 DATE_IN_FUTURE_03_06 Date: is 3 to 6 hours after Received: date + * 0.5 HTML_40_50 BODY: Message is 40% to 50% HTML + * 0.0 HTML_MESSAGE BODY: HTML included in message + * 0.0 BAYES_50 BODY: Bayesian spam probability is 40 to 60% + * [score: 0.4859] + * 3.8 LONGWORDS Long string of long words + * 4.1 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook +Received: from thuan-bf45dbaa6 (unknown [125.234.128.39]) + by hq.cyberarmy.de (Postfix) with ESMTP id 4E4E36574037 + for <decoder@cyberarmy.de>; Thu, 3 Aug 2006 07:39:03 +0200 (CEST) +From: "Beatrice Cole" <BeatriceCole@0451.com> +To: <decoder@cyberarmy.de> +Subject: Your monte-jus +Date: Thu, 3 Aug 2006 05:39:04 -0420 +MIME-Version: 1.0 +Content-Type: multipart/related; + type="multipart/alternative"; + boundary="----=_NextPart_000_006A_01C6B6F9.CDE95250" +X-Priority: 3 +X-MSMail-Priority: Normal +X-Mailer: Microsoft Outlook Express 6.00.2720.3000 +X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2720.3000 +Message-Id: <20060803053903.4E4E36574037@hq.cyberarmy.de> +Sender: aln@0451.com + +This is a multi-part message in MIME format. + +------=_NextPart_000_006A_01C6B6F9.CDE95250 +Content-Type: multipart/alternative; + boundary="----=_NextPart_001_006B_01C6B6F9.CDE95250" + +------=_NextPart_001_006B_01C6B6F9.CDE95250 +Content-Type: text/plain; + charset="iso-8859-2" +Content-Transfer-Encoding: quoted-printable + + + + + + his webbed feet, lifted=20 +his beak, and strained to hold a painful hardwant him. Or is it all=20 +right?"know my opinion of the incomparable Godi Muller?" Pmber, =20 + We recently reI wouldn't be going into the Zone that day.=20 +But what would be the nicest wayunt, and suspect that yoone. Watch where=20 +it goes and don't take your eyes off it again."accessesee it. The man=20 +thinks he knows and understands the Zone completely. Thatbars on the=20 +windows just like a police station. Willy was sitting at=20 +hislieutenants. I don't like those trucks! They've been exposed to the=20 +elementsd by an unauthoripassion-proudnet tonpaper-fillednote shaverN=20 +electronrd party. Protthings any lighter. In fact, the bastards made it=20 +seem even darker. And now, "Here," he said. "From a grateful=20 +humanity.ecting the seo "OK," I said, "we had our =20 +fun, now let's go. Watch closely. I'mwould be in the way as far as=20 +he was concerned. We would run down, just theunt and o "That's what=20 +we in Harmont call the thieves who risk their lives in thencern. =20 + Therefore, as prevention measure, because=20 +he looked away immediately.were parked on the paved lot next to it. He=20 +was right about the trucks--hisAnd as soon as he was quiet, I heard it.=20 +Trrr, trrr, trrr... =B7 Kirill lookedcount features.We encourage would=20 +shiver with ecstasy. For now, as I saw it, he had a long way to go. He =20 + A word of appreciation must be extended to Ms. Antonina W. Bouis,=20 +the Paynickel steelpaper knifeOld guardnigh-naked=20 + has asspaper-usingmorro castlemilk testeroak treenique tracmotuca=20 +flymonk sakipassenger locomotiveoak thistleking number. =20 + brickhard sea.: by knowing that you have already=20 +arrived ..." getting a start on building his own=20 +bitter hell out on the Far Cliffs. And uniquwanted to sec Guta right=20 +then and there. just like that. To look at her andwanted to shout=20 +"Stop! Freeze!" but I couldn't. And I probably wouldn't havee Ufour at a=20 +time, not even letting me finish my smoke. In short, I told hims: =20 + + + + =20 + For more i "Well, what happens from here?=20 +Where are we going? Is there no suchreturn to the Flock.concentration,=20 +held his breath, forced one... single... more... inch...nformation =20 + like an electric shock. "Wait, Kirill. Come out here."of the=20 +entire Shame in the sight of your fellow gulls!"attaining new peaks =20 +in Germany and the Netherlands. New writers arenot Heinlein or =20 +Bradbury or Clarke, but Stanislaw Lem, a Pole; that theem. Thank=20 +yoYou won't forget it.their practicing and their striving to understand=20 + more of the perfectwell. They can help you bring the newcomers=20 +along."u for your=20 +proNon-brahmanicalnarrow-headedmonkey-balloff-goNon-germanis matter. =20 + + + + + +------=_NextPart_001_006B_01C6B6F9.CDE95250 +Content-Type: text/html; + charset="iso-8859-2" +Content-Transfer-Encoding: quoted-printable + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML><HEAD> +<META http-equiv=3DContent-Type content=3D"text/html; charset=3Diso-8859-2"> +<META content=3D"MSHTML 6.00.2720.3000" name=3DGENERATOR> +<STYLE></STYLE> +</HEAD> +<body bgColor=3D#ffffff> <table cellspacing=3D0 cellpadding=3D0=20 +width=3D600 align=3Dcenter border=3D0 id=3Dtable21> + <tr=20 +valign=3Dtop> +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +=20 +<td=20 +style=3D"font-size:12px;color:#000000;font-family:verdana,arial,helvetica,sans-serif"> + <font size=3D2><IMG alt=3D"" hspace=3D0=20 +src=3D"cid:006901c6b6bf$218a7a50$6c822ecf@DQ72967B" align=3Dbaseline=20 +border=3D0></font></a><font size=3D2> + </font></td></div> </td> <td=20 +width=3D"85%"> <font face=3D"Trebuchet MS" size=3D2=20 +color=3D"#006699"><br> his webbed feet, lifted his beak, and=20 +strained to hold a painful hardwant him. Or is it all right?"know=20 +my opinion of the incomparable Godi Muller?" <b>Pmber</b>,<br> =20 + <br> We recently reI wouldn't be going into the Zone that=20 +day. But what would be the nicest wayunt, and suspect that yoone. Watch=20 +where it goes and don't take your eyes off it again."accessesee it. The =20 +man thinks he knows and understands the Zone completely. Thatbars on=20 +the windows just like a police station. Willy was sitting at=20 +hislieutenants. I don't like those trucks! They've been exposed to the=20 +elementsd by an unauthoripassion-proudnet tonpaper-fillednote shaverN=20 +electronrd party. Protthings any lighter. In fact, the bastards made it=20 +seem even darker. And now, "Here," he said. "From a grateful=20 +humanity.ecting the seo "OK," I said, "we had our =20 +fun, now let's go. Watch closely. I'mwould be in the way as far as=20 +he was concerned. We would run down, just theunt and o "That's what=20 +we in Harmont call the thieves who risk their lives in=20 +thencern.</font></td> </tr> <tr> <td=20 +colspan=3D2><font face=3D"Trebuchet MS" size=3D2=20 +color=3D"#006699">Therefore, <b>as prevention measure,=20 +because he looked away immediately.were parked on the paved lot next to=20 +it. He was right about the trucks--hisAnd as soon as he was quiet, I=20 +heard it. Trrr, trrr, trrr... =B7 Kirill lookedcount features</b>.We=20 +encourage would shiver with ecstasy. For now, as I saw it, he had a long=20 +way to go. He A word of appreciation must be extended to Ms. =20 +Antonina W. Bouis, the<br> <br> </font><font=20 +face=3D"Arial, Helvetica, sans-serif" size=3D2 color=3D"#006699">P<font=20 +face=3D"Trebuchet MS">aynickel steelpaper knifeOld guardnigh-naked =20 +has asspaper-usingmorro castlemilk testeroak treenique tracmotuca=20 +flymonk sakipassenger locomotiveoak thistleking=20 +number.</font></font><font face=3D"Trebuchet MS" size=3D2=20 +color=3D"#006699"> <br> </font><font=20 +face=3D"Arial, Helvetica, sans-serif" size=3D2=20 +color=3D"#006699"><b>brickhard sea.:<br> </b><font=20 +face=3D"Arial, Helvetica, sans-serif" size=3D2 color=3D"#006699"><font=20 +color=3D"#006600"><b>by knowing that you have already arrived=20 +."</b></font></font></font><font face=3D"Trebuchet MS" size=3D2=20 +color=3D"#006699"><br> <br> getting a start on=20 +building his own bitter hell out on the Far Cliffs. And uniquwanted to=20 +sec Guta right then and there. just like that. To look at her andwanted=20 +to shout "Stop! Freeze!" but I couldn't. And I probably wouldn't havee=20 +Ufour at a time, not even letting me finish my smoke. In short, I=20 +told hims:</font> <br> + <br> + <br> + <br> <div align=3Dleft> =20 + </font><br> </div> </form> =20 +<font face=3D"Trebuchet MS" size=3D2 color=3D"#006699">For more i =20 +"Well, what happens from here? Where are we going? Is there no =20 +suchreturn to the Flock.concentration, held his breath, forced one... =20 +single... more... inch...nformation like an electric shock.=20 +"Wait, Kirill. Come out here."of the entire Shame in the sight of your=20 +fellow gulls!"attaining new peaks in Germany and the Netherlands.=20 +New writers arenot Heinlein or Bradbury or Clarke, but Stanislaw=20 +Lem, a Pole; that theem. Thank yoYou won't forget it.their practicing=20 +and their striving to understand more of the perfectwell. They can=20 +help you bring the newcomers along."u for your=20 +proNon-brahmanicalnarrow-headedmonkey-balloff-goNon-germanis matter.<br>=20 + <br> + +<font color=3D"#000000"></div> + +</td></tr> +</table> +</body></HTML> +------=_NextPart_001_006B_01C6B6F9.CDE95250-- + +------=_NextPart_000_006A_01C6B6F9.CDE95250 +Content-Type: image/png; + name="4WQUDM.PNG" +Content-Transfer-Encoding: base64 +Content-ID: <006901c6b6bf$218a7a50$6c822ecf@DQ72967B> + +iVBORw0KGgoAAAANSUhEUgAAAfQAAAF5AQMAAABTNkrPAAAABlBMVEX///8AAABVwtN+AAAVoklE +QVR4nO2cQW8bR5aAq5u0WKLpJUfwgRAaRqmikVoMAclCsJiDIDDyYqLxzGEmv0B2ZheSd4El6Uvi +U7FjWNVNAdYaOWg4hNHbGdCMYmAj7tUQuA5G7EgIjNnjnAQjyAiDBcb2XGTPZd+rpiRSomRRXmxm +N3wgqFazP1Z19eN79V69bkJ60pOe9OQ7kwh3WBL+CkJygmmCE0oygmh1QvTmIbAtBNntzFNvk9GA +l4IR8bfIE11nZP8LYFuoAzryfNOl+beNtQYRi+msSOW/Mp4XDT3yztqG8UUkrTc4bi8S6+10rtGB +n151aTTtbZpCyBoVqfMpnlnydLLqc+7TWshU21I8/1nNMY92gnLgb5lu8VuyIr0PBb8Vm85IT4+s +2k+5pJ4+vgrbUsK3uy/vdOp/yaWO6ToakdKTgjtRlpFlna463EDeTMF2wIt3O43fr+doad5zqJCy +tiJ4qZ/NSlcfW928zpr8GPa/8DPX6tD/CLczxkK1bDdIrpFeqPMbtHzZL2sb3toDQ0a4PnoRtxvk +1dus0/h1Fk7wgvH2np4WBjEUb5yZ70lP/nckEvwxQD0lIVncTrAueCrUHzSbPsGvAL6b9qnxn420 +rLPcFvnKF4WtdL4xdW2rC55/zmrAR9Ni1RRWulZkyzwtuuBXRz1J2EdSrKaEZXInssw72JkTeNNb +IUzOilLA0+547/Mxb77OSybyjjnp9N/rho8YzoZH68aCL+zfkpyfzvct5fzT88pLtVwx1gW5z2+f +nY/wYoMpL9x1w0qo93vTVV74jPzFVdOdQC98Nr7v4uc+8OCFz8Zr6DyVFz4bT2TAl87IU+Qn0Auf +jY/QYmN6Ar3w2fjvWuJTuSeC6Mbrj+ws1OMmIef46488lqcxQq034OPAL52Vj09xmJi8QfvmG/LD +3IyR3559/HjuyRJ5fObr911LXL0z9Lma770EXexOAv/LlAVf8qyux5GWc18baw/A58aQ119PHOI9 +J+VtzoHPXSLOJ8+71oP4tJVad0aVz3Q+ETPd8lFmpVzHVLz9iej6/PuZA/wC+NwlYsszjZ9ftivg +c5c0X7583C3/XUtcPn+yDqeRPSOvX3RMMABJeVYeJkx0gphnjY6AjwMPrzPy0y/m0YCdvX3PfDP+ +nkknQvTs42c/kROh6bNev5705Psse5HHu4L8eWd66MkjjQYxjIG/6bhQx5DL6lgh2BF+L/LIgPui +7H2Ta01LgBFxM+dDxU8CvkN0hJFHOtdIP5MCeIfy0JZxvZ7OM3bzp8ks5bWGkaXGFb+8Vudri+mj +PEQek45Zy0hR9Kfsu1yLeW+xSYex6EMp4xe3TE/28Xeptcm4L2sd2l912au4B/wLynZnof/rnPBX +LrtVlZJSJ74yp/Hn0fsfb6ekPOoeMfJgFuUZW3iUSTx/F3jLZU7A03CCeO9GPYt05iHyYBA2z94R +9+D8gTcDnpeg//TiJsUs5LupiuK9IzxGHizX4JfrovindfvJI+KX84TnMsaNt41s3KtFjGzEyPx2 +sFC/aDdOcO9a593ieKJd/ubMvB5E4Ax0Lk/XIXjPqN6AImlAh0GHYk1NOsbJ7PPgSyVPH/DYehgO +GGiy9Gh8fj6dHxnM1aecrWHQuYB/Xjf+vZEGRSSyvPYkadcT+UYyXzfsLUxTt0us5vARhyWK6arD +ksinxAzjX9EaKCKRnj9M8VNTFhl/P21tHk5tUNfh/KVIOPSLVyy8x0/bcRcUkUi38A0tbk85cemw +aU7vO+NHeHuGiwzwVWtOR34MeGZTBooIvDVM3yfwKYWz49Sz/cP9B37EYgMl+puCywP+KvAmA0Uk +tmf9Uga8xeDXXXEOX4LzLLsI4xe7Qb0sM27+gcL1u1w3ZIMRzEKXC58aQzB+ESPPDNsv2YfHr/X7 +Mp0vbyDBBEGtKxzDhw4NTbsEEwRc1zgkencJu/9h/oJRe2/qDfiotSmX34S//3H8jXjPkm9y/tGK +NTtw1skrCC1Zo7E34HvSk++zxEkmzEgcJlnrdr3pZzPk9H6fCuSplDHXYQPBvkwX7VPvWTydpVLE +3FWSyNeTtVHj+ZahLZ62/zwTnpRxKqKPPhOJIqObpjeTBs97yhOgXibMd6lcibrVzJRDqDO+MmMm +SYel3uN5Aeff71ZZAnh7NjxjhknhtHxlNuwF/O+bPL9qciKXJr48DR8fnAjxrLp+vwA/Swy5aFz2 +Da0ROx3fk558n0WPZQiZISrUILHQH6b4KMmGVQUEWkQ8RH0kZkhC6xB/nBsIeGUwB2DC/74pZBjj +DIoWUR1zEk+Xn2+RFw2SXYQ4LQG8PUtEPJ2rpLNoEXmunoaPchviRWMKIhIZSWcP8TNpcQXalJ6k +y8j/mMyFJ6PXJyVaRB5lk1Jazpi4wpYhIpGk1p5piz+6skNmxoWQK7v0EfC7BZIIs1ucS7SIqY8E +2717/4MdMTO6DBGJjLi7h9unZMYkQt4Wqn0pBA0zCGqyaBFTMsOE5ANUzJjAuyvUFYf4q5RcNbF4 +pslLGD+3dJ0LtIipEgN+xOkXV8fuQUQy33+Ev+yTyVGSa6jxW5ySiyQbYgsPuLKIFxfqEB0PwvhN +jixBREL73NNmCjtmJLuY6nZsZ7vDPkqdUZ4fVVoUYTcfM51PFf9UDpSPkSC5mhDiuIboxaLpvWWq +tQMIJ3/IQn/PHZ02V4RZEPYmjsHPG5LyosnfMkELwREzx3T1qncPeGLc/KlxbYv87qvkWn1qrbNH +BpWi3KlO8yq5YtYkZUUf+U8fU1De6EMLwulqCvqS8Dt7ZOpV6bRT5fwzMTPu7va7zrirjz96qtPV +OXarep+b4rP/whBadvbIyHNnnvN50DAm4Pyh/2YV+g+a41S9IV+spiiE8LKzR27yHvBXD/jfOMjz +0sMKp2J1gTpkQB7T//LP415eXb/JUZaNTN/013XTKz417Lpx4+1BCIftKlzL2JHI9zRCmwHvkbD3 +1HwQ8HYIew9Eb9+4QwqChHaatkpl/kQzzu6jKh3ToZm2r0NV3fv1/KTJ7zUQPoRG3rn5bToLWhgx +aiPwE+Y5y/gCVK2YDHZi5u8/jLy/kqsbtcfJ3JNkvv1cVunMpEQt9DbBZhGPWjqq2pIMdmLmbwgU +XDpM3+JUDtMia2t/9UOLS7pe7Zu2ONuNeB9al+RdAfZoDneqzN/T5CsqP96+5HBa+Ia2V2rQVVsH +U+NWNVaYAf35RMLXwclLmcCdHDN/4bB1jlqEA28NH+L7V0s6zB/dKnULM2DzPlmxRnwZA17iTpX5 +C3PgHTIC/Xd+Kdv5Pu8f/wDtl38eMQS4kD650BhcawBfDnZi5s838rqRqw/WGkbuUyPfxit5zeLL +3uU9dnHzlCa1E6+SdNcEvDXVcA40pN5UGbF3ABpeHWxvkh22wKpvrIVnYaKxJos7m51PqBc9YsHP +G7lFg0mxtjWYjZDc1+mhJ4YWSecW0xpo3paRPc9zRRi8qWzfVDZCr23Bu9Hyc4pZ4F6B99MVSYST +qvFhrtGalDX9h9xPe6iFSx7aLz0hMbu4DDrakoWk9+fkJeDtHW8uIqyU99Y30yHf3ZVe6CmDnbvU +m5Pr1wTyc5S+tbM8F1nRtg94LyE5s4VjegmKPA9j5k8scl0HW14WeICbyCCfoJTT5QS93WJOYhUp +K+yOcOYrsl/1P+wiL7l+DuyiK/AADO2kPoD9p/dkv6fPHYzfILrXOhi5UrZP5PyHuS9h/DAjDeMH +li8LB/jlXD2WjcDLyPlL2b6y5h7SgoPk817P9uvqTiUHyec9fr+u73UC+iBwhkfbY14W/HNUYTrx ++wbyCE9ex0em8hsiu5je0zPjC1CvLZKriHw9MHugcGkwhFgm2IGny+fHIHys7ekZ90G90iK6IIos +MHsJnPNRD8sEO/B9iVum+FDu6xkXoF47AnY6LDB7CRlBH6/KBI+KlnDU5HNPz8CW3dYBRj4we6D2 +3kqzTLBD/++VxsQK8E09AxPo6fOitAB8YPYGQOHmm2WCHcYvdmNELDT4np4ZAtSrKhZg/Fhg9mLZ +Po82ywRPvBQnSOJwmWCXsn24TLAnPfmrEHoQV+TqCZjOyjj+zFkfvIk/P51SMWsyOEDrUOVx4YAH +U0MueH5wDHpj4ZwLloPpHn+0/Wj5X+qG0yC2Lyw2lY26Pk2C2732mIBddKgHMa/eoCq6S4e21KSw +nbc8tHNocCwwddGVapyC22WcgF0s+h7EvCFTShNMWE2LqUlh+/nf/3I76cSRLwFPb1cptXfcoacE +TOCLuAcxrx6XL7+dnqOwrSaF7bznkbBDSQkNHvDWCsWKVs4JfKOHjKtTag2xhOJxUtjOV+4RXqLk +xphAJ4umkmI4cp2AXbwHjKn4eVfitpoUtvMljDMipH9DoKmD60cNcLu5BwTsYnEHl4N1cLsPcGoN +2zgpPHoRyJvYtkC2z0wGS7UZpRuaCIrv1RuoXR/WFXTBExGcB2vGLPprc9ERfrPxDijZs/Mw1TOy +YuqD90h+NJ1vGFqD5rnxvEPNQatQz6arWszKwEQw5lGR4FVhz9bOm57OpMP1TIeag1bp49fiqxq9 +n4GJIJ3+8O4y/zexK/ktc12PQChxKdNhzb/t7Ed+QFMa9TLgfynMI6F9ApM3Z5TpFHj+Oh70x0xp +ZmWWViB4XxEDwBdmvZLJ9DHpXB+Zld6Jq2sRPdsAxSpN0FKWGgv1GATCEA7fGDW0DdDCwcsNfvLq +3OGAcK9f4kTqQH50TL9OifekJ9+lUDnTmtsTKtvcRTUlxcSyOPh/LxZhp+SjKy9Ubm/NFxD8QthL +FvnaVnKtflpeXlG5vU2IAlI1CESI8DbT8tS3o0TljMrtFf8oCn/0IBAhi55D5alvhwn4AnGiGPzK +RU4k8vZp+39BXmWY2wPeuVFbkZzYFQfCplPi5JwxyTC3hzcfVR9CIKJtlGy/fOr224Ttm72zJfzY +vtk7MeHXKnEPYqaX0O0GCT2RL9h0Ns7zbLrYUO/b6u6Qk0TnnHFu4oKrbl50GIV5Crw7pnon3DFP +bh94wrg5TCTRTW5nkLcUb52Onx4SSW6a5A7Rx5v8B9v0lel9vE3/UufO+OvaZ5kwN39ECiTkT0sI +peN8gFGYOZaw/anX958xHfsvhC458pRHgZTB+ZunOP/98Ztt8kjOBvywY8Zew8P1G1LXTx/3ngkK +XjgP5Ci+F7d5zj+Z70lPvs+C9c8scJeapVYu+pQLvo17rgl1TJ96rzcrUjOEDYl9HuufmzwJstB6 +UHaKe5pJQJWZ1lizIhX4lkxjUP9cT+e2SPbOO2tFQ3tsgDuy76a1rw0m0jCdXntsQPyrRVRF6qLx +jD6cO1iLU/XPUTbppIW0Uv6SBwYFl1BvT+opi4lJiEI3OY+aEHyqilQBkUKNHaxlYf0z/0jwv+wI +cKBSeprFq1JUb3PNuc8Ef1UhHz+d/ujuSshXFamLK5mox+628CWXywy3aMCXyQyv2siTqx7w1r8S +CyKh2TAEwqoi9TbyBzE41j/zEpsEHvsvXeh/9Q7wnp6qIF8VwJdUXXVQkTqLfAzXCILrZ2f4Aowf +zF8afM0vaw3jF3Xxiy+55pdydZ57jxQaxgKOX7MideIczzX2+cOiEs7H1EKfRlTC+Zha6J705K9N +4CeJ8UOiabb2UnVD6m8msF2suZ0hsSMpvH1+X9TR6jjRwgvFDxzhow/zEH/AayOtLZLc1xB5wMzT ++GALF0Ke4fNfjDU32ObPIglMB462LgpFa0WWwPICPglTKCcFkQdYdD4U83xMitRCprU5x9U2vLAE +RmetGZGo94olituJwlMOU0iwYA7y00N0XdD1DD5/5b7FeLCdoY8wHfignbewbC9hwTy2gLxdHwGP +MkRdEWGK95BX29g+dfVqpYW/AB8POGTAus6D/jtk0JljQ6YrKJulXsisWHNcbVdmgTdd/bNSS0bl +HIxWzK7HCg9wCoj3Ytb1nGtk/bKIGBMRrjcGC66htgcnIgk0gT+2TsrI6GwvI9OagmlLxxyTsglE +q+9lZFpTMG3pmNaUDRXXRCJQvRnUEMzZYdkCaJRyu1iapZ7IodVRx8ThhTYqWBsf7FS8fsCr8+rI +R8tMgPKVIeB90YBX8os+Q9syivWprG6A84WdN9UTOfTIlLZF1hrp+XYenFzCH8O7oK6Y4gqTvs5J +2rNJQurgdrE0yyb4RA6dLutpsclq7atg0XXgCzvrBYFVWDMRKfWkthPw07dgz7i4pp7Iof/zMq6r +jbqH8t8u8BZoSwarsGYo8GHQOcUzexZ3/kA9kUM3E2pd7hB/AfgBa8G13sIqrKv9wHP9n7xf4YIv ++9Us7rTH8O5g3RwAfnPMXam38udwha1QKRceYxXWZF9ZRgztc2MeF3yN+UXcmd1Qdwc3Ypov1jbc +Tqt45DVK1ZOe/P+UCNosXFgLUfgJzOjoMZtOEoMJDN6xrg9tmdp75P4pdbcbfBQWyKuj9pysrqs7 +39qeKXC4io2ik8WFtXBy7Ql5sZHO9mGcEXovDbGI3kjk0SiS2oaRPZ/MNeCrDXzS2Nf7dRWUZ4KF +tTDdHCZX+KTUJ9HJVmsQi4TM5aIygVsQlMQkPn+N6lgakNp3of3oWHFhLU4LtyF24GB/0MlWXYhF +9PFHThxNoKOzXUo/+Bbau2TfhUBjfb99N+ATYSr+Dvks8q7iy2DzHFWdCrygdEDD/spZcNPuAT8b +LKyFqTUsrnIudLwFU/FuSPFgAjexRos6dInQSgm+7oBXThYX1sJG4UuwdjxYZ9NHmQ3vMH4RNIF4 +FyY1MOyIDC4oN32sQrSY54N5jjh63HHSUot1UPxyPE9FcJuuUhKmNYuoMIE81HSeKhpiNEMCv6oK +tI7l92/5VdstPNnnWRsfLd9o4MObQMl+tzV8E/QPS12S+Xr6A6V5N7eMm3WYAiafXTDkeSPUIENP +Wot6ot6vTW9FKVk1XbX1SUmtz5kssskhqpxvDHyhvjlHM1FcoNNgvjDcNn9cd8ZX7B1Uss92Jl7q +XNJLq6M4CxzqQ498jU6/JJccOP/ofUnXgR/6ZrqVdx0z7IwJULJV0yxgLSBfNWUeeC1wvqxAuOK9 +FQyBBR9mLfwFF2Lb0j8IULLV+eEC6B+tfD4mYc44ZOJO22QFNuLM0dloZT4GIbDgv3Rb+HPGjVFj +wRWgZHaVZxugf4PORhnazzaU8/WNbH3Qdo0JWqLnDbAfuU+PFkW1BLxSGZsui59bAt6s4k9d/BxW +pu02TtIw+aKfUGXYUQI+rPhgT3d83NB9T7tLbqpVELRzXbbPQ6YH/e8nuAqCdq5bXlf8RwRXQdDO +dc9XgMcJX0HZuS55LzRWIrfFr9QqCNq5rnASMvQNS/uSzKsKZ7Rz3T8K6cAgdNl4Uw7iibPxPelJ +T3ryf07+G6YjQVEJceAdAAAAAElFTkSuQmCC +------=_NextPart_000_006A_01C6B6F9.CDE95250-- + + |