/* The following code was generated by JFlex 1.2.2 on 5/6/09 2:12 PM */

/*******************************************************************************
 * Copyright (c) 2004, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.xml.core.internal.parser;

import java.io.CharArrayReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker;
import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTokenizer;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.util.Debug;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.Logger;
import org.eclipse.wst.xml.core.internal.parser.regions.XMLParserRegionFactory;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;


/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 5/6/09 2:12 PM from the specification file
 * <tt>file:/E:/wtp-3.0/workspace/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/XMLTokenizer.jflex</tt>
 */
public class XMLTokenizer implements BlockTokenizer, DOMRegionContext {

  /** this character denotes the end of file */
  final public static int YYEOF = -1;

  /** lexical states */
  final public static int ST_XML_DOCTYPE_EXTERNAL_ID = 23;
  final public static int ST_XML_ELEMENT_DECLARATION_CONTENT = 27;
  final public static int ST_DHTML_ATTRIBUTE_NAME = 12;
  final public static int ST_XML_PI_TAG_CLOSE = 11;
  final public static int ST_XML_DECLARATION_CLOSE = 21;
  final public static int ST_XML_PI_ATTRIBUTE_VALUE = 10;
  final public static int ST_DHTML_EQUALS = 13;
  final public static int ST_XML_TAG_NAME = 16;
  final public static int ST_XML_ATTRIBUTE_VALUE = 19;
  final public static int ST_DHTML_ATTRIBUTE_VALUE = 14;
  final public static int ST_XML_DOCTYPE_ID_SYSTEM = 25;
  final public static int ST_XML_ATTRIBUTE_NAME = 17;
  final public static int ST_XML_ELEMENT_DECLARATION = 26;
  final public static int ST_XML_DOCTYPE_DECLARATION = 22;
  final public static int ST_XML_ATTLIST_DECLARATION = 28;
  final public static int ST_XML_COMMENT_END = 4;
  final public static int ST_CDATA_TEXT = 1;
  final public static int ST_DHTML_TAG_CLOSE = 15;
  final public static int ST_XML_COMMENT = 3;
  final public static int ST_PI_CONTENT = 7;
  final public static int ST_PI_WS = 6;
  final public static int ST_CDATA_END = 2;
  final public static int ST_XML_ATTLIST_DECLARATION_CONTENT = 29;
  final public static int ST_BLOCK_TAG_SCAN = 30;
  final public static int ST_XML_PI_EQUALS = 9;
  final public static int ST_XML_DECLARATION = 20;
  final public static int YYINITIAL = 0;
  final public static int ST_XML_DOCTYPE_ID_PUBLIC = 24;
  final public static int ST_XML_EQUALS = 18;
  final public static int ST_PI = 5;
  final public static int ST_XML_PI_ATTRIBUTE_NAME = 8;

  /** 
   * Translates characters to character classes
   */
  final private static String yycmap_packed = 
    "\11\0\1\5\1\22\2\0\1\14\22\0\1\14\1\21\1\11\1\55"+
    "\1\16\1\17\1\12\1\13\1\16\1\16\1\16\1\16\1\16\1\7"+
    "\1\6\1\3\12\15\1\10\1\61\1\1\1\45\1\2\1\4\1\16"+
    "\1\34\1\62\1\32\1\33\1\50\1\57\1\36\1\36\1\42\1\36"+
    "\1\36\1\27\1\25\1\44\1\43\1\47\1\36\1\40\1\56\1\35"+
    "\1\60\2\36\1\23\1\46\1\36\1\31\1\0\1\20\1\0\1\10"+
    "\1\0\1\52\1\62\1\63\1\53\1\37\1\57\1\36\1\66\1\42"+
    "\2\36\1\30\1\26\1\44\1\43\1\47\1\36\1\40\1\41\1\51"+
    "\1\60\1\36\1\36\1\24\1\54\1\36\1\0\1\0\72\0\1\65"+
    "\10\0\27\64\1\0\37\64\1\0\72\64\2\0\13\64\2\0\10\64"+
    "\1\0\65\64\1\0\104\64\11\0\44\64\3\0\2\64\4\0\36\64"+
    "\70\0\131\64\22\0\7\64\16\0\2\65\56\0\106\65\32\0\2\65"+
    "\44\0\1\64\1\65\3\64\1\0\1\64\1\0\24\64\1\0\54\64"+
    "\1\0\7\64\3\0\1\64\1\0\1\64\1\0\1\64\1\0\1\64"+
    "\1\0\22\64\15\0\14\64\1\0\102\64\1\0\14\64\1\0\44\64"+
    "\1\0\4\65\11\0\65\64\2\0\2\64\2\0\2\64\3\0\34\64"+
    "\2\0\10\64\2\0\2\64\67\0\46\64\2\0\1\64\7\0\46\64"+
    "\12\0\21\65\1\0\27\65\1\0\3\65\1\0\1\65\1\0\2\65"+
    "\1\0\1\65\13\0\33\64\5\0\3\64\56\0\32\64\5\0\1\65"+
    "\12\64\10\65\15\0\12\65\6\0\1\65\107\64\2\0\5\64\1\0"+
    "\17\64\1\0\4\64\1\0\1\64\17\65\2\64\2\65\1\0\4\65"+
    "\2\0\12\65\u0207\0\3\65\1\0\65\64\2\0\1\65\1\64\20\65"+
    "\3\0\4\65\3\0\12\64\2\65\2\0\12\65\21\0\3\65\1\0"+
    "\10\64\2\0\2\64\2\0\26\64\1\0\7\64\1\0\1\64\3\0"+
    "\4\64\2\0\1\65\1\0\7\65\2\0\2\65\2\0\3\65\11\0"+
    "\1\65\4\0\2\64\1\0\3\64\2\65\2\0\12\65\2\64\20\0"+
    "\1\65\2\0\6\64\4\0\2\64\2\0\26\64\1\0\7\64\1\0"+
    "\2\64\1\0\2\64\1\0\2\64\2\0\1\65\1\0\5\65\4\0"+
    "\2\65\2\0\3\65\13\0\4\64\1\0\1\64\7\0\12\65\2\65"+
    "\3\64\14\0\3\65\1\0\7\64\1\0\1\64\1\0\3\64\1\0"+
    "\26\64\1\0\7\64\1\0\2\64\1\0\5\64\2\0\1\65\1\64"+
    "\10\65\1\0\3\65\1\0\3\65\22\0\1\64\5\0\12\65\21\0"+
    "\3\65\1\0\10\64\2\0\2\64\2\0\26\64\1\0\7\64\1\0"+
    "\2\64\2\0\4\64\2\0\1\65\1\64\6\65\3\0\2\65\2\0"+
    "\3\65\10\0\2\65\4\0\2\64\1\0\3\64\4\0\12\65\22\0"+
    "\2\65\1\0\6\64\3\0\3\64\1\0\4\64\3\0\2\64\1\0"+
    "\1\64\1\0\2\64\3\0\2\64\3\0\3\64\3\0\10\64\1\0"+
    "\3\64\4\0\5\65\3\0\3\65\1\0\4\65\11\0\1\65\17\0"+
    "\11\65\21\0\3\65\1\0\10\64\1\0\3\64\1\0\27\64\1\0"+
    "\12\64\1\0\5\64\4\0\7\65\1\0\3\65\1\0\4\65\7\0"+
    "\2\65\11\0\2\64\4\0\12\65\22\0\2\65\1\0\10\64\1\0"+
    "\3\64\1\0\27\64\1\0\12\64\1\0\5\64\4\0\7\65\1\0"+
    "\3\65\1\0\4\65\7\0\2\65\7\0\1\64\1\0\2\64\4\0"+
    "\12\65\22\0\2\65\1\0\10\64\1\0\3\64\1\0\27\64\1\0"+
    "\20\64\4\0\6\65\2\0\3\65\1\0\4\65\11\0\1\65\10\0"+
    "\2\64\4\0\12\65\221\0\56\64\1\0\1\64\1\65\2\64\7\65"+
    "\5\0\6\64\1\65\10\65\1\0\12\65\47\0\2\64\1\0\1\64"+
    "\2\0\2\64\1\0\1\64\2\0\1\64\6\0\4\64\1\0\7\64"+
    "\1\0\3\64\1\0\1\64\1\0\1\64\2\0\2\64\1\0\2\64"+
    "\1\0\1\64\1\65\2\64\6\65\1\0\2\65\1\64\2\0\5\64"+
    "\1\0\1\65\1\0\6\65\2\0\12\65\76\0\2\65\6\0\12\65"+
    "\13\0\1\65\1\0\1\65\1\0\1\65\4\0\2\65\10\64\1\0"+
    "\41\64\7\0\24\65\1\0\6\65\4\0\6\65\1\0\1\65\1\0"+
    "\25\65\3\0\7\65\1\0\1\65\346\0\46\64\12\0\47\64\11\0"+
    "\1\64\1\0\2\64\1\0\3\64\1\0\1\64\1\0\2\64\1\0"+
    "\5\64\51\0\1\64\1\0\1\64\1\0\1\64\13\0\1\64\1\0"+
    "\1\64\1\0\1\64\3\0\2\64\3\0\1\64\5\0\3\64\1\0"+
    "\1\64\1\0\1\64\1\0\1\64\1\0\1\64\3\0\2\64\3\0"+
    "\2\64\1\0\1\64\50\0\1\64\11\0\1\64\2\0\1\64\2\0"+
    "\2\64\7\0\2\64\1\0\1\64\1\0\7\64\50\0\1\64\4\0"+
    "\1\64\10\0\1\64\u0c06\0\234\64\4\0\132\64\6\0\26\64\2\0"+
    "\6\64\2\0\46\64\2\0\6\64\2\0\10\64\1\0\1\64\1\0"+
    "\1\64\1\0\1\64\1\0\37\64\2\0\65\64\1\0\7\64\1\0"+
    "\1\64\3\0\3\64\1\0\7\64\3\0\4\64\2\0\6\64\4\0"+
    "\15\64\5\0\3\64\1\0\7\64\323\0\15\65\4\0\1\65\104\0"+
    "\1\64\3\0\2\64\2\0\1\64\121\0\3\64\u0e82\0\1\65\1\0"+
    "\1\64\31\0\11\64\6\65\1\0\5\65\13\0\124\64\4\0\2\65"+
    "\2\0\2\65\2\0\132\64\1\0\3\65\6\0\50\64\u1cd3\0\u51a6\64"+
    "\u0c5a\0\u2ba4\64\134\0\u0800\0\u1ffe\0\2\0";

  /** 
   * Translates characters to character classes
   */
  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);

  /** 
   * Translates a state to a row index in the transition table
   */
  final private static int yy_rowMap [] = { 
        0,    55,   110,   165,   220,   275,   330,   385,   440,   495, 
      550,   605,   660,   715,   770,   825,   880,   935,   990,  1045, 
     1100,  1155,  1210,  1265,  1320,  1375,  1430,  1485,  1540,  1595, 
     1650,  1705,  1760,  1815,  1870,  1925,  1980,  1925,  1980,  2035, 
     1925,  1980,  2090,  2145,  2200,  2255,  2310,  2365,  2420,  2475, 
     1925,  1980,  2530,  2585,  2640,  1925,  2695,  2695,  2750,  2805, 
     2860,  2530,  1925,  2915,  2970,  1925,  3025,  3080,  3135,  3190, 
     3245,  3300,  1925,  3355,  3410,  3465,  3520,  1925,  3575,  3630, 
     3685,  3740,  3795,  1925,  3850,  3905,  3960,  4015,  4070,  4125, 
     4180,  4235,  4235,  4290,  4345,  4400,  4455,  4455,  4510,  4565, 
     4620,  4675,  4675,  4730,  4785,  4840,  4895,  1925,  4950,  4950, 
     5005,  5060,  5115,  5170,  1925,  1925,  1980,  1925,  1925,  5225, 
     5280,  5335,  5390,  5445,  5500,  5555,  5610,  1925,  5665,  5720, 
     5775,  1925,  1925,  2695,  5830,  2805,  1925,  5885,  2860,  2915, 
     3025,  3080,  5940,  3135,  1925,  5995,  3190,  1925,  3575,  6050, 
     3685,  1925,  6105,  3740,  5225,  6160,  6215,  6270,  4015,  1925, 
     6325,  6380,  4235,  6435,  4290,  1925,  6490,  6545,  6600,  6600, 
     6655,  6710,  4400,  4235,  4455,  6765,  4510,  1925,  6820,  4565, 
     4620,  4455,  4675,  6875,  4730,  1925,  6930,  6985,  7040,  7040, 
     7095,  7150,  7205,  4950,  7260,  5005,  1925,  7315,  7370,  7425, 
     7425,  7480,  7535,  7590,  7645,  7700,  7755,  7810,  1925,  7865, 
     7920,  1925,  1925,  1925,  2255,  7975,  8030,  8085,  8140,  8195, 
     8250,  8305,  6490,  8360,  8360,  6930,  8415,  8415,  8470,  7315, 
     8525,  8525,  8580,  1925,  8635,  8690,  1925,  8745,  8800,  8855, 
     8910,  8965,  9020,  9075,  9130,  6655,  7095,  9185,  7480,  9240, 
     9295,  9350,  9405,  9460,  9515,  9570,  9625,  9680,  9735,  9790, 
     9845,  9900,  9955, 10010, 10065, 10120,  1925,  1925, 10175, 10230, 
    10285, 10340, 10395,  1925,  1925,  1925, 10450, 10505, 10560, 10615, 
    10670, 10725,  1925, 10780,  4840,  5115, 10835, 10890, 10945, 11000, 
     2255
  };

  /** 
   * The packed transition table of the DFA
   */
  final private static String yy_packed = 
    "\1\40\1\41\10\40\1\42\4\40\1\43\47\40\1\44"+
    "\1\45\65\44\1\46\1\47\16\46\1\50\46\46\1\51"+
    "\1\52\65\51\1\46\1\47\5\46\1\53\60\46\1\47"+
    "\2\46\1\54\1\55\2\46\1\56\3\46\1\55\5\46"+
    "\1\55\1\57\1\60\4\56\1\46\10\56\1\61\2\56"+
    "\1\46\7\56\1\46\3\56\1\46\3\56\1\46\1\56"+
    "\1\46\1\47\2\46\1\54\1\62\6\46\1\62\5\46"+
    "\1\62\44\46\1\63\1\64\2\63\1\65\15\63\1\46"+
    "\44\63\1\46\1\47\2\46\1\66\1\55\2\46\1\67"+
    "\3\46\1\55\5\46\1\55\6\67\1\46\13\67\1\46"+
    "\7\67\1\46\3\67\1\46\3\67\1\46\1\67\1\46"+
    "\1\47\2\46\1\66\1\55\2\46\1\67\3\46\1\55"+
    "\5\46\1\55\6\67\1\46\13\67\1\70\7\67\1\46"+
    "\3\67\1\46\3\67\1\46\1\67\1\71\1\47\1\46"+
    "\1\72\1\73\1\55\3\71\1\74\1\71\1\75\1\55"+
    "\5\71\1\55\44\71\1\46\1\47\2\46\1\76\63\46"+
    "\1\47\1\77\1\100\1\46\1\55\2\46\1\101\3\46"+
    "\1\55\5\46\1\55\6\101\1\46\13\101\1\46\7\101"+
    "\1\46\3\101\1\46\3\101\1\46\1\101\1\46\1\47"+
    "\1\77\1\100\1\46\1\55\2\46\1\101\3\46\1\55"+
    "\5\46\1\55\6\101\1\46\13\101\1\102\7\101\1\46"+
    "\3\101\1\46\3\101\1\46\1\101\1\103\1\47\1\77"+
    "\1\104\1\103\1\55\3\103\1\105\1\103\1\106\1\55"+
    "\5\103\1\55\44\103\1\46\1\47\3\46\1\55\6\46"+
    "\1\55\5\46\1\55\44\46\1\107\1\110\1\111\1\112"+
    "\4\107\1\113\12\107\6\114\1\107\13\114\1\107\7\114"+
    "\1\107\3\114\1\107\3\114\1\107\1\114\1\46\1\110"+
    "\1\111\1\112\1\46\1\55\2\46\1\115\3\46\1\55"+
    "\5\46\1\55\6\115\1\46\13\115\1\46\7\115\1\46"+
    "\3\115\1\46\3\115\1\46\1\115\1\46\1\110\1\111"+
    "\1\112\1\46\1\55\2\46\1\115\3\46\1\55\5\46"+
    "\1\55\6\115\1\46\13\115\1\116\7\115\1\46\3\115"+
    "\1\46\3\115\1\46\1\115\1\117\1\110\1\111\1\120"+
    "\1\117\1\55\3\117\1\121\1\117\1\122\1\55\5\117"+
    "\1\55\44\117\1\46\1\123\1\124\2\46\1\55\6\46"+
    "\1\55\5\46\1\55\10\46\1\125\1\126\2\46\1\127"+
    "\10\46\1\127\1\46\1\126\1\125\14\46\1\47\1\124"+
    "\2\46\1\55\6\46\1\55\5\46\1\55\6\46\1\130"+
    "\36\46\1\47\1\124\2\46\1\55\2\46\1\131\3\46"+
    "\1\55\5\46\1\55\6\131\1\130\13\131\1\46\7\131"+
    "\1\46\3\131\1\46\3\131\1\46\1\131\1\46\1\47"+
    "\1\124\2\46\1\55\6\46\1\55\5\46\1\55\6\46"+
    "\1\130\7\46\1\132\5\46\1\133\6\46\1\132\10\46"+
    "\1\134\1\47\1\124\1\135\1\134\1\55\3\134\1\136"+
    "\1\134\1\137\1\55\5\134\1\55\6\134\1\140\35\134"+
    "\1\141\1\47\1\124\1\142\1\141\1\55\3\141\1\143"+
    "\1\141\1\144\1\55\5\141\1\55\6\141\1\145\35\141"+
    "\1\146\1\47\1\124\1\147\1\146\1\55\3\146\1\150"+
    "\1\146\1\151\1\55\5\146\1\55\44\146\1\152\1\153"+
    "\1\154\64\152\1\155\1\47\1\124\1\156\1\155\1\55"+
    "\3\155\1\157\1\155\1\160\1\55\5\155\1\55\44\155"+
    "\1\161\1\162\1\163\64\161\1\164\1\165\65\164\1\40"+
    "\1\0\10\40\1\0\4\40\1\0\47\40\3\0\1\166"+
    "\1\167\14\0\1\170\52\0\1\171\2\0\1\172\3\0"+
    "\1\171\5\0\1\171\6\172\1\0\13\172\1\0\7\172"+
    "\1\173\3\172\1\0\3\172\1\0\1\172\5\0\1\171"+
    "\2\0\1\174\3\0\1\171\5\0\1\171\6\174\1\0"+
    "\13\174\1\0\7\174\1\0\3\174\1\0\3\174\1\0"+
    "\1\174\110\0\1\175\65\0\1\176\55\0\1\177\61\0"+
    "\1\200\71\0\1\55\6\0\1\55\5\0\1\55\52\0"+
    "\3\56\4\0\1\56\5\0\6\56\1\0\13\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\6\0\3\56\4\0"+
    "\1\56\5\0\2\56\2\201\2\56\1\0\13\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\6\0\3\56\4\0"+
    "\1\56\5\0\2\56\1\201\1\202\2\56\1\0\13\56"+
    "\1\0\7\56\1\0\3\56\1\0\5\56\6\0\3\56"+
    "\4\0\1\56\5\0\2\56\2\203\2\56\1\0\13\56"+
    "\1\0\7\56\1\0\3\56\1\0\5\56\5\0\1\62"+
    "\6\0\1\62\5\0\1\62\46\0\1\204\66\0\1\205"+
    "\72\0\3\67\4\0\1\67\5\0\6\67\1\0\13\67"+
    "\1\0\7\67\1\0\3\67\1\0\5\67\1\71\2\0"+
    "\1\206\1\71\1\0\3\71\1\0\1\71\2\0\5\71"+
    "\1\0\45\71\1\0\1\205\1\206\1\71\1\0\3\71"+
    "\1\0\1\71\2\0\5\71\1\0\44\71\1\74\1\0"+
    "\1\207\1\210\1\74\1\207\3\74\1\211\1\74\2\207"+
    "\5\74\1\207\44\74\1\75\1\0\1\212\1\213\1\75"+
    "\1\212\3\75\1\212\1\75\1\211\1\212\5\75\1\212"+
    "\44\75\2\0\1\77\1\214\71\0\3\101\4\0\1\101"+
    "\5\0\6\101\1\0\13\101\1\0\7\101\1\0\3\101"+
    "\1\0\5\101\1\103\2\0\1\215\1\103\1\0\3\103"+
    "\1\0\1\103\2\0\5\103\1\0\45\103\1\0\1\77"+
    "\1\216\1\103\1\0\3\103\1\0\1\103\2\0\5\103"+
    "\1\0\44\103\1\105\1\0\1\217\1\220\1\105\1\217"+
    "\3\105\1\221\1\105\2\217\5\105\1\217\44\105\1\106"+
    "\1\0\1\222\1\223\1\106\1\222\3\106\1\222\1\106"+
    "\1\221\1\222\5\106\1\222\44\106\1\107\3\0\17\107"+
    "\6\0\1\107\13\0\1\107\7\0\1\107\3\0\1\107"+
    "\3\0\1\107\4\0\1\166\15\0\1\170\47\0\1\224"+
    "\64\0\1\107\3\0\2\107\3\113\4\107\1\113\5\107"+
    "\6\114\1\107\13\114\1\107\7\114\1\107\3\114\1\107"+
    "\3\114\1\113\1\114\6\0\3\114\4\0\1\114\5\0"+
    "\6\114\1\0\13\114\1\0\7\114\1\0\3\114\1\0"+
    "\5\114\6\0\3\115\4\0\1\115\5\0\6\115\1\0"+
    "\13\115\1\0\7\115\1\0\3\115\1\0\5\115\1\117"+
    "\2\0\1\225\1\117\1\0\3\117\1\0\1\117\2\0"+
    "\5\117\1\0\45\117\1\0\1\224\1\225\1\117\1\0"+
    "\3\117\1\0\1\117\2\0\5\117\1\0\44\117\1\121"+
    "\1\0\1\226\1\227\1\121\1\226\3\121\1\230\1\121"+
    "\2\226\5\121\1\226\44\121\1\122\1\0\1\231\1\232"+
    "\1\122\1\231\3\122\1\231\1\122\1\230\1\231\5\122"+
    "\1\231\44\122\3\0\1\166\15\0\1\233\110\0\1\234"+
    "\60\0\1\235\13\0\1\235\44\0\2\236\36\0\20\237"+
    "\1\240\46\237\6\0\3\131\4\0\1\131\5\0\6\131"+
    "\1\0\13\131\1\0\7\131\1\0\3\131\1\0\5\131"+
    "\46\0\1\241\5\0\1\241\72\0\1\242\6\0\1\134"+
    "\2\0\1\243\1\134\1\0\3\134\1\0\1\134\2\0"+
    "\5\134\1\0\44\134\1\136\1\0\1\244\1\245\1\136"+
    "\1\244\3\136\1\246\1\136\2\244\5\136\1\244\44\136"+
    "\1\247\1\0\1\250\1\251\1\252\1\250\3\252\1\250"+
    "\1\247\1\253\1\254\3\252\1\247\1\252\1\254\6\252"+
    "\1\247\32\252\2\247\1\252\1\140\2\237\1\255\1\140"+
    "\1\237\3\140\1\237\1\140\2\237\3\140\1\256\1\140"+
    "\1\237\44\140\1\141\2\0\1\257\1\141\1\0\3\141"+
    "\1\0\1\141\2\0\5\141\1\0\44\141\1\143\2\260"+
    "\1\261\1\143\1\260\3\143\1\262\1\143\2\260\5\143"+
    "\1\260\44\143\1\144\2\263\1\264\1\144\1\263\3\144"+
    "\1\263\1\144\1\262\1\263\5\144\1\263\44\144\1\145"+
    "\2\237\1\265\1\145\1\237\3\145\1\237\1\145\2\237"+
    "\3\145\1\266\1\145\1\237\44\145\1\146\2\0\1\267"+
    "\1\146\1\0\3\146\1\0\1\146\2\0\5\146\1\0"+
    "\44\146\1\150\1\0\1\270\1\271\1\150\1\270\3\150"+
    "\1\272\1\150\2\270\5\150\1\270\44\150\1\273\1\0"+
    "\1\274\1\275\1\276\1\274\3\276\1\274\1\273\1\277"+
    "\1\300\3\276\1\273\1\276\1\300\6\276\1\273\32\276"+
    "\2\273\1\276\2\152\1\0\66\152\1\0\16\152\1\301"+
    "\45\152\1\155\2\0\1\302\1\155\1\0\3\155\1\0"+
    "\1\155\2\0\5\155\1\0\44\155\1\157\1\0\1\303"+
    "\1\304\1\157\1\303\3\157\1\305\1\157\2\303\5\157"+
    "\1\303\44\157\1\306\1\0\1\307\1\310\1\311\1\307"+
    "\3\311\1\307\1\306\1\312\1\313\3\311\1\306\1\311"+
    "\1\313\6\311\1\306\32\311\2\306\1\311\2\161\1\0"+
    "\66\161\1\0\16\161\1\314\45\161\7\0\1\315\21\0"+
    "\1\316\42\0\1\171\2\0\1\40\3\0\1\171\5\0"+
    "\1\171\6\40\1\0\13\40\1\0\7\40\1\0\3\40"+
    "\1\0\3\40\1\0\1\40\1\317\1\0\3\317\1\320"+
    "\3\172\1\317\1\0\1\317\1\320\1\172\1\317\1\0"+
    "\2\317\1\320\6\172\1\317\13\172\1\317\7\172\1\317"+
    "\3\172\1\321\5\172\15\0\1\322\6\0\1\323\42\0"+
    "\1\317\1\0\3\317\1\320\3\174\1\317\1\0\1\317"+
    "\1\320\1\174\1\317\1\0\2\317\1\320\6\174\1\317"+
    "\13\174\1\317\7\174\1\317\3\174\1\324\5\174\31\0"+
    "\1\316\37\0\1\325\66\0\1\326\72\0\3\56\4\0"+
    "\1\56\5\0\4\56\2\327\1\0\13\56\1\0\7\56"+
    "\1\0\3\56\1\0\5\56\6\0\3\56\4\0\1\56"+
    "\5\0\4\56\1\327\1\330\1\0\13\56\1\0\7\56"+
    "\1\0\3\56\1\0\5\56\6\0\3\56\4\0\1\56"+
    "\5\0\6\56\1\0\13\56\1\0\1\56\1\331\5\56"+
    "\1\0\3\56\1\0\5\56\1\207\1\0\7\207\1\211"+
    "\55\207\1\212\1\0\11\212\1\211\53\212\1\217\1\0"+
    "\7\217\1\221\55\217\1\222\1\0\11\222\1\221\53\222"+
    "\1\226\1\0\7\226\1\230\55\226\1\231\1\0\11\231"+
    "\1\230\53\231\32\0\1\332\30\0\1\332\40\0\1\333"+
    "\13\0\1\333\54\0\1\334\10\0\1\334\57\0\1\335"+
    "\14\0\1\335\72\0\1\336\4\0\1\244\1\0\7\244"+
    "\1\246\55\244\1\247\1\0\1\250\1\337\1\247\1\250"+
    "\3\247\1\250\1\247\1\246\1\250\5\247\1\250\44\247"+
    "\1\250\1\0\11\250\1\246\53\250\1\247\1\0\1\250"+
    "\1\337\1\247\1\250\3\247\1\250\1\247\1\340\1\250"+
    "\5\247\1\250\44\247\13\0\1\341\53\0\1\250\1\0"+
    "\11\250\1\340\53\250\11\260\1\262\55\260\13\263\1\262"+
    "\53\263\1\270\1\0\7\270\1\272\55\270\1\273\1\0"+
    "\1\274\1\342\1\273\1\274\3\273\1\274\1\273\1\272"+
    "\1\274\5\273\1\274\44\273\1\274\1\0\11\274\1\272"+
    "\53\274\1\273\1\0\1\274\1\342\1\273\1\274\3\273"+
    "\1\274\1\273\1\343\1\274\5\273\1\274\44\273\13\0"+
    "\1\344\53\0\1\274\1\0\11\274\1\343\53\274\2\152"+
    "\1\0\26\152\1\345\35\152\1\303\1\0\7\303\1\305"+
    "\55\303\1\306\1\0\1\307\1\346\1\306\1\307\3\306"+
    "\1\307\1\306\1\305\1\307\5\306\1\307\44\306\1\307"+
    "\1\0\11\307\1\305\53\307\1\306\1\0\1\307\1\346"+
    "\1\306\1\307\3\306\1\307\1\306\1\347\1\307\5\306"+
    "\1\307\44\306\13\0\1\350\53\0\1\307\1\0\11\307"+
    "\1\347\53\307\2\161\1\0\26\161\1\351\35\161\7\0"+
    "\1\352\111\0\1\353\34\0\1\317\1\0\10\317\1\0"+
    "\4\317\1\0\41\317\1\0\6\317\1\0\3\317\1\320"+
    "\4\317\1\0\1\317\1\320\2\317\1\0\2\317\1\320"+
    "\36\317\1\354\5\317\15\0\1\322\43\0\1\355\22\0"+
    "\1\356\14\0\3\356\2\0\1\356\10\0\1\356\1\0"+
    "\2\356\3\0\1\356\2\0\2\356\11\0\1\56\1\357"+
    "\1\56\4\0\1\56\5\0\6\56\1\0\13\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\6\0\3\56\4\0"+
    "\1\56\5\0\6\56\1\0\11\56\1\360\1\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\35\0\1\361\13\0"+
    "\1\361\44\0\2\362\63\0\2\363\75\0\1\364\13\0"+
    "\1\364\44\0\2\365\41\0\2\366\1\0\3\366\2\0"+
    "\1\253\4\366\1\0\10\366\1\0\32\366\2\0\1\366"+
    "\3\0\2\367\1\0\3\367\2\0\1\277\4\367\1\0"+
    "\10\367\1\0\32\367\2\0\1\367\2\152\1\0\27\152"+
    "\1\370\34\152\3\0\2\371\1\0\3\371\2\0\1\312"+
    "\4\371\1\0\10\371\1\0\32\371\2\0\1\371\2\161"+
    "\1\0\27\161\1\372\34\161\33\0\1\373\114\0\1\354"+
    "\22\0\1\356\14\0\3\356\2\0\1\356\10\0\1\356"+
    "\1\0\2\356\3\0\1\356\1\0\1\355\2\356\11\0"+
    "\3\56\4\0\1\56\5\0\6\56\1\0\7\56\1\374"+
    "\3\56\1\0\7\56\1\0\3\56\1\0\5\56\6\0"+
    "\3\56\4\0\1\56\5\0\6\56\1\0\6\56\1\375"+
    "\4\56\1\0\7\56\1\0\3\56\1\0\5\56\46\0"+
    "\1\376\5\0\1\376\54\0\1\377\63\0\1\u0100\10\0"+
    "\1\u0100\55\0\1\u0101\10\0\1\u0101\60\0\1\u0102\24\0"+
    "\2\152\1\0\30\152\1\u0103\33\152\2\161\1\0\30\161"+
    "\1\u0104\33\161\34\0\1\u0105\40\0\3\56\4\0\1\56"+
    "\5\0\6\56\1\0\13\56\1\0\3\56\1\u0106\3\56"+
    "\1\0\3\56\1\0\5\56\6\0\3\56\4\0\1\56"+
    "\5\0\6\56\1\0\3\56\1\u0107\7\56\1\0\3\56"+
    "\1\u0107\3\56\1\0\3\56\1\0\5\56\47\0\1\u0108"+
    "\60\0\1\u0109\14\0\1\u0109\54\0\1\u010a\47\0\2\u010b"+
    "\72\0\1\u010c\30\0\1\u010c\3\0\2\152\1\0\31\152"+
    "\1\u010d\32\152\2\161\1\0\31\161\1\u010e\32\161\35\0"+
    "\1\u010f\37\0\3\56\4\0\1\56\5\0\6\56\1\0"+
    "\13\56\1\0\6\56\1\u0110\1\0\3\56\1\0\5\56"+
    "\5\0\1\u0111\3\56\3\0\1\u0111\1\56\4\0\1\u0111"+
    "\6\56\1\0\13\56\1\0\7\56\1\0\3\56\1\0"+
    "\5\56\37\0\1\u0112\10\0\1\u0112\53\0\1\u0113\13\0"+
    "\1\u0113\52\0\1\u0114\13\0\1\u0114\15\0\2\152\1\0"+
    "\32\152\1\u0115\31\152\2\161\1\0\32\161\1\u0116\31\161"+
    "\34\0\1\u0117\40\0\3\56\4\0\1\56\5\0\5\56"+
    "\1\u0118\1\0\13\56\1\0\7\56\1\0\3\56\1\0"+
    "\5\56\5\0\1\u0111\6\0\1\u0111\5\0\1\u0111\44\0"+
    "\2\152\1\0\31\152\1\u0119\32\152\2\161\1\0\31\161"+
    "\1\u011a\32\161\31\0\1\u011b\43\0\3\56\4\0\1\56"+
    "\5\0\6\56\1\0\5\56\1\u011c\5\56\1\0\7\56"+
    "\1\0\3\56\1\0\5\56\2\152\1\0\26\152\1\u011d"+
    "\35\152\2\161\1\0\26\161\1\u011e\35\161\6\0\3\56"+
    "\4\0\1\56\5\0\6\56\1\0\7\56\1\u011f\3\56"+
    "\1\0\7\56\1\0\3\56\1\0\5\56\6\0\3\56"+
    "\4\0\1\56\5\0\6\56\1\0\13\56\1\0\7\56"+
    "\1\0\3\56\1\0\4\56\1\u0120\6\0\3\56\4\0"+
    "\1\56\5\0\6\56\1\0\5\56\1\u0121\5\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\6\0\3\56\4\0"+
    "\1\56\5\0\6\56\1\0\5\56\1\u0122\5\56\1\0"+
    "\7\56\1\0\3\56\1\0\5\56\6\0\3\56\4\0"+
    "\1\56\5\0\6\56\1\0\13\56\1\0\3\56\1\u0123"+
    "\3\56\1\0\3\56\1\0\5\56";

  /** 
   * The transition table of the DFA
   */
  final private static int yytrans [] = yy_unpack(yy_packed);


  /* error codes */
  final private static int YY_UNKNOWN_ERROR = 0;
  // final private static int YY_ILLEGAL_STATE = 1;
  final private static int YY_NO_MATCH = 2;
  final private static int YY_PUSHBACK_2BIG = 3;

  /* error messages for the codes above */
  final private static String YY_ERROR_MSG[] = {
    "Unknown internal scanner error",		//$NON-NLS-1$
    "Internal error: unknown state",		//$NON-NLS-1$
    "Error: could not match input",		//$NON-NLS-1$
    "Error: pushback value was too large"	//$NON-NLS-1$
  };

  /**
   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private final static byte YY_ATTRIBUTE[] = {
     1,  0,  0,  0,  0,  1,  0,  0,  1,  1,  1,  0,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1, 
     1,  1,  1,  9,  1,  9,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  9,  1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  1, 
     1,  9,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1,  9,  1,  1, 
     1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1,  1,  1,  1, 
     1,  1,  9,  9,  1,  9,  9,  1,  0,  1,  0,  1,  0,  0,  0,  9, 
     1,  1,  1,  9,  9,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0, 
     9,  0,  0,  9,  0,  0,  0,  9,  0,  0,  0,  0,  0,  0,  0,  9, 
     0,  0,  0,  0,  0,  9,  1,  0,  0,  1,  1,  0,  0,  1,  0,  0, 
     0,  9,  0,  0,  0,  1,  0,  0,  0,  9,  1,  0,  0,  1,  1,  0, 
     1,  0,  0,  0,  9,  1,  0,  0,  1,  1,  0,  1,  0,  0,  1,  1, 
     9,  0,  0,  9,  9,  9,  1,  1,  1,  0,  0,  0,  0,  0,  0,  1, 
     0,  0,  1,  0,  1,  0,  1,  0,  1,  9,  0,  1,  9,  0,  1,  1, 
     0,  0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  1,  0,  0,  0, 
     0,  0,  1,  1,  0,  1,  1,  0,  0,  0,  9,  9,  1,  1,  0,  1, 
     1,  9,  9,  9,  1,  1,  0,  1,  1,  1,  9,  1,  1,  1,  1,  1, 
     1,  1,  1
  };

  /** the input device */
  private java.io.Reader yy_reader;

  /** the current state of the DFA */
  private int yy_state;

  /** the current lexical state */
  private int yy_lexical_state = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char yy_buffer[] = new char[16384];

  /** the textposition at the last accepting state */
  private int yy_markedPos;

  /** the textposition at the last state to be included in yytext */
  private int yy_pushbackPos;

  /** the current text position in the buffer */
  private int yy_currentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int yy_startRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int yy_endRead;

  /** number of newlines encountered up to the start of the matched text */
  //private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  // private int yycolumn; 

  /** 
   * yy_atBOL == true <=> the scanner is currently at the beginning of a line
   */
  // private boolean yy_atBOL;

  /** yy_atEOF == true <=> the scanner has returned a value for EOF */
  private boolean yy_atEOF;

  // records the number of times we've set up new input to be parsed
  private long fInputStamp = -1;
  // records the last input iteration for which we reported an error
  private long fErroredInputstamp = -1;

  /** denotes if the user-EOF-code has already been executed */
  private boolean yy_eof_done;

  /* user code: */
	private int fTokenCount = 0;
 
	// required holders for white-space compacting
	private boolean fShouldLoadBuffered = false;
	private String fBufferedContext = null;
	private int fBufferedStart = 1;
	private int fBufferedLength = 0;
	private String f_context = null;

	// state stack for handling embedded regions
	private IntStack fStateStack = new IntStack();

	private String context = null;
	private int start = 0;
	private int textLength = 0;
	private int length = 0;

	// offset for tracking position specific block tags
	private int fOffset = 0;
	
	// the name of the current tag being opened
	private String fCurrentTagName = null;

	// the list of tag name BlockMarkers
	private List fBlockMarkers = new ArrayList();

	// required to not seek text blocks on an end tag
	private boolean fIsBlockingEnabled = false;
	private boolean fIsCaseSensitiveBlocking = true;

	private XMLParserRegionFactory fRegionFactory = new XMLParserRegionFactory();
/**
 * user method 
 */
public final void addBlockMarker(BlockMarker marker) {
	if(containsTagName(marker.getTagName()))
		return;
	fBlockMarkers.add(marker);
}
/**
 * user method 
 */
public final void removeBlockMarker(BlockMarker marker) {
	fBlockMarkers.remove(marker);
}
/**
 * user method 
 */
public final void removeBlockMarker(String tagname) {
	if (fBlockMarkers != null) {
		Iterator blocks = fBlockMarkers.iterator();
		while (blocks.hasNext()) {
			if (((BlockMarker) blocks.next()).getTagName().equals(tagname))
				blocks.remove();
		}
	}
}
/* user method */
public final boolean isCaseSensitiveBlocking() {
	return fIsCaseSensitiveBlocking;
}
/* user method */
public final void setCaseSensitiveBlocking(boolean newValue) {
	fIsCaseSensitiveBlocking = newValue;
}
/* user method */
public boolean getBlockMarkerCaseSensitivity() {
        return getBlockMarkerCaseSensitivity(fCurrentTagName);
}
/* user method */
public boolean getBlockMarkerCaseSensitivity(String name) {
	Iterator iterator = fBlockMarkers.iterator();
	while(iterator.hasNext()) {
		BlockMarker marker = (BlockMarker)iterator.next();
		boolean casesensitive = marker.isCaseSensitive();
		if(casesensitive && marker.getTagName().equals(name))
			return casesensitive;
		else if(!casesensitive && marker.getTagName().equalsIgnoreCase(name))
			return casesensitive;
	}
	return true;
}
/* user method */
public String getBlockMarkerContext() {
	return getBlockMarkerContext(fCurrentTagName);
}
/* user method */
public String getBlockMarkerContext(String name) {
	Iterator iterator = fBlockMarkers.iterator();
	while(iterator.hasNext()) {
		BlockMarker marker = (BlockMarker)iterator.next();
		if(marker.getTagName().equals(name))
			return marker.getContext();
	}
	return BLOCK_TEXT;
}
/* user method */
public List getBlockMarkers() {
	return fBlockMarkers;
}
/* user method */
public final int getOffset() {
	return fOffset + yychar;
}
private final boolean isBlockMarker() {
	return isBlockMarker(fCurrentTagName);
}
private final boolean isBlockMarker(String tagName) {
	if (!fIsBlockingEnabled)
		return false;
	return containsTagName(tagName);
}
/**
 * user method
 */
public final void beginBlockTagScan(String newTagName) {
	beginBlockMarkerScan(newTagName, BLOCK_TEXT);
}
/**
 * user method
 *
 * Special tokenizer setup.  Allows tokenization to be initiated at the
 * start of a text block within a "newTagName" tag.
 *
 * Example: 
 *	Tokenizer toker = new Tokenizer();
 *	toker.setCaseSensitiveBlocking(false);
 *	toker.reset(new java.io.StringReader("afiuhqwkejhtasihgalkwhtq</scripter></scr></script>asgdasga"));
 *	toker.beginBlockMarkerScan("script", BLOCK_TEXT);
 *	toker.getRegions(); 
 *
 * Returns:
 *	BLOCK_TEXT: 0-40
 *	XML_END_TAG_OPEN: 41-42
 *	XML_TAG_NAME: 43-48
 *	XML_TAG_CLOSE: 49-49
 *	XML_CONTENT: 50-57
 *
 */
public final void beginBlockMarkerScan(String newTagName, String blockcontext) {
	yybegin(ST_BLOCK_TAG_SCAN);
	fCurrentTagName = newTagName;
}
/**
 * Method doScan.
 * 
 * Returns a context region for all of the text from the current position upto the end of input or
 * to right *before* the first occurence of searchString
 * 
 * @param searchString - target string to search for ex.: "-->", "</tagname"
 * @param requireTailSeparator - whether the target must be immediately followed by whitespace or '>'
 * @param context - the context of the scanned region if non-zero length
 * @param exitState - the state to go to if the region was of non-zero length
 * @param abortState - the state to go to if the searchString was found immediately
 * @return String - the context found: the desired context on a non-zero length match, the abortContext on immediate success
 * @throws IOException
 */
private final String doScan(String searchString, boolean requireTailSeparator, String searchContext, int exitState, int immediateFallbackState) throws IOException {
	boolean stillSearching = true;
	// Disable further block (probably)
	fIsBlockingEnabled = false;
	int searchStringLength = searchString.length();
	int n = 0;
	char lastCheckChar;
	int i;
	boolean same = false;
	while (stillSearching) {
		n = 0;
		// Ensure that enough data from the input exists to compare against the search String.
		n = yy_advance();
		while(n != YYEOF && yy_currentPos < searchStringLength)
			n = yy_advance();
		// If the input was too short or we've exhausted the input, stop immediately.
		if (n == YYEOF) {
			stillSearching = false;
		}
		else {
			same = true;
			// Ensure that we've not encountered a complete block (<%%>) that was *shorter* than the closeTagString and
			// thus found twice at current-targetLength [since the first scan would have come out this far anyway].
			// Check the characters in the target versus the last targetLength characters read from the buffer
			// and see if it matches
			
			// safety check for array accesses (yy_currentPos is the *last* character we can check against)
			if(yy_currentPos >= searchStringLength && yy_currentPos <= yy_buffer.length) {
				for(i = 0; i < searchStringLength; i++) {
					if(same && fIsCaseSensitiveBlocking)
						same = yy_buffer[i + yy_currentPos - searchStringLength] == searchString.charAt(i);
					else if(same && !fIsCaseSensitiveBlocking)
						same = Character.toLowerCase(yy_buffer[i + yy_currentPos - searchStringLength]) == Character.toLowerCase(searchString.charAt(i));
				}
			}
			// safety check failed; no match is possible right now
			else {
				same = false;
			}
			if (same && requireTailSeparator && yy_currentPos < yy_buffer.length) {
				// Additional check for close tags to ensure that targetString="</script" doesn't match
				// "</scriptS"
				lastCheckChar = yy_buffer[yy_currentPos];
				// Succeed on "</script>" and "</script "
				if(lastCheckChar == '>' || Character.isWhitespace(lastCheckChar))
					stillSearching = false;
			}
			else {
				stillSearching = !same || (yy_currentPos < yy_startRead + searchStringLength);
			}
		}
	}
	if (n != YYEOF || same) {
		// We've stopped short of the end or definitely found a match
		yy_markedPos = yy_currentPos - searchStringLength;
		yy_currentPos = yy_markedPos + 1;
		// If the searchString occurs at the very beginning of what would have
		// been a Block, resume scanning normally immediately
		if (yy_markedPos == yy_startRead) {
			yybegin(immediateFallbackState);
			return primGetNextToken();
		}
	}
	else {
		// We ran through the rest of the input
		yy_markedPos = yy_currentPos;
		yy_currentPos++;
	}
	yybegin(exitState);
	// If the ending occurs at the very beginning of what would have
	// been a Block, resume scanning normally immediately
	if(yy_markedPos == yy_startRead) {
		return primGetNextToken();
	}
	return searchContext;
}
/**
 * user method
 *
 * A generic lookahead-like operation
 */
private final String doBlockScan(String target, String targetContext, int immediateFallbackState) throws IOException {
	return doScan(target, false, targetContext, immediateFallbackState, immediateFallbackState);
}
/**
 * user method 
 * does a lookahead for the current tag name
 */
private final String doBlockTagScan() throws IOException {
        fIsCaseSensitiveBlocking = getBlockMarkerCaseSensitivity();
	return doScan("</" + fCurrentTagName, true, getBlockMarkerContext(fCurrentTagName), YYINITIAL, YYINITIAL);
}
/**
 * user method
 *
 * Converts the raw context String returned by the primGetNextToken()
 * method into a full ITextRegion by pulling in values for the
 * current offset within the scanning text.
 *
 * Returns null when EOF is encountered and attaches intermittently
 * discovered whitespace onto the end of useful regions.
 *
 * Note that this algorithm caches the token following the one being returned
 * so that whitespace can be collapsed.
 */
public final ITextRegion getNextToken() throws IOException {
	// load the starting non-whitespace token (assume that it is so)
	if (fShouldLoadBuffered) {
		context = fBufferedContext;
		start = fBufferedStart;
		textLength = length = fBufferedLength;
		fShouldLoadBuffered = false;
	}
	else {
		context = primGetNextToken();
		if (context == XML_TAG_NAME) {
			if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
				fCurrentTagName = yytext();
			else
				fCurrentTagName = null;
		}
		else if (context == XML_TAG_OPEN) {
			fIsBlockingEnabled = true;
		}
		else if (context == XML_END_TAG_OPEN) {
			fIsBlockingEnabled = false;
		}
		start = yychar;
		textLength = length = yylength();
		if (yy_atEOF) {
			fTokenCount++;
			return null;
		}
	}
	// store the next token
	f_context = primGetNextToken();
	if (f_context == XML_TAG_NAME) {
	if(containsTagName(yy_buffer, yy_startRead, yy_markedPos-yy_startRead))
		fCurrentTagName = yytext();
	else
		fCurrentTagName = null;
	}
	else if (f_context == XML_TAG_OPEN) {
		fIsBlockingEnabled = true;
	}
	else if (f_context == XML_END_TAG_OPEN) {
		fIsBlockingEnabled = false;
	}
	fBufferedContext = f_context;
	fBufferedStart = yychar;
	fBufferedLength = yylength();
	fShouldLoadBuffered = true;
	if (fBufferedContext == WHITE_SPACE) {
		fShouldLoadBuffered = false;
		length += fBufferedLength;
	}
	if (context == null) {
		// EOF
		if (Debug.debugTokenizer) {
			System.out.println(getClass().getName() + " discovered " + fTokenCount + " tokens."); //$NON-NLS-2$//$NON-NLS-1$
		}
		return null;
	}
	fTokenCount++;
	return fRegionFactory.createToken(context, start, textLength, length, null, fCurrentTagName);
}
/* user method */
public XMLTokenizer(){
	super();
}
/* user method */
public XMLTokenizer(char[] charArray){
		this(new CharArrayReader(charArray));
}
/* user method */
public void reset(char[] charArray) {
	reset(new CharArrayReader(charArray), 0);
}
/* user method */
public void reset(char[] charArray, int newOffset) {
	reset(new CharArrayReader(charArray), newOffset);
}
/* user method */
public void reset(java.io.InputStream in) {
	reset(new java.io.InputStreamReader(in), 0);
}
/* user method */
public void reset(java.io.InputStream in, int newOffset) {
	reset(new java.io.InputStreamReader(in), newOffset);
}
/* user method */
public void reset(java.io.Reader in) {
	reset(in, 0);
}
/**
 * user method *
 *
 * Reset internal counters and vars to "newly created" values, in the hopes
 * that resetting a pre-existing tokenizer is faster than creating a new one.
 *
 * This method contains code blocks that were essentially duplicated from the
 * <em>generated</em> output of this specification before this method was
 * added.  Those code blocks were under the above copyright.
 */
public void reset(java.io.Reader in, int newOffset) {
	if (Debug.debugTokenizer) {
		System.out.println("resetting tokenizer");//$NON-NLS-1$
	}

	fInputStamp++;
	fOffset = newOffset;

	/* the input device */
	yy_reader = in;

	/* the current state of the DFA */
	yy_state = 0;

	/* the current lexical state */
	yy_lexical_state = YYINITIAL;

	/* this buffer contains the current text to be matched and is
	the source of the yytext() string */
	java.util.Arrays.fill(yy_buffer, (char)0);

	/* the textposition at the last accepting state */
	yy_markedPos = 0;

	/* the textposition at the last state to be included in yytext */
	yy_pushbackPos = 0;

	/* the current text position in the buffer */
	yy_currentPos = 0;

	/* startRead marks the beginning of the yytext() string in the buffer */
	yy_startRead = 0;

	/** 
	 * endRead marks the last character in the buffer, that has been read
	 * from input 
	 */
	yy_endRead = 0;

	/* number of newlines encountered up to the start of the matched text */
	//yyline = 0;

	/* the number of characters up to the start of the matched text */
	yychar = 0;

	/* yy_atEOF == true <=> the scanner has returned a value for EOF */
	yy_atEOF = false;

	/* denotes if the user-EOF-code has already been executed */
	yy_eof_done = false;


	/* user vars: */
	fTokenCount = 0;
 
	fShouldLoadBuffered = false;
	fBufferedContext = null;
	fBufferedStart = 1;
	fBufferedLength = 0;
	fStateStack = new IntStack();

	context = null;
	start = 0;
	textLength = 0;
	length = 0;
}

	/**
	 * user method
	 *
	 */
	public BlockTokenizer newInstance() {
		XMLTokenizer newInstance = new XMLTokenizer();
		// global tagmarkers can be shared; they have no state and 
		// are never destroyed (e.g. 'release')
		for(int i = 0; i < fBlockMarkers.size(); i++) {
			BlockMarker blockMarker = (BlockMarker) fBlockMarkers.get(i);
			if(blockMarker.isGlobal())
				newInstance.addBlockMarker(blockMarker);
		}
		return newInstance;
	}
/* user method */
private final String scanXMLCommentText() throws IOException {
	// Scan for '-->' and return the text up to that point as
	//   XML_COMMENT_TEXT unless the string occurs IMMEDIATELY, in which
	//  case change to the ST_XML_COMMENT_END state and return the next
	//  context as usual.
	return doScan("-->", false, XML_COMMENT_TEXT, ST_XML_COMMENT_END, ST_XML_COMMENT_END);
}


  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public XMLTokenizer(java.io.Reader in) {
    this.yy_reader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public XMLTokenizer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /** 
   * Unpacks the compressed DFA transition table.
   *
   * @param packed   the packed transition table
   * @return         the unpacked transition table
   */
  private static int [] yy_unpack(String packed) {
    int [] trans = new int[11055];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 3722) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do trans[j++] = value; while (--count > 0);
    }
    return trans;
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] yy_unpack_cmap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 1372) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Gets the next input character.
   *
   * @return      the next character of the input stream, EOF if the
   *              end of the stream is reached.
   * @exception   IOException  if any I/O-Error occurs
   */
  private int yy_advance() throws java.io.IOException {

    /* standard case */
    if (yy_currentPos < yy_endRead) return yy_buffer[yy_currentPos++];

    /* if the eof is reached, we don't need to work hard */ 
    if (yy_atEOF) return YYEOF;

    /* otherwise: need to refill the buffer */

    /* first: make room (if you can) */
    if (yy_startRead > 0) {
      System.arraycopy(yy_buffer, yy_startRead, 
                       yy_buffer, 0, 
                       yy_endRead-yy_startRead);

      /* translate stored positions */
      yy_endRead-= yy_startRead;
      yy_currentPos-= yy_startRead;
      yy_markedPos-= yy_startRead;
      yy_pushbackPos-= yy_startRead;
      yy_startRead = 0;
    }

    /* is the buffer big enough? */
    if (yy_currentPos >= yy_buffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[yy_currentPos*2];
      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
      yy_buffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
                                            yy_buffer.length-yy_endRead);

    if ( numRead == -1 ) return YYEOF;

    yy_endRead+= numRead;

    return yy_buffer[yy_currentPos++];
  }

    
  /**
   * Closes the input stream.
   */
  final public void yyclose() throws java.io.IOException {
    yy_atEOF = true;            /* indicate end of file */
    yy_endRead = yy_startRead;  /* invalidate buffer    */
    yy_reader.close();
  }


  /**
   * Returns the current lexical state.
   */
  final public int yystate() {
    return yy_lexical_state;
  }

  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  final public void yybegin(int newState) {
    yy_lexical_state = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  final public String yytext() {
    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
  }

  /**
   * Returns the length of the matched text region.
   */
  final public int yylength() {
    return yy_markedPos-yy_startRead;
  }


  /**
   * Reports an error that occurred while scanning - method from the SSE custom JFlex skeleton
   *
   * @param   errorCode  the code of the error message to display
   */
  private void yy_ScanError(int errorCode) {
	if (fErroredInputstamp != fInputStamp) {
		IllegalStateException e = new IllegalStateException("Instance:" + System.identityHashCode(this) + " Input:" + fInputStamp + " offset:" + (fOffset + yychar) + " state:" + yystate());
		try {
			Logger.logException(YY_ERROR_MSG[errorCode], e);
			throw(e);
		}
		catch (ArrayIndexOutOfBoundsException e2) {
			Logger.logException(YY_ERROR_MSG[YY_UNKNOWN_ERROR], e2);
		}
		fErroredInputstamp = fInputStamp;
	}
	
    // DO NOT EXIT the VM on an error
    // System.exit(1);
  } 


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  void yypushback(int number) {
    if ( number > yylength() )
      yy_ScanError(YY_PUSHBACK_2BIG);

    yy_markedPos -= number;
  }

	/**
	 * user method - skeleton.sed
	 */
	protected final boolean containsTagName(char[] markerTagName, int offset, int tagnameLength) {
		for(int j = 0; j < fBlockMarkers.size(); j++) {
			BlockMarker marker = (BlockMarker)fBlockMarkers.get(j);
			if(marker.getTagName().length() == tagnameLength) {
				boolean matchesSoFar = true;
				for(int i = 0; i < tagnameLength && matchesSoFar; i++) {
					if(marker.isCaseSensitive()) {
						if(marker.getTagName().charAt(i) != markerTagName[i + offset])
							matchesSoFar = false;
					}
					else {
						if(Character.toLowerCase(marker.getTagName().charAt(i)) != Character.toLowerCase(markerTagName[i + offset]))
							matchesSoFar = false;
					}
				}
				if(matchesSoFar)
					return true;
			}
		}
		return false;
	}

	/**
	 * user method - skeleton.sed
	 *
	 * Return ALL of the regions scannable within the remaining text
	 * Note: for verification use
	 */
	public final List getRegions() {
		List tokens = new ArrayList();
		ITextRegion region = null;
		try {
			region = getNextToken();
			while(region != null) {
				if (region != null) {
					tokens.add(region);
				}
				region = getNextToken();
			}
		}
		catch (StackOverflowError e) {
			Logger.logException(getClass().getName()+": input could not be tokenized correctly at position " + getOffset(), e);//$NON-NLS-1$
			throw e;
		}
		catch (Exception e) {
			// Since this is convenience method and NOT the recommended 
			// way of getting tokens, many errors are simply hidden
			Logger.logException("Exception not handled retrieving regions: " + e.getLocalizedMessage(), e);//$NON-NLS-1$
		}
		return tokens;
	}
	/**
	 * user method - skeleton.sed
	 */
	private final void dump(String s) {
		if (Debug.debugTokenizer) {
			System.out.println(s + " (" + yychar + "-" + //$NON-NLS-2$//$NON-NLS-1$
				(yylength() + yychar) + "):\'" +//$NON-NLS-1$
					StringUtils.escape(yytext()) + "\'");//$NON-NLS-1$
		}
	}
	/* user method  - skeleton.sed */
	public final boolean isEOF() {
		return yy_atEOF;
	}
/* user method - skeleton.sed */
protected final boolean containsTagName(String markerTagName) {
	Iterator blocks = fBlockMarkers.iterator();
	while(blocks.hasNext()) {
		BlockMarker marker = (BlockMarker)blocks.next();
		if(marker.isCaseSensitive()) {
			if(marker.getTagName().equals(markerTagName))
				return true;
		}
		else {
			if(marker.getTagName().equalsIgnoreCase(markerTagName))
				return true;
		}
	}
	return false;
}

  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void yy_do_eof() {
    if (!yy_eof_done) {
      yy_eof_done = true;
    // do nothing, this is the downstream parser's job

    }
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   IOException  if any I/O-Error occurs
   */
  public String primGetNextToken() throws java.io.IOException {
    int yy_input;
    int yy_action;


    while (true) {

      yychar+= yylength();

      yy_action = -1;

      yy_currentPos = yy_startRead = yy_markedPos;

      yy_state = yy_lexical_state;


      yy_forAction: {
        while (true) {
    
          yy_input = yy_advance();

          if ( yy_input == YYEOF ) break yy_forAction;

          int yy_next = yytrans[ yy_rowMap[yy_state] + yycmap[yy_input] ];
          if (yy_next == -1) break yy_forAction;
          yy_state = yy_next;

          int yy_attributes = YY_ATTRIBUTE[yy_state];
          if ( (yy_attributes & 1) > 0 ) {
            yy_action = yy_state; 
            yy_markedPos = yy_currentPos; 
            if ( (yy_attributes & 8) > 0 ) break yy_forAction;
          }

        }
      }


      switch (yy_action) {    

        case 290: 
          { 
	if(Debug.debugTokenizer)
		dump("XSL processing instruction target");//$NON-NLS-1$
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 292: break;
        case 282: 
        case 284: 
        case 285: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCDATA start");//$NON-NLS-1$
	fStateStack.push(yystate());
	yybegin(ST_CDATA_TEXT);
	return XML_CDATA_OPEN;
 }
        case 293: break;
        case 275: 
          { 
	if(Debug.debugTokenizer)
		dump("element");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION);
	return XML_ELEMENT_DECLARATION;
 }
        case 294: break;
        case 274: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION);
	return XML_ATTLIST_DECLARATION;
 }
        case 295: break;
        case 273: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_DECLARATION);
	return XML_DOCTYPE_DECLARATION;
 }
        case 296: break;
        case 267: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_ID_PUBLIC);
	return XML_DOCTYPE_EXTERNAL_ID_PUBLIC;
 }
        case 297: break;
        case 266: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype external id");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_SYSTEM;
 }
        case 298: break;
        case 262: 
        case 272: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction target");//$NON-NLS-1$
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 299: break;
        case 236: 
          { 
	if(Debug.debugTokenizer)
		dump("\nCharRef");//$NON-NLS-1$
	return XML_CHAR_REFERENCE;
 }
        case 300: break;
        case 233: 
          { 
	if(Debug.debugTokenizer)
		dump("\ncomment start");//$NON-NLS-1$
	yybegin(ST_XML_COMMENT);
	return XML_COMMENT_OPEN;
 }
        case 301: break;
        case 214: 
        case 215: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction target");//$NON-NLS-1$
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 302: break;
        case 213: 
          { 
	if(Debug.debugTokenizer)
		dump("comment end");//$NON-NLS-1$
	yybegin(YYINITIAL);
	return XML_COMMENT_CLOSE;
 }
        case 303: break;
        case 212: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA end");//$NON-NLS-1$
	yybegin(fStateStack.pop());
	return XML_CDATA_CLOSE;
 }
        case 304: break;
        case 211: 
          { 
	if(Debug.debugTokenizer)
		dump("\nPEReference");//$NON-NLS-1$
	return XML_PE_REFERENCE;
 }
        case 305: break;
        case 208: 
          { 
	if(Debug.debugTokenizer)
		dump("\nEntityRef");//$NON-NLS-1$
	return XML_ENTITY_REFERENCE;
 }
        case 306: break;
        case 159: 
        case 173: 
        case 181: 
          { 
	return XML_DOCTYPE_INTERNAL_SUBSET;
 }
        case 307: break;
        case 147: 
          { 
        yybegin(YYINITIAL);
	if(Debug.debugTokenizer)
		dump("empty tag close");//$NON-NLS-1$
        return XML_EMPTY_TAG_CLOSE;
 }
        case 308: break;
        case 132: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction end");//$NON-NLS-1$
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 309: break;
        case 131: 
          { 
		// ended with nothing inside
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 310: break;
        case 127: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction end");//$NON-NLS-1$
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 311: break;
        case 119: 
          { 
	fStateStack.push(yystate());
	if(Debug.debugTokenizer)
		dump("\ndeclaration start");//$NON-NLS-1$
        yybegin(ST_XML_DECLARATION);
	return XML_DECLARATION_OPEN;
 }
        case 312: break;
        case 64: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_DHTML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 313: break;
        case 62: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction end");//$NON-NLS-1$
        yybegin(YYINITIAL);
        return XML_PI_CLOSE;
 }
        case 314: break;
        case 56: 
        case 58: 
        case 59: 
        case 60: 
        case 136: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute value");//$NON-NLS-1$
        yybegin(ST_XML_PI_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 315: break;
        case 55: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction '='");//$NON-NLS-1$
        yybegin(ST_XML_PI_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 316: break;
        case 54: 
          { 
	if(Debug.debugTokenizer)
		dump("XML processing instruction attribute name");//$NON-NLS-1$
        yybegin(ST_XML_PI_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 317: break;
        case 50: 
        case 51: 
        case 52: 
          { 
	// block scan until close is found
	return doScan("?>", false, XML_PI_CONTENT, ST_XML_PI_TAG_CLOSE, ST_XML_PI_TAG_CLOSE);
 }
        case 318: break;
        case 49: 
          { 
        yybegin(ST_PI_CONTENT);
        return WHITE_SPACE;
 }
        case 319: break;
        case 45: 
        case 46: 
        case 47: 
        case 48: 
        case 128: 
        case 129: 
        case 130: 
        case 216: 
        case 238: 
        case 239: 
        case 251: 
        case 252: 
        case 261: 
        case 271: 
        case 279: 
        case 283: 
        case 286: 
        case 287: 
        case 288: 
        case 289: 
          { 
	if(Debug.debugTokenizer)
		dump("processing instruction target");//$NON-NLS-1$
        yybegin(ST_PI_WS);
        return XML_TAG_NAME;
 }
        case 320: break;
        case 40: 
        case 41: 
          { 
	if(Debug.debugTokenizer)
		dump("comment content");//$NON-NLS-1$
	return scanXMLCommentText();
 }
        case 321: break;
        case 0: 
        case 31: 
        case 121: 
        case 123: 
        case 206: 
        case 207: 
        case 235: 
          { 
	if(Debug.debugTokenizer)
		dump("\nXML content");//$NON-NLS-1$
	return XML_CONTENT;
 }
        case 322: break;
        case 5: 
        case 8: 
        case 9: 
        case 10: 
        case 12: 
        case 13: 
        case 14: 
        case 15: 
        case 17: 
        case 18: 
        case 19: 
        case 20: 
        case 21: 
        case 22: 
        case 23: 
        case 24: 
        case 25: 
        case 26: 
        case 28: 
        case 44: 
          { 
	if(Debug.debugTokenizer)
		dump("white space");//$NON-NLS-1$
        return WHITE_SPACE;
 }
        case 323: break;
        case 16: 
        case 70: 
          { 
	if(Debug.debugTokenizer)
		dump("inappropriate tag name");//$NON-NLS-1$
	yybegin(YYINITIAL);
        return XML_CONTENT;
 }
        case 324: break;
        case 27: 
        case 105: 
        case 106: 
        case 192: 
        case 228: 
        case 247: 
        case 258: 
        case 268: 
        case 276: 
        case 280: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl contentspec");//$NON-NLS-1$
	return XML_ELEMENT_DECL_CONTENT;
 }
        case 325: break;
        case 29: 
        case 112: 
        case 113: 
        case 203: 
        case 232: 
        case 249: 
        case 259: 
        case 269: 
        case 277: 
        case 281: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist contentspec");//$NON-NLS-1$
	return XML_ATTLIST_DECL_CONTENT;
 }
        case 326: break;
        case 32: 
        case 71: 
        case 82: 
          { 
	if(Debug.debugTokenizer)
		dump("\nstart tag open");//$NON-NLS-1$
        yybegin(ST_XML_TAG_NAME);
        return XML_TAG_OPEN;
 }
        case 327: break;
        case 33: 
        case 34: 
        case 37: 
        case 38: 
        case 39: 
        case 42: 
        case 43: 
        case 53: 
        case 57: 
        case 61: 
        case 63: 
        case 67: 
        case 73: 
        case 79: 
        case 84: 
        case 85: 
        case 86: 
        case 87: 
        case 89: 
        case 90: 
        case 92: 
        case 97: 
        case 102: 
        case 109: 
          { 
	if (Debug.debugTokenizer)
		System.out.println("!!!unexpected!!!: \"" + yytext() + "\":" + //$NON-NLS-2$//$NON-NLS-1$
			yychar + "-" + (yychar + yylength()));//$NON-NLS-1$
	return UNDEFINED;
 }
        case 328: break;
        case 35: 
        case 36: 
          { 
	if(Debug.debugTokenizer)
		dump("CDATA text");//$NON-NLS-1$
	String blockContext = doBlockScan("]]>", XML_CDATA_TEXT, ST_CDATA_END);//$NON-NLS-1$
	if(blockContext == XML_CDATA_TEXT)
		yybegin(ST_CDATA_END);
	return blockContext;
 }
        case 329: break;
        case 65: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction '='");//$NON-NLS-1$
        yybegin(ST_DHTML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 330: break;
        case 66: 
        case 68: 
        case 69: 
        case 144: 
          { 
	if(Debug.debugTokenizer)
		dump("DHTML processing instruction attribute value");//$NON-NLS-1$
        yybegin(ST_DHTML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 331: break;
        case 72: 
          { 
	if(Debug.debugTokenizer)
		dump("tag close");//$NON-NLS-1$
	if(isBlockMarker()) {
        	yybegin(ST_BLOCK_TAG_SCAN);
	}
	else
        	yybegin(YYINITIAL);
        return XML_TAG_CLOSE;
 }
        case 332: break;
        case 74: 
        case 75: 
          { 
	if(Debug.debugTokenizer)
		dump("tag name");//$NON-NLS-1$
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_NAME;
 }
        case 333: break;
        case 76: 
          { 
	if(Debug.debugTokenizer)
		dump("attr name");//$NON-NLS-1$
        yybegin(ST_XML_EQUALS);
        return XML_TAG_ATTRIBUTE_NAME;
 }
        case 334: break;
        case 77: 
          { 
	if(Debug.debugTokenizer)
		dump("equals");//$NON-NLS-1$
        yybegin(ST_XML_ATTRIBUTE_VALUE);
        return XML_TAG_ATTRIBUTE_EQUALS;
 }
        case 335: break;
        case 78: 
        case 80: 
        case 81: 
        case 151: 
          { 
	if(Debug.debugTokenizer)
		dump("attr value");//$NON-NLS-1$
        yybegin(ST_XML_ATTRIBUTE_NAME);
        return XML_TAG_ATTRIBUTE_VALUE;
 }
        case 336: break;
        case 83: 
          { 
	if(Debug.debugTokenizer)
		dump("declaration end");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 337: break;
        case 88: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype type");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_EXTERNAL_ID);
	return XML_DOCTYPE_NAME;
 }
        case 338: break;
        case 91: 
        case 93: 
        case 94: 
        case 95: 
        case 165: 
        case 166: 
        case 169: 
        case 170: 
        case 223: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype public reference");//$NON-NLS-1$
	yybegin(ST_XML_DOCTYPE_ID_SYSTEM);
	return XML_DOCTYPE_EXTERNAL_ID_PUBREF;
 }
        case 339: break;
        case 96: 
        case 98: 
        case 99: 
        case 100: 
        case 177: 
          { 
	if(Debug.debugTokenizer)
		dump("doctype system reference");//$NON-NLS-1$
	yybegin(ST_XML_DECLARATION_CLOSE);
	return XML_DOCTYPE_EXTERNAL_ID_SYSREF;
 }
        case 340: break;
        case 101: 
        case 103: 
        case 104: 
        case 185: 
        case 186: 
        case 189: 
        case 190: 
        case 226: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl name");//$NON-NLS-1$
	yybegin(ST_XML_ELEMENT_DECLARATION_CONTENT);
	return XML_ELEMENT_DECL_NAME;
 }
        case 341: break;
        case 107: 
          { 
	if(Debug.debugTokenizer)
		dump("elementdecl close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 342: break;
        case 108: 
        case 110: 
        case 111: 
        case 196: 
        case 197: 
        case 200: 
        case 201: 
        case 230: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist name");//$NON-NLS-1$
	yybegin(ST_XML_ATTLIST_DECLARATION_CONTENT);
	return XML_ATTLIST_DECL_NAME;
 }
        case 343: break;
        case 114: 
          { 
	if(Debug.debugTokenizer)
		dump("attlist close");//$NON-NLS-1$
	if (Debug.debugTokenizer) {
		if(fStateStack.peek()!=YYINITIAL)
			System.out.println("end embedded region");//$NON-NLS-1$
	}
	yybegin(fStateStack.pop());
	return XML_DECLARATION_CLOSE;
 }
        case 344: break;
        case 117: 
          { 
	if(Debug.debugTokenizer)
		dump("\nend tag open");//$NON-NLS-1$
        yybegin(ST_XML_TAG_NAME);
        return XML_END_TAG_OPEN;
 }
        case 345: break;
        case 118: 
          { 
	if(Debug.debugTokenizer)
		dump("\nprocessing instruction start");//$NON-NLS-1$
	yybegin(ST_PI);
        return XML_PI_OPEN;
 }
        case 346: break;
        case 115: 
        case 116: 
          { 
		return doBlockTagScan();
	 }
        case 347: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            yy_do_eof();
              return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }    


}
