diff --git a/config/jflex/.gitignore b/config/jflex/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..37eca22b514d44efc70c028edb68a962aa8f5420 --- /dev/null +++ b/config/jflex/.gitignore @@ -0,0 +1 @@ +SmaliTokenMaker.java diff --git a/config/jflex/README.md b/config/jflex/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8ef7cefd1bfd17f3eb0f531374a1df78c7d3ffc5 --- /dev/null +++ b/config/jflex/README.md @@ -0,0 +1,5 @@ +Refer to the following instructions to modify and use to generate SmaliTokenMarker + +```shell +jflex SmaliTokenMaker.flex --skel skeleton.default +``` diff --git a/config/jflex/SmaliTokenMaker.flex b/config/jflex/SmaliTokenMaker.flex new file mode 100644 index 0000000000000000000000000000000000000000..fbb962c6c638465c3ef0d8f50785f18d3e663f7f --- /dev/null +++ b/config/jflex/SmaliTokenMaker.flex @@ -0,0 +1,681 @@ +/* + * Generated on 11/22/21, 8:58 PM + */ +package jadx.gui.ui.codeearea; + +import java.io.*; +import javax.swing.text.Segment; + +import org.fife.ui.rsyntaxtextarea.*; + + +/** + * 用于Smali代码高亮 + * MartinKay@qq.com + */ +%% + +%public +%class SmaliTokenMaker +%extends AbstractJFlexCTokenMaker +%unicode +/* Case sensitive */ +%type org.fife.ui.rsyntaxtextarea.Token + + +%{ + + + /** + * Constructor. This must be here because JFlex does not generate a + * no-parameter constructor. + */ + public SmaliTokenMaker() { + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + * @see #addToken(int, int, int) + */ + private void addHyperlinkToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start,end, tokenType, so, true); + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + */ + private void addToken(int tokenType) { + addToken(zzStartRead, zzMarkedPos-1, tokenType); + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + * @see #addHyperlinkToken(int, int, int) + */ + private void addToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start,end, tokenType, so, false); + } + + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param array The character array. + * @param start The starting offset in the array. + * @param end The ending offset in the array. + * @param tokenType The token's type. + * @param startOffset The offset in the document at which this token + * occurs. + * @param hyperlink Whether this token is a hyperlink. + */ + public void addToken(char[] array, int start, int end, int tokenType, + int startOffset, boolean hyperlink) { + super.addToken(array, start,end, tokenType, startOffset, hyperlink); + zzStartRead = zzMarkedPos; + } + + + /** + * {@inheritDoc} + */ + public String[] getLineCommentStartAndEnd(int languageIndex) { + return new String[] { "#", null }; + } + + + /** + * Returns the first token in the linked list of tokens generated + * from text. This method must be implemented by + * subclasses so they can correctly implement syntax highlighting. + * + * @param text The text from which to get tokens. + * @param initialTokenType The token type we should start with. + * @param startOffset The offset into the document at which + * text starts. + * @return The first Token in a linked list representing + * the syntax highlighted text. + */ + public Token getTokenList(Segment text, int initialTokenType, int startOffset) { + + resetTokenList(); + this.offsetShift = -text.offset + startOffset; + + // Start off in the proper state. + int state = Token.NULL; + switch (initialTokenType) { + /* No multi-line comments */ + /* No documentation comments */ + default: + state = Token.NULL; + } + + s = text; + try { + yyreset(zzReader); + yybegin(state); + return yylex(); + } catch (IOException ioe) { + ioe.printStackTrace(); + return new TokenImpl(); + } + + } + + + /** + * Refills the input buffer. + * + * @return true if EOF was reached, otherwise + * false. + */ + private boolean zzRefill() { + return zzCurrentPos>=s.offset+s.count; + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to YY_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(Reader reader) { + // 's' has been updated. + zzBuffer = s.array; + /* + * We replaced the line below with the two below it because zzRefill + * no longer "refills" the buffer (since the way we do it, it's always + * "full" the first time through, since it points to the segment's + * array). So, we assign zzEndRead here. + */ + //zzStartRead = zzEndRead = s.offset; + zzStartRead = s.offset; + zzEndRead = zzStartRead + s.count - 1; + zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset; + zzLexicalState = YYINITIAL; + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + } + + +%} + +Letter = [A-Za-z] +LetterOrUnderscore = ({Letter}|"_") +NonzeroDigit = [1-9] +Digit = ("0"|{NonzeroDigit}) +HexDigit = ({Digit}|[A-Fa-f]) +OctalDigit = ([0-7]) +AnyCharacterButApostropheOrBackSlash = ([^\\']) +AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n]) +EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit}) +Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter})) +NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\") +IdentifierStart = ({LetterOrUnderscore}|"$") +IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter})) + +LineTerminator = (\n) +WhiteSpace = ([ \t\f]+) + +CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\']) +UnclosedCharLiteral = ([\'][^\'\n]*) +ErrorCharLiteral = ({UnclosedCharLiteral}[\']) +StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"]) +UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?) +ErrorStringLiteral = ({UnclosedStringLiteral}[\"]) + +/* No multi-line comments */ +/* No documentation comments */ +LineCommentBegin = "#" + +IntegerLiteral = ({Digit}+) +HexLiteral = (0x{HexDigit}+) +FloatLiteral = (({Digit}+)("."{Digit}+)?(e[+-]?{Digit}+)? | ({Digit}+)?("."{Digit}+)(e[+-]?{Digit}+)?) +ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+) +BooleanLiteral = ("true"|"false") + +Separator = ([\(\)\{\}\[\]]) +Separator2 = ([\;,.]) + +Identifier = ({IdentifierStart}{IdentifierPart}*) + +URLGenDelim = ([:\/\?#\[\]@]) +URLSubDelim = ([\!\$&'\(\)\*\+,;=]) +URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~]) +URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%]) +URLCharacters = ({URLCharacter}*) +URLEndCharacter = ([\/\$]|{Letter}|{Digit}) +URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?) + + +/* Custom Regex */ +/* fully-qualified name Rules */ +SimpleName = ([a-zA-Z0-9_$]*) +QUALIFIED_TYPE_NAME = ("L"({SimpleName}{SLASH})*{SimpleName}*";") +/* Types */ +VOID_TYPE = ("V") +BOOLEAN_TYPE = ("Z") +BYTE_TYPE = ("B") +SHORT_TYPE = ("S") +CHAR_TYPE = ("C") +INT_TYPE = ("I") +LONG_TYPE = ("J") +FLOAT_TYPE = ("F") +DOUBLE_TYPE = ("D") +/* Multi Args Types Highlight */ +MULTI_ARGS_TYPES = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+); + +/* Types fully-qualified name */ +COMPOUND_METHOD_ARG_LITERAL = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+{QUALIFIED_TYPE_NAME}) + + +LBRACK = ("[") +RBRACK = ("]") +LPAREN = ("(") +RPAREN = (")") +LBRACE = ("{") +RBRACE = ("}") +COLON = (":") +ASSIGN = ("=") +DOT = (".") +SUB = ("-") +COMMA = (",") +SLASH = ("/") +LT = ("<") +GT = (">") +ARROW = ("->") +SEMI = (";") +ARROW_FUNCTION = ({ARROW}[a-zA-Z_$<>]*) +CustomSeparator = ({Separator}|{ARROW_FUNCTION}) + +/* Register */ +VREGISTER = ("v"("0"|[1-9])*) +PREGISTER = ("p"("0"|[1-9])*) + +/* Flags */ +FLAG_PSWITCH = (":pswitch_"{SimpleName}) +FLAG_PSWITCH_DATA = (":pswitch_data_"{SimpleName}) +FLAG_GOTO = (":goto_"{SimpleName}) +FLAG_COND = (":cond_"{SimpleName}) +FLAG_TRY_START = (":try_start_"{SimpleName}) +FLAG_TRY_END = (":try_end_"{SimpleName}) +FLAG_CATCH = (":catch_"{SimpleName}) +FLAG_CATCHALL = (":catchall_"{SimpleName}) +FLAG_ARRAY = (":array_"{SimpleName}) + +/* No string state */ +/* No char state */ +/* No MLC state */ +/* No documentation comment state */ +%state EOL_COMMENT + +%% + + { + + /* Keywords Instructions Highlight */ +"nop" | +"move" | +"move/from16" | +"move/16" | +"move-wide" | +"move-wide/from16" | +"move-wide/16" | +"move-object" | +"move-object/from16" | +"move-object/16" | +"move-result" | +"move-result-wide" | +"move-result-object" | +"move-exception" | +"return-void" | +"return" | +"return-wide" | +"return-object" | +"const/4" | +"const/16" | +"const" | +"const/high16" | +"const-wide/16" | +"const-wide/32" | +"const-wide" | +"const-wide/high16" | +"const-string" | +"const-string/jumbo" | +"const-class" | +"monitor-enter" | +"monitor-exit" | +"check-cast" | +"instance-of" | +"array-length" | +"new-instance" | +"new-array" | +"filled-new-array" | +"filled-new-array/range" | +"fill-array-data" | +"throw" | +"goto" | +"goto/16" | +"goto/32" | +"cmpl-float" | +"cmpg-float" | +"cmpl-double" | +"cmpg-double" | +"cmp-long" | +"if-eq" | +"if-ne" | +"if-lt" | +"if-ge" | +"if-gt" | +"if-le" | +"if-eqz" | +"if-nez" | +"if-ltz" | +"if-gez" | +"if-gtz" | +"if-lez" | +"aget" | +"aget-wide" | +"aget-object" | +"aget-boolean" | +"aget-byte" | +"aget-char" | +"aget-short" | +"aput" | +"aput-wide" | +"aput-object" | +"aput-boolean" | +"aput-byte" | +"aput-char" | +"aput-short" | +"iget" | +"iget-wide" | +"iget-object" | +"iget-boolean" | +"iget-byte" | +"iget-char" | +"iget-short" | +"iput" | +"iput-wide" | +"iput-object" | +"iput-boolean" | +"iput-byte" | +"iput-char" | +"iput-short" | +"sget" | +"sget-wide" | +"sget-object" | +"sget-boolean" | +"sget-byte" | +"sget-char" | +"sget-short" | +"sput" | +"sput-wide" | +"sput-object" | +"sput-boolean" | +"sput-byte" | +"sput-char" | +"sput-short" | +"invoke-virtual" | +"invoke-super" | +"invoke-direct" | +"invoke-static" | +"invoke-interface" | +"invoke-virtual/range" | +"invoke-super/range" | +"invoke-direct/range" | +"invoke-static/range" | +"invoke-interface/range" | +"neg-int" | +"not-int" | +"neg-long" | +"not-long" | +"neg-float" | +"neg-double" | +"int-to-long" | +"int-to-float" | +"int-to-double" | +"long-to-int" | +"long-to-float" | +"long-to-double" | +"float-to-int" | +"float-to-long" | +"float-to-double" | +"double-to-int" | +"double-to-long" | +"double-to-float" | +"int-to-byte" | +"int-to-char" | +"int-to-short" | +"add-int" | +"sub-int" | +"mul-int" | +"div-int" | +"rem-int" | +"and-int" | +"or-int" | +"xor-int" | +"shl-int" | +"shr-int" | +"ushr-int" | +"add-long" | +"sub-long" | +"mul-long" | +"div-long" | +"rem-long" | +"and-long" | +"or-long" | +"xor-long" | +"shl-long" | +"shr-long" | +"ushr-long" | +"add-float" | +"sub-float" | +"mul-float" | +"div-float" | +"rem-float" | +"add-double" | +"sub-double" | +"mul-double" | +"div-double" | +"rem-double" | +"add-int/2addr" | +"sub-int/2addr" | +"mul-int/2addr" | +"div-int/2addr" | +"rem-int/2addr" | +"and-int/2addr" | +"or-int/2addr" | +"xor-int/2addr" | +"shl-int/2addr" | +"shr-int/2addr" | +"ushr-int/2addr" | +"add-long/2addr" | +"sub-long/2addr" | +"mul-long/2addr" | +"div-long/2addr" | +"rem-long/2addr" | +"and-long/2addr" | +"or-long/2addr" | +"xor-long/2addr" | +"shl-long/2addr" | +"shr-long/2addr" | +"ushr-long/2addr" | +"add-float/2addr" | +"sub-float/2addr" | +"mul-float/2addr" | +"div-float/2addr" | +"rem-float/2addr" | +"add-double/2addr" | +"sub-double/2addr" | +"mul-double/2addr" | +"div-double/2addr" | +"rem-double/2addr" | +"add-int/lit16" | +"rsub-int" | +"mul-int/lit16" | +"div-int/lit16" | +"rem-int/lit16" | +"and-int/lit16" | +"or-int/lit16" | +"xor-int/lit16" | +"add-int/lit8" | +"rsub-int/lit8" | +"mul-int/lit8" | +"div-int/lit8" | +"rem-int/lit8" | +"and-int/lit8" | +"or-int/lit8" | +"xor-int/lit8" | +"shl-int/lit8" | +"shr-int/lit8" | +"ushr-int/lit8" | +"invoke-polymorphic" | +"invoke-polymorphic/range" | +"invoke-custom" | +"invoke-custom/range" | +"const-method-handle" | +"const-method-type" | +"packed-switch" | +"sparse-switch" { addToken(Token.FUNCTION); } + + /* Keywords Modifiers(IDENTIFIER标识符、修饰符) Highlight */ +"public" | +"private" | +"protected" | +"final" | +"annotation" | +"static" | +"synthetic" | +"constructor" | +"abstract" | +"enum" | +"interface" | +"transient" | +"bridge" | +"declared-synchronized" | +"volatile" | +"strictfp" | +"varargs" | +"native" { addToken(Token.RESERVED_WORD); } + + + + + /* Keywords Directives Highlight */ +".method" | +".end method" | +".implements" | +".class" | +".prologue" | +".source" | +".super" | +".field" | +".end field" | +".registers" | +".locals" | +".param" | +".line" | +".catch" | +".catchall" | +".annotation" | +".end annotation" | +".local" | +".end local" | +".restart local" | +".packed-switch" | +".end packed-switch" | +".array-data" | +".end array-data" | +".sparse-switch" | +".end sparse-switch" | +".end param" { addToken(Token.RESERVED_WORD_2); } + + + /* VARIABLE Register Highlight */ +{VREGISTER} | +{PREGISTER} { addToken(Token.VARIABLE); } + + + + /* Data types Highlight */ +{QUALIFIED_TYPE_NAME} | +{COMPOUND_METHOD_ARG_LITERAL} | +{MULTI_ARGS_TYPES} | +{QUALIFIED_TYPE_NAME} | +{VOID_TYPE} | +{BOOLEAN_TYPE} | +{BYTE_TYPE} | +{SHORT_TYPE} | +{CHAR_TYPE} | +{INT_TYPE} | +{LONG_TYPE} | +{FLOAT_TYPE} | +{DOUBLE_TYPE} { addToken(Token.DATA_TYPE); } + + /* FLAGS */ +{FLAG_PSWITCH} | +{FLAG_PSWITCH_DATA} | +{FLAG_GOTO} | +{FLAG_COND} | +{FLAG_TRY_START} | +{FLAG_TRY_END} | +{FLAG_CATCHALL} | +{FLAG_ARRAY} | +{FLAG_CATCH} { addToken(Token.MARKUP_TAG_NAME); } + + /* Functions */ + /* No functions */ + + {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); } + + {LineTerminator} { addNullToken(); return firstToken; } + + {Identifier} { addToken(Token.IDENTIFIER); } + + {WhiteSpace} { addToken(Token.WHITESPACE); } + + /* String/Character literals. */ + {CharLiteral} { addToken(Token.LITERAL_CHAR); } +{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; } +{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); } + {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); } +{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; } +{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); } + + /* Comment literals. */ + /* No multi-line comments */ + /* No documentation comments */ + {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); } + + /* Separators. */ + {CustomSeparator} { addToken(Token.SEPARATOR); } + {Separator2} { addToken(Token.IDENTIFIER); } + + /* Operators. */ +"!" | +";" | +"." | +"=" | +"/" | +"'" | +"(" | +")" | +"," | +"->" | +";->" | +"<" | +">" | +"@" | +"[" | +"]" | +"{" | +"}" { addToken(Token.OPERATOR); } + + /* Numbers */ + {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); } + {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); } + {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); } + {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); } + + /* Ended with a line not in a string or comment. */ + <> { addNullToken(); return firstToken; } + + /* Catch any other (unhandled) characters. */ + . { addToken(Token.IDENTIFIER); } + +} + + +/* No char state */ + +/* No string state */ + +/* No multi-line comment state */ + +/* No documentation comment state */ + + { + [^hwf\n]+ {} + {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; } + [hwf] {} + \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; } + <> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; } +} + diff --git a/config/jflex/skeleton.default b/config/jflex/skeleton.default new file mode 100644 index 0000000000000000000000000000000000000000..c8ad3fef66acdadfa9949dac6ea26c85989ac8d0 --- /dev/null +++ b/config/jflex/skeleton.default @@ -0,0 +1,243 @@ + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ +--- private static final int ZZ_BUFFERSIZE = ...; + + /** lexical states */ +--- lexical states, charmap + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + +--- isFinal list + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** 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; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + +--- user class code + + /** + * 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. + */ +--- constructor declaration + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ +--- zzScanError declaration + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + +--- throws clause + } + + + /** + * 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()! + */ +--- yypushback decl (contains zzScanError exception) + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + +--- zzDoEOF + /** + * 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 java.io.IOException if any I/O-Error occurs + */ +--- yylex declaration + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + +--- local declarations + + while (true) { + zzMarkedPosL = zzMarkedPos; + +--- start admin (line, char, col count) + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + +--- start admin (lexstate etc) + + zzForAction: { + while (true) { + +--- next input, line, col, char count, next transition, isFinal action + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; +--- line count update + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; +--- char count update + +--- actions + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; +--- eofvalue + } + else { +--- no match + } + } + } + } + +--- main + +} diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java index 151bc3e5002349654f97decdd607cafc8ea4acd7..584b54a21d800d6caf94555a3b464da1a1791544 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java @@ -6,6 +6,9 @@ import java.awt.Point; import javax.swing.JTabbedPane; import javax.swing.border.EmptyBorder; +import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory; +import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; + import jadx.gui.treemodel.JNode; import jadx.gui.ui.TabbedPane; import jadx.gui.ui.panel.IViewStateSupport; @@ -29,6 +32,10 @@ public final class ClassCodeContentPanel extends AbstractCodeContentPanel implem public ClassCodeContentPanel(TabbedPane panel, JNode jnode) { super(panel, jnode); + // FIXME I don't know the project very well, so need to get the right place + AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance(); + atmf.putMapping("text/smali", "jadx.gui.ui.codearea.SmaliTokenMaker"); + javaCodePanel = new CodePanel(new CodeArea(this)); smaliCodePanel = new CodePanel(new SmaliArea(this)); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java index 6fbbde0340725ffefe1a9c0423eb62dfee93f9ad..e320f83670d852c8ef1ce0c3cf1e1c8922ee0eba 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java @@ -162,7 +162,7 @@ public final class SmaliArea extends AbstractCodeArea { public NormalModel() { Theme theme = getContentPanel().getTabbedPane().getMainWindow().getEditorTheme(); setSyntaxScheme(theme.scheme); - setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); + setSyntaxEditingStyle("text/smali"); } @Override diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java new file mode 100644 index 0000000000000000000000000000000000000000..b52ac88c9787c03567f90a015b08cd3e172ac361 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java @@ -0,0 +1,1678 @@ +/* The following code was generated by JFlex */ + +package jadx.gui.ui.codearea; + +import java.io.*; + +import javax.swing.text.Segment; + +import org.fife.ui.rsyntaxtextarea.*; + +/** + * 用于Smali代码高亮 + * MartinKay@qq.com + */ + +@SuppressWarnings("checkstyle:all") +public class SmaliTokenMaker extends AbstractJFlexCTokenMaker { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int EOL_COMMENT = 1; + public static final int YYINITIAL = 0; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\21\1\10\1\0\1\21\1\17\22\0\1\77\1\54\1\15" + + "\1\20\1\1\1\35\1\35\1\7\1\37\1\37\1\35\1\40\1\35" + + "\1\25\1\23\1\41\1\4\1\66\1\16\1\72\1\71\1\6\1\67" + + "\1\6\1\76\1\3\1\45\1\50\1\55\1\54\1\56\1\35\1\36" + + "\1\5\1\53\1\53\1\53\1\5\1\53\2\1\1\52\1\52\1\1" + + "\1\47\6\1\1\52\2\1\1\51\3\1\1\52\1\37\1\11\1\37" + + "\1\17\1\2\1\0\1\31\1\14\1\60\1\61\1\24\1\30\1\62" + + "\1\42\1\44\1\70\1\73\1\32\1\65\1\13\1\63\1\43\1\74" + + "\1\27\1\33\1\26\1\12\1\57\1\46\1\22\1\64\1\75\1\34" + + "\1\17\1\34\1\35\uff81\0"; + + /** + * Translates characters to character classes + */ + private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int[] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\2\0\2\1\2\2\1\3\1\4\3\1\1\5\1\6" + + "\1\7\12\1\1\10\1\11\1\12\4\1\2\13\1\12" + + "\5\1\1\14\1\15\3\14\1\0\1\16\1\0\2\16" + + "\1\3\1\17\1\0\1\3\5\1\2\5\1\20\1\21" + + "\12\0\1\1\1\10\23\1\1\12\5\1\6\0\1\13" + + "\1\0\15\1\5\0\1\21\1\0\1\22\1\3\1\23" + + "\2\3\1\17\1\3\5\1\1\24\1\1\1\5\1\25" + + "\1\5\20\0\35\1\7\0\10\1\1\0\2\1\5\0" + + "\1\3\2\0\1\1\1\0\1\1\1\5\22\0\1\26" + + "\1\27\3\1\1\0\7\1\1\24\1\1\1\0\2\1" + + "\1\0\6\1\1\0\2\1\11\0\4\1\1\0\3\1" + + "\1\24\2\0\1\1\1\24\2\0\1\30\1\0\1\3" + + "\6\0\1\1\1\5\6\0\1\31\13\0\2\1\3\0" + + "\2\1\1\0\3\1\3\0\2\1\1\0\6\1\1\0" + + "\2\1\1\24\5\0\3\1\1\24\1\0\2\1\3\0" + + "\1\1\5\0\1\3\6\0\1\5\7\0\1\31\4\0" + + "\1\31\1\1\1\24\4\0\1\1\1\0\2\1\10\0" + + "\1\1\1\0\3\1\1\0\2\1\1\24\3\0\1\32" + + "\2\1\2\0\1\1\1\0\2\1\3\0\1\24\1\1" + + "\23\0\1\1\7\0\2\1\10\0\1\24\1\1\1\24" + + "\1\0\2\1\1\0\1\1\11\0\1\1\1\0\1\1" + + "\2\0\1\1\22\0\1\24\3\0\1\1\12\0\1\1" + + "\1\0\1\1\15\0\1\1\1\0\1\1\25\0\1\1" + + "\22\0\1\1\10\0\1\24\26\0\1\24\2\0\1\1" + + "\35\0\1\24\3\0\1\24\6\0\1\24\50\0\1\26"; + + private static int[] zzUnpackAction() { + int[] result = new int[701]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do + result[j++] = value; + while (--count > 0); + } + return j; + } + + /** + * Translates a state to a row index in the transition table + */ + private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\100\0\200\0\300\0\u0100\0\u0140\0\u0180\0\200" + + "\0\u01c0\0\u0200\0\u0240\0\u0280\0\200\0\u02c0\0\u0300\0\u0340" + + "\0\u0380\0\u03c0\0\u0400\0\u0440\0\u0480\0\u04c0\0\u0500\0\u0540" + + "\0\200\0\200\0\u0580\0\u05c0\0\u0600\0\u0640\0\u0680\0\300" + + "\0\u06c0\0\u0700\0\u0740\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880" + + "\0\200\0\u08c0\0\u0900\0\u0940\0\u0980\0\u09c0\0\u0a00\0\u0a40" + + "\0\u0a80\0\u0ac0\0\200\0\u0b00\0\u0b40\0\u0b80\0\u0bc0\0\u0c00" + + "\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\200\0\u0d40\0\u0d80\0\u0dc0" + + "\0\u0e00\0\u0e40\0\u0e80\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0" + + "\0\u1000\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0" + + "\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340\0\u1380\0\u13c0" + + "\0\u1400\0\u1440\0\u1480\0\u14c0\0\u1500\0\u1540\0\u1580\0\u15c0" + + "\0\u1600\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0" + + "\0\u1800\0\200\0\u1840\0\u06c0\0\u1880\0\u18c0\0\u1900\0\u1940" + + "\0\u1980\0\u19c0\0\u1a00\0\u1a40\0\u1a80\0\u1ac0\0\u1b00\0\u1b40" + + "\0\u1b80\0\u1bc0\0\u1c00\0\u1c40\0\u1c80\0\u1cc0\0\u1d00\0\u0a80" + + "\0\u1d40\0\200\0\u1d80\0\u1dc0\0\u0b00\0\u1e00\0\u1e40\0\u1e80" + + "\0\u1ec0\0\u1f00\0\u1f40\0\300\0\u1f80\0\u1fc0\0\200\0\u2000" + + "\0\u2040\0\u2080\0\u20c0\0\u2100\0\u2140\0\u2180\0\u21c0\0\u2200" + + "\0\u2240\0\u2280\0\u22c0\0\u2300\0\u2340\0\u2380\0\u23c0\0\u2400" + + "\0\u2440\0\u2480\0\u24c0\0\u2500\0\u2540\0\u2580\0\u25c0\0\u2600" + + "\0\u2640\0\u2680\0\u26c0\0\u2700\0\u2740\0\u2780\0\u27c0\0\u2800" + + "\0\u2840\0\u2880\0\u28c0\0\u2900\0\u2940\0\u2980\0\u29c0\0\u2a00" + + "\0\u2a40\0\u2a80\0\u2ac0\0\u2b00\0\u2b40\0\u2b80\0\u2bc0\0\u2c00" + + "\0\u2c40\0\u2c80\0\u2cc0\0\u2d00\0\u2d40\0\u2d80\0\u2dc0\0\u2e00" + + "\0\u2e40\0\u2e80\0\u2ec0\0\u2f00\0\u2f40\0\u2f80\0\u2fc0\0\u3000" + + "\0\u3040\0\u3080\0\u30c0\0\u3100\0\u3140\0\u3180\0\u31c0\0\u3200" + + "\0\u3240\0\u3280\0\u32c0\0\u3300\0\u3340\0\u3380\0\u33c0\0\u3400" + + "\0\u3440\0\u3480\0\u34c0\0\u3500\0\u3540\0\u3580\0\u35c0\0\u3600" + + "\0\u3640\0\u3680\0\u36c0\0\u3700\0\u3740\0\300\0\300\0\u3780" + + "\0\u37c0\0\u3800\0\u3840\0\u3880\0\u38c0\0\u3900\0\u3940\0\u3980" + + "\0\u39c0\0\u3a00\0\u3a40\0\u3a80\0\u3ac0\0\u3b00\0\u3b40\0\u3b80" + + "\0\u3bc0\0\u3c00\0\u3c40\0\u3c80\0\u3cc0\0\u3d00\0\u3d40\0\u3d80" + + "\0\u3dc0\0\u3e00\0\u3e40\0\u3e80\0\u3ec0\0\u3f00\0\u3f40\0\u3f80" + + "\0\u3fc0\0\u4000\0\u4040\0\u4080\0\u40c0\0\u4100\0\u4140\0\u4180" + + "\0\u41c0\0\u4200\0\u4240\0\u4280\0\u42c0\0\u4300\0\u4340\0\u4380" + + "\0\u43c0\0\u4400\0\u4440\0\u4480\0\u44c0\0\u4500\0\u4540\0\u4580" + + "\0\u45c0\0\u4600\0\u4640\0\u4680\0\u46c0\0\u4700\0\u4740\0\u4780" + + "\0\u47c0\0\u4800\0\200\0\u4840\0\u4880\0\u48c0\0\u4900\0\u4940" + + "\0\u4980\0\u49c0\0\u4a00\0\u4a40\0\u4a80\0\u4ac0\0\u4b00\0\u4b40" + + "\0\u4b80\0\u4bc0\0\u4c00\0\u4c40\0\u4c80\0\u4cc0\0\u4d00\0\u4d40" + + "\0\u4d80\0\u4dc0\0\u4e00\0\u4e40\0\u4e80\0\u4ec0\0\u4f00\0\u4f40" + + "\0\u4f80\0\u4fc0\0\u5000\0\u5040\0\u5080\0\u50c0\0\u5100\0\u5140" + + "\0\u5180\0\u51c0\0\u5200\0\u5240\0\u5280\0\u52c0\0\u5300\0\u5340" + + "\0\u5380\0\u53c0\0\u5400\0\u5440\0\u5480\0\u54c0\0\u5500\0\u5540" + + "\0\u5580\0\u55c0\0\u5600\0\u5640\0\u4400\0\u5680\0\u56c0\0\u5700" + + "\0\u5740\0\u5780\0\u57c0\0\u5800\0\u5840\0\u5880\0\u58c0\0\u5900" + + "\0\u5940\0\u5980\0\u59c0\0\u5a00\0\u5a40\0\u4a80\0\u5a80\0\u5ac0" + + "\0\u5b00\0\u5b40\0\u5b80\0\u5bc0\0\u5c00\0\u5c40\0\u5c80\0\u5cc0" + + "\0\u5d00\0\u5d40\0\u5d80\0\u5dc0\0\u5e00\0\u5e40\0\u5e80\0\u5ec0" + + "\0\u5f00\0\u5f40\0\u5f80\0\u5fc0\0\u6000\0\u6040\0\u6080\0\u60c0" + + "\0\u6100\0\u6140\0\u6180\0\u61c0\0\u6200\0\200\0\u6240\0\u6280" + + "\0\u62c0\0\u6300\0\u6340\0\u6380\0\u63c0\0\u6400\0\u6440\0\u6480" + + "\0\u64c0\0\u6500\0\u6540\0\u6580\0\u65c0\0\u6600\0\u6640\0\u6680" + + "\0\u66c0\0\u6700\0\u6740\0\u6780\0\u67c0\0\u6800\0\u6840\0\u6880" + + "\0\u68c0\0\u6900\0\u6940\0\u6980\0\u69c0\0\u6a00\0\u6a40\0\u6a80" + + "\0\u6ac0\0\u6b00\0\u6b40\0\u6b80\0\u6bc0\0\u6c00\0\u6c40\0\u6c80" + + "\0\u6cc0\0\u6d00\0\u6d40\0\u6d80\0\u6dc0\0\u6e00\0\u6e40\0\u6e80" + + "\0\u6ec0\0\u6f00\0\u6f40\0\u6f80\0\u6fc0\0\u7000\0\u7040\0\u7080" + + "\0\u70c0\0\u7100\0\u7140\0\u7180\0\u71c0\0\u7200\0\u7240\0\u7280" + + "\0\u72c0\0\u7300\0\u7340\0\u7380\0\u73c0\0\u7400\0\u7440\0\u7480" + + "\0\u74c0\0\u7500\0\u7540\0\u7580\0\u75c0\0\u7600\0\u7640\0\u7680" + + "\0\u76c0\0\u7700\0\u7740\0\u7780\0\u77c0\0\u7800\0\u7840\0\u7880" + + "\0\u78c0\0\u7900\0\u7940\0\u7980\0\u79c0\0\u7a00\0\u7a40\0\u7a80" + + "\0\u7ac0\0\u7b00\0\u7b40\0\u7b80\0\u7bc0\0\u7c00\0\u7c40\0\u7c80" + + "\0\u7cc0\0\u7d00\0\u7d40\0\u7d80\0\u7dc0\0\u7e00\0\u7e40\0\u7e80" + + "\0\u7ec0\0\u7f00\0\u7f40\0\u7f80\0\u7fc0\0\u8000\0\u8040\0\u8080" + + "\0\u80c0\0\u8100\0\u8140\0\u8180\0\u81c0\0\u8200\0\u8240\0\u8280" + + "\0\u82c0\0\u8300\0\u8340\0\u8380\0\u83c0\0\u8400\0\u8440\0\u8480" + + "\0\u84c0\0\u8500\0\u8540\0\u8580\0\u85c0\0\u8600\0\u8640\0\u8680" + + "\0\u86c0\0\u8700\0\u8740\0\u8780\0\u87c0\0\u8800\0\u8840\0\u8880" + + "\0\u88c0\0\u8900\0\u8940\0\u8980\0\u89c0\0\u8a00\0\u8a40\0\u8a80" + + "\0\u8ac0\0\u8b00\0\u8b40\0\u8b80\0\u8bc0\0\u8c00\0\u8c40\0\u8c80" + + "\0\u8cc0\0\u8d00\0\u8d40\0\u8d80\0\u8dc0\0\u8e00\0\u8e40\0\u8e80" + + "\0\u8ec0\0\u8f00\0\u8f40\0\u8f80\0\u8fc0\0\u9000\0\u9040\0\u9080" + + "\0\u90c0\0\u9100\0\u9140\0\u9180\0\u91c0\0\u9200\0\u9240\0\u9280" + + "\0\u92c0\0\u9300\0\u9340\0\u9380\0\u93c0\0\u9400\0\u9440\0\u9480" + + "\0\u94c0\0\u9500\0\u9540\0\u9580\0\u95c0\0\u9600\0\u9640\0\u9680" + + "\0\u96c0\0\u9700\0\u9740\0\u9780\0\u97c0\0\u9800\0\u9840\0\u9880" + + "\0\u98c0\0\u9900\0\u9940\0\u9980\0\u99c0\0\u9a00\0\u9a40\0\u9a80" + + "\0\u9ac0\0\u9b00\0\u9b40\0\u9b80\0\u9bc0\0\u9c00\0\u9c40\0\u9c80" + + "\0\u9cc0\0\u9d00\0\u9d40\0\u9d80\0\u9dc0\0\u9e00\0\u9e40\0\u9e80" + + "\0\u9ec0\0\u9f00\0\u9f40\0\u9f80\0\u9fc0\0\ua000\0\ua040\0\ua080" + + "\0\ua0c0\0\ua100\0\ua140\0\ua180\0\ua1c0\0\ua200\0\ua240\0\ua280" + + "\0\ua2c0\0\ua300\0\ua340\0\ua380\0\ua3c0\0\ua400\0\ua440\0\ua480" + + "\0\ua4c0\0\ua500\0\ua540\0\ua580\0\ua5c0\0\ua600\0\ua640\0\ua680" + + "\0\ua6c0\0\ua700\0\ua740\0\ua780\0\ua7c0\0\ua800\0\ua840\0\ua880" + + "\0\ua8c0\0\ua900\0\ua940\0\ua980\0\200"; + + private static int[] zzUnpackRowMap() { + int[] result = new int[701]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int[] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\3\2\4\1\5\1\6\1\4\1\5\1\7\1\10" + + "\1\3\1\11\1\12\1\13\1\14\1\5\1\3\1\15" + + "\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25" + + "\1\26\1\27\1\30\1\31\1\3\1\32\1\31\1\3" + + "\1\32\1\4\1\33\1\34\1\35\1\4\1\36\1\37" + + "\1\40\2\41\3\32\1\42\1\43\1\44\1\45\1\46" + + "\1\4\1\47\2\5\1\4\2\5\3\4\1\5\1\16" + + "\10\50\1\51\17\50\1\52\11\50\1\53\3\50\1\54" + + "\31\50\101\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\1\0\3\56" + + "\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" + + "\1\56\1\0\1\56\1\57\1\60\1\0\6\56\2\0" + + "\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" + + "\7\56\2\5\1\56\2\5\3\56\1\5\1\0\3\56" + + "\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" + + "\1\56\1\0\1\61\1\57\1\60\1\0\6\56\2\0" + + "\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" + + "\7\56\2\5\1\56\2\5\3\56\1\5\1\0\7\62" + + "\1\63\1\64\1\65\66\62\1\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\5\4\1\66\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\67\1\0\3\4\1\70" + + "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\4\4\1\71\13\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" + + "\1\72\4\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\1\0\10\14\1\73\1\74\3\14\1\75" + + "\62\14\21\0\1\16\55\0\1\16\1\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\4\4\1\46\13\4\4\0\2\76\1\0\1\76" + + "\7\0\1\76\5\0\1\77\2\0\1\100\1\101\1\102" + + "\1\103\1\104\7\0\1\105\1\106\13\0\1\107\4\0" + + "\1\110\2\76\1\0\2\76\3\0\1\76\2\0\6\4" + + "\2\0\1\55\1\4\1\111\1\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\57\0\1\112\22\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\4\1\113\4\4\6\0\1\114" + + "\2\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\115\1\0\5\4\1\116\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\3\4\1\117\1\120\1\4\6\0\2\4\1\121" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\1\4\1\122\1\123\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\4\1\124\4\4\6\0" + + "\1\4\1\125\1\4\1\0\2\4\1\0\3\4\3\0" + + "\2\4\1\126\1\127\14\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\4\4\1\130\13\4\2\0\6\4\2\0\1\55\1\131" + + "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\1\132\5\4\6\0\1\133\1\134\1\4\1\0\2\4" + + "\1\0\3\4\3\0\3\4\1\127\1\4\1\135\12\4" + + "\2\0\2\4\2\136\1\4\1\136\2\0\1\55\1\137" + + "\2\4\1\0\1\136\3\0\1\4\1\0\1\4\1\0" + + "\1\4\1\140\1\4\1\141\2\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\7\4\2\136\1\4\2\136" + + "\3\4\1\136\2\0\6\4\2\0\1\55\1\4\1\142" + + "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\2\4\1\143\3\4\6\0\1\4\1\125\1\4\1\0" + + "\2\4\1\0\3\4\3\0\3\4\1\127\14\4\27\0" + + "\1\144\2\0\1\145\11\0\1\146\14\0\1\147\1\0" + + "\1\150\16\0\6\36\2\0\1\55\3\36\1\0\1\36" + + "\3\0\1\36\1\0\1\36\1\0\6\36\5\0\1\151" + + "\3\36\1\0\2\36\1\152\3\36\3\0\20\36\26\0" + + "\1\153\53\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\1\4\1\36\1\152\1\4\2\154\3\0\20\4" + + "\2\0\2\4\2\136\1\4\1\136\2\0\1\55\3\4" + + "\1\0\1\136\3\0\1\4\1\0\1\4\1\0\3\4" + + "\1\155\2\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\4\4\1\156\2\4\2\136\1\4\2\136\3\4" + + "\1\136\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\157" + + "\2\4\1\0\2\4\1\0\3\4\3\0\4\4\1\160" + + "\1\4\1\161\11\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\162\1\0\6\4" + + "\6\0\2\4\1\163\1\0\2\4\1\0\3\4\3\0" + + "\4\4\1\164\13\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\4\4" + + "\1\165\13\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\1\4\1\166" + + "\4\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\1\167\2\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\4\4\1\170" + + "\13\4\1\0\10\50\1\0\17\50\1\0\11\50\1\0" + + "\3\50\1\0\31\50\26\0\1\171\15\0\1\172\61\0" + + "\1\173\117\0\1\174\43\0\1\175\65\0\7\56\2\0" + + "\4\56\1\0\1\56\1\0\1\56\1\0\1\56\1\0" + + "\1\56\1\0\6\56\2\0\1\56\3\0\3\56\1\0" + + "\2\56\1\0\3\56\3\0\20\56\4\0\2\76\1\0" + + "\1\76\7\0\1\76\47\0\2\76\1\0\2\76\3\0" + + "\1\76\1\0\3\56\2\176\1\56\1\176\2\0\4\56" + + "\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" + + "\1\177\6\56\2\0\1\56\1\0\1\177\1\0\3\56" + + "\1\0\2\56\1\0\3\56\3\0\7\56\2\176\1\56" + + "\2\176\3\56\1\176\1\0\3\56\4\200\2\0\3\56" + + "\1\200\1\0\1\200\1\0\1\56\1\0\1\56\1\0" + + "\1\200\1\0\2\56\2\200\2\56\2\0\1\56\3\0" + + "\3\56\1\0\2\56\1\0\2\56\1\200\3\0\1\56" + + "\2\200\4\56\2\200\1\56\2\200\3\56\1\200\1\0" + + "\7\201\1\202\1\0\67\201\7\0\1\202\70\0\4\201" + + "\1\203\1\201\1\204\1\205\1\0\1\62\1\206\3\62" + + "\1\203\7\201\3\62\35\201\1\203\1\204\1\201\1\204" + + "\1\203\5\201\1\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\1\207\2\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\1\210\1\4\1\0\3\4\3\0\3\4\1\211\14\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\212\5\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\213\5\4\6\0\1\4\1\214\1\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\2\4\1\215\1\0\2\4" + + "\1\0\3\4\3\0\20\4\1\0\11\73\1\216\3\73" + + "\1\217\66\73\1\14\1\73\2\14\1\0\1\14\1\220" + + "\4\14\7\73\3\14\35\73\2\14\1\73\2\14\5\73" + + "\3\56\2\76\1\56\1\76\2\0\4\56\1\0\1\76" + + "\1\0\1\56\1\0\1\56\1\0\1\60\1\0\6\56" + + "\2\0\1\56\3\0\3\56\1\0\2\56\1\0\3\56" + + "\3\0\7\56\2\76\1\56\2\76\3\56\1\76\14\0" + + "\1\221\110\0\1\222\117\0\1\223\46\0\1\224\13\0" + + "\1\225\114\0\1\226\16\0\1\227\26\0\1\230\30\0" + + "\1\231\17\0\1\232\43\0\1\233\1\0\1\234\133\0" + + "\1\235\43\0\1\236\1\237\71\0\1\240\54\0\6\4" + + "\2\0\1\55\1\241\2\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\2\112\2\0\1\112" + + "\4\0\3\112\5\0\1\112\1\0\1\112\1\0\6\112" + + "\6\0\3\112\1\0\2\112\1\0\3\112\1\0\11\112" + + "\2\0\1\112\2\0\3\112\3\0\6\4\2\0\1\55" + + "\1\242\2\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\3\4\1\243\2\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\1\4\1\244\4\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\245" + + "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\6\4\1\246\11\4\2\0\6\4\2\0\1\55\1\247" + + "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\4\4\1\250\1\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\4\4\1\251\13\4\2\0" + + "\6\4\2\0\1\55\1\4\1\252\1\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\4\4\1\253\1\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\1\4\1\254\1\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\166" + + "\15\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\5\4\1\255\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\4\1\256\4\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\1\257\2\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\2\4\1\246\15\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\257\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\1\4\1\260\1\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\2\4\1\261\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\1\4\1\262\1\4\1\263\2\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\4\1\264\2\4\1\264\1\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\1\257\2\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\3\4\1\265\2\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\1\4\1\266\1\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\2\4" + + "\2\136\1\4\1\136\2\0\1\55\3\4\1\0\1\136" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\7\4\2\136\1\4" + + "\2\136\3\4\1\136\2\0\6\4\2\0\1\55\2\4" + + "\1\267\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" + + "\1\270\1\0\2\4\1\0\3\4\3\0\4\4\1\271" + + "\13\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\1\4\1\272\16\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\273\4\4\1\274\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\1\275\17\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\276\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\30\0\1\277\77\0" + + "\1\300\103\0\1\301\75\0\1\302\31\0\1\303\77\0" + + "\1\304\15\0\6\151\3\0\3\151\1\0\1\151\3\0" + + "\1\151\1\0\1\151\1\0\6\151\5\0\4\151\1\0" + + "\2\151\1\152\3\151\3\0\20\151\57\0\1\32\22\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\4\1\305\4\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\4\4\1\306\1\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\307" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\310" + + "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\4" + + "\1\311\1\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\1\4\1\312\16\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\1\246\17\4\2\0\6\4\2\0" + + "\1\55\1\313\2\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\314" + + "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\315\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\4\4\1\246\1\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\1\4\1\316\1\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\1\317\17\4\44\0\1\320\66\0" + + "\1\321\73\0\1\322\117\0\1\323\34\0\4\324\5\0" + + "\1\324\1\0\1\324\5\0\1\324\3\0\2\324\21\0" + + "\1\324\4\0\2\324\4\0\2\324\1\0\2\324\3\0" + + "\1\324\1\0\3\56\2\176\1\56\1\176\2\0\4\56" + + "\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" + + "\1\0\6\56\2\0\1\56\3\0\3\56\1\0\2\56" + + "\1\0\3\56\3\0\7\56\2\176\1\56\2\176\3\56" + + "\1\176\4\0\2\176\1\0\1\176\7\0\1\176\47\0" + + "\2\176\1\0\2\176\3\0\1\176\1\0\7\201\1\63" + + "\1\0\73\201\1\204\1\201\1\204\1\202\1\0\5\201" + + "\1\204\47\201\2\204\1\201\2\204\11\201\1\62\1\201" + + "\1\62\1\202\1\0\5\201\1\62\47\201\2\62\1\201" + + "\2\62\10\201\4\325\1\63\1\0\3\201\1\325\1\201" + + "\1\325\5\201\1\325\3\201\2\325\21\201\1\325\4\201" + + "\2\325\4\201\2\325\1\201\2\325\3\201\1\325\1\201" + + "\1\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\4\1\264\4\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\326\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\327" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" + + "\1\330\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\331\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\2\4\1\332\15\4\1\0\10\73\1\0\72\73\4\333" + + "\2\73\1\216\2\73\1\333\1\217\1\333\5\73\1\333" + + "\3\73\2\333\21\73\1\333\4\73\2\333\4\73\2\333" + + "\1\73\2\333\3\73\1\333\1\73\61\0\1\334\51\0" + + "\1\335\26\0\1\336\41\0\1\337\66\0\1\340\113\0" + + "\1\341\63\0\1\342\144\0\1\343\62\0\1\344\65\0" + + "\1\345\60\0\1\346\150\0\1\347\43\0\1\350\30\0" + + "\1\351\62\0\1\352\62\0\1\353\102\0\1\354\74\0" + + "\1\355\52\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\6\4\1\356\11\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\357\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\1\4\1\360\1\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\4\4\1\361\13\4\2\0\6\4\2\0\1\55\1\362" + + "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\363\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\2\4\1\364\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\5\4\1\242\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\365" + + "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\3\4\1\366\2\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\4\4\1\367\1\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\4\4\1\370\13\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\371\5\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\3\4\1\372\2\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\373" + + "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\3\4\1\374\14\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\375\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\2\4\1\376\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\377" + + "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\u0100\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\4\1\u0101\4\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\1\u0102\5\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\4\4" + + "\1\377\1\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\1\u0103\17\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\u0104\5\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\14\4\1\u0105\3\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0106" + + "\1\u0107\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\1\u0108\5\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\4\4\1\u0109\13\4\14\0" + + "\1\u010a\10\0\1\u010b\5\0\1\u010c\27\0\1\u010c\101\0" + + "\1\u010d\42\0\1\u010e\116\0\1\u010f\57\0\1\u0110\64\0" + + "\1\u0111\112\0\1\u0112\52\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\3\4" + + "\1\u0113\2\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\u0114" + + "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\1\4\1\u0115\16\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\5\4\1\u0116\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\u0117\4\4\1\u0118\1\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\3\4\1\u0118\14\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\4\4\1\u0119\1\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\2\4\1\u011a\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\4\4\1\u011b\13\4\33\0\1\u011c\11\0\1\u011d\34\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\2\4\1\u011e\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u011f" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\46\0\1\u0120\56\0\1\320\116\0\1\u0121" + + "\57\0\1\u0122\57\0\4\u0123\5\0\1\u0123\1\0\1\u0123" + + "\5\0\1\u0123\3\0\2\u0123\21\0\1\u0123\4\0\2\u0123" + + "\4\0\2\u0123\1\0\2\u0123\3\0\1\u0123\1\0\3\201" + + "\4\u0124\1\63\1\0\3\201\1\u0124\1\201\1\u0124\5\201" + + "\1\u0124\3\201\2\u0124\21\201\1\u0124\4\201\2\u0124\4\201" + + "\2\u0124\1\201\2\u0124\3\201\1\u0124\1\201\31\0\1\u0125" + + "\12\0\1\u0126\63\0\1\u0127\1\0\1\u0128\11\0\1\u0129" + + "\14\0\1\u012a\17\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\1\u012b\17\4" + + "\33\0\1\u0128\11\0\1\u0129\34\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\3\4\1\u012b\14\4\1\0\3\73\4\u012c\2\73\1\216" + + "\2\73\1\u012c\1\217\1\u012c\5\73\1\u012c\3\73\2\u012c" + + "\21\73\1\u012c\4\73\2\u012c\4\73\2\u012c\1\73\2\u012c" + + "\3\73\1\u012c\1\73\77\0\1\u012d\26\0\1\u012e\115\0" + + "\1\u012f\65\0\1\u0130\130\0\1\u0131\45\0\1\u0132\72\0" + + "\1\u0133\104\0\1\u0134\72\0\1\u0135\102\0\1\u0136\77\0" + + "\1\u0137\102\0\1\u0138\76\0\1\u0139\141\0\1\u013a\36\0" + + "\1\u013b\125\0\1\u013c\52\0\1\u013d\106\0\1\u013e\36\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\5\4\1\u013f\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\1\214\1\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" + + "\1\u0140\4\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\31\0\1\u0141\1\0\1\u011c\11\0\1\u011d" + + "\14\0\1\u0142\17\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\u0143\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\u0144\5\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\4\4\1\356\1\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\u0145\1\u0146" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\1\u0147\5\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\4\1\u0148\4\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\5\4\1\u0149\12\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\u014a\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\u014b\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\31\0" + + "\1\u0141\1\0\1\u011c\11\0\1\u014c\14\0\1\u0142\17\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\1\4\1\u014d\16\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\2\4\1\u014e\1\0\2\4" + + "\1\0\3\4\3\0\20\4\33\0\1\u011c\11\0\1\u014f" + + "\34\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\5\4\1\u0150\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\1\u0151\2\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\3\4\1\u0152\2\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\u0153\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\u0154\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\1\4\1\u0155\4\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\27\0\1\u0156\52\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\3\4\1\u0157\2\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\14\4\1\u0158\3\4\25\0\1\u0159\147\0\1\u0159" + + "\27\0\1\u0159\1\0\1\u0159\53\0\1\u015a\126\0\1\u015b" + + "\112\0\1\u015c\113\0\1\u015d\100\0\1\u015e\101\0\1\u015e" + + "\15\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\1\4\1\u015f\4\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\u0160\5\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\14\4\1\u0161\3\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\1\u0162\5\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\33\0\1\u0128\46\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\u0163" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\3\4\1\u0164\2\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\4\4\1\u0165\1\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\6\4\5\0\1\u0166\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\64\0\1\u0167\27\0" + + "\1\u0168\65\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\1\u0169\5\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\u016a\6\4\5\0\1\u016b\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\42\0\1\u016c\71\0" + + "\1\320\11\0\1\u0120\33\0\1\u0122\1\u016d\4\u0122\1\u016d" + + "\2\0\3\u0122\1\0\1\u0122\1\0\1\u016d\1\0\1\u0122" + + "\1\u016d\1\u0122\1\u016d\6\u0122\1\0\4\u016d\4\u0122\1\u016d" + + "\2\u0122\1\u016d\3\u0122\1\u016d\2\0\20\u0122\4\0\4\u016e" + + "\5\0\1\u016e\1\0\1\u016e\5\0\1\u016e\3\0\2\u016e" + + "\21\0\1\u016e\4\0\2\u016e\4\0\2\u016e\1\0\2\u016e" + + "\3\0\1\u016e\1\0\3\201\4\u016f\1\63\1\0\3\201" + + "\1\u016f\1\201\1\u016f\5\201\1\u016f\3\201\2\u016f\21\201" + + "\1\u016f\4\201\2\u016f\4\201\2\u016f\1\201\2\u016f\3\201" + + "\1\u016f\1\201\27\0\1\u0170\63\0\1\u0171\116\0\1\u0172" + + "\130\0\1\u0173\27\0\1\u0174\147\0\1\u0175\15\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\356\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\1\0\3\73\4\u0176\2\73\1\216" + + "\2\73\1\u0176\1\217\1\u0176\5\73\1\u0176\3\73\2\u0176" + + "\21\73\1\u0176\4\73\2\u0176\4\73\2\u0176\1\73\2\u0176" + + "\3\73\1\u0176\1\73\30\0\1\101\1\102\1\u0177\1\u0178" + + "\7\0\1\u0179\21\0\1\110\43\0\1\u017a\101\0\1\u017b" + + "\125\0\1\u0133\44\0\1\u017c\135\0\1\u017d\45\0\1\u017e" + + "\74\0\1\u0133\103\0\1\u017f\124\0\1\342\102\0\1\u0180" + + "\101\0\1\u0133\36\0\1\u0181\77\0\1\u0182\115\0\1\u0183" + + "\70\0\1\u0133\127\0\1\u0130\15\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\2\4\1\u0184\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\u0185" + + "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\33\0\1\u0186\130\0\1\u0187\60\0\1\u0188\34\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\u0189\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\2\4\1\u018a\15\4\32\0\1\u018b\47\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\3\4\1\u018c\2\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\3\4\1\u018d\2\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\u018e\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\15\0\1\u018f\16\0\1\u0190\12\0\1\u0191\11\0\1\u0192" + + "\2\0\1\u0193\42\0\1\u0194\64\0\1\u0195\65\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\u0196\5\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\1\4\1\356\16\4\14\0\1\u0197\65\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0198" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\263\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\1\u012b\5\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\1\4\1\u0199\16\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\2\4\1\u0198\15\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\2\4" + + "\1\u019a\3\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\64\0\1\u019b\15\0\6\4\2\0\1\55" + + "\1\4\1\u019c\1\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\u019d\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\76\0\1\u019e\26\0\1\303\6\0\1\u019f\130\0\1\u015e" + + "\41\0\1\u01a0\113\0\1\u01a1\37\0\1\u01a2\76\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\3\4\1\u01a3\14\4\2\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\2\4\1\u01a4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\u01a5\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\u01a6\1\4\1\u01a7\4\4\5\0" + + "\1\u01a8\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\31\0\1\u0127\30\0\1\u012a\17\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\1\4\1\u01a9\4\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\u01aa\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\67\0\1\u01ab\3\0\1\u01ac\20\0\1\u01ad\112\0\1\u01ae" + + "\52\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\4\4\1\u01af\13\4\25\0" + + "\1\u01b0\2\0\1\u01b1\16\0\1\u01b2\14\0\1\u01b3\44\0" + + "\1\u01b4\35\0\1\u01ab\52\0\1\u0122\41\0\4\4\5\0" + + "\1\4\1\0\1\4\5\0\1\4\3\0\2\4\21\0" + + "\1\4\4\0\2\4\4\0\2\4\1\0\2\4\3\0" + + "\1\4\1\0\3\201\4\62\1\63\1\0\3\201\1\62" + + "\1\201\1\62\5\201\1\62\3\201\2\62\21\201\1\62" + + "\4\201\2\62\4\201\2\62\1\201\2\62\3\201\1\62" + + "\1\201\27\0\1\u01b5\103\0\1\u01b6\127\0\1\u01b7\27\0" + + "\1\u01b8\112\0\1\u019e\63\0\1\u01b9\65\0\3\73\4\14" + + "\2\73\1\216\2\73\1\14\1\217\1\14\5\73\1\14" + + "\3\73\2\14\21\73\1\14\4\73\2\14\4\73\2\14" + + "\1\73\2\14\3\73\1\14\1\73\63\0\1\u01ba\57\0" + + "\1\231\65\0\1\234\75\0\1\u01bb\76\0\1\u01bc\102\0" + + "\1\u01bd\73\0\1\u01be\76\0\1\u01bf\135\0\1\u01c0\76\0" + + "\1\u01bf\103\0\1\u01c1\43\0\1\u01c2\47\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u01c3" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\u01c4\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\64\0" + + "\1\u01c5\26\0\1\u01c6\100\0\1\u01c7\112\0\1\u01c8\52\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\u01c9\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\30\0\1\u01ca\51\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\u01cb\5\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\1\4\1\u01cc\16\4\33\0\1\u01cd\130\0\1\u01ce\1\u01cf" + + "\55\0\1\u01d0\101\0\1\u01d1\75\0\1\u01d2\51\0\1\u01d3" + + "\146\0\1\u01d4\42\0\1\u01d5\52\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\2\4\1\u01d6\3\4\6\0\3\4\1\0\2\4\1\0" + + "\3\4\3\0\20\4\27\0\1\u01d7\52\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\u01d8\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\1\u01d9\5\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\3\4\1\u01da\2\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\26\0" + + "\1\u01db\53\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\1\4\1\u01dc\16\4" + + "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\u01dd\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\27\0\1\u01de\131\0" + + "\1\u01df\21\0\1\u01a2\26\0\1\u01e0\47\0\6\u01a2\3\0" + + "\3\u01a2\1\0\1\u01a2\3\0\1\u01a2\1\0\1\u01a2\1\0" + + "\6\u01a2\6\0\3\u01a2\1\0\2\u01a2\1\0\3\u01a2\3\0" + + "\20\u01a2\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\5\4\1\356\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\0\4\4\1\u012b\1\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\61\0\1\u01e1" + + "\52\0\1\u01e2\12\0\1\u01e3\11\0\1\u01e4\4\0\1\u01e5" + + "\13\0\6\4\2\0\1\55\1\u01e6\2\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\43\0\1\u01e7" + + "\23\0\1\u01ab\2\0\1\u019e\7\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\u01e8\1\0" + + "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\u01e9\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\20\4\70\0\1\u019e" + + "\26\0\1\u019e\143\0\1\u01d5\56\0\1\u01ea\37\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\4\1\u01eb\4\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\23\0\1\u01ec\101\0" + + "\1\u01ed\117\0\1\u01ee\47\0\1\u01ef\112\0\1\u01f0\101\0" + + "\1\u01f1\74\0\1\u01f2\102\0\1\u0174\130\0\1\u019e\31\0" + + "\1\u01f3\143\0\1\u01f4\45\0\1\u01f5\75\0\1\u01f6\101\0" + + "\1\u01f7\132\0\1\u01f8\43\0\1\u01f9\64\0\1\342\111\0" + + "\1\u01fa\105\0\1\u01fb\46\0\6\4\2\0\1\55\1\4" + + "\1\u01cc\1\4\1\0\1\4\3\0\1\4\1\0\1\4" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\47\0\1\u0191\10\0\1\u01fc\3\0\1\u0193" + + "\45\0\1\u0195\62\0\1\u01fd\111\0\1\u01fe\134\0\1\u01ff" + + "\27\0\1\u0200\113\0\1\u0201\51\0\6\4\2\0\1\55" + + "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" + + "\6\4\6\0\2\4\1\u0202\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\1\356\5\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\25\0\1\u0203\136\0\1\u0204\42\0\1\u0205\134\0\1\u0206" + + "\75\0\1\u0205\47\0\1\u0207\136\0\1\u0208\34\0\1\u0209" + + "\113\0\1\u020a\37\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\1\4\1\356\1\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\42\0\1\u020b\71\0\1\u020c\45\0\6\4\2\0" + + "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u020d" + + "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" + + "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\1\4\1\u012b" + + "\16\4\15\0\1\u020e\13\0\1\u0127\1\0\1\u0128\1\u0190" + + "\24\0\1\u0192\1\u012a\17\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\u020f\1\0\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\34\0\1\u0210\7\0\1\u0211\1\u0212\12\0\1\u0213\1\u0214" + + "\1\u0215\47\0\1\u0216\110\0\1\u015e\67\0\1\u0217\76\0" + + "\1\u0218\74\0\1\u0219\115\0\1\u021a\65\0\1\u021b\71\0" + + "\1\u021c\54\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\1\4\1\u021d\16\4" + + "\45\0\1\u021e\34\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\u021f" + + "\15\4\27\0\1\u0220\67\0\1\u0221\13\0\1\u0222\46\0" + + "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" + + "\1\0\1\4\1\u0223\6\4\6\0\3\4\1\0\2\4" + + "\1\0\3\4\3\0\20\4\61\0\1\u0224\52\0\1\u0225" + + "\125\0\1\u0226\106\0\1\u0227\72\0\1\u0228\100\0\1\u019e" + + "\44\0\1\u0229\100\0\1\u0205\76\0\1\u01fb\145\0\1\u022a" + + "\27\0\1\u013d\114\0\1\u022b\64\0\1\u022c\101\0\1\u022d" + + "\57\0\1\u022e\116\0\1\u0133\130\0\1\u022f\46\0\1\u0230" + + "\106\0\1\u0231\63\0\1\u0232\76\0\1\u0233\104\0\1\u0234" + + "\47\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\4\4\1\u0235\13\4\14\0" + + "\1\u0236\116\0\1\u0237\71\0\1\u019e\102\0\1\u0174\77\0" + + "\1\u019e\74\0\1\u0238\103\0\1\u0127\13\0\1\u0129\14\0" + + "\1\u012a\34\0\1\u0221\77\0\1\u0221\13\0\1\u0239\113\0" + + "\1\u023a\32\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\2\4\1\356\15\4" + + "\65\0\1\u01cf\14\0\6\4\2\0\1\55\3\4\1\0" + + "\1\4\3\0\1\4\1\0\1\4\1\u023b\6\4\6\0" + + "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\13\0" + + "\1\u023c\13\0\1\u023d\134\0\1\u023e\27\0\1\u023f\130\0" + + "\1\u0240\45\0\1\u0241\131\0\1\u0242\62\0\1\u0243\102\0" + + "\1\u015e\100\0\1\u0174\73\0\1\u0244\131\0\1\u0245\47\0" + + "\1\u0246\74\0\1\u0247\52\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\u0248" + + "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" + + "\20\4\63\0\1\u0249\16\0\6\4\2\0\1\55\3\4" + + "\1\0\1\4\3\0\1\4\1\0\1\4\1\u024a\6\4" + + "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" + + "\64\0\1\u024b\45\0\1\u024c\112\0\1\u024d\57\0\1\u024e" + + "\77\0\1\u024f\65\0\1\u0250\111\0\1\u0251\77\0\1\u0252" + + "\140\0\1\u0253\25\0\1\u0254\116\0\1\u0177\130\0\1\u0255" + + "\42\0\1\u0256\117\0\1\u0257\57\0\1\u013d\115\0\1\u0258" + + "\57\0\1\u01d5\105\0\1\u0239\77\0\1\u0128\11\0\1\u0129" + + "\14\0\1\u012a\64\0\1\u0259\115\0\1\u025a\14\0\6\4" + + "\2\0\1\55\1\4\1\356\1\4\1\0\1\4\3\0" + + "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\63\0\1\u025b\41\0" + + "\1\u025c\133\0\1\u0174\63\0\1\u025d\77\0\1\u025e\116\0" + + "\1\u025f\57\0\1\u0260\65\0\1\u0261\100\0\1\u0262\73\0" + + "\1\u0263\100\0\1\u0264\103\0\1\u0265\73\0\1\u0266\76\0" + + "\1\u015e\115\0\1\u0267\57\0\1\u0268\106\0\1\u0269\106\0" + + "\1\u026a\36\0\6\4\2\0\1\55\3\4\1\0\1\4" + + "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" + + "\1\0\2\4\1\0\3\4\3\0\4\4\1\u026b\13\4" + + "\43\0\1\u0253\70\0\1\u026c\71\0\1\u026d\133\0\1\u026e" + + "\44\0\1\u026f\64\0\1\u0270\6\0\1\u0271\120\0\1\u0272" + + "\66\0\1\u0273\106\0\1\u016b\116\0\1\u0274\105\0\1\u01ab" + + "\71\0\1\u0205\32\0\1\u0133\115\0\1\u0133\112\0\1\u0275" + + "\114\0\1\u019e\43\0\1\u0276\77\0\1\u0277\100\0\1\u0278" + + "\102\0\1\u0279\74\0\1\u027a\77\0\1\u027b\101\0\1\u019e" + + "\73\0\1\u027c\101\0\1\u027d\135\0\1\u027e\37\0\1\u027f" + + "\101\0\1\u0280\77\0\1\u0281\75\0\1\u0282\66\0\1\u0283" + + "\125\0\1\u0284\71\0\1\u019e\127\0\1\u0285\15\0\6\4" + + "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" + + "\1\4\1\0\1\4\1\356\4\4\6\0\3\4\1\0" + + "\2\4\1\0\3\4\3\0\20\4\65\0\1\u0286\43\0" + + "\1\u0127\1\0\1\u0128\11\0\1\u0129\114\0\1\u0207\104\0" + + "\1\u01ab\7\0\1\u019e\27\0\1\u0287\115\0\1\u0174\61\0" + + "\1\u0288\77\0\1\u0289\77\0\1\u0251\77\0\1\u028a\102\0" + + "\1\u028b\127\0\1\u028c\60\0\1\u019e\50\0\1\u019e\162\0" + + "\1\u019e\61\0\1\u0278\46\0\1\u028d\114\0\1\u028e\120\0" + + "\1\u028f\41\0\1\u0290\62\0\1\u0291\150\0\1\u0292\74\0" + + "\1\u0293\101\0\1\u0294\57\0\1\u01e7\23\0\1\u01ab\3\0" + + "\1\u01ac\66\0\1\u0295\31\0\1\u0296\110\0\1\u0207\117\0" + + "\1\u0297\60\0\1\u0298\132\0\1\u0299\46\0\1\u029a\101\0" + + "\1\u029b\107\0\1\u029c\116\0\1\u028d\102\0\1\u029d\44\0" + + "\1\u029e\100\0\1\u029f\133\0\1\u028d\40\0\1\u028d\112\0" + + "\1\u02a0\63\0\1\u02a1\132\0\1\u02a2\102\0\1\u0279\62\0" + + "\1\u0191\14\0\1\u0193\56\0\1\u0133\64\0\1\u02a3\76\0" + + "\1\u02a4\100\0\1\u02a5\77\0\1\u02a6\101\0\1\u02a7\100\0" + + "\1\u028d\135\0\1\u02a8\35\0\1\u02a9\13\0\1\u02aa\77\0" + + "\1\u02ab\66\0\1\u02ac\77\0\1\u019e\77\0\1\u02ad\111\0" + + "\1\u02ae\114\0\1\u02af\31\0\1\u02b0\151\0\1\u02b1\44\0" + + "\1\u02b2\75\0\1\u02b3\134\0\1\u028d\26\0\1\u02b4\126\0" + + "\1\u027d\61\0\1\u028d\140\0\1\u02b5\55\0\1\u0205\47\0" + + "\1\u02b6\147\0\1\u02b7\76\0\1\u0205\31\0\1\u02b8\144\0" + + "\1\u01f3\31\0\1\u02b9\147\0\1\u019e\60\0\1\u02ba\130\0" + + "\1\u02bb\26\0\1\u02bc\134\0\1\u02bd\16\0"; + + private static int[] zzUnpackTrans() { + int[] result = new int[43456]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do + result[j++] = value; + while (--count > 0); + } + return j; + } + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\2\0\1\11\4\1\1\11\4\1\1\11\13\1\2\11" + + "\16\1\1\11\3\1\1\0\1\1\1\0\3\1\1\11" + + "\1\0\10\1\1\11\1\1\12\0\33\1\6\0\1\11" + + "\1\0\15\1\5\0\1\1\1\0\2\1\1\11\14\1" + + "\1\11\1\1\20\0\35\1\7\0\10\1\1\0\2\1" + + "\5\0\1\1\2\0\1\1\1\0\2\1\22\0\5\1" + + "\1\0\11\1\1\0\2\1\1\0\6\1\1\0\2\1" + + "\11\0\4\1\1\0\4\1\2\0\2\1\2\0\1\1" + + "\1\0\1\1\6\0\2\1\6\0\1\11\13\0\2\1" + + "\3\0\2\1\1\0\3\1\3\0\2\1\1\0\6\1" + + "\1\0\3\1\5\0\4\1\1\0\2\1\3\0\1\1" + + "\5\0\1\1\6\0\1\1\7\0\1\1\4\0\3\1" + + "\4\0\1\1\1\0\2\1\10\0\1\1\1\0\3\1" + + "\1\0\2\1\1\11\3\0\3\1\2\0\1\1\1\0" + + "\2\1\3\0\2\1\23\0\1\1\7\0\2\1\10\0" + + "\3\1\1\0\2\1\1\0\1\1\11\0\1\1\1\0" + + "\1\1\2\0\1\1\22\0\1\1\3\0\1\1\12\0" + + "\1\1\1\0\1\1\15\0\1\1\1\0\1\1\25\0" + + "\1\1\22\0\1\1\10\0\1\1\26\0\1\1\2\0" + + "\1\1\35\0\1\1\3\0\1\1\6\0\1\1\50\0" + + "\1\11"; + + private static int[] zzUnpackAttribute() { + int[] result = new int[701]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int[] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do + result[j++] = value; + while (--count > 0); + } + return j; + } + + /** the input device */ + private Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** + * this buffer contains the current text to be matched and is + * the source of the yytext() string + */ + private char zzBuffer[]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** + * endRead marks the last character in the buffer, that has been read + * from input + */ + private int zzEndRead; + + /** 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; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /* user code: */ + + /** + * Constructor. This must be here because JFlex does not generate a + * no-parameter constructor. + */ + public SmaliTokenMaker() { + } + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + * @see #addToken(int, int, int) + */ + private void addHyperlinkToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, true); + } + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + */ + private void addToken(int tokenType) { + addToken(zzStartRead, zzMarkedPos - 1, tokenType); + } + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param tokenType The token's type. + * @see #addHyperlinkToken(int, int, int) + */ + private void addToken(int start, int end, int tokenType) { + int so = start + offsetShift; + addToken(zzBuffer, start, end, tokenType, so, false); + } + + /** + * Adds the token specified to the current linked list of tokens. + * + * @param array The character array. + * @param start The starting offset in the array. + * @param end The ending offset in the array. + * @param tokenType The token's type. + * @param startOffset The offset in the document at which this token + * occurs. + * @param hyperlink Whether this token is a hyperlink. + */ + public void addToken(char[] array, int start, int end, int tokenType, + int startOffset, boolean hyperlink) { + super.addToken(array, start, end, tokenType, startOffset, hyperlink); + zzStartRead = zzMarkedPos; + } + + /** + * {@inheritDoc} + */ + public String[] getLineCommentStartAndEnd(int languageIndex) { + return new String[] { "#", null }; + } + + /** + * Returns the first token in the linked list of tokens generated + * from text. This method must be implemented by + * subclasses so they can correctly implement syntax highlighting. + * + * @param text The text from which to get tokens. + * @param initialTokenType The token type we should start with. + * @param startOffset The offset into the document at which + * text starts. + * @return The first Token in a linked list representing + * the syntax highlighted text. + */ + public Token getTokenList(Segment text, int initialTokenType, int startOffset) { + + resetTokenList(); + this.offsetShift = -text.offset + startOffset; + + // Start off in the proper state. + int state = Token.NULL; + switch (initialTokenType) { + /* No multi-line comments */ + /* No documentation comments */ + default: + state = Token.NULL; + } + + s = text; + try { + yyreset(zzReader); + yybegin(state); + return yylex(); + } catch (IOException ioe) { + ioe.printStackTrace(); + return new TokenImpl(); + } + + } + + /** + * Refills the input buffer. + * + * @return true if EOF was reached, otherwise + * false. + */ + private boolean zzRefill() { + return zzCurrentPos >= s.offset + s.count; + } + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to YY_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(Reader reader) { + // 's' has been updated. + zzBuffer = s.array; + /* + * We replaced the line below with the two below it because zzRefill + * no longer "refills" the buffer (since the way we do it, it's always + * "full" the first time through, since it points to the segment's + * array). So, we assign zzEndRead here. + */ + // zzStartRead = zzEndRead = s.offset; + zzStartRead = s.offset; + zzEndRead = zzStartRead + s.count - 1; + zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset; + zzLexicalState = YYINITIAL; + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + } + + /** + * 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 SmaliTokenMaker(Reader in) { + this.zzReader = 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 SmaliTokenMaker(InputStream in) { + this(new InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char[] zzUnpackCMap(String packed) { + char[] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 188) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do + map[j++] = value; + while (--count > 0); + } + return map; + } + + /** + * Closes the input stream. + */ + public final void yyclose() throws IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead); + } + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead + pos]; + } + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos - zzStartRead; + } + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + /** + * 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()! + */ + public void yypushback(int number) { + if (number > yylength()) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + /** + * 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 Token yylex() throws IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char[] zzBufferL = zzBuffer; + char[] zzCMapL = ZZ_CMAP; + + int[] zzTransL = ZZ_TRANS; + int[] zzRowMapL = ZZ_ROWMAP; + int[] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = zzLexicalState; + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = zzBufferL[zzCurrentPosL++]; + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } else { + zzInput = zzBufferL[zzCurrentPosL++]; + } + } + int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]]; + if (zzNext == -1) + break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ((zzAttributes & 1) == 1) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ((zzAttributes & 8) == 8) + break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 4: { + addNullToken(); + return firstToken; + } + case 27: + break; + case 19: { + addToken(Token.LITERAL_CHAR); + } + case 28: + break; + case 26: { + addToken(Token.MARKUP_TAG_NAME); + } + case 29: + break; + case 7: { + addToken(Token.WHITESPACE); + } + case 30: + break; + case 18: { + addToken(Token.LITERAL_NUMBER_HEXADECIMAL); + } + case 31: + break; + case 21: { + addToken(Token.ERROR_STRING_DOUBLE); + } + case 32: + break; + case 17: { + addToken(Token.LITERAL_NUMBER_FLOAT); + } + case 33: + break; + case 22: { + addToken(Token.RESERVED_WORD); + } + case 34: + break; + case 8: { + addToken(Token.SEPARATOR); + } + case 35: + break; + case 10: { + addToken(Token.VARIABLE); + } + case 36: + break; + case 1: { + addToken(Token.IDENTIFIER); + } + case 37: + break; + case 13: { + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addNullToken(); + return firstToken; + } + case 38: + break; + case 20: { + addToken(Token.FUNCTION); + } + case 39: + break; + case 3: { + addToken(Token.ERROR_CHAR); + addNullToken(); + return firstToken; + } + case 40: + break; + case 5: { + addToken(Token.ERROR_STRING_DOUBLE); + addNullToken(); + return firstToken; + } + case 41: + break; + case 11: { + addToken(Token.DATA_TYPE); + } + case 42: + break; + case 15: { + addToken(Token.ERROR_CHAR); + } + case 43: + break; + case 23: { + addToken(Token.LITERAL_BOOLEAN); + } + case 44: + break; + case 16: { + addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); + } + case 45: + break; + case 24: { + int temp = zzStartRead; + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL); + start = zzMarkedPos; + } + case 46: + break; + case 25: { + addToken(Token.RESERVED_WORD_2); + } + case 47: + break; + case 14: { + addToken(Token.ERROR_NUMBER_FORMAT); + } + case 48: + break; + case 6: { + start = zzMarkedPos - 1; + yybegin(EOL_COMMENT); + } + case 49: + break; + case 2: { + addToken(Token.LITERAL_NUMBER_DECIMAL_INT); + } + case 50: + break; + case 9: { + addToken(Token.OPERATOR); + } + case 51: + break; + case 12: { + } + case 52: + break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + switch (zzLexicalState) { + case EOL_COMMENT: { + addToken(start, zzStartRead - 1, Token.COMMENT_EOL); + addNullToken(); + return firstToken; + } + case 702: + break; + case YYINITIAL: { + addNullToken(); + return firstToken; + } + case 703: + break; + default: + return null; + } + } else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + +}