diff --git a/modules/lang-painless/src/main/antlr/PainlessLexer.g4 b/modules/lang-painless/src/main/antlr/PainlessLexer.g4 index e920f11215ac3..70d476b321a54 100644 --- a/modules/lang-painless/src/main/antlr/PainlessLexer.g4 +++ b/modules/lang-painless/src/main/antlr/PainlessLexer.g4 @@ -22,6 +22,7 @@ LBRACE: '['; RBRACE: ']'; LP: '('; RP: ')'; +DOLLAR: '$'; // We switch modes after a dot to ensure there are not conflicts // between shortcuts and decimal values. Without the mode switch // shortcuts such as id.0.0 will fail because 0.0 will be interpreted diff --git a/modules/lang-painless/src/main/antlr/PainlessLexer.tokens b/modules/lang-painless/src/main/antlr/PainlessLexer.tokens index ff62343c92ba5..3a1af2a5154d3 100644 --- a/modules/lang-painless/src/main/antlr/PainlessLexer.tokens +++ b/modules/lang-painless/src/main/antlr/PainlessLexer.tokens @@ -6,153 +6,155 @@ LBRACE=5 RBRACE=6 LP=7 RP=8 -DOT=9 -NSDOT=10 -COMMA=11 -SEMICOLON=12 -IF=13 -IN=14 -ELSE=15 -WHILE=16 -DO=17 -FOR=18 -CONTINUE=19 -BREAK=20 -RETURN=21 -NEW=22 -TRY=23 -CATCH=24 -THROW=25 -THIS=26 -INSTANCEOF=27 -BOOLNOT=28 -BWNOT=29 -MUL=30 -DIV=31 -REM=32 -ADD=33 -SUB=34 -LSH=35 -RSH=36 -USH=37 -LT=38 -LTE=39 -GT=40 -GTE=41 -EQ=42 -EQR=43 -NE=44 -NER=45 -BWAND=46 -XOR=47 -BWOR=48 -BOOLAND=49 -BOOLOR=50 -COND=51 -COLON=52 -ELVIS=53 -REF=54 -ARROW=55 -FIND=56 -MATCH=57 -INCR=58 -DECR=59 -ASSIGN=60 -AADD=61 -ASUB=62 -AMUL=63 -ADIV=64 -AREM=65 -AAND=66 -AXOR=67 -AOR=68 -ALSH=69 -ARSH=70 -AUSH=71 -OCTAL=72 -HEX=73 -INTEGER=74 -DECIMAL=75 -STRING=76 -REGEX=77 -TRUE=78 -FALSE=79 -NULL=80 -PRIMITIVE=81 -DEF=82 -ID=83 -DOTINTEGER=84 -DOTID=85 +DOLLAR=9 +DOT=10 +NSDOT=11 +COMMA=12 +SEMICOLON=13 +IF=14 +IN=15 +ELSE=16 +WHILE=17 +DO=18 +FOR=19 +CONTINUE=20 +BREAK=21 +RETURN=22 +NEW=23 +TRY=24 +CATCH=25 +THROW=26 +THIS=27 +INSTANCEOF=28 +BOOLNOT=29 +BWNOT=30 +MUL=31 +DIV=32 +REM=33 +ADD=34 +SUB=35 +LSH=36 +RSH=37 +USH=38 +LT=39 +LTE=40 +GT=41 +GTE=42 +EQ=43 +EQR=44 +NE=45 +NER=46 +BWAND=47 +XOR=48 +BWOR=49 +BOOLAND=50 +BOOLOR=51 +COND=52 +COLON=53 +ELVIS=54 +REF=55 +ARROW=56 +FIND=57 +MATCH=58 +INCR=59 +DECR=60 +ASSIGN=61 +AADD=62 +ASUB=63 +AMUL=64 +ADIV=65 +AREM=66 +AAND=67 +AXOR=68 +AOR=69 +ALSH=70 +ARSH=71 +AUSH=72 +OCTAL=73 +HEX=74 +INTEGER=75 +DECIMAL=76 +STRING=77 +REGEX=78 +TRUE=79 +FALSE=80 +NULL=81 +PRIMITIVE=82 +DEF=83 +ID=84 +DOTINTEGER=85 +DOTID=86 '{'=3 '}'=4 '['=5 ']'=6 '('=7 ')'=8 -'.'=9 -'?.'=10 -','=11 -';'=12 -'if'=13 -'in'=14 -'else'=15 -'while'=16 -'do'=17 -'for'=18 -'continue'=19 -'break'=20 -'return'=21 -'new'=22 -'try'=23 -'catch'=24 -'throw'=25 -'this'=26 -'instanceof'=27 -'!'=28 -'~'=29 -'*'=30 -'/'=31 -'%'=32 -'+'=33 -'-'=34 -'<<'=35 -'>>'=36 -'>>>'=37 -'<'=38 -'<='=39 -'>'=40 -'>='=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 -'true'=78 -'false'=79 -'null'=80 -'def'=82 +'$'=9 +'.'=10 +'?.'=11 +','=12 +';'=13 +'if'=14 +'in'=15 +'else'=16 +'while'=17 +'do'=18 +'for'=19 +'continue'=20 +'break'=21 +'return'=22 +'new'=23 +'try'=24 +'catch'=25 +'throw'=26 +'this'=27 +'instanceof'=28 +'!'=29 +'~'=30 +'*'=31 +'/'=32 +'%'=33 +'+'=34 +'-'=35 +'<<'=36 +'>>'=37 +'>>>'=38 +'<'=39 +'<='=40 +'>'=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 +'true'=79 +'false'=80 +'null'=81 +'def'=83 diff --git a/modules/lang-painless/src/main/antlr/PainlessParser.g4 b/modules/lang-painless/src/main/antlr/PainlessParser.g4 index e3c95032ae56a..41e9e49365aa6 100644 --- a/modules/lang-painless/src/main/antlr/PainlessParser.g4 +++ b/modules/lang-painless/src/main/antlr/PainlessParser.g4 @@ -163,7 +163,7 @@ primary | listinitializer # listinit | mapinitializer # mapinit | ID # variable - | ID arguments # calllocal + | (ID | DOLLAR) arguments # calllocal | NEW type arguments # newobject ; diff --git a/modules/lang-painless/src/main/antlr/PainlessParser.tokens b/modules/lang-painless/src/main/antlr/PainlessParser.tokens index ff62343c92ba5..3a1af2a5154d3 100644 --- a/modules/lang-painless/src/main/antlr/PainlessParser.tokens +++ b/modules/lang-painless/src/main/antlr/PainlessParser.tokens @@ -6,153 +6,155 @@ LBRACE=5 RBRACE=6 LP=7 RP=8 -DOT=9 -NSDOT=10 -COMMA=11 -SEMICOLON=12 -IF=13 -IN=14 -ELSE=15 -WHILE=16 -DO=17 -FOR=18 -CONTINUE=19 -BREAK=20 -RETURN=21 -NEW=22 -TRY=23 -CATCH=24 -THROW=25 -THIS=26 -INSTANCEOF=27 -BOOLNOT=28 -BWNOT=29 -MUL=30 -DIV=31 -REM=32 -ADD=33 -SUB=34 -LSH=35 -RSH=36 -USH=37 -LT=38 -LTE=39 -GT=40 -GTE=41 -EQ=42 -EQR=43 -NE=44 -NER=45 -BWAND=46 -XOR=47 -BWOR=48 -BOOLAND=49 -BOOLOR=50 -COND=51 -COLON=52 -ELVIS=53 -REF=54 -ARROW=55 -FIND=56 -MATCH=57 -INCR=58 -DECR=59 -ASSIGN=60 -AADD=61 -ASUB=62 -AMUL=63 -ADIV=64 -AREM=65 -AAND=66 -AXOR=67 -AOR=68 -ALSH=69 -ARSH=70 -AUSH=71 -OCTAL=72 -HEX=73 -INTEGER=74 -DECIMAL=75 -STRING=76 -REGEX=77 -TRUE=78 -FALSE=79 -NULL=80 -PRIMITIVE=81 -DEF=82 -ID=83 -DOTINTEGER=84 -DOTID=85 +DOLLAR=9 +DOT=10 +NSDOT=11 +COMMA=12 +SEMICOLON=13 +IF=14 +IN=15 +ELSE=16 +WHILE=17 +DO=18 +FOR=19 +CONTINUE=20 +BREAK=21 +RETURN=22 +NEW=23 +TRY=24 +CATCH=25 +THROW=26 +THIS=27 +INSTANCEOF=28 +BOOLNOT=29 +BWNOT=30 +MUL=31 +DIV=32 +REM=33 +ADD=34 +SUB=35 +LSH=36 +RSH=37 +USH=38 +LT=39 +LTE=40 +GT=41 +GTE=42 +EQ=43 +EQR=44 +NE=45 +NER=46 +BWAND=47 +XOR=48 +BWOR=49 +BOOLAND=50 +BOOLOR=51 +COND=52 +COLON=53 +ELVIS=54 +REF=55 +ARROW=56 +FIND=57 +MATCH=58 +INCR=59 +DECR=60 +ASSIGN=61 +AADD=62 +ASUB=63 +AMUL=64 +ADIV=65 +AREM=66 +AAND=67 +AXOR=68 +AOR=69 +ALSH=70 +ARSH=71 +AUSH=72 +OCTAL=73 +HEX=74 +INTEGER=75 +DECIMAL=76 +STRING=77 +REGEX=78 +TRUE=79 +FALSE=80 +NULL=81 +PRIMITIVE=82 +DEF=83 +ID=84 +DOTINTEGER=85 +DOTID=86 '{'=3 '}'=4 '['=5 ']'=6 '('=7 ')'=8 -'.'=9 -'?.'=10 -','=11 -';'=12 -'if'=13 -'in'=14 -'else'=15 -'while'=16 -'do'=17 -'for'=18 -'continue'=19 -'break'=20 -'return'=21 -'new'=22 -'try'=23 -'catch'=24 -'throw'=25 -'this'=26 -'instanceof'=27 -'!'=28 -'~'=29 -'*'=30 -'/'=31 -'%'=32 -'+'=33 -'-'=34 -'<<'=35 -'>>'=36 -'>>>'=37 -'<'=38 -'<='=39 -'>'=40 -'>='=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 -'true'=78 -'false'=79 -'null'=80 -'def'=82 +'$'=9 +'.'=10 +'?.'=11 +','=12 +';'=13 +'if'=14 +'in'=15 +'else'=16 +'while'=17 +'do'=18 +'for'=19 +'continue'=20 +'break'=21 +'return'=22 +'new'=23 +'try'=24 +'catch'=25 +'throw'=26 +'this'=27 +'instanceof'=28 +'!'=29 +'~'=30 +'*'=31 +'/'=32 +'%'=33 +'+'=34 +'-'=35 +'<<'=36 +'>>'=37 +'>>>'=38 +'<'=39 +'<='=40 +'>'=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 +'true'=79 +'false'=80 +'null'=81 +'def'=83 diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java index 320ab38f39ce2..4e810af6b239a 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessLexer.java @@ -16,14 +16,14 @@ abstract class PainlessLexer extends Lexer { protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); - public static final int WS = 1, COMMENT = 2, LBRACK = 3, RBRACK = 4, LBRACE = 5, RBRACE = 6, LP = 7, RP = 8, DOT = 9, NSDOT = 10, - COMMA = 11, SEMICOLON = 12, IF = 13, IN = 14, ELSE = 15, WHILE = 16, DO = 17, FOR = 18, CONTINUE = 19, BREAK = 20, RETURN = 21, - NEW = 22, TRY = 23, CATCH = 24, THROW = 25, THIS = 26, INSTANCEOF = 27, BOOLNOT = 28, BWNOT = 29, MUL = 30, DIV = 31, REM = 32, - ADD = 33, SUB = 34, LSH = 35, RSH = 36, USH = 37, LT = 38, LTE = 39, GT = 40, GTE = 41, EQ = 42, EQR = 43, NE = 44, NER = 45, - BWAND = 46, XOR = 47, BWOR = 48, BOOLAND = 49, BOOLOR = 50, COND = 51, COLON = 52, ELVIS = 53, REF = 54, ARROW = 55, FIND = 56, - MATCH = 57, INCR = 58, DECR = 59, ASSIGN = 60, AADD = 61, ASUB = 62, AMUL = 63, ADIV = 64, AREM = 65, AAND = 66, AXOR = 67, AOR = - 68, ALSH = 69, ARSH = 70, AUSH = 71, OCTAL = 72, HEX = 73, INTEGER = 74, DECIMAL = 75, STRING = 76, REGEX = 77, TRUE = 78, - FALSE = 79, NULL = 80, PRIMITIVE = 81, DEF = 82, ID = 83, DOTINTEGER = 84, DOTID = 85; + public static final int WS = 1, COMMENT = 2, LBRACK = 3, RBRACK = 4, LBRACE = 5, RBRACE = 6, LP = 7, RP = 8, DOLLAR = 9, DOT = 10, + NSDOT = 11, COMMA = 12, SEMICOLON = 13, IF = 14, IN = 15, ELSE = 16, WHILE = 17, DO = 18, FOR = 19, CONTINUE = 20, BREAK = 21, + RETURN = 22, NEW = 23, TRY = 24, CATCH = 25, THROW = 26, THIS = 27, INSTANCEOF = 28, BOOLNOT = 29, BWNOT = 30, MUL = 31, DIV = 32, + REM = 33, ADD = 34, SUB = 35, LSH = 36, RSH = 37, USH = 38, LT = 39, LTE = 40, GT = 41, GTE = 42, EQ = 43, EQR = 44, NE = 45, NER = + 46, BWAND = 47, XOR = 48, BWOR = 49, BOOLAND = 50, BOOLOR = 51, COND = 52, COLON = 53, ELVIS = 54, REF = 55, ARROW = 56, FIND = + 57, MATCH = 58, INCR = 59, DECR = 60, ASSIGN = 61, AADD = 62, ASUB = 63, AMUL = 64, ADIV = 65, AREM = 66, AAND = 67, AXOR = + 68, AOR = 69, ALSH = 70, ARSH = 71, AUSH = 72, OCTAL = 73, HEX = 74, INTEGER = 75, DECIMAL = 76, STRING = 77, REGEX = + 78, TRUE = 79, FALSE = 80, NULL = 81, PRIMITIVE = 82, DEF = 83, ID = 84, DOTINTEGER = 85, DOTID = 86; public static final int AFTER_DOT = 1; public static String[] modeNames = { "DEFAULT_MODE", "AFTER_DOT" }; @@ -36,6 +36,7 @@ abstract class PainlessLexer extends Lexer { "RBRACE", "LP", "RP", + "DOLLAR", "DOT", "NSDOT", "COMMA", @@ -124,6 +125,7 @@ abstract class PainlessLexer extends Lexer { "']'", "'('", "')'", + "'$'", "'.'", "'?.'", "','", @@ -208,6 +210,7 @@ abstract class PainlessLexer extends Lexer { "RBRACE", "LP", "RP", + "DOLLAR", "DOT", "NSDOT", "COMMA", @@ -354,9 +357,9 @@ public ATN getATN() { @Override public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 30: + case 31: return DIV_sempred((RuleContext) _localctx, predIndex); - case 76: + case 77: return REGEX_sempred((RuleContext) _localctx, predIndex); } return true; @@ -378,7 +381,7 @@ private boolean REGEX_sempred(RuleContext _localctx, int predIndex) { return true; } - public static final String _serializedATN = "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2W\u027a\b\1\b\1\4" + public static final String _serializedATN = "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2X\u027e\b\1\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" @@ -388,218 +391,219 @@ private boolean REGEX_sempred(RuleContext _localctx, int predIndex) { + "\t\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\4" + "I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t" - + "T\4U\tU\4V\tV\3\2\6\2\u00b0\n\2\r\2\16\2\u00b1\3\2\3\2\3\3\3\3\3\3\3\3" - + "\7\3\u00ba\n\3\f\3\16\3\u00bd\13\3\3\3\3\3\3\3\3\3\3\3\7\3\u00c4\n\3\f" - + "\3\16\3\u00c7\13\3\3\3\3\3\5\3\u00cb\n\3\3\3\3\3\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\n\3\n\3\13\3\13\3\13\3\13\3\13\3" - + "\f\3\f\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20" - + "\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\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\25\3\25\3\25\3\25\3\25\3\25" - + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30" - + "\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33" - + "\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34" - + "\3\34\3\35\3\35\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\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\66\3\67\3\67\3\67\38\3" - + "8\38\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\3F\3G\3" - + "G\3G\3G\3H\3H\3H\3H\3H\3I\3I\6I\u01ba\nI\rI\16I\u01bb\3I\5I\u01bf\nI\3" - + "J\3J\3J\6J\u01c4\nJ\rJ\16J\u01c5\3J\5J\u01c9\nJ\3K\3K\3K\7K\u01ce\nK\f" - + "K\16K\u01d1\13K\5K\u01d3\nK\3K\5K\u01d6\nK\3L\3L\3L\7L\u01db\nL\fL\16" - + "L\u01de\13L\5L\u01e0\nL\3L\3L\6L\u01e4\nL\rL\16L\u01e5\5L\u01e8\nL\3L" - + "\3L\5L\u01ec\nL\3L\6L\u01ef\nL\rL\16L\u01f0\5L\u01f3\nL\3L\5L\u01f6\n" - + "L\3M\3M\3M\3M\3M\3M\7M\u01fe\nM\fM\16M\u0201\13M\3M\3M\3M\3M\3M\3M\3M" - + "\7M\u020a\nM\fM\16M\u020d\13M\3M\5M\u0210\nM\3N\3N\3N\3N\6N\u0216\nN\r" - + "N\16N\u0217\3N\3N\7N\u021c\nN\fN\16N\u021f\13N\3N\3N\3O\3O\3O\3O\3O\3" - + "P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\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\5R\u0259\nR\3S\3S\3S\3S\3T\3T\7T\u0261\nT\fT\16T\u0264\13T\3U" - + "\3U\3U\7U\u0269\nU\fU\16U\u026c\13U\5U\u026e\nU\3U\3U\3V\3V\7V\u0274\n" - + "V\fV\16V\u0277\13V\3V\3V\7\u00bb\u00c5\u01ff\u020b\u0217\2W\4\3\6\4\b" - + "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$" - + "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F" - + "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I" - + "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4" - + "S\u00a6T\u00a8U\u00aaV\u00acW\4\2\3\25\5\2\13\f\17\17\"\"\4\2\f\f\17\17" - + "\3\2\629\4\2NNnn\4\2ZZzz\5\2\62;CHch\3\2\63;\3\2\62;\b\2FFHHNNffhhnn\4" - + "\2GGgg\4\2--//\6\2FFHHffhh\4\2$$^^\4\2))^^\3\2\f\f\4\2\f\f\61\61\t\2W" - + "Weekknouuwwzz\5\2C\\aac|\6\2\62;C\\aac|\u02a0\2\4\3\2\2\2\2\6\3\2\2\2" - + "\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3" - + "\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2" - + "\2\2\36\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\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2" - + "\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2" - + "\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2" - + "N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3" - + "\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2" - + "\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2" - + "\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080" - + "\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2" - + "\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092" - + "\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2" - + "\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4" - + "\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\3\u00aa\3\2\2\2\3\u00ac\3\2\2" - + "\2\4\u00af\3\2\2\2\6\u00ca\3\2\2\2\b\u00ce\3\2\2\2\n\u00d0\3\2\2\2\f\u00d2" - + "\3\2\2\2\16\u00d4\3\2\2\2\20\u00d6\3\2\2\2\22\u00d8\3\2\2\2\24\u00da\3" - + "\2\2\2\26\u00de\3\2\2\2\30\u00e3\3\2\2\2\32\u00e5\3\2\2\2\34\u00e7\3\2" - + "\2\2\36\u00ea\3\2\2\2 \u00ed\3\2\2\2\"\u00f2\3\2\2\2$\u00f8\3\2\2\2&\u00fb" - + "\3\2\2\2(\u00ff\3\2\2\2*\u0108\3\2\2\2,\u010e\3\2\2\2.\u0115\3\2\2\2\60" - + "\u0119\3\2\2\2\62\u011d\3\2\2\2\64\u0123\3\2\2\2\66\u0129\3\2\2\28\u012e" - + "\3\2\2\2:\u0139\3\2\2\2<\u013b\3\2\2\2>\u013d\3\2\2\2@\u013f\3\2\2\2B" - + "\u0142\3\2\2\2D\u0144\3\2\2\2F\u0146\3\2\2\2H\u0148\3\2\2\2J\u014b\3\2" - + "\2\2L\u014e\3\2\2\2N\u0152\3\2\2\2P\u0154\3\2\2\2R\u0157\3\2\2\2T\u0159" - + "\3\2\2\2V\u015c\3\2\2\2X\u015f\3\2\2\2Z\u0163\3\2\2\2\\\u0166\3\2\2\2" - + "^\u016a\3\2\2\2`\u016c\3\2\2\2b\u016e\3\2\2\2d\u0170\3\2\2\2f\u0173\3" - + "\2\2\2h\u0176\3\2\2\2j\u0178\3\2\2\2l\u017a\3\2\2\2n\u017d\3\2\2\2p\u0180" - + "\3\2\2\2r\u0183\3\2\2\2t\u0186\3\2\2\2v\u018a\3\2\2\2x\u018d\3\2\2\2z" - + "\u0190\3\2\2\2|\u0192\3\2\2\2~\u0195\3\2\2\2\u0080\u0198\3\2\2\2\u0082" - + "\u019b\3\2\2\2\u0084\u019e\3\2\2\2\u0086\u01a1\3\2\2\2\u0088\u01a4\3\2" - + "\2\2\u008a\u01a7\3\2\2\2\u008c\u01aa\3\2\2\2\u008e\u01ae\3\2\2\2\u0090" - + "\u01b2\3\2\2\2\u0092\u01b7\3\2\2\2\u0094\u01c0\3\2\2\2\u0096\u01d2\3\2" - + "\2\2\u0098\u01df\3\2\2\2\u009a\u020f\3\2\2\2\u009c\u0211\3\2\2\2\u009e" - + "\u0222\3\2\2\2\u00a0\u0227\3\2\2\2\u00a2\u022d\3\2\2\2\u00a4\u0258\3\2" - + "\2\2\u00a6\u025a\3\2\2\2\u00a8\u025e\3\2\2\2\u00aa\u026d\3\2\2\2\u00ac" - + "\u0271\3\2\2\2\u00ae\u00b0\t\2\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b1\3\2" - + "\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3" - + "\u00b4\b\2\2\2\u00b4\5\3\2\2\2\u00b5\u00b6\7\61\2\2\u00b6\u00b7\7\61\2" - + "\2\u00b7\u00bb\3\2\2\2\u00b8\u00ba\13\2\2\2\u00b9\u00b8\3\2\2\2\u00ba" - + "\u00bd\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bc\u00be\3\2" - + "\2\2\u00bd\u00bb\3\2\2\2\u00be\u00cb\t\3\2\2\u00bf\u00c0\7\61\2\2\u00c0" - + "\u00c1\7,\2\2\u00c1\u00c5\3\2\2\2\u00c2\u00c4\13\2\2\2\u00c3\u00c2\3\2" - + "\2\2\u00c4\u00c7\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c5\u00c3\3\2\2\2\u00c6" - + "\u00c8\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c8\u00c9\7,\2\2\u00c9\u00cb\7\61" - + "\2\2\u00ca\u00b5\3\2\2\2\u00ca\u00bf\3\2\2\2\u00cb\u00cc\3\2\2\2\u00cc" - + "\u00cd\b\3\2\2\u00cd\7\3\2\2\2\u00ce\u00cf\7}\2\2\u00cf\t\3\2\2\2\u00d0" - + "\u00d1\7\177\2\2\u00d1\13\3\2\2\2\u00d2\u00d3\7]\2\2\u00d3\r\3\2\2\2\u00d4" - + "\u00d5\7_\2\2\u00d5\17\3\2\2\2\u00d6\u00d7\7*\2\2\u00d7\21\3\2\2\2\u00d8" - + "\u00d9\7+\2\2\u00d9\23\3\2\2\2\u00da\u00db\7\60\2\2\u00db\u00dc\3\2\2" - + "\2\u00dc\u00dd\b\n\3\2\u00dd\25\3\2\2\2\u00de\u00df\7A\2\2\u00df\u00e0" - + "\7\60\2\2\u00e0\u00e1\3\2\2\2\u00e1\u00e2\b\13\3\2\u00e2\27\3\2\2\2\u00e3" - + "\u00e4\7.\2\2\u00e4\31\3\2\2\2\u00e5\u00e6\7=\2\2\u00e6\33\3\2\2\2\u00e7" - + "\u00e8\7k\2\2\u00e8\u00e9\7h\2\2\u00e9\35\3\2\2\2\u00ea\u00eb\7k\2\2\u00eb" - + "\u00ec\7p\2\2\u00ec\37\3\2\2\2\u00ed\u00ee\7g\2\2\u00ee\u00ef\7n\2\2\u00ef" - + "\u00f0\7u\2\2\u00f0\u00f1\7g\2\2\u00f1!\3\2\2\2\u00f2\u00f3\7y\2\2\u00f3" - + "\u00f4\7j\2\2\u00f4\u00f5\7k\2\2\u00f5\u00f6\7n\2\2\u00f6\u00f7\7g\2\2" - + "\u00f7#\3\2\2\2\u00f8\u00f9\7f\2\2\u00f9\u00fa\7q\2\2\u00fa%\3\2\2\2\u00fb" - + "\u00fc\7h\2\2\u00fc\u00fd\7q\2\2\u00fd\u00fe\7t\2\2\u00fe\'\3\2\2\2\u00ff" - + "\u0100\7e\2\2\u0100\u0101\7q\2\2\u0101\u0102\7p\2\2\u0102\u0103\7v\2\2" - + "\u0103\u0104\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106\7w\2\2\u0106\u0107" - + "\7g\2\2\u0107)\3\2\2\2\u0108\u0109\7d\2\2\u0109\u010a\7t\2\2\u010a\u010b" - + "\7g\2\2\u010b\u010c\7c\2\2\u010c\u010d\7m\2\2\u010d+\3\2\2\2\u010e\u010f" - + "\7t\2\2\u010f\u0110\7g\2\2\u0110\u0111\7v\2\2\u0111\u0112\7w\2\2\u0112" - + "\u0113\7t\2\2\u0113\u0114\7p\2\2\u0114-\3\2\2\2\u0115\u0116\7p\2\2\u0116" - + "\u0117\7g\2\2\u0117\u0118\7y\2\2\u0118/\3\2\2\2\u0119\u011a\7v\2\2\u011a" - + "\u011b\7t\2\2\u011b\u011c\7{\2\2\u011c\61\3\2\2\2\u011d\u011e\7e\2\2\u011e" - + "\u011f\7c\2\2\u011f\u0120\7v\2\2\u0120\u0121\7e\2\2\u0121\u0122\7j\2\2" - + "\u0122\63\3\2\2\2\u0123\u0124\7v\2\2\u0124\u0125\7j\2\2\u0125\u0126\7" - + "t\2\2\u0126\u0127\7q\2\2\u0127\u0128\7y\2\2\u0128\65\3\2\2\2\u0129\u012a" - + "\7v\2\2\u012a\u012b\7j\2\2\u012b\u012c\7k\2\2\u012c\u012d\7u\2\2\u012d" - + "\67\3\2\2\2\u012e\u012f\7k\2\2\u012f\u0130\7p\2\2\u0130\u0131\7u\2\2\u0131" - + "\u0132\7v\2\2\u0132\u0133\7c\2\2\u0133\u0134\7p\2\2\u0134\u0135\7e\2\2" - + "\u0135\u0136\7g\2\2\u0136\u0137\7q\2\2\u0137\u0138\7h\2\2\u01389\3\2\2" - + "\2\u0139\u013a\7#\2\2\u013a;\3\2\2\2\u013b\u013c\7\u0080\2\2\u013c=\3" - + "\2\2\2\u013d\u013e\7,\2\2\u013e?\3\2\2\2\u013f\u0140\7\61\2\2\u0140\u0141" - + "\6 \2\2\u0141A\3\2\2\2\u0142\u0143\7\'\2\2\u0143C\3\2\2\2\u0144\u0145" - + "\7-\2\2\u0145E\3\2\2\2\u0146\u0147\7/\2\2\u0147G\3\2\2\2\u0148\u0149\7" - + ">\2\2\u0149\u014a\7>\2\2\u014aI\3\2\2\2\u014b\u014c\7@\2\2\u014c\u014d" - + "\7@\2\2\u014dK\3\2\2\2\u014e\u014f\7@\2\2\u014f\u0150\7@\2\2\u0150\u0151" - + "\7@\2\2\u0151M\3\2\2\2\u0152\u0153\7>\2\2\u0153O\3\2\2\2\u0154\u0155\7" - + ">\2\2\u0155\u0156\7?\2\2\u0156Q\3\2\2\2\u0157\u0158\7@\2\2\u0158S\3\2" - + "\2\2\u0159\u015a\7@\2\2\u015a\u015b\7?\2\2\u015bU\3\2\2\2\u015c\u015d" - + "\7?\2\2\u015d\u015e\7?\2\2\u015eW\3\2\2\2\u015f\u0160\7?\2\2\u0160\u0161" - + "\7?\2\2\u0161\u0162\7?\2\2\u0162Y\3\2\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\u0169" - + "\7?\2\2\u0169]\3\2\2\2\u016a\u016b\7(\2\2\u016b_\3\2\2\2\u016c\u016d\7" - + "`\2\2\u016da\3\2\2\2\u016e\u016f\7~\2\2\u016fc\3\2\2\2\u0170\u0171\7(" - + "\2\2\u0171\u0172\7(\2\2\u0172e\3\2\2\2\u0173\u0174\7~\2\2\u0174\u0175" - + "\7~\2\2\u0175g\3\2\2\2\u0176\u0177\7A\2\2\u0177i\3\2\2\2\u0178\u0179\7" - + "<\2\2\u0179k\3\2\2\2\u017a\u017b\7A\2\2\u017b\u017c\7<\2\2\u017cm\3\2" - + "\2\2\u017d\u017e\7<\2\2\u017e\u017f\7<\2\2\u017fo\3\2\2\2\u0180\u0181" - + "\7/\2\2\u0181\u0182\7@\2\2\u0182q\3\2\2\2\u0183\u0184\7?\2\2\u0184\u0185" - + "\7\u0080\2\2\u0185s\3\2\2\2\u0186\u0187\7?\2\2\u0187\u0188\7?\2\2\u0188" - + "\u0189\7\u0080\2\2\u0189u\3\2\2\2\u018a\u018b\7-\2\2\u018b\u018c\7-\2" - + "\2\u018cw\3\2\2\2\u018d\u018e\7/\2\2\u018e\u018f\7/\2\2\u018fy\3\2\2\2" - + "\u0190\u0191\7?\2\2\u0191{\3\2\2\2\u0192\u0193\7-\2\2\u0193\u0194\7?\2" - + "\2\u0194}\3\2\2\2\u0195\u0196\7/\2\2\u0196\u0197\7?\2\2\u0197\177\3\2" - + "\2\2\u0198\u0199\7,\2\2\u0199\u019a\7?\2\2\u019a\u0081\3\2\2\2\u019b\u019c" - + "\7\61\2\2\u019c\u019d\7?\2\2\u019d\u0083\3\2\2\2\u019e\u019f\7\'\2\2\u019f" - + "\u01a0\7?\2\2\u01a0\u0085\3\2\2\2\u01a1\u01a2\7(\2\2\u01a2\u01a3\7?\2" - + "\2\u01a3\u0087\3\2\2\2\u01a4\u01a5\7`\2\2\u01a5\u01a6\7?\2\2\u01a6\u0089" - + "\3\2\2\2\u01a7\u01a8\7~\2\2\u01a8\u01a9\7?\2\2\u01a9\u008b\3\2\2\2\u01aa" - + "\u01ab\7>\2\2\u01ab\u01ac\7>\2\2\u01ac\u01ad\7?\2\2\u01ad\u008d\3\2\2" - + "\2\u01ae\u01af\7@\2\2\u01af\u01b0\7@\2\2\u01b0\u01b1\7?\2\2\u01b1\u008f" - + "\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3\u01b4\7@\2\2\u01b4\u01b5\7@\2\2\u01b5" - + "\u01b6\7?\2\2\u01b6\u0091\3\2\2\2\u01b7\u01b9\7\62\2\2\u01b8\u01ba\t\4" - + "\2\2\u01b9\u01b8\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bb" - + "\u01bc\3\2\2\2\u01bc\u01be\3\2\2\2\u01bd\u01bf\t\5\2\2\u01be\u01bd\3\2" - + "\2\2\u01be\u01bf\3\2\2\2\u01bf\u0093\3\2\2\2\u01c0\u01c1\7\62\2\2\u01c1" - + "\u01c3\t\6\2\2\u01c2\u01c4\t\7\2\2\u01c3\u01c2\3\2\2\2\u01c4\u01c5\3\2" - + "\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2\2\2\u01c7" - + "\u01c9\t\5\2\2\u01c8\u01c7\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9\u0095\3\2" - + "\2\2\u01ca\u01d3\7\62\2\2\u01cb\u01cf\t\b\2\2\u01cc\u01ce\t\t\2\2\u01cd" - + "\u01cc\3\2\2\2\u01ce\u01d1\3\2\2\2\u01cf\u01cd\3\2\2\2\u01cf\u01d0\3\2" - + "\2\2\u01d0\u01d3\3\2\2\2\u01d1\u01cf\3\2\2\2\u01d2\u01ca\3\2\2\2\u01d2" - + "\u01cb\3\2\2\2\u01d3\u01d5\3\2\2\2\u01d4\u01d6\t\n\2\2\u01d5\u01d4\3\2" - + "\2\2\u01d5\u01d6\3\2\2\2\u01d6\u0097\3\2\2\2\u01d7\u01e0\7\62\2\2\u01d8" - + "\u01dc\t\b\2\2\u01d9\u01db\t\t\2\2\u01da\u01d9\3\2\2\2\u01db\u01de\3\2" - + "\2\2\u01dc\u01da\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01e0\3\2\2\2\u01de" - + "\u01dc\3\2\2\2\u01df\u01d7\3\2\2\2\u01df\u01d8\3\2\2\2\u01e0\u01e7\3\2" - + "\2\2\u01e1\u01e3\5\24\n\2\u01e2\u01e4\t\t\2\2\u01e3\u01e2\3\2\2\2\u01e4" - + "\u01e5\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e8\3\2" - + "\2\2\u01e7\u01e1\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8\u01f2\3\2\2\2\u01e9" - + "\u01eb\t\13\2\2\u01ea\u01ec\t\f\2\2\u01eb\u01ea\3\2\2\2\u01eb\u01ec\3" - + "\2\2\2\u01ec\u01ee\3\2\2\2\u01ed\u01ef\t\t\2\2\u01ee\u01ed\3\2\2\2\u01ef" - + "\u01f0\3\2\2\2\u01f0\u01ee\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f3\3\2" - + "\2\2\u01f2\u01e9\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\3\2\2\2\u01f4" - + "\u01f6\t\r\2\2\u01f5\u01f4\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6\u0099\3\2" - + "\2\2\u01f7\u01ff\7$\2\2\u01f8\u01f9\7^\2\2\u01f9\u01fe\7$\2\2\u01fa\u01fb" - + "\7^\2\2\u01fb\u01fe\7^\2\2\u01fc\u01fe\n\16\2\2\u01fd\u01f8\3\2\2\2\u01fd" - + "\u01fa\3\2\2\2\u01fd\u01fc\3\2\2\2\u01fe\u0201\3\2\2\2\u01ff\u0200\3\2" - + "\2\2\u01ff\u01fd\3\2\2\2\u0200\u0202\3\2\2\2\u0201\u01ff\3\2\2\2\u0202" - + "\u0210\7$\2\2\u0203\u020b\7)\2\2\u0204\u0205\7^\2\2\u0205\u020a\7)\2\2" - + "\u0206\u0207\7^\2\2\u0207\u020a\7^\2\2\u0208\u020a\n\17\2\2\u0209\u0204" - + "\3\2\2\2\u0209\u0206\3\2\2\2\u0209\u0208\3\2\2\2\u020a\u020d\3\2\2\2\u020b" - + "\u020c\3\2\2\2\u020b\u0209\3\2\2\2\u020c\u020e\3\2\2\2\u020d\u020b\3\2" - + "\2\2\u020e\u0210\7)\2\2\u020f\u01f7\3\2\2\2\u020f\u0203\3\2\2\2\u0210" - + "\u009b\3\2\2\2\u0211\u0215\7\61\2\2\u0212\u0213\7^\2\2\u0213\u0216\n\20" - + "\2\2\u0214\u0216\n\21\2\2\u0215\u0212\3\2\2\2\u0215\u0214\3\2\2\2\u0216" - + "\u0217\3\2\2\2\u0217\u0218\3\2\2\2\u0217\u0215\3\2\2\2\u0218\u0219\3\2" - + "\2\2\u0219\u021d\7\61\2\2\u021a\u021c\t\22\2\2\u021b\u021a\3\2\2\2\u021c" - + "\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0220\3\2" - + "\2\2\u021f\u021d\3\2\2\2\u0220\u0221\6N\3\2\u0221\u009d\3\2\2\2\u0222" - + "\u0223\7v\2\2\u0223\u0224\7t\2\2\u0224\u0225\7w\2\2\u0225\u0226\7g\2\2" - + "\u0226\u009f\3\2\2\2\u0227\u0228\7h\2\2\u0228\u0229\7c\2\2\u0229\u022a" - + "\7n\2\2\u022a\u022b\7u\2\2\u022b\u022c\7g\2\2\u022c\u00a1\3\2\2\2\u022d" - + "\u022e\7p\2\2\u022e\u022f\7w\2\2\u022f\u0230\7n\2\2\u0230\u0231\7n\2\2" - + "\u0231\u00a3\3\2\2\2\u0232\u0233\7d\2\2\u0233\u0234\7q\2\2\u0234\u0235" - + "\7q\2\2\u0235\u0236\7n\2\2\u0236\u0237\7g\2\2\u0237\u0238\7c\2\2\u0238" - + "\u0259\7p\2\2\u0239\u023a\7d\2\2\u023a\u023b\7{\2\2\u023b\u023c\7v\2\2" - + "\u023c\u0259\7g\2\2\u023d\u023e\7u\2\2\u023e\u023f\7j\2\2\u023f\u0240" - + "\7q\2\2\u0240\u0241\7t\2\2\u0241\u0259\7v\2\2\u0242\u0243\7e\2\2\u0243" - + "\u0244\7j\2\2\u0244\u0245\7c\2\2\u0245\u0259\7t\2\2\u0246\u0247\7k\2\2" - + "\u0247\u0248\7p\2\2\u0248\u0259\7v\2\2\u0249\u024a\7n\2\2\u024a\u024b" - + "\7q\2\2\u024b\u024c\7p\2\2\u024c\u0259\7i\2\2\u024d\u024e\7h\2\2\u024e" - + "\u024f\7n\2\2\u024f\u0250\7q\2\2\u0250\u0251\7c\2\2\u0251\u0259\7v\2\2" - + "\u0252\u0253\7f\2\2\u0253\u0254\7q\2\2\u0254\u0255\7w\2\2\u0255\u0256" - + "\7d\2\2\u0256\u0257\7n\2\2\u0257\u0259\7g\2\2\u0258\u0232\3\2\2\2\u0258" - + "\u0239\3\2\2\2\u0258\u023d\3\2\2\2\u0258\u0242\3\2\2\2\u0258\u0246\3\2" - + "\2\2\u0258\u0249\3\2\2\2\u0258\u024d\3\2\2\2\u0258\u0252\3\2\2\2\u0259" - + "\u00a5\3\2\2\2\u025a\u025b\7f\2\2\u025b\u025c\7g\2\2\u025c\u025d\7h\2" - + "\2\u025d\u00a7\3\2\2\2\u025e\u0262\t\23\2\2\u025f\u0261\t\24\2\2\u0260" - + "\u025f\3\2\2\2\u0261\u0264\3\2\2\2\u0262\u0260\3\2\2\2\u0262\u0263\3\2" - + "\2\2\u0263\u00a9\3\2\2\2\u0264\u0262\3\2\2\2\u0265\u026e\7\62\2\2\u0266" - + "\u026a\t\b\2\2\u0267\u0269\t\t\2\2\u0268\u0267\3\2\2\2\u0269\u026c\3\2" - + "\2\2\u026a\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b\u026e\3\2\2\2\u026c" - + "\u026a\3\2\2\2\u026d\u0265\3\2\2\2\u026d\u0266\3\2\2\2\u026e\u026f\3\2" - + "\2\2\u026f\u0270\bU\4\2\u0270\u00ab\3\2\2\2\u0271\u0275\t\23\2\2\u0272" - + "\u0274\t\24\2\2\u0273\u0272\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3" - + "\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278" - + "\u0279\bV\4\2\u0279\u00ad\3\2\2\2$\2\3\u00b1\u00bb\u00c5\u00ca\u01bb\u01be" - + "\u01c5\u01c8\u01cf\u01d2\u01d5\u01dc\u01df\u01e5\u01e7\u01eb\u01f0\u01f2" - + "\u01f5\u01fd\u01ff\u0209\u020b\u020f\u0215\u0217\u021d\u0258\u0262\u026a" - + "\u026d\u0275\5\b\2\2\4\3\2\4\2\2"; + + "T\4U\tU\4V\tV\4W\tW\3\2\6\2\u00b2\n\2\r\2\16\2\u00b3\3\2\3\2\3\3\3\3\3" + + "\3\3\3\7\3\u00bc\n\3\f\3\16\3\u00bf\13\3\3\3\3\3\3\3\3\3\3\3\7\3\u00c6" + + "\n\3\f\3\16\3\u00c9\13\3\3\3\3\3\5\3\u00cd\n\3\3\3\3\3\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\13\3\13\3\f\3\f\3" + + "\f\3\f\3\f\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3" + + "\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\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\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\27\3\30\3\30\3\30\3\30\3" + + "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3" + + "\33\3\33\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\35\3\35\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\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\3\67\38\3" + + "8\38\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\3G\3G\3" + + "G\3G\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\6J\u01be\nJ\rJ\16J\u01bf\3J\5J\u01c3" + + "\nJ\3K\3K\3K\6K\u01c8\nK\rK\16K\u01c9\3K\5K\u01cd\nK\3L\3L\3L\7L\u01d2" + + "\nL\fL\16L\u01d5\13L\5L\u01d7\nL\3L\5L\u01da\nL\3M\3M\3M\7M\u01df\nM\f" + + "M\16M\u01e2\13M\5M\u01e4\nM\3M\3M\6M\u01e8\nM\rM\16M\u01e9\5M\u01ec\n" + + "M\3M\3M\5M\u01f0\nM\3M\6M\u01f3\nM\rM\16M\u01f4\5M\u01f7\nM\3M\5M\u01fa" + + "\nM\3N\3N\3N\3N\3N\3N\7N\u0202\nN\fN\16N\u0205\13N\3N\3N\3N\3N\3N\3N\3" + + "N\7N\u020e\nN\fN\16N\u0211\13N\3N\5N\u0214\nN\3O\3O\3O\3O\6O\u021a\nO" + + "\rO\16O\u021b\3O\3O\7O\u0220\nO\fO\16O\u0223\13O\3O\3O\3P\3P\3P\3P\3P" + + "\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S" + + "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S" + + "\3S\3S\3S\5S\u025d\nS\3T\3T\3T\3T\3U\3U\7U\u0265\nU\fU\16U\u0268\13U\3" + + "V\3V\3V\7V\u026d\nV\fV\16V\u0270\13V\5V\u0272\nV\3V\3V\3W\3W\7W\u0278" + + "\nW\fW\16W\u027b\13W\3W\3W\7\u00bd\u00c7\u0203\u020f\u021b\2X\4\3\6\4" + + "\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22" + + "$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#" + + "F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090" + + "I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4" + + "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\4\2\3\25\5\2\13\f\17\17\"\"\4\2\f" + + "\f\17\17\3\2\629\4\2NNnn\4\2ZZzz\5\2\62;CHch\3\2\63;\3\2\62;\b\2FFHHN" + + "Nffhhnn\4\2GGgg\4\2--//\6\2FFHHffhh\4\2$$^^\4\2))^^\3\2\f\f\4\2\f\f\61" + + "\61\t\2WWeekknouuwwzz\5\2C\\aac|\6\2\62;C\\aac|\u02a4\2\4\3\2\2\2\2\6" + + "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2" + + "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34" + + "\3\2\2\2\2\36\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\60\3\2\2\2\2\62\3\2\2\2\2" + + "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2" + + "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3" + + "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2" + + "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2" + + "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r" + + "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2" + + "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2" + + "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090" + + "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2" + + "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2" + + "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2" + + "\2\3\u00ac\3\2\2\2\3\u00ae\3\2\2\2\4\u00b1\3\2\2\2\6\u00cc\3\2\2\2\b\u00d0" + + "\3\2\2\2\n\u00d2\3\2\2\2\f\u00d4\3\2\2\2\16\u00d6\3\2\2\2\20\u00d8\3\2" + + "\2\2\22\u00da\3\2\2\2\24\u00dc\3\2\2\2\26\u00de\3\2\2\2\30\u00e2\3\2\2" + + "\2\32\u00e7\3\2\2\2\34\u00e9\3\2\2\2\36\u00eb\3\2\2\2 \u00ee\3\2\2\2\"" + + "\u00f1\3\2\2\2$\u00f6\3\2\2\2&\u00fc\3\2\2\2(\u00ff\3\2\2\2*\u0103\3\2" + + "\2\2,\u010c\3\2\2\2.\u0112\3\2\2\2\60\u0119\3\2\2\2\62\u011d\3\2\2\2\64" + + "\u0121\3\2\2\2\66\u0127\3\2\2\28\u012d\3\2\2\2:\u0132\3\2\2\2<\u013d\3" + + "\2\2\2>\u013f\3\2\2\2@\u0141\3\2\2\2B\u0143\3\2\2\2D\u0146\3\2\2\2F\u0148" + + "\3\2\2\2H\u014a\3\2\2\2J\u014c\3\2\2\2L\u014f\3\2\2\2N\u0152\3\2\2\2P" + + "\u0156\3\2\2\2R\u0158\3\2\2\2T\u015b\3\2\2\2V\u015d\3\2\2\2X\u0160\3\2" + + "\2\2Z\u0163\3\2\2\2\\\u0167\3\2\2\2^\u016a\3\2\2\2`\u016e\3\2\2\2b\u0170" + + "\3\2\2\2d\u0172\3\2\2\2f\u0174\3\2\2\2h\u0177\3\2\2\2j\u017a\3\2\2\2l" + + "\u017c\3\2\2\2n\u017e\3\2\2\2p\u0181\3\2\2\2r\u0184\3\2\2\2t\u0187\3\2" + + "\2\2v\u018a\3\2\2\2x\u018e\3\2\2\2z\u0191\3\2\2\2|\u0194\3\2\2\2~\u0196" + + "\3\2\2\2\u0080\u0199\3\2\2\2\u0082\u019c\3\2\2\2\u0084\u019f\3\2\2\2\u0086" + + "\u01a2\3\2\2\2\u0088\u01a5\3\2\2\2\u008a\u01a8\3\2\2\2\u008c\u01ab\3\2" + + "\2\2\u008e\u01ae\3\2\2\2\u0090\u01b2\3\2\2\2\u0092\u01b6\3\2\2\2\u0094" + + "\u01bb\3\2\2\2\u0096\u01c4\3\2\2\2\u0098\u01d6\3\2\2\2\u009a\u01e3\3\2" + + "\2\2\u009c\u0213\3\2\2\2\u009e\u0215\3\2\2\2\u00a0\u0226\3\2\2\2\u00a2" + + "\u022b\3\2\2\2\u00a4\u0231\3\2\2\2\u00a6\u025c\3\2\2\2\u00a8\u025e\3\2" + + "\2\2\u00aa\u0262\3\2\2\2\u00ac\u0271\3\2\2\2\u00ae\u0275\3\2\2\2\u00b0" + + "\u00b2\t\2\2\2\u00b1\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b1\3\2" + + "\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00b6\b\2\2\2\u00b6" + + "\5\3\2\2\2\u00b7\u00b8\7\61\2\2\u00b8\u00b9\7\61\2\2\u00b9\u00bd\3\2\2" + + "\2\u00ba\u00bc\13\2\2\2\u00bb\u00ba\3\2\2\2\u00bc\u00bf\3\2\2\2\u00bd" + + "\u00be\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be\u00c0\3\2\2\2\u00bf\u00bd\3\2" + + "\2\2\u00c0\u00cd\t\3\2\2\u00c1\u00c2\7\61\2\2\u00c2\u00c3\7,\2\2\u00c3" + + "\u00c7\3\2\2\2\u00c4\u00c6\13\2\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00c9\3" + + "\2\2\2\u00c7\u00c8\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c8\u00ca\3\2\2\2\u00c9" + + "\u00c7\3\2\2\2\u00ca\u00cb\7,\2\2\u00cb\u00cd\7\61\2\2\u00cc\u00b7\3\2" + + "\2\2\u00cc\u00c1\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\b\3\2\2\u00cf" + + "\7\3\2\2\2\u00d0\u00d1\7}\2\2\u00d1\t\3\2\2\2\u00d2\u00d3\7\177\2\2\u00d3" + + "\13\3\2\2\2\u00d4\u00d5\7]\2\2\u00d5\r\3\2\2\2\u00d6\u00d7\7_\2\2\u00d7" + + "\17\3\2\2\2\u00d8\u00d9\7*\2\2\u00d9\21\3\2\2\2\u00da\u00db\7+\2\2\u00db" + + "\23\3\2\2\2\u00dc\u00dd\7&\2\2\u00dd\25\3\2\2\2\u00de\u00df\7\60\2\2\u00df" + + "\u00e0\3\2\2\2\u00e0\u00e1\b\13\3\2\u00e1\27\3\2\2\2\u00e2\u00e3\7A\2" + + "\2\u00e3\u00e4\7\60\2\2\u00e4\u00e5\3\2\2\2\u00e5\u00e6\b\f\3\2\u00e6" + + "\31\3\2\2\2\u00e7\u00e8\7.\2\2\u00e8\33\3\2\2\2\u00e9\u00ea\7=\2\2\u00ea" + + "\35\3\2\2\2\u00eb\u00ec\7k\2\2\u00ec\u00ed\7h\2\2\u00ed\37\3\2\2\2\u00ee" + + "\u00ef\7k\2\2\u00ef\u00f0\7p\2\2\u00f0!\3\2\2\2\u00f1\u00f2\7g\2\2\u00f2" + + "\u00f3\7n\2\2\u00f3\u00f4\7u\2\2\u00f4\u00f5\7g\2\2\u00f5#\3\2\2\2\u00f6" + + "\u00f7\7y\2\2\u00f7\u00f8\7j\2\2\u00f8\u00f9\7k\2\2\u00f9\u00fa\7n\2\2" + + "\u00fa\u00fb\7g\2\2\u00fb%\3\2\2\2\u00fc\u00fd\7f\2\2\u00fd\u00fe\7q\2" + + "\2\u00fe\'\3\2\2\2\u00ff\u0100\7h\2\2\u0100\u0101\7q\2\2\u0101\u0102\7" + + "t\2\2\u0102)\3\2\2\2\u0103\u0104\7e\2\2\u0104\u0105\7q\2\2\u0105\u0106" + + "\7p\2\2\u0106\u0107\7v\2\2\u0107\u0108\7k\2\2\u0108\u0109\7p\2\2\u0109" + + "\u010a\7w\2\2\u010a\u010b\7g\2\2\u010b+\3\2\2\2\u010c\u010d\7d\2\2\u010d" + + "\u010e\7t\2\2\u010e\u010f\7g\2\2\u010f\u0110\7c\2\2\u0110\u0111\7m\2\2" + + "\u0111-\3\2\2\2\u0112\u0113\7t\2\2\u0113\u0114\7g\2\2\u0114\u0115\7v\2" + + "\2\u0115\u0116\7w\2\2\u0116\u0117\7t\2\2\u0117\u0118\7p\2\2\u0118/\3\2" + + "\2\2\u0119\u011a\7p\2\2\u011a\u011b\7g\2\2\u011b\u011c\7y\2\2\u011c\61" + + "\3\2\2\2\u011d\u011e\7v\2\2\u011e\u011f\7t\2\2\u011f\u0120\7{\2\2\u0120" + + "\63\3\2\2\2\u0121\u0122\7e\2\2\u0122\u0123\7c\2\2\u0123\u0124\7v\2\2\u0124" + + "\u0125\7e\2\2\u0125\u0126\7j\2\2\u0126\65\3\2\2\2\u0127\u0128\7v\2\2\u0128" + + "\u0129\7j\2\2\u0129\u012a\7t\2\2\u012a\u012b\7q\2\2\u012b\u012c\7y\2\2" + + "\u012c\67\3\2\2\2\u012d\u012e\7v\2\2\u012e\u012f\7j\2\2\u012f\u0130\7" + + "k\2\2\u0130\u0131\7u\2\2\u01319\3\2\2\2\u0132\u0133\7k\2\2\u0133\u0134" + + "\7p\2\2\u0134\u0135\7u\2\2\u0135\u0136\7v\2\2\u0136\u0137\7c\2\2\u0137" + + "\u0138\7p\2\2\u0138\u0139\7e\2\2\u0139\u013a\7g\2\2\u013a\u013b\7q\2\2" + + "\u013b\u013c\7h\2\2\u013c;\3\2\2\2\u013d\u013e\7#\2\2\u013e=\3\2\2\2\u013f" + + "\u0140\7\u0080\2\2\u0140?\3\2\2\2\u0141\u0142\7,\2\2\u0142A\3\2\2\2\u0143" + + "\u0144\7\61\2\2\u0144\u0145\6!\2\2\u0145C\3\2\2\2\u0146\u0147\7\'\2\2" + + "\u0147E\3\2\2\2\u0148\u0149\7-\2\2\u0149G\3\2\2\2\u014a\u014b\7/\2\2\u014b" + + "I\3\2\2\2\u014c\u014d\7>\2\2\u014d\u014e\7>\2\2\u014eK\3\2\2\2\u014f\u0150" + + "\7@\2\2\u0150\u0151\7@\2\2\u0151M\3\2\2\2\u0152\u0153\7@\2\2\u0153\u0154" + + "\7@\2\2\u0154\u0155\7@\2\2\u0155O\3\2\2\2\u0156\u0157\7>\2\2\u0157Q\3" + + "\2\2\2\u0158\u0159\7>\2\2\u0159\u015a\7?\2\2\u015aS\3\2\2\2\u015b\u015c" + + "\7@\2\2\u015cU\3\2\2\2\u015d\u015e\7@\2\2\u015e\u015f\7?\2\2\u015fW\3" + + "\2\2\2\u0160\u0161\7?\2\2\u0161\u0162\7?\2\2\u0162Y\3\2\2\2\u0163\u0164" + + "\7?\2\2\u0164\u0165\7?\2\2\u0165\u0166\7?\2\2\u0166[\3\2\2\2\u0167\u0168" + + "\7#\2\2\u0168\u0169\7?\2\2\u0169]\3\2\2\2\u016a\u016b\7#\2\2\u016b\u016c" + + "\7?\2\2\u016c\u016d\7?\2\2\u016d_\3\2\2\2\u016e\u016f\7(\2\2\u016fa\3" + + "\2\2\2\u0170\u0171\7`\2\2\u0171c\3\2\2\2\u0172\u0173\7~\2\2\u0173e\3\2" + + "\2\2\u0174\u0175\7(\2\2\u0175\u0176\7(\2\2\u0176g\3\2\2\2\u0177\u0178" + + "\7~\2\2\u0178\u0179\7~\2\2\u0179i\3\2\2\2\u017a\u017b\7A\2\2\u017bk\3" + + "\2\2\2\u017c\u017d\7<\2\2\u017dm\3\2\2\2\u017e\u017f\7A\2\2\u017f\u0180" + + "\7<\2\2\u0180o\3\2\2\2\u0181\u0182\7<\2\2\u0182\u0183\7<\2\2\u0183q\3" + + "\2\2\2\u0184\u0185\7/\2\2\u0185\u0186\7@\2\2\u0186s\3\2\2\2\u0187\u0188" + + "\7?\2\2\u0188\u0189\7\u0080\2\2\u0189u\3\2\2\2\u018a\u018b\7?\2\2\u018b" + + "\u018c\7?\2\2\u018c\u018d\7\u0080\2\2\u018dw\3\2\2\2\u018e\u018f\7-\2" + + "\2\u018f\u0190\7-\2\2\u0190y\3\2\2\2\u0191\u0192\7/\2\2\u0192\u0193\7" + + "/\2\2\u0193{\3\2\2\2\u0194\u0195\7?\2\2\u0195}\3\2\2\2\u0196\u0197\7-" + + "\2\2\u0197\u0198\7?\2\2\u0198\177\3\2\2\2\u0199\u019a\7/\2\2\u019a\u019b" + + "\7?\2\2\u019b\u0081\3\2\2\2\u019c\u019d\7,\2\2\u019d\u019e\7?\2\2\u019e" + + "\u0083\3\2\2\2\u019f\u01a0\7\61\2\2\u01a0\u01a1\7?\2\2\u01a1\u0085\3\2" + + "\2\2\u01a2\u01a3\7\'\2\2\u01a3\u01a4\7?\2\2\u01a4\u0087\3\2\2\2\u01a5" + + "\u01a6\7(\2\2\u01a6\u01a7\7?\2\2\u01a7\u0089\3\2\2\2\u01a8\u01a9\7`\2" + + "\2\u01a9\u01aa\7?\2\2\u01aa\u008b\3\2\2\2\u01ab\u01ac\7~\2\2\u01ac\u01ad" + + "\7?\2\2\u01ad\u008d\3\2\2\2\u01ae\u01af\7>\2\2\u01af\u01b0\7>\2\2\u01b0" + + "\u01b1\7?\2\2\u01b1\u008f\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3\u01b4\7@\2" + + "\2\u01b4\u01b5\7?\2\2\u01b5\u0091\3\2\2\2\u01b6\u01b7\7@\2\2\u01b7\u01b8" + + "\7@\2\2\u01b8\u01b9\7@\2\2\u01b9\u01ba\7?\2\2\u01ba\u0093\3\2\2\2\u01bb" + + "\u01bd\7\62\2\2\u01bc\u01be\t\4\2\2\u01bd\u01bc\3\2\2\2\u01be\u01bf\3" + + "\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c2\3\2\2\2\u01c1" + + "\u01c3\t\5\2\2\u01c2\u01c1\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u0095\3\2" + + "\2\2\u01c4\u01c5\7\62\2\2\u01c5\u01c7\t\6\2\2\u01c6\u01c8\t\7\2\2\u01c7" + + "\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2" + + "\2\2\u01ca\u01cc\3\2\2\2\u01cb\u01cd\t\5\2\2\u01cc\u01cb\3\2\2\2\u01cc" + + "\u01cd\3\2\2\2\u01cd\u0097\3\2\2\2\u01ce\u01d7\7\62\2\2\u01cf\u01d3\t" + + "\b\2\2\u01d0\u01d2\t\t\2\2\u01d1\u01d0\3\2\2\2\u01d2\u01d5\3\2\2\2\u01d3" + + "\u01d1\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d7\3\2\2\2\u01d5\u01d3\3\2" + + "\2\2\u01d6\u01ce\3\2\2\2\u01d6\u01cf\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8" + + "\u01da\t\n\2\2\u01d9\u01d8\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u0099\3\2" + + "\2\2\u01db\u01e4\7\62\2\2\u01dc\u01e0\t\b\2\2\u01dd\u01df\t\t\2\2\u01de" + + "\u01dd\3\2\2\2\u01df\u01e2\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2" + + "\2\2\u01e1\u01e4\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e3\u01db\3\2\2\2\u01e3" + + "\u01dc\3\2\2\2\u01e4\u01eb\3\2\2\2\u01e5\u01e7\5\26\13\2\u01e6\u01e8\t" + + "\t\2\2\u01e7\u01e6\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01e7\3\2\2\2\u01e9" + + "\u01ea\3\2\2\2\u01ea\u01ec\3\2\2\2\u01eb\u01e5\3\2\2\2\u01eb\u01ec\3\2" + + "\2\2\u01ec\u01f6\3\2\2\2\u01ed\u01ef\t\13\2\2\u01ee\u01f0\t\f\2\2\u01ef" + + "\u01ee\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f2\3\2\2\2\u01f1\u01f3\t\t" + + "\2\2\u01f2\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4" + + "\u01f5\3\2\2\2\u01f5\u01f7\3\2\2\2\u01f6\u01ed\3\2\2\2\u01f6\u01f7\3\2" + + "\2\2\u01f7\u01f9\3\2\2\2\u01f8\u01fa\t\r\2\2\u01f9\u01f8\3\2\2\2\u01f9" + + "\u01fa\3\2\2\2\u01fa\u009b\3\2\2\2\u01fb\u0203\7$\2\2\u01fc\u01fd\7^\2" + + "\2\u01fd\u0202\7$\2\2\u01fe\u01ff\7^\2\2\u01ff\u0202\7^\2\2\u0200\u0202" + + "\n\16\2\2\u0201\u01fc\3\2\2\2\u0201\u01fe\3\2\2\2\u0201\u0200\3\2\2\2" + + "\u0202\u0205\3\2\2\2\u0203\u0204\3\2\2\2\u0203\u0201\3\2\2\2\u0204\u0206" + + "\3\2\2\2\u0205\u0203\3\2\2\2\u0206\u0214\7$\2\2\u0207\u020f\7)\2\2\u0208" + + "\u0209\7^\2\2\u0209\u020e\7)\2\2\u020a\u020b\7^\2\2\u020b\u020e\7^\2\2" + + "\u020c\u020e\n\17\2\2\u020d\u0208\3\2\2\2\u020d\u020a\3\2\2\2\u020d\u020c" + + "\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u0210\3\2\2\2\u020f\u020d\3\2\2\2\u0210" + + "\u0212\3\2\2\2\u0211\u020f\3\2\2\2\u0212\u0214\7)\2\2\u0213\u01fb\3\2" + + "\2\2\u0213\u0207\3\2\2\2\u0214\u009d\3\2\2\2\u0215\u0219\7\61\2\2\u0216" + + "\u0217\7^\2\2\u0217\u021a\n\20\2\2\u0218\u021a\n\21\2\2\u0219\u0216\3" + + "\2\2\2\u0219\u0218\3\2\2\2\u021a\u021b\3\2\2\2\u021b\u021c\3\2\2\2\u021b" + + "\u0219\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u0221\7\61\2\2\u021e\u0220\t" + + "\22\2\2\u021f\u021e\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221" + + "\u0222\3\2\2\2\u0222\u0224\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u0225\6O" + + "\3\2\u0225\u009f\3\2\2\2\u0226\u0227\7v\2\2\u0227\u0228\7t\2\2\u0228\u0229" + + "\7w\2\2\u0229\u022a\7g\2\2\u022a\u00a1\3\2\2\2\u022b\u022c\7h\2\2\u022c" + + "\u022d\7c\2\2\u022d\u022e\7n\2\2\u022e\u022f\7u\2\2\u022f\u0230\7g\2\2" + + "\u0230\u00a3\3\2\2\2\u0231\u0232\7p\2\2\u0232\u0233\7w\2\2\u0233\u0234" + + "\7n\2\2\u0234\u0235\7n\2\2\u0235\u00a5\3\2\2\2\u0236\u0237\7d\2\2\u0237" + + "\u0238\7q\2\2\u0238\u0239\7q\2\2\u0239\u023a\7n\2\2\u023a\u023b\7g\2\2" + + "\u023b\u023c\7c\2\2\u023c\u025d\7p\2\2\u023d\u023e\7d\2\2\u023e\u023f" + + "\7{\2\2\u023f\u0240\7v\2\2\u0240\u025d\7g\2\2\u0241\u0242\7u\2\2\u0242" + + "\u0243\7j\2\2\u0243\u0244\7q\2\2\u0244\u0245\7t\2\2\u0245\u025d\7v\2\2" + + "\u0246\u0247\7e\2\2\u0247\u0248\7j\2\2\u0248\u0249\7c\2\2\u0249\u025d" + + "\7t\2\2\u024a\u024b\7k\2\2\u024b\u024c\7p\2\2\u024c\u025d\7v\2\2\u024d" + + "\u024e\7n\2\2\u024e\u024f\7q\2\2\u024f\u0250\7p\2\2\u0250\u025d\7i\2\2" + + "\u0251\u0252\7h\2\2\u0252\u0253\7n\2\2\u0253\u0254\7q\2\2\u0254\u0255" + + "\7c\2\2\u0255\u025d\7v\2\2\u0256\u0257\7f\2\2\u0257\u0258\7q\2\2\u0258" + + "\u0259\7w\2\2\u0259\u025a\7d\2\2\u025a\u025b\7n\2\2\u025b\u025d\7g\2\2" + + "\u025c\u0236\3\2\2\2\u025c\u023d\3\2\2\2\u025c\u0241\3\2\2\2\u025c\u0246" + + "\3\2\2\2\u025c\u024a\3\2\2\2\u025c\u024d\3\2\2\2\u025c\u0251\3\2\2\2\u025c" + + "\u0256\3\2\2\2\u025d\u00a7\3\2\2\2\u025e\u025f\7f\2\2\u025f\u0260\7g\2" + + "\2\u0260\u0261\7h\2\2\u0261\u00a9\3\2\2\2\u0262\u0266\t\23\2\2\u0263\u0265" + + "\t\24\2\2\u0264\u0263\3\2\2\2\u0265\u0268\3\2\2\2\u0266\u0264\3\2\2\2" + + "\u0266\u0267\3\2\2\2\u0267\u00ab\3\2\2\2\u0268\u0266\3\2\2\2\u0269\u0272" + + "\7\62\2\2\u026a\u026e\t\b\2\2\u026b\u026d\t\t\2\2\u026c\u026b\3\2\2\2" + + "\u026d\u0270\3\2\2\2\u026e\u026c\3\2\2\2\u026e\u026f\3\2\2\2\u026f\u0272" + + "\3\2\2\2\u0270\u026e\3\2\2\2\u0271\u0269\3\2\2\2\u0271\u026a\3\2\2\2\u0272" + + "\u0273\3\2\2\2\u0273\u0274\bV\4\2\u0274\u00ad\3\2\2\2\u0275\u0279\t\23" + + "\2\2\u0276\u0278\t\24\2\2\u0277\u0276\3\2\2\2\u0278\u027b\3\2\2\2\u0279" + + "\u0277\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027c\3\2\2\2\u027b\u0279\3\2" + + "\2\2\u027c\u027d\bW\4\2\u027d\u00af\3\2\2\2$\2\3\u00b3\u00bd\u00c7\u00cc" + + "\u01bf\u01c2\u01c9\u01cc\u01d3\u01d6\u01d9\u01e0\u01e3\u01e9\u01eb\u01ef" + + "\u01f4\u01f6\u01f9\u0201\u0203\u020d\u020f\u0213\u0219\u021b\u0221\u025c" + + "\u0266\u026e\u0271\u0279\5\b\2\2\4\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java index a520e06cf7f58..07ab6dd438904 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/PainlessParser.java @@ -17,14 +17,14 @@ class PainlessParser extends Parser { protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); - public static final int WS = 1, COMMENT = 2, LBRACK = 3, RBRACK = 4, LBRACE = 5, RBRACE = 6, LP = 7, RP = 8, DOT = 9, NSDOT = 10, - COMMA = 11, SEMICOLON = 12, IF = 13, IN = 14, ELSE = 15, WHILE = 16, DO = 17, FOR = 18, CONTINUE = 19, BREAK = 20, RETURN = 21, - NEW = 22, TRY = 23, CATCH = 24, THROW = 25, THIS = 26, INSTANCEOF = 27, BOOLNOT = 28, BWNOT = 29, MUL = 30, DIV = 31, REM = 32, - ADD = 33, SUB = 34, LSH = 35, RSH = 36, USH = 37, LT = 38, LTE = 39, GT = 40, GTE = 41, EQ = 42, EQR = 43, NE = 44, NER = 45, - BWAND = 46, XOR = 47, BWOR = 48, BOOLAND = 49, BOOLOR = 50, COND = 51, COLON = 52, ELVIS = 53, REF = 54, ARROW = 55, FIND = 56, - MATCH = 57, INCR = 58, DECR = 59, ASSIGN = 60, AADD = 61, ASUB = 62, AMUL = 63, ADIV = 64, AREM = 65, AAND = 66, AXOR = 67, AOR = - 68, ALSH = 69, ARSH = 70, AUSH = 71, OCTAL = 72, HEX = 73, INTEGER = 74, DECIMAL = 75, STRING = 76, REGEX = 77, TRUE = 78, - FALSE = 79, NULL = 80, PRIMITIVE = 81, DEF = 82, ID = 83, DOTINTEGER = 84, DOTID = 85; + public static final int WS = 1, COMMENT = 2, LBRACK = 3, RBRACK = 4, LBRACE = 5, RBRACE = 6, LP = 7, RP = 8, DOLLAR = 9, DOT = 10, + NSDOT = 11, COMMA = 12, SEMICOLON = 13, IF = 14, IN = 15, ELSE = 16, WHILE = 17, DO = 18, FOR = 19, CONTINUE = 20, BREAK = 21, + RETURN = 22, NEW = 23, TRY = 24, CATCH = 25, THROW = 26, THIS = 27, INSTANCEOF = 28, BOOLNOT = 29, BWNOT = 30, MUL = 31, DIV = 32, + REM = 33, ADD = 34, SUB = 35, LSH = 36, RSH = 37, USH = 38, LT = 39, LTE = 40, GT = 41, GTE = 42, EQ = 43, EQR = 44, NE = 45, NER = + 46, BWAND = 47, XOR = 48, BWOR = 49, BOOLAND = 50, BOOLOR = 51, COND = 52, COLON = 53, ELVIS = 54, REF = 55, ARROW = 56, FIND = + 57, MATCH = 58, INCR = 59, DECR = 60, ASSIGN = 61, AADD = 62, ASUB = 63, AMUL = 64, ADIV = 65, AREM = 66, AAND = 67, AXOR = + 68, AOR = 69, ALSH = 70, ARSH = 71, AUSH = 72, OCTAL = 73, HEX = 74, INTEGER = 75, DECIMAL = 76, STRING = 77, REGEX = + 78, TRUE = 79, FALSE = 80, NULL = 81, PRIMITIVE = 82, DEF = 83, ID = 84, DOTINTEGER = 85, DOTID = 86; public static final int RULE_source = 0, RULE_function = 1, RULE_parameters = 2, RULE_statement = 3, RULE_rstatement = 4, RULE_dstatement = 5, RULE_trailer = 6, RULE_block = 7, RULE_empty = 8, RULE_initializer = 9, RULE_afterthought = 10, RULE_declaration = 11, RULE_decltype = 12, RULE_type = 13, RULE_declvar = 14, RULE_trap = 15, RULE_noncondexpression = 16, @@ -83,6 +83,7 @@ class PainlessParser extends Parser { "']'", "'('", "')'", + "'$'", "'.'", "'?.'", "','", @@ -167,6 +168,7 @@ class PainlessParser extends Parser { "RBRACE", "LP", "RP", + "DOLLAR", "DOT", "NSDOT", "COMMA", @@ -367,13 +369,13 @@ public final SourceContext source() throws RecognitionException { _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << IF) | (1L << WHILE) | (1L << DO) | (1L << FOR) | (1L - << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L << NEW) | (1L << TRY) | (1L << THROW) | (1L << BOOLNOT) | (1L - << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (PRIMITIVE - 72)) | (1L << (DEF - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << IF) | (1L << WHILE) | (1L << DO) | (1L << FOR) + | (1L << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L << NEW) | (1L << TRY) | (1L << THROW) | (1L << BOOLNOT) + | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (PRIMITIVE - 73)) | (1L << (DEF - 73)) | (1L << (ID - 73)))) != 0)) { { { setState(84); @@ -515,8 +517,8 @@ public final ParametersContext parameters() throws RecognitionException { match(LP); setState(109); _la = _input.LA(1); - if (((((_la - 81)) & ~0x3f) == 0 - && ((1L << (_la - 81)) & ((1L << (PRIMITIVE - 81)) | (1L << (DEF - 81)) | (1L << (ID - 81)))) != 0)) { + if (((((_la - 82)) & ~0x3f) == 0 + && ((1L << (_la - 82)) & ((1L << (PRIMITIVE - 82)) | (1L << (DEF - 82)) | (1L << (ID - 82)))) != 0)) { { setState(98); decltype(); @@ -607,6 +609,7 @@ public final StatementContext statement() throws RecognitionException { break; case LBRACE: case LP: + case DOLLAR: case DO: case CONTINUE: case BREAK: @@ -969,6 +972,7 @@ public final RstatementContext rstatement() throws RecognitionException { case LBRACK: case LBRACE: case LP: + case DOLLAR: case IF: case WHILE: case DO: @@ -1021,12 +1025,12 @@ public final RstatementContext rstatement() throws RecognitionException { setState(140); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L - << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (PRIMITIVE - 72)) | (1L << (DEF - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) + | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (PRIMITIVE - 73)) | (1L << (DEF - 73)) | (1L << (ID - 73)))) != 0)) { { setState(139); initializer(); @@ -1038,12 +1042,12 @@ public final RstatementContext rstatement() throws RecognitionException { setState(144); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L - << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) + | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (ID - 73)))) != 0)) { { setState(143); expression(); @@ -1055,12 +1059,12 @@ public final RstatementContext rstatement() throws RecognitionException { setState(148); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L - << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) + | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (ID - 73)))) != 0)) { { setState(147); afterthought(); @@ -1074,6 +1078,7 @@ public final RstatementContext rstatement() throws RecognitionException { case LBRACK: case LBRACE: case LP: + case DOLLAR: case IF: case WHILE: case DO: @@ -1406,12 +1411,12 @@ public final DstatementContext dstatement() throws RecognitionException { setState(193); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L - << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) + | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (ID - 73)))) != 0)) { { setState(192); expression(); @@ -1486,6 +1491,7 @@ public final TrailerContext trailer() throws RecognitionException { break; case LBRACE: case LP: + case DOLLAR: case IF: case WHILE: case DO: @@ -1598,13 +1604,13 @@ public final BlockContext block() throws RecognitionException { setState(212); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DO) | (1L << CONTINUE) | (1L << BREAK) | (1L << RETURN) | (1L - << NEW) | (1L << THROW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L - << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (PRIMITIVE - 72)) | (1L << (DEF - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << DO) | (1L << CONTINUE) | (1L << BREAK) | (1L + << RETURN) | (1L << NEW) | (1L << THROW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L << SUB) | (1L + << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (PRIMITIVE - 73)) | (1L << (DEF - 73)) | (1L << (ID - 73)))) != 0)) { { setState(211); dstatement(); @@ -2772,10 +2778,10 @@ public final ExpressionContext expression() throws RecognitionException { noncondexpression(0); setState(320); _la = _input.LA(1); - if (!(((((_la - 60)) & ~0x3f) == 0 - && ((1L << (_la - 60)) & ((1L << (ASSIGN - 60)) | (1L << (AADD - 60)) | (1L << (ASUB - 60)) | (1L << (AMUL - 60)) - | (1L << (ADIV - 60)) | (1L << (AREM - 60)) | (1L << (AAND - 60)) | (1L << (AXOR - 60)) | (1L << (AOR - 60)) - | (1L << (ALSH - 60)) | (1L << (ARSH - 60)) | (1L << (AUSH - 60)))) != 0))) { + if (!(((((_la - 61)) & ~0x3f) == 0 + && ((1L << (_la - 61)) & ((1L << (ASSIGN - 61)) | (1L << (AADD - 61)) | (1L << (ASUB - 61)) | (1L << (AMUL - 61)) + | (1L << (ADIV - 61)) | (1L << (AREM - 61)) | (1L << (AAND - 61)) | (1L << (AXOR - 61)) | (1L << (AOR - 61)) + | (1L << (ALSH - 61)) | (1L << (ARSH - 61)) | (1L << (AUSH - 61)))) != 0))) { _errHandler.recoverInline(this); } else { consume(); @@ -2915,6 +2921,7 @@ public final UnaryContext unary() throws RecognitionException { break; case LBRACE: case LP: + case DOLLAR: case NEW: case BOOLNOT: case BWNOT: @@ -3641,12 +3648,16 @@ public T accept(ParseTreeVisitor visitor) { } public static class CalllocalContext extends PrimaryContext { + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class, 0); + } + public TerminalNode ID() { return getToken(PainlessParser.ID, 0); } - public ArgumentsContext arguments() { - return getRuleContext(ArgumentsContext.class, 0); + public TerminalNode DOLLAR() { + return getToken(PainlessParser.DOLLAR, 0); } public CalllocalContext(PrimaryContext ctx) { @@ -3808,9 +3819,9 @@ public final PrimaryContext primary() throws RecognitionException { enterOuterAlt(_localctx, 2); { setState(400); _la = _input.LA(1); - if (!(((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)))) != 0))) { + if (!(((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)))) != 0))) { _errHandler.recoverInline(this); } else { consume(); @@ -3877,7 +3888,12 @@ public final PrimaryContext primary() throws RecognitionException { _localctx = new CalllocalContext(_localctx); enterOuterAlt(_localctx, 11); { setState(409); - match(ID); + _la = _input.LA(1); + if (!(_la == DOLLAR || _la == ID)) { + _errHandler.recoverInline(this); + } else { + consume(); + } setState(410); arguments(); } @@ -4420,12 +4436,12 @@ public final ArrayinitializerContext arrayinitializer() throws RecognitionExcept setState(469); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) | (1L << ADD) | (1L - << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << BOOLNOT) | (1L << BWNOT) + | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (ID - 73)))) != 0)) { { setState(461); expression(); @@ -4779,12 +4795,12 @@ public final ArgumentsContext arguments() throws RecognitionException { setState(524); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 - && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << NEW) | (1L << THIS) | (1L << BOOLNOT) | (1L << BWNOT) | (1L - << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) - || ((((_la - 72)) & ~0x3f) == 0 - && ((1L << (_la - 72)) & ((1L << (OCTAL - 72)) | (1L << (HEX - 72)) | (1L << (INTEGER - 72)) | (1L << (DECIMAL - - 72)) | (1L << (STRING - 72)) | (1L << (REGEX - 72)) | (1L << (TRUE - 72)) | (1L << (FALSE - 72)) | (1L - << (NULL - 72)) | (1L << (PRIMITIVE - 72)) | (1L << (DEF - 72)) | (1L << (ID - 72)))) != 0)) { + && ((1L << _la) & ((1L << LBRACE) | (1L << LP) | (1L << DOLLAR) | (1L << NEW) | (1L << THIS) | (1L << BOOLNOT) | (1L + << BWNOT) | (1L << ADD) | (1L << SUB) | (1L << INCR) | (1L << DECR))) != 0) + || ((((_la - 73)) & ~0x3f) == 0 + && ((1L << (_la - 73)) & ((1L << (OCTAL - 73)) | (1L << (HEX - 73)) | (1L << (INTEGER - 73)) | (1L << (DECIMAL + - 73)) | (1L << (STRING - 73)) | (1L << (REGEX - 73)) | (1L << (TRUE - 73)) | (1L << (FALSE - 73)) | (1L + << (NULL - 73)) | (1L << (PRIMITIVE - 73)) | (1L << (DEF - 73)) | (1L << (ID - 73)))) != 0)) { { setState(516); argument(); @@ -4960,8 +4976,8 @@ public final LambdaContext lambda() throws RecognitionException { match(LP); setState(543); _la = _input.LA(1); - if (((((_la - 81)) & ~0x3f) == 0 - && ((1L << (_la - 81)) & ((1L << (PRIMITIVE - 81)) | (1L << (DEF - 81)) | (1L << (ID - 81)))) != 0)) { + if (((((_la - 82)) & ~0x3f) == 0 + && ((1L << (_la - 82)) & ((1L << (PRIMITIVE - 82)) | (1L << (DEF - 82)) | (1L << (ID - 82)))) != 0)) { { setState(535); lamtype(); @@ -5002,6 +5018,7 @@ public final LambdaContext lambda() throws RecognitionException { break; case LBRACE: case LP: + case DOLLAR: case NEW: case BOOLNOT: case BWNOT: @@ -5282,7 +5299,7 @@ private boolean noncondexpression_sempred(NoncondexpressionContext _localctx, in return true; } - public static final String _serializedATN = "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3W\u023e\4\2\t\2\4" + public static final String _serializedATN = "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3X\u023e\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" @@ -5325,49 +5342,49 @@ private boolean noncondexpression_sempred(NoncondexpressionContext _localctx, in + "&\3&\7&\u021d\n&\f&\16&\u0220\13&\5&\u0222\n&\3&\5&\u0225\n&\3&\3&\3&" + "\5&\u022a\n&\3\'\5\'\u022d\n\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3" + "(\5(\u023c\n(\3(\2\3\")\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*" - + ",.\60\62\64\668:<>@BDFHJLN\2\20\3\3\16\16\3\2 \"\3\2#$\3\2:;\3\2%\'\3" - + "\2(+\3\2,/\3\2>I\3\2<=\3\2\36\37\3\2ST\3\2JM\3\2\13\f\3\2VW\u0279\2S\3" - + "\2\2\2\4^\3\2\2\2\6c\3\2\2\2\bw\3\2\2\2\n\u00b5\3\2\2\2\f\u00c8\3\2\2" - + "\2\16\u00cc\3\2\2\2\20\u00ce\3\2\2\2\22\u00da\3\2\2\2\24\u00de\3\2\2\2" - + "\26\u00e0\3\2\2\2\30\u00e2\3\2\2\2\32\u00eb\3\2\2\2\34\u00fd\3\2\2\2\36" - + "\u00ff\3\2\2\2 \u0104\3\2\2\2\"\u010b\3\2\2\2$\u0145\3\2\2\2&\u014c\3" - + "\2\2\2(\u0155\3\2\2\2*\u0161\3\2\2\2,\u0163\3\2\2\2.\u0182\3\2\2\2\60" + + ",.\60\62\64\668:<>@BDFHJLN\2\21\3\3\17\17\3\2!#\3\2$%\3\2;<\3\2&(\3\2" + + "),\3\2-\60\3\2?J\3\2=>\3\2\37 \3\2TU\3\2KN\4\2\13\13VV\3\2\f\r\3\2WX\u0279" + + "\2S\3\2\2\2\4^\3\2\2\2\6c\3\2\2\2\bw\3\2\2\2\n\u00b5\3\2\2\2\f\u00c8\3" + + "\2\2\2\16\u00cc\3\2\2\2\20\u00ce\3\2\2\2\22\u00da\3\2\2\2\24\u00de\3\2" + + "\2\2\26\u00e0\3\2\2\2\30\u00e2\3\2\2\2\32\u00eb\3\2\2\2\34\u00fd\3\2\2" + + "\2\36\u00ff\3\2\2\2 \u0104\3\2\2\2\"\u010b\3\2\2\2$\u0145\3\2\2\2&\u014c" + + "\3\2\2\2(\u0155\3\2\2\2*\u0161\3\2\2\2,\u0163\3\2\2\2.\u0182\3\2\2\2\60" + "\u018c\3\2\2\2\62\u01a1\3\2\2\2\64\u01a6\3\2\2\2\66\u01aa\3\2\2\28\u01ac" + "\3\2\2\2:\u01b0\3\2\2\2<\u01b3\3\2\2\2>\u01e0\3\2\2\2@\u01ef\3\2\2\2B" + "\u01ff\3\2\2\2D\u0201\3\2\2\2F\u0205\3\2\2\2H\u0215\3\2\2\2J\u0224\3\2" + "\2\2L\u022c\3\2\2\2N\u023b\3\2\2\2PR\5\4\3\2QP\3\2\2\2RU\3\2\2\2SQ\3\2" + "\2\2ST\3\2\2\2TY\3\2\2\2US\3\2\2\2VX\5\b\5\2WV\3\2\2\2X[\3\2\2\2YW\3\2" + "\2\2YZ\3\2\2\2Z\\\3\2\2\2[Y\3\2\2\2\\]\7\2\2\3]\3\3\2\2\2^_\5\32\16\2" - + "_`\7U\2\2`a\5\6\4\2ab\5\20\t\2b\5\3\2\2\2co\7\t\2\2de\5\32\16\2el\7U\2" - + "\2fg\7\r\2\2gh\5\32\16\2hi\7U\2\2ik\3\2\2\2jf\3\2\2\2kn\3\2\2\2lj\3\2" + + "_`\7V\2\2`a\5\6\4\2ab\5\20\t\2b\5\3\2\2\2co\7\t\2\2de\5\32\16\2el\7V\2" + + "\2fg\7\16\2\2gh\5\32\16\2hi\7V\2\2ik\3\2\2\2jf\3\2\2\2kn\3\2\2\2lj\3\2" + "\2\2lm\3\2\2\2mp\3\2\2\2nl\3\2\2\2od\3\2\2\2op\3\2\2\2pq\3\2\2\2qr\7\n" + "\2\2r\7\3\2\2\2sx\5\n\6\2tu\5\f\7\2uv\t\2\2\2vx\3\2\2\2ws\3\2\2\2wt\3" - + "\2\2\2x\t\3\2\2\2yz\7\17\2\2z{\7\t\2\2{|\5$\23\2|}\7\n\2\2}\u0081\5\16" - + "\b\2~\177\7\21\2\2\177\u0082\5\16\b\2\u0080\u0082\6\6\2\2\u0081~\3\2\2" - + "\2\u0081\u0080\3\2\2\2\u0082\u00b6\3\2\2\2\u0083\u0084\7\22\2\2\u0084" + + "\2\2\2x\t\3\2\2\2yz\7\20\2\2z{\7\t\2\2{|\5$\23\2|}\7\n\2\2}\u0081\5\16" + + "\b\2~\177\7\22\2\2\177\u0082\5\16\b\2\u0080\u0082\6\6\2\2\u0081~\3\2\2" + + "\2\u0081\u0080\3\2\2\2\u0082\u00b6\3\2\2\2\u0083\u0084\7\23\2\2\u0084" + "\u0085\7\t\2\2\u0085\u0086\5$\23\2\u0086\u0089\7\n\2\2\u0087\u008a\5\16" + "\b\2\u0088\u008a\5\22\n\2\u0089\u0087\3\2\2\2\u0089\u0088\3\2\2\2\u008a" - + "\u00b6\3\2\2\2\u008b\u008c\7\24\2\2\u008c\u008e\7\t\2\2\u008d\u008f\5" + + "\u00b6\3\2\2\2\u008b\u008c\7\25\2\2\u008c\u008e\7\t\2\2\u008d\u008f\5" + "\24\13\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2\2\u0090" - + "\u0092\7\16\2\2\u0091\u0093\5$\23\2\u0092\u0091\3\2\2\2\u0092\u0093\3" - + "\2\2\2\u0093\u0094\3\2\2\2\u0094\u0096\7\16\2\2\u0095\u0097\5\26\f\2\u0096" + + "\u0092\7\17\2\2\u0091\u0093\5$\23\2\u0092\u0091\3\2\2\2\u0092\u0093\3" + + "\2\2\2\u0093\u0094\3\2\2\2\u0094\u0096\7\17\2\2\u0095\u0097\5\26\f\2\u0096" + "\u0095\3\2\2\2\u0096\u0097\3\2\2\2\u0097\u0098\3\2\2\2\u0098\u009b\7\n" + "\2\2\u0099\u009c\5\16\b\2\u009a\u009c\5\22\n\2\u009b\u0099\3\2\2\2\u009b" - + "\u009a\3\2\2\2\u009c\u00b6\3\2\2\2\u009d\u009e\7\24\2\2\u009e\u009f\7" - + "\t\2\2\u009f\u00a0\5\32\16\2\u00a0\u00a1\7U\2\2\u00a1\u00a2\7\66\2\2\u00a2" + + "\u009a\3\2\2\2\u009c\u00b6\3\2\2\2\u009d\u009e\7\25\2\2\u009e\u009f\7" + + "\t\2\2\u009f\u00a0\5\32\16\2\u00a0\u00a1\7V\2\2\u00a1\u00a2\7\67\2\2\u00a2" + "\u00a3\5$\23\2\u00a3\u00a4\7\n\2\2\u00a4\u00a5\5\16\b\2\u00a5\u00b6\3" - + "\2\2\2\u00a6\u00a7\7\24\2\2\u00a7\u00a8\7\t\2\2\u00a8\u00a9\7U\2\2\u00a9" - + "\u00aa\7\20\2\2\u00aa\u00ab\5$\23\2\u00ab\u00ac\7\n\2\2\u00ac\u00ad\5" - + "\16\b\2\u00ad\u00b6\3\2\2\2\u00ae\u00af\7\31\2\2\u00af\u00b1\5\20\t\2" + + "\2\2\2\u00a6\u00a7\7\25\2\2\u00a7\u00a8\7\t\2\2\u00a8\u00a9\7V\2\2\u00a9" + + "\u00aa\7\21\2\2\u00aa\u00ab\5$\23\2\u00ab\u00ac\7\n\2\2\u00ac\u00ad\5" + + "\16\b\2\u00ad\u00b6\3\2\2\2\u00ae\u00af\7\32\2\2\u00af\u00b1\5\20\t\2" + "\u00b0\u00b2\5 \21\2\u00b1\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b1" + "\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00b6\3\2\2\2\u00b5y\3\2\2\2\u00b5" + "\u0083\3\2\2\2\u00b5\u008b\3\2\2\2\u00b5\u009d\3\2\2\2\u00b5\u00a6\3\2" - + "\2\2\u00b5\u00ae\3\2\2\2\u00b6\13\3\2\2\2\u00b7\u00b8\7\23\2\2\u00b8\u00b9" - + "\5\20\t\2\u00b9\u00ba\7\22\2\2\u00ba\u00bb\7\t\2\2\u00bb\u00bc\5$\23\2" + + "\2\2\u00b5\u00ae\3\2\2\2\u00b6\13\3\2\2\2\u00b7\u00b8\7\24\2\2\u00b8\u00b9" + + "\5\20\t\2\u00b9\u00ba\7\23\2\2\u00ba\u00bb\7\t\2\2\u00bb\u00bc\5$\23\2" + "\u00bc\u00bd\7\n\2\2\u00bd\u00c9\3\2\2\2\u00be\u00c9\5\30\r\2\u00bf\u00c9" - + "\7\25\2\2\u00c0\u00c9\7\26\2\2\u00c1\u00c3\7\27\2\2\u00c2\u00c4\5$\23" + + "\7\26\2\2\u00c0\u00c9\7\27\2\2\u00c1\u00c3\7\30\2\2\u00c2\u00c4\5$\23" + "\2\u00c3\u00c2\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4\u00c9\3\2\2\2\u00c5\u00c6" - + "\7\33\2\2\u00c6\u00c9\5$\23\2\u00c7\u00c9\5$\23\2\u00c8\u00b7\3\2\2\2" + + "\7\34\2\2\u00c6\u00c9\5$\23\2\u00c7\u00c9\5$\23\2\u00c8\u00b7\3\2\2\2" + "\u00c8\u00be\3\2\2\2\u00c8\u00bf\3\2\2\2\u00c8\u00c0\3\2\2\2\u00c8\u00c1" + "\3\2\2\2\u00c8\u00c5\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c9\r\3\2\2\2\u00ca" + "\u00cd\5\20\t\2\u00cb\u00cd\5\b\5\2\u00cc\u00ca\3\2\2\2\u00cc\u00cb\3" @@ -5375,131 +5392,131 @@ private boolean noncondexpression_sempred(NoncondexpressionContext _localctx, in + "\u00cf\3\2\2\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0\3\2\2\2\u00d2\u00d3\3\2" + "\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5\u00d7\5\f\7\2\u00d6" + "\u00d5\3\2\2\2\u00d6\u00d7\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8\u00d9\7\6" - + "\2\2\u00d9\21\3\2\2\2\u00da\u00db\7\16\2\2\u00db\23\3\2\2\2\u00dc\u00df" + + "\2\2\u00d9\21\3\2\2\2\u00da\u00db\7\17\2\2\u00db\23\3\2\2\2\u00dc\u00df" + "\5\30\r\2\u00dd\u00df\5$\23\2\u00de\u00dc\3\2\2\2\u00de\u00dd\3\2\2\2" + "\u00df\25\3\2\2\2\u00e0\u00e1\5$\23\2\u00e1\27\3\2\2\2\u00e2\u00e3\5\32" - + "\16\2\u00e3\u00e8\5\36\20\2\u00e4\u00e5\7\r\2\2\u00e5\u00e7\5\36\20\2" + + "\16\2\u00e3\u00e8\5\36\20\2\u00e4\u00e5\7\16\2\2\u00e5\u00e7\5\36\20\2" + "\u00e6\u00e4\3\2\2\2\u00e7\u00ea\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e8\u00e9" + "\3\2\2\2\u00e9\31\3\2\2\2\u00ea\u00e8\3\2\2\2\u00eb\u00f0\5\34\17\2\u00ec" + "\u00ed\7\7\2\2\u00ed\u00ef\7\b\2\2\u00ee\u00ec\3\2\2\2\u00ef\u00f2\3\2" + "\2\2\u00f0\u00ee\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1\33\3\2\2\2\u00f2\u00f0" - + "\3\2\2\2\u00f3\u00fe\7T\2\2\u00f4\u00fe\7S\2\2\u00f5\u00fa\7U\2\2\u00f6" - + "\u00f7\7\13\2\2\u00f7\u00f9\7W\2\2\u00f8\u00f6\3\2\2\2\u00f9\u00fc\3\2" + + "\3\2\2\2\u00f3\u00fe\7U\2\2\u00f4\u00fe\7T\2\2\u00f5\u00fa\7V\2\2\u00f6" + + "\u00f7\7\f\2\2\u00f7\u00f9\7X\2\2\u00f8\u00f6\3\2\2\2\u00f9\u00fc\3\2" + "\2\2\u00fa\u00f8\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fe\3\2\2\2\u00fc" + "\u00fa\3\2\2\2\u00fd\u00f3\3\2\2\2\u00fd\u00f4\3\2\2\2\u00fd\u00f5\3\2" - + "\2\2\u00fe\35\3\2\2\2\u00ff\u0102\7U\2\2\u0100\u0101\7>\2\2\u0101\u0103" + + "\2\2\u00fe\35\3\2\2\2\u00ff\u0102\7V\2\2\u0100\u0101\7?\2\2\u0101\u0103" + "\5$\23\2\u0102\u0100\3\2\2\2\u0102\u0103\3\2\2\2\u0103\37\3\2\2\2\u0104" - + "\u0105\7\32\2\2\u0105\u0106\7\t\2\2\u0106\u0107\5\34\17\2\u0107\u0108" - + "\7U\2\2\u0108\u0109\7\n\2\2\u0109\u010a\5\20\t\2\u010a!\3\2\2\2\u010b" + + "\u0105\7\33\2\2\u0105\u0106\7\t\2\2\u0106\u0107\5\34\17\2\u0107\u0108" + + "\7V\2\2\u0108\u0109\7\n\2\2\u0109\u010a\5\20\t\2\u010a!\3\2\2\2\u010b" + "\u010c\b\22\1\2\u010c\u010d\5&\24\2\u010d\u0137\3\2\2\2\u010e\u010f\f" + "\17\2\2\u010f\u0110\t\3\2\2\u0110\u0136\5\"\22\20\u0111\u0112\f\16\2\2" + "\u0112\u0113\t\4\2\2\u0113\u0136\5\"\22\17\u0114\u0115\f\r\2\2\u0115\u0116" + "\t\5\2\2\u0116\u0136\5\"\22\16\u0117\u0118\f\f\2\2\u0118\u0119\t\6\2\2" + "\u0119\u0136\5\"\22\r\u011a\u011b\f\13\2\2\u011b\u011c\t\7\2\2\u011c\u0136" + "\5\"\22\f\u011d\u011e\f\t\2\2\u011e\u011f\t\b\2\2\u011f\u0136\5\"\22\n" - + "\u0120\u0121\f\b\2\2\u0121\u0122\7\60\2\2\u0122\u0136\5\"\22\t\u0123\u0124" - + "\f\7\2\2\u0124\u0125\7\61\2\2\u0125\u0136\5\"\22\b\u0126\u0127\f\6\2\2" - + "\u0127\u0128\7\62\2\2\u0128\u0136\5\"\22\7\u0129\u012a\f\5\2\2\u012a\u012b" - + "\7\63\2\2\u012b\u0136\5\"\22\6\u012c\u012d\f\4\2\2\u012d\u012e\7\64\2" - + "\2\u012e\u0136\5\"\22\5\u012f\u0130\f\3\2\2\u0130\u0131\7\67\2\2\u0131" - + "\u0136\5\"\22\3\u0132\u0133\f\n\2\2\u0133\u0134\7\35\2\2\u0134\u0136\5" - + "\32\16\2\u0135\u010e\3\2\2\2\u0135\u0111\3\2\2\2\u0135\u0114\3\2\2\2\u0135" - + "\u0117\3\2\2\2\u0135\u011a\3\2\2\2\u0135\u011d\3\2\2\2\u0135\u0120\3\2" - + "\2\2\u0135\u0123\3\2\2\2\u0135\u0126\3\2\2\2\u0135\u0129\3\2\2\2\u0135" - + "\u012c\3\2\2\2\u0135\u012f\3\2\2\2\u0135\u0132\3\2\2\2\u0136\u0139\3\2" - + "\2\2\u0137\u0135\3\2\2\2\u0137\u0138\3\2\2\2\u0138#\3\2\2\2\u0139\u0137" - + "\3\2\2\2\u013a\u0146\5\"\22\2\u013b\u013c\5\"\22\2\u013c\u013d\7\65\2" - + "\2\u013d\u013e\5$\23\2\u013e\u013f\7\66\2\2\u013f\u0140\5$\23\2\u0140" - + "\u0146\3\2\2\2\u0141\u0142\5\"\22\2\u0142\u0143\t\t\2\2\u0143\u0144\5" - + "$\23\2\u0144\u0146\3\2\2\2\u0145\u013a\3\2\2\2\u0145\u013b\3\2\2\2\u0145" - + "\u0141\3\2\2\2\u0146%\3\2\2\2\u0147\u0148\t\n\2\2\u0148\u014d\5\60\31" - + "\2\u0149\u014a\t\4\2\2\u014a\u014d\5&\24\2\u014b\u014d\5(\25\2\u014c\u0147" - + "\3\2\2\2\u014c\u0149\3\2\2\2\u014c\u014b\3\2\2\2\u014d\'\3\2\2\2\u014e" - + "\u0156\5\60\31\2\u014f\u0150\5\60\31\2\u0150\u0151\t\n\2\2\u0151\u0156" - + "\3\2\2\2\u0152\u0153\t\13\2\2\u0153\u0156\5&\24\2\u0154\u0156\5*\26\2" - + "\u0155\u014e\3\2\2\2\u0155\u014f\3\2\2\2\u0155\u0152\3\2\2\2\u0155\u0154" - + "\3\2\2\2\u0156)\3\2\2\2\u0157\u0158\7\t\2\2\u0158\u0159\5,\27\2\u0159" - + "\u015a\7\n\2\2\u015a\u015b\5&\24\2\u015b\u0162\3\2\2\2\u015c\u015d\7\t" - + "\2\2\u015d\u015e\5.\30\2\u015e\u015f\7\n\2\2\u015f\u0160\5(\25\2\u0160" - + "\u0162\3\2\2\2\u0161\u0157\3\2\2\2\u0161\u015c\3\2\2\2\u0162+\3\2\2\2" - + "\u0163\u0164\t\f\2\2\u0164-\3\2\2\2\u0165\u0168\7T\2\2\u0166\u0167\7\7" - + "\2\2\u0167\u0169\7\b\2\2\u0168\u0166\3\2\2\2\u0169\u016a\3\2\2\2\u016a" - + "\u0168\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u0183\3\2\2\2\u016c\u016f\7S" - + "\2\2\u016d\u016e\7\7\2\2\u016e\u0170\7\b\2\2\u016f\u016d\3\2\2\2\u0170" - + "\u0171\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0183\3\2" - + "\2\2\u0173\u0178\7U\2\2\u0174\u0175\7\13\2\2\u0175\u0177\7W\2\2\u0176" - + "\u0174\3\2\2\2\u0177\u017a\3\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2" - + "\2\2\u0179\u017f\3\2\2\2\u017a\u0178\3\2\2\2\u017b\u017c\7\7\2\2\u017c" - + "\u017e\7\b\2\2\u017d\u017b\3\2\2\2\u017e\u0181\3\2\2\2\u017f\u017d\3\2" - + "\2\2\u017f\u0180\3\2\2\2\u0180\u0183\3\2\2\2\u0181\u017f\3\2\2\2\u0182" - + "\u0165\3\2\2\2\u0182\u016c\3\2\2\2\u0182\u0173\3\2\2\2\u0183/\3\2\2\2" - + "\u0184\u0188\5\62\32\2\u0185\u0187\5\64\33\2\u0186\u0185\3\2\2\2\u0187" - + "\u018a\3\2\2\2\u0188\u0186\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018d\3\2" - + "\2\2\u018a\u0188\3\2\2\2\u018b\u018d\5> \2\u018c\u0184\3\2\2\2\u018c\u018b" - + "\3\2\2\2\u018d\61\3\2\2\2\u018e\u018f\7\t\2\2\u018f\u0190\5$\23\2\u0190" - + "\u0191\7\n\2\2\u0191\u01a2\3\2\2\2\u0192\u01a2\t\r\2\2\u0193\u01a2\7P" - + "\2\2\u0194\u01a2\7Q\2\2\u0195\u01a2\7R\2\2\u0196\u01a2\7N\2\2\u0197\u01a2" - + "\7O\2\2\u0198\u01a2\5@!\2\u0199\u01a2\5B\"\2\u019a\u01a2\7U\2\2\u019b" - + "\u019c\7U\2\2\u019c\u01a2\5F$\2\u019d\u019e\7\30\2\2\u019e\u019f\5\34" - + "\17\2\u019f\u01a0\5F$\2\u01a0\u01a2\3\2\2\2\u01a1\u018e\3\2\2\2\u01a1" - + "\u0192\3\2\2\2\u01a1\u0193\3\2\2\2\u01a1\u0194\3\2\2\2\u01a1\u0195\3\2" - + "\2\2\u01a1\u0196\3\2\2\2\u01a1\u0197\3\2\2\2\u01a1\u0198\3\2\2\2\u01a1" - + "\u0199\3\2\2\2\u01a1\u019a\3\2\2\2\u01a1\u019b\3\2\2\2\u01a1\u019d\3\2" - + "\2\2\u01a2\63\3\2\2\2\u01a3\u01a7\58\35\2\u01a4\u01a7\5:\36\2\u01a5\u01a7" - + "\5<\37\2\u01a6\u01a3\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a5\3\2\2\2\u01a7" - + "\65\3\2\2\2\u01a8\u01ab\58\35\2\u01a9\u01ab\5:\36\2\u01aa\u01a8\3\2\2" - + "\2\u01aa\u01a9\3\2\2\2\u01ab\67\3\2\2\2\u01ac\u01ad\t\16\2\2\u01ad\u01ae" - + "\7W\2\2\u01ae\u01af\5F$\2\u01af9\3\2\2\2\u01b0\u01b1\t\16\2\2\u01b1\u01b2" - + "\t\17\2\2\u01b2;\3\2\2\2\u01b3\u01b4\7\7\2\2\u01b4\u01b5\5$\23\2\u01b5" - + "\u01b6\7\b\2\2\u01b6=\3\2\2\2\u01b7\u01b8\7\30\2\2\u01b8\u01bd\5\34\17" - + "\2\u01b9\u01ba\7\7\2\2\u01ba\u01bb\5$\23\2\u01bb\u01bc\7\b\2\2\u01bc\u01be" - + "\3\2\2\2\u01bd\u01b9\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf" - + "\u01c0\3\2\2\2\u01c0\u01c8\3\2\2\2\u01c1\u01c5\5\66\34\2\u01c2\u01c4\5" - + "\64\33\2\u01c3\u01c2\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5" - + "\u01c6\3\2\2\2\u01c6\u01c9\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01c1\3\2" - + "\2\2\u01c8\u01c9\3\2\2\2\u01c9\u01e1\3\2\2\2\u01ca\u01cb\7\30\2\2\u01cb" - + "\u01cc\5\34\17\2\u01cc\u01cd\7\7\2\2\u01cd\u01ce\7\b\2\2\u01ce\u01d7\7" - + "\5\2\2\u01cf\u01d4\5$\23\2\u01d0\u01d1\7\r\2\2\u01d1\u01d3\5$\23\2\u01d2" - + "\u01d0\3\2\2\2\u01d3\u01d6\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2" - + "\2\2\u01d5\u01d8\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d7\u01cf\3\2\2\2\u01d7" - + "\u01d8\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01dd\7\6\2\2\u01da\u01dc\5\64" - + "\33\2\u01db\u01da\3\2\2\2\u01dc\u01df\3\2\2\2\u01dd\u01db\3\2\2\2\u01dd" - + "\u01de\3\2\2\2\u01de\u01e1\3\2\2\2\u01df\u01dd\3\2\2\2\u01e0\u01b7\3\2" - + "\2\2\u01e0\u01ca\3\2\2\2\u01e1?\3\2\2\2\u01e2\u01e3\7\7\2\2\u01e3\u01e8" - + "\5$\23\2\u01e4\u01e5\7\r\2\2\u01e5\u01e7\5$\23\2\u01e6\u01e4\3\2\2\2\u01e7" - + "\u01ea\3\2\2\2\u01e8\u01e6\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01eb\3\2" - + "\2\2\u01ea\u01e8\3\2\2\2\u01eb\u01ec\7\b\2\2\u01ec\u01f0\3\2\2\2\u01ed" - + "\u01ee\7\7\2\2\u01ee\u01f0\7\b\2\2\u01ef\u01e2\3\2\2\2\u01ef\u01ed\3\2" - + "\2\2\u01f0A\3\2\2\2\u01f1\u01f2\7\7\2\2\u01f2\u01f7\5D#\2\u01f3\u01f4" - + "\7\r\2\2\u01f4\u01f6\5D#\2\u01f5\u01f3\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7" - + "\u01f5\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01fa\3\2\2\2\u01f9\u01f7\3\2" - + "\2\2\u01fa\u01fb\7\b\2\2\u01fb\u0200\3\2\2\2\u01fc\u01fd\7\7\2\2\u01fd" - + "\u01fe\7\66\2\2\u01fe\u0200\7\b\2\2\u01ff\u01f1\3\2\2\2\u01ff\u01fc\3" - + "\2\2\2\u0200C\3\2\2\2\u0201\u0202\5$\23\2\u0202\u0203\7\66\2\2\u0203\u0204" - + "\5$\23\2\u0204E\3\2\2\2\u0205\u020e\7\t\2\2\u0206\u020b\5H%\2\u0207\u0208" - + "\7\r\2\2\u0208\u020a\5H%\2\u0209\u0207\3\2\2\2\u020a\u020d\3\2\2\2\u020b" - + "\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u020f\3\2\2\2\u020d\u020b\3\2" - + "\2\2\u020e\u0206\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\3\2\2\2\u0210" - + "\u0211\7\n\2\2\u0211G\3\2\2\2\u0212\u0216\5$\23\2\u0213\u0216\5J&\2\u0214" - + "\u0216\5N(\2\u0215\u0212\3\2\2\2\u0215\u0213\3\2\2\2\u0215\u0214\3\2\2" - + "\2\u0216I\3\2\2\2\u0217\u0225\5L\'\2\u0218\u0221\7\t\2\2\u0219\u021e\5" - + "L\'\2\u021a\u021b\7\r\2\2\u021b\u021d\5L\'\2\u021c\u021a\3\2\2\2\u021d" - + "\u0220\3\2\2\2\u021e\u021c\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0222\3\2" - + "\2\2\u0220\u021e\3\2\2\2\u0221\u0219\3\2\2\2\u0221\u0222\3\2\2\2\u0222" - + "\u0223\3\2\2\2\u0223\u0225\7\n\2\2\u0224\u0217\3\2\2\2\u0224\u0218\3\2" - + "\2\2\u0225\u0226\3\2\2\2\u0226\u0229\79\2\2\u0227\u022a\5\20\t\2\u0228" - + "\u022a\5$\23\2\u0229\u0227\3\2\2\2\u0229\u0228\3\2\2\2\u022aK\3\2\2\2" - + "\u022b\u022d\5\32\16\2\u022c\u022b\3\2\2\2\u022c\u022d\3\2\2\2\u022d\u022e" - + "\3\2\2\2\u022e\u022f\7U\2\2\u022fM\3\2\2\2\u0230\u0231\5\32\16\2\u0231" - + "\u0232\78\2\2\u0232\u0233\7U\2\2\u0233\u023c\3\2\2\2\u0234\u0235\5\32" - + "\16\2\u0235\u0236\78\2\2\u0236\u0237\7\30\2\2\u0237\u023c\3\2\2\2\u0238" - + "\u0239\7\34\2\2\u0239\u023a\78\2\2\u023a\u023c\7U\2\2\u023b\u0230\3\2" - + "\2\2\u023b\u0234\3\2\2\2\u023b\u0238\3\2\2\2\u023cO\3\2\2\2>SYlow\u0081" - + "\u0089\u008e\u0092\u0096\u009b\u00b3\u00b5\u00c3\u00c8\u00cc\u00d2\u00d6" - + "\u00de\u00e8\u00f0\u00fa\u00fd\u0102\u0135\u0137\u0145\u014c\u0155\u0161" - + "\u016a\u0171\u0178\u017f\u0182\u0188\u018c\u01a1\u01a6\u01aa\u01bf\u01c5" - + "\u01c8\u01d4\u01d7\u01dd\u01e0\u01e8\u01ef\u01f7\u01ff\u020b\u020e\u0215" - + "\u021e\u0221\u0224\u0229\u022c\u023b"; + + "\u0120\u0121\f\b\2\2\u0121\u0122\7\61\2\2\u0122\u0136\5\"\22\t\u0123\u0124" + + "\f\7\2\2\u0124\u0125\7\62\2\2\u0125\u0136\5\"\22\b\u0126\u0127\f\6\2\2" + + "\u0127\u0128\7\63\2\2\u0128\u0136\5\"\22\7\u0129\u012a\f\5\2\2\u012a\u012b" + + "\7\64\2\2\u012b\u0136\5\"\22\6\u012c\u012d\f\4\2\2\u012d\u012e\7\65\2" + + "\2\u012e\u0136\5\"\22\5\u012f\u0130\f\3\2\2\u0130\u0131\78\2\2\u0131\u0136" + + "\5\"\22\3\u0132\u0133\f\n\2\2\u0133\u0134\7\36\2\2\u0134\u0136\5\32\16" + + "\2\u0135\u010e\3\2\2\2\u0135\u0111\3\2\2\2\u0135\u0114\3\2\2\2\u0135\u0117" + + "\3\2\2\2\u0135\u011a\3\2\2\2\u0135\u011d\3\2\2\2\u0135\u0120\3\2\2\2\u0135" + + "\u0123\3\2\2\2\u0135\u0126\3\2\2\2\u0135\u0129\3\2\2\2\u0135\u012c\3\2" + + "\2\2\u0135\u012f\3\2\2\2\u0135\u0132\3\2\2\2\u0136\u0139\3\2\2\2\u0137" + + "\u0135\3\2\2\2\u0137\u0138\3\2\2\2\u0138#\3\2\2\2\u0139\u0137\3\2\2\2" + + "\u013a\u0146\5\"\22\2\u013b\u013c\5\"\22\2\u013c\u013d\7\66\2\2\u013d" + + "\u013e\5$\23\2\u013e\u013f\7\67\2\2\u013f\u0140\5$\23\2\u0140\u0146\3" + + "\2\2\2\u0141\u0142\5\"\22\2\u0142\u0143\t\t\2\2\u0143\u0144\5$\23\2\u0144" + + "\u0146\3\2\2\2\u0145\u013a\3\2\2\2\u0145\u013b\3\2\2\2\u0145\u0141\3\2" + + "\2\2\u0146%\3\2\2\2\u0147\u0148\t\n\2\2\u0148\u014d\5\60\31\2\u0149\u014a" + + "\t\4\2\2\u014a\u014d\5&\24\2\u014b\u014d\5(\25\2\u014c\u0147\3\2\2\2\u014c" + + "\u0149\3\2\2\2\u014c\u014b\3\2\2\2\u014d\'\3\2\2\2\u014e\u0156\5\60\31" + + "\2\u014f\u0150\5\60\31\2\u0150\u0151\t\n\2\2\u0151\u0156\3\2\2\2\u0152" + + "\u0153\t\13\2\2\u0153\u0156\5&\24\2\u0154\u0156\5*\26\2\u0155\u014e\3" + + "\2\2\2\u0155\u014f\3\2\2\2\u0155\u0152\3\2\2\2\u0155\u0154\3\2\2\2\u0156" + + ")\3\2\2\2\u0157\u0158\7\t\2\2\u0158\u0159\5,\27\2\u0159\u015a\7\n\2\2" + + "\u015a\u015b\5&\24\2\u015b\u0162\3\2\2\2\u015c\u015d\7\t\2\2\u015d\u015e" + + "\5.\30\2\u015e\u015f\7\n\2\2\u015f\u0160\5(\25\2\u0160\u0162\3\2\2\2\u0161" + + "\u0157\3\2\2\2\u0161\u015c\3\2\2\2\u0162+\3\2\2\2\u0163\u0164\t\f\2\2" + + "\u0164-\3\2\2\2\u0165\u0168\7U\2\2\u0166\u0167\7\7\2\2\u0167\u0169\7\b" + + "\2\2\u0168\u0166\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u0168\3\2\2\2\u016a" + + "\u016b\3\2\2\2\u016b\u0183\3\2\2\2\u016c\u016f\7T\2\2\u016d\u016e\7\7" + + "\2\2\u016e\u0170\7\b\2\2\u016f\u016d\3\2\2\2\u0170\u0171\3\2\2\2\u0171" + + "\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0183\3\2\2\2\u0173\u0178\7V" + + "\2\2\u0174\u0175\7\f\2\2\u0175\u0177\7X\2\2\u0176\u0174\3\2\2\2\u0177" + + "\u017a\3\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017f\3\2" + + "\2\2\u017a\u0178\3\2\2\2\u017b\u017c\7\7\2\2\u017c\u017e\7\b\2\2\u017d" + + "\u017b\3\2\2\2\u017e\u0181\3\2\2\2\u017f\u017d\3\2\2\2\u017f\u0180\3\2" + + "\2\2\u0180\u0183\3\2\2\2\u0181\u017f\3\2\2\2\u0182\u0165\3\2\2\2\u0182" + + "\u016c\3\2\2\2\u0182\u0173\3\2\2\2\u0183/\3\2\2\2\u0184\u0188\5\62\32" + + "\2\u0185\u0187\5\64\33\2\u0186\u0185\3\2\2\2\u0187\u018a\3\2\2\2\u0188" + + "\u0186\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018d\3\2\2\2\u018a\u0188\3\2" + + "\2\2\u018b\u018d\5> \2\u018c\u0184\3\2\2\2\u018c\u018b\3\2\2\2\u018d\61" + + "\3\2\2\2\u018e\u018f\7\t\2\2\u018f\u0190\5$\23\2\u0190\u0191\7\n\2\2\u0191" + + "\u01a2\3\2\2\2\u0192\u01a2\t\r\2\2\u0193\u01a2\7Q\2\2\u0194\u01a2\7R\2" + + "\2\u0195\u01a2\7S\2\2\u0196\u01a2\7O\2\2\u0197\u01a2\7P\2\2\u0198\u01a2" + + "\5@!\2\u0199\u01a2\5B\"\2\u019a\u01a2\7V\2\2\u019b\u019c\t\16\2\2\u019c" + + "\u01a2\5F$\2\u019d\u019e\7\31\2\2\u019e\u019f\5\34\17\2\u019f\u01a0\5" + + "F$\2\u01a0\u01a2\3\2\2\2\u01a1\u018e\3\2\2\2\u01a1\u0192\3\2\2\2\u01a1" + + "\u0193\3\2\2\2\u01a1\u0194\3\2\2\2\u01a1\u0195\3\2\2\2\u01a1\u0196\3\2" + + "\2\2\u01a1\u0197\3\2\2\2\u01a1\u0198\3\2\2\2\u01a1\u0199\3\2\2\2\u01a1" + + "\u019a\3\2\2\2\u01a1\u019b\3\2\2\2\u01a1\u019d\3\2\2\2\u01a2\63\3\2\2" + + "\2\u01a3\u01a7\58\35\2\u01a4\u01a7\5:\36\2\u01a5\u01a7\5<\37\2\u01a6\u01a3" + + "\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a5\3\2\2\2\u01a7\65\3\2\2\2\u01a8" + + "\u01ab\58\35\2\u01a9\u01ab\5:\36\2\u01aa\u01a8\3\2\2\2\u01aa\u01a9\3\2" + + "\2\2\u01ab\67\3\2\2\2\u01ac\u01ad\t\17\2\2\u01ad\u01ae\7X\2\2\u01ae\u01af" + + "\5F$\2\u01af9\3\2\2\2\u01b0\u01b1\t\17\2\2\u01b1\u01b2\t\20\2\2\u01b2" + + ";\3\2\2\2\u01b3\u01b4\7\7\2\2\u01b4\u01b5\5$\23\2\u01b5\u01b6\7\b\2\2" + + "\u01b6=\3\2\2\2\u01b7\u01b8\7\31\2\2\u01b8\u01bd\5\34\17\2\u01b9\u01ba" + + "\7\7\2\2\u01ba\u01bb\5$\23\2\u01bb\u01bc\7\b\2\2\u01bc\u01be\3\2\2\2\u01bd" + + "\u01b9\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2" + + "\2\2\u01c0\u01c8\3\2\2\2\u01c1\u01c5\5\66\34\2\u01c2\u01c4\5\64\33\2\u01c3" + + "\u01c2\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2" + + "\2\2\u01c6\u01c9\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01c1\3\2\2\2\u01c8" + + "\u01c9\3\2\2\2\u01c9\u01e1\3\2\2\2\u01ca\u01cb\7\31\2\2\u01cb\u01cc\5" + + "\34\17\2\u01cc\u01cd\7\7\2\2\u01cd\u01ce\7\b\2\2\u01ce\u01d7\7\5\2\2\u01cf" + + "\u01d4\5$\23\2\u01d0\u01d1\7\16\2\2\u01d1\u01d3\5$\23\2\u01d2\u01d0\3" + + "\2\2\2\u01d3\u01d6\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5" + + "\u01d8\3\2\2\2\u01d6\u01d4\3\2\2\2\u01d7\u01cf\3\2\2\2\u01d7\u01d8\3\2" + + "\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01dd\7\6\2\2\u01da\u01dc\5\64\33\2\u01db" + + "\u01da\3\2\2\2\u01dc\u01df\3\2\2\2\u01dd\u01db\3\2\2\2\u01dd\u01de\3\2" + + "\2\2\u01de\u01e1\3\2\2\2\u01df\u01dd\3\2\2\2\u01e0\u01b7\3\2\2\2\u01e0" + + "\u01ca\3\2\2\2\u01e1?\3\2\2\2\u01e2\u01e3\7\7\2\2\u01e3\u01e8\5$\23\2" + + "\u01e4\u01e5\7\16\2\2\u01e5\u01e7\5$\23\2\u01e6\u01e4\3\2\2\2\u01e7\u01ea" + + "\3\2\2\2\u01e8\u01e6\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01eb\3\2\2\2\u01ea" + + "\u01e8\3\2\2\2\u01eb\u01ec\7\b\2\2\u01ec\u01f0\3\2\2\2\u01ed\u01ee\7\7" + + "\2\2\u01ee\u01f0\7\b\2\2\u01ef\u01e2\3\2\2\2\u01ef\u01ed\3\2\2\2\u01f0" + + "A\3\2\2\2\u01f1\u01f2\7\7\2\2\u01f2\u01f7\5D#\2\u01f3\u01f4\7\16\2\2\u01f4" + + "\u01f6\5D#\2\u01f5\u01f3\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f5\3\2\2" + + "\2\u01f7\u01f8\3\2\2\2\u01f8\u01fa\3\2\2\2\u01f9\u01f7\3\2\2\2\u01fa\u01fb" + + "\7\b\2\2\u01fb\u0200\3\2\2\2\u01fc\u01fd\7\7\2\2\u01fd\u01fe\7\67\2\2" + + "\u01fe\u0200\7\b\2\2\u01ff\u01f1\3\2\2\2\u01ff\u01fc\3\2\2\2\u0200C\3" + + "\2\2\2\u0201\u0202\5$\23\2\u0202\u0203\7\67\2\2\u0203\u0204\5$\23\2\u0204" + + "E\3\2\2\2\u0205\u020e\7\t\2\2\u0206\u020b\5H%\2\u0207\u0208\7\16\2\2\u0208" + + "\u020a\5H%\2\u0209\u0207\3\2\2\2\u020a\u020d\3\2\2\2\u020b\u0209\3\2\2" + + "\2\u020b\u020c\3\2\2\2\u020c\u020f\3\2\2\2\u020d\u020b\3\2\2\2\u020e\u0206" + + "\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\7\n\2\2\u0211" + + "G\3\2\2\2\u0212\u0216\5$\23\2\u0213\u0216\5J&\2\u0214\u0216\5N(\2\u0215" + + "\u0212\3\2\2\2\u0215\u0213\3\2\2\2\u0215\u0214\3\2\2\2\u0216I\3\2\2\2" + + "\u0217\u0225\5L\'\2\u0218\u0221\7\t\2\2\u0219\u021e\5L\'\2\u021a\u021b" + + "\7\16\2\2\u021b\u021d\5L\'\2\u021c\u021a\3\2\2\2\u021d\u0220\3\2\2\2\u021e" + + "\u021c\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0222\3\2\2\2\u0220\u021e\3\2" + + "\2\2\u0221\u0219\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223\3\2\2\2\u0223" + + "\u0225\7\n\2\2\u0224\u0217\3\2\2\2\u0224\u0218\3\2\2\2\u0225\u0226\3\2" + + "\2\2\u0226\u0229\7:\2\2\u0227\u022a\5\20\t\2\u0228\u022a\5$\23\2\u0229" + + "\u0227\3\2\2\2\u0229\u0228\3\2\2\2\u022aK\3\2\2\2\u022b\u022d\5\32\16" + + "\2\u022c\u022b\3\2\2\2\u022c\u022d\3\2\2\2\u022d\u022e\3\2\2\2\u022e\u022f" + + "\7V\2\2\u022fM\3\2\2\2\u0230\u0231\5\32\16\2\u0231\u0232\79\2\2\u0232" + + "\u0233\7V\2\2\u0233\u023c\3\2\2\2\u0234\u0235\5\32\16\2\u0235\u0236\7" + + "9\2\2\u0236\u0237\7\31\2\2\u0237\u023c\3\2\2\2\u0238\u0239\7\35\2\2\u0239" + + "\u023a\79\2\2\u023a\u023c\7V\2\2\u023b\u0230\3\2\2\2\u023b\u0234\3\2\2" + + "\2\u023b\u0238\3\2\2\2\u023cO\3\2\2\2>SYlow\u0081\u0089\u008e\u0092\u0096" + + "\u009b\u00b3\u00b5\u00c3\u00c8\u00cc\u00d2\u00d6\u00de\u00e8\u00f0\u00fa" + + "\u00fd\u0102\u0135\u0137\u0145\u014c\u0155\u0161\u016a\u0171\u0178\u017f" + + "\u0182\u0188\u018c\u01a1\u01a6\u01aa\u01bf\u01c5\u01c8\u01d4\u01d7\u01dd" + + "\u01e0\u01e8\u01ef\u01f7\u01ff\u020b\u020e\u0215\u021e\u0221\u0224\u0229" + + "\u022c\u023b"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java index e9316cd283efd..e2fa14a5b964d 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/antlr/Walker.java @@ -918,7 +918,7 @@ public ANode visitVariable(VariableContext ctx) { @Override public ANode visitCalllocal(CalllocalContext ctx) { - String name = ctx.ID().getText(); + String name = ctx.ID() == null ? ctx.DOLLAR().getText() : ctx.ID().getText(); List arguments = collectArguments(ctx.arguments()); return new ECallLocal(nextIdentifier(), location(ctx), name, arguments); diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessSemanticAnalysisPhase.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessSemanticAnalysisPhase.java index e4f9cee678e8c..73b179ee55fd7 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessSemanticAnalysisPhase.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessSemanticAnalysisPhase.java @@ -13,9 +13,11 @@ import org.elasticsearch.painless.ScriptClassInfo; import org.elasticsearch.painless.lookup.PainlessCast; import org.elasticsearch.painless.lookup.PainlessLookupUtility; +import org.elasticsearch.painless.lookup.PainlessMethod; import org.elasticsearch.painless.lookup.def; import org.elasticsearch.painless.node.AExpression; import org.elasticsearch.painless.node.AStatement; +import org.elasticsearch.painless.node.ECallLocal; import org.elasticsearch.painless.node.SBlock; import org.elasticsearch.painless.node.SExpression; import org.elasticsearch.painless.node.SFunction; @@ -29,6 +31,8 @@ import org.elasticsearch.painless.symbol.Decorations.MethodEscape; import org.elasticsearch.painless.symbol.Decorations.Read; import org.elasticsearch.painless.symbol.Decorations.TargetType; +import org.elasticsearch.painless.symbol.Decorations.ThisPainlessMethod; +import org.elasticsearch.painless.symbol.Decorations.ValueType; import org.elasticsearch.painless.symbol.FunctionTable.LocalFunction; import org.elasticsearch.painless.symbol.ScriptScope; import org.elasticsearch.painless.symbol.SemanticScope; @@ -230,4 +234,47 @@ public void decorateWithCastForReturn( semanticScope.putDecoration(userExpressionNode, new ExpressionPainlessCast(painlessCast)); } } + + @Override + public void visitCallLocal(ECallLocal userCallLocalNode, SemanticScope semanticScope) { + if ("$".equals(userCallLocalNode.getMethodName())) { + ScriptScope scriptScope = semanticScope.getScriptScope(); + PainlessMethod thisMethod = scriptScope.getPainlessLookup() + .lookupPainlessMethod(scriptScope.getScriptClassInfo().getBaseClass(), false, "field", 1); + + if (thisMethod == null) { + throw new IllegalArgumentException("invalid shortcut [$] for [field]; ensure [field] exists in this context"); + } + + semanticScope.setUsesInstanceMethod(); + semanticScope.putDecoration(userCallLocalNode, new ThisPainlessMethod(thisMethod)); + + // we specify the parameters here as String for the field name, and def for the default value + // we don't know the type of field at compile-time or the method since we use duck-typing + // so the default value has to be def + Class[] typeParameters = new Class[] { String.class, def.class }; + List userArgumentNodes = userCallLocalNode.getArgumentNodes(); + int userArgumentsSize = userArgumentNodes.size(); + + if (userArgumentsSize != 2) { + throw new IllegalArgumentException( + "invalid number of arguments for [$] shortcut for [field]; expected and " + ); + } + + for (int argument = 0; argument < userArgumentsSize; ++argument) { + AExpression userArgumentNode = userArgumentNodes.get(argument); + + semanticScope.setCondition(userArgumentNode, Read.class); + semanticScope.putDecoration(userArgumentNode, new TargetType(typeParameters[argument])); + semanticScope.setCondition(userArgumentNode, Internal.class); + checkedVisit(userArgumentNode, semanticScope); + decorateWithCast(userArgumentNode, semanticScope); + } + + semanticScope.putDecoration(userCallLocalNode, new ValueType(def.class)); + } else { + super.visitCallLocal(userCallLocalNode, semanticScope); + } + } } diff --git a/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessUserTreeToIRTreePhase.java b/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessUserTreeToIRTreePhase.java index dbcf7cd5eca0b..b34272d62b558 100644 --- a/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessUserTreeToIRTreePhase.java +++ b/modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/PainlessUserTreeToIRTreePhase.java @@ -22,6 +22,7 @@ import org.elasticsearch.painless.ir.FieldNode; import org.elasticsearch.painless.ir.FunctionNode; import org.elasticsearch.painless.ir.IRNode; +import org.elasticsearch.painless.ir.InvokeCallDefNode; import org.elasticsearch.painless.ir.InvokeCallMemberNode; import org.elasticsearch.painless.ir.InvokeCallNode; import org.elasticsearch.painless.ir.LoadFieldMemberNode; @@ -33,13 +34,16 @@ import org.elasticsearch.painless.ir.TryNode; import org.elasticsearch.painless.lookup.PainlessLookup; import org.elasticsearch.painless.lookup.PainlessMethod; +import org.elasticsearch.painless.lookup.def; import org.elasticsearch.painless.node.AStatement; +import org.elasticsearch.painless.node.ECallLocal; import org.elasticsearch.painless.node.SExpression; import org.elasticsearch.painless.node.SFunction; import org.elasticsearch.painless.node.SReturn; import org.elasticsearch.painless.symbol.Decorations.Converter; import org.elasticsearch.painless.symbol.Decorations.IRNodeDecoration; import org.elasticsearch.painless.symbol.Decorations.MethodEscape; +import org.elasticsearch.painless.symbol.Decorations.ThisPainlessMethod; import org.elasticsearch.painless.symbol.FunctionTable.LocalFunction; import org.elasticsearch.painless.symbol.IRDecorations.IRCAllEscape; import org.elasticsearch.painless.symbol.IRDecorations.IRCStatic; @@ -56,6 +60,7 @@ import org.elasticsearch.painless.symbol.IRDecorations.IRDParameterNames; import org.elasticsearch.painless.symbol.IRDecorations.IRDReturnType; import org.elasticsearch.painless.symbol.IRDecorations.IRDSymbol; +import org.elasticsearch.painless.symbol.IRDecorations.IRDThisMethod; import org.elasticsearch.painless.symbol.IRDecorations.IRDTypeParameters; import org.elasticsearch.painless.symbol.ScriptScope; import org.elasticsearch.script.ScriptException; @@ -540,6 +545,31 @@ public void injectConverter(AStatement userStatementNode, ScriptScope scriptScop ExpressionNode returnExpression = returnNode.getExpressionNode(); returnNode.setExpressionNode(irInvokeCallMemberNode); irInvokeCallMemberNode.addArgumentNode(returnExpression); + } + @Override + public void visitCallLocal(ECallLocal userCallLocalNode, ScriptScope scriptScope) { + if ("$".equals(userCallLocalNode.getMethodName())) { + PainlessMethod thisMethod = scriptScope.getDecoration(userCallLocalNode, ThisPainlessMethod.class).getThisPainlessMethod(); + + InvokeCallMemberNode irInvokeCallMemberNode = new InvokeCallMemberNode(userCallLocalNode.getLocation()); + irInvokeCallMemberNode.attachDecoration(new IRDThisMethod(thisMethod)); + irInvokeCallMemberNode.addArgumentNode(injectCast(userCallLocalNode.getArgumentNodes().get(0), scriptScope)); + irInvokeCallMemberNode.attachDecoration(new IRDExpressionType(def.class)); + + InvokeCallDefNode irCallSubDefNode = new InvokeCallDefNode(userCallLocalNode.getLocation()); + irCallSubDefNode.addArgumentNode(injectCast(userCallLocalNode.getArgumentNodes().get(1), scriptScope)); + irCallSubDefNode.attachDecoration(new IRDExpressionType(def.class)); + irCallSubDefNode.attachDecoration(new IRDName("get")); + + BinaryImplNode irBinaryImplNode = new BinaryImplNode(userCallLocalNode.getLocation()); + irBinaryImplNode.setLeftNode(irInvokeCallMemberNode); + irBinaryImplNode.setRightNode(irCallSubDefNode); + irBinaryImplNode.attachDecoration(new IRDExpressionType(def.class)); + + scriptScope.putDecoration(userCallLocalNode, new IRNodeDecoration(irBinaryImplNode)); + } else { + super.visitCallLocal(userCallLocalNode, scriptScope); + } } } diff --git a/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/50_script_doc_values.yml b/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/50_script_doc_values.yml index 40c081cb0ca9b..51976b614e71a 100644 --- a/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/50_script_doc_values.yml +++ b/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/50_script_doc_values.yml @@ -124,13 +124,13 @@ setup: - do: search: - rest_total_hits_as_int: true - body: - query: { term: { _id: 1 } } - script_fields: - field: - script: - source: "field('boolean').get(false)" + rest_total_hits_as_int: true + body: + query: { term: { _id: 1 } } + script_fields: + field: + script: + source: "/* avoid yaml stash for '$' */ $('boolean', false)" - match: { hits.hits.0.fields.field.0: true } - do: @@ -144,6 +144,17 @@ setup: source: "field('boolean').get(false)" - match: { hits.hits.0.fields.field.0: false } + - do: + search: + rest_total_hits_as_int: true + body: + query: { term: { _id: 2 } } + script_fields: + field: + script: + source: "/* avoid yaml stash for '$' */ $('boolean', false)" + - match: { hits.hits.0.fields.field.0: false } + - do: search: rest_total_hits_as_int: true @@ -422,6 +433,18 @@ setup: - match: { hits.hits.0.fields.field.0: 134134566 } - match: { hits.hits.1.fields.field.0: -1 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "/* avoid yaml stash */ $('integer', -1)" + - match: { hits.hits.0.fields.field.0: 134134566 } + - match: { hits.hits.1.fields.field.0: -1 } + - do: search: rest_total_hits_as_int: true @@ -484,6 +507,18 @@ setup: - match: { hits.hits.0.fields.field.0: 1324 } - match: { hits.hits.1.fields.field.0: -1 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "/* avoid yaml stash */ $('short', -1)" + - match: { hits.hits.0.fields.field.0: 1324 } + - match: { hits.hits.1.fields.field.0: -1 } + - do: search: rest_total_hits_as_int: true @@ -496,6 +531,18 @@ setup: - match: { hits.hits.0.fields.field.0: 1324 } - match: { hits.hits.1.fields.field.0: -1 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "short defaultShort = -1; $('short', defaultShort)" + - match: { hits.hits.0.fields.field.0: 1324 } + - match: { hits.hits.1.fields.field.0: -1 } + - do: search: rest_total_hits_as_int: true @@ -572,6 +619,19 @@ setup: - match: { hits.hits.1.fields.field.0: 5 } - match: { hits.hits.2.fields.field.0: 4 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "/* avoid yaml stash */ $('byte', (byte) 5)" + - match: { hits.hits.0.fields.field.0: 12 } + - match: { hits.hits.1.fields.field.0: 5 } + - match: { hits.hits.2.fields.field.0: 4 } + - do: search: rest_total_hits_as_int: true @@ -585,6 +645,19 @@ setup: - match: { hits.hits.1.fields.field.0: 5 } - match: { hits.hits.2.fields.field.0: 4 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "byte defaultByte = 5; $('byte', defaultByte)" + - match: { hits.hits.0.fields.field.0: 12 } + - match: { hits.hits.1.fields.field.0: 5 } + - match: { hits.hits.2.fields.field.0: 4 } + - do: search: rest_total_hits_as_int: true @@ -598,6 +671,19 @@ setup: - match: { hits.hits.1.fields.field.0: 5 } - match: { hits.hits.2.fields.field.0: 4 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "/* avoid yaml stash */ $('byte', 5)" + - match: { hits.hits.0.fields.field.0: 12 } + - match: { hits.hits.1.fields.field.0: 5 } + - match: { hits.hits.2.fields.field.0: 4 } + - do: search: rest_total_hits_as_int: true @@ -687,6 +773,19 @@ setup: - match: { hits.hits.1.fields.field.0: -1 } - match: { hits.hits.2.fields.field.0: 2.141592653587 } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "/* avoid yaml stash */ $('double', -1)" + - match: { hits.hits.0.fields.field.0: 3.14159265358979 } + - match: { hits.hits.1.fields.field.0: -1 } + - match: { hits.hits.2.fields.field.0: 2.141592653587 } + - do: search: rest_total_hits_as_int: true @@ -763,6 +862,19 @@ setup: - match: { hits.hits.1.fields.field.0: "-1.0" } - match: { hits.hits.2.fields.field.0: "1.123" } + - do: + search: + rest_total_hits_as_int: true + body: + sort: [ { rank: asc } ] + script_fields: + field: + script: + source: "return $('float', -1).toString()" # toString to avoid making this a double + - match: { hits.hits.0.fields.field.0: "3.1415927" } + - match: { hits.hits.1.fields.field.0: "-1.0" } + - match: { hits.hits.2.fields.field.0: "1.123" } + - do: search: rest_total_hits_as_int: true @@ -886,6 +998,16 @@ setup: source: "int value = field('dne').get(1); value" - match: { hits.hits.0.fields.field.0: 1} + - do: + search: + rest_total_hits_as_int: true + body: + script_fields: + field: + script: + source: "int value = $('dne', 1); value" + - match: { hits.hits.0.fields.field.0: 1} + - do: search: rest_total_hits_as_int: true diff --git a/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/60_script_doc_values_binary.yml b/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/60_script_doc_values_binary.yml index ba8d15d82ae0c..614ce53fd0649 100644 --- a/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/60_script_doc_values_binary.yml +++ b/modules/lang-painless/src/yamlRestTest/resources/rest-api-spec/test/painless/60_script_doc_values_binary.yml @@ -106,3 +106,25 @@ - match: { hits.hits.2.fields.field1.0: -1 } - match: { hits.hits.2.fields.field2.0: -1 } - match: { hits.hits.2.fields.field3.0: 0 } + + - do: + search: + body: + script_fields: + field1: + script: + source: "ByteBuffer bb = $('binary', null); if (bb == null) {return -1;} return bb.get(0)" + - match: { hits.hits.0.fields.field1.0: 83 } + - match: { hits.hits.1.fields.field1.0: 49 } + - match: { hits.hits.2.fields.field1.0: -1 } + + - do: + search: + body: + script_fields: + field1: + script: + source: "ByteBuffer bb = $('binary', null); if (bb == null) {return -1;} return bb.limit()" + - match: { hits.hits.0.fields.field1.0: 16 } + - match: { hits.hits.1.fields.field1.0: 4 } + - match: { hits.hits.2.fields.field1.0: -1 }