TUCoPS :: Crypto :: mimic.pl

CyberArmy Spam Steganograpy SPM:

#!/usr/local/bin/perl
#
################################
# CyberArmy Spam Steganography #
################################
#
# Mimic.pl:
#
#	This uses steganography to encode a message into spam.  Rather like 
# the scripts put up by spammimic.com and others, even if this uses another 
# algorithm.  The workings of &encode and &decode are discussed in thier 
# comments below, but this is the message format used:
#
#	[GREETING][BEGIN][DATA][END][CLOSING]
#
#	Each spam has a greeting and closing made specifically for that genre 
# of spam, whether the spam is credit fraud, phoney cures or MMF.  It also 
# picks one of 3 pairs of begin and end lines.  On each line of spam, \n's are 
# replaced with a token [ESC - \033] so they don't mistakenly get encoded as 
# two charactors, while the lines of spam themselves are randomly punctuated by
# &addpunct to add variety.  It also formats the spam into paragraphs of 4-8 
# lines so it looks much more natural, while it turns tabs into spaces and also 
# specially encodes spaces by doubling the punctuation [eg. '.' -> '..' and so 
# on]  In the mean time, each charactor is run through &munge which implements 
# a simple series of transliterations to keep repeated lines to a minimum.
#
#
# Credits:
#
#	(c) 2001 Xenographic of the CyberArmy [www.cyberarmy.com]
#	Released under the BSD license for unrestricted free use.
#	This notice is all that must remain unchanged.
#
#	Spammimic.Com
#		They came up with the idea & this is a copy of it.
#
#	News.Admin.Net-Abuse.Sightings [NANAS]
#		I got the spam from there, using groups.google.com.
#
#	O'Reilly Publishing
#		Their books are the best; I also use some boilerplate code from 
#		them.
#
#	DAL Net #perl [http://www.dalnet-perl.org]
#		Helped me clean up a few bugs that crept in.
#
#	51 of www.cyberarmy.com
#		He suggested some improvements to the coding style.
#

INIT {	# Make sure other INIT blocks see all this.
	$corrupt = 0;		# Flag if the data has been corrupted somehow.
	$fakeNL = v33;		# Pretend \n is ESC internally.
	$tab = " " x 5;		# So we can change tabs to spaces.
	$verbose = 1;		# Turns on verbose error messages.
	$debug_info = "";	# Holds verbose error messages.
}

&output_header; 		# Prints the page's header.

# Give them a form to enter data if they just got here.
my %data = getDATA() or &ourFORM;	
my $input = $data{"MESSAGE"} or &ourFORM("You forgot to enter a message!");
$action = $data{"ACTION"};	# Remember for later.

# Decide which action to do.
if ($action eq "DECODE") {
	&decode($input);
} else {
	&encode($input);
}

&ourFORM("You forgot to tell me what to do with that data!");
exit;	# Explicit.


#################
# output_header #
#################
#
# Outputs the HTML header.
#

sub output_header {

print "Content-type: text/html\n\n";	# Tell browser what this data is.
$| = 1;					# Turn off buffering.

print <<'ENDHTML';

	<HTML><HEAD>
	<TITLE> Spam Steganography </TITLE>
	<STYLE TYPE="text/css">
	<!--
		A:hover   { 
		  color: #C0C0C0;
		  background: white;
		  text-decoration:underline; 
		}
		H1, H2, H3 { 
		  margin-left: 0%;
		  color: #FFAA33;
		 font-family: arial, verdana, helvetica, sans-serif;
		}
	-->
	</STYLE>
	</HEAD>

	<BODY BGCOLOR=#263C6D TEXT="white" LINK="#FFFFFF" VLINK="#C0C0C0" ALINK="#C0C0C0">

	<H1>Spam Steganography</H1>

	This utility is our own rip-off of the 
	<A HREF="http://www.spammimic.com/">Spam Mimic</A>. It's improved in 
	some ways, even if it may sound really idiotic (doesn't all spam?) and 
	it doesn't allow accents.  Don't put any long messages in there, since 
	it becomes *VERY* long the more you put into it. Still, it's one more 
	thing for email snoops to worry about :] <BR><BR>

	-Xenographic <BR><BR>

ENDHTML

}

###########
# getDATA #
###########
#
# Gets the data sent to the script.
#
# Ripped from boilerplate code on p. 81 of O'Reilly's 
# "CGI Programming with Perl."
#

sub getDATA {

	my %form_data;
	my $name_value;
	my @name_value_pairs = split /&/, $ENV{QUERY_STRING};

	if ($ENV{REQUEST_METHOD} eq 'POST') {
		my $query = "";
		read ( STDIN, $query, $ENV{CONTENT_LENGTH} ) == $ENV{CONTENT_LENGTH}
			or return undef;
		push @name_value_pairs, split /&/, $query;
	}

	foreach $name_value (@name_value_pairs) {
		my($name, $value) = split /=/, $name_value;

		$name =~ tr/+/ /;
		$name =~ s/%([\da-f][\da-f])/chr(hex($1))/egi;

		$value = "" unless defined $value;
		$value =~ tr/+/ /;
		$value =~ s/%([\da-f][\da-f])/chr(hex($1))/egi;

		$form_data{$name} = $value;
	}

	return %form_data;
}

###########
# escHTML #
###########
#
# This does a bit more than escapeHTML in cgi.pm would, namely it encodes 
# whitespace properly for our uses here.
#

sub escHTML {
	my ($info) = @_;	# Get HTML
	return undef unless defined($info);

	$info =~ s/&/&amp;/g;		# Escape chars into proper HTML.
	$info =~ s/</&lt;/g;
	$info =~ s/>/&gt;/g;
	$info =~ s/\"/&quot;/g;

	$info =~ s/\t/$tab/g;		# Change tabs to spaces.
	$info =~ s/$fakeNL/<BR>/og;	# Decode hidden \n's.
	$info =~ s/\n/<BR>/g;		# Decode non-hidden \n's.
	1 while $info =~ s/  /&nbsp; /g;# Some spaces cannot be 
					# &nbsp;'s or it becomes one 
					# long line.  This allows it  
					# to show all spaces & work.

	return $info;
}

###########
# ourFORM #
###########
#
# Writes out the HTML form used and the footer, as well as any messages. By the
# time you get here, there is no time to do anything else, since you'll output 
# the </HTML> tag.
#

sub ourFORM {

	my ($info) = @_;
	$info = escHTML($info);

	print <<EHTML;

	<FORM METHOD=POST>
	  <TABLE BORDER=0>

	    <TR VALIGN=TOP>
	      <TD ALIGN=LEFT>Message:</TD>
	    </TR>
	    <TR>
	      <TD ALIGN=LEFT COLSPAN=3>
	      <TEXTAREA NAME="MESSAGE" ROWS=5 COLS=60></TEXTAREA></TD>
	    </TR>

	    <TR VALIGN=TOP>
	      <TD ALIGN=LEFT VALIGN=CENTER>
	        <INPUT CHECKED TYPE=RADIO NAME=ACTION VALUE="ENCODE"> Encode </TD>
	      <TD ALIGN=CENTER VALIGN=CENTER>
	        <INPUT TYPE=RADIO NAME=ACTION VALUE="DECODE"> Decode </TD>
	      <TD ALIGN=RIGHT><INPUT TYPE=SUBMIT VALUE="Submit"> </TD>
	    </TR>

	  </TABLE>
	</FORM>

EHTML

	unless ($corrupt == 0) { # Print a notice that something went wrong.
		print qq!
			<B>The program says that some data was lost or incorrect. 
			Double check it before use.!;
			print "<BR> ERROR: $debug_info " if $verbose;
		if ($action eq "DECODE") {
			print qq! <BR>[?'s may indicate corrupted data]!;
		}

		print qq!</B><BR><BR>!;
	}

	if ($action eq "ENCODE") {
		# Print the notice that they just encoded something.
		print qq!Your message becomes the spam: <BR><BR>!;
	}

	if ($action eq "DECODE") {
		# Print the notice that they just decoded something.
		print qq!The secret message in that spam is: <BR><BR>!;
		# Make sure they get *some* feedback.
		$info = "[ERROR: NO DATA]" unless defined $info;
	}

	if (defined $info) {
		# Don't print anything when there's no message to be given.
		print <<"EINFO";
			<TABLE WIDTH="100%" BORDER=1>
			<TR><TD>$info</TD></TR>
			</TABLE>
EINFO
	}

	# Put your page footer in here.
	print <<"FOOTER";
	</BODY> </HTML>
FOOTER

	exit;	# Done, there's nothing left to do now...
}

##########
# encode #
##########
#
# Turns a message into spam.  It picks a genre of spam, selects one of the pairs
# of greetings and endings (greetings are 2 lines, the last sentence is only one
# line, that's why it looks odd below with the 1,3,5 array indexes).  It then 
# goes through each charactor & encodes it as a line of spam.  It also puncuates
# each line with a random ! or . [which is why the data section cannot have any 
# lines with !'s or .'s in them].  When it encodes a space, it just adds another
# punctuation mark [whichever one it last used, to make it .. for 1 space, ...
# for 2, etc.] Finally, it adds a "pad" to the end appropriate to the genre and 
# prints it out for you.  We hide \n's as ESC [\033] internally, since they seem 
# to get confused otherwise.
#

sub encode {

	my ($message) = @_;	 # Get message to encode.
	my $badchars = $message; # Save a copy to find the bad chars in it.
	$encoded = "";		 # Place to put the message as it's encoded.

	# Replace everything except chars we understand with ?'s.
	# Be *very* careful when changing these...
	if ($message =~ tr[-^a-zA-Z0-9_ \t\n\r\f\\/:;",.?+~'<>{=}()!@#$%&*][?]c) {

		# This had something more...
		$corrupt = 1;		# Uh oh, it had bad chars in it.

		# Use the same regex as above, w/o the ^ negation and substitue the
		# null string instead to be left with what was NOT understood.
		$badchars =~ tr[-^a-zA-Z0-9_ \t\n\r\f\\/:;",.?+~'<>{=}()!@#$%&*][]d;

		# Remove dupes in $badchars.
		$badchars =~ tr[-^a-zA-Z0-9_ \t\n\r\f\\/:;",.?+~'<>{=}()!@#$%&*][]cs;

		$badchars = &escHTML($badchars);	# So they show up in HTML.
		$debug_info .= " Found the illegal char(s) [$badchars] when encoding them. " if $verbose;
	}

	$message =~ s/\t/$tab/ego;		# Interpret tabs.
	$message =~ s/[\r]?\n/$fakeNL/eg;	# Hide \n's from the encoder.
	$message =~ s/\f/$fakeNL/eg;		# Just because... :]

	$genre = 1 + int rand(3);		# Choose a random spam genre.
	$endgrt = (int rand(3));		# Random ending.
	$greet = $endgrt * 2;			# Greeting to go with ending above.

	if ($genre == 1) {	# Load data on business spam.
		&get_spamtype("business");
		$encoded .= ($bus_start[$greet] . "\n\n" . $bus_start[$greet + 1]);
		$end = $bus_end[$endgrt];
	}

	if ($genre == 2) {	# Load data on credit spam.
		&get_spamtype("credit");
		$encoded .= ($cre_start[$greet] . "\n\n" . $cre_start[$greet + 1]);
		$end = $cre_end[$endgrt];
	}

	if ($genre == 3) {	# Load data on miracle cure spam.
		&get_spamtype("cures");
		$encoded .= ($cur_start[$greet] . "\n\n" . $cur_start[$greet + 1]);
		$end = $cur_end[$endgrt];
	}

	@arrmsg = split //, $message;

	foreach $char (@arrmsg) {

		if ($char eq " ") {		# Spaces become punctuation
			&addpunct("last");	# Add more punctuation to encode
						# a space [eg. '.' -> '..']
		} else {
			&addpunct;		# &addpunct gets sneaky here in 
						# how it adds things, it makes 
						# sure that it wasn't intending 
						# to start a new paragraph, as 
						# it does sometimes.

			$char = &munge($char);	# Make the spam less repetetive.

			if (defined $tospam[$getindx{$char}]) {	# Writes out a line of spam.
				my $curpunct = &peekpunct; 	# Find punctuation to use.
				$encoded .= " " . $tospam[$getindx{$char}] . $curpunct;

			} else {		# Warn about unencodeable chars.
				$corrupted = 1;
				$char = &escHTML($char);
				$debug_info .= " Didn't know how to encode [ $char ] " if $verbose;
			}
		}
	}

	$encoded .= (" \n\n" . $end . " " . $pad);	# Write out appropriate ending.
	&ourFORM($encoded);				# Print out the spam.
	exit;	# Explicit.
}

##########
# decode #
##########
#
# Turns a message back to normal.  It first checks to see which beginning tag you used.  If it 
# doesn't find any of them, it reports an error.  Otherwise, it strips off everything between 
# the beginning tag it found and the ending tag that goes with that [it reports an error if it 
# cannot find the end tag, but valiantly attempts to decode what it can, first].  From the tags 
# it finds, it deduces the proper genre and loads the info for that sort of spam.  It then splits 
# the spam on the line delimiters (! and .) and matches each line against all possible letters. 
# If the line is blank, it knows that it hit a .. or !! or something, which encodes a space, so 
# it adds them in there, as appropriate and changes all unknown lines to ?'s.
#

sub decode {

	my ($message) = @_;
	$message = &validate_spam($message);
	@spltmsg = split /[.!]/, $message;
	$decoded = "";

	for (@spltmsg) {	# Remove extra whitespace so it doesn't hinder matches.
		s/^\s+//;
		s/\s+$//;
	}

	TRANS: foreach $line (@spltmsg) {

		if ($line =~ /^[\s]?$/o) {	# Decode spaces, which become 
						# blank lines after the split
			$decoded .= " ";	# since they were extra 
						# punctuation (.!) before.
			next TRANS;
		}

		for (my $i = $[; $i < $#tospam; ++$i) { # Just in case you changed $[
			# Figure out what symbol it is supposed to be.
			if ($line eq $tospam[$i]) {
				$decoded .= munge($indx[$i]); # Descramble it.
				next TRANS;
			}
		}

		$line = &escHTML($line);
		$debug_info .= " Didn't understand [ $line ] in spammish. " if $verbose;
		$decoded .= "?";	# Corrupted data :[
		$corrupted = 1;
	}

	&ourFORM($decoded);
	exit;	# Explicit.
}

#################
# validate_spam #
#################
#
# Figure out if it's one of our spams.  It looks for beginning and ending tags [if they're not 
# found, it reports an error] and strips out everything between those tags.  It then figures 
# out the genre of spam it just matched and loads the info for that type of spam and goes back 
# to &decode which actually decodes the spam.
#

sub validate_spam {

	my ($message) = @_;
	$message =~ s/[\n\r]/ /g;	# Collapse it into one long line.
	$message =~ s/\s+/ /g;		# Remove extra whitespace which may have snuck in.

	# Now see if this is one of *our* spams.  Spam
	# headers are 2 lines, here I only care about 
	# every 2nd line, which is at 1, 3 & 5 in the 
	# array.  I hope you guys aren't using $[ but 
	# if you are this works, since I check against 
	# $[ - 1 rather than just -1.

	FIND: {
		my $pos;
		for (my $i = 1; $i < 6; $i += 2) {

			$pos = index($message, $bus_start[$i]);
			if ($pos != ($[ - 1)) {				# If it matched...
				&get_spamtype("business");		# Load data on the buisness genre.
				$pos += length($bus_start[$i]);		# Move to the end of the start tag.
				$message = substr($message, $pos);	# Grab everything after the start tag.
				$i = int ($i - 1) / 2;			# Correct $i, since the arrays are goofy.
				$pos = index($message, $bus_end[$i]);	# Find the end of the data.
				if ($pos == ($[ - 1)) {			# If it failed...
					$corrupted = "1";		# Warn about missing/corrupted data.
					$debug_info .= " No ending tag found. " if $verbose;
				} else {
					$message = substr($message, 0, $pos);	# Strip off the ending tag and anything after it.
				}
				last FIND;	# Go translate it now.
			}

			$pos = index($message, $cre_start[$i]);
			if ($pos != ($[ - 1)) {				# If it matched...
				&get_spamtype("credit");		# Load data on the credit genre.
				$pos += length($cre_start[$i]);		# Move to the end of the start tag.
				$message = substr($message, $pos);	# Grab everything after the start tag.
				$i = int ($i - 1) / 2;			# Correct $i, since the arrays are goofy.
				$pos = index($message, $cre_end[$i]);	# Find the end of the data.
				if ($pos == ($[ - 1)) {			# If it failed...
					$corrupted = 1;			# Warn about missing/corrupted data.
					$debug_info .= " No ending tag found. " if $verbose;
				} else {
					$message = substr($message, 0, $pos);	# Strip off the ending tag and anything after it.
				}
				last FIND;	# Go translate it now.
			}

			$pos = index($message, $cur_start[$i]);
			if ($pos != ($[ - 1)) {				# If it matched...
				&get_spamtype("cures");			# Load data on the miracle cure genre.
				$pos += length($cur_start[$i]);		# Move to the end of the start tag.
				$message = substr($message, $pos);	# Grab everything after the start tag.
				$i = int ($i - 1) / 2;			# Correct $i, since the arrays are goofy.
				$pos = index($message, $cur_end[$i]);	# Find the end of the data.
				if ($pos == ($[ - 1)) {			# If it failed...
					$corrupted = 1;		# Warn about missing/corrupted data.
					$debug_info .= " No ending tag found. " if $verbose;
				} else {
					$message = substr($message, 0, $pos);	# Strip off the ending tag and anything after it.
				}
				last FIND;	# Go translate it now.
			}

		}

		# This isn't one of our spams.
		&ourFORM("Sorry, that spam doesn't contain any hidden messages!");
		exit;	# Explicit.

	}; # Go on to translate the spam.

	return $message;

}


############
# addpunct #
############
#
# This function generates random !'s and .'s to punctuate the spam and to encode
# spaces (they are encoded as one extra punctuation mark in the spam for each 
# space encoded, eg. ! -> !! for one space). It also adds newlines every so often 
# to form simulated paragraphs about every 4-8 lines of spam, so it doesn't look 
# like one big, long & ugly block of jibberish.  It operates on the assumption that
# $encoded is both visible to it and holds the text to be encoded.
#

{	# This block holds some variables for &addpunct so they aren't exposed.

	my $punctcount;
	my $curpunct;
	my $nextp;
	my $choice;
	my $first_time;

	INIT {
		$punctcount = 0;		# How many punctuation marks to output.
		$curpunct = '!';		# Current punctuation.
		$nextp = 4 + int rand(5);	# When to start the next paragraph.
		$choice = 1 + int rand(3);	# The next punctuation to choose ('.' twice or '!')
		$first_time = 1;		# Don't add the extra space the first time.
	}

	sub peekpunct {
		return $curpunct;
	}

	sub addpunct {

		my $mode = shift;

		if ($mode) {	# They want what they had last time.
				# No need to check if it's equal to "last" since it's
				# undef the rest of the time.

			if ($punctcount) {
				# Add punctuation unless a new paragraph is starting.
				++$punctcount;
			} else {
				$encoded .= $curpunct unless $first_time;
				$first_time = 0;
			}	
				return;
		}

		# They want some new punctuation...

		if ($punctcount) {		# Start new paragraphs neatly.
			$encoded .= ($curpunct x ($punctcount - 1)) . "\n\n";
			$punctcount = 0;	# Sub 1 because this miscounts.
		}

		$choice = 1 + int rand(3);	# Choose the next punctuation.

		if ($choice == 3) {
			$curpunct = "!";
		} else {
			$curpunct = ".";
		}

		if (--$nextp == 0) {		# Decide when to start new paragraphs.
			++$punctcount;
			$nextp = 4 + int rand(5);
		}

		return;
	}
}

#########
# munge #
#########
#
# This function scrambles the data a little so that the spam isn't quite as 
# repetetive and may be slightly harder to decode.  Note that ALL routines must 
# be SYMETRIC.  This means that if c -> q then q -> c and that the transforms of
# uppercase letters is the same as the one for lowercase letters (q -> c and 
# Q -> C).  If you change that, the input will not match the output and you will
# wind up with garbage :]  This should give the spam a period of about one 
# paragraph before repeating on average, unless you're unlucky and it transforms 
# just so.  It's not like this will stop the NSA from decrypting this; it just 
# makes it look nastier, I think.  You should not munge spaces--they're taken 
# care of separately in the encoding scheme.
#

{
	# This block contains some of the initialization code for &munge
	# It just helps it keep track of local variables and such while 
	# scrambling the data to make the same sentences repeat less often.
	# It is here to keep this info private.

	my $seed;	# The seed for the munger.
	my $oldseed;	# The last seed used.
	my $maxseed;	# This is how many munges there are below, make
			# sure it's right by reading &munge below.
	my $ch;		# The charactor we're munging in &munge.

	INIT {		# Initializes some variables for these routines.

		$seed = 0;
		$oldseed = 0;
		$maxseed = 7;
		$ch = "";
	}

	sub getseed {	# This advances the seed making sure it gets reset.

		$oldseed = $seed;

		if ($seed == $maxseed) { # Reset seed.
			$seed = 0;
		} else {		 # Advance seed.
			++$seed;
		}

		return $oldseed;	# They want the *old* value.
	}

	sub charuc {	# Swap case on an uppercase char half the time.

		my $ch = shift;
		$ch = lc $ch if (($seed % 2) == 1);
		return $ch;
	}

	sub charlc {	# Swap case on a lowercase char half the time.

		my $ch = shift;
		$ch = uc $ch if (($seed % 2) == 1);
		return $ch;
	}
}

sub munge {	# Here is where we actually munge each character.

	my $ch = shift;
	my $seed = &getseed;

	if ($ch =~ /^[a-z]$/o) {

	# Do you like those tr///s?  It's one way of enforcing the BSD license as those are 
	# a /pain/ to mess with :]  -xeno

		LWRTRANS: {			# Transform lowercase letters.

			if ($seed == 0) {	# Transform 0
				$ch =~ tr/xenoaisrhldcuqzvtjkbywgpfm/qzvtjkbywgpfmxenoaisrhldcu/;
				last LWRTRANS;
			}

			if ($seed == 1) {	# Transform 1
				$ch =~ tr/xenoaisrhldcukvtmzqbjfywpg/kvtmzqbjfywpgxenoaisrhldcu/;
				last LWRTRANS;
			}

			if ($seed == 2) {	# Transform 2
				$ch =~ tr/xenotaizqjkvsfbyrchpdgwmlu/fbyrchpdgwmluxenotaizqjkvs/;
				last LWRTRANS;
			}

			if ($seed == 3) {	# Transform 3
				$ch =~ tr/xenoaibywldcuvktzprsqghjfm/vktzprsqghjfmxenoaibywldcu/;
				last LWRTRANS;
			}

			if ($seed == 4) {	# Transform 4
				$ch =~ tr/xenoshdcuzqkvglrjayibtmwfp/glrjayibtmwfpxenoshdcuzqkv/;
				last LWRTRANS;
			}

			if ($seed == 5) {	# Transform 5
				$ch =~ tr/xenotasywgpfmirlvjbkzhqcdu/irlvjbkzhqcduxenotasywgpfm/;
				last LWRTRANS;
			}

			if ($seed == 6) {	# Transform 6
				$ch =~ tr/xenozjisrgpfmtqlwcdkaubhyv/tqlwcdkaubhyvxenozjisrgpfm/;
				last LWRTRANS;
			}

			if ($seed == 7) {	# Transform 7 - $maxseed should equal this (7).
				$ch =~ tr/xenojtkbrwlcmphizadyvqsufg/phizadyvqsufgxenojtkbrwlcm/;
				last LWRTRANS;
			}

			# We should not get here, check below & make sure the seed gets reset 
			# after going through the last transform above.

			warn "Bad seed value $seed found in swapcaps routine.";

		}

		$ch = &charlc($ch);	# Swap case half the time.
		return $ch;

	} elsif ($ch =~ /^[A-Z]$/o) {

		UPRTRANS: {			# Transform uppercase charactors.

			if ($seed == 0) {	# Transform 0
				$ch =~ tr/XENOAISRHLDCUQZVTJKBYWGPFM/QZVTJKBYWGPFMXENOAISRHLDCU/;
				last UPRTRANS;
			}

			if ($seed == 1) {	# Transform 1
				$ch =~ tr/XENOAISRHLDCUKVTMZQBJFYWPG/KVTMZQBJFYWPGXENOAISRHLDCU/;
				last UPRTRANS;
			}

			if ($seed == 2) {	# Transform 2
				$ch =~ tr/XENOTAIZQJKVSFBYRCHPDGWMLU/FBYRCHPDGWMLUXENOTAIZQJKVS/;
				last UPRTRANS;
			}

			if ($seed == 3) {	# Transform 3
				$ch =~ tr/XENOAIBYWLDCUVKTZPRSQGHJFM/VKTZPRSQGHJFMXENOAIBYWLDCU/;
				last UPRTRANS;
			}

			if ($seed == 4) {	# Transform 4
				$ch =~ tr/XENOSHDCUZQKVGLRJAYIBTMWFP/GLRJAYIBTMWFPXENOSHDCUZQKV/;
				last UPRTRANS;
			}

			if ($seed == 5) {	# Transform 5
				$ch =~ tr/XENOTASYWGPFMIRLVJBKZHQCDU/IRLVJBKZHQCDUXENOTASYWGPFM/;
				last UPRTRANS;
			}

			if ($seed == 6) {	# Transform 6
				$ch =~ tr/XENOZJISRGPFMTQLWCDKAUBHYV/TQLWCDKAUBHYVXENOZJISRGPFM/;
				last UPRTRANS;
			}

			if ($seed == 7) {	# Transform 7 - $maxseed should equal this (7).
				$ch =~ tr/XENOJTKBRWLCMPHIZADYVQSUFG/PHIZADYVQSUFGXENOJTKBRWLCM/;
				last UPRTRANS;
			}

			# If this triggers, you need to check below to ensure that the seed is 
			# being reset after going through all transforms above.

			warn "Bad seed value $seed found in swapcaps routine.";

		}

		$ch = charuc($ch);	# Switch case half the time.
		return $ch;

	} else {	# Mess with some of the common punctuation & numbers so they're 
			# even less obvious :]
	
		if (($seed % 2) == 1) {	# Be careful that these stay *symmetric* :]
			$ch =~ tr/01234567?!@.$9)8#^(&%*/.$9)8#^(&%*01234567?!@/;
			# Ugly, huh? :]  Don't even try changing that...
	
		} else {
			$ch =~ tr/12345678@&^?).*%!#9$(0/?).*%!#9$(012345678@&^/;
			# It may look like a core dump, but it's not...
		}
		return $ch;
	}
}

################
# get_spamtype #
################
#
# Get the info on the genre of spam we have to translate.
# Parts in the data section (@tospam) CANNOT contain 
# periods (.) or exclamation marks (!) or it will encode 
# extra spaces which don't belong there or make the data 
# unreadable.  Whitespace is also stripped & collapsed to 
# make matches easier, since it is often changed in 
# transmission.
#

sub get_spamtype {

	$needs = $_[0];

	INIT {	# This is always used, so we might as well load it right away.
		# The number of chars here *must* correspond to the number of 
		# lines in EACH @tospam below, or things won't work right.
		# Be *really* careful when chaging it...

		@indx = qw[a b c d e f g h i j k l m n o p q r s t u v w x y z
			   1 2 3 4 5 6 7 8 9 0 ( ) { } < > \ / - + * = ~ ^ $ @
			   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
			   ; : . & ? ! ' " _ %];

		push @indx, '#', ',', $fakeNL;		# So qw// won't whine.


		%getindx = undef;			# Just so Perl doesn't whine.
		for ($i = $[; $i < $#indx; ++$i) {	# Build a reverse lookup of @indx so I 
			$getindx{$indx[$i]} = $i;	# can find the position of any element.
		}

		# These are the delimiters of the spams, change them if you like, but make 
		# sure that you don't add or remove any lines or it won't work.  It's best 
		# if the start blocks end with a ! or ? since the script adds a ! for the 
		# punctuation of a space is the first charactor of the message to encode.
		# [?! or !! look better than .! :]

		@bus_start = <<'EB' =~ m/(\S.*\S)/og;
			Dear E-Entrepreneur;
			With all the money-making opportunities on the net why aren't you a millionaire yet?
			Dear E-Business Owner,
			You could be a millionaire! Can you accept this in your life?
			Dear Internet Professional -
			You were referred to me as someone who was ready for a Financial Breakthrough!
EB

		@bus_end = <<'EBE' =~ m/(\S.*\S)/og;
			TO BE INCLUDED IN FUTURE MAILINGS, PLEASE VISIT OUR WEBSITE!
			Call 1-530-343-9681 to place your credit card order TODAY!
			$$$ FINALLY YOU CAN MAKE SOME DREAMS COME TRUE! $$$
EBE

		@cre_start = <<'ECR' =~ m/(\S.*\S)/og;
			Dear Businessperson:
			As a technical person and a natural skeptic my initial impulse was to ignore things like this, but NO MORE!
			Dear E-commerce Consultant,
			Have you been dissappointed by other credit card solutions which turned out to be scams?
			Dear Professional:
			Give yourself the ADVANTAGE of enjoying life more with EXCELLENT CREDIT!
ECR

		@cre_end = <<'ECRE' =~ m/(\S.*\S)/og;
			$$$ ENJOY YOUR NEWFOUND FINANCIAL FREEDOM $$$
			CALL 1 (307) 587-9409 TO ORDER TODAY!
			To Order By Phone, please call (206) 219-3312 NOW!
ECRE

		@cur_start = <<'ECU' =~ m/(\S.*\S)/og;
			Dear Herbal Enthusiest;
			Did you know that you can order your herbs online from Mexico at a FRACTION of the cost?
			Dear Friend -
			Our ALL NATURAL 100% organic herbal supplements can help you feel at your peak again!
			Dear Truth seeker,
			Have you been misinformed about the nearly miraculous effectiveness of modern herbal remedies?
ECU

		@cur_end = <<'ECUE' =~ m/(\S.*\S)/og;
			!!! ORDER ONLINE NOW BEFORE THE MEXICAN GOVERNMENT SHUTS US DOWN !!!
			Order now, you won't regret trying our ULTRA-HIGH QUALITY herbs!
			VISIT US TODAY TO DISCOVER ALL THE THINGS *THEY* DON'T WANT YOU TO KNOW!
ECUE

	}	# End of preloaded spam header data block.

	if ($needs eq "business") {
		$pad = qq'

	Apex
	Attn: R. Colbert
	MailRoom Post Office Box  #0215
	Coral Springs, FL 33067-0215

ORDER YOUR REPORTS TODAY AND GET STARTED ON
YOUR ROAD TO FINANCIAL FREEDOM !

Under Bill s. 1618 TITLE 3 passed by the 105th us congress, this letter 
cannot be considered SPAM, as long ad the sender includes contact information
and a method of "removal". To be removed from future mailings, just reply with
REMOVE in the subject line.

Thank-you for your kind consideration';

# Here's a ton of raw spam.  All of these blocks are similar for each genre.
# Don't add or remove lines unless you're trying to encode more charactors,
# but you can change them almost as much as you want so long as you are sure 
# that none contain .'s or !'s and that none of them contains another (eg. 
# that one line isn't "Just BUY NOW" and another is "BUY NOW" which would 
# confuse the script when it tried to decode them.  I personally validated 
# all of these, but... :]

		@tospam = <<'END_BUSINESS' =~ m/(\S.*\S)/g;
We sell the CD Your Not Suppose to Have BUSINESS SECRETS OF THE INTERNET
Learn to make THOUSANDS of dollars per hour while Surfing the Internet for PORN
Find out how To Beat Speeding Tickets confound the cops and get off scot free
You can get Information on Anyone you want for FREE online
Your messages can reach MILLIONS for pennies just like this one
You KNOW this works since just as you are reading this message yours will be read
If you want to be successful you must copy someone who is
I am willing to teach you the secrets that I have leaned in creating Financial Independence
I am looking for a few motivated individuals who are ready to start earning BIG MONEY
This is not MLM or a pyramid scheme or a get rich quick scheme
This is a REAL Legitimate business that requires motivated parteners
With Us Everyone Gets Approved No Upfront Fees For Application-Processing
While Others Charge You HUNDREDS OF DOLLARS to Get Set Up WE CHARGE ZERO FOR SETUP FEES
This is A Limited Time Offer So Take Advantage of it
Scroll to bottom of this email for our CONTACT INFORMATION to ORDER NOW
The Internet is the fastest growing industry in today's direct marketing business
Give your customers the convenience of ordering products right from your web page
Now tell me if this doesn't sound intriguing
With us you will have LIQUID ASSETS AVAILABLE ALMOST IMMEDIATELY
We Also offer SOFTWARE AND TERMINAL PACKAGES to reach your customers
Our terminal will allow you to receive the LOWEST DISCOUNT RATE per transaction available
Thank You for reading this and Heres to Bigger and Better Business
Thats right seventy seven MILLION FRESH AND VALID email addresses with NO duplications
You can offer your product to the online community TODAY
Using direct marketing is easier and cheaper a LOT easier and a LOT cheaper
Contact us to receive a collection of BULK EMAIL PROGRAMS to automate your mailouts
Our programs such as Express mail and Stealth Bomber all are very user friendly
These programs usually cost around HUNDREDS but are FREE to you when you invest with us
You can set your computer in the morning and it can send emails all day by itself
If you get only a one percent response from mailing to a list thats worth THOUSANDS
Imagine how much information you could get from a short survey sent to a mailing list like ours
We have been in this business for close to TWO YEARS now
We have a lot of satisfied customers who keep coming back to us for more
We hope to do business with you continuously for years to come
We have gone through the list in the past month and deleted any old addresses
We have also deleted any known SPAM haters
Our lists include almost every person on the Internet today with no duplications
People are making TONS of money right now by doing the same thing we are
With us the more people you send to the more money you will make
With our product we will also send you a copy of every law concerning email
We make it easy to obey the law and make a fortune
This offer is not for everyone
If you can see the value in this opportunity then now is the time to TAKE ACTION
Ours is a fantastic idea which has over FOUR MILLION users already
For checks in currencies other than US dollars please find details below
ALL INFORMATION NECESSARY FOR YOU TO SUCCESSFULLY MAIL QUICKLY PROPERLY AND LEGALLY IS PROVIDED
This email contains the ENTIRE PLAN of how YOU can make BIG MONEY NOW
Just read on and see how easy this is
Since everyone makes more as more people try it out it's been very exciting
Please read this program THEN READ IT AGAIN
Just follow the instructions and you will make money
This simplified e-mail marketing program works perfectly EVERY TIME
Email is the sales tool of the future
Take advantage of this virtually free method of advertising NOW
The longer you wait the more people will be doing business using email
The enclosed information is something I almost let slip through my fingers
I could NOT believe my eyes here was a MONEY MAKING MACHINE I could start immediately
Like most of you I was still a little skeptical and a little worried about the legal aspects
After determining the program was LEGAL I decided WHY NOT
I paid off ALL my debts and bought a much needed new car
Please take your time to read this plan IT WILL CHANGE YOUR LIFE FOREVER
This program does work but you must follow it EXACTLY
If you choose not to participate in this program I am sorry
This really is a great opportunity with little cost or risk to you
As the saying goes THE RICH GET RICHER AND THE POOR GET POORER
With us you can make more money in the next few months than you have EVER imagined
Just follow the program EXACTLY AS INSTRUCTED
Remember to email a copy of this exciting report to everyone you can think of
Remember that the more you send out the more potential customers you will reach
HERE IS HOW THIS AMAZING PROGRAM WILL MAKE YOU THOUSANDS OF DOLLARS
Our method of raising capital REALLY WORKS EVERY TIME
Before you say BULL please read this program carefully
This is not a chain letter but a perfectly legal money making business
Every state in the USA allows you to recruit new multilevel business partners
WITH US ORDERS COME BY MAIL AND ARE FILLED BY EMAIL so you are not involved in personal selling
You do this privately in your own home store or office
We have the EASIEST marketing plan anywhere
Your cost to participate in this is practically nothing
Placing a lot of FREE ads on the Internet will EASILY get a larger response
You should be prompt and professional and follow the directions accurately
You can KEEP TRACK of your PROGRESS by watching which report people are ordering from you
What you are about to read is tried and true and proven and effective
Above all our offer is utterly and ridicously excellent
Read on and weep with joy if you would like to know exactly how to begin making money
Nowhere else will you find such a complete package as this
YOU WILL SOON BE RAKING IN MONEY LIKE NOBODYS BUSINESS
This is the fastest way I have ever seen to make money
If you do not call us RIGHT NOW you will regret it for the rest of your life
Business opportunities like this do not come around every day you know
You would have to be an IDIOT not to BUY NOW
Our product is simply the BEST EVER
Unless you want to kick yourself later you MUST ORDER NOW
END_BUSINESS

		foreach $line (@tospam) {	# Collapse whitespace to help matching.
			s/^\s+//;
			s/\s+$//;
			s/\s+/ /g;
			warn "Erroneous punctuation (! or .) found in business spam." if m/[!.]/;
		}

		return;
	}

	if ($needs eq "credit") {

		$pad = qq'

FAX TOLL FREE TO 888.244.4366 or mail to:

	The Credit Emporium
	Attn: C. Spambert
	MailRoom Post Office Box  #0715
	Coral Springs, FL 33067-0215


** We respect your privacy and will not share
any of the above information with any other 
persons or companies. **


.............................................
This is a one time email transmission, either
requested by you or by someone you know. The
information provided is for educational
purposes only and FFS Ltd is not providing a
service. This offer is void where prohibited.
This cannot be considered spam as long as the
sender includes a method of removal at no cost
to the recipient as stated in bill s.1618 
TITLE III passed by the 105th US Congress. 
This is a one time email transmission; no need
for removal is required. If you do not respond,
FFS Lts will not contact you and you will be
automatically removed.';

		@tospam = <<'END_CREDIT' =~ m/(\S.*\S)/g;
Good Bad or No Credit is NO PROBLEM with us
GET GUARANTEED EXCELLENT CREDIT IN THIRTY DAYS
If your credit is less than perfect then you must read this email
We have compiled a wonderful ebook GUARANTEED to give you an excellent credit rating
John Simmers tried this and removed every negative item off his credit report in two weeks
Over the last few years we have received thousands of positive letters from customers
With us FINANCIAL FREEDOM COSTS JUST A FEW DOLLARS
Print this now or save it to a folder for future reference
With us you can learn of the secret federal law that stops ALL your collection calls immediately
Thousands of Americans have used our service successfully we want YOU to be next
NO MORE will you have to be ashamed of your past
The Credit Secrets Manual reveals one of the greatest secrets in the world  
Our attorneys have discovered a method of creating brand NEW credit files for their clients
With us you can destroy bad credit by taking advantage of a special consumer protection law
With us you can dump your bad credit using our suberb Credit File Replication Service
With our methods anyone can bury the past and put their bad credit behind them forever
Our service is really BONAFIDE and PROVEN to work for anyone
This product is so easy to use that a sixteen year old could do it
Thanks to us you will be in fear of your future NO MORE
All this involves is a little thinking and filling out forms and making phone calls
This product works just like THAT it is almost MAGICAL
I truly do bless the day I ordered this program YOU will too
This program has changed my life I now want it to change yours
You will be scared to apply for credit NO MORE
With us you can learn the Secret Key to getting your new credit file and how easy it is to do
We can get your new credit file without you ever leaving your house
Our goal is to make this program affordable so everyone can benefit from the power of it
Rich people have been using our secrets for years
We have a guaranteed way for legally getting an excellent credit rating almost instantly
Contact us to guarantee that you will quickly have EXCELLENT CREDIT
We will assist you in instantly adding UNLIMITED positive information to your credit file
My Proven Credit Advantage Program unconditionally guarantees you will qualify for loans
TRIPLE A ONE CREDIT IS WITHIN YOUR REACH
Our ebook tells you everything you will ever need to know
With ONE CALL we can get your creditors to leave you alone
Complete Our Simple Online Form To Receive Your Free Debt Analysis
Our programs can get you the cash you need
This all comes with our RISK FREE DOUBLE YOUR MONEY BACK GUARANTEE
If your credit isnt so great your interest rate will be higher
We can tell you the Six Credit Card Secrets Banks Dont Want You to Know
With Us You Will Learn The Guerrilla Tactics That Will Give You A Good Credit Rating
We know Surefire Methods Of Raising Instant Cash
This is NOT another credit scam OUR methods are TOTALLY LEGAL
Do NOT get suckered by the cheap waffle packed guides offered elsewhere
We will NOT waste your time with flowery sales letters and empty promises
WE are the real deal WE tell it like it IS
Sign up NOW and become part of our CASH ADVANTAGE PROGRAM
WE use the only legitimate way to get you new credit files
We can Add YEARS of AAA credit to your PERSONAL credit report in just days
You can never lie or be dishonest and STILL get the credit you need and deserve without hassle
You should follow the example of thousands of ordinary people who use this system everyday
You can use our services to maintain complete anonymity in your financial dealings
You can purchase everything you buy at below wholesale prices and on credit
Our services will NOT lead you to do anything illegal immoral or unethical
We do NOT send you on letter writing campaigns that produce no results
We will not have you to use untested methods that do not work in the real world
We will NOT make you use a bogus TIN or EIN number on credit applications
Our customers are SHOCKED at how quickly and easily they have restored their credit
We have perfected a system called the GoldPro Credit Restoration Program which is AWESOME
With us you just go through our EASY five step program to establish the credit you deserve
If you want to buy a home our methods will virtually GUARANTEE your success
With us you will now be able to easily qualify for any credit you desire
My program unconditionally guarantees that you will qualify for all kinds of loans
If you do not fix your credit you might as well throw MONEY out the window
You CAN Save Thousands of Dollars in Interest and Late Charges
We offer a NO OBLIGATION FREE CONSULTATION WITH STRICT PRIVACY
The credit industry is constantly changing to anticipate the demands of customers like you
We look forward to EARNING your business
Do not delay in ordering from us your good credit depends on it
With our help you will have ULTRA LOW INTEREST RATES
When we are finished you will have a copy of YOUR unblemished credit file
You Can Join our Lenders Network for FREE
YOU SHOULD NEVER SETTLE FOR A SINGLE QUOTE AGAIN WHEN YOU CAN GET MANY OFFERS WITH US
The information you provide to our Financial Experts will help you get the results you deserve
With us you will discover why bankruptcy may actually improve your credit rating
You can learn to Restart your life Completely Debt-Free
Find out how to stop your creditors dead in their tracks with our foolproof debt solutions
Find out how to know if you need a lawyer to help you
Let us help you get out of debt NOW
We can even help you consolidate your debts into one low monthly payment
Do not even think of filing bankrupcy without reading this message
This request is totally risk free since no obligation or costs are incurred
By working with us we can cut your payments in HALF
We have Special Programs for Self Employed Borrowers
We have programs for EVERY credit situation
You could get CASH BACK within ONE DAY of approval
Our professional debt negotiators can instantly reduce your interest rates
We WILL Get Your Creditors Off Your Back
Our credit history eraser is NOT a loan
WE ARE THE TOP ONLINE SOURCE FOR APPROVING CREDIT CHALLENGED INDIVIDUALS
With your new credit rating you will feel like a KING
You simple MUST ORDER NOW or you will regret it
Without us you might face BANKRUPCY
END_CREDIT

		foreach $line (@tospam) {	# Collapse whitespace to help matching.
			s/^\s+//;
			s/\s+$//;
			s/\s+/ /g;
			warn "Erroneous punctuation (! or .) found in credit spam." if m/[!.]/;
		}

		return;
	}

	if ($needs eq "cures") {

		$pad = qq'

Order online and save. Visit us at http://www.iscsale.com/

Please print and postal mail to:


	Chess Industries
	PO BOX 97-0531
	Coconut Creek, FL 33097-0531


or FAX toll free to 800.708.5714. 


~ ~ ~   ~ ~ ~    ~ ~ ~   ~ ~ ~   ~ ~ ~   ~ ~ ~   ~ ~ ~    ~ ~ ~
   Your Email Address Removal/Deletion Instructions:

   We comply with proposed federal legislation regarding unsolicited
commercial email by providing you with a method for your email address to be
permanently removed from our database and any future mailings from our
company.

   To remove your address, please send an email message with the word REMOVE
in the subject line to: processrequest\@adexec.com
   If you do not type the word REMOVE in the subject line,your request to be
removed will not be processed.
';

		@tospam = <<'END_CURES' =~ m/(\S.*\S)/g;
The results have been truly remarkable
You will understand once you try it yourself
Remember that it wont work if you don't try it
Please delete this now if such messages are annoying to you
You have been invited to participate in a thirty day free trial
This is an UNBELIEVEABLE OFFER for the Ultimate Herbal Experience
Absolutely LEGAL and Marvelously POTENT
Kiff possess all of the positive virtues fine ganja or cannabis without any of the negatives
These all have NO side effects NO dependency and are Vivaciously Mellow
It is formulated in accordance with the Taoist herbal principle of botanical interactiveness
All products are Satisfaction Guaranteed you will NOT want to miss out on them
TRY THE BODY MIND AND SPIRIT HEAVENLY INTRO COMBINATION OFFER
GET THIS Erotic Aphrodisia it is a wonderful Sexual Intensifier
These are made with herbs of Power which are master blended to emphasize body mind and spirit
Our products are best when taken upon an empty stomach
Persons taking any precsription medication should consult with their health care providers
Try our obscure multidimensional singular leafy smoking and brewing ethnobotanicals
TRY our LEGAL CANNABIS ALTERNATIVES they will help you MeLoW OuT
There is ABSOLUTELY nothing else quite like our herbs
Our HERBS are blended according to ancient Tanatric methods of exploring the pleasure of SEX
Using these herbs you can explore ancient and exotic SEXUAL EXPEREMENTS LEGALLY
I guarantee your life will never be the same again SEEING IS BELIEVING
I truly look forward to making you another SATISFIED CLIENT
Use our herbs to enjoy Tantra which is the art of CARNAL SEXUAL exploration
These herbs are major mood enhancers they make you feel HAPPY and SERENE
Our ginsing increases physical and mental endurance MASSIVELY
The ginsenosides in our ginsing have bee proven to help the body to respond to stress
This offer is NOT available in stores
Order now and get a FREE herb pipe for your SMOKING PLEASURE
Use our viripotent cannabis alternatives for blissful regressions of vexatious depressions
Our kiff is indeed the BEST marijuana or cannabis alternative on the planet
Our amalgamations are high concentrates of rare euphoric herbas for maximum PLEASURE
We use only the highest quality Chavana Prash and Black Seed Herbs in our amalgams
We have tons of hard to get Asian Herbs for Serenity and Joyful Living
With these herbs you can experience the dynamic energization of body mind and spirit
Our special compounds prolificate molecular communion to achieve herbal efficaciousness
Every item is always on sale on our website so visit there NOW
Many people do not realize the hidden dangers of Excessive Stress in their lives
Everyone at one time or another can use a health enhancing vitamin supplement or herbal remedy
The ISC Wellness Association can help you find the perfect gift
Try these today and feel the energy flow you need to get things done
Stress has often been referred to as a silent killer
We have just what you are looking for
CARE FOR YOUR SKIN THE WAY NATURE INTENDED
Put your best face forward by using our Skin Care Products
Most people love the natural nourishing qualities of our products and you will too
We offer more than just vitamins herbs and supplements
While the FDA will not allow us to call this a miracle cure we do not know what else to call it
Clinical tests of our products have show that they enhance SEXUAL ECTASY
Use our androstenedione to unlock your natural sexual potential
These offers are NOT available in stores
Try our tribulus terrestis to increase Luteinzing hormone levels
THOUSANDS OF SATISFIED CUSTOMERS CANNOT BE WRONG
Get What Is Perhaps The Most Powerful Aphrodisiac Ever Discovered
Get More Energy And Explode Your Sex Life
Drop Those Extra Pounds And Feel Like A Teenager Again
Turn Your Life Around With Herbal Medicine
Get Back In Control Of Your Life
Consult With A Herbal Professional Today
Get some of our HUNZA DIET BREAD it is said to beat all fad diets hands down
IF YOU'VE BEEN LOOKING FOR THE MIRACLE FOR LOSING WEIGHT WITH NO HUNGER	THEN READ ON
These are all TOTALLY Natural with no negative side effects
WE ARE BLOWING THE PHARMACY GUIDE OUT DURING THIS SPECIAL
Get all the EXPERIMENTAL DRUGS you need here
Order from us and we can even send your presecriptions in by mail
We have put together THE COMPLETE PHARMACY GUIDE of MEXICO to help you save BIG MONEY on drugs
The Information we have obtained may be Your First Step towards a better tomorrow
If you do not have health insurance you are paying extremely high prices for your medications
With our services you do not need to leave the privacy and comfort of your home
GO TO OUR WEBSITE NOW AND JOIN OUR CLUB
You can order EVERYTHING online from us
Lose weight and inches without stimulants using our products
Lower cholesterol without drugs with our products
Control acne without antibiotics with our all NATURAL herbal remedies
You Should Use Our Herbal V Which is An Incredible All Natural Natural Alternative to Viagra
Welcome to the New Sexual Revolution
We Use ONLY The Highest Quality Pharmaceutical Grade Pure Nutriceuticals
With The Herbs We Sell You Can Be a Real Man Again
These amazing formulas first became popular with Hollywood insiders and the wealthy elite
Simply put these can make your sex life INCREDIBLE
According to clinical trials our products really are CURE ALLS
These cures are so wonderful the FDA is keeping them SECRET
You simply have to learn the PLEASURES of these herbs which THEY do not want you to know
END_CURES

		foreach $line (@tospam) {	# Collapse whitespace to help matching.
			s/^\s+//;
			s/\s+$//;
			s/\s+/ /g;
			warn "Erroneous punctuation (! or .) found in cure all spam." if m/[!.]/;
		}

		return;
	}	

	# Just in case someone adds new genres too & is forgetful :]
	warn "Error: invalid call to get_spamtype($needs)";
}

TUCoPS is optimized to look best in Firefox® on a widescreen monitor (1440x900 or better).
Site design & layout copyright © 1986-2024 AOH