/* Generated By:JavaCC: Do not edit this line. FilterParserTokenManager.java */
package org.apache.sling.resource.filter.impl.script;
import java.util.ArrayList;
import java.util.List;
import org.apache.sling.resource.filter.impl.node.*;

/** Token Manager. */
public class FilterParserTokenManager implements FilterParserConstants
{

  /** Debug output. */
  public  java.io.PrintStream debugStream = System.out;
  /** Set debug output. */
  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
private final int jjStopStringLiteralDfa_0(int pos, long active0)
{
   switch (pos)
   {
      case 0:
         if ((active0 & 0x200000000L) != 0L)
         {
            jjmatchedKind = 32;
            return -1;
         }
         if ((active0 & 0x80000000L) != 0L)
         {
            jjmatchedKind = 30;
            return -1;
         }
         if ((active0 & 0x2f800800000L) != 0L)
         {
            jjmatchedKind = 43;
            return 52;
         }
         if ((active0 & 0x4L) != 0L)
            return 52;
         return -1;
      case 1:
         if ((active0 & 0x2f800800000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 1;
            return 52;
         }
         if ((active0 & 0x200000000L) != 0L)
         {
            if (jjmatchedPos == 0)
            {
               jjmatchedKind = 32;
               jjmatchedPos = 0;
            }
            return -1;
         }
         if ((active0 & 0x80000000L) != 0L)
         {
            if (jjmatchedPos == 0)
            {
               jjmatchedKind = 30;
               jjmatchedPos = 0;
            }
            return -1;
         }
         return -1;
      case 2:
         if ((active0 & 0x2f800800000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 2;
            return 52;
         }
         return -1;
      case 3:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 3;
            return 52;
         }
         if ((active0 & 0x800000L) != 0L)
            return 52;
         if ((active0 & 0x20800000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      case 4:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 4;
            return 52;
         }
         if ((active0 & 0x20800000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      case 5:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 5;
            return 52;
         }
         if ((active0 & 0x20800000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      case 6:
         if ((active0 & 0xf000000000L) != 0L)
         {
            jjmatchedKind = 43;
            jjmatchedPos = 6;
            return 52;
         }
         if ((active0 & 0x800000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      case 7:
         if ((active0 & 0xf000000000L) != 0L)
            return 52;
         if ((active0 & 0x800000000L) != 0L)
         {
            if (jjmatchedPos < 2)
            {
               jjmatchedKind = 43;
               jjmatchedPos = 2;
            }
            return -1;
         }
         return -1;
      default :
         return -1;
   }
}
private final int jjStartNfa_0(int pos, long active0)
{
   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
}
private int jjStopAtPos(int pos, int kind)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   return pos + 1;
}
private int jjMoveStringLiteralDfa0_0()
{
   switch(curChar)
   {
      case 9:
         return jjStartNfaWithStates_0(0, 2, 52);
      case 36:
         return jjStopAtPos(0, 42);
      case 40:
         return jjStopAtPos(0, 24);
      case 41:
         return jjStopAtPos(0, 25);
      case 44:
         return jjStopAtPos(0, 26);
      case 60:
         return jjMoveStringLiteralDfa1_0(0x200000000L);
      case 62:
         return jjMoveStringLiteralDfa1_0(0x80000000L);
      case 99:
         return jjMoveStringLiteralDfa1_0(0xf000000000L);
      case 110:
         return jjMoveStringLiteralDfa1_0(0x20800800000L);
      default :
         return jjMoveNfa_0(0, 0);
   }
}
private int jjMoveStringLiteralDfa1_0(long active0)
{
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(0, active0);
      return 1;
   }
   switch(curChar)
   {
      case 61:
         if ((active0 & 0x80000000L) != 0L)
            return jjStopAtPos(1, 31);
         else if ((active0 & 0x200000000L) != 0L)
            return jjStopAtPos(1, 33);
         break;
      case 111:
         return jjMoveStringLiteralDfa2_0(active0, 0x2f800000000L);
      case 117:
         return jjMoveStringLiteralDfa2_0(active0, 0x800000L);
      default :
         break;
   }
   return jjStartNfa_0(0, active0);
}
private int jjMoveStringLiteralDfa2_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(0, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(1, active0);
      return 2;
   }
   switch(curChar)
   {
      case 108:
         return jjMoveStringLiteralDfa3_0(active0, 0x800000L);
      case 110:
         return jjMoveStringLiteralDfa3_0(active0, 0xf000000000L);
      case 116:
         return jjMoveStringLiteralDfa3_0(active0, 0x20800000000L);
      default :
         break;
   }
   return jjStartNfa_0(1, active0);
}
private int jjMoveStringLiteralDfa3_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(1, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(2, active0);
      return 3;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa4_0(active0, 0x20800000000L);
      case 108:
         if ((active0 & 0x800000L) != 0L)
            return jjStartNfaWithStates_0(3, 23, 52);
         break;
      case 116:
         return jjMoveStringLiteralDfa4_0(active0, 0xf000000000L);
      default :
         break;
   }
   return jjStartNfa_0(2, active0);
}
private int jjMoveStringLiteralDfa4_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(2, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(3, active0);
      return 4;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa5_0(active0, 0xf000000000L);
      case 105:
         return jjMoveStringLiteralDfa5_0(active0, 0x20000000000L);
      case 108:
         return jjMoveStringLiteralDfa5_0(active0, 0x800000000L);
      default :
         break;
   }
   return jjStartNfa_0(3, active0);
}
private int jjMoveStringLiteralDfa5_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(3, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(4, active0);
      return 5;
   }
   switch(curChar)
   {
      case 105:
         return jjMoveStringLiteralDfa6_0(active0, 0xf800000000L);
      case 110:
         if ((active0 & 0x20000000000L) != 0L)
            return jjStopAtPos(5, 41);
         break;
      default :
         break;
   }
   return jjStartNfa_0(4, active0);
}
private int jjMoveStringLiteralDfa6_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(4, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(5, active0);
      return 6;
   }
   switch(curChar)
   {
      case 107:
         return jjMoveStringLiteralDfa7_0(active0, 0x800000000L);
      case 110:
         return jjMoveStringLiteralDfa7_0(active0, 0xf000000000L);
      default :
         break;
   }
   return jjStartNfa_0(5, active0);
}
private int jjMoveStringLiteralDfa7_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(5, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(6, active0);
      return 7;
   }
   switch(curChar)
   {
      case 101:
         if ((active0 & 0x800000000L) != 0L)
            return jjStopAtPos(7, 35);
         break;
      case 115:
         if ((active0 & 0x1000000000L) != 0L)
         {
            jjmatchedKind = 36;
            jjmatchedPos = 7;
         }
         return jjMoveStringLiteralDfa8_0(active0, 0xe000000000L);
      default :
         break;
   }
   return jjStartNfa_0(6, active0);
}
private int jjMoveStringLiteralDfa8_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(6, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(7, active0);
      return 8;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa9_0(active0, 0xe000000000L);
      default :
         break;
   }
   return jjStartNfa_0(7, active0);
}
private int jjMoveStringLiteralDfa9_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(7, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(8, active0);
      return 9;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa10_0(active0, 0x4000000000L);
      case 110:
         return jjMoveStringLiteralDfa10_0(active0, 0xa000000000L);
      default :
         break;
   }
   return jjStartNfa_0(8, active0);
}
private int jjMoveStringLiteralDfa10_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(8, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(9, active0);
      return 10;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa11_0(active0, 0x4000000000L);
      case 111:
         return jjMoveStringLiteralDfa11_0(active0, 0xa000000000L);
      default :
         break;
   }
   return jjStartNfa_0(9, active0);
}
private int jjMoveStringLiteralDfa11_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(9, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(10, active0);
      return 11;
   }
   switch(curChar)
   {
      case 116:
         if ((active0 & 0x2000000000L) != 0L)
         {
            jjmatchedKind = 37;
            jjmatchedPos = 11;
         }
         return jjMoveStringLiteralDfa12_0(active0, 0x8000000000L);
      case 121:
         if ((active0 & 0x4000000000L) != 0L)
            return jjStopAtPos(11, 38);
         break;
      default :
         break;
   }
   return jjStartNfa_0(10, active0);
}
private int jjMoveStringLiteralDfa12_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(10, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(11, active0);
      return 12;
   }
   switch(curChar)
   {
      case 32:
         return jjMoveStringLiteralDfa13_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(11, active0);
}
private int jjMoveStringLiteralDfa13_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(11, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(12, active0);
      return 13;
   }
   switch(curChar)
   {
      case 97:
         return jjMoveStringLiteralDfa14_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(12, active0);
}
private int jjMoveStringLiteralDfa14_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(12, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(13, active0);
      return 14;
   }
   switch(curChar)
   {
      case 110:
         return jjMoveStringLiteralDfa15_0(active0, 0x8000000000L);
      default :
         break;
   }
   return jjStartNfa_0(13, active0);
}
private int jjMoveStringLiteralDfa15_0(long old0, long active0)
{
   if (((active0 &= old0)) == 0L)
      return jjStartNfa_0(13, old0);
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) {
      jjStopStringLiteralDfa_0(14, active0);
      return 15;
   }
   switch(curChar)
   {
      case 121:
         if ((active0 & 0x8000000000L) != 0L)
            return jjStopAtPos(15, 39);
         break;
      default :
         break;
   }
   return jjStartNfa_0(14, active0);
}
private int jjStartNfaWithStates_0(int pos, int kind, int state)
{
   jjmatchedKind = kind;
   jjmatchedPos = pos;
   try { curChar = input_stream.readChar(); }
   catch(java.io.IOException e) { return pos + 1; }
   return jjMoveNfa_0(state, pos + 1);
}
static final long[] jjbitVec0 = {
   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
};
static final long[] jjbitVec2 = {
   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
};
private int jjMoveNfa_0(int startState, int curPos)
{
   int startsAt = 0;
   jjnewStateCnt = 187;
   int i = 1;
   jjstateSet[0] = startState;
   int kind = 0x7fffffff;
   for (;;)
   {
      if (++jjround == 0x7fffffff)
         ReInitRounds();
      if (curChar < 64)
      {
         long l = 1L << curChar;
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0x8c00846affffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(52);
                  }
                  else if ((0x3ff000000000000L & l) != 0L)
                  {
                     if (kind > 13)
                        kind = 13;
                     jjCheckNAddStates(0, 14);
                  }
                  else if (curChar == 45)
                     jjCheckNAddStates(15, 22);
                  else if (curChar == 60)
                  {
                     if (kind > 32)
                        kind = 32;
                  }
                  else if (curChar == 62)
                  {
                     if (kind > 30)
                        kind = 30;
                  }
                  else if (curChar == 61)
                     jjstateSet[jjnewStateCnt++] = 32;
                  else if (curChar == 34)
                     jjCheckNAddStates(23, 25);
                  else if (curChar == 39)
                     jjCheckNAddStates(26, 28);
                  else if (curChar == 46)
                     jjCheckNAdd(1);
                  if (curChar == 33)
                     jjstateSet[jjnewStateCnt++] = 34;
                  else if (curChar == 38)
                     jjstateSet[jjnewStateCnt++] = 15;
                  break;
               case 1:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 15)
                     kind = 15;
                  jjCheckNAdd(1);
                  break;
               case 3:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(4);
                  break;
               case 4:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 16)
                     kind = 16;
                  jjCheckNAdd(4);
                  break;
               case 5:
                  if (curChar == 39)
                     jjCheckNAddStates(26, 28);
                  break;
               case 7:
                  jjCheckNAddStates(26, 28);
                  break;
               case 8:
                  if ((0xffffff7fffffffffL & l) != 0L)
                     jjCheckNAddStates(26, 28);
                  break;
               case 9:
                  if (curChar == 39 && kind > 18)
                     kind = 18;
                  break;
               case 10:
                  if (curChar == 34)
                     jjCheckNAddStates(23, 25);
                  break;
               case 12:
                  jjCheckNAddStates(23, 25);
                  break;
               case 13:
                  if ((0xfffffffbffffffffL & l) != 0L)
                     jjCheckNAddStates(23, 25);
                  break;
               case 14:
                  if (curChar == 34 && kind > 18)
                     kind = 18;
                  break;
               case 15:
                  if (curChar == 38 && kind > 21)
                     kind = 21;
                  break;
               case 16:
                  if (curChar == 38)
                     jjstateSet[jjnewStateCnt++] = 15;
                  break;
               case 32:
                  if (curChar == 61 && kind > 28)
                     kind = 28;
                  break;
               case 33:
                  if (curChar == 61)
                     jjstateSet[jjnewStateCnt++] = 32;
                  break;
               case 34:
                  if (curChar == 61 && kind > 29)
                     kind = 29;
                  break;
               case 35:
                  if (curChar == 33)
                     jjstateSet[jjnewStateCnt++] = 34;
                  break;
               case 36:
                  if (curChar == 62 && kind > 30)
                     kind = 30;
                  break;
               case 41:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 40;
                  break;
               case 49:
                  if (curChar == 60 && kind > 32)
                     kind = 32;
                  break;
               case 50:
                  if (curChar == 61 && kind > 34)
                     kind = 34;
                  break;
               case 52:
                  if ((0x8c00846affffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(52);
                  break;
               case 55:
               case 56:
                  jjCheckNAddStates(29, 31);
                  break;
               case 58:
                  if (curChar == 45)
                     jjCheckNAddStates(15, 22);
                  break;
               case 59:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(60, 94);
                  break;
               case 60:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 61;
                  break;
               case 61:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(62, 93);
                  break;
               case 62:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 63;
                  break;
               case 63:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(64, 92);
                  break;
               case 64:
                  if (curChar == 45)
                     jjCheckNAdd(65);
                  break;
               case 65:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(65, 66);
                  break;
               case 66:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 67;
                  break;
               case 67:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(68, 69);
                  break;
               case 68:
                  if (curChar == 45)
                     jjCheckNAdd(69);
                  break;
               case 69:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(69, 70);
                  break;
               case 70:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 71;
                  break;
               case 71:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 72;
                  break;
               case 72:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 73;
                  break;
               case 74:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 75;
                  break;
               case 75:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 76;
                  break;
               case 76:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 77;
                  break;
               case 77:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 78;
                  break;
               case 78:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(79, 86);
                  break;
               case 79:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 80;
                  break;
               case 80:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 81;
                  break;
               case 81:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(82, 86);
                  break;
               case 82:
                  if (curChar == 46)
                     jjstateSet[jjnewStateCnt++] = 83;
                  break;
               case 83:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 84;
                  break;
               case 84:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 85;
                  break;
               case 85:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAdd(86);
                  break;
               case 86:
                  if ((0x280000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 87;
                  break;
               case 87:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 88;
                  break;
               case 88:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 89;
                  break;
               case 89:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 90;
                  break;
               case 90:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 91;
                  break;
               case 91:
                  if ((0x3ff000000000000L & l) != 0L && kind > 10)
                     kind = 10;
                  break;
               case 92:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(32, 35);
                  break;
               case 93:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(36, 39);
                  break;
               case 94:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(40, 43);
                  break;
               case 95:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(96, 124);
                  break;
               case 96:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 97;
                  break;
               case 97:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(98, 123);
                  break;
               case 98:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 99;
                  break;
               case 99:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(100, 122);
                  break;
               case 100:
                  if (curChar == 45)
                     jjCheckNAdd(101);
                  break;
               case 101:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(101, 102);
                  break;
               case 102:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 103;
                  break;
               case 103:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(104, 105);
                  break;
               case 104:
                  if (curChar == 45)
                     jjCheckNAdd(105);
                  break;
               case 105:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(105, 106);
                  break;
               case 106:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 107;
                  break;
               case 107:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 108;
                  break;
               case 108:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 109;
                  break;
               case 110:
                  if ((0x7000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 111;
                  break;
               case 111:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 112;
                  break;
               case 112:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 113;
                  break;
               case 113:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 114;
                  break;
               case 114:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 11)
                     kind = 11;
                  jjstateSet[jjnewStateCnt++] = 115;
                  break;
               case 115:
                  if (curChar == 58)
                     jjstateSet[jjnewStateCnt++] = 116;
                  break;
               case 116:
                  if ((0x3f000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 117;
                  break;
               case 117:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 11)
                     kind = 11;
                  jjstateSet[jjnewStateCnt++] = 118;
                  break;
               case 118:
                  if (curChar == 46)
                     jjstateSet[jjnewStateCnt++] = 119;
                  break;
               case 119:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 120;
                  break;
               case 120:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 121;
                  break;
               case 121:
                  if ((0x3ff000000000000L & l) != 0L && kind > 11)
                     kind = 11;
                  break;
               case 122:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(44, 47);
                  break;
               case 123:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(48, 51);
                  break;
               case 124:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(52, 55);
                  break;
               case 125:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(126, 141);
                  break;
               case 126:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 127;
                  break;
               case 127:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(128, 140);
                  break;
               case 128:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 129;
                  break;
               case 129:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(130, 139);
                  break;
               case 130:
                  if (curChar == 45)
                     jjCheckNAdd(131);
                  break;
               case 131:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(131, 132);
                  break;
               case 132:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 133;
                  break;
               case 133:
                  if ((0x3000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(134, 135);
                  break;
               case 134:
                  if (curChar == 45)
                     jjCheckNAdd(135);
                  break;
               case 135:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(135, 136);
                  break;
               case 136:
                  if (curChar == 45)
                     jjstateSet[jjnewStateCnt++] = 137;
                  break;
               case 137:
                  if ((0xf000000000000L & l) != 0L)
                     jjstateSet[jjnewStateCnt++] = 138;
                  break;
               case 138:
                  if ((0x3ff000000000000L & l) != 0L && kind > 12)
                     kind = 12;
                  break;
               case 139:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(56, 59);
                  break;
               case 140:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(60, 63);
                  break;
               case 141:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddStates(64, 67);
                  break;
               case 142:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(142);
                  break;
               case 143:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(143, 144);
                  break;
               case 144:
                  if (curChar == 46)
                     jjCheckNAdd(145);
                  break;
               case 145:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(145);
                  break;
               case 146:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(146, 147);
                  break;
               case 148:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(149);
                  break;
               case 149:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(149);
                  break;
               case 150:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(150, 151);
                  break;
               case 151:
                  if (curChar == 46)
                     jjCheckNAdd(152);
                  break;
               case 152:
                  if ((0x3ff000000000000L & l) != 0L)
                     jjCheckNAddTwoStates(152, 153);
                  break;
               case 154:
                  if ((0x280000000000L & l) != 0L)
                     jjCheckNAdd(155);
                  break;
               case 155:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAdd(155);
                  break;
               case 156:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 14)
                     kind = 14;
                  jjCheckNAdd(156);
                  break;
               case 157:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 13)
                     kind = 13;
                  jjCheckNAddStates(0, 14);
                  break;
               case 158:
                  if ((0x3ff000000000000L & l) == 0L)
                     break;
                  if (kind > 17)
                     kind = 17;
                  jjCheckNAdd(158);
                  break;
               case 164:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 163;
                  break;
               case 170:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 169;
                  break;
               case 174:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 173;
                  break;
               case 181:
                  if (curChar == 32)
                     jjstateSet[jjnewStateCnt++] = 180;
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else if (curChar < 128)
      {
         long l = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
                  if ((0xffffffffd7ffffffL & l) != 0L)
                  {
                     if (kind > 43)
                        kind = 43;
                     jjCheckNAdd(52);
                  }
                  else if (curChar == 91)
                     jjCheckNAddStates(29, 31);
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(68, 69);
                  else if (curChar == 108)
                     jjAddStates(70, 71);
                  else if (curChar == 105)
                     jjCheckNAddStates(72, 76);
                  else if (curChar == 126)
                     jjstateSet[jjnewStateCnt++] = 50;
                  else if (curChar == 103)
                     jjstateSet[jjnewStateCnt++] = 47;
                  else if (curChar == 102)
                     jjstateSet[jjnewStateCnt++] = 30;
                  else if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 26;
                  else if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 22;
                  else if (curChar == 124)
                     jjstateSet[jjnewStateCnt++] = 20;
                  else if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 18;
                  break;
               case 2:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(68, 69);
                  break;
               case 6:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 7;
                  break;
               case 7:
                  jjCheckNAddStates(26, 28);
                  break;
               case 8:
                  if ((0xffffffffefffffffL & l) != 0L)
                     jjCheckNAddStates(26, 28);
                  break;
               case 11:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 12;
                  break;
               case 12:
                  jjCheckNAddStates(23, 25);
                  break;
               case 13:
                  if ((0xffffffffefffffffL & l) != 0L)
                     jjCheckNAddStates(23, 25);
                  break;
               case 17:
                  if (curChar == 100 && kind > 21)
                     kind = 21;
                  break;
               case 18:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 17;
                  break;
               case 19:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 18;
                  break;
               case 20:
                  if (curChar == 124 && kind > 22)
                     kind = 22;
                  break;
               case 21:
                  if (curChar == 124)
                     jjstateSet[jjnewStateCnt++] = 20;
                  break;
               case 22:
                  if (curChar == 114 && kind > 22)
                     kind = 22;
                  break;
               case 23:
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 22;
                  break;
               case 24:
                  if (curChar == 101 && kind > 27)
                     kind = 27;
                  break;
               case 25:
                  if (curChar == 117)
                     jjCheckNAdd(24);
                  break;
               case 26:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 25;
                  break;
               case 27:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 26;
                  break;
               case 28:
                  if (curChar == 115)
                     jjCheckNAdd(24);
                  break;
               case 29:
                  if (curChar == 108)
                     jjstateSet[jjnewStateCnt++] = 28;
                  break;
               case 30:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 29;
                  break;
               case 31:
                  if (curChar == 102)
                     jjstateSet[jjnewStateCnt++] = 30;
                  break;
               case 37:
                  if (curChar == 110 && kind > 30)
                     kind = 30;
                  break;
               case 38:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 37;
                  break;
               case 39:
                  if (curChar == 104)
                     jjstateSet[jjnewStateCnt++] = 38;
                  break;
               case 40:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 39;
                  break;
               case 42:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 41;
                  break;
               case 43:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 42;
                  break;
               case 44:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 43;
                  break;
               case 45:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 44;
                  break;
               case 46:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 45;
                  break;
               case 47:
                  if (curChar == 114)
                     jjstateSet[jjnewStateCnt++] = 46;
                  break;
               case 48:
                  if (curChar == 103)
                     jjstateSet[jjnewStateCnt++] = 47;
                  break;
               case 51:
                  if (curChar == 126)
                     jjstateSet[jjnewStateCnt++] = 50;
                  break;
               case 52:
                  if ((0xffffffffd7ffffffL & l) == 0L)
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(52);
                  break;
               case 53:
                  if (curChar == 91)
                     jjCheckNAddStates(29, 31);
                  break;
               case 54:
                  if (curChar == 92)
                     jjstateSet[jjnewStateCnt++] = 55;
                  break;
               case 55:
                  jjCheckNAddStates(29, 31);
                  break;
               case 56:
                  if ((0xffffffffcfffffffL & l) != 0L)
                     jjCheckNAddStates(29, 31);
                  break;
               case 57:
                  if (curChar == 93 && kind > 44)
                     kind = 44;
                  break;
               case 73:
                  if (curChar == 84)
                     jjstateSet[jjnewStateCnt++] = 74;
                  break;
               case 109:
                  if (curChar == 84)
                     jjstateSet[jjnewStateCnt++] = 110;
                  break;
               case 147:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(77, 78);
                  break;
               case 153:
                  if ((0x2000000020L & l) != 0L)
                     jjAddStates(79, 80);
                  break;
               case 159:
                  if (curChar == 105)
                     jjCheckNAddStates(72, 76);
                  break;
               case 160:
                  if (curChar == 115 && kind > 28)
                     kind = 28;
                  break;
               case 161:
                  if (curChar == 116 && kind > 29)
                     kind = 29;
                  break;
               case 162:
                  if (curChar == 111)
                     jjstateSet[jjnewStateCnt++] = 161;
                  break;
               case 163:
                  if (curChar == 110)
                     jjstateSet[jjnewStateCnt++] = 162;
                  break;
               case 165:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 164;
                  break;
               case 166:
                  if (curChar == 101 && kind > 34)
                     kind = 34;
                  break;
               case 167:
               case 185:
                  if (curChar == 107)
                     jjCheckNAdd(166);
                  break;
               case 168:
                  if (curChar == 105)
                     jjstateSet[jjnewStateCnt++] = 167;
                  break;
               case 169:
                  if (curChar == 108)
                     jjstateSet[jjnewStateCnt++] = 168;
                  break;
               case 171:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 170;
                  break;
               case 172:
                  if (curChar == 110 && kind > 40)
                     kind = 40;
                  break;
               case 173:
                  if (curChar == 105)
                     jjCheckNAdd(172);
                  break;
               case 175:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 174;
                  break;
               case 176:
                  if (curChar == 108)
                     jjAddStates(70, 71);
                  break;
               case 177:
                  if (curChar == 110 && kind > 32)
                     kind = 32;
                  break;
               case 178:
                  if (curChar == 97)
                     jjstateSet[jjnewStateCnt++] = 177;
                  break;
               case 179:
                  if (curChar == 104)
                     jjstateSet[jjnewStateCnt++] = 178;
                  break;
               case 180:
                  if (curChar == 116)
                     jjstateSet[jjnewStateCnt++] = 179;
                  break;
               case 182:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 181;
                  break;
               case 183:
                  if (curChar == 115)
                     jjstateSet[jjnewStateCnt++] = 182;
                  break;
               case 184:
                  if (curChar == 101)
                     jjstateSet[jjnewStateCnt++] = 183;
                  break;
               case 186:
                  if (curChar == 105)
                     jjstateSet[jjnewStateCnt++] = 185;
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      else
      {
         int hiByte = (int)(curChar >> 8);
         int i1 = hiByte >> 6;
         long l1 = 1L << (hiByte & 077);
         int i2 = (curChar & 0xff) >> 6;
         long l2 = 1L << (curChar & 077);
         do
         {
            switch(jjstateSet[--i])
            {
               case 0:
               case 52:
                  if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                     break;
                  if (kind > 43)
                     kind = 43;
                  jjCheckNAdd(52);
                  break;
               case 7:
               case 8:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(26, 28);
                  break;
               case 12:
               case 13:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(23, 25);
                  break;
               case 55:
               case 56:
                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                     jjCheckNAddStates(29, 31);
                  break;
               default : break;
            }
         } while(i != startsAt);
      }
      if (kind != 0x7fffffff)
      {
         jjmatchedKind = kind;
         jjmatchedPos = curPos;
         kind = 0x7fffffff;
      }
      ++curPos;
      if ((i = jjnewStateCnt) == (startsAt = 187 - (jjnewStateCnt = startsAt)))
         return curPos;
      try { curChar = input_stream.readChar(); }
      catch(java.io.IOException e) { return curPos; }
   }
}
static final int[] jjnextStates = {
   60, 96, 126, 142, 143, 144, 146, 147, 150, 151, 156, 158, 141, 124, 94, 59, 
   95, 125, 142, 143, 146, 150, 156, 11, 13, 14, 6, 8, 9, 54, 56, 57, 
   64, 65, 66, 92, 62, 64, 92, 93, 60, 62, 93, 94, 100, 101, 102, 122, 
   98, 100, 122, 123, 96, 98, 123, 124, 130, 131, 132, 139, 128, 130, 139, 140, 
   126, 128, 140, 141, 3, 4, 184, 186, 160, 165, 171, 175, 172, 148, 149, 154, 
   155, 
};
private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
{
   switch(hiByte)
   {
      case 0:
         return ((jjbitVec2[i2] & l2) != 0L);
      default :
         if ((jjbitVec0[i1] & l1) != 0L)
            return true;
         return false;
   }
}

/** Token literal values. */
public static final String[] jjstrLiteralImages = {
"", null, null, null, null, null, null, null, null, null, null, null, null, 
null, null, null, null, null, null, null, null, null, null, "\156\165\154\154", 
"\50", "\51", "\54", null, null, null, null, "\76\75", null, "\74\75", null, 
"\156\157\164\40\154\151\153\145", "\143\157\156\164\141\151\156\163", 
"\143\157\156\164\141\151\156\163\40\156\157\164", "\143\157\156\164\141\151\156\163\40\141\156\171", 
"\143\157\156\164\141\151\156\163\40\156\157\164\40\141\156\171", null, "\156\157\164\40\151\156", "\44", null, null, null, };

/** Lexer state names. */
public static final String[] lexStateNames = {
   "DEFAULT",
};
static final long[] jjtoToken = {
   0x3fffffe7fc01L, 
};
static final long[] jjtoSkip = {
   0x6L, 
};
protected SimpleCharStream input_stream;
private final int[] jjrounds = new int[187];
private final int[] jjstateSet = new int[374];
private final StringBuilder jjimage = new StringBuilder();
private StringBuilder image = jjimage;
private int jjimageLen;
private int lengthOfMatch;
protected char curChar;
/** Constructor. */
public FilterParserTokenManager(SimpleCharStream stream){
   if (SimpleCharStream.staticFlag)
      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
   input_stream = stream;
}

/** Constructor. */
public FilterParserTokenManager(SimpleCharStream stream, int lexState){
   this(stream);
   SwitchTo(lexState);
}

/** Reinitialise parser. */
public void ReInit(SimpleCharStream stream)
{
   jjmatchedPos = jjnewStateCnt = 0;
   curLexState = defaultLexState;
   input_stream = stream;
   ReInitRounds();
}
private void ReInitRounds()
{
   int i;
   jjround = 0x80000001;
   for (i = 187; i-- > 0;)
      jjrounds[i] = 0x80000000;
}

/** Reinitialise parser. */
public void ReInit(SimpleCharStream stream, int lexState)
{
   ReInit(stream);
   SwitchTo(lexState);
}

/** Switch to specified lex state. */
public void SwitchTo(int lexState)
{
   if (lexState >= 1 || lexState < 0)
      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
   else
      curLexState = lexState;
}

protected Token jjFillToken()
{
   final Token t;
   final String curTokenImage;
   final int beginLine;
   final int endLine;
   final int beginColumn;
   final int endColumn;
   String im = jjstrLiteralImages[jjmatchedKind];
   curTokenImage = (im == null) ? input_stream.GetImage() : im;
   beginLine = input_stream.getBeginLine();
   beginColumn = input_stream.getBeginColumn();
   endLine = input_stream.getEndLine();
   endColumn = input_stream.getEndColumn();
   t = Token.newToken(jjmatchedKind, curTokenImage);

   t.beginLine = beginLine;
   t.endLine = endLine;
   t.beginColumn = beginColumn;
   t.endColumn = endColumn;

   return t;
}

int curLexState = 0;
int defaultLexState = 0;
int jjnewStateCnt;
int jjround;
int jjmatchedPos;
int jjmatchedKind;

/** Get the next Token. */
public Token getNextToken() 
{
  Token matchedToken;
  int curPos = 0;

  EOFLoop :
  for (;;)
  {
   try
   {
      curChar = input_stream.BeginToken();
   }
   catch(java.io.IOException e)
   {
      jjmatchedKind = 0;
      matchedToken = jjFillToken();
      return matchedToken;
   }
   image = jjimage;
   image.setLength(0);
   jjimageLen = 0;

   try { input_stream.backup(0);
      while (curChar <= 32 && (0x100000000L & (1L << curChar)) != 0L)
         curChar = input_stream.BeginToken();
   }
   catch (java.io.IOException e1) { continue EOFLoop; }
   jjmatchedKind = 0x7fffffff;
   jjmatchedPos = 0;
   curPos = jjMoveStringLiteralDfa0_0();
   if (jjmatchedPos == 0 && jjmatchedKind > 45)
   {
      jjmatchedKind = 45;
   }
   if (jjmatchedKind != 0x7fffffff)
   {
      if (jjmatchedPos + 1 < curPos)
         input_stream.backup(curPos - jjmatchedPos - 1);
      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
      {
         matchedToken = jjFillToken();
         TokenLexicalActions(matchedToken);
         return matchedToken;
      }
      else
      {
         continue EOFLoop;
      }
   }
   int error_line = input_stream.getEndLine();
   int error_column = input_stream.getEndColumn();
   String error_after = null;
   boolean EOFSeen = false;
   try { input_stream.readChar(); input_stream.backup(1); }
   catch (java.io.IOException e1) {
      EOFSeen = true;
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
      if (curChar == '\n' || curChar == '\r') {
         error_line++;
         error_column = 0;
      }
      else
         error_column++;
   }
   if (!EOFSeen) {
      input_stream.backup(1);
      error_after = curPos <= 1 ? "" : input_stream.GetImage();
   }
   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
  }
}

void TokenLexicalActions(Token matchedToken)
{
   switch(jjmatchedKind)
   {
      case 18 :
        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
                                       matchedToken.image = image.substring(1, lengthOfMatch - 1);
         break;
      case 44 :
        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
                                                        matchedToken.image = image.substring(1, lengthOfMatch - 1);
         break;
      default :
         break;
   }
}
private void jjCheckNAdd(int state)
{
   if (jjrounds[state] != jjround)
   {
      jjstateSet[jjnewStateCnt++] = state;
      jjrounds[state] = jjround;
   }
}
private void jjAddStates(int start, int end)
{
   do {
      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
   } while (start++ != end);
}
private void jjCheckNAddTwoStates(int state1, int state2)
{
   jjCheckNAdd(state1);
   jjCheckNAdd(state2);
}

private void jjCheckNAddStates(int start, int end)
{
   do {
      jjCheckNAdd(jjnextStates[start]);
   } while (start++ != end);
}

}
