[jboss-svn-commits] JBL Code SVN: r26072 - in labs/jbosstm/workspace/adinn/orchestration: src/org/jboss/jbossts/orchestration/rule and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 16 12:40:07 EDT 2009


Author: adinn
Date: 2009-04-16 12:40:07 -0400 (Thu, 16 Apr 2009)
New Revision: 26072

Added:
   labs/jbosstm/workspace/adinn/orchestration/tests/dd/scripts/javaops/TestField.txt
   labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/auxiliary/TestFieldAuxiliary.java
   labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestField.java
Modified:
   labs/jbosstm/workspace/adinn/orchestration/dd/grammar/cup/ECAGrammar.cup
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Action.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/RuleElement.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ArithmeticExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/BitExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ConditionalEvalExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/DollarExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Expression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/FieldExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/LogicalExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/NotExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ReturnExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/StaticExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Variable.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/sym.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/Type.java
   labs/jbosstm/workspace/adinn/orchestration/tests/build.xml
   labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestArithmetic.java
   labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestLogical.java
Log:
added tests for field operations and fixed various compilation bugs turned up by running those tests

Modified: labs/jbosstm/workspace/adinn/orchestration/dd/grammar/cup/ECAGrammar.cup
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/dd/grammar/cup/ECAGrammar.cup	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/dd/grammar/cup/ECAGrammar.cup	2009-04-16 16:40:07 UTC (rev 26072)
@@ -391,6 +391,8 @@
 expr_field_expr
 	::=	simple_expr:se DOT simple_name:f
 		{: RESULT = node(ParseNode.FIELD, fleft, fright, f, se); :}
+	|	meth_expr:me DOT simple_name:f
+		{: RESULT = node(ParseNode.FIELD, fleft, fright, f, me); :}
 	|	expr_field_expr:efe DOT simple_name:f
 		{: RESULT = node(ParseNode.FIELD, fleft, fright, f, efe); :}
 	;

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Action.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Action.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Action.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -26,6 +26,8 @@
 import org.jboss.jbossts.orchestration.rule.type.Type;
 import org.jboss.jbossts.orchestration.rule.expression.ExpressionHelper;
 import org.jboss.jbossts.orchestration.rule.expression.Expression;
+import org.jboss.jbossts.orchestration.rule.expression.ReturnExpression;
+import org.jboss.jbossts.orchestration.rule.expression.ThrowExpression;
 import org.jboss.jbossts.orchestration.rule.grammar.ECATokenLexer;
 import org.jboss.jbossts.orchestration.rule.grammar.ECAGrammarParser;
 import org.jboss.jbossts.orchestration.rule.grammar.ParseNode;
@@ -117,7 +119,10 @@
             hasActions = true;
             expr.compile(mv, currentStackHeights, maxStackHeights);
             Type resultType = expr.getType();
-            if (resultType != Type.VOID) {
+            // return and throw expressions don't actually leave a value on the stack even
+            // though they may have a non-VOID value type
+            boolean maybePop = !(expr instanceof ReturnExpression || expr instanceof ThrowExpression);
+            if (maybePop && resultType != Type.VOID) {
                 int expected = (resultType.getNBytes() > 4 ? 2 : 1);
                 for (int i = 0; i < expected; i++) {
                     mv.visitInsn(Opcodes.POP);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -25,10 +25,7 @@
 
 import org.jboss.jbossts.orchestration.rule.type.TypeGroup;
 import org.jboss.jbossts.orchestration.rule.type.Type;
-import org.jboss.jbossts.orchestration.rule.exception.ParseException;
-import org.jboss.jbossts.orchestration.rule.exception.CompileException;
-import org.jboss.jbossts.orchestration.rule.exception.TypeException;
-import org.jboss.jbossts.orchestration.rule.exception.ExecuteException;
+import org.jboss.jbossts.orchestration.rule.exception.*;
 import org.jboss.jbossts.orchestration.rule.binding.Bindings;
 import org.jboss.jbossts.orchestration.rule.binding.Binding;
 import org.jboss.jbossts.orchestration.rule.grammar.ECATokenLexer;
@@ -472,6 +469,16 @@
                 System.out.println("cast exception " + helperImplementationClass.getCanonicalName());
                 e.printStackTrace(System.out);
                 return;
+            } catch (EarlyReturnException e) {
+                throw e;
+            } catch (ThrowException e) {
+                throw e;
+            } catch (ExecuteException e) {
+                System.out.println(getName() + " : " + e);
+                throw e;
+            } catch (Throwable throwable) {
+                System.out.println(getName() + " : " + throwable);
+                throw new ExecuteException(getName() + " unknnown error : " + throwable, throwable);
             }
         }
     }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/RuleElement.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/RuleElement.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/RuleElement.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -99,8 +99,9 @@
                 Type midType = Type.boxType(toType);
                 compileUnbox(fromType, midType, mv, currentStackHeights, maxStackHeights);
                 compileBox(midType, mv, currentStackHeights, maxStackHeights);
+            } else {
+                compileUnbox(fromType, toType, mv, currentStackHeights, maxStackHeights);
             }
-            compileUnbox(fromType, toType, mv, currentStackHeights, maxStackHeights);
         } else if (box) {
             Type midType = Type.boxType(toType);
             if (fromType != midType) {
@@ -177,87 +178,24 @@
     protected void compileBox(Type toType, MethodVisitor mv, StackHeights currentStackHeights, StackHeights maxStackHeights)
             throws CompileException
     {
+        // use the statci methods on the class  to do conversions -- that means the class gets a chance
+        // to reuse cached values
         if (toType == Type.BOOLEAN) {
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Boolean");
-            mv.visitInsn(Opcodes.DUP_X1);
-            mv.visitInsn(Opcodes.SWAP);
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Boolean", "<init>", "(Z)V");
-        } else if (toType == Type.BOOLEAN) {
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Byte");
-            mv.visitInsn(Opcodes.DUP_X1);
-            mv.visitInsn(Opcodes.SWAP);
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Byte", "<init>", "(B)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
+        } else if (toType == Type.BYTE) {
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
         } else if (toType == Type.SHORT){
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Short");
-            mv.visitInsn(Opcodes.DUP_X1);
-            mv.visitInsn(Opcodes.SWAP);
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Short", "<init>", "(S)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
         } else if (toType == Type.CHARACTER){
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Character");
-            mv.visitInsn(Opcodes.DUP_X1);
-            mv.visitInsn(Opcodes.SWAP);
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Character", "<init>", "(C)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
         } else if (toType == Type.INTEGER) {
-            // initial stack [i, ...]
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Integer"); // => [Integer, i, ...]
-            mv.visitInsn(Opcodes.DUP_X1);                        // => [Integer, i, Integer, ...]
-            mv.visitInsn(Opcodes.SWAP);                          // => [i, Integer, Integer, ...]
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Integer", "<init>", "(I)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
         } else if (toType == Type.LONG) {
-            // initial stack [i, ...]
-            mv.visitInsn(Opcodes.I2L);  // => [l1, l0, ...]
-            // this temporarily adds 4 to the stack height
-            if (currentStackHeights.stackCount + 4 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 4;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Long");   // => [Long, l1, l0, ...]
-            mv.visitInsn(Opcodes.DUP_X2);                       // => [Long, l1, l0, Long, ...]
-            mv.visitInsn(Opcodes.DUP_X2);                       // => [Long, l1, l0, Long Long, ...]
-            mv.visitInsn(Opcodes.POP);                          // => [l1, l0, Long, Long ...]
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Long", "<init>", "(J)V"); // => [ Long, ...]
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", "(L)Ljava/lang/Long;");
         } else if (toType == Type.FLOAT) {
-            // initial stack [i, ...]
-            mv.visitInsn(Opcodes.I2F); // => [f, ...]
-            // this temporarily adds 2 to the stack height
-            if (currentStackHeights.stackCount + 2 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 2;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Float"); // => [Float, f, ...]
-            mv.visitInsn(Opcodes.DUP_X1);                      // => [Float, f, Float, ...]
-            mv.visitInsn(Opcodes.SWAP);                        // => [f, Float, Float, ...]
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Float", "<init>", "(F)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
         } else if (toType == Type.DOUBLE) {
-            // initial stack [i, ...]
-            mv.visitInsn(Opcodes.I2D);  // => [d1, d0, ...]
-            // this temporarily adds 4 to the stack height
-            if (currentStackHeights.stackCount + 4 > maxStackHeights.stackCount) {
-                maxStackHeights.stackCount = currentStackHeights.stackCount + 4;
-            }
-            mv.visitTypeInsn(Opcodes.NEW,  "java/lang/Double");   // => [Double, d1, d0, ...]
-            mv.visitInsn(Opcodes.DUP_X2);                         // => [Double, d1, d0, Double, ...]
-            mv.visitInsn(Opcodes.DUP_X2);                         // => [Double, d1, d0, Double, Double, ...]
-            mv.visitInsn(Opcodes.POP) ;                           // => [d1, d0, Double, Double, ...]
-            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Double", "<init>", "(D)V");
+            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
         }
     }
 

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ArithmeticExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ArithmeticExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ArithmeticExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -40,6 +40,7 @@
 public class ArithmeticExpression extends BinaryOperExpression
 {
     public ArithmeticExpression(Rule rule, int oper, ParseNode token, Expression left, Expression right)
+            throws TypeException
     {
         super(rule, oper, Type.promote(left.getType(), right.getType()), token, left, right);
     }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/BitExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/BitExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/BitExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -40,6 +40,7 @@
 public class BitExpression extends BinaryOperExpression
 {
     public BitExpression(Rule rule, int oper, ParseNode token, Expression left, Expression right)
+            throws TypeException
     {
         // n.b. left and right must be of integral type
 

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ConditionalEvalExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ConditionalEvalExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ConditionalEvalExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -106,6 +106,12 @@
         compileTypeConversion(oper1.getType(), type,  mv, currentStackHeights, maxStackHeights);
         // plant a goto skipping over the else expression
         mv.visitJumpInsn(Opcodes.GOTO, endLabel);
+        // check the stack height is what we expect, either 1 or 2 words depending upon the result type
+        if (currentStackHeights.stackCount != currentStack + expected) {
+            throw new CompileException("ConditionalEvalExpression.compile : invalid true branch stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
+        }
+        // ok, now reset stack height for false branch
+        currentStackHeights.addStackCount(-expected);
         // else starts here
         mv.visitLabel(elseLabel);
         // compile the else branch
@@ -117,8 +123,9 @@
 
         // check the stack height is what we expect, either 1 or 2 words depending upon the result type
         if (currentStackHeights.stackCount != currentStack + expected) {
-            throw new CompileException("ConditionalEvalExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
+            throw new CompileException("ConditionalEvalExpression.compile : invalid false branch stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
         }
+
         // no need to check max stack height as teh left and right expressions will have exceeded anything
         // we stacked inside this call
     }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/DollarExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/DollarExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/DollarExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -141,8 +141,9 @@
             // perform any necessary type conversion
             if (type.isPrimitive()) {
                 // cast down to the boxed type then do an unbox
-                compileObjectConversion(Type.OBJECT, Type.boxType(type), mv, currentStackHeights, maxStackHeights);
-                compileUnbox(Type.OBJECT, type,  mv, currentStackHeights, maxStackHeights);
+                Type boxType = Type.boxType(type);
+                compileObjectConversion(Type.OBJECT, boxType, mv, currentStackHeights, maxStackHeights);
+                compileUnbox(boxType, type,  mv, currentStackHeights, maxStackHeights);
             } else {
                 // cast down to the required type
                 compileObjectConversion(Type.OBJECT, type, mv, currentStackHeights, maxStackHeights);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Expression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Expression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Expression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -74,7 +74,7 @@
 
     public String getPos()
     {
-        return rule.getFile() + " @ line " + "." + charPos;
+        return " file " + rule.getFile() + " @ " + line + "." + charPos;
     }
 
     public Type getType()

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/FieldExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/FieldExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/FieldExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -190,12 +190,14 @@
         int currentStack = currentStackHeights.stackCount;
         int expected = (type.getNBytes() > 4 ? 2 : 1);
 
-        // compile the owner expression and then ensure it is typed correctly
+        // compile the owner expression
         owner.compile(mv, currentStackHeights, maxStackHeights);
-        compileTypeConversion(owner.getType(), type, mv, currentStackHeights, maxStackHeights);
         if (!indirectStatic) {
             // compile a field access
-            mv.visitFieldInsn(Opcodes.GETFIELD, field.getDeclaringClass().getName(), field.getName(), field.getType().getName());
+            String ownerType = Type.internalName(field.getDeclaringClass());
+            String fieldName = field.getName();
+            String fieldType = Type.internalName(field.getType(), true);
+            mv.visitFieldInsn(Opcodes.GETFIELD, ownerType, fieldName, fieldType);
         }
         // check the stack height is ok
         if (currentStackHeights.stackCount != currentStack + expected) {
@@ -222,17 +224,24 @@
 
     public int getPathCount(String name)
     {
-        int charMax = name.length();
-        int charCount = 0;
-        int dotExtra = 0;
-        int idx;
-        for (idx = 0; idx < pathList.length; idx++) {
-            charCount += (dotExtra + pathList[idx].length());
-            if (charCount > charMax) {
-                break;
+        // name will be package qualified so check whether the path list also includes the package
+        if (name.startsWith(pathList[0])) {
+            int charMax = name.length();
+            int charCount = 0;
+            int dotExtra = 0;
+            int idx;
+            for (idx = 0; idx < pathList.length; idx++) {
+                charCount += (dotExtra + pathList[idx].length());
+                if (charCount > charMax) {
+                    break;
+                }
             }
+            return idx;
+        } else {
+            // name must have been obtained by globalizing an unqualified type name so the typename
+            // is the first element in the path list
+            return 1;
         }
-        return idx;
     }
 
     public void writeTo(StringWriter stringWriter) {

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/LogicalExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/LogicalExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/LogicalExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -94,6 +94,8 @@
             mv.visitLdcInsn(true);
             mv.visitJumpInsn(Opcodes.GOTO, endLabel);
         }
+        // in either case if we get here the if test removed 1 from the stack
+        currentStackHeights.addStackCount(-1);
         // the else branch -- adds 1 to stack height
         mv.visitLabel(nextLabel);
         oper1.compile(mv, currentStackHeights, maxStackHeights);
@@ -103,9 +105,10 @@
         // the final result is the result of the second oper which is on the stack already
         // This is the end, my beau-tiful friend
         mv.visitLabel(endLabel);
+        // in either case if we get here we should have one extra value on the stack
         // check stack height
         if (currentStackHeights.stackCount != currentStack + 1) {
-            throw new CompileException("LogicalExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + 1);
+            throw new CompileException("LogicalExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + 1));
         }
         // no need to check max stack height as recursive calls will have added at least 1 
     }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -382,23 +382,32 @@
 
     public int getPathCount(String name)
     {
-        int charMax = name.length();
-        int charCount = 0;
-        int dotExtra = 0;
-        int idx;
-        for (idx = 0; idx < pathList.length; idx++) {
-            charCount += (dotExtra + pathList[idx].length());
-            if (charCount > charMax) {
-                break;
+        // name will be package qualified so check whether the path list also includes the package
+        if (name.startsWith(pathList[0])) {
+            int charMax = name.length();
+            int charCount = 0;
+            int dotExtra = 0;
+            int idx;
+            for (idx = 0; idx < pathList.length; idx++) {
+                charCount += (dotExtra + pathList[idx].length());
+                if (charCount > charMax) {
+                    break;
+                }
             }
+            return idx;
+        } else {
+            // name must have been obtained by globalizing an unqualified type name so the typename
+            // is the first element in the path list
+            return 1;
         }
-        return idx;
     }
 
     public void writeTo(StringWriter stringWriter) {
         if (recipient != null) {
             recipient.writeTo(stringWriter);
             stringWriter.write(".");
+        } else if (pathList != null) {
+            stringWriter.write(getPath(pathList.length));
         }
         stringWriter.write(name);
         stringWriter.write("(");

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/NotExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/NotExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/NotExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -63,7 +63,7 @@
         Type operType = oper.getType();
 
         int currentStack = currentStackHeights.stackCount;
-        int expected = 0;
+        int expected = 1;
 
         // compile code to execute the operand -- adds 1
         oper.compile(mv, currentStackHeights, maxStackHeights);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ReturnExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ReturnExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ReturnExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -173,7 +173,7 @@
         Type returnType = returnValue.getType();
         int currentStack = currentStackHeights.stackCount;
         int expected = 1;
-        int extraSlots = 3;
+        int extraSlots = 0;
 
         // ok, we need to create the EarlyReturnException instance and then
         // initialise it using the appropriate return value or null if no
@@ -185,32 +185,44 @@
         // create am EarlyReturnException -- adds 1 to stack
         String exceptionClassName = Type.internalName(EarlyReturnException.class);
         mv.visitTypeInsn(Opcodes.NEW, exceptionClassName);
+        currentStackHeights.addStackCount(1);
+        // copy the exception so we can initialise it -- adds 1 to stack
+        mv.visitInsn(Opcodes.DUP);
+        currentStackHeights.addStackCount(1);
         // stack a string constant to initialise the exception with -- adds 1 to stack
         mv.visitLdcInsn("return from " + rule.getName());
+        currentStackHeights.addStackCount(1);
         // stack any required return value or null -- adds 1 to stack but may use 2 slots
         if (returnValue != null) {
             returnValue.compile(mv, currentStackHeights, maxStackHeights);
             if (returnType.isPrimitive()) {
-                // we need an object not a primitive
-                compileBox(returnType, mv, currentStackHeights, maxStackHeights);
                 // if the intermediate value used 2 words then at the peak we needed an extra stack slot
                 if (returnType.getNBytes() > 4) {
                     extraSlots++;
                 }
+                // we need an object not a primitive
+                compileBox(Type.boxType(returnType), mv, currentStackHeights, maxStackHeights);
             }
         } else {
             // just push null
             mv.visitInsn(Opcodes.ACONST_NULL);
+            currentStackHeights.addStackCount(1);
         }
-        // construct the exception
+        // construct the exception -- pops 3
         mv.visitMethodInsn(Opcodes.INVOKESPECIAL, exceptionClassName, "<init>", "(Ljava/lang/String;Ljava/lang/Object;)V");
+        currentStackHeights.addStackCount(-3);
 
         // check current stack and increment max stack if necessary
         if (currentStackHeights.stackCount != currentStack + expected) {
-            throw new CompileException("ReturnExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
+            throw new CompileException("ReturnExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expected));
         }
 
-        int overflow = ((currentStack + extraSlots) - maxStackHeights.stackCount);
+        // now insert the throw instruction and decrement the stack height accordingly
+        
+        mv.visitInsn(Opcodes.ATHROW);
+        currentStackHeights.addStackCount(-1);
+
+        int overflow = ((currentStack + 3 +  extraSlots) - maxStackHeights.stackCount);
         if (overflow > 0) {
             maxStackHeights.addStackCount(overflow);
         }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/StaticExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/StaticExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/StaticExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -109,7 +109,10 @@
 
         // compile a field access
 
-        mv.visitFieldInsn(Opcodes.GETSTATIC, ownerTypeName, fieldName, type.getName());
+        String ownerType = Type.internalName(field.getDeclaringClass());
+        String fieldName = field.getName();
+        String fieldType = Type.internalName(field.getType(), true);
+        mv.visitFieldInsn(Opcodes.GETSTATIC, ownerType, fieldName, fieldType);
         expected = (type.getNBytes() > 4 ? 2 : 1);
 
         currentStackHeights.addStackCount(expected);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -266,7 +266,9 @@
         String exceptionClassName = type.getInternalName();
         mv.visitTypeInsn(Opcodes.NEW, exceptionClassName);
         currentStackHeights.addStackCount(1);
-        extraParams++;
+        // copy the exception so we can init it
+        mv.visitInsn(Opcodes.DUP);
+        currentStackHeights.addStackCount(1);
 
         int argCount = arguments.size();
 
@@ -274,26 +276,31 @@
         for (int i = 0; i < argCount; i++) {
             Type argType = argumentTypes.get(i);
             Type paramType = paramTypes.get(i);
+            int paramCount = (paramType.getNBytes() > 4 ? 2 : 1);
 
+            // track extra storage used after type conversion
+            currentStackHeights.addStackCount(paramCount);
+            extraParams += (paramCount);
             arguments.get(i).compile(mv, currentStackHeights, maxStackHeights);
             compileTypeConversion(argType, paramType, mv, currentStackHeights, maxStackHeights);
-            // track extra storage used after type conversion
-            extraParams += (paramType.getNBytes() > 4 ? 2 : 1);
         }
 
         // construct the exception
         mv.visitMethodInsn(Opcodes.INVOKESPECIAL, exceptionClassName, "<init>", getDescriptor());
-        // now throw it
-        mv.visitInsn(Opcodes.ATHROW);
 
-        // decrement the stack height to account for stacked param values (removed) and return value (added)
-        currentStackHeights.addStackCount(expected - extraParams);
+        // modify the stack height to account for the removed exception and params
+        currentStackHeights.addStackCount(-(extraParams+1));
 
         // we should only have the thrown exception on the stack
         if (currentStackHeights.stackCount != currentStack + expected) {
-            throw new CompileException("ThrowExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + currentStack + expected);
+            throw new CompileException("ThrowExpression.compile : invalid stack height " + currentStackHeights.stackCount + " expecting " + (currentStack + expected));
         }
 
+        // now throw the exception and decrement the stack height
+
+        mv.visitInsn(Opcodes.ATHROW);
+        currentStackHeights.addStackCount(-1);
+
         // no need to update max stack unless extraParams is zero in which case the exception
         // instance may have thrown us over the limit
 

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Variable.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Variable.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/Variable.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -113,8 +113,9 @@
         // perform any necessary type conversion
         if (type.isPrimitive()) {
             // cast down to the boxed type then do an unbox
-            compileObjectConversion(Type.OBJECT, Type.boxType(type), mv, currentStackHeights, maxStackHeights);
-            compileUnbox(Type.OBJECT, type,  mv, currentStackHeights, maxStackHeights);
+            Type boxType = Type.boxType(type);
+            compileObjectConversion(Type.OBJECT, boxType, mv, currentStackHeights, maxStackHeights);
+            compileUnbox(boxType, type,  mv, currentStackHeights, maxStackHeights);
         } else {
             // cast down to the required type
             compileObjectConversion(Type.OBJECT, type, mv, currentStackHeights, maxStackHeights);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Thu Apr 09 12:10:33 BST 2009
+// Wed Apr 15 17:33:38 BST 2009
 //----------------------------------------------------
 
 package org.jboss.jbossts.orchestration.rule.grammar;
@@ -10,7 +10,7 @@
 import org.jboss.jbossts.orchestration.rule.grammar.ParseNode;
 
 /** CUP v0.10k generated parser.
-  * @version Thu Apr 09 12:10:33 BST 2009
+  * @version Wed Apr 15 17:33:38 BST 2009
   */
 public class ECAGrammarParser extends java_cup.runtime.lr_parser {
 
@@ -23,7 +23,7 @@
   /** Production table. */
   protected static final short _production_table[][] = 
     unpackFromStrings(new String[] {
-    "\000\122\000\002\003\003\000\002\002\004\000\002\004" +
+    "\000\123\000\002\003\003\000\002\002\004\000\002\004" +
     "\010\000\002\005\003\000\002\005\003\000\002\006\005" +
     "\000\002\006\005\000\002\006\003\000\002\007\005\000" +
     "\002\010\005\000\002\010\003\000\002\011\003\000\002" +
@@ -42,13 +42,13 @@
     "\021\004\000\002\022\004\000\002\022\004\000\002\022" +
     "\004\000\002\030\003\000\002\030\004\000\002\031\005" +
     "\000\002\023\005\000\002\023\003\000\002\024\005\000" +
-    "\002\024\005\000\002\025\005\000\002\025\006\000\002" +
-    "\025\007\000\002\025\010\000\002\025\003\000\002\026" +
-    "\007\000\002\026\010\000\002\026\007\000\002\026\010" +
-    "\000\002\027\003\000\002\027\003\000\002\027\003\000" +
-    "\002\027\003\000\002\027\003\000\002\027\005\000\002" +
-    "\032\003\000\002\032\005\000\002\033\003\000\002\034" +
-    "\003\000\002\034\005" });
+    "\002\024\005\000\002\024\005\000\002\025\005\000\002" +
+    "\025\006\000\002\025\007\000\002\025\010\000\002\025" +
+    "\003\000\002\026\007\000\002\026\010\000\002\026\007" +
+    "\000\002\026\010\000\002\027\003\000\002\027\003\000" +
+    "\002\027\003\000\002\027\003\000\002\027\003\000\002" +
+    "\027\005\000\002\032\003\000\002\032\005\000\002\033" +
+    "\003\000\002\034\003\000\002\034\005" });
 
   /** Access to production table. */
   public short[][] production_table() {return _production_table;}
@@ -57,26 +57,26 @@
   protected static final short[][] _action_table = 
     unpackFromStrings(new String[] {
     "\000\217\000\004\004\005\001\002\000\004\002\001\001" +
-    "\002\000\006\007\010\054\011\001\002\000\004\002\007" +
+    "\002\000\006\007\010\054\012\001\002\000\004\002\007" +
     "\001\002\000\004\002\000\001\002\000\004\005\ufffe\001" +
-    "\002\000\074\002\uffb2\005\uffb2\006\uffb2\012\uffb2\013\uffb2" +
-    "\014\uffb2\015\uffb2\016\uffb2\017\uffb2\020\uffb2\021\uffb2\022" +
-    "\uffb2\023\uffb2\024\uffb2\025\uffb2\026\uffb2\027\uffb2\030\uffb2" +
-    "\031\uffb2\032\uffb2\033\uffb2\034\uffb2\035\uffb2\036\uffb2\037" +
-    "\uffb2\040\uffb2\041\uffb2\042\uffb2\043\uffb2\001\002\000\004" +
-    "\005\175\001\002\000\004\021\032\001\002\000\006\021" +
+    "\002\000\004\005\175\001\002\000\074\002\uffb1\005\uffb1" +
+    "\006\uffb1\012\uffb1\013\uffb1\014\uffb1\015\uffb1\016\uffb1\017" +
+    "\uffb1\020\uffb1\021\uffb1\022\uffb1\023\uffb1\024\uffb1\025\uffb1" +
+    "\026\uffb1\027\uffb1\030\uffb1\031\uffb1\032\uffb1\033\uffb1\034" +
+    "\uffb1\035\uffb1\036\uffb1\037\uffb1\040\uffb1\041\uffb1\042\uffb1" +
+    "\043\uffb1\001\002\000\004\021\032\001\002\000\006\021" +
     "\ufff7\023\023\001\002\000\010\005\ufffa\016\020\017\017" +
-    "\001\002\000\004\005\ufffd\001\002\000\004\054\011\001" +
-    "\002\000\004\054\011\001\002\000\004\005\ufffb\001\002" +
+    "\001\002\000\004\005\ufffd\001\002\000\004\054\012\001" +
+    "\002\000\004\054\012\001\002\000\004\005\ufffb\001\002" +
     "\000\004\005\ufffc\001\002\000\004\054\025\001\002\000" +
-    "\004\021\ufff8\001\002\000\072\002\uffb2\005\uffb2\006\uffb2" +
-    "\012\uffb2\013\uffb2\015\uffb2\016\uffb2\017\uffb2\020\uffb1\021" +
-    "\uffb2\022\uffb2\023\uffb2\024\uffb2\025\uffb2\026\uffb2\027\uffb2" +
-    "\030\uffb2\031\uffb2\032\uffb2\033\uffb2\034\uffb2\035\uffb2\036" +
-    "\uffb2\037\uffb2\040\uffb2\041\uffb2\042\uffb2\043\uffb2\001\002" +
-    "\000\004\020\030\001\002\000\006\012\uffb4\021\uffb4\001" +
-    "\002\000\004\054\031\001\002\000\010\012\uffb3\020\uffb0" +
-    "\021\uffb3\001\002\000\026\012\042\042\051\044\036\045" +
+    "\004\021\ufff8\001\002\000\072\002\uffb1\005\uffb1\006\uffb1" +
+    "\012\uffb1\013\uffb1\015\uffb1\016\uffb1\017\uffb1\020\uffb0\021" +
+    "\uffb1\022\uffb1\023\uffb1\024\uffb1\025\uffb1\026\uffb1\027\uffb1" +
+    "\030\uffb1\031\uffb1\032\uffb1\033\uffb1\034\uffb1\035\uffb1\036" +
+    "\uffb1\037\uffb1\040\uffb1\041\uffb1\042\uffb1\043\uffb1\001\002" +
+    "\000\004\020\030\001\002\000\006\012\uffb3\021\uffb3\001" +
+    "\002\000\004\054\031\001\002\000\010\012\uffb2\020\uffaf" +
+    "\021\uffb2\001\002\000\026\012\042\042\051\044\036\045" +
     "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
     "\001\002\000\052\005\ufff9\016\ufff9\017\ufff9\022\113\024" +
     "\077\025\073\026\074\027\101\030\110\031\075\032\106" +
@@ -86,17 +86,17 @@
     "\uffe5\023\uffe5\024\uffe5\025\uffe5\026\uffe5\027\uffe5\030\uffe5" +
     "\031\uffe5\032\uffe5\033\uffe5\034\uffe5\035\uffe5\036\uffe5\037" +
     "\uffe5\040\uffe5\041\uffe5\042\uffe5\043\uffe5\001\002\000\070" +
-    "\002\uffb6\005\uffb6\006\uffb6\013\uffb6\014\uffb6\015\uffb6\016" +
-    "\uffb6\017\uffb6\020\uffb6\022\uffb6\023\uffb6\024\uffb6\025\uffb6" +
-    "\026\uffb6\027\uffb6\030\uffb6\031\uffb6\032\uffb6\033\uffb6\034" +
-    "\uffb6\035\uffb6\036\uffb6\037\uffb6\040\uffb6\041\uffb6\042\uffb6" +
-    "\043\uffb6\001\002\000\026\012\042\042\051\044\036\045" +
+    "\002\uffb5\005\uffb5\006\uffb5\013\uffb5\014\uffb5\015\uffb5\016" +
+    "\uffb5\017\uffb5\020\uffb5\022\uffb5\023\uffb5\024\uffb5\025\uffb5" +
+    "\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5\034" +
+    "\uffb5\035\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042\uffb5" +
+    "\043\uffb5\001\002\000\026\012\042\042\051\044\036\045" +
     "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\070\002\uffb8\005\uffb8\006\uffb8\013\uffb8\014" +
-    "\uffb8\015\uffb8\016\uffb8\017\uffb8\020\uffb8\022\uffb8\023\uffb8" +
-    "\024\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032" +
-    "\uffb8\033\uffb8\034\uffb8\035\uffb8\036\uffb8\037\uffb8\040\uffb8" +
-    "\041\uffb8\042\uffb8\043\uffb8\001\002\000\066\002\uffe2\005" +
+    "\001\002\000\070\002\uffb7\005\uffb7\006\uffb7\013\uffb7\014" +
+    "\uffb7\015\uffb7\016\uffb7\017\uffb7\020\uffb7\022\uffb7\023\uffb7" +
+    "\024\uffb7\025\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032" +
+    "\uffb7\033\uffb7\034\uffb7\035\uffb7\036\uffb7\037\uffb7\040\uffb7" +
+    "\041\uffb7\042\uffb7\043\uffb7\001\002\000\066\002\uffe2\005" +
     "\uffe2\006\uffe2\012\167\013\uffe2\015\uffe2\016\uffe2\017\uffe2" +
     "\022\uffe2\023\uffe2\024\uffe2\025\uffe2\026\uffe2\027\uffe2\030" +
     "\uffe2\031\uffe2\032\uffe2\033\uffe2\034\uffe2\035\uffe2\036\uffe2" +
@@ -109,11 +109,11 @@
     "\020\156\022\uffe3\023\uffe3\024\uffe3\025\uffe3\026\uffe3\027" +
     "\uffe3\030\uffe3\031\uffe3\032\uffe3\033\uffe3\034\uffe3\035\uffe3" +
     "\036\uffe3\037\uffe3\040\uffe3\041\uffe3\042\uffe3\043\uffe3\001" +
-    "\002\000\070\002\uffb7\005\uffb7\006\uffb7\013\uffb7\014\uffb7" +
-    "\015\uffb7\016\uffb7\017\uffb7\020\uffb7\022\uffb7\023\uffb7\024" +
-    "\uffb7\025\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7" +
-    "\033\uffb7\034\uffb7\035\uffb7\036\uffb7\037\uffb7\040\uffb7\041" +
-    "\uffb7\042\uffb7\043\uffb7\001\002\000\064\002\uffe8\005\uffe8" +
+    "\002\000\070\002\uffb6\005\uffb6\006\uffb6\013\uffb6\014\uffb6" +
+    "\015\uffb6\016\uffb6\017\uffb6\020\uffb6\022\uffb6\023\uffb6\024" +
+    "\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6\031\uffb6\032\uffb6" +
+    "\033\uffb6\034\uffb6\035\uffb6\036\uffb6\037\uffb6\040\uffb6\041" +
+    "\uffb6\042\uffb6\043\uffb6\001\002\000\064\002\uffe8\005\uffe8" +
     "\006\uffe8\013\uffe8\015\uffe8\016\uffe8\017\uffe8\022\uffe8\023" +
     "\uffe8\024\uffe8\025\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8" +
     "\032\uffe8\033\uffe8\034\uffe8\035\uffe8\036\uffe8\037\uffe8\040" +
@@ -128,16 +128,16 @@
     "\uffe9\032\uffe9\033\uffe9\034\uffe9\035\uffe9\036\uffe9\037\uffe9" +
     "\040\uffe9\041\uffe9\042\uffe9\043\uffe9\001\002\000\026\012" +
     "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\070\002\uffbf\005" +
-    "\uffbf\006\uffbf\013\uffbf\014\uffbf\015\uffbf\016\uffbf\017\uffbf" +
-    "\020\uffbf\022\uffbf\023\uffbf\024\uffbf\025\uffbf\026\uffbf\027" +
-    "\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\uffbf\035\uffbf" +
-    "\036\uffbf\037\uffbf\040\uffbf\041\uffbf\042\uffbf\043\uffbf\001" +
-    "\002\000\070\002\uffba\005\uffba\006\uffba\013\uffba\014\uffba" +
-    "\015\uffba\016\uffba\017\uffba\020\uffba\022\uffba\023\uffba\024" +
-    "\uffba\025\uffba\026\uffba\027\uffba\030\uffba\031\uffba\032\uffba" +
-    "\033\uffba\034\uffba\035\uffba\036\uffba\037\uffba\040\uffba\041" +
-    "\uffba\042\uffba\043\uffba\001\002\000\064\002\uffe6\005\uffe6" +
+    "\052\037\053\044\054\025\001\002\000\070\002\uffbe\005" +
+    "\uffbe\006\uffbe\013\uffbe\014\uffbe\015\uffbe\016\uffbe\017\uffbe" +
+    "\020\uffbe\022\uffbe\023\uffbe\024\uffbe\025\uffbe\026\uffbe\027" +
+    "\uffbe\030\uffbe\031\uffbe\032\uffbe\033\uffbe\034\uffbe\035\uffbe" +
+    "\036\uffbe\037\uffbe\040\uffbe\041\uffbe\042\uffbe\043\uffbe\001" +
+    "\002\000\070\002\uffb9\005\uffb9\006\uffb9\013\uffb9\014\uffb9" +
+    "\015\uffb9\016\uffb9\017\uffb9\020\uffb9\022\uffb9\023\uffb9\024" +
+    "\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031\uffb9\032\uffb9" +
+    "\033\uffb9\034\uffb9\035\uffb9\036\uffb9\037\uffb9\040\uffb9\041" +
+    "\uffb9\042\uffb9\043\uffb9\001\002\000\064\002\uffe6\005\uffe6" +
     "\006\uffe6\013\uffe6\015\uffe6\016\uffe6\017\uffe6\022\uffe6\023" +
     "\uffe6\024\uffe6\025\uffe6\026\uffe6\027\uffe6\030\uffe6\031\uffe6" +
     "\032\uffe6\033\uffe6\034\uffe6\035\uffe6\036\uffe6\037\uffe6\040" +
@@ -150,11 +150,11 @@
     "\uffe4\017\uffe4\020\063\022\uffe4\023\uffe4\024\uffe4\025\uffe4" +
     "\026\uffe4\027\uffe4\030\uffe4\031\uffe4\032\uffe4\033\uffe4\034" +
     "\uffe4\035\uffe4\036\uffe4\037\uffe4\040\uffe4\041\uffe4\042\uffe4" +
-    "\043\uffe4\001\002\000\070\002\uffb9\005\uffb9\006\uffb9\013" +
-    "\uffb9\014\uffb9\015\uffb9\016\uffb9\017\uffb9\020\uffb9\022\uffb9" +
-    "\023\uffb9\024\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031" +
-    "\uffb9\032\uffb9\033\uffb9\034\uffb9\035\uffb9\036\uffb9\037\uffb9" +
-    "\040\uffb9\041\uffb9\042\uffb9\043\uffb9\001\002\000\026\012" +
+    "\043\uffe4\001\002\000\070\002\uffb8\005\uffb8\006\uffb8\013" +
+    "\uffb8\014\uffb8\015\uffb8\016\uffb8\017\uffb8\020\uffb8\022\uffb8" +
+    "\023\uffb8\024\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031" +
+    "\uffb8\032\uffb8\033\uffb8\034\uffb8\035\uffb8\036\uffb8\037\uffb8" +
+    "\040\uffb8\041\uffb8\042\uffb8\043\uffb8\001\002\000\026\012" +
     "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
     "\052\037\053\044\054\025\001\002\000\064\002\uffcb\005" +
     "\uffcb\006\uffcb\013\uffcb\015\uffcb\016\uffcb\017\uffcb\022\uffcb" +
@@ -165,22 +165,28 @@
     "\017\uffca\022\uffca\023\uffca\024\uffca\025\uffca\026\uffca\027" +
     "\uffca\030\uffca\031\uffca\032\uffca\033\uffca\034\uffca\035\uffca" +
     "\036\uffca\037\uffca\040\uffca\041\uffca\042\uffca\043\uffca\001" +
-    "\002\000\004\054\011\001\002\000\004\012\065\001\002" +
-    "\000\030\012\042\013\067\042\051\044\036\045\041\047" +
-    "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\050\013\uffeb\017\102\022\113\024\077\025\073\026" +
-    "\074\027\101\030\110\031\075\032\106\033\100\034\105" +
-    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
-    "\072\001\002\000\070\002\uffbc\005\uffbc\006\uffbc\013\uffbc" +
-    "\014\uffbc\015\uffbc\016\uffbc\017\uffbc\020\uffbc\022\uffbc\023" +
-    "\uffbc\024\uffbc\025\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc" +
-    "\032\uffbc\033\uffbc\034\uffbc\035\uffbc\036\uffbc\037\uffbc\040" +
-    "\uffbc\041\uffbc\042\uffbc\043\uffbc\001\002\000\004\013\071" +
-    "\001\002\000\070\002\uffbb\005\uffbb\006\uffbb\013\uffbb\014" +
-    "\uffbb\015\uffbb\016\uffbb\017\uffbb\020\uffbb\022\uffbb\023\uffbb" +
-    "\024\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb\032" +
-    "\uffbb\033\uffbb\034\uffbb\035\uffbb\036\uffbb\037\uffbb\040\uffbb" +
-    "\041\uffbb\042\uffbb\043\uffbb\001\002\000\026\012\042\042" +
+    "\002\000\004\054\012\001\002\000\072\002\uffc4\005\uffc4" +
+    "\006\uffc4\012\065\013\uffc4\014\uffc4\015\uffc4\016\uffc4\017" +
+    "\uffc4\020\uffc4\022\uffc4\023\uffc4\024\uffc4\025\uffc4\026\uffc4" +
+    "\027\uffc4\030\uffc4\031\uffc4\032\uffc4\033\uffc4\034\uffc4\035" +
+    "\uffc4\036\uffc4\037\uffc4\040\uffc4\041\uffc4\042\uffc4\043\uffc4" +
+    "\001\002\000\030\012\042\013\067\042\051\044\036\045" +
+    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
+    "\001\002\000\050\013\uffeb\017\102\022\113\024\077\025" +
+    "\073\026\074\027\101\030\110\031\075\032\106\033\100" +
+    "\034\105\035\111\036\104\037\112\040\103\041\076\042" +
+    "\107\043\072\001\002\000\070\002\uffbb\005\uffbb\006\uffbb" +
+    "\013\uffbb\014\uffbb\015\uffbb\016\uffbb\017\uffbb\020\uffbb\022" +
+    "\uffbb\023\uffbb\024\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb" +
+    "\031\uffbb\032\uffbb\033\uffbb\034\uffbb\035\uffbb\036\uffbb\037" +
+    "\uffbb\040\uffbb\041\uffbb\042\uffbb\043\uffbb\001\002\000\004" +
+    "\013\071\001\002\000\070\002\uffba\005\uffba\006\uffba\013" +
+    "\uffba\014\uffba\015\uffba\016\uffba\017\uffba\020\uffba\022\uffba" +
+    "\023\uffba\024\uffba\025\uffba\026\uffba\027\uffba\030\uffba\031" +
+    "\uffba\032\uffba\033\uffba\034\uffba\035\uffba\036\uffba\037\uffba" +
+    "\040\uffba\041\uffba\042\uffba\043\uffba\001\002\000\026\012" +
+    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
+    "\052\037\053\044\054\025\001\002\000\026\012\042\042" +
     "\051\044\036\045\041\047\035\050\057\051\053\052\037" +
     "\053\044\054\025\001\002\000\026\012\042\042\051\044" +
     "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
@@ -212,205 +218,203 @@
     "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
     "\001\002\000\026\012\042\042\051\044\036\045\041\047" +
     "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\026\012\042\042\051\044\036\045\041\047\035\050" +
-    "\057\051\053\052\037\053\044\054\025\001\002\000\046" +
-    "\022\113\023\115\024\077\025\073\026\074\027\101\030" +
+    "\000\046\022\113\023\115\024\077\025\073\026\074\027" +
+    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
+    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
+    "\002\000\026\012\042\042\051\044\036\045\041\047\035" +
+    "\050\057\051\053\052\037\053\044\054\025\001\002\000" +
+    "\064\002\uffe1\005\uffe1\006\uffe1\013\uffe1\015\uffe1\016\uffe1" +
+    "\017\uffe1\022\113\023\uffe1\024\077\025\073\026\074\027" +
+    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
+    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
+    "\002\000\064\002\uffd3\005\uffd3\006\uffd3\013\uffd3\015\uffd3" +
+    "\016\uffd3\017\uffd3\022\uffd3\023\uffd3\024\uffd3\025\uffd3\026" +
+    "\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\034\105" +
+    "\035\111\036\104\037\uffd3\040\uffd3\041\uffd3\042\uffd3\043" +
+    "\uffd3\001\002\000\064\002\uffd7\005\uffd7\006\uffd7\013\uffd7" +
+    "\015\uffd7\016\uffd7\017\uffd7\022\uffd7\023\uffd7\024\uffd7\025" +
+    "\uffd7\026\uffd7\027\uffd7\030\uffd7\031\uffd7\032\uffd7\033\uffd7" +
+    "\034\uffd7\035\uffd7\036\uffd7\037\uffd7\040\uffd7\041\uffd7\042" +
+    "\uffd7\043\uffd7\001\002\000\060\002\uffdc\005\uffdc\006\uffdc" +
+    "\013\uffdc\015\uffdc\016\uffdc\017\uffdc\022\uffdc\023\uffdc\024" +
+    "\uffdc\025\uffdc\026\074\027\101\032\106\033\100\034\105" +
+    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
+    "\072\001\002\000\064\002\uffd4\005\uffd4\006\uffd4\013\uffd4" +
+    "\015\uffd4\016\uffd4\017\uffd4\022\uffd4\023\uffd4\024\uffd4\025" +
+    "\uffd4\026\uffd4\027\uffd4\030\uffd4\031\uffd4\032\uffd4\033\uffd4" +
+    "\034\105\035\111\036\104\037\112\040\103\041\uffd4\042" +
+    "\uffd4\043\072\001\002\000\064\002\uffda\005\uffda\006\uffda" +
+    "\013\uffda\015\uffda\016\uffda\017\uffda\022\uffda\023\uffda\024" +
+    "\uffda\025\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda" +
+    "\033\uffda\034\105\035\111\036\104\037\112\040\103\041" +
+    "\076\042\107\043\072\001\002\000\064\002\uffd8\005\uffd8" +
+    "\006\uffd8\013\uffd8\015\uffd8\016\uffd8\017\uffd8\022\uffd8\023" +
+    "\uffd8\024\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031\uffd8" +
+    "\032\uffd8\033\uffd8\034\uffd8\035\uffd8\036\uffd8\037\uffd8\040" +
+    "\uffd8\041\uffd8\042\uffd8\043\uffd8\001\002\000\064\002\uffd6" +
+    "\005\uffd6\006\uffd6\013\uffd6\015\uffd6\016\uffd6\017\uffd6\022" +
+    "\uffd6\023\uffd6\024\uffd6\025\uffd6\026\uffd6\027\uffd6\030\uffd6" +
+    "\031\uffd6\032\uffd6\033\uffd6\034\uffd6\035\uffd6\036\uffd6\037" +
+    "\uffd6\040\uffd6\041\uffd6\042\uffd6\043\uffd6\001\002\000\064" +
+    "\002\uffd2\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016\uffd2\017" +
+    "\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2\027\uffd2" +
+    "\030\uffd2\031\uffd2\032\uffd2\033\uffd2\034\105\035\111\036" +
+    "\104\037\uffd2\040\uffd2\041\uffd2\042\uffd2\043\uffd2\001\002" +
+    "\000\004\013\uffea\001\002\000\064\002\uffdd\005\uffdd\006" +
+    "\uffdd\013\uffdd\015\uffdd\016\uffdd\017\uffdd\022\uffdd\023\uffdd" +
+    "\024\uffdd\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd\032" +
+    "\uffdd\033\uffdd\034\105\035\111\036\104\037\112\040\103" +
+    "\041\076\042\107\043\072\001\002\000\064\002\uffd9\005" +
+    "\uffd9\006\uffd9\013\uffd9\015\uffd9\016\uffd9\017\uffd9\022\uffd9" +
+    "\023\uffd9\024\uffd9\025\uffd9\026\uffd9\027\uffd9\030\uffd9\031" +
+    "\uffd9\032\uffd9\033\uffd9\034\105\035\111\036\104\037\112" +
+    "\040\103\041\076\042\107\043\072\001\002\000\064\002" +
+    "\uffe0\005\uffe0\006\uffe0\013\uffe0\015\uffe0\016\uffe0\017\uffe0" +
+    "\022\uffe0\023\uffe0\024\uffe0\025\uffe0\026\074\027\101\030" +
     "\110\031\075\032\106\033\100\034\105\035\111\036\104" +
     "\037\112\040\103\041\076\042\107\043\072\001\002\000" +
-    "\026\012\042\042\051\044\036\045\041\047\035\050\057" +
-    "\051\053\052\037\053\044\054\025\001\002\000\064\002" +
-    "\uffe1\005\uffe1\006\uffe1\013\uffe1\015\uffe1\016\uffe1\017\uffe1" +
-    "\022\113\023\uffe1\024\077\025\073\026\074\027\101\030" +
-    "\110\031\075\032\106\033\100\034\105\035\111\036\104" +
+    "\064\002\uffd5\005\uffd5\006\uffd5\013\uffd5\015\uffd5\016\uffd5" +
+    "\017\uffd5\022\uffd5\023\uffd5\024\uffd5\025\uffd5\026\uffd5\027" +
+    "\uffd5\030\uffd5\031\uffd5\032\uffd5\033\uffd5\034\105\035\111" +
+    "\036\104\037\112\040\103\041\uffd5\042\uffd5\043\072\001" +
+    "\002\000\060\002\uffdb\005\uffdb\006\uffdb\013\uffdb\015\uffdb" +
+    "\016\uffdb\017\uffdb\022\uffdb\023\uffdb\024\uffdb\025\uffdb\026" +
+    "\074\027\101\032\106\033\100\034\105\035\111\036\104" +
     "\037\112\040\103\041\076\042\107\043\072\001\002\000" +
-    "\064\002\uffd3\005\uffd3\006\uffd3\013\uffd3\015\uffd3\016\uffd3" +
-    "\017\uffd3\022\uffd3\023\uffd3\024\uffd3\025\uffd3\026\uffd3\027" +
-    "\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\034\105\035\111" +
-    "\036\104\037\uffd3\040\uffd3\041\uffd3\042\uffd3\043\uffd3\001" +
-    "\002\000\064\002\uffd7\005\uffd7\006\uffd7\013\uffd7\015\uffd7" +
-    "\016\uffd7\017\uffd7\022\uffd7\023\uffd7\024\uffd7\025\uffd7\026" +
-    "\uffd7\027\uffd7\030\uffd7\031\uffd7\032\uffd7\033\uffd7\034\uffd7" +
-    "\035\uffd7\036\uffd7\037\uffd7\040\uffd7\041\uffd7\042\uffd7\043" +
-    "\uffd7\001\002\000\060\002\uffdc\005\uffdc\006\uffdc\013\uffdc" +
-    "\015\uffdc\016\uffdc\017\uffdc\022\uffdc\023\uffdc\024\uffdc\025" +
-    "\uffdc\026\074\027\101\032\106\033\100\034\105\035\111" +
+    "\064\002\uffde\005\uffde\006\uffde\013\uffde\015\uffde\016\uffde" +
+    "\017\uffde\022\uffde\023\uffde\024\uffde\025\uffde\026\uffde\027" +
+    "\uffde\030\uffde\031\uffde\032\uffde\033\uffde\034\105\035\111" +
     "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\064\002\uffd4\005\uffd4\006\uffd4\013\uffd4\015\uffd4" +
-    "\016\uffd4\017\uffd4\022\uffd4\023\uffd4\024\uffd4\025\uffd4\026" +
-    "\uffd4\027\uffd4\030\uffd4\031\uffd4\032\uffd4\033\uffd4\034\105" +
-    "\035\111\036\104\037\112\040\103\041\uffd4\042\uffd4\043" +
-    "\072\001\002\000\064\002\uffda\005\uffda\006\uffda\013\uffda" +
-    "\015\uffda\016\uffda\017\uffda\022\uffda\023\uffda\024\uffda\025" +
-    "\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda\033\uffda" +
-    "\034\105\035\111\036\104\037\112\040\103\041\076\042" +
-    "\107\043\072\001\002\000\064\002\uffd8\005\uffd8\006\uffd8" +
-    "\013\uffd8\015\uffd8\016\uffd8\017\uffd8\022\uffd8\023\uffd8\024" +
-    "\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031\uffd8\032\uffd8" +
-    "\033\uffd8\034\uffd8\035\uffd8\036\uffd8\037\uffd8\040\uffd8\041" +
-    "\uffd8\042\uffd8\043\uffd8\001\002\000\064\002\uffd6\005\uffd6" +
-    "\006\uffd6\013\uffd6\015\uffd6\016\uffd6\017\uffd6\022\uffd6\023" +
-    "\uffd6\024\uffd6\025\uffd6\026\uffd6\027\uffd6\030\uffd6\031\uffd6" +
-    "\032\uffd6\033\uffd6\034\uffd6\035\uffd6\036\uffd6\037\uffd6\040" +
-    "\uffd6\041\uffd6\042\uffd6\043\uffd6\001\002\000\064\002\uffd2" +
-    "\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016\uffd2\017\uffd2\022" +
-    "\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2\027\uffd2\030\uffd2" +
-    "\031\uffd2\032\uffd2\033\uffd2\034\105\035\111\036\104\037" +
-    "\uffd2\040\uffd2\041\uffd2\042\uffd2\043\uffd2\001\002\000\004" +
-    "\013\uffea\001\002\000\064\002\uffdd\005\uffdd\006\uffdd\013" +
-    "\uffdd\015\uffdd\016\uffdd\017\uffdd\022\uffdd\023\uffdd\024\uffdd" +
-    "\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd\032\uffdd\033" +
-    "\uffdd\034\105\035\111\036\104\037\112\040\103\041\076" +
-    "\042\107\043\072\001\002\000\064\002\uffd9\005\uffd9\006" +
-    "\uffd9\013\uffd9\015\uffd9\016\uffd9\017\uffd9\022\uffd9\023\uffd9" +
-    "\024\uffd9\025\uffd9\026\uffd9\027\uffd9\030\uffd9\031\uffd9\032" +
-    "\uffd9\033\uffd9\034\105\035\111\036\104\037\112\040\103" +
-    "\041\076\042\107\043\072\001\002\000\064\002\uffe0\005" +
-    "\uffe0\006\uffe0\013\uffe0\015\uffe0\016\uffe0\017\uffe0\022\uffe0" +
-    "\023\uffe0\024\uffe0\025\uffe0\026\074\027\101\030\110\031" +
+    "\002\000\064\002\uffdf\005\uffdf\006\uffdf\013\uffdf\015\uffdf" +
+    "\016\uffdf\017\uffdf\022\uffdf\023\uffdf\024\uffdf\025\uffdf\026" +
+    "\074\027\101\030\110\031\075\032\106\033\100\034\105" +
+    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
+    "\072\001\002\000\064\002\uffd1\005\uffd1\006\uffd1\013\uffd1" +
+    "\015\uffd1\016\uffd1\017\uffd1\022\uffd1\023\uffd1\024\uffd1\025" +
+    "\uffd1\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1" +
+    "\034\105\035\111\036\104\037\uffd1\040\uffd1\041\uffd1\042" +
+    "\uffd1\043\uffd1\001\002\000\064\002\uffc9\005\uffc9\006\uffc9" +
+    "\013\uffc9\015\uffc9\016\uffc9\017\uffc9\022\uffc9\023\uffc9\024" +
+    "\uffc9\025\uffc9\026\uffc9\027\uffc9\030\uffc9\031\uffc9\032\uffc9" +
+    "\033\uffc9\034\uffc9\035\uffc9\036\uffc9\037\uffc9\040\uffc9\041" +
+    "\uffc9\042\uffc9\043\uffc9\001\002\000\046\015\142\022\113" +
+    "\024\077\025\073\026\074\027\101\030\110\031\075\032" +
+    "\106\033\100\034\105\035\111\036\104\037\112\040\103" +
+    "\041\076\042\107\043\072\001\002\000\066\002\uffc8\005" +
+    "\uffc8\006\uffc8\013\uffc8\014\uffc8\015\uffc8\016\uffc8\017\uffc8" +
+    "\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026\uffc8\027\uffc8\030" +
+    "\uffc8\031\uffc8\032\uffc8\033\uffc8\034\uffc8\035\uffc8\036\uffc8" +
+    "\037\uffc8\040\uffc8\041\uffc8\042\uffc8\043\uffc8\001\002\000" +
+    "\064\002\uffce\005\uffce\006\uffce\013\uffce\015\uffce\016\uffce" +
+    "\017\uffce\022\uffce\023\uffce\024\uffce\025\uffce\026\uffce\027" +
+    "\uffce\030\uffce\031\uffce\032\uffce\033\uffce\034\uffce\035\uffce" +
+    "\036\uffce\037\uffce\040\uffce\041\uffce\042\uffce\043\uffce\001" +
+    "\002\000\004\054\145\001\002\000\072\002\uffb1\005\uffb1" +
+    "\006\uffb1\012\uffb1\013\uffb1\014\uffb1\015\uffb1\016\uffb1\017" +
+    "\uffb1\020\uffaf\022\uffb1\023\uffb1\024\uffb1\025\uffb1\026\uffb1" +
+    "\027\uffb1\030\uffb1\031\uffb1\032\uffb1\033\uffb1\034\uffb1\035" +
+    "\uffb1\036\uffb1\037\uffb1\040\uffb1\041\uffb1\042\uffb1\043\uffb1" +
+    "\001\002\000\070\002\uffc7\005\uffc7\006\uffc7\012\147\013" +
+    "\uffc7\014\uffc7\015\uffc7\016\uffc7\017\uffc7\022\uffc7\023\uffc7" +
+    "\024\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031\uffc7\032" +
+    "\uffc7\033\uffc7\034\uffc7\035\uffc7\036\uffc7\037\uffc7\040\uffc7" +
+    "\041\uffc7\042\uffc7\043\uffc7\001\002\000\030\012\042\013" +
+    "\150\042\051\044\036\045\041\047\035\050\057\051\053" +
+    "\052\037\053\044\054\025\001\002\000\070\002\uffc0\005" +
+    "\uffc0\006\uffc0\013\uffc0\014\uffc0\015\uffc0\016\uffc0\017\uffc0" +
+    "\020\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0\026\uffc0\027" +
+    "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\034\uffc0\035\uffc0" +
+    "\036\uffc0\037\uffc0\040\uffc0\041\uffc0\042\uffc0\043\uffc0\001" +
+    "\002\000\004\013\152\001\002\000\070\002\uffbf\005\uffbf" +
+    "\006\uffbf\013\uffbf\014\uffbf\015\uffbf\016\uffbf\017\uffbf\020" +
+    "\uffbf\022\uffbf\023\uffbf\024\uffbf\025\uffbf\026\uffbf\027\uffbf" +
+    "\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\uffbf\035\uffbf\036" +
+    "\uffbf\037\uffbf\040\uffbf\041\uffbf\042\uffbf\043\uffbf\001\002" +
+    "\000\004\054\012\001\002\000\070\002\uffc3\005\uffc3\006" +
+    "\uffc3\013\uffc3\014\uffc3\015\uffc3\016\uffc3\017\uffc3\020\uffc3" +
+    "\022\uffc3\023\uffc3\024\uffc3\025\uffc3\026\uffc3\027\uffc3\030" +
+    "\uffc3\031\uffc3\032\uffc3\033\uffc3\034\uffc3\035\uffc3\036\uffc3" +
+    "\037\uffc3\040\uffc3\041\uffc3\042\uffc3\043\uffc3\001\002\000" +
+    "\064\002\uffcd\005\uffcd\006\uffcd\013\uffcd\015\uffcd\016\uffcd" +
+    "\017\uffcd\022\uffcd\023\uffcd\024\uffcd\025\uffcd\026\uffcd\027" +
+    "\uffcd\030\uffcd\031\uffcd\032\uffcd\033\uffcd\034\uffcd\035\uffcd" +
+    "\036\uffcd\037\uffcd\040\uffcd\041\uffcd\042\uffcd\043\uffcd\001" +
+    "\002\000\004\054\012\001\002\000\072\002\uffc5\005\uffc5" +
+    "\006\uffc5\012\160\013\uffc5\014\uffc5\015\uffc5\016\uffc5\017" +
+    "\uffc5\020\uffc5\022\uffc5\023\uffc5\024\uffc5\025\uffc5\026\uffc5" +
+    "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\034\uffc5\035" +
+    "\uffc5\036\uffc5\037\uffc5\040\uffc5\041\uffc5\042\uffc5\043\uffc5" +
+    "\001\002\000\030\012\042\013\161\042\051\044\036\045" +
+    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
+    "\001\002\000\070\002\uffbd\005\uffbd\006\uffbd\013\uffbd\014" +
+    "\uffbd\015\uffbd\016\uffbd\017\uffbd\020\uffbd\022\uffbd\023\uffbd" +
+    "\024\uffbd\025\uffbd\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032" +
+    "\uffbd\033\uffbd\034\uffbd\035\uffbd\036\uffbd\037\uffbd\040\uffbd" +
+    "\041\uffbd\042\uffbd\043\uffbd\001\002\000\004\013\163\001" +
+    "\002\000\070\002\uffbc\005\uffbc\006\uffbc\013\uffbc\014\uffbc" +
+    "\015\uffbc\016\uffbc\017\uffbc\020\uffbc\022\uffbc\023\uffbc\024" +
+    "\uffbc\025\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc\032\uffbc" +
+    "\033\uffbc\034\uffbc\035\uffbc\036\uffbc\037\uffbc\040\uffbc\041" +
+    "\uffbc\042\uffbc\043\uffbc\001\002\000\046\013\165\022\113" +
+    "\024\077\025\073\026\074\027\101\030\110\031\075\032" +
+    "\106\033\100\034\105\035\111\036\104\037\112\040\103" +
+    "\041\076\042\107\043\072\001\002\000\070\002\uffb4\005" +
+    "\uffb4\006\uffb4\013\uffb4\014\uffb4\015\uffb4\016\uffb4\017\uffb4" +
+    "\020\uffb4\022\uffb4\023\uffb4\024\uffb4\025\uffb4\026\uffb4\027" +
+    "\uffb4\030\uffb4\031\uffb4\032\uffb4\033\uffb4\034\uffb4\035\uffb4" +
+    "\036\uffb4\037\uffb4\040\uffb4\041\uffb4\042\uffb4\043\uffb4\001" +
+    "\002\000\064\002\uffcf\005\uffcf\006\uffcf\013\uffcf\015\uffcf" +
+    "\016\uffcf\017\uffcf\022\uffcf\023\uffcf\024\uffcf\025\uffcf\026" +
+    "\uffcf\027\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\034\uffcf" +
+    "\035\uffcf\036\uffcf\037\uffcf\040\uffcf\041\uffcf\042\uffcf\043" +
+    "\uffcf\001\002\000\030\012\042\013\170\042\051\044\036" +
+    "\045\041\047\035\050\057\051\053\052\037\053\044\054" +
+    "\025\001\002\000\070\002\uffc2\005\uffc2\006\uffc2\013\uffc2" +
+    "\014\uffc2\015\uffc2\016\uffc2\017\uffc2\020\uffc2\022\uffc2\023" +
+    "\uffc2\024\uffc2\025\uffc2\026\uffc2\027\uffc2\030\uffc2\031\uffc2" +
+    "\032\uffc2\033\uffc2\034\uffc2\035\uffc2\036\uffc2\037\uffc2\040" +
+    "\uffc2\041\uffc2\042\uffc2\043\uffc2\001\002\000\004\013\172" +
+    "\001\002\000\070\002\uffc1\005\uffc1\006\uffc1\013\uffc1\014" +
+    "\uffc1\015\uffc1\016\uffc1\017\uffc1\020\uffc1\022\uffc1\023\uffc1" +
+    "\024\uffc1\025\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1\032" +
+    "\uffc1\033\uffc1\034\uffc1\035\uffc1\036\uffc1\037\uffc1\040\uffc1" +
+    "\041\uffc1\042\uffc1\043\uffc1\001\002\000\064\002\uffd0\005" +
+    "\uffd0\006\uffd0\013\uffd0\015\uffd0\016\uffd0\017\uffd0\022\uffd0" +
+    "\023\uffd0\024\uffd0\025\uffd0\026\074\027\101\030\110\031" +
     "\075\032\106\033\100\034\105\035\111\036\104\037\112" +
     "\040\103\041\076\042\107\043\072\001\002\000\064\002" +
-    "\uffd5\005\uffd5\006\uffd5\013\uffd5\015\uffd5\016\uffd5\017\uffd5" +
-    "\022\uffd5\023\uffd5\024\uffd5\025\uffd5\026\uffd5\027\uffd5\030" +
-    "\uffd5\031\uffd5\032\uffd5\033\uffd5\034\105\035\111\036\104" +
-    "\037\112\040\103\041\uffd5\042\uffd5\043\072\001\002\000" +
-    "\060\002\uffdb\005\uffdb\006\uffdb\013\uffdb\015\uffdb\016\uffdb" +
-    "\017\uffdb\022\uffdb\023\uffdb\024\uffdb\025\uffdb\026\074\027" +
-    "\101\032\106\033\100\034\105\035\111\036\104\037\112" +
-    "\040\103\041\076\042\107\043\072\001\002\000\064\002" +
-    "\uffde\005\uffde\006\uffde\013\uffde\015\uffde\016\uffde\017\uffde" +
-    "\022\uffde\023\uffde\024\uffde\025\uffde\026\uffde\027\uffde\030" +
-    "\uffde\031\uffde\032\uffde\033\uffde\034\105\035\111\036\104" +
-    "\037\112\040\103\041\076\042\107\043\072\001\002\000" +
-    "\064\002\uffdf\005\uffdf\006\uffdf\013\uffdf\015\uffdf\016\uffdf" +
-    "\017\uffdf\022\uffdf\023\uffdf\024\uffdf\025\uffdf\026\074\027" +
-    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
-    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\064\002\uffd1\005\uffd1\006\uffd1\013\uffd1\015\uffd1" +
-    "\016\uffd1\017\uffd1\022\uffd1\023\uffd1\024\uffd1\025\uffd1\026" +
-    "\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1\034\105" +
-    "\035\111\036\104\037\uffd1\040\uffd1\041\uffd1\042\uffd1\043" +
-    "\uffd1\001\002\000\064\002\uffc9\005\uffc9\006\uffc9\013\uffc9" +
-    "\015\uffc9\016\uffc9\017\uffc9\022\uffc9\023\uffc9\024\uffc9\025" +
-    "\uffc9\026\uffc9\027\uffc9\030\uffc9\031\uffc9\032\uffc9\033\uffc9" +
-    "\034\uffc9\035\uffc9\036\uffc9\037\uffc9\040\uffc9\041\uffc9\042" +
-    "\uffc9\043\uffc9\001\002\000\046\015\142\022\113\024\077" +
+    "\uffcc\005\uffcc\006\uffcc\013\uffcc\015\uffcc\016\uffcc\017\uffcc" +
+    "\022\uffcc\023\uffcc\024\uffcc\025\uffcc\026\uffcc\027\uffcc\030" +
+    "\uffcc\031\uffcc\032\uffcc\033\uffcc\034\uffcc\035\uffcc\036\uffcc" +
+    "\037\uffcc\040\uffcc\041\uffcc\042\uffcc\043\uffcc\001\002\000" +
+    "\026\012\042\042\051\044\036\045\041\047\035\050\057" +
+    "\051\053\052\037\053\044\054\025\001\002\000\046\006" +
+    "\ufff6\022\113\024\077\025\073\026\074\027\101\030\110" +
+    "\031\075\032\106\033\100\034\105\035\111\036\104\037" +
+    "\112\040\103\041\076\042\107\043\072\001\002\000\004" +
+    "\006\200\001\002\000\034\007\205\010\203\011\207\012" +
+    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
+    "\052\037\053\044\054\025\001\002\000\004\002\ufff1\001" +
+    "\002\000\052\002\ufff0\016\216\017\217\022\113\024\077" +
     "\025\073\026\074\027\101\030\110\031\075\032\106\033" +
     "\100\034\105\035\111\036\104\037\112\040\103\041\076" +
-    "\042\107\043\072\001\002\000\066\002\uffc8\005\uffc8\006" +
-    "\uffc8\013\uffc8\014\uffc8\015\uffc8\016\uffc8\017\uffc8\022\uffc8" +
-    "\023\uffc8\024\uffc8\025\uffc8\026\uffc8\027\uffc8\030\uffc8\031" +
-    "\uffc8\032\uffc8\033\uffc8\034\uffc8\035\uffc8\036\uffc8\037\uffc8" +
-    "\040\uffc8\041\uffc8\042\uffc8\043\uffc8\001\002\000\064\002" +
-    "\uffce\005\uffce\006\uffce\013\uffce\015\uffce\016\uffce\017\uffce" +
-    "\022\uffce\023\uffce\024\uffce\025\uffce\026\uffce\027\uffce\030" +
-    "\uffce\031\uffce\032\uffce\033\uffce\034\uffce\035\uffce\036\uffce" +
-    "\037\uffce\040\uffce\041\uffce\042\uffce\043\uffce\001\002\000" +
-    "\004\054\145\001\002\000\072\002\uffb2\005\uffb2\006\uffb2" +
-    "\012\uffb2\013\uffb2\014\uffb2\015\uffb2\016\uffb2\017\uffb2\020" +
-    "\uffb0\022\uffb2\023\uffb2\024\uffb2\025\uffb2\026\uffb2\027\uffb2" +
-    "\030\uffb2\031\uffb2\032\uffb2\033\uffb2\034\uffb2\035\uffb2\036" +
-    "\uffb2\037\uffb2\040\uffb2\041\uffb2\042\uffb2\043\uffb2\001\002" +
-    "\000\070\002\uffc7\005\uffc7\006\uffc7\012\147\013\uffc7\014" +
-    "\uffc7\015\uffc7\016\uffc7\017\uffc7\022\uffc7\023\uffc7\024\uffc7" +
-    "\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031\uffc7\032\uffc7\033" +
-    "\uffc7\034\uffc7\035\uffc7\036\uffc7\037\uffc7\040\uffc7\041\uffc7" +
-    "\042\uffc7\043\uffc7\001\002\000\030\012\042\013\150\042" +
+    "\042\107\043\072\001\002\000\030\002\uffef\012\042\042" +
     "\051\044\036\045\041\047\035\050\057\051\053\052\037" +
-    "\053\044\054\025\001\002\000\070\002\uffc1\005\uffc1\006" +
-    "\uffc1\013\uffc1\014\uffc1\015\uffc1\016\uffc1\017\uffc1\020\uffc1" +
-    "\022\uffc1\023\uffc1\024\uffc1\025\uffc1\026\uffc1\027\uffc1\030" +
-    "\uffc1\031\uffc1\032\uffc1\033\uffc1\034\uffc1\035\uffc1\036\uffc1" +
-    "\037\uffc1\040\uffc1\041\uffc1\042\uffc1\043\uffc1\001\002\000" +
-    "\004\013\152\001\002\000\070\002\uffc0\005\uffc0\006\uffc0" +
-    "\013\uffc0\014\uffc0\015\uffc0\016\uffc0\017\uffc0\020\uffc0\022" +
-    "\uffc0\023\uffc0\024\uffc0\025\uffc0\026\uffc0\027\uffc0\030\uffc0" +
-    "\031\uffc0\032\uffc0\033\uffc0\034\uffc0\035\uffc0\036\uffc0\037" +
-    "\uffc0\040\uffc0\041\uffc0\042\uffc0\043\uffc0\001\002\000\004" +
-    "\054\011\001\002\000\070\002\uffc4\005\uffc4\006\uffc4\013" +
-    "\uffc4\014\uffc4\015\uffc4\016\uffc4\017\uffc4\020\uffc4\022\uffc4" +
-    "\023\uffc4\024\uffc4\025\uffc4\026\uffc4\027\uffc4\030\uffc4\031" +
-    "\uffc4\032\uffc4\033\uffc4\034\uffc4\035\uffc4\036\uffc4\037\uffc4" +
-    "\040\uffc4\041\uffc4\042\uffc4\043\uffc4\001\002\000\064\002" +
-    "\uffcd\005\uffcd\006\uffcd\013\uffcd\015\uffcd\016\uffcd\017\uffcd" +
-    "\022\uffcd\023\uffcd\024\uffcd\025\uffcd\026\uffcd\027\uffcd\030" +
-    "\uffcd\031\uffcd\032\uffcd\033\uffcd\034\uffcd\035\uffcd\036\uffcd" +
-    "\037\uffcd\040\uffcd\041\uffcd\042\uffcd\043\uffcd\001\002\000" +
-    "\004\054\011\001\002\000\072\002\uffc5\005\uffc5\006\uffc5" +
-    "\012\160\013\uffc5\014\uffc5\015\uffc5\016\uffc5\017\uffc5\020" +
-    "\uffc5\022\uffc5\023\uffc5\024\uffc5\025\uffc5\026\uffc5\027\uffc5" +
-    "\030\uffc5\031\uffc5\032\uffc5\033\uffc5\034\uffc5\035\uffc5\036" +
-    "\uffc5\037\uffc5\040\uffc5\041\uffc5\042\uffc5\043\uffc5\001\002" +
-    "\000\030\012\042\013\161\042\051\044\036\045\041\047" +
-    "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\070\002\uffbe\005\uffbe\006\uffbe\013\uffbe\014\uffbe\015" +
-    "\uffbe\016\uffbe\017\uffbe\020\uffbe\022\uffbe\023\uffbe\024\uffbe" +
-    "\025\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe\032\uffbe\033" +
-    "\uffbe\034\uffbe\035\uffbe\036\uffbe\037\uffbe\040\uffbe\041\uffbe" +
-    "\042\uffbe\043\uffbe\001\002\000\004\013\163\001\002\000" +
-    "\070\002\uffbd\005\uffbd\006\uffbd\013\uffbd\014\uffbd\015\uffbd" +
-    "\016\uffbd\017\uffbd\020\uffbd\022\uffbd\023\uffbd\024\uffbd\025" +
-    "\uffbd\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" +
-    "\034\uffbd\035\uffbd\036\uffbd\037\uffbd\040\uffbd\041\uffbd\042" +
-    "\uffbd\043\uffbd\001\002\000\046\013\165\022\113\024\077" +
-    "\025\073\026\074\027\101\030\110\031\075\032\106\033" +
-    "\100\034\105\035\111\036\104\037\112\040\103\041\076" +
-    "\042\107\043\072\001\002\000\070\002\uffb5\005\uffb5\006" +
-    "\uffb5\013\uffb5\014\uffb5\015\uffb5\016\uffb5\017\uffb5\020\uffb5" +
-    "\022\uffb5\023\uffb5\024\uffb5\025\uffb5\026\uffb5\027\uffb5\030" +
-    "\uffb5\031\uffb5\032\uffb5\033\uffb5\034\uffb5\035\uffb5\036\uffb5" +
-    "\037\uffb5\040\uffb5\041\uffb5\042\uffb5\043\uffb5\001\002\000" +
-    "\064\002\uffcf\005\uffcf\006\uffcf\013\uffcf\015\uffcf\016\uffcf" +
-    "\017\uffcf\022\uffcf\023\uffcf\024\uffcf\025\uffcf\026\uffcf\027" +
-    "\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\034\uffcf\035\uffcf" +
-    "\036\uffcf\037\uffcf\040\uffcf\041\uffcf\042\uffcf\043\uffcf\001" +
-    "\002\000\030\012\042\013\170\042\051\044\036\045\041" +
-    "\047\035\050\057\051\053\052\037\053\044\054\025\001" +
-    "\002\000\070\002\uffc3\005\uffc3\006\uffc3\013\uffc3\014\uffc3" +
-    "\015\uffc3\016\uffc3\017\uffc3\020\uffc3\022\uffc3\023\uffc3\024" +
-    "\uffc3\025\uffc3\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3" +
-    "\033\uffc3\034\uffc3\035\uffc3\036\uffc3\037\uffc3\040\uffc3\041" +
-    "\uffc3\042\uffc3\043\uffc3\001\002\000\004\013\172\001\002" +
-    "\000\070\002\uffc2\005\uffc2\006\uffc2\013\uffc2\014\uffc2\015" +
-    "\uffc2\016\uffc2\017\uffc2\020\uffc2\022\uffc2\023\uffc2\024\uffc2" +
-    "\025\uffc2\026\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033" +
-    "\uffc2\034\uffc2\035\uffc2\036\uffc2\037\uffc2\040\uffc2\041\uffc2" +
-    "\042\uffc2\043\uffc2\001\002\000\064\002\uffd0\005\uffd0\006" +
-    "\uffd0\013\uffd0\015\uffd0\016\uffd0\017\uffd0\022\uffd0\023\uffd0" +
-    "\024\uffd0\025\uffd0\026\074\027\101\030\110\031\075\032" +
-    "\106\033\100\034\105\035\111\036\104\037\112\040\103" +
-    "\041\076\042\107\043\072\001\002\000\064\002\uffcc\005" +
-    "\uffcc\006\uffcc\013\uffcc\015\uffcc\016\uffcc\017\uffcc\022\uffcc" +
-    "\023\uffcc\024\uffcc\025\uffcc\026\uffcc\027\uffcc\030\uffcc\031" +
-    "\uffcc\032\uffcc\033\uffcc\034\uffcc\035\uffcc\036\uffcc\037\uffcc" +
-    "\040\uffcc\041\uffcc\042\uffcc\043\uffcc\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\046\006\ufff6\022" +
-    "\113\024\077\025\073\026\074\027\101\030\110\031\075" +
-    "\032\106\033\100\034\105\035\111\036\104\037\112\040" +
-    "\103\041\076\042\107\043\072\001\002\000\004\006\200" +
-    "\001\002\000\034\007\205\010\203\011\207\012\042\042" +
-    "\051\044\036\045\041\047\035\050\057\051\053\052\037" +
-    "\053\044\054\025\001\002\000\004\002\ufff1\001\002\000" +
-    "\052\002\ufff0\016\216\017\217\022\113\024\077\025\073" +
-    "\026\074\027\101\030\110\031\075\032\106\033\100\034" +
-    "\105\035\111\036\104\037\112\040\103\041\076\042\107" +
-    "\043\072\001\002\000\030\002\uffef\012\042\042\051\044" +
-    "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
-    "\054\025\001\002\000\004\002\uffff\001\002\000\004\002" +
-    "\ufff5\001\002\000\004\002\ufff4\001\002\000\004\054\025" +
-    "\001\002\000\004\012\211\001\002\000\030\012\042\013" +
-    "\212\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\004\002\uffed\001" +
-    "\002\000\004\013\214\001\002\000\004\002\uffec\001\002" +
-    "\000\046\002\uffee\022\113\024\077\025\073\026\074\027" +
-    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
-    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\032\010\203\011\207\012\042\042\051\044\036" +
-    "\045\041\047\035\050\057\051\053\052\037\053\044\054" +
-    "\025\001\002\000\032\010\203\011\207\012\042\042\051" +
+    "\053\044\054\025\001\002\000\004\002\uffff\001\002\000" +
+    "\004\002\ufff5\001\002\000\004\002\ufff4\001\002\000\004" +
+    "\054\025\001\002\000\004\012\211\001\002\000\030\012" +
+    "\042\013\212\042\051\044\036\045\041\047\035\050\057" +
+    "\051\053\052\037\053\044\054\025\001\002\000\004\002" +
+    "\uffed\001\002\000\004\013\214\001\002\000\004\002\uffec" +
+    "\001\002\000\046\002\uffee\022\113\024\077\025\073\026" +
+    "\074\027\101\030\110\031\075\032\106\033\100\034\105" +
+    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
+    "\072\001\002\000\032\010\203\011\207\012\042\042\051" +
     "\044\036\045\041\047\035\050\057\051\053\052\037\053" +
-    "\044\054\025\001\002\000\004\002\ufff2\001\002\000\004" +
-    "\002\ufff3\001\002" });
+    "\044\054\025\001\002\000\032\010\203\011\207\012\042" +
+    "\042\051\044\036\045\041\047\035\050\057\051\053\052" +
+    "\037\053\044\054\025\001\002\000\004\002\ufff2\001\002" +
+    "\000\004\002\ufff3\001\002" });
 
   /** Access to parse-action table. */
   public short[][] action_table() {return _action_table;}
@@ -419,7 +423,7 @@
   protected static final short[][] _reduce_table = 
     unpackFromStrings(new String[] {
     "\000\217\000\006\003\005\004\003\001\001\000\002\001" +
-    "\001\000\014\005\011\006\015\007\014\010\012\033\013" +
+    "\001\000\014\005\010\006\015\007\014\010\012\033\013" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
@@ -678,7 +682,7 @@
       switch (CUP$ECAGrammarParser$act_num)
         {
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 81: // path ::= path DOT IDENTIFIER 
+          case 82: // path ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -693,7 +697,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 80: // path ::= IDENTIFIER 
+          case 81: // path ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -705,7 +709,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 79: // simple_name ::= IDENTIFIER 
+          case 80: // simple_name ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -717,7 +721,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 78: // name ::= path DOT IDENTIFIER 
+          case 79: // name ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -732,7 +736,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 77: // name ::= simple_name 
+          case 78: // name ::= simple_name 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -744,7 +748,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 76: // simple_expr ::= LPAREN expr RPAREN 
+          case 77: // simple_expr ::= LPAREN expr RPAREN 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -756,7 +760,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 75: // simple_expr ::= DOLLAR 
+          case 76: // simple_expr ::= DOLLAR 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -768,7 +772,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 74: // simple_expr ::= STRING_LITERAL 
+          case 75: // simple_expr ::= STRING_LITERAL 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -780,7 +784,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 73: // simple_expr ::= BOOLEAN_LITERAL 
+          case 74: // simple_expr ::= BOOLEAN_LITERAL 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -792,7 +796,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 72: // simple_expr ::= FLOAT_LITERAL 
+          case 73: // simple_expr ::= FLOAT_LITERAL 
             {
               ParseNode RESULT = null;
 		int fleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -804,7 +808,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 71: // simple_expr ::= INTEGER_LITERAL 
+          case 72: // simple_expr ::= INTEGER_LITERAL 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -816,7 +820,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 70: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 71: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -834,7 +838,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 69: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
+          case 70: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -849,7 +853,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 68: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 69: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -867,7 +871,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 67: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
+          case 68: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -882,7 +886,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 66: // meth_expr ::= expr_meth_expr 
+          case 67: // meth_expr ::= expr_meth_expr 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -894,7 +898,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 65: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
+          case 66: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -912,7 +916,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 64: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
+          case 65: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -927,7 +931,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 63: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
+          case 64: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left;
@@ -942,7 +946,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 62: // meth_expr ::= simple_name LPAREN RPAREN 
+          case 63: // meth_expr ::= simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -954,7 +958,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 61: // expr_field_expr ::= expr_field_expr DOT simple_name 
+          case 62: // expr_field_expr ::= expr_field_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -969,6 +973,21 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
+          case 61: // expr_field_expr ::= meth_expr DOT simple_name 
+            {
+              ParseNode RESULT = null;
+		int meleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
+		int meright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
+		ParseNode me = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
+		int fleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode f = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = node(ParseNode.FIELD, fleft, fright, f, me); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
           case 60: // expr_field_expr ::= simple_expr DOT simple_name 
             {
               ParseNode RESULT = null;

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.2 on 09/04/09 12:10 */
+/* The following code was generated by JFlex 1.4.2 on 15/04/09 17:33 */
 
 /*
 * JBoss, Home of Professional Open Source
@@ -33,7 +33,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.2
- * on 09/04/09 12:10 from the specification file
+ * on 15/04/09 17:33 from the specification file
  * <tt>dd/grammar/flex/ECAToken.flex</tt>
  */
 public class ECATokenLexer implements java_cup.runtime.Scanner {

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/sym.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/sym.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/sym.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Thu Apr 09 12:10:33 BST 2009
+// Wed Apr 15 17:33:38 BST 2009
 //----------------------------------------------------
 
 package org.jboss.jbossts.orchestration.rule.grammar;

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/Type.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/Type.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/Type.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -24,6 +24,7 @@
 package org.jboss.jbossts.orchestration.rule.type;
 
 import org.jboss.jbossts.orchestration.rule.helper.HelperAdapter;
+import org.jboss.jbossts.orchestration.rule.exception.TypeException;
 
 import java.util.HashMap;
 import java.util.List;
@@ -527,14 +528,13 @@
      * @param type2 the type of the right operand which must be numeric but may be undefined
      * @return the corresponding promotion/result type which may be undefined numeric
      */
-    public static Type promote(Type type1, Type type2) {
-        if (!type1.isNumeric() || !type2.isNumeric()) {
-            // should not happen!
-            System.err.println("Type.promote : unexpected non-numeric type argument");
-            return N;
-        } else if (type1.isUndefined() || type2.isUndefined()) {
+    public static Type promote(Type type1, Type type2) throws TypeException {
+        if (type1.isUndefined() || type2.isUndefined()) {
                 // don't know for sure which is which so return undefined numeric
                 return N;
+        } else if (!type1.isNumeric() || !type2.isNumeric()) {
+                // should not happen!
+            throw new TypeException("Type.promote : unexpected non-numeric type argument");
         } else if (type1.isFloating() || type2.isFloating()) {
             if (type1 == DOUBLE || type2 == DOUBLE || type1 == D || type2 == D) {
                 return D;
@@ -891,9 +891,27 @@
 
     public static String internalName(Class<?> clazz)
     {
-        return clazz.getName().replaceAll("\\.", "/");
+        return internalName(clazz, false);
     }
 
+    public static String internalName(Class<?> clazz, boolean forField)
+    {
+        if (clazz.isPrimitive()) {
+            if (forField) {
+                return internalNames.get(clazz.getName());
+            } else {
+                return clazz.getName();
+            }
+        } else if (clazz.isArray()) {
+            Class base = clazz.getComponentType();
+            return "[" + internalName(base, true);
+        } else if (forField) {
+            return "L" + clazz.getName().replaceAll("\\.", "/") + ";";
+        } else {
+            return clazz.getName().replaceAll("\\.", "/");
+        }
+    }
+
     // private class used to type unknown types
     private static class Undefined {
     }

Modified: labs/jbosstm/workspace/adinn/orchestration/tests/build.xml
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/build.xml	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/build.xml	2009-04-16 16:40:07 UTC (rev 26072)
@@ -72,7 +72,7 @@
     </target>
 
     <!--
-    <target name="tests" depends="jar, tests.location, tests.location.compiled"/>
+    <target name="tests" depends="jar, tests.location, tests.location.compiled, tests.javaops, tests.javaops.compiled"/>
     -->
     <target name="tests" depends="jar, tests.location, tests.location.compiled, tests.javaops, tests.javaops.compiled"/>
 
@@ -221,6 +221,12 @@
                 <pathelement location="${junit.home}/${junit.jar}"/>
             </classpath>
             <jvmarg value="-javaagent:${toast.home}/${toast.jar}=script:${scripts.dir}/javaops/TestArithmetic.txt"/>
+            <!--
+            <jvmarg value="-Xdebug"/>
+            <jvmarg  value="-Xnoagent"/>
+            <jvmarg  value="-Djava.compiler=NONE"/>
+            <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+            -->
             <test name="org.jboss.jbossts.orchestration.tests.javaops.TestArithmetic"/>
         </junit>
         <junit fork="true" showoutput="true">
@@ -229,6 +235,14 @@
                 <pathelement location="${junit.home}/${junit.jar}"/>
             </classpath>
             <jvmarg value="-javaagent:${toast.home}/${toast.jar}=script:${scripts.dir}/javaops/TestLogical.txt"/>
+            <test name="org.jboss.jbossts.orchestration.tests.javaops.TestLogical"/>
+        </junit>
+        <junit fork="true" showoutput="true">
+            <classpath>
+                <pathelement location="${build.lib.dir}/orchestration-tests.jar"/>
+                <pathelement location="${junit.home}/${junit.jar}"/>
+            </classpath>
+            <jvmarg value="-javaagent:${toast.home}/${toast.jar}=script:${scripts.dir}/javaops/TestField.txt"/>
             <!-- uncomment for verbose toast output
             <jvmarg value="-Dorg.jboss.jbossts.orchestration.verbose"/>
             -->
@@ -241,8 +255,11 @@
             <jvmarg  value="-Xnoagent"/>
             <jvmarg  value="-Djava.compiler=NONE"/>
             <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
-            <test name="org.jboss.jbossts.orchestration.tests.javaops.TestLogical"/>
             -->
+            <!--  set this to debug the rule parser
+            <jvmarg value="-Dorg.jboss.jbossts.orchestration.rule.debug"/>
+            -->
+            <test name="org.jboss.jbossts.orchestration.tests.javaops.TestField"/>
         </junit>
     </target>
 
@@ -273,10 +290,32 @@
             <jvmarg  value="-Xnoagent"/>
             <jvmarg  value="-Djava.compiler=NONE"/>
             <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+            -->
+            <!--  set this to debug the rule parser
+            <jvmarg value="-Dorg.jboss.jbossts.orchestration.rule.debug"/>
+            -->
             <jvmarg value="-Dorg.jboss.jbossts.orchestration.compileToBytecode"/>
-            -->
             <test name="org.jboss.jbossts.orchestration.tests.javaops.TestLogical"/>
         </junit>
+        <junit fork="true" showoutput="true">
+            <classpath>
+                <pathelement location="${build.lib.dir}/orchestration-tests.jar"/>
+                <pathelement location="${junit.home}/${junit.jar}"/>
+            </classpath>
+            <jvmarg value="-javaagent:${toast.home}/${toast.jar}=script:${scripts.dir}/javaops/TestField.txt"/>
+            <jvmarg value="-Dorg.jboss.jbossts.orchestration.compileToBytecode"/>
+            <!-- uncomment to dump generated code
+            <jvmarg value="-Dorg.jboss.jbossts.orchestration.dump.generated.classes"/>
+            <jvmarg value="-Dorg.jboss.jbossts.orchestration.dump.generated.classes.directory=dump"/>
+            -->
+            <!-- uncomment to enable debug
+            <jvmarg value="-Xdebug"/>
+            <jvmarg  value="-Xnoagent"/>
+            <jvmarg  value="-Djava.compiler=NONE"/>
+            <jvmarg  value="-Xrunjdwp:transport=dt_socket,server=n,suspend=y,address=5005"/>
+            -->
+            <test name="org.jboss.jbossts.orchestration.tests.javaops.TestField"/>
+        </junit>
     </target>
 
 </project>

Copied: labs/jbosstm/workspace/adinn/orchestration/tests/dd/scripts/javaops/TestField.txt (from rev 25991, labs/jbosstm/workspace/adinn/orchestration/tests/dd/scripts/javaops/TestLogical.txt)
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/dd/scripts/javaops/TestField.txt	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/dd/scripts/javaops/TestField.txt	2009-04-16 16:40:07 UTC (rev 26072)
@@ -0,0 +1,56 @@
+RULE test field 1
+CLASS TestField
+METHOD triggerMethod1(TestFieldAuxiliary)
+HELPER org.jboss.jbossts.orchestration.tests.helpers.Default
+AFTER CALL log
+BIND test : Test = $0,
+     arg : TestFieldAuxiliary = $1
+IF arg.left.value <= 1
+DO test.log("triggerMethod1 : arg == " + $1),
+   test.log("triggerMethod1 : arg.left == " + arg.left),
+   test.log("triggerMethod1 : arg.right == " + arg.right),
+   return arg.left.left
+ENDRULE
+
+RULE test field 2
+CLASS TestField
+METHOD triggerMethod1(TestFieldAuxiliary)
+HELPER org.jboss.jbossts.orchestration.tests.helpers.Default
+AFTER CALL log
+BIND test : Test = $0,
+     arg : TestFieldAuxiliary = $1
+IF arg.left.value > 1
+DO test.log("triggerMethod1 : arg == " + $1),
+   test.log("triggerMethod1 : arg.left.right == " + arg.left.right),
+   test.log("triggerMethod1 : arg.right.right.right == " + arg.right.right.right),
+   return arg.right.getRight()
+ENDRULE
+
+RULE test field 3
+CLASS TestField
+METHOD triggerMethod2(TestFieldAuxiliary)
+HELPER org.jboss.jbossts.orchestration.tests.helpers.Default
+AFTER CALL log
+BIND test : Test = $0,
+     arg : TestFieldAuxiliary = $1
+IF arg.value == 4
+DO test.log("triggerMethod2 : arg == " + $1),
+   test.log("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.left.value == " + TestFieldAuxiliary.theAuxiliary.left.value),
+   test.log("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.left.getRight().right == " + (TestFieldAuxiliary.theAuxiliary.left.getRight()).right),
+   return TestFieldAuxiliary.theAuxiliary.getLeft().right
+ENDRULE
+
+RULE test field 4
+CLASS TestField
+METHOD triggerMethod2(TestFieldAuxiliary)
+HELPER org.jboss.jbossts.orchestration.tests.helpers.Default
+AFTER CALL log
+BIND test : Test = $0,
+     arg : TestFieldAuxiliary = $1
+IF arg.value != 4
+DO test.log("triggerMethod2 : arg == " + $1),
+   test.log("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.value == " + TestFieldAuxiliary.theAuxiliary.value),
+   test.log("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.right.right.right.right.value == " + TestFieldAuxiliary.theAuxiliary.right.right.right.right.value),
+   return arg.getLeft()
+ENDRULE
+

Added: labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/auxiliary/TestFieldAuxiliary.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/auxiliary/TestFieldAuxiliary.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/auxiliary/TestFieldAuxiliary.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -0,0 +1,63 @@
+package org.jboss.jbossts.orchestration.tests.auxiliary;
+
+/**
+ * Auxiliary class used to implement TestField test class
+ */
+public class TestFieldAuxiliary
+{
+    public static TestFieldAuxiliary theAuxiliary;
+    
+    public int value;
+    public TestFieldAuxiliary left;
+    public TestFieldAuxiliary right;
+
+    public TestFieldAuxiliary(int value)
+    {
+        this(null, value, null);
+    }
+
+    public TestFieldAuxiliary(TestFieldAuxiliary left, int value)
+    {
+        this(left, value, null);
+    }
+
+    public TestFieldAuxiliary(int value, TestFieldAuxiliary right)
+    {
+        this(null, value, right);
+    }
+
+    public TestFieldAuxiliary(TestFieldAuxiliary left, int value, TestFieldAuxiliary right)
+    {
+        this.left = left;
+        this.value = value;
+        this.right = right;
+    }
+
+    public TestFieldAuxiliary getLeft()
+    {
+        return left;
+    }
+
+    public int getValue()
+    {
+        return value;
+    }
+    
+    public TestFieldAuxiliary getRight()
+    {
+        return right;
+    }
+
+    public String toString()
+    {
+        StringBuffer buf = new StringBuffer();
+        buf.append("aux[");
+        buf.append(left == null ? "null" : left.value);
+        buf.append("<--");
+        buf.append(value);
+        buf.append("-->");
+        buf.append(right == null ? "null" : right.value);
+        buf.append("]");
+        return buf.toString();
+    }
+}

Modified: labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestArithmetic.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestArithmetic.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestArithmetic.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -3,7 +3,7 @@
 import org.jboss.jbossts.orchestration.tests.Test;
 
 /**
- * Test to ensure at entry trigger points are correctly identified
+ * Test to ensure arithmetic operations compute as expected
  */
 public class TestArithmetic extends Test
 {

Copied: labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestField.java (from rev 25991, labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestLogical.java)
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestField.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestField.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -0,0 +1,169 @@
+package org.jboss.jbossts.orchestration.tests.javaops;
+
+import org.jboss.jbossts.orchestration.tests.Test;
+import org.jboss.jbossts.orchestration.tests.auxiliary.TestFieldAuxiliary;
+
+/**
+ * Test to ensure static and instance field accesses work as expected
+ */
+public class TestField extends Test
+{
+    public int value = 0;
+
+    public TestField() {
+        super(TestField.class.getCanonicalName());
+    }
+
+    static int runNumber = 0;
+
+    private TestFieldAuxiliary[] aux;
+    public void test()
+    {
+        // create a network of linked objects
+
+        aux = new TestFieldAuxiliary[15];
+
+        for (int i = 0; i < 15; i++) {
+            aux[i] = new TestFieldAuxiliary(i);
+        }
+
+        aux[0].left = aux[1];
+        aux[0].right = aux[2];
+        aux[1].left = aux[3];
+        aux[1].right = aux[4];
+        aux[2].left = aux[5];
+        aux[2].right = aux[6];
+        aux[3].left = aux[7];
+        aux[3].right = aux[8];
+        aux[4].left = aux[9];
+        aux[4].right = aux[10];
+        aux[5].left = aux[11];
+        aux[5].right = aux[12];
+        aux[6].left = aux[13];
+        aux[6].right = aux[14];
+        aux[7].left = aux[0];
+        aux[7].right = aux[0];
+        aux[8].left = aux[0];
+        aux[8].right = aux[0];
+        aux[9].left = aux[0];
+        aux[9].right = aux[0];
+        aux[10].left = aux[0];
+        aux[10].right = aux[0];
+        aux[11].left = aux[0];
+        aux[11].right = aux[0];
+        aux[12].left = aux[0];
+        aux[12].right = aux[0];
+        aux[13].left = aux[0];
+        aux[13].right = aux[0];
+        aux[14].left = aux[0];
+        aux[14].right = aux[0];
+
+        TestFieldAuxiliary.theAuxiliary = aux[0];
+
+        TestFieldAuxiliary res;
+
+        runNumber = 1;
+        try {
+            log("calling TestField.triggerMethod1");
+            res = triggerMethod1(aux[0]);
+            log("called TestField.triggerMethod1 : result == " + res);
+        } catch (Exception e) {
+            log(e);
+        }
+
+        checkOutput(true);
+
+        runNumber = 2;
+        try {
+            log("calling TestField.triggerMethod1");
+            res = triggerMethod1(aux[2]);
+            log("called TestField.triggerMethod1 : result == " + res);
+        } catch (Exception e) {
+            log(e);
+        }
+
+        checkOutput(true);
+
+        runNumber = 3;
+        try {
+            log("calling TestField.triggerMethod2");
+            res = triggerMethod2(aux[4]);
+            log("called TestField.triggerMethod2 : result == " + res);
+        } catch (Exception e) {
+            log(e);
+        }
+
+        checkOutput(true);
+
+        runNumber = 4;
+        try {
+            log("calling TestField.triggerMethod2");
+            res = triggerMethod2(aux[7]);
+            log("called TestField.triggerMethod2 : result == " + res);
+        } catch (Exception e) {
+            log(e);
+        }
+
+        checkOutput(true);
+    }
+
+    public TestFieldAuxiliary triggerMethod1(TestFieldAuxiliary arg)
+    {
+        log("inside TestField.triggerMethod1");
+        return arg;
+    }
+
+    public TestFieldAuxiliary triggerMethod2(TestFieldAuxiliary arg)
+    {
+        log("inside TestField.triggerMethod2");
+        return arg;
+    }
+
+    @Override
+    public String getExpected() {
+        switch (runNumber) {
+            case 1:
+            {
+                logExpected("calling TestField.triggerMethod1");
+                logExpected("inside TestField.triggerMethod1");
+                logExpected("triggerMethod1 : arg == " + aux[0]);
+                logExpected("triggerMethod1 : arg.left == " + aux[0].left);
+                logExpected("triggerMethod1 : arg.right == " + aux[0].right);
+                logExpected("called TestField.triggerMethod1 : result == " + aux[0].left.left);
+            }
+            break;
+            case 2:
+            {
+                logExpected("calling TestField.triggerMethod1");
+                logExpected("inside TestField.triggerMethod1");
+                logExpected("triggerMethod1 : arg == " + aux[2]);
+                logExpected("triggerMethod1 : arg.left.right == " + aux[2].left.right);
+                logExpected("triggerMethod1 : arg.right.right.right == " + aux[2].right.right.right);
+                logExpected("called TestField.triggerMethod1 : result == " + aux[2].right.getRight());
+            }
+            break;
+            case 3:
+            {
+                logExpected("calling TestField.triggerMethod2");
+                logExpected("inside TestField.triggerMethod2");
+                logExpected("triggerMethod2 : arg == " + aux[4]);
+                logExpected("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.left.value == " + aux[0].left.value);
+                logExpected("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.left.getRight().right == " + aux[0].left.getRight().right);
+                logExpected("called TestField.triggerMethod2 : result == " + aux[0].getLeft().right);
+            }
+            break;
+            case 4:
+            {
+                logExpected("calling TestField.triggerMethod2");
+                logExpected("inside TestField.triggerMethod2");
+                logExpected("triggerMethod2 : arg == " + aux[7]);
+                logExpected("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.value == " + aux[0].value);
+                logExpected("triggerMethod2 : TestFieldAuxiliary.theAuxiliary.right.right.right.right.value == " + aux[0].right.right.right.right.value);
+                logExpected("called TestField.triggerMethod2 : result == " + aux[7].getLeft());
+            }
+            break;
+        }
+
+        return super.getExpected();
+    }
+}
\ No newline at end of file

Modified: labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestLogical.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestLogical.java	2009-04-16 16:36:29 UTC (rev 26071)
+++ labs/jbosstm/workspace/adinn/orchestration/tests/src/org/jboss/jbossts/orchestration/tests/javaops/TestLogical.java	2009-04-16 16:40:07 UTC (rev 26072)
@@ -3,11 +3,7 @@
 import org.jboss.jbossts.orchestration.tests.Test;
 
 /**
- * Created by IntelliJ IDEA.
- * User: adinn
- * Date: 08-Apr-2009
- * Time: 16:04:11
- * To change this template use File | Settings | File Templates.
+ * Test to ensure logical operations compute as expected
  */
 public class TestLogical extends Test
 {




More information about the jboss-svn-commits mailing list