1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-19 08:31:01 +00:00

Added enum syntax (no functionality yet). Working on #119

This commit is contained in:
jespergravgaard 2019-06-18 18:36:01 +02:00
parent d111836faf
commit e4af001041
12 changed files with 1906 additions and 1341 deletions

View File

@ -24,6 +24,7 @@ declSeq
decl
: declVariables ';'
| structDef ';'
| enumDef ';'
| declFunction
| declFunction
| declKasm
@ -123,6 +124,8 @@ typeDecl
| typeDecl '(' ')' #typeProcedure
| structDef #typeStructDef
| structRef #typeStructRef
| enumDef #typeEnumDef
| enumRef #typeEnumRef
| NAME #typeNamedRef
;
@ -138,6 +141,23 @@ structMembers
: declVariables ';'
;
enumRef
: 'enum' NAME
;
enumDef
: 'enum' NAME '{' enumMemberList '}'
;
enumMemberList
: enumMember
| enumMemberList ',' enumMember
;
enumMember
: NAME ( '=' expr )?
;
commaExpr
: expr #commaNone
| commaExpr ',' expr #commaSimple

View File

@ -78,26 +78,27 @@ T__76=77
T__77=78
T__78=79
T__79=80
MNEMONIC=81
KICKASM=82
SIMPLETYPE=83
STRING=84
CHAR=85
BOOLEAN=86
NUMBER=87
NUMFLOAT=88
BINFLOAT=89
DECFLOAT=90
HEXFLOAT=91
NUMINT=92
BININTEGER=93
DECINTEGER=94
HEXINTEGER=95
NAME=96
ASMREL=97
WS=98
COMMENT_LINE=99
COMMENT_BLOCK=100
T__80=81
MNEMONIC=82
KICKASM=83
SIMPLETYPE=84
STRING=85
CHAR=86
BOOLEAN=87
NUMBER=88
NUMFLOAT=89
BINFLOAT=90
DECFLOAT=91
HEXFLOAT=92
NUMINT=93
BININTEGER=94
DECINTEGER=95
HEXINTEGER=96
NAME=97
ASMREL=98
WS=99
COMMENT_LINE=100
COMMENT_BLOCK=101
'import'=1
';'=2
'typedef'=3
@ -135,46 +136,47 @@ COMMENT_BLOCK=100
'['=35
']'=36
'struct'=37
'.'=38
'->'=39
'sizeof'=40
'typeid'=41
'--'=42
'++'=43
'+'=44
'-'=45
'!'=46
'&'=47
'~'=48
'>>'=49
'<<'=50
'/'=51
'%'=52
'<'=53
'>'=54
'=='=55
'!='=56
'<='=57
'>='=58
'^'=59
'|'=60
'&&'=61
'||'=62
'?'=63
'+='=64
'-='=65
'*='=66
'/='=67
'%='=68
'<<='=69
'>>='=70
'&='=71
'|='=72
'^='=73
'kickasm'=74
'resource'=75
'uses'=76
'clobbers'=77
'bytes'=78
'cycles'=79
'.byte'=80
'enum'=38
'.'=39
'->'=40
'sizeof'=41
'typeid'=42
'--'=43
'++'=44
'+'=45
'-'=46
'!'=47
'&'=48
'~'=49
'>>'=50
'<<'=51
'/'=52
'%'=53
'<'=54
'>'=55
'=='=56
'!='=57
'<='=58
'>='=59
'^'=60
'|'=61
'&&'=62
'||'=63
'?'=64
'+='=65
'-='=66
'*='=67
'/='=68
'%='=69
'<<='=70
'>>='=71
'&='=72
'|='=73
'^='=74
'kickasm'=75
'resource'=76
'uses'=77
'clobbers'=78
'bytes'=79
'cycles'=80
'.byte'=81

View File

@ -647,6 +647,30 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterTypeEnumRef(KickCParser.TypeEnumRefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitTypeEnumRef(KickCParser.TypeEnumRefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterTypeEnumDef(KickCParser.TypeEnumDefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitTypeEnumDef(KickCParser.TypeEnumDefContext ctx) { }
/**
* {@inheritDoc}
*
@ -683,6 +707,54 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitStructMembers(KickCParser.StructMembersContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterEnumRef(KickCParser.EnumRefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitEnumRef(KickCParser.EnumRefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterEnumDef(KickCParser.EnumDefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitEnumDef(KickCParser.EnumDefContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterEnumMemberList(KickCParser.EnumMemberListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitEnumMemberList(KickCParser.EnumMemberListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterEnumMember(KickCParser.EnumMemberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitEnumMember(KickCParser.EnumMemberContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -382,6 +382,20 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeEnumRef(KickCParser.TypeEnumRefContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeEnumDef(KickCParser.TypeEnumDefContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -403,6 +417,34 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStructMembers(KickCParser.StructMembersContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEnumRef(KickCParser.EnumRefContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEnumDef(KickCParser.EnumDefContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEnumMemberList(KickCParser.EnumMemberListContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEnumMember(KickCParser.EnumMemberContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -28,10 +28,10 @@ public class KickCLexer extends Lexer {
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, T__78=79, T__79=80,
MNEMONIC=81, KICKASM=82, SIMPLETYPE=83, STRING=84, CHAR=85, BOOLEAN=86,
NUMBER=87, NUMFLOAT=88, BINFLOAT=89, DECFLOAT=90, HEXFLOAT=91, NUMINT=92,
BININTEGER=93, DECINTEGER=94, HEXINTEGER=95, NAME=96, ASMREL=97, WS=98,
COMMENT_LINE=99, COMMENT_BLOCK=100;
T__80=81, MNEMONIC=82, KICKASM=83, SIMPLETYPE=84, STRING=85, CHAR=86,
BOOLEAN=87, NUMBER=88, NUMFLOAT=89, BINFLOAT=90, DECFLOAT=91, HEXFLOAT=92,
NUMINT=93, BININTEGER=94, DECINTEGER=95, HEXINTEGER=96, NAME=97, ASMREL=98,
WS=99, COMMENT_LINE=100, COMMENT_BLOCK=101;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -50,11 +50,11 @@ public class KickCLexer 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", "T__78", "T__79", "MNEMONIC",
"KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START",
"NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER",
"NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME",
"NAME_START", "NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
private static final String[] _LITERAL_NAMES = {
@ -63,12 +63,12 @@ public class KickCLexer extends Lexer {
"'register'", "'inline'", "'volatile'", "'interrupt'", "'reserve'", "'if'",
"'else'", "'while'", "'do'", "'for'", "'return'", "'break'", "'continue'",
"'asm'", "':'", "'..'", "'signed'", "'unsigned'", "'*'", "'['", "']'",
"'struct'", "'.'", "'->'", "'sizeof'", "'typeid'", "'--'", "'++'", "'+'",
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='",
"'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='",
"'kickasm'", "'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'",
"'.byte'"
"'struct'", "'enum'", "'.'", "'->'", "'sizeof'", "'typeid'", "'--'", "'++'",
"'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'",
"'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'",
"'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='",
"'^='", "'kickasm'", "'resource'", "'uses'", "'clobbers'", "'bytes'",
"'cycles'", "'.byte'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -77,10 +77,10 @@ public class KickCLexer 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, null, null, "MNEMONIC", "KICKASM",
"SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -140,7 +140,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2f\u0408\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2g\u040f\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"+
@ -151,367 +151,370 @@ public class KickCLexer extends Lexer {
"\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\\\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\3\2\3"+
"\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5"+
"\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\f\3\r\3\r"+
"\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3"+
"\17\3\17\3\17\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\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3"+
"\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3"+
"\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3"+
"\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3"+
"\31\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3"+
"\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3"+
"\36\3\36\3\36\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)\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\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64"+
"\3\64\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\39\39\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\3G\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3"+
"K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3"+
"N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3"+
"Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3"+
"R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\5R\u0309\nR\3S\3"+
"S\3S\3S\7S\u030f\nS\fS\16S\u0312\13S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T"+
"\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T"+
"\3T\3T\3T\3T\3T\3T\5T\u033c\nT\3U\3U\3U\3U\7U\u0342\nU\fU\16U\u0345\13"+
"U\3U\3U\5U\u0349\nU\3U\3U\5U\u034d\nU\5U\u034f\nU\3U\5U\u0352\nU\3V\3"+
"V\3V\3V\5V\u0358\nV\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\5W\u0365\nW\3X\3"+
"X\5X\u0369\nX\3Y\3Y\3Y\5Y\u036e\nY\3Z\3Z\3Z\3Z\3Z\5Z\u0375\nZ\3Z\7Z\u0378"+
"\nZ\fZ\16Z\u037b\13Z\3Z\3Z\6Z\u037f\nZ\rZ\16Z\u0380\3[\7[\u0384\n[\f["+
"\16[\u0387\13[\3[\3[\6[\u038b\n[\r[\16[\u038c\3\\\3\\\3\\\3\\\3\\\5\\"+
"\u0394\n\\\3\\\7\\\u0397\n\\\f\\\16\\\u039a\13\\\3\\\3\\\6\\\u039e\n\\"+
"\r\\\16\\\u039f\3]\3]\3]\5]\u03a5\n]\3]\3]\3]\5]\u03aa\n]\3^\3^\3^\6^"+
"\u03af\n^\r^\16^\u03b0\3^\3^\6^\u03b5\n^\r^\16^\u03b6\5^\u03b9\n^\3_\6"+
"_\u03bc\n_\r_\16_\u03bd\3`\3`\3`\3`\3`\5`\u03c5\n`\3`\6`\u03c8\n`\r`\16"+
"`\u03c9\3a\3a\3b\3b\3c\3c\3d\3d\7d\u03d4\nd\fd\16d\u03d7\13d\3e\3e\3f"+
"\3f\3g\3g\7g\u03df\ng\fg\16g\u03e2\13g\3g\6g\u03e5\ng\rg\16g\u03e6\3h"+
"\6h\u03ea\nh\rh\16h\u03eb\3h\3h\3i\3i\3i\3i\7i\u03f4\ni\fi\16i\u03f7\13"+
"i\3i\3i\3j\3j\3j\3j\7j\u03ff\nj\fj\16j\u0402\13j\3j\3j\3j\3j\3j\4\u0310"+
"\u0400\2k\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\65"+
"i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b"+
"G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f"+
"Q\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3"+
"[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1\2\u00c3\2\u00c5\2\u00c7"+
"b\u00c9\2\u00cb\2\u00cdc\u00cfd\u00d1e\u00d3f\3\2\22\3\2$$\3\2||\4\2r"+
"ruu\4\2ooww\3\2))\4\2uuww\7\2dfkknnuuyy\4\2DDdd\3\2\62\63\3\2\62;\5\2"+
"\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\6\2\13\f\17\17\"\"\u00a2\u00a2"+
"\4\2\f\f\17\17\2\u047a\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\2"+
"Q\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\2"+
"w\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\u00c7"+
"\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2"+
"\2\3\u00d5\3\2\2\2\5\u00dc\3\2\2\2\7\u00de\3\2\2\2\t\u00e6\3\2\2\2\13"+
"\u00e8\3\2\2\2\r\u00ea\3\2\2\2\17\u00ec\3\2\2\2\21\u00ee\3\2\2\2\23\u00f0"+
"\3\2\2\2\25\u00f2\3\2\2\2\27\u00f4\3\2\2\2\31\u00f7\3\2\2\2\33\u0100\3"+
"\2\2\2\35\u0106\3\2\2\2\37\u010d\3\2\2\2!\u0113\3\2\2\2#\u011c\3\2\2\2"+
"%\u0123\3\2\2\2\'\u012c\3\2\2\2)\u0136\3\2\2\2+\u013e\3\2\2\2-\u0141\3"+
"\2\2\2/\u0146\3\2\2\2\61\u014c\3\2\2\2\63\u014f\3\2\2\2\65\u0153\3\2\2"+
"\2\67\u015a\3\2\2\29\u0160\3\2\2\2;\u0169\3\2\2\2=\u016d\3\2\2\2?\u016f"+
"\3\2\2\2A\u0172\3\2\2\2C\u0179\3\2\2\2E\u0182\3\2\2\2G\u0184\3\2\2\2I"+
"\u0186\3\2\2\2K\u0188\3\2\2\2M\u018f\3\2\2\2O\u0191\3\2\2\2Q\u0194\3\2"+
"\2\2S\u019b\3\2\2\2U\u01a2\3\2\2\2W\u01a5\3\2\2\2Y\u01a8\3\2\2\2[\u01aa"+
"\3\2\2\2]\u01ac\3\2\2\2_\u01ae\3\2\2\2a\u01b0\3\2\2\2c\u01b2\3\2\2\2e"+
"\u01b5\3\2\2\2g\u01b8\3\2\2\2i\u01ba\3\2\2\2k\u01bc\3\2\2\2m\u01be\3\2"+
"\2\2o\u01c0\3\2\2\2q\u01c3\3\2\2\2s\u01c6\3\2\2\2u\u01c9\3\2\2\2w\u01cc"+
"\3\2\2\2y\u01ce\3\2\2\2{\u01d0\3\2\2\2}\u01d3\3\2\2\2\177\u01d6\3\2\2"+
"\2\u0081\u01d8\3\2\2\2\u0083\u01db\3\2\2\2\u0085\u01de\3\2\2\2\u0087\u01e1"+
"\3\2\2\2\u0089\u01e4\3\2\2\2\u008b\u01e7\3\2\2\2\u008d\u01eb\3\2\2\2\u008f"+
"\u01ef\3\2\2\2\u0091\u01f2\3\2\2\2\u0093\u01f5\3\2\2\2\u0095\u01f8\3\2"+
"\2\2\u0097\u0200\3\2\2\2\u0099\u0209\3\2\2\2\u009b\u020e\3\2\2\2\u009d"+
"\u0217\3\2\2\2\u009f\u021d\3\2\2\2\u00a1\u0224\3\2\2\2\u00a3\u0308\3\2"+
"\2\2\u00a5\u030a\3\2\2\2\u00a7\u033b\3\2\2\2\u00a9\u033d\3\2\2\2\u00ab"+
"\u0353\3\2\2\2\u00ad\u0364\3\2\2\2\u00af\u0368\3\2\2\2\u00b1\u036d\3\2"+
"\2\2\u00b3\u0374\3\2\2\2\u00b5\u0385\3\2\2\2\u00b7\u0393\3\2\2\2\u00b9"+
"\u03a4\3\2\2\2\u00bb\u03b8\3\2\2\2\u00bd\u03bb\3\2\2\2\u00bf\u03c4\3\2"+
"\2\2\u00c1\u03cb\3\2\2\2\u00c3\u03cd\3\2\2\2\u00c5\u03cf\3\2\2\2\u00c7"+
"\u03d1\3\2\2\2\u00c9\u03d8\3\2\2\2\u00cb\u03da\3\2\2\2\u00cd\u03dc\3\2"+
"\2\2\u00cf\u03e9\3\2\2\2\u00d1\u03ef\3\2\2\2\u00d3\u03fa\3\2\2\2\u00d5"+
"\u00d6\7k\2\2\u00d6\u00d7\7o\2\2\u00d7\u00d8\7r\2\2\u00d8\u00d9\7q\2\2"+
"\u00d9\u00da\7t\2\2\u00da\u00db\7v\2\2\u00db\4\3\2\2\2\u00dc\u00dd\7="+
"\2\2\u00dd\6\3\2\2\2\u00de\u00df\7v\2\2\u00df\u00e0\7{\2\2\u00e0\u00e1"+
"\7r\2\2\u00e1\u00e2\7g\2\2\u00e2\u00e3\7f\2\2\u00e3\u00e4\7g\2\2\u00e4"+
"\u00e5\7h\2\2\u00e5\b\3\2\2\2\u00e6\u00e7\7.\2\2\u00e7\n\3\2\2\2\u00e8"+
"\u00e9\7?\2\2\u00e9\f\3\2\2\2\u00ea\u00eb\7*\2\2\u00eb\16\3\2\2\2\u00ec"+
"\u00ed\7+\2\2\u00ed\20\3\2\2\2\u00ee\u00ef\7}\2\2\u00ef\22\3\2\2\2\u00f0"+
"\u00f1\7\177\2\2\u00f1\24\3\2\2\2\u00f2\u00f3\7%\2\2\u00f3\26\3\2\2\2"+
"\u00f4\u00f5\7r\2\2\u00f5\u00f6\7e\2\2\u00f6\30\3\2\2\2\u00f7\u00f8\7"+
"g\2\2\u00f8\u00f9\7p\2\2\u00f9\u00fa\7e\2\2\u00fa\u00fb\7q\2\2\u00fb\u00fc"+
"\7f\2\2\u00fc\u00fd\7k\2\2\u00fd\u00fe\7p\2\2\u00fe\u00ff\7i\2\2\u00ff"+
"\32\3\2\2\2\u0100\u0101\7e\2\2\u0101\u0102\7q\2\2\u0102\u0103\7p\2\2\u0103"+
"\u0104\7u\2\2\u0104\u0105\7v\2\2\u0105\34\3\2\2\2\u0106\u0107\7g\2\2\u0107"+
"\u0108\7z\2\2\u0108\u0109\7v\2\2\u0109\u010a\7g\2\2\u010a\u010b\7t\2\2"+
"\u010b\u010c\7p\2\2\u010c\36\3\2\2\2\u010d\u010e\7c\2\2\u010e\u010f\7"+
"n\2\2\u010f\u0110\7k\2\2\u0110\u0111\7i\2\2\u0111\u0112\7p\2\2\u0112 "+
"\3\2\2\2\u0113\u0114\7t\2\2\u0114\u0115\7g\2\2\u0115\u0116\7i\2\2\u0116"+
"\u0117\7k\2\2\u0117\u0118\7u\2\2\u0118\u0119\7v\2\2\u0119\u011a\7g\2\2"+
"\u011a\u011b\7t\2\2\u011b\"\3\2\2\2\u011c\u011d\7k\2\2\u011d\u011e\7p"+
"\2\2\u011e\u011f\7n\2\2\u011f\u0120\7k\2\2\u0120\u0121\7p\2\2\u0121\u0122"+
"\7g\2\2\u0122$\3\2\2\2\u0123\u0124\7x\2\2\u0124\u0125\7q\2\2\u0125\u0126"+
"\7n\2\2\u0126\u0127\7c\2\2\u0127\u0128\7v\2\2\u0128\u0129\7k\2\2\u0129"+
"\u012a\7n\2\2\u012a\u012b\7g\2\2\u012b&\3\2\2\2\u012c\u012d\7k\2\2\u012d"+
"\u012e\7p\2\2\u012e\u012f\7v\2\2\u012f\u0130\7g\2\2\u0130\u0131\7t\2\2"+
"\u0131\u0132\7t\2\2\u0132\u0133\7w\2\2\u0133\u0134\7r\2\2\u0134\u0135"+
"\7v\2\2\u0135(\3\2\2\2\u0136\u0137\7t\2\2\u0137\u0138\7g\2\2\u0138\u0139"+
"\7u\2\2\u0139\u013a\7g\2\2\u013a\u013b\7t\2\2\u013b\u013c\7x\2\2\u013c"+
"\u013d\7g\2\2\u013d*\3\2\2\2\u013e\u013f\7k\2\2\u013f\u0140\7h\2\2\u0140"+
",\3\2\2\2\u0141\u0142\7g\2\2\u0142\u0143\7n\2\2\u0143\u0144\7u\2\2\u0144"+
"\u0145\7g\2\2\u0145.\3\2\2\2\u0146\u0147\7y\2\2\u0147\u0148\7j\2\2\u0148"+
"\u0149\7k\2\2\u0149\u014a\7n\2\2\u014a\u014b\7g\2\2\u014b\60\3\2\2\2\u014c"+
"\u014d\7f\2\2\u014d\u014e\7q\2\2\u014e\62\3\2\2\2\u014f\u0150\7h\2\2\u0150"+
"\u0151\7q\2\2\u0151\u0152\7t\2\2\u0152\64\3\2\2\2\u0153\u0154\7t\2\2\u0154"+
"\u0155\7g\2\2\u0155\u0156\7v\2\2\u0156\u0157\7w\2\2\u0157\u0158\7t\2\2"+
"\u0158\u0159\7p\2\2\u0159\66\3\2\2\2\u015a\u015b\7d\2\2\u015b\u015c\7"+
"t\2\2\u015c\u015d\7g\2\2\u015d\u015e\7c\2\2\u015e\u015f\7m\2\2\u015f8"+
"\3\2\2\2\u0160\u0161\7e\2\2\u0161\u0162\7q\2\2\u0162\u0163\7p\2\2\u0163"+
"\u0164\7v\2\2\u0164\u0165\7k\2\2\u0165\u0166\7p\2\2\u0166\u0167\7w\2\2"+
"\u0167\u0168\7g\2\2\u0168:\3\2\2\2\u0169\u016a\7c\2\2\u016a\u016b\7u\2"+
"\2\u016b\u016c\7o\2\2\u016c<\3\2\2\2\u016d\u016e\7<\2\2\u016e>\3\2\2\2"+
"\u016f\u0170\7\60\2\2\u0170\u0171\7\60\2\2\u0171@\3\2\2\2\u0172\u0173"+
"\7u\2\2\u0173\u0174\7k\2\2\u0174\u0175\7i\2\2\u0175\u0176\7p\2\2\u0176"+
"\u0177\7g\2\2\u0177\u0178\7f\2\2\u0178B\3\2\2\2\u0179\u017a\7w\2\2\u017a"+
"\u017b\7p\2\2\u017b\u017c\7u\2\2\u017c\u017d\7k\2\2\u017d\u017e\7i\2\2"+
"\u017e\u017f\7p\2\2\u017f\u0180\7g\2\2\u0180\u0181\7f\2\2\u0181D\3\2\2"+
"\2\u0182\u0183\7,\2\2\u0183F\3\2\2\2\u0184\u0185\7]\2\2\u0185H\3\2\2\2"+
"\u0186\u0187\7_\2\2\u0187J\3\2\2\2\u0188\u0189\7u\2\2\u0189\u018a\7v\2"+
"\2\u018a\u018b\7t\2\2\u018b\u018c\7w\2\2\u018c\u018d\7e\2\2\u018d\u018e"+
"\7v\2\2\u018eL\3\2\2\2\u018f\u0190\7\60\2\2\u0190N\3\2\2\2\u0191\u0192"+
"\7/\2\2\u0192\u0193\7@\2\2\u0193P\3\2\2\2\u0194\u0195\7u\2\2\u0195\u0196"+
"\7k\2\2\u0196\u0197\7|\2\2\u0197\u0198\7g\2\2\u0198\u0199\7q\2\2\u0199"+
"\u019a\7h\2\2\u019aR\3\2\2\2\u019b\u019c\7v\2\2\u019c\u019d\7{\2\2\u019d"+
"\u019e\7r\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7f\2\2"+
"\u01a1T\3\2\2\2\u01a2\u01a3\7/\2\2\u01a3\u01a4\7/\2\2\u01a4V\3\2\2\2\u01a5"+
"\u01a6\7-\2\2\u01a6\u01a7\7-\2\2\u01a7X\3\2\2\2\u01a8\u01a9\7-\2\2\u01a9"+
"Z\3\2\2\2\u01aa\u01ab\7/\2\2\u01ab\\\3\2\2\2\u01ac\u01ad\7#\2\2\u01ad"+
"^\3\2\2\2\u01ae\u01af\7(\2\2\u01af`\3\2\2\2\u01b0\u01b1\7\u0080\2\2\u01b1"+
"b\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3\u01b4\7@\2\2\u01b4d\3\2\2\2\u01b5\u01b6"+
"\7>\2\2\u01b6\u01b7\7>\2\2\u01b7f\3\2\2\2\u01b8\u01b9\7\61\2\2\u01b9h"+
"\3\2\2\2\u01ba\u01bb\7\'\2\2\u01bbj\3\2\2\2\u01bc\u01bd\7>\2\2\u01bdl"+
"\3\2\2\2\u01be\u01bf\7@\2\2\u01bfn\3\2\2\2\u01c0\u01c1\7?\2\2\u01c1\u01c2"+
"\7?\2\2\u01c2p\3\2\2\2\u01c3\u01c4\7#\2\2\u01c4\u01c5\7?\2\2\u01c5r\3"+
"\2\2\2\u01c6\u01c7\7>\2\2\u01c7\u01c8\7?\2\2\u01c8t\3\2\2\2\u01c9\u01ca"+
"\7@\2\2\u01ca\u01cb\7?\2\2\u01cbv\3\2\2\2\u01cc\u01cd\7`\2\2\u01cdx\3"+
"\2\2\2\u01ce\u01cf\7~\2\2\u01cfz\3\2\2\2\u01d0\u01d1\7(\2\2\u01d1\u01d2"+
"\7(\2\2\u01d2|\3\2\2\2\u01d3\u01d4\7~\2\2\u01d4\u01d5\7~\2\2\u01d5~\3"+
"\2\2\2\u01d6\u01d7\7A\2\2\u01d7\u0080\3\2\2\2\u01d8\u01d9\7-\2\2\u01d9"+
"\u01da\7?\2\2\u01da\u0082\3\2\2\2\u01db\u01dc\7/\2\2\u01dc\u01dd\7?\2"+
"\2\u01dd\u0084\3\2\2\2\u01de\u01df\7,\2\2\u01df\u01e0\7?\2\2\u01e0\u0086"+
"\3\2\2\2\u01e1\u01e2\7\61\2\2\u01e2\u01e3\7?\2\2\u01e3\u0088\3\2\2\2\u01e4"+
"\u01e5\7\'\2\2\u01e5\u01e6\7?\2\2\u01e6\u008a\3\2\2\2\u01e7\u01e8\7>\2"+
"\2\u01e8\u01e9\7>\2\2\u01e9\u01ea\7?\2\2\u01ea\u008c\3\2\2\2\u01eb\u01ec"+
"\7@\2\2\u01ec\u01ed\7@\2\2\u01ed\u01ee\7?\2\2\u01ee\u008e\3\2\2\2\u01ef"+
"\u01f0\7(\2\2\u01f0\u01f1\7?\2\2\u01f1\u0090\3\2\2\2\u01f2\u01f3\7~\2"+
"\2\u01f3\u01f4\7?\2\2\u01f4\u0092\3\2\2\2\u01f5\u01f6\7`\2\2\u01f6\u01f7"+
"\7?\2\2\u01f7\u0094\3\2\2\2\u01f8\u01f9\7m\2\2\u01f9\u01fa\7k\2\2\u01fa"+
"\u01fb\7e\2\2\u01fb\u01fc\7m\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe\7u\2\2"+
"\u01fe\u01ff\7o\2\2\u01ff\u0096\3\2\2\2\u0200\u0201\7t\2\2\u0201\u0202"+
"\7g\2\2\u0202\u0203\7u\2\2\u0203\u0204\7q\2\2\u0204\u0205\7w\2\2\u0205"+
"\u0206\7t\2\2\u0206\u0207\7e\2\2\u0207\u0208\7g\2\2\u0208\u0098\3\2\2"+
"\2\u0209\u020a\7w\2\2\u020a\u020b\7u\2\2\u020b\u020c\7g\2\2\u020c\u020d"+
"\7u\2\2\u020d\u009a\3\2\2\2\u020e\u020f\7e\2\2\u020f\u0210\7n\2\2\u0210"+
"\u0211\7q\2\2\u0211\u0212\7d\2\2\u0212\u0213\7d\2\2\u0213\u0214\7g\2\2"+
"\u0214\u0215\7t\2\2\u0215\u0216\7u\2\2\u0216\u009c\3\2\2\2\u0217\u0218"+
"\7d\2\2\u0218\u0219\7{\2\2\u0219\u021a\7v\2\2\u021a\u021b\7g\2\2\u021b"+
"\u021c\7u\2\2\u021c\u009e\3\2\2\2\u021d\u021e\7e\2\2\u021e\u021f\7{\2"+
"\2\u021f\u0220\7e\2\2\u0220\u0221\7n\2\2\u0221\u0222\7g\2\2\u0222\u0223"+
"\7u\2\2\u0223\u00a0\3\2\2\2\u0224\u0225\7\60\2\2\u0225\u0226\7d\2\2\u0226"+
"\u0227\7{\2\2\u0227\u0228\7v\2\2\u0228\u0229\7g\2\2\u0229\u00a2\3\2\2"+
"\2\u022a\u022b\7d\2\2\u022b\u022c\7t\2\2\u022c\u0309\7m\2\2\u022d\u022e"+
"\7q\2\2\u022e\u022f\7t\2\2\u022f\u0309\7c\2\2\u0230\u0231\7m\2\2\u0231"+
"\u0232\7k\2\2\u0232\u0309\7n\2\2\u0233\u0234\7u\2\2\u0234\u0235\7n\2\2"+
"\u0235\u0309\7q\2\2\u0236\u0237\7p\2\2\u0237\u0238\7q\2\2\u0238\u0309"+
"\7r\2\2\u0239\u023a\7c\2\2\u023a\u023b\7u\2\2\u023b\u0309\7n\2\2\u023c"+
"\u023d\7r\2\2\u023d\u023e\7j\2\2\u023e\u0309\7r\2\2\u023f\u0240\7c\2\2"+
"\u0240\u0241\7p\2\2\u0241\u0309\7e\2\2\u0242\u0243\7d\2\2\u0243\u0244"+
"\7r\2\2\u0244\u0309\7n\2\2\u0245\u0246\7e\2\2\u0246\u0247\7n\2\2\u0247"+
"\u0309\7e\2\2\u0248\u0249\7l\2\2\u0249\u024a\7u\2\2\u024a\u0309\7t\2\2"+
"\u024b\u024c\7c\2\2\u024c\u024d\7p\2\2\u024d\u0309\7f\2\2\u024e\u024f"+
"\7t\2\2\u024f\u0250\7n\2\2\u0250\u0309\7c\2\2\u0251\u0252\7d\2\2\u0252"+
"\u0253\7k\2\2\u0253\u0309\7v\2\2\u0254\u0255\7t\2\2\u0255\u0256\7q\2\2"+
"\u0256\u0309\7n\2\2\u0257\u0258\7r\2\2\u0258\u0259\7n\2\2\u0259\u0309"+
"\7c\2\2\u025a\u025b\7r\2\2\u025b\u025c\7n\2\2\u025c\u0309\7r\2\2\u025d"+
"\u025e\7d\2\2\u025e\u025f\7o\2\2\u025f\u0309\7k\2\2\u0260\u0261\7u\2\2"+
"\u0261\u0262\7g\2\2\u0262\u0309\7e\2\2\u0263\u0264\7t\2\2\u0264\u0265"+
"\7v\2\2\u0265\u0309\7k\2\2\u0266\u0267\7g\2\2\u0267\u0268\7q\2\2\u0268"+
"\u0309\7t\2\2\u0269\u026a\7u\2\2\u026a\u026b\7t\2\2\u026b\u0309\7g\2\2"+
"\u026c\u026d\7n\2\2\u026d\u026e\7u\2\2\u026e\u0309\7t\2\2\u026f\u0270"+
"\7r\2\2\u0270\u0271\7j\2\2\u0271\u0309\7c\2\2\u0272\u0273\7c\2\2\u0273"+
"\u0274\7n\2\2\u0274\u0309\7t\2\2\u0275\u0276\7l\2\2\u0276\u0277\7o\2\2"+
"\u0277\u0309\7r\2\2\u0278\u0279\7d\2\2\u0279\u027a\7x\2\2\u027a\u0309"+
"\7e\2\2\u027b\u027c\7e\2\2\u027c\u027d\7n\2\2\u027d\u0309\7k\2\2\u027e"+
"\u027f\7t\2\2\u027f\u0280\7v\2\2\u0280\u0309\7u\2\2\u0281\u0282\7c\2\2"+
"\u0282\u0283\7f\2\2\u0283\u0309\7e\2\2\u0284\u0285\7t\2\2\u0285\u0286"+
"\7t\2\2\u0286\u0309\7c\2\2\u0287\u0288\7d\2\2\u0288\u0289\7x\2\2\u0289"+
"\u0309\7u\2\2\u028a\u028b\7u\2\2\u028b\u028c\7g\2\2\u028c\u0309\7k\2\2"+
"\u028d\u028e\7u\2\2\u028e\u028f\7c\2\2\u028f\u0309\7z\2\2\u0290\u0291"+
"\7u\2\2\u0291\u0292\7v\2\2\u0292\u0309\7{\2\2\u0293\u0294\7u\2\2\u0294"+
"\u0295\7v\2\2\u0295\u0309\7c\2\2\u0296\u0297\7u\2\2\u0297\u0298\7v\2\2"+
"\u0298\u0309\7z\2\2\u0299\u029a\7f\2\2\u029a\u029b\7g\2\2\u029b\u0309"+
"\7{\2\2\u029c\u029d\7v\2\2\u029d\u029e\7z\2\2\u029e\u0309\7c\2\2\u029f"+
"\u02a0\7z\2\2\u02a0\u02a1\7c\2\2\u02a1\u0309\7c\2\2\u02a2\u02a3\7d\2\2"+
"\u02a3\u02a4\7e\2\2\u02a4\u0309\7e\2\2\u02a5\u02a6\7c\2\2\u02a6\u02a7"+
"\7j\2\2\u02a7\u0309\7z\2\2\u02a8\u02a9\7v\2\2\u02a9\u02aa\7{\2\2\u02aa"+
"\u0309\7c\2\2\u02ab\u02ac\7v\2\2\u02ac\u02ad\7z\2\2\u02ad\u0309\7u\2\2"+
"\u02ae\u02af\7v\2\2\u02af\u02b0\7c\2\2\u02b0\u0309\7u\2\2\u02b1\u02b2"+
"\7u\2\2\u02b2\u02b3\7j\2\2\u02b3\u0309\7{\2\2\u02b4\u02b5\7u\2\2\u02b5"+
"\u02b6\7j\2\2\u02b6\u0309\7z\2\2\u02b7\u02b8\7n\2\2\u02b8\u02b9\7f\2\2"+
"\u02b9\u0309\7{\2\2\u02ba\u02bb\7n\2\2\u02bb\u02bc\7f\2\2\u02bc\u0309"+
"\7c\2\2\u02bd\u02be\7n\2\2\u02be\u02bf\7f\2\2\u02bf\u0309\7z\2\2\u02c0"+
"\u02c1\7n\2\2\u02c1\u02c2\7c\2\2\u02c2\u0309\7z\2\2\u02c3\u02c4\7v\2\2"+
"\u02c4\u02c5\7c\2\2\u02c5\u0309\7{\2\2\u02c6\u02c7\7v\2\2\u02c7\u02c8"+
"\7c\2\2\u02c8\u0309\7z\2\2\u02c9\u02ca\7d\2\2\u02ca\u02cb\7e\2\2\u02cb"+
"\u0309\7u\2\2\u02cc\u02cd\7e\2\2\u02cd\u02ce\7n\2\2\u02ce\u0309\7x\2\2"+
"\u02cf\u02d0\7v\2\2\u02d0\u02d1\7u\2\2\u02d1\u0309\7z\2\2\u02d2\u02d3"+
"\7n\2\2\u02d3\u02d4\7c\2\2\u02d4\u0309\7u\2\2\u02d5\u02d6\7e\2\2\u02d6"+
"\u02d7\7r\2\2\u02d7\u0309\7{\2\2\u02d8\u02d9\7e\2\2\u02d9\u02da\7o\2\2"+
"\u02da\u0309\7r\2\2\u02db\u02dc\7e\2\2\u02dc\u02dd\7r\2\2\u02dd\u0309"+
"\7z\2\2\u02de\u02df\7f\2\2\u02df\u02e0\7e\2\2\u02e0\u0309\7r\2\2\u02e1"+
"\u02e2\7f\2\2\u02e2\u02e3\7g\2\2\u02e3\u0309\7e\2\2\u02e4\u02e5\7k\2\2"+
"\u02e5\u02e6\7p\2\2\u02e6\u0309\7e\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9"+
"\7z\2\2\u02e9\u0309\7u\2\2\u02ea\u02eb\7d\2\2\u02eb\u02ec\7p\2\2\u02ec"+
"\u0309\7g\2\2\u02ed\u02ee\7e\2\2\u02ee\u02ef\7n\2\2\u02ef\u0309\7f\2\2"+
"\u02f0\u02f1\7u\2\2\u02f1\u02f2\7d\2\2\u02f2\u0309\7e\2\2\u02f3\u02f4"+
"\7k\2\2\u02f4\u02f5\7u\2\2\u02f5\u0309\7e\2\2\u02f6\u02f7\7k\2\2\u02f7"+
"\u02f8\7p\2\2\u02f8\u0309\7z\2\2\u02f9\u02fa\7d\2\2\u02fa\u02fb\7g\2\2"+
"\u02fb\u0309\7s\2\2\u02fc\u02fd\7u\2\2\u02fd\u02fe\7g\2\2\u02fe\u0309"+
"\7f\2\2\u02ff\u0300\7f\2\2\u0300\u0301\7g\2\2\u0301\u0309\7z\2\2\u0302"+
"\u0303\7k\2\2\u0303\u0304\7p\2\2\u0304\u0309\7{\2\2\u0305\u0306\7t\2\2"+
"\u0306\u0307\7q\2\2\u0307\u0309\7t\2\2\u0308\u022a\3\2\2\2\u0308\u022d"+
"\3\2\2\2\u0308\u0230\3\2\2\2\u0308\u0233\3\2\2\2\u0308\u0236\3\2\2\2\u0308"+
"\u0239\3\2\2\2\u0308\u023c\3\2\2\2\u0308\u023f\3\2\2\2\u0308\u0242\3\2"+
"\2\2\u0308\u0245\3\2\2\2\u0308\u0248\3\2\2\2\u0308\u024b\3\2\2\2\u0308"+
"\u024e\3\2\2\2\u0308\u0251\3\2\2\2\u0308\u0254\3\2\2\2\u0308\u0257\3\2"+
"\2\2\u0308\u025a\3\2\2\2\u0308\u025d\3\2\2\2\u0308\u0260\3\2\2\2\u0308"+
"\u0263\3\2\2\2\u0308\u0266\3\2\2\2\u0308\u0269\3\2\2\2\u0308\u026c\3\2"+
"\2\2\u0308\u026f\3\2\2\2\u0308\u0272\3\2\2\2\u0308\u0275\3\2\2\2\u0308"+
"\u0278\3\2\2\2\u0308\u027b\3\2\2\2\u0308\u027e\3\2\2\2\u0308\u0281\3\2"+
"\2\2\u0308\u0284\3\2\2\2\u0308\u0287\3\2\2\2\u0308\u028a\3\2\2\2\u0308"+
"\u028d\3\2\2\2\u0308\u0290\3\2\2\2\u0308\u0293\3\2\2\2\u0308\u0296\3\2"+
"\2\2\u0308\u0299\3\2\2\2\u0308\u029c\3\2\2\2\u0308\u029f\3\2\2\2\u0308"+
"\u02a2\3\2\2\2\u0308\u02a5\3\2\2\2\u0308\u02a8\3\2\2\2\u0308\u02ab\3\2"+
"\2\2\u0308\u02ae\3\2\2\2\u0308\u02b1\3\2\2\2\u0308\u02b4\3\2\2\2\u0308"+
"\u02b7\3\2\2\2\u0308\u02ba\3\2\2\2\u0308\u02bd\3\2\2\2\u0308\u02c0\3\2"+
"\2\2\u0308\u02c3\3\2\2\2\u0308\u02c6\3\2\2\2\u0308\u02c9\3\2\2\2\u0308"+
"\u02cc\3\2\2\2\u0308\u02cf\3\2\2\2\u0308\u02d2\3\2\2\2\u0308\u02d5\3\2"+
"\2\2\u0308\u02d8\3\2\2\2\u0308\u02db\3\2\2\2\u0308\u02de\3\2\2\2\u0308"+
"\u02e1\3\2\2\2\u0308\u02e4\3\2\2\2\u0308\u02e7\3\2\2\2\u0308\u02ea\3\2"+
"\2\2\u0308\u02ed\3\2\2\2\u0308\u02f0\3\2\2\2\u0308\u02f3\3\2\2\2\u0308"+
"\u02f6\3\2\2\2\u0308\u02f9\3\2\2\2\u0308\u02fc\3\2\2\2\u0308\u02ff\3\2"+
"\2\2\u0308\u0302\3\2\2\2\u0308\u0305\3\2\2\2\u0309\u00a4\3\2\2\2\u030a"+
"\u030b\7}\2\2\u030b\u030c\7}\2\2\u030c\u0310\3\2\2\2\u030d\u030f\13\2"+
"\2\2\u030e\u030d\3\2\2\2\u030f\u0312\3\2\2\2\u0310\u0311\3\2\2\2\u0310"+
"\u030e\3\2\2\2\u0311\u0313\3\2\2\2\u0312\u0310\3\2\2\2\u0313\u0314\7\177"+
"\2\2\u0314\u0315\7\177\2\2\u0315\u00a6\3\2\2\2\u0316\u0317\7d\2\2\u0317"+
"\u0318\7{\2\2\u0318\u0319\7v\2\2\u0319\u033c\7g\2\2\u031a\u031b\7y\2\2"+
"\u031b\u031c\7q\2\2\u031c\u031d\7t\2\2\u031d\u033c\7f\2\2\u031e\u031f"+
"\7f\2\2\u031f\u0320\7y\2\2\u0320\u0321\7q\2\2\u0321\u0322\7t\2\2\u0322"+
"\u033c\7f\2\2\u0323\u0324\7d\2\2\u0324\u0325\7q\2\2\u0325\u0326\7q\2\2"+
"\u0326\u033c\7n\2\2\u0327\u0328\7e\2\2\u0328\u0329\7j\2\2\u0329\u032a"+
"\7c\2\2\u032a\u033c\7t\2\2\u032b\u032c\7u\2\2\u032c\u032d\7j\2\2\u032d"+
"\u032e\7q\2\2\u032e\u032f\7t\2\2\u032f\u033c\7v\2\2\u0330\u0331\7k\2\2"+
"\u0331\u0332\7p\2\2\u0332\u033c\7v\2\2\u0333\u0334\7n\2\2\u0334\u0335"+
"\7q\2\2\u0335\u0336\7p\2\2\u0336\u033c\7i\2\2\u0337\u0338\7x\2\2\u0338"+
"\u0339\7q\2\2\u0339\u033a\7k\2\2\u033a\u033c\7f\2\2\u033b\u0316\3\2\2"+
"\2\u033b\u031a\3\2\2\2\u033b\u031e\3\2\2\2\u033b\u0323\3\2\2\2\u033b\u0327"+
"\3\2\2\2\u033b\u032b\3\2\2\2\u033b\u0330\3\2\2\2\u033b\u0333\3\2\2\2\u033b"+
"\u0337\3\2\2\2\u033c\u00a8\3\2\2\2\u033d\u0343\7$\2\2\u033e\u033f\7^\2"+
"\2\u033f\u0342\7$\2\2\u0340\u0342\n\2\2\2\u0341\u033e\3\2\2\2\u0341\u0340"+
"\3\2\2\2\u0342\u0345\3\2\2\2\u0343\u0341\3\2\2\2\u0343\u0344\3\2\2\2\u0344"+
"\u0346\3\2\2\2\u0345\u0343\3\2\2\2\u0346\u0348\7$\2\2\u0347\u0349\t\3"+
"\2\2\u0348\u0347\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034e\3\2\2\2\u034a"+
"\u034c\t\4\2\2\u034b\u034d\t\5\2\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2"+
"\2\2\u034d\u034f\3\2\2\2\u034e\u034a\3\2\2\2\u034e\u034f\3\2\2\2\u034f"+
"\u0351\3\2\2\2\u0350\u0352\t\3\2\2\u0351\u0350\3\2\2\2\u0351\u0352\3\2"+
"\2\2\u0352\u00aa\3\2\2\2\u0353\u0357\7)\2\2\u0354\u0355\7^\2\2\u0355\u0358"+
"\7)\2\2\u0356\u0358\n\6\2\2\u0357\u0354\3\2\2\2\u0357\u0356\3\2\2\2\u0358"+
"\u0359\3\2\2\2\u0359\u035a\7)\2\2\u035a\u00ac\3\2\2\2\u035b\u035c\7v\2"+
"\2\u035c\u035d\7t\2\2\u035d\u035e\7w\2\2\u035e\u0365\7g\2\2\u035f\u0360"+
"\7h\2\2\u0360\u0361\7c\2\2\u0361\u0362\7n\2\2\u0362\u0363\7u\2\2\u0363"+
"\u0365\7g\2\2\u0364\u035b\3\2\2\2\u0364\u035f\3\2\2\2\u0365\u00ae\3\2"+
"\2\2\u0366\u0369\5\u00b1Y\2\u0367\u0369\5\u00b9]\2\u0368\u0366\3\2\2\2"+
"\u0368\u0367\3\2\2\2\u0369\u00b0\3\2\2\2\u036a\u036e\5\u00b3Z\2\u036b"+
"\u036e\5\u00b5[\2\u036c\u036e\5\u00b7\\\2\u036d\u036a\3\2\2\2\u036d\u036b"+
"\3\2\2\2\u036d\u036c\3\2\2\2\u036e\u00b2\3\2\2\2\u036f\u0375\7\'\2\2\u0370"+
"\u0371\7\62\2\2\u0371\u0375\7d\2\2\u0372\u0373\7\62\2\2\u0373\u0375\7"+
"D\2\2\u0374\u036f\3\2\2\2\u0374\u0370\3\2\2\2\u0374\u0372\3\2\2\2\u0375"+
"\u0379\3\2\2\2\u0376\u0378\5\u00c1a\2\u0377\u0376\3\2\2\2\u0378\u037b"+
"\3\2\2\2\u0379\u0377\3\2\2\2\u0379\u037a\3\2\2\2\u037a\u037c\3\2\2\2\u037b"+
"\u0379\3\2\2\2\u037c\u037e\7\60\2\2\u037d\u037f\5\u00c1a\2\u037e\u037d"+
"\3\2\2\2\u037f\u0380\3\2\2\2\u0380\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381"+
"\u00b4\3\2\2\2\u0382\u0384\5\u00c3b\2\u0383\u0382\3\2\2\2\u0384\u0387"+
"\3\2\2\2\u0385\u0383\3\2\2\2\u0385\u0386\3\2\2\2\u0386\u0388\3\2\2\2\u0387"+
"\u0385\3\2\2\2\u0388\u038a\7\60\2\2\u0389\u038b\5\u00c3b\2\u038a\u0389"+
"\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038a\3\2\2\2\u038c\u038d\3\2\2\2\u038d"+
"\u00b6\3\2\2\2\u038e\u0394\7&\2\2\u038f\u0390\7\62\2\2\u0390\u0394\7z"+
"\2\2\u0391\u0392\7\62\2\2\u0392\u0394\7Z\2\2\u0393\u038e\3\2\2\2\u0393"+
"\u038f\3\2\2\2\u0393\u0391\3\2\2\2\u0394\u0398\3\2\2\2\u0395\u0397\5\u00c5"+
"c\2\u0396\u0395\3\2\2\2\u0397\u039a\3\2\2\2\u0398\u0396\3\2\2\2\u0398"+
"\u0399\3\2\2\2\u0399\u039b\3\2\2\2\u039a\u0398\3\2\2\2\u039b\u039d\7\60"+
"\2\2\u039c\u039e\5\u00c5c\2\u039d\u039c\3\2\2\2\u039e\u039f\3\2\2\2\u039f"+
"\u039d\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0\u00b8\3\2\2\2\u03a1\u03a5\5\u00bd"+
"_\2\u03a2\u03a5\5\u00bf`\2\u03a3\u03a5\5\u00bb^\2\u03a4\u03a1\3\2\2\2"+
"\u03a4\u03a2\3\2\2\2\u03a4\u03a3\3\2\2\2\u03a5\u03a9\3\2\2\2\u03a6\u03a7"+
"\t\7\2\2\u03a7\u03aa\t\b\2\2\u03a8\u03aa\7n\2\2\u03a9\u03a6\3\2\2\2\u03a9"+
"\u03a8\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u00ba\3\2\2\2\u03ab\u03ac\7\62"+
"\2\2\u03ac\u03ae\t\t\2\2\u03ad\u03af\5\u00c1a\2\u03ae\u03ad\3\2\2\2\u03af"+
"\u03b0\3\2\2\2\u03b0\u03ae\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1\u03b9\3\2"+
"\2\2\u03b2\u03b4\7\'\2\2\u03b3\u03b5\5\u00c1a\2\u03b4\u03b3\3\2\2\2\u03b5"+
"\u03b6\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u03b9\3\2"+
"\2\2\u03b8\u03ab\3\2\2\2\u03b8\u03b2\3\2\2\2\u03b9\u00bc\3\2\2\2\u03ba"+
"\u03bc\5\u00c3b\2\u03bb\u03ba\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u03bb"+
"\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u00be\3\2\2\2\u03bf\u03c5\7&\2\2\u03c0"+
"\u03c1\7\62\2\2\u03c1\u03c5\7z\2\2\u03c2\u03c3\7\62\2\2\u03c3\u03c5\7"+
"Z\2\2\u03c4\u03bf\3\2\2\2\u03c4\u03c0\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c5"+
"\u03c7\3\2\2\2\u03c6\u03c8\5\u00c5c\2\u03c7\u03c6\3\2\2\2\u03c8\u03c9"+
"\3\2\2\2\u03c9\u03c7\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca\u00c0\3\2\2\2\u03cb"+
"\u03cc\t\n\2\2\u03cc\u00c2\3\2\2\2\u03cd\u03ce\t\13\2\2\u03ce\u00c4\3"+
"\2\2\2\u03cf\u03d0\t\f\2\2\u03d0\u00c6\3\2\2\2\u03d1\u03d5\5\u00c9e\2"+
"\u03d2\u03d4\5\u00cbf\2\u03d3\u03d2\3\2\2\2\u03d4\u03d7\3\2\2\2\u03d5"+
"\u03d3\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u00c8\3\2\2\2\u03d7\u03d5\3\2"+
"\2\2\u03d8\u03d9\t\r\2\2\u03d9\u00ca\3\2\2\2\u03da\u03db\t\16\2\2\u03db"+
"\u00cc\3\2\2\2\u03dc\u03e0\7#\2\2\u03dd\u03df\5\u00cbf\2\u03de\u03dd\3"+
"\2\2\2\u03df\u03e2\3\2\2\2\u03e0\u03de\3\2\2\2\u03e0\u03e1\3\2\2\2\u03e1"+
"\u03e4\3\2\2\2\u03e2\u03e0\3\2\2\2\u03e3\u03e5\t\17\2\2\u03e4\u03e3\3"+
"\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03e4\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7"+
"\u00ce\3\2\2\2\u03e8\u03ea\t\20\2\2\u03e9\u03e8\3\2\2\2\u03ea\u03eb\3"+
"\2\2\2\u03eb\u03e9\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed"+
"\u03ee\bh\2\2\u03ee\u00d0\3\2\2\2\u03ef\u03f0\7\61\2\2\u03f0\u03f1\7\61"+
"\2\2\u03f1\u03f5\3\2\2\2\u03f2\u03f4\n\21\2\2\u03f3\u03f2\3\2\2\2\u03f4"+
"\u03f7\3\2\2\2\u03f5\u03f3\3\2\2\2\u03f5\u03f6\3\2\2\2\u03f6\u03f8\3\2"+
"\2\2\u03f7\u03f5\3\2\2\2\u03f8\u03f9\bi\3\2\u03f9\u00d2\3\2\2\2\u03fa"+
"\u03fb\7\61\2\2\u03fb\u03fc\7,\2\2\u03fc\u0400\3\2\2\2\u03fd\u03ff\13"+
"\2\2\2\u03fe\u03fd\3\2\2\2\u03ff\u0402\3\2\2\2\u0400\u0401\3\2\2\2\u0400"+
"\u03fe\3\2\2\2\u0401\u0403\3\2\2\2\u0402\u0400\3\2\2\2\u0403\u0404\7,"+
"\2\2\u0404\u0405\7\61\2\2\u0405\u0406\3\2\2\2\u0406\u0407\bj\3\2\u0407"+
"\u00d4\3\2\2\2&\2\u0308\u0310\u033b\u0341\u0343\u0348\u034c\u034e\u0351"+
"\u0357\u0364\u0368\u036d\u0374\u0379\u0380\u0385\u038c\u0393\u0398\u039f"+
"\u03a4\u03a9\u03b0\u03b6\u03b8\u03bd\u03c4\u03c9\u03d5\u03e0\u03e6\u03eb"+
"\u03f5\u0400\4\2\3\2\2\4\2";
"`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+
"k\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4"+
"\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\f\3\f\3\f"+
"\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+
"\3\17\3\17\3\17\3\17\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\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+
"\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+
"\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26"+
"\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31"+
"\3\31\3\31\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34"+
"\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
"\3\36\3\36\3\36\3\36\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)\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\61\3\61\3\62\3\62\3\63"+
"\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\38\38\39\39\3"+
"9\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3>\3>\3?\3?\3?\3@\3@\3@\3A\3A\3B\3"+
"B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3I\3"+
"I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3"+
"M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3"+
"Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3"+
"S\3S\3S\3S\5S\u0310\nS\3T\3T\3T\3T\7T\u0316\nT\fT\16T\u0319\13T\3T\3T"+
"\3T\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U"+
"\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\3U\5U\u0343\nU\3V\3V\3V\3V"+
"\7V\u0349\nV\fV\16V\u034c\13V\3V\3V\5V\u0350\nV\3V\3V\5V\u0354\nV\5V\u0356"+
"\nV\3V\5V\u0359\nV\3W\3W\3W\3W\5W\u035f\nW\3W\3W\3X\3X\3X\3X\3X\3X\3X"+
"\3X\3X\5X\u036c\nX\3Y\3Y\5Y\u0370\nY\3Z\3Z\3Z\5Z\u0375\nZ\3[\3[\3[\3["+
"\3[\5[\u037c\n[\3[\7[\u037f\n[\f[\16[\u0382\13[\3[\3[\6[\u0386\n[\r[\16"+
"[\u0387\3\\\7\\\u038b\n\\\f\\\16\\\u038e\13\\\3\\\3\\\6\\\u0392\n\\\r"+
"\\\16\\\u0393\3]\3]\3]\3]\3]\5]\u039b\n]\3]\7]\u039e\n]\f]\16]\u03a1\13"+
"]\3]\3]\6]\u03a5\n]\r]\16]\u03a6\3^\3^\3^\5^\u03ac\n^\3^\3^\3^\5^\u03b1"+
"\n^\3_\3_\3_\6_\u03b6\n_\r_\16_\u03b7\3_\3_\6_\u03bc\n_\r_\16_\u03bd\5"+
"_\u03c0\n_\3`\6`\u03c3\n`\r`\16`\u03c4\3a\3a\3a\3a\3a\5a\u03cc\na\3a\6"+
"a\u03cf\na\ra\16a\u03d0\3b\3b\3c\3c\3d\3d\3e\3e\7e\u03db\ne\fe\16e\u03de"+
"\13e\3f\3f\3g\3g\3h\3h\7h\u03e6\nh\fh\16h\u03e9\13h\3h\6h\u03ec\nh\rh"+
"\16h\u03ed\3i\6i\u03f1\ni\ri\16i\u03f2\3i\3i\3j\3j\3j\3j\7j\u03fb\nj\f"+
"j\16j\u03fe\13j\3j\3j\3k\3k\3k\3k\7k\u0406\nk\fk\16k\u0409\13k\3k\3k\3"+
"k\3k\3k\4\u0317\u0407\2l\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\62"+
"c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087"+
"E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+
"O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+
"Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3"+
"\2\u00c5\2\u00c7\2\u00c9c\u00cb\2\u00cd\2\u00cfd\u00d1e\u00d3f\u00d5g"+
"\3\2\22\3\2$$\3\2||\4\2rruu\4\2ooww\3\2))\4\2uuww\7\2dfkknnuuyy\4\2DD"+
"dd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\6\2"+
"\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u0481\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\2"+
"Y\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\u00c1\3\2\2\2\2\u00c9\3\2\2\2\2\u00cf\3\2\2"+
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\3\u00d7\3\2\2\2\5\u00de"+
"\3\2\2\2\7\u00e0\3\2\2\2\t\u00e8\3\2\2\2\13\u00ea\3\2\2\2\r\u00ec\3\2"+
"\2\2\17\u00ee\3\2\2\2\21\u00f0\3\2\2\2\23\u00f2\3\2\2\2\25\u00f4\3\2\2"+
"\2\27\u00f6\3\2\2\2\31\u00f9\3\2\2\2\33\u0102\3\2\2\2\35\u0108\3\2\2\2"+
"\37\u010f\3\2\2\2!\u0115\3\2\2\2#\u011e\3\2\2\2%\u0125\3\2\2\2\'\u012e"+
"\3\2\2\2)\u0138\3\2\2\2+\u0140\3\2\2\2-\u0143\3\2\2\2/\u0148\3\2\2\2\61"+
"\u014e\3\2\2\2\63\u0151\3\2\2\2\65\u0155\3\2\2\2\67\u015c\3\2\2\29\u0162"+
"\3\2\2\2;\u016b\3\2\2\2=\u016f\3\2\2\2?\u0171\3\2\2\2A\u0174\3\2\2\2C"+
"\u017b\3\2\2\2E\u0184\3\2\2\2G\u0186\3\2\2\2I\u0188\3\2\2\2K\u018a\3\2"+
"\2\2M\u0191\3\2\2\2O\u0196\3\2\2\2Q\u0198\3\2\2\2S\u019b\3\2\2\2U\u01a2"+
"\3\2\2\2W\u01a9\3\2\2\2Y\u01ac\3\2\2\2[\u01af\3\2\2\2]\u01b1\3\2\2\2_"+
"\u01b3\3\2\2\2a\u01b5\3\2\2\2c\u01b7\3\2\2\2e\u01b9\3\2\2\2g\u01bc\3\2"+
"\2\2i\u01bf\3\2\2\2k\u01c1\3\2\2\2m\u01c3\3\2\2\2o\u01c5\3\2\2\2q\u01c7"+
"\3\2\2\2s\u01ca\3\2\2\2u\u01cd\3\2\2\2w\u01d0\3\2\2\2y\u01d3\3\2\2\2{"+
"\u01d5\3\2\2\2}\u01d7\3\2\2\2\177\u01da\3\2\2\2\u0081\u01dd\3\2\2\2\u0083"+
"\u01df\3\2\2\2\u0085\u01e2\3\2\2\2\u0087\u01e5\3\2\2\2\u0089\u01e8\3\2"+
"\2\2\u008b\u01eb\3\2\2\2\u008d\u01ee\3\2\2\2\u008f\u01f2\3\2\2\2\u0091"+
"\u01f6\3\2\2\2\u0093\u01f9\3\2\2\2\u0095\u01fc\3\2\2\2\u0097\u01ff\3\2"+
"\2\2\u0099\u0207\3\2\2\2\u009b\u0210\3\2\2\2\u009d\u0215\3\2\2\2\u009f"+
"\u021e\3\2\2\2\u00a1\u0224\3\2\2\2\u00a3\u022b\3\2\2\2\u00a5\u030f\3\2"+
"\2\2\u00a7\u0311\3\2\2\2\u00a9\u0342\3\2\2\2\u00ab\u0344\3\2\2\2\u00ad"+
"\u035a\3\2\2\2\u00af\u036b\3\2\2\2\u00b1\u036f\3\2\2\2\u00b3\u0374\3\2"+
"\2\2\u00b5\u037b\3\2\2\2\u00b7\u038c\3\2\2\2\u00b9\u039a\3\2\2\2\u00bb"+
"\u03ab\3\2\2\2\u00bd\u03bf\3\2\2\2\u00bf\u03c2\3\2\2\2\u00c1\u03cb\3\2"+
"\2\2\u00c3\u03d2\3\2\2\2\u00c5\u03d4\3\2\2\2\u00c7\u03d6\3\2\2\2\u00c9"+
"\u03d8\3\2\2\2\u00cb\u03df\3\2\2\2\u00cd\u03e1\3\2\2\2\u00cf\u03e3\3\2"+
"\2\2\u00d1\u03f0\3\2\2\2\u00d3\u03f6\3\2\2\2\u00d5\u0401\3\2\2\2\u00d7"+
"\u00d8\7k\2\2\u00d8\u00d9\7o\2\2\u00d9\u00da\7r\2\2\u00da\u00db\7q\2\2"+
"\u00db\u00dc\7t\2\2\u00dc\u00dd\7v\2\2\u00dd\4\3\2\2\2\u00de\u00df\7="+
"\2\2\u00df\6\3\2\2\2\u00e0\u00e1\7v\2\2\u00e1\u00e2\7{\2\2\u00e2\u00e3"+
"\7r\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7f\2\2\u00e5\u00e6\7g\2\2\u00e6"+
"\u00e7\7h\2\2\u00e7\b\3\2\2\2\u00e8\u00e9\7.\2\2\u00e9\n\3\2\2\2\u00ea"+
"\u00eb\7?\2\2\u00eb\f\3\2\2\2\u00ec\u00ed\7*\2\2\u00ed\16\3\2\2\2\u00ee"+
"\u00ef\7+\2\2\u00ef\20\3\2\2\2\u00f0\u00f1\7}\2\2\u00f1\22\3\2\2\2\u00f2"+
"\u00f3\7\177\2\2\u00f3\24\3\2\2\2\u00f4\u00f5\7%\2\2\u00f5\26\3\2\2\2"+
"\u00f6\u00f7\7r\2\2\u00f7\u00f8\7e\2\2\u00f8\30\3\2\2\2\u00f9\u00fa\7"+
"g\2\2\u00fa\u00fb\7p\2\2\u00fb\u00fc\7e\2\2\u00fc\u00fd\7q\2\2\u00fd\u00fe"+
"\7f\2\2\u00fe\u00ff\7k\2\2\u00ff\u0100\7p\2\2\u0100\u0101\7i\2\2\u0101"+
"\32\3\2\2\2\u0102\u0103\7e\2\2\u0103\u0104\7q\2\2\u0104\u0105\7p\2\2\u0105"+
"\u0106\7u\2\2\u0106\u0107\7v\2\2\u0107\34\3\2\2\2\u0108\u0109\7g\2\2\u0109"+
"\u010a\7z\2\2\u010a\u010b\7v\2\2\u010b\u010c\7g\2\2\u010c\u010d\7t\2\2"+
"\u010d\u010e\7p\2\2\u010e\36\3\2\2\2\u010f\u0110\7c\2\2\u0110\u0111\7"+
"n\2\2\u0111\u0112\7k\2\2\u0112\u0113\7i\2\2\u0113\u0114\7p\2\2\u0114 "+
"\3\2\2\2\u0115\u0116\7t\2\2\u0116\u0117\7g\2\2\u0117\u0118\7i\2\2\u0118"+
"\u0119\7k\2\2\u0119\u011a\7u\2\2\u011a\u011b\7v\2\2\u011b\u011c\7g\2\2"+
"\u011c\u011d\7t\2\2\u011d\"\3\2\2\2\u011e\u011f\7k\2\2\u011f\u0120\7p"+
"\2\2\u0120\u0121\7n\2\2\u0121\u0122\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124"+
"\7g\2\2\u0124$\3\2\2\2\u0125\u0126\7x\2\2\u0126\u0127\7q\2\2\u0127\u0128"+
"\7n\2\2\u0128\u0129\7c\2\2\u0129\u012a\7v\2\2\u012a\u012b\7k\2\2\u012b"+
"\u012c\7n\2\2\u012c\u012d\7g\2\2\u012d&\3\2\2\2\u012e\u012f\7k\2\2\u012f"+
"\u0130\7p\2\2\u0130\u0131\7v\2\2\u0131\u0132\7g\2\2\u0132\u0133\7t\2\2"+
"\u0133\u0134\7t\2\2\u0134\u0135\7w\2\2\u0135\u0136\7r\2\2\u0136\u0137"+
"\7v\2\2\u0137(\3\2\2\2\u0138\u0139\7t\2\2\u0139\u013a\7g\2\2\u013a\u013b"+
"\7u\2\2\u013b\u013c\7g\2\2\u013c\u013d\7t\2\2\u013d\u013e\7x\2\2\u013e"+
"\u013f\7g\2\2\u013f*\3\2\2\2\u0140\u0141\7k\2\2\u0141\u0142\7h\2\2\u0142"+
",\3\2\2\2\u0143\u0144\7g\2\2\u0144\u0145\7n\2\2\u0145\u0146\7u\2\2\u0146"+
"\u0147\7g\2\2\u0147.\3\2\2\2\u0148\u0149\7y\2\2\u0149\u014a\7j\2\2\u014a"+
"\u014b\7k\2\2\u014b\u014c\7n\2\2\u014c\u014d\7g\2\2\u014d\60\3\2\2\2\u014e"+
"\u014f\7f\2\2\u014f\u0150\7q\2\2\u0150\62\3\2\2\2\u0151\u0152\7h\2\2\u0152"+
"\u0153\7q\2\2\u0153\u0154\7t\2\2\u0154\64\3\2\2\2\u0155\u0156\7t\2\2\u0156"+
"\u0157\7g\2\2\u0157\u0158\7v\2\2\u0158\u0159\7w\2\2\u0159\u015a\7t\2\2"+
"\u015a\u015b\7p\2\2\u015b\66\3\2\2\2\u015c\u015d\7d\2\2\u015d\u015e\7"+
"t\2\2\u015e\u015f\7g\2\2\u015f\u0160\7c\2\2\u0160\u0161\7m\2\2\u01618"+
"\3\2\2\2\u0162\u0163\7e\2\2\u0163\u0164\7q\2\2\u0164\u0165\7p\2\2\u0165"+
"\u0166\7v\2\2\u0166\u0167\7k\2\2\u0167\u0168\7p\2\2\u0168\u0169\7w\2\2"+
"\u0169\u016a\7g\2\2\u016a:\3\2\2\2\u016b\u016c\7c\2\2\u016c\u016d\7u\2"+
"\2\u016d\u016e\7o\2\2\u016e<\3\2\2\2\u016f\u0170\7<\2\2\u0170>\3\2\2\2"+
"\u0171\u0172\7\60\2\2\u0172\u0173\7\60\2\2\u0173@\3\2\2\2\u0174\u0175"+
"\7u\2\2\u0175\u0176\7k\2\2\u0176\u0177\7i\2\2\u0177\u0178\7p\2\2\u0178"+
"\u0179\7g\2\2\u0179\u017a\7f\2\2\u017aB\3\2\2\2\u017b\u017c\7w\2\2\u017c"+
"\u017d\7p\2\2\u017d\u017e\7u\2\2\u017e\u017f\7k\2\2\u017f\u0180\7i\2\2"+
"\u0180\u0181\7p\2\2\u0181\u0182\7g\2\2\u0182\u0183\7f\2\2\u0183D\3\2\2"+
"\2\u0184\u0185\7,\2\2\u0185F\3\2\2\2\u0186\u0187\7]\2\2\u0187H\3\2\2\2"+
"\u0188\u0189\7_\2\2\u0189J\3\2\2\2\u018a\u018b\7u\2\2\u018b\u018c\7v\2"+
"\2\u018c\u018d\7t\2\2\u018d\u018e\7w\2\2\u018e\u018f\7e\2\2\u018f\u0190"+
"\7v\2\2\u0190L\3\2\2\2\u0191\u0192\7g\2\2\u0192\u0193\7p\2\2\u0193\u0194"+
"\7w\2\2\u0194\u0195\7o\2\2\u0195N\3\2\2\2\u0196\u0197\7\60\2\2\u0197P"+
"\3\2\2\2\u0198\u0199\7/\2\2\u0199\u019a\7@\2\2\u019aR\3\2\2\2\u019b\u019c"+
"\7u\2\2\u019c\u019d\7k\2\2\u019d\u019e\7|\2\2\u019e\u019f\7g\2\2\u019f"+
"\u01a0\7q\2\2\u01a0\u01a1\7h\2\2\u01a1T\3\2\2\2\u01a2\u01a3\7v\2\2\u01a3"+
"\u01a4\7{\2\2\u01a4\u01a5\7r\2\2\u01a5\u01a6\7g\2\2\u01a6\u01a7\7k\2\2"+
"\u01a7\u01a8\7f\2\2\u01a8V\3\2\2\2\u01a9\u01aa\7/\2\2\u01aa\u01ab\7/\2"+
"\2\u01abX\3\2\2\2\u01ac\u01ad\7-\2\2\u01ad\u01ae\7-\2\2\u01aeZ\3\2\2\2"+
"\u01af\u01b0\7-\2\2\u01b0\\\3\2\2\2\u01b1\u01b2\7/\2\2\u01b2^\3\2\2\2"+
"\u01b3\u01b4\7#\2\2\u01b4`\3\2\2\2\u01b5\u01b6\7(\2\2\u01b6b\3\2\2\2\u01b7"+
"\u01b8\7\u0080\2\2\u01b8d\3\2\2\2\u01b9\u01ba\7@\2\2\u01ba\u01bb\7@\2"+
"\2\u01bbf\3\2\2\2\u01bc\u01bd\7>\2\2\u01bd\u01be\7>\2\2\u01beh\3\2\2\2"+
"\u01bf\u01c0\7\61\2\2\u01c0j\3\2\2\2\u01c1\u01c2\7\'\2\2\u01c2l\3\2\2"+
"\2\u01c3\u01c4\7>\2\2\u01c4n\3\2\2\2\u01c5\u01c6\7@\2\2\u01c6p\3\2\2\2"+
"\u01c7\u01c8\7?\2\2\u01c8\u01c9\7?\2\2\u01c9r\3\2\2\2\u01ca\u01cb\7#\2"+
"\2\u01cb\u01cc\7?\2\2\u01cct\3\2\2\2\u01cd\u01ce\7>\2\2\u01ce\u01cf\7"+
"?\2\2\u01cfv\3\2\2\2\u01d0\u01d1\7@\2\2\u01d1\u01d2\7?\2\2\u01d2x\3\2"+
"\2\2\u01d3\u01d4\7`\2\2\u01d4z\3\2\2\2\u01d5\u01d6\7~\2\2\u01d6|\3\2\2"+
"\2\u01d7\u01d8\7(\2\2\u01d8\u01d9\7(\2\2\u01d9~\3\2\2\2\u01da\u01db\7"+
"~\2\2\u01db\u01dc\7~\2\2\u01dc\u0080\3\2\2\2\u01dd\u01de\7A\2\2\u01de"+
"\u0082\3\2\2\2\u01df\u01e0\7-\2\2\u01e0\u01e1\7?\2\2\u01e1\u0084\3\2\2"+
"\2\u01e2\u01e3\7/\2\2\u01e3\u01e4\7?\2\2\u01e4\u0086\3\2\2\2\u01e5\u01e6"+
"\7,\2\2\u01e6\u01e7\7?\2\2\u01e7\u0088\3\2\2\2\u01e8\u01e9\7\61\2\2\u01e9"+
"\u01ea\7?\2\2\u01ea\u008a\3\2\2\2\u01eb\u01ec\7\'\2\2\u01ec\u01ed\7?\2"+
"\2\u01ed\u008c\3\2\2\2\u01ee\u01ef\7>\2\2\u01ef\u01f0\7>\2\2\u01f0\u01f1"+
"\7?\2\2\u01f1\u008e\3\2\2\2\u01f2\u01f3\7@\2\2\u01f3\u01f4\7@\2\2\u01f4"+
"\u01f5\7?\2\2\u01f5\u0090\3\2\2\2\u01f6\u01f7\7(\2\2\u01f7\u01f8\7?\2"+
"\2\u01f8\u0092\3\2\2\2\u01f9\u01fa\7~\2\2\u01fa\u01fb\7?\2\2\u01fb\u0094"+
"\3\2\2\2\u01fc\u01fd\7`\2\2\u01fd\u01fe\7?\2\2\u01fe\u0096\3\2\2\2\u01ff"+
"\u0200\7m\2\2\u0200\u0201\7k\2\2\u0201\u0202\7e\2\2\u0202\u0203\7m\2\2"+
"\u0203\u0204\7c\2\2\u0204\u0205\7u\2\2\u0205\u0206\7o\2\2\u0206\u0098"+
"\3\2\2\2\u0207\u0208\7t\2\2\u0208\u0209\7g\2\2\u0209\u020a\7u\2\2\u020a"+
"\u020b\7q\2\2\u020b\u020c\7w\2\2\u020c\u020d\7t\2\2\u020d\u020e\7e\2\2"+
"\u020e\u020f\7g\2\2\u020f\u009a\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+
"\7u\2\2\u0212\u0213\7g\2\2\u0213\u0214\7u\2\2\u0214\u009c\3\2\2\2\u0215"+
"\u0216\7e\2\2\u0216\u0217\7n\2\2\u0217\u0218\7q\2\2\u0218\u0219\7d\2\2"+
"\u0219\u021a\7d\2\2\u021a\u021b\7g\2\2\u021b\u021c\7t\2\2\u021c\u021d"+
"\7u\2\2\u021d\u009e\3\2\2\2\u021e\u021f\7d\2\2\u021f\u0220\7{\2\2\u0220"+
"\u0221\7v\2\2\u0221\u0222\7g\2\2\u0222\u0223\7u\2\2\u0223\u00a0\3\2\2"+
"\2\u0224\u0225\7e\2\2\u0225\u0226\7{\2\2\u0226\u0227\7e\2\2\u0227\u0228"+
"\7n\2\2\u0228\u0229\7g\2\2\u0229\u022a\7u\2\2\u022a\u00a2\3\2\2\2\u022b"+
"\u022c\7\60\2\2\u022c\u022d\7d\2\2\u022d\u022e\7{\2\2\u022e\u022f\7v\2"+
"\2\u022f\u0230\7g\2\2\u0230\u00a4\3\2\2\2\u0231\u0232\7d\2\2\u0232\u0233"+
"\7t\2\2\u0233\u0310\7m\2\2\u0234\u0235\7q\2\2\u0235\u0236\7t\2\2\u0236"+
"\u0310\7c\2\2\u0237\u0238\7m\2\2\u0238\u0239\7k\2\2\u0239\u0310\7n\2\2"+
"\u023a\u023b\7u\2\2\u023b\u023c\7n\2\2\u023c\u0310\7q\2\2\u023d\u023e"+
"\7p\2\2\u023e\u023f\7q\2\2\u023f\u0310\7r\2\2\u0240\u0241\7c\2\2\u0241"+
"\u0242\7u\2\2\u0242\u0310\7n\2\2\u0243\u0244\7r\2\2\u0244\u0245\7j\2\2"+
"\u0245\u0310\7r\2\2\u0246\u0247\7c\2\2\u0247\u0248\7p\2\2\u0248\u0310"+
"\7e\2\2\u0249\u024a\7d\2\2\u024a\u024b\7r\2\2\u024b\u0310\7n\2\2\u024c"+
"\u024d\7e\2\2\u024d\u024e\7n\2\2\u024e\u0310\7e\2\2\u024f\u0250\7l\2\2"+
"\u0250\u0251\7u\2\2\u0251\u0310\7t\2\2\u0252\u0253\7c\2\2\u0253\u0254"+
"\7p\2\2\u0254\u0310\7f\2\2\u0255\u0256\7t\2\2\u0256\u0257\7n\2\2\u0257"+
"\u0310\7c\2\2\u0258\u0259\7d\2\2\u0259\u025a\7k\2\2\u025a\u0310\7v\2\2"+
"\u025b\u025c\7t\2\2\u025c\u025d\7q\2\2\u025d\u0310\7n\2\2\u025e\u025f"+
"\7r\2\2\u025f\u0260\7n\2\2\u0260\u0310\7c\2\2\u0261\u0262\7r\2\2\u0262"+
"\u0263\7n\2\2\u0263\u0310\7r\2\2\u0264\u0265\7d\2\2\u0265\u0266\7o\2\2"+
"\u0266\u0310\7k\2\2\u0267\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u0310"+
"\7e\2\2\u026a\u026b\7t\2\2\u026b\u026c\7v\2\2\u026c\u0310\7k\2\2\u026d"+
"\u026e\7g\2\2\u026e\u026f\7q\2\2\u026f\u0310\7t\2\2\u0270\u0271\7u\2\2"+
"\u0271\u0272\7t\2\2\u0272\u0310\7g\2\2\u0273\u0274\7n\2\2\u0274\u0275"+
"\7u\2\2\u0275\u0310\7t\2\2\u0276\u0277\7r\2\2\u0277\u0278\7j\2\2\u0278"+
"\u0310\7c\2\2\u0279\u027a\7c\2\2\u027a\u027b\7n\2\2\u027b\u0310\7t\2\2"+
"\u027c\u027d\7l\2\2\u027d\u027e\7o\2\2\u027e\u0310\7r\2\2\u027f\u0280"+
"\7d\2\2\u0280\u0281\7x\2\2\u0281\u0310\7e\2\2\u0282\u0283\7e\2\2\u0283"+
"\u0284\7n\2\2\u0284\u0310\7k\2\2\u0285\u0286\7t\2\2\u0286\u0287\7v\2\2"+
"\u0287\u0310\7u\2\2\u0288\u0289\7c\2\2\u0289\u028a\7f\2\2\u028a\u0310"+
"\7e\2\2\u028b\u028c\7t\2\2\u028c\u028d\7t\2\2\u028d\u0310\7c\2\2\u028e"+
"\u028f\7d\2\2\u028f\u0290\7x\2\2\u0290\u0310\7u\2\2\u0291\u0292\7u\2\2"+
"\u0292\u0293\7g\2\2\u0293\u0310\7k\2\2\u0294\u0295\7u\2\2\u0295\u0296"+
"\7c\2\2\u0296\u0310\7z\2\2\u0297\u0298\7u\2\2\u0298\u0299\7v\2\2\u0299"+
"\u0310\7{\2\2\u029a\u029b\7u\2\2\u029b\u029c\7v\2\2\u029c\u0310\7c\2\2"+
"\u029d\u029e\7u\2\2\u029e\u029f\7v\2\2\u029f\u0310\7z\2\2\u02a0\u02a1"+
"\7f\2\2\u02a1\u02a2\7g\2\2\u02a2\u0310\7{\2\2\u02a3\u02a4\7v\2\2\u02a4"+
"\u02a5\7z\2\2\u02a5\u0310\7c\2\2\u02a6\u02a7\7z\2\2\u02a7\u02a8\7c\2\2"+
"\u02a8\u0310\7c\2\2\u02a9\u02aa\7d\2\2\u02aa\u02ab\7e\2\2\u02ab\u0310"+
"\7e\2\2\u02ac\u02ad\7c\2\2\u02ad\u02ae\7j\2\2\u02ae\u0310\7z\2\2\u02af"+
"\u02b0\7v\2\2\u02b0\u02b1\7{\2\2\u02b1\u0310\7c\2\2\u02b2\u02b3\7v\2\2"+
"\u02b3\u02b4\7z\2\2\u02b4\u0310\7u\2\2\u02b5\u02b6\7v\2\2\u02b6\u02b7"+
"\7c\2\2\u02b7\u0310\7u\2\2\u02b8\u02b9\7u\2\2\u02b9\u02ba\7j\2\2\u02ba"+
"\u0310\7{\2\2\u02bb\u02bc\7u\2\2\u02bc\u02bd\7j\2\2\u02bd\u0310\7z\2\2"+
"\u02be\u02bf\7n\2\2\u02bf\u02c0\7f\2\2\u02c0\u0310\7{\2\2\u02c1\u02c2"+
"\7n\2\2\u02c2\u02c3\7f\2\2\u02c3\u0310\7c\2\2\u02c4\u02c5\7n\2\2\u02c5"+
"\u02c6\7f\2\2\u02c6\u0310\7z\2\2\u02c7\u02c8\7n\2\2\u02c8\u02c9\7c\2\2"+
"\u02c9\u0310\7z\2\2\u02ca\u02cb\7v\2\2\u02cb\u02cc\7c\2\2\u02cc\u0310"+
"\7{\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7c\2\2\u02cf\u0310\7z\2\2\u02d0"+
"\u02d1\7d\2\2\u02d1\u02d2\7e\2\2\u02d2\u0310\7u\2\2\u02d3\u02d4\7e\2\2"+
"\u02d4\u02d5\7n\2\2\u02d5\u0310\7x\2\2\u02d6\u02d7\7v\2\2\u02d7\u02d8"+
"\7u\2\2\u02d8\u0310\7z\2\2\u02d9\u02da\7n\2\2\u02da\u02db\7c\2\2\u02db"+
"\u0310\7u\2\2\u02dc\u02dd\7e\2\2\u02dd\u02de\7r\2\2\u02de\u0310\7{\2\2"+
"\u02df\u02e0\7e\2\2\u02e0\u02e1\7o\2\2\u02e1\u0310\7r\2\2\u02e2\u02e3"+
"\7e\2\2\u02e3\u02e4\7r\2\2\u02e4\u0310\7z\2\2\u02e5\u02e6\7f\2\2\u02e6"+
"\u02e7\7e\2\2\u02e7\u0310\7r\2\2\u02e8\u02e9\7f\2\2\u02e9\u02ea\7g\2\2"+
"\u02ea\u0310\7e\2\2\u02eb\u02ec\7k\2\2\u02ec\u02ed\7p\2\2\u02ed\u0310"+
"\7e\2\2\u02ee\u02ef\7c\2\2\u02ef\u02f0\7z\2\2\u02f0\u0310\7u\2\2\u02f1"+
"\u02f2\7d\2\2\u02f2\u02f3\7p\2\2\u02f3\u0310\7g\2\2\u02f4\u02f5\7e\2\2"+
"\u02f5\u02f6\7n\2\2\u02f6\u0310\7f\2\2\u02f7\u02f8\7u\2\2\u02f8\u02f9"+
"\7d\2\2\u02f9\u0310\7e\2\2\u02fa\u02fb\7k\2\2\u02fb\u02fc\7u\2\2\u02fc"+
"\u0310\7e\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7p\2\2\u02ff\u0310\7z\2\2"+
"\u0300\u0301\7d\2\2\u0301\u0302\7g\2\2\u0302\u0310\7s\2\2\u0303\u0304"+
"\7u\2\2\u0304\u0305\7g\2\2\u0305\u0310\7f\2\2\u0306\u0307\7f\2\2\u0307"+
"\u0308\7g\2\2\u0308\u0310\7z\2\2\u0309\u030a\7k\2\2\u030a\u030b\7p\2\2"+
"\u030b\u0310\7{\2\2\u030c\u030d\7t\2\2\u030d\u030e\7q\2\2\u030e\u0310"+
"\7t\2\2\u030f\u0231\3\2\2\2\u030f\u0234\3\2\2\2\u030f\u0237\3\2\2\2\u030f"+
"\u023a\3\2\2\2\u030f\u023d\3\2\2\2\u030f\u0240\3\2\2\2\u030f\u0243\3\2"+
"\2\2\u030f\u0246\3\2\2\2\u030f\u0249\3\2\2\2\u030f\u024c\3\2\2\2\u030f"+
"\u024f\3\2\2\2\u030f\u0252\3\2\2\2\u030f\u0255\3\2\2\2\u030f\u0258\3\2"+
"\2\2\u030f\u025b\3\2\2\2\u030f\u025e\3\2\2\2\u030f\u0261\3\2\2\2\u030f"+
"\u0264\3\2\2\2\u030f\u0267\3\2\2\2\u030f\u026a\3\2\2\2\u030f\u026d\3\2"+
"\2\2\u030f\u0270\3\2\2\2\u030f\u0273\3\2\2\2\u030f\u0276\3\2\2\2\u030f"+
"\u0279\3\2\2\2\u030f\u027c\3\2\2\2\u030f\u027f\3\2\2\2\u030f\u0282\3\2"+
"\2\2\u030f\u0285\3\2\2\2\u030f\u0288\3\2\2\2\u030f\u028b\3\2\2\2\u030f"+
"\u028e\3\2\2\2\u030f\u0291\3\2\2\2\u030f\u0294\3\2\2\2\u030f\u0297\3\2"+
"\2\2\u030f\u029a\3\2\2\2\u030f\u029d\3\2\2\2\u030f\u02a0\3\2\2\2\u030f"+
"\u02a3\3\2\2\2\u030f\u02a6\3\2\2\2\u030f\u02a9\3\2\2\2\u030f\u02ac\3\2"+
"\2\2\u030f\u02af\3\2\2\2\u030f\u02b2\3\2\2\2\u030f\u02b5\3\2\2\2\u030f"+
"\u02b8\3\2\2\2\u030f\u02bb\3\2\2\2\u030f\u02be\3\2\2\2\u030f\u02c1\3\2"+
"\2\2\u030f\u02c4\3\2\2\2\u030f\u02c7\3\2\2\2\u030f\u02ca\3\2\2\2\u030f"+
"\u02cd\3\2\2\2\u030f\u02d0\3\2\2\2\u030f\u02d3\3\2\2\2\u030f\u02d6\3\2"+
"\2\2\u030f\u02d9\3\2\2\2\u030f\u02dc\3\2\2\2\u030f\u02df\3\2\2\2\u030f"+
"\u02e2\3\2\2\2\u030f\u02e5\3\2\2\2\u030f\u02e8\3\2\2\2\u030f\u02eb\3\2"+
"\2\2\u030f\u02ee\3\2\2\2\u030f\u02f1\3\2\2\2\u030f\u02f4\3\2\2\2\u030f"+
"\u02f7\3\2\2\2\u030f\u02fa\3\2\2\2\u030f\u02fd\3\2\2\2\u030f\u0300\3\2"+
"\2\2\u030f\u0303\3\2\2\2\u030f\u0306\3\2\2\2\u030f\u0309\3\2\2\2\u030f"+
"\u030c\3\2\2\2\u0310\u00a6\3\2\2\2\u0311\u0312\7}\2\2\u0312\u0313\7}\2"+
"\2\u0313\u0317\3\2\2\2\u0314\u0316\13\2\2\2\u0315\u0314\3\2\2\2\u0316"+
"\u0319\3\2\2\2\u0317\u0318\3\2\2\2\u0317\u0315\3\2\2\2\u0318\u031a\3\2"+
"\2\2\u0319\u0317\3\2\2\2\u031a\u031b\7\177\2\2\u031b\u031c\7\177\2\2\u031c"+
"\u00a8\3\2\2\2\u031d\u031e\7d\2\2\u031e\u031f\7{\2\2\u031f\u0320\7v\2"+
"\2\u0320\u0343\7g\2\2\u0321\u0322\7y\2\2\u0322\u0323\7q\2\2\u0323\u0324"+
"\7t\2\2\u0324\u0343\7f\2\2\u0325\u0326\7f\2\2\u0326\u0327\7y\2\2\u0327"+
"\u0328\7q\2\2\u0328\u0329\7t\2\2\u0329\u0343\7f\2\2\u032a\u032b\7d\2\2"+
"\u032b\u032c\7q\2\2\u032c\u032d\7q\2\2\u032d\u0343\7n\2\2\u032e\u032f"+
"\7e\2\2\u032f\u0330\7j\2\2\u0330\u0331\7c\2\2\u0331\u0343\7t\2\2\u0332"+
"\u0333\7u\2\2\u0333\u0334\7j\2\2\u0334\u0335\7q\2\2\u0335\u0336\7t\2\2"+
"\u0336\u0343\7v\2\2\u0337\u0338\7k\2\2\u0338\u0339\7p\2\2\u0339\u0343"+
"\7v\2\2\u033a\u033b\7n\2\2\u033b\u033c\7q\2\2\u033c\u033d\7p\2\2\u033d"+
"\u0343\7i\2\2\u033e\u033f\7x\2\2\u033f\u0340\7q\2\2\u0340\u0341\7k\2\2"+
"\u0341\u0343\7f\2\2\u0342\u031d\3\2\2\2\u0342\u0321\3\2\2\2\u0342\u0325"+
"\3\2\2\2\u0342\u032a\3\2\2\2\u0342\u032e\3\2\2\2\u0342\u0332\3\2\2\2\u0342"+
"\u0337\3\2\2\2\u0342\u033a\3\2\2\2\u0342\u033e\3\2\2\2\u0343\u00aa\3\2"+
"\2\2\u0344\u034a\7$\2\2\u0345\u0346\7^\2\2\u0346\u0349\7$\2\2\u0347\u0349"+
"\n\2\2\2\u0348\u0345\3\2\2\2\u0348\u0347\3\2\2\2\u0349\u034c\3\2\2\2\u034a"+
"\u0348\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034d\3\2\2\2\u034c\u034a\3\2"+
"\2\2\u034d\u034f\7$\2\2\u034e\u0350\t\3\2\2\u034f\u034e\3\2\2\2\u034f"+
"\u0350\3\2\2\2\u0350\u0355\3\2\2\2\u0351\u0353\t\4\2\2\u0352\u0354\t\5"+
"\2\2\u0353\u0352\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0356\3\2\2\2\u0355"+
"\u0351\3\2\2\2\u0355\u0356\3\2\2\2\u0356\u0358\3\2\2\2\u0357\u0359\t\3"+
"\2\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u00ac\3\2\2\2\u035a"+
"\u035e\7)\2\2\u035b\u035c\7^\2\2\u035c\u035f\7)\2\2\u035d\u035f\n\6\2"+
"\2\u035e\u035b\3\2\2\2\u035e\u035d\3\2\2\2\u035f\u0360\3\2\2\2\u0360\u0361"+
"\7)\2\2\u0361\u00ae\3\2\2\2\u0362\u0363\7v\2\2\u0363\u0364\7t\2\2\u0364"+
"\u0365\7w\2\2\u0365\u036c\7g\2\2\u0366\u0367\7h\2\2\u0367\u0368\7c\2\2"+
"\u0368\u0369\7n\2\2\u0369\u036a\7u\2\2\u036a\u036c\7g\2\2\u036b\u0362"+
"\3\2\2\2\u036b\u0366\3\2\2\2\u036c\u00b0\3\2\2\2\u036d\u0370\5\u00b3Z"+
"\2\u036e\u0370\5\u00bb^\2\u036f\u036d\3\2\2\2\u036f\u036e\3\2\2\2\u0370"+
"\u00b2\3\2\2\2\u0371\u0375\5\u00b5[\2\u0372\u0375\5\u00b7\\\2\u0373\u0375"+
"\5\u00b9]\2\u0374\u0371\3\2\2\2\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2"+
"\2\u0375\u00b4\3\2\2\2\u0376\u037c\7\'\2\2\u0377\u0378\7\62\2\2\u0378"+
"\u037c\7d\2\2\u0379\u037a\7\62\2\2\u037a\u037c\7D\2\2\u037b\u0376\3\2"+
"\2\2\u037b\u0377\3\2\2\2\u037b\u0379\3\2\2\2\u037c\u0380\3\2\2\2\u037d"+
"\u037f\5\u00c3b\2\u037e\u037d\3\2\2\2\u037f\u0382\3\2\2\2\u0380\u037e"+
"\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0383\3\2\2\2\u0382\u0380\3\2\2\2\u0383"+
"\u0385\7\60\2\2\u0384\u0386\5\u00c3b\2\u0385\u0384\3\2\2\2\u0386\u0387"+
"\3\2\2\2\u0387\u0385\3\2\2\2\u0387\u0388\3\2\2\2\u0388\u00b6\3\2\2\2\u0389"+
"\u038b\5\u00c5c\2\u038a\u0389\3\2\2\2\u038b\u038e\3\2\2\2\u038c\u038a"+
"\3\2\2\2\u038c\u038d\3\2\2\2\u038d\u038f\3\2\2\2\u038e\u038c\3\2\2\2\u038f"+
"\u0391\7\60\2\2\u0390\u0392\5\u00c5c\2\u0391\u0390\3\2\2\2\u0392\u0393"+
"\3\2\2\2\u0393\u0391\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u00b8\3\2\2\2\u0395"+
"\u039b\7&\2\2\u0396\u0397\7\62\2\2\u0397\u039b\7z\2\2\u0398\u0399\7\62"+
"\2\2\u0399\u039b\7Z\2\2\u039a\u0395\3\2\2\2\u039a\u0396\3\2\2\2\u039a"+
"\u0398\3\2\2\2\u039b\u039f\3\2\2\2\u039c\u039e\5\u00c7d\2\u039d\u039c"+
"\3\2\2\2\u039e\u03a1\3\2\2\2\u039f\u039d\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0"+
"\u03a2\3\2\2\2\u03a1\u039f\3\2\2\2\u03a2\u03a4\7\60\2\2\u03a3\u03a5\5"+
"\u00c7d\2\u03a4\u03a3\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6\u03a4\3\2\2\2"+
"\u03a6\u03a7\3\2\2\2\u03a7\u00ba\3\2\2\2\u03a8\u03ac\5\u00bf`\2\u03a9"+
"\u03ac\5\u00c1a\2\u03aa\u03ac\5\u00bd_\2\u03ab\u03a8\3\2\2\2\u03ab\u03a9"+
"\3\2\2\2\u03ab\u03aa\3\2\2\2\u03ac\u03b0\3\2\2\2\u03ad\u03ae\t\7\2\2\u03ae"+
"\u03b1\t\b\2\2\u03af\u03b1\7n\2\2\u03b0\u03ad\3\2\2\2\u03b0\u03af\3\2"+
"\2\2\u03b0\u03b1\3\2\2\2\u03b1\u00bc\3\2\2\2\u03b2\u03b3\7\62\2\2\u03b3"+
"\u03b5\t\t\2\2\u03b4\u03b6\5\u00c3b\2\u03b5\u03b4\3\2\2\2\u03b6\u03b7"+
"\3\2\2\2\u03b7\u03b5\3\2\2\2\u03b7\u03b8\3\2\2\2\u03b8\u03c0\3\2\2\2\u03b9"+
"\u03bb\7\'\2\2\u03ba\u03bc\5\u00c3b\2\u03bb\u03ba\3\2\2\2\u03bc\u03bd"+
"\3\2\2\2\u03bd\u03bb\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03c0\3\2\2\2\u03bf"+
"\u03b2\3\2\2\2\u03bf\u03b9\3\2\2\2\u03c0\u00be\3\2\2\2\u03c1\u03c3\5\u00c5"+
"c\2\u03c2\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c4"+
"\u03c5\3\2\2\2\u03c5\u00c0\3\2\2\2\u03c6\u03cc\7&\2\2\u03c7\u03c8\7\62"+
"\2\2\u03c8\u03cc\7z\2\2\u03c9\u03ca\7\62\2\2\u03ca\u03cc\7Z\2\2\u03cb"+
"\u03c6\3\2\2\2\u03cb\u03c7\3\2\2\2\u03cb\u03c9\3\2\2\2\u03cc\u03ce\3\2"+
"\2\2\u03cd\u03cf\5\u00c7d\2\u03ce\u03cd\3\2\2\2\u03cf\u03d0\3\2\2\2\u03d0"+
"\u03ce\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u00c2\3\2\2\2\u03d2\u03d3\t\n"+
"\2\2\u03d3\u00c4\3\2\2\2\u03d4\u03d5\t\13\2\2\u03d5\u00c6\3\2\2\2\u03d6"+
"\u03d7\t\f\2\2\u03d7\u00c8\3\2\2\2\u03d8\u03dc\5\u00cbf\2\u03d9\u03db"+
"\5\u00cdg\2\u03da\u03d9\3\2\2\2\u03db\u03de\3\2\2\2\u03dc\u03da\3\2\2"+
"\2\u03dc\u03dd\3\2\2\2\u03dd\u00ca\3\2\2\2\u03de\u03dc\3\2\2\2\u03df\u03e0"+
"\t\r\2\2\u03e0\u00cc\3\2\2\2\u03e1\u03e2\t\16\2\2\u03e2\u00ce\3\2\2\2"+
"\u03e3\u03e7\7#\2\2\u03e4\u03e6\5\u00cdg\2\u03e5\u03e4\3\2\2\2\u03e6\u03e9"+
"\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8\u03eb\3\2\2\2\u03e9"+
"\u03e7\3\2\2\2\u03ea\u03ec\t\17\2\2\u03eb\u03ea\3\2\2\2\u03ec\u03ed\3"+
"\2\2\2\u03ed\u03eb\3\2\2\2\u03ed\u03ee\3\2\2\2\u03ee\u00d0\3\2\2\2\u03ef"+
"\u03f1\t\20\2\2\u03f0\u03ef\3\2\2\2\u03f1\u03f2\3\2\2\2\u03f2\u03f0\3"+
"\2\2\2\u03f2\u03f3\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u03f5\bi\2\2\u03f5"+
"\u00d2\3\2\2\2\u03f6\u03f7\7\61\2\2\u03f7\u03f8\7\61\2\2\u03f8\u03fc\3"+
"\2\2\2\u03f9\u03fb\n\21\2\2\u03fa\u03f9\3\2\2\2\u03fb\u03fe\3\2\2\2\u03fc"+
"\u03fa\3\2\2\2\u03fc\u03fd\3\2\2\2\u03fd\u03ff\3\2\2\2\u03fe\u03fc\3\2"+
"\2\2\u03ff\u0400\bj\3\2\u0400\u00d4\3\2\2\2\u0401\u0402\7\61\2\2\u0402"+
"\u0403\7,\2\2\u0403\u0407\3\2\2\2\u0404\u0406\13\2\2\2\u0405\u0404\3\2"+
"\2\2\u0406\u0409\3\2\2\2\u0407\u0408\3\2\2\2\u0407\u0405\3\2\2\2\u0408"+
"\u040a\3\2\2\2\u0409\u0407\3\2\2\2\u040a\u040b\7,\2\2\u040b\u040c\7\61"+
"\2\2\u040c\u040d\3\2\2\2\u040d\u040e\bk\3\2\u040e\u00d6\3\2\2\2&\2\u030f"+
"\u0317\u0342\u0348\u034a\u034f\u0353\u0355\u0358\u035e\u036b\u036f\u0374"+
"\u037b\u0380\u0387\u038c\u0393\u039a\u039f\u03a6\u03ab\u03b0\u03b7\u03bd"+
"\u03bf\u03c4\u03cb\u03d0\u03dc\u03e7\u03ed\u03f2\u03fc\u0407\4\2\3\2\2"+
"\4\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -78,26 +78,27 @@ T__76=77
T__77=78
T__78=79
T__79=80
MNEMONIC=81
KICKASM=82
SIMPLETYPE=83
STRING=84
CHAR=85
BOOLEAN=86
NUMBER=87
NUMFLOAT=88
BINFLOAT=89
DECFLOAT=90
HEXFLOAT=91
NUMINT=92
BININTEGER=93
DECINTEGER=94
HEXINTEGER=95
NAME=96
ASMREL=97
WS=98
COMMENT_LINE=99
COMMENT_BLOCK=100
T__80=81
MNEMONIC=82
KICKASM=83
SIMPLETYPE=84
STRING=85
CHAR=86
BOOLEAN=87
NUMBER=88
NUMFLOAT=89
BINFLOAT=90
DECFLOAT=91
HEXFLOAT=92
NUMINT=93
BININTEGER=94
DECINTEGER=95
HEXINTEGER=96
NAME=97
ASMREL=98
WS=99
COMMENT_LINE=100
COMMENT_BLOCK=101
'import'=1
';'=2
'typedef'=3
@ -135,46 +136,47 @@ COMMENT_BLOCK=100
'['=35
']'=36
'struct'=37
'.'=38
'->'=39
'sizeof'=40
'typeid'=41
'--'=42
'++'=43
'+'=44
'-'=45
'!'=46
'&'=47
'~'=48
'>>'=49
'<<'=50
'/'=51
'%'=52
'<'=53
'>'=54
'=='=55
'!='=56
'<='=57
'>='=58
'^'=59
'|'=60
'&&'=61
'||'=62
'?'=63
'+='=64
'-='=65
'*='=66
'/='=67
'%='=68
'<<='=69
'>>='=70
'&='=71
'|='=72
'^='=73
'kickasm'=74
'resource'=75
'uses'=76
'clobbers'=77
'bytes'=78
'cycles'=79
'.byte'=80
'enum'=38
'.'=39
'->'=40
'sizeof'=41
'typeid'=42
'--'=43
'++'=44
'+'=45
'-'=46
'!'=47
'&'=48
'~'=49
'>>'=50
'<<'=51
'/'=52
'%'=53
'<'=54
'>'=55
'=='=56
'!='=57
'<='=58
'>='=59
'^'=60
'|'=61
'&&'=62
'||'=63
'?'=64
'+='=65
'-='=66
'*='=67
'/='=68
'%='=69
'<<='=70
'>>='=71
'&='=72
'|='=73
'^='=74
'kickasm'=75
'resource'=76
'uses'=77
'clobbers'=78
'bytes'=79
'cycles'=80
'.byte'=81

View File

@ -613,6 +613,30 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx);
/**
* Enter a parse tree produced by the {@code typeEnumRef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
*/
void enterTypeEnumRef(KickCParser.TypeEnumRefContext ctx);
/**
* Exit a parse tree produced by the {@code typeEnumRef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
*/
void exitTypeEnumRef(KickCParser.TypeEnumRefContext ctx);
/**
* Enter a parse tree produced by the {@code typeEnumDef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
*/
void enterTypeEnumDef(KickCParser.TypeEnumDefContext ctx);
/**
* Exit a parse tree produced by the {@code typeEnumDef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
*/
void exitTypeEnumDef(KickCParser.TypeEnumDefContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#structRef}.
* @param ctx the parse tree
@ -643,6 +667,46 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitStructMembers(KickCParser.StructMembersContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#enumRef}.
* @param ctx the parse tree
*/
void enterEnumRef(KickCParser.EnumRefContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#enumRef}.
* @param ctx the parse tree
*/
void exitEnumRef(KickCParser.EnumRefContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#enumDef}.
* @param ctx the parse tree
*/
void enterEnumDef(KickCParser.EnumDefContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#enumDef}.
* @param ctx the parse tree
*/
void exitEnumDef(KickCParser.EnumDefContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#enumMemberList}.
* @param ctx the parse tree
*/
void enterEnumMemberList(KickCParser.EnumMemberListContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#enumMemberList}.
* @param ctx the parse tree
*/
void exitEnumMemberList(KickCParser.EnumMemberListContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#enumMember}.
* @param ctx the parse tree
*/
void enterEnumMember(KickCParser.EnumMemberContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#enumMember}.
* @param ctx the parse tree
*/
void exitEnumMember(KickCParser.EnumMemberContext ctx);
/**
* Enter a parse tree produced by the {@code commaNone}
* labeled alternative in {@link KickCParser#commaExpr}.

File diff suppressed because it is too large Load Diff

View File

@ -366,6 +366,20 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitTypeSignedSimple(KickCParser.TypeSignedSimpleContext ctx);
/**
* Visit a parse tree produced by the {@code typeEnumRef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitTypeEnumRef(KickCParser.TypeEnumRefContext ctx);
/**
* Visit a parse tree produced by the {@code typeEnumDef}
* labeled alternative in {@link KickCParser#typeDecl}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitTypeEnumDef(KickCParser.TypeEnumDefContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#structRef}.
* @param ctx the parse tree
@ -384,6 +398,30 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitStructMembers(KickCParser.StructMembersContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#enumRef}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitEnumRef(KickCParser.EnumRefContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#enumDef}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitEnumDef(KickCParser.EnumDefContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#enumMemberList}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitEnumMemberList(KickCParser.EnumMemberListContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#enumMember}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitEnumMember(KickCParser.EnumMemberContext ctx);
/**
* Visit a parse tree produced by the {@code commaNone}
* labeled alternative in {@link KickCParser#commaExpr}.

View File

@ -1,11 +1,11 @@
// Standard C strings.h - functions to manipulate C strings and arrays.
// Copy block of memory
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
byte* memcpy( byte* destination, byte* source, word num ) {
byte* src = source;
byte* dst = destination;
for( word i=0;i<num; i++) *dst++ = *src++;
for( word i=0; i<num; i++) *dst++ = *src++;
return destination;
}
@ -13,15 +13,12 @@ byte* memcpy( byte* destination, byte* source, word num ) {
// Copies the values of num bytes from the location pointed by source to the memory block pointed by destination. Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.
byte* memmove( byte* destination, byte* source, word num ) {
if((word)destination<(word)source) {
// copy forwards
byte* src = source;
byte* dst = destination;
for( word i=0;i<num; i++) *dst++ = *src++;
memcpy(destination, source, num);
} else {
// copy backwards
byte* src = source+num;
byte* dst = destination+num;
for( word i=0;i<num; i++) *--dst = *--src;
for( word i=0; i<num; i++) *--dst = *--src;
}
return destination;
}

View File

@ -38,7 +38,7 @@ main: {
sta SCREEN+$3e7
jmp b1
}
// Copy block of memory
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.label src = 2

View File

@ -498,7 +498,7 @@ main: {
jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.label src = 2
@ -668,7 +668,7 @@ main: {
jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.label src = 2
@ -886,7 +886,7 @@ main: {
jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.label src = 2