<html>
<head>
<style><!--
body {background-color:#ffffff;}
.file {border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;}
.pathname {font-family:monospace; float:right;}
.fileheader {margin-bottom:.5em;}
.diff {margin:0;}
.tasklist {padding:4px;border:1px dashed #000000;margin-top:1em;}
.tasklist ul {margin-top:0;margin-bottom:0;}
tr.alt {background-color:#eeeeee}
#added {background-color:#ddffdd;}
#addedchars {background-color:#99ff99;font-weight:bolder;}
tr.alt #added {background-color:#ccf7cc;}
#removed {background-color:#ffdddd;}
#removedchars {background-color:#ff9999;font-weight:bolder;}
tr.alt #removed {background-color:#f7cccc;}
#copied {background-color:#ccccff;}
tr.alt #copied {background-color:#bbbbf7;}
#info {color:#888888;}
#context {background-color:#eeeeee;}
td {padding-left:.3em;padding-right:.3em;}
tr.head {border-bottom-width:1px;border-bottom-style:solid;}
tr.head td {padding:0;padding-top:.2em;}
.task {background-color:#ffff00;}
.comment {white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;padding:4px;border:1px dashed #000000;background-color:#ffffdd}
.error {color:red;}
hr {border-width:0px;height:2px;background:black;}
--></style>
</head>
<body>
<table cellspacing="0" cellpadding="0" border="0" rules="cols">
<tr class="head"><td colspan="5">Commit in <b><tt>metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas</tt></b></td></tr>
<tr><td><tt><a href="#file1">ActionScriptFactory.java</a></tt> </td><td></td><td align="right" id="added">+86</td><td align="right" id="removed">-1</td><td nowrap="nowrap" align="center">576 -> 577</td></tr>
<tr class="alt"><td><tt>dom/<a href="#file2"><span id="added">ASAssignmentExpression.java</span></a></tt> </td><td></td><td align="right" id="added">+46</td><td></td><td nowrap="nowrap" align="right">added 577</td></tr>
<tr><td><tt>impl/<a href="#file3"><span id="added">ASTASAssignmentExpression.java</span></a></tt> </td><td></td><td align="right" id="added">+45</td><td></td><td nowrap="nowrap" align="right">added 577</td></tr>
<tr class="alt"><td><tt> /<a href="#file4">ASTBuilder.java</a></tt> </td><td></td><td align="right" id="added">+25</td><td align="right" id="removed">-1</td><td nowrap="nowrap" align="center">576 -> 577</td></tr>
<tr><td><tt> /<a href="#file5"><span id="added">AssignmentOperatorMap.java</span></a></tt> </td><td></td><td align="right" id="added">+51</td><td></td><td nowrap="nowrap" align="right">added 577</td></tr>
<tr class="alt"><td><tt> /<a href="#file6">ExpressionBuilder.java</a></tt> </td><td></td><td align="right" id="added">+13</td><td></td><td nowrap="nowrap" align="center">576 -> 577</td></tr>
<tr><td><tt> /<a href="#file7">TokenBuilder.java</a></tt> </td><td></td><td align="right" id="added">+49</td><td align="right" id="removed">-1</td><td nowrap="nowrap" align="center">576 -> 577</td></tr>
<tr><td></td><td></td><td align="right" id="added">+315</td><td align="right" id="removed">-3</td><td></td></tr>
</table>
<small id="info">3 added + 4 modified, total 7 files</small><br />
<div class="tasklist"><ul>
<li><a href="#task1">TODO: handle operator precedence issues</a></li>
</ul></div>
<pre class="comment">
Support for assignment-expressions, mostly contributed by Matthew J Tretter
</pre>
<hr /><a name="file1" /><div class="file">
<span class="pathname">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas</span><br />
<div class="fileheader"><big><b>ActionScriptFactory.java</b></big> <small id="info">576 -> 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/ActionScriptFactory.java        2008-01-07 21:39:14 UTC (rev 576)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/ActionScriptFactory.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -9,6 +9,7 @@
</small></pre><pre class="diff" id="context"> import java.util.List;
import org.asdt.core.internal.antlr.AS3Parser;
import uk.co.badgersinfoil.metaas.dom.ASArrayAccessExpression;
</pre><pre class="diff" id="added">+import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression;
</pre><pre class="diff" id="context"> import uk.co.badgersinfoil.metaas.dom.ASBinaryExpression;
import uk.co.badgersinfoil.metaas.dom.ASBlock;
import uk.co.badgersinfoil.metaas.dom.ASBooleanLiteral;
</pre><pre class="diff"><small id="info">@@ -330,4 +331,88 @@
</small></pre><pre class="diff" id="context">                 ASTASArrayAccessExpression result = new ASTASArrayAccessExpression(ast);
                return result;
        }
</pre><pre class="diff" id="removed">-}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre><pre class="diff" id="added">+
+        public ASAssignmentExpression newAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newAddAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newAddAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newBitAndAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newBitAndAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newBitOrAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newBitOrAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newBitXorAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newBitXorAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newDivideAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newDivAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newModuloAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newModAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newMultiplyAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newMulAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newShiftLeftAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newSLAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newShiftRightAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newSRAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newShiftRightUnsignedAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newSRUAssign(),
+                 left, right);
+        }
+
+        public ASAssignmentExpression newSubtractAssignExpression(ASExpression left,
+         ASExpression right)
+        {
+                return ASTBuilder.newAssignExpression(TokenBuilder.newSubAssign(),
+                 left, right);
+        }
+}
</pre></div>
<hr /><a name="file2" /><div class="file">
<span class="pathname" id="added">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/dom</span><br />
<div class="fileheader" id="added"><big><b>ASAssignmentExpression.java</b></big> <small id="info">added at 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/dom/ASAssignmentExpression.java         (rev 0)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/dom/ASAssignmentExpression.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -0,0 +1,46 @@
</small></pre><pre class="diff" id="added">+package uk.co.badgersinfoil.metaas.dom;
+
+public interface ASAssignmentExpression extends ASExpression {
+        public Op getOperator();
+        public void setOperator(Op operator);
+        public ASExpression getLeftSubexpression();
+        public void setLeftSubexpression(ASExpression left);
+        public ASExpression getRightSubexpression();
+        public void setRightSubexpression(ASExpression right);
+
+        public static class Op {
+                private String name;
+                private Op(String name) {
+                        this.name = name;
+                }
+                
+                /** '+=' */
+                public static final Op ADD_ASSIGN = new Op("ADD_ASSIGN");
+                /** Assignment '=' */
+                public static final Op ASSIGN = new Op("ASSIGN");
+                /** '&=' */
+                public static final Op BITAND_ASSIGN = new Op("BITAND_ASSIGN");
+                /** '|=' */
+                public static final Op BITOR_ASSIGN = new Op("BITOR_ASSIGN");
+                /** '^=' */
+                public static final Op BITXOR_ASSIGN = new Op("BITXOR_ASSIGN");
+                /** '/=' */
+                public static final Op DIV_ASSIGN = new Op("DIV_ASSIGN");
+                /** '%=' */
+                public static final Op MOD_ASSIGN = new Op("MOD_ASSIGN");
+                /** '*=' */
+                public static final Op MUL_ASSIGN = new Op("MUL_ASSIGN");
+                /** Left Shift Assigment '<<=' */
+                public static final Op SL_ASSIGN = new Op("SL_ASSIGN");
+                /** Right Shift Assigment '>>=' */
+                public static final Op SR_ASSIGN = new Op("SR_ASSIGN");
+                /** Unsigned Right Shift Assigment '>>>=' */
+                public static final Op SRU_ASSIGN = new Op("SRU_ASSIGN");
+                /** '-=' */
+                public static final Op SUB_ASSIGN = new Op("SUB_ASSIGN");
+                
+                public String toString() {
+                        return name;
+                }
+        }
+}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre></div>
<hr /><a name="file3" /><div class="file">
<span class="pathname" id="added">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/impl</span><br />
<div class="fileheader" id="added"><big><b>ASTASAssignmentExpression.java</b></big> <small id="info">added at 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASAssignmentExpression.java         (rev 0)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ASTASAssignmentExpression.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -0,0 +1,45 @@
</small></pre><pre class="diff" id="added">+package uk.co.badgersinfoil.metaas.impl;
+
+import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression;
+import uk.co.badgersinfoil.metaas.dom.ASExpression;
+import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListTree;
+
+public class ASTASAssignmentExpression extends ASTASExpression
+ implements ASAssignmentExpression
+{
+        public ASTASAssignmentExpression(LinkedListTree ast) {
+                super(ast);
+        }
+
+        public ASExpression getLeftSubexpression() {
+                return ExpressionBuilder.build(ast.getFirstChild());
+        }
+
+        public Op getOperator() {
+                return AssignmentOperatorMap.opFromType(ast.getType());
+        }
+
+        public ASExpression getRightSubexpression() {
+                return ExpressionBuilder.build(ast.getLastChild());
+        }
+
+        public void setLeftSubexpression(ASExpression left) {
+                setSubexpression(0, left);
+        }
+
+        public void setOperator(Op operator) {
+                AssignmentOperatorMap.initialiseFromOp(operator, ast.getToken());
+        }
+
+        public void setRightSubexpression(ASExpression right) {
+                setSubexpression(1, right);
+        }
+
+        private void setSubexpression(int index, ASExpression subexpression) {
+                ASTASExpression sub = (ASTASExpression)subexpression;
+                LinkedListTree subExpr = sub.getAST();
+                ASTBuilder.assertNoParent("expression", subExpr);
<a name="task1" />+                // <span class="task">TODO</span>: handle operator precedence issues
+                ast.setChildWithTokens(index, subExpr);
+        }
+}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre></div>
<hr /><a name="file4" /><div class="file">
<span class="pathname">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/impl</span><br />
<div class="fileheader"><big><b>ASTBuilder.java</b></big> <small id="info">576 -> 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ASTBuilder.java        2008-01-07 21:39:14 UTC (rev 576)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ASTBuilder.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -9,6 +9,7 @@
</small></pre><pre class="diff" id="context"> import java.util.List;
import org.asdt.core.internal.antlr.AS3Parser;
import uk.co.badgersinfoil.metaas.SyntaxException;
</pre><pre class="diff" id="added">+import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression;
</pre><pre class="diff" id="context"> import uk.co.badgersinfoil.metaas.dom.ASBinaryExpression;
import uk.co.badgersinfoil.metaas.dom.ASCompilationUnit;
import uk.co.badgersinfoil.metaas.dom.ASExpression;
</pre><pre class="diff"><small id="info">@@ -411,6 +412,29 @@
</small></pre><pre class="diff" id="context">                 return new ASTASBinaryExpression(ast);
        }
</pre><pre class="diff" id="added">+        public static ASAssignmentExpression newAssignExpression(LinkedListToken op, ASExpression left, ASExpression right) {
+                LinkedListTree ast = ASTUtils.newAST(op);
+                LinkedListTree leftExpr = ((ASTASExpression)left).getAST();
+                assertNoParent("left-hand expression", leftExpr);
+                LinkedListTree rightExpr = ((ASTASExpression)right).getAST();
+                if (precidence(ast) < precidence(leftExpr)) {
+                        leftExpr = parenthise(leftExpr);
+                }
+                if (precidence(ast) < precidence(rightExpr)) {
+                        rightExpr = parenthise(rightExpr);
+                }
+                // don't use addChildWithTokens(); special handling below,
+                ast.addChild(leftExpr);
+                ast.addChild(rightExpr);
+                leftExpr.getStopToken().setNext(op);
+                rightExpr.getStartToken().setPrev(op);
+                ast.setStartToken(leftExpr.getStartToken());
+                ast.setStopToken(rightExpr.getStopToken());
+                op.beforeInsert(TokenBuilder.newSpace());
+                op.afterInsert(TokenBuilder.newSpace());
+                return new ASTASAssignmentExpression(ast);
+        }
+
</pre><pre class="diff" id="context">         public static void assertNoParent(String astDescription, LinkedListTree ast)
        {
                if (ast.getParent() != null) {
</pre><pre class="diff"><small id="info">@@ -482,4 +506,4 @@
</small></pre><pre class="diff" id="context">                                 return 1;
                }
        }
</pre><pre class="diff" id="removed">-}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre><pre class="diff" id="added">+}
</pre></div>
<hr /><a name="file5" /><div class="file">
<span class="pathname" id="added">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/impl</span><br />
<div class="fileheader" id="added"><big><b>AssignmentOperatorMap.java</b></big> <small id="info">added at 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/AssignmentOperatorMap.java         (rev 0)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/AssignmentOperatorMap.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -0,0 +1,51 @@
</small></pre><pre class="diff" id="added">+package uk.co.badgersinfoil.metaas.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.antlr.runtime.Token;
+import org.asdt.core.internal.antlr.AS3Parser;
+import uk.co.badgersinfoil.metaas.dom.ASAssignmentExpression;
+import uk.co.badgersinfoil.metaas.impl.antlr.LinkedListToken;
+
+public class AssignmentOperatorMap {
+
+        private static final Map OPERATORS_BY_TYPE = new HashMap();
+        private static final Map TYPES_BY_OPERATOR = new HashMap();
+
+        private static void mapOp(int type, String text, ASAssignmentExpression.Op operator) {
+                OPERATORS_BY_TYPE.put(new Integer(type), operator);
+                TYPES_BY_OPERATOR.put(operator, new LinkedListToken(type, text));
+        }
+
+        static {
+                mapOp(AS3Parser.PLUS_ASSIGN, "+=", ASAssignmentExpression.Op.ADD_ASSIGN);
+                mapOp(AS3Parser.ASSIGN, "=", ASAssignmentExpression.Op.ASSIGN);
+                mapOp(AS3Parser.BAND_ASSIGN, "&=", ASAssignmentExpression.Op.BITAND_ASSIGN);
+                mapOp(AS3Parser.BOR_ASSIGN, "|=", ASAssignmentExpression.Op.BITOR_ASSIGN);
+                mapOp(AS3Parser.BXOR_ASSIGN, "^=", ASAssignmentExpression.Op.BITXOR_ASSIGN);
+                mapOp(AS3Parser.DIV_ASSIGN, "/=", ASAssignmentExpression.Op.DIV_ASSIGN);
+                mapOp(AS3Parser.MOD_ASSIGN, "%=", ASAssignmentExpression.Op.MOD_ASSIGN);
+                mapOp(AS3Parser.STAR_ASSIGN, "*=", ASAssignmentExpression.Op.MUL_ASSIGN);
+                mapOp(AS3Parser.SL_ASSIGN, "<<=", ASAssignmentExpression.Op.SL_ASSIGN);
+                mapOp(AS3Parser.SR_ASSIGN, ">>=", ASAssignmentExpression.Op.SR_ASSIGN);
+                mapOp(AS3Parser.BSR_ASSIGN, ">>=", ASAssignmentExpression.Op.SRU_ASSIGN);
+                mapOp(AS3Parser.MINUS_ASSIGN, "-=", ASAssignmentExpression.Op.SUB_ASSIGN);
+        }
+
+        public static ASAssignmentExpression.Op opFromType(int type) {
+                ASAssignmentExpression.Op op = (ASAssignmentExpression.Op)OPERATORS_BY_TYPE.get(new Integer(type));
+                if (op == null) {
+                        throw new IllegalArgumentException("No operator for token-type "+ASTUtils.tokenName(type));
+                }
+                return op;
+        }
+
+        public static void initialiseFromOp(ASAssignmentExpression.Op operator, Token tok) {
+                LinkedListToken type = (LinkedListToken)TYPES_BY_OPERATOR.get(operator);
+                if (type == null) {
+                        throw new IllegalArgumentException("No operator for Op "+operator);
+                }
+                tok.setType(type.getType());
+                tok.setText(type.getText());
+        }
+}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre></div>
<hr /><a name="file6" /><div class="file">
<span class="pathname">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/impl</span><br />
<div class="fileheader"><big><b>ExpressionBuilder.java</b></big> <small id="info">576 -> 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ExpressionBuilder.java        2008-01-07 21:39:14 UTC (rev 576)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/ExpressionBuilder.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -18,6 +18,19 @@
</small></pre><pre class="diff" id="context">                         case AS3Parser.TRUE:
                        case AS3Parser.FALSE:
                                return new ASTASBooleanLiteral(ast);
</pre><pre class="diff" id="added">+                        case AS3Parser.PLUS_ASSIGN:
+                        case AS3Parser.ASSIGN:
+                        case AS3Parser.BAND_ASSIGN:
+                        case AS3Parser.BOR_ASSIGN:
+                        case AS3Parser.BXOR_ASSIGN:
+                        case AS3Parser.DIV_ASSIGN:
+                        case AS3Parser.MOD_ASSIGN:
+                        case AS3Parser.STAR_ASSIGN:
+                        case AS3Parser.SL_ASSIGN:
+                        case AS3Parser.SR_ASSIGN:
+                        case AS3Parser.BSR_ASSIGN:
+                        case AS3Parser.MINUS_ASSIGN:
+                                return new ASTASAssignmentExpression(ast);
</pre><pre class="diff" id="context">                         case AS3Parser.PLUS:
                        case AS3Parser.LAND:
                        case AS3Parser.BAND:
</pre></div>
<hr /><a name="file7" /><div class="file">
<span class="pathname">metaas/trunk/src/main/java/uk/co/badgersinfoil/metaas/impl</span><br />
<div class="fileheader"><big><b>TokenBuilder.java</b></big> <small id="info">576 -> 577</small></div>
<pre class="diff"><small id="info">--- trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/TokenBuilder.java        2008-01-07 21:39:14 UTC (rev 576)
+++ trunk/src/main/java/uk/co/badgersinfoil/metaas/impl/TokenBuilder.java        2008-01-07 22:57:52 UTC (rev 577)
@@ -205,4 +205,52 @@
</small></pre><pre class="diff" id="context">         public static LinkedListToken newRBrack() {
                return newToken(AS3Parser.RBRACK, "]");
        }
</pre><pre class="diff" id="removed">-}
</pre><pre class="diff"><small id="info">\ No newline at end of file
</small></pre><pre class="diff" id="added">+
+        public static LinkedListToken newAssign() {
+                return newToken(AS3Parser.ASSIGN, "=");
+        }
+
+        public static LinkedListToken newAddAssign() {
+                return newToken(AS3Parser.PLUS_ASSIGN, "+=");
+        }
+
+        public static LinkedListToken newBitAndAssign() {
+                return newToken(AS3Parser.BAND_ASSIGN, "&=");
+        }
+
+        public static LinkedListToken newBitOrAssign() {
+                return newToken(AS3Parser.BOR_ASSIGN, "|=");
+        }
+
+        public static LinkedListToken newBitXorAssign() {
+                return newToken(AS3Parser.BXOR_ASSIGN, "^=");
+        }
+
+        public static LinkedListToken newDivAssign() {
+                return newToken(AS3Parser.DIV_ASSIGN, "/=");
+        }
+
+        public static LinkedListToken newModAssign() {
+                return newToken(AS3Parser.MOD_ASSIGN, "%=");
+        }
+
+        public static LinkedListToken newMulAssign() {
+                return newToken(AS3Parser.STAR_ASSIGN, "*=");
+        }
+
+        public static LinkedListToken newSLAssign() {
+                return newToken(AS3Parser.SL_ASSIGN, "<<=");
+        }
+
+        public static LinkedListToken newSRAssign() {
+                return newToken(AS3Parser.SR_ASSIGN, ">>=");
+        }
+
+        public static LinkedListToken newSRUAssign() {
+                return newToken(AS3Parser.BSR_ASSIGN, ">>>=");
+        }
+
+        public static LinkedListToken newSubAssign() {
+                return newToken(AS3Parser.MINUS_ASSIGN, "-=");
+        }
+}
</pre></div>
<center><small><a href="http://www.badgers-in-foil.co.uk/projects/cvsspam/" title="commit -> email">CVSspam</a> 0.2.12</small></center>
</body></html>