From ece638010fdb57f6d273763ec5c61ae158e76d4f Mon Sep 17 00:00:00 2001 From: aboyko Date: Wed, 14 Aug 2024 11:51:08 -0400 Subject: [PATCH] Input parameters for SPEL grammar --- .../commons/jpql/grammars/SpelLexer.g4 | 6 - .../commons/jpql/grammars/SpelParser.g4 | 13 +- .../ide/vscode/parser/spel/SpelLexer.java | 916 +++++++++--------- .../ide/vscode/parser/spel/SpelParser.java | 887 ++++++++++------- .../parser/spel/SpelParserBaseListener.java | 24 + .../parser/spel/SpelParserListener.java | 20 + .../boot/java/spel/SpelSemanticTokens.java | 66 +- .../java/spel/SpelSemanticTokensTest.java | 21 +- 8 files changed, 1117 insertions(+), 836 deletions(-) diff --git a/headless-services/commons/jpql/grammars/SpelLexer.g4 b/headless-services/commons/jpql/grammars/SpelLexer.g4 index dedaf7996..dc9d89903 100644 --- a/headless-services/commons/jpql/grammars/SpelLexer.g4 +++ b/headless-services/commons/jpql/grammars/SpelLexer.g4 @@ -117,12 +117,6 @@ IDENTIFIER : (ALPHABETIC | '_') (ALPHABETIC | DIGIT | '_' | '$')* ; -NUMERIC_LITERAL - : REAL_LITERAL - | INTEGER_LITERAL - ; - - REAL_LITERAL : '.' DECIMAL_DIGIT+ EXPONENT_PART? REAL_TYPE_SUFFIX? | DECIMAL_DIGIT+ '.' DECIMAL_DIGIT+ EXPONENT_PART? REAL_TYPE_SUFFIX? diff --git a/headless-services/commons/jpql/grammars/SpelParser.g4 b/headless-services/commons/jpql/grammars/SpelParser.g4 index 2ec7a1cf2..314bbe2a7 100644 --- a/headless-services/commons/jpql/grammars/SpelParser.g4 +++ b/headless-services/commons/jpql/grammars/SpelParser.g4 @@ -58,6 +58,7 @@ node nonDottedNode : (LSQUARE spelExpr RSQUARE) + | inputParameter ; dottedNode @@ -105,16 +106,21 @@ startNode | projection | selection | inlineListOrMap + | inputParameter ; literal - : NUMERIC_LITERAL + : numericLiteral | STRING_LITERAL | TRUE | FALSE ; +numericLiteral + : INTEGER_LITERAL + | REAL_LITERAL + ; parenspelExpr : LPAREN spelExpr RPAREN @@ -168,4 +174,7 @@ beanReference : (BEAN_REF | FACTORY_BEAN_REF) (IDENTIFIER | STRING_LITERAL) ; - \ No newline at end of file +inputParameter + : (LSQUARE INTEGER_LITERAL RSQUARE) + ; + diff --git a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelLexer.java b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelLexer.java index b15c4d336..c555d3067 100644 --- a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelLexer.java +++ b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelLexer.java @@ -37,9 +37,9 @@ public class SpelLexer extends Lexer { LE=36, LT=37, LCURLY=38, RCURLY=39, BACKTICK=40, OR=41, AND=42, TRUE=43, FALSE=44, NEW=45, NULL=46, T=47, MATCHES=48, GT_KEYWORD=49, GE_KEYWORD=50, LE_KEYWORD=51, LT_KEYWORD=52, EQ_KEYWORD=53, NE_KEYWORD=54, IDENTIFIER=55, - NUMERIC_LITERAL=56, REAL_LITERAL=57, INTEGER_LITERAL=58, STRING_LITERAL=59, - SINGLE_QUOTED_STRING=60, DOUBLE_QUOTED_STRING=61, ESCAPED_BACKTICK=62, - SPEL_IN_TEMPLATE_STRING_OPEN=63, TEMPLATE_TEXT=64; + REAL_LITERAL=56, INTEGER_LITERAL=57, STRING_LITERAL=58, SINGLE_QUOTED_STRING=59, + DOUBLE_QUOTED_STRING=60, ESCAPED_BACKTICK=61, SPEL_IN_TEMPLATE_STRING_OPEN=62, + TEMPLATE_TEXT=63; public static final int IN_TEMPLATE_STRING=1; public static String[] channelNames = { @@ -59,11 +59,11 @@ public class SpelLexer extends Lexer { "SELECT", "ELVIS", "SAFE_NAVI", "QMARK", "SELECT_LAST", "GE", "GT", "LE", "LT", "LCURLY", "RCURLY", "BACKTICK", "OR", "AND", "TRUE", "FALSE", "NEW", "NULL", "T", "MATCHES", "GT_KEYWORD", "GE_KEYWORD", "LE_KEYWORD", "LT_KEYWORD", - "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "NUMERIC_LITERAL", "REAL_LITERAL", - "INTEGER_LITERAL", "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", - "INTEGER_TYPE_SUFFIX", "HEX_DIGIT", "DECIMAL_DIGIT", "EXPONENT_PART", - "SIGN", "REAL_TYPE_SUFFIX", "ALPHABETIC", "DIGIT", "ESCAPED_BACKTICK", - "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT", "BACKTICK_IN_TEMPLATE" + "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "REAL_LITERAL", "INTEGER_LITERAL", + "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", "INTEGER_TYPE_SUFFIX", + "HEX_DIGIT", "DECIMAL_DIGIT", "EXPONENT_PART", "SIGN", "REAL_TYPE_SUFFIX", + "ALPHABETIC", "DIGIT", "ESCAPED_BACKTICK", "SPEL_IN_TEMPLATE_STRING_OPEN", + "TEMPLATE_TEXT", "BACKTICK_IN_TEMPLATE" }; } public static final String[] ruleNames = makeRuleNames(); @@ -76,7 +76,7 @@ public class SpelLexer extends Lexer { "'?:'", "'?.'", "'?'", "'$['", "'>='", "'>'", "'<='", "'<'", null, null, null, "'or'", "'and'", "'true'", "'false'", "'new'", "'null'", "'T'", "'matches'", "'gt'", "'ge'", "'le'", "'lt'", "'eq'", "'ne'", null, null, - null, null, null, null, null, "'``'" + null, null, null, null, "'``'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -89,9 +89,9 @@ public class SpelLexer extends Lexer { "ELVIS", "SAFE_NAVI", "QMARK", "SELECT_LAST", "GE", "GT", "LE", "LT", "LCURLY", "RCURLY", "BACKTICK", "OR", "AND", "TRUE", "FALSE", "NEW", "NULL", "T", "MATCHES", "GT_KEYWORD", "GE_KEYWORD", "LE_KEYWORD", "LT_KEYWORD", - "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "NUMERIC_LITERAL", "REAL_LITERAL", - "INTEGER_LITERAL", "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", - "ESCAPED_BACKTICK", "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT" + "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "REAL_LITERAL", "INTEGER_LITERAL", + "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", "ESCAPED_BACKTICK", + "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -164,7 +164,7 @@ public class SpelLexer extends Lexer { case 39: RCURLY_action((RuleContext)_localctx, actionIndex); break; - case 71: + case 70: SPEL_IN_TEMPLATE_STRING_OPEN_action((RuleContext)_localctx, actionIndex); break; } @@ -196,7 +196,7 @@ public class SpelLexer extends Lexer { } public static final String _serializedATN = - "\u0004\u0000@\u01d8\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ + "\u0004\u0000?\u01d2\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000\u0007"+ "\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007"+ "\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007"+ "\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n"+ @@ -215,452 +215,448 @@ public class SpelLexer extends Lexer { "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ - "H\u0007H\u0002I\u0007I\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0003\u0001\u009c\b\u0001\u0001\u0002\u0004\u0002\u009f\b"+ - "\u0002\u000b\u0002\f\u0002\u00a0\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ - "\u0001\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001"+ - "\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001"+ - "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ - "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ - "!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001"+ - "$\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ - "*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u00012\u0001"+ - "3\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u00015\u00016\u0001"+ - "6\u00016\u00017\u00017\u00037\u0140\b7\u00017\u00017\u00017\u00057\u0145"+ - "\b7\n7\f7\u0148\t7\u00018\u00018\u00038\u014c\b8\u00019\u00019\u00049"+ - "\u0150\b9\u000b9\f9\u0151\u00019\u00039\u0155\b9\u00019\u00039\u0158\b"+ - "9\u00019\u00049\u015b\b9\u000b9\f9\u015c\u00019\u00019\u00049\u0161\b"+ - "9\u000b9\f9\u0162\u00019\u00039\u0166\b9\u00019\u00039\u0169\b9\u0001"+ - "9\u00049\u016c\b9\u000b9\f9\u016d\u00019\u00019\u00039\u0172\b9\u0001"+ - "9\u00049\u0175\b9\u000b9\f9\u0176\u00019\u00019\u00039\u017b\b9\u0001"+ - ":\u0004:\u017e\b:\u000b:\f:\u017f\u0001:\u0003:\u0183\b:\u0001;\u0001"+ - ";\u0003;\u0187\b;\u0001<\u0001<\u0001<\u0001<\u0005<\u018d\b<\n<\f<\u0190"+ - "\t<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0005=\u0198\b=\n=\f=\u019b"+ - "\t=\u0001=\u0001=\u0001>\u0001>\u0001?\u0001?\u0001@\u0001@\u0001A\u0001"+ - "A\u0005A\u01a7\bA\nA\fA\u01aa\tA\u0001A\u0004A\u01ad\bA\u000bA\fA\u01ae"+ - "\u0001A\u0001A\u0005A\u01b3\bA\nA\fA\u01b6\tA\u0001A\u0004A\u01b9\bA\u000b"+ - "A\fA\u01ba\u0003A\u01bd\bA\u0001B\u0001B\u0001C\u0001C\u0001D\u0003D\u01c4"+ - "\bD\u0001E\u0001E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0000"+ - "\u0000J\u0002\u0001\u0004\u0000\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e"+ - "\u0006\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018\u000b\u001a\f\u001c\r"+ - "\u001e\u000e \u000f\"\u0010$\u0011&\u0012(\u0013*\u0014,\u0015.\u0016"+ - "0\u00172\u00184\u00196\u001a8\u001b:\u001c<\u001d>\u001e@\u001fB D!F\""+ - "H#J$L%N&P\'R(T)V*X+Z,\\-^.`/b0d1f2h3j4l5n6p7r8t9v:x;z<|=~\u0000\u0080"+ - "\u0000\u0082\u0000\u0084\u0000\u0086\u0000\u0088\u0000\u008a\u0000\u008c"+ - "\u0000\u008e>\u0090?\u0092@\u0094\u0000\u0002\u0000\u0001\f\u0003\u0000"+ - "\n\n\r\r\u2028\u2029\u0003\u0000\t\n\r\r \u0002\u0000$$__\u0002\u0000"+ - "\n\n\'\'\u0002\u0000\n\n\"\"\u0002\u0000LLll\u0003\u000009AFaf\u0001\u0000"+ - "09\u0002\u0000++--\u0004\u0000DDFFddff\u0293\u0000AZaz\u00aa\u00aa\u00b5"+ - "\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0"+ - "\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f"+ - "\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7"+ - "\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef"+ - "\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee"+ - "\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1"+ - "\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824"+ - "\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0"+ - "\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985"+ - "\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd"+ - "\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05"+ - "\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38"+ - "\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93"+ - "\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0"+ - "\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32"+ - "\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83"+ - "\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e"+ - "\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e"+ - "\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60"+ - "\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5"+ - "\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e"+ - "\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a"+ - "\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01"+ - "\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c"+ - "\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6"+ - "\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000"+ - "\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e"+ - "\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0"+ - "\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260"+ - "\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2"+ - "\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0"+ - "\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1"+ - "\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780"+ - "\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa"+ - "\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0"+ - "\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83"+ - "\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80"+ - "\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa"+ - "\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50"+ - "\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6"+ - "\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0"+ - "\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102"+ - "\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126"+ - "\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e"+ - "\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27"+ - "\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8"+ - "\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8"+ - "\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d"+ - "\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0"+ - "\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500"+ - "\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640"+ - "\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717"+ - "\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0"+ - "\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2"+ - "\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c"+ - "\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2"+ - "\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a"+ - "\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984"+ - "\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6"+ - "\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40"+ - "\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a"+ - "\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5"+ - "\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2"+ - "\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2"+ - "\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11"+ - "\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30"+ - "\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00"+ - "\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900"+ - "\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13"+ - "\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a"+ - "\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40"+ - "\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3"+ - "\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0"+ - "\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21"+ - "\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2"+ - "\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda"+ - "\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001"+ - "<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280"+ - "\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d"+ - "\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380"+ - "\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400"+ - "\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500"+ - "\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c"+ - "\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597"+ - "\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb"+ - "\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760"+ - "\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2"+ - "\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a"+ - "\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f"+ - "\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0"+ - "\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920"+ - "\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00"+ - "\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19"+ - "\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0"+ - "\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40"+ - "\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00"+ - "\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00"+ - "\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00"+ - "\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70"+ - "\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003"+ - "\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083"+ - "\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144"+ - "\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176"+ - "\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da"+ - "\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213"+ - "\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280\u8001\u1286\u8001\u1288"+ - "\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f\u8001\u129d\u8001\u129f"+ - "\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305\u8001\u130c\u8001\u130f"+ - "\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a\u8001\u1330\u8001\u1332"+ - "\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d\u8001\u133d\u8001\u1350"+ - "\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400\u8001\u1434\u8001\u1447"+ - "\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480\u8001\u14af\u8001\u14c4"+ - "\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8"+ - "\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644\u8001\u1644\u8001\u1680"+ - "\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700\u8001\u171a\u8001\u1740"+ - "\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff"+ - "\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c\u8001\u1913\u8001\u1915"+ - "\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f\u8001\u193f\u8001\u1941"+ - "\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1"+ - "\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b"+ - "\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c"+ - "\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00"+ - "\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72"+ - "\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b"+ - "\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67"+ - "\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0"+ - "\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04\u8001\u1f10\u8001\u1f12"+ - "\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480"+ - "\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001\u3441"+ - "\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001\u6a40"+ - "\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001\u6b00"+ - "\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001\u6b77\u8001\u6b7d"+ - "\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50"+ - "\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001\u6fe1\u8001\u6fe3"+ - "\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00"+ - "\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001\uaffb\u8001\uaffd"+ - "\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150"+ - "\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170"+ - "\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80"+ - "\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456"+ - "\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5"+ - "\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb"+ - "\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507"+ - "\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e"+ - "\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546"+ - "\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8"+ - "\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc"+ - "\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750"+ - "\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa"+ - "\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25"+ - "\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100\u8001\ue12c\u8001\ue137"+ - "\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0"+ - "\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8"+ - "\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800"+ - "\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00"+ - "\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21\u8001\uee22\u8001\uee24"+ - "\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29\u8001\uee32\u8001\uee34"+ - "\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42"+ - "\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49\u8001\uee49\u8001\uee4b"+ - "\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51\u8001\uee52\u8001\uee54"+ - "\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59\u8001\uee59\u8001\uee5b"+ - "\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61"+ - "\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c"+ - "\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e"+ - "\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1"+ - "\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000"+ - "\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740\u8002\ub81d\u8002\ub820"+ - "\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000"+ - "\u8003\u134a\u8003\u1350\u8003\u23af\u0002\u0000\n\n``\u01ed\u0000\u0002"+ - "\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001"+ - "\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000"+ - "\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000"+ - "\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000"+ - "\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000"+ - "\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000"+ - "\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000"+ - "\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000"+ - "\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*"+ - "\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000"+ - "\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000"+ - "\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008"+ - "\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000"+ - "\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000"+ - "\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F"+ - "\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000"+ - "\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000"+ - "\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T"+ - "\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000"+ - "\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000"+ - "\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000"+ - "b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001"+ - "\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000"+ - "\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001\u0000\u0000\u0000\u0000"+ - "p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000\u0000\u0000t\u0001"+ - "\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000x\u0001\u0000\u0000"+ - "\u0000\u0000z\u0001\u0000\u0000\u0000\u0000|\u0001\u0000\u0000\u0000\u0001"+ - "\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001"+ - "\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0002"+ - "\u0096\u0001\u0000\u0000\u0000\u0004\u009b\u0001\u0000\u0000\u0000\u0006"+ - "\u009e\u0001\u0000\u0000\u0000\b\u00a4\u0001\u0000\u0000\u0000\n\u00a7"+ - "\u0001\u0000\u0000\u0000\f\u00a9\u0001\u0000\u0000\u0000\u000e\u00ac\u0001"+ - "\u0000\u0000\u0000\u0010\u00ae\u0001\u0000\u0000\u0000\u0012\u00b0\u0001"+ - "\u0000\u0000\u0000\u0014\u00b2\u0001\u0000\u0000\u0000\u0016\u00b4\u0001"+ - "\u0000\u0000\u0000\u0018\u00b6\u0001\u0000\u0000\u0000\u001a\u00b8\u0001"+ - "\u0000\u0000\u0000\u001c\u00ba\u0001\u0000\u0000\u0000\u001e\u00bc\u0001"+ - "\u0000\u0000\u0000 \u00be\u0001\u0000\u0000\u0000\"\u00c0\u0001\u0000"+ - "\u0000\u0000$\u00c2\u0001\u0000\u0000\u0000&\u00c4\u0001\u0000\u0000\u0000"+ - "(\u00c6\u0001\u0000\u0000\u0000*\u00c9\u0001\u0000\u0000\u0000,\u00cb"+ - "\u0001\u0000\u0000\u0000.\u00ce\u0001\u0000\u0000\u00000\u00d1\u0001\u0000"+ - "\u0000\u00002\u00d3\u0001\u0000\u0000\u00004\u00d6\u0001\u0000\u0000\u0000"+ - "6\u00d8\u0001\u0000\u0000\u00008\u00db\u0001\u0000\u0000\u0000:\u00dd"+ - "\u0001\u0000\u0000\u0000<\u00e0\u0001\u0000\u0000\u0000>\u00e3\u0001\u0000"+ - "\u0000\u0000@\u00e6\u0001\u0000\u0000\u0000B\u00e9\u0001\u0000\u0000\u0000"+ - "D\u00eb\u0001\u0000\u0000\u0000F\u00ee\u0001\u0000\u0000\u0000H\u00f1"+ - "\u0001\u0000\u0000\u0000J\u00f3\u0001\u0000\u0000\u0000L\u00f6\u0001\u0000"+ - "\u0000\u0000N\u00f8\u0001\u0000\u0000\u0000P\u00fd\u0001\u0000\u0000\u0000"+ - "R\u0102\u0001\u0000\u0000\u0000T\u0106\u0001\u0000\u0000\u0000V\u0109"+ - "\u0001\u0000\u0000\u0000X\u010d\u0001\u0000\u0000\u0000Z\u0112\u0001\u0000"+ - "\u0000\u0000\\\u0118\u0001\u0000\u0000\u0000^\u011c\u0001\u0000\u0000"+ - "\u0000`\u0121\u0001\u0000\u0000\u0000b\u0123\u0001\u0000\u0000\u0000d"+ - "\u012b\u0001\u0000\u0000\u0000f\u012e\u0001\u0000\u0000\u0000h\u0131\u0001"+ - "\u0000\u0000\u0000j\u0134\u0001\u0000\u0000\u0000l\u0137\u0001\u0000\u0000"+ - "\u0000n\u013a\u0001\u0000\u0000\u0000p\u013f\u0001\u0000\u0000\u0000r"+ - "\u014b\u0001\u0000\u0000\u0000t\u017a\u0001\u0000\u0000\u0000v\u017d\u0001"+ - "\u0000\u0000\u0000x\u0186\u0001\u0000\u0000\u0000z\u0188\u0001\u0000\u0000"+ - "\u0000|\u0193\u0001\u0000\u0000\u0000~\u019e\u0001\u0000\u0000\u0000\u0080"+ - "\u01a0\u0001\u0000\u0000\u0000\u0082\u01a2\u0001\u0000\u0000\u0000\u0084"+ - "\u01bc\u0001\u0000\u0000\u0000\u0086\u01be\u0001\u0000\u0000\u0000\u0088"+ - "\u01c0\u0001\u0000\u0000\u0000\u008a\u01c3\u0001\u0000\u0000\u0000\u008c"+ - "\u01c5\u0001\u0000\u0000\u0000\u008e\u01c7\u0001\u0000\u0000\u0000\u0090"+ - "\u01ca\u0001\u0000\u0000\u0000\u0092\u01d1\u0001\u0000\u0000\u0000\u0094"+ - "\u01d3\u0001\u0000\u0000\u0000\u0096\u0097\u0005;\u0000\u0000\u0097\u0003"+ - "\u0001\u0000\u0000\u0000\u0098\u0099\u0005\r\u0000\u0000\u0099\u009c\u0005"+ - "\n\u0000\u0000\u009a\u009c\u0007\u0000\u0000\u0000\u009b\u0098\u0001\u0000"+ - "\u0000\u0000\u009b\u009a\u0001\u0000\u0000\u0000\u009c\u0005\u0001\u0000"+ - "\u0000\u0000\u009d\u009f\u0007\u0001\u0000\u0000\u009e\u009d\u0001\u0000"+ - "\u0000\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u009e\u0001\u0000"+ - "\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000"+ - "\u0000\u0000\u00a2\u00a3\u0006\u0002\u0000\u0000\u00a3\u0007\u0001\u0000"+ - "\u0000\u0000\u00a4\u00a5\u0005+\u0000\u0000\u00a5\u00a6\u0005+\u0000\u0000"+ - "\u00a6\t\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005+\u0000\u0000\u00a8"+ - "\u000b\u0001\u0000\u0000\u0000\u00a9\u00aa\u0005-\u0000\u0000\u00aa\u00ab"+ - "\u0005-\u0000\u0000\u00ab\r\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005"+ - "-\u0000\u0000\u00ad\u000f\u0001\u0000\u0000\u0000\u00ae\u00af\u0005:\u0000"+ - "\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b1\u0005.\u0000\u0000"+ - "\u00b1\u0013\u0001\u0000\u0000\u0000\u00b2\u00b3\u0005,\u0000\u0000\u00b3"+ - "\u0015\u0001\u0000\u0000\u0000\u00b4\u00b5\u0005*\u0000\u0000\u00b5\u0017"+ - "\u0001\u0000\u0000\u0000\u00b6\u00b7\u0005/\u0000\u0000\u00b7\u0019\u0001"+ - "\u0000\u0000\u0000\u00b8\u00b9\u0005%\u0000\u0000\u00b9\u001b\u0001\u0000"+ - "\u0000\u0000\u00ba\u00bb\u0005(\u0000\u0000\u00bb\u001d\u0001\u0000\u0000"+ - "\u0000\u00bc\u00bd\u0005)\u0000\u0000\u00bd\u001f\u0001\u0000\u0000\u0000"+ - "\u00be\u00bf\u0005[\u0000\u0000\u00bf!\u0001\u0000\u0000\u0000\u00c0\u00c1"+ - "\u0005]\u0000\u0000\u00c1#\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005#"+ - "\u0000\u0000\u00c3%\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005@\u0000\u0000"+ - "\u00c5\'\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005^\u0000\u0000\u00c7"+ - "\u00c8\u0005[\u0000\u0000\u00c8)\u0001\u0000\u0000\u0000\u00c9\u00ca\u0005"+ - "^\u0000\u0000\u00ca+\u0001\u0000\u0000\u0000\u00cb\u00cc\u0005!\u0000"+ - "\u0000\u00cc\u00cd\u0005=\u0000\u0000\u00cd-\u0001\u0000\u0000\u0000\u00ce"+ - "\u00cf\u0005!\u0000\u0000\u00cf\u00d0\u0005[\u0000\u0000\u00d0/\u0001"+ - "\u0000\u0000\u0000\u00d1\u00d2\u0005!\u0000\u0000\u00d21\u0001\u0000\u0000"+ - "\u0000\u00d3\u00d4\u0005=\u0000\u0000\u00d4\u00d5\u0005=\u0000\u0000\u00d5"+ - "3\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005=\u0000\u0000\u00d75\u0001"+ - "\u0000\u0000\u0000\u00d8\u00d9\u0005&\u0000\u0000\u00d9\u00da\u0005&\u0000"+ - "\u0000\u00da7\u0001\u0000\u0000\u0000\u00db\u00dc\u0005&\u0000\u0000\u00dc"+ - "9\u0001\u0000\u0000\u0000\u00dd\u00de\u0005|\u0000\u0000\u00de\u00df\u0005"+ - "|\u0000\u0000\u00df;\u0001\u0000\u0000\u0000\u00e0\u00e1\u0005?\u0000"+ - "\u0000\u00e1\u00e2\u0005[\u0000\u0000\u00e2=\u0001\u0000\u0000\u0000\u00e3"+ - "\u00e4\u0005?\u0000\u0000\u00e4\u00e5\u0005:\u0000\u0000\u00e5?\u0001"+ - "\u0000\u0000\u0000\u00e6\u00e7\u0005?\u0000\u0000\u00e7\u00e8\u0005.\u0000"+ - "\u0000\u00e8A\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005?\u0000\u0000\u00ea"+ - "C\u0001\u0000\u0000\u0000\u00eb\u00ec\u0005$\u0000\u0000\u00ec\u00ed\u0005"+ - "[\u0000\u0000\u00edE\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005>\u0000"+ - "\u0000\u00ef\u00f0\u0005=\u0000\u0000\u00f0G\u0001\u0000\u0000\u0000\u00f1"+ - "\u00f2\u0005>\u0000\u0000\u00f2I\u0001\u0000\u0000\u0000\u00f3\u00f4\u0005"+ - "<\u0000\u0000\u00f4\u00f5\u0005=\u0000\u0000\u00f5K\u0001\u0000\u0000"+ - "\u0000\u00f6\u00f7\u0005<\u0000\u0000\u00f7M\u0001\u0000\u0000\u0000\u00f8"+ - "\u00f9\u0005{\u0000\u0000\u00f9\u00fa\u0006&\u0001\u0000\u00fa\u00fb\u0001"+ - "\u0000\u0000\u0000\u00fb\u00fc\u0006&\u0002\u0000\u00fcO\u0001\u0000\u0000"+ - "\u0000\u00fd\u00fe\u0005}\u0000\u0000\u00fe\u00ff\u0006\'\u0003\u0000"+ - "\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u0101\u0006\'\u0004\u0000\u0101"+ - "Q\u0001\u0000\u0000\u0000\u0102\u0103\u0005`\u0000\u0000\u0103\u0104\u0001"+ - "\u0000\u0000\u0000\u0104\u0105\u0006(\u0005\u0000\u0105S\u0001\u0000\u0000"+ - "\u0000\u0106\u0107\u0005o\u0000\u0000\u0107\u0108\u0005r\u0000\u0000\u0108"+ - "U\u0001\u0000\u0000\u0000\u0109\u010a\u0005a\u0000\u0000\u010a\u010b\u0005"+ - "n\u0000\u0000\u010b\u010c\u0005d\u0000\u0000\u010cW\u0001\u0000\u0000"+ - "\u0000\u010d\u010e\u0005t\u0000\u0000\u010e\u010f\u0005r\u0000\u0000\u010f"+ - "\u0110\u0005u\u0000\u0000\u0110\u0111\u0005e\u0000\u0000\u0111Y\u0001"+ - "\u0000\u0000\u0000\u0112\u0113\u0005f\u0000\u0000\u0113\u0114\u0005a\u0000"+ - "\u0000\u0114\u0115\u0005l\u0000\u0000\u0115\u0116\u0005s\u0000\u0000\u0116"+ - "\u0117\u0005e\u0000\u0000\u0117[\u0001\u0000\u0000\u0000\u0118\u0119\u0005"+ - "n\u0000\u0000\u0119\u011a\u0005e\u0000\u0000\u011a\u011b\u0005w\u0000"+ - "\u0000\u011b]\u0001\u0000\u0000\u0000\u011c\u011d\u0005n\u0000\u0000\u011d"+ - "\u011e\u0005u\u0000\u0000\u011e\u011f\u0005l\u0000\u0000\u011f\u0120\u0005"+ - "l\u0000\u0000\u0120_\u0001\u0000\u0000\u0000\u0121\u0122\u0005T\u0000"+ - "\u0000\u0122a\u0001\u0000\u0000\u0000\u0123\u0124\u0005m\u0000\u0000\u0124"+ - "\u0125\u0005a\u0000\u0000\u0125\u0126\u0005t\u0000\u0000\u0126\u0127\u0005"+ - "c\u0000\u0000\u0127\u0128\u0005h\u0000\u0000\u0128\u0129\u0005e\u0000"+ - "\u0000\u0129\u012a\u0005s\u0000\u0000\u012ac\u0001\u0000\u0000\u0000\u012b"+ - "\u012c\u0005g\u0000\u0000\u012c\u012d\u0005t\u0000\u0000\u012de\u0001"+ - "\u0000\u0000\u0000\u012e\u012f\u0005g\u0000\u0000\u012f\u0130\u0005e\u0000"+ - "\u0000\u0130g\u0001\u0000\u0000\u0000\u0131\u0132\u0005l\u0000\u0000\u0132"+ - "\u0133\u0005e\u0000\u0000\u0133i\u0001\u0000\u0000\u0000\u0134\u0135\u0005"+ - "l\u0000\u0000\u0135\u0136\u0005t\u0000\u0000\u0136k\u0001\u0000\u0000"+ - "\u0000\u0137\u0138\u0005e\u0000\u0000\u0138\u0139\u0005q\u0000\u0000\u0139"+ - "m\u0001\u0000\u0000\u0000\u013a\u013b\u0005n\u0000\u0000\u013b\u013c\u0005"+ - "e\u0000\u0000\u013co\u0001\u0000\u0000\u0000\u013d\u0140\u0003\u008aD"+ - "\u0000\u013e\u0140\u0005_\u0000\u0000\u013f\u013d\u0001\u0000\u0000\u0000"+ - "\u013f\u013e\u0001\u0000\u0000\u0000\u0140\u0146\u0001\u0000\u0000\u0000"+ - "\u0141\u0145\u0003\u008aD\u0000\u0142\u0145\u0003\u008cE\u0000\u0143\u0145"+ - "\u0007\u0002\u0000\u0000\u0144\u0141\u0001\u0000\u0000\u0000\u0144\u0142"+ - "\u0001\u0000\u0000\u0000\u0144\u0143\u0001\u0000\u0000\u0000\u0145\u0148"+ - "\u0001\u0000\u0000\u0000\u0146\u0144\u0001\u0000\u0000\u0000\u0146\u0147"+ - "\u0001\u0000\u0000\u0000\u0147q\u0001\u0000\u0000\u0000\u0148\u0146\u0001"+ - "\u0000\u0000\u0000\u0149\u014c\u0003t9\u0000\u014a\u014c\u0003v:\u0000"+ - "\u014b\u0149\u0001\u0000\u0000\u0000\u014b\u014a\u0001\u0000\u0000\u0000"+ - "\u014cs\u0001\u0000\u0000\u0000\u014d\u014f\u0005.\u0000\u0000\u014e\u0150"+ - "\u0003\u0082@\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u0150\u0151\u0001"+ - "\u0000\u0000\u0000\u0151\u014f\u0001\u0000\u0000\u0000\u0151\u0152\u0001"+ - "\u0000\u0000\u0000\u0152\u0154\u0001\u0000\u0000\u0000\u0153\u0155\u0003"+ - "\u0084A\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0154\u0155\u0001\u0000"+ - "\u0000\u0000\u0155\u0157\u0001\u0000\u0000\u0000\u0156\u0158\u0003\u0088"+ - "C\u0000\u0157\u0156\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000"+ - "\u0000\u0158\u017b\u0001\u0000\u0000\u0000\u0159\u015b\u0003\u0082@\u0000"+ - "\u015a\u0159\u0001\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000"+ - "\u015c\u015a\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000\u0000\u0000"+ - "\u015d\u015e\u0001\u0000\u0000\u0000\u015e\u0160\u0005.\u0000\u0000\u015f"+ - "\u0161\u0003\u0082@\u0000\u0160\u015f\u0001\u0000\u0000\u0000\u0161\u0162"+ - "\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163"+ - "\u0001\u0000\u0000\u0000\u0163\u0165\u0001\u0000\u0000\u0000\u0164\u0166"+ - "\u0003\u0084A\u0000\u0165\u0164\u0001\u0000\u0000\u0000\u0165\u0166\u0001"+ - "\u0000\u0000\u0000\u0166\u0168\u0001\u0000\u0000\u0000\u0167\u0169\u0003"+ - "\u0088C\u0000\u0168\u0167\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000"+ - "\u0000\u0000\u0169\u017b\u0001\u0000\u0000\u0000\u016a\u016c\u0003\u0082"+ - "@\u0000\u016b\u016a\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000"+ - "\u0000\u016d\u016b\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000"+ - "\u0000\u016e\u016f\u0001\u0000\u0000\u0000\u016f\u0171\u0003\u0084A\u0000"+ - "\u0170\u0172\u0003\u0088C\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171"+ - "\u0172\u0001\u0000\u0000\u0000\u0172\u017b\u0001\u0000\u0000\u0000\u0173"+ - "\u0175\u0003\u0082@\u0000\u0174\u0173\u0001\u0000\u0000\u0000\u0175\u0176"+ - "\u0001\u0000\u0000\u0000\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177"+ - "\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000\u0178\u0179"+ - "\u0003\u0088C\u0000\u0179\u017b\u0001\u0000\u0000\u0000\u017a\u014d\u0001"+ - "\u0000\u0000\u0000\u017a\u015a\u0001\u0000\u0000\u0000\u017a\u016b\u0001"+ - "\u0000\u0000\u0000\u017a\u0174\u0001\u0000\u0000\u0000\u017bu\u0001\u0000"+ - "\u0000\u0000\u017c\u017e\u0003\u0082@\u0000\u017d\u017c\u0001\u0000\u0000"+ - "\u0000\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u017d\u0001\u0000\u0000"+ - "\u0000\u017f\u0180\u0001\u0000\u0000\u0000\u0180\u0182\u0001\u0000\u0000"+ - "\u0000\u0181\u0183\u0003~>\u0000\u0182\u0181\u0001\u0000\u0000\u0000\u0182"+ - "\u0183\u0001\u0000\u0000\u0000\u0183w\u0001\u0000\u0000\u0000\u0184\u0187"+ - "\u0003z<\u0000\u0185\u0187\u0003|=\u0000\u0186\u0184\u0001\u0000\u0000"+ - "\u0000\u0186\u0185\u0001\u0000\u0000\u0000\u0187y\u0001\u0000\u0000\u0000"+ - "\u0188\u018e\u0005\'\u0000\u0000\u0189\u018a\u0005\'\u0000\u0000\u018a"+ - "\u018d\u0005\'\u0000\u0000\u018b\u018d\b\u0003\u0000\u0000\u018c\u0189"+ - "\u0001\u0000\u0000\u0000\u018c\u018b\u0001\u0000\u0000\u0000\u018d\u0190"+ - "\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018e\u018f"+ - "\u0001\u0000\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u018e"+ - "\u0001\u0000\u0000\u0000\u0191\u0192\u0005\'\u0000\u0000\u0192{\u0001"+ - "\u0000\u0000\u0000\u0193\u0199\u0005\"\u0000\u0000\u0194\u0195\u0005\""+ - "\u0000\u0000\u0195\u0198\u0005\"\u0000\u0000\u0196\u0198\b\u0004\u0000"+ - "\u0000\u0197\u0194\u0001\u0000\u0000\u0000\u0197\u0196\u0001\u0000\u0000"+ - "\u0000\u0198\u019b\u0001\u0000\u0000\u0000\u0199\u0197\u0001\u0000\u0000"+ - "\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a\u019c\u0001\u0000\u0000"+ - "\u0000\u019b\u0199\u0001\u0000\u0000\u0000\u019c\u019d\u0005\"\u0000\u0000"+ - "\u019d}\u0001\u0000\u0000\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f"+ - "\u007f\u0001\u0000\u0000\u0000\u01a0\u01a1\u0007\u0006\u0000\u0000\u01a1"+ - "\u0081\u0001\u0000\u0000\u0000\u01a2\u01a3\u0007\u0007\u0000\u0000\u01a3"+ - "\u0083\u0001\u0000\u0000\u0000\u01a4\u01a8\u0005e\u0000\u0000\u01a5\u01a7"+ - "\u0003\u0086B\u0000\u01a6\u01a5\u0001\u0000\u0000\u0000\u01a7\u01aa\u0001"+ - "\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001"+ - "\u0000\u0000\u0000\u01a9\u01ac\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001"+ - "\u0000\u0000\u0000\u01ab\u01ad\u0003\u0082@\u0000\u01ac\u01ab\u0001\u0000"+ - "\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000"+ - "\u0000\u0000\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01bd\u0001\u0000"+ - "\u0000\u0000\u01b0\u01b4\u0005E\u0000\u0000\u01b1\u01b3\u0003\u0086B\u0000"+ - "\u01b2\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000"+ - "\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000"+ - "\u01b5\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000"+ - "\u01b7\u01b9\u0003\u0082@\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b9"+ - "\u01ba\u0001\u0000\u0000\u0000\u01ba\u01b8\u0001\u0000\u0000\u0000\u01ba"+ - "\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bd\u0001\u0000\u0000\u0000\u01bc"+ - "\u01a4\u0001\u0000\u0000\u0000\u01bc\u01b0\u0001\u0000\u0000\u0000\u01bd"+ - "\u0085\u0001\u0000\u0000\u0000\u01be\u01bf\u0007\b\u0000\u0000\u01bf\u0087"+ - "\u0001\u0000\u0000\u0000\u01c0\u01c1\u0007\t\u0000\u0000\u01c1\u0089\u0001"+ - "\u0000\u0000\u0000\u01c2\u01c4\u0007\n\u0000\u0000\u01c3\u01c2\u0001\u0000"+ - "\u0000\u0000\u01c4\u008b\u0001\u0000\u0000\u0000\u01c5\u01c6\u0007\u0007"+ - "\u0000\u0000\u01c6\u008d\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005`\u0000"+ - "\u0000\u01c8\u01c9\u0005`\u0000\u0000\u01c9\u008f\u0001\u0000\u0000\u0000"+ - "\u01ca\u01cb\u0005#\u0000\u0000\u01cb\u01cc\u0005{\u0000\u0000\u01cc\u01cd"+ - "\u0001\u0000\u0000\u0000\u01cd\u01ce\u0006G\u0006\u0000\u01ce\u01cf\u0001"+ - "\u0000\u0000\u0000\u01cf\u01d0\u0006G\u0002\u0000\u01d0\u0091\u0001\u0000"+ - "\u0000\u0000\u01d1\u01d2\b\u000b\u0000\u0000\u01d2\u0093\u0001\u0000\u0000"+ - "\u0000\u01d3\u01d4\u0005`\u0000\u0000\u01d4\u01d5\u0001\u0000\u0000\u0000"+ - "\u01d5\u01d6\u0006I\u0007\u0000\u01d6\u01d7\u0006I\u0004\u0000\u01d7\u0095"+ - "\u0001\u0000\u0000\u0000 \u0000\u0001\u009b\u00a0\u013f\u0144\u0146\u014b"+ - "\u0151\u0154\u0157\u015c\u0162\u0165\u0168\u016d\u0171\u0176\u017a\u017f"+ - "\u0182\u0186\u018c\u018e\u0197\u0199\u01a8\u01ae\u01b4\u01ba\u01bc\u01c3"+ - "\b\u0000\u0001\u0000\u0001&\u0000\u0005\u0000\u0000\u0001\'\u0001\u0004"+ - "\u0000\u0000\u0005\u0001\u0000\u0001G\u0002\u0007(\u0000"; + "H\u0007H\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u009a\b\u0001\u0001\u0002\u0004\u0002\u009d\b\u0002\u000b\u0002"+ + "\f\u0002\u009e\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006"+ + "\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001"+ + "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0001"+ + "\"\u0001\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001"+ + ".\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00011\u00011\u00011\u00012\u00012\u00012\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+ + "7\u00017\u00037\u013e\b7\u00017\u00017\u00017\u00057\u0143\b7\n7\f7\u0146"+ + "\t7\u00018\u00018\u00048\u014a\b8\u000b8\f8\u014b\u00018\u00038\u014f"+ + "\b8\u00018\u00038\u0152\b8\u00018\u00048\u0155\b8\u000b8\f8\u0156\u0001"+ + "8\u00018\u00048\u015b\b8\u000b8\f8\u015c\u00018\u00038\u0160\b8\u0001"+ + "8\u00038\u0163\b8\u00018\u00048\u0166\b8\u000b8\f8\u0167\u00018\u0001"+ + "8\u00038\u016c\b8\u00018\u00048\u016f\b8\u000b8\f8\u0170\u00018\u0001"+ + "8\u00038\u0175\b8\u00019\u00049\u0178\b9\u000b9\f9\u0179\u00019\u0003"+ + "9\u017d\b9\u0001:\u0001:\u0003:\u0181\b:\u0001;\u0001;\u0001;\u0001;\u0005"+ + ";\u0187\b;\n;\f;\u018a\t;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0005"+ + "<\u0192\b<\n<\f<\u0195\t<\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001"+ + "?\u0001?\u0001@\u0001@\u0005@\u01a1\b@\n@\f@\u01a4\t@\u0001@\u0004@\u01a7"+ + "\b@\u000b@\f@\u01a8\u0001@\u0001@\u0005@\u01ad\b@\n@\f@\u01b0\t@\u0001"+ + "@\u0004@\u01b3\b@\u000b@\f@\u01b4\u0003@\u01b7\b@\u0001A\u0001A\u0001"+ + "B\u0001B\u0001C\u0003C\u01be\bC\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0000\u0000I\u0002\u0001\u0004\u0000\u0006\u0002"+ + "\b\u0003\n\u0004\f\u0005\u000e\u0006\u0010\u0007\u0012\b\u0014\t\u0016"+ + "\n\u0018\u000b\u001a\f\u001c\r\u001e\u000e \u000f\"\u0010$\u0011&\u0012"+ + "(\u0013*\u0014,\u0015.\u00160\u00172\u00184\u00196\u001a8\u001b:\u001c"+ + "<\u001d>\u001e@\u001fB D!F\"H#J$L%N&P\'R(T)V*X+Z,\\-^.`/b0d1f2h3j4l5n"+ + "6p7r8t9v:x;z<|\u0000~\u0000\u0080\u0000\u0082\u0000\u0084\u0000\u0086"+ + "\u0000\u0088\u0000\u008a\u0000\u008c=\u008e>\u0090?\u0092\u0000\u0002"+ + "\u0000\u0001\f\u0003\u0000\n\n\r\r\u2028\u2029\u0003\u0000\t\n\r\r \u0002"+ + "\u0000$$__\u0002\u0000\n\n\'\'\u0002\u0000\n\n\"\"\u0002\u0000LLll\u0003"+ + "\u000009AFaf\u0001\u000009\u0002\u0000++--\u0004\u0000DDFFddff\u0293\u0000"+ + "AZaz\u00aa\u00aa\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8"+ + "\u02c1\u02c6\u02d1\u02e0\u02e4\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376"+ + "\u0377\u037a\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c\u038e"+ + "\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0559\u0559\u0560"+ + "\u0588\u05d0\u05ea\u05ef\u05f2\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5"+ + "\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712"+ + "\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800"+ + "\u0815\u081a\u081a\u0824\u0824\u0828\u0828\u0840\u0858\u0860\u086a\u0870"+ + "\u0887\u0889\u088e\u08a0\u08c9\u0904\u0939\u093d\u093d\u0950\u0950\u0958"+ + "\u0961\u0971\u0980\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2"+ + "\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0"+ + "\u09f1\u09fc\u09fc\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32"+ + "\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85"+ + "\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd"+ + "\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13"+ + "\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f"+ + "\u0b61\u0b71\u0b71\u0b83\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99"+ + "\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0"+ + "\u0bd0\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58"+ + "\u0c5a\u0c5d\u0c5d\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92"+ + "\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1"+ + "\u0cf2\u0d04\u0d0c\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54"+ + "\u0d56\u0d5f\u0d61\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd"+ + "\u0dbd\u0dc0\u0dc6\u0e01\u0e30\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84"+ + "\u0e84\u0e86\u0e8a\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd"+ + "\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49"+ + "\u0f6c\u0f88\u0f8c\u1000\u102a\u103f\u103f\u1050\u1055\u105a\u105d\u1061"+ + "\u1061\u1065\u1066\u106e\u1070\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7"+ + "\u10c7\u10cd\u10cd\u10d0\u10fa\u10fc\u1248\u124a\u124d\u1250\u1256\u1258"+ + "\u1258\u125a\u125d\u1260\u1288\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8"+ + "\u12be\u12c0\u12c0\u12c2\u12c5\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318"+ + "\u135a\u1380\u138f\u13a0\u13f5\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681"+ + "\u169a\u16a0\u16ea\u16f1\u16f8\u1700\u1711\u171f\u1731\u1740\u1751\u1760"+ + "\u176c\u176e\u1770\u1780\u17b3\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880"+ + "\u1884\u1887\u18a8\u18aa\u18aa\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970"+ + "\u1974\u1980\u19ab\u19b0\u19c9\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05"+ + "\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d"+ + "\u1c4f\u1c5a\u1c7d\u1c80\u1c88\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee"+ + "\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20"+ + "\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f"+ + "\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0"+ + "\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f"+ + "\u207f\u2090\u209c\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119"+ + "\u211d\u2124\u2124\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c"+ + "\u213f\u2145\u2149\u214e\u214e\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2"+ + "\u2cf3\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80"+ + "\u2d96\u2da0\u2da6\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8"+ + "\u2dce\u2dd0\u2dd6\u2dd8\u2dde\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b"+ + "\u303c\u3041\u3096\u309d\u309f\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131"+ + "\u318e\u31a0\u31bf\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0"+ + "\u8000\ua4fd\u8000\ua500\u8000\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a"+ + "\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0"+ + "\u8000\ua6e5\u8000\ua717\u8000\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b"+ + "\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5"+ + "\u8000\ua7d9\u8000\ua7f2\u8000\ua801\u8000\ua803\u8000\ua805\u8000\ua807"+ + "\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000\ua840\u8000\ua873\u8000\ua882"+ + "\u8000\ua8b3\u8000\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd"+ + "\u8000\ua8fe\u8000\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960"+ + "\u8000\ua97c\u8000\ua984\u8000\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0"+ + "\u8000\ua9e4\u8000\ua9e6\u8000\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00"+ + "\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60"+ + "\u8000\uaa76\u8000\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1"+ + "\u8000\uaab1\u8000\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0"+ + "\u8000\uaac0\u8000\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0"+ + "\u8000\uaaea\u8000\uaaf2\u8000\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09"+ + "\u8000\uab0e\u8000\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28"+ + "\u8000\uab2e\u8000\uab30\u8000\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70"+ + "\u8000\uabe2\u8000\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb"+ + "\u8000\ud7fb\u8000\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00"+ + "\u8000\ufb06\u8000\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f"+ + "\u8000\ufb28\u8000\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e"+ + "\u8000\ufb3e\u8000\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46"+ + "\u8000\ufbb1\u8000\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92"+ + "\u8000\ufdc7\u8000\ufdf0\u8000\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76"+ + "\u8000\ufefc\u8000\uff21\u8000\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66"+ + "\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2"+ + "\u8000\uffd7\u8000\uffda\u8000\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001"+ + "&\u8001(\u8001:\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080"+ + "\u8001\u00fa\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300"+ + "\u8001\u031f\u8001\u032d\u8001\u0340\u8001\u0342\u8001\u0349\u8001\u0350"+ + "\u8001\u0375\u8001\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8"+ + "\u8001\u03cf\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8"+ + "\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001\u0570"+ + "\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001\u0594"+ + "\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3"+ + "\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001\u0740"+ + "\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0780\u8001\u0785\u8001\u0787"+ + "\u8001\u07b0\u8001\u07b2\u8001\u07ba\u8001\u0800\u8001\u0805\u8001\u0808"+ + "\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001\u083c"+ + "\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001\u0880"+ + "\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900"+ + "\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001\u09be"+ + "\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15"+ + "\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80"+ + "\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00"+ + "\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80"+ + "\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0"+ + "\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0"+ + "\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30"+ + "\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0"+ + "\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001\u1075"+ + "\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103"+ + "\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001\u1150"+ + "\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1"+ + "\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200"+ + "\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001\u1240\u8001\u1280"+ + "\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d\u8001\u128f"+ + "\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001\u1305"+ + "\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328\u8001\u132a"+ + "\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339\u8001\u133d"+ + "\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361\u8001\u1400"+ + "\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461\u8001\u1480"+ + "\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001\u1580"+ + "\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f\u8001\u1644"+ + "\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001\u1700"+ + "\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b\u8001\u18a0"+ + "\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909\u8001\u190c"+ + "\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f\u8001\u193f"+ + "\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001\u19aa"+ + "\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001\u1a00"+ + "\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001\u1a50"+ + "\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001\u1ab0"+ + "\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001\u1c40"+ + "\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001\u1d08"+ + "\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001\u1d60"+ + "\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001\u1d98"+ + "\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001\u1f04"+ + "\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001\u2000"+ + "\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000"+ + "\u8001\u342f\u8001\u3441\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800"+ + "\u8001\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0"+ + "\u8001\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63"+ + "\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00"+ + "\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0"+ + "\u8001\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800"+ + "\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5"+ + "\u8001\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub132"+ + "\u8001\ub132\u8001\ub150\u8001\ub152\u8001\ub155\u8001\ub155\u8001\ub164"+ + "\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001\ubc6a\u8001\ubc70"+ + "\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001\ubc99\u8001\ud400"+ + "\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001\ud49f\u8001\ud4a2"+ + "\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001\ud4ac\u8001\ud4ae"+ + "\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001\ud4c3\u8001\ud4c5"+ + "\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001\ud514\u8001\ud516"+ + "\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001\ud53e\u8001\ud540"+ + "\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001\ud550\u8001\ud552"+ + "\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001\ud6da\u8001\ud6dc"+ + "\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001\ud734\u8001\ud736"+ + "\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001\ud788\u8001\ud78a"+ + "\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001\ud7cb\u8001\udf00"+ + "\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001\ue030\u8001\ue06d\u8001\ue100"+ + "\u8001\ue12c\u8001\ue137\u8001\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290"+ + "\u8001\ue2ad\u8001\ue2c0\u8001\ue2eb\u8001\ue4d0\u8001\ue4eb\u8001\ue7e0"+ + "\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001\ue7f0"+ + "\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001\ue94b"+ + "\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f\u8001\uee21"+ + "\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27\u8001\uee29"+ + "\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39\u8001\uee3b"+ + "\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47\u8001\uee49"+ + "\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001\uee51"+ + "\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57\u8001\uee59"+ + "\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001\uee5f"+ + "\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64\u8001\uee67"+ + "\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77\u8001\uee79"+ + "\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89\u8001\uee8b"+ + "\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001\ueeab"+ + "\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub739\u8002\ub740"+ + "\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002\uf800"+ + "\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003\u23af\u0002\u0000"+ + "\n\n``\u01e6\u0000\u0002\u0001\u0000\u0000\u0000\u0000\u0006\u0001\u0000"+ + "\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000\u0000"+ + "\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000\u0000"+ + "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ + "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ + "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ + "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ + "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ + "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ + "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ + "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ + "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ + "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ + "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ + "@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000D\u0001"+ + "\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001\u0000\u0000"+ + "\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000\u0000\u0000"+ + "N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000R\u0001"+ + "\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001\u0000\u0000"+ + "\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000\u0000\u0000"+ + "\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000\u0000`\u0001"+ + "\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d\u0001\u0000\u0000"+ + "\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000\u0000\u0000\u0000"+ + "j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000\u0000n\u0001"+ + "\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r\u0001\u0000\u0000"+ + "\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000\u0000\u0000\u0000"+ + "x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000\u0001\u008c\u0001"+ + "\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001"+ + "\u0000\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000\u0002\u0094\u0001"+ + "\u0000\u0000\u0000\u0004\u0099\u0001\u0000\u0000\u0000\u0006\u009c\u0001"+ + "\u0000\u0000\u0000\b\u00a2\u0001\u0000\u0000\u0000\n\u00a5\u0001\u0000"+ + "\u0000\u0000\f\u00a7\u0001\u0000\u0000\u0000\u000e\u00aa\u0001\u0000\u0000"+ + "\u0000\u0010\u00ac\u0001\u0000\u0000\u0000\u0012\u00ae\u0001\u0000\u0000"+ + "\u0000\u0014\u00b0\u0001\u0000\u0000\u0000\u0016\u00b2\u0001\u0000\u0000"+ + "\u0000\u0018\u00b4\u0001\u0000\u0000\u0000\u001a\u00b6\u0001\u0000\u0000"+ + "\u0000\u001c\u00b8\u0001\u0000\u0000\u0000\u001e\u00ba\u0001\u0000\u0000"+ + "\u0000 \u00bc\u0001\u0000\u0000\u0000\"\u00be\u0001\u0000\u0000\u0000"+ + "$\u00c0\u0001\u0000\u0000\u0000&\u00c2\u0001\u0000\u0000\u0000(\u00c4"+ + "\u0001\u0000\u0000\u0000*\u00c7\u0001\u0000\u0000\u0000,\u00c9\u0001\u0000"+ + "\u0000\u0000.\u00cc\u0001\u0000\u0000\u00000\u00cf\u0001\u0000\u0000\u0000"+ + "2\u00d1\u0001\u0000\u0000\u00004\u00d4\u0001\u0000\u0000\u00006\u00d6"+ + "\u0001\u0000\u0000\u00008\u00d9\u0001\u0000\u0000\u0000:\u00db\u0001\u0000"+ + "\u0000\u0000<\u00de\u0001\u0000\u0000\u0000>\u00e1\u0001\u0000\u0000\u0000"+ + "@\u00e4\u0001\u0000\u0000\u0000B\u00e7\u0001\u0000\u0000\u0000D\u00e9"+ + "\u0001\u0000\u0000\u0000F\u00ec\u0001\u0000\u0000\u0000H\u00ef\u0001\u0000"+ + "\u0000\u0000J\u00f1\u0001\u0000\u0000\u0000L\u00f4\u0001\u0000\u0000\u0000"+ + "N\u00f6\u0001\u0000\u0000\u0000P\u00fb\u0001\u0000\u0000\u0000R\u0100"+ + "\u0001\u0000\u0000\u0000T\u0104\u0001\u0000\u0000\u0000V\u0107\u0001\u0000"+ + "\u0000\u0000X\u010b\u0001\u0000\u0000\u0000Z\u0110\u0001\u0000\u0000\u0000"+ + "\\\u0116\u0001\u0000\u0000\u0000^\u011a\u0001\u0000\u0000\u0000`\u011f"+ + "\u0001\u0000\u0000\u0000b\u0121\u0001\u0000\u0000\u0000d\u0129\u0001\u0000"+ + "\u0000\u0000f\u012c\u0001\u0000\u0000\u0000h\u012f\u0001\u0000\u0000\u0000"+ + "j\u0132\u0001\u0000\u0000\u0000l\u0135\u0001\u0000\u0000\u0000n\u0138"+ + "\u0001\u0000\u0000\u0000p\u013d\u0001\u0000\u0000\u0000r\u0174\u0001\u0000"+ + "\u0000\u0000t\u0177\u0001\u0000\u0000\u0000v\u0180\u0001\u0000\u0000\u0000"+ + "x\u0182\u0001\u0000\u0000\u0000z\u018d\u0001\u0000\u0000\u0000|\u0198"+ + "\u0001\u0000\u0000\u0000~\u019a\u0001\u0000\u0000\u0000\u0080\u019c\u0001"+ + "\u0000\u0000\u0000\u0082\u01b6\u0001\u0000\u0000\u0000\u0084\u01b8\u0001"+ + "\u0000\u0000\u0000\u0086\u01ba\u0001\u0000\u0000\u0000\u0088\u01bd\u0001"+ + "\u0000\u0000\u0000\u008a\u01bf\u0001\u0000\u0000\u0000\u008c\u01c1\u0001"+ + "\u0000\u0000\u0000\u008e\u01c4\u0001\u0000\u0000\u0000\u0090\u01cb\u0001"+ + "\u0000\u0000\u0000\u0092\u01cd\u0001\u0000\u0000\u0000\u0094\u0095\u0005"+ + ";\u0000\u0000\u0095\u0003\u0001\u0000\u0000\u0000\u0096\u0097\u0005\r"+ + "\u0000\u0000\u0097\u009a\u0005\n\u0000\u0000\u0098\u009a\u0007\u0000\u0000"+ + "\u0000\u0099\u0096\u0001\u0000\u0000\u0000\u0099\u0098\u0001\u0000\u0000"+ + "\u0000\u009a\u0005\u0001\u0000\u0000\u0000\u009b\u009d\u0007\u0001\u0000"+ + "\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009d\u009e\u0001\u0000\u0000"+ + "\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009e\u009f\u0001\u0000\u0000"+ + "\u0000\u009f\u00a0\u0001\u0000\u0000\u0000\u00a0\u00a1\u0006\u0002\u0000"+ + "\u0000\u00a1\u0007\u0001\u0000\u0000\u0000\u00a2\u00a3\u0005+\u0000\u0000"+ + "\u00a3\u00a4\u0005+\u0000\u0000\u00a4\t\u0001\u0000\u0000\u0000\u00a5"+ + "\u00a6\u0005+\u0000\u0000\u00a6\u000b\u0001\u0000\u0000\u0000\u00a7\u00a8"+ + "\u0005-\u0000\u0000\u00a8\u00a9\u0005-\u0000\u0000\u00a9\r\u0001\u0000"+ + "\u0000\u0000\u00aa\u00ab\u0005-\u0000\u0000\u00ab\u000f\u0001\u0000\u0000"+ + "\u0000\u00ac\u00ad\u0005:\u0000\u0000\u00ad\u0011\u0001\u0000\u0000\u0000"+ + "\u00ae\u00af\u0005.\u0000\u0000\u00af\u0013\u0001\u0000\u0000\u0000\u00b0"+ + "\u00b1\u0005,\u0000\u0000\u00b1\u0015\u0001\u0000\u0000\u0000\u00b2\u00b3"+ + "\u0005*\u0000\u0000\u00b3\u0017\u0001\u0000\u0000\u0000\u00b4\u00b5\u0005"+ + "/\u0000\u0000\u00b5\u0019\u0001\u0000\u0000\u0000\u00b6\u00b7\u0005%\u0000"+ + "\u0000\u00b7\u001b\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005(\u0000\u0000"+ + "\u00b9\u001d\u0001\u0000\u0000\u0000\u00ba\u00bb\u0005)\u0000\u0000\u00bb"+ + "\u001f\u0001\u0000\u0000\u0000\u00bc\u00bd\u0005[\u0000\u0000\u00bd!\u0001"+ + "\u0000\u0000\u0000\u00be\u00bf\u0005]\u0000\u0000\u00bf#\u0001\u0000\u0000"+ + "\u0000\u00c0\u00c1\u0005#\u0000\u0000\u00c1%\u0001\u0000\u0000\u0000\u00c2"+ + "\u00c3\u0005@\u0000\u0000\u00c3\'\u0001\u0000\u0000\u0000\u00c4\u00c5"+ + "\u0005^\u0000\u0000\u00c5\u00c6\u0005[\u0000\u0000\u00c6)\u0001\u0000"+ + "\u0000\u0000\u00c7\u00c8\u0005^\u0000\u0000\u00c8+\u0001\u0000\u0000\u0000"+ + "\u00c9\u00ca\u0005!\u0000\u0000\u00ca\u00cb\u0005=\u0000\u0000\u00cb-"+ + "\u0001\u0000\u0000\u0000\u00cc\u00cd\u0005!\u0000\u0000\u00cd\u00ce\u0005"+ + "[\u0000\u0000\u00ce/\u0001\u0000\u0000\u0000\u00cf\u00d0\u0005!\u0000"+ + "\u0000\u00d01\u0001\u0000\u0000\u0000\u00d1\u00d2\u0005=\u0000\u0000\u00d2"+ + "\u00d3\u0005=\u0000\u0000\u00d33\u0001\u0000\u0000\u0000\u00d4\u00d5\u0005"+ + "=\u0000\u0000\u00d55\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005&\u0000"+ + "\u0000\u00d7\u00d8\u0005&\u0000\u0000\u00d87\u0001\u0000\u0000\u0000\u00d9"+ + "\u00da\u0005&\u0000\u0000\u00da9\u0001\u0000\u0000\u0000\u00db\u00dc\u0005"+ + "|\u0000\u0000\u00dc\u00dd\u0005|\u0000\u0000\u00dd;\u0001\u0000\u0000"+ + "\u0000\u00de\u00df\u0005?\u0000\u0000\u00df\u00e0\u0005[\u0000\u0000\u00e0"+ + "=\u0001\u0000\u0000\u0000\u00e1\u00e2\u0005?\u0000\u0000\u00e2\u00e3\u0005"+ + ":\u0000\u0000\u00e3?\u0001\u0000\u0000\u0000\u00e4\u00e5\u0005?\u0000"+ + "\u0000\u00e5\u00e6\u0005.\u0000\u0000\u00e6A\u0001\u0000\u0000\u0000\u00e7"+ + "\u00e8\u0005?\u0000\u0000\u00e8C\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005"+ + "$\u0000\u0000\u00ea\u00eb\u0005[\u0000\u0000\u00ebE\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ed\u0005>\u0000\u0000\u00ed\u00ee\u0005=\u0000\u0000\u00ee"+ + "G\u0001\u0000\u0000\u0000\u00ef\u00f0\u0005>\u0000\u0000\u00f0I\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f2\u0005<\u0000\u0000\u00f2\u00f3\u0005=\u0000"+ + "\u0000\u00f3K\u0001\u0000\u0000\u0000\u00f4\u00f5\u0005<\u0000\u0000\u00f5"+ + "M\u0001\u0000\u0000\u0000\u00f6\u00f7\u0005{\u0000\u0000\u00f7\u00f8\u0006"+ + "&\u0001\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9\u00fa\u0006&\u0002"+ + "\u0000\u00faO\u0001\u0000\u0000\u0000\u00fb\u00fc\u0005}\u0000\u0000\u00fc"+ + "\u00fd\u0006\'\u0003\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u00ff"+ + "\u0006\'\u0004\u0000\u00ffQ\u0001\u0000\u0000\u0000\u0100\u0101\u0005"+ + "`\u0000\u0000\u0101\u0102\u0001\u0000\u0000\u0000\u0102\u0103\u0006(\u0005"+ + "\u0000\u0103S\u0001\u0000\u0000\u0000\u0104\u0105\u0005o\u0000\u0000\u0105"+ + "\u0106\u0005r\u0000\u0000\u0106U\u0001\u0000\u0000\u0000\u0107\u0108\u0005"+ + "a\u0000\u0000\u0108\u0109\u0005n\u0000\u0000\u0109\u010a\u0005d\u0000"+ + "\u0000\u010aW\u0001\u0000\u0000\u0000\u010b\u010c\u0005t\u0000\u0000\u010c"+ + "\u010d\u0005r\u0000\u0000\u010d\u010e\u0005u\u0000\u0000\u010e\u010f\u0005"+ + "e\u0000\u0000\u010fY\u0001\u0000\u0000\u0000\u0110\u0111\u0005f\u0000"+ + "\u0000\u0111\u0112\u0005a\u0000\u0000\u0112\u0113\u0005l\u0000\u0000\u0113"+ + "\u0114\u0005s\u0000\u0000\u0114\u0115\u0005e\u0000\u0000\u0115[\u0001"+ + "\u0000\u0000\u0000\u0116\u0117\u0005n\u0000\u0000\u0117\u0118\u0005e\u0000"+ + "\u0000\u0118\u0119\u0005w\u0000\u0000\u0119]\u0001\u0000\u0000\u0000\u011a"+ + "\u011b\u0005n\u0000\u0000\u011b\u011c\u0005u\u0000\u0000\u011c\u011d\u0005"+ + "l\u0000\u0000\u011d\u011e\u0005l\u0000\u0000\u011e_\u0001\u0000\u0000"+ + "\u0000\u011f\u0120\u0005T\u0000\u0000\u0120a\u0001\u0000\u0000\u0000\u0121"+ + "\u0122\u0005m\u0000\u0000\u0122\u0123\u0005a\u0000\u0000\u0123\u0124\u0005"+ + "t\u0000\u0000\u0124\u0125\u0005c\u0000\u0000\u0125\u0126\u0005h\u0000"+ + "\u0000\u0126\u0127\u0005e\u0000\u0000\u0127\u0128\u0005s\u0000\u0000\u0128"+ + "c\u0001\u0000\u0000\u0000\u0129\u012a\u0005g\u0000\u0000\u012a\u012b\u0005"+ + "t\u0000\u0000\u012be\u0001\u0000\u0000\u0000\u012c\u012d\u0005g\u0000"+ + "\u0000\u012d\u012e\u0005e\u0000\u0000\u012eg\u0001\u0000\u0000\u0000\u012f"+ + "\u0130\u0005l\u0000\u0000\u0130\u0131\u0005e\u0000\u0000\u0131i\u0001"+ + "\u0000\u0000\u0000\u0132\u0133\u0005l\u0000\u0000\u0133\u0134\u0005t\u0000"+ + "\u0000\u0134k\u0001\u0000\u0000\u0000\u0135\u0136\u0005e\u0000\u0000\u0136"+ + "\u0137\u0005q\u0000\u0000\u0137m\u0001\u0000\u0000\u0000\u0138\u0139\u0005"+ + "n\u0000\u0000\u0139\u013a\u0005e\u0000\u0000\u013ao\u0001\u0000\u0000"+ + "\u0000\u013b\u013e\u0003\u0088C\u0000\u013c\u013e\u0005_\u0000\u0000\u013d"+ + "\u013b\u0001\u0000\u0000\u0000\u013d\u013c\u0001\u0000\u0000\u0000\u013e"+ + "\u0144\u0001\u0000\u0000\u0000\u013f\u0143\u0003\u0088C\u0000\u0140\u0143"+ + "\u0003\u008aD\u0000\u0141\u0143\u0007\u0002\u0000\u0000\u0142\u013f\u0001"+ + "\u0000\u0000\u0000\u0142\u0140\u0001\u0000\u0000\u0000\u0142\u0141\u0001"+ + "\u0000\u0000\u0000\u0143\u0146\u0001\u0000\u0000\u0000\u0144\u0142\u0001"+ + "\u0000\u0000\u0000\u0144\u0145\u0001\u0000\u0000\u0000\u0145q\u0001\u0000"+ + "\u0000\u0000\u0146\u0144\u0001\u0000\u0000\u0000\u0147\u0149\u0005.\u0000"+ + "\u0000\u0148\u014a\u0003\u0080?\u0000\u0149\u0148\u0001\u0000\u0000\u0000"+ + "\u014a\u014b\u0001\u0000\u0000\u0000\u014b\u0149\u0001\u0000\u0000\u0000"+ + "\u014b\u014c\u0001\u0000\u0000\u0000\u014c\u014e\u0001\u0000\u0000\u0000"+ + "\u014d\u014f\u0003\u0082@\u0000\u014e\u014d\u0001\u0000\u0000\u0000\u014e"+ + "\u014f\u0001\u0000\u0000\u0000\u014f\u0151\u0001\u0000\u0000\u0000\u0150"+ + "\u0152\u0003\u0086B\u0000\u0151\u0150\u0001\u0000\u0000\u0000\u0151\u0152"+ + "\u0001\u0000\u0000\u0000\u0152\u0175\u0001\u0000\u0000\u0000\u0153\u0155"+ + "\u0003\u0080?\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0155\u0156\u0001"+ + "\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001"+ + "\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158\u015a\u0005"+ + ".\u0000\u0000\u0159\u015b\u0003\u0080?\u0000\u015a\u0159\u0001\u0000\u0000"+ + "\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c\u015a\u0001\u0000\u0000"+ + "\u0000\u015c\u015d\u0001\u0000\u0000\u0000\u015d\u015f\u0001\u0000\u0000"+ + "\u0000\u015e\u0160\u0003\u0082@\u0000\u015f\u015e\u0001\u0000\u0000\u0000"+ + "\u015f\u0160\u0001\u0000\u0000\u0000\u0160\u0162\u0001\u0000\u0000\u0000"+ + "\u0161\u0163\u0003\u0086B\u0000\u0162\u0161\u0001\u0000\u0000\u0000\u0162"+ + "\u0163\u0001\u0000\u0000\u0000\u0163\u0175\u0001\u0000\u0000\u0000\u0164"+ + "\u0166\u0003\u0080?\u0000\u0165\u0164\u0001\u0000\u0000\u0000\u0166\u0167"+ + "\u0001\u0000\u0000\u0000\u0167\u0165\u0001\u0000\u0000\u0000\u0167\u0168"+ + "\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000\u0000\u0169\u016b"+ + "\u0003\u0082@\u0000\u016a\u016c\u0003\u0086B\u0000\u016b\u016a\u0001\u0000"+ + "\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c\u0175\u0001\u0000"+ + "\u0000\u0000\u016d\u016f\u0003\u0080?\u0000\u016e\u016d\u0001\u0000\u0000"+ + "\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170\u016e\u0001\u0000\u0000"+ + "\u0000\u0170\u0171\u0001\u0000\u0000\u0000\u0171\u0172\u0001\u0000\u0000"+ + "\u0000\u0172\u0173\u0003\u0086B\u0000\u0173\u0175\u0001\u0000\u0000\u0000"+ + "\u0174\u0147\u0001\u0000\u0000\u0000\u0174\u0154\u0001\u0000\u0000\u0000"+ + "\u0174\u0165\u0001\u0000\u0000\u0000\u0174\u016e\u0001\u0000\u0000\u0000"+ + "\u0175s\u0001\u0000\u0000\u0000\u0176\u0178\u0003\u0080?\u0000\u0177\u0176"+ + "\u0001\u0000\u0000\u0000\u0178\u0179\u0001\u0000\u0000\u0000\u0179\u0177"+ + "\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000\u0000\u0000\u017a\u017c"+ + "\u0001\u0000\u0000\u0000\u017b\u017d\u0003|=\u0000\u017c\u017b\u0001\u0000"+ + "\u0000\u0000\u017c\u017d\u0001\u0000\u0000\u0000\u017du\u0001\u0000\u0000"+ + "\u0000\u017e\u0181\u0003x;\u0000\u017f\u0181\u0003z<\u0000\u0180\u017e"+ + "\u0001\u0000\u0000\u0000\u0180\u017f\u0001\u0000\u0000\u0000\u0181w\u0001"+ + "\u0000\u0000\u0000\u0182\u0188\u0005\'\u0000\u0000\u0183\u0184\u0005\'"+ + "\u0000\u0000\u0184\u0187\u0005\'\u0000\u0000\u0185\u0187\b\u0003\u0000"+ + "\u0000\u0186\u0183\u0001\u0000\u0000\u0000\u0186\u0185\u0001\u0000\u0000"+ + "\u0000\u0187\u018a\u0001\u0000\u0000\u0000\u0188\u0186\u0001\u0000\u0000"+ + "\u0000\u0188\u0189\u0001\u0000\u0000\u0000\u0189\u018b\u0001\u0000\u0000"+ + "\u0000\u018a\u0188\u0001\u0000\u0000\u0000\u018b\u018c\u0005\'\u0000\u0000"+ + "\u018cy\u0001\u0000\u0000\u0000\u018d\u0193\u0005\"\u0000\u0000\u018e"+ + "\u018f\u0005\"\u0000\u0000\u018f\u0192\u0005\"\u0000\u0000\u0190\u0192"+ + "\b\u0004\u0000\u0000\u0191\u018e\u0001\u0000\u0000\u0000\u0191\u0190\u0001"+ + "\u0000\u0000\u0000\u0192\u0195\u0001\u0000\u0000\u0000\u0193\u0191\u0001"+ + "\u0000\u0000\u0000\u0193\u0194\u0001\u0000\u0000\u0000\u0194\u0196\u0001"+ + "\u0000\u0000\u0000\u0195\u0193\u0001\u0000\u0000\u0000\u0196\u0197\u0005"+ + "\"\u0000\u0000\u0197{\u0001\u0000\u0000\u0000\u0198\u0199\u0007\u0005"+ + "\u0000\u0000\u0199}\u0001\u0000\u0000\u0000\u019a\u019b\u0007\u0006\u0000"+ + "\u0000\u019b\u007f\u0001\u0000\u0000\u0000\u019c\u019d\u0007\u0007\u0000"+ + "\u0000\u019d\u0081\u0001\u0000\u0000\u0000\u019e\u01a2\u0005e\u0000\u0000"+ + "\u019f\u01a1\u0003\u0084A\u0000\u01a0\u019f\u0001\u0000\u0000\u0000\u01a1"+ + "\u01a4\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2"+ + "\u01a3\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4"+ + "\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a7\u0003\u0080?\u0000\u01a6\u01a5"+ + "\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a6"+ + "\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01b7"+ + "\u0001\u0000\u0000\u0000\u01aa\u01ae\u0005E\u0000\u0000\u01ab\u01ad\u0003"+ + "\u0084A\u0000\u01ac\u01ab\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001\u0000"+ + "\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001\u0000"+ + "\u0000\u0000\u01af\u01b2\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001\u0000"+ + "\u0000\u0000\u01b1\u01b3\u0003\u0080?\u0000\u01b2\u01b1\u0001\u0000\u0000"+ + "\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000"+ + "\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7\u0001\u0000\u0000"+ + "\u0000\u01b6\u019e\u0001\u0000\u0000\u0000\u01b6\u01aa\u0001\u0000\u0000"+ + "\u0000\u01b7\u0083\u0001\u0000\u0000\u0000\u01b8\u01b9\u0007\b\u0000\u0000"+ + "\u01b9\u0085\u0001\u0000\u0000\u0000\u01ba\u01bb\u0007\t\u0000\u0000\u01bb"+ + "\u0087\u0001\u0000\u0000\u0000\u01bc\u01be\u0007\n\u0000\u0000\u01bd\u01bc"+ + "\u0001\u0000\u0000\u0000\u01be\u0089\u0001\u0000\u0000\u0000\u01bf\u01c0"+ + "\u0007\u0007\u0000\u0000\u01c0\u008b\u0001\u0000\u0000\u0000\u01c1\u01c2"+ + "\u0005`\u0000\u0000\u01c2\u01c3\u0005`\u0000\u0000\u01c3\u008d\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c5\u0005#\u0000\u0000\u01c5\u01c6\u0005{\u0000\u0000"+ + "\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8\u0006F\u0006\u0000\u01c8"+ + "\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0006F\u0002\u0000\u01ca\u008f"+ + "\u0001\u0000\u0000\u0000\u01cb\u01cc\b\u000b\u0000\u0000\u01cc\u0091\u0001"+ + "\u0000\u0000\u0000\u01cd\u01ce\u0005`\u0000\u0000\u01ce\u01cf\u0001\u0000"+ + "\u0000\u0000\u01cf\u01d0\u0006H\u0007\u0000\u01d0\u01d1\u0006H\u0004\u0000"+ + "\u01d1\u0093\u0001\u0000\u0000\u0000\u001f\u0000\u0001\u0099\u009e\u013d"+ + "\u0142\u0144\u014b\u014e\u0151\u0156\u015c\u015f\u0162\u0167\u016b\u0170"+ + "\u0174\u0179\u017c\u0180\u0186\u0188\u0191\u0193\u01a2\u01a8\u01ae\u01b4"+ + "\u01b6\u01bd\b\u0000\u0001\u0000\u0001&\u0000\u0005\u0000\u0000\u0001"+ + "\'\u0001\u0004\u0000\u0000\u0005\u0001\u0000\u0001F\u0002\u0007(\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParser.java b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParser.java index 8fcd70898..c832e2432 100644 --- a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParser.java +++ b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParser.java @@ -37,24 +37,26 @@ public class SpelParser extends Parser { LE=36, LT=37, LCURLY=38, RCURLY=39, BACKTICK=40, OR=41, AND=42, TRUE=43, FALSE=44, NEW=45, NULL=46, T=47, MATCHES=48, GT_KEYWORD=49, GE_KEYWORD=50, LE_KEYWORD=51, LT_KEYWORD=52, EQ_KEYWORD=53, NE_KEYWORD=54, IDENTIFIER=55, - NUMERIC_LITERAL=56, REAL_LITERAL=57, INTEGER_LITERAL=58, STRING_LITERAL=59, - SINGLE_QUOTED_STRING=60, DOUBLE_QUOTED_STRING=61, ESCAPED_BACKTICK=62, - SPEL_IN_TEMPLATE_STRING_OPEN=63, TEMPLATE_TEXT=64; + REAL_LITERAL=56, INTEGER_LITERAL=57, STRING_LITERAL=58, SINGLE_QUOTED_STRING=59, + DOUBLE_QUOTED_STRING=60, ESCAPED_BACKTICK=61, SPEL_IN_TEMPLATE_STRING_OPEN=62, + TEMPLATE_TEXT=63; public static final int RULE_script = 0, RULE_spelExpr = 1, RULE_node = 2, RULE_nonDottedNode = 3, RULE_dottedNode = 4, RULE_functionOrVar = 5, RULE_methodArgs = 6, RULE_args = 7, RULE_methodOrProperty = 8, RULE_projection = 9, RULE_selection = 10, RULE_startNode = 11, - RULE_literal = 12, RULE_parenspelExpr = 13, RULE_typeReference = 14, RULE_possiblyQualifiedId = 15, - RULE_nullReference = 16, RULE_constructorReference = 17, RULE_constructorArgs = 18, - RULE_inlineListOrMap = 19, RULE_listBindings = 20, RULE_listBinding = 21, - RULE_mapBindings = 22, RULE_mapBinding = 23, RULE_beanReference = 24; + RULE_literal = 12, RULE_numericLiteral = 13, RULE_parenspelExpr = 14, + RULE_typeReference = 15, RULE_possiblyQualifiedId = 16, RULE_nullReference = 17, + RULE_constructorReference = 18, RULE_constructorArgs = 19, RULE_inlineListOrMap = 20, + RULE_listBindings = 21, RULE_listBinding = 22, RULE_mapBindings = 23, + RULE_mapBinding = 24, RULE_beanReference = 25, RULE_inputParameter = 26; private static String[] makeRuleNames() { return new String[] { "script", "spelExpr", "node", "nonDottedNode", "dottedNode", "functionOrVar", "methodArgs", "args", "methodOrProperty", "projection", "selection", - "startNode", "literal", "parenspelExpr", "typeReference", "possiblyQualifiedId", - "nullReference", "constructorReference", "constructorArgs", "inlineListOrMap", - "listBindings", "listBinding", "mapBindings", "mapBinding", "beanReference" + "startNode", "literal", "numericLiteral", "parenspelExpr", "typeReference", + "possiblyQualifiedId", "nullReference", "constructorReference", "constructorArgs", + "inlineListOrMap", "listBindings", "listBinding", "mapBindings", "mapBinding", + "beanReference", "inputParameter" }; } public static final String[] ruleNames = makeRuleNames(); @@ -67,7 +69,7 @@ public class SpelParser extends Parser { "'?:'", "'?.'", "'?'", "'$['", "'>='", "'>'", "'<='", "'<'", null, null, null, "'or'", "'and'", "'true'", "'false'", "'new'", "'null'", "'T'", "'matches'", "'gt'", "'ge'", "'le'", "'lt'", "'eq'", "'ne'", null, null, - null, null, null, null, null, "'``'" + null, null, null, null, "'``'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -80,9 +82,9 @@ public class SpelParser extends Parser { "ELVIS", "SAFE_NAVI", "QMARK", "SELECT_LAST", "GE", "GT", "LE", "LT", "LCURLY", "RCURLY", "BACKTICK", "OR", "AND", "TRUE", "FALSE", "NEW", "NULL", "T", "MATCHES", "GT_KEYWORD", "GE_KEYWORD", "LE_KEYWORD", "LT_KEYWORD", - "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "NUMERIC_LITERAL", "REAL_LITERAL", - "INTEGER_LITERAL", "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", - "ESCAPED_BACKTICK", "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT" + "EQ_KEYWORD", "NE_KEYWORD", "IDENTIFIER", "REAL_LITERAL", "INTEGER_LITERAL", + "STRING_LITERAL", "SINGLE_QUOTED_STRING", "DOUBLE_QUOTED_STRING", "ESCAPED_BACKTICK", + "SPEL_IN_TEMPLATE_STRING_OPEN", "TEMPLATE_TEXT" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -162,9 +164,9 @@ public class SpelParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(50); + setState(54); spelExpr(0); - setState(51); + setState(55); match(EOF); } } @@ -256,7 +258,7 @@ public class SpelParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(63); + setState(67); _errHandler.sync(this); switch (_input.LA(1)) { case INC: @@ -265,7 +267,7 @@ public class SpelParser extends Parser { case MINUS: case NOT: { - setState(54); + setState(58); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8388728L) != 0)) ) { _errHandler.recoverInline(this); @@ -275,11 +277,12 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(55); + setState(59); spelExpr(13); } break; case LPAREN: + case LSQUARE: case HASH: case BEAN_REF: case SELECT_FIRST: @@ -294,24 +297,25 @@ public class SpelParser extends Parser { case NULL: case T: case IDENTIFIER: - case NUMERIC_LITERAL: + case REAL_LITERAL: + case INTEGER_LITERAL: case STRING_LITERAL: { - setState(56); - startNode(); setState(60); + startNode(); + setState(64); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(57); + setState(61); node(); } } } - setState(62); + setState(66); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } @@ -321,7 +325,7 @@ public class SpelParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(102); + setState(106); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -329,18 +333,18 @@ public class SpelParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(100); + setState(104); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(65); + setState(69); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(66); + setState(70); match(POWER); - setState(67); + setState(71); spelExpr(12); } break; @@ -348,9 +352,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(68); + setState(72); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(69); + setState(73); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7168L) != 0)) ) { _errHandler.recoverInline(this); @@ -360,7 +364,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(70); + setState(74); spelExpr(11); } break; @@ -368,9 +372,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(71); + setState(75); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(72); + setState(76); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -380,7 +384,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(73); + setState(77); spelExpr(10); } break; @@ -388,9 +392,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(74); + setState(78); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(75); + setState(79); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 35466104782454784L) != 0)) ) { _errHandler.recoverInline(this); @@ -400,7 +404,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(76); + setState(80); spelExpr(9); } break; @@ -408,9 +412,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(77); + setState(81); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(78); + setState(82); _la = _input.LA(1); if ( !(_la==SYMBOLIC_AND || _la==AND) ) { _errHandler.recoverInline(this); @@ -420,7 +424,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(79); + setState(83); spelExpr(8); } break; @@ -428,9 +432,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(80); + setState(84); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(81); + setState(85); _la = _input.LA(1); if ( !(_la==SYMBOLIC_OR || _la==OR) ) { _errHandler.recoverInline(this); @@ -440,7 +444,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(82); + setState(86); spelExpr(7); } break; @@ -448,11 +452,11 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(83); + setState(87); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(84); + setState(88); match(MATCHES); - setState(85); + setState(89); spelExpr(6); } break; @@ -460,11 +464,11 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(86); + setState(90); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(87); + setState(91); match(ASSIGN); - setState(88); + setState(92); spelExpr(5); } break; @@ -472,11 +476,11 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(89); + setState(93); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(90); + setState(94); match(ELVIS); - setState(91); + setState(95); spelExpr(4); } break; @@ -484,15 +488,15 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(92); - if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(93); - match(QMARK); - setState(94); - spelExpr(0); - setState(95); - match(COLON); setState(96); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(97); + match(QMARK); + setState(98); + spelExpr(0); + setState(99); + match(COLON); + setState(100); spelExpr(3); } break; @@ -500,9 +504,9 @@ public class SpelParser extends Parser { { _localctx = new SpelExprContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_spelExpr); - setState(98); + setState(102); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(99); + setState(103); _la = _input.LA(1); if ( !(_la==INC || _la==DEC) ) { _errHandler.recoverInline(this); @@ -517,7 +521,7 @@ public class SpelParser extends Parser { } } } - setState(104); + setState(108); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); } @@ -560,7 +564,7 @@ public class SpelParser extends Parser { NodeContext _localctx = new NodeContext(_ctx, getState()); enterRule(_localctx, 4, RULE_node); try { - setState(107); + setState(111); _errHandler.sync(this); switch (_input.LA(1)) { case DOT: @@ -572,14 +576,14 @@ public class SpelParser extends Parser { case SELECT_LAST: enterOuterAlt(_localctx, 1); { - setState(105); + setState(109); dottedNode(); } break; case LSQUARE: enterOuterAlt(_localctx, 2); { - setState(106); + setState(110); nonDottedNode(); } break; @@ -605,6 +609,9 @@ public class SpelParser extends Parser { return getRuleContext(SpelExprContext.class,0); } public TerminalNode RSQUARE() { return getToken(SpelParser.RSQUARE, 0); } + public InputParameterContext inputParameter() { + return getRuleContext(InputParameterContext.class,0); + } public NonDottedNodeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -623,16 +630,29 @@ public class SpelParser extends Parser { NonDottedNodeContext _localctx = new NonDottedNodeContext(_ctx, getState()); enterRule(_localctx, 6, RULE_nonDottedNode); try { - enterOuterAlt(_localctx, 1); - { - { - setState(109); - match(LSQUARE); - setState(110); - spelExpr(0); - setState(111); - match(RSQUARE); - } + setState(118); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + { + setState(113); + match(LSQUARE); + setState(114); + spelExpr(0); + setState(115); + match(RSQUARE); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(117); + inputParameter(); + } + break; } } catch (RecognitionException re) { @@ -681,14 +701,14 @@ public class SpelParser extends Parser { enterRule(_localctx, 8, RULE_dottedNode); int _la; try { - setState(118); + setState(125); _errHandler.sync(this); switch (_input.LA(1)) { case DOT: case SAFE_NAVI: enterOuterAlt(_localctx, 1); { - setState(113); + setState(120); _la = _input.LA(1); if ( !(_la==DOT || _la==SAFE_NAVI) ) { _errHandler.recoverInline(this); @@ -698,21 +718,21 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(114); + setState(121); methodOrProperty(); } break; case HASH: enterOuterAlt(_localctx, 2); { - setState(115); + setState(122); functionOrVar(); } break; case PROJECT: enterOuterAlt(_localctx, 3); { - setState(116); + setState(123); projection(); } break; @@ -721,7 +741,7 @@ public class SpelParser extends Parser { case SELECT_LAST: enterOuterAlt(_localctx, 4); { - setState(117); + setState(124); selection(); } break; @@ -765,26 +785,26 @@ public class SpelParser extends Parser { FunctionOrVarContext _localctx = new FunctionOrVarContext(_ctx, getState()); enterRule(_localctx, 10, RULE_functionOrVar); try { - setState(125); + setState(132); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(120); + setState(127); match(HASH); - setState(121); + setState(128); match(IDENTIFIER); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(122); + setState(129); match(HASH); - setState(123); + setState(130); match(IDENTIFIER); - setState(124); + setState(131); methodArgs(); } break; @@ -828,11 +848,11 @@ public class SpelParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(127); + setState(134); match(LPAREN); - setState(128); + setState(135); args(); - setState(129); + setState(136); match(RPAREN); } } @@ -880,29 +900,29 @@ public class SpelParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(132); + setState(139); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 684820106396442744L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 540704918320619640L) != 0)) { { - setState(131); + setState(138); spelExpr(0); } } - setState(138); + setState(145); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(134); + setState(141); match(COMMA); - setState(135); + setState(142); spelExpr(0); } } - setState(140); + setState(147); _errHandler.sync(this); _la = _input.LA(1); } @@ -943,22 +963,22 @@ public class SpelParser extends Parser { MethodOrPropertyContext _localctx = new MethodOrPropertyContext(_ctx, getState()); enterRule(_localctx, 16, RULE_methodOrProperty); try { - setState(144); + setState(151); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(141); + setState(148); match(IDENTIFIER); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(142); + setState(149); match(IDENTIFIER); - setState(143); + setState(150); methodArgs(); } break; @@ -1002,11 +1022,11 @@ public class SpelParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(146); + setState(153); match(PROJECT); - setState(147); + setState(154); spelExpr(0); - setState(148); + setState(155); match(RSQUARE); } } @@ -1051,7 +1071,7 @@ public class SpelParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(150); + setState(157); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 9127329792L) != 0)) ) { _errHandler.recoverInline(this); @@ -1061,9 +1081,9 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(151); + setState(158); spelExpr(0); - setState(152); + setState(159); match(RSQUARE); } } @@ -1113,6 +1133,9 @@ public class SpelParser extends Parser { public InlineListOrMapContext inlineListOrMap() { return getRuleContext(InlineListOrMapContext.class,0); } + public InputParameterContext inputParameter() { + return getRuleContext(InputParameterContext.class,0); + } public StartNodeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1131,58 +1154,59 @@ public class SpelParser extends Parser { StartNodeContext _localctx = new StartNodeContext(_ctx, getState()); enterRule(_localctx, 22, RULE_startNode); try { - setState(165); + setState(173); _errHandler.sync(this); switch (_input.LA(1)) { case TRUE: case FALSE: - case NUMERIC_LITERAL: + case REAL_LITERAL: + case INTEGER_LITERAL: case STRING_LITERAL: enterOuterAlt(_localctx, 1); { - setState(154); + setState(161); literal(); } break; case LPAREN: enterOuterAlt(_localctx, 2); { - setState(155); + setState(162); parenspelExpr(); } break; case T: enterOuterAlt(_localctx, 3); { - setState(156); + setState(163); typeReference(); } break; case NULL: enterOuterAlt(_localctx, 4); { - setState(157); + setState(164); nullReference(); } break; case NEW: enterOuterAlt(_localctx, 5); { - setState(158); + setState(165); constructorReference(); } break; case IDENTIFIER: enterOuterAlt(_localctx, 6); { - setState(159); + setState(166); methodOrProperty(); } break; case HASH: enterOuterAlt(_localctx, 7); { - setState(160); + setState(167); functionOrVar(); } break; @@ -1190,14 +1214,14 @@ public class SpelParser extends Parser { case FACTORY_BEAN_REF: enterOuterAlt(_localctx, 8); { - setState(161); + setState(168); beanReference(); } break; case PROJECT: enterOuterAlt(_localctx, 9); { - setState(162); + setState(169); projection(); } break; @@ -1206,17 +1230,24 @@ public class SpelParser extends Parser { case SELECT_LAST: enterOuterAlt(_localctx, 10); { - setState(163); + setState(170); selection(); } break; case LCURLY: enterOuterAlt(_localctx, 11); { - setState(164); + setState(171); inlineListOrMap(); } break; + case LSQUARE: + enterOuterAlt(_localctx, 12); + { + setState(172); + inputParameter(); + } + break; default: throw new NoViableAltException(this); } @@ -1234,7 +1265,9 @@ public class SpelParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class LiteralContext extends ParserRuleContext { - public TerminalNode NUMERIC_LITERAL() { return getToken(SpelParser.NUMERIC_LITERAL, 0); } + public NumericLiteralContext numericLiteral() { + return getRuleContext(NumericLiteralContext.class,0); + } public TerminalNode STRING_LITERAL() { return getToken(SpelParser.STRING_LITERAL, 0); } public TerminalNode TRUE() { return getToken(SpelParser.TRUE, 0); } public TerminalNode FALSE() { return getToken(SpelParser.FALSE, 0); } @@ -1255,13 +1288,82 @@ public class SpelParser extends Parser { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 24, RULE_literal); + try { + setState(179); + _errHandler.sync(this); + switch (_input.LA(1)) { + case REAL_LITERAL: + case INTEGER_LITERAL: + enterOuterAlt(_localctx, 1); + { + setState(175); + numericLiteral(); + } + break; + case STRING_LITERAL: + enterOuterAlt(_localctx, 2); + { + setState(176); + match(STRING_LITERAL); + } + break; + case TRUE: + enterOuterAlt(_localctx, 3); + { + setState(177); + match(TRUE); + } + break; + case FALSE: + enterOuterAlt(_localctx, 4); + { + setState(178); + match(FALSE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NumericLiteralContext extends ParserRuleContext { + public TerminalNode INTEGER_LITERAL() { return getToken(SpelParser.INTEGER_LITERAL, 0); } + public TerminalNode REAL_LITERAL() { return getToken(SpelParser.REAL_LITERAL, 0); } + public NumericLiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_numericLiteral; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SpelParserListener ) ((SpelParserListener)listener).enterNumericLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SpelParserListener ) ((SpelParserListener)listener).exitNumericLiteral(this); + } + } + + public final NumericLiteralContext numericLiteral() throws RecognitionException { + NumericLiteralContext _localctx = new NumericLiteralContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_numericLiteral); int _la; try { enterOuterAlt(_localctx, 1); { - setState(167); + setState(181); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 648544734620418048L) != 0)) ) { + if ( !(_la==REAL_LITERAL || _la==INTEGER_LITERAL) ) { _errHandler.recoverInline(this); } else { @@ -1305,15 +1407,15 @@ public class SpelParser extends Parser { public final ParenspelExprContext parenspelExpr() throws RecognitionException { ParenspelExprContext _localctx = new ParenspelExprContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_parenspelExpr); + enterRule(_localctx, 28, RULE_parenspelExpr); try { enterOuterAlt(_localctx, 1); { - setState(169); + setState(183); match(LPAREN); - setState(170); + setState(184); spelExpr(0); - setState(171); + setState(185); match(RPAREN); } } @@ -1360,34 +1462,34 @@ public class SpelParser extends Parser { public final TypeReferenceContext typeReference() throws RecognitionException { TypeReferenceContext _localctx = new TypeReferenceContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_typeReference); + enterRule(_localctx, 30, RULE_typeReference); int _la; try { enterOuterAlt(_localctx, 1); { - setState(173); + setState(187); match(T); - setState(174); + setState(188); match(LPAREN); - setState(175); + setState(189); possiblyQualifiedId(); - setState(180); + setState(194); _errHandler.sync(this); _la = _input.LA(1); while (_la==LSQUARE) { { { - setState(176); + setState(190); match(LSQUARE); - setState(177); + setState(191); match(RSQUARE); } } - setState(182); + setState(196); _errHandler.sync(this); _la = _input.LA(1); } - setState(183); + setState(197); match(RPAREN); } } @@ -1428,26 +1530,26 @@ public class SpelParser extends Parser { public final PossiblyQualifiedIdContext possiblyQualifiedId() throws RecognitionException { PossiblyQualifiedIdContext _localctx = new PossiblyQualifiedIdContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_possiblyQualifiedId); + enterRule(_localctx, 32, RULE_possiblyQualifiedId); int _la; try { enterOuterAlt(_localctx, 1); { - setState(185); + setState(199); match(IDENTIFIER); - setState(190); + setState(204); _errHandler.sync(this); _la = _input.LA(1); while (_la==DOT) { { { - setState(186); + setState(200); match(DOT); - setState(187); + setState(201); match(IDENTIFIER); } } - setState(192); + setState(206); _errHandler.sync(this); _la = _input.LA(1); } @@ -1483,11 +1585,11 @@ public class SpelParser extends Parser { public final NullReferenceContext nullReference() throws RecognitionException { NullReferenceContext _localctx = new NullReferenceContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_nullReference); + enterRule(_localctx, 34, RULE_nullReference); try { enterOuterAlt(_localctx, 1); { - setState(193); + setState(207); match(NULL); } } @@ -1544,21 +1646,21 @@ public class SpelParser extends Parser { public final ConstructorReferenceContext constructorReference() throws RecognitionException { ConstructorReferenceContext _localctx = new ConstructorReferenceContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_constructorReference); + enterRule(_localctx, 36, RULE_constructorReference); int _la; try { int _alt; - setState(213); + setState(227); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(195); + setState(209); match(NEW); - setState(196); + setState(210); possiblyQualifiedId(); - setState(202); + setState(216); _errHandler.sync(this); _alt = 1; do { @@ -1566,19 +1668,19 @@ public class SpelParser extends Parser { case 1: { { - setState(197); + setState(211); match(LSQUARE); - setState(199); + setState(213); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 684820106396442744L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 540704918320619640L) != 0)) { { - setState(198); + setState(212); spelExpr(0); } } - setState(201); + setState(215); match(RSQUARE); } } @@ -1586,16 +1688,16 @@ public class SpelParser extends Parser { default: throw new NoViableAltException(this); } - setState(204); + setState(218); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,14,_ctx); + _alt = getInterpreter().adaptivePredict(_input,16,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - setState(207); + setState(221); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: { - setState(206); + setState(220); inlineListOrMap(); } break; @@ -1605,11 +1707,11 @@ public class SpelParser extends Parser { case 2: enterOuterAlt(_localctx, 2); { - setState(209); + setState(223); match(NEW); - setState(210); + setState(224); possiblyQualifiedId(); - setState(211); + setState(225); constructorArgs(); } break; @@ -1649,15 +1751,15 @@ public class SpelParser extends Parser { public final ConstructorArgsContext constructorArgs() throws RecognitionException { ConstructorArgsContext _localctx = new ConstructorArgsContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_constructorArgs); + enterRule(_localctx, 38, RULE_constructorArgs); try { enterOuterAlt(_localctx, 1); { - setState(215); + setState(229); match(LPAREN); - setState(216); + setState(230); args(); - setState(217); + setState(231); match(RPAREN); } } @@ -1699,50 +1801,50 @@ public class SpelParser extends Parser { public final InlineListOrMapContext inlineListOrMap() throws RecognitionException { InlineListOrMapContext _localctx = new InlineListOrMapContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_inlineListOrMap); + enterRule(_localctx, 40, RULE_inlineListOrMap); try { - setState(232); + setState(246); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(219); + setState(233); match(LCURLY); - setState(220); + setState(234); match(RCURLY); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(221); + setState(235); match(LCURLY); - setState(222); + setState(236); match(COLON); - setState(223); + setState(237); match(RCURLY); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(224); + setState(238); match(LCURLY); - setState(225); + setState(239); listBindings(); - setState(226); + setState(240); match(RCURLY); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(228); + setState(242); match(LCURLY); - setState(229); + setState(243); mapBindings(); - setState(230); + setState(244); match(RCURLY); } break; @@ -1789,28 +1891,28 @@ public class SpelParser extends Parser { public final ListBindingsContext listBindings() throws RecognitionException { ListBindingsContext _localctx = new ListBindingsContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_listBindings); + enterRule(_localctx, 42, RULE_listBindings); int _la; try { enterOuterAlt(_localctx, 1); { - setState(234); + setState(248); ((ListBindingsContext)_localctx).listBinding = listBinding(); ((ListBindingsContext)_localctx).bindings.add(((ListBindingsContext)_localctx).listBinding); - setState(239); + setState(253); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(235); + setState(249); match(COMMA); - setState(236); + setState(250); ((ListBindingsContext)_localctx).listBinding = listBinding(); ((ListBindingsContext)_localctx).bindings.add(((ListBindingsContext)_localctx).listBinding); } } - setState(241); + setState(255); _errHandler.sync(this); _la = _input.LA(1); } @@ -1848,11 +1950,11 @@ public class SpelParser extends Parser { public final ListBindingContext listBinding() throws RecognitionException { ListBindingContext _localctx = new ListBindingContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_listBinding); + enterRule(_localctx, 44, RULE_listBinding); try { enterOuterAlt(_localctx, 1); { - setState(242); + setState(256); spelExpr(0); } } @@ -1897,28 +1999,28 @@ public class SpelParser extends Parser { public final MapBindingsContext mapBindings() throws RecognitionException { MapBindingsContext _localctx = new MapBindingsContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_mapBindings); + enterRule(_localctx, 46, RULE_mapBindings); int _la; try { enterOuterAlt(_localctx, 1); { - setState(244); + setState(258); ((MapBindingsContext)_localctx).mapBinding = mapBinding(); ((MapBindingsContext)_localctx).bindings.add(((MapBindingsContext)_localctx).mapBinding); - setState(249); + setState(263); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(245); + setState(259); match(COMMA); - setState(246); + setState(260); ((MapBindingsContext)_localctx).mapBinding = mapBinding(); ((MapBindingsContext)_localctx).bindings.add(((MapBindingsContext)_localctx).mapBinding); } } - setState(251); + setState(265); _errHandler.sync(this); _la = _input.LA(1); } @@ -1962,15 +2064,15 @@ public class SpelParser extends Parser { public final MapBindingContext mapBinding() throws RecognitionException { MapBindingContext _localctx = new MapBindingContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_mapBinding); + enterRule(_localctx, 48, RULE_mapBinding); try { enterOuterAlt(_localctx, 1); { - setState(252); + setState(266); ((MapBindingContext)_localctx).key = spelExpr(0); - setState(253); + setState(267); match(COLON); - setState(254); + setState(268); ((MapBindingContext)_localctx).value = spelExpr(0); } } @@ -2007,12 +2109,12 @@ public class SpelParser extends Parser { public final BeanReferenceContext beanReference() throws RecognitionException { BeanReferenceContext _localctx = new BeanReferenceContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_beanReference); + enterRule(_localctx, 50, RULE_beanReference); int _la; try { enterOuterAlt(_localctx, 1); { - setState(256); + setState(270); _la = _input.LA(1); if ( !(_la==BEAN_REF || _la==FACTORY_BEAN_REF) ) { _errHandler.recoverInline(this); @@ -2022,7 +2124,7 @@ public class SpelParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(257); + setState(271); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==STRING_LITERAL) ) { _errHandler.recoverInline(this); @@ -2045,6 +2147,52 @@ public class SpelParser extends Parser { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class InputParameterContext extends ParserRuleContext { + public TerminalNode LSQUARE() { return getToken(SpelParser.LSQUARE, 0); } + public TerminalNode INTEGER_LITERAL() { return getToken(SpelParser.INTEGER_LITERAL, 0); } + public TerminalNode RSQUARE() { return getToken(SpelParser.RSQUARE, 0); } + public InputParameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inputParameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof SpelParserListener ) ((SpelParserListener)listener).enterInputParameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof SpelParserListener ) ((SpelParserListener)listener).exitInputParameter(this); + } + } + + public final InputParameterContext inputParameter() throws RecognitionException { + InputParameterContext _localctx = new InputParameterContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_inputParameter); + try { + enterOuterAlt(_localctx, 1); + { + { + setState(273); + match(LSQUARE); + setState(274); + match(INTEGER_LITERAL); + setState(275); + match(RSQUARE); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 1: @@ -2081,7 +2229,7 @@ public class SpelParser extends Parser { } public static final String _serializedATN = - "\u0004\u0001@\u0104\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001?\u0116\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -2089,167 +2237,180 @@ public class SpelParser extends Parser { "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ - "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0005\u0001;\b\u0001\n\u0001\f\u0001>\t\u0001"+ - "\u0003\u0001@\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0005\u0001?\b\u0001\n\u0001\f\u0001B\t\u0001\u0003\u0001D\b\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001e\b\u0001\n\u0001\f\u0001h\t\u0001\u0001\u0002"+ - "\u0001\u0002\u0003\u0002l\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0003\u0004w\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0003\u0005~\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0007\u0003\u0007\u0085\b\u0007\u0001\u0007\u0001\u0007"+ - "\u0005\u0007\u0089\b\u0007\n\u0007\f\u0007\u008c\t\u0007\u0001\b\u0001"+ - "\b\u0001\b\u0003\b\u0091\b\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0003\u000b\u00a6\b\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0005\u000e\u00b3\b\u000e\n\u000e\f\u000e\u00b6\t\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u00bd\b\u000f\n"+ - "\u000f\f\u000f\u00c0\t\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u00c8\b\u0011\u0001\u0011\u0004"+ - "\u0011\u00cb\b\u0011\u000b\u0011\f\u0011\u00cc\u0001\u0011\u0003\u0011"+ - "\u00d0\b\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011"+ - "\u00d6\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0003\u0013\u00e9\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014"+ - "\u00ee\b\u0014\n\u0014\f\u0014\u00f1\t\u0014\u0001\u0015\u0001\u0015\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u00f8\b\u0016\n\u0016\f\u0016"+ - "\u00fb\t\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0000\u0001\u0002\u0019\u0000\u0002"+ - "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e"+ - " \"$&(*,.0\u0000\f\u0002\u0000\u0003\u0006\u0017\u0017\u0001\u0000\n\f"+ - "\u0002\u0000\u0004\u0004\u0006\u0006\u0004\u0000\u0015\u0015\u0018\u0018"+ - "\"%16\u0002\u0000\u001a\u001a**\u0002\u0000\u001c\u001c))\u0002\u0000"+ - "\u0003\u0003\u0005\u0005\u0002\u0000\b\b\u001f\u001f\u0003\u0000\u0013"+ - "\u0013\u001d\u001d!!\u0003\u0000+,88;;\u0002\u0000\u0012\u0012\u001b\u001b"+ - "\u0002\u000077;;\u0114\u00002\u0001\u0000\u0000\u0000\u0002?\u0001\u0000"+ - "\u0000\u0000\u0004k\u0001\u0000\u0000\u0000\u0006m\u0001\u0000\u0000\u0000"+ - "\bv\u0001\u0000\u0000\u0000\n}\u0001\u0000\u0000\u0000\f\u007f\u0001\u0000"+ - "\u0000\u0000\u000e\u0084\u0001\u0000\u0000\u0000\u0010\u0090\u0001\u0000"+ - "\u0000\u0000\u0012\u0092\u0001\u0000\u0000\u0000\u0014\u0096\u0001\u0000"+ - "\u0000\u0000\u0016\u00a5\u0001\u0000\u0000\u0000\u0018\u00a7\u0001\u0000"+ - "\u0000\u0000\u001a\u00a9\u0001\u0000\u0000\u0000\u001c\u00ad\u0001\u0000"+ - "\u0000\u0000\u001e\u00b9\u0001\u0000\u0000\u0000 \u00c1\u0001\u0000\u0000"+ - "\u0000\"\u00d5\u0001\u0000\u0000\u0000$\u00d7\u0001\u0000\u0000\u0000"+ - "&\u00e8\u0001\u0000\u0000\u0000(\u00ea\u0001\u0000\u0000\u0000*\u00f2"+ - "\u0001\u0000\u0000\u0000,\u00f4\u0001\u0000\u0000\u0000.\u00fc\u0001\u0000"+ - "\u0000\u00000\u0100\u0001\u0000\u0000\u000023\u0003\u0002\u0001\u0000"+ - "34\u0005\u0000\u0000\u00014\u0001\u0001\u0000\u0000\u000056\u0006\u0001"+ - "\uffff\uffff\u000067\u0007\u0000\u0000\u00007@\u0003\u0002\u0001\r8<\u0003"+ - "\u0016\u000b\u00009;\u0003\u0004\u0002\u0000:9\u0001\u0000\u0000\u0000"+ - ";>\u0001\u0000\u0000\u0000<:\u0001\u0000\u0000\u0000<=\u0001\u0000\u0000"+ - "\u0000=@\u0001\u0000\u0000\u0000><\u0001\u0000\u0000\u0000?5\u0001\u0000"+ - "\u0000\u0000?8\u0001\u0000\u0000\u0000@f\u0001\u0000\u0000\u0000AB\n\u000b"+ - "\u0000\u0000BC\u0005\u0014\u0000\u0000Ce\u0003\u0002\u0001\fDE\n\n\u0000"+ - "\u0000EF\u0007\u0001\u0000\u0000Fe\u0003\u0002\u0001\u000bGH\n\t\u0000"+ - "\u0000HI\u0007\u0002\u0000\u0000Ie\u0003\u0002\u0001\nJK\n\b\u0000\u0000"+ - "KL\u0007\u0003\u0000\u0000Le\u0003\u0002\u0001\tMN\n\u0007\u0000\u0000"+ - "NO\u0007\u0004\u0000\u0000Oe\u0003\u0002\u0001\bPQ\n\u0006\u0000\u0000"+ - "QR\u0007\u0005\u0000\u0000Re\u0003\u0002\u0001\u0007ST\n\u0005\u0000\u0000"+ - "TU\u00050\u0000\u0000Ue\u0003\u0002\u0001\u0006VW\n\u0004\u0000\u0000"+ - "WX\u0005\u0019\u0000\u0000Xe\u0003\u0002\u0001\u0005YZ\n\u0003\u0000\u0000"+ - "Z[\u0005\u001e\u0000\u0000[e\u0003\u0002\u0001\u0004\\]\n\u0002\u0000"+ - "\u0000]^\u0005 \u0000\u0000^_\u0003\u0002\u0001\u0000_`\u0005\u0007\u0000"+ - "\u0000`a\u0003\u0002\u0001\u0003ae\u0001\u0000\u0000\u0000bc\n\f\u0000"+ - "\u0000ce\u0007\u0006\u0000\u0000dA\u0001\u0000\u0000\u0000dD\u0001\u0000"+ - "\u0000\u0000dG\u0001\u0000\u0000\u0000dJ\u0001\u0000\u0000\u0000dM\u0001"+ - "\u0000\u0000\u0000dP\u0001\u0000\u0000\u0000dS\u0001\u0000\u0000\u0000"+ - "dV\u0001\u0000\u0000\u0000dY\u0001\u0000\u0000\u0000d\\\u0001\u0000\u0000"+ - "\u0000db\u0001\u0000\u0000\u0000eh\u0001\u0000\u0000\u0000fd\u0001\u0000"+ - "\u0000\u0000fg\u0001\u0000\u0000\u0000g\u0003\u0001\u0000\u0000\u0000"+ - "hf\u0001\u0000\u0000\u0000il\u0003\b\u0004\u0000jl\u0003\u0006\u0003\u0000"+ - "ki\u0001\u0000\u0000\u0000kj\u0001\u0000\u0000\u0000l\u0005\u0001\u0000"+ - "\u0000\u0000mn\u0005\u000f\u0000\u0000no\u0003\u0002\u0001\u0000op\u0005"+ - "\u0010\u0000\u0000p\u0007\u0001\u0000\u0000\u0000qr\u0007\u0007\u0000"+ - "\u0000rw\u0003\u0010\b\u0000sw\u0003\n\u0005\u0000tw\u0003\u0012\t\u0000"+ - "uw\u0003\u0014\n\u0000vq\u0001\u0000\u0000\u0000vs\u0001\u0000\u0000\u0000"+ - "vt\u0001\u0000\u0000\u0000vu\u0001\u0000\u0000\u0000w\t\u0001\u0000\u0000"+ - "\u0000xy\u0005\u0011\u0000\u0000y~\u00057\u0000\u0000z{\u0005\u0011\u0000"+ - "\u0000{|\u00057\u0000\u0000|~\u0003\f\u0006\u0000}x\u0001\u0000\u0000"+ - "\u0000}z\u0001\u0000\u0000\u0000~\u000b\u0001\u0000\u0000\u0000\u007f"+ - "\u0080\u0005\r\u0000\u0000\u0080\u0081\u0003\u000e\u0007\u0000\u0081\u0082"+ - "\u0005\u000e\u0000\u0000\u0082\r\u0001\u0000\u0000\u0000\u0083\u0085\u0003"+ - "\u0002\u0001\u0000\u0084\u0083\u0001\u0000\u0000\u0000\u0084\u0085\u0001"+ - "\u0000\u0000\u0000\u0085\u008a\u0001\u0000\u0000\u0000\u0086\u0087\u0005"+ - "\t\u0000\u0000\u0087\u0089\u0003\u0002\u0001\u0000\u0088\u0086\u0001\u0000"+ - "\u0000\u0000\u0089\u008c\u0001\u0000\u0000\u0000\u008a\u0088\u0001\u0000"+ - "\u0000\u0000\u008a\u008b\u0001\u0000\u0000\u0000\u008b\u000f\u0001\u0000"+ - "\u0000\u0000\u008c\u008a\u0001\u0000\u0000\u0000\u008d\u0091\u00057\u0000"+ - "\u0000\u008e\u008f\u00057\u0000\u0000\u008f\u0091\u0003\f\u0006\u0000"+ - "\u0090\u008d\u0001\u0000\u0000\u0000\u0090\u008e\u0001\u0000\u0000\u0000"+ - "\u0091\u0011\u0001\u0000\u0000\u0000\u0092\u0093\u0005\u0016\u0000\u0000"+ - "\u0093\u0094\u0003\u0002\u0001\u0000\u0094\u0095\u0005\u0010\u0000\u0000"+ - "\u0095\u0013\u0001\u0000\u0000\u0000\u0096\u0097\u0007\b\u0000\u0000\u0097"+ - "\u0098\u0003\u0002\u0001\u0000\u0098\u0099\u0005\u0010\u0000\u0000\u0099"+ - "\u0015\u0001\u0000\u0000\u0000\u009a\u00a6\u0003\u0018\f\u0000\u009b\u00a6"+ - "\u0003\u001a\r\u0000\u009c\u00a6\u0003\u001c\u000e\u0000\u009d\u00a6\u0003"+ - " \u0010\u0000\u009e\u00a6\u0003\"\u0011\u0000\u009f\u00a6\u0003\u0010"+ - "\b\u0000\u00a0\u00a6\u0003\n\u0005\u0000\u00a1\u00a6\u00030\u0018\u0000"+ - "\u00a2\u00a6\u0003\u0012\t\u0000\u00a3\u00a6\u0003\u0014\n\u0000\u00a4"+ - "\u00a6\u0003&\u0013\u0000\u00a5\u009a\u0001\u0000\u0000\u0000\u00a5\u009b"+ - "\u0001\u0000\u0000\u0000\u00a5\u009c\u0001\u0000\u0000\u0000\u00a5\u009d"+ - "\u0001\u0000\u0000\u0000\u00a5\u009e\u0001\u0000\u0000\u0000\u00a5\u009f"+ - "\u0001\u0000\u0000\u0000\u00a5\u00a0\u0001\u0000\u0000\u0000\u00a5\u00a1"+ - "\u0001\u0000\u0000\u0000\u00a5\u00a2\u0001\u0000\u0000\u0000\u00a5\u00a3"+ - "\u0001\u0000\u0000\u0000\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a6\u0017"+ - "\u0001\u0000\u0000\u0000\u00a7\u00a8\u0007\t\u0000\u0000\u00a8\u0019\u0001"+ - "\u0000\u0000\u0000\u00a9\u00aa\u0005\r\u0000\u0000\u00aa\u00ab\u0003\u0002"+ - "\u0001\u0000\u00ab\u00ac\u0005\u000e\u0000\u0000\u00ac\u001b\u0001\u0000"+ - "\u0000\u0000\u00ad\u00ae\u0005/\u0000\u0000\u00ae\u00af\u0005\r\u0000"+ - "\u0000\u00af\u00b4\u0003\u001e\u000f\u0000\u00b0\u00b1\u0005\u000f\u0000"+ - "\u0000\u00b1\u00b3\u0005\u0010\u0000\u0000\u00b2\u00b0\u0001\u0000\u0000"+ - "\u0000\u00b3\u00b6\u0001\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000"+ - "\u0000\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u00b7\u0001\u0000\u0000"+ - "\u0000\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b7\u00b8\u0005\u000e\u0000"+ - "\u0000\u00b8\u001d\u0001\u0000\u0000\u0000\u00b9\u00be\u00057\u0000\u0000"+ - "\u00ba\u00bb\u0005\b\u0000\u0000\u00bb\u00bd\u00057\u0000\u0000\u00bc"+ - "\u00ba\u0001\u0000\u0000\u0000\u00bd\u00c0\u0001\u0000\u0000\u0000\u00be"+ - "\u00bc\u0001\u0000\u0000\u0000\u00be\u00bf\u0001\u0000\u0000\u0000\u00bf"+ - "\u001f\u0001\u0000\u0000\u0000\u00c0\u00be\u0001\u0000\u0000\u0000\u00c1"+ - "\u00c2\u0005.\u0000\u0000\u00c2!\u0001\u0000\u0000\u0000\u00c3\u00c4\u0005"+ - "-\u0000\u0000\u00c4\u00ca\u0003\u001e\u000f\u0000\u00c5\u00c7\u0005\u000f"+ - "\u0000\u0000\u00c6\u00c8\u0003\u0002\u0001\u0000\u00c7\u00c6\u0001\u0000"+ - "\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u00c9\u0001\u0000"+ - "\u0000\u0000\u00c9\u00cb\u0005\u0010\u0000\u0000\u00ca\u00c5\u0001\u0000"+ - "\u0000\u0000\u00cb\u00cc\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cd\u0001\u0000\u0000\u0000\u00cd\u00cf\u0001\u0000"+ - "\u0000\u0000\u00ce\u00d0\u0003&\u0013\u0000\u00cf\u00ce\u0001\u0000\u0000"+ - "\u0000\u00cf\u00d0\u0001\u0000\u0000\u0000\u00d0\u00d6\u0001\u0000\u0000"+ - "\u0000\u00d1\u00d2\u0005-\u0000\u0000\u00d2\u00d3\u0003\u001e\u000f\u0000"+ - "\u00d3\u00d4\u0003$\u0012\u0000\u00d4\u00d6\u0001\u0000\u0000\u0000\u00d5"+ - "\u00c3\u0001\u0000\u0000\u0000\u00d5\u00d1\u0001\u0000\u0000\u0000\u00d6"+ - "#\u0001\u0000\u0000\u0000\u00d7\u00d8\u0005\r\u0000\u0000\u00d8\u00d9"+ - "\u0003\u000e\u0007\u0000\u00d9\u00da\u0005\u000e\u0000\u0000\u00da%\u0001"+ - "\u0000\u0000\u0000\u00db\u00dc\u0005&\u0000\u0000\u00dc\u00e9\u0005\'"+ - "\u0000\u0000\u00dd\u00de\u0005&\u0000\u0000\u00de\u00df\u0005\u0007\u0000"+ - "\u0000\u00df\u00e9\u0005\'\u0000\u0000\u00e0\u00e1\u0005&\u0000\u0000"+ - "\u00e1\u00e2\u0003(\u0014\u0000\u00e2\u00e3\u0005\'\u0000\u0000\u00e3"+ - "\u00e9\u0001\u0000\u0000\u0000\u00e4\u00e5\u0005&\u0000\u0000\u00e5\u00e6"+ - "\u0003,\u0016\u0000\u00e6\u00e7\u0005\'\u0000\u0000\u00e7\u00e9\u0001"+ - "\u0000\u0000\u0000\u00e8\u00db\u0001\u0000\u0000\u0000\u00e8\u00dd\u0001"+ - "\u0000\u0000\u0000\u00e8\u00e0\u0001\u0000\u0000\u0000\u00e8\u00e4\u0001"+ - "\u0000\u0000\u0000\u00e9\'\u0001\u0000\u0000\u0000\u00ea\u00ef\u0003*"+ - "\u0015\u0000\u00eb\u00ec\u0005\t\u0000\u0000\u00ec\u00ee\u0003*\u0015"+ - "\u0000\u00ed\u00eb\u0001\u0000\u0000\u0000\u00ee\u00f1\u0001\u0000\u0000"+ - "\u0000\u00ef\u00ed\u0001\u0000\u0000\u0000\u00ef\u00f0\u0001\u0000\u0000"+ - "\u0000\u00f0)\u0001\u0000\u0000\u0000\u00f1\u00ef\u0001\u0000\u0000\u0000"+ - "\u00f2\u00f3\u0003\u0002\u0001\u0000\u00f3+\u0001\u0000\u0000\u0000\u00f4"+ - "\u00f9\u0003.\u0017\u0000\u00f5\u00f6\u0005\t\u0000\u0000\u00f6\u00f8"+ - "\u0003.\u0017\u0000\u00f7\u00f5\u0001\u0000\u0000\u0000\u00f8\u00fb\u0001"+ - "\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00f9\u00fa\u0001"+ - "\u0000\u0000\u0000\u00fa-\u0001\u0000\u0000\u0000\u00fb\u00f9\u0001\u0000"+ - "\u0000\u0000\u00fc\u00fd\u0003\u0002\u0001\u0000\u00fd\u00fe\u0005\u0007"+ - "\u0000\u0000\u00fe\u00ff\u0003\u0002\u0001\u0000\u00ff/\u0001\u0000\u0000"+ - "\u0000\u0100\u0101\u0007\n\u0000\u0000\u0101\u0102\u0007\u000b\u0000\u0000"+ - "\u01021\u0001\u0000\u0000\u0000\u0014=\u0001\u0000\u0000\u0000?B\u0001\u0000\u0000\u0000"+ + "@>\u0001\u0000\u0000\u0000@A\u0001\u0000\u0000\u0000AD\u0001\u0000\u0000"+ + "\u0000B@\u0001\u0000\u0000\u0000C9\u0001\u0000\u0000\u0000C<\u0001\u0000"+ + "\u0000\u0000Dj\u0001\u0000\u0000\u0000EF\n\u000b\u0000\u0000FG\u0005\u0014"+ + "\u0000\u0000Gi\u0003\u0002\u0001\fHI\n\n\u0000\u0000IJ\u0007\u0001\u0000"+ + "\u0000Ji\u0003\u0002\u0001\u000bKL\n\t\u0000\u0000LM\u0007\u0002\u0000"+ + "\u0000Mi\u0003\u0002\u0001\nNO\n\b\u0000\u0000OP\u0007\u0003\u0000\u0000"+ + "Pi\u0003\u0002\u0001\tQR\n\u0007\u0000\u0000RS\u0007\u0004\u0000\u0000"+ + "Si\u0003\u0002\u0001\bTU\n\u0006\u0000\u0000UV\u0007\u0005\u0000\u0000"+ + "Vi\u0003\u0002\u0001\u0007WX\n\u0005\u0000\u0000XY\u00050\u0000\u0000"+ + "Yi\u0003\u0002\u0001\u0006Z[\n\u0004\u0000\u0000[\\\u0005\u0019\u0000"+ + "\u0000\\i\u0003\u0002\u0001\u0005]^\n\u0003\u0000\u0000^_\u0005\u001e"+ + "\u0000\u0000_i\u0003\u0002\u0001\u0004`a\n\u0002\u0000\u0000ab\u0005 "+ + "\u0000\u0000bc\u0003\u0002\u0001\u0000cd\u0005\u0007\u0000\u0000de\u0003"+ + "\u0002\u0001\u0003ei\u0001\u0000\u0000\u0000fg\n\f\u0000\u0000gi\u0007"+ + "\u0006\u0000\u0000hE\u0001\u0000\u0000\u0000hH\u0001\u0000\u0000\u0000"+ + "hK\u0001\u0000\u0000\u0000hN\u0001\u0000\u0000\u0000hQ\u0001\u0000\u0000"+ + "\u0000hT\u0001\u0000\u0000\u0000hW\u0001\u0000\u0000\u0000hZ\u0001\u0000"+ + "\u0000\u0000h]\u0001\u0000\u0000\u0000h`\u0001\u0000\u0000\u0000hf\u0001"+ + "\u0000\u0000\u0000il\u0001\u0000\u0000\u0000jh\u0001\u0000\u0000\u0000"+ + "jk\u0001\u0000\u0000\u0000k\u0003\u0001\u0000\u0000\u0000lj\u0001\u0000"+ + "\u0000\u0000mp\u0003\b\u0004\u0000np\u0003\u0006\u0003\u0000om\u0001\u0000"+ + "\u0000\u0000on\u0001\u0000\u0000\u0000p\u0005\u0001\u0000\u0000\u0000"+ + "qr\u0005\u000f\u0000\u0000rs\u0003\u0002\u0001\u0000st\u0005\u0010\u0000"+ + "\u0000tw\u0001\u0000\u0000\u0000uw\u00034\u001a\u0000vq\u0001\u0000\u0000"+ + "\u0000vu\u0001\u0000\u0000\u0000w\u0007\u0001\u0000\u0000\u0000xy\u0007"+ + "\u0007\u0000\u0000y~\u0003\u0010\b\u0000z~\u0003\n\u0005\u0000{~\u0003"+ + "\u0012\t\u0000|~\u0003\u0014\n\u0000}x\u0001\u0000\u0000\u0000}z\u0001"+ + "\u0000\u0000\u0000}{\u0001\u0000\u0000\u0000}|\u0001\u0000\u0000\u0000"+ + "~\t\u0001\u0000\u0000\u0000\u007f\u0080\u0005\u0011\u0000\u0000\u0080"+ + "\u0085\u00057\u0000\u0000\u0081\u0082\u0005\u0011\u0000\u0000\u0082\u0083"+ + "\u00057\u0000\u0000\u0083\u0085\u0003\f\u0006\u0000\u0084\u007f\u0001"+ + "\u0000\u0000\u0000\u0084\u0081\u0001\u0000\u0000\u0000\u0085\u000b\u0001"+ + "\u0000\u0000\u0000\u0086\u0087\u0005\r\u0000\u0000\u0087\u0088\u0003\u000e"+ + "\u0007\u0000\u0088\u0089\u0005\u000e\u0000\u0000\u0089\r\u0001\u0000\u0000"+ + "\u0000\u008a\u008c\u0003\u0002\u0001\u0000\u008b\u008a\u0001\u0000\u0000"+ + "\u0000\u008b\u008c\u0001\u0000\u0000\u0000\u008c\u0091\u0001\u0000\u0000"+ + "\u0000\u008d\u008e\u0005\t\u0000\u0000\u008e\u0090\u0003\u0002\u0001\u0000"+ + "\u008f\u008d\u0001\u0000\u0000\u0000\u0090\u0093\u0001\u0000\u0000\u0000"+ + "\u0091\u008f\u0001\u0000\u0000\u0000\u0091\u0092\u0001\u0000\u0000\u0000"+ + "\u0092\u000f\u0001\u0000\u0000\u0000\u0093\u0091\u0001\u0000\u0000\u0000"+ + "\u0094\u0098\u00057\u0000\u0000\u0095\u0096\u00057\u0000\u0000\u0096\u0098"+ + "\u0003\f\u0006\u0000\u0097\u0094\u0001\u0000\u0000\u0000\u0097\u0095\u0001"+ + "\u0000\u0000\u0000\u0098\u0011\u0001\u0000\u0000\u0000\u0099\u009a\u0005"+ + "\u0016\u0000\u0000\u009a\u009b\u0003\u0002\u0001\u0000\u009b\u009c\u0005"+ + "\u0010\u0000\u0000\u009c\u0013\u0001\u0000\u0000\u0000\u009d\u009e\u0007"+ + "\b\u0000\u0000\u009e\u009f\u0003\u0002\u0001\u0000\u009f\u00a0\u0005\u0010"+ + "\u0000\u0000\u00a0\u0015\u0001\u0000\u0000\u0000\u00a1\u00ae\u0003\u0018"+ + "\f\u0000\u00a2\u00ae\u0003\u001c\u000e\u0000\u00a3\u00ae\u0003\u001e\u000f"+ + "\u0000\u00a4\u00ae\u0003\"\u0011\u0000\u00a5\u00ae\u0003$\u0012\u0000"+ + "\u00a6\u00ae\u0003\u0010\b\u0000\u00a7\u00ae\u0003\n\u0005\u0000\u00a8"+ + "\u00ae\u00032\u0019\u0000\u00a9\u00ae\u0003\u0012\t\u0000\u00aa\u00ae"+ + "\u0003\u0014\n\u0000\u00ab\u00ae\u0003(\u0014\u0000\u00ac\u00ae\u0003"+ + "4\u001a\u0000\u00ad\u00a1\u0001\u0000\u0000\u0000\u00ad\u00a2\u0001\u0000"+ + "\u0000\u0000\u00ad\u00a3\u0001\u0000\u0000\u0000\u00ad\u00a4\u0001\u0000"+ + "\u0000\u0000\u00ad\u00a5\u0001\u0000\u0000\u0000\u00ad\u00a6\u0001\u0000"+ + "\u0000\u0000\u00ad\u00a7\u0001\u0000\u0000\u0000\u00ad\u00a8\u0001\u0000"+ + "\u0000\u0000\u00ad\u00a9\u0001\u0000\u0000\u0000\u00ad\u00aa\u0001\u0000"+ + "\u0000\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ad\u00ac\u0001\u0000"+ + "\u0000\u0000\u00ae\u0017\u0001\u0000\u0000\u0000\u00af\u00b4\u0003\u001a"+ + "\r\u0000\u00b0\u00b4\u0005:\u0000\u0000\u00b1\u00b4\u0005+\u0000\u0000"+ + "\u00b2\u00b4\u0005,\u0000\u0000\u00b3\u00af\u0001\u0000\u0000\u0000\u00b3"+ + "\u00b0\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b3"+ + "\u00b2\u0001\u0000\u0000\u0000\u00b4\u0019\u0001\u0000\u0000\u0000\u00b5"+ + "\u00b6\u0007\t\u0000\u0000\u00b6\u001b\u0001\u0000\u0000\u0000\u00b7\u00b8"+ + "\u0005\r\u0000\u0000\u00b8\u00b9\u0003\u0002\u0001\u0000\u00b9\u00ba\u0005"+ + "\u000e\u0000\u0000\u00ba\u001d\u0001\u0000\u0000\u0000\u00bb\u00bc\u0005"+ + "/\u0000\u0000\u00bc\u00bd\u0005\r\u0000\u0000\u00bd\u00c2\u0003 \u0010"+ + "\u0000\u00be\u00bf\u0005\u000f\u0000\u0000\u00bf\u00c1\u0005\u0010\u0000"+ + "\u0000\u00c0\u00be\u0001\u0000\u0000\u0000\u00c1\u00c4\u0001\u0000\u0000"+ + "\u0000\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c2\u00c3\u0001\u0000\u0000"+ + "\u0000\u00c3\u00c5\u0001\u0000\u0000\u0000\u00c4\u00c2\u0001\u0000\u0000"+ + "\u0000\u00c5\u00c6\u0005\u000e\u0000\u0000\u00c6\u001f\u0001\u0000\u0000"+ + "\u0000\u00c7\u00cc\u00057\u0000\u0000\u00c8\u00c9\u0005\b\u0000\u0000"+ + "\u00c9\u00cb\u00057\u0000\u0000\u00ca\u00c8\u0001\u0000\u0000\u0000\u00cb"+ + "\u00ce\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc"+ + "\u00cd\u0001\u0000\u0000\u0000\u00cd!\u0001\u0000\u0000\u0000\u00ce\u00cc"+ + "\u0001\u0000\u0000\u0000\u00cf\u00d0\u0005.\u0000\u0000\u00d0#\u0001\u0000"+ + "\u0000\u0000\u00d1\u00d2\u0005-\u0000\u0000\u00d2\u00d8\u0003 \u0010\u0000"+ + "\u00d3\u00d5\u0005\u000f\u0000\u0000\u00d4\u00d6\u0003\u0002\u0001\u0000"+ + "\u00d5\u00d4\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001\u0000\u0000\u0000"+ + "\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u00d9\u0005\u0010\u0000\u0000"+ + "\u00d8\u00d3\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000"+ + "\u00da\u00d8\u0001\u0000\u0000\u0000\u00da\u00db\u0001\u0000\u0000\u0000"+ + "\u00db\u00dd\u0001\u0000\u0000\u0000\u00dc\u00de\u0003(\u0014\u0000\u00dd"+ + "\u00dc\u0001\u0000\u0000\u0000\u00dd\u00de\u0001\u0000\u0000\u0000\u00de"+ + "\u00e4\u0001\u0000\u0000\u0000\u00df\u00e0\u0005-\u0000\u0000\u00e0\u00e1"+ + "\u0003 \u0010\u0000\u00e1\u00e2\u0003&\u0013\u0000\u00e2\u00e4\u0001\u0000"+ + "\u0000\u0000\u00e3\u00d1\u0001\u0000\u0000\u0000\u00e3\u00df\u0001\u0000"+ + "\u0000\u0000\u00e4%\u0001\u0000\u0000\u0000\u00e5\u00e6\u0005\r\u0000"+ + "\u0000\u00e6\u00e7\u0003\u000e\u0007\u0000\u00e7\u00e8\u0005\u000e\u0000"+ + "\u0000\u00e8\'\u0001\u0000\u0000\u0000\u00e9\u00ea\u0005&\u0000\u0000"+ + "\u00ea\u00f7\u0005\'\u0000\u0000\u00eb\u00ec\u0005&\u0000\u0000\u00ec"+ + "\u00ed\u0005\u0007\u0000\u0000\u00ed\u00f7\u0005\'\u0000\u0000\u00ee\u00ef"+ + "\u0005&\u0000\u0000\u00ef\u00f0\u0003*\u0015\u0000\u00f0\u00f1\u0005\'"+ + "\u0000\u0000\u00f1\u00f7\u0001\u0000\u0000\u0000\u00f2\u00f3\u0005&\u0000"+ + "\u0000\u00f3\u00f4\u0003.\u0017\u0000\u00f4\u00f5\u0005\'\u0000\u0000"+ + "\u00f5\u00f7\u0001\u0000\u0000\u0000\u00f6\u00e9\u0001\u0000\u0000\u0000"+ + "\u00f6\u00eb\u0001\u0000\u0000\u0000\u00f6\u00ee\u0001\u0000\u0000\u0000"+ + "\u00f6\u00f2\u0001\u0000\u0000\u0000\u00f7)\u0001\u0000\u0000\u0000\u00f8"+ + "\u00fd\u0003,\u0016\u0000\u00f9\u00fa\u0005\t\u0000\u0000\u00fa\u00fc"+ + "\u0003,\u0016\u0000\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fc\u00ff\u0001"+ + "\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000\u00fd\u00fe\u0001"+ + "\u0000\u0000\u0000\u00fe+\u0001\u0000\u0000\u0000\u00ff\u00fd\u0001\u0000"+ + "\u0000\u0000\u0100\u0101\u0003\u0002\u0001\u0000\u0101-\u0001\u0000\u0000"+ + "\u0000\u0102\u0107\u00030\u0018\u0000\u0103\u0104\u0005\t\u0000\u0000"+ + "\u0104\u0106\u00030\u0018\u0000\u0105\u0103\u0001\u0000\u0000\u0000\u0106"+ + "\u0109\u0001\u0000\u0000\u0000\u0107\u0105\u0001\u0000\u0000\u0000\u0107"+ + "\u0108\u0001\u0000\u0000\u0000\u0108/\u0001\u0000\u0000\u0000\u0109\u0107"+ + "\u0001\u0000\u0000\u0000\u010a\u010b\u0003\u0002\u0001\u0000\u010b\u010c"+ + "\u0005\u0007\u0000\u0000\u010c\u010d\u0003\u0002\u0001\u0000\u010d1\u0001"+ + "\u0000\u0000\u0000\u010e\u010f\u0007\n\u0000\u0000\u010f\u0110\u0007\u000b"+ + "\u0000\u0000\u01103\u0001\u0000\u0000\u0000\u0111\u0112\u0005\u000f\u0000"+ + "\u0000\u0112\u0113\u00059\u0000\u0000\u0113\u0114\u0005\u0010\u0000\u0000"+ + "\u01145\u0001\u0000\u0000\u0000\u0016@Chjov}\u0084\u008b\u0091\u0097\u00ad"+ + "\u00b3\u00c2\u00cc\u00d5\u00da\u00dd\u00e3\u00f6\u00fd\u0107"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserBaseListener.java b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserBaseListener.java index 63d8d1212..d6715035e 100644 --- a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserBaseListener.java +++ b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserBaseListener.java @@ -180,6 +180,18 @@ public class SpelParserBaseListener implements SpelParserListener { *

The default implementation does nothing.

*/ @Override public void exitLiteral(SpelParser.LiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNumericLiteral(SpelParser.NumericLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNumericLiteral(SpelParser.NumericLiteralContext ctx) { } /** * {@inheritDoc} * @@ -324,6 +336,18 @@ public class SpelParserBaseListener implements SpelParserListener { *

The default implementation does nothing.

*/ @Override public void exitBeanReference(SpelParser.BeanReferenceContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInputParameter(SpelParser.InputParameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInputParameter(SpelParser.InputParameterContext ctx) { } /** * {@inheritDoc} diff --git a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserListener.java b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserListener.java index 059fdb2c8..a75f42e58 100644 --- a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserListener.java +++ b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/spel/SpelParserListener.java @@ -149,6 +149,16 @@ public interface SpelParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitLiteral(SpelParser.LiteralContext ctx); + /** + * Enter a parse tree produced by {@link SpelParser#numericLiteral}. + * @param ctx the parse tree + */ + void enterNumericLiteral(SpelParser.NumericLiteralContext ctx); + /** + * Exit a parse tree produced by {@link SpelParser#numericLiteral}. + * @param ctx the parse tree + */ + void exitNumericLiteral(SpelParser.NumericLiteralContext ctx); /** * Enter a parse tree produced by {@link SpelParser#parenspelExpr}. * @param ctx the parse tree @@ -269,4 +279,14 @@ public interface SpelParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitBeanReference(SpelParser.BeanReferenceContext ctx); + /** + * Enter a parse tree produced by {@link SpelParser#inputParameter}. + * @param ctx the parse tree + */ + void enterInputParameter(SpelParser.InputParameterContext ctx); + /** + * Exit a parse tree produced by {@link SpelParser#inputParameter}. + * @param ctx the parse tree + */ + void exitInputParameter(SpelParser.InputParameterContext ctx); } \ No newline at end of file diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokens.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokens.java index 2c45c9979..ae0c80d3b 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokens.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokens.java @@ -12,16 +12,26 @@ package org.springframework.ide.vscode.boot.java.spel; import static org.springframework.ide.vscode.parser.spel.SpelLexer.*; +import java.util.ArrayList; +import java.util.BitSet; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.function.Consumer; import java.util.stream.Collectors; +import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.ConsoleErrorListener; +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.atn.ATNConfigSet; +import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.TerminalNode; import org.springframework.ide.vscode.commons.languageserver.semantic.tokens.SemanticTokenData; @@ -32,15 +42,26 @@ import org.springframework.ide.vscode.parser.spel.SpelParser.BeanReferenceContex import org.springframework.ide.vscode.parser.spel.SpelParser.ConstructorReferenceContext; import org.springframework.ide.vscode.parser.spel.SpelParser.DottedNodeContext; import org.springframework.ide.vscode.parser.spel.SpelParser.FunctionOrVarContext; +import org.springframework.ide.vscode.parser.spel.SpelParser.InputParameterContext; import org.springframework.ide.vscode.parser.spel.SpelParser.MethodOrPropertyContext; import org.springframework.ide.vscode.parser.spel.SpelParser.PossiblyQualifiedIdContext; import org.springframework.ide.vscode.parser.spel.SpelParserBaseListener; public class SpelSemanticTokens implements SemanticTokensDataProvider { + + private final Optional> parseErrorHandler; + + public SpelSemanticTokens(Optional> parseErrorHandler) { + this.parseErrorHandler = parseErrorHandler; + } + + public SpelSemanticTokens() { + this(Optional.empty()); + } @Override public List getTokenTypes() { - return List.of("operator", "keyword", "type", "string", "number", "method", "property"); + return List.of("operator", "keyword", "type", "string", "number", "method", "property", "parameter"); } @Override @@ -54,6 +75,8 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider { lexer.removeErrorListener(ConsoleErrorListener.INSTANCE); parser.removeErrorListener(ConsoleErrorListener.INSTANCE); + List tokens = new ArrayList<>(); + parser.addParseListener(new SpelParserBaseListener() { private void processTerminalNode(TerminalNode node) { @@ -119,7 +142,6 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider { case IDENTIFIER: semantics.put(node.getSymbol(), "variable"); break; - case NUMERIC_LITERAL: case INTEGER_LITERAL: case REAL_LITERAL: semantics.put(node.getSymbol(), "number"); @@ -178,6 +200,17 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider { } } + @Override + public void exitInputParameter(InputParameterContext ctx) { + semantics.remove(ctx.LSQUARE().getSymbol()); + semantics.remove(ctx.INTEGER_LITERAL().getSymbol()); + semantics.remove(ctx.RSQUARE().getSymbol()); + + int start = ctx.getStart().getStartIndex() + initialOffset; + int end = start + ctx.getText().length(); + tokens.add(new SemanticTokenData(start, end, "parameter", new String[0])); + } + @Override public void visitTerminal(TerminalNode node) { processTerminalNode(node); @@ -190,13 +223,38 @@ public class SpelSemanticTokens implements SemanticTokensDataProvider { }); + parser.addErrorListener(new ANTLRErrorListener() { + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, + String msg, RecognitionException e) { + parseErrorHandler.ifPresent(h -> h.accept(e)); + } + + @Override + public void reportContextSensitivity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, int prediction, + ATNConfigSet configs) { + } + + @Override + public void reportAttemptingFullContext(Parser recognizer, DFA dfa, int startIndex, int stopIndex, + BitSet conflictingAlts, ATNConfigSet configs) { + } + + @Override + public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, + BitSet ambigAlts, ATNConfigSet configs) { + } + }); + + parser.spelExpr(); - List tokens = semantics.entrySet().stream() + tokens.addAll(semantics.entrySet().stream() .map(e -> new SemanticTokenData(e.getKey().getStartIndex() + initialOffset, e.getKey().getStartIndex() + e.getKey().getText().length() + initialOffset, e.getValue(), new String[0])) - .collect(Collectors.toList()); + .collect(Collectors.toList())); Collections.sort(tokens); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokensTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokensTest.java index d2070a605..c8ce227b4 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokensTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/spel/SpelSemanticTokensTest.java @@ -13,13 +13,15 @@ package org.springframework.ide.vscode.boot.java.spel; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.ide.vscode.commons.languageserver.semantic.tokens.SemanticTokenData; public class SpelSemanticTokensTest { - private SpelSemanticTokens provider = new SpelSemanticTokens(); + private SpelSemanticTokens provider = new SpelSemanticTokens(Optional.of(Assertions::fail)); @Test void simpleCompare() { @@ -124,5 +126,22 @@ public class SpelSemanticTokensTest { assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(37, 38, "operator", new String[0])); assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(38, 39, "operator", new String[0])); } + + //https://github.com/spring-projects/sts4/issues/1320 + @Test + void inputParameter() { + List tokens = provider.computeTokens("[1].size().longValue()", 0); + assertThat(tokens.size()).isEqualTo(9); + assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 3, "parameter", new String[0])); // [1] + assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(3, 4, "operator", new String[0])); // . + assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(4, 8, "method", new String[0])); // size + assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(8, 9, "operator", new String[0])); // ( + assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(9, 10, "operator", new String[0])); // ) + assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(10, 11, "operator", new String[0])); // . + assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(11, 20, "method", new String[0])); // longValue + assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(20, 21, "operator", new String[0])); // ( + assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(21, 22, "operator", new String[0])); // ) + } + }