branching instructions

This commit is contained in:
Irmen de Jong 2018-09-02 18:32:48 +02:00
parent 492c64f348
commit e39ae3c346
10 changed files with 1150 additions and 707 deletions

View File

@ -178,8 +178,6 @@ Variables that represent CPU hardware registers
The following variables are reserved
and map directly (read/write) to a CPU hardware register: ``A``, ``X``, ``Y``, ``AX``, ``AY``, ``XY`` (the 2-letter ones
are a pseudo 16-bit 'register' by pairing two 8-bit registers).
The following variables are reserved and can be used to *read* a CPU status register bit (can be used in conditional
expressions): ``Pc``, ``Pz``, ``Pn``, ``Pv``.
Special types: const and memory-mapped
@ -279,12 +277,6 @@ You can also create loops by using the ``goto`` statement, but this should usual
Conditional Execution
---------------------
.. todo::
not sure how to handle direct translation into
[cc, cs, vc, vs, eq, ne, true, not, zero, pos, neg, lt, gt, le, ge]
It defaults to 'true' (=='ne', not-zero) if omitted. ('pos' will translate into 'pl', 'neg' into 'mi')
@todo signed: lts==neg?, gts==eq+pos?, les==neg+eq?, ges==pos?
.. todo::
eventually allow local variable definitions inside the sub blocks but for now,
they have to use the same variables as the block the ``if`` statement itself is in.
@ -293,28 +285,30 @@ Conditional Execution
Conditional execution means that the flow of execution changes based on certiain conditions,
rather than having fixed gotos or subroutine calls::
if A > 4 goto overflow
if (A > 4) goto overflow
if X == 3 then Y = 4
if X == 3 then Y = 4 else A = 2
if (X == 3) Y = 4
if (X == 3) Y = 4 else A = 2
if X == 5 {
if (X == 5) {
Y = 99
} else {
A = 3
}
condition = arithmetic expression or logical expression or comparison expression or status_register_flags ( ``SR.cs`` , ``SR.cc``, ``SR.pl`` etc... @todo )
Conditional jumps are compiled into 6502's branching instructions (such as ``bne`` and ``bcc``) so
Conditional jumps (``if (condition) goto label``) are compiled using 6502's branching instructions (such as ``bne`` and ``bcc``) so
the rather strict limit on how *far* it can jump applies. The compiler itself can't figure this
out unfortunately, so it is entirely possible to create code that cannot be assembled successfully.
You'll have to restructure your gotos in the code (place target labels closer to the branch)
if you run into this type of assembler error.
There is a special form of the if-statement that immediately translates into one of the 6502's branching instructions.
This allows you to write a conditional jump or block execution directly acting on the current values of the CPU's status register bits.
The eight branching instructions of the CPU each have an if-equivalent:
``if_cs``, ``if_cc``, ``if_eq``, ``if_ne``, ``if_pl``, ``if_mi``, ``if_vs`` and ``if_vc``.
So ``if_cc goto target`` will directly translate into the single CPU instruction ``BCC target``.
Assignments
-----------

View File

@ -290,7 +290,6 @@ The following names are reserved, they have a special meaning::
A X Y ; 6502 hardware registers
AX AY XY ; 16-bit pseudo register pairs
Pc Pz Pn Pv ; bits of the 6502 hardware status register
Operators
@ -490,10 +489,30 @@ With the 'if' / 'else' statement you can execute code depending on the value of
if ( <expression> ) <statements> [else <statements> ]
where <statements> can be just a single statement, or a block, such as this::
where <statements> can be just a single statement for instance just a ``goto``, or it can be a block such as this::
if ( <expression> ) {
<statements>
} else {
<alternative statements>
}
**Special status register branch form:**
There is a special form of the if-statement that immediately translates into one of the 6502's branching instructions.
It is almost the same as the regular if-statement but it lacks a contional expression part, because the if-statement
itself defines on what status register bit it should branch on::
if_XX <statements> [else <statements> ]
where <statements> can be just a single statement for instance just a ``goto``, or it can be a block such as this::
if_XX {
<statements>
} else {
<alternative statements>
}
The XX corresponds to one of the eigth branching instructions so the possibilities are:
``if_cs``, ``if_cc``, ``if_eq``, ``if_ne``, ``if_pl``, ``if_mi``, ``if_vs`` and ``if_vc``.

View File

@ -127,17 +127,13 @@ The following 6502 CPU hardware registers are directly usable in program code (a
- ``A``, ``X``, ``Y`` the three main cpu registers (8 bits)
- ``AX``, ``AY``, ``XY`` surrogate 16-bit registers: LSB-order (lo/hi) combined register pairs
- ``Pc`` status register (P) Carry flag (read-only, use ``_P_carry`` pseudo-function to write it)
- ``Pz`` status register (P) Zero flag (read-only)
- ``Pn`` status register (P) Negative flag (read-only)
- ``Pv`` status register (P) Overflow flag (read-only)
- the status register (P) Interrupt flag is not accessible, but can be set with the ``_P_irqd`` pseudo-function.
- the status register (P) carry flag and interrupt disable flag can be written via the ``_P_carry`` and ``_P_irqd`` builtin functions.
Subroutine Calling Conventions
------------------------------
Subroutine arguments and results are passed via registers.
Sometimes the status register's Carry flag (``Pc``) is used as well (as a boolean flag).
Sometimes the status register's Carry flag is used as well (as a boolean flag).
Additional arguments can be passed via memory locations as well ofcourse.
But you'll have to be careful when dealing with chained or even recursive calls then,
because there's a big risk of overwriting those memory locations.

View File

@ -60,6 +60,7 @@ statement :
| postincrdecr
| functioncall_stmt
| if_stmt
| branch_stmt
| subroutine
| inlineasm
| labeldef
@ -150,7 +151,9 @@ identifier : NAME ;
scoped_identifier : NAME ('.' NAME)+ ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'Pc' | 'Pz' | 'Pn' | 'Pv' ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' ;
statusflag : 'Pc' | 'Pz' | 'Pn' | 'Pv' ;
integerliteral : DEC_INTEGER | HEX_INTEGER | BIN_INTEGER ;
@ -187,13 +190,18 @@ sub_address : '=' integerliteral ;
sub_params : sub_param (',' sub_param)* ;
sub_param: identifier ':' register;
sub_param: identifier ':' (register | statusflag);
sub_returns : '?' | ( sub_return (',' sub_return)* ) ;
sub_return: register '?'? ;
sub_return: (register | statusflag) '?'? ;
if_stmt : 'if' '(' expression ')' EOL? (statement | statement_block) EOL? else_part? EOL ; // statement is constrained later
else_part : 'else' EOL? (statement | statement_block) ; // statement is constrained later
branch_stmt : branchcondition EOL? (statement | statement_block) EOL? else_part? EOL ;
branchcondition: 'if_cs' | 'if_cc' | 'if_eq' | 'if_ne' | 'if_pl' | 'if_mi' | 'if_vs' | 'if_vc' ;

View File

@ -1,6 +1,8 @@
%output prg
%launcher basic
%import c64lib
~ main $c003 {
@ -31,6 +33,14 @@
const byte equal = 4==4
const byte equal2 = (4+hopla)>0
if_eq goto mega
if_eq {
A=99
} else {
A=100
}
%breakpoint
byte equalQQ = 4==4

View File

@ -33,6 +33,24 @@ enum class Register {
PV
}
enum class Statusflag {
Pc,
Pz,
Pv,
Pn
}
enum class BranchCondition {
CS,
CC,
EQ,
NE,
VS,
VC,
MI,
PL
}
class FatalAstException (override var message: String) : Exception(message)
@ -128,6 +146,12 @@ interface IAstProcessor {
return ifStatement
}
fun process(branchStatement: BranchStatement): IStatement {
branchStatement.statements = branchStatement.statements.map { it.process(this) }
branchStatement.elsepart = branchStatement.elsepart.map { it.process(this) }
return branchStatement
}
fun process(range: RangeExpr): IExpression {
range.from = range.from.process(this)
range.to = range.to.process(this)
@ -759,7 +783,7 @@ data class Subroutine(override val name: String,
}
data class SubroutineParameter(val name: String, val register: Register) : Node {
data class SubroutineParameter(val name: String, val register: Register?, val statusflag: Statusflag?) : Node {
override var position: Position? = null
override lateinit var parent: Node
@ -769,7 +793,7 @@ data class SubroutineParameter(val name: String, val register: Register) : Node
}
data class SubroutineReturnvalue(val register: Register, val clobbered: Boolean) : Node {
data class SubroutineReturnvalue(val register: Register?, val statusflag: Statusflag?, val clobbered: Boolean) : Node {
override var position: Position? = null
override lateinit var parent: Node
@ -796,6 +820,22 @@ data class IfStatement(var condition: IExpression,
}
data class BranchStatement(var condition: BranchCondition,
var statements: List<IStatement>, var
elsepart: List<IStatement>) : IStatement {
override var position: Position? = null
override lateinit var parent: Node
override fun linkParents(parent: Node) {
this.parent = parent
statements.forEach { it.linkParents(this) }
elsepart.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor): IStatement = processor.process(this)
}
/***************** Antlr Extension methods to create AST ****************/
fun il65Parser.ModuleContext.toAst(name: String, withPosition: Boolean) : Module {
@ -929,7 +969,10 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
val asm = inlineasm()?.toAst(withPosition)
if(asm!=null) return asm
throw FatalAstException(text)
val branchstmt = branch_stmt()?.toAst(withPosition)
if(branchstmt!=null) return branchstmt
throw FatalAstException("unprocessed source text: $text")
}
private fun il65Parser.Functioncall_stmtContext.toAst(withPosition: Boolean): IStatement {
@ -1002,13 +1045,15 @@ private fun il65Parser.SubroutineContext.toAst(withPosition: Boolean) : Subrouti
private fun il65Parser.Sub_paramsContext.toAst(): List<SubroutineParameter> =
sub_param().map { SubroutineParameter(it.identifier().text, it.register().toAst()) }
sub_param().map {
SubroutineParameter(it.identifier().text, it.register()?.toAst(), it.statusflag()?.toAst())
}
private fun il65Parser.Sub_returnsContext.toAst(): List<SubroutineReturnvalue> =
sub_return().map {
val isClobber = it.childCount==2 && it.children[1].text == "?"
SubroutineReturnvalue(it.register().toAst(), isClobber)
SubroutineReturnvalue(it.register()?.toAst(), it.statusflag()?.toAst(), isClobber)
}
@ -1026,6 +1071,7 @@ private fun il65Parser.Assign_targetContext.toAst(withPosition: Boolean) : Assig
private fun il65Parser.RegisterContext.toAst() = Register.valueOf(text.toUpperCase())
private fun il65Parser.StatusflagContext.toAst() = Statusflag.valueOf(text)
private fun il65Parser.DatatypeContext.toAst() = DataType.valueOf(text.toUpperCase())
@ -1169,3 +1215,15 @@ private fun il65Parser.If_stmtContext.toAst(withPosition: Boolean): IfStatement
private fun il65Parser.Else_partContext.toAst(withPosition: Boolean): List<IStatement> {
return statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
}
private fun il65Parser.Branch_stmtContext.toAst(withPosition: Boolean): IStatement {
val branchcondition = branchcondition().toAst(withPosition)
val statements = statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
val elsepart = else_part()?.toAst(withPosition) ?: emptyList()
val result = BranchStatement(branchcondition, statements, elsepart)
result.position = toPosition(withPosition)
return result
}
private fun il65Parser.BranchconditionContext.toAst(withPosition: Boolean) = BranchCondition.valueOf(text.substringAfter('_').toUpperCase())

View File

@ -76,17 +76,25 @@ T__74=75
T__75=76
T__76=77
T__77=78
LINECOMMENT=79
COMMENT=80
WS=81
EOL=82
NAME=83
DEC_INTEGER=84
HEX_INTEGER=85
BIN_INTEGER=86
FLOAT_NUMBER=87
STRING=88
INLINEASMBLOCK=89
T__78=79
T__79=80
T__80=81
T__81=82
T__82=83
T__83=84
T__84=85
T__85=86
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
'~'=1
':'=2
'goto'=3
@ -165,3 +173,11 @@ INLINEASMBLOCK=89
'?'=76
'if'=77
'else'=78
'if_cs'=79
'if_cc'=80
'if_eq'=81
'if_ne'=82
'if_pl'=83
'if_mi'=84
'if_vs'=85
'if_vc'=86

View File

@ -27,9 +27,10 @@ public class il65Lexer extends Lexer {
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, LINECOMMENT=79, COMMENT=80,
WS=81, EOL=82, NAME=83, DEC_INTEGER=84, HEX_INTEGER=85, BIN_INTEGER=86,
FLOAT_NUMBER=87, STRING=88, INLINEASMBLOCK=89;
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, LINECOMMENT=87,
COMMENT=88, WS=89, EOL=90, NAME=91, DEC_INTEGER=92, HEX_INTEGER=93, BIN_INTEGER=94,
FLOAT_NUMBER=95, STRING=96, INLINEASMBLOCK=97;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -48,7 +49,8 @@ public class il65Lexer extends Lexer {
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
"T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
"T__73", "T__74", "T__75", "T__76", "T__77", "LINECOMMENT", "COMMENT",
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "T__83", "T__84", "T__85", "LINECOMMENT", "COMMENT",
"WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
};
@ -63,7 +65,8 @@ public class il65Lexer extends Lexer {
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'", "'if_cs'", "'if_cc'",
"'if_eq'", "'if_ne'", "'if_pl'", "'if_mi'", "'if_vs'", "'if_vc'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -72,9 +75,9 @@ public class il65Lexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT", "WS",
"EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"STRING", "INLINEASMBLOCK"
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -136,10 +139,10 @@ public class il65Lexer extends Lexer {
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 89:
case 97:
STRING_action((RuleContext)_localctx, actionIndex);
break;
case 90:
case 98:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break;
}
@ -168,7 +171,7 @@ public class il65Lexer extends Lexer {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2[\u0261\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2c\u02a1\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -178,198 +181,219 @@ public class il65Lexer extends Lexer {
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\3\2\3\2\3\3\3\3\3\4"+
"\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3"+
"\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b"+
"\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+
"\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
"\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
"\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3"+
"\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3"+
"\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3"+
"\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3"+
"\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3"+
"\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 "+
"\3 \3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3"+
")\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61"+
"\3\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66"+
"\3\66\3\67\3\67\3\67\38\38\38\38\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3"+
";\3<\3<\3=\3=\3>\3>\3?\3?\3?\3@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3"+
"D\3D\3E\3E\3E\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3"+
"I\3I\3J\3J\3J\3K\3K\3L\3L\3M\3M\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\7P\u01f8"+
"\nP\fP\16P\u01fb\13P\3P\3P\3P\3P\3Q\3Q\7Q\u0203\nQ\fQ\16Q\u0206\13Q\3"+
"Q\3Q\3R\3R\3R\3R\3S\6S\u020f\nS\rS\16S\u0210\3T\3T\7T\u0215\nT\fT\16T"+
"\u0218\13T\3U\3U\3U\6U\u021d\nU\rU\16U\u021e\5U\u0221\nU\3V\3V\6V\u0225"+
"\nV\rV\16V\u0226\3W\3W\6W\u022b\nW\rW\16W\u022c\3X\3X\3X\5X\u0232\nX\3"+
"X\5X\u0235\nX\3Y\6Y\u0238\nY\rY\16Y\u0239\3Y\3Y\6Y\u023e\nY\rY\16Y\u023f"+
"\5Y\u0242\nY\3Z\3Z\3Z\3Z\5Z\u0248\nZ\3[\3[\3[\7[\u024d\n[\f[\16[\u0250"+
"\13[\3[\3[\3[\3\\\3\\\3\\\3\\\6\\\u0259\n\\\r\\\16\\\u025a\3\\\3\\\3\\"+
"\3\\\3\\\3\u025a\2]\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r"+
"\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+
"\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+
"e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"\2\u00b3\2\u00b5Z\u00b7[\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|"+
"\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u026f"+
"\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2"+
"\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2"+
"\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2"+
"\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2"+
"\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3"+
"\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2"+
"\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2"+
"U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3"+
"\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2"+
"\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2"+
"{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085"+
"\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2"+
"\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
"\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b5\3\2\2"+
"\2\2\u00b7\3\2\2\2\3\u00b9\3\2\2\2\5\u00bb\3\2\2\2\7\u00bd\3\2\2\2\t\u00c2"+
"\3\2\2\2\13\u00ca\3\2\2\2\r\u00d4\3\2\2\2\17\u00de\3\2\2\2\21\u00e7\3"+
"\2\2\2\23\u00ef\3\2\2\2\25\u00fb\3\2\2\2\27\u0107\3\2\2\2\31\u0112\3\2"+
"\2\2\33\u011a\3\2\2\2\35\u011c\3\2\2\2\37\u011e\3\2\2\2!\u0124\3\2\2\2"+
"#\u012b\3\2\2\2%\u0130\3\2\2\2\'\u0135\3\2\2\2)\u013b\3\2\2\2+\u013f\3"+
"\2\2\2-\u0145\3\2\2\2/\u014b\3\2\2\2\61\u0152\3\2\2\2\63\u0154\3\2\2\2"+
"\65\u0156\3\2\2\2\67\u0159\3\2\2\29\u015c\3\2\2\2;\u015f\3\2\2\2=\u0162"+
"\3\2\2\2?\u0166\3\2\2\2A\u0169\3\2\2\2C\u016c\3\2\2\2E\u016f\3\2\2\2G"+
"\u0172\3\2\2\2I\u0175\3\2\2\2K\u0177\3\2\2\2M\u0179\3\2\2\2O\u017b\3\2"+
"\2\2Q\u017d\3\2\2\2S\u0180\3\2\2\2U\u0182\3\2\2\2W\u0184\3\2\2\2Y\u0186"+
"\3\2\2\2[\u0188\3\2\2\2]\u018b\3\2\2\2_\u018e\3\2\2\2a\u0191\3\2\2\2c"+
"\u0194\3\2\2\2e\u0196\3\2\2\2g\u0198\3\2\2\2i\u019a\3\2\2\2k\u019d\3\2"+
"\2\2m\u01a1\3\2\2\2o\u01a4\3\2\2\2q\u01a8\3\2\2\2s\u01ac\3\2\2\2u\u01b3"+
"\3\2\2\2w\u01b5\3\2\2\2y\u01b7\3\2\2\2{\u01b9\3\2\2\2}\u01bb\3\2\2\2\177"+
"\u01be\3\2\2\2\u0081\u01c1\3\2\2\2\u0083\u01c4\3\2\2\2\u0085\u01c7\3\2"+
"\2\2\u0087\u01ca\3\2\2\2\u0089\u01cd\3\2\2\2\u008b\u01d0\3\2\2\2\u008d"+
"\u01d5\3\2\2\2\u008f\u01db\3\2\2\2\u0091\u01e0\3\2\2\2\u0093\u01e4\3\2"+
"\2\2\u0095\u01e7\3\2\2\2\u0097\u01e9\3\2\2\2\u0099\u01eb\3\2\2\2\u009b"+
"\u01ed\3\2\2\2\u009d\u01f0\3\2\2\2\u009f\u01f5\3\2\2\2\u00a1\u0200\3\2"+
"\2\2\u00a3\u0209\3\2\2\2\u00a5\u020e\3\2\2\2\u00a7\u0212\3\2\2\2\u00a9"+
"\u0220\3\2\2\2\u00ab\u0222\3\2\2\2\u00ad\u0228\3\2\2\2\u00af\u022e\3\2"+
"\2\2\u00b1\u0237\3\2\2\2\u00b3\u0247\3\2\2\2\u00b5\u0249\3\2\2\2\u00b7"+
"\u0254\3\2\2\2\u00b9\u00ba\7\u0080\2\2\u00ba\4\3\2\2\2\u00bb\u00bc\7<"+
"\2\2\u00bc\6\3\2\2\2\u00bd\u00be\7i\2\2\u00be\u00bf\7q\2\2\u00bf\u00c0"+
"\7v\2\2\u00c0\u00c1\7q\2\2\u00c1\b\3\2\2\2\u00c2\u00c3\7\'\2\2\u00c3\u00c4"+
"\7q\2\2\u00c4\u00c5\7w\2\2\u00c5\u00c6\7v\2\2\u00c6\u00c7\7r\2\2\u00c7"+
"\u00c8\7w\2\2\u00c8\u00c9\7v\2\2\u00c9\n\3\2\2\2\u00ca\u00cb\7\'\2\2\u00cb"+
"\u00cc\7n\2\2\u00cc\u00cd\7c\2\2\u00cd\u00ce\7w\2\2\u00ce\u00cf\7p\2\2"+
"\u00cf\u00d0\7e\2\2\u00d0\u00d1\7j\2\2\u00d1\u00d2\7g\2\2\u00d2\u00d3"+
"\7t\2\2\u00d3\f\3\2\2\2\u00d4\u00d5\7\'\2\2\u00d5\u00d6\7|\2\2\u00d6\u00d7"+
"\7g\2\2\u00d7\u00d8\7t\2\2\u00d8\u00d9\7q\2\2\u00d9\u00da\7r\2\2\u00da"+
"\u00db\7c\2\2\u00db\u00dc\7i\2\2\u00dc\u00dd\7g\2\2\u00dd\16\3\2\2\2\u00de"+
"\u00df\7\'\2\2\u00df\u00e0\7c\2\2\u00e0\u00e1\7f\2\2\u00e1\u00e2\7f\2"+
"\2\u00e2\u00e3\7t\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7u\2\2\u00e5\u00e6"+
"\7u\2\2\u00e6\20\3\2\2\2\u00e7\u00e8\7\'\2\2\u00e8\u00e9\7k\2\2\u00e9"+
"\u00ea\7o\2\2\u00ea\u00eb\7r\2\2\u00eb\u00ec\7q\2\2\u00ec\u00ed\7t\2\2"+
"\u00ed\u00ee\7v\2\2\u00ee\22\3\2\2\2\u00ef\u00f0\7\'\2\2\u00f0\u00f1\7"+
"d\2\2\u00f1\u00f2\7t\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4\7c\2\2\u00f4\u00f5"+
"\7m\2\2\u00f5\u00f6\7r\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7k\2\2\u00f8"+
"\u00f9\7p\2\2\u00f9\u00fa\7v\2\2\u00fa\24\3\2\2\2\u00fb\u00fc\7\'\2\2"+
"\u00fc\u00fd\7c\2\2\u00fd\u00fe\7u\2\2\u00fe\u00ff\7o\2\2\u00ff\u0100"+
"\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102\7e\2\2\u0102\u0103\7n\2\2\u0103"+
"\u0104\7w\2\2\u0104\u0105\7f\2\2\u0105\u0106\7g\2\2\u0106\26\3\2\2\2\u0107"+
"\u0108\7\'\2\2\u0108\u0109\7c\2\2\u0109\u010a\7u\2\2\u010a\u010b\7o\2"+
"\2\u010b\u010c\7d\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f"+
"\7c\2\2\u010f\u0110\7t\2\2\u0110\u0111\7{\2\2\u0111\30\3\2\2\2\u0112\u0113"+
"\7\'\2\2\u0113\u0114\7q\2\2\u0114\u0115\7r\2\2\u0115\u0116\7v\2\2\u0116"+
"\u0117\7k\2\2\u0117\u0118\7q\2\2\u0118\u0119\7p\2\2\u0119\32\3\2\2\2\u011a"+
"\u011b\7.\2\2\u011b\34\3\2\2\2\u011c\u011d\7?\2\2\u011d\36\3\2\2\2\u011e"+
"\u011f\7e\2\2\u011f\u0120\7q\2\2\u0120\u0121\7p\2\2\u0121\u0122\7u\2\2"+
"\u0122\u0123\7v\2\2\u0123 \3\2\2\2\u0124\u0125\7o\2\2\u0125\u0126\7g\2"+
"\2\u0126\u0127\7o\2\2\u0127\u0128\7q\2\2\u0128\u0129\7t\2\2\u0129\u012a"+
"\7{\2\2\u012a\"\3\2\2\2\u012b\u012c\7d\2\2\u012c\u012d\7{\2\2\u012d\u012e"+
"\7v\2\2\u012e\u012f\7g\2\2\u012f$\3\2\2\2\u0130\u0131\7y\2\2\u0131\u0132"+
"\7q\2\2\u0132\u0133\7t\2\2\u0133\u0134\7f\2\2\u0134&\3\2\2\2\u0135\u0136"+
"\7h\2\2\u0136\u0137\7n\2\2\u0137\u0138\7q\2\2\u0138\u0139\7c\2\2\u0139"+
"\u013a\7v\2\2\u013a(\3\2\2\2\u013b\u013c\7u\2\2\u013c\u013d\7v\2\2\u013d"+
"\u013e\7t\2\2\u013e*\3\2\2\2\u013f\u0140\7u\2\2\u0140\u0141\7v\2\2\u0141"+
"\u0142\7t\2\2\u0142\u0143\7a\2\2\u0143\u0144\7r\2\2\u0144,\3\2\2\2\u0145"+
"\u0146\7u\2\2\u0146\u0147\7v\2\2\u0147\u0148\7t\2\2\u0148\u0149\7a\2\2"+
"\u0149\u014a\7u\2\2\u014a.\3\2\2\2\u014b\u014c\7u\2\2\u014c\u014d\7v\2"+
"\2\u014d\u014e\7t\2\2\u014e\u014f\7a\2\2\u014f\u0150\7r\2\2\u0150\u0151"+
"\7u\2\2\u0151\60\3\2\2\2\u0152\u0153\7]\2\2\u0153\62\3\2\2\2\u0154\u0155"+
"\7_\2\2\u0155\64\3\2\2\2\u0156\u0157\7-\2\2\u0157\u0158\7?\2\2\u0158\66"+
"\3\2\2\2\u0159\u015a\7/\2\2\u015a\u015b\7?\2\2\u015b8\3\2\2\2\u015c\u015d"+
"\7\61\2\2\u015d\u015e\7?\2\2\u015e:\3\2\2\2\u015f\u0160\7,\2\2\u0160\u0161"+
"\7?\2\2\u0161<\3\2\2\2\u0162\u0163\7,\2\2\u0163\u0164\7,\2\2\u0164\u0165"+
"\7?\2\2\u0165>\3\2\2\2\u0166\u0167\7(\2\2\u0167\u0168\7?\2\2\u0168@\3"+
"\2\2\2\u0169\u016a\7~\2\2\u016a\u016b\7?\2\2\u016bB\3\2\2\2\u016c\u016d"+
"\7`\2\2\u016d\u016e\7?\2\2\u016eD\3\2\2\2\u016f\u0170\7-\2\2\u0170\u0171"+
"\7-\2\2\u0171F\3\2\2\2\u0172\u0173\7/\2\2\u0173\u0174\7/\2\2\u0174H\3"+
"\2\2\2\u0175\u0176\7*\2\2\u0176J\3\2\2\2\u0177\u0178\7+\2\2\u0178L\3\2"+
"\2\2\u0179\u017a\7-\2\2\u017aN\3\2\2\2\u017b\u017c\7/\2\2\u017cP\3\2\2"+
"\2\u017d\u017e\7,\2\2\u017e\u017f\7,\2\2\u017fR\3\2\2\2\u0180\u0181\7"+
",\2\2\u0181T\3\2\2\2\u0182\u0183\7\61\2\2\u0183V\3\2\2\2\u0184\u0185\7"+
">\2\2\u0185X\3\2\2\2\u0186\u0187\7@\2\2\u0187Z\3\2\2\2\u0188\u0189\7>"+
"\2\2\u0189\u018a\7?\2\2\u018a\\\3\2\2\2\u018b\u018c\7@\2\2\u018c\u018d"+
"\7?\2\2\u018d^\3\2\2\2\u018e\u018f\7?\2\2\u018f\u0190\7?\2\2\u0190`\3"+
"\2\2\2\u0191\u0192\7#\2\2\u0192\u0193\7?\2\2\u0193b\3\2\2\2\u0194\u0195"+
"\7(\2\2\u0195d\3\2\2\2\u0196\u0197\7`\2\2\u0197f\3\2\2\2\u0198\u0199\7"+
"~\2\2\u0199h\3\2\2\2\u019a\u019b\7v\2\2\u019b\u019c\7q\2\2\u019cj\3\2"+
"\2\2\u019d\u019e\7c\2\2\u019e\u019f\7p\2\2\u019f\u01a0\7f\2\2\u01a0l\3"+
"\2\2\2\u01a1\u01a2\7q\2\2\u01a2\u01a3\7t\2\2\u01a3n\3\2\2\2\u01a4\u01a5"+
"\7z\2\2\u01a5\u01a6\7q\2\2\u01a6\u01a7\7t\2\2\u01a7p\3\2\2\2\u01a8\u01a9"+
"\7p\2\2\u01a9\u01aa\7q\2\2\u01aa\u01ab\7v\2\2\u01abr\3\2\2\2\u01ac\u01ad"+
"\7t\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7v\2\2\u01af\u01b0\7w\2\2\u01b0"+
"\u01b1\7t\2\2\u01b1\u01b2\7p\2\2\u01b2t\3\2\2\2\u01b3\u01b4\7\60\2\2\u01b4"+
"v\3\2\2\2\u01b5\u01b6\7C\2\2\u01b6x\3\2\2\2\u01b7\u01b8\7Z\2\2\u01b8z"+
"\3\2\2\2\u01b9\u01ba\7[\2\2\u01ba|\3\2\2\2\u01bb\u01bc\7C\2\2\u01bc\u01bd"+
"\7Z\2\2\u01bd~\3\2\2\2\u01be\u01bf\7C\2\2\u01bf\u01c0\7[\2\2\u01c0\u0080"+
"\3\2\2\2\u01c1\u01c2\7Z\2\2\u01c2\u01c3\7[\2\2\u01c3\u0082\3\2\2\2\u01c4"+
"\u01c5\7R\2\2\u01c5\u01c6\7e\2\2\u01c6\u0084\3\2\2\2\u01c7\u01c8\7R\2"+
"\2\u01c8\u01c9\7|\2\2\u01c9\u0086\3\2\2\2\u01ca\u01cb\7R\2\2\u01cb\u01cc"+
"\7p\2\2\u01cc\u0088\3\2\2\2\u01cd\u01ce\7R\2\2\u01ce\u01cf\7x\2\2\u01cf"+
"\u008a\3\2\2\2\u01d0\u01d1\7v\2\2\u01d1\u01d2\7t\2\2\u01d2\u01d3\7w\2"+
"\2\u01d3\u01d4\7g\2\2\u01d4\u008c\3\2\2\2\u01d5\u01d6\7h\2\2\u01d6\u01d7"+
"\7c\2\2\u01d7\u01d8\7n\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da\7g\2\2\u01da"+
"\u008e\3\2\2\2\u01db\u01dc\7\'\2\2\u01dc\u01dd\7c\2\2\u01dd\u01de\7u\2"+
"\2\u01de\u01df\7o\2\2\u01df\u0090\3\2\2\2\u01e0\u01e1\7u\2\2\u01e1\u01e2"+
"\7w\2\2\u01e2\u01e3\7d\2\2\u01e3\u0092\3\2\2\2\u01e4\u01e5\7/\2\2\u01e5"+
"\u01e6\7@\2\2\u01e6\u0094\3\2\2\2\u01e7\u01e8\7}\2\2\u01e8\u0096\3\2\2"+
"\2\u01e9\u01ea\7\177\2\2\u01ea\u0098\3\2\2\2\u01eb\u01ec\7A\2\2\u01ec"+
"\u009a\3\2\2\2\u01ed\u01ee\7k\2\2\u01ee\u01ef\7h\2\2\u01ef\u009c\3\2\2"+
"\2\u01f0\u01f1\7g\2\2\u01f1\u01f2\7n\2\2\u01f2\u01f3\7u\2\2\u01f3\u01f4"+
"\7g\2\2\u01f4\u009e\3\2\2\2\u01f5\u01f9\t\2\2\2\u01f6\u01f8\t\3\2\2\u01f7"+
"\u01f6\3\2\2\2\u01f8\u01fb\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2"+
"\2\2\u01fa\u01fc\3\2\2\2\u01fb\u01f9\3\2\2\2\u01fc\u01fd\5\u00a1Q\2\u01fd"+
"\u01fe\3\2\2\2\u01fe\u01ff\bP\2\2\u01ff\u00a0\3\2\2\2\u0200\u0204\7=\2"+
"\2\u0201\u0203\n\2\2\2\u0202\u0201\3\2\2\2\u0203\u0206\3\2\2\2\u0204\u0202"+
"\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0207\3\2\2\2\u0206\u0204\3\2\2\2\u0207"+
"\u0208\bQ\2\2\u0208\u00a2\3\2\2\2\u0209\u020a\t\3\2\2\u020a\u020b\3\2"+
"\2\2\u020b\u020c\bR\3\2\u020c\u00a4\3\2\2\2\u020d\u020f\t\2\2\2\u020e"+
"\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u020e\3\2\2\2\u0210\u0211\3\2"+
"\2\2\u0211\u00a6\3\2\2\2\u0212\u0216\t\4\2\2\u0213\u0215\t\5\2\2\u0214"+
"\u0213\3\2\2\2\u0215\u0218\3\2\2\2\u0216\u0214\3\2\2\2\u0216\u0217\3\2"+
"\2\2\u0217\u00a8\3\2\2\2\u0218\u0216\3\2\2\2\u0219\u0221\4\62;\2\u021a"+
"\u021c\4\63;\2\u021b\u021d\4\62;\2\u021c\u021b\3\2\2\2\u021d\u021e\3\2"+
"\2\2\u021e\u021c\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0221\3\2\2\2\u0220"+
"\u0219\3\2\2\2\u0220\u021a\3\2\2\2\u0221\u00aa\3\2\2\2\u0222\u0224\7&"+
"\2\2\u0223\u0225\t\6\2\2\u0224\u0223\3\2\2\2\u0225\u0226\3\2\2\2\u0226"+
"\u0224\3\2\2\2\u0226\u0227\3\2\2\2\u0227\u00ac\3\2\2\2\u0228\u022a\7\'"+
"\2\2\u0229\u022b\4\62\63\2\u022a\u0229\3\2\2\2\u022b\u022c\3\2\2\2\u022c"+
"\u022a\3\2\2\2\u022c\u022d\3\2\2\2\u022d\u00ae\3\2\2\2\u022e\u0234\5\u00b1"+
"Y\2\u022f\u0231\t\7\2\2\u0230\u0232\t\b\2\2\u0231\u0230\3\2\2\2\u0231"+
"\u0232\3\2\2\2\u0232\u0233\3\2\2\2\u0233\u0235\5\u00b1Y\2\u0234\u022f"+
"\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u00b0\3\2\2\2\u0236\u0238\4\62;\2\u0237"+
"\u0236\3\2\2\2\u0238\u0239\3\2\2\2\u0239\u0237\3\2\2\2\u0239\u023a\3\2"+
"\2\2\u023a\u0241\3\2\2\2\u023b\u023d\7\60\2\2\u023c\u023e\4\62;\2\u023d"+
"\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2"+
"\2\2\u0240\u0242\3\2\2\2\u0241\u023b\3\2\2\2\u0241\u0242\3\2\2\2\u0242"+
"\u00b2\3\2\2\2\u0243\u0244\7^\2\2\u0244\u0248\13\2\2\2\u0245\u0246\7^"+
"\2\2\u0246\u0248\5\u00a5S\2\u0247\u0243\3\2\2\2\u0247\u0245\3\2\2\2\u0248"+
"\u00b4\3\2\2\2\u0249\u024e\7$\2\2\u024a\u024d\5\u00b3Z\2\u024b\u024d\n"+
"\t\2\2\u024c\u024a\3\2\2\2\u024c\u024b\3\2\2\2\u024d\u0250\3\2\2\2\u024e"+
"\u024c\3\2\2\2\u024e\u024f\3\2\2\2\u024f\u0251\3\2\2\2\u0250\u024e\3\2"+
"\2\2\u0251\u0252\7$\2\2\u0252\u0253\b[\4\2\u0253\u00b6\3\2\2\2\u0254\u0255"+
"\7}\2\2\u0255\u0256\7}\2\2\u0256\u0258\3\2\2\2\u0257\u0259\13\2\2\2\u0258"+
"\u0257\3\2\2\2\u0259\u025a\3\2\2\2\u025a\u025b\3\2\2\2\u025a\u0258\3\2"+
"\2\2\u025b\u025c\3\2\2\2\u025c\u025d\7\177\2\2\u025d\u025e\7\177\2\2\u025e"+
"\u025f\3\2\2\2\u025f\u0260\b\\\5\2\u0260\u00b8\3\2\2\2\25\2\u01f9\u0204"+
"\u0210\u0216\u021e\u0220\u0224\u0226\u022c\u0231\u0234\u0239\u023f\u0241"+
"\u0247\u024c\u024e\u025a\6\2\3\2\b\2\2\3[\2\3\\\3";
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+
"`\t`\4a\ta\4b\tb\4c\tc\4d\td\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3"+
"\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
"\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+
"\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
"\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23"+
"\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
"\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35"+
"\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3\"\3\"\3\""+
"\3#\3#\3#\3$\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3)\3*\3*\3+\3+\3,\3"+
",\3-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\63"+
"\3\63\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\67\3\67\3\67\38\3"+
"8\38\38\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3;\3<\3<\3=\3=\3>\3>\3?\3"+
"?\3?\3@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3"+
"F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3K\3K\3L\3"+
"L\3M\3M\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3"+
"R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3"+
"U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\7X\u0238\nX\fX\16X\u023b\13"+
"X\3X\3X\3X\3X\3Y\3Y\7Y\u0243\nY\fY\16Y\u0246\13Y\3Y\3Y\3Z\3Z\3Z\3Z\3["+
"\6[\u024f\n[\r[\16[\u0250\3\\\3\\\7\\\u0255\n\\\f\\\16\\\u0258\13\\\3"+
"]\3]\3]\6]\u025d\n]\r]\16]\u025e\5]\u0261\n]\3^\3^\6^\u0265\n^\r^\16^"+
"\u0266\3_\3_\6_\u026b\n_\r_\16_\u026c\3`\3`\3`\5`\u0272\n`\3`\5`\u0275"+
"\n`\3a\6a\u0278\na\ra\16a\u0279\3a\3a\6a\u027e\na\ra\16a\u027f\5a\u0282"+
"\na\3b\3b\3b\3b\5b\u0288\nb\3c\3c\3c\7c\u028d\nc\fc\16c\u0290\13c\3c\3"+
"c\3c\3d\3d\3d\3d\6d\u0299\nd\rd\16d\u029a\3d\3d\3d\3d\3d\3\u029a\2e\3"+
"\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37"+
"\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37="+
" ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9"+
"q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008f"+
"I\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3"+
"S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7"+
"]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1\2\u00c3\2\u00c5b\u00c7c\3\2\n\4\2"+
"\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGg"+
"g\4\2--//\6\2\f\f\16\17$$^^\2\u02af\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+
"\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23"+
"\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2"+
"\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+
"\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+
"\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+
"\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+
"\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2["+
"\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+
"\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2"+
"\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2"+
"\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089"+
"\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+
"\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b"+
"\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2"+
"\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad"+
"\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2"+
"\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf"+
"\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\3\u00c9\3\2\2\2\5\u00cb\3\2\2"+
"\2\7\u00cd\3\2\2\2\t\u00d2\3\2\2\2\13\u00da\3\2\2\2\r\u00e4\3\2\2\2\17"+
"\u00ee\3\2\2\2\21\u00f7\3\2\2\2\23\u00ff\3\2\2\2\25\u010b\3\2\2\2\27\u0117"+
"\3\2\2\2\31\u0122\3\2\2\2\33\u012a\3\2\2\2\35\u012c\3\2\2\2\37\u012e\3"+
"\2\2\2!\u0134\3\2\2\2#\u013b\3\2\2\2%\u0140\3\2\2\2\'\u0145\3\2\2\2)\u014b"+
"\3\2\2\2+\u014f\3\2\2\2-\u0155\3\2\2\2/\u015b\3\2\2\2\61\u0162\3\2\2\2"+
"\63\u0164\3\2\2\2\65\u0166\3\2\2\2\67\u0169\3\2\2\29\u016c\3\2\2\2;\u016f"+
"\3\2\2\2=\u0172\3\2\2\2?\u0176\3\2\2\2A\u0179\3\2\2\2C\u017c\3\2\2\2E"+
"\u017f\3\2\2\2G\u0182\3\2\2\2I\u0185\3\2\2\2K\u0187\3\2\2\2M\u0189\3\2"+
"\2\2O\u018b\3\2\2\2Q\u018d\3\2\2\2S\u0190\3\2\2\2U\u0192\3\2\2\2W\u0194"+
"\3\2\2\2Y\u0196\3\2\2\2[\u0198\3\2\2\2]\u019b\3\2\2\2_\u019e\3\2\2\2a"+
"\u01a1\3\2\2\2c\u01a4\3\2\2\2e\u01a6\3\2\2\2g\u01a8\3\2\2\2i\u01aa\3\2"+
"\2\2k\u01ad\3\2\2\2m\u01b1\3\2\2\2o\u01b4\3\2\2\2q\u01b8\3\2\2\2s\u01bc"+
"\3\2\2\2u\u01c3\3\2\2\2w\u01c5\3\2\2\2y\u01c7\3\2\2\2{\u01c9\3\2\2\2}"+
"\u01cb\3\2\2\2\177\u01ce\3\2\2\2\u0081\u01d1\3\2\2\2\u0083\u01d4\3\2\2"+
"\2\u0085\u01d7\3\2\2\2\u0087\u01da\3\2\2\2\u0089\u01dd\3\2\2\2\u008b\u01e0"+
"\3\2\2\2\u008d\u01e5\3\2\2\2\u008f\u01eb\3\2\2\2\u0091\u01f0\3\2\2\2\u0093"+
"\u01f4\3\2\2\2\u0095\u01f7\3\2\2\2\u0097\u01f9\3\2\2\2\u0099\u01fb\3\2"+
"\2\2\u009b\u01fd\3\2\2\2\u009d\u0200\3\2\2\2\u009f\u0205\3\2\2\2\u00a1"+
"\u020b\3\2\2\2\u00a3\u0211\3\2\2\2\u00a5\u0217\3\2\2\2\u00a7\u021d\3\2"+
"\2\2\u00a9\u0223\3\2\2\2\u00ab\u0229\3\2\2\2\u00ad\u022f\3\2\2\2\u00af"+
"\u0235\3\2\2\2\u00b1\u0240\3\2\2\2\u00b3\u0249\3\2\2\2\u00b5\u024e\3\2"+
"\2\2\u00b7\u0252\3\2\2\2\u00b9\u0260\3\2\2\2\u00bb\u0262\3\2\2\2\u00bd"+
"\u0268\3\2\2\2\u00bf\u026e\3\2\2\2\u00c1\u0277\3\2\2\2\u00c3\u0287\3\2"+
"\2\2\u00c5\u0289\3\2\2\2\u00c7\u0294\3\2\2\2\u00c9\u00ca\7\u0080\2\2\u00ca"+
"\4\3\2\2\2\u00cb\u00cc\7<\2\2\u00cc\6\3\2\2\2\u00cd\u00ce\7i\2\2\u00ce"+
"\u00cf\7q\2\2\u00cf\u00d0\7v\2\2\u00d0\u00d1\7q\2\2\u00d1\b\3\2\2\2\u00d2"+
"\u00d3\7\'\2\2\u00d3\u00d4\7q\2\2\u00d4\u00d5\7w\2\2\u00d5\u00d6\7v\2"+
"\2\u00d6\u00d7\7r\2\2\u00d7\u00d8\7w\2\2\u00d8\u00d9\7v\2\2\u00d9\n\3"+
"\2\2\2\u00da\u00db\7\'\2\2\u00db\u00dc\7n\2\2\u00dc\u00dd\7c\2\2\u00dd"+
"\u00de\7w\2\2\u00de\u00df\7p\2\2\u00df\u00e0\7e\2\2\u00e0\u00e1\7j\2\2"+
"\u00e1\u00e2\7g\2\2\u00e2\u00e3\7t\2\2\u00e3\f\3\2\2\2\u00e4\u00e5\7\'"+
"\2\2\u00e5\u00e6\7|\2\2\u00e6\u00e7\7g\2\2\u00e7\u00e8\7t\2\2\u00e8\u00e9"+
"\7q\2\2\u00e9\u00ea\7r\2\2\u00ea\u00eb\7c\2\2\u00eb\u00ec\7i\2\2\u00ec"+
"\u00ed\7g\2\2\u00ed\16\3\2\2\2\u00ee\u00ef\7\'\2\2\u00ef\u00f0\7c\2\2"+
"\u00f0\u00f1\7f\2\2\u00f1\u00f2\7f\2\2\u00f2\u00f3\7t\2\2\u00f3\u00f4"+
"\7g\2\2\u00f4\u00f5\7u\2\2\u00f5\u00f6\7u\2\2\u00f6\20\3\2\2\2\u00f7\u00f8"+
"\7\'\2\2\u00f8\u00f9\7k\2\2\u00f9\u00fa\7o\2\2\u00fa\u00fb\7r\2\2\u00fb"+
"\u00fc\7q\2\2\u00fc\u00fd\7t\2\2\u00fd\u00fe\7v\2\2\u00fe\22\3\2\2\2\u00ff"+
"\u0100\7\'\2\2\u0100\u0101\7d\2\2\u0101\u0102\7t\2\2\u0102\u0103\7g\2"+
"\2\u0103\u0104\7c\2\2\u0104\u0105\7m\2\2\u0105\u0106\7r\2\2\u0106\u0107"+
"\7q\2\2\u0107\u0108\7k\2\2\u0108\u0109\7p\2\2\u0109\u010a\7v\2\2\u010a"+
"\24\3\2\2\2\u010b\u010c\7\'\2\2\u010c\u010d\7c\2\2\u010d\u010e\7u\2\2"+
"\u010e\u010f\7o\2\2\u010f\u0110\7k\2\2\u0110\u0111\7p\2\2\u0111\u0112"+
"\7e\2\2\u0112\u0113\7n\2\2\u0113\u0114\7w\2\2\u0114\u0115\7f\2\2\u0115"+
"\u0116\7g\2\2\u0116\26\3\2\2\2\u0117\u0118\7\'\2\2\u0118\u0119\7c\2\2"+
"\u0119\u011a\7u\2\2\u011a\u011b\7o\2\2\u011b\u011c\7d\2\2\u011c\u011d"+
"\7k\2\2\u011d\u011e\7p\2\2\u011e\u011f\7c\2\2\u011f\u0120\7t\2\2\u0120"+
"\u0121\7{\2\2\u0121\30\3\2\2\2\u0122\u0123\7\'\2\2\u0123\u0124\7q\2\2"+
"\u0124\u0125\7r\2\2\u0125\u0126\7v\2\2\u0126\u0127\7k\2\2\u0127\u0128"+
"\7q\2\2\u0128\u0129\7p\2\2\u0129\32\3\2\2\2\u012a\u012b\7.\2\2\u012b\34"+
"\3\2\2\2\u012c\u012d\7?\2\2\u012d\36\3\2\2\2\u012e\u012f\7e\2\2\u012f"+
"\u0130\7q\2\2\u0130\u0131\7p\2\2\u0131\u0132\7u\2\2\u0132\u0133\7v\2\2"+
"\u0133 \3\2\2\2\u0134\u0135\7o\2\2\u0135\u0136\7g\2\2\u0136\u0137\7o\2"+
"\2\u0137\u0138\7q\2\2\u0138\u0139\7t\2\2\u0139\u013a\7{\2\2\u013a\"\3"+
"\2\2\2\u013b\u013c\7d\2\2\u013c\u013d\7{\2\2\u013d\u013e\7v\2\2\u013e"+
"\u013f\7g\2\2\u013f$\3\2\2\2\u0140\u0141\7y\2\2\u0141\u0142\7q\2\2\u0142"+
"\u0143\7t\2\2\u0143\u0144\7f\2\2\u0144&\3\2\2\2\u0145\u0146\7h\2\2\u0146"+
"\u0147\7n\2\2\u0147\u0148\7q\2\2\u0148\u0149\7c\2\2\u0149\u014a\7v\2\2"+
"\u014a(\3\2\2\2\u014b\u014c\7u\2\2\u014c\u014d\7v\2\2\u014d\u014e\7t\2"+
"\2\u014e*\3\2\2\2\u014f\u0150\7u\2\2\u0150\u0151\7v\2\2\u0151\u0152\7"+
"t\2\2\u0152\u0153\7a\2\2\u0153\u0154\7r\2\2\u0154,\3\2\2\2\u0155\u0156"+
"\7u\2\2\u0156\u0157\7v\2\2\u0157\u0158\7t\2\2\u0158\u0159\7a\2\2\u0159"+
"\u015a\7u\2\2\u015a.\3\2\2\2\u015b\u015c\7u\2\2\u015c\u015d\7v\2\2\u015d"+
"\u015e\7t\2\2\u015e\u015f\7a\2\2\u015f\u0160\7r\2\2\u0160\u0161\7u\2\2"+
"\u0161\60\3\2\2\2\u0162\u0163\7]\2\2\u0163\62\3\2\2\2\u0164\u0165\7_\2"+
"\2\u0165\64\3\2\2\2\u0166\u0167\7-\2\2\u0167\u0168\7?\2\2\u0168\66\3\2"+
"\2\2\u0169\u016a\7/\2\2\u016a\u016b\7?\2\2\u016b8\3\2\2\2\u016c\u016d"+
"\7\61\2\2\u016d\u016e\7?\2\2\u016e:\3\2\2\2\u016f\u0170\7,\2\2\u0170\u0171"+
"\7?\2\2\u0171<\3\2\2\2\u0172\u0173\7,\2\2\u0173\u0174\7,\2\2\u0174\u0175"+
"\7?\2\2\u0175>\3\2\2\2\u0176\u0177\7(\2\2\u0177\u0178\7?\2\2\u0178@\3"+
"\2\2\2\u0179\u017a\7~\2\2\u017a\u017b\7?\2\2\u017bB\3\2\2\2\u017c\u017d"+
"\7`\2\2\u017d\u017e\7?\2\2\u017eD\3\2\2\2\u017f\u0180\7-\2\2\u0180\u0181"+
"\7-\2\2\u0181F\3\2\2\2\u0182\u0183\7/\2\2\u0183\u0184\7/\2\2\u0184H\3"+
"\2\2\2\u0185\u0186\7*\2\2\u0186J\3\2\2\2\u0187\u0188\7+\2\2\u0188L\3\2"+
"\2\2\u0189\u018a\7-\2\2\u018aN\3\2\2\2\u018b\u018c\7/\2\2\u018cP\3\2\2"+
"\2\u018d\u018e\7,\2\2\u018e\u018f\7,\2\2\u018fR\3\2\2\2\u0190\u0191\7"+
",\2\2\u0191T\3\2\2\2\u0192\u0193\7\61\2\2\u0193V\3\2\2\2\u0194\u0195\7"+
">\2\2\u0195X\3\2\2\2\u0196\u0197\7@\2\2\u0197Z\3\2\2\2\u0198\u0199\7>"+
"\2\2\u0199\u019a\7?\2\2\u019a\\\3\2\2\2\u019b\u019c\7@\2\2\u019c\u019d"+
"\7?\2\2\u019d^\3\2\2\2\u019e\u019f\7?\2\2\u019f\u01a0\7?\2\2\u01a0`\3"+
"\2\2\2\u01a1\u01a2\7#\2\2\u01a2\u01a3\7?\2\2\u01a3b\3\2\2\2\u01a4\u01a5"+
"\7(\2\2\u01a5d\3\2\2\2\u01a6\u01a7\7`\2\2\u01a7f\3\2\2\2\u01a8\u01a9\7"+
"~\2\2\u01a9h\3\2\2\2\u01aa\u01ab\7v\2\2\u01ab\u01ac\7q\2\2\u01acj\3\2"+
"\2\2\u01ad\u01ae\7c\2\2\u01ae\u01af\7p\2\2\u01af\u01b0\7f\2\2\u01b0l\3"+
"\2\2\2\u01b1\u01b2\7q\2\2\u01b2\u01b3\7t\2\2\u01b3n\3\2\2\2\u01b4\u01b5"+
"\7z\2\2\u01b5\u01b6\7q\2\2\u01b6\u01b7\7t\2\2\u01b7p\3\2\2\2\u01b8\u01b9"+
"\7p\2\2\u01b9\u01ba\7q\2\2\u01ba\u01bb\7v\2\2\u01bbr\3\2\2\2\u01bc\u01bd"+
"\7t\2\2\u01bd\u01be\7g\2\2\u01be\u01bf\7v\2\2\u01bf\u01c0\7w\2\2\u01c0"+
"\u01c1\7t\2\2\u01c1\u01c2\7p\2\2\u01c2t\3\2\2\2\u01c3\u01c4\7\60\2\2\u01c4"+
"v\3\2\2\2\u01c5\u01c6\7C\2\2\u01c6x\3\2\2\2\u01c7\u01c8\7Z\2\2\u01c8z"+
"\3\2\2\2\u01c9\u01ca\7[\2\2\u01ca|\3\2\2\2\u01cb\u01cc\7C\2\2\u01cc\u01cd"+
"\7Z\2\2\u01cd~\3\2\2\2\u01ce\u01cf\7C\2\2\u01cf\u01d0\7[\2\2\u01d0\u0080"+
"\3\2\2\2\u01d1\u01d2\7Z\2\2\u01d2\u01d3\7[\2\2\u01d3\u0082\3\2\2\2\u01d4"+
"\u01d5\7R\2\2\u01d5\u01d6\7e\2\2\u01d6\u0084\3\2\2\2\u01d7\u01d8\7R\2"+
"\2\u01d8\u01d9\7|\2\2\u01d9\u0086\3\2\2\2\u01da\u01db\7R\2\2\u01db\u01dc"+
"\7p\2\2\u01dc\u0088\3\2\2\2\u01dd\u01de\7R\2\2\u01de\u01df\7x\2\2\u01df"+
"\u008a\3\2\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7t\2\2\u01e2\u01e3\7w\2"+
"\2\u01e3\u01e4\7g\2\2\u01e4\u008c\3\2\2\2\u01e5\u01e6\7h\2\2\u01e6\u01e7"+
"\7c\2\2\u01e7\u01e8\7n\2\2\u01e8\u01e9\7u\2\2\u01e9\u01ea\7g\2\2\u01ea"+
"\u008e\3\2\2\2\u01eb\u01ec\7\'\2\2\u01ec\u01ed\7c\2\2\u01ed\u01ee\7u\2"+
"\2\u01ee\u01ef\7o\2\2\u01ef\u0090\3\2\2\2\u01f0\u01f1\7u\2\2\u01f1\u01f2"+
"\7w\2\2\u01f2\u01f3\7d\2\2\u01f3\u0092\3\2\2\2\u01f4\u01f5\7/\2\2\u01f5"+
"\u01f6\7@\2\2\u01f6\u0094\3\2\2\2\u01f7\u01f8\7}\2\2\u01f8\u0096\3\2\2"+
"\2\u01f9\u01fa\7\177\2\2\u01fa\u0098\3\2\2\2\u01fb\u01fc\7A\2\2\u01fc"+
"\u009a\3\2\2\2\u01fd\u01fe\7k\2\2\u01fe\u01ff\7h\2\2\u01ff\u009c\3\2\2"+
"\2\u0200\u0201\7g\2\2\u0201\u0202\7n\2\2\u0202\u0203\7u\2\2\u0203\u0204"+
"\7g\2\2\u0204\u009e\3\2\2\2\u0205\u0206\7k\2\2\u0206\u0207\7h\2\2\u0207"+
"\u0208\7a\2\2\u0208\u0209\7e\2\2\u0209\u020a\7u\2\2\u020a\u00a0\3\2\2"+
"\2\u020b\u020c\7k\2\2\u020c\u020d\7h\2\2\u020d\u020e\7a\2\2\u020e\u020f"+
"\7e\2\2\u020f\u0210\7e\2\2\u0210\u00a2\3\2\2\2\u0211\u0212\7k\2\2\u0212"+
"\u0213\7h\2\2\u0213\u0214\7a\2\2\u0214\u0215\7g\2\2\u0215\u0216\7s\2\2"+
"\u0216\u00a4\3\2\2\2\u0217\u0218\7k\2\2\u0218\u0219\7h\2\2\u0219\u021a"+
"\7a\2\2\u021a\u021b\7p\2\2\u021b\u021c\7g\2\2\u021c\u00a6\3\2\2\2\u021d"+
"\u021e\7k\2\2\u021e\u021f\7h\2\2\u021f\u0220\7a\2\2\u0220\u0221\7r\2\2"+
"\u0221\u0222\7n\2\2\u0222\u00a8\3\2\2\2\u0223\u0224\7k\2\2\u0224\u0225"+
"\7h\2\2\u0225\u0226\7a\2\2\u0226\u0227\7o\2\2\u0227\u0228\7k\2\2\u0228"+
"\u00aa\3\2\2\2\u0229\u022a\7k\2\2\u022a\u022b\7h\2\2\u022b\u022c\7a\2"+
"\2\u022c\u022d\7x\2\2\u022d\u022e\7u\2\2\u022e\u00ac\3\2\2\2\u022f\u0230"+
"\7k\2\2\u0230\u0231\7h\2\2\u0231\u0232\7a\2\2\u0232\u0233\7x\2\2\u0233"+
"\u0234\7e\2\2\u0234\u00ae\3\2\2\2\u0235\u0239\t\2\2\2\u0236\u0238\t\3"+
"\2\2\u0237\u0236\3\2\2\2\u0238\u023b\3\2\2\2\u0239\u0237\3\2\2\2\u0239"+
"\u023a\3\2\2\2\u023a\u023c\3\2\2\2\u023b\u0239\3\2\2\2\u023c\u023d\5\u00b1"+
"Y\2\u023d\u023e\3\2\2\2\u023e\u023f\bX\2\2\u023f\u00b0\3\2\2\2\u0240\u0244"+
"\7=\2\2\u0241\u0243\n\2\2\2\u0242\u0241\3\2\2\2\u0243\u0246\3\2\2\2\u0244"+
"\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0247\3\2\2\2\u0246\u0244\3\2"+
"\2\2\u0247\u0248\bY\2\2\u0248\u00b2\3\2\2\2\u0249\u024a\t\3\2\2\u024a"+
"\u024b\3\2\2\2\u024b\u024c\bZ\3\2\u024c\u00b4\3\2\2\2\u024d\u024f\t\2"+
"\2\2\u024e\u024d\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u024e\3\2\2\2\u0250"+
"\u0251\3\2\2\2\u0251\u00b6\3\2\2\2\u0252\u0256\t\4\2\2\u0253\u0255\t\5"+
"\2\2\u0254\u0253\3\2\2\2\u0255\u0258\3\2\2\2\u0256\u0254\3\2\2\2\u0256"+
"\u0257\3\2\2\2\u0257\u00b8\3\2\2\2\u0258\u0256\3\2\2\2\u0259\u0261\4\62"+
";\2\u025a\u025c\4\63;\2\u025b\u025d\4\62;\2\u025c\u025b\3\2\2\2\u025d"+
"\u025e\3\2\2\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f\u0261\3\2"+
"\2\2\u0260\u0259\3\2\2\2\u0260\u025a\3\2\2\2\u0261\u00ba\3\2\2\2\u0262"+
"\u0264\7&\2\2\u0263\u0265\t\6\2\2\u0264\u0263\3\2\2\2\u0265\u0266\3\2"+
"\2\2\u0266\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267\u00bc\3\2\2\2\u0268"+
"\u026a\7\'\2\2\u0269\u026b\4\62\63\2\u026a\u0269\3\2\2\2\u026b\u026c\3"+
"\2\2\2\u026c\u026a\3\2\2\2\u026c\u026d\3\2\2\2\u026d\u00be\3\2\2\2\u026e"+
"\u0274\5\u00c1a\2\u026f\u0271\t\7\2\2\u0270\u0272\t\b\2\2\u0271\u0270"+
"\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u0275\5\u00c1a"+
"\2\u0274\u026f\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u00c0\3\2\2\2\u0276\u0278"+
"\4\62;\2\u0277\u0276\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u0277\3\2\2\2\u0279"+
"\u027a\3\2\2\2\u027a\u0281\3\2\2\2\u027b\u027d\7\60\2\2\u027c\u027e\4"+
"\62;\2\u027d\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u027d\3\2\2\2\u027f"+
"\u0280\3\2\2\2\u0280\u0282\3\2\2\2\u0281\u027b\3\2\2\2\u0281\u0282\3\2"+
"\2\2\u0282\u00c2\3\2\2\2\u0283\u0284\7^\2\2\u0284\u0288\13\2\2\2\u0285"+
"\u0286\7^\2\2\u0286\u0288\5\u00b5[\2\u0287\u0283\3\2\2\2\u0287\u0285\3"+
"\2\2\2\u0288\u00c4\3\2\2\2\u0289\u028e\7$\2\2\u028a\u028d\5\u00c3b\2\u028b"+
"\u028d\n\t\2\2\u028c\u028a\3\2\2\2\u028c\u028b\3\2\2\2\u028d\u0290\3\2"+
"\2\2\u028e\u028c\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u0291\3\2\2\2\u0290"+
"\u028e\3\2\2\2\u0291\u0292\7$\2\2\u0292\u0293\bc\4\2\u0293\u00c6\3\2\2"+
"\2\u0294\u0295\7}\2\2\u0295\u0296\7}\2\2\u0296\u0298\3\2\2\2\u0297\u0299"+
"\13\2\2\2\u0298\u0297\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029b\3\2\2\2"+
"\u029a\u0298\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u029d\7\177\2\2\u029d\u029e"+
"\7\177\2\2\u029e\u029f\3\2\2\2\u029f\u02a0\bd\5\2\u02a0\u00c8\3\2\2\2"+
"\25\2\u0239\u0244\u0250\u0256\u025e\u0260\u0264\u0266\u026c\u0271\u0274"+
"\u0279\u027f\u0281\u0287\u028c\u028e\u029a\6\2\3\2\b\2\2\3c\2\3d\3";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -76,17 +76,25 @@ T__74=75
T__75=76
T__76=77
T__77=78
LINECOMMENT=79
COMMENT=80
WS=81
EOL=82
NAME=83
DEC_INTEGER=84
HEX_INTEGER=85
BIN_INTEGER=86
FLOAT_NUMBER=87
STRING=88
INLINEASMBLOCK=89
T__78=79
T__79=80
T__80=81
T__81=82
T__82=83
T__83=84
T__84=85
T__85=86
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
'~'=1
':'=2
'goto'=3
@ -165,3 +173,11 @@ INLINEASMBLOCK=89
'?'=76
'if'=77
'else'=78
'if_cs'=79
'if_cc'=80
'if_eq'=81
'if_ne'=82
'if_pl'=83
'if_mi'=84
'if_vs'=85
'if_vc'=86

File diff suppressed because it is too large Load Diff