diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index ca03f1108..c0618c0b4 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -1,39 +1,33 @@ /* - [The "BSD licence"] - Copyright (c) 2017 Sasa Coh, Michał Błotniak - Copyright (c) 2019 Ivan Kochurkin, kvanttt@gmail.com, Positive Technologies - Copyright (c) 2019 Dmitry Rassadin, flipparassa@gmail.com, Positive Technologies - Copyright (c) 2021 Martin Mirchev, mirchevmartin2203@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + [The "BSD licence"] Copyright (c) 2017 Sasa Coh, Michał Błotniak Copyright (c) 2019 Ivan Kochurkin, + kvanttt@gmail.com, Positive Technologies Copyright (c) 2019 Dmitry Rassadin, + flipparassa@gmail.com,Positive Technologies All rights reserved. Copyright (c) 2021 Martin Mirchev, + mirchevmartin2203@gmail.com + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: 1. Redistributions of source code must retain the + above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in + binary form must reproduce the above copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the distribution. 3. The name + of the author may not be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ /* * A Go grammar for ANTLR 4 derived from the Go Language Specification https://golang.org/ref/spec */ -// Imported to Gobra from https://github.com/antlr/grammars-v4/tree/fae6a8500e9c6a1ec895fca1495b0384b9144091/golang +// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/5493f3e2458d443f5a475359bf5e7cda87b25559/golang +// Extended with Generics parser grammar GoParser; @@ -68,11 +62,15 @@ expressionList: expression (COMMA expression)*; typeDecl: TYPE (typeSpec | L_PAREN (typeSpec eos)* R_PAREN); -typeSpec: IDENTIFIER ASSIGN? type_; +typeSpec: aliasDecl | typeDef; + +aliasDecl: IDENTIFIER ASSIGN type_; + +typeDef: IDENTIFIER typeParameters? type_; // Function declarations -functionDecl: FUNC IDENTIFIER (signature block?); +functionDecl: FUNC IDENTIFIER typeParameters? (signature block?); methodDecl: FUNC receiver IDENTIFIER ( signature block?); @@ -207,7 +205,7 @@ rangeClause: ( goStmt: GO expression; -type_: typeName | typeLit | L_PAREN type_ R_PAREN; +type_: typeName index? | typeLit | L_PAREN type_ R_PAREN; typeName: qualifiedIdent | IDENTIFIER; @@ -230,7 +228,13 @@ elementType: type_; pointerType: STAR type_; interfaceType: - INTERFACE L_CURLY ((methodSpec | typeName) eos)* R_CURLY; + INTERFACE L_CURLY (interfaceElem eos)* R_CURLY; + +interfaceElem: methodSpec | typeElem; + +typeElem: typeTerm (OR typeTerm)*; + +typeTerm: type_; sliceType: L_BRACKET R_BRACKET elementType; @@ -256,6 +260,14 @@ parameters: parameterDecl: identifierList? ELLIPSIS? type_; +typeParameters: L_BRACKET typeParamList COMMA? R_BRACKET; + +typeParamList: typeParamDecl (COMMA typeParamDecl)*; + +typeParamDecl: identifierList typeConstraint; + +typeConstraint: typeElem; + expression: primaryExpr | unary_op = ( @@ -301,7 +313,9 @@ primaryExpr: ); -conversion: nonNamedType L_PAREN expression COMMA? R_PAREN; + + +conversion: type_ L_PAREN expression COMMA? R_PAREN; nonNamedType: typeLit | L_PAREN nonNamedType R_PAREN; @@ -335,7 +349,7 @@ literalType: | L_BRACKET ELLIPSIS R_BRACKET elementType | sliceType | mapType - | typeName; + | typeName index?; literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -356,11 +370,11 @@ fieldDecl: ( string_: RAW_STRING_LIT | INTERPRETED_STRING_LIT; -embeddedField: STAR? typeName; +embeddedField: STAR? typeName index?; functionLit: FUNC signature block; // function -index: L_BRACKET expression R_BRACKET; +index: L_BRACKET expression (COMMA expression)* COMMA? R_BRACKET; slice_: L_BRACKET ( diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index c37e545ba..c2935dedd 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -226,7 +226,7 @@ new_: NEW L_PAREN type_ R_PAREN; specMember: specification (functionDecl[$specification.trusted, $specification.pure] | methodDecl[$specification.trusted, $specification.pure]); -functionDecl[boolean trusted, boolean pure]: FUNC IDENTIFIER (signature blockWithBodyParameterInfo?); +functionDecl[boolean trusted, boolean pure]: FUNC IDENTIFIER typeParameters? (signature blockWithBodyParameterInfo?); methodDecl[boolean trusted, boolean pure]: FUNC receiver IDENTIFIER (signature blockWithBodyParameterInfo?); @@ -393,7 +393,9 @@ predConstructArgs: L_PRED expressionList? COMMA? R_PRED; // Added predicate spec and method specifications interfaceType: - INTERFACE L_CURLY ((methodSpec | typeName| predicateSpec) eos)* R_CURLY; + INTERFACE L_CURLY (interfaceElem eos)* R_CURLY; + +interfaceElem: methodSpec | typeElem | predicateSpec; predicateSpec: PRED IDENTIFIER parameters; @@ -402,7 +404,7 @@ methodSpec: | GHOST? specification IDENTIFIER parameters; // Added ghostTypeLiterals -type_: typeName | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; +type_: typeName index? | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; // Added pred types typeLit: @@ -428,7 +430,7 @@ literalType: | sliceType | mapType | ghostTypeLit - | typeName; + | typeName index?; implicitArray: L_BRACKET ELLIPSIS R_BRACKET elementType; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 13027367a..634b1c0b9 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraLexer.g4 by ANTLR 4.12.0 +// Generated from S:/GitHub/gobra/src/main/antlr4\GobraLexer.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 0b583ef70..252bc39ab 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from S:/GitHub/gobra/src/main/antlr4\GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -71,32 +71,35 @@ public class GobraParser extends GobraParserBase { RULE_statement = 83, RULE_applyStmt = 84, RULE_packageStmt = 85, RULE_specForStmt = 86, RULE_loopSpec = 87, RULE_deferStmt = 88, RULE_basicLit = 89, RULE_primaryExpr = 90, RULE_functionLit = 91, RULE_closureDecl = 92, RULE_predConstructArgs = 93, - RULE_interfaceType = 94, RULE_predicateSpec = 95, RULE_methodSpec = 96, - RULE_type_ = 97, RULE_typeLit = 98, RULE_predType = 99, RULE_predTypeParams = 100, - RULE_literalType = 101, RULE_implicitArray = 102, RULE_slice_ = 103, RULE_low = 104, - RULE_high = 105, RULE_cap = 106, RULE_assign_op = 107, RULE_rangeClause = 108, - RULE_packageClause = 109, RULE_importPath = 110, RULE_declaration = 111, - RULE_constDecl = 112, RULE_constSpec = 113, RULE_identifierList = 114, - RULE_expressionList = 115, RULE_typeDecl = 116, RULE_typeSpec = 117, RULE_varDecl = 118, - RULE_block = 119, RULE_statementList = 120, RULE_simpleStmt = 121, RULE_expressionStmt = 122, - RULE_sendStmt = 123, RULE_incDecStmt = 124, RULE_assignment = 125, RULE_emptyStmt = 126, - RULE_labeledStmt = 127, RULE_returnStmt = 128, RULE_breakStmt = 129, RULE_continueStmt = 130, - RULE_gotoStmt = 131, RULE_fallthroughStmt = 132, RULE_ifStmt = 133, RULE_switchStmt = 134, - RULE_exprSwitchStmt = 135, RULE_exprCaseClause = 136, RULE_exprSwitchCase = 137, - RULE_typeSwitchStmt = 138, RULE_typeSwitchGuard = 139, RULE_typeCaseClause = 140, - RULE_typeSwitchCase = 141, RULE_typeList = 142, RULE_selectStmt = 143, - RULE_commClause = 144, RULE_commCase = 145, RULE_recvStmt = 146, RULE_forStmt = 147, - RULE_forClause = 148, RULE_goStmt = 149, RULE_typeName = 150, RULE_arrayType = 151, - RULE_arrayLength = 152, RULE_elementType = 153, RULE_pointerType = 154, - RULE_sliceType = 155, RULE_mapType = 156, RULE_channelType = 157, RULE_functionType = 158, - RULE_signature = 159, RULE_result = 160, RULE_parameters = 161, RULE_conversion = 162, - RULE_nonNamedType = 163, RULE_operand = 164, RULE_literal = 165, RULE_integer = 166, - RULE_operandName = 167, RULE_qualifiedIdent = 168, RULE_compositeLit = 169, - RULE_literalValue = 170, RULE_elementList = 171, RULE_keyedElement = 172, - RULE_key = 173, RULE_element = 174, RULE_structType = 175, RULE_fieldDecl = 176, - RULE_string_ = 177, RULE_embeddedField = 178, RULE_index = 179, RULE_typeAssertion = 180, - RULE_arguments = 181, RULE_methodExpr = 182, RULE_receiverType = 183, - RULE_eos = 184; + RULE_interfaceType = 94, RULE_interfaceElem = 95, RULE_predicateSpec = 96, + RULE_methodSpec = 97, RULE_type_ = 98, RULE_typeLit = 99, RULE_predType = 100, + RULE_predTypeParams = 101, RULE_literalType = 102, RULE_implicitArray = 103, + RULE_slice_ = 104, RULE_low = 105, RULE_high = 106, RULE_cap = 107, RULE_assign_op = 108, + RULE_rangeClause = 109, RULE_packageClause = 110, RULE_importPath = 111, + RULE_declaration = 112, RULE_constDecl = 113, RULE_constSpec = 114, RULE_identifierList = 115, + RULE_expressionList = 116, RULE_typeDecl = 117, RULE_typeSpec = 118, RULE_aliasDecl = 119, + RULE_typeDef = 120, RULE_varDecl = 121, RULE_block = 122, RULE_statementList = 123, + RULE_simpleStmt = 124, RULE_expressionStmt = 125, RULE_sendStmt = 126, + RULE_incDecStmt = 127, RULE_assignment = 128, RULE_emptyStmt = 129, RULE_labeledStmt = 130, + RULE_returnStmt = 131, RULE_breakStmt = 132, RULE_continueStmt = 133, + RULE_gotoStmt = 134, RULE_fallthroughStmt = 135, RULE_ifStmt = 136, RULE_switchStmt = 137, + RULE_exprSwitchStmt = 138, RULE_exprCaseClause = 139, RULE_exprSwitchCase = 140, + RULE_typeSwitchStmt = 141, RULE_typeSwitchGuard = 142, RULE_typeCaseClause = 143, + RULE_typeSwitchCase = 144, RULE_typeList = 145, RULE_selectStmt = 146, + RULE_commClause = 147, RULE_commCase = 148, RULE_recvStmt = 149, RULE_forStmt = 150, + RULE_forClause = 151, RULE_goStmt = 152, RULE_typeName = 153, RULE_arrayType = 154, + RULE_arrayLength = 155, RULE_elementType = 156, RULE_pointerType = 157, + RULE_typeElem = 158, RULE_typeTerm = 159, RULE_sliceType = 160, RULE_mapType = 161, + RULE_channelType = 162, RULE_functionType = 163, RULE_signature = 164, + RULE_result = 165, RULE_parameters = 166, RULE_typeParameters = 167, RULE_typeParamList = 168, + RULE_typeParamDecl = 169, RULE_typeConstraint = 170, RULE_conversion = 171, + RULE_nonNamedType = 172, RULE_operand = 173, RULE_literal = 174, RULE_integer = 175, + RULE_operandName = 176, RULE_qualifiedIdent = 177, RULE_compositeLit = 178, + RULE_literalValue = 179, RULE_elementList = 180, RULE_keyedElement = 181, + RULE_key = 182, RULE_element = 183, RULE_structType = 184, RULE_fieldDecl = 185, + RULE_string_ = 186, RULE_embeddedField = 187, RULE_index = 188, RULE_typeAssertion = 189, + RULE_arguments = 190, RULE_methodExpr = 191, RULE_receiverType = 192, + RULE_eos = 193; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -118,24 +121,26 @@ private static String[] makeRuleNames() { "receiver", "parameterDecl", "actualParameterDecl", "ghostParameterDecl", "parameterType", "expression", "statement", "applyStmt", "packageStmt", "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", - "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", - "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", - "packageClause", "importPath", "declaration", "constDecl", "constSpec", - "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", - "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", - "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", - "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", - "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", - "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", - "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", - "typeName", "arrayType", "arrayLength", "elementType", "pointerType", + "closureDecl", "predConstructArgs", "interfaceType", "interfaceElem", + "predicateSpec", "methodSpec", "type_", "typeLit", "predType", "predTypeParams", + "literalType", "implicitArray", "slice_", "low", "high", "cap", "assign_op", + "rangeClause", "packageClause", "importPath", "declaration", "constDecl", + "constSpec", "identifierList", "expressionList", "typeDecl", "typeSpec", + "aliasDecl", "typeDef", "varDecl", "block", "statementList", "simpleStmt", + "expressionStmt", "sendStmt", "incDecStmt", "assignment", "emptyStmt", + "labeledStmt", "returnStmt", "breakStmt", "continueStmt", "gotoStmt", + "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", "exprCaseClause", + "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", "typeCaseClause", + "typeSwitchCase", "typeList", "selectStmt", "commClause", "commCase", + "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "arrayType", + "arrayLength", "elementType", "pointerType", "typeElem", "typeTerm", "sliceType", "mapType", "channelType", "functionType", "signature", "result", - "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", - "operandName", "qualifiedIdent", "compositeLit", "literalValue", "elementList", - "keyedElement", "key", "element", "structType", "fieldDecl", "string_", - "embeddedField", "index", "typeAssertion", "arguments", "methodExpr", - "receiverType", "eos" + "parameters", "typeParameters", "typeParamList", "typeParamDecl", "typeConstraint", + "conversion", "nonNamedType", "operand", "literal", "integer", "operandName", + "qualifiedIdent", "compositeLit", "literalValue", "elementList", "keyedElement", + "key", "element", "structType", "fieldDecl", "string_", "embeddedField", + "index", "typeAssertion", "arguments", "methodExpr", "receiverType", + "eos" }; } public static final String[] ruleNames = makeRuleNames(); @@ -267,9 +272,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(370); + setState(388); expression(0); - setState(371); + setState(389); match(EOF); } } @@ -307,9 +312,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(373); + setState(391); statement(); - setState(374); + setState(392); match(EOF); } } @@ -347,9 +352,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(376); + setState(394); type_(); - setState(377); + setState(395); match(EOF); } } @@ -394,21 +399,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(379); + setState(397); maybeAddressableIdentifier(); - setState(384); + setState(402); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(380); + setState(398); match(COMMA); - setState(381); + setState(399); maybeAddressableIdentifier(); } } - setState(386); + setState(404); _errHandler.sync(this); _la = _input.LA(1); } @@ -447,14 +452,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(387); + setState(405); match(IDENTIFIER); - setState(389); + setState(407); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(388); + setState(406); match(ADDR_MOD); } } @@ -532,79 +537,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(396); + setState(414); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(391); + setState(409); initPost(); - setState(392); + setState(410); eos(); } } - setState(398); + setState(416); _errHandler.sync(this); _la = _input.LA(1); } - setState(399); + setState(417); packageClause(); - setState(400); + setState(418); eos(); - setState(406); + setState(424); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(401); + setState(419); importDecl(); - setState(402); + setState(420); eos(); } } - setState(408); + setState(426); _errHandler.sync(this); _la = _input.LA(1); } - setState(418); + setState(436); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881350095299L) != 0)) { { { - setState(412); + setState(430); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(409); + setState(427); specMember(); } break; case 2: { - setState(410); + setState(428); declaration(); } break; case 3: { - setState(411); + setState(429); ghostMember(); } break; } - setState(414); + setState(432); eos(); } } - setState(420); + setState(438); _errHandler.sync(this); _la = _input.LA(1); } - setState(421); + setState(439); match(EOF); } } @@ -660,39 +665,39 @@ public final PreambleContext preamble() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(428); + setState(446); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(423); + setState(441); initPost(); - setState(424); + setState(442); eos(); } } - setState(430); + setState(448); _errHandler.sync(this); _la = _input.LA(1); } - setState(431); + setState(449); packageClause(); - setState(432); + setState(450); eos(); - setState(438); + setState(456); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(433); + setState(451); importDecl(); - setState(434); + setState(452); eos(); } } - setState(440); + setState(458); _errHandler.sync(this); _la = _input.LA(1); } @@ -732,9 +737,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(441); + setState(459); match(INIT_POST); - setState(442); + setState(460); expression(0); } } @@ -772,9 +777,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(444); + setState(462); match(IMPORT_PRE); - setState(445); + setState(463); expression(0); } } @@ -827,28 +832,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(452); + setState(470); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(447); + setState(465); importPre(); - setState(448); + setState(466); eos(); } } - setState(454); + setState(472); _errHandler.sync(this); _la = _input.LA(1); } - setState(456); + setState(474); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(455); + setState(473); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -862,7 +867,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(458); + setState(476); importPath(); } } @@ -918,56 +923,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(465); + setState(483); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(460); + setState(478); importPre(); - setState(461); + setState(479); eos(); } } - setState(467); + setState(485); _errHandler.sync(this); _la = _input.LA(1); } - setState(481); + setState(499); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(468); + setState(486); match(IMPORT); - setState(469); + setState(487); importSpec(); } break; case 2: { - setState(470); + setState(488); match(IMPORT); - setState(471); + setState(489); match(L_PAREN); - setState(477); + setState(495); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(472); + setState(490); importSpec(); - setState(473); + setState(491); eos(); } } - setState(479); + setState(497); _errHandler.sync(this); _la = _input.LA(1); } - setState(480); + setState(498); match(R_PAREN); } break; @@ -1014,34 +1019,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 22, RULE_ghostMember); try { - setState(487); + setState(505); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(483); + setState(501); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(484); + setState(502); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(485); + setState(503); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(486); + setState(504); explicitGhostMember(); } break; @@ -1133,16 +1138,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 24, RULE_ghostStatement); int _la; try { - setState(496); + setState(514); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(489); + setState(507); match(GHOST); - setState(490); + setState(508); statement(); } break; @@ -1151,7 +1156,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(491); + setState(509); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1162,7 +1167,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(492); + setState(510); predicateAccess(); } break; @@ -1173,7 +1178,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(493); + setState(511); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { @@ -1184,7 +1189,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(494); + setState(512); expression(0); } break; @@ -1192,7 +1197,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(495); + setState(513); matchStmt(); } break; @@ -1233,7 +1238,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(498); + setState(516); statementWithSpec(); } } @@ -1274,10 +1279,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(500); + setState(518); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(501); + setState(519); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1323,21 +1328,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(503); + setState(521); match(OUTLINE); - setState(504); + setState(522); match(L_PAREN); - setState(506); + setState(524); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(505); + setState(523); statementList(); } break; } - setState(508); + setState(526); match(R_PAREN); } } @@ -1408,97 +1413,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 32, RULE_ghostPrimaryExpr); try { - setState(523); + setState(541); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(510); + setState(528); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(511); + setState(529); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(512); + setState(530); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(513); + setState(531); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(514); + setState(532); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(515); + setState(533); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(516); + setState(534); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(517); + setState(535); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(518); + setState(536); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(519); + setState(537); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(520); + setState(538); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(521); + setState(539); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(522); + setState(540); matchExpr(); } break; @@ -1537,7 +1542,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(525); + setState(543); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1585,13 +1590,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(545); match(TYPE); - setState(528); + setState(546); match(L_BRACKET); - setState(529); + setState(547); type_(); - setState(530); + setState(548); match(R_BRACKET); } } @@ -1637,32 +1642,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(532); + setState(550); boundVariableDecl(); - setState(537); + setState(555); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(533); + setState(551); match(COMMA); - setState(534); + setState(552); boundVariableDecl(); } } } - setState(539); + setState(557); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } - setState(541); + setState(559); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(540); + setState(558); match(COMMA); } } @@ -1711,25 +1716,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(543); + setState(561); match(IDENTIFIER); - setState(548); + setState(566); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(544); + setState(562); match(COMMA); - setState(545); + setState(563); match(IDENTIFIER); } } - setState(550); + setState(568); _errHandler.sync(this); _la = _input.LA(1); } - setState(551); + setState(569); elementType(); } } @@ -1770,17 +1775,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(556); + setState(574); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(553); + setState(571); trigger(); } } - setState(558); + setState(576); _errHandler.sync(this); _la = _input.LA(1); } @@ -1829,27 +1834,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(559); + setState(577); match(L_CURLY); - setState(560); + setState(578); expression(0); - setState(565); + setState(583); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(561); + setState(579); match(COMMA); - setState(562); + setState(580); expression(0); } } - setState(567); + setState(585); _errHandler.sync(this); _la = _input.LA(1); } - setState(568); + setState(586); match(R_CURLY); } } @@ -1886,7 +1891,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(570); + setState(588); primaryExpr(0); } } @@ -1926,13 +1931,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(590); match(SOME); - setState(573); + setState(591); match(L_PAREN); - setState(574); + setState(592); expression(0); - setState(575); + setState(593); match(R_PAREN); } } @@ -1972,13 +1977,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(577); + setState(595); match(NONE); - setState(578); + setState(596); match(L_BRACKET); - setState(579); + setState(597); type_(); - setState(580); + setState(598); match(R_BRACKET); } } @@ -2018,13 +2023,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(582); + setState(600); match(GET); - setState(583); + setState(601); match(L_PAREN); - setState(584); + setState(602); expression(0); - setState(585); + setState(603); match(R_PAREN); } } @@ -2068,7 +2073,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(605); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2079,11 +2084,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(588); + setState(606); match(L_PAREN); - setState(589); + setState(607); expression(0); - setState(590); + setState(608); match(R_PAREN); } } @@ -2129,27 +2134,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(592); + setState(610); match(OLD); - setState(597); + setState(615); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(593); + setState(611); match(L_BRACKET); - setState(594); + setState(612); oldLabelUse(); - setState(595); + setState(613); match(R_BRACKET); } } - setState(599); + setState(617); match(L_PAREN); - setState(600); + setState(618); expression(0); - setState(601); + setState(619); match(R_PAREN); } } @@ -2185,20 +2190,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 58, RULE_oldLabelUse); try { - setState(605); + setState(623); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(603); + setState(621); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(604); + setState(622); match(LHS); } break; @@ -2237,7 +2242,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(607); + setState(625); match(IDENTIFIER); } } @@ -2277,13 +2282,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(627); match(BEFORE); - setState(610); + setState(628); match(L_PAREN); - setState(611); + setState(629); expression(0); - setState(612); + setState(630); match(R_PAREN); } } @@ -2323,13 +2328,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(614); + setState(632); match(IS_COMPARABLE); - setState(615); + setState(633); match(L_PAREN); - setState(616); + setState(634); expression(0); - setState(617); + setState(635); match(R_PAREN); } } @@ -2369,13 +2374,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(619); + setState(637); match(TYPE_OF); - setState(620); + setState(638); match(L_PAREN); - setState(621); + setState(639); expression(0); - setState(622); + setState(640); match(R_PAREN); } } @@ -2420,25 +2425,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(624); + setState(642); match(ACCESS); - setState(625); + setState(643); match(L_PAREN); - setState(626); + setState(644); expression(0); - setState(629); + setState(647); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(627); + setState(645); match(COMMA); - setState(628); + setState(646); expression(0); } } - setState(631); + setState(649); match(R_PAREN); } } @@ -2486,7 +2491,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(633); + setState(651); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2497,15 +2502,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(634); + setState(652); match(L_BRACKET); - setState(635); + setState(653); expression(0); - setState(636); + setState(654); match(DOT_DOT); - setState(637); + setState(655); expression(0); - setState(638); + setState(656); match(R_BRACKET); } } @@ -2558,29 +2563,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(640); + setState(658); match(MATCH); - setState(641); + setState(659); expression(0); - setState(642); + setState(660); match(L_CURLY); - setState(648); + setState(666); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(643); + setState(661); matchExprClause(); - setState(644); + setState(662); eos(); } } - setState(650); + setState(668); _errHandler.sync(this); _la = _input.LA(1); } - setState(651); + setState(669); match(R_CURLY); } } @@ -2621,11 +2626,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(653); + setState(671); matchCase(); - setState(654); + setState(672); match(COLON); - setState(655); + setState(673); expression(0); } } @@ -2672,29 +2677,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(657); + setState(675); match(L_BRACKET); { - setState(658); + setState(676); seqUpdClause(); - setState(663); + setState(681); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(659); + setState(677); match(COMMA); - setState(660); + setState(678); seqUpdClause(); } } - setState(665); + setState(683); _errHandler.sync(this); _la = _input.LA(1); } } - setState(666); + setState(684); match(R_BRACKET); } } @@ -2735,11 +2740,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(668); + setState(686); expression(0); - setState(669); + setState(687); match(ASSIGN); - setState(670); + setState(688); expression(0); } } @@ -2783,7 +2788,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 80, RULE_ghostTypeLit); try { - setState(676); + setState(694); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2793,28 +2798,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(672); + setState(690); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(673); + setState(691); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(674); + setState(692); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(675); + setState(693); adtType(); } break; @@ -2868,27 +2873,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(678); + setState(696); match(DOM); - setState(679); + setState(697); match(L_CURLY); - setState(685); + setState(703); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(680); + setState(698); domainClause(); - setState(681); + setState(699); eos(); } } - setState(687); + setState(705); _errHandler.sync(this); _la = _input.LA(1); } - setState(688); + setState(706); match(R_CURLY); } } @@ -2934,32 +2939,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 84, RULE_domainClause); try { - setState(699); + setState(717); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(690); + setState(708); match(FUNC); - setState(691); + setState(709); match(IDENTIFIER); - setState(692); + setState(710); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(693); + setState(711); match(AXIOM); - setState(694); + setState(712); match(L_CURLY); - setState(695); + setState(713); expression(0); - setState(696); + setState(714); eos(); - setState(697); + setState(715); match(R_CURLY); } break; @@ -3013,27 +3018,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(701); + setState(719); match(ADT); - setState(702); + setState(720); match(L_CURLY); - setState(708); + setState(726); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(703); + setState(721); adtClause(); - setState(704); + setState(722); eos(); } } - setState(710); + setState(728); _errHandler.sync(this); _la = _input.LA(1); } - setState(711); + setState(729); match(R_CURLY); } } @@ -3083,27 +3088,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(713); + setState(731); match(IDENTIFIER); - setState(714); + setState(732); match(L_CURLY); - setState(720); + setState(738); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(715); + setState(733); fieldDecl(); - setState(716); + setState(734); eos(); } } - setState(722); + setState(740); _errHandler.sync(this); _la = _input.LA(1); } - setState(723); + setState(741); match(R_CURLY); } } @@ -3143,13 +3148,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(725); + setState(743); match(GHOST); - setState(726); + setState(744); match(L_BRACKET); - setState(727); + setState(745); match(R_BRACKET); - setState(728); + setState(746); elementType(); } } @@ -3196,7 +3201,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 92, RULE_sqType); int _la; try { - setState(741); + setState(759); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3206,7 +3211,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(730); + setState(748); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3217,11 +3222,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(731); + setState(749); match(L_BRACKET); - setState(732); + setState(750); type_(); - setState(733); + setState(751); match(R_BRACKET); } } @@ -3229,15 +3234,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(735); + setState(753); ((SqTypeContext)_localctx).kind = match(DICT); - setState(736); + setState(754); match(L_BRACKET); - setState(737); + setState(755); type_(); - setState(738); + setState(756); match(R_BRACKET); - setState(739); + setState(757); type_(); } break; @@ -3299,14 +3304,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(753); + setState(771); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(748); + setState(766); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3314,20 +3319,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(743); + setState(761); specStatement(); } break; case PURE: { - setState(744); + setState(762); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(746); + setState(764); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3335,21 +3340,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(750); + setState(768); eos(); } } } - setState(755); + setState(773); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } - setState(758); + setState(776); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(756); + setState(774); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3396,42 +3401,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 96, RULE_specStatement); try { - setState(768); + setState(786); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(760); + setState(778); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(761); + setState(779); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(762); + setState(780); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(763); + setState(781); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(764); + setState(782); ((SpecStatementContext)_localctx).kind = match(POST); - setState(765); + setState(783); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(766); + setState(784); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(767); + setState(785); terminationMeasure(); } break; @@ -3476,24 +3481,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(771); + setState(789); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(770); + setState(788); expressionList(); } break; } - setState(775); + setState(793); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(773); + setState(791); match(IF); - setState(774); + setState(792); expression(0); } break; @@ -3531,7 +3536,7 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 100, RULE_assertion); try { - setState(779); + setState(797); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: @@ -3542,7 +3547,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(778); + setState(796); expression(0); } break; @@ -3591,27 +3596,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(781); + setState(799); match(MATCH); - setState(782); + setState(800); expression(0); - setState(783); + setState(801); match(L_CURLY); - setState(787); + setState(805); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(784); + setState(802); matchStmtClause(); } } - setState(789); + setState(807); _errHandler.sync(this); _la = _input.LA(1); } - setState(790); + setState(808); match(R_CURLY); } } @@ -3652,16 +3657,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(792); + setState(810); matchCase(); - setState(793); + setState(811); match(COLON); - setState(795); + setState(813); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(794); + setState(812); statementList(); } break; @@ -3701,22 +3706,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 106, RULE_matchCase); try { - setState(800); + setState(818); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(797); + setState(815); match(CASE); - setState(798); + setState(816); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(799); + setState(817); match(DEFAULT); } break; @@ -3794,16 +3799,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 108, RULE_matchPattern); int _la; try { - setState(815); + setState(833); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(802); + setState(820); match(QMARK); - setState(803); + setState(821); match(IDENTIFIER); } break; @@ -3811,23 +3816,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(804); + setState(822); literalType(); - setState(805); + setState(823); match(L_CURLY); - setState(810); + setState(828); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956190846021146L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(806); + setState(824); matchPatternList(); - setState(808); + setState(826); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(807); + setState(825); match(COMMA); } } @@ -3835,7 +3840,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(812); + setState(830); match(R_CURLY); } break; @@ -3843,7 +3848,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(814); + setState(832); expression(0); } break; @@ -3890,23 +3895,23 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(817); + setState(835); matchPattern(); - setState(822); + setState(840); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(818); + setState(836); match(COMMA); - setState(819); + setState(837); matchPattern(); } } } - setState(824); + setState(842); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } @@ -3954,33 +3959,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(825); + setState(843); match(L_CURLY); - setState(830); + setState(848); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(826); + setState(844); match(SHARE); - setState(827); + setState(845); identifierList(); - setState(828); + setState(846); eos(); } break; } - setState(833); + setState(851); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(832); + setState(850); statementList(); } break; } - setState(835); + setState(853); match(R_CURLY); } } @@ -4025,42 +4030,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(839); + setState(857); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(837); + setState(855); qualifiedIdent(); } break; case 2: { - setState(838); + setState(856); match(IDENTIFIER); } break; } - setState(849); + setState(867); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(841); + setState(859); match(L_CURLY); - setState(846); + setState(864); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(842); + setState(860); closureSpecParams(); - setState(844); + setState(862); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(843); + setState(861); match(COMMA); } } @@ -4068,7 +4073,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(848); + setState(866); match(R_CURLY); } break; @@ -4116,23 +4121,23 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(851); + setState(869); closureSpecParam(); - setState(856); + setState(874); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,53,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(852); + setState(870); match(COMMA); - setState(853); + setState(871); closureSpecParam(); } } } - setState(858); + setState(876); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,53,_ctx); } @@ -4173,19 +4178,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(861); + setState(879); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(859); + setState(877); match(IDENTIFIER); - setState(860); + setState(878); match(COLON); } break; } - setState(863); + setState(881); expression(0); } } @@ -4230,15 +4235,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(865); + setState(883); match(PROOF); - setState(866); + setState(884); expression(0); - setState(867); + setState(885); match(IMPL); - setState(868); + setState(886); closureSpecInstance(); - setState(869); + setState(887); block(); } } @@ -4300,52 +4305,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(871); + setState(889); type_(); - setState(872); + setState(890); match(IMPL); - setState(873); + setState(891); type_(); - setState(892); + setState(910); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(874); + setState(892); match(L_CURLY); - setState(880); + setState(898); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(875); + setState(893); implementationProofPredicateAlias(); - setState(876); + setState(894); eos(); } } - setState(882); + setState(900); _errHandler.sync(this); _la = _input.LA(1); } - setState(888); + setState(906); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(883); + setState(901); methodImplementationProof(); - setState(884); + setState(902); eos(); } } - setState(890); + setState(908); _errHandler.sync(this); _la = _input.LA(1); } - setState(891); + setState(909); match(R_CURLY); } break; @@ -4394,28 +4399,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(895); + setState(913); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(894); + setState(912); match(PURE); } } - setState(897); + setState(915); nonLocalReceiver(); - setState(898); + setState(916); match(IDENTIFIER); - setState(899); + setState(917); signature(); - setState(901); + setState(919); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(900); + setState(918); block(); } break; @@ -4460,31 +4465,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(903); + setState(921); match(L_PAREN); - setState(905); + setState(923); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: { - setState(904); + setState(922); match(IDENTIFIER); } break; } - setState(908); + setState(926); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(907); + setState(925); match(STAR); } } - setState(910); + setState(928); typeName(); - setState(911); + setState(929); match(R_PAREN); } } @@ -4524,24 +4529,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 128, RULE_selection); try { - setState(918); + setState(936); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,62,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(913); + setState(931); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(914); + setState(932); type_(); - setState(915); + setState(933); match(DOT); - setState(916); + setState(934); match(IDENTIFIER); } break; @@ -4586,24 +4591,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(920); + setState(938); match(PRED); - setState(921); + setState(939); match(IDENTIFIER); - setState(922); + setState(940); match(DECLARE_ASSIGN); - setState(925); + setState(943); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(923); + setState(941); selection(); } break; case 2: { - setState(924); + setState(942); operandName(); } break; @@ -4651,25 +4656,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(927); + setState(945); match(MAKE); - setState(928); + setState(946); match(L_PAREN); - setState(929); + setState(947); type_(); - setState(932); + setState(950); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(930); + setState(948); match(COMMA); - setState(931); + setState(949); expressionList(); } } - setState(934); + setState(952); match(R_PAREN); } } @@ -4709,13 +4714,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(936); + setState(954); match(NEW); - setState(937); + setState(955); match(L_PAREN); - setState(938); + setState(956); type_(); - setState(939); + setState(957); match(R_PAREN); } } @@ -4759,20 +4764,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(941); + setState(959); ((SpecMemberContext)_localctx).specification = specification(); - setState(944); + setState(962); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(942); + setState(960); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(943); + setState(961); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4799,6 +4804,9 @@ public static class FunctionDeclContext extends ParserRuleContext { public SignatureContext signature() { return getRuleContext(SignatureContext.class,0); } + public TypeParametersContext typeParameters() { + return getRuleContext(TypeParametersContext.class,0); + } public BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() { return getRuleContext(BlockWithBodyParameterInfoContext.class,0); } @@ -4819,22 +4827,33 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) throws RecognitionException { FunctionDeclContext _localctx = new FunctionDeclContext(_ctx, getState(), trusted, pure); enterRule(_localctx, 138, RULE_functionDecl); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(946); + setState(964); match(FUNC); - setState(947); + setState(965); match(IDENTIFIER); + setState(967); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==L_BRACKET) { + { + setState(966); + typeParameters(); + } + } + { - setState(948); + setState(969); signature(); - setState(950); + setState(971); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { - setState(949); + setState(970); blockWithBodyParameterInfo(); } break; @@ -4888,21 +4907,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R try { enterOuterAlt(_localctx, 1); { - setState(952); + setState(973); match(FUNC); - setState(953); + setState(974); receiver(); - setState(954); + setState(975); match(IDENTIFIER); { - setState(955); + setState(976); signature(); - setState(957); + setState(978); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(956); + setState(977); blockWithBodyParameterInfo(); } break; @@ -4947,9 +4966,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(959); + setState(980); match(GHOST); - setState(962); + setState(983); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4960,7 +4979,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(960); + setState(981); specMember(); } break; @@ -4968,7 +4987,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(961); + setState(982); declaration(); } break; @@ -5015,18 +5034,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(964); + setState(985); match(PRED); - setState(965); + setState(986); match(IDENTIFIER); - setState(966); + setState(987); parameters(); - setState(968); + setState(989); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(967); + setState(988); predicateBody(); } break; @@ -5071,13 +5090,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(970); + setState(991); match(L_CURLY); - setState(971); + setState(992); expression(0); - setState(972); + setState(993); eos(); - setState(973); + setState(994); match(R_CURLY); } } @@ -5122,20 +5141,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(975); + setState(996); match(PRED); - setState(976); + setState(997); receiver(); - setState(977); + setState(998); match(IDENTIFIER); - setState(978); + setState(999); parameters(); - setState(980); + setState(1001); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(979); + setState(1000); predicateBody(); } break; @@ -5182,9 +5201,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(982); + setState(1003); maybeAddressableIdentifierList(); - setState(990); + setState(1011); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5207,16 +5226,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(983); + setState(1004); type_(); - setState(986); + setState(1007); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(984); + setState(1005); match(ASSIGN); - setState(985); + setState(1006); expressionList(); } break; @@ -5225,9 +5244,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(988); + setState(1009); match(ASSIGN); - setState(989); + setState(1010); expressionList(); } break; @@ -5273,11 +5292,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(992); + setState(1013); maybeAddressableIdentifierList(); - setState(993); + setState(1014); match(DECLARE_ASSIGN); - setState(994); + setState(1015); expressionList(); } } @@ -5321,31 +5340,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(996); + setState(1017); match(L_PAREN); - setState(998); + setState(1019); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(997); + setState(1018); maybeAddressableIdentifier(); } break; } - setState(1000); + setState(1021); type_(); - setState(1002); + setState(1023); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1001); + setState(1022); match(COMMA); } } - setState(1004); + setState(1025); match(R_PAREN); } } @@ -5383,20 +5402,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 156, RULE_parameterDecl); try { - setState(1008); + setState(1029); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1006); + setState(1027); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1007); + setState(1028); ghostParameterDecl(); } break; @@ -5438,17 +5457,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1011); + setState(1032); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(1010); + setState(1031); identifierList(); } break; } - setState(1013); + setState(1034); parameterType(); } } @@ -5489,19 +5508,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1015); + setState(1036); match(GHOST); - setState(1017); + setState(1038); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(1016); + setState(1037); identifierList(); } break; } - setState(1019); + setState(1040); parameterType(); } } @@ -5540,17 +5559,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1022); + setState(1043); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1021); + setState(1042); match(ELLIPSIS); } } - setState(1024); + setState(1045); type_(); } } @@ -5872,16 +5891,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1047); + setState(1068); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1027); + setState(1048); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { @@ -5892,7 +5911,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1028); + setState(1049); expression(15); } break; @@ -5901,7 +5920,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1029); + setState(1050); primaryExpr(0); } break; @@ -5910,13 +5929,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1030); + setState(1051); match(UNFOLDING); - setState(1031); + setState(1052); predicateAccess(); - setState(1032); + setState(1053); match(IN); - setState(1033); + setState(1054); expression(3); } break; @@ -5925,13 +5944,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1035); + setState(1056); match(LET); - setState(1036); + setState(1057); shortVarDecl(); - setState(1037); + setState(1058); match(IN); - setState(1038); + setState(1059); expression(2); } break; @@ -5940,7 +5959,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1040); + setState(1061); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5950,38 +5969,38 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1041); + setState(1062); boundVariables(); - setState(1042); + setState(1063); match(COLON); - setState(1043); + setState(1064); match(COLON); - setState(1044); + setState(1065); triggers(); - setState(1045); + setState(1066); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1084); + setState(1105); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1082); + setState(1103); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1049); + setState(1070); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1050); + setState(1071); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { @@ -5992,7 +6011,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1051); + setState(1072); expression(14); } break; @@ -6000,9 +6019,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1052); + setState(1073); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1053); + setState(1074); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { @@ -6013,7 +6032,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1054); + setState(1075); expression(13); } break; @@ -6021,9 +6040,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1055); + setState(1076); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1056); + setState(1077); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -6034,7 +6053,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1057); + setState(1078); expression(12); } break; @@ -6042,9 +6061,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1058); + setState(1079); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1059); + setState(1080); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -6055,7 +6074,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1060); + setState(1081); expression(11); } break; @@ -6063,9 +6082,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1061); + setState(1082); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1062); + setState(1083); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { @@ -6076,7 +6095,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1063); + setState(1084); expression(10); } break; @@ -6084,11 +6103,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1064); + setState(1085); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1065); + setState(1086); match(LOGICAL_AND); - setState(1066); + setState(1087); expression(8); } break; @@ -6096,11 +6115,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1067); + setState(1088); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1068); + setState(1089); match(LOGICAL_OR); - setState(1069); + setState(1090); expression(7); } break; @@ -6108,11 +6127,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1070); + setState(1091); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1071); + setState(1092); match(IMPLIES); - setState(1072); + setState(1093); expression(5); } break; @@ -6120,15 +6139,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1073); + setState(1094); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1074); + setState(1095); match(QMARK); - setState(1075); + setState(1096); expression(0); - setState(1076); + setState(1097); match(COLON); - setState(1077); + setState(1098); expression(4); } break; @@ -6136,20 +6155,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1079); + setState(1100); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1080); + setState(1101); match(IMPL); - setState(1081); + setState(1102); closureSpecInstance(); } break; } } } - setState(1086); + setState(1107); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,81,_ctx); + _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } } } @@ -6241,146 +6260,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 166, RULE_statement); try { - setState(1107); + setState(1128); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1087); + setState(1108); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1088); + setState(1109); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1089); + setState(1110); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1090); + setState(1111); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1091); + setState(1112); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1092); + setState(1113); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1093); + setState(1114); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1094); + setState(1115); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1095); + setState(1116); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1096); + setState(1117); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1097); + setState(1118); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1098); + setState(1119); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1099); + setState(1120); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1100); + setState(1121); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1101); + setState(1122); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1102); + setState(1123); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1103); + setState(1124); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1104); + setState(1125); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1105); + setState(1126); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1106); + setState(1127); closureImplProofStmt(); } break; @@ -6420,9 +6439,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1109); + setState(1130); match(APPLY); - setState(1110); + setState(1131); expression(0); } } @@ -6463,16 +6482,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1112); + setState(1133); match(PACKAGE); - setState(1113); + setState(1134); expression(0); - setState(1115); + setState(1136); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: { - setState(1114); + setState(1135); block(); } break; @@ -6515,9 +6534,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1138); loopSpec(); - setState(1118); + setState(1139); forStmt(); } } @@ -6572,34 +6591,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1126); + setState(1147); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1120); + setState(1141); match(INV); - setState(1121); + setState(1142); expression(0); - setState(1122); + setState(1143); eos(); } } - setState(1128); + setState(1149); _errHandler.sync(this); _la = _input.LA(1); } - setState(1133); + setState(1154); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1129); + setState(1150); match(DEC); - setState(1130); + setState(1151); terminationMeasure(); - setState(1131); + setState(1152); eos(); } } @@ -6645,24 +6664,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 176, RULE_deferStmt); int _la; try { - setState(1140); + setState(1161); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1135); + setState(1156); match(DEFER); - setState(1136); + setState(1157); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1137); + setState(1158); match(DEFER); - setState(1138); + setState(1159); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6673,7 +6692,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1139); + setState(1160); predicateAccess(); } break; @@ -6719,62 +6738,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 178, RULE_basicLit); try { - setState(1150); + setState(1171); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1142); + setState(1163); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1143); + setState(1164); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1144); + setState(1165); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1145); + setState(1166); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1146); + setState(1167); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1147); + setState(1168); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1148); + setState(1169); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1149); + setState(1170); match(RUNE_LIT); } break; @@ -7034,16 +7053,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1164); + setState(1185); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1153); + setState(1174); operand(); } break; @@ -7052,7 +7071,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1154); + setState(1175); conversion(); } break; @@ -7061,7 +7080,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1155); + setState(1176); methodExpr(); } break; @@ -7070,7 +7089,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1156); + setState(1177); ghostPrimaryExpr(); } break; @@ -7079,7 +7098,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1157); + setState(1178); new_(); } break; @@ -7088,7 +7107,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1158); + setState(1179); make(); } break; @@ -7097,7 +7116,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1159); + setState(1180); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { @@ -7108,36 +7127,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1160); + setState(1181); match(L_PAREN); - setState(1161); + setState(1182); expression(0); - setState(1162); + setState(1183); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1188); + setState(1209); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1186); + setState(1207); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1166); + setState(1187); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1167); + setState(1188); match(DOT); - setState(1168); + setState(1189); match(IDENTIFIER); } break; @@ -7145,9 +7164,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1169); + setState(1190); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1170); + setState(1191); index(); } break; @@ -7155,9 +7174,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1171); + setState(1192); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1172); + setState(1193); slice_(); } break; @@ -7165,9 +7184,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1173); + setState(1194); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1174); + setState(1195); seqUpdExp(); } break; @@ -7175,9 +7194,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1175); + setState(1196); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1176); + setState(1197); typeAssertion(); } break; @@ -7185,9 +7204,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1177); + setState(1198); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1178); + setState(1199); arguments(); } break; @@ -7195,13 +7214,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1179); + setState(1200); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1180); + setState(1201); arguments(); - setState(1181); + setState(1202); match(AS); - setState(1182); + setState(1203); closureSpecInstance(); } break; @@ -7209,18 +7228,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); + setState(1205); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1185); + setState(1206); predConstructArgs(); } break; } } } - setState(1190); + setState(1211); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,90,_ctx); + _alt = getInterpreter().adaptivePredict(_input,91,_ctx); } } } @@ -7261,9 +7280,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1191); + setState(1212); ((FunctionLitContext)_localctx).specification = specification(); - setState(1192); + setState(1213); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7311,27 +7330,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1194); + setState(1215); match(FUNC); - setState(1196); + setState(1217); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1195); + setState(1216); match(IDENTIFIER); } } { - setState(1198); + setState(1219); signature(); - setState(1200); + setState(1221); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(1199); + setState(1220); blockWithBodyParameterInfo(); } break; @@ -7376,29 +7395,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1202); + setState(1223); match(L_PRED); - setState(1204); + setState(1225); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1203); + setState(1224); expressionList(); } } - setState(1207); + setState(1228); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1206); + setState(1227); match(COMMA); } } - setState(1209); + setState(1230); match(R_PRED); } } @@ -7418,30 +7437,18 @@ public static class InterfaceTypeContext extends ParserRuleContext { public TerminalNode INTERFACE() { return getToken(GobraParser.INTERFACE, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } + public List interfaceElem() { + return getRuleContexts(InterfaceElemContext.class); + } + public InterfaceElemContext interfaceElem(int i) { + return getRuleContext(InterfaceElemContext.class,i); + } public List eos() { return getRuleContexts(EosContext.class); } public EosContext eos(int i) { return getRuleContext(EosContext.class,i); } - public List methodSpec() { - return getRuleContexts(MethodSpecContext.class); - } - public MethodSpecContext methodSpec(int i) { - return getRuleContext(MethodSpecContext.class,i); - } - public List typeName() { - return getRuleContexts(TypeNameContext.class); - } - public TypeNameContext typeName(int i) { - return getRuleContext(TypeNameContext.class,i); - } - public List predicateSpec() { - return getRuleContexts(PredicateSpecContext.class); - } - public PredicateSpecContext predicateSpec(int i) { - return getRuleContext(PredicateSpecContext.class,i); - } public InterfaceTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -7460,47 +7467,27 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1211); + setState(1232); match(INTERFACE); - setState(1212); + setState(1233); match(L_CURLY); - setState(1222); + setState(1239); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 72057594172173824L) != 0) || _la==TRUSTED || _la==IDENTIFIER) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { { - setState(1216); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { - case 1: - { - setState(1213); - methodSpec(); - } - break; - case 2: - { - setState(1214); - typeName(); - } - break; - case 3: - { - setState(1215); - predicateSpec(); - } - break; - } - setState(1218); + setState(1234); + interfaceElem(); + setState(1235); eos(); } } - setState(1224); + setState(1241); _errHandler.sync(this); _la = _input.LA(1); } - setState(1225); + setState(1242); match(R_CURLY); } } @@ -7515,6 +7502,69 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class InterfaceElemContext extends ParserRuleContext { + public MethodSpecContext methodSpec() { + return getRuleContext(MethodSpecContext.class,0); + } + public TypeElemContext typeElem() { + return getRuleContext(TypeElemContext.class,0); + } + public PredicateSpecContext predicateSpec() { + return getRuleContext(PredicateSpecContext.class,0); + } + public InterfaceElemContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceElem; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitInterfaceElem(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceElemContext interfaceElem() throws RecognitionException { + InterfaceElemContext _localctx = new InterfaceElemContext(_ctx, getState()); + enterRule(_localctx, 190, RULE_interfaceElem); + try { + setState(1247); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1244); + methodSpec(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1245); + typeElem(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1246); + predicateSpec(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class PredicateSpecContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } @@ -7535,15 +7585,15 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateSpecContext predicateSpec() throws RecognitionException { PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_predicateSpec); + enterRule(_localctx, 192, RULE_predicateSpec); try { enterOuterAlt(_localctx, 1); { - setState(1227); + setState(1249); match(PRED); - setState(1228); + setState(1250); match(IDENTIFIER); - setState(1229); + setState(1251); parameters(); } } @@ -7584,53 +7634,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_methodSpec); + enterRule(_localctx, 194, RULE_methodSpec); int _la; try { - setState(1246); + setState(1268); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,100,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1232); + setState(1254); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1231); + setState(1253); match(GHOST); } } - setState(1234); + setState(1256); specification(); - setState(1235); + setState(1257); match(IDENTIFIER); - setState(1236); + setState(1258); parameters(); - setState(1237); + setState(1259); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1240); + setState(1262); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1239); + setState(1261); match(GHOST); } } - setState(1242); + setState(1264); specification(); - setState(1243); + setState(1265); match(IDENTIFIER); - setState(1244); + setState(1266); parameters(); } break; @@ -7652,6 +7702,9 @@ public static class Type_Context extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } + public IndexContext index() { + return getRuleContext(IndexContext.class,0); + } public TypeLitContext typeLit() { return getRuleContext(TypeLitContext.class,0); } @@ -7676,16 +7729,26 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 194, RULE_type_); + enterRule(_localctx, 196, RULE_type_); try { - setState(1255); + setState(1280); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1248); + setState(1270); typeName(); + setState(1272); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + case 1: + { + setState(1271); + index(); + } + break; + } } break; case PRED: @@ -7699,7 +7762,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1249); + setState(1274); typeLit(); } break; @@ -7713,18 +7776,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1250); + setState(1275); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1251); + setState(1276); match(L_PAREN); - setState(1252); + setState(1277); type_(); - setState(1253); + setState(1278); match(R_PAREN); } break; @@ -7785,71 +7848,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_typeLit); + enterRule(_localctx, 198, RULE_typeLit); try { - setState(1266); + setState(1291); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1257); + setState(1282); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1258); + setState(1283); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1259); + setState(1284); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1260); + setState(1285); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1261); + setState(1286); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1262); + setState(1287); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1263); + setState(1288); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1264); + setState(1289); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1265); + setState(1290); predType(); } break; @@ -7885,13 +7948,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_predType); + enterRule(_localctx, 200, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1268); + setState(1293); match(PRED); - setState(1269); + setState(1294); predTypeParams(); } } @@ -7933,45 +7996,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_predTypeParams); + enterRule(_localctx, 202, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1271); + setState(1296); match(L_PAREN); - setState(1283); + setState(1308); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1272); + setState(1297); type_(); - setState(1277); + setState(1302); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + _alt = getInterpreter().adaptivePredict(_input,104,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1273); + setState(1298); match(COMMA); - setState(1274); + setState(1299); type_(); } } } - setState(1279); + setState(1304); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,102,_ctx); + _alt = getInterpreter().adaptivePredict(_input,104,_ctx); } - setState(1281); + setState(1306); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1280); + setState(1305); match(COMMA); } } @@ -7979,7 +8042,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1285); + setState(1310); match(R_PAREN); } } @@ -8017,6 +8080,9 @@ public GhostTypeLitContext ghostTypeLit() { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } + public IndexContext index() { + return getRuleContext(IndexContext.class,0); + } public LiteralTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -8030,58 +8096,69 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_literalType); + enterRule(_localctx, 204, RULE_literalType); + int _la; try { - setState(1294); + setState(1322); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,105,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,108,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1287); + setState(1312); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1288); + setState(1313); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1289); + setState(1314); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1290); + setState(1315); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1291); + setState(1316); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1292); + setState(1317); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1293); + setState(1318); typeName(); + setState(1320); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==L_BRACKET) { + { + setState(1319); + index(); + } + } + } break; } @@ -8118,17 +8195,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_implicitArray); + enterRule(_localctx, 206, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1324); match(L_BRACKET); - setState(1297); + setState(1325); match(ELLIPSIS); - setState(1298); + setState(1326); match(R_BRACKET); - setState(1299); + setState(1327); elementType(); } } @@ -8173,36 +8250,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 206, RULE_slice_); + enterRule(_localctx, 208, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1329); match(L_BRACKET); - setState(1317); + setState(1345); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1303); + setState(1331); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1302); + setState(1330); low(); } } - setState(1305); + setState(1333); match(COLON); - setState(1307); + setState(1335); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1306); + setState(1334); high(); } } @@ -8211,28 +8288,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1310); + setState(1338); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1309); + setState(1337); low(); } } - setState(1312); + setState(1340); match(COLON); - setState(1313); + setState(1341); high(); - setState(1314); + setState(1342); match(COLON); - setState(1315); + setState(1343); cap(); } break; } - setState(1319); + setState(1347); match(R_BRACKET); } } @@ -8265,11 +8342,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_low); + enterRule(_localctx, 210, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1349); expression(0); } } @@ -8302,11 +8379,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_high); + enterRule(_localctx, 212, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1323); + setState(1351); expression(0); } } @@ -8339,11 +8416,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_cap); + enterRule(_localctx, 214, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1325); + setState(1353); expression(0); } } @@ -8386,17 +8463,17 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_assign_op); + enterRule(_localctx, 216, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1356); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { { - setState(1327); + setState(1355); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { @@ -8410,7 +8487,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1330); + setState(1358); match(ASSIGN); } } @@ -8454,48 +8531,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_rangeClause); + enterRule(_localctx, 218, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1366); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { case 1: { - setState(1332); + setState(1360); expressionList(); - setState(1333); + setState(1361); match(ASSIGN); } break; case 2: { - setState(1335); + setState(1363); maybeAddressableIdentifierList(); - setState(1336); + setState(1364); match(DECLARE_ASSIGN); } break; } - setState(1340); + setState(1368); match(RANGE); - setState(1341); + setState(1369); expression(0); - setState(1346); + setState(1374); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1342); + setState(1370); match(WITH); - setState(1344); + setState(1372); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1343); + setState(1371); match(IDENTIFIER); } } @@ -8534,13 +8611,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_packageClause); + enterRule(_localctx, 220, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1348); + setState(1376); match(PACKAGE); - setState(1349); + setState(1377); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8573,11 +8650,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_importPath); + enterRule(_localctx, 222, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1351); + setState(1379); string_(); } } @@ -8616,29 +8693,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_declaration); + enterRule(_localctx, 224, RULE_declaration); try { - setState(1356); + setState(1384); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1353); + setState(1381); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1354); + setState(1382); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1355); + setState(1383); varDecl(); } break; @@ -8687,43 +8764,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_constDecl); + enterRule(_localctx, 226, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1358); + setState(1386); match(CONST); - setState(1370); + setState(1398); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1359); + setState(1387); constSpec(); } break; case L_PAREN: { - setState(1360); + setState(1388); match(L_PAREN); - setState(1366); + setState(1394); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1361); + setState(1389); constSpec(); - setState(1362); + setState(1390); eos(); } } - setState(1368); + setState(1396); _errHandler.sync(this); _la = _input.LA(1); } - setState(1369); + setState(1397); match(R_PAREN); } break; @@ -8768,31 +8845,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_constSpec); + enterRule(_localctx, 228, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1372); + setState(1400); identifierList(); - setState(1378); + setState(1406); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1374); + setState(1402); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1373); + setState(1401); type_(); } } - setState(1376); + setState(1404); match(ASSIGN); - setState(1377); + setState(1405); expressionList(); } break; @@ -8833,30 +8910,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_identifierList); + enterRule(_localctx, 230, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1380); + setState(1408); match(IDENTIFIER); - setState(1385); + setState(1413); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,122,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1381); + setState(1409); match(COMMA); - setState(1382); + setState(1410); match(IDENTIFIER); } } } - setState(1387); + setState(1415); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,119,_ctx); + _alt = getInterpreter().adaptivePredict(_input,122,_ctx); } } } @@ -8896,30 +8973,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_expressionList); + enterRule(_localctx, 232, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1416); expression(0); - setState(1393); + setState(1421); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,123,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1389); + setState(1417); match(COMMA); - setState(1390); + setState(1418); expression(0); } } } - setState(1395); + setState(1423); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,120,_ctx); + _alt = getInterpreter().adaptivePredict(_input,123,_ctx); } } } @@ -8964,43 +9041,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_typeDecl); + enterRule(_localctx, 234, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1424); match(TYPE); - setState(1408); + setState(1436); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1397); + setState(1425); typeSpec(); } break; case L_PAREN: { - setState(1398); + setState(1426); match(L_PAREN); - setState(1404); + setState(1432); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1399); + setState(1427); typeSpec(); - setState(1400); + setState(1428); eos(); } } - setState(1406); + setState(1434); _errHandler.sync(this); _la = _input.LA(1); } - setState(1407); + setState(1435); match(R_PAREN); } break; @@ -9022,11 +9099,12 @@ public final TypeDeclContext typeDecl() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class TypeSpecContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } - public Type_Context type_() { - return getRuleContext(Type_Context.class,0); + public AliasDeclContext aliasDecl() { + return getRuleContext(AliasDeclContext.class,0); + } + public TypeDefContext typeDef() { + return getRuleContext(TypeDefContext.class,0); } - public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } public TypeSpecContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -9040,24 +9118,120 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_typeSpec); - int _la; + enterRule(_localctx, 236, RULE_typeSpec); + try { + setState(1440); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1438); + aliasDecl(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1439); + typeDef(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AliasDeclContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public AliasDeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_aliasDecl; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitAliasDecl(this); + else return visitor.visitChildren(this); + } + } + + public final AliasDeclContext aliasDecl() throws RecognitionException { + AliasDeclContext _localctx = new AliasDeclContext(_ctx, getState()); + enterRule(_localctx, 238, RULE_aliasDecl); + try { + enterOuterAlt(_localctx, 1); + { + setState(1442); + match(IDENTIFIER); + setState(1443); + match(ASSIGN); + setState(1444); + type_(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeDefContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TypeParametersContext typeParameters() { + return getRuleContext(TypeParametersContext.class,0); + } + public TypeDefContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeDef; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeDef(this); + else return visitor.visitChildren(this); + } + } + + public final TypeDefContext typeDef() throws RecognitionException { + TypeDefContext _localctx = new TypeDefContext(_ctx, getState()); + enterRule(_localctx, 240, RULE_typeDef); try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1446); match(IDENTIFIER); - setState(1412); + setState(1448); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ASSIGN) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + case 1: { - setState(1411); - match(ASSIGN); + setState(1447); + typeParameters(); } + break; } - - setState(1414); + setState(1450); type_(); } } @@ -9102,43 +9276,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_varDecl); + enterRule(_localctx, 242, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1416); + setState(1452); match(VAR); - setState(1428); + setState(1464); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1417); + setState(1453); varSpec(); } break; case L_PAREN: { - setState(1418); + setState(1454); match(L_PAREN); - setState(1424); + setState(1460); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1419); + setState(1455); varSpec(); - setState(1420); + setState(1456); eos(); } } - setState(1426); + setState(1462); _errHandler.sync(this); _la = _input.LA(1); } - setState(1427); + setState(1463); match(R_PAREN); } break; @@ -9178,23 +9352,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_block); + enterRule(_localctx, 244, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1466); match(L_CURLY); - setState(1432); + setState(1468); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: { - setState(1431); + setState(1467); statementList(); } break; } - setState(1434); + setState(1470); match(R_CURLY); } } @@ -9244,13 +9418,13 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_statementList); + enterRule(_localctx, 246, RULE_statementList); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1484); _errHandler.sync(this); _alt = 1; do { @@ -9258,17 +9432,17 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1443); + setState(1479); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1437); + setState(1473); _errHandler.sync(this); _la = _input.LA(1); if (_la==SEMI) { { - setState(1436); + setState(1472); match(SEMI); } } @@ -9277,12 +9451,12 @@ public final StatementListContext statementList() throws RecognitionException { break; case 2: { - setState(1440); + setState(1476); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOS) { { - setState(1439); + setState(1475); match(EOS); } } @@ -9291,14 +9465,14 @@ public final StatementListContext statementList() throws RecognitionException { break; case 3: { - setState(1442); + setState(1478); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; } - setState(1445); + setState(1481); statement(); - setState(1446); + setState(1482); eos(); } } @@ -9306,9 +9480,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1450); + setState(1486); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,130,_ctx); + _alt = getInterpreter().adaptivePredict(_input,134,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -9353,43 +9527,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_simpleStmt); + enterRule(_localctx, 248, RULE_simpleStmt); try { - setState(1457); + setState(1493); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1488); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1453); + setState(1489); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1454); + setState(1490); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1455); + setState(1491); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1456); + setState(1492); shortVarDecl(); } break; @@ -9424,11 +9598,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_expressionStmt); + enterRule(_localctx, 250, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1459); + setState(1495); expression(0); } } @@ -9466,15 +9640,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_sendStmt); + enterRule(_localctx, 252, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1497); ((SendStmtContext)_localctx).channel = expression(0); - setState(1462); + setState(1498); match(RECEIVE); - setState(1463); + setState(1499); expression(0); } } @@ -9509,14 +9683,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_incDecStmt); + enterRule(_localctx, 254, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1501); expression(0); - setState(1466); + setState(1502); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9563,15 +9737,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_assignment); + enterRule(_localctx, 256, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1504); expressionList(); - setState(1469); + setState(1505); assign_op(); - setState(1470); + setState(1506); expressionList(); } } @@ -9603,12 +9777,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_emptyStmt); + enterRule(_localctx, 258, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1508); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9651,20 +9825,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_labeledStmt); + enterRule(_localctx, 260, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1474); + setState(1510); match(IDENTIFIER); - setState(1475); + setState(1511); match(COLON); - setState(1477); + setState(1513); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1476); + setState(1512); statement(); } break; @@ -9701,18 +9875,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_returnStmt); + enterRule(_localctx, 262, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1479); + setState(1515); match(RETURN); - setState(1481); + setState(1517); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { case 1: { - setState(1480); + setState(1516); expressionList(); } break; @@ -9747,18 +9921,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_breakStmt); + enterRule(_localctx, 264, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1483); + setState(1519); match(BREAK); - setState(1485); + setState(1521); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: { - setState(1484); + setState(1520); match(IDENTIFIER); } break; @@ -9793,18 +9967,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_continueStmt); + enterRule(_localctx, 266, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1487); + setState(1523); match(CONTINUE); - setState(1489); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { case 1: { - setState(1488); + setState(1524); match(IDENTIFIER); } break; @@ -9839,13 +10013,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_gotoStmt); + enterRule(_localctx, 268, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1491); + setState(1527); match(GOTO); - setState(1492); + setState(1528); match(IDENTIFIER); } } @@ -9876,11 +10050,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_fallthroughStmt); + enterRule(_localctx, 270, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1530); match(FALLTHROUGH); } } @@ -9930,61 +10104,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_ifStmt); + enterRule(_localctx, 272, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1496); + setState(1532); match(IF); - setState(1505); + setState(1541); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: { - setState(1497); + setState(1533); expression(0); } break; case 2: { - setState(1498); + setState(1534); eos(); - setState(1499); + setState(1535); expression(0); } break; case 3: { - setState(1501); + setState(1537); simpleStmt(); - setState(1502); + setState(1538); eos(); - setState(1503); + setState(1539); expression(0); } break; } - setState(1507); + setState(1543); block(); - setState(1513); + setState(1549); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1508); + setState(1544); match(ELSE); - setState(1511); + setState(1547); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1509); + setState(1545); ifStmt(); } break; case L_CURLY: { - setState(1510); + setState(1546); block(); } break; @@ -10028,22 +10202,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_switchStmt); + enterRule(_localctx, 274, RULE_switchStmt); try { - setState(1517); + setState(1553); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1551); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1516); + setState(1552); typeSwitchStmt(); } break; @@ -10093,24 +10267,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_exprSwitchStmt); + enterRule(_localctx, 276, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1519); + setState(1555); match(SWITCH); - setState(1530); + setState(1566); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1521); + setState(1557); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1520); + setState(1556); expression(0); } } @@ -10119,24 +10293,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1524); + setState(1560); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1523); + setState(1559); simpleStmt(); } break; } - setState(1526); + setState(1562); eos(); - setState(1528); + setState(1564); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1527); + setState(1563); expression(0); } } @@ -10144,23 +10318,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1532); + setState(1568); match(L_CURLY); - setState(1536); + setState(1572); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1533); + setState(1569); exprCaseClause(); } } - setState(1538); + setState(1574); _errHandler.sync(this); _la = _input.LA(1); } - setState(1539); + setState(1575); match(R_CURLY); } } @@ -10197,20 +10371,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprCaseClause); + enterRule(_localctx, 278, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1541); + setState(1577); exprSwitchCase(); - setState(1542); + setState(1578); match(COLON); - setState(1544); + setState(1580); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { case 1: { - setState(1543); + setState(1579); statementList(); } break; @@ -10248,24 +10422,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_exprSwitchCase); + enterRule(_localctx, 280, RULE_exprSwitchCase); try { - setState(1549); + setState(1585); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1546); + setState(1582); match(CASE); - setState(1547); + setState(1583); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1548); + setState(1584); match(DEFAULT); } break; @@ -10317,58 +10491,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_typeSwitchStmt); + enterRule(_localctx, 282, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1551); + setState(1587); match(SWITCH); - setState(1560); + setState(1596); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1552); + setState(1588); typeSwitchGuard(); } break; case 2: { - setState(1553); + setState(1589); eos(); - setState(1554); + setState(1590); typeSwitchGuard(); } break; case 3: { - setState(1556); + setState(1592); simpleStmt(); - setState(1557); + setState(1593); eos(); - setState(1558); + setState(1594); typeSwitchGuard(); } break; } - setState(1562); + setState(1598); match(L_CURLY); - setState(1566); + setState(1602); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1563); + setState(1599); typeCaseClause(); } } - setState(1568); + setState(1604); _errHandler.sync(this); _la = _input.LA(1); } - setState(1569); + setState(1605); match(R_CURLY); } } @@ -10407,31 +10581,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeSwitchGuard); + enterRule(_localctx, 284, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1573); + setState(1609); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: { - setState(1571); + setState(1607); match(IDENTIFIER); - setState(1572); + setState(1608); match(DECLARE_ASSIGN); } break; } - setState(1575); + setState(1611); primaryExpr(0); - setState(1576); + setState(1612); match(DOT); - setState(1577); + setState(1613); match(L_PAREN); - setState(1578); + setState(1614); match(TYPE); - setState(1579); + setState(1615); match(R_PAREN); } } @@ -10468,20 +10642,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeCaseClause); + enterRule(_localctx, 286, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1581); + setState(1617); typeSwitchCase(); - setState(1582); + setState(1618); match(COLON); - setState(1584); + setState(1620); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,154,_ctx) ) { case 1: { - setState(1583); + setState(1619); statementList(); } break; @@ -10519,24 +10693,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeSwitchCase); + enterRule(_localctx, 288, RULE_typeSwitchCase); try { - setState(1589); + setState(1625); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1586); + setState(1622); match(CASE); - setState(1587); + setState(1623); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1588); + setState(1624); match(DEFAULT); } break; @@ -10584,12 +10758,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_typeList); + enterRule(_localctx, 290, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1593); + setState(1629); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10612,28 +10786,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1591); + setState(1627); type_(); } break; case NIL_LIT: { - setState(1592); + setState(1628); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1602); + setState(1638); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1595); + setState(1631); match(COMMA); - setState(1598); + setState(1634); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10656,13 +10830,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1596); + setState(1632); type_(); } break; case NIL_LIT: { - setState(1597); + setState(1633); match(NIL_LIT); } break; @@ -10671,7 +10845,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1604); + setState(1640); _errHandler.sync(this); _la = _input.LA(1); } @@ -10712,30 +10886,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_selectStmt); + enterRule(_localctx, 292, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1605); + setState(1641); match(SELECT); - setState(1606); + setState(1642); match(L_CURLY); - setState(1610); + setState(1646); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1607); + setState(1643); commClause(); } } - setState(1612); + setState(1648); _errHandler.sync(this); _la = _input.LA(1); } - setState(1613); + setState(1649); match(R_CURLY); } } @@ -10772,20 +10946,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_commClause); + enterRule(_localctx, 294, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1615); + setState(1651); commCase(); - setState(1616); + setState(1652); match(COLON); - setState(1618); + setState(1654); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1617); + setState(1653); statementList(); } break; @@ -10826,28 +11000,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_commCase); + enterRule(_localctx, 296, RULE_commCase); try { - setState(1626); + setState(1662); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1620); + setState(1656); match(CASE); - setState(1623); + setState(1659); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1621); + setState(1657); sendStmt(); } break; case 2: { - setState(1622); + setState(1658); recvStmt(); } break; @@ -10857,7 +11031,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1625); + setState(1661); match(DEFAULT); } break; @@ -10903,31 +11077,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_recvStmt); + enterRule(_localctx, 298, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1634); + setState(1670); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: { - setState(1628); + setState(1664); expressionList(); - setState(1629); + setState(1665); match(ASSIGN); } break; case 2: { - setState(1631); + setState(1667); identifierList(); - setState(1632); + setState(1668); match(DECLARE_ASSIGN); } break; } - setState(1636); + setState(1672); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10970,24 +11144,24 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_forStmt); + enterRule(_localctx, 300, RULE_forStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1674); match(FOR); - setState(1646); + setState(1682); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: { - setState(1640); + setState(1676); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1639); + setState(1675); expression(0); } } @@ -10996,18 +11170,18 @@ public final ForStmtContext forStmt() throws RecognitionException { break; case 2: { - setState(1642); + setState(1678); forClause(); } break; case 3: { - setState(1644); + setState(1680); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1643); + setState(1679); rangeClause(); } } @@ -11015,7 +11189,7 @@ public final ForStmtContext forStmt() throws RecognitionException { } break; } - setState(1648); + setState(1684); block(); } } @@ -11062,41 +11236,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_forClause); + enterRule(_localctx, 302, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1651); + setState(1687); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1650); + setState(1686); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1653); + setState(1689); eos(); - setState(1655); + setState(1691); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1654); + setState(1690); expression(0); } break; } - setState(1657); + setState(1693); eos(); - setState(1659); + setState(1695); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1658); + setState(1694); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11133,13 +11307,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_goStmt); + enterRule(_localctx, 304, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1661); + setState(1697); match(GO); - setState(1662); + setState(1698); expression(0); } } @@ -11173,22 +11347,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_typeName); + enterRule(_localctx, 306, RULE_typeName); try { - setState(1666); + setState(1702); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1664); + setState(1700); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1665); + setState(1701); match(IDENTIFIER); } break; @@ -11228,17 +11402,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_arrayType); + enterRule(_localctx, 308, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1668); + setState(1704); match(L_BRACKET); - setState(1669); + setState(1705); arrayLength(); - setState(1670); + setState(1706); match(R_BRACKET); - setState(1671); + setState(1707); elementType(); } } @@ -11271,11 +11445,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_arrayLength); + enterRule(_localctx, 310, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1673); + setState(1709); expression(0); } } @@ -11308,11 +11482,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_elementType); + enterRule(_localctx, 312, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1675); + setState(1711); type_(); } } @@ -11346,13 +11520,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_pointerType); + enterRule(_localctx, 314, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1713); match(STAR); - setState(1678); + setState(1714); type_(); } } @@ -11368,35 +11542,55 @@ public final PointerTypeContext pointerType() throws RecognitionException { } @SuppressWarnings("CheckReturnValue") - public static class SliceTypeContext extends ParserRuleContext { - public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } - public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } - public ElementTypeContext elementType() { - return getRuleContext(ElementTypeContext.class,0); + public static class TypeElemContext extends ParserRuleContext { + public List typeTerm() { + return getRuleContexts(TypeTermContext.class); } - public SliceTypeContext(ParserRuleContext parent, int invokingState) { + public TypeTermContext typeTerm(int i) { + return getRuleContext(TypeTermContext.class,i); + } + public List OR() { return getTokens(GobraParser.OR); } + public TerminalNode OR(int i) { + return getToken(GobraParser.OR, i); + } + public TypeElemContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_sliceType; } + @Override public int getRuleIndex() { return RULE_typeElem; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitSliceType(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeElem(this); else return visitor.visitChildren(this); } } - public final SliceTypeContext sliceType() throws RecognitionException { - SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_sliceType); + public final TypeElemContext typeElem() throws RecognitionException { + TypeElemContext _localctx = new TypeElemContext(_ctx, getState()); + enterRule(_localctx, 316, RULE_typeElem); try { + int _alt; enterOuterAlt(_localctx, 1); { - setState(1680); - match(L_BRACKET); - setState(1681); - match(R_BRACKET); - setState(1682); - elementType(); + setState(1716); + typeTerm(); + setState(1721); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1717); + match(OR); + setState(1718); + typeTerm(); + } + } + } + setState(1723); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,171,_ctx); + } } } catch (RecognitionException re) { @@ -11411,43 +11605,29 @@ public final SliceTypeContext sliceType() throws RecognitionException { } @SuppressWarnings("CheckReturnValue") - public static class MapTypeContext extends ParserRuleContext { - public TerminalNode MAP() { return getToken(GobraParser.MAP, 0); } - public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public static class TypeTermContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); } - public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } - public ElementTypeContext elementType() { - return getRuleContext(ElementTypeContext.class,0); - } - public MapTypeContext(ParserRuleContext parent, int invokingState) { + public TypeTermContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_mapType; } + @Override public int getRuleIndex() { return RULE_typeTerm; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMapType(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeTerm(this); else return visitor.visitChildren(this); } } - public final MapTypeContext mapType() throws RecognitionException { - MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_mapType); + public final TypeTermContext typeTerm() throws RecognitionException { + TypeTermContext _localctx = new TypeTermContext(_ctx, getState()); + enterRule(_localctx, 318, RULE_typeTerm); try { enterOuterAlt(_localctx, 1); { - setState(1684); - match(MAP); - setState(1685); - match(L_BRACKET); - setState(1686); + setState(1724); type_(); - setState(1687); - match(R_BRACKET); - setState(1688); - elementType(); } } catch (RecognitionException re) { @@ -11462,7 +11642,101 @@ public final MapTypeContext mapType() throws RecognitionException { } @SuppressWarnings("CheckReturnValue") - public static class ChannelTypeContext extends ParserRuleContext { + public static class SliceTypeContext extends ParserRuleContext { + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public ElementTypeContext elementType() { + return getRuleContext(ElementTypeContext.class,0); + } + public SliceTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sliceType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitSliceType(this); + else return visitor.visitChildren(this); + } + } + + public final SliceTypeContext sliceType() throws RecognitionException { + SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); + enterRule(_localctx, 320, RULE_sliceType); + try { + enterOuterAlt(_localctx, 1); + { + setState(1726); + match(L_BRACKET); + setState(1727); + match(R_BRACKET); + setState(1728); + elementType(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MapTypeContext extends ParserRuleContext { + public TerminalNode MAP() { return getToken(GobraParser.MAP, 0); } + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public ElementTypeContext elementType() { + return getRuleContext(ElementTypeContext.class,0); + } + public MapTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mapType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitMapType(this); + else return visitor.visitChildren(this); + } + } + + public final MapTypeContext mapType() throws RecognitionException { + MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); + enterRule(_localctx, 322, RULE_mapType); + try { + enterOuterAlt(_localctx, 1); + { + setState(1730); + match(MAP); + setState(1731); + match(L_BRACKET); + setState(1732); + type_(); + setState(1733); + match(R_BRACKET); + setState(1734); + elementType(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ChannelTypeContext extends ParserRuleContext { public ElementTypeContext elementType() { return getRuleContext(ElementTypeContext.class,0); } @@ -11481,37 +11755,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_channelType); + enterRule(_localctx, 324, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1695); + setState(1741); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { case 1: { - setState(1690); + setState(1736); match(CHAN); } break; case 2: { - setState(1691); + setState(1737); match(CHAN); - setState(1692); + setState(1738); match(RECEIVE); } break; case 3: { - setState(1693); + setState(1739); match(RECEIVE); - setState(1694); + setState(1740); match(CHAN); } break; } - setState(1697); + setState(1743); elementType(); } } @@ -11545,13 +11819,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_functionType); + enterRule(_localctx, 326, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1699); + setState(1745); match(FUNC); - setState(1700); + setState(1746); signature(); } } @@ -11587,24 +11861,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_signature); + enterRule(_localctx, 328, RULE_signature); try { - setState(1706); + setState(1752); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,173,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1702); + setState(1748); parameters(); - setState(1703); + setState(1749); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1705); + setState(1751); parameters(); } break; @@ -11642,22 +11916,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_result); + enterRule(_localctx, 330, RULE_result); try { - setState(1710); + setState(1756); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1708); + setState(1754); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1709); + setState(1755); type_(); } break; @@ -11701,45 +11975,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_parameters); + enterRule(_localctx, 332, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1712); + setState(1758); match(L_PAREN); - setState(1724); + setState(1770); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441152431101575619L) != 0)) { { - setState(1713); + setState(1759); parameterDecl(); - setState(1718); + setState(1764); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,175,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1714); + setState(1760); match(COMMA); - setState(1715); + setState(1761); parameterDecl(); } } } - setState(1720); + setState(1766); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,175,_ctx); } - setState(1722); + setState(1768); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1721); + setState(1767); match(COMMA); } } @@ -11747,7 +12021,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1726); + setState(1772); match(R_PAREN); } } @@ -11762,10 +12036,207 @@ public final ParametersContext parameters() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class TypeParametersContext extends ParserRuleContext { + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public TypeParamListContext typeParamList() { + return getRuleContext(TypeParamListContext.class,0); + } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public TerminalNode COMMA() { return getToken(GobraParser.COMMA, 0); } + public TypeParametersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeParameters; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeParameters(this); + else return visitor.visitChildren(this); + } + } + + public final TypeParametersContext typeParameters() throws RecognitionException { + TypeParametersContext _localctx = new TypeParametersContext(_ctx, getState()); + enterRule(_localctx, 334, RULE_typeParameters); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1774); + match(L_BRACKET); + setState(1775); + typeParamList(); + setState(1777); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1776); + match(COMMA); + } + } + + setState(1779); + match(R_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeParamListContext extends ParserRuleContext { + public List typeParamDecl() { + return getRuleContexts(TypeParamDeclContext.class); + } + public TypeParamDeclContext typeParamDecl(int i) { + return getRuleContext(TypeParamDeclContext.class,i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public TypeParamListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeParamList; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeParamList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeParamListContext typeParamList() throws RecognitionException { + TypeParamListContext _localctx = new TypeParamListContext(_ctx, getState()); + enterRule(_localctx, 336, RULE_typeParamList); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1781); + typeParamDecl(); + setState(1786); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1782); + match(COMMA); + setState(1783); + typeParamDecl(); + } + } + } + setState(1788); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeParamDeclContext extends ParserRuleContext { + public IdentifierListContext identifierList() { + return getRuleContext(IdentifierListContext.class,0); + } + public TypeConstraintContext typeConstraint() { + return getRuleContext(TypeConstraintContext.class,0); + } + public TypeParamDeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeParamDecl; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeParamDecl(this); + else return visitor.visitChildren(this); + } + } + + public final TypeParamDeclContext typeParamDecl() throws RecognitionException { + TypeParamDeclContext _localctx = new TypeParamDeclContext(_ctx, getState()); + enterRule(_localctx, 338, RULE_typeParamDecl); + try { + enterOuterAlt(_localctx, 1); + { + setState(1789); + identifierList(); + setState(1790); + typeConstraint(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeConstraintContext extends ParserRuleContext { + public TypeElemContext typeElem() { + return getRuleContext(TypeElemContext.class,0); + } + public TypeConstraintContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeConstraint; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeConstraint(this); + else return visitor.visitChildren(this); + } + } + + public final TypeConstraintContext typeConstraint() throws RecognitionException { + TypeConstraintContext _localctx = new TypeConstraintContext(_ctx, getState()); + enterRule(_localctx, 340, RULE_typeConstraint); + try { + enterOuterAlt(_localctx, 1); + { + setState(1792); + typeElem(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class ConversionContext extends ParserRuleContext { - public NonNamedTypeContext nonNamedType() { - return getRuleContext(NonNamedTypeContext.class,0); + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public ExpressionContext expression() { @@ -11786,28 +12257,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_conversion); + enterRule(_localctx, 342, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1728); - nonNamedType(); - setState(1729); + setState(1794); + type_(); + setState(1795); match(L_PAREN); - setState(1730); + setState(1796); expression(0); - setState(1732); + setState(1798); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1731); + setState(1797); match(COMMA); } } - setState(1734); + setState(1800); match(R_PAREN); } } @@ -11845,9 +12316,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_nonNamedType); + enterRule(_localctx, 344, RULE_nonNamedType); try { - setState(1741); + setState(1807); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11861,18 +12332,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1736); + setState(1802); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1737); + setState(1803); match(L_PAREN); - setState(1738); + setState(1804); nonNamedType(); - setState(1739); + setState(1805); match(R_PAREN); } break; @@ -11917,33 +12388,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_operand); + enterRule(_localctx, 346, RULE_operand); try { - setState(1749); + setState(1815); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1743); + setState(1809); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1744); + setState(1810); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1745); + setState(1811); match(L_PAREN); - setState(1746); + setState(1812); expression(0); - setState(1747); + setState(1813); match(R_PAREN); } break; @@ -11984,9 +12455,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_literal); + enterRule(_localctx, 348, RULE_literal); try { - setState(1754); + setState(1820); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12003,7 +12474,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1751); + setState(1817); basicLit(); } break; @@ -12021,7 +12492,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1752); + setState(1818); compositeLit(); } break; @@ -12034,7 +12505,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1753); + setState(1819); functionLit(); } break; @@ -12074,12 +12545,12 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_integer); + enterRule(_localctx, 350, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1756); + setState(1822); _la = _input.LA(1); if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12118,11 +12589,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_operandName); + enterRule(_localctx, 352, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1758); + setState(1824); match(IDENTIFIER); } } @@ -12157,15 +12628,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_qualifiedIdent); + enterRule(_localctx, 354, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1760); + setState(1826); match(IDENTIFIER); - setState(1761); + setState(1827); match(DOT); - setState(1762); + setState(1828); match(IDENTIFIER); } } @@ -12201,13 +12672,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_compositeLit); + enterRule(_localctx, 356, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1764); + setState(1830); literalType(); - setState(1765); + setState(1831); literalValue(); } } @@ -12243,26 +12714,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_literalValue); + enterRule(_localctx, 358, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1767); + setState(1833); match(L_CURLY); - setState(1772); + setState(1838); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2990104391687L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1768); + setState(1834); elementList(); - setState(1770); + setState(1836); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1769); + setState(1835); match(COMMA); } } @@ -12270,7 +12741,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1774); + setState(1840); match(R_CURLY); } } @@ -12310,30 +12781,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_elementList); + enterRule(_localctx, 360, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1776); + setState(1842); keyedElement(); - setState(1781); + setState(1847); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + _alt = getInterpreter().adaptivePredict(_input,186,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1777); + setState(1843); match(COMMA); - setState(1778); + setState(1844); keyedElement(); } } } - setState(1783); + setState(1849); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,179,_ctx); + _alt = getInterpreter().adaptivePredict(_input,186,_ctx); } } } @@ -12370,23 +12841,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_keyedElement); + enterRule(_localctx, 362, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1787); + setState(1853); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { case 1: { - setState(1784); + setState(1850); key(); - setState(1785); + setState(1851); match(COLON); } break; } - setState(1789); + setState(1855); element(); } } @@ -12422,9 +12893,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_key); + enterRule(_localctx, 364, RULE_key); try { - setState(1793); + setState(1859); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12492,14 +12963,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1791); + setState(1857); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1792); + setState(1858); literalValue(); } break; @@ -12539,9 +13010,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_element); + enterRule(_localctx, 366, RULE_element); try { - setState(1797); + setState(1863); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12609,14 +13080,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1795); + setState(1861); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1796); + setState(1862); literalValue(); } break; @@ -12665,32 +13136,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_structType); + enterRule(_localctx, 368, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1799); + setState(1865); match(STRUCT); - setState(1800); + setState(1866); match(L_CURLY); - setState(1806); + setState(1872); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1801); + setState(1867); fieldDecl(); - setState(1802); + setState(1868); eos(); } } - setState(1808); + setState(1874); _errHandler.sync(this); _la = _input.LA(1); } - setState(1809); + setState(1875); match(R_CURLY); } } @@ -12733,34 +13204,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_fieldDecl); + enterRule(_localctx, 370, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1815); + setState(1881); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,184,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { case 1: { - setState(1811); + setState(1877); identifierList(); - setState(1812); + setState(1878); type_(); } break; case 2: { - setState(1814); + setState(1880); embeddedField(); } break; } - setState(1818); + setState(1884); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { case 1: { - setState(1817); + setState(1883); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12795,12 +13266,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 354, RULE_string_); + enterRule(_localctx, 372, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1820); + setState(1886); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12829,6 +13300,9 @@ public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } + public IndexContext index() { + return getRuleContext(IndexContext.class,0); + } public EmbeddedFieldContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -12842,23 +13316,33 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_embeddedField); + enterRule(_localctx, 374, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1823); + setState(1889); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1822); + setState(1888); match(STAR); } } - setState(1825); + setState(1891); typeName(); + setState(1893); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,194,_ctx) ) { + case 1: + { + setState(1892); + index(); + } + break; + } } } catch (RecognitionException re) { @@ -12875,10 +13359,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class IndexContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } public IndexContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -12892,15 +13383,45 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_index); + enterRule(_localctx, 376, RULE_index); + int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { - setState(1827); + setState(1895); match(L_BRACKET); - setState(1828); + setState(1896); expression(0); - setState(1829); + setState(1901); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,195,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1897); + match(COMMA); + setState(1898); + expression(0); + } + } + } + setState(1903); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,195,_ctx); + } + setState(1905); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1904); + match(COMMA); + } + } + + setState(1907); match(R_BRACKET); } } @@ -12936,17 +13457,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_typeAssertion); + enterRule(_localctx, 378, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1909); match(DOT); - setState(1832); + setState(1910); match(L_PAREN); - setState(1833); + setState(1911); type_(); - setState(1834); + setState(1912); match(R_PAREN); } } @@ -12989,39 +13510,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_arguments); + enterRule(_localctx, 380, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1836); + setState(1914); match(L_PAREN); - setState(1851); + setState(1929); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956053407067674L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 2440348577799L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1843); + setState(1921); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,198,_ctx) ) { case 1: { - setState(1837); + setState(1915); expressionList(); } break; case 2: { - setState(1838); + setState(1916); nonNamedType(); - setState(1841); + setState(1919); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,197,_ctx) ) { case 1: { - setState(1839); + setState(1917); match(COMMA); - setState(1840); + setState(1918); expressionList(); } break; @@ -13029,22 +13550,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1846); + setState(1924); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1845); + setState(1923); match(ELLIPSIS); } } - setState(1849); + setState(1927); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1848); + setState(1926); match(COMMA); } } @@ -13052,7 +13573,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1853); + setState(1931); match(R_PAREN); } } @@ -13087,15 +13608,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_methodExpr); + enterRule(_localctx, 382, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1855); + setState(1933); nonNamedType(); - setState(1856); + setState(1934); match(DOT); - setState(1857); + setState(1935); match(IDENTIFIER); } } @@ -13128,11 +13649,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_receiverType); + enterRule(_localctx, 384, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1859); + setState(1937); type_(); } } @@ -13165,36 +13686,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 368, RULE_eos); + enterRule(_localctx, 386, RULE_eos); try { - setState(1865); + setState(1943); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,202,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1861); + setState(1939); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1862); + setState(1940); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1863); + setState(1941); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1864); + setState(1942); if (!(this.closingBracket())) throw new FailedPredicateException(this, "this.closingBracket()"); } break; @@ -13217,9 +13738,9 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return expression_sempred((ExpressionContext)_localctx, predIndex); case 90: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 120: + case 123: return statementList_sempred((StatementListContext)_localctx, predIndex); - case 184: + case 193: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -13286,7 +13807,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a0\u074c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a0\u079a\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"+ @@ -13334,1158 +13855,1211 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af\u0002\u00b0\u0007"+ "\u00b0\u0002\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007"+ "\u00b3\u0002\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007"+ - "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0001\u0000\u0001"+ + "\u00b6\u0002\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007"+ + "\u00b9\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007"+ + "\u00bc\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be\u0002\u00bf\u0007"+ + "\u00bf\u0002\u00c0\u0007\u00c0\u0002\u00c1\u0007\u00c1\u0001\u0000\u0001"+ "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u017f"+ - "\b\u0003\n\u0003\f\u0003\u0182\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+ - "\u0186\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u018b\b"+ - "\u0005\n\u0005\f\u0005\u018e\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0005\u0005\u0195\b\u0005\n\u0005\f\u0005\u0198"+ - "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u019d\b\u0005"+ - "\u0001\u0005\u0001\u0005\u0005\u0005\u01a1\b\u0005\n\u0005\f\u0005\u01a4"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u0003\u0191"+ + "\b\u0003\n\u0003\f\u0003\u0194\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004"+ + "\u0198\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u019d\b"+ + "\u0005\n\u0005\f\u0005\u01a0\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u01a7\b\u0005\n\u0005\f\u0005\u01aa"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u01af\b\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u01b3\b\u0005\n\u0005\f\u0005\u01b6"+ "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005"+ - "\u0006\u01ab\b\u0006\n\u0006\f\u0006\u01ae\t\u0006\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01b5\b\u0006\n\u0006"+ - "\f\u0006\u01b8\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ - "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01c3\b\t\n\t\f\t\u01c6\t\t"+ - "\u0001\t\u0003\t\u01c9\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+ - "\n\u01d0\b\n\n\n\f\n\u01d3\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ - "\u0001\n\u0001\n\u0005\n\u01dc\b\n\n\n\f\n\u01df\t\n\u0001\n\u0003\n\u01e2"+ - "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01e8"+ + "\u0006\u01bd\b\u0006\n\u0006\f\u0006\u01c0\t\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u01c7\b\u0006\n\u0006"+ + "\f\u0006\u01ca\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01d5\b\t\n\t\f\t\u01d8\t\t"+ + "\u0001\t\u0003\t\u01db\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0005"+ + "\n\u01e2\b\n\n\n\f\n\u01e5\t\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ + "\u0001\n\u0001\n\u0005\n\u01ee\b\n\n\n\f\n\u01f1\t\n\u0001\n\u0003\n\u01f4"+ + "\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01fa"+ "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003"+ - "\f\u01f1\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u01fb\b\u000f\u0001\u000f\u0001"+ + "\f\u0203\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u020d\b\u000f\u0001\u000f\u0001"+ "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0003\u0010\u020c\b\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0010\u0001\u0010\u0003\u0010\u021e\b\u0010\u0001\u0011\u0001\u0011\u0001"+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0005\u0013\u0218\b\u0013\n\u0013\f\u0013\u021b\t\u0013"+ - "\u0001\u0013\u0003\u0013\u021e\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0005\u0014\u0223\b\u0014\n\u0014\f\u0014\u0226\t\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0005\u0015\u022b\b\u0015\n\u0015\f\u0015\u022e\t\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0234\b\u0016"+ - "\n\u0016\f\u0016\u0237\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0013\u0001\u0013\u0005\u0013\u022a\b\u0013\n\u0013\f\u0013\u022d\t\u0013"+ + "\u0001\u0013\u0003\u0013\u0230\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0005\u0014\u0235\b\u0014\n\u0014\f\u0014\u0238\t\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0005\u0015\u023d\b\u0015\n\u0015\f\u0015\u0240\t\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0246\b\u0016"+ + "\n\u0016\f\u0016\u0249\t\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001"+ "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0003\u001c\u0256\b\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u025e\b\u001d\u0001"+ + "\u001c\u0001\u001c\u0003\u001c\u0268\b\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u0270\b\u001d\u0001"+ "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!"+ - "\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0003\"\u0276\b\"\u0001"+ + "\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0003\"\u0288\b\"\u0001"+ "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001"+ - "$\u0001$\u0001$\u0001$\u0001$\u0005$\u0287\b$\n$\f$\u028a\t$\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u0296"+ - "\b&\n&\f&\u0299\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "(\u0001(\u0001(\u0001(\u0003(\u02a5\b(\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0005)\u02ac\b)\n)\f)\u02af\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u02bc\b*\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0005+\u02c3\b+\n+\f+\u02c6\t+\u0001+\u0001+\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0005,\u02cf\b,\n,\f,\u02d2\t,\u0001,\u0001,\u0001"+ + "$\u0001$\u0001$\u0001$\u0001$\u0005$\u0299\b$\n$\f$\u029c\t$\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u02a8"+ + "\b&\n&\f&\u02ab\t&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0003(\u02b7\b(\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0005)\u02be\b)\n)\f)\u02c1\t)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u02ce\b*\u0001+\u0001+\u0001"+ + "+\u0001+\u0001+\u0005+\u02d5\b+\n+\f+\u02d8\t+\u0001+\u0001+\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0005,\u02e1\b,\n,\f,\u02e4\t,\u0001,\u0001,\u0001"+ "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u02e6\b.\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0003/\u02ed\b/\u0001/\u0005/\u02f0\b/\n/\f/\u02f3\t/"+ - "\u0001/\u0001/\u0003/\u02f7\b/\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00030\u0301\b0\u00011\u00031\u0304\b1\u00011\u00011\u0003"+ - "1\u0308\b1\u00012\u00012\u00032\u030c\b2\u00013\u00013\u00013\u00013\u0005"+ - "3\u0312\b3\n3\f3\u0315\t3\u00013\u00013\u00014\u00014\u00014\u00034\u031c"+ - "\b4\u00015\u00015\u00015\u00035\u0321\b5\u00016\u00016\u00016\u00016\u0001"+ - "6\u00016\u00036\u0329\b6\u00036\u032b\b6\u00016\u00016\u00016\u00036\u0330"+ - "\b6\u00017\u00017\u00017\u00057\u0335\b7\n7\f7\u0338\t7\u00018\u00018"+ - "\u00018\u00018\u00018\u00038\u033f\b8\u00018\u00038\u0342\b8\u00018\u0001"+ - "8\u00019\u00019\u00039\u0348\b9\u00019\u00019\u00019\u00039\u034d\b9\u0003"+ - "9\u034f\b9\u00019\u00039\u0352\b9\u0001:\u0001:\u0001:\u0005:\u0357\b"+ - ":\n:\f:\u035a\t:\u0001;\u0001;\u0003;\u035e\b;\u0001;\u0001;\u0001<\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0003.\u02f8\b.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0003/\u02ff\b/\u0001/\u0005/\u0302\b/\n/\f/\u0305\t/"+ + "\u0001/\u0001/\u0003/\u0309\b/\u00010\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00030\u0313\b0\u00011\u00031\u0316\b1\u00011\u00011\u0003"+ + "1\u031a\b1\u00012\u00012\u00032\u031e\b2\u00013\u00013\u00013\u00013\u0005"+ + "3\u0324\b3\n3\f3\u0327\t3\u00013\u00013\u00014\u00014\u00014\u00034\u032e"+ + "\b4\u00015\u00015\u00015\u00035\u0333\b5\u00016\u00016\u00016\u00016\u0001"+ + "6\u00016\u00036\u033b\b6\u00036\u033d\b6\u00016\u00016\u00016\u00036\u0342"+ + "\b6\u00017\u00017\u00017\u00057\u0347\b7\n7\f7\u034a\t7\u00018\u00018"+ + "\u00018\u00018\u00018\u00038\u0351\b8\u00018\u00038\u0354\b8\u00018\u0001"+ + "8\u00019\u00019\u00039\u035a\b9\u00019\u00019\u00019\u00039\u035f\b9\u0003"+ + "9\u0361\b9\u00019\u00039\u0364\b9\u0001:\u0001:\u0001:\u0005:\u0369\b"+ + ":\n:\f:\u036c\t:\u0001;\u0001;\u0003;\u0370\b;\u0001;\u0001;\u0001<\u0001"+ "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0001=\u0005=\u036f\b=\n=\f=\u0372\t=\u0001=\u0001=\u0001=\u0005=\u0377"+ - "\b=\n=\f=\u037a\t=\u0001=\u0003=\u037d\b=\u0001>\u0003>\u0380\b>\u0001"+ - ">\u0001>\u0001>\u0001>\u0003>\u0386\b>\u0001?\u0001?\u0003?\u038a\b?\u0001"+ - "?\u0003?\u038d\b?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0003@\u0397\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u039e\bA\u0001"+ - "B\u0001B\u0001B\u0001B\u0001B\u0003B\u03a5\bB\u0001B\u0001B\u0001C\u0001"+ - "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0003D\u03b1\bD\u0001E\u0001"+ - "E\u0001E\u0001E\u0003E\u03b7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0003"+ - "F\u03be\bF\u0001G\u0001G\u0001G\u0003G\u03c3\bG\u0001H\u0001H\u0001H\u0001"+ - "H\u0003H\u03c9\bH\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0003J\u03d5\bJ\u0001K\u0001K\u0001K\u0001K\u0003K\u03db"+ - "\bK\u0001K\u0001K\u0003K\u03df\bK\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ - "M\u0003M\u03e7\bM\u0001M\u0001M\u0003M\u03eb\bM\u0001M\u0001M\u0001N\u0001"+ - "N\u0003N\u03f1\bN\u0001O\u0003O\u03f4\bO\u0001O\u0001O\u0001P\u0001P\u0003"+ - "P\u03fa\bP\u0001P\u0001P\u0001Q\u0003Q\u03ff\bQ\u0001Q\u0001Q\u0001R\u0001"+ + "=\u0001=\u0005=\u0381\b=\n=\f=\u0384\t=\u0001=\u0001=\u0001=\u0005=\u0389"+ + "\b=\n=\f=\u038c\t=\u0001=\u0003=\u038f\b=\u0001>\u0003>\u0392\b>\u0001"+ + ">\u0001>\u0001>\u0001>\u0003>\u0398\b>\u0001?\u0001?\u0003?\u039c\b?\u0001"+ + "?\u0003?\u039f\b?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0003@\u03a9\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0003A\u03b0\bA\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0003B\u03b7\bB\u0001B\u0001B\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0003D\u03c3\bD\u0001E\u0001"+ + "E\u0001E\u0003E\u03c8\bE\u0001E\u0001E\u0003E\u03cc\bE\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0003F\u03d3\bF\u0001G\u0001G\u0001G\u0003G\u03d8\bG\u0001"+ + "H\u0001H\u0001H\u0001H\u0003H\u03de\bH\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0003J\u03ea\bJ\u0001K\u0001K\u0001"+ + "K\u0001K\u0003K\u03f0\bK\u0001K\u0001K\u0003K\u03f4\bK\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0003M\u03fc\bM\u0001M\u0001M\u0003M\u0400\bM\u0001"+ + "M\u0001M\u0001N\u0001N\u0003N\u0406\bN\u0001O\u0003O\u0409\bO\u0001O\u0001"+ + "O\u0001P\u0001P\u0003P\u040f\bP\u0001P\u0001P\u0001Q\u0003Q\u0414\bQ\u0001"+ + "Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0003"+ - "R\u0418\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0003R\u042d\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0001R\u0001R\u0005R\u043b\bR\nR\fR\u043e\tR\u0001S\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0005R\u0450\bR\nR"+ + "\fR\u0453\tR\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0003S\u0454"+ - "\bS\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0003U\u045c\bU\u0001V\u0001"+ - "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0005W\u0465\bW\nW\fW\u0468\tW\u0001"+ - "W\u0001W\u0001W\u0001W\u0003W\u046e\bW\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0003X\u0475\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0003Y\u047f\bY\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u048d\bZ\u0001Z\u0001Z\u0001Z\u0001"+ + "S\u0001S\u0003S\u0469\bS\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0003"+ + "U\u0471\bU\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0005W\u047a"+ + "\bW\nW\fW\u047d\tW\u0001W\u0001W\u0001W\u0001W\u0003W\u0483\bW\u0001X"+ + "\u0001X\u0001X\u0001X\u0001X\u0003X\u048a\bX\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u0494\bY\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0003Z\u04a2"+ + "\bZ\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0005Z\u04a3\bZ\nZ\fZ\u04a6"+ - "\tZ\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0003\\\u04ad\b\\\u0001\\\u0001"+ - "\\\u0003\\\u04b1\b\\\u0001]\u0001]\u0003]\u04b5\b]\u0001]\u0003]\u04b8"+ - "\b]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0003^\u04c1\b^\u0001"+ - "^\u0001^\u0005^\u04c5\b^\n^\f^\u04c8\t^\u0001^\u0001^\u0001_\u0001_\u0001"+ - "_\u0001_\u0001`\u0003`\u04d1\b`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0003`\u04d9\b`\u0001`\u0001`\u0001`\u0001`\u0003`\u04df\b`\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04e8\ba\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0003b\u04f3\bb\u0001c\u0001"+ - "c\u0001c\u0001d\u0001d\u0001d\u0001d\u0005d\u04fc\bd\nd\fd\u04ff\td\u0001"+ - "d\u0003d\u0502\bd\u0003d\u0504\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001e\u0003e\u050f\be\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001g\u0001g\u0003g\u0518\bg\u0001g\u0001g\u0003g\u051c\bg\u0001g\u0003"+ - "g\u051f\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0526\bg\u0001g\u0001"+ - "g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u0531\bk\u0001"+ - "k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u053b\bl\u0001"+ - "l\u0001l\u0001l\u0001l\u0003l\u0541\bl\u0003l\u0543\bl\u0001m\u0001m\u0001"+ - "m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u054d\bo\u0001p\u0001p\u0001"+ - "p\u0001p\u0001p\u0001p\u0005p\u0555\bp\np\fp\u0558\tp\u0001p\u0003p\u055b"+ - "\bp\u0001q\u0001q\u0003q\u055f\bq\u0001q\u0001q\u0003q\u0563\bq\u0001"+ - "r\u0001r\u0001r\u0005r\u0568\br\nr\fr\u056b\tr\u0001s\u0001s\u0001s\u0005"+ - "s\u0570\bs\ns\fs\u0573\ts\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0005"+ - "t\u057b\bt\nt\ft\u057e\tt\u0001t\u0003t\u0581\bt\u0001u\u0001u\u0003u"+ - "\u0585\bu\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0005"+ - "v\u058f\bv\nv\fv\u0592\tv\u0001v\u0003v\u0595\bv\u0001w\u0001w\u0003w"+ - "\u0599\bw\u0001w\u0001w\u0001x\u0003x\u059e\bx\u0001x\u0003x\u05a1\bx"+ - "\u0001x\u0003x\u05a4\bx\u0001x\u0001x\u0001x\u0004x\u05a9\bx\u000bx\f"+ - "x\u05aa\u0001y\u0001y\u0001y\u0001y\u0001y\u0003y\u05b2\by\u0001z\u0001"+ - "z\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001"+ - "}\u0001}\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0003\u007f"+ - "\u05c6\b\u007f\u0001\u0080\u0001\u0080\u0003\u0080\u05ca\b\u0080\u0001"+ - "\u0081\u0001\u0081\u0003\u0081\u05ce\b\u0081\u0001\u0082\u0001\u0082\u0003"+ - "\u0082\u05d2\b\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001"+ - "\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e2\b\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0003\u0085\u05e8\b\u0085\u0003"+ - "\u0085\u05ea\b\u0085\u0001\u0086\u0001\u0086\u0003\u0086\u05ee\b\u0086"+ - "\u0001\u0087\u0001\u0087\u0003\u0087\u05f2\b\u0087\u0001\u0087\u0003\u0087"+ - "\u05f5\b\u0087\u0001\u0087\u0001\u0087\u0003\u0087\u05f9\b\u0087\u0003"+ - "\u0087\u05fb\b\u0087\u0001\u0087\u0001\u0087\u0005\u0087\u05ff\b\u0087"+ - "\n\u0087\f\u0087\u0602\t\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0003\u0088\u0609\b\u0088\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0003\u0089\u060e\b\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ - "\u008a\u0619\b\u008a\u0001\u008a\u0001\u008a\u0005\u008a\u061d\b\u008a"+ - "\n\u008a\f\u008a\u0620\t\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ - "\u008b\u0003\u008b\u0626\b\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003"+ - "\u008c\u0631\b\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u0636"+ - "\b\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u063a\b\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008e\u0003\u008e\u063f\b\u008e\u0005\u008e\u0641\b"+ - "\u008e\n\u008e\f\u008e\u0644\t\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0005\u008f\u0649\b\u008f\n\u008f\f\u008f\u064c\t\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0653\b\u0090\u0001"+ - "\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u0658\b\u0091\u0001\u0091\u0003"+ - "\u0091\u065b\b\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0003\u0092\u0663\b\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0093\u0001\u0093\u0003\u0093\u0669\b\u0093\u0001\u0093\u0001\u0093\u0003"+ - "\u0093\u066d\b\u0093\u0003\u0093\u066f\b\u0093\u0001\u0093\u0001\u0093"+ - "\u0001\u0094\u0003\u0094\u0674\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094"+ - "\u0678\b\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u067c\b\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0003\u0096\u0683"+ - "\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001"+ - "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0003\u009d\u06a0\b\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001"+ - "\u009f\u0001\u009f\u0001\u009f\u0003\u009f\u06ab\b\u009f\u0001\u00a0\u0001"+ - "\u00a0\u0003\u00a0\u06af\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0005\u00a1\u06b5\b\u00a1\n\u00a1\f\u00a1\u06b8\t\u00a1\u0001\u00a1"+ - "\u0003\u00a1\u06bb\b\u00a1\u0003\u00a1\u06bd\b\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0003\u00a2\u06c5"+ - "\b\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001"+ - "\u00a3\u0001\u00a3\u0003\u00a3\u06ce\b\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06d6\b\u00a4\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06db\b\u00a5\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ - "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001"+ - "\u00aa\u0003\u00aa\u06eb\b\u00aa\u0003\u00aa\u06ed\b\u00aa\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u06f4\b\u00ab"+ - "\n\u00ab\f\u00ab\u06f7\t\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003"+ - "\u00ac\u06fc\b\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0003"+ - "\u00ad\u0702\b\u00ad\u0001\u00ae\u0001\u00ae\u0003\u00ae\u0706\b\u00ae"+ - "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0005\u00af"+ - "\u070d\b\u00af\n\u00af\f\u00af\u0710\t\u00af\u0001\u00af\u0001\u00af\u0001"+ - "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003\u00b0\u0718\b\u00b0\u0001"+ - "\u00b0\u0003\u00b0\u071b\b\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0003"+ - "\u00b2\u0720\b\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ - "\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0003"+ - "\u00b5\u0732\b\u00b5\u0003\u00b5\u0734\b\u00b5\u0001\u00b5\u0003\u00b5"+ - "\u0737\b\u00b5\u0001\u00b5\u0003\u00b5\u073a\b\u00b5\u0003\u00b5\u073c"+ - "\b\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0003\u00b8\u074a\b\u00b8\u0001\u00b8\u0001\u02f1\u0002\u00a4\u00b4"+ - "\u00b9\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018"+ - "\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8"+ - "\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0"+ - "\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8"+ - "\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110"+ - "\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128"+ - "\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140"+ - "\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158"+ - "\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170"+ - "\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001\u0000\u0005"+ - "\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000\u0083\u0089"+ - "\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004\u0000##"+ - "qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002\u0000"+ - "HIw|\u0004\u0000--0033]]\u0002\u0000}\u0082\u0084\u0088\u0001\u0000qr"+ - "\u0002\u0000nn\u009f\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001\u0000"+ - "\u0096\u0097\u07b5\u0000\u0172\u0001\u0000\u0000\u0000\u0002\u0175\u0001"+ - "\u0000\u0000\u0000\u0004\u0178\u0001\u0000\u0000\u0000\u0006\u017b\u0001"+ - "\u0000\u0000\u0000\b\u0183\u0001\u0000\u0000\u0000\n\u018c\u0001\u0000"+ - "\u0000\u0000\f\u01ac\u0001\u0000\u0000\u0000\u000e\u01b9\u0001\u0000\u0000"+ - "\u0000\u0010\u01bc\u0001\u0000\u0000\u0000\u0012\u01c4\u0001\u0000\u0000"+ - "\u0000\u0014\u01d1\u0001\u0000\u0000\u0000\u0016\u01e7\u0001\u0000\u0000"+ - "\u0000\u0018\u01f0\u0001\u0000\u0000\u0000\u001a\u01f2\u0001\u0000\u0000"+ - "\u0000\u001c\u01f4\u0001\u0000\u0000\u0000\u001e\u01f7\u0001\u0000\u0000"+ - "\u0000 \u020b\u0001\u0000\u0000\u0000\"\u020d\u0001\u0000\u0000\u0000"+ - "$\u020f\u0001\u0000\u0000\u0000&\u0214\u0001\u0000\u0000\u0000(\u021f"+ - "\u0001\u0000\u0000\u0000*\u022c\u0001\u0000\u0000\u0000,\u022f\u0001\u0000"+ - "\u0000\u0000.\u023a\u0001\u0000\u0000\u00000\u023c\u0001\u0000\u0000\u0000"+ - "2\u0241\u0001\u0000\u0000\u00004\u0246\u0001\u0000\u0000\u00006\u024b"+ - "\u0001\u0000\u0000\u00008\u0250\u0001\u0000\u0000\u0000:\u025d\u0001\u0000"+ - "\u0000\u0000<\u025f\u0001\u0000\u0000\u0000>\u0261\u0001\u0000\u0000\u0000"+ - "@\u0266\u0001\u0000\u0000\u0000B\u026b\u0001\u0000\u0000\u0000D\u0270"+ - "\u0001\u0000\u0000\u0000F\u0279\u0001\u0000\u0000\u0000H\u0280\u0001\u0000"+ - "\u0000\u0000J\u028d\u0001\u0000\u0000\u0000L\u0291\u0001\u0000\u0000\u0000"+ - "N\u029c\u0001\u0000\u0000\u0000P\u02a4\u0001\u0000\u0000\u0000R\u02a6"+ - "\u0001\u0000\u0000\u0000T\u02bb\u0001\u0000\u0000\u0000V\u02bd\u0001\u0000"+ - "\u0000\u0000X\u02c9\u0001\u0000\u0000\u0000Z\u02d5\u0001\u0000\u0000\u0000"+ - "\\\u02e5\u0001\u0000\u0000\u0000^\u02f1\u0001\u0000\u0000\u0000`\u0300"+ - "\u0001\u0000\u0000\u0000b\u0303\u0001\u0000\u0000\u0000d\u030b\u0001\u0000"+ - "\u0000\u0000f\u030d\u0001\u0000\u0000\u0000h\u0318\u0001\u0000\u0000\u0000"+ - "j\u0320\u0001\u0000\u0000\u0000l\u032f\u0001\u0000\u0000\u0000n\u0331"+ - "\u0001\u0000\u0000\u0000p\u0339\u0001\u0000\u0000\u0000r\u0347\u0001\u0000"+ - "\u0000\u0000t\u0353\u0001\u0000\u0000\u0000v\u035d\u0001\u0000\u0000\u0000"+ - "x\u0361\u0001\u0000\u0000\u0000z\u0367\u0001\u0000\u0000\u0000|\u037f"+ - "\u0001\u0000\u0000\u0000~\u0387\u0001\u0000\u0000\u0000\u0080\u0396\u0001"+ - "\u0000\u0000\u0000\u0082\u0398\u0001\u0000\u0000\u0000\u0084\u039f\u0001"+ - "\u0000\u0000\u0000\u0086\u03a8\u0001\u0000\u0000\u0000\u0088\u03ad\u0001"+ - "\u0000\u0000\u0000\u008a\u03b2\u0001\u0000\u0000\u0000\u008c\u03b8\u0001"+ - "\u0000\u0000\u0000\u008e\u03bf\u0001\u0000\u0000\u0000\u0090\u03c4\u0001"+ - "\u0000\u0000\u0000\u0092\u03ca\u0001\u0000\u0000\u0000\u0094\u03cf\u0001"+ - "\u0000\u0000\u0000\u0096\u03d6\u0001\u0000\u0000\u0000\u0098\u03e0\u0001"+ - "\u0000\u0000\u0000\u009a\u03e4\u0001\u0000\u0000\u0000\u009c\u03f0\u0001"+ - "\u0000\u0000\u0000\u009e\u03f3\u0001\u0000\u0000\u0000\u00a0\u03f7\u0001"+ - "\u0000\u0000\u0000\u00a2\u03fe\u0001\u0000\u0000\u0000\u00a4\u0417\u0001"+ - "\u0000\u0000\u0000\u00a6\u0453\u0001\u0000\u0000\u0000\u00a8\u0455\u0001"+ - "\u0000\u0000\u0000\u00aa\u0458\u0001\u0000\u0000\u0000\u00ac\u045d\u0001"+ - "\u0000\u0000\u0000\u00ae\u0466\u0001\u0000\u0000\u0000\u00b0\u0474\u0001"+ - "\u0000\u0000\u0000\u00b2\u047e\u0001\u0000\u0000\u0000\u00b4\u048c\u0001"+ - "\u0000\u0000\u0000\u00b6\u04a7\u0001\u0000\u0000\u0000\u00b8\u04aa\u0001"+ - "\u0000\u0000\u0000\u00ba\u04b2\u0001\u0000\u0000\u0000\u00bc\u04bb\u0001"+ - "\u0000\u0000\u0000\u00be\u04cb\u0001\u0000\u0000\u0000\u00c0\u04de\u0001"+ - "\u0000\u0000\u0000\u00c2\u04e7\u0001\u0000\u0000\u0000\u00c4\u04f2\u0001"+ - "\u0000\u0000\u0000\u00c6\u04f4\u0001\u0000\u0000\u0000\u00c8\u04f7\u0001"+ - "\u0000\u0000\u0000\u00ca\u050e\u0001\u0000\u0000\u0000\u00cc\u0510\u0001"+ - "\u0000\u0000\u0000\u00ce\u0515\u0001\u0000\u0000\u0000\u00d0\u0529\u0001"+ - "\u0000\u0000\u0000\u00d2\u052b\u0001\u0000\u0000\u0000\u00d4\u052d\u0001"+ - "\u0000\u0000\u0000\u00d6\u0530\u0001\u0000\u0000\u0000\u00d8\u053a\u0001"+ - "\u0000\u0000\u0000\u00da\u0544\u0001\u0000\u0000\u0000\u00dc\u0547\u0001"+ - "\u0000\u0000\u0000\u00de\u054c\u0001\u0000\u0000\u0000\u00e0\u054e\u0001"+ - "\u0000\u0000\u0000\u00e2\u055c\u0001\u0000\u0000\u0000\u00e4\u0564\u0001"+ - "\u0000\u0000\u0000\u00e6\u056c\u0001\u0000\u0000\u0000\u00e8\u0574\u0001"+ - "\u0000\u0000\u0000\u00ea\u0582\u0001\u0000\u0000\u0000\u00ec\u0588\u0001"+ - "\u0000\u0000\u0000\u00ee\u0596\u0001\u0000\u0000\u0000\u00f0\u05a8\u0001"+ - "\u0000\u0000\u0000\u00f2\u05b1\u0001\u0000\u0000\u0000\u00f4\u05b3\u0001"+ - "\u0000\u0000\u0000\u00f6\u05b5\u0001\u0000\u0000\u0000\u00f8\u05b9\u0001"+ - "\u0000\u0000\u0000\u00fa\u05bc\u0001\u0000\u0000\u0000\u00fc\u05c0\u0001"+ - "\u0000\u0000\u0000\u00fe\u05c2\u0001\u0000\u0000\u0000\u0100\u05c7\u0001"+ - "\u0000\u0000\u0000\u0102\u05cb\u0001\u0000\u0000\u0000\u0104\u05cf\u0001"+ - "\u0000\u0000\u0000\u0106\u05d3\u0001\u0000\u0000\u0000\u0108\u05d6\u0001"+ - "\u0000\u0000\u0000\u010a\u05d8\u0001\u0000\u0000\u0000\u010c\u05ed\u0001"+ - "\u0000\u0000\u0000\u010e\u05ef\u0001\u0000\u0000\u0000\u0110\u0605\u0001"+ - "\u0000\u0000\u0000\u0112\u060d\u0001\u0000\u0000\u0000\u0114\u060f\u0001"+ - "\u0000\u0000\u0000\u0116\u0625\u0001\u0000\u0000\u0000\u0118\u062d\u0001"+ - "\u0000\u0000\u0000\u011a\u0635\u0001\u0000\u0000\u0000\u011c\u0639\u0001"+ - "\u0000\u0000\u0000\u011e\u0645\u0001\u0000\u0000\u0000\u0120\u064f\u0001"+ - "\u0000\u0000\u0000\u0122\u065a\u0001\u0000\u0000\u0000\u0124\u0662\u0001"+ - "\u0000\u0000\u0000\u0126\u0666\u0001\u0000\u0000\u0000\u0128\u0673\u0001"+ - "\u0000\u0000\u0000\u012a\u067d\u0001\u0000\u0000\u0000\u012c\u0682\u0001"+ - "\u0000\u0000\u0000\u012e\u0684\u0001\u0000\u0000\u0000\u0130\u0689\u0001"+ - "\u0000\u0000\u0000\u0132\u068b\u0001\u0000\u0000\u0000\u0134\u068d\u0001"+ - "\u0000\u0000\u0000\u0136\u0690\u0001\u0000\u0000\u0000\u0138\u0694\u0001"+ - "\u0000\u0000\u0000\u013a\u069f\u0001\u0000\u0000\u0000\u013c\u06a3\u0001"+ - "\u0000\u0000\u0000\u013e\u06aa\u0001\u0000\u0000\u0000\u0140\u06ae\u0001"+ - "\u0000\u0000\u0000\u0142\u06b0\u0001\u0000\u0000\u0000\u0144\u06c0\u0001"+ - "\u0000\u0000\u0000\u0146\u06cd\u0001\u0000\u0000\u0000\u0148\u06d5\u0001"+ - "\u0000\u0000\u0000\u014a\u06da\u0001\u0000\u0000\u0000\u014c\u06dc\u0001"+ - "\u0000\u0000\u0000\u014e\u06de\u0001\u0000\u0000\u0000\u0150\u06e0\u0001"+ - "\u0000\u0000\u0000\u0152\u06e4\u0001\u0000\u0000\u0000\u0154\u06e7\u0001"+ - "\u0000\u0000\u0000\u0156\u06f0\u0001\u0000\u0000\u0000\u0158\u06fb\u0001"+ - "\u0000\u0000\u0000\u015a\u0701\u0001\u0000\u0000\u0000\u015c\u0705\u0001"+ - "\u0000\u0000\u0000\u015e\u0707\u0001\u0000\u0000\u0000\u0160\u0717\u0001"+ - "\u0000\u0000\u0000\u0162\u071c\u0001\u0000\u0000\u0000\u0164\u071f\u0001"+ - "\u0000\u0000\u0000\u0166\u0723\u0001\u0000\u0000\u0000\u0168\u0727\u0001"+ - "\u0000\u0000\u0000\u016a\u072c\u0001\u0000\u0000\u0000\u016c\u073f\u0001"+ - "\u0000\u0000\u0000\u016e\u0743\u0001\u0000\u0000\u0000\u0170\u0749\u0001"+ - "\u0000\u0000\u0000\u0172\u0173\u0003\u00a4R\u0000\u0173\u0174\u0005\u0000"+ - "\u0000\u0001\u0174\u0001\u0001\u0000\u0000\u0000\u0175\u0176\u0003\u00a6"+ - "S\u0000\u0176\u0177\u0005\u0000\u0000\u0001\u0177\u0003\u0001\u0000\u0000"+ - "\u0000\u0178\u0179\u0003\u00c2a\u0000\u0179\u017a\u0005\u0000\u0000\u0001"+ - "\u017a\u0005\u0001\u0000\u0000\u0000\u017b\u0180\u0003\b\u0004\u0000\u017c"+ - "\u017d\u0005m\u0000\u0000\u017d\u017f\u0003\b\u0004\u0000\u017e\u017c"+ - "\u0001\u0000\u0000\u0000\u017f\u0182\u0001\u0000\u0000\u0000\u0180\u017e"+ - "\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000\u0181\u0007"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0185"+ - "\u0005e\u0000\u0000\u0184\u0186\u0005<\u0000\u0000\u0185\u0184\u0001\u0000"+ - "\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u0186\t\u0001\u0000\u0000"+ - "\u0000\u0187\u0188\u0003\u000e\u0007\u0000\u0188\u0189\u0003\u0170\u00b8"+ - "\u0000\u0189\u018b\u0001\u0000\u0000\u0000\u018a\u0187\u0001\u0000\u0000"+ - "\u0000\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000"+ - "\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018f\u0001\u0000\u0000"+ - "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0003\u00dam\u0000"+ - "\u0190\u0196\u0003\u0170\u00b8\u0000\u0191\u0192\u0003\u0014\n\u0000\u0192"+ - "\u0193\u0003\u0170\u00b8\u0000\u0193\u0195\u0001\u0000\u0000\u0000\u0194"+ - "\u0191\u0001\u0000\u0000\u0000\u0195\u0198\u0001\u0000\u0000\u0000\u0196"+ - "\u0194\u0001\u0000\u0000\u0000\u0196\u0197\u0001\u0000\u0000\u0000\u0197"+ - "\u01a2\u0001\u0000\u0000\u0000\u0198\u0196\u0001\u0000\u0000\u0000\u0199"+ - "\u019d\u0003\u0088D\u0000\u019a\u019d\u0003\u00deo\u0000\u019b\u019d\u0003"+ - "\u0016\u000b\u0000\u019c\u0199\u0001\u0000\u0000\u0000\u019c\u019a\u0001"+ - "\u0000\u0000\u0000\u019c\u019b\u0001\u0000\u0000\u0000\u019d\u019e\u0001"+ - "\u0000\u0000\u0000\u019e\u019f\u0003\u0170\u00b8\u0000\u019f\u01a1\u0001"+ - "\u0000\u0000\u0000\u01a0\u019c\u0001\u0000\u0000\u0000\u01a1\u01a4\u0001"+ - "\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2\u01a3\u0001"+ - "\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001"+ - "\u0000\u0000\u0000\u01a5\u01a6\u0005\u0000\u0000\u0001\u01a6\u000b\u0001"+ - "\u0000\u0000\u0000\u01a7\u01a8\u0003\u000e\u0007\u0000\u01a8\u01a9\u0003"+ - "\u0170\u00b8\u0000\u01a9\u01ab\u0001\u0000\u0000\u0000\u01aa\u01a7\u0001"+ - "\u0000\u0000\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001"+ - "\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01af\u0001"+ - "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01b0\u0003"+ - "\u00dam\u0000\u01b0\u01b6\u0003\u0170\u00b8\u0000\u01b1\u01b2\u0003\u0014"+ - "\n\u0000\u01b2\u01b3\u0003\u0170\u00b8\u0000\u01b3\u01b5\u0001\u0000\u0000"+ - "\u0000\u01b4\u01b1\u0001\u0000\u0000\u0000\u01b5\u01b8\u0001\u0000\u0000"+ - "\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000"+ - "\u0000\u01b7\r\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000"+ - "\u01b9\u01ba\u0005E\u0000\u0000\u01ba\u01bb\u0003\u00a4R\u0000\u01bb\u000f"+ - "\u0001\u0000\u0000\u0000\u01bc\u01bd\u0005F\u0000\u0000\u01bd\u01be\u0003"+ - "\u00a4R\u0000\u01be\u0011\u0001\u0000\u0000\u0000\u01bf\u01c0\u0003\u0010"+ - "\b\u0000\u01c0\u01c1\u0003\u0170\u00b8\u0000\u01c1\u01c3\u0001\u0000\u0000"+ - "\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000"+ - "\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000"+ - "\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000"+ - "\u0000\u01c7\u01c9\u0007\u0000\u0000\u0000\u01c8\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0001\u0000\u0000"+ - "\u0000\u01ca\u01cb\u0003\u00dcn\u0000\u01cb\u0013\u0001\u0000\u0000\u0000"+ - "\u01cc\u01cd\u0003\u0010\b\u0000\u01cd\u01ce\u0003\u0170\u00b8\u0000\u01ce"+ - "\u01d0\u0001\u0000\u0000\u0000\u01cf\u01cc\u0001\u0000\u0000\u0000\u01d0"+ - "\u01d3\u0001\u0000\u0000\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1"+ - "\u01d2\u0001\u0000\u0000\u0000\u01d2\u01e1\u0001\u0000\u0000\u0000\u01d3"+ - "\u01d1\u0001\u0000\u0000\u0000\u01d4\u01d5\u0005a\u0000\u0000\u01d5\u01e2"+ - "\u0003\u0012\t\u0000\u01d6\u01d7\u0005a\u0000\u0000\u01d7\u01dd\u0005"+ - "f\u0000\u0000\u01d8\u01d9\u0003\u0012\t\u0000\u01d9\u01da\u0003\u0170"+ - "\u00b8\u0000\u01da\u01dc\u0001\u0000\u0000\u0000\u01db\u01d8\u0001\u0000"+ - "\u0000\u0000\u01dc\u01df\u0001\u0000\u0000\u0000\u01dd\u01db\u0001\u0000"+ - "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01e0\u0001\u0000"+ - "\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e2\u0005g\u0000"+ - "\u0000\u01e1\u01d4\u0001\u0000\u0000\u0000\u01e1\u01d6\u0001\u0000\u0000"+ - "\u0000\u01e2\u0015\u0001\u0000\u0000\u0000\u01e3\u01e8\u0003z=\u0000\u01e4"+ - "\u01e8\u0003\u0090H\u0000\u01e5\u01e8\u0003\u0094J\u0000\u01e6\u01e8\u0003"+ - "\u008eG\u0000\u01e7\u01e3\u0001\u0000\u0000\u0000\u01e7\u01e4\u0001\u0000"+ - "\u0000\u0000\u01e7\u01e5\u0001\u0000\u0000\u0000\u01e7\u01e6\u0001\u0000"+ - "\u0000\u0000\u01e8\u0017\u0001\u0000\u0000\u0000\u01e9\u01ea\u0005\u001b"+ - "\u0000\u0000\u01ea\u01f1\u0003\u00a6S\u0000\u01eb\u01ec\u0007\u0001\u0000"+ - "\u0000\u01ec\u01f1\u0003.\u0017\u0000\u01ed\u01ee\u0007\u0002\u0000\u0000"+ - "\u01ee\u01f1\u0003\u00a4R\u0000\u01ef\u01f1\u0003f3\u0000\u01f0\u01e9"+ - "\u0001\u0000\u0000\u0000\u01f0\u01eb\u0001\u0000\u0000\u0000\u01f0\u01ed"+ - "\u0001\u0000\u0000\u0000\u01f0\u01ef\u0001\u0000\u0000\u0000\u01f1\u0019"+ - "\u0001\u0000\u0000\u0000\u01f2\u01f3\u0003\u001c\u000e\u0000\u01f3\u001b"+ - "\u0001\u0000\u0000\u0000\u01f4\u01f5\u0003^/\u0000\u01f5\u01f6\u0003\u001e"+ - "\u000f\u0000\u01f6\u001d\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005D\u0000"+ - "\u0000\u01f8\u01fa\u0005f\u0000\u0000\u01f9\u01fb\u0003\u00f0x\u0000\u01fa"+ - "\u01f9\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb"+ - "\u01fc\u0001\u0000\u0000\u0000\u01fc\u01fd\u0005g\u0000\u0000\u01fd\u001f"+ - "\u0001\u0000\u0000\u0000\u01fe\u020c\u0003F#\u0000\u01ff\u020c\u0003D"+ - "\"\u0000\u0200\u020c\u0003B!\u0000\u0201\u020c\u0003$\u0012\u0000\u0202"+ - "\u020c\u0003@ \u0000\u0203\u020c\u00038\u001c\u0000\u0204\u020c\u0003"+ - ">\u001f\u0000\u0205\u020c\u00036\u001b\u0000\u0206\u020c\u00032\u0019"+ - "\u0000\u0207\u020c\u00030\u0018\u0000\u0208\u020c\u00034\u001a\u0000\u0209"+ - "\u020c\u0003\"\u0011\u0000\u020a\u020c\u0003H$\u0000\u020b\u01fe\u0001"+ - "\u0000\u0000\u0000\u020b\u01ff\u0001\u0000\u0000\u0000\u020b\u0200\u0001"+ - "\u0000\u0000\u0000\u020b\u0201\u0001\u0000\u0000\u0000\u020b\u0202\u0001"+ - "\u0000\u0000\u0000\u020b\u0203\u0001\u0000\u0000\u0000\u020b\u0204\u0001"+ - "\u0000\u0000\u0000\u020b\u0205\u0001\u0000\u0000\u0000\u020b\u0206\u0001"+ - "\u0000\u0000\u0000\u020b\u0207\u0001\u0000\u0000\u0000\u020b\u0208\u0001"+ - "\u0000\u0000\u0000\u020b\u0209\u0001\u0000\u0000\u0000\u020b\u020a\u0001"+ - "\u0000\u0000\u0000\u020c!\u0001\u0000\u0000\u0000\u020d\u020e\u0007\u0003"+ - "\u0000\u0000\u020e#\u0001\u0000\u0000\u0000\u020f\u0210\u0005^\u0000\u0000"+ - "\u0210\u0211\u0005j\u0000\u0000\u0211\u0212\u0003\u00c2a\u0000\u0212\u0213"+ - "\u0005k\u0000\u0000\u0213%\u0001\u0000\u0000\u0000\u0214\u0219\u0003("+ - "\u0014\u0000\u0215\u0216\u0005m\u0000\u0000\u0216\u0218\u0003(\u0014\u0000"+ - "\u0217\u0215\u0001\u0000\u0000\u0000\u0218\u021b\u0001\u0000\u0000\u0000"+ - "\u0219\u0217\u0001\u0000\u0000\u0000\u0219\u021a\u0001\u0000\u0000\u0000"+ - "\u021a\u021d\u0001\u0000\u0000\u0000\u021b\u0219\u0001\u0000\u0000\u0000"+ - "\u021c\u021e\u0005m\u0000\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021d"+ - "\u021e\u0001\u0000\u0000\u0000\u021e\'\u0001\u0000\u0000\u0000\u021f\u0224"+ - "\u0005e\u0000\u0000\u0220\u0221\u0005m\u0000\u0000\u0221\u0223\u0005e"+ - "\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0223\u0226\u0001\u0000"+ - "\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0224\u0225\u0001\u0000"+ - "\u0000\u0000\u0225\u0227\u0001\u0000\u0000\u0000\u0226\u0224\u0001\u0000"+ - "\u0000\u0000\u0227\u0228\u0003\u0132\u0099\u0000\u0228)\u0001\u0000\u0000"+ - "\u0000\u0229\u022b\u0003,\u0016\u0000\u022a\u0229\u0001\u0000\u0000\u0000"+ - "\u022b\u022e\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000\u0000\u0000"+ - "\u022c\u022d\u0001\u0000\u0000\u0000\u022d+\u0001\u0000\u0000\u0000\u022e"+ - "\u022c\u0001\u0000\u0000\u0000\u022f\u0230\u0005h\u0000\u0000\u0230\u0235"+ - "\u0003\u00a4R\u0000\u0231\u0232\u0005m\u0000\u0000\u0232\u0234\u0003\u00a4"+ - "R\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0234\u0237\u0001\u0000\u0000"+ - "\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0235\u0236\u0001\u0000\u0000"+ - "\u0000\u0236\u0238\u0001\u0000\u0000\u0000\u0237\u0235\u0001\u0000\u0000"+ - "\u0000\u0238\u0239\u0005i\u0000\u0000\u0239-\u0001\u0000\u0000\u0000\u023a"+ - "\u023b\u0003\u00b4Z\u0000\u023b/\u0001\u0000\u0000\u0000\u023c\u023d\u0005"+ - "1\u0000\u0000\u023d\u023e\u0005f\u0000\u0000\u023e\u023f\u0003\u00a4R"+ - "\u0000\u023f\u0240\u0005g\u0000\u0000\u02401\u0001\u0000\u0000\u0000\u0241"+ - "\u0242\u00057\u0000\u0000\u0242\u0243\u0005j\u0000\u0000\u0243\u0244\u0003"+ - "\u00c2a\u0000\u0244\u0245\u0005k\u0000\u0000\u02453\u0001\u0000\u0000"+ - "\u0000\u0246\u0247\u00052\u0000\u0000\u0247\u0248\u0005f\u0000\u0000\u0248"+ - "\u0249\u0003\u00a4R\u0000\u0249\u024a\u0005g\u0000\u0000\u024a5\u0001"+ - "\u0000\u0000\u0000\u024b\u024c\u0007\u0004\u0000\u0000\u024c\u024d\u0005"+ - "f\u0000\u0000\u024d\u024e\u0003\u00a4R\u0000\u024e\u024f\u0005g\u0000"+ - "\u0000\u024f7\u0001\u0000\u0000\u0000\u0250\u0255\u0005\u0011\u0000\u0000"+ - "\u0251\u0252\u0005j\u0000\u0000\u0252\u0253\u0003:\u001d\u0000\u0253\u0254"+ - "\u0005k\u0000\u0000\u0254\u0256\u0001\u0000\u0000\u0000\u0255\u0251\u0001"+ - "\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u0257\u0001"+ - "\u0000\u0000\u0000\u0257\u0258\u0005f\u0000\u0000\u0258\u0259\u0003\u00a4"+ - "R\u0000\u0259\u025a\u0005g\u0000\u0000\u025a9\u0001\u0000\u0000\u0000"+ - "\u025b\u025e\u0003<\u001e\u0000\u025c\u025e\u0005\u0013\u0000\u0000\u025d"+ - "\u025b\u0001\u0000\u0000\u0000\u025d\u025c\u0001\u0000\u0000\u0000\u025e"+ - ";\u0001\u0000\u0000\u0000\u025f\u0260\u0005e\u0000\u0000\u0260=\u0001"+ - "\u0000\u0000\u0000\u0261\u0262\u0005\u0012\u0000\u0000\u0262\u0263\u0005"+ - "f\u0000\u0000\u0263\u0264\u0003\u00a4R\u0000\u0264\u0265\u0005g\u0000"+ - "\u0000\u0265?\u0001\u0000\u0000\u0000\u0266\u0267\u0005:\u0000\u0000\u0267"+ - "\u0268\u0005f\u0000\u0000\u0268\u0269\u0003\u00a4R\u0000\u0269\u026a\u0005"+ - "g\u0000\u0000\u026aA\u0001\u0000\u0000\u0000\u026b\u026c\u00059\u0000"+ - "\u0000\u026c\u026d\u0005f\u0000\u0000\u026d\u026e\u0003\u00a4R\u0000\u026e"+ - "\u026f\u0005g\u0000\u0000\u026fC\u0001\u0000\u0000\u0000\u0270\u0271\u0005"+ - "\u0016\u0000\u0000\u0271\u0272\u0005f\u0000\u0000\u0272\u0275\u0003\u00a4"+ - "R\u0000\u0273\u0274\u0005m\u0000\u0000\u0274\u0276\u0003\u00a4R\u0000"+ - "\u0275\u0273\u0001\u0000\u0000\u0000\u0275\u0276\u0001\u0000\u0000\u0000"+ - "\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0278\u0005g\u0000\u0000\u0278"+ - "E\u0001\u0000\u0000\u0000\u0279\u027a\u0007\u0004\u0000\u0000\u027a\u027b"+ - "\u0005j\u0000\u0000\u027b\u027c\u0003\u00a4R\u0000\u027c\u027d\u0005="+ - "\u0000\u0000\u027d\u027e\u0003\u00a4R\u0000\u027e\u027f\u0005k\u0000\u0000"+ - "\u027fG\u0001\u0000\u0000\u0000\u0280\u0281\u00056\u0000\u0000\u0281\u0282"+ - "\u0003\u00a4R\u0000\u0282\u0288\u0005h\u0000\u0000\u0283\u0284\u0003J"+ - "%\u0000\u0284\u0285\u0003\u0170\u00b8\u0000\u0285\u0287\u0001\u0000\u0000"+ - "\u0000\u0286\u0283\u0001\u0000\u0000\u0000\u0287\u028a\u0001\u0000\u0000"+ - "\u0000\u0288\u0286\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000"+ - "\u0000\u0289\u028b\u0001\u0000\u0000\u0000\u028a\u0288\u0001\u0000\u0000"+ - "\u0000\u028b\u028c\u0005i\u0000\u0000\u028cI\u0001\u0000\u0000\u0000\u028d"+ - "\u028e\u0003j5\u0000\u028e\u028f\u0005o\u0000\u0000\u028f\u0290\u0003"+ - "\u00a4R\u0000\u0290K\u0001\u0000\u0000\u0000\u0291\u0292\u0005j\u0000"+ - "\u0000\u0292\u0297\u0003N\'\u0000\u0293\u0294\u0005m\u0000\u0000\u0294"+ - "\u0296\u0003N\'\u0000\u0295\u0293\u0001\u0000\u0000\u0000\u0296\u0299"+ - "\u0001\u0000\u0000\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0297\u0298"+ - "\u0001\u0000\u0000\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u0297"+ - "\u0001\u0000\u0000\u0000\u029a\u029b\u0005k\u0000\u0000\u029bM\u0001\u0000"+ - "\u0000\u0000\u029c\u029d\u0003\u00a4R\u0000\u029d\u029e\u0005l\u0000\u0000"+ - "\u029e\u029f\u0003\u00a4R\u0000\u029fO\u0001\u0000\u0000\u0000\u02a0\u02a5"+ - "\u0003\\.\u0000\u02a1\u02a5\u0003Z-\u0000\u02a2\u02a5\u0003R)\u0000\u02a3"+ - "\u02a5\u0003V+\u0000\u02a4\u02a0\u0001\u0000\u0000\u0000\u02a4\u02a1\u0001"+ - "\u0000\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4\u02a3\u0001"+ - "\u0000\u0000\u0000\u02a5Q\u0001\u0000\u0000\u0000\u02a6\u02a7\u00053\u0000"+ - "\u0000\u02a7\u02ad\u0005h\u0000\u0000\u02a8\u02a9\u0003T*\u0000\u02a9"+ - "\u02aa\u0003\u0170\u00b8\u0000\u02aa\u02ac\u0001\u0000\u0000\u0000\u02ab"+ - "\u02a8\u0001\u0000\u0000\u0000\u02ac\u02af\u0001\u0000\u0000\u0000\u02ad"+ - "\u02ab\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae"+ - "\u02b0\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02b0"+ - "\u02b1\u0005i\u0000\u0000\u02b1S\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005"+ - "M\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02bc\u0003\u013e\u009f"+ - "\u0000\u02b5\u02b6\u00054\u0000\u0000\u02b6\u02b7\u0005h\u0000\u0000\u02b7"+ - "\u02b8\u0003\u00a4R\u0000\u02b8\u02b9\u0003\u0170\u00b8\u0000\u02b9\u02ba"+ - "\u0005i\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02b2\u0001"+ - "\u0000\u0000\u0000\u02bb\u02b5\u0001\u0000\u0000\u0000\u02bcU\u0001\u0000"+ - "\u0000\u0000\u02bd\u02be\u00055\u0000\u0000\u02be\u02c4\u0005h\u0000\u0000"+ - "\u02bf\u02c0\u0003X,\u0000\u02c0\u02c1\u0003\u0170\u00b8\u0000\u02c1\u02c3"+ - "\u0001\u0000\u0000\u0000\u02c2\u02bf\u0001\u0000\u0000\u0000\u02c3\u02c6"+ - "\u0001\u0000\u0000\u0000\u02c4\u02c2\u0001\u0000\u0000\u0000\u02c4\u02c5"+ - "\u0001\u0000\u0000\u0000\u02c5\u02c7\u0001\u0000\u0000\u0000\u02c6\u02c4"+ - "\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005i\u0000\u0000\u02c8W\u0001\u0000"+ - "\u0000\u0000\u02c9\u02ca\u0005e\u0000\u0000\u02ca\u02d0\u0005h\u0000\u0000"+ - "\u02cb\u02cc\u0003\u0160\u00b0\u0000\u02cc\u02cd\u0003\u0170\u00b8\u0000"+ - "\u02cd\u02cf\u0001\u0000\u0000\u0000\u02ce\u02cb\u0001\u0000\u0000\u0000"+ - "\u02cf\u02d2\u0001\u0000\u0000\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000"+ - "\u02d0\u02d1\u0001\u0000\u0000\u0000\u02d1\u02d3\u0001\u0000\u0000\u0000"+ - "\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005i\u0000\u0000\u02d4"+ - "Y\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005\u001b\u0000\u0000\u02d6\u02d7"+ - "\u0005j\u0000\u0000\u02d7\u02d8\u0005k\u0000\u0000\u02d8\u02d9\u0003\u0132"+ - "\u0099\u0000\u02d9[\u0001\u0000\u0000\u0000\u02da\u02db\u0007\u0005\u0000"+ - "\u0000\u02db\u02dc\u0005j\u0000\u0000\u02dc\u02dd\u0003\u00c2a\u0000\u02dd"+ - "\u02de\u0005k\u0000\u0000\u02de\u02e6\u0001\u0000\u0000\u0000\u02df\u02e0"+ - "\u0005+\u0000\u0000\u02e0\u02e1\u0005j\u0000\u0000\u02e1\u02e2\u0003\u00c2"+ - "a\u0000\u02e2\u02e3\u0005k\u0000\u0000\u02e3\u02e4\u0003\u00c2a\u0000"+ - "\u02e4\u02e6\u0001\u0000\u0000\u0000\u02e5\u02da\u0001\u0000\u0000\u0000"+ - "\u02e5\u02df\u0001\u0000\u0000\u0000\u02e6]\u0001\u0000\u0000\u0000\u02e7"+ - "\u02ed\u0003`0\u0000\u02e8\u02e9\u0005\u000e\u0000\u0000\u02e9\u02ed\u0006"+ - "/\uffff\uffff\u0000\u02ea\u02eb\u0005C\u0000\u0000\u02eb\u02ed\u0006/"+ - "\uffff\uffff\u0000\u02ec\u02e7\u0001\u0000\u0000\u0000\u02ec\u02e8\u0001"+ - "\u0000\u0000\u0000\u02ec\u02ea\u0001\u0000\u0000\u0000\u02ed\u02ee\u0001"+ - "\u0000\u0000\u0000\u02ee\u02f0\u0003\u0170\u00b8\u0000\u02ef\u02ec\u0001"+ - "\u0000\u0000\u0000\u02f0\u02f3\u0001\u0000\u0000\u0000\u02f1\u02f2\u0001"+ - "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f6\u0001"+ - "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f4\u02f5\u0005"+ - "\u000e\u0000\u0000\u02f5\u02f7\u0006/\uffff\uffff\u0000\u02f6\u02f4\u0001"+ - "\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000\u0000\u0000\u02f7_\u0001\u0000"+ - "\u0000\u0000\u02f8\u02f9\u0005\t\u0000\u0000\u02f9\u0301\u0003d2\u0000"+ - "\u02fa\u02fb\u0005\n\u0000\u0000\u02fb\u0301\u0003d2\u0000\u02fc\u02fd"+ - "\u0005\u000b\u0000\u0000\u02fd\u0301\u0003d2\u0000\u02fe\u02ff\u0005\r"+ - "\u0000\u0000\u02ff\u0301\u0003b1\u0000\u0300\u02f8\u0001\u0000\u0000\u0000"+ - "\u0300\u02fa\u0001\u0000\u0000\u0000\u0300\u02fc\u0001\u0000\u0000\u0000"+ - "\u0300\u02fe\u0001\u0000\u0000\u0000\u0301a\u0001\u0000\u0000\u0000\u0302"+ - "\u0304\u0003\u00e6s\u0000\u0303\u0302\u0001\u0000\u0000\u0000\u0303\u0304"+ - "\u0001\u0000\u0000\u0000\u0304\u0307\u0001\u0000\u0000\u0000\u0305\u0306"+ - "\u0005\\\u0000\u0000\u0306\u0308\u0003\u00a4R\u0000\u0307\u0305\u0001"+ - "\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308c\u0001\u0000"+ - "\u0000\u0000\u0309\u030c\u0001\u0000\u0000\u0000\u030a\u030c\u0003\u00a4"+ - "R\u0000\u030b\u0309\u0001\u0000\u0000\u0000\u030b\u030a\u0001\u0000\u0000"+ - "\u0000\u030ce\u0001\u0000\u0000\u0000\u030d\u030e\u00056\u0000\u0000\u030e"+ - "\u030f\u0003\u00a4R\u0000\u030f\u0313\u0005h\u0000\u0000\u0310\u0312\u0003"+ - "h4\u0000\u0311\u0310\u0001\u0000\u0000\u0000\u0312\u0315\u0001\u0000\u0000"+ - "\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0313\u0314\u0001\u0000\u0000"+ - "\u0000\u0314\u0316\u0001\u0000\u0000\u0000\u0315\u0313\u0001\u0000\u0000"+ - "\u0000\u0316\u0317\u0005i\u0000\u0000\u0317g\u0001\u0000\u0000\u0000\u0318"+ - "\u0319\u0003j5\u0000\u0319\u031b\u0005o\u0000\u0000\u031a\u031c\u0003"+ - "\u00f0x\u0000\u031b\u031a\u0001\u0000\u0000\u0000\u031b\u031c\u0001\u0000"+ - "\u0000\u0000\u031ci\u0001\u0000\u0000\u0000\u031d\u031e\u0005P\u0000\u0000"+ - "\u031e\u0321\u0003l6\u0000\u031f\u0321\u0005L\u0000\u0000\u0320\u031d"+ - "\u0001\u0000\u0000\u0000\u0320\u031f\u0001\u0000\u0000\u0000\u0321k\u0001"+ - "\u0000\u0000\u0000\u0322\u0323\u0005%\u0000\u0000\u0323\u0330\u0005e\u0000"+ - "\u0000\u0324\u0325\u0003\u00cae\u0000\u0325\u032a\u0005h\u0000\u0000\u0326"+ - "\u0328\u0003n7\u0000\u0327\u0329\u0005m\u0000\u0000\u0328\u0327\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u032b\u0001"+ - "\u0000\u0000\u0000\u032a\u0326\u0001\u0000\u0000\u0000\u032a\u032b\u0001"+ - "\u0000\u0000\u0000\u032b\u032c\u0001\u0000\u0000\u0000\u032c\u032d\u0005"+ - "i\u0000\u0000\u032d\u0330\u0001\u0000\u0000\u0000\u032e\u0330\u0003\u00a4"+ - "R\u0000\u032f\u0322\u0001\u0000\u0000\u0000\u032f\u0324\u0001\u0000\u0000"+ - "\u0000\u032f\u032e\u0001\u0000\u0000\u0000\u0330m\u0001\u0000\u0000\u0000"+ - "\u0331\u0336\u0003l6\u0000\u0332\u0333\u0005m\u0000\u0000\u0333\u0335"+ - "\u0003l6\u0000\u0334\u0332\u0001\u0000\u0000\u0000\u0335\u0338\u0001\u0000"+ - "\u0000\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0336\u0337\u0001\u0000"+ - "\u0000\u0000\u0337o\u0001\u0000\u0000\u0000\u0338\u0336\u0001\u0000\u0000"+ - "\u0000\u0339\u033e\u0005h\u0000\u0000\u033a\u033b\u0005;\u0000\u0000\u033b"+ - "\u033c\u0003\u00e4r\u0000\u033c\u033d\u0003\u0170\u00b8\u0000\u033d\u033f"+ - "\u0001\u0000\u0000\u0000\u033e\u033a\u0001\u0000\u0000\u0000\u033e\u033f"+ - "\u0001\u0000\u0000\u0000\u033f\u0341\u0001\u0000\u0000\u0000\u0340\u0342"+ - "\u0003\u00f0x\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0341\u0342\u0001"+ - "\u0000\u0000\u0000\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ - "i\u0000\u0000\u0344q\u0001\u0000\u0000\u0000\u0345\u0348\u0003\u0150\u00a8"+ - "\u0000\u0346\u0348\u0005e\u0000\u0000\u0347\u0345\u0001\u0000\u0000\u0000"+ - "\u0347\u0346\u0001\u0000\u0000\u0000\u0348\u0351\u0001\u0000\u0000\u0000"+ - "\u0349\u034e\u0005h\u0000\u0000\u034a\u034c\u0003t:\u0000\u034b\u034d"+ - "\u0005m\u0000\u0000\u034c\u034b\u0001\u0000\u0000\u0000\u034c\u034d\u0001"+ - "\u0000\u0000\u0000\u034d\u034f\u0001\u0000\u0000\u0000\u034e\u034a\u0001"+ - "\u0000\u0000\u0000\u034e\u034f\u0001\u0000\u0000\u0000\u034f\u0350\u0001"+ - "\u0000\u0000\u0000\u0350\u0352\u0005i\u0000\u0000\u0351\u0349\u0001\u0000"+ - "\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000\u0352s\u0001\u0000\u0000"+ - "\u0000\u0353\u0358\u0003v;\u0000\u0354\u0355\u0005m\u0000\u0000\u0355"+ - "\u0357\u0003v;\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0357\u035a\u0001"+ - "\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0358\u0359\u0001"+ - "\u0000\u0000\u0000\u0359u\u0001\u0000\u0000\u0000\u035a\u0358\u0001\u0000"+ - "\u0000\u0000\u035b\u035c\u0005e\u0000\u0000\u035c\u035e\u0005o\u0000\u0000"+ - "\u035d\u035b\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000"+ - "\u035e\u035f\u0001\u0000\u0000\u0000\u035f\u0360\u0003\u00a4R\u0000\u0360"+ - "w\u0001\u0000\u0000\u0000\u0361\u0362\u0005G\u0000\u0000\u0362\u0363\u0003"+ - "\u00a4R\u0000\u0363\u0364\u0005\u000f\u0000\u0000\u0364\u0365\u0003r9"+ - "\u0000\u0365\u0366\u0003\u00eew\u0000\u0366y\u0001\u0000\u0000\u0000\u0367"+ - "\u0368\u0003\u00c2a\u0000\u0368\u0369\u0005\u000f\u0000\u0000\u0369\u037c"+ - "\u0003\u00c2a\u0000\u036a\u0370\u0005h\u0000\u0000\u036b\u036c\u0003\u0082"+ - "A\u0000\u036c\u036d\u0003\u0170\u00b8\u0000\u036d\u036f\u0001\u0000\u0000"+ - "\u0000\u036e\u036b\u0001\u0000\u0000\u0000\u036f\u0372\u0001\u0000\u0000"+ - "\u0000\u0370\u036e\u0001\u0000\u0000\u0000\u0370\u0371\u0001\u0000\u0000"+ - "\u0000\u0371\u0378\u0001\u0000\u0000\u0000\u0372\u0370\u0001\u0000\u0000"+ - "\u0000\u0373\u0374\u0003|>\u0000\u0374\u0375\u0003\u0170\u00b8\u0000\u0375"+ - "\u0377\u0001\u0000\u0000\u0000\u0376\u0373\u0001\u0000\u0000\u0000\u0377"+ - "\u037a\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0378"+ - "\u0379\u0001\u0000\u0000\u0000\u0379\u037b\u0001\u0000\u0000\u0000\u037a"+ - "\u0378\u0001\u0000\u0000\u0000\u037b\u037d\u0005i\u0000\u0000\u037c\u036a"+ - "\u0001\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d{\u0001"+ - "\u0000\u0000\u0000\u037e\u0380\u0005\u000e\u0000\u0000\u037f\u037e\u0001"+ - "\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0381\u0001"+ - "\u0000\u0000\u0000\u0381\u0382\u0003~?\u0000\u0382\u0383\u0005e\u0000"+ - "\u0000\u0383\u0385\u0003\u013e\u009f\u0000\u0384\u0386\u0003\u00eew\u0000"+ - "\u0385\u0384\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000\u0000"+ - "\u0386}\u0001\u0000\u0000\u0000\u0387\u0389\u0005f\u0000\u0000\u0388\u038a"+ - "\u0005e\u0000\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u0389\u038a\u0001"+ - "\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000\u0000\u038b\u038d\u0005"+ - "\u0087\u0000\u0000\u038c\u038b\u0001\u0000\u0000\u0000\u038c\u038d\u0001"+ - "\u0000\u0000\u0000\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u038f\u0003"+ - "\u012c\u0096\u0000\u038f\u0390\u0005g\u0000\u0000\u0390\u007f\u0001\u0000"+ - "\u0000\u0000\u0391\u0397\u0003\u00b4Z\u0000\u0392\u0393\u0003\u00c2a\u0000"+ - "\u0393\u0394\u0005p\u0000\u0000\u0394\u0395\u0005e\u0000\u0000\u0395\u0397"+ - "\u0001\u0000\u0000\u0000\u0396\u0391\u0001\u0000\u0000\u0000\u0396\u0392"+ - "\u0001\u0000\u0000\u0000\u0397\u0081\u0001\u0000\u0000\u0000\u0398\u0399"+ - "\u00058\u0000\u0000\u0399\u039a\u0005e\u0000\u0000\u039a\u039d\u0005s"+ - "\u0000\u0000\u039b\u039e\u0003\u0080@\u0000\u039c\u039e\u0003\u014e\u00a7"+ - "\u0000\u039d\u039b\u0001\u0000\u0000\u0000\u039d\u039c\u0001\u0000\u0000"+ - "\u0000\u039e\u0083\u0001\u0000\u0000\u0000\u039f\u03a0\u0005/\u0000\u0000"+ - "\u03a0\u03a1\u0005f\u0000\u0000\u03a1\u03a4\u0003\u00c2a\u0000\u03a2\u03a3"+ - "\u0005m\u0000\u0000\u03a3\u03a5\u0003\u00e6s\u0000\u03a4\u03a2\u0001\u0000"+ - "\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0001\u0000"+ - "\u0000\u0000\u03a6\u03a7\u0005g\u0000\u0000\u03a7\u0085\u0001\u0000\u0000"+ - "\u0000\u03a8\u03a9\u0005.\u0000\u0000\u03a9\u03aa\u0005f\u0000\u0000\u03aa"+ - "\u03ab\u0003\u00c2a\u0000\u03ab\u03ac\u0005g\u0000\u0000\u03ac\u0087\u0001"+ - "\u0000\u0000\u0000\u03ad\u03b0\u0003^/\u0000\u03ae\u03b1\u0003\u008aE"+ - "\u0000\u03af\u03b1\u0003\u008cF\u0000\u03b0\u03ae\u0001\u0000\u0000\u0000"+ - "\u03b0\u03af\u0001\u0000\u0000\u0000\u03b1\u0089\u0001\u0000\u0000\u0000"+ - "\u03b2\u03b3\u0005M\u0000\u0000\u03b3\u03b4\u0005e\u0000\u0000\u03b4\u03b6"+ - "\u0003\u013e\u009f\u0000\u03b5\u03b7\u0003p8\u0000\u03b6\u03b5\u0001\u0000"+ - "\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u008b\u0001\u0000"+ - "\u0000\u0000\u03b8\u03b9\u0005M\u0000\u0000\u03b9\u03ba\u0003\u009aM\u0000"+ - "\u03ba\u03bb\u0005e\u0000\u0000\u03bb\u03bd\u0003\u013e\u009f\u0000\u03bc"+ - "\u03be\u0003p8\u0000\u03bd\u03bc\u0001\u0000\u0000\u0000\u03bd\u03be\u0001"+ - "\u0000\u0000\u0000\u03be\u008d\u0001\u0000\u0000\u0000\u03bf\u03c2\u0005"+ - "\u001b\u0000\u0000\u03c0\u03c3\u0003\u0088D\u0000\u03c1\u03c3\u0003\u00de"+ - "o\u0000\u03c2\u03c0\u0001\u0000\u0000\u0000\u03c2\u03c1\u0001\u0000\u0000"+ - "\u0000\u03c3\u008f\u0001\u0000\u0000\u0000\u03c4\u03c5\u00058\u0000\u0000"+ - "\u03c5\u03c6\u0005e\u0000\u0000\u03c6\u03c8\u0003\u0142\u00a1\u0000\u03c7"+ - "\u03c9\u0003\u0092I\u0000\u03c8\u03c7\u0001\u0000\u0000\u0000\u03c8\u03c9"+ - "\u0001\u0000\u0000\u0000\u03c9\u0091\u0001\u0000\u0000\u0000\u03ca\u03cb"+ - "\u0005h\u0000\u0000\u03cb\u03cc\u0003\u00a4R\u0000\u03cc\u03cd\u0003\u0170"+ - "\u00b8\u0000\u03cd\u03ce\u0005i\u0000\u0000\u03ce\u0093\u0001\u0000\u0000"+ - "\u0000\u03cf\u03d0\u00058\u0000\u0000\u03d0\u03d1\u0003\u009aM\u0000\u03d1"+ - "\u03d2\u0005e\u0000\u0000\u03d2\u03d4\u0003\u0142\u00a1\u0000\u03d3\u03d5"+ - "\u0003\u0092I\u0000\u03d4\u03d3\u0001\u0000\u0000\u0000\u03d4\u03d5\u0001"+ - "\u0000\u0000\u0000\u03d5\u0095\u0001\u0000\u0000\u0000\u03d6\u03de\u0003"+ - "\u0006\u0003\u0000\u03d7\u03da\u0003\u00c2a\u0000\u03d8\u03d9\u0005l\u0000"+ - "\u0000\u03d9\u03db\u0003\u00e6s\u0000\u03da\u03d8\u0001\u0000\u0000\u0000"+ - "\u03da\u03db\u0001\u0000\u0000\u0000\u03db\u03df\u0001\u0000\u0000\u0000"+ - "\u03dc\u03dd\u0005l\u0000\u0000\u03dd\u03df\u0003\u00e6s\u0000\u03de\u03d7"+ - "\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000\u03df\u0097"+ - "\u0001\u0000\u0000\u0000\u03e0\u03e1\u0003\u0006\u0003\u0000\u03e1\u03e2"+ - "\u0005s\u0000\u0000\u03e2\u03e3\u0003\u00e6s\u0000\u03e3\u0099\u0001\u0000"+ - "\u0000\u0000\u03e4\u03e6\u0005f\u0000\u0000\u03e5\u03e7\u0003\b\u0004"+ - "\u0000\u03e6\u03e5\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000"+ - "\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8\u03ea\u0003\u00c2a\u0000"+ - "\u03e9\u03eb\u0005m\u0000\u0000\u03ea\u03e9\u0001\u0000\u0000\u0000\u03ea"+ - "\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000\u03ec"+ - "\u03ed\u0005g\u0000\u0000\u03ed\u009b\u0001\u0000\u0000\u0000\u03ee\u03f1"+ - "\u0003\u009eO\u0000\u03ef\u03f1\u0003\u00a0P\u0000\u03f0\u03ee\u0001\u0000"+ - "\u0000\u0000\u03f0\u03ef\u0001\u0000\u0000\u0000\u03f1\u009d\u0001\u0000"+ - "\u0000\u0000\u03f2\u03f4\u0003\u00e4r\u0000\u03f3\u03f2\u0001\u0000\u0000"+ - "\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000"+ - "\u0000\u03f5\u03f6\u0003\u00a2Q\u0000\u03f6\u009f\u0001\u0000\u0000\u0000"+ - "\u03f7\u03f9\u0005\u001b\u0000\u0000\u03f8\u03fa\u0003\u00e4r\u0000\u03f9"+ - "\u03f8\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa"+ - "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0003\u00a2Q\u0000\u03fc\u00a1"+ - "\u0001\u0000\u0000\u0000\u03fd\u03ff\u0005t\u0000\u0000\u03fe\u03fd\u0001"+ - "\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0001"+ - "\u0000\u0000\u0000\u0400\u0401\u0003\u00c2a\u0000\u0401\u00a3\u0001\u0000"+ - "\u0000\u0000\u0402\u0403\u0006R\uffff\uffff\u0000\u0403\u0404\u0007\u0006"+ - "\u0000\u0000\u0404\u0418\u0003\u00a4R\u000f\u0405\u0418\u0003\u00b4Z\u0000"+ - "\u0406\u0407\u0005\u0019\u0000\u0000\u0407\u0408\u0003.\u0017\u0000\u0408"+ - "\u0409\u0005\u001c\u0000\u0000\u0409\u040a\u0003\u00a4R\u0003\u040a\u0418"+ - "\u0001\u0000\u0000\u0000\u040b\u040c\u0005\u001a\u0000\u0000\u040c\u040d"+ - "\u0003\u0098L\u0000\u040d\u040e\u0005\u001c\u0000\u0000\u040e\u040f\u0003"+ - "\u00a4R\u0002\u040f\u0418\u0001\u0000\u0000\u0000\u0410\u0411\u0007\u0007"+ - "\u0000\u0000\u0411\u0412\u0003&\u0013\u0000\u0412\u0413\u0005o\u0000\u0000"+ - "\u0413\u0414\u0005o\u0000\u0000\u0414\u0415\u0003*\u0015\u0000\u0415\u0416"+ - "\u0003\u00a4R\u0001\u0416\u0418\u0001\u0000\u0000\u0000\u0417\u0402\u0001"+ - "\u0000\u0000\u0000\u0417\u0405\u0001\u0000\u0000\u0000\u0417\u0406\u0001"+ - "\u0000\u0000\u0000\u0417\u040b\u0001\u0000\u0000\u0000\u0417\u0410\u0001"+ - "\u0000\u0000\u0000\u0418\u043c\u0001\u0000\u0000\u0000\u0419\u041a\n\r"+ - "\u0000\u0000\u041a\u041b\u0007\b\u0000\u0000\u041b\u043b\u0003\u00a4R"+ - "\u000e\u041c\u041d\n\f\u0000\u0000\u041d\u041e\u0007\t\u0000\u0000\u041e"+ - "\u043b\u0003\u00a4R\r\u041f\u0420\n\u000b\u0000\u0000\u0420\u0421\u0007"+ - "\n\u0000\u0000\u0421\u043b\u0003\u00a4R\f\u0422\u0423\n\n\u0000\u0000"+ - "\u0423\u0424\u0007\u000b\u0000\u0000\u0424\u043b\u0003\u00a4R\u000b\u0425"+ - "\u0426\n\t\u0000\u0000\u0426\u0427\u0007\f\u0000\u0000\u0427\u043b\u0003"+ - "\u00a4R\n\u0428\u0429\n\u0007\u0000\u0000\u0429\u042a\u0005v\u0000\u0000"+ - "\u042a\u043b\u0003\u00a4R\b\u042b\u042c\n\u0006\u0000\u0000\u042c\u042d"+ - "\u0005u\u0000\u0000\u042d\u043b\u0003\u00a4R\u0007\u042e\u042f\n\u0005"+ - "\u0000\u0000\u042f\u0430\u0005\"\u0000\u0000\u0430\u043b\u0003\u00a4R"+ - "\u0005\u0431\u0432\n\u0004\u0000\u0000\u0432\u0433\u0005%\u0000\u0000"+ - "\u0433\u0434\u0003\u00a4R\u0000\u0434\u0435\u0005o\u0000\u0000\u0435\u0436"+ - "\u0003\u00a4R\u0004\u0436\u043b\u0001\u0000\u0000\u0000\u0437\u0438\n"+ - "\b\u0000\u0000\u0438\u0439\u0005\u000f\u0000\u0000\u0439\u043b\u0003r"+ - "9\u0000\u043a\u0419\u0001\u0000\u0000\u0000\u043a\u041c\u0001\u0000\u0000"+ - "\u0000\u043a\u041f\u0001\u0000\u0000\u0000\u043a\u0422\u0001\u0000\u0000"+ - "\u0000\u043a\u0425\u0001\u0000\u0000\u0000\u043a\u0428\u0001\u0000\u0000"+ - "\u0000\u043a\u042b\u0001\u0000\u0000\u0000\u043a\u042e\u0001\u0000\u0000"+ - "\u0000\u043a\u0431\u0001\u0000\u0000\u0000\u043a\u0437\u0001\u0000\u0000"+ - "\u0000\u043b\u043e\u0001\u0000\u0000\u0000\u043c\u043a\u0001\u0000\u0000"+ - "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u00a5\u0001\u0000\u0000"+ - "\u0000\u043e\u043c\u0001\u0000\u0000\u0000\u043f\u0454\u0003\u0018\f\u0000"+ - "\u0440\u0454\u0003\u001a\r\u0000\u0441\u0454\u0003\u00aaU\u0000\u0442"+ - "\u0454\u0003\u00a8T\u0000\u0443\u0454\u0003\u00deo\u0000\u0444\u0454\u0003"+ - "\u00fe\u007f\u0000\u0445\u0454\u0003\u00f2y\u0000\u0446\u0454\u0003\u012a"+ - "\u0095\u0000\u0447\u0454\u0003\u0100\u0080\u0000\u0448\u0454\u0003\u0102"+ - "\u0081\u0000\u0449\u0454\u0003\u0104\u0082\u0000\u044a\u0454\u0003\u0106"+ - "\u0083\u0000\u044b\u0454\u0003\u0108\u0084\u0000\u044c\u0454\u0003\u00ee"+ - "w\u0000\u044d\u0454\u0003\u010a\u0085\u0000\u044e\u0454\u0003\u010c\u0086"+ - "\u0000\u044f\u0454\u0003\u011e\u008f\u0000\u0450\u0454\u0003\u00acV\u0000"+ - "\u0451\u0454\u0003\u00b0X\u0000\u0452\u0454\u0003x<\u0000\u0453\u043f"+ - "\u0001\u0000\u0000\u0000\u0453\u0440\u0001\u0000\u0000\u0000\u0453\u0441"+ - "\u0001\u0000\u0000\u0000\u0453\u0442\u0001\u0000\u0000\u0000\u0453\u0443"+ - "\u0001\u0000\u0000\u0000\u0453\u0444\u0001\u0000\u0000\u0000\u0453\u0445"+ - "\u0001\u0000\u0000\u0000\u0453\u0446\u0001\u0000\u0000\u0000\u0453\u0447"+ - "\u0001\u0000\u0000\u0000\u0453\u0448\u0001\u0000\u0000\u0000\u0453\u0449"+ - "\u0001\u0000\u0000\u0000\u0453\u044a\u0001\u0000\u0000\u0000\u0453\u044b"+ - "\u0001\u0000\u0000\u0000\u0453\u044c\u0001\u0000\u0000\u0000\u0453\u044d"+ - "\u0001\u0000\u0000\u0000\u0453\u044e\u0001\u0000\u0000\u0000\u0453\u044f"+ - "\u0001\u0000\u0000\u0000\u0453\u0450\u0001\u0000\u0000\u0000\u0453\u0451"+ - "\u0001\u0000\u0000\u0000\u0453\u0452\u0001\u0000\u0000\u0000\u0454\u00a7"+ - "\u0001\u0000\u0000\u0000\u0455\u0456\u0005$\u0000\u0000\u0456\u0457\u0003"+ - "\u00a4R\u0000\u0457\u00a9\u0001\u0000\u0000\u0000\u0458\u0459\u0005X\u0000"+ - "\u0000\u0459\u045b\u0003\u00a4R\u0000\u045a\u045c\u0003\u00eew\u0000\u045b"+ - "\u045a\u0001\u0000\u0000\u0000\u045b\u045c\u0001\u0000\u0000\u0000\u045c"+ - "\u00ab\u0001\u0000\u0000\u0000\u045d\u045e\u0003\u00aeW\u0000\u045e\u045f"+ - "\u0003\u0126\u0093\u0000\u045f\u00ad\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0005\f\u0000\u0000\u0461\u0462\u0003\u00a4R\u0000\u0462\u0463\u0003"+ - "\u0170\u00b8\u0000\u0463\u0465\u0001\u0000\u0000\u0000\u0464\u0460\u0001"+ - "\u0000\u0000\u0000\u0465\u0468\u0001\u0000\u0000\u0000\u0466\u0464\u0001"+ - "\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u046d\u0001"+ - "\u0000\u0000\u0000\u0468\u0466\u0001\u0000\u0000\u0000\u0469\u046a\u0005"+ - "\r\u0000\u0000\u046a\u046b\u0003b1\u0000\u046b\u046c\u0003\u0170\u00b8"+ - "\u0000\u046c\u046e\u0001\u0000\u0000\u0000\u046d\u0469\u0001\u0000\u0000"+ - "\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u00af\u0001\u0000\u0000"+ - "\u0000\u046f\u0470\u0005Q\u0000\u0000\u0470\u0475\u0003\u00a4R\u0000\u0471"+ - "\u0472\u0005Q\u0000\u0000\u0472\u0473\u0007\u0001\u0000\u0000\u0473\u0475"+ - "\u0003.\u0017\u0000\u0474\u046f\u0001\u0000\u0000\u0000\u0474\u0471\u0001"+ - "\u0000\u0000\u0000\u0475\u00b1\u0001\u0000\u0000\u0000\u0476\u047f\u0005"+ - "\u0003\u0000\u0000\u0477\u047f\u0005\u0004\u0000\u0000\u0478\u047f\u0005"+ - "d\u0000\u0000\u0479\u047f\u0003\u014c\u00a6\u0000\u047a\u047f\u0003\u0162"+ - "\u00b1\u0000\u047b\u047f\u0005\u0001\u0000\u0000\u047c\u047f\u0005\u008f"+ - "\u0000\u0000\u047d\u047f\u0005\u0090\u0000\u0000\u047e\u0476\u0001\u0000"+ - "\u0000\u0000\u047e\u0477\u0001\u0000\u0000\u0000\u047e\u0478\u0001\u0000"+ - "\u0000\u0000\u047e\u0479\u0001\u0000\u0000\u0000\u047e\u047a\u0001\u0000"+ - "\u0000\u0000\u047e\u047b\u0001\u0000\u0000\u0000\u047e\u047c\u0001\u0000"+ - "\u0000\u0000\u047e\u047d\u0001\u0000\u0000\u0000\u047f\u00b3\u0001\u0000"+ - "\u0000\u0000\u0480\u0481\u0006Z\uffff\uffff\u0000\u0481\u048d\u0003\u0148"+ - "\u00a4\u0000\u0482\u048d\u0003\u0144\u00a2\u0000\u0483\u048d\u0003\u016c"+ - "\u00b6\u0000\u0484\u048d\u0003 \u0010\u0000\u0485\u048d\u0003\u0086C\u0000"+ - "\u0486\u048d\u0003\u0084B\u0000\u0487\u0488\u0007\r\u0000\u0000\u0488"+ - "\u0489\u0005f\u0000\u0000\u0489\u048a\u0003\u00a4R\u0000\u048a\u048b\u0005"+ - "g\u0000\u0000\u048b\u048d\u0001\u0000\u0000\u0000\u048c\u0480\u0001\u0000"+ - "\u0000\u0000\u048c\u0482\u0001\u0000\u0000\u0000\u048c\u0483\u0001\u0000"+ - "\u0000\u0000\u048c\u0484\u0001\u0000\u0000\u0000\u048c\u0485\u0001\u0000"+ - "\u0000\u0000\u048c\u0486\u0001\u0000\u0000\u0000\u048c\u0487\u0001\u0000"+ - "\u0000\u0000\u048d\u04a4\u0001\u0000\u0000\u0000\u048e\u048f\n\t\u0000"+ - "\u0000\u048f\u0490\u0005p\u0000\u0000\u0490\u04a3\u0005e\u0000\u0000\u0491"+ - "\u0492\n\b\u0000\u0000\u0492\u04a3\u0003\u0166\u00b3\u0000\u0493\u0494"+ - "\n\u0007\u0000\u0000\u0494\u04a3\u0003\u00ceg\u0000\u0495\u0496\n\u0006"+ - "\u0000\u0000\u0496\u04a3\u0003L&\u0000\u0497\u0498\n\u0005\u0000\u0000"+ - "\u0498\u04a3\u0003\u0168\u00b4\u0000\u0499\u049a\n\u0004\u0000\u0000\u049a"+ - "\u04a3\u0003\u016a\u00b5\u0000\u049b\u049c\n\u0003\u0000\u0000\u049c\u049d"+ - "\u0003\u016a\u00b5\u0000\u049d\u049e\u0005\u0010\u0000\u0000\u049e\u049f"+ - "\u0003r9\u0000\u049f\u04a3\u0001\u0000\u0000\u0000\u04a0\u04a1\n\u0002"+ - "\u0000\u0000\u04a1\u04a3\u0003\u00ba]\u0000\u04a2\u048e\u0001\u0000\u0000"+ - "\u0000\u04a2\u0491\u0001\u0000\u0000\u0000\u04a2\u0493\u0001\u0000\u0000"+ - "\u0000\u04a2\u0495\u0001\u0000\u0000\u0000\u04a2\u0497\u0001\u0000\u0000"+ - "\u0000\u04a2\u0499\u0001\u0000\u0000\u0000\u04a2\u049b\u0001\u0000\u0000"+ - "\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a3\u04a6\u0001\u0000\u0000"+ - "\u0000\u04a4\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000"+ - "\u0000\u04a5\u00b5\u0001\u0000\u0000\u0000\u04a6\u04a4\u0001\u0000\u0000"+ - "\u0000\u04a7\u04a8\u0003^/\u0000\u04a8\u04a9\u0003\u00b8\\\u0000\u04a9"+ - "\u00b7\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005M\u0000\u0000\u04ab\u04ad"+ - "\u0005e\u0000\u0000\u04ac\u04ab\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ - "\u0000\u0000\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04b0\u0003"+ - "\u013e\u009f\u0000\u04af\u04b1\u0003p8\u0000\u04b0\u04af\u0001\u0000\u0000"+ - "\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u00b9\u0001\u0000\u0000"+ - "\u0000\u04b2\u04b4\u0005&\u0000\u0000\u04b3\u04b5\u0003\u00e6s\u0000\u04b4"+ - "\u04b3\u0001\u0000\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5"+ - "\u04b7\u0001\u0000\u0000\u0000\u04b6\u04b8\u0005m\u0000\u0000\u04b7\u04b6"+ - "\u0001\u0000\u0000\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9"+ - "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0005\'\u0000\u0000\u04ba\u00bb\u0001"+ - "\u0000\u0000\u0000\u04bb\u04bc\u0005N\u0000\u0000\u04bc\u04c6\u0005h\u0000"+ - "\u0000\u04bd\u04c1\u0003\u00c0`\u0000\u04be\u04c1\u0003\u012c\u0096\u0000"+ - "\u04bf\u04c1\u0003\u00be_\u0000\u04c0\u04bd\u0001\u0000\u0000\u0000\u04c0"+ - "\u04be\u0001\u0000\u0000\u0000\u04c0\u04bf\u0001\u0000\u0000\u0000\u04c1"+ - "\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0003\u0170\u00b8\u0000\u04c3"+ - "\u04c5\u0001\u0000\u0000\u0000\u04c4\u04c0\u0001\u0000\u0000\u0000\u04c5"+ - "\u04c8\u0001\u0000\u0000\u0000\u04c6\u04c4\u0001\u0000\u0000\u0000\u04c6"+ - "\u04c7\u0001\u0000\u0000\u0000\u04c7\u04c9\u0001\u0000\u0000\u0000\u04c8"+ - "\u04c6\u0001\u0000\u0000\u0000\u04c9\u04ca\u0005i\u0000\u0000\u04ca\u00bd"+ - "\u0001\u0000\u0000\u0000\u04cb\u04cc\u00058\u0000\u0000\u04cc\u04cd\u0005"+ - "e\u0000\u0000\u04cd\u04ce\u0003\u0142\u00a1\u0000\u04ce\u00bf\u0001\u0000"+ - "\u0000\u0000\u04cf\u04d1\u0005\u001b\u0000\u0000\u04d0\u04cf\u0001\u0000"+ - "\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000"+ - "\u0000\u0000\u04d2\u04d3\u0003^/\u0000\u04d3\u04d4\u0005e\u0000\u0000"+ - "\u04d4\u04d5\u0003\u0142\u00a1\u0000\u04d5\u04d6\u0003\u0140\u00a0\u0000"+ - "\u04d6\u04df\u0001\u0000\u0000\u0000\u04d7\u04d9\u0005\u001b\u0000\u0000"+ - "\u04d8\u04d7\u0001\u0000\u0000\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000"+ - "\u04d9\u04da\u0001\u0000\u0000\u0000\u04da\u04db\u0003^/\u0000\u04db\u04dc"+ - "\u0005e\u0000\u0000\u04dc\u04dd\u0003\u0142\u00a1\u0000\u04dd\u04df\u0001"+ - "\u0000\u0000\u0000\u04de\u04d0\u0001\u0000\u0000\u0000\u04de\u04d8\u0001"+ - "\u0000\u0000\u0000\u04df\u00c1\u0001\u0000\u0000\u0000\u04e0\u04e8\u0003"+ - "\u012c\u0096\u0000\u04e1\u04e8\u0003\u00c4b\u0000\u04e2\u04e8\u0003P("+ - "\u0000\u04e3\u04e4\u0005f\u0000\u0000\u04e4\u04e5\u0003\u00c2a\u0000\u04e5"+ - "\u04e6\u0005g\u0000\u0000\u04e6\u04e8\u0001\u0000\u0000\u0000\u04e7\u04e0"+ - "\u0001\u0000\u0000\u0000\u04e7\u04e1\u0001\u0000\u0000\u0000\u04e7\u04e2"+ - "\u0001\u0000\u0000\u0000\u04e7\u04e3\u0001\u0000\u0000\u0000\u04e8\u00c3"+ - "\u0001\u0000\u0000\u0000\u04e9\u04f3\u0003\u012e\u0097\u0000\u04ea\u04f3"+ - "\u0003\u015e\u00af\u0000\u04eb\u04f3\u0003\u0134\u009a\u0000\u04ec\u04f3"+ - "\u0003\u013c\u009e\u0000\u04ed\u04f3\u0003\u00bc^\u0000\u04ee\u04f3\u0003"+ - "\u0136\u009b\u0000\u04ef\u04f3\u0003\u0138\u009c\u0000\u04f0\u04f3\u0003"+ - "\u013a\u009d\u0000\u04f1\u04f3\u0003\u00c6c\u0000\u04f2\u04e9\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ea\u0001\u0000\u0000\u0000\u04f2\u04eb\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ec\u0001\u0000\u0000\u0000\u04f2\u04ed\u0001\u0000"+ - "\u0000\u0000\u04f2\u04ee\u0001\u0000\u0000\u0000\u04f2\u04ef\u0001\u0000"+ - "\u0000\u0000\u04f2\u04f0\u0001\u0000\u0000\u0000\u04f2\u04f1\u0001\u0000"+ - "\u0000\u0000\u04f3\u00c5\u0001\u0000\u0000\u0000\u04f4\u04f5\u00058\u0000"+ - "\u0000\u04f5\u04f6\u0003\u00c8d\u0000\u04f6\u00c7\u0001\u0000\u0000\u0000"+ - "\u04f7\u0503\u0005f\u0000\u0000\u04f8\u04fd\u0003\u00c2a\u0000\u04f9\u04fa"+ - "\u0005m\u0000\u0000\u04fa\u04fc\u0003\u00c2a\u0000\u04fb\u04f9\u0001\u0000"+ - "\u0000\u0000\u04fc\u04ff\u0001\u0000\u0000\u0000\u04fd\u04fb\u0001\u0000"+ - "\u0000\u0000\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u0501\u0001\u0000"+ - "\u0000\u0000\u04ff\u04fd\u0001\u0000\u0000\u0000\u0500\u0502\u0005m\u0000"+ - "\u0000\u0501\u0500\u0001\u0000\u0000\u0000\u0501\u0502\u0001\u0000\u0000"+ - "\u0000\u0502\u0504\u0001\u0000\u0000\u0000\u0503\u04f8\u0001\u0000\u0000"+ - "\u0000\u0503\u0504\u0001\u0000\u0000\u0000\u0504\u0505\u0001\u0000\u0000"+ - "\u0000\u0505\u0506\u0005g\u0000\u0000\u0506\u00c9\u0001\u0000\u0000\u0000"+ - "\u0507\u050f\u0003\u015e\u00af\u0000\u0508\u050f\u0003\u012e\u0097\u0000"+ - "\u0509\u050f\u0003\u00ccf\u0000\u050a\u050f\u0003\u0136\u009b\u0000\u050b"+ - "\u050f\u0003\u0138\u009c\u0000\u050c\u050f\u0003P(\u0000\u050d\u050f\u0003"+ - "\u012c\u0096\u0000\u050e\u0507\u0001\u0000\u0000\u0000\u050e\u0508\u0001"+ - "\u0000\u0000\u0000\u050e\u0509\u0001\u0000\u0000\u0000\u050e\u050a\u0001"+ - "\u0000\u0000\u0000\u050e\u050b\u0001\u0000\u0000\u0000\u050e\u050c\u0001"+ - "\u0000\u0000\u0000\u050e\u050d\u0001\u0000\u0000\u0000\u050f\u00cb\u0001"+ - "\u0000\u0000\u0000\u0510\u0511\u0005j\u0000\u0000\u0511\u0512\u0005t\u0000"+ - "\u0000\u0512\u0513\u0005k\u0000\u0000\u0513\u0514\u0003\u0132\u0099\u0000"+ - "\u0514\u00cd\u0001\u0000\u0000\u0000\u0515\u0525\u0005j\u0000\u0000\u0516"+ - "\u0518\u0003\u00d0h\u0000\u0517\u0516\u0001\u0000\u0000\u0000\u0517\u0518"+ - "\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000\u0519\u051b"+ - "\u0005o\u0000\u0000\u051a\u051c\u0003\u00d2i\u0000\u051b\u051a\u0001\u0000"+ - "\u0000\u0000\u051b\u051c\u0001\u0000\u0000\u0000\u051c\u0526\u0001\u0000"+ - "\u0000\u0000\u051d\u051f\u0003\u00d0h\u0000\u051e\u051d\u0001\u0000\u0000"+ - "\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000"+ - "\u0000\u0520\u0521\u0005o\u0000\u0000\u0521\u0522\u0003\u00d2i\u0000\u0522"+ - "\u0523\u0005o\u0000\u0000\u0523\u0524\u0003\u00d4j\u0000\u0524\u0526\u0001"+ - "\u0000\u0000\u0000\u0525\u0517\u0001\u0000\u0000\u0000\u0525\u051e\u0001"+ - "\u0000\u0000\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0005"+ - "k\u0000\u0000\u0528\u00cf\u0001\u0000\u0000\u0000\u0529\u052a\u0003\u00a4"+ - "R\u0000\u052a\u00d1\u0001\u0000\u0000\u0000\u052b\u052c\u0003\u00a4R\u0000"+ - "\u052c\u00d3\u0001\u0000\u0000\u0000\u052d\u052e\u0003\u00a4R\u0000\u052e"+ - "\u00d5\u0001\u0000\u0000\u0000\u052f\u0531\u0007\u000e\u0000\u0000\u0530"+ - "\u052f\u0001\u0000\u0000\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531"+ - "\u0532\u0001\u0000\u0000\u0000\u0532\u0533\u0005l\u0000\u0000\u0533\u00d7"+ - "\u0001\u0000\u0000\u0000\u0534\u0535\u0003\u00e6s\u0000\u0535\u0536\u0005"+ - "l\u0000\u0000\u0536\u053b\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u0006"+ - "\u0003\u0000\u0538\u0539\u0005s\u0000\u0000\u0539\u053b\u0001\u0000\u0000"+ - "\u0000\u053a\u0534\u0001\u0000\u0000\u0000\u053a\u0537\u0001\u0000\u0000"+ - "\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0001\u0000\u0000"+ - "\u0000\u053c\u053d\u0005]\u0000\u0000\u053d\u0542\u0003\u00a4R\u0000\u053e"+ - "\u0540\u0005J\u0000\u0000\u053f\u0541\u0005e\u0000\u0000\u0540\u053f\u0001"+ - "\u0000\u0000\u0000\u0540\u0541\u0001\u0000\u0000\u0000\u0541\u0543\u0001"+ - "\u0000\u0000\u0000\u0542\u053e\u0001\u0000\u0000\u0000\u0542\u0543\u0001"+ - "\u0000\u0000\u0000\u0543\u00d9\u0001\u0000\u0000\u0000\u0544\u0545\u0005"+ - "X\u0000\u0000\u0545\u0546\u0005e\u0000\u0000\u0546\u00db\u0001\u0000\u0000"+ - "\u0000\u0547\u0548\u0003\u0162\u00b1\u0000\u0548\u00dd\u0001\u0000\u0000"+ - "\u0000\u0549\u054d\u0003\u00e0p\u0000\u054a\u054d\u0003\u00e8t\u0000\u054b"+ - "\u054d\u0003\u00ecv\u0000\u054c\u0549\u0001\u0000\u0000\u0000\u054c\u054a"+ - "\u0001\u0000\u0000\u0000\u054c\u054b\u0001\u0000\u0000\u0000\u054d\u00df"+ - "\u0001\u0000\u0000\u0000\u054e\u055a\u0005Z\u0000\u0000\u054f\u055b\u0003"+ - "\u00e2q\u0000\u0550\u0556\u0005f\u0000\u0000\u0551\u0552\u0003\u00e2q"+ - "\u0000\u0552\u0553\u0003\u0170\u00b8\u0000\u0553\u0555\u0001\u0000\u0000"+ - "\u0000\u0554\u0551\u0001\u0000\u0000\u0000\u0555\u0558\u0001\u0000\u0000"+ - "\u0000\u0556\u0554\u0001\u0000\u0000\u0000\u0556\u0557\u0001\u0000\u0000"+ - "\u0000\u0557\u0559\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000\u0000"+ - "\u0000\u0559\u055b\u0005g\u0000\u0000\u055a\u054f\u0001\u0000\u0000\u0000"+ - "\u055a\u0550\u0001\u0000\u0000\u0000\u055b\u00e1\u0001\u0000\u0000\u0000"+ - "\u055c\u0562\u0003\u00e4r\u0000\u055d\u055f\u0003\u00c2a\u0000\u055e\u055d"+ - "\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u0560"+ - "\u0001\u0000\u0000\u0000\u0560\u0561\u0005l\u0000\u0000\u0561\u0563\u0003"+ - "\u00e6s\u0000\u0562\u055e\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000"+ - "\u0000\u0000\u0563\u00e3\u0001\u0000\u0000\u0000\u0564\u0569\u0005e\u0000"+ - "\u0000\u0565\u0566\u0005m\u0000\u0000\u0566\u0568\u0005e\u0000\u0000\u0567"+ - "\u0565\u0001\u0000\u0000\u0000\u0568\u056b\u0001\u0000\u0000\u0000\u0569"+ - "\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001\u0000\u0000\u0000\u056a"+ - "\u00e5\u0001\u0000\u0000\u0000\u056b\u0569\u0001\u0000\u0000\u0000\u056c"+ - "\u0571\u0003\u00a4R\u0000\u056d\u056e\u0005m\u0000\u0000\u056e\u0570\u0003"+ - "\u00a4R\u0000\u056f\u056d\u0001\u0000\u0000\u0000\u0570\u0573\u0001\u0000"+ - "\u0000\u0000\u0571\u056f\u0001\u0000\u0000\u0000\u0571\u0572\u0001\u0000"+ - "\u0000\u0000\u0572\u00e7\u0001\u0000\u0000\u0000\u0573\u0571\u0001\u0000"+ - "\u0000\u0000\u0574\u0580\u0005^\u0000\u0000\u0575\u0581\u0003\u00eau\u0000"+ - "\u0576\u057c\u0005f\u0000\u0000\u0577\u0578\u0003\u00eau\u0000\u0578\u0579"+ - "\u0003\u0170\u00b8\u0000\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u0577"+ - "\u0001\u0000\u0000\u0000\u057b\u057e\u0001\u0000\u0000\u0000\u057c\u057a"+ - "\u0001\u0000\u0000\u0000\u057c\u057d\u0001\u0000\u0000\u0000\u057d\u057f"+ - "\u0001\u0000\u0000\u0000\u057e\u057c\u0001\u0000\u0000\u0000\u057f\u0581"+ - "\u0005g\u0000\u0000\u0580\u0575\u0001\u0000\u0000\u0000\u0580\u0576\u0001"+ - "\u0000\u0000\u0000\u0581\u00e9\u0001\u0000\u0000\u0000\u0582\u0584\u0005"+ - "e\u0000\u0000\u0583\u0585\u0005l\u0000\u0000\u0584\u0583\u0001\u0000\u0000"+ - "\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000"+ - "\u0000\u0586\u0587\u0003\u00c2a\u0000\u0587\u00eb\u0001\u0000\u0000\u0000"+ - "\u0588\u0594\u0005c\u0000\u0000\u0589\u0595\u0003\u0096K\u0000\u058a\u0590"+ - "\u0005f\u0000\u0000\u058b\u058c\u0003\u0096K\u0000\u058c\u058d\u0003\u0170"+ - "\u00b8\u0000\u058d\u058f\u0001\u0000\u0000\u0000\u058e\u058b\u0001\u0000"+ - "\u0000\u0000\u058f\u0592\u0001\u0000\u0000\u0000\u0590\u058e\u0001\u0000"+ - "\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0593\u0001\u0000"+ - "\u0000\u0000\u0592\u0590\u0001\u0000\u0000\u0000\u0593\u0595\u0005g\u0000"+ - "\u0000\u0594\u0589\u0001\u0000\u0000\u0000\u0594\u058a\u0001\u0000\u0000"+ - "\u0000\u0595\u00ed\u0001\u0000\u0000\u0000\u0596\u0598\u0005h\u0000\u0000"+ - "\u0597\u0599\u0003\u00f0x\u0000\u0598\u0597\u0001\u0000\u0000\u0000\u0598"+ - "\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000\u0000\u059a"+ - "\u059b\u0005i\u0000\u0000\u059b\u00ef\u0001\u0000\u0000\u0000\u059c\u059e"+ - "\u0005n\u0000\u0000\u059d\u059c\u0001\u0000\u0000\u0000\u059d\u059e\u0001"+ - "\u0000\u0000\u0000\u059e\u05a4\u0001\u0000\u0000\u0000\u059f\u05a1\u0005"+ - "\u009f\u0000\u0000\u05a0\u059f\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001"+ - "\u0000\u0000\u0000\u05a1\u05a4\u0001\u0000\u0000\u0000\u05a2\u05a4\u0004"+ - "x\u0012\u0000\u05a3\u059d\u0001\u0000\u0000\u0000\u05a3\u05a0\u0001\u0000"+ - "\u0000\u0000\u05a3\u05a2\u0001\u0000\u0000\u0000\u05a4\u05a5\u0001\u0000"+ - "\u0000\u0000\u05a5\u05a6\u0003\u00a6S\u0000\u05a6\u05a7\u0003\u0170\u00b8"+ - "\u0000\u05a7\u05a9\u0001\u0000\u0000\u0000\u05a8\u05a3\u0001\u0000\u0000"+ - "\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05a8\u0001\u0000\u0000"+ - "\u0000\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u00f1\u0001\u0000\u0000"+ - "\u0000\u05ac\u05b2\u0003\u00f6{\u0000\u05ad\u05b2\u0003\u00f8|\u0000\u05ae"+ - "\u05b2\u0003\u00fa}\u0000\u05af\u05b2\u0003\u00f4z\u0000\u05b0\u05b2\u0003"+ - "\u0098L\u0000\u05b1\u05ac\u0001\u0000\u0000\u0000\u05b1\u05ad\u0001\u0000"+ - "\u0000\u0000\u05b1\u05ae\u0001\u0000\u0000\u0000\u05b1\u05af\u0001\u0000"+ - "\u0000\u0000\u05b1\u05b0\u0001\u0000\u0000\u0000\u05b2\u00f3\u0001\u0000"+ - "\u0000\u0000\u05b3\u05b4\u0003\u00a4R\u0000\u05b4\u00f5\u0001\u0000\u0000"+ - "\u0000\u05b5\u05b6\u0003\u00a4R\u0000\u05b6\u05b7\u0005\u0089\u0000\u0000"+ - "\u05b7\u05b8\u0003\u00a4R\u0000\u05b8\u00f7\u0001\u0000\u0000\u0000\u05b9"+ - "\u05ba\u0003\u00a4R\u0000\u05ba\u05bb\u0007\u000f\u0000\u0000\u05bb\u00f9"+ - "\u0001\u0000\u0000\u0000\u05bc\u05bd\u0003\u00e6s\u0000\u05bd\u05be\u0003"+ - "\u00d6k\u0000\u05be\u05bf\u0003\u00e6s\u0000\u05bf\u00fb\u0001\u0000\u0000"+ - "\u0000\u05c0\u05c1\u0007\u0010\u0000\u0000\u05c1\u00fd\u0001\u0000\u0000"+ - "\u0000\u05c2\u05c3\u0005e\u0000\u0000\u05c3\u05c5\u0005o\u0000\u0000\u05c4"+ - "\u05c6\u0003\u00a6S\u0000\u05c5\u05c4\u0001\u0000\u0000\u0000\u05c5\u05c6"+ - "\u0001\u0000\u0000\u0000\u05c6\u00ff\u0001\u0000\u0000\u0000\u05c7\u05c9"+ - "\u0005b\u0000\u0000\u05c8\u05ca\u0003\u00e6s\u0000\u05c9\u05c8\u0001\u0000"+ - "\u0000\u0000\u05c9\u05ca\u0001\u0000\u0000\u0000\u05ca\u0101\u0001\u0000"+ - "\u0000\u0000\u05cb\u05cd\u0005K\u0000\u0000\u05cc\u05ce\u0005e\u0000\u0000"+ - "\u05cd\u05cc\u0001\u0000\u0000\u0000\u05cd\u05ce\u0001\u0000\u0000\u0000"+ - "\u05ce\u0103\u0001\u0000\u0000\u0000\u05cf\u05d1\u0005_\u0000\u0000\u05d0"+ - "\u05d2\u0005e\u0000\u0000\u05d1\u05d0\u0001\u0000\u0000\u0000\u05d1\u05d2"+ - "\u0001\u0000\u0000\u0000\u05d2\u0105\u0001\u0000\u0000\u0000\u05d3\u05d4"+ - "\u0005W\u0000\u0000\u05d4\u05d5\u0005e\u0000\u0000\u05d5\u0107\u0001\u0000"+ - "\u0000\u0000\u05d6\u05d7\u0005[\u0000\u0000\u05d7\u0109\u0001\u0000\u0000"+ - "\u0000\u05d8\u05e1\u0005\\\u0000\u0000\u05d9\u05e2\u0003\u00a4R\u0000"+ - "\u05da\u05db\u0003\u0170\u00b8\u0000\u05db\u05dc\u0003\u00a4R\u0000\u05dc"+ - "\u05e2\u0001\u0000\u0000\u0000\u05dd\u05de\u0003\u00f2y\u0000\u05de\u05df"+ - "\u0003\u0170\u00b8\u0000\u05df\u05e0\u0003\u00a4R\u0000\u05e0\u05e2\u0001"+ - "\u0000\u0000\u0000\u05e1\u05d9\u0001\u0000\u0000\u0000\u05e1\u05da\u0001"+ - "\u0000\u0000\u0000\u05e1\u05dd\u0001\u0000\u0000\u0000\u05e2\u05e3\u0001"+ - "\u0000\u0000\u0000\u05e3\u05e9\u0003\u00eew\u0000\u05e4\u05e7\u0005V\u0000"+ - "\u0000\u05e5\u05e8\u0003\u010a\u0085\u0000\u05e6\u05e8\u0003\u00eew\u0000"+ - "\u05e7\u05e5\u0001\u0000\u0000\u0000\u05e7\u05e6\u0001\u0000\u0000\u0000"+ - "\u05e8\u05ea\u0001\u0000\u0000\u0000\u05e9\u05e4\u0001\u0000\u0000\u0000"+ - "\u05e9\u05ea\u0001\u0000\u0000\u0000\u05ea\u010b\u0001\u0000\u0000\u0000"+ - "\u05eb\u05ee\u0003\u010e\u0087\u0000\u05ec\u05ee\u0003\u0114\u008a\u0000"+ - "\u05ed\u05eb\u0001\u0000\u0000\u0000\u05ed\u05ec\u0001\u0000\u0000\u0000"+ - "\u05ee\u010d\u0001\u0000\u0000\u0000\u05ef\u05fa\u0005Y\u0000\u0000\u05f0"+ - "\u05f2\u0003\u00a4R\u0000\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f1\u05f2"+ - "\u0001\u0000\u0000\u0000\u05f2\u05fb\u0001\u0000\u0000\u0000\u05f3\u05f5"+ - "\u0003\u00f2y\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f4\u05f5\u0001"+ - "\u0000\u0000\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u05f8\u0003"+ - "\u0170\u00b8\u0000\u05f7\u05f9\u0003\u00a4R\u0000\u05f8\u05f7\u0001\u0000"+ - "\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000\u0000\u05f9\u05fb\u0001\u0000"+ - "\u0000\u0000\u05fa\u05f1\u0001\u0000\u0000\u0000\u05fa\u05f4\u0001\u0000"+ - "\u0000\u0000\u05fb\u05fc\u0001\u0000\u0000\u0000\u05fc\u0600\u0005h\u0000"+ - "\u0000\u05fd\u05ff\u0003\u0110\u0088\u0000\u05fe\u05fd\u0001\u0000\u0000"+ - "\u0000\u05ff\u0602\u0001\u0000\u0000\u0000\u0600\u05fe\u0001\u0000\u0000"+ - "\u0000\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0603\u0001\u0000\u0000"+ - "\u0000\u0602\u0600\u0001\u0000\u0000\u0000\u0603\u0604\u0005i\u0000\u0000"+ - "\u0604\u010f\u0001\u0000\u0000\u0000\u0605\u0606\u0003\u0112\u0089\u0000"+ - "\u0606\u0608\u0005o\u0000\u0000\u0607\u0609\u0003\u00f0x\u0000\u0608\u0607"+ - "\u0001\u0000\u0000\u0000\u0608\u0609\u0001\u0000\u0000\u0000\u0609\u0111"+ - "\u0001\u0000\u0000\u0000\u060a\u060b\u0005P\u0000\u0000\u060b\u060e\u0003"+ - "\u00e6s\u0000\u060c\u060e\u0005L\u0000\u0000\u060d\u060a\u0001\u0000\u0000"+ - "\u0000\u060d\u060c\u0001\u0000\u0000\u0000\u060e\u0113\u0001\u0000\u0000"+ - "\u0000\u060f\u0618\u0005Y\u0000\u0000\u0610\u0619\u0003\u0116\u008b\u0000"+ - "\u0611\u0612\u0003\u0170\u00b8\u0000\u0612\u0613\u0003\u0116\u008b\u0000"+ - "\u0613\u0619\u0001\u0000\u0000\u0000\u0614\u0615\u0003\u00f2y\u0000\u0615"+ - "\u0616\u0003\u0170\u00b8\u0000\u0616\u0617\u0003\u0116\u008b\u0000\u0617"+ - "\u0619\u0001\u0000\u0000\u0000\u0618\u0610\u0001\u0000\u0000\u0000\u0618"+ - "\u0611\u0001\u0000\u0000\u0000\u0618\u0614\u0001\u0000\u0000\u0000\u0619"+ - "\u061a\u0001\u0000\u0000\u0000\u061a\u061e\u0005h\u0000\u0000\u061b\u061d"+ - "\u0003\u0118\u008c\u0000\u061c\u061b\u0001\u0000\u0000\u0000\u061d\u0620"+ - "\u0001\u0000\u0000\u0000\u061e\u061c\u0001\u0000\u0000\u0000\u061e\u061f"+ - "\u0001\u0000\u0000\u0000\u061f\u0621\u0001\u0000\u0000\u0000\u0620\u061e"+ - "\u0001\u0000\u0000\u0000\u0621\u0622\u0005i\u0000\u0000\u0622\u0115\u0001"+ - "\u0000\u0000\u0000\u0623\u0624\u0005e\u0000\u0000\u0624\u0626\u0005s\u0000"+ - "\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001\u0000\u0000"+ - "\u0000\u0626\u0627\u0001\u0000\u0000\u0000\u0627\u0628\u0003\u00b4Z\u0000"+ - "\u0628\u0629\u0005p\u0000\u0000\u0629\u062a\u0005f\u0000\u0000\u062a\u062b"+ - "\u0005^\u0000\u0000\u062b\u062c\u0005g\u0000\u0000\u062c\u0117\u0001\u0000"+ - "\u0000\u0000\u062d\u062e\u0003\u011a\u008d\u0000\u062e\u0630\u0005o\u0000"+ - "\u0000\u062f\u0631\u0003\u00f0x\u0000\u0630\u062f\u0001\u0000\u0000\u0000"+ - "\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0119\u0001\u0000\u0000\u0000"+ - "\u0632\u0633\u0005P\u0000\u0000\u0633\u0636\u0003\u011c\u008e\u0000\u0634"+ - "\u0636\u0005L\u0000\u0000\u0635\u0632\u0001\u0000\u0000\u0000\u0635\u0634"+ - "\u0001\u0000\u0000\u0000\u0636\u011b\u0001\u0000\u0000\u0000\u0637\u063a"+ - "\u0003\u00c2a\u0000\u0638\u063a\u0005d\u0000\u0000\u0639\u0637\u0001\u0000"+ - "\u0000\u0000\u0639\u0638\u0001\u0000\u0000\u0000\u063a\u0642\u0001\u0000"+ - "\u0000\u0000\u063b\u063e\u0005m\u0000\u0000\u063c\u063f\u0003\u00c2a\u0000"+ - "\u063d\u063f\u0005d\u0000\u0000\u063e\u063c\u0001\u0000\u0000\u0000\u063e"+ - "\u063d\u0001\u0000\u0000\u0000\u063f\u0641\u0001\u0000\u0000\u0000\u0640"+ - "\u063b\u0001\u0000\u0000\u0000\u0641\u0644\u0001\u0000\u0000\u0000\u0642"+ - "\u0640\u0001\u0000\u0000\u0000\u0642\u0643\u0001\u0000\u0000\u0000\u0643"+ - "\u011d\u0001\u0000\u0000\u0000\u0644\u0642\u0001\u0000\u0000\u0000\u0645"+ - "\u0646\u0005O\u0000\u0000\u0646\u064a\u0005h\u0000\u0000\u0647\u0649\u0003"+ - "\u0120\u0090\u0000\u0648\u0647\u0001\u0000\u0000\u0000\u0649\u064c\u0001"+ - "\u0000\u0000\u0000\u064a\u0648\u0001\u0000\u0000\u0000\u064a\u064b\u0001"+ - "\u0000\u0000\u0000\u064b\u064d\u0001\u0000\u0000\u0000\u064c\u064a\u0001"+ - "\u0000\u0000\u0000\u064d\u064e\u0005i\u0000\u0000\u064e\u011f\u0001\u0000"+ - "\u0000\u0000\u064f\u0650\u0003\u0122\u0091\u0000\u0650\u0652\u0005o\u0000"+ - "\u0000\u0651\u0653\u0003\u00f0x\u0000\u0652\u0651\u0001\u0000\u0000\u0000"+ - "\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0121\u0001\u0000\u0000\u0000"+ - "\u0654\u0657\u0005P\u0000\u0000\u0655\u0658\u0003\u00f6{\u0000\u0656\u0658"+ - "\u0003\u0124\u0092\u0000\u0657\u0655\u0001\u0000\u0000\u0000\u0657\u0656"+ - "\u0001\u0000\u0000\u0000\u0658\u065b\u0001\u0000\u0000\u0000\u0659\u065b"+ - "\u0005L\u0000\u0000\u065a\u0654\u0001\u0000\u0000\u0000\u065a\u0659\u0001"+ - "\u0000\u0000\u0000\u065b\u0123\u0001\u0000\u0000\u0000\u065c\u065d\u0003"+ - "\u00e6s\u0000\u065d\u065e\u0005l\u0000\u0000\u065e\u0663\u0001\u0000\u0000"+ - "\u0000\u065f\u0660\u0003\u00e4r\u0000\u0660\u0661\u0005s\u0000\u0000\u0661"+ - "\u0663\u0001\u0000\u0000\u0000\u0662\u065c\u0001\u0000\u0000\u0000\u0662"+ - "\u065f\u0001\u0000\u0000\u0000\u0662\u0663\u0001\u0000\u0000\u0000\u0663"+ - "\u0664\u0001\u0000\u0000\u0000\u0664\u0665\u0003\u00a4R\u0000\u0665\u0125"+ - "\u0001\u0000\u0000\u0000\u0666\u066e\u0005`\u0000\u0000\u0667\u0669\u0003"+ - "\u00a4R\u0000\u0668\u0667\u0001\u0000\u0000\u0000\u0668\u0669\u0001\u0000"+ - "\u0000\u0000\u0669\u066f\u0001\u0000\u0000\u0000\u066a\u066f\u0003\u0128"+ - "\u0094\u0000\u066b\u066d\u0003\u00d8l\u0000\u066c\u066b\u0001\u0000\u0000"+ - "\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066f\u0001\u0000\u0000"+ - "\u0000\u066e\u0668\u0001\u0000\u0000\u0000\u066e\u066a\u0001\u0000\u0000"+ - "\u0000\u066e\u066c\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000"+ - "\u0000\u0670\u0671\u0003\u00eew\u0000\u0671\u0127\u0001\u0000\u0000\u0000"+ - "\u0672\u0674\u0003\u00f2y\u0000\u0673\u0672\u0001\u0000\u0000\u0000\u0673"+ - "\u0674\u0001\u0000\u0000\u0000\u0674\u0675\u0001\u0000\u0000\u0000\u0675"+ - "\u0677\u0003\u0170\u00b8\u0000\u0676\u0678\u0003\u00a4R\u0000\u0677\u0676"+ - "\u0001\u0000\u0000\u0000\u0677\u0678\u0001\u0000\u0000\u0000\u0678\u0679"+ - "\u0001\u0000\u0000\u0000\u0679\u067b\u0003\u0170\u00b8\u0000\u067a\u067c"+ - "\u0003\u00f2y\u0000\u067b\u067a\u0001\u0000\u0000\u0000\u067b\u067c\u0001"+ - "\u0000\u0000\u0000\u067c\u0129\u0001\u0000\u0000\u0000\u067d\u067e\u0005"+ - "R\u0000\u0000\u067e\u067f\u0003\u00a4R\u0000\u067f\u012b\u0001\u0000\u0000"+ - "\u0000\u0680\u0683\u0003\u0150\u00a8\u0000\u0681\u0683\u0005e\u0000\u0000"+ - "\u0682\u0680\u0001\u0000\u0000\u0000\u0682\u0681\u0001\u0000\u0000\u0000"+ - "\u0683\u012d\u0001\u0000\u0000\u0000\u0684\u0685\u0005j\u0000\u0000\u0685"+ - "\u0686\u0003\u0130\u0098\u0000\u0686\u0687\u0005k\u0000\u0000\u0687\u0688"+ - "\u0003\u0132\u0099\u0000\u0688\u012f\u0001\u0000\u0000\u0000\u0689\u068a"+ - "\u0003\u00a4R\u0000\u068a\u0131\u0001\u0000\u0000\u0000\u068b\u068c\u0003"+ - "\u00c2a\u0000\u068c\u0133\u0001\u0000\u0000\u0000\u068d\u068e\u0005\u0087"+ - "\u0000\u0000\u068e\u068f\u0003\u00c2a\u0000\u068f\u0135\u0001\u0000\u0000"+ - "\u0000\u0690\u0691\u0005j\u0000\u0000\u0691\u0692\u0005k\u0000\u0000\u0692"+ - "\u0693\u0003\u0132\u0099\u0000\u0693\u0137\u0001\u0000\u0000\u0000\u0694"+ - "\u0695\u0005S\u0000\u0000\u0695\u0696\u0005j\u0000\u0000\u0696\u0697\u0003"+ - "\u00c2a\u0000\u0697\u0698\u0005k\u0000\u0000\u0698\u0699\u0003\u0132\u0099"+ - "\u0000\u0699\u0139\u0001\u0000\u0000\u0000\u069a\u06a0\u0005U\u0000\u0000"+ - "\u069b\u069c\u0005U\u0000\u0000\u069c\u06a0\u0005\u0089\u0000\u0000\u069d"+ - "\u069e\u0005\u0089\u0000\u0000\u069e\u06a0\u0005U\u0000\u0000\u069f\u069a"+ - "\u0001\u0000\u0000\u0000\u069f\u069b\u0001\u0000\u0000\u0000\u069f\u069d"+ - "\u0001\u0000\u0000\u0000\u06a0\u06a1\u0001\u0000\u0000\u0000\u06a1\u06a2"+ - "\u0003\u0132\u0099\u0000\u06a2\u013b\u0001\u0000\u0000\u0000\u06a3\u06a4"+ - "\u0005M\u0000\u0000\u06a4\u06a5\u0003\u013e\u009f\u0000\u06a5\u013d\u0001"+ - "\u0000\u0000\u0000\u06a6\u06a7\u0003\u0142\u00a1\u0000\u06a7\u06a8\u0003"+ - "\u0140\u00a0\u0000\u06a8\u06ab\u0001\u0000\u0000\u0000\u06a9\u06ab\u0003"+ - "\u0142\u00a1\u0000\u06aa\u06a6\u0001\u0000\u0000\u0000\u06aa\u06a9\u0001"+ - "\u0000\u0000\u0000\u06ab\u013f\u0001\u0000\u0000\u0000\u06ac\u06af\u0003"+ - "\u0142\u00a1\u0000\u06ad\u06af\u0003\u00c2a\u0000\u06ae\u06ac\u0001\u0000"+ - "\u0000\u0000\u06ae\u06ad\u0001\u0000\u0000\u0000\u06af\u0141\u0001\u0000"+ - "\u0000\u0000\u06b0\u06bc\u0005f\u0000\u0000\u06b1\u06b6\u0003\u009cN\u0000"+ - "\u06b2\u06b3\u0005m\u0000\u0000\u06b3\u06b5\u0003\u009cN\u0000\u06b4\u06b2"+ - "\u0001\u0000\u0000\u0000\u06b5\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b4"+ - "\u0001\u0000\u0000\u0000\u06b6\u06b7\u0001\u0000\u0000\u0000\u06b7\u06ba"+ - "\u0001\u0000\u0000\u0000\u06b8\u06b6\u0001\u0000\u0000\u0000\u06b9\u06bb"+ - "\u0005m\u0000\u0000\u06ba\u06b9\u0001\u0000\u0000\u0000\u06ba\u06bb\u0001"+ - "\u0000\u0000\u0000\u06bb\u06bd\u0001\u0000\u0000\u0000\u06bc\u06b1\u0001"+ - "\u0000\u0000\u0000\u06bc\u06bd\u0001\u0000\u0000\u0000\u06bd\u06be\u0001"+ - "\u0000\u0000\u0000\u06be\u06bf\u0005g\u0000\u0000\u06bf\u0143\u0001\u0000"+ - "\u0000\u0000\u06c0\u06c1\u0003\u0146\u00a3\u0000\u06c1\u06c2\u0005f\u0000"+ - "\u0000\u06c2\u06c4\u0003\u00a4R\u0000\u06c3\u06c5\u0005m\u0000\u0000\u06c4"+ - "\u06c3\u0001\u0000\u0000\u0000\u06c4\u06c5\u0001\u0000\u0000\u0000\u06c5"+ - "\u06c6\u0001\u0000\u0000\u0000\u06c6\u06c7\u0005g\u0000\u0000\u06c7\u0145"+ - "\u0001\u0000\u0000\u0000\u06c8\u06ce\u0003\u00c4b\u0000\u06c9\u06ca\u0005"+ - "f\u0000\u0000\u06ca\u06cb\u0003\u0146\u00a3\u0000\u06cb\u06cc\u0005g\u0000"+ - "\u0000\u06cc\u06ce\u0001\u0000\u0000\u0000\u06cd\u06c8\u0001\u0000\u0000"+ - "\u0000\u06cd\u06c9\u0001\u0000\u0000\u0000\u06ce\u0147\u0001\u0000\u0000"+ - "\u0000\u06cf\u06d6\u0003\u014a\u00a5\u0000\u06d0\u06d6\u0003\u014e\u00a7"+ - "\u0000\u06d1\u06d2\u0005f\u0000\u0000\u06d2\u06d3\u0003\u00a4R\u0000\u06d3"+ - "\u06d4\u0005g\u0000\u0000\u06d4\u06d6\u0001\u0000\u0000\u0000\u06d5\u06cf"+ - "\u0001\u0000\u0000\u0000\u06d5\u06d0\u0001\u0000\u0000\u0000\u06d5\u06d1"+ - "\u0001\u0000\u0000\u0000\u06d6\u0149\u0001\u0000\u0000\u0000\u06d7\u06db"+ - "\u0003\u00b2Y\u0000\u06d8\u06db\u0003\u0152\u00a9\u0000\u06d9\u06db\u0003"+ - "\u00b6[\u0000\u06da\u06d7\u0001\u0000\u0000\u0000\u06da\u06d8\u0001\u0000"+ - "\u0000\u0000\u06da\u06d9\u0001\u0000\u0000\u0000\u06db\u014b\u0001\u0000"+ - "\u0000\u0000\u06dc\u06dd\u0007\u0011\u0000\u0000\u06dd\u014d\u0001\u0000"+ - "\u0000\u0000\u06de\u06df\u0005e\u0000\u0000\u06df\u014f\u0001\u0000\u0000"+ - "\u0000\u06e0\u06e1\u0005e\u0000\u0000\u06e1\u06e2\u0005p\u0000\u0000\u06e2"+ - "\u06e3\u0005e\u0000\u0000\u06e3\u0151\u0001\u0000\u0000\u0000\u06e4\u06e5"+ - "\u0003\u00cae\u0000\u06e5\u06e6\u0003\u0154\u00aa\u0000\u06e6\u0153\u0001"+ - "\u0000\u0000\u0000\u06e7\u06ec\u0005h\u0000\u0000\u06e8\u06ea\u0003\u0156"+ - "\u00ab\u0000\u06e9\u06eb\u0005m\u0000\u0000\u06ea\u06e9\u0001\u0000\u0000"+ - "\u0000\u06ea\u06eb\u0001\u0000\u0000\u0000\u06eb\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ec\u06e8\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ed\u06ee\u0001\u0000\u0000\u0000\u06ee\u06ef\u0005i\u0000\u0000"+ - "\u06ef\u0155\u0001\u0000\u0000\u0000\u06f0\u06f5\u0003\u0158\u00ac\u0000"+ - "\u06f1\u06f2\u0005m\u0000\u0000\u06f2\u06f4\u0003\u0158\u00ac\u0000\u06f3"+ - "\u06f1\u0001\u0000\u0000\u0000\u06f4\u06f7\u0001\u0000\u0000\u0000\u06f5"+ - "\u06f3\u0001\u0000\u0000\u0000\u06f5\u06f6\u0001\u0000\u0000\u0000\u06f6"+ - "\u0157\u0001\u0000\u0000\u0000\u06f7\u06f5\u0001\u0000\u0000\u0000\u06f8"+ - "\u06f9\u0003\u015a\u00ad\u0000\u06f9\u06fa\u0005o\u0000\u0000\u06fa\u06fc"+ - "\u0001\u0000\u0000\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000\u06fb\u06fc"+ - "\u0001\u0000\u0000\u0000\u06fc\u06fd\u0001\u0000\u0000\u0000\u06fd\u06fe"+ - "\u0003\u015c\u00ae\u0000\u06fe\u0159\u0001\u0000\u0000\u0000\u06ff\u0702"+ - "\u0003\u00a4R\u0000\u0700\u0702\u0003\u0154\u00aa\u0000\u0701\u06ff\u0001"+ - "\u0000\u0000\u0000\u0701\u0700\u0001\u0000\u0000\u0000\u0702\u015b\u0001"+ - "\u0000\u0000\u0000\u0703\u0706\u0003\u00a4R\u0000\u0704\u0706\u0003\u0154"+ - "\u00aa\u0000\u0705\u0703\u0001\u0000\u0000\u0000\u0705\u0704\u0001\u0000"+ - "\u0000\u0000\u0706\u015d\u0001\u0000\u0000\u0000\u0707\u0708\u0005T\u0000"+ - "\u0000\u0708\u070e\u0005h\u0000\u0000\u0709\u070a\u0003\u0160\u00b0\u0000"+ - "\u070a\u070b\u0003\u0170\u00b8\u0000\u070b\u070d\u0001\u0000\u0000\u0000"+ - "\u070c\u0709\u0001\u0000\u0000\u0000\u070d\u0710\u0001\u0000\u0000\u0000"+ - "\u070e\u070c\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000"+ - "\u070f\u0711\u0001\u0000\u0000\u0000\u0710\u070e\u0001\u0000\u0000\u0000"+ - "\u0711\u0712\u0005i\u0000\u0000\u0712\u015f\u0001\u0000\u0000\u0000\u0713"+ - "\u0714\u0003\u00e4r\u0000\u0714\u0715\u0003\u00c2a\u0000\u0715\u0718\u0001"+ - "\u0000\u0000\u0000\u0716\u0718\u0003\u0164\u00b2\u0000\u0717\u0713\u0001"+ - "\u0000\u0000\u0000\u0717\u0716\u0001\u0000\u0000\u0000\u0718\u071a\u0001"+ - "\u0000\u0000\u0000\u0719\u071b\u0003\u0162\u00b1\u0000\u071a\u0719\u0001"+ - "\u0000\u0000\u0000\u071a\u071b\u0001\u0000\u0000\u0000\u071b\u0161\u0001"+ - "\u0000\u0000\u0000\u071c\u071d\u0007\u0012\u0000\u0000\u071d\u0163\u0001"+ - "\u0000\u0000\u0000\u071e\u0720\u0005\u0087\u0000\u0000\u071f\u071e\u0001"+ - "\u0000\u0000\u0000\u071f\u0720\u0001\u0000\u0000\u0000\u0720\u0721\u0001"+ - "\u0000\u0000\u0000\u0721\u0722\u0003\u012c\u0096\u0000\u0722\u0165\u0001"+ - "\u0000\u0000\u0000\u0723\u0724\u0005j\u0000\u0000\u0724\u0725\u0003\u00a4"+ - "R\u0000\u0725\u0726\u0005k\u0000\u0000\u0726\u0167\u0001\u0000\u0000\u0000"+ - "\u0727\u0728\u0005p\u0000\u0000\u0728\u0729\u0005f\u0000\u0000\u0729\u072a"+ - "\u0003\u00c2a\u0000\u072a\u072b\u0005g\u0000\u0000\u072b\u0169\u0001\u0000"+ - "\u0000\u0000\u072c\u073b\u0005f\u0000\u0000\u072d\u0734\u0003\u00e6s\u0000"+ - "\u072e\u0731\u0003\u0146\u00a3\u0000\u072f\u0730\u0005m\u0000\u0000\u0730"+ - "\u0732\u0003\u00e6s\u0000\u0731\u072f\u0001\u0000\u0000\u0000\u0731\u0732"+ - "\u0001\u0000\u0000\u0000\u0732\u0734\u0001\u0000\u0000\u0000\u0733\u072d"+ - "\u0001\u0000\u0000\u0000\u0733\u072e\u0001\u0000\u0000\u0000\u0734\u0736"+ - "\u0001\u0000\u0000\u0000\u0735\u0737\u0005t\u0000\u0000\u0736\u0735\u0001"+ - "\u0000\u0000\u0000\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0739\u0001"+ - "\u0000\u0000\u0000\u0738\u073a\u0005m\u0000\u0000\u0739\u0738\u0001\u0000"+ - "\u0000\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a\u073c\u0001\u0000"+ - "\u0000\u0000\u073b\u0733\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000"+ - "\u0000\u0000\u073c\u073d\u0001\u0000\u0000\u0000\u073d\u073e\u0005g\u0000"+ - "\u0000\u073e\u016b\u0001\u0000\u0000\u0000\u073f\u0740\u0003\u0146\u00a3"+ - "\u0000\u0740\u0741\u0005p\u0000\u0000\u0741\u0742\u0005e\u0000\u0000\u0742"+ - "\u016d\u0001\u0000\u0000\u0000\u0743\u0744\u0003\u00c2a\u0000\u0744\u016f"+ - "\u0001\u0000\u0000\u0000\u0745\u074a\u0005n\u0000\u0000\u0746\u074a\u0005"+ - "\u0000\u0000\u0001\u0747\u074a\u0005\u009f\u0000\u0000\u0748\u074a\u0004"+ - "\u00b8\u0013\u0000\u0749\u0745\u0001\u0000\u0000\u0000\u0749\u0746\u0001"+ - "\u0000\u0000\u0000\u0749\u0747\u0001\u0000\u0000\u0000\u0749\u0748\u0001"+ - "\u0000\u0000\u0000\u074a\u0171\u0001\u0000\u0000\u0000\u00c1\u0180\u0185"+ - "\u018c\u0196\u019c\u01a2\u01ac\u01b6\u01c4\u01c8\u01d1\u01dd\u01e1\u01e7"+ - "\u01f0\u01fa\u020b\u0219\u021d\u0224\u022c\u0235\u0255\u025d\u0275\u0288"+ - "\u0297\u02a4\u02ad\u02bb\u02c4\u02d0\u02e5\u02ec\u02f1\u02f6\u0300\u0303"+ - "\u0307\u030b\u0313\u031b\u0320\u0328\u032a\u032f\u0336\u033e\u0341\u0347"+ - "\u034c\u034e\u0351\u0358\u035d\u0370\u0378\u037c\u037f\u0385\u0389\u038c"+ - "\u0396\u039d\u03a4\u03b0\u03b6\u03bd\u03c2\u03c8\u03d4\u03da\u03de\u03e6"+ - "\u03ea\u03f0\u03f3\u03f9\u03fe\u0417\u043a\u043c\u0453\u045b\u0466\u046d"+ - "\u0474\u047e\u048c\u04a2\u04a4\u04ac\u04b0\u04b4\u04b7\u04c0\u04c6\u04d0"+ - "\u04d8\u04de\u04e7\u04f2\u04fd\u0501\u0503\u050e\u0517\u051b\u051e\u0525"+ - "\u0530\u053a\u0540\u0542\u054c\u0556\u055a\u055e\u0562\u0569\u0571\u057c"+ - "\u0580\u0584\u0590\u0594\u0598\u059d\u05a0\u05a3\u05aa\u05b1\u05c5\u05c9"+ - "\u05cd\u05d1\u05e1\u05e7\u05e9\u05ed\u05f1\u05f4\u05f8\u05fa\u0600\u0608"+ - "\u060d\u0618\u061e\u0625\u0630\u0635\u0639\u063e\u0642\u064a\u0652\u0657"+ - "\u065a\u0662\u0668\u066c\u066e\u0673\u0677\u067b\u0682\u069f\u06aa\u06ae"+ - "\u06b6\u06ba\u06bc\u06c4\u06cd\u06d5\u06da\u06ea\u06ec\u06f5\u06fb\u0701"+ - "\u0705\u070e\u0717\u071a\u071f\u0731\u0733\u0736\u0739\u073b\u0749"; + "Z\u0005Z\u04b8\bZ\nZ\fZ\u04bb\tZ\u0001[\u0001[\u0001[\u0001\\\u0001\\"+ + "\u0003\\\u04c2\b\\\u0001\\\u0001\\\u0003\\\u04c6\b\\\u0001]\u0001]\u0003"+ + "]\u04ca\b]\u0001]\u0003]\u04cd\b]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ + "^\u0001^\u0005^\u04d6\b^\n^\f^\u04d9\t^\u0001^\u0001^\u0001_\u0001_\u0001"+ + "_\u0003_\u04e0\b_\u0001`\u0001`\u0001`\u0001`\u0001a\u0003a\u04e7\ba\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0003a\u04ef\ba\u0001a\u0001a\u0001"+ + "a\u0001a\u0003a\u04f5\ba\u0001b\u0001b\u0003b\u04f9\bb\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0003b\u0501\bb\u0001c\u0001c\u0001c\u0001c\u0001"+ + "c\u0001c\u0001c\u0001c\u0001c\u0003c\u050c\bc\u0001d\u0001d\u0001d\u0001"+ + "e\u0001e\u0001e\u0001e\u0005e\u0515\be\ne\fe\u0518\te\u0001e\u0003e\u051b"+ + "\be\u0003e\u051d\be\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001f\u0003f\u0529\bf\u0003f\u052b\bf\u0001g\u0001g\u0001g\u0001"+ + "g\u0001g\u0001h\u0001h\u0003h\u0534\bh\u0001h\u0001h\u0003h\u0538\bh\u0001"+ + "h\u0003h\u053b\bh\u0001h\u0001h\u0001h\u0001h\u0001h\u0003h\u0542\bh\u0001"+ + "h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001l\u0003l\u054d"+ + "\bl\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u0557"+ + "\bm\u0001m\u0001m\u0001m\u0001m\u0003m\u055d\bm\u0003m\u055f\bm\u0001"+ + "n\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001p\u0003p\u0569\bp\u0001"+ + "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0005q\u0571\bq\nq\fq\u0574\tq\u0001"+ + "q\u0003q\u0577\bq\u0001r\u0001r\u0003r\u057b\br\u0001r\u0001r\u0003r\u057f"+ + "\br\u0001s\u0001s\u0001s\u0005s\u0584\bs\ns\fs\u0587\ts\u0001t\u0001t"+ + "\u0001t\u0005t\u058c\bt\nt\ft\u058f\tt\u0001u\u0001u\u0001u\u0001u\u0001"+ + "u\u0001u\u0005u\u0597\bu\nu\fu\u059a\tu\u0001u\u0003u\u059d\bu\u0001v"+ + "\u0001v\u0003v\u05a1\bv\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0003"+ + "x\u05a9\bx\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0005"+ + "y\u05b3\by\ny\fy\u05b6\ty\u0001y\u0003y\u05b9\by\u0001z\u0001z\u0003z"+ + "\u05bd\bz\u0001z\u0001z\u0001{\u0003{\u05c2\b{\u0001{\u0003{\u05c5\b{"+ + "\u0001{\u0003{\u05c8\b{\u0001{\u0001{\u0001{\u0004{\u05cd\b{\u000b{\f"+ + "{\u05ce\u0001|\u0001|\u0001|\u0001|\u0001|\u0003|\u05d6\b|\u0001}\u0001"+ + "}\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001"+ + "\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0003\u0082\u05ea\b\u0082\u0001\u0083\u0001"+ + "\u0083\u0003\u0083\u05ee\b\u0083\u0001\u0084\u0001\u0084\u0003\u0084\u05f2"+ + "\b\u0084\u0001\u0085\u0001\u0085\u0003\u0085\u05f6\b\u0085\u0001\u0086"+ + "\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088"+ + "\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0088\u0003\u0088\u0606\b\u0088\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0088\u0003\u0088\u060c\b\u0088\u0003\u0088\u060e\b\u0088\u0001"+ + "\u0089\u0001\u0089\u0003\u0089\u0612\b\u0089\u0001\u008a\u0001\u008a\u0003"+ + "\u008a\u0616\b\u008a\u0001\u008a\u0003\u008a\u0619\b\u008a\u0001\u008a"+ + "\u0001\u008a\u0003\u008a\u061d\b\u008a\u0003\u008a\u061f\b\u008a\u0001"+ + "\u008a\u0001\u008a\u0005\u008a\u0623\b\u008a\n\u008a\f\u008a\u0626\t\u008a"+ + "\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0003\u008b"+ + "\u062d\b\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u0632\b"+ + "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0003\u008d\u063d\b\u008d\u0001"+ + "\u008d\u0001\u008d\u0005\u008d\u0641\b\u008d\n\u008d\f\u008d\u0644\t\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0003\u008e\u064a\b\u008e"+ + "\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e"+ + "\u0001\u008f\u0001\u008f\u0001\u008f\u0003\u008f\u0655\b\u008f\u0001\u0090"+ + "\u0001\u0090\u0001\u0090\u0003\u0090\u065a\b\u0090\u0001\u0091\u0001\u0091"+ + "\u0003\u0091\u065e\b\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091"+ + "\u0663\b\u0091\u0005\u0091\u0665\b\u0091\n\u0091\f\u0091\u0668\t\u0091"+ + "\u0001\u0092\u0001\u0092\u0001\u0092\u0005\u0092\u066d\b\u0092\n\u0092"+ + "\f\u0092\u0670\t\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093"+ + "\u0001\u0093\u0003\u0093\u0677\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+ + "\u0003\u0094\u067c\b\u0094\u0001\u0094\u0003\u0094\u067f\b\u0094\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0003"+ + "\u0095\u0687\b\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0003"+ + "\u0096\u068d\b\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0691\b\u0096"+ + "\u0003\u0096\u0693\b\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0003\u0097"+ + "\u0698\b\u0097\u0001\u0097\u0001\u0097\u0003\u0097\u069c\b\u0097\u0001"+ + "\u0097\u0001\u0097\u0003\u0097\u06a0\b\u0097\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0099\u0001\u0099\u0003\u0099\u06a7\b\u0099\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ + "\u009e\u0001\u009e\u0005\u009e\u06b8\b\u009e\n\u009e\f\u009e\u06bb\t\u009e"+ + "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0003\u00a2"+ + "\u06ce\b\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0003\u00a4\u06d9\b\u00a4"+ + "\u0001\u00a5\u0001\u00a5\u0003\u00a5\u06dd\b\u00a5\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0005\u00a6\u06e3\b\u00a6\n\u00a6\f\u00a6\u06e6"+ + "\t\u00a6\u0001\u00a6\u0003\u00a6\u06e9\b\u00a6\u0003\u00a6\u06eb\b\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7"+ + "\u06f2\b\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ + "\u0005\u00a8\u06f9\b\u00a8\n\u00a8\f\u00a8\u06fc\t\u00a8\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0003\u00ab\u0707\b\u00ab\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u0710"+ + "\b\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001"+ + "\u00ad\u0003\u00ad\u0718\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0003"+ + "\u00ae\u071d\b\u00ae\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001"+ + "\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0003\u00b3\u072d\b\u00b3\u0003"+ + "\u00b3\u072f\b\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0005\u00b4\u0736\b\u00b4\n\u00b4\f\u00b4\u0739\t\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0003\u00b5\u073e\b\u00b5\u0001\u00b5\u0001\u00b5"+ + "\u0001\u00b6\u0001\u00b6\u0003\u00b6\u0744\b\u00b6\u0001\u00b7\u0001\u00b7"+ + "\u0003\u00b7\u0748\b\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8"+ + "\u0001\u00b8\u0005\u00b8\u074f\b\u00b8\n\u00b8\f\u00b8\u0752\t\u00b8\u0001"+ + "\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0003"+ + "\u00b9\u075a\b\u00b9\u0001\u00b9\u0003\u00b9\u075d\b\u00b9\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00bb\u0003\u00bb\u0762\b\u00bb\u0001\u00bb\u0001\u00bb"+ + "\u0003\u00bb\u0766\b\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ + "\u0005\u00bc\u076c\b\u00bc\n\u00bc\f\u00bc\u076f\t\u00bc\u0001\u00bc\u0003"+ + "\u00bc\u0772\b\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001"+ + "\u00be\u0001\u00be\u0003\u00be\u0780\b\u00be\u0003\u00be\u0782\b\u00be"+ + "\u0001\u00be\u0003\u00be\u0785\b\u00be\u0001\u00be\u0003\u00be\u0788\b"+ + "\u00be\u0003\u00be\u078a\b\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001"+ + "\u00c1\u0001\u00c1\u0001\u00c1\u0003\u00c1\u0798\b\u00c1\u0001\u00c1\u0001"+ + "\u0303\u0002\u00a4\u00b4\u00c2\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ + "TVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e"+ + "\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6"+ + "\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be"+ + "\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6"+ + "\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee"+ + "\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106"+ + "\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e"+ + "\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136"+ + "\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c\u014e"+ + "\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166"+ + "\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u017a\u017c\u017e"+ + "\u0180\u0182\u0000\u0013\u0002\u0000eepp\u0001\u0000\u0017\u0018\u0001"+ + "\u0000\u0005\b\u0001\u0000AB\u0001\u0000(*\u0002\u0000(*,,\u0001\u0000"+ + "\u0083\u0089\u0001\u0000\u0014\u0015\u0002\u0000~\u0082\u0087\u0088\u0004"+ + "\u0000##qq}}\u0084\u0086\u0001\u0000\u001f!\u0001\u0000\u001c\u001e\u0002"+ + "\u0000HIw|\u0004\u0000--0033]]\u0002\u0000}\u0082\u0084\u0088\u0001\u0000"+ + "qr\u0002\u0000nn\u009f\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001"+ + "\u0000\u0096\u0097\u0804\u0000\u0184\u0001\u0000\u0000\u0000\u0002\u0187"+ + "\u0001\u0000\u0000\u0000\u0004\u018a\u0001\u0000\u0000\u0000\u0006\u018d"+ + "\u0001\u0000\u0000\u0000\b\u0195\u0001\u0000\u0000\u0000\n\u019e\u0001"+ + "\u0000\u0000\u0000\f\u01be\u0001\u0000\u0000\u0000\u000e\u01cb\u0001\u0000"+ + "\u0000\u0000\u0010\u01ce\u0001\u0000\u0000\u0000\u0012\u01d6\u0001\u0000"+ + "\u0000\u0000\u0014\u01e3\u0001\u0000\u0000\u0000\u0016\u01f9\u0001\u0000"+ + "\u0000\u0000\u0018\u0202\u0001\u0000\u0000\u0000\u001a\u0204\u0001\u0000"+ + "\u0000\u0000\u001c\u0206\u0001\u0000\u0000\u0000\u001e\u0209\u0001\u0000"+ + "\u0000\u0000 \u021d\u0001\u0000\u0000\u0000\"\u021f\u0001\u0000\u0000"+ + "\u0000$\u0221\u0001\u0000\u0000\u0000&\u0226\u0001\u0000\u0000\u0000("+ + "\u0231\u0001\u0000\u0000\u0000*\u023e\u0001\u0000\u0000\u0000,\u0241\u0001"+ + "\u0000\u0000\u0000.\u024c\u0001\u0000\u0000\u00000\u024e\u0001\u0000\u0000"+ + "\u00002\u0253\u0001\u0000\u0000\u00004\u0258\u0001\u0000\u0000\u00006"+ + "\u025d\u0001\u0000\u0000\u00008\u0262\u0001\u0000\u0000\u0000:\u026f\u0001"+ + "\u0000\u0000\u0000<\u0271\u0001\u0000\u0000\u0000>\u0273\u0001\u0000\u0000"+ + "\u0000@\u0278\u0001\u0000\u0000\u0000B\u027d\u0001\u0000\u0000\u0000D"+ + "\u0282\u0001\u0000\u0000\u0000F\u028b\u0001\u0000\u0000\u0000H\u0292\u0001"+ + "\u0000\u0000\u0000J\u029f\u0001\u0000\u0000\u0000L\u02a3\u0001\u0000\u0000"+ + "\u0000N\u02ae\u0001\u0000\u0000\u0000P\u02b6\u0001\u0000\u0000\u0000R"+ + "\u02b8\u0001\u0000\u0000\u0000T\u02cd\u0001\u0000\u0000\u0000V\u02cf\u0001"+ + "\u0000\u0000\u0000X\u02db\u0001\u0000\u0000\u0000Z\u02e7\u0001\u0000\u0000"+ + "\u0000\\\u02f7\u0001\u0000\u0000\u0000^\u0303\u0001\u0000\u0000\u0000"+ + "`\u0312\u0001\u0000\u0000\u0000b\u0315\u0001\u0000\u0000\u0000d\u031d"+ + "\u0001\u0000\u0000\u0000f\u031f\u0001\u0000\u0000\u0000h\u032a\u0001\u0000"+ + "\u0000\u0000j\u0332\u0001\u0000\u0000\u0000l\u0341\u0001\u0000\u0000\u0000"+ + "n\u0343\u0001\u0000\u0000\u0000p\u034b\u0001\u0000\u0000\u0000r\u0359"+ + "\u0001\u0000\u0000\u0000t\u0365\u0001\u0000\u0000\u0000v\u036f\u0001\u0000"+ + "\u0000\u0000x\u0373\u0001\u0000\u0000\u0000z\u0379\u0001\u0000\u0000\u0000"+ + "|\u0391\u0001\u0000\u0000\u0000~\u0399\u0001\u0000\u0000\u0000\u0080\u03a8"+ + "\u0001\u0000\u0000\u0000\u0082\u03aa\u0001\u0000\u0000\u0000\u0084\u03b1"+ + "\u0001\u0000\u0000\u0000\u0086\u03ba\u0001\u0000\u0000\u0000\u0088\u03bf"+ + "\u0001\u0000\u0000\u0000\u008a\u03c4\u0001\u0000\u0000\u0000\u008c\u03cd"+ + "\u0001\u0000\u0000\u0000\u008e\u03d4\u0001\u0000\u0000\u0000\u0090\u03d9"+ + "\u0001\u0000\u0000\u0000\u0092\u03df\u0001\u0000\u0000\u0000\u0094\u03e4"+ + "\u0001\u0000\u0000\u0000\u0096\u03eb\u0001\u0000\u0000\u0000\u0098\u03f5"+ + "\u0001\u0000\u0000\u0000\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u0405"+ + "\u0001\u0000\u0000\u0000\u009e\u0408\u0001\u0000\u0000\u0000\u00a0\u040c"+ + "\u0001\u0000\u0000\u0000\u00a2\u0413\u0001\u0000\u0000\u0000\u00a4\u042c"+ + "\u0001\u0000\u0000\u0000\u00a6\u0468\u0001\u0000\u0000\u0000\u00a8\u046a"+ + "\u0001\u0000\u0000\u0000\u00aa\u046d\u0001\u0000\u0000\u0000\u00ac\u0472"+ + "\u0001\u0000\u0000\u0000\u00ae\u047b\u0001\u0000\u0000\u0000\u00b0\u0489"+ + "\u0001\u0000\u0000\u0000\u00b2\u0493\u0001\u0000\u0000\u0000\u00b4\u04a1"+ + "\u0001\u0000\u0000\u0000\u00b6\u04bc\u0001\u0000\u0000\u0000\u00b8\u04bf"+ + "\u0001\u0000\u0000\u0000\u00ba\u04c7\u0001\u0000\u0000\u0000\u00bc\u04d0"+ + "\u0001\u0000\u0000\u0000\u00be\u04df\u0001\u0000\u0000\u0000\u00c0\u04e1"+ + "\u0001\u0000\u0000\u0000\u00c2\u04f4\u0001\u0000\u0000\u0000\u00c4\u0500"+ + "\u0001\u0000\u0000\u0000\u00c6\u050b\u0001\u0000\u0000\u0000\u00c8\u050d"+ + "\u0001\u0000\u0000\u0000\u00ca\u0510\u0001\u0000\u0000\u0000\u00cc\u052a"+ + "\u0001\u0000\u0000\u0000\u00ce\u052c\u0001\u0000\u0000\u0000\u00d0\u0531"+ + "\u0001\u0000\u0000\u0000\u00d2\u0545\u0001\u0000\u0000\u0000\u00d4\u0547"+ + "\u0001\u0000\u0000\u0000\u00d6\u0549\u0001\u0000\u0000\u0000\u00d8\u054c"+ + "\u0001\u0000\u0000\u0000\u00da\u0556\u0001\u0000\u0000\u0000\u00dc\u0560"+ + "\u0001\u0000\u0000\u0000\u00de\u0563\u0001\u0000\u0000\u0000\u00e0\u0568"+ + "\u0001\u0000\u0000\u0000\u00e2\u056a\u0001\u0000\u0000\u0000\u00e4\u0578"+ + "\u0001\u0000\u0000\u0000\u00e6\u0580\u0001\u0000\u0000\u0000\u00e8\u0588"+ + "\u0001\u0000\u0000\u0000\u00ea\u0590\u0001\u0000\u0000\u0000\u00ec\u05a0"+ + "\u0001\u0000\u0000\u0000\u00ee\u05a2\u0001\u0000\u0000\u0000\u00f0\u05a6"+ + "\u0001\u0000\u0000\u0000\u00f2\u05ac\u0001\u0000\u0000\u0000\u00f4\u05ba"+ + "\u0001\u0000\u0000\u0000\u00f6\u05cc\u0001\u0000\u0000\u0000\u00f8\u05d5"+ + "\u0001\u0000\u0000\u0000\u00fa\u05d7\u0001\u0000\u0000\u0000\u00fc\u05d9"+ + "\u0001\u0000\u0000\u0000\u00fe\u05dd\u0001\u0000\u0000\u0000\u0100\u05e0"+ + "\u0001\u0000\u0000\u0000\u0102\u05e4\u0001\u0000\u0000\u0000\u0104\u05e6"+ + "\u0001\u0000\u0000\u0000\u0106\u05eb\u0001\u0000\u0000\u0000\u0108\u05ef"+ + "\u0001\u0000\u0000\u0000\u010a\u05f3\u0001\u0000\u0000\u0000\u010c\u05f7"+ + "\u0001\u0000\u0000\u0000\u010e\u05fa\u0001\u0000\u0000\u0000\u0110\u05fc"+ + "\u0001\u0000\u0000\u0000\u0112\u0611\u0001\u0000\u0000\u0000\u0114\u0613"+ + "\u0001\u0000\u0000\u0000\u0116\u0629\u0001\u0000\u0000\u0000\u0118\u0631"+ + "\u0001\u0000\u0000\u0000\u011a\u0633\u0001\u0000\u0000\u0000\u011c\u0649"+ + "\u0001\u0000\u0000\u0000\u011e\u0651\u0001\u0000\u0000\u0000\u0120\u0659"+ + "\u0001\u0000\u0000\u0000\u0122\u065d\u0001\u0000\u0000\u0000\u0124\u0669"+ + "\u0001\u0000\u0000\u0000\u0126\u0673\u0001\u0000\u0000\u0000\u0128\u067e"+ + "\u0001\u0000\u0000\u0000\u012a\u0686\u0001\u0000\u0000\u0000\u012c\u068a"+ + "\u0001\u0000\u0000\u0000\u012e\u0697\u0001\u0000\u0000\u0000\u0130\u06a1"+ + "\u0001\u0000\u0000\u0000\u0132\u06a6\u0001\u0000\u0000\u0000\u0134\u06a8"+ + "\u0001\u0000\u0000\u0000\u0136\u06ad\u0001\u0000\u0000\u0000\u0138\u06af"+ + "\u0001\u0000\u0000\u0000\u013a\u06b1\u0001\u0000\u0000\u0000\u013c\u06b4"+ + "\u0001\u0000\u0000\u0000\u013e\u06bc\u0001\u0000\u0000\u0000\u0140\u06be"+ + "\u0001\u0000\u0000\u0000\u0142\u06c2\u0001\u0000\u0000\u0000\u0144\u06cd"+ + "\u0001\u0000\u0000\u0000\u0146\u06d1\u0001\u0000\u0000\u0000\u0148\u06d8"+ + "\u0001\u0000\u0000\u0000\u014a\u06dc\u0001\u0000\u0000\u0000\u014c\u06de"+ + "\u0001\u0000\u0000\u0000\u014e\u06ee\u0001\u0000\u0000\u0000\u0150\u06f5"+ + "\u0001\u0000\u0000\u0000\u0152\u06fd\u0001\u0000\u0000\u0000\u0154\u0700"+ + "\u0001\u0000\u0000\u0000\u0156\u0702\u0001\u0000\u0000\u0000\u0158\u070f"+ + "\u0001\u0000\u0000\u0000\u015a\u0717\u0001\u0000\u0000\u0000\u015c\u071c"+ + "\u0001\u0000\u0000\u0000\u015e\u071e\u0001\u0000\u0000\u0000\u0160\u0720"+ + "\u0001\u0000\u0000\u0000\u0162\u0722\u0001\u0000\u0000\u0000\u0164\u0726"+ + "\u0001\u0000\u0000\u0000\u0166\u0729\u0001\u0000\u0000\u0000\u0168\u0732"+ + "\u0001\u0000\u0000\u0000\u016a\u073d\u0001\u0000\u0000\u0000\u016c\u0743"+ + "\u0001\u0000\u0000\u0000\u016e\u0747\u0001\u0000\u0000\u0000\u0170\u0749"+ + "\u0001\u0000\u0000\u0000\u0172\u0759\u0001\u0000\u0000\u0000\u0174\u075e"+ + "\u0001\u0000\u0000\u0000\u0176\u0761\u0001\u0000\u0000\u0000\u0178\u0767"+ + "\u0001\u0000\u0000\u0000\u017a\u0775\u0001\u0000\u0000\u0000\u017c\u077a"+ + "\u0001\u0000\u0000\u0000\u017e\u078d\u0001\u0000\u0000\u0000\u0180\u0791"+ + "\u0001\u0000\u0000\u0000\u0182\u0797\u0001\u0000\u0000\u0000\u0184\u0185"+ + "\u0003\u00a4R\u0000\u0185\u0186\u0005\u0000\u0000\u0001\u0186\u0001\u0001"+ + "\u0000\u0000\u0000\u0187\u0188\u0003\u00a6S\u0000\u0188\u0189\u0005\u0000"+ + "\u0000\u0001\u0189\u0003\u0001\u0000\u0000\u0000\u018a\u018b\u0003\u00c4"+ + "b\u0000\u018b\u018c\u0005\u0000\u0000\u0001\u018c\u0005\u0001\u0000\u0000"+ + "\u0000\u018d\u0192\u0003\b\u0004\u0000\u018e\u018f\u0005m\u0000\u0000"+ + "\u018f\u0191\u0003\b\u0004\u0000\u0190\u018e\u0001\u0000\u0000\u0000\u0191"+ + "\u0194\u0001\u0000\u0000\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0192"+ + "\u0193\u0001\u0000\u0000\u0000\u0193\u0007\u0001\u0000\u0000\u0000\u0194"+ + "\u0192\u0001\u0000\u0000\u0000\u0195\u0197\u0005e\u0000\u0000\u0196\u0198"+ + "\u0005<\u0000\u0000\u0197\u0196\u0001\u0000\u0000\u0000\u0197\u0198\u0001"+ + "\u0000\u0000\u0000\u0198\t\u0001\u0000\u0000\u0000\u0199\u019a\u0003\u000e"+ + "\u0007\u0000\u019a\u019b\u0003\u0182\u00c1\u0000\u019b\u019d\u0001\u0000"+ + "\u0000\u0000\u019c\u0199\u0001\u0000\u0000\u0000\u019d\u01a0\u0001\u0000"+ + "\u0000\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019e\u019f\u0001\u0000"+ + "\u0000\u0000\u019f\u01a1\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000"+ + "\u0000\u0000\u01a1\u01a2\u0003\u00dcn\u0000\u01a2\u01a8\u0003\u0182\u00c1"+ + "\u0000\u01a3\u01a4\u0003\u0014\n\u0000\u01a4\u01a5\u0003\u0182\u00c1\u0000"+ + "\u01a5\u01a7\u0001\u0000\u0000\u0000\u01a6\u01a3\u0001\u0000\u0000\u0000"+ + "\u01a7\u01aa\u0001\u0000\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000"+ + "\u01a8\u01a9\u0001\u0000\u0000\u0000\u01a9\u01b4\u0001\u0000\u0000\u0000"+ + "\u01aa\u01a8\u0001\u0000\u0000\u0000\u01ab\u01af\u0003\u0088D\u0000\u01ac"+ + "\u01af\u0003\u00e0p\u0000\u01ad\u01af\u0003\u0016\u000b\u0000\u01ae\u01ab"+ + "\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01ad"+ + "\u0001\u0000\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0\u01b1"+ + "\u0003\u0182\u00c1\u0000\u01b1\u01b3\u0001\u0000\u0000\u0000\u01b2\u01ae"+ + "\u0001\u0000\u0000\u0000\u01b3\u01b6\u0001\u0000\u0000\u0000\u01b4\u01b2"+ + "\u0001\u0000\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000\u01b5\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7\u01b8"+ + "\u0005\u0000\u0000\u0001\u01b8\u000b\u0001\u0000\u0000\u0000\u01b9\u01ba"+ + "\u0003\u000e\u0007\u0000\u01ba\u01bb\u0003\u0182\u00c1\u0000\u01bb\u01bd"+ + "\u0001\u0000\u0000\u0000\u01bc\u01b9\u0001\u0000\u0000\u0000\u01bd\u01c0"+ + "\u0001\u0000\u0000\u0000\u01be\u01bc\u0001\u0000\u0000\u0000\u01be\u01bf"+ + "\u0001\u0000\u0000\u0000\u01bf\u01c1\u0001\u0000\u0000\u0000\u01c0\u01be"+ + "\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u00dcn\u0000\u01c2\u01c8\u0003"+ + "\u0182\u00c1\u0000\u01c3\u01c4\u0003\u0014\n\u0000\u01c4\u01c5\u0003\u0182"+ + "\u00c1\u0000\u01c5\u01c7\u0001\u0000\u0000\u0000\u01c6\u01c3\u0001\u0000"+ + "\u0000\u0000\u01c7\u01ca\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000"+ + "\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\r\u0001\u0000\u0000"+ + "\u0000\u01ca\u01c8\u0001\u0000\u0000\u0000\u01cb\u01cc\u0005E\u0000\u0000"+ + "\u01cc\u01cd\u0003\u00a4R\u0000\u01cd\u000f\u0001\u0000\u0000\u0000\u01ce"+ + "\u01cf\u0005F\u0000\u0000\u01cf\u01d0\u0003\u00a4R\u0000\u01d0\u0011\u0001"+ + "\u0000\u0000\u0000\u01d1\u01d2\u0003\u0010\b\u0000\u01d2\u01d3\u0003\u0182"+ + "\u00c1\u0000\u01d3\u01d5\u0001\u0000\u0000\u0000\u01d4\u01d1\u0001\u0000"+ + "\u0000\u0000\u01d5\u01d8\u0001\u0000\u0000\u0000\u01d6\u01d4\u0001\u0000"+ + "\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01da\u0001\u0000"+ + "\u0000\u0000\u01d8\u01d6\u0001\u0000\u0000\u0000\u01d9\u01db\u0007\u0000"+ + "\u0000\u0000\u01da\u01d9\u0001\u0000\u0000\u0000\u01da\u01db\u0001\u0000"+ + "\u0000\u0000\u01db\u01dc\u0001\u0000\u0000\u0000\u01dc\u01dd\u0003\u00de"+ + "o\u0000\u01dd\u0013\u0001\u0000\u0000\u0000\u01de\u01df\u0003\u0010\b"+ + "\u0000\u01df\u01e0\u0003\u0182\u00c1\u0000\u01e0\u01e2\u0001\u0000\u0000"+ + "\u0000\u01e1\u01de\u0001\u0000\u0000\u0000\u01e2\u01e5\u0001\u0000\u0000"+ + "\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000"+ + "\u0000\u01e4\u01f3\u0001\u0000\u0000\u0000\u01e5\u01e3\u0001\u0000\u0000"+ + "\u0000\u01e6\u01e7\u0005a\u0000\u0000\u01e7\u01f4\u0003\u0012\t\u0000"+ + "\u01e8\u01e9\u0005a\u0000\u0000\u01e9\u01ef\u0005f\u0000\u0000\u01ea\u01eb"+ + "\u0003\u0012\t\u0000\u01eb\u01ec\u0003\u0182\u00c1\u0000\u01ec\u01ee\u0001"+ + "\u0000\u0000\u0000\u01ed\u01ea\u0001\u0000\u0000\u0000\u01ee\u01f1\u0001"+ + "\u0000\u0000\u0000\u01ef\u01ed\u0001\u0000\u0000\u0000\u01ef\u01f0\u0001"+ + "\u0000\u0000\u0000\u01f0\u01f2\u0001\u0000\u0000\u0000\u01f1\u01ef\u0001"+ + "\u0000\u0000\u0000\u01f2\u01f4\u0005g\u0000\u0000\u01f3\u01e6\u0001\u0000"+ + "\u0000\u0000\u01f3\u01e8\u0001\u0000\u0000\u0000\u01f4\u0015\u0001\u0000"+ + "\u0000\u0000\u01f5\u01fa\u0003z=\u0000\u01f6\u01fa\u0003\u0090H\u0000"+ + "\u01f7\u01fa\u0003\u0094J\u0000\u01f8\u01fa\u0003\u008eG\u0000\u01f9\u01f5"+ + "\u0001\u0000\u0000\u0000\u01f9\u01f6\u0001\u0000\u0000\u0000\u01f9\u01f7"+ + "\u0001\u0000\u0000\u0000\u01f9\u01f8\u0001\u0000\u0000\u0000\u01fa\u0017"+ + "\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005\u001b\u0000\u0000\u01fc\u0203"+ + "\u0003\u00a6S\u0000\u01fd\u01fe\u0007\u0001\u0000\u0000\u01fe\u0203\u0003"+ + ".\u0017\u0000\u01ff\u0200\u0007\u0002\u0000\u0000\u0200\u0203\u0003\u00a4"+ + "R\u0000\u0201\u0203\u0003f3\u0000\u0202\u01fb\u0001\u0000\u0000\u0000"+ + "\u0202\u01fd\u0001\u0000\u0000\u0000\u0202\u01ff\u0001\u0000\u0000\u0000"+ + "\u0202\u0201\u0001\u0000\u0000\u0000\u0203\u0019\u0001\u0000\u0000\u0000"+ + "\u0204\u0205\u0003\u001c\u000e\u0000\u0205\u001b\u0001\u0000\u0000\u0000"+ + "\u0206\u0207\u0003^/\u0000\u0207\u0208\u0003\u001e\u000f\u0000\u0208\u001d"+ + "\u0001\u0000\u0000\u0000\u0209\u020a\u0005D\u0000\u0000\u020a\u020c\u0005"+ + "f\u0000\u0000\u020b\u020d\u0003\u00f6{\u0000\u020c\u020b\u0001\u0000\u0000"+ + "\u0000\u020c\u020d\u0001\u0000\u0000\u0000\u020d\u020e\u0001\u0000\u0000"+ + "\u0000\u020e\u020f\u0005g\u0000\u0000\u020f\u001f\u0001\u0000\u0000\u0000"+ + "\u0210\u021e\u0003F#\u0000\u0211\u021e\u0003D\"\u0000\u0212\u021e\u0003"+ + "B!\u0000\u0213\u021e\u0003$\u0012\u0000\u0214\u021e\u0003@ \u0000\u0215"+ + "\u021e\u00038\u001c\u0000\u0216\u021e\u0003>\u001f\u0000\u0217\u021e\u0003"+ + "6\u001b\u0000\u0218\u021e\u00032\u0019\u0000\u0219\u021e\u00030\u0018"+ + "\u0000\u021a\u021e\u00034\u001a\u0000\u021b\u021e\u0003\"\u0011\u0000"+ + "\u021c\u021e\u0003H$\u0000\u021d\u0210\u0001\u0000\u0000\u0000\u021d\u0211"+ + "\u0001\u0000\u0000\u0000\u021d\u0212\u0001\u0000\u0000\u0000\u021d\u0213"+ + "\u0001\u0000\u0000\u0000\u021d\u0214\u0001\u0000\u0000\u0000\u021d\u0215"+ + "\u0001\u0000\u0000\u0000\u021d\u0216\u0001\u0000\u0000\u0000\u021d\u0217"+ + "\u0001\u0000\u0000\u0000\u021d\u0218\u0001\u0000\u0000\u0000\u021d\u0219"+ + "\u0001\u0000\u0000\u0000\u021d\u021a\u0001\u0000\u0000\u0000\u021d\u021b"+ + "\u0001\u0000\u0000\u0000\u021d\u021c\u0001\u0000\u0000\u0000\u021e!\u0001"+ + "\u0000\u0000\u0000\u021f\u0220\u0007\u0003\u0000\u0000\u0220#\u0001\u0000"+ + "\u0000\u0000\u0221\u0222\u0005^\u0000\u0000\u0222\u0223\u0005j\u0000\u0000"+ + "\u0223\u0224\u0003\u00c4b\u0000\u0224\u0225\u0005k\u0000\u0000\u0225%"+ + "\u0001\u0000\u0000\u0000\u0226\u022b\u0003(\u0014\u0000\u0227\u0228\u0005"+ + "m\u0000\u0000\u0228\u022a\u0003(\u0014\u0000\u0229\u0227\u0001\u0000\u0000"+ + "\u0000\u022a\u022d\u0001\u0000\u0000\u0000\u022b\u0229\u0001\u0000\u0000"+ + "\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\u022f\u0001\u0000\u0000"+ + "\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022e\u0230\u0005m\u0000\u0000"+ + "\u022f\u022e\u0001\u0000\u0000\u0000\u022f\u0230\u0001\u0000\u0000\u0000"+ + "\u0230\'\u0001\u0000\u0000\u0000\u0231\u0236\u0005e\u0000\u0000\u0232"+ + "\u0233\u0005m\u0000\u0000\u0233\u0235\u0005e\u0000\u0000\u0234\u0232\u0001"+ + "\u0000\u0000\u0000\u0235\u0238\u0001\u0000\u0000\u0000\u0236\u0234\u0001"+ + "\u0000\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0239\u0001"+ + "\u0000\u0000\u0000\u0238\u0236\u0001\u0000\u0000\u0000\u0239\u023a\u0003"+ + "\u0138\u009c\u0000\u023a)\u0001\u0000\u0000\u0000\u023b\u023d\u0003,\u0016"+ + "\u0000\u023c\u023b\u0001\u0000\u0000\u0000\u023d\u0240\u0001\u0000\u0000"+ + "\u0000\u023e\u023c\u0001\u0000\u0000\u0000\u023e\u023f\u0001\u0000\u0000"+ + "\u0000\u023f+\u0001\u0000\u0000\u0000\u0240\u023e\u0001\u0000\u0000\u0000"+ + "\u0241\u0242\u0005h\u0000\u0000\u0242\u0247\u0003\u00a4R\u0000\u0243\u0244"+ + "\u0005m\u0000\u0000\u0244\u0246\u0003\u00a4R\u0000\u0245\u0243\u0001\u0000"+ + "\u0000\u0000\u0246\u0249\u0001\u0000\u0000\u0000\u0247\u0245\u0001\u0000"+ + "\u0000\u0000\u0247\u0248\u0001\u0000\u0000\u0000\u0248\u024a\u0001\u0000"+ + "\u0000\u0000\u0249\u0247\u0001\u0000\u0000\u0000\u024a\u024b\u0005i\u0000"+ + "\u0000\u024b-\u0001\u0000\u0000\u0000\u024c\u024d\u0003\u00b4Z\u0000\u024d"+ + "/\u0001\u0000\u0000\u0000\u024e\u024f\u00051\u0000\u0000\u024f\u0250\u0005"+ + "f\u0000\u0000\u0250\u0251\u0003\u00a4R\u0000\u0251\u0252\u0005g\u0000"+ + "\u0000\u02521\u0001\u0000\u0000\u0000\u0253\u0254\u00057\u0000\u0000\u0254"+ + "\u0255\u0005j\u0000\u0000\u0255\u0256\u0003\u00c4b\u0000\u0256\u0257\u0005"+ + "k\u0000\u0000\u02573\u0001\u0000\u0000\u0000\u0258\u0259\u00052\u0000"+ + "\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0003\u00a4R\u0000\u025b"+ + "\u025c\u0005g\u0000\u0000\u025c5\u0001\u0000\u0000\u0000\u025d\u025e\u0007"+ + "\u0004\u0000\u0000\u025e\u025f\u0005f\u0000\u0000\u025f\u0260\u0003\u00a4"+ + "R\u0000\u0260\u0261\u0005g\u0000\u0000\u02617\u0001\u0000\u0000\u0000"+ + "\u0262\u0267\u0005\u0011\u0000\u0000\u0263\u0264\u0005j\u0000\u0000\u0264"+ + "\u0265\u0003:\u001d\u0000\u0265\u0266\u0005k\u0000\u0000\u0266\u0268\u0001"+ + "\u0000\u0000\u0000\u0267\u0263\u0001\u0000\u0000\u0000\u0267\u0268\u0001"+ + "\u0000\u0000\u0000\u0268\u0269\u0001\u0000\u0000\u0000\u0269\u026a\u0005"+ + "f\u0000\u0000\u026a\u026b\u0003\u00a4R\u0000\u026b\u026c\u0005g\u0000"+ + "\u0000\u026c9\u0001\u0000\u0000\u0000\u026d\u0270\u0003<\u001e\u0000\u026e"+ + "\u0270\u0005\u0013\u0000\u0000\u026f\u026d\u0001\u0000\u0000\u0000\u026f"+ + "\u026e\u0001\u0000\u0000\u0000\u0270;\u0001\u0000\u0000\u0000\u0271\u0272"+ + "\u0005e\u0000\u0000\u0272=\u0001\u0000\u0000\u0000\u0273\u0274\u0005\u0012"+ + "\u0000\u0000\u0274\u0275\u0005f\u0000\u0000\u0275\u0276\u0003\u00a4R\u0000"+ + "\u0276\u0277\u0005g\u0000\u0000\u0277?\u0001\u0000\u0000\u0000\u0278\u0279"+ + "\u0005:\u0000\u0000\u0279\u027a\u0005f\u0000\u0000\u027a\u027b\u0003\u00a4"+ + "R\u0000\u027b\u027c\u0005g\u0000\u0000\u027cA\u0001\u0000\u0000\u0000"+ + "\u027d\u027e\u00059\u0000\u0000\u027e\u027f\u0005f\u0000\u0000\u027f\u0280"+ + "\u0003\u00a4R\u0000\u0280\u0281\u0005g\u0000\u0000\u0281C\u0001\u0000"+ + "\u0000\u0000\u0282\u0283\u0005\u0016\u0000\u0000\u0283\u0284\u0005f\u0000"+ + "\u0000\u0284\u0287\u0003\u00a4R\u0000\u0285\u0286\u0005m\u0000\u0000\u0286"+ + "\u0288\u0003\u00a4R\u0000\u0287\u0285\u0001\u0000\u0000\u0000\u0287\u0288"+ + "\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0005g\u0000\u0000\u028aE\u0001\u0000\u0000\u0000\u028b\u028c\u0007\u0004"+ + "\u0000\u0000\u028c\u028d\u0005j\u0000\u0000\u028d\u028e\u0003\u00a4R\u0000"+ + "\u028e\u028f\u0005=\u0000\u0000\u028f\u0290\u0003\u00a4R\u0000\u0290\u0291"+ + "\u0005k\u0000\u0000\u0291G\u0001\u0000\u0000\u0000\u0292\u0293\u00056"+ + "\u0000\u0000\u0293\u0294\u0003\u00a4R\u0000\u0294\u029a\u0005h\u0000\u0000"+ + "\u0295\u0296\u0003J%\u0000\u0296\u0297\u0003\u0182\u00c1\u0000\u0297\u0299"+ + "\u0001\u0000\u0000\u0000\u0298\u0295\u0001\u0000\u0000\u0000\u0299\u029c"+ + "\u0001\u0000\u0000\u0000\u029a\u0298\u0001\u0000\u0000\u0000\u029a\u029b"+ + "\u0001\u0000\u0000\u0000\u029b\u029d\u0001\u0000\u0000\u0000\u029c\u029a"+ + "\u0001\u0000\u0000\u0000\u029d\u029e\u0005i\u0000\u0000\u029eI\u0001\u0000"+ + "\u0000\u0000\u029f\u02a0\u0003j5\u0000\u02a0\u02a1\u0005o\u0000\u0000"+ + "\u02a1\u02a2\u0003\u00a4R\u0000\u02a2K\u0001\u0000\u0000\u0000\u02a3\u02a4"+ + "\u0005j\u0000\u0000\u02a4\u02a9\u0003N\'\u0000\u02a5\u02a6\u0005m\u0000"+ + "\u0000\u02a6\u02a8\u0003N\'\u0000\u02a7\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a8\u02ab\u0001\u0000\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000"+ + "\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u02ac\u0001\u0000\u0000\u0000"+ + "\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ac\u02ad\u0005k\u0000\u0000\u02ad"+ + "M\u0001\u0000\u0000\u0000\u02ae\u02af\u0003\u00a4R\u0000\u02af\u02b0\u0005"+ + "l\u0000\u0000\u02b0\u02b1\u0003\u00a4R\u0000\u02b1O\u0001\u0000\u0000"+ + "\u0000\u02b2\u02b7\u0003\\.\u0000\u02b3\u02b7\u0003Z-\u0000\u02b4\u02b7"+ + "\u0003R)\u0000\u02b5\u02b7\u0003V+\u0000\u02b6\u02b2\u0001\u0000\u0000"+ + "\u0000\u02b6\u02b3\u0001\u0000\u0000\u0000\u02b6\u02b4\u0001\u0000\u0000"+ + "\u0000\u02b6\u02b5\u0001\u0000\u0000\u0000\u02b7Q\u0001\u0000\u0000\u0000"+ + "\u02b8\u02b9\u00053\u0000\u0000\u02b9\u02bf\u0005h\u0000\u0000\u02ba\u02bb"+ + "\u0003T*\u0000\u02bb\u02bc\u0003\u0182\u00c1\u0000\u02bc\u02be\u0001\u0000"+ + "\u0000\u0000\u02bd\u02ba\u0001\u0000\u0000\u0000\u02be\u02c1\u0001\u0000"+ + "\u0000\u0000\u02bf\u02bd\u0001\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000"+ + "\u0000\u0000\u02c0\u02c2\u0001\u0000\u0000\u0000\u02c1\u02bf\u0001\u0000"+ + "\u0000\u0000\u02c2\u02c3\u0005i\u0000\u0000\u02c3S\u0001\u0000\u0000\u0000"+ + "\u02c4\u02c5\u0005M\u0000\u0000\u02c5\u02c6\u0005e\u0000\u0000\u02c6\u02ce"+ + "\u0003\u0148\u00a4\u0000\u02c7\u02c8\u00054\u0000\u0000\u02c8\u02c9\u0005"+ + "h\u0000\u0000\u02c9\u02ca\u0003\u00a4R\u0000\u02ca\u02cb\u0003\u0182\u00c1"+ + "\u0000\u02cb\u02cc\u0005i\u0000\u0000\u02cc\u02ce\u0001\u0000\u0000\u0000"+ + "\u02cd\u02c4\u0001\u0000\u0000\u0000\u02cd\u02c7\u0001\u0000\u0000\u0000"+ + "\u02ceU\u0001\u0000\u0000\u0000\u02cf\u02d0\u00055\u0000\u0000\u02d0\u02d6"+ + "\u0005h\u0000\u0000\u02d1\u02d2\u0003X,\u0000\u02d2\u02d3\u0003\u0182"+ + "\u00c1\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d1\u0001\u0000"+ + "\u0000\u0000\u02d5\u02d8\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000"+ + "\u0000\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7\u02d9\u0001\u0000"+ + "\u0000\u0000\u02d8\u02d6\u0001\u0000\u0000\u0000\u02d9\u02da\u0005i\u0000"+ + "\u0000\u02daW\u0001\u0000\u0000\u0000\u02db\u02dc\u0005e\u0000\u0000\u02dc"+ + "\u02e2\u0005h\u0000\u0000\u02dd\u02de\u0003\u0172\u00b9\u0000\u02de\u02df"+ + "\u0003\u0182\u00c1\u0000\u02df\u02e1\u0001\u0000\u0000\u0000\u02e0\u02dd"+ + "\u0001\u0000\u0000\u0000\u02e1\u02e4\u0001\u0000\u0000\u0000\u02e2\u02e0"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e5"+ + "\u0001\u0000\u0000\u0000\u02e4\u02e2\u0001\u0000\u0000\u0000\u02e5\u02e6"+ + "\u0005i\u0000\u0000\u02e6Y\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005\u001b"+ + "\u0000\u0000\u02e8\u02e9\u0005j\u0000\u0000\u02e9\u02ea\u0005k\u0000\u0000"+ + "\u02ea\u02eb\u0003\u0138\u009c\u0000\u02eb[\u0001\u0000\u0000\u0000\u02ec"+ + "\u02ed\u0007\u0005\u0000\u0000\u02ed\u02ee\u0005j\u0000\u0000\u02ee\u02ef"+ + "\u0003\u00c4b\u0000\u02ef\u02f0\u0005k\u0000\u0000\u02f0\u02f8\u0001\u0000"+ + "\u0000\u0000\u02f1\u02f2\u0005+\u0000\u0000\u02f2\u02f3\u0005j\u0000\u0000"+ + "\u02f3\u02f4\u0003\u00c4b\u0000\u02f4\u02f5\u0005k\u0000\u0000\u02f5\u02f6"+ + "\u0003\u00c4b\u0000\u02f6\u02f8\u0001\u0000\u0000\u0000\u02f7\u02ec\u0001"+ + "\u0000\u0000\u0000\u02f7\u02f1\u0001\u0000\u0000\u0000\u02f8]\u0001\u0000"+ + "\u0000\u0000\u02f9\u02ff\u0003`0\u0000\u02fa\u02fb\u0005\u000e\u0000\u0000"+ + "\u02fb\u02ff\u0006/\uffff\uffff\u0000\u02fc\u02fd\u0005C\u0000\u0000\u02fd"+ + "\u02ff\u0006/\uffff\uffff\u0000\u02fe\u02f9\u0001\u0000\u0000\u0000\u02fe"+ + "\u02fa\u0001\u0000\u0000\u0000\u02fe\u02fc\u0001\u0000\u0000\u0000\u02ff"+ + "\u0300\u0001\u0000\u0000\u0000\u0300\u0302\u0003\u0182\u00c1\u0000\u0301"+ + "\u02fe\u0001\u0000\u0000\u0000\u0302\u0305\u0001\u0000\u0000\u0000\u0303"+ + "\u0304\u0001\u0000\u0000\u0000\u0303\u0301\u0001\u0000\u0000\u0000\u0304"+ + "\u0308\u0001\u0000\u0000\u0000\u0305\u0303\u0001\u0000\u0000\u0000\u0306"+ + "\u0307\u0005\u000e\u0000\u0000\u0307\u0309\u0006/\uffff\uffff\u0000\u0308"+ + "\u0306\u0001\u0000\u0000\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309"+ + "_\u0001\u0000\u0000\u0000\u030a\u030b\u0005\t\u0000\u0000\u030b\u0313"+ + "\u0003d2\u0000\u030c\u030d\u0005\n\u0000\u0000\u030d\u0313\u0003d2\u0000"+ + "\u030e\u030f\u0005\u000b\u0000\u0000\u030f\u0313\u0003d2\u0000\u0310\u0311"+ + "\u0005\r\u0000\u0000\u0311\u0313\u0003b1\u0000\u0312\u030a\u0001\u0000"+ + "\u0000\u0000\u0312\u030c\u0001\u0000\u0000\u0000\u0312\u030e\u0001\u0000"+ + "\u0000\u0000\u0312\u0310\u0001\u0000\u0000\u0000\u0313a\u0001\u0000\u0000"+ + "\u0000\u0314\u0316\u0003\u00e8t\u0000\u0315\u0314\u0001\u0000\u0000\u0000"+ + "\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0319\u0001\u0000\u0000\u0000"+ + "\u0317\u0318\u0005\\\u0000\u0000\u0318\u031a\u0003\u00a4R\u0000\u0319"+ + "\u0317\u0001\u0000\u0000\u0000\u0319\u031a\u0001\u0000\u0000\u0000\u031a"+ + "c\u0001\u0000\u0000\u0000\u031b\u031e\u0001\u0000\u0000\u0000\u031c\u031e"+ + "\u0003\u00a4R\u0000\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031c\u0001"+ + "\u0000\u0000\u0000\u031ee\u0001\u0000\u0000\u0000\u031f\u0320\u00056\u0000"+ + "\u0000\u0320\u0321\u0003\u00a4R\u0000\u0321\u0325\u0005h\u0000\u0000\u0322"+ + "\u0324\u0003h4\u0000\u0323\u0322\u0001\u0000\u0000\u0000\u0324\u0327\u0001"+ + "\u0000\u0000\u0000\u0325\u0323\u0001\u0000\u0000\u0000\u0325\u0326\u0001"+ + "\u0000\u0000\u0000\u0326\u0328\u0001\u0000\u0000\u0000\u0327\u0325\u0001"+ + "\u0000\u0000\u0000\u0328\u0329\u0005i\u0000\u0000\u0329g\u0001\u0000\u0000"+ + "\u0000\u032a\u032b\u0003j5\u0000\u032b\u032d\u0005o\u0000\u0000\u032c"+ + "\u032e\u0003\u00f6{\u0000\u032d\u032c\u0001\u0000\u0000\u0000\u032d\u032e"+ + "\u0001\u0000\u0000\u0000\u032ei\u0001\u0000\u0000\u0000\u032f\u0330\u0005"+ + "P\u0000\u0000\u0330\u0333\u0003l6\u0000\u0331\u0333\u0005L\u0000\u0000"+ + "\u0332\u032f\u0001\u0000\u0000\u0000\u0332\u0331\u0001\u0000\u0000\u0000"+ + "\u0333k\u0001\u0000\u0000\u0000\u0334\u0335\u0005%\u0000\u0000\u0335\u0342"+ + "\u0005e\u0000\u0000\u0336\u0337\u0003\u00ccf\u0000\u0337\u033c\u0005h"+ + "\u0000\u0000\u0338\u033a\u0003n7\u0000\u0339\u033b\u0005m\u0000\u0000"+ + "\u033a\u0339\u0001\u0000\u0000\u0000\u033a\u033b\u0001\u0000\u0000\u0000"+ + "\u033b\u033d\u0001\u0000\u0000\u0000\u033c\u0338\u0001\u0000\u0000\u0000"+ + "\u033c\u033d\u0001\u0000\u0000\u0000\u033d\u033e\u0001\u0000\u0000\u0000"+ + "\u033e\u033f\u0005i\u0000\u0000\u033f\u0342\u0001\u0000\u0000\u0000\u0340"+ + "\u0342\u0003\u00a4R\u0000\u0341\u0334\u0001\u0000\u0000\u0000\u0341\u0336"+ + "\u0001\u0000\u0000\u0000\u0341\u0340\u0001\u0000\u0000\u0000\u0342m\u0001"+ + "\u0000\u0000\u0000\u0343\u0348\u0003l6\u0000\u0344\u0345\u0005m\u0000"+ + "\u0000\u0345\u0347\u0003l6\u0000\u0346\u0344\u0001\u0000\u0000\u0000\u0347"+ + "\u034a\u0001\u0000\u0000\u0000\u0348\u0346\u0001\u0000\u0000\u0000\u0348"+ + "\u0349\u0001\u0000\u0000\u0000\u0349o\u0001\u0000\u0000\u0000\u034a\u0348"+ + "\u0001\u0000\u0000\u0000\u034b\u0350\u0005h\u0000\u0000\u034c\u034d\u0005"+ + ";\u0000\u0000\u034d\u034e\u0003\u00e6s\u0000\u034e\u034f\u0003\u0182\u00c1"+ + "\u0000\u034f\u0351\u0001\u0000\u0000\u0000\u0350\u034c\u0001\u0000\u0000"+ + "\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0353\u0001\u0000\u0000"+ + "\u0000\u0352\u0354\u0003\u00f6{\u0000\u0353\u0352\u0001\u0000\u0000\u0000"+ + "\u0353\u0354\u0001\u0000\u0000\u0000\u0354\u0355\u0001\u0000\u0000\u0000"+ + "\u0355\u0356\u0005i\u0000\u0000\u0356q\u0001\u0000\u0000\u0000\u0357\u035a"+ + "\u0003\u0162\u00b1\u0000\u0358\u035a\u0005e\u0000\u0000\u0359\u0357\u0001"+ + "\u0000\u0000\u0000\u0359\u0358\u0001\u0000\u0000\u0000\u035a\u0363\u0001"+ + "\u0000\u0000\u0000\u035b\u0360\u0005h\u0000\u0000\u035c\u035e\u0003t:"+ + "\u0000\u035d\u035f\u0005m\u0000\u0000\u035e\u035d\u0001\u0000\u0000\u0000"+ + "\u035e\u035f\u0001\u0000\u0000\u0000\u035f\u0361\u0001\u0000\u0000\u0000"+ + "\u0360\u035c\u0001\u0000\u0000\u0000\u0360\u0361\u0001\u0000\u0000\u0000"+ + "\u0361\u0362\u0001\u0000\u0000\u0000\u0362\u0364\u0005i\u0000\u0000\u0363"+ + "\u035b\u0001\u0000\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364"+ + "s\u0001\u0000\u0000\u0000\u0365\u036a\u0003v;\u0000\u0366\u0367\u0005"+ + "m\u0000\u0000\u0367\u0369\u0003v;\u0000\u0368\u0366\u0001\u0000\u0000"+ + "\u0000\u0369\u036c\u0001\u0000\u0000\u0000\u036a\u0368\u0001\u0000\u0000"+ + "\u0000\u036a\u036b\u0001\u0000\u0000\u0000\u036bu\u0001\u0000\u0000\u0000"+ + "\u036c\u036a\u0001\u0000\u0000\u0000\u036d\u036e\u0005e\u0000\u0000\u036e"+ + "\u0370\u0005o\u0000\u0000\u036f\u036d\u0001\u0000\u0000\u0000\u036f\u0370"+ + "\u0001\u0000\u0000\u0000\u0370\u0371\u0001\u0000\u0000\u0000\u0371\u0372"+ + "\u0003\u00a4R\u0000\u0372w\u0001\u0000\u0000\u0000\u0373\u0374\u0005G"+ + "\u0000\u0000\u0374\u0375\u0003\u00a4R\u0000\u0375\u0376\u0005\u000f\u0000"+ + "\u0000\u0376\u0377\u0003r9\u0000\u0377\u0378\u0003\u00f4z\u0000\u0378"+ + "y\u0001\u0000\u0000\u0000\u0379\u037a\u0003\u00c4b\u0000\u037a\u037b\u0005"+ + "\u000f\u0000\u0000\u037b\u038e\u0003\u00c4b\u0000\u037c\u0382\u0005h\u0000"+ + "\u0000\u037d\u037e\u0003\u0082A\u0000\u037e\u037f\u0003\u0182\u00c1\u0000"+ + "\u037f\u0381\u0001\u0000\u0000\u0000\u0380\u037d\u0001\u0000\u0000\u0000"+ + "\u0381\u0384\u0001\u0000\u0000\u0000\u0382\u0380\u0001\u0000\u0000\u0000"+ + "\u0382\u0383\u0001\u0000\u0000\u0000\u0383\u038a\u0001\u0000\u0000\u0000"+ + "\u0384\u0382\u0001\u0000\u0000\u0000\u0385\u0386\u0003|>\u0000\u0386\u0387"+ + "\u0003\u0182\u00c1\u0000\u0387\u0389\u0001\u0000\u0000\u0000\u0388\u0385"+ + "\u0001\u0000\u0000\u0000\u0389\u038c\u0001\u0000\u0000\u0000\u038a\u0388"+ + "\u0001\u0000\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000\u038b\u038d"+ + "\u0001\u0000\u0000\u0000\u038c\u038a\u0001\u0000\u0000\u0000\u038d\u038f"+ + "\u0005i\u0000\u0000\u038e\u037c\u0001\u0000\u0000\u0000\u038e\u038f\u0001"+ + "\u0000\u0000\u0000\u038f{\u0001\u0000\u0000\u0000\u0390\u0392\u0005\u000e"+ + "\u0000\u0000\u0391\u0390\u0001\u0000\u0000\u0000\u0391\u0392\u0001\u0000"+ + "\u0000\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393\u0394\u0003~?\u0000"+ + "\u0394\u0395\u0005e\u0000\u0000\u0395\u0397\u0003\u0148\u00a4\u0000\u0396"+ + "\u0398\u0003\u00f4z\u0000\u0397\u0396\u0001\u0000\u0000\u0000\u0397\u0398"+ + "\u0001\u0000\u0000\u0000\u0398}\u0001\u0000\u0000\u0000\u0399\u039b\u0005"+ + "f\u0000\u0000\u039a\u039c\u0005e\u0000\u0000\u039b\u039a\u0001\u0000\u0000"+ + "\u0000\u039b\u039c\u0001\u0000\u0000\u0000\u039c\u039e\u0001\u0000\u0000"+ + "\u0000\u039d\u039f\u0005\u0087\u0000\u0000\u039e\u039d\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ + "\u0000\u03a0\u03a1\u0003\u0132\u0099\u0000\u03a1\u03a2\u0005g\u0000\u0000"+ + "\u03a2\u007f\u0001\u0000\u0000\u0000\u03a3\u03a9\u0003\u00b4Z\u0000\u03a4"+ + "\u03a5\u0003\u00c4b\u0000\u03a5\u03a6\u0005p\u0000\u0000\u03a6\u03a7\u0005"+ + "e\u0000\u0000\u03a7\u03a9\u0001\u0000\u0000\u0000\u03a8\u03a3\u0001\u0000"+ + "\u0000\u0000\u03a8\u03a4\u0001\u0000\u0000\u0000\u03a9\u0081\u0001\u0000"+ + "\u0000\u0000\u03aa\u03ab\u00058\u0000\u0000\u03ab\u03ac\u0005e\u0000\u0000"+ + "\u03ac\u03af\u0005s\u0000\u0000\u03ad\u03b0\u0003\u0080@\u0000\u03ae\u03b0"+ + "\u0003\u0160\u00b0\u0000\u03af\u03ad\u0001\u0000\u0000\u0000\u03af\u03ae"+ + "\u0001\u0000\u0000\u0000\u03b0\u0083\u0001\u0000\u0000\u0000\u03b1\u03b2"+ + "\u0005/\u0000\u0000\u03b2\u03b3\u0005f\u0000\u0000\u03b3\u03b6\u0003\u00c4"+ + "b\u0000\u03b4\u03b5\u0005m\u0000\u0000\u03b5\u03b7\u0003\u00e8t\u0000"+ + "\u03b6\u03b4\u0001\u0000\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000"+ + "\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u03b9\u0005g\u0000\u0000\u03b9"+ + "\u0085\u0001\u0000\u0000\u0000\u03ba\u03bb\u0005.\u0000\u0000\u03bb\u03bc"+ + "\u0005f\u0000\u0000\u03bc\u03bd\u0003\u00c4b\u0000\u03bd\u03be\u0005g"+ + "\u0000\u0000\u03be\u0087\u0001\u0000\u0000\u0000\u03bf\u03c2\u0003^/\u0000"+ + "\u03c0\u03c3\u0003\u008aE\u0000\u03c1\u03c3\u0003\u008cF\u0000\u03c2\u03c0"+ + "\u0001\u0000\u0000\u0000\u03c2\u03c1\u0001\u0000\u0000\u0000\u03c3\u0089"+ + "\u0001\u0000\u0000\u0000\u03c4\u03c5\u0005M\u0000\u0000\u03c5\u03c7\u0005"+ + "e\u0000\u0000\u03c6\u03c8\u0003\u014e\u00a7\u0000\u03c7\u03c6\u0001\u0000"+ + "\u0000\u0000\u03c7\u03c8\u0001\u0000\u0000\u0000\u03c8\u03c9\u0001\u0000"+ + "\u0000\u0000\u03c9\u03cb\u0003\u0148\u00a4\u0000\u03ca\u03cc\u0003p8\u0000"+ + "\u03cb\u03ca\u0001\u0000\u0000\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000"+ + "\u03cc\u008b\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005M\u0000\u0000\u03ce"+ + "\u03cf\u0003\u009aM\u0000\u03cf\u03d0\u0005e\u0000\u0000\u03d0\u03d2\u0003"+ + "\u0148\u00a4\u0000\u03d1\u03d3\u0003p8\u0000\u03d2\u03d1\u0001\u0000\u0000"+ + "\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u008d\u0001\u0000\u0000"+ + "\u0000\u03d4\u03d7\u0005\u001b\u0000\u0000\u03d5\u03d8\u0003\u0088D\u0000"+ + "\u03d6\u03d8\u0003\u00e0p\u0000\u03d7\u03d5\u0001\u0000\u0000\u0000\u03d7"+ + "\u03d6\u0001\u0000\u0000\u0000\u03d8\u008f\u0001\u0000\u0000\u0000\u03d9"+ + "\u03da\u00058\u0000\u0000\u03da\u03db\u0005e\u0000\u0000\u03db\u03dd\u0003"+ + "\u014c\u00a6\u0000\u03dc\u03de\u0003\u0092I\u0000\u03dd\u03dc\u0001\u0000"+ + "\u0000\u0000\u03dd\u03de\u0001\u0000\u0000\u0000\u03de\u0091\u0001\u0000"+ + "\u0000\u0000\u03df\u03e0\u0005h\u0000\u0000\u03e0\u03e1\u0003\u00a4R\u0000"+ + "\u03e1\u03e2\u0003\u0182\u00c1\u0000\u03e2\u03e3\u0005i\u0000\u0000\u03e3"+ + "\u0093\u0001\u0000\u0000\u0000\u03e4\u03e5\u00058\u0000\u0000\u03e5\u03e6"+ + "\u0003\u009aM\u0000\u03e6\u03e7\u0005e\u0000\u0000\u03e7\u03e9\u0003\u014c"+ + "\u00a6\u0000\u03e8\u03ea\u0003\u0092I\u0000\u03e9\u03e8\u0001\u0000\u0000"+ + "\u0000\u03e9\u03ea\u0001\u0000\u0000\u0000\u03ea\u0095\u0001\u0000\u0000"+ + "\u0000\u03eb\u03f3\u0003\u0006\u0003\u0000\u03ec\u03ef\u0003\u00c4b\u0000"+ + "\u03ed\u03ee\u0005l\u0000\u0000\u03ee\u03f0\u0003\u00e8t\u0000\u03ef\u03ed"+ + "\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0\u03f4"+ + "\u0001\u0000\u0000\u0000\u03f1\u03f2\u0005l\u0000\u0000\u03f2\u03f4\u0003"+ + "\u00e8t\u0000\u03f3\u03ec\u0001\u0000\u0000\u0000\u03f3\u03f1\u0001\u0000"+ + "\u0000\u0000\u03f4\u0097\u0001\u0000\u0000\u0000\u03f5\u03f6\u0003\u0006"+ + "\u0003\u0000\u03f6\u03f7\u0005s\u0000\u0000\u03f7\u03f8\u0003\u00e8t\u0000"+ + "\u03f8\u0099\u0001\u0000\u0000\u0000\u03f9\u03fb\u0005f\u0000\u0000\u03fa"+ + "\u03fc\u0003\b\u0004\u0000\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fb\u03fc"+ + "\u0001\u0000\u0000\u0000\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u03ff"+ + "\u0003\u00c4b\u0000\u03fe\u0400\u0005m\u0000\u0000\u03ff\u03fe\u0001\u0000"+ + "\u0000\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401\u0001\u0000"+ + "\u0000\u0000\u0401\u0402\u0005g\u0000\u0000\u0402\u009b\u0001\u0000\u0000"+ + "\u0000\u0403\u0406\u0003\u009eO\u0000\u0404\u0406\u0003\u00a0P\u0000\u0405"+ + "\u0403\u0001\u0000\u0000\u0000\u0405\u0404\u0001\u0000\u0000\u0000\u0406"+ + "\u009d\u0001\u0000\u0000\u0000\u0407\u0409\u0003\u00e6s\u0000\u0408\u0407"+ + "\u0001\u0000\u0000\u0000\u0408\u0409\u0001\u0000\u0000\u0000\u0409\u040a"+ + "\u0001\u0000\u0000\u0000\u040a\u040b\u0003\u00a2Q\u0000\u040b\u009f\u0001"+ + "\u0000\u0000\u0000\u040c\u040e\u0005\u001b\u0000\u0000\u040d\u040f\u0003"+ + "\u00e6s\u0000\u040e\u040d\u0001\u0000\u0000\u0000\u040e\u040f\u0001\u0000"+ + "\u0000\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0411\u0003\u00a2"+ + "Q\u0000\u0411\u00a1\u0001\u0000\u0000\u0000\u0412\u0414\u0005t\u0000\u0000"+ + "\u0413\u0412\u0001\u0000\u0000\u0000\u0413\u0414\u0001\u0000\u0000\u0000"+ + "\u0414\u0415\u0001\u0000\u0000\u0000\u0415\u0416\u0003\u00c4b\u0000\u0416"+ + "\u00a3\u0001\u0000\u0000\u0000\u0417\u0418\u0006R\uffff\uffff\u0000\u0418"+ + "\u0419\u0007\u0006\u0000\u0000\u0419\u042d\u0003\u00a4R\u000f\u041a\u042d"+ + "\u0003\u00b4Z\u0000\u041b\u041c\u0005\u0019\u0000\u0000\u041c\u041d\u0003"+ + ".\u0017\u0000\u041d\u041e\u0005\u001c\u0000\u0000\u041e\u041f\u0003\u00a4"+ + "R\u0003\u041f\u042d\u0001\u0000\u0000\u0000\u0420\u0421\u0005\u001a\u0000"+ + "\u0000\u0421\u0422\u0003\u0098L\u0000\u0422\u0423\u0005\u001c\u0000\u0000"+ + "\u0423\u0424\u0003\u00a4R\u0002\u0424\u042d\u0001\u0000\u0000\u0000\u0425"+ + "\u0426\u0007\u0007\u0000\u0000\u0426\u0427\u0003&\u0013\u0000\u0427\u0428"+ + "\u0005o\u0000\u0000\u0428\u0429\u0005o\u0000\u0000\u0429\u042a\u0003*"+ + "\u0015\u0000\u042a\u042b\u0003\u00a4R\u0001\u042b\u042d\u0001\u0000\u0000"+ + "\u0000\u042c\u0417\u0001\u0000\u0000\u0000\u042c\u041a\u0001\u0000\u0000"+ + "\u0000\u042c\u041b\u0001\u0000\u0000\u0000\u042c\u0420\u0001\u0000\u0000"+ + "\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042d\u0451\u0001\u0000\u0000"+ + "\u0000\u042e\u042f\n\r\u0000\u0000\u042f\u0430\u0007\b\u0000\u0000\u0430"+ + "\u0450\u0003\u00a4R\u000e\u0431\u0432\n\f\u0000\u0000\u0432\u0433\u0007"+ + "\t\u0000\u0000\u0433\u0450\u0003\u00a4R\r\u0434\u0435\n\u000b\u0000\u0000"+ + "\u0435\u0436\u0007\n\u0000\u0000\u0436\u0450\u0003\u00a4R\f\u0437\u0438"+ + "\n\n\u0000\u0000\u0438\u0439\u0007\u000b\u0000\u0000\u0439\u0450\u0003"+ + "\u00a4R\u000b\u043a\u043b\n\t\u0000\u0000\u043b\u043c\u0007\f\u0000\u0000"+ + "\u043c\u0450\u0003\u00a4R\n\u043d\u043e\n\u0007\u0000\u0000\u043e\u043f"+ + "\u0005v\u0000\u0000\u043f\u0450\u0003\u00a4R\b\u0440\u0441\n\u0006\u0000"+ + "\u0000\u0441\u0442\u0005u\u0000\u0000\u0442\u0450\u0003\u00a4R\u0007\u0443"+ + "\u0444\n\u0005\u0000\u0000\u0444\u0445\u0005\"\u0000\u0000\u0445\u0450"+ + "\u0003\u00a4R\u0005\u0446\u0447\n\u0004\u0000\u0000\u0447\u0448\u0005"+ + "%\u0000\u0000\u0448\u0449\u0003\u00a4R\u0000\u0449\u044a\u0005o\u0000"+ + "\u0000\u044a\u044b\u0003\u00a4R\u0004\u044b\u0450\u0001\u0000\u0000\u0000"+ + "\u044c\u044d\n\b\u0000\u0000\u044d\u044e\u0005\u000f\u0000\u0000\u044e"+ + "\u0450\u0003r9\u0000\u044f\u042e\u0001\u0000\u0000\u0000\u044f\u0431\u0001"+ + "\u0000\u0000\u0000\u044f\u0434\u0001\u0000\u0000\u0000\u044f\u0437\u0001"+ + "\u0000\u0000\u0000\u044f\u043a\u0001\u0000\u0000\u0000\u044f\u043d\u0001"+ + "\u0000\u0000\u0000\u044f\u0440\u0001\u0000\u0000\u0000\u044f\u0443\u0001"+ + "\u0000\u0000\u0000\u044f\u0446\u0001\u0000\u0000\u0000\u044f\u044c\u0001"+ + "\u0000\u0000\u0000\u0450\u0453\u0001\u0000\u0000\u0000\u0451\u044f\u0001"+ + "\u0000\u0000\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452\u00a5\u0001"+ + "\u0000\u0000\u0000\u0453\u0451\u0001\u0000\u0000\u0000\u0454\u0469\u0003"+ + "\u0018\f\u0000\u0455\u0469\u0003\u001a\r\u0000\u0456\u0469\u0003\u00aa"+ + "U\u0000\u0457\u0469\u0003\u00a8T\u0000\u0458\u0469\u0003\u00e0p\u0000"+ + "\u0459\u0469\u0003\u0104\u0082\u0000\u045a\u0469\u0003\u00f8|\u0000\u045b"+ + "\u0469\u0003\u0130\u0098\u0000\u045c\u0469\u0003\u0106\u0083\u0000\u045d"+ + "\u0469\u0003\u0108\u0084\u0000\u045e\u0469\u0003\u010a\u0085\u0000\u045f"+ + "\u0469\u0003\u010c\u0086\u0000\u0460\u0469\u0003\u010e\u0087\u0000\u0461"+ + "\u0469\u0003\u00f4z\u0000\u0462\u0469\u0003\u0110\u0088\u0000\u0463\u0469"+ + "\u0003\u0112\u0089\u0000\u0464\u0469\u0003\u0124\u0092\u0000\u0465\u0469"+ + "\u0003\u00acV\u0000\u0466\u0469\u0003\u00b0X\u0000\u0467\u0469\u0003x"+ + "<\u0000\u0468\u0454\u0001\u0000\u0000\u0000\u0468\u0455\u0001\u0000\u0000"+ + "\u0000\u0468\u0456\u0001\u0000\u0000\u0000\u0468\u0457\u0001\u0000\u0000"+ + "\u0000\u0468\u0458\u0001\u0000\u0000\u0000\u0468\u0459\u0001\u0000\u0000"+ + "\u0000\u0468\u045a\u0001\u0000\u0000\u0000\u0468\u045b\u0001\u0000\u0000"+ + "\u0000\u0468\u045c\u0001\u0000\u0000\u0000\u0468\u045d\u0001\u0000\u0000"+ + "\u0000\u0468\u045e\u0001\u0000\u0000\u0000\u0468\u045f\u0001\u0000\u0000"+ + "\u0000\u0468\u0460\u0001\u0000\u0000\u0000\u0468\u0461\u0001\u0000\u0000"+ + "\u0000\u0468\u0462\u0001\u0000\u0000\u0000\u0468\u0463\u0001\u0000\u0000"+ + "\u0000\u0468\u0464\u0001\u0000\u0000\u0000\u0468\u0465\u0001\u0000\u0000"+ + "\u0000\u0468\u0466\u0001\u0000\u0000\u0000\u0468\u0467\u0001\u0000\u0000"+ + "\u0000\u0469\u00a7\u0001\u0000\u0000\u0000\u046a\u046b\u0005$\u0000\u0000"+ + "\u046b\u046c\u0003\u00a4R\u0000\u046c\u00a9\u0001\u0000\u0000\u0000\u046d"+ + "\u046e\u0005X\u0000\u0000\u046e\u0470\u0003\u00a4R\u0000\u046f\u0471\u0003"+ + "\u00f4z\u0000\u0470\u046f\u0001\u0000\u0000\u0000\u0470\u0471\u0001\u0000"+ + "\u0000\u0000\u0471\u00ab\u0001\u0000\u0000\u0000\u0472\u0473\u0003\u00ae"+ + "W\u0000\u0473\u0474\u0003\u012c\u0096\u0000\u0474\u00ad\u0001\u0000\u0000"+ + "\u0000\u0475\u0476\u0005\f\u0000\u0000\u0476\u0477\u0003\u00a4R\u0000"+ + "\u0477\u0478\u0003\u0182\u00c1\u0000\u0478\u047a\u0001\u0000\u0000\u0000"+ + "\u0479\u0475\u0001\u0000\u0000\u0000\u047a\u047d\u0001\u0000\u0000\u0000"+ + "\u047b\u0479\u0001\u0000\u0000\u0000\u047b\u047c\u0001\u0000\u0000\u0000"+ + "\u047c\u0482\u0001\u0000\u0000\u0000\u047d\u047b\u0001\u0000\u0000\u0000"+ + "\u047e\u047f\u0005\r\u0000\u0000\u047f\u0480\u0003b1\u0000\u0480\u0481"+ + "\u0003\u0182\u00c1\u0000\u0481\u0483\u0001\u0000\u0000\u0000\u0482\u047e"+ + "\u0001\u0000\u0000\u0000\u0482\u0483\u0001\u0000\u0000\u0000\u0483\u00af"+ + "\u0001\u0000\u0000\u0000\u0484\u0485\u0005Q\u0000\u0000\u0485\u048a\u0003"+ + "\u00a4R\u0000\u0486\u0487\u0005Q\u0000\u0000\u0487\u0488\u0007\u0001\u0000"+ + "\u0000\u0488\u048a\u0003.\u0017\u0000\u0489\u0484\u0001\u0000\u0000\u0000"+ + "\u0489\u0486\u0001\u0000\u0000\u0000\u048a\u00b1\u0001\u0000\u0000\u0000"+ + "\u048b\u0494\u0005\u0003\u0000\u0000\u048c\u0494\u0005\u0004\u0000\u0000"+ + "\u048d\u0494\u0005d\u0000\u0000\u048e\u0494\u0003\u015e\u00af\u0000\u048f"+ + "\u0494\u0003\u0174\u00ba\u0000\u0490\u0494\u0005\u0001\u0000\u0000\u0491"+ + "\u0494\u0005\u008f\u0000\u0000\u0492\u0494\u0005\u0090\u0000\u0000\u0493"+ + "\u048b\u0001\u0000\u0000\u0000\u0493\u048c\u0001\u0000\u0000\u0000\u0493"+ + "\u048d\u0001\u0000\u0000\u0000\u0493\u048e\u0001\u0000\u0000\u0000\u0493"+ + "\u048f\u0001\u0000\u0000\u0000\u0493\u0490\u0001\u0000\u0000\u0000\u0493"+ + "\u0491\u0001\u0000\u0000\u0000\u0493\u0492\u0001\u0000\u0000\u0000\u0494"+ + "\u00b3\u0001\u0000\u0000\u0000\u0495\u0496\u0006Z\uffff\uffff\u0000\u0496"+ + "\u04a2\u0003\u015a\u00ad\u0000\u0497\u04a2\u0003\u0156\u00ab\u0000\u0498"+ + "\u04a2\u0003\u017e\u00bf\u0000\u0499\u04a2\u0003 \u0010\u0000\u049a\u04a2"+ + "\u0003\u0086C\u0000\u049b\u04a2\u0003\u0084B\u0000\u049c\u049d\u0007\r"+ + "\u0000\u0000\u049d\u049e\u0005f\u0000\u0000\u049e\u049f\u0003\u00a4R\u0000"+ + "\u049f\u04a0\u0005g\u0000\u0000\u04a0\u04a2\u0001\u0000\u0000\u0000\u04a1"+ + "\u0495\u0001\u0000\u0000\u0000\u04a1\u0497\u0001\u0000\u0000\u0000\u04a1"+ + "\u0498\u0001\u0000\u0000\u0000\u04a1\u0499\u0001\u0000\u0000\u0000\u04a1"+ + "\u049a\u0001\u0000\u0000\u0000\u04a1\u049b\u0001\u0000\u0000\u0000\u04a1"+ + "\u049c\u0001\u0000\u0000\u0000\u04a2\u04b9\u0001\u0000\u0000\u0000\u04a3"+ + "\u04a4\n\t\u0000\u0000\u04a4\u04a5\u0005p\u0000\u0000\u04a5\u04b8\u0005"+ + "e\u0000\u0000\u04a6\u04a7\n\b\u0000\u0000\u04a7\u04b8\u0003\u0178\u00bc"+ + "\u0000\u04a8\u04a9\n\u0007\u0000\u0000\u04a9\u04b8\u0003\u00d0h\u0000"+ + "\u04aa\u04ab\n\u0006\u0000\u0000\u04ab\u04b8\u0003L&\u0000\u04ac\u04ad"+ + "\n\u0005\u0000\u0000\u04ad\u04b8\u0003\u017a\u00bd\u0000\u04ae\u04af\n"+ + "\u0004\u0000\u0000\u04af\u04b8\u0003\u017c\u00be\u0000\u04b0\u04b1\n\u0003"+ + "\u0000\u0000\u04b1\u04b2\u0003\u017c\u00be\u0000\u04b2\u04b3\u0005\u0010"+ + "\u0000\u0000\u04b3\u04b4\u0003r9\u0000\u04b4\u04b8\u0001\u0000\u0000\u0000"+ + "\u04b5\u04b6\n\u0002\u0000\u0000\u04b6\u04b8\u0003\u00ba]\u0000\u04b7"+ + "\u04a3\u0001\u0000\u0000\u0000\u04b7\u04a6\u0001\u0000\u0000\u0000\u04b7"+ + "\u04a8\u0001\u0000\u0000\u0000\u04b7\u04aa\u0001\u0000\u0000\u0000\u04b7"+ + "\u04ac\u0001\u0000\u0000\u0000\u04b7\u04ae\u0001\u0000\u0000\u0000\u04b7"+ + "\u04b0\u0001\u0000\u0000\u0000\u04b7\u04b5\u0001\u0000\u0000\u0000\u04b8"+ + "\u04bb\u0001\u0000\u0000\u0000\u04b9\u04b7\u0001\u0000\u0000\u0000\u04b9"+ + "\u04ba\u0001\u0000\u0000\u0000\u04ba\u00b5\u0001\u0000\u0000\u0000\u04bb"+ + "\u04b9\u0001\u0000\u0000\u0000\u04bc\u04bd\u0003^/\u0000\u04bd\u04be\u0003"+ + "\u00b8\\\u0000\u04be\u00b7\u0001\u0000\u0000\u0000\u04bf\u04c1\u0005M"+ + "\u0000\u0000\u04c0\u04c2\u0005e\u0000\u0000\u04c1\u04c0\u0001\u0000\u0000"+ + "\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0001\u0000\u0000"+ + "\u0000\u04c3\u04c5\u0003\u0148\u00a4\u0000\u04c4\u04c6\u0003p8\u0000\u04c5"+ + "\u04c4\u0001\u0000\u0000\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6"+ + "\u00b9\u0001\u0000\u0000\u0000\u04c7\u04c9\u0005&\u0000\u0000\u04c8\u04ca"+ + "\u0003\u00e8t\u0000\u04c9\u04c8\u0001\u0000\u0000\u0000\u04c9\u04ca\u0001"+ + "\u0000\u0000\u0000\u04ca\u04cc\u0001\u0000\u0000\u0000\u04cb\u04cd\u0005"+ + "m\u0000\u0000\u04cc\u04cb\u0001\u0000\u0000\u0000\u04cc\u04cd\u0001\u0000"+ + "\u0000\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce\u04cf\u0005\'\u0000"+ + "\u0000\u04cf\u00bb\u0001\u0000\u0000\u0000\u04d0\u04d1\u0005N\u0000\u0000"+ + "\u04d1\u04d7\u0005h\u0000\u0000\u04d2\u04d3\u0003\u00be_\u0000\u04d3\u04d4"+ + "\u0003\u0182\u00c1\u0000\u04d4\u04d6\u0001\u0000\u0000\u0000\u04d5\u04d2"+ + "\u0001\u0000\u0000\u0000\u04d6\u04d9\u0001\u0000\u0000\u0000\u04d7\u04d5"+ + "\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04da"+ + "\u0001\u0000\u0000\u0000\u04d9\u04d7\u0001\u0000\u0000\u0000\u04da\u04db"+ + "\u0005i\u0000\u0000\u04db\u00bd\u0001\u0000\u0000\u0000\u04dc\u04e0\u0003"+ + "\u00c2a\u0000\u04dd\u04e0\u0003\u013c\u009e\u0000\u04de\u04e0\u0003\u00c0"+ + "`\u0000\u04df\u04dc\u0001\u0000\u0000\u0000\u04df\u04dd\u0001\u0000\u0000"+ + "\u0000\u04df\u04de\u0001\u0000\u0000\u0000\u04e0\u00bf\u0001\u0000\u0000"+ + "\u0000\u04e1\u04e2\u00058\u0000\u0000\u04e2\u04e3\u0005e\u0000\u0000\u04e3"+ + "\u04e4\u0003\u014c\u00a6\u0000\u04e4\u00c1\u0001\u0000\u0000\u0000\u04e5"+ + "\u04e7\u0005\u001b\u0000\u0000\u04e6\u04e5\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8"+ + "\u04e9\u0003^/\u0000\u04e9\u04ea\u0005e\u0000\u0000\u04ea\u04eb\u0003"+ + "\u014c\u00a6\u0000\u04eb\u04ec\u0003\u014a\u00a5\u0000\u04ec\u04f5\u0001"+ + "\u0000\u0000\u0000\u04ed\u04ef\u0005\u001b\u0000\u0000\u04ee\u04ed\u0001"+ + "\u0000\u0000\u0000\u04ee\u04ef\u0001\u0000\u0000\u0000\u04ef\u04f0\u0001"+ + "\u0000\u0000\u0000\u04f0\u04f1\u0003^/\u0000\u04f1\u04f2\u0005e\u0000"+ + "\u0000\u04f2\u04f3\u0003\u014c\u00a6\u0000\u04f3\u04f5\u0001\u0000\u0000"+ + "\u0000\u04f4\u04e6\u0001\u0000\u0000\u0000\u04f4\u04ee\u0001\u0000\u0000"+ + "\u0000\u04f5\u00c3\u0001\u0000\u0000\u0000\u04f6\u04f8\u0003\u0132\u0099"+ + "\u0000\u04f7\u04f9\u0003\u0178\u00bc\u0000\u04f8\u04f7\u0001\u0000\u0000"+ + "\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u0501\u0001\u0000\u0000"+ + "\u0000\u04fa\u0501\u0003\u00c6c\u0000\u04fb\u0501\u0003P(\u0000\u04fc"+ + "\u04fd\u0005f\u0000\u0000\u04fd\u04fe\u0003\u00c4b\u0000\u04fe\u04ff\u0005"+ + "g\u0000\u0000\u04ff\u0501\u0001\u0000\u0000\u0000\u0500\u04f6\u0001\u0000"+ + "\u0000\u0000\u0500\u04fa\u0001\u0000\u0000\u0000\u0500\u04fb\u0001\u0000"+ + "\u0000\u0000\u0500\u04fc\u0001\u0000\u0000\u0000\u0501\u00c5\u0001\u0000"+ + "\u0000\u0000\u0502\u050c\u0003\u0134\u009a\u0000\u0503\u050c\u0003\u0170"+ + "\u00b8\u0000\u0504\u050c\u0003\u013a\u009d\u0000\u0505\u050c\u0003\u0146"+ + "\u00a3\u0000\u0506\u050c\u0003\u00bc^\u0000\u0507\u050c\u0003\u0140\u00a0"+ + "\u0000\u0508\u050c\u0003\u0142\u00a1\u0000\u0509\u050c\u0003\u0144\u00a2"+ + "\u0000\u050a\u050c\u0003\u00c8d\u0000\u050b\u0502\u0001\u0000\u0000\u0000"+ + "\u050b\u0503\u0001\u0000\u0000\u0000\u050b\u0504\u0001\u0000\u0000\u0000"+ + "\u050b\u0505\u0001\u0000\u0000\u0000\u050b\u0506\u0001\u0000\u0000\u0000"+ + "\u050b\u0507\u0001\u0000\u0000\u0000\u050b\u0508\u0001\u0000\u0000\u0000"+ + "\u050b\u0509\u0001\u0000\u0000\u0000\u050b\u050a\u0001\u0000\u0000\u0000"+ + "\u050c\u00c7\u0001\u0000\u0000\u0000\u050d\u050e\u00058\u0000\u0000\u050e"+ + "\u050f\u0003\u00cae\u0000\u050f\u00c9\u0001\u0000\u0000\u0000\u0510\u051c"+ + "\u0005f\u0000\u0000\u0511\u0516\u0003\u00c4b\u0000\u0512\u0513\u0005m"+ + "\u0000\u0000\u0513\u0515\u0003\u00c4b\u0000\u0514\u0512\u0001\u0000\u0000"+ + "\u0000\u0515\u0518\u0001\u0000\u0000\u0000\u0516\u0514\u0001\u0000\u0000"+ + "\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u051a\u0001\u0000\u0000"+ + "\u0000\u0518\u0516\u0001\u0000\u0000\u0000\u0519\u051b\u0005m\u0000\u0000"+ + "\u051a\u0519\u0001\u0000\u0000\u0000\u051a\u051b\u0001\u0000\u0000\u0000"+ + "\u051b\u051d\u0001\u0000\u0000\u0000\u051c\u0511\u0001\u0000\u0000\u0000"+ + "\u051c\u051d\u0001\u0000\u0000\u0000\u051d\u051e\u0001\u0000\u0000\u0000"+ + "\u051e\u051f\u0005g\u0000\u0000\u051f\u00cb\u0001\u0000\u0000\u0000\u0520"+ + "\u052b\u0003\u0170\u00b8\u0000\u0521\u052b\u0003\u0134\u009a\u0000\u0522"+ + "\u052b\u0003\u00ceg\u0000\u0523\u052b\u0003\u0140\u00a0\u0000\u0524\u052b"+ + "\u0003\u0142\u00a1\u0000\u0525\u052b\u0003P(\u0000\u0526\u0528\u0003\u0132"+ + "\u0099\u0000\u0527\u0529\u0003\u0178\u00bc\u0000\u0528\u0527\u0001\u0000"+ + "\u0000\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u052b\u0001\u0000"+ + "\u0000\u0000\u052a\u0520\u0001\u0000\u0000\u0000\u052a\u0521\u0001\u0000"+ + "\u0000\u0000\u052a\u0522\u0001\u0000\u0000\u0000\u052a\u0523\u0001\u0000"+ + "\u0000\u0000\u052a\u0524\u0001\u0000\u0000\u0000\u052a\u0525\u0001\u0000"+ + "\u0000\u0000\u052a\u0526\u0001\u0000\u0000\u0000\u052b\u00cd\u0001\u0000"+ + "\u0000\u0000\u052c\u052d\u0005j\u0000\u0000\u052d\u052e\u0005t\u0000\u0000"+ + "\u052e\u052f\u0005k\u0000\u0000\u052f\u0530\u0003\u0138\u009c\u0000\u0530"+ + "\u00cf\u0001\u0000\u0000\u0000\u0531\u0541\u0005j\u0000\u0000\u0532\u0534"+ + "\u0003\u00d2i\u0000\u0533\u0532\u0001\u0000\u0000\u0000\u0533\u0534\u0001"+ + "\u0000\u0000\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0537\u0005"+ + "o\u0000\u0000\u0536\u0538\u0003\u00d4j\u0000\u0537\u0536\u0001\u0000\u0000"+ + "\u0000\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0542\u0001\u0000\u0000"+ + "\u0000\u0539\u053b\u0003\u00d2i\u0000\u053a\u0539\u0001\u0000\u0000\u0000"+ + "\u053a\u053b\u0001\u0000\u0000\u0000\u053b\u053c\u0001\u0000\u0000\u0000"+ + "\u053c\u053d\u0005o\u0000\u0000\u053d\u053e\u0003\u00d4j\u0000\u053e\u053f"+ + "\u0005o\u0000\u0000\u053f\u0540\u0003\u00d6k\u0000\u0540\u0542\u0001\u0000"+ + "\u0000\u0000\u0541\u0533\u0001\u0000\u0000\u0000\u0541\u053a\u0001\u0000"+ + "\u0000\u0000\u0542\u0543\u0001\u0000\u0000\u0000\u0543\u0544\u0005k\u0000"+ + "\u0000\u0544\u00d1\u0001\u0000\u0000\u0000\u0545\u0546\u0003\u00a4R\u0000"+ + "\u0546\u00d3\u0001\u0000\u0000\u0000\u0547\u0548\u0003\u00a4R\u0000\u0548"+ + "\u00d5\u0001\u0000\u0000\u0000\u0549\u054a\u0003\u00a4R\u0000\u054a\u00d7"+ + "\u0001\u0000\u0000\u0000\u054b\u054d\u0007\u000e\u0000\u0000\u054c\u054b"+ + "\u0001\u0000\u0000\u0000\u054c\u054d\u0001\u0000\u0000\u0000\u054d\u054e"+ + "\u0001\u0000\u0000\u0000\u054e\u054f\u0005l\u0000\u0000\u054f\u00d9\u0001"+ + "\u0000\u0000\u0000\u0550\u0551\u0003\u00e8t\u0000\u0551\u0552\u0005l\u0000"+ + "\u0000\u0552\u0557\u0001\u0000\u0000\u0000\u0553\u0554\u0003\u0006\u0003"+ + "\u0000\u0554\u0555\u0005s\u0000\u0000\u0555\u0557\u0001\u0000\u0000\u0000"+ + "\u0556\u0550\u0001\u0000\u0000\u0000\u0556\u0553\u0001\u0000\u0000\u0000"+ + "\u0556\u0557\u0001\u0000\u0000\u0000\u0557\u0558\u0001\u0000\u0000\u0000"+ + "\u0558\u0559\u0005]\u0000\u0000\u0559\u055e\u0003\u00a4R\u0000\u055a\u055c"+ + "\u0005J\u0000\u0000\u055b\u055d\u0005e\u0000\u0000\u055c\u055b\u0001\u0000"+ + "\u0000\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055f\u0001\u0000"+ + "\u0000\u0000\u055e\u055a\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000"+ + "\u0000\u0000\u055f\u00db\u0001\u0000\u0000\u0000\u0560\u0561\u0005X\u0000"+ + "\u0000\u0561\u0562\u0005e\u0000\u0000\u0562\u00dd\u0001\u0000\u0000\u0000"+ + "\u0563\u0564\u0003\u0174\u00ba\u0000\u0564\u00df\u0001\u0000\u0000\u0000"+ + "\u0565\u0569\u0003\u00e2q\u0000\u0566\u0569\u0003\u00eau\u0000\u0567\u0569"+ + "\u0003\u00f2y\u0000\u0568\u0565\u0001\u0000\u0000\u0000\u0568\u0566\u0001"+ + "\u0000\u0000\u0000\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u00e1\u0001"+ + "\u0000\u0000\u0000\u056a\u0576\u0005Z\u0000\u0000\u056b\u0577\u0003\u00e4"+ + "r\u0000\u056c\u0572\u0005f\u0000\u0000\u056d\u056e\u0003\u00e4r\u0000"+ + "\u056e\u056f\u0003\u0182\u00c1\u0000\u056f\u0571\u0001\u0000\u0000\u0000"+ + "\u0570\u056d\u0001\u0000\u0000\u0000\u0571\u0574\u0001\u0000\u0000\u0000"+ + "\u0572\u0570\u0001\u0000\u0000\u0000\u0572\u0573\u0001\u0000\u0000\u0000"+ + "\u0573\u0575\u0001\u0000\u0000\u0000\u0574\u0572\u0001\u0000\u0000\u0000"+ + "\u0575\u0577\u0005g\u0000\u0000\u0576\u056b\u0001\u0000\u0000\u0000\u0576"+ + "\u056c\u0001\u0000\u0000\u0000\u0577\u00e3\u0001\u0000\u0000\u0000\u0578"+ + "\u057e\u0003\u00e6s\u0000\u0579\u057b\u0003\u00c4b\u0000\u057a\u0579\u0001"+ + "\u0000\u0000\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u057c\u0001"+ + "\u0000\u0000\u0000\u057c\u057d\u0005l\u0000\u0000\u057d\u057f\u0003\u00e8"+ + "t\u0000\u057e\u057a\u0001\u0000\u0000\u0000\u057e\u057f\u0001\u0000\u0000"+ + "\u0000\u057f\u00e5\u0001\u0000\u0000\u0000\u0580\u0585\u0005e\u0000\u0000"+ + "\u0581\u0582\u0005m\u0000\u0000\u0582\u0584\u0005e\u0000\u0000\u0583\u0581"+ + "\u0001\u0000\u0000\u0000\u0584\u0587\u0001\u0000\u0000\u0000\u0585\u0583"+ + "\u0001\u0000\u0000\u0000\u0585\u0586\u0001\u0000\u0000\u0000\u0586\u00e7"+ + "\u0001\u0000\u0000\u0000\u0587\u0585\u0001\u0000\u0000\u0000\u0588\u058d"+ + "\u0003\u00a4R\u0000\u0589\u058a\u0005m\u0000\u0000\u058a\u058c\u0003\u00a4"+ + "R\u0000\u058b\u0589\u0001\u0000\u0000\u0000\u058c\u058f\u0001\u0000\u0000"+ + "\u0000\u058d\u058b\u0001\u0000\u0000\u0000\u058d\u058e\u0001\u0000\u0000"+ + "\u0000\u058e\u00e9\u0001\u0000\u0000\u0000\u058f\u058d\u0001\u0000\u0000"+ + "\u0000\u0590\u059c\u0005^\u0000\u0000\u0591\u059d\u0003\u00ecv\u0000\u0592"+ + "\u0598\u0005f\u0000\u0000\u0593\u0594\u0003\u00ecv\u0000\u0594\u0595\u0003"+ + "\u0182\u00c1\u0000\u0595\u0597\u0001\u0000\u0000\u0000\u0596\u0593\u0001"+ + "\u0000\u0000\u0000\u0597\u059a\u0001\u0000\u0000\u0000\u0598\u0596\u0001"+ + "\u0000\u0000\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059b\u0001"+ + "\u0000\u0000\u0000\u059a\u0598\u0001\u0000\u0000\u0000\u059b\u059d\u0005"+ + "g\u0000\u0000\u059c\u0591\u0001\u0000\u0000\u0000\u059c\u0592\u0001\u0000"+ + "\u0000\u0000\u059d\u00eb\u0001\u0000\u0000\u0000\u059e\u05a1\u0003\u00ee"+ + "w\u0000\u059f\u05a1\u0003\u00f0x\u0000\u05a0\u059e\u0001\u0000\u0000\u0000"+ + "\u05a0\u059f\u0001\u0000\u0000\u0000\u05a1\u00ed\u0001\u0000\u0000\u0000"+ + "\u05a2\u05a3\u0005e\u0000\u0000\u05a3\u05a4\u0005l\u0000\u0000\u05a4\u05a5"+ + "\u0003\u00c4b\u0000\u05a5\u00ef\u0001\u0000\u0000\u0000\u05a6\u05a8\u0005"+ + "e\u0000\u0000\u05a7\u05a9\u0003\u014e\u00a7\u0000\u05a8\u05a7\u0001\u0000"+ + "\u0000\u0000\u05a8\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000"+ + "\u0000\u0000\u05aa\u05ab\u0003\u00c4b\u0000\u05ab\u00f1\u0001\u0000\u0000"+ + "\u0000\u05ac\u05b8\u0005c\u0000\u0000\u05ad\u05b9\u0003\u0096K\u0000\u05ae"+ + "\u05b4\u0005f\u0000\u0000\u05af\u05b0\u0003\u0096K\u0000\u05b0\u05b1\u0003"+ + "\u0182\u00c1\u0000\u05b1\u05b3\u0001\u0000\u0000\u0000\u05b2\u05af\u0001"+ + "\u0000\u0000\u0000\u05b3\u05b6\u0001\u0000\u0000\u0000\u05b4\u05b2\u0001"+ + "\u0000\u0000\u0000\u05b4\u05b5\u0001\u0000\u0000\u0000\u05b5\u05b7\u0001"+ + "\u0000\u0000\u0000\u05b6\u05b4\u0001\u0000\u0000\u0000\u05b7\u05b9\u0005"+ + "g\u0000\u0000\u05b8\u05ad\u0001\u0000\u0000\u0000\u05b8\u05ae\u0001\u0000"+ + "\u0000\u0000\u05b9\u00f3\u0001\u0000\u0000\u0000\u05ba\u05bc\u0005h\u0000"+ + "\u0000\u05bb\u05bd\u0003\u00f6{\u0000\u05bc\u05bb\u0001\u0000\u0000\u0000"+ + "\u05bc\u05bd\u0001\u0000\u0000\u0000\u05bd\u05be\u0001\u0000\u0000\u0000"+ + "\u05be\u05bf\u0005i\u0000\u0000\u05bf\u00f5\u0001\u0000\u0000\u0000\u05c0"+ + "\u05c2\u0005n\u0000\u0000\u05c1\u05c0\u0001\u0000\u0000\u0000\u05c1\u05c2"+ + "\u0001\u0000\u0000\u0000\u05c2\u05c8\u0001\u0000\u0000\u0000\u05c3\u05c5"+ + "\u0005\u009f\u0000\u0000\u05c4\u05c3\u0001\u0000\u0000\u0000\u05c4\u05c5"+ + "\u0001\u0000\u0000\u0000\u05c5\u05c8\u0001\u0000\u0000\u0000\u05c6\u05c8"+ + "\u0004{\u0012\u0000\u05c7\u05c1\u0001\u0000\u0000\u0000\u05c7\u05c4\u0001"+ + "\u0000\u0000\u0000\u05c7\u05c6\u0001\u0000\u0000\u0000\u05c8\u05c9\u0001"+ + "\u0000\u0000\u0000\u05c9\u05ca\u0003\u00a6S\u0000\u05ca\u05cb\u0003\u0182"+ + "\u00c1\u0000\u05cb\u05cd\u0001\u0000\u0000\u0000\u05cc\u05c7\u0001\u0000"+ + "\u0000\u0000\u05cd\u05ce\u0001\u0000\u0000\u0000\u05ce\u05cc\u0001\u0000"+ + "\u0000\u0000\u05ce\u05cf\u0001\u0000\u0000\u0000\u05cf\u00f7\u0001\u0000"+ + "\u0000\u0000\u05d0\u05d6\u0003\u00fc~\u0000\u05d1\u05d6\u0003\u00fe\u007f"+ + "\u0000\u05d2\u05d6\u0003\u0100\u0080\u0000\u05d3\u05d6\u0003\u00fa}\u0000"+ + "\u05d4\u05d6\u0003\u0098L\u0000\u05d5\u05d0\u0001\u0000\u0000\u0000\u05d5"+ + "\u05d1\u0001\u0000\u0000\u0000\u05d5\u05d2\u0001\u0000\u0000\u0000\u05d5"+ + "\u05d3\u0001\u0000\u0000\u0000\u05d5\u05d4\u0001\u0000\u0000\u0000\u05d6"+ + "\u00f9\u0001\u0000\u0000\u0000\u05d7\u05d8\u0003\u00a4R\u0000\u05d8\u00fb"+ + "\u0001\u0000\u0000\u0000\u05d9\u05da\u0003\u00a4R\u0000\u05da\u05db\u0005"+ + "\u0089\u0000\u0000\u05db\u05dc\u0003\u00a4R\u0000\u05dc\u00fd\u0001\u0000"+ + "\u0000\u0000\u05dd\u05de\u0003\u00a4R\u0000\u05de\u05df\u0007\u000f\u0000"+ + "\u0000\u05df\u00ff\u0001\u0000\u0000\u0000\u05e0\u05e1\u0003\u00e8t\u0000"+ + "\u05e1\u05e2\u0003\u00d8l\u0000\u05e2\u05e3\u0003\u00e8t\u0000\u05e3\u0101"+ + "\u0001\u0000\u0000\u0000\u05e4\u05e5\u0007\u0010\u0000\u0000\u05e5\u0103"+ + "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0005e\u0000\u0000\u05e7\u05e9\u0005"+ + "o\u0000\u0000\u05e8\u05ea\u0003\u00a6S\u0000\u05e9\u05e8\u0001\u0000\u0000"+ + "\u0000\u05e9\u05ea\u0001\u0000\u0000\u0000\u05ea\u0105\u0001\u0000\u0000"+ + "\u0000\u05eb\u05ed\u0005b\u0000\u0000\u05ec\u05ee\u0003\u00e8t\u0000\u05ed"+ + "\u05ec\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000\u05ee"+ + "\u0107\u0001\u0000\u0000\u0000\u05ef\u05f1\u0005K\u0000\u0000\u05f0\u05f2"+ + "\u0005e\u0000\u0000\u05f1\u05f0\u0001\u0000\u0000\u0000\u05f1\u05f2\u0001"+ + "\u0000\u0000\u0000\u05f2\u0109\u0001\u0000\u0000\u0000\u05f3\u05f5\u0005"+ + "_\u0000\u0000\u05f4\u05f6\u0005e\u0000\u0000\u05f5\u05f4\u0001\u0000\u0000"+ + "\u0000\u05f5\u05f6\u0001\u0000\u0000\u0000\u05f6\u010b\u0001\u0000\u0000"+ + "\u0000\u05f7\u05f8\u0005W\u0000\u0000\u05f8\u05f9\u0005e\u0000\u0000\u05f9"+ + "\u010d\u0001\u0000\u0000\u0000\u05fa\u05fb\u0005[\u0000\u0000\u05fb\u010f"+ + "\u0001\u0000\u0000\u0000\u05fc\u0605\u0005\\\u0000\u0000\u05fd\u0606\u0003"+ + "\u00a4R\u0000\u05fe\u05ff\u0003\u0182\u00c1\u0000\u05ff\u0600\u0003\u00a4"+ + "R\u0000\u0600\u0606\u0001\u0000\u0000\u0000\u0601\u0602\u0003\u00f8|\u0000"+ + "\u0602\u0603\u0003\u0182\u00c1\u0000\u0603\u0604\u0003\u00a4R\u0000\u0604"+ + "\u0606\u0001\u0000\u0000\u0000\u0605\u05fd\u0001\u0000\u0000\u0000\u0605"+ + "\u05fe\u0001\u0000\u0000\u0000\u0605\u0601\u0001\u0000\u0000\u0000\u0606"+ + "\u0607\u0001\u0000\u0000\u0000\u0607\u060d\u0003\u00f4z\u0000\u0608\u060b"+ + "\u0005V\u0000\u0000\u0609\u060c\u0003\u0110\u0088\u0000\u060a\u060c\u0003"+ + "\u00f4z\u0000\u060b\u0609\u0001\u0000\u0000\u0000\u060b\u060a\u0001\u0000"+ + "\u0000\u0000\u060c\u060e\u0001\u0000\u0000\u0000\u060d\u0608\u0001\u0000"+ + "\u0000\u0000\u060d\u060e\u0001\u0000\u0000\u0000\u060e\u0111\u0001\u0000"+ + "\u0000\u0000\u060f\u0612\u0003\u0114\u008a\u0000\u0610\u0612\u0003\u011a"+ + "\u008d\u0000\u0611\u060f\u0001\u0000\u0000\u0000\u0611\u0610\u0001\u0000"+ + "\u0000\u0000\u0612\u0113\u0001\u0000\u0000\u0000\u0613\u061e\u0005Y\u0000"+ + "\u0000\u0614\u0616\u0003\u00a4R\u0000\u0615\u0614\u0001\u0000\u0000\u0000"+ + "\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u061f\u0001\u0000\u0000\u0000"+ + "\u0617\u0619\u0003\u00f8|\u0000\u0618\u0617\u0001\u0000\u0000\u0000\u0618"+ + "\u0619\u0001\u0000\u0000\u0000\u0619\u061a\u0001\u0000\u0000\u0000\u061a"+ + "\u061c\u0003\u0182\u00c1\u0000\u061b\u061d\u0003\u00a4R\u0000\u061c\u061b"+ + "\u0001\u0000\u0000\u0000\u061c\u061d\u0001\u0000\u0000\u0000\u061d\u061f"+ + "\u0001\u0000\u0000\u0000\u061e\u0615\u0001\u0000\u0000\u0000\u061e\u0618"+ + "\u0001\u0000\u0000\u0000\u061f\u0620\u0001\u0000\u0000\u0000\u0620\u0624"+ + "\u0005h\u0000\u0000\u0621\u0623\u0003\u0116\u008b\u0000\u0622\u0621\u0001"+ + "\u0000\u0000\u0000\u0623\u0626\u0001\u0000\u0000\u0000\u0624\u0622\u0001"+ + "\u0000\u0000\u0000\u0624\u0625\u0001\u0000\u0000\u0000\u0625\u0627\u0001"+ + "\u0000\u0000\u0000\u0626\u0624\u0001\u0000\u0000\u0000\u0627\u0628\u0005"+ + "i\u0000\u0000\u0628\u0115\u0001\u0000\u0000\u0000\u0629\u062a\u0003\u0118"+ + "\u008c\u0000\u062a\u062c\u0005o\u0000\u0000\u062b\u062d\u0003\u00f6{\u0000"+ + "\u062c\u062b\u0001\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000"+ + "\u062d\u0117\u0001\u0000\u0000\u0000\u062e\u062f\u0005P\u0000\u0000\u062f"+ + "\u0632\u0003\u00e8t\u0000\u0630\u0632\u0005L\u0000\u0000\u0631\u062e\u0001"+ + "\u0000\u0000\u0000\u0631\u0630\u0001\u0000\u0000\u0000\u0632\u0119\u0001"+ + "\u0000\u0000\u0000\u0633\u063c\u0005Y\u0000\u0000\u0634\u063d\u0003\u011c"+ + "\u008e\u0000\u0635\u0636\u0003\u0182\u00c1\u0000\u0636\u0637\u0003\u011c"+ + "\u008e\u0000\u0637\u063d\u0001\u0000\u0000\u0000\u0638\u0639\u0003\u00f8"+ + "|\u0000\u0639\u063a\u0003\u0182\u00c1\u0000\u063a\u063b\u0003\u011c\u008e"+ + "\u0000\u063b\u063d\u0001\u0000\u0000\u0000\u063c\u0634\u0001\u0000\u0000"+ + "\u0000\u063c\u0635\u0001\u0000\u0000\u0000\u063c\u0638\u0001\u0000\u0000"+ + "\u0000\u063d\u063e\u0001\u0000\u0000\u0000\u063e\u0642\u0005h\u0000\u0000"+ + "\u063f\u0641\u0003\u011e\u008f\u0000\u0640\u063f\u0001\u0000\u0000\u0000"+ + "\u0641\u0644\u0001\u0000\u0000\u0000\u0642\u0640\u0001\u0000\u0000\u0000"+ + "\u0642\u0643\u0001\u0000\u0000\u0000\u0643\u0645\u0001\u0000\u0000\u0000"+ + "\u0644\u0642\u0001\u0000\u0000\u0000\u0645\u0646\u0005i\u0000\u0000\u0646"+ + "\u011b\u0001\u0000\u0000\u0000\u0647\u0648\u0005e\u0000\u0000\u0648\u064a"+ + "\u0005s\u0000\u0000\u0649\u0647\u0001\u0000\u0000\u0000\u0649\u064a\u0001"+ + "\u0000\u0000\u0000\u064a\u064b\u0001\u0000\u0000\u0000\u064b\u064c\u0003"+ + "\u00b4Z\u0000\u064c\u064d\u0005p\u0000\u0000\u064d\u064e\u0005f\u0000"+ + "\u0000\u064e\u064f\u0005^\u0000\u0000\u064f\u0650\u0005g\u0000\u0000\u0650"+ + "\u011d\u0001\u0000\u0000\u0000\u0651\u0652\u0003\u0120\u0090\u0000\u0652"+ + "\u0654\u0005o\u0000\u0000\u0653\u0655\u0003\u00f6{\u0000\u0654\u0653\u0001"+ + "\u0000\u0000\u0000\u0654\u0655\u0001\u0000\u0000\u0000\u0655\u011f\u0001"+ + "\u0000\u0000\u0000\u0656\u0657\u0005P\u0000\u0000\u0657\u065a\u0003\u0122"+ + "\u0091\u0000\u0658\u065a\u0005L\u0000\u0000\u0659\u0656\u0001\u0000\u0000"+ + "\u0000\u0659\u0658\u0001\u0000\u0000\u0000\u065a\u0121\u0001\u0000\u0000"+ + "\u0000\u065b\u065e\u0003\u00c4b\u0000\u065c\u065e\u0005d\u0000\u0000\u065d"+ + "\u065b\u0001\u0000\u0000\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065e"+ + "\u0666\u0001\u0000\u0000\u0000\u065f\u0662\u0005m\u0000\u0000\u0660\u0663"+ + "\u0003\u00c4b\u0000\u0661\u0663\u0005d\u0000\u0000\u0662\u0660\u0001\u0000"+ + "\u0000\u0000\u0662\u0661\u0001\u0000\u0000\u0000\u0663\u0665\u0001\u0000"+ + "\u0000\u0000\u0664\u065f\u0001\u0000\u0000\u0000\u0665\u0668\u0001\u0000"+ + "\u0000\u0000\u0666\u0664\u0001\u0000\u0000\u0000\u0666\u0667\u0001\u0000"+ + "\u0000\u0000\u0667\u0123\u0001\u0000\u0000\u0000\u0668\u0666\u0001\u0000"+ + "\u0000\u0000\u0669\u066a\u0005O\u0000\u0000\u066a\u066e\u0005h\u0000\u0000"+ + "\u066b\u066d\u0003\u0126\u0093\u0000\u066c\u066b\u0001\u0000\u0000\u0000"+ + "\u066d\u0670\u0001\u0000\u0000\u0000\u066e\u066c\u0001\u0000\u0000\u0000"+ + "\u066e\u066f\u0001\u0000\u0000\u0000\u066f\u0671\u0001\u0000\u0000\u0000"+ + "\u0670\u066e\u0001\u0000\u0000\u0000\u0671\u0672\u0005i\u0000\u0000\u0672"+ + "\u0125\u0001\u0000\u0000\u0000\u0673\u0674\u0003\u0128\u0094\u0000\u0674"+ + "\u0676\u0005o\u0000\u0000\u0675\u0677\u0003\u00f6{\u0000\u0676\u0675\u0001"+ + "\u0000\u0000\u0000\u0676\u0677\u0001\u0000\u0000\u0000\u0677\u0127\u0001"+ + "\u0000\u0000\u0000\u0678\u067b\u0005P\u0000\u0000\u0679\u067c\u0003\u00fc"+ + "~\u0000\u067a\u067c\u0003\u012a\u0095\u0000\u067b\u0679\u0001\u0000\u0000"+ + "\u0000\u067b\u067a\u0001\u0000\u0000\u0000\u067c\u067f\u0001\u0000\u0000"+ + "\u0000\u067d\u067f\u0005L\u0000\u0000\u067e\u0678\u0001\u0000\u0000\u0000"+ + "\u067e\u067d\u0001\u0000\u0000\u0000\u067f\u0129\u0001\u0000\u0000\u0000"+ + "\u0680\u0681\u0003\u00e8t\u0000\u0681\u0682\u0005l\u0000\u0000\u0682\u0687"+ + "\u0001\u0000\u0000\u0000\u0683\u0684\u0003\u00e6s\u0000\u0684\u0685\u0005"+ + "s\u0000\u0000\u0685\u0687\u0001\u0000\u0000\u0000\u0686\u0680\u0001\u0000"+ + "\u0000\u0000\u0686\u0683\u0001\u0000\u0000\u0000\u0686\u0687\u0001\u0000"+ + "\u0000\u0000\u0687\u0688\u0001\u0000\u0000\u0000\u0688\u0689\u0003\u00a4"+ + "R\u0000\u0689\u012b\u0001\u0000\u0000\u0000\u068a\u0692\u0005`\u0000\u0000"+ + "\u068b\u068d\u0003\u00a4R\u0000\u068c\u068b\u0001\u0000\u0000\u0000\u068c"+ + "\u068d\u0001\u0000\u0000\u0000\u068d\u0693\u0001\u0000\u0000\u0000\u068e"+ + "\u0693\u0003\u012e\u0097\u0000\u068f\u0691\u0003\u00dam\u0000\u0690\u068f"+ + "\u0001\u0000\u0000\u0000\u0690\u0691\u0001\u0000\u0000\u0000\u0691\u0693"+ + "\u0001\u0000\u0000\u0000\u0692\u068c\u0001\u0000\u0000\u0000\u0692\u068e"+ + "\u0001\u0000\u0000\u0000\u0692\u0690\u0001\u0000\u0000\u0000\u0693\u0694"+ + "\u0001\u0000\u0000\u0000\u0694\u0695\u0003\u00f4z\u0000\u0695\u012d\u0001"+ + "\u0000\u0000\u0000\u0696\u0698\u0003\u00f8|\u0000\u0697\u0696\u0001\u0000"+ + "\u0000\u0000\u0697\u0698\u0001\u0000\u0000\u0000\u0698\u0699\u0001\u0000"+ + "\u0000\u0000\u0699\u069b\u0003\u0182\u00c1\u0000\u069a\u069c\u0003\u00a4"+ + "R\u0000\u069b\u069a\u0001\u0000\u0000\u0000\u069b\u069c\u0001\u0000\u0000"+ + "\u0000\u069c\u069d\u0001\u0000\u0000\u0000\u069d\u069f\u0003\u0182\u00c1"+ + "\u0000\u069e\u06a0\u0003\u00f8|\u0000\u069f\u069e\u0001\u0000\u0000\u0000"+ + "\u069f\u06a0\u0001\u0000\u0000\u0000\u06a0\u012f\u0001\u0000\u0000\u0000"+ + "\u06a1\u06a2\u0005R\u0000\u0000\u06a2\u06a3\u0003\u00a4R\u0000\u06a3\u0131"+ + "\u0001\u0000\u0000\u0000\u06a4\u06a7\u0003\u0162\u00b1\u0000\u06a5\u06a7"+ + "\u0005e\u0000\u0000\u06a6\u06a4\u0001\u0000\u0000\u0000\u06a6\u06a5\u0001"+ + "\u0000\u0000\u0000\u06a7\u0133\u0001\u0000\u0000\u0000\u06a8\u06a9\u0005"+ + "j\u0000\u0000\u06a9\u06aa\u0003\u0136\u009b\u0000\u06aa\u06ab\u0005k\u0000"+ + "\u0000\u06ab\u06ac\u0003\u0138\u009c\u0000\u06ac\u0135\u0001\u0000\u0000"+ + "\u0000\u06ad\u06ae\u0003\u00a4R\u0000\u06ae\u0137\u0001\u0000\u0000\u0000"+ + "\u06af\u06b0\u0003\u00c4b\u0000\u06b0\u0139\u0001\u0000\u0000\u0000\u06b1"+ + "\u06b2\u0005\u0087\u0000\u0000\u06b2\u06b3\u0003\u00c4b\u0000\u06b3\u013b"+ + "\u0001\u0000\u0000\u0000\u06b4\u06b9\u0003\u013e\u009f\u0000\u06b5\u06b6"+ + "\u0005}\u0000\u0000\u06b6\u06b8\u0003\u013e\u009f\u0000\u06b7\u06b5\u0001"+ + "\u0000\u0000\u0000\u06b8\u06bb\u0001\u0000\u0000\u0000\u06b9\u06b7\u0001"+ + "\u0000\u0000\u0000\u06b9\u06ba\u0001\u0000\u0000\u0000\u06ba\u013d\u0001"+ + "\u0000\u0000\u0000\u06bb\u06b9\u0001\u0000\u0000\u0000\u06bc\u06bd\u0003"+ + "\u00c4b\u0000\u06bd\u013f\u0001\u0000\u0000\u0000\u06be\u06bf\u0005j\u0000"+ + "\u0000\u06bf\u06c0\u0005k\u0000\u0000\u06c0\u06c1\u0003\u0138\u009c\u0000"+ + "\u06c1\u0141\u0001\u0000\u0000\u0000\u06c2\u06c3\u0005S\u0000\u0000\u06c3"+ + "\u06c4\u0005j\u0000\u0000\u06c4\u06c5\u0003\u00c4b\u0000\u06c5\u06c6\u0005"+ + "k\u0000\u0000\u06c6\u06c7\u0003\u0138\u009c\u0000\u06c7\u0143\u0001\u0000"+ + "\u0000\u0000\u06c8\u06ce\u0005U\u0000\u0000\u06c9\u06ca\u0005U\u0000\u0000"+ + "\u06ca\u06ce\u0005\u0089\u0000\u0000\u06cb\u06cc\u0005\u0089\u0000\u0000"+ + "\u06cc\u06ce\u0005U\u0000\u0000\u06cd\u06c8\u0001\u0000\u0000\u0000\u06cd"+ + "\u06c9\u0001\u0000\u0000\u0000\u06cd\u06cb\u0001\u0000\u0000\u0000\u06ce"+ + "\u06cf\u0001\u0000\u0000\u0000\u06cf\u06d0\u0003\u0138\u009c\u0000\u06d0"+ + "\u0145\u0001\u0000\u0000\u0000\u06d1\u06d2\u0005M\u0000\u0000\u06d2\u06d3"+ + "\u0003\u0148\u00a4\u0000\u06d3\u0147\u0001\u0000\u0000\u0000\u06d4\u06d5"+ + "\u0003\u014c\u00a6\u0000\u06d5\u06d6\u0003\u014a\u00a5\u0000\u06d6\u06d9"+ + "\u0001\u0000\u0000\u0000\u06d7\u06d9\u0003\u014c\u00a6\u0000\u06d8\u06d4"+ + "\u0001\u0000\u0000\u0000\u06d8\u06d7\u0001\u0000\u0000\u0000\u06d9\u0149"+ + "\u0001\u0000\u0000\u0000\u06da\u06dd\u0003\u014c\u00a6\u0000\u06db\u06dd"+ + "\u0003\u00c4b\u0000\u06dc\u06da\u0001\u0000\u0000\u0000\u06dc\u06db\u0001"+ + "\u0000\u0000\u0000\u06dd\u014b\u0001\u0000\u0000\u0000\u06de\u06ea\u0005"+ + "f\u0000\u0000\u06df\u06e4\u0003\u009cN\u0000\u06e0\u06e1\u0005m\u0000"+ + "\u0000\u06e1\u06e3\u0003\u009cN\u0000\u06e2\u06e0\u0001\u0000\u0000\u0000"+ + "\u06e3\u06e6\u0001\u0000\u0000\u0000\u06e4\u06e2\u0001\u0000\u0000\u0000"+ + "\u06e4\u06e5\u0001\u0000\u0000\u0000\u06e5\u06e8\u0001\u0000\u0000\u0000"+ + "\u06e6\u06e4\u0001\u0000\u0000\u0000\u06e7\u06e9\u0005m\u0000\u0000\u06e8"+ + "\u06e7\u0001\u0000\u0000\u0000\u06e8\u06e9\u0001\u0000\u0000\u0000\u06e9"+ + "\u06eb\u0001\u0000\u0000\u0000\u06ea\u06df\u0001\u0000\u0000\u0000\u06ea"+ + "\u06eb\u0001\u0000\u0000\u0000\u06eb\u06ec\u0001\u0000\u0000\u0000\u06ec"+ + "\u06ed\u0005g\u0000\u0000\u06ed\u014d\u0001\u0000\u0000\u0000\u06ee\u06ef"+ + "\u0005j\u0000\u0000\u06ef\u06f1\u0003\u0150\u00a8\u0000\u06f0\u06f2\u0005"+ + "m\u0000\u0000\u06f1\u06f0\u0001\u0000\u0000\u0000\u06f1\u06f2\u0001\u0000"+ + "\u0000\u0000\u06f2\u06f3\u0001\u0000\u0000\u0000\u06f3\u06f4\u0005k\u0000"+ + "\u0000\u06f4\u014f\u0001\u0000\u0000\u0000\u06f5\u06fa\u0003\u0152\u00a9"+ + "\u0000\u06f6\u06f7\u0005m\u0000\u0000\u06f7\u06f9\u0003\u0152\u00a9\u0000"+ + "\u06f8\u06f6\u0001\u0000\u0000\u0000\u06f9\u06fc\u0001\u0000\u0000\u0000"+ + "\u06fa\u06f8\u0001\u0000\u0000\u0000\u06fa\u06fb\u0001\u0000\u0000\u0000"+ + "\u06fb\u0151\u0001\u0000\u0000\u0000\u06fc\u06fa\u0001\u0000\u0000\u0000"+ + "\u06fd\u06fe\u0003\u00e6s\u0000\u06fe\u06ff\u0003\u0154\u00aa\u0000\u06ff"+ + "\u0153\u0001\u0000\u0000\u0000\u0700\u0701\u0003\u013c\u009e\u0000\u0701"+ + "\u0155\u0001\u0000\u0000\u0000\u0702\u0703\u0003\u00c4b\u0000\u0703\u0704"+ + "\u0005f\u0000\u0000\u0704\u0706\u0003\u00a4R\u0000\u0705\u0707\u0005m"+ + "\u0000\u0000\u0706\u0705\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000"+ + "\u0000\u0000\u0707\u0708\u0001\u0000\u0000\u0000\u0708\u0709\u0005g\u0000"+ + "\u0000\u0709\u0157\u0001\u0000\u0000\u0000\u070a\u0710\u0003\u00c6c\u0000"+ + "\u070b\u070c\u0005f\u0000\u0000\u070c\u070d\u0003\u0158\u00ac\u0000\u070d"+ + "\u070e\u0005g\u0000\u0000\u070e\u0710\u0001\u0000\u0000\u0000\u070f\u070a"+ + "\u0001\u0000\u0000\u0000\u070f\u070b\u0001\u0000\u0000\u0000\u0710\u0159"+ + "\u0001\u0000\u0000\u0000\u0711\u0718\u0003\u015c\u00ae\u0000\u0712\u0718"+ + "\u0003\u0160\u00b0\u0000\u0713\u0714\u0005f\u0000\u0000\u0714\u0715\u0003"+ + "\u00a4R\u0000\u0715\u0716\u0005g\u0000\u0000\u0716\u0718\u0001\u0000\u0000"+ + "\u0000\u0717\u0711\u0001\u0000\u0000\u0000\u0717\u0712\u0001\u0000\u0000"+ + "\u0000\u0717\u0713\u0001\u0000\u0000\u0000\u0718\u015b\u0001\u0000\u0000"+ + "\u0000\u0719\u071d\u0003\u00b2Y\u0000\u071a\u071d\u0003\u0164\u00b2\u0000"+ + "\u071b\u071d\u0003\u00b6[\u0000\u071c\u0719\u0001\u0000\u0000\u0000\u071c"+ + "\u071a\u0001\u0000\u0000\u0000\u071c\u071b\u0001\u0000\u0000\u0000\u071d"+ + "\u015d\u0001\u0000\u0000\u0000\u071e\u071f\u0007\u0011\u0000\u0000\u071f"+ + "\u015f\u0001\u0000\u0000\u0000\u0720\u0721\u0005e\u0000\u0000\u0721\u0161"+ + "\u0001\u0000\u0000\u0000\u0722\u0723\u0005e\u0000\u0000\u0723\u0724\u0005"+ + "p\u0000\u0000\u0724\u0725\u0005e\u0000\u0000\u0725\u0163\u0001\u0000\u0000"+ + "\u0000\u0726\u0727\u0003\u00ccf\u0000\u0727\u0728\u0003\u0166\u00b3\u0000"+ + "\u0728\u0165\u0001\u0000\u0000\u0000\u0729\u072e\u0005h\u0000\u0000\u072a"+ + "\u072c\u0003\u0168\u00b4\u0000\u072b\u072d\u0005m\u0000\u0000\u072c\u072b"+ + "\u0001\u0000\u0000\u0000\u072c\u072d\u0001\u0000\u0000\u0000\u072d\u072f"+ + "\u0001\u0000\u0000\u0000\u072e\u072a\u0001\u0000\u0000\u0000\u072e\u072f"+ + "\u0001\u0000\u0000\u0000\u072f\u0730\u0001\u0000\u0000\u0000\u0730\u0731"+ + "\u0005i\u0000\u0000\u0731\u0167\u0001\u0000\u0000\u0000\u0732\u0737\u0003"+ + "\u016a\u00b5\u0000\u0733\u0734\u0005m\u0000\u0000\u0734\u0736\u0003\u016a"+ + "\u00b5\u0000\u0735\u0733\u0001\u0000\u0000\u0000\u0736\u0739\u0001\u0000"+ + "\u0000\u0000\u0737\u0735\u0001\u0000\u0000\u0000\u0737\u0738\u0001\u0000"+ + "\u0000\u0000\u0738\u0169\u0001\u0000\u0000\u0000\u0739\u0737\u0001\u0000"+ + "\u0000\u0000\u073a\u073b\u0003\u016c\u00b6\u0000\u073b\u073c\u0005o\u0000"+ + "\u0000\u073c\u073e\u0001\u0000\u0000\u0000\u073d\u073a\u0001\u0000\u0000"+ + "\u0000\u073d\u073e\u0001\u0000\u0000\u0000\u073e\u073f\u0001\u0000\u0000"+ + "\u0000\u073f\u0740\u0003\u016e\u00b7\u0000\u0740\u016b\u0001\u0000\u0000"+ + "\u0000\u0741\u0744\u0003\u00a4R\u0000\u0742\u0744\u0003\u0166\u00b3\u0000"+ + "\u0743\u0741\u0001\u0000\u0000\u0000\u0743\u0742\u0001\u0000\u0000\u0000"+ + "\u0744\u016d\u0001\u0000\u0000\u0000\u0745\u0748\u0003\u00a4R\u0000\u0746"+ + "\u0748\u0003\u0166\u00b3\u0000\u0747\u0745\u0001\u0000\u0000\u0000\u0747"+ + "\u0746\u0001\u0000\u0000\u0000\u0748\u016f\u0001\u0000\u0000\u0000\u0749"+ + "\u074a\u0005T\u0000\u0000\u074a\u0750\u0005h\u0000\u0000\u074b\u074c\u0003"+ + "\u0172\u00b9\u0000\u074c\u074d\u0003\u0182\u00c1\u0000\u074d\u074f\u0001"+ + "\u0000\u0000\u0000\u074e\u074b\u0001\u0000\u0000\u0000\u074f\u0752\u0001"+ + "\u0000\u0000\u0000\u0750\u074e\u0001\u0000\u0000\u0000\u0750\u0751\u0001"+ + "\u0000\u0000\u0000\u0751\u0753\u0001\u0000\u0000\u0000\u0752\u0750\u0001"+ + "\u0000\u0000\u0000\u0753\u0754\u0005i\u0000\u0000\u0754\u0171\u0001\u0000"+ + "\u0000\u0000\u0755\u0756\u0003\u00e6s\u0000\u0756\u0757\u0003\u00c4b\u0000"+ + "\u0757\u075a\u0001\u0000\u0000\u0000\u0758\u075a\u0003\u0176\u00bb\u0000"+ + "\u0759\u0755\u0001\u0000\u0000\u0000\u0759\u0758\u0001\u0000\u0000\u0000"+ + "\u075a\u075c\u0001\u0000\u0000\u0000\u075b\u075d\u0003\u0174\u00ba\u0000"+ + "\u075c\u075b\u0001\u0000\u0000\u0000\u075c\u075d\u0001\u0000\u0000\u0000"+ + "\u075d\u0173\u0001\u0000\u0000\u0000\u075e\u075f\u0007\u0012\u0000\u0000"+ + "\u075f\u0175\u0001\u0000\u0000\u0000\u0760\u0762\u0005\u0087\u0000\u0000"+ + "\u0761\u0760\u0001\u0000\u0000\u0000\u0761\u0762\u0001\u0000\u0000\u0000"+ + "\u0762\u0763\u0001\u0000\u0000\u0000\u0763\u0765\u0003\u0132\u0099\u0000"+ + "\u0764\u0766\u0003\u0178\u00bc\u0000\u0765\u0764\u0001\u0000\u0000\u0000"+ + "\u0765\u0766\u0001\u0000\u0000\u0000\u0766\u0177\u0001\u0000\u0000\u0000"+ + "\u0767\u0768\u0005j\u0000\u0000\u0768\u076d\u0003\u00a4R\u0000\u0769\u076a"+ + "\u0005m\u0000\u0000\u076a\u076c\u0003\u00a4R\u0000\u076b\u0769\u0001\u0000"+ + "\u0000\u0000\u076c\u076f\u0001\u0000\u0000\u0000\u076d\u076b\u0001\u0000"+ + "\u0000\u0000\u076d\u076e\u0001\u0000\u0000\u0000\u076e\u0771\u0001\u0000"+ + "\u0000\u0000\u076f\u076d\u0001\u0000\u0000\u0000\u0770\u0772\u0005m\u0000"+ + "\u0000\u0771\u0770\u0001\u0000\u0000\u0000\u0771\u0772\u0001\u0000\u0000"+ + "\u0000\u0772\u0773\u0001\u0000\u0000\u0000\u0773\u0774\u0005k\u0000\u0000"+ + "\u0774\u0179\u0001\u0000\u0000\u0000\u0775\u0776\u0005p\u0000\u0000\u0776"+ + "\u0777\u0005f\u0000\u0000\u0777\u0778\u0003\u00c4b\u0000\u0778\u0779\u0005"+ + "g\u0000\u0000\u0779\u017b\u0001\u0000\u0000\u0000\u077a\u0789\u0005f\u0000"+ + "\u0000\u077b\u0782\u0003\u00e8t\u0000\u077c\u077f\u0003\u0158\u00ac\u0000"+ + "\u077d\u077e\u0005m\u0000\u0000\u077e\u0780\u0003\u00e8t\u0000\u077f\u077d"+ + "\u0001\u0000\u0000\u0000\u077f\u0780\u0001\u0000\u0000\u0000\u0780\u0782"+ + "\u0001\u0000\u0000\u0000\u0781\u077b\u0001\u0000\u0000\u0000\u0781\u077c"+ + "\u0001\u0000\u0000\u0000\u0782\u0784\u0001\u0000\u0000\u0000\u0783\u0785"+ + "\u0005t\u0000\u0000\u0784\u0783\u0001\u0000\u0000\u0000\u0784\u0785\u0001"+ + "\u0000\u0000\u0000\u0785\u0787\u0001\u0000\u0000\u0000\u0786\u0788\u0005"+ + "m\u0000\u0000\u0787\u0786\u0001\u0000\u0000\u0000\u0787\u0788\u0001\u0000"+ + "\u0000\u0000\u0788\u078a\u0001\u0000\u0000\u0000\u0789\u0781\u0001\u0000"+ + "\u0000\u0000\u0789\u078a\u0001\u0000\u0000\u0000\u078a\u078b\u0001\u0000"+ + "\u0000\u0000\u078b\u078c\u0005g\u0000\u0000\u078c\u017d\u0001\u0000\u0000"+ + "\u0000\u078d\u078e\u0003\u0158\u00ac\u0000\u078e\u078f\u0005p\u0000\u0000"+ + "\u078f\u0790\u0005e\u0000\u0000\u0790\u017f\u0001\u0000\u0000\u0000\u0791"+ + "\u0792\u0003\u00c4b\u0000\u0792\u0181\u0001\u0000\u0000\u0000\u0793\u0798"+ + "\u0005n\u0000\u0000\u0794\u0798\u0005\u0000\u0000\u0001\u0795\u0798\u0005"+ + "\u009f\u0000\u0000\u0796\u0798\u0004\u00c1\u0013\u0000\u0797\u0793\u0001"+ + "\u0000\u0000\u0000\u0797\u0794\u0001\u0000\u0000\u0000\u0797\u0795\u0001"+ + "\u0000\u0000\u0000\u0797\u0796\u0001\u0000\u0000\u0000\u0798\u0183\u0001"+ + "\u0000\u0000\u0000\u00cb\u0192\u0197\u019e\u01a8\u01ae\u01b4\u01be\u01c8"+ + "\u01d6\u01da\u01e3\u01ef\u01f3\u01f9\u0202\u020c\u021d\u022b\u022f\u0236"+ + "\u023e\u0247\u0267\u026f\u0287\u029a\u02a9\u02b6\u02bf\u02cd\u02d6\u02e2"+ + "\u02f7\u02fe\u0303\u0308\u0312\u0315\u0319\u031d\u0325\u032d\u0332\u033a"+ + "\u033c\u0341\u0348\u0350\u0353\u0359\u035e\u0360\u0363\u036a\u036f\u0382"+ + "\u038a\u038e\u0391\u0397\u039b\u039e\u03a8\u03af\u03b6\u03c2\u03c7\u03cb"+ + "\u03d2\u03d7\u03dd\u03e9\u03ef\u03f3\u03fb\u03ff\u0405\u0408\u040e\u0413"+ + "\u042c\u044f\u0451\u0468\u0470\u047b\u0482\u0489\u0493\u04a1\u04b7\u04b9"+ + "\u04c1\u04c5\u04c9\u04cc\u04d7\u04df\u04e6\u04ee\u04f4\u04f8\u0500\u050b"+ + "\u0516\u051a\u051c\u0528\u052a\u0533\u0537\u053a\u0541\u054c\u0556\u055c"+ + "\u055e\u0568\u0572\u0576\u057a\u057e\u0585\u058d\u0598\u059c\u05a0\u05a8"+ + "\u05b4\u05b8\u05bc\u05c1\u05c4\u05c7\u05ce\u05d5\u05e9\u05ed\u05f1\u05f5"+ + "\u0605\u060b\u060d\u0611\u0615\u0618\u061c\u061e\u0624\u062c\u0631\u063c"+ + "\u0642\u0649\u0654\u0659\u065d\u0662\u0666\u066e\u0676\u067b\u067e\u0686"+ + "\u068c\u0690\u0692\u0697\u069b\u069f\u06a6\u06b9\u06cd\u06d8\u06dc\u06e4"+ + "\u06e8\u06ea\u06f1\u06fa\u0706\u070f\u0717\u071c\u072c\u072e\u0737\u073d"+ + "\u0743\u0747\u0750\u0759\u075c\u0761\u0765\u076d\u0771\u077f\u0781\u0784"+ + "\u0787\u0789\u0797"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 52b9990df..f8af9f180 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from S:/GitHub/gobra/src/main/antlr4\GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -908,6 +908,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitInterfaceType(GobraParser.InterfaceTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceElem(GobraParser.InterfaceElemContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1069,6 +1076,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitTypeSpec(GobraParser.TypeSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAliasDecl(GobraParser.AliasDeclContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeDef(GobraParser.TypeDefContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1328,6 +1349,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitPointerType(GobraParser.PointerTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeElem(GobraParser.TypeElemContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeTerm(GobraParser.TypeTermContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1377,6 +1412,34 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitParameters(GobraParser.ParametersContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeParameters(GobraParser.TypeParametersContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeParamList(GobraParser.TypeParamListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeParamDecl(GobraParser.TypeParamDeclContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeConstraint(GobraParser.TypeConstraintContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 352f76c5e..2cc05fdcb 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from src/main/antlr4/GobraParser.g4 by ANTLR 4.12.0 +// Generated from S:/GitHub/gobra/src/main/antlr4\GobraParser.g4 by ANTLR 4.12.0 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -815,6 +815,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitInterfaceType(GobraParser.InterfaceTypeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#interfaceElem}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceElem(GobraParser.InterfaceElemContext ctx); /** * Visit a parse tree produced by {@link GobraParser#predicateSpec}. * @param ctx the parse tree @@ -953,6 +959,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitTypeSpec(GobraParser.TypeSpecContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#aliasDecl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAliasDecl(GobraParser.AliasDeclContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeDef}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeDef(GobraParser.TypeDefContext ctx); /** * Visit a parse tree produced by {@link GobraParser#varDecl}. * @param ctx the parse tree @@ -1175,6 +1193,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitPointerType(GobraParser.PointerTypeContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeElem}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeElem(GobraParser.TypeElemContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeTerm}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeTerm(GobraParser.TypeTermContext ctx); /** * Visit a parse tree produced by {@link GobraParser#sliceType}. * @param ctx the parse tree @@ -1217,6 +1247,30 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitParameters(GobraParser.ParametersContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeParameters}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeParameters(GobraParser.TypeParametersContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeParamList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeParamList(GobraParser.TypeParamListContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeParamDecl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeParamDecl(GobraParser.TypeParamDeclContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeConstraint}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeConstraint(GobraParser.TypeConstraintContext ctx); /** * Visit a parse tree produced by {@link GobraParser#conversion}. * @param ctx the parse tree diff --git a/src/main/resources/builtin/builtin.gobra b/src/main/resources/builtin/builtin.gobra index 9680d28e2..8d92f0b59 100644 --- a/src/main/resources/builtin/builtin.gobra +++ b/src/main/resources/builtin/builtin.gobra @@ -10,6 +10,8 @@ package builtin type any = interface{} +type comparable interface{} + type error interface { pred ErrorMem() diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index eb543ed16..6b1c787c7 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -165,6 +165,10 @@ case class PConstSpec(typ: Option[PType], right: Vector[PExpression], left: Vect case class PVarDecl(typ: Option[PType], right: Vector[PExpression], left: Vector[PDefLikeId], addressable: Vector[Boolean]) extends PActualMember with PActualStatement with PGhostifiableStatement with PGhostifiableMember with PDeclaration +sealed trait PWithTypeParameters { + def typeParameters: Vector[PTypeParameter] +} + sealed trait PFunctionOrClosureDecl extends PScope { def args: Vector[PParameter] def result: PResult @@ -178,11 +182,12 @@ sealed trait PFunctionOrMethodDecl extends PNode with PScope { case class PFunctionDecl( id: PIdnDef, + typeParameters: Vector[PTypeParameter], args: Vector[PParameter], result: PResult, spec: PFunctionSpec, body: Option[(PBodyParameterInfo, PBlock)] - ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl + ) extends PFunctionOrClosureDecl with PActualMember with PCodeRootWithResult with PWithBody with PGhostifiableMember with PFunctionOrMethodDecl with PWithTypeParameters case class PMethodDecl( id: PIdnDef, @@ -200,7 +205,7 @@ sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostif def right: PType } -case class PTypeDef(right: PType, left: PIdnDef) extends PTypeDecl +case class PTypeDef(typeParameters: Vector[PTypeParameter], right: PType, left: PIdnDef) extends PTypeDecl with PScope with PWithTypeParameters case class PTypeAlias(right: PType, left: PIdnDef) extends PTypeDecl @@ -475,7 +480,8 @@ case class PInvoke(base: PExpressionOrType, args: Vector[PExpression], spec: Opt case class PDot(base: PExpressionOrType, id: PIdnUse) extends PActualExpression with PActualType with PExpressionAndType with PAssignee with PLiteralType with PNameOrDot with PTypeName -case class PIndexedExp(base: PExpression, index: PExpression) extends PActualExpression with PAssignee + +case class PIndexedExp(base: PExpression, index: Vector[PExpressionOrType]) extends PActualExpression with PActualType with PExpressionAndType with PAssignee /** * Represents Go's built-in "len(`exp`)" function that returns the @@ -616,21 +622,32 @@ case class PPredConstructor(id: PPredConstructorBase, args: Vector[Option[PExpre * Types */ -sealed trait PType extends PNode with PExpressionOrType +sealed trait PType extends PNode with PExpressionOrType with PTypeTerm sealed trait PActualType extends PType sealed trait PLiteralType extends PNode +sealed trait PParameterizedType extends PActualType { + def typeName: PTypeName + def typeArgs: Vector[PType] +} + /** * Represents a named type in Go. * @see [[https://go.dev/ref/spec#TypeName]] **/ -sealed trait PTypeName extends PActualType { +sealed trait PTypeName extends PActualType with PLiteralType { def id : PUseLikeId val name: String = id.name } +case class PParameterizedTypeName(typeName: PTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PLiteralType + +case class PParameterizedUnqualifiedTypeName(typeName: PUnqualifiedTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PUnqualifiedTypeName { + override def id: PUseLikeId = typeName.id +} + /** * Represents a type name without a qualifier, e.g. "`int`" or "`MyCustomType`". */ @@ -677,6 +694,7 @@ sealed trait PFloatType extends PType case class PFloat32() extends PPredeclaredType("float32") with PFloatType case class PFloat64() extends PPredeclaredType("float64") with PFloatType + // TODO: add more types // TODO: ellipsis type @@ -747,14 +765,16 @@ case class PFunctionType(args: Vector[PParameter], result: PResult) extends PTyp case class PPredType(args: Vector[PType]) extends PTypeLit case class PInterfaceType( - embedded: Vector[PInterfaceName], + embedded: Vector[PTypeElement], methSpecs: Vector[PMethodSig], predSpecs: Vector[PMPredicateSig] ) extends PTypeLit with PUnorderedScope sealed trait PInterfaceClause extends PNode -case class PInterfaceName(typ: PTypeName) extends PInterfaceClause +case class PTypeElement(terms: Vector[PTypeTerm]) extends PInterfaceClause + +sealed trait PTypeTerm extends PNode // Felix: I see `isGhost` as part of the declaration and not as port of the specification. // In the past, I usually created some ghost wrapper for these cases, but I wanted to get rid of them in the future. @@ -847,6 +867,7 @@ case class PEmbeddedName(typ: PUnqualifiedTypeName) extends PEmbeddedType case class PEmbeddedPointer(typ: PUnqualifiedTypeName) extends PEmbeddedType +case class PTypeParameter(id: PIdnDef, constraint: PInterfaceType) extends PNode /** * Ghost diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 3a6cfdc9c..ecd97d6de 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -20,9 +20,12 @@ object AstPattern { sealed trait Type extends Pattern - case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic + case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity, typeArgs: Vector[PType] = Vector()) extends Type with Symbolic with Parameterizable { + override def withTypeArgs(typeArgs: Vector[PType]): Parameterizable = NamedType(id, symb, typeArgs) + } case class PointerType(base: PType) extends Type case class AdtClause(id: PIdnUse, symb: st.AdtClause) extends Type with Symbolic + case class TypeArgument(id: PIdnUse, symb: st.TypeParameter) extends Type with Symbolic case class BuiltInType(id: PIdnUse, symb: st.BuiltInType) extends Type with Symbolic @@ -54,7 +57,15 @@ object AstPattern { def id: PIdnUse } - case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic + sealed trait Parameterizable extends Pattern { + def typeArgs: Vector[PType] + + def withTypeArgs(typeArgs: Vector[PType]): Parameterizable + } + + case class Function(id: PIdnUse, symb: st.Function, typeArgs: Vector[PType] = Vector()) extends FunctionKind with Symbolic with Parameterizable { + override def withTypeArgs(typeArgs: Vector[PType]): Function = Function(id, symb, typeArgs) + } case class Closure(id: PIdnUse, symb: st.Closure) extends FunctionKind with Symbolic case class DomainFunction(id: PIdnUse, symb: st.DomainFunction) extends FunctionKind with Symbolic case class ReceivedMethod(recv: PExpression, id: PIdnUse, path: Vector[MemberPath], symb: st.Method) extends FunctionKind with Symbolic diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 1a750fa88..185cf8cf1 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -50,6 +50,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case n: PInterfaceClause => showInterfaceClause(n) case n: PBodyParameterInfo => showBodyParameterInfo(n) case n: PTerminationMeasure => showTerminationMeasure(n) + case n: PTypeParameter => showTypeParameter(n) case PPos(_) => emptyDoc } @@ -106,8 +107,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case n: PConstDecl => showConstDecl(n) case n: PVarDecl => showVarDecl(n) case n: PTypeDecl => showTypeDecl(n) - case PFunctionDecl(id, args, res, spec, body) => - showSpec(spec) <> "func" <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) <> + case PFunctionDecl(id, typeParameters, args, res, spec, body) => + showSpec(spec) <> "func" <+> showId(id) <> showTypeParameters(typeParameters) <> parens(showParameterList(args)) <> showResult(res) <> opt(body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) case PMethodDecl(id, rec, args, res, spec, body) => showSpec(spec) <> "func" <+> showReceiver(rec) <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) <> @@ -176,9 +177,18 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showList[T](list: Vector[T])(f: T => Doc): Doc = ssep(list map f, comma <> space) + def showTypeParameters(typeParameters: Vector[PTypeParameter]): Doc = + if (typeParameters.nonEmpty) brackets(ssep(typeParameters map showTypeParameter, comma <> space)) else emptyDoc + + def showTypeParameter(typeParameter: PTypeParameter): Doc = + showId(typeParameter.id) <+> showType(typeParameter.constraint) + + def showTypeArguments(typeArgs: Vector[PType]): Doc = + if (typeArgs.nonEmpty) brackets(ssep(typeArgs map showType, comma <> space)) else emptyDoc + def showFunctionLit(lit: PFunctionLit): Doc = lit match { case PFunctionLit(id, PClosureDecl(args, result, spec, body)) => - showSpec(spec) <> "func" <> id.fold(emptyDoc)(id => emptyDoc <+> showId(id)) <> parens(showParameterList(args)) <> showResult(result) <> + showSpec(spec) <> "func" <> id.fold(emptyDoc)(id => emptyDoc <+> showId(id)) <> parens(showParameterList(args)) <> showResult(result) <> opt(body)(b => space <> showBodyParameterInfoWithBlock(b._1, b._2)) } @@ -198,7 +208,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showTypeDecl(decl: PTypeDecl): Doc = decl match { - case PTypeDef(right, left) => "type" <+> showId(left) <+> showType(right) + case PTypeDef(typeParameters, right, left) => "type" <+> showId(left) <> showTypeParameters(typeParameters) <+> showType(right) case PTypeAlias(right, left) => "type" <+> showId(left) <+> "=" <+> showType(right) } @@ -454,7 +464,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PCompositeLit(typ, lit) => showLiteralType(typ) <+> showLiteralValue(lit) case lit: PFunctionLit => showFunctionLit(lit) case PInvoke(base, args, spec) => showExprOrType(base) <> parens(showExprList(args)) <> opt(spec)(s => emptyDoc <+> "as" <+> showMisc(s)) - case PIndexedExp(base, index) => showExpr(base) <> brackets(showExpr(index)) + case PIndexedExp(base, index) => showExprOrType(base) <> brackets(showList(index)(showExprOrType)) case PSliceExp(base, low, high, cap) => { val lowP = low.fold(emptyDoc)(showExpr) @@ -591,7 +601,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // types + def showParameterizedType(typ: PParameterizedType): Doc = { + showType(typ.typeName) <> showTypeArguments(typ.typeArgs) + } + def showType(typ: PType): Doc = typ match { + case t: PParameterizedType => showParameterizedType(t) case t: PActualType => showActualType(t) case t: PGhostType => showGhostType(t) } @@ -622,6 +637,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PMapType(key, elem) => "map" <> brackets(showType(key)) <> showType(elem) case PDeref(base) => "*" <> showExprOrType(base) case PDot(base, id) => showExprOrType(base) <> "." <> showId(id) + case PIndexedExp(base, index) => showExprOrType(base) <> brackets(showList(index)(showExprOrType)) case channelType: PChannelType => channelType match { case PBiChannelType(elem) => "chan" <+> showType(elem) case PSendChannelType(elem) => "chan" <> "<-" <+> showType(elem) @@ -674,13 +690,21 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showInterfaceClause(n: PInterfaceClause): Doc = n match { - case PInterfaceName(typ) => showType(typ) + case t: PTypeElement => showTypeElement(t) case PMethodSig(id, args, result, spec, isGhost) => (if (isGhost) "ghost" <> line else emptyDoc) <> showSpec(spec) <> showId(id) <> parens(showParameterList(args)) <> showResult(result) case PMPredicateSig(id, args) => "pred" <+> showId(id) <> parens(showParameterList(args)) } + def showTypeElement(n: PTypeElement): Doc = { + ssep(n.terms map showTypeTerm, space <> verticalbar <> space) + } + + def showTypeTerm(n: PTypeTerm): Doc = n match { + case t: PType => showType(t) + } + // ids def showId(id: PIdnNode): Doc = id.name @@ -741,8 +765,8 @@ class ShortPrettyPrinter extends DefaultPrettyPrinter { case n: PConstDecl => showConstDecl(n) case n: PVarDecl => showVarDecl(n) case n: PTypeDecl => showTypeDecl(n) - case PFunctionDecl(id, args, res, spec, _) => - showSpec(spec) <> "func" <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) + case PFunctionDecl(id, typeParameters, args, res, spec, _) => + showSpec(spec) <> "func" <+> showId(id) <> showTypeParameters(typeParameters) <> parens(showParameterList(args)) <> showResult(res) case PMethodDecl(id, rec, args, res, spec, _) => showSpec(spec) <> "func" <+> showReceiver(rec) <+> showId(id) <> parens(showParameterList(args)) <> showResult(res) } diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index a23f14046..c78e0ce7c 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1376,6 +1376,14 @@ case object SortT extends PrettyType("sort") { override def withAddressability(newAddressability: Addressability): SortT.type = SortT } +case class TypeParameterT(name: String, addressability: Addressability) extends PrettyType(s"$name") { + override def equalsWithoutMod(t: Type): Boolean = t match { + case TypeParameterT(n, _) => n == name + case _ => false + } + override def withAddressability(newAddressability: Addressability): Type = TypeParameterT(name, newAddressability) +} + /** * The type of `length`-sized arrays of elements of type `typ`. */ diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 9a0704d51..0b41a766e 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -294,7 +294,7 @@ object Desugar extends LazyLogging { def closureSpecD(ctx: FunctionContext, info: TypeInfo)(s: PClosureSpecInstance): in.ClosureSpec = { val (funcTypeInfo, fArgs, proxy) = info.resolve(s.func) match { - case Some(ap.Function(id, symb)) => (symb.context.getTypeInfo, symb.decl.args, functionProxy(id, info)) + case Some(ap.Function(id, symb, _)) => (symb.context.getTypeInfo, symb.decl.args, functionProxy(id, info)) case Some(ap.Closure(id, symb)) => (symb.context.getTypeInfo, symb.lit.args, functionLitProxyD(id, info)) case _ => violation("expected function or function literal") } @@ -2081,7 +2081,7 @@ object Desugar extends LazyLogging { } def getFunctionProxy(f: ap.FunctionKind, args: Vector[in.Expr]): in.FunctionProxy = f match { - case ap.Function(id, _) => functionProxy(id, info) + case ap.Function(id, _, _) => functionProxy(id, info) case ap.BuiltInFunction(_, symb) => functionProxy(symb.tag, args.map(_.typ))(src) case c => Violation.violation(s"This case should be unreachable, but got $c") } @@ -2279,7 +2279,7 @@ object Desugar extends LazyLogging { * This method encodes closure calls, i.e. calls of the type c(_) as _, where c is a closure expression (and not a function/method proxy). */ def closureCallDAux(ctx: FunctionContext, info: TypeInfo)(expr: PInvoke)(src: Meta): Writer[Either[(Vector[in.LocalVar], in.Stmt), in.Expr]] = { val (func, isPure) = info.resolve(expr.spec.get.func) match { - case Some(ap.Function(_, f)) => (f, f.isPure) + case Some(ap.Function(_, f, _)) => (f, f.isPure) case Some(ap.Closure(_, c)) => (c, c.isPure) case _ => violation("expected function or function literal") } @@ -2455,8 +2455,13 @@ object Desugar extends LazyLogging { } yield in.IndexedExp(dbase, dindex, baseUnderlyingType)(src) } - def indexedExprD(expr : PIndexedExp)(ctx : FunctionContext, info : TypeInfo) : Writer[in.IndexedExp] = - indexedExprD(expr.base, expr.index)(ctx, info)(meta(expr, info)) + def indexedExprD(expr : PIndexedExp)(ctx : FunctionContext, info : TypeInfo) : Writer[in.IndexedExp] = { + info.resolve(expr) match { + case Some(indexedExpr@ap.IndexedExp(_, _)) => indexedExprD(indexedExpr)(ctx, info)(meta(expr, info)) + // TODO handle instantiated generic functions here in the future + } + } + def indexedExprD(expr : ap.IndexedExp)(ctx : FunctionContext, info : TypeInfo)(src : Meta) : Writer[in.IndexedExp] = indexedExprD(expr.base, expr.index)(ctx, info)(src) @@ -3775,7 +3780,6 @@ object Desugar extends LazyLogging { in.AdtClauseT(idName(t.decl.id, t.context.getTypeInfo), adt, fields, addrMod) case Type.PredT(args) => in.PredT(args.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) - case Type.FunctionT(args, result) => val res = result match { case InternalTupleT(r) => r @@ -3805,6 +3809,8 @@ object Desugar extends LazyLogging { case Type.PermissionT => in.PermissionT(addrMod) + case Type.TypeParameterT(id, _, _) => in.TypeParameterT(id.name, addrMod) + case _ => Violation.violation(s"got unexpected type $t") } @@ -4148,7 +4154,7 @@ object Desugar extends LazyLogging { */ private def closureImplProofD(ctx: FunctionContext)(proof: PClosureImplProof): Writer[in.Stmt] = { val (func, funcTypeInfo) = info.resolve(proof.impl.spec.func) match { - case Some(ap.Function(_, f)) => (f, f.context.getTypeInfo) + case Some(ap.Function(_, f, _)) => (f, f.context.getTypeInfo) case Some(ap.Closure(_, c)) => (c, c.context.getTypeInfo) case _ => violation("expected function member or literal") } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index c63d3911d..c6bd8135c 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -19,6 +19,7 @@ import viper.gobra.util.Violation.violation import scala.StringContext.InvalidEscapeException import scala.annotation.unused +import scala.collection.convert.ImplicitConversions.`iterable AsScalaIterable` import scala.collection.mutable.ListBuffer import scala.jdk.CollectionConverters._ @@ -208,6 +209,22 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole //region Types + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitType_(ctx: Type_Context): PType = { + visitChildren(ctx) match { + case Vector(typeName: PTypeName, index: Vector[PType]) => PParameterizedTypeName(typeName, index) + case typeName: PTypeName => typeName + case typeLit: PTypeLit => typeLit + case pType: PType => pType + case _ => fail(ctx) + } + } + override def visitTypeName(ctx: GobraParser.TypeNameContext): PTypeName = { visitChildren(ctx) match { case idnUse(id) => visitTypeIdentifier(id) // replace with `PNamedOperand(id)` when arrays etc. of custom types are supported @@ -320,8 +337,12 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitEmbeddedField(ctx: EmbeddedFieldContext): PEmbeddedType = { visitChildren(ctx) match { case name : PUnqualifiedTypeName => PEmbeddedName(name) + case Vector(name: PUnqualifiedTypeName, index: Vector[PType]) => + PEmbeddedName(PParameterizedUnqualifiedTypeName(name, index)) case Vector("*", name : PUnqualifiedTypeName) => PEmbeddedPointer(name) - case _ : PDot | Vector("*", _ : PDot) => fail(ctx, "Imported types are not yet supported as embedded interface names") + case Vector("*", name : PUnqualifiedTypeName, index: Vector[PType]) => + PEmbeddedPointer(PParameterizedUnqualifiedTypeName(name, index)) + case _ : PDot | Vector(_: PDot, _: Vector[PType]) | Vector("*", _ : PDot) | Vector("*", _ :PDot, _ : Vector[PType]) => fail(ctx, "Imported types are not yet supported as embedded interface names") } } //endregion @@ -406,16 +427,24 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitInterfaceType(ctx: GobraParser.InterfaceTypeContext): PInterfaceType = { - val methodDecls = visitListNode[PMethodSig](ctx.methodSpec()) - val embedded = visitListNode[PTypeName](ctx.typeName()).map { - case tn: PUnqualifiedTypeName => PInterfaceName(tn).at(ctx) - case _: PDot => fail(ctx, "Imported types are not yet supported as embedded fields.") - case _ => fail(ctx, s"Interface embeds predeclared type.") - } - val predicateDecls = visitListNode[PMPredicateSig](ctx.predicateSpec()) + val methodDecls = visitNodeIf[PMethodSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.methodSpec())) + val embedded = visitNodeIf[PTypeElement, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.typeElem())) + val predicateDecls = visitNodeIf[PMPredicateSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.predicateSpec())) PInterfaceType(embedded, methodDecls, predicateDecls).at(ctx) } + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitTypeElem(ctx: TypeElemContext): PTypeElement = { + PTypeElement(visitListNode[PTypeTerm](ctx.typeTerm()).map { + case _: PDot => fail(ctx, "Imported types are not yet supported as embedded fields.") + case x => x + }).at(ctx) + } /** * {@inheritDoc } @@ -725,21 +754,65 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@inheritDoc } * *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

+ * {@link # visitChildren} on {@code ctx}.

*/ - override def visitTypeSpec(ctx: GobraParser.TypeSpecContext): PTypeDecl = { + override def visitAliasDecl(ctx: AliasDeclContext): PTypeDecl = { val left = goIdnDef.get(ctx.IDENTIFIER()) val right = visitNode[PType](ctx.type_()) - if (ctx.ASSIGN() != null) { - // = -> This is a type alias - PTypeAlias(right, left).at(ctx) - } else { - // -> This is a type definition - PTypeDef(right, left).at(ctx) + + PTypeAlias(right, left).at(ctx) + } + + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitTypeDef(ctx: TypeDefContext): PTypeDecl = { + visitChildren(ctx) match { + case Vector(goIdnDef(id), typeParameters: Vector[PTypeParameter], pType: PType) => PTypeDef(typeParameters, pType, id).at(ctx) + case Vector(goIdnDef(id), pType: PType) => PTypeDef(Vector(), pType, id).at(ctx) } } + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitTypeParameters(ctx: TypeParametersContext): Vector[PTypeParameter] = super.visitTypeParameters(ctx) match { + case Vector("[", typeParamList: Vector[PTypeParameter], "]") => typeParamList + } + + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitTypeParamList(ctx: TypeParamListContext): Vector[PTypeParameter] = { + ctx.typeParamDecl().asScala.flatMap(typeParamDeclCtx => visitTypeParamDecl(typeParamDeclCtx)).toVector + } + + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitTypeParamDecl(ctx: TypeParamDeclContext): Vector[PTypeParameter] = { + visitChildren(ctx) match { + case Vector(idnDefList(identifierList), PTypeElement(Vector(t: PInterfaceType))) => + identifierList.map(id => PTypeParameter(id, t).at(id)) + case Vector(idnDefList(identifierList), typeConstraint: PTypeElement) => + // embed non interface type constraint in interface + identifierList.map(id => PTypeParameter(id, PInterfaceType(Vector(typeConstraint), Vector(), Vector()).at(typeConstraint)).at(id)) + } + } + /** * {@inheritDoc } * @@ -821,8 +894,8 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } override def visitSpecMember(ctx: SpecMemberContext): AnyRef = super.visitSpecMember(ctx) match { - case Vector(spec : PFunctionSpec, (id: PIdnDef, args: Vector[PParameter@unchecked], result: PResult, body: Option[(PBodyParameterInfo, PBlock)@unchecked])) - => PFunctionDecl(id, args, result, spec, body) + case Vector(spec : PFunctionSpec, (id: PIdnDef, typeParameters: Vector[PTypeParameter], args: Vector[PParameter@unchecked], result: PResult, body: Option[(PBodyParameterInfo, PBlock)@unchecked])) + => PFunctionDecl(id, typeParameters, args, result, spec, body) case Vector(spec : PFunctionSpec, (id: PIdnDef, receiver: PReceiver, args: Vector[PParameter@unchecked], result: PResult, body: Option[(PBodyParameterInfo, PBlock)@unchecked])) => PMethodDecl(id, receiver, args, result, spec, body) } @@ -833,13 +906,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * @param ctx the parse tree * @return the visitor result */ - override def visitFunctionDecl(ctx: GobraParser.FunctionDeclContext): (PIdnDef, Vector[PParameter], PResult, Option[(PBodyParameterInfo, PBlock)]) = { + override def visitFunctionDecl(ctx: FunctionDeclContext): (PIdnDef, Vector[PTypeParameter], Vector[PParameter], PResult, Option[(PBodyParameterInfo, PBlock)]) = { // Go allows the blank identifier here, but PFunctionDecl doesn't. val id = goIdnDef.get(ctx.IDENTIFIER()) + val typeParameters = if (has(ctx.typeParameters())) visitNode[Vector[PTypeParameter]](ctx.typeParameters()) else Vector.empty val sig = visitNode[Signature](ctx.signature()) // Translate the function body if the function is not abstract or trusted, specOnly isn't set or the function is pure val body = if (has(ctx.blockWithBodyParameterInfo()) && !ctx.trusted && (!specOnly || ctx.pure)) Some(visitNode[(PBodyParameterInfo, PBlock)](ctx.blockWithBodyParameterInfo())) else None - (id, sig._1, sig._2, body) + (id, typeParameters, sig._1, sig._2, body) } @@ -1064,6 +1138,18 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } } + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitLiteralType(ctx: LiteralTypeContext): PLiteralType = { + visitChildren(ctx) match { + case Vector(typeName: PTypeName, index: Vector[PType]) => PParameterizedTypeName(typeName, index) + case x : PLiteralType => x + } + } /** Translates the rule * literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -1192,7 +1278,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * @return the unpositioned visitor result */ override def visitIndexPrimaryExpr(ctx: IndexPrimaryExprContext): AnyRef = super.visitIndexPrimaryExpr(ctx) match { - case Vector(pe: PExpression, Vector("[", index : PExpression, "]")) => PIndexedExp(pe, index).at(ctx) + case Vector(pe: PExpression, index: Vector[PExpressionOrType]) => PIndexedExp(pe, index).at(ctx) } override def visitSeqUpdPrimaryExpr(ctx: SeqUpdPrimaryExprContext): AnyRef = super.visitSeqUpdPrimaryExpr(ctx) match { @@ -1309,7 +1395,15 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole PMake(typ, args).at(ctx) } - + /** + * {@inheritDoc } + * + *

The default implementation returns the result of calling + * {@link # visitChildren} on {@code ctx}.

+ */ + override def visitIndex(ctx: IndexContext): Vector[PExpressionOrType] = { + visitListNode[PExpressionOrType](ctx.expression()) + } /** * Visits the rule @@ -2396,6 +2490,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole case c if cond(c) => visitNode(c) }.asInstanceOf[Vector[P]] } + //endregion //region Error reporting and positioning diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index 5900fa9e6..cb9baec02 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -500,7 +500,7 @@ object Parser extends LazyLogging { strategyWithName[Any]("replaceTerminationMeasuresForFunctionsAndMethods", { // apply transformation only to the specification of function or method declaration (in particular, do not // apply the transformation to method signatures in interface declarations) - case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.args, n.result, replace(n.spec), n.body)) + case n: PFunctionDecl => Some(PFunctionDecl(n.id, n.typeParameters, n.args, n.result, replace(n.spec), n.body)) case n: PMethodDecl => Some(PMethodDecl(n.id, n.receiver, n.args, n.result, replace(n.spec), n.body)) case n: PMember => Some(n) }) diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index d5b905bd9..4ba45d720 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -67,8 +67,14 @@ object SymbolTable extends Environments[Entity] { def context: ExternalTypeInfo } - case class Function(decl: PFunctionDecl, ghost: Boolean, context: ExternalTypeInfo) extends ActualDataEntity with WithArguments with WithResult { + sealed trait WithTypeParameters { + def typeParameters: Vector[PTypeParameter] = Vector.empty + def context: ExternalTypeInfo + } + + case class Function(decl: PFunctionDecl, ghost: Boolean, context: ExternalTypeInfo) extends ActualDataEntity with WithArguments with WithResult with WithTypeParameters { override def rep: PNode = decl + override val typeParameters: Vector[PTypeParameter] = decl.typeParameters override val args: Vector[PParameter] = decl.args override val result: PResult = decl.result def isPure: Boolean = decl.spec.isPure @@ -153,15 +159,20 @@ object SymbolTable extends Environments[Entity] { val decl: PTypeDecl } - case class NamedType(decl: PTypeDef, ghost: Boolean, context: ExternalTypeInfo) extends ActualTypeEntity { + case class NamedType(decl: PTypeDef, ghost: Boolean, context: ExternalTypeInfo) extends ActualTypeEntity with WithTypeParameters { require(!ghost, "type entities are not supported to be ghost yet") // TODO override def rep: PNode = decl + override def typeParameters: Vector[PTypeParameter] = decl.typeParameters } case class TypeAlias(decl: PTypeAlias, ghost: Boolean, context: ExternalTypeInfo) extends ActualTypeEntity { require(!ghost, "type entities are not supported to be ghost yet") // TODO override def rep: PNode = decl } + case class TypeParameter(decl: PTypeParameter, ghost: Boolean, context: ExternalTypeInfo) extends TypeEntity with ActualRegular { + require(!ghost, "type entities are not supported to be ghost yet") // TODO + override def rep: PNode = decl + } sealed trait TypeMember extends Regular diff --git a/src/main/scala/viper/gobra/frontend/info/base/Type.scala b/src/main/scala/viper/gobra/frontend/info/base/Type.scala index 5604d4e22..a97dd90ef 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -8,16 +8,20 @@ package viper.gobra.frontend.info.base import org.bitbucket.inkytonik.kiama.==> import org.bitbucket.inkytonik.kiama.util.Messaging.Messages -import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PImport, PInterfaceType, PNode, PStructType, PTypeDecl} +import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PIdnDef, PImport, PInterfaceType, PNode, PStructType, PTypeDecl} +import viper.gobra.ast.internal.Node import viper.gobra.frontend.info.ExternalTypeInfo +import viper.gobra.reporting.Source +import viper.gobra.reporting.Source.Parser import viper.gobra.util.TypeBounds +import viper.silver.ast.Position import scala.annotation.tailrec import scala.collection.immutable.ListMap object Type { - sealed trait Type + sealed trait Type extends TypeNode abstract class PrettyType(pretty: => String) extends Type { override lazy val toString: String = pretty @@ -56,7 +60,7 @@ object Type { case class DomainT(decl: PDomainType, context: ExternalTypeInfo) extends PrettyType("domain{...}") with ContextualType - case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends PrettyType("adt{...}") case class AdtClauseT(fieldsToTypes: Map[String, Type], fields: Vector[String], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type { require(fields.forall(fieldsToTypes.isDefinedAt), "there must be a type for each key") @@ -100,7 +104,8 @@ object Type { } } - case class FunctionT(args: Vector[Type], result: Type) extends PrettyType(s"func(${args.mkString(",")}) $result") + case class FunctionT(args: Vector[Type], result: Type) + extends PrettyType(s"func(${args.mkString(",")}) $result") case class PredT(args: Vector[Type]) extends PrettyType(s"pred(${args.mkString(",")})") @@ -126,6 +131,8 @@ object Type { case object SortT extends PrettyType("Type") + case class TypeParameterT(id: PIdnDef, constraint: PInterfaceType, context: ExternalTypeInfo) extends PrettyType(s"${id.name}") + sealed trait GhostType extends Type case object AssertionT extends PrettyType("assertion") with GhostType @@ -210,4 +217,59 @@ object Type { * vector storing the receiver's type for methods and mpredicates. */ case class AbstractType(messages: (PNode, Vector[Type]) => Messages, typing: Vector[Type] ==> FunctionT) extends PrettyType("abstract") + + trait TypeNode extends Node { + /** + * Applies the type parameter substitution f to this type + */ + def substitute(f: PartialFunction[PIdnDef, Type]): this.type = { + this.transform({ + case TypeParameterT(id, _, _) if f.isDefinedAt(id) => f(id) + }) + } + + /** + * Returns uninstantiated in the type + */ + def uninstantiatedTypeParameters(symb: SymbolTable.WithTypeParameters): Seq[PIdnDef] = { + /** + * collect all type parameters in the type and filter out type parameters that are not declared by the symb + * (we consider type parameters that are not declared by the symbol as instantiated) + */ + this.deepCollect({ + case t: TypeParameterT => t.id + }).intersect(symb.typeParameters.map(_.id)) + } + + override def info: Parser.Info = Source.Parser.Unsourced + + override def withChildren(children: Seq[Any], pos: Option[(Position, Position)], forceRewrite: Boolean): this.type = { + assert(pos.isEmpty, "The pos argument must be set to nil if called on Gobra nodes.") + + if (!forceRewrite && this.children == children) { + this + } else { + create(children) + } + } + + private def create(children: Seq[Any]): this.type = { + import scala.reflect.runtime.{universe => reflection} + val mirror = reflection.runtimeMirror(reflection.getClass.getClassLoader) + val instanceMirror = mirror.reflect(this) + val classSymbol = instanceMirror.symbol + val classMirror = mirror.reflectClass(classSymbol) + val constructorSymbol = instanceMirror.symbol.primaryConstructor.asMethod + val constructorMirror = classMirror.reflectConstructor(constructorSymbol) + + // Call constructor + val newNode = constructorMirror(children: _*) + newNode.asInstanceOf[this.type] + } + + /** + * override toString method to prevent that the toString method of the internal Node [[viper.gobra.ast.internal.Node]] is used + */ + override def toString: String = ??? + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala index 5ca81f4c4..108b085eb 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala @@ -60,6 +60,7 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val dependentTypeInfo: Map with Implements with UnderlyingType with TypeMerging + with Satisfiability with Errors with StrictLogging diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index e79d3a9d3..7058ae7bf 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala @@ -10,6 +10,7 @@ import viper.gobra.ast.frontend._ import viper.gobra.ast.frontend.{AstPattern => ap} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.frontend.info.implementation.resolution.TypeSet import viper.gobra.util.TypeBounds.BoundedIntegerKind import viper.gobra.util.Violation.violation @@ -63,13 +64,6 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => } } - lazy val parameterAssignableTo: Property[(Type, Type)] = createProperty[(Type, Type)] { - case (Argument(InternalTupleT(rs)), Argument(InternalTupleT(ls))) if rs.size == ls.size => - propForall(rs zip ls, assignableTo) - - case (r, l) => assignableTo.result(r, l) - } - lazy val assignableTo: Property[(Type, Type)] = createFlatPropertyWithReason[(Type, Type)] { case (right, left) => s"$right is not assignable to $left" } { @@ -82,14 +76,19 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => // the go language spec states that a value x of type V is assignable to a variable of type T // if V and T have identical underlying types and at least one of V or T is not a defined type case (l, r) if !(isDefinedType(l) && isDefinedType(r)) - && identicalTypes(underlyingType(l), underlyingType(r)) => successProp + && identicalTypes(underlyingType(l), underlyingType(r)) + && !isTypeParameter(l) && !isTypeParameter(r) => successProp - case (l, r) if underlyingType(r).isInstanceOf[InterfaceT] => implements(l, r) + case (l, r) if !isTypeParameter(r) && underlyingType(r).isInstanceOf[InterfaceT] => implements(l, r) case (ChannelT(le, ChannelModus.Bi), ChannelT(re, _)) if identicalTypes(le, re) => successProp - case (NilType, r) if isPointerType(r) => successProp + case (NilType, r) if isPointerType(r) && !isTypeParameter(r) => successProp case (VariadicT(t1), VariadicT(t2)) => assignableTo.result(t1, t2) case (t1, VariadicT(t2)) => assignableTo.result(t1, t2) case (VariadicT(t1), SliceT(t2)) if identicalTypes(t1, t2) => successProp + case (UNTYPED_INT_CONST, TypeParameterT(_, constraint, _)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint, this)) + case (NilType, TypeParameterT(_, constraint, _)) => assignableToAll(NilType, TypeSet.from(constraint, this)) + case (l, TypeParameterT(_, constraint, _)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint, this)) + case (TypeParameterT(_, constraint, _), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint, this), r) // for ghost types case (BooleanT, AssertionT) => successProp @@ -337,4 +336,21 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case _ => true } } + + /** + * checks whether a type is assignable to all types in a type set + */ + private def assignableToAll(t: Type, typeSet: TypeSet) = typeSet match { + case _: TypeSet.UnboundedTypeSet => errorProp() + case TypeSet.BoundedTypeSet(ts) => propForall(ts.map((t, _)), assignableTo) + } + + /** + * checks whether all types in a type set are assignable to a type + */ + private def allAssignableTo(typeSet: TypeSet, t: Type) = (typeSet, t) match { + case (_: TypeSet.UnboundedTypeSet, _: InterfaceT) => successProp + case (_: TypeSet.UnboundedTypeSet, _) => errorProp() + case (TypeSet.BoundedTypeSet(ts), _) => propForall(ts.map((_, t)), assignableTo) + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Comparability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Comparability.scala index 40b133100..114082f06 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Comparability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Comparability.scala @@ -9,6 +9,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.frontend.info.base.SymbolTable.{Embbed, Field} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.frontend.info.implementation.resolution.TypeSet trait Comparability extends BaseProperty { this: TypeInfoImpl => @@ -33,16 +34,41 @@ trait Comparability extends BaseProperty { this: TypeInfoImpl => } lazy val comparableType: Property[Type] = createBinaryProperty("comparable") { - case Single(st) => underlyingType(st) match { - case t: StructT => - structMemberSet(t).collect { - case (_, f: Field) => f.context.symbType(f.decl.typ) - case (_, e: Embbed) => e.context.typ(e.decl.typ) - }.forall(comparableType) - - case _: SliceT | _: GhostSliceT | _: MapT | _: FunctionT => false - case _ => true + case Single(st) => st match { + case t: TypeParameterT => strictlyComparableType.result(t).holds + case _ => underlyingType (st) match { + case t: StructT => + structMemberSet (t).collect { + case (_, f: Field) => f.context.symbType (f.decl.typ) + case (_, e: Embbed) => e.context.typ (e.decl.typ) + }.forall (comparableType) + + case _: SliceT | _: GhostSliceT | _: MapT | _: FunctionT => false + case _ => true + } + } + case _ => false + } + + private lazy val strictlyComparableType: Property[Type] = createBinaryProperty("strictly comparable") { + case Single(st) => st match { + case t: TypeParameterT => allStrictlyComparableTypes(TypeSet.from(t.constraint, this)) + case _ => underlyingType(st) match { + case t: StructT => + structMemberSet(t).collect { + case (_, f: Field) => f.context.symbType(f.decl.typ) + case (_, e: Embbed) => e.context.typ(e.decl.typ) + }.forall(strictlyComparableType) + + case _: SliceT | _: GhostSliceT | _: MapT | _: FunctionT | _: InterfaceT => false + case _ => true + } } case _ => false } + + private def allStrictlyComparableTypes(typeSet: TypeSet) = typeSet match { + case TypeSet.UnboundedTypeSet(isComparable) => isComparable + case TypeSet.BoundedTypeSet(ts) => ts.forall(strictlyComparableType.result(_).holds) + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 5129fa76e..50ca5433b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.ast.frontend.{PExplicitGhostStructClause, PInterfaceType, PTypeDef, AstPattern => ap} +import viper.gobra.ast.frontend.{PExplicitGhostStructClause, PInterfaceType, PTypeDef, AstPattern => ap, PTypeElement, PType} import viper.gobra.frontend.info.base.SymbolTable.{MPredicateSpec, Method} import viper.gobra.frontend.info.base.{Type, SymbolTable => st} import viper.gobra.frontend.info.base.Type.{GhostCollectionType, NilType, Type} @@ -17,7 +17,7 @@ trait Implements { this: TypeInfoImpl => def implements(l: Type, r: Type): PropertyResult = underlyingType(r) match { case itf: Type.InterfaceT => - val valid = syntaxImplements(l, r) + val valid = implementsMemberSet(l, r) if (valid.holds && l != NilType && !itf.isEmpty) { _requiredImplements ++= Set((l, itf)) } @@ -38,22 +38,27 @@ trait Implements { this: TypeInfoImpl => } } def addDemandedEmbeddedInterfaceImplements(itf: Type.InterfaceT): Unit = { - itf.decl.embedded.foreach{ x => resolve(x.typ) match { // interface implements its embedded types - case Some(ap.NamedType(_, st.NamedType(PTypeDef(int: PInterfaceType, _), _, context))) => - context.symbType(int) match { - case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) - case _ => - } + itf.decl.embedded.foreach { + case PTypeElement(Vector(t: PType)) => resolve(t) match { // interface implements its embedded types + case Some(ap.NamedType(_, st.NamedType(PTypeDef(_, int: PInterfaceType, _), _, context), _)) => + context.symbType(int) match { + case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) + case _ => + } + case _ => + } case _ => - }} + } } override def interfaceImplementations: Map[Type.InterfaceT, Set[Type]] = { (localRequiredImplements ++ localGuaranteedImplements).groupMap(_._2)(_._1) } - def syntaxImplements(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { + def implementsMemberSet(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { case (NilType, _: Type.InterfaceT) => successProp + // a type parameter syntactically implements an interface iff its type constraint syntactically implements the interface + case (Type.TypeParameterT(_, constraint, _), _: Type.InterfaceT) => implementsMemberSet(symbType(constraint), r) case (_, _: Type.InterfaceT) => supportedSortForInterfaces(l) and { val itfMemberSet = memberSet(r) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala new file mode 100644 index 000000000..f31603d9c --- /dev/null +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala @@ -0,0 +1,28 @@ +package viper.gobra.frontend.info.implementation.property + +import viper.gobra.ast.frontend.{PIdnUse, PInterfaceType, PNamedOperand, PTypeElement} +import viper.gobra.frontend.info.base.Type._ +import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.frontend.info.implementation.resolution.TypeSet + +trait Satisfiability extends BaseProperty { this: TypeInfoImpl => + + lazy val satisfies: Property[(Type, PInterfaceType)] = createProperty { + case (t, PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), methSpecs, _)) => + comparableType.result(t) and goImplements.result(t, PInterfaceType(Vector(), methSpecs, Vector())) + case (t, constraintType) => + goImplements.result(t, constraintType) + } + + private lazy val goImplements: Property[(Type, PInterfaceType)] = createProperty { + case (typ: Type, interfacePType: PInterfaceType) => + val interfaceTypeSet = TypeSet.from(interfacePType, this) + + (typ match { + case i: InterfaceT => + failedProp("is not a subset of the allowed type set", !TypeSet.isSubset(TypeSet.from(i.decl, this), interfaceTypeSet)) + case _ => + failedProp("is not an element of the allowed type set", !TypeSet.contains(interfaceTypeSet, typ)) + }) and implementsMemberSet(typ, InterfaceT(interfacePType, this)) + } +} diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala index d46efbb34..ab9d31388 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeIdentity.scala @@ -70,7 +70,7 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (VoidType, VoidType) => true - + case (TypeParameterT(l, _, _), TypeParameterT(r, _, _)) => l == r case _ => false } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala index 9aa0ffe51..6c3a5b29e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/TypeMerging.scala @@ -7,7 +7,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.internal.{Float32T, Float64T} -import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type} +import viper.gobra.frontend.info.base.Type.{AdtClauseT, AdtT, ArrayT, ChannelT, GhostSliceT, IntT, InternalSingleMulti, InternalTupleT, MapT, MultisetT, PermissionT, PointerT, SequenceT, SetT, Single, SliceT, Type, TypeParameterT} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait TypeMerging extends BaseProperty { this: TypeInfoImpl => @@ -54,6 +54,7 @@ trait TypeMerging extends BaseProperty { this: TypeInfoImpl => if l.context == r.context && l.adtT == r.adtT => Some(AdtT(l.adtT, l.context)) case (c: AdtClauseT, u@UnderlyingType(a: AdtT)) if c.context == a.context && c.adtT == a.decl => Some(u) case (u@UnderlyingType(a: AdtT), c: AdtClauseT) if c.context == a.context && c.adtT == a.decl => Some(u) + case (l: TypeParameterT, r: TypeParameterT) if identicalTypes(l, r) => Some(l) case _ => None } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala index d9c47981b..6a57827fe 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/UnderlyingType.scala @@ -9,7 +9,7 @@ package viper.gobra.frontend.info.implementation.property import viper.gobra.ast.frontend.{PDeref, PDot, PEmbeddedName, PEmbeddedPointer, PEmbeddedType, PInterfaceType, PNamedOperand, PStructType, PType, PTypeDecl} import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.frontend.info.base.BuiltInMemberTag.BuiltInTypeTag -import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type} +import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelT, DeclaredT, FunctionT, GhostSliceT, IntT, InterfaceT, MapT, NilType, PointerT, Single, SliceT, StringT, StructT, Type, TypeParameterT} import viper.gobra.frontend.info.base.{SymbolTable => st} import viper.gobra.frontend.info.implementation.TypeInfoImpl @@ -22,6 +22,8 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val underlyingType: Type => Type = attr[Type, Type] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right)) + // the underlying type of a type parameter is the underlying type of its type constraint (interface) + case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => underlyingType(ctx.symbType(t)) case t => t } @@ -211,8 +213,13 @@ trait UnderlyingType { this: TypeInfoImpl => // uint uint8 uint16 uint32 uint64 uintptr t match { // should be extended as new types are added to the language - case _: IntT | BooleanT | _: DeclaredT | StringT => true + case _: IntT | BooleanT | _: DeclaredT | StringT | _: TypeParameterT => true case _ => false } } + + def isTypeParameter(t: Type): Boolean = t match { + case _: TypeParameterT => true + case _ => false + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index 64b51d831..d5f1e7e7d 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala @@ -35,6 +35,10 @@ trait AmbiguityResolution { this: TypeInfoImpl => case _ => Left(n) }) + case n: PIndexedExp => + // expression indexes have an expression base and type instantiations have a type base + if (exprOrType(n.base).isLeft) Left(n) else Right(n) + // Otherwise just expression or type case n: PExpression => Left(n) case n: PType => Right(n) @@ -43,14 +47,21 @@ trait AmbiguityResolution { this: TypeInfoImpl => def asExpr(n: PExpressionOrType): Option[PExpression] = exprOrType(n).left.toOption def asType(n: PExpressionOrType): Option[PType] = exprOrType(n).toOption - - + def asExprList(n: Vector[PExpressionOrType]): Option[Vector[PExpression]] = { + val asExprs = n.map(asExpr) + if (asExprs.forall(_.nonEmpty)) Some(asExprs.map(_.get)) else None + } + def asTypeList(n: Vector[PExpressionOrType]): Option[Vector[PType]] = { + val asTypes = n.map(asType) + if (asTypes.forall(_.nonEmpty)) Some(asTypes.map(_.get)) else None + } def resolve(n: PExpressionOrType): Option[ap.Pattern] = n match { case n: PNamedOperand => entity(n.id) match { case s: st.NamedType => Some(ap.NamedType(n.id, s)) + case s: st.TypeParameter => Some(ap.TypeArgument(n.id, s)) case s: st.Variable => s match { case g: st.GlobalVariable => Some(ap.GlobalVariable(n.id, g)) case _ => Some(ap.LocalVariable(n.id, s)) @@ -122,9 +133,19 @@ trait AmbiguityResolution { this: TypeInfoImpl => case _ => violation(s"unexpected case reached: type conversion with arguments ${n.args}, expected single argument instead") } - case n: PIndexedExp => exprOrType(n.base) match { - case Left(base) => Some(ap.IndexedExp(base, n.index)) - case Right(_) => None // unknown pattern + case n: PIndexedExp => resolve(n.base) match { + case Some(f: ap.Parameterizable) => + asTypeList(n.index) match { + case Some(typeArgs) => Some(f.withTypeArgs(typeArgs)) + case _ => None + } + case _ if n.index.length == 1 => { + exprOrType(n.index.head) match { + case Left(expression) => Some(ap.IndexedExp(n.base, expression)) + case _ => None + } + } + case _ => None // unknow pattern } case b: PBlankIdentifier => Some(ap.BlankIdentifier(b)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index f38148c79..56e4604a3 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala @@ -19,6 +19,7 @@ import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.reporting.{NotFoundError, VerifierError} import viper.gobra.util.Violation +import viper.gobra.ast.frontend.{PTypeName} import scala.annotation.tailrec @@ -177,13 +178,15 @@ trait MemberResolution { this: TypeInfoImpl => val topLevel = AdvancedMemberSet.init[TypeMember](methSpecs.map(m => ctxt.createMethodSpec(m))) union AdvancedMemberSet.init[TypeMember](predSpecs.map(m => ctxt.createMPredSpec(m))) AdvancedMemberSet.union { - topLevel +: es.map(e => interfaceMethodSet( - entity(e.typ.id) match { - // TODO: might break for imported interfaces - case NamedType(PTypeDef(t: PInterfaceType, _), _, _) => InterfaceT(t, ctxt) - case _ => ??? - } - ).promoteItf(e.typ.name)) + topLevel +: es.map(_.terms).map { + case Vector(t: PTypeName) => + underlyingType(symbType(t)) match { + case i: InterfaceT => interfaceMethodSet(i).promoteItf(t.name) + // only embedded interfaces increase the member set + case _ => AdvancedMemberSet.empty[TypeMember] + } + case _ => AdvancedMemberSet.empty[TypeMember] // TODO implement nameless interfaces in the future + } } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index 7925531d6..d3b96645f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -62,6 +62,7 @@ trait NameResolution { } case decl: PTypeDef => NamedType(decl, isGhost, this) case decl: PTypeAlias => TypeAlias(decl, isGhost, this) + case decl: PTypeParameter => TypeParameter(decl, isGhost, this) case decl: PFunctionDecl => Function(decl, isGhost, this) case decl: PMethodDecl => MethodImpl(decl, isGhost, this) case tree.parent.pair(spec: PMethodSig, tdef: PInterfaceType) => diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala new file mode 100644 index 000000000..50e6dd38b --- /dev/null +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -0,0 +1,82 @@ +package viper.gobra.frontend.info.implementation.resolution + +import viper.gobra.frontend.info.base.Type._ +import viper.gobra.ast.frontend._ +import viper.gobra.frontend.info.implementation.TypeInfoImpl + +sealed trait TypeSet + +/** + * The type set of a type parameter constraint is the set of all types that satisfy this constraint + * In this implementation, type sets that are unbounded are represented by the [[UnboundedTypeSet]] + * Bounded type sets are represented by [[BoundedTypeSet]] and explicitly list the set of types they contains + * + * Additionally, an unbounded type set needs to keep track whether all types in the type set are comparable + * The comparability of a bounded type set can just be calculated with the set of types it contains + */ +object TypeSet { + case class UnboundedTypeSet(isComparable: Boolean = false) extends TypeSet + case class BoundedTypeSet(ts: Set[Type]) extends TypeSet + + /** + * Constructs the type set from a type parameter constraint + */ + def from(constraint: PInterfaceType, ctx: TypeInfoImpl): TypeSet = typeSetFromInterfaceType(constraint, ctx) + + private def typeSetFromInterfaceType(inter: PInterfaceType, ctx: TypeInfoImpl): TypeSet = inter match { + case PInterfaceType(embedded, _, _) => if (embedded.isEmpty) UnboundedTypeSet() else intersect(embedded.map(el => typeSetFromElement(el, ctx))) + } + + private def typeSetFromElement(element: PTypeElement, ctx: TypeInfoImpl): TypeSet = + if (element.terms.isEmpty) UnboundedTypeSet() else union(element.terms.map(term => typeSetFromTerm(term, ctx))) + + private def typeSetFromTerm(term: PTypeTerm, ctx: TypeInfoImpl): TypeSet = term match { + case PNamedOperand(PIdnUse("comparable")) => UnboundedTypeSet(isComparable = true) + case pType: PType => ctx.underlyingType(ctx.symbType(pType)) match { + case InterfaceT(i, _) => typeSetFromInterfaceType(i, ctx) + case t => BoundedTypeSet(Set(t)) + } + } + + def empty(): TypeSet = { + BoundedTypeSet(Set.empty[Type]) + } + + def union(tss: Vector[TypeSet]): TypeSet = tss.size match { + case 0 => empty() + case 1 => tss.head + case _ => tss.fold(empty()) { + case (tl: UnboundedTypeSet, tr: UnboundedTypeSet) => UnboundedTypeSet(tl.isComparable || tr.isComparable) + case (t: UnboundedTypeSet, _) => UnboundedTypeSet(t.isComparable) + case (_, t: UnboundedTypeSet) => UnboundedTypeSet(t.isComparable) + case (BoundedTypeSet(x), BoundedTypeSet(y)) => BoundedTypeSet(x union y) + } + } + + def intersect(tss: Vector[TypeSet]): TypeSet = tss.size match { + case 0 => empty() + case 1 => tss.head + case _ => tss.fold(UnboundedTypeSet(isComparable = true)) { + case (UnboundedTypeSet(l), UnboundedTypeSet(r)) => UnboundedTypeSet(l && r) + case (_: UnboundedTypeSet, ts) => ts + case (ts, _: UnboundedTypeSet) => ts + case (BoundedTypeSet(x), BoundedTypeSet(y)) => BoundedTypeSet(x intersect y) + } + } + + def contains(ts: TypeSet, t: Type): Boolean = ts match { + case _: UnboundedTypeSet => true + case BoundedTypeSet(s) => s.contains(t) + } + + def isSubset(sub: TypeSet, of: TypeSet): Boolean = (sub, of) match { + case (_, _: UnboundedTypeSet) => true + case (_: UnboundedTypeSet, _) => false + case (BoundedTypeSet(tsSub), BoundedTypeSet(tsOf)) => tsSub.subsetOf(tsOf) + } + + def allMatch(all: TypeSet, matcher: PartialFunction[Type, Boolean]): Boolean = all match { + case _: UnboundedTypeSet => false + case BoundedTypeSet(ts) => ts.forall(t => matcher.isDefinedAt(t) && matcher(t)) + } +} diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 40ad6d048..d45fe19a1 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala @@ -7,13 +7,16 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages} +import viper.gobra.ast.frontend.AstPattern.FunctionCall import viper.gobra.ast.frontend.{AstPattern => ap, _} import viper.gobra.frontend.info.base.SymbolTable.{AdtDestructor, AdtDiscriminator, GlobalVariable, SingleConstant} import viper.gobra.frontend.info.base.Type._ import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.frontend.info.implementation.resolution.TypeSet import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} + trait ExprTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -35,6 +38,11 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(ap.Closure(id, _)) => error(n, s"expected valid operand, got closure declaration name $n", !tree.parent(n).head.isInstanceOf[PClosureSpecInstance] && tryEnclosingFunctionLit(n).fold(true)(lit => lit.id.fold(true)(encId => encId.name != id.name))) + case Some(ap.Function(id, symb, _)) if symb.typeParameters.nonEmpty => + tree.parent(n).head match { + case _: PIndexedExp | _: PInvoke => noMessages + case _ => error(n, s"cannot use generic function $id without instantiation") + } case _ => noMessages } // no more checks to avoid cycles @@ -91,6 +99,69 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case _ => error(n, s"expected field selection, method or predicate with a receiver, method expression, predicate expression, adt constructor or discriminator or destructor, an imported member or a built-in member, but got $n") } + + case n: PIndexedExp => + resolve(n) match { + case Some(ap.Function(_, symb, typeArgs)) => + tree.parent(n).head match { + case _: PInvoke => wellDefPartialIndexTypeArguments(n, symb.decl, typeArgs) + case _ => wellDefFullIndexTypeArguments(n, symb.decl, typeArgs) + } + case Some(ap.NamedType(_, symb, typeArgs)) if symb.decl.isInstanceOf[PTypeDef] => + wellDefFullIndexTypeArguments(n, symb.decl.asInstanceOf[PTypeDef], typeArgs) + case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { + val baseType = exprType(base) + val idxType = exprType(index) + (underlyingType(baseType), underlyingType(idxType)) match { + case (ArrayT(l, _), IntT(_)) => + val idxOpt = intConstantEval(index) + error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) + + case (PointerT(ArrayT(l, _)), IntT(_)) => + val idxOpt = intConstantEval(index) + error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) + + case (SequenceT(_), IntT(_)) => + noMessages + + case (_: SliceT | _: GhostSliceT, IntT(_)) => + noMessages + + case (VariadicT(_), IntT(_)) => + noMessages + + case (StringT, IntT(_)) => + error(n, "Indexing a string is currently not supported") + + case (MapT(key, _), underlyingIdxType) => + // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation + // between two types, which is less precise. Because of this limitation, and with the goal of handling + // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go + // expressions that are not accepted by the compiler. + val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) + if (assignableToIdxType.nonEmpty) { + error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) + } else { + assignableToIdxType + } + + case (MathMapT(key, _), underlyingIdxType) => + // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation + // between two types, which is less precise. Because of this limitation, and with the goal of handling + // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go + // expressions that are not accepted by the compiler. + val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) + if (assignableToIdxType.nonEmpty) { + error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) + } else { + assignableToIdxType + } + + case (bt, it) => error(n, s"$it index is not a proper index of $bt") + } + } + case _ => error(n, s"invalid index expr $n") + } } lazy val exprAndTypeType: Typing[PExpressionAndType] = createTyping[PExpressionAndType] { @@ -188,6 +259,30 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case p => violation(s"expected field selection, method or predicate with a receiver, method expression, or predicate expression pattern, but got $p") } + case n: PIndexedExp => + resolve(n) match { + case Some(_: ap.Function) => symbType(n) + + case Some(ap.NamedType(_, symb, _)) if symb.decl.isInstanceOf[PTypeDef] => symbType(n) + + case Some(ap.IndexedExp(base, index)) => + val baseType = exprType(base) + val idxType = exprType(index) + (underlyingType(baseType), underlyingType(idxType)) match { + case (ArrayT(_, elem), IntT(_)) => elem + case (PointerT(ArrayT(_, elem)), IntT(_)) => elem + case (SequenceT(elem), IntT(_)) => elem + case (SliceT(elem), IntT(_)) => elem + case (GhostSliceT(elem), IntT(_)) => elem + case (VariadicT(elem), IntT(_)) => elem + case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => + InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) + case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => + InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) + case (bt, it) => violation(s"$it is not a valid index for the the base $bt") + } + } + }(wellDefExprAndType) def exprOrTypeType(n: PExpressionOrType): Type = n match { @@ -244,19 +339,37 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: PIntegerType) => intExprWithinTypeBounds(p.arg, typ) case _ => noMessages } - convertibleTo.errors(exprType(p.arg), typ)(n) ++ isExpr(p.arg).out ++ argWithinBounds + convertibleTo.errors(exprType(p.arg), underlyingType(typ))(n) ++ isExpr(p.arg).out ++ argWithinBounds case (Left(callee), Some(c: ap.FunctionCall)) => val isCallToInit = error(n, s"${Constants.INIT_FUNC_NAME} function is not callable", c.callee.isInstanceOf[ap.Function] && c.callee.id.name == Constants.INIT_FUNC_NAME) + val argTypes = n.args map exprType // arguments have to be assignable to function val wellTypedArgs = exprType(callee) match { - case FunctionT(args, _) => // TODO: add special assignment - if (n.spec.nonEmpty) wellDefCallWithSpec(n) - else if (n.args.isEmpty && args.isEmpty) noMessages - else multiAssignableTo.errors(n.args map exprType, args)(n) ++ n.args.flatMap(isExpr(_).out) + case f@FunctionT(args, _) => + val (inferenceErrors: Messages, inferredFunctionType: FunctionT) = c.callee match { + case ap.Function(_, symb, _) => + if (f.uninstantiatedTypeParameters(symb).isEmpty) (noMessages, f) + else { + // do type inference + val typeMap = inferTypeArgumentsFromCall(args, argTypes) + + val inferredType = f.substitute(typeMap) + + (wellDefTypeArguments(callee, symb.decl, typeMap) ++ inferredType.uninstantiatedTypeParameters(symb).flatMap(typeParam => { + error(n, s"cannot infer ${typeParam}") + }), inferredType) + } + case _ => (noMessages, f) + } + + if (inferenceErrors.nonEmpty) inferenceErrors + else if (n.spec.nonEmpty) wellDefCallWithSpec(n) + else if (n.args.isEmpty && inferredFunctionType.args.isEmpty) noMessages + else multiAssignableTo.errors(n.args map exprType, inferredFunctionType.args)(n) ++ n.args.flatMap(isExpr(_).out) case t: AbstractType => t.messages(n, n.args map exprType) case t => error(n, s"type error: got $t but expected function type or AbstractType") } @@ -299,60 +412,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case PBitNegation(op) => isExpr(op).out ++ assignableTo.errors(typ(op), UNTYPED_INT_CONST)(op) - case n@PIndexedExp(base, index) => - isExpr(base).out ++ isExpr(index).out ++ { - val baseType = exprType(base) - val idxType = exprType(index) - (underlyingType(baseType), underlyingType(idxType)) match { - case (ArrayT(l, _), IntT(_)) => - val idxOpt = intConstantEval(index) - error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - - case (PointerT(ArrayT(l, _)), IntT(_)) => - val idxOpt = intConstantEval(index) - error(n, s"index $index is out of bounds", !idxOpt.forall(i => i >= 0 && i < l)) - - case (SequenceT(_), IntT(_)) => - noMessages - - case (_: SliceT | _: GhostSliceT, IntT(_)) => - noMessages - - case (VariadicT(_), IntT(_)) => - noMessages - - case (StringT, IntT(_)) => - error(n, "Indexing a string is currently not supported") - - case (MapT(key, _), underlyingIdxType) => - // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation - // between two types, which is less precise. Because of this limitation, and with the goal of handling - // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go - // expressions that are not accepted by the compiler. - val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) - if (assignableToIdxType.nonEmpty) { - error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) - } else { - assignableToIdxType - } - - case (MathMapT(key, _), underlyingIdxType) => - // Assignability in Go is a property between a value and and a type. In Gobra, we model this as a relation - // between two types, which is less precise. Because of this limitation, and with the goal of handling - // untyped literals, we introduce an extra condition here. This makes the type checker of Gobra accept Go - // expressions that are not accepted by the compiler. - val assignableToIdxType = error(n, s"$idxType is not assignable to map key of $key", !assignableTo(idxType, key)) - if (assignableToIdxType.nonEmpty) { - error(n, s"$underlyingIdxType is not assignable to map key of $key", !assignableTo(underlyingIdxType, key)) - } else { - assignableToIdxType - } - - case (bt, it) => error(n, s"$it index is not a proper index of $bt") - } - } - - case n@PSliceExp(base, low, high, cap) => isExpr(base).out ++ low.fold(noMessages)(isExpr(_).out) ++ high.fold(noMessages)(isExpr(_).out) ++ @@ -433,6 +492,18 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => assignableTo.errors(l, PermissionT)(n) ++ assignableTo.errors(r, PermissionT)(n) case _ => assignableTo.errors(l, UNTYPED_INT_CONST)(n) ++ assignableTo.errors(r, UNTYPED_INT_CONST)(n) } + case (_: PAdd, t1: TypeParameterT, t2: TypeParameterT) + if TypeSet.allMatch(TypeSet.from(t1.constraint, this), { + case StringT | Float32T | Float64T | _: IntT => true + }) && identicalTypes.result(t1, t2).holds => noMessages + case (_: PSub | _: PMul | _: PDiv, t1: TypeParameterT, t2: TypeParameterT) + if TypeSet.allMatch(TypeSet.from(t1.constraint, this), { + case Float32T | Float64T | _: IntT => true + }) && identicalTypes.result(t1, t2).holds => noMessages + case (_: PMod | _: PBitAnd | _: PBitOr | _: PBitXor | _: PBitClear, t1: TypeParameterT, t2: TypeParameterT) + if TypeSet.allMatch(TypeSet.from(t1.constraint, this), { + case _: IntT => true + }) && identicalTypes.result(t1, t2).holds => noMessages case (_: PAdd, StringT, StringT) => noMessages case (_: PAdd | _: PSub | _: PMul | _: PDiv, l, r) if Set(l, r).intersect(Set(Float32T, Float64T)).nonEmpty => mergeableTypes.errors(l, r)(n) @@ -617,6 +688,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val typCtx = getNonInterfaceTypeFromCtxt(exp) typCtx.map(underlyingType) match { case Some(intTypeCtx: IntT) => assignableWithinBounds.errors(intTypeCtx, exp)(exp) + case Some(_: TypeParameterT) => noMessages case Some(t) => error(exp, s"$exp is not assignable to type $t") case None => noMessages // no type inferred from context } @@ -652,9 +724,15 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case (Left(_), Some(_: ap.PredExprInstance)) => // a PInvoke on a predicate expression instance must fully apply the predicate arguments AssertionT - case (Left(callee), Some(_: ap.FunctionCall | _: ap.PredicateCall | _: ap.ClosureCall)) => + case (Left(callee), Some(pattern@(_: ap.FunctionCall | _: ap.PredicateCall | _: ap.ClosureCall))) => exprType(callee) match { - case FunctionT(_, res) => res + case f: FunctionT => pattern match { + case fc: FunctionCall => + // do type inference + val typeMap = inferTypeArgumentsFromCall(f.args, fc.args.map(exprType)) + f.substitute(typeMap).result + case _ => f.result + } case t: AbstractType => val argTypes = n.args map exprType if (t.typing.isDefinedAt(argTypes)) t.typing(argTypes).result @@ -664,23 +742,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case p => violation(s"expected conversion, function call, predicate call, or predicate expression instance, but got $p") } - case PIndexedExp(base, index) => - val baseType = exprType(base) - val idxType = exprType(index) - (underlyingType(baseType), underlyingType(idxType)) match { - case (ArrayT(_, elem), IntT(_)) => elem - case (PointerT(ArrayT(_, elem)), IntT(_)) => elem - case (SequenceT(elem), IntT(_)) => elem - case (SliceT(elem), IntT(_)) => elem - case (GhostSliceT(elem), IntT(_)) => elem - case (VariadicT(elem), IntT(_)) => elem - case (MapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => - InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) - case (MathMapT(key, elem), underlyingIdxType) if assignableTo(idxType, key) || assignableTo(underlyingIdxType, key) => - InternalSingleMulti(elem, InternalTupleT(Vector(elem, BooleanT))) - case (bt, it) => violation(s"$it is not a valid index for the the base $bt") - } - case PSliceExp(base, low, high, cap) => val baseType = exprType(base) (underlyingType(baseType), low map exprType, high map exprType, cap map exprType) match { @@ -793,8 +854,11 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => def defaultTypeIfInterface(t: Type) : Type = { if (t.isInstanceOf[InterfaceT]) DEFAULT_INTEGER_TYPE else t } + def untypedTypeIfTypeParameter(t: Type): Type = { + if (t.isInstanceOf[TypeParameterT]) UNTYPED_INT_CONST else t + } // handle cases where it returns a SingleMultiTuple and we only care about a single type - getTypeFromCtxt(expr).map(defaultTypeIfInterface) match { + getTypeFromCtxt(expr).map(defaultTypeIfInterface).map(untypedTypeIfTypeParameter) match { case Some(t) => t match { case Single(t) => Some(t) case UnknownType => Some(UnknownType) @@ -1055,6 +1119,33 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"unexpected argument ${expr.exp} of type $t passed to len") } + private[typing] def wellDefFullIndexTypeArguments(n: PNode, decl: PWithTypeParameters, typeArgs: Vector[PType]): Messages = { + error(n, s"got ${typeArgs.length} type arguments but want ${decl.typeParameters.length}", typeArgs.length != decl.typeParameters.length) ++ + wellDefTypeArguments(n, decl, decl.typeParameters.map(_.id).zip(typeArgs.map(symbType)).toMap) + } + + private[typing] def wellDefPartialIndexTypeArguments(n: PNode, decl: PWithTypeParameters, typeArgs: Vector[PType]): Messages = { + wellDefTypeArguments(n, decl, decl.typeParameters.map(_.id).zip(typeArgs.map(symbType)).toMap) + } + + /** + * Checks whether type arguments satisfy the type parameter constraints + */ + private[typing] def wellDefTypeArguments(n: PNode, decl: PWithTypeParameters, typeArgs: Map[PIdnDef, Type]): Messages = { + decl.typeParameters.flatMap(typeParam => { + val typeParamId = typeParam.id + if (typeArgs.isDefinedAt(typeParamId)) satisfies.errors((typeArgs(typeParamId), typeParam.constraint))(n) + else noMessages + }) + } + + /** + * Infers type arguments for a function with the argument signature types and the provided argument types + */ + private [typing] def inferTypeArgumentsFromCall(argSignatureTypes: Vector[Type], argTypes: Vector[Type]): Map[PIdnDef, Type] = argSignatureTypes.zip(argTypes).map { + case (TypeParameterT(id, _, _), typ) => (PIdnDef(id.name), typ) + }.toMap[PIdnDef, Type] + /** * True iff a conversion may produce side-effects, such as allocating a slice. * May need to be extended when we introduce support for generics and when we allow diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index c62376ec4..07ce9de5f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -88,7 +88,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => } }) - case Function(PFunctionDecl(_, args, r, _, _), _, _) => unsafeMessage(! { + case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { args.forall(wellDefMisc.valid) && miscType.valid(r) }) @@ -138,6 +138,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => wellDefMisc.valid(typ) }) + case _: TypeParameter => LocalMessages(noMessages) + case _: MethodImpl => LocalMessages(noMessages) // not typed case _: MethodSpec => LocalMessages(noMessages) // not typed @@ -161,6 +163,9 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => AdtClauseT(fields.toMap, fields.map(_._1), a.decl, a.adtDecl, this) case BuiltInType(tag, _, _) => tag.typ + + case TypeParameter(decl, _, ctx) => TypeParameterT(decl.id, decl.constraint, ctx) + case _ => violation(s"expected type, but got $id") } } @@ -204,7 +209,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") }) - case Function(PFunctionDecl(_, args, r, _, _), _, context) => + case Function(PFunctionDecl(_, _, args, r, _, _), _, context) => FunctionT(args map context.typ, context.typ(r)) case Closure(PFunctionLit(_, PClosureDecl(args, r, _, _)), _, context) => @@ -249,6 +254,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case Wildcard(decl, _) => getWildcardType(decl) + case _: TypeParameter => SortT + case e => violation(s"untypable: $e") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index ad6c39039..35bef5664 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -202,7 +202,7 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => val closureImplProof = tryEnclosingClosureImplementationProof(n) if (closureImplProof.nonEmpty) { (resolve(closureImplProof.get.impl.spec.func) match { - case Some(AstPattern.Function(id, f)) => (idType(id).asInstanceOf[FunctionT].result, f.result.outs) + case Some(AstPattern.Function(id, f, _)) => (idType(id).asInstanceOf[FunctionT].result, f.result.outs) case Some(AstPattern.Closure(id, c)) => (idType(id).asInstanceOf[FunctionT].result, c.result.outs) case _ => violation("this case should be unreachable") }) match { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index bbfa0a00f..eaa51b8fe 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala @@ -11,6 +11,7 @@ import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages import scala.collection.immutable.ListMap import viper.gobra.ast.frontend._ import viper.gobra.ast.frontend.{AstPattern => ap} +import viper.gobra.frontend.info.base.SymbolTable.NamedType import viper.gobra.frontend.info.base.Type.{StructT, _} import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.frontend.info.implementation.property.UnderlyingType @@ -72,6 +73,11 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => isRecursiveInterface } + case t: PParameterizedType => entity(t.typeName.id) match { + case NamedType(decl, _, _) => + wellDefFullIndexTypeArguments(t, decl, t.typeArgs) + } + case t: PExpressionAndType => wellDefExprAndType(t).out } @@ -160,6 +166,28 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case _ => violation(s"expected type, but got $n") } + + case n: PIndexedExp => + resolve(n) match { + case Some(ap.Function(_, symb, typeArgs)) => + val substitution = symb.typeParameters.map(_.id).zip(typeArgs.map(typeSymbType)).toMap + + FunctionT(symb.args.map(miscType), miscType(symb.result)).substitute(substitution) + + case Some(ap.NamedType(_, symb, typeArgs)) if symb.decl.isInstanceOf[PTypeDef] => + val typeDecl = symb.decl.asInstanceOf[PTypeDef] + val substitution = typeDecl.typeParameters.map(_.id).zip(typeArgs.map(typeSymbType)).toMap + + underlyingType(symbType(symb.decl.right)).substitute(substitution) + case _ => violation(s"expected function or named type, but got $n") + } + + case typ: PParameterizedType => entity(typ.typeName.id) match { + case NamedType(decl, _, _) => + val typeArgs = typ.typeArgs map typeSymbType + val substitution = decl.typeParameters.map(_.id).zip(typeArgs).toMap + typeSymbType(decl.right).substitute(substitution) + } } private def structSymbType(t: PStructType): Type = { @@ -230,7 +258,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => // `ctx` of type UnderlyingType represents the current context in which a lookup should happen // ExternalTypeInfo is not used as we need access to `underlyingTypeWithCtxP`, which is not exposed by the interface. def isCyclic(itfT: PInterfaceType, visitedTypes: Set[String], ctx: UnderlyingType): Boolean = { - val fieldTypes = itfT.embedded.map(_.typ) + val fieldTypes = itfT.embedded.flatMap(_.terms) fieldTypes exists { case n: PUnqualifiedTypeName if visitedTypes.contains(n.name) => true case n: PUnqualifiedTypeName if isUnderlyingInterfaceType(n, ctx).isDefined => @@ -251,12 +279,12 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => */ def containsRedeclarations(t: PInterfaceType): Messages = { def findAllEmbeddedMethods(itfT: PInterfaceType, ctx: UnderlyingType): Set[String] = { - val fieldTypes = itfT.embedded.map(_.typ).toSet + val fieldTypes = itfT.embedded.flatMap(_.terms).toSet fieldTypes.flatMap{ case n: PTypeName if isUnderlyingInterfaceType(n, ctx).isDefined => val (itfT, itfCtx) = isUnderlyingInterfaceType(n, ctx).get itfT.methSpecs.map(_.id.name) ++ findAllEmbeddedMethods(itfT, itfCtx) - case _: PTypeName => + case _ => // if the type is ill-formed and Gobra the previous case was not entered, // then we assume that another error will be reported while type-checking // this type diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala index a49c58c22..c90a30e5e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostExprTyping.scala @@ -366,7 +366,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case (Right(_), Some(p: ap.Conversion)) => !isEffectfulConversion(p) && go(p.arg) case (Left(callee), Some(p@ap.FunctionCall(f, _))) => go(callee) && p.args.forall(go) && (f match { - case ap.Function(_, symb) => symb.isPure + case ap.Function(_, symb, _) => symb.isPure case ap.Closure(_, symb) => symb.isPure case ap.DomainFunction(_, _) => true case ap.ReceivedMethod(_, _, _, symb) => symb.isPure @@ -377,7 +377,7 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case ap.BuiltInFunction(_, symb) => symb.isPure }) case (Left(callee), Some(_: ap.ClosureCall)) => resolve(n.spec.get.func) match { - case Some(ap.Function(_, f)) => f.isPure && go(callee) && n.args.forall(a => go(a)) + case Some(ap.Function(_, f, _)) => f.isPure && go(callee) && n.args.forall(a => go(a)) case Some(ap.Closure(_, c)) => c.isPure && go(callee) && n.args.forall(a => go(a)) case _ => false } @@ -462,7 +462,10 @@ trait GhostExprTyping extends BaseTyping { this: TypeInfoImpl => case PSliceExp(base, low, high, cap) => go(base) && Seq(low, high, cap).flatten.forall(go) - case PIndexedExp(base, index) => Seq(base, index).forall(go) + case PIndexedExp(base, index) => go(base) && index.map(exprOrType).forall { + case Left(e) => go(e) + case _ => true + } case _: PMake | _: PNew => false diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala index 6ff5bef67..c88f0d802 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMemberTyping.scala @@ -30,7 +30,7 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl => val subType = symbType(ip.subT) val superType = symbType(ip.superT) - val syntaxImplementsMsgs = syntaxImplements(subType, superType).asReason(ip, s"${ip.subT} does not implement the interface ${ip.superT}") + val syntaxImplementsMsgs = implementsMemberSet(subType, superType).asReason(ip, s"${ip.subT} does not implement the interface ${ip.superT}") if (syntaxImplementsMsgs.nonEmpty) syntaxImplementsMsgs else { addDemandedImplements(subType, superType) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala index 3ab5e4a53..f1195a2ac 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostMiscTyping.scala @@ -21,7 +21,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefGhostMisc(misc: PGhostMisc) = misc match { case c@PClosureSpecInstance(id, _) => resolve(id) match { - case Some(ap.Function(_, f)) => wellDefClosureSpecInstanceParams(c, f.args zip exprOrTypeType(id).asInstanceOf[FunctionT].args) + case Some(ap.Function(_, f, _)) => wellDefClosureSpecInstanceParams(c, f.args zip exprOrTypeType(id).asInstanceOf[FunctionT].args) case Some(ap.Closure(_, l)) => if (c.params.isEmpty || capturedLocalVariables(l.lit.decl).isEmpty) wellDefClosureSpecInstanceParams(c, l.args zip exprOrTypeType(id).asInstanceOf[FunctionT].args) else error(c, s"function literal ${l.lit.id.get} captures variables, so it cannot be used to derive a parametrized spec instance") @@ -168,7 +168,7 @@ trait GhostMiscTyping extends BaseTyping { this: TypeInfoImpl => if (spec.paramKeys.isEmpty) fType.copy(args = fType.args.drop(params.size)) else { val f = resolve(func) match { - case Some(ap.Function(_, f)) => f + case Some(ap.Function(_, f, _)) => f case Some(ap.Closure(_, c)) => c case _ => Violation.violation(s"expected a function or closure, but got $func") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala index cceeb8f22..9cdc0b767 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/GhostStmtTyping.scala @@ -78,7 +78,7 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => val PClosureImplProof(impl@PClosureImplements(closure, spec), b: PBlock) = p val func = resolve(spec.func) match { - case Some(ap.Function(_, f)) => f + case Some(ap.Function(_, f, _)) => f case Some(ap.Closure(_, c)) => c case _ => Violation.violation(s"expected a function or closure, but got ${spec.func}") } @@ -289,7 +289,7 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => } resolve(closureImplProofCallAttr(p)) match { case Some(ap.FunctionCall(callee, _)) => callee match { - case ap.Function(_, symb) => symb.decl.spec.terminationMeasures + case ap.Function(_, symb, _) => symb.decl.spec.terminationMeasures case ap.Closure(_, symb) => symb.lit.spec.terminationMeasures case ap.ReceivedMethod(_, _, _, symb) => measuresFromMethod(symb) case ap.ImplicitlyReceivedInterfaceMethod(_, symb) => symb.spec.spec.terminationMeasures @@ -297,7 +297,7 @@ trait GhostStmtTyping extends BaseTyping { this: TypeInfoImpl => case _ => Violation.violation("this case should be unreachable") } case Some(ap.ClosureCall(_, _, spec)) => resolve(spec.func) match { - case Some(ap.Function(_, f)) => f.decl.spec.terminationMeasures + case Some(ap.Function(_, f, _)) => f.decl.spec.terminationMeasures case Some(ap.Closure(_, c)) => c.lit.spec.terminationMeasures case _ => Violation.violation("this case should be unreachable") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index 80deb079e..826170959 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala @@ -44,7 +44,7 @@ trait GhostAssignability { /** checks that ghost arguments are not assigned to non-ghost arguments in a call with spec */ private[separation] def ghostAssignableToClosureCall(call: ap.ClosureCall): Messages = { val isPure = resolve(call.maybeSpec.get.func) match { - case Some(ap.Function(_, f)) => f.isPure + case Some(ap.Function(_, f, _)) => f.isPure case Some(ap.Closure(_, c)) => c.isPure case _ => Violation.violation("this case should be unreachable") } @@ -66,7 +66,7 @@ trait GhostAssignability { GhostType.ghostTuple(params.map(p => context.isParamGhost(p))) val (fArgs, fRes, context) = resolve(spec.func) match { - case Some(ap.Function(_, f)) => (f.args, f.result.outs, f.context) + case Some(ap.Function(_, f, _)) => (f.args, f.result.outs, f.context) case Some(ap.Closure(_, c)) => (c.args, c.result.outs, c.context) case _ => Violation.violation("this case should be unreachable") } @@ -97,7 +97,10 @@ trait GhostAssignability { case PIndexedExp(_, index) => // a[i] := e ~ !ghost(i) && !ghost(e) error(left, "ghost error: ghost cannot be assigned to index expressions", isRightGhost) ++ - error(left, "ghost error: ghost index are not permitted in index expressions", ghostExprResultClassification(index)) + error(left, "ghost error: ghost index are not permitted in index expressions", index.map(exprOrType).exists { + case Left(expression) => ghostExprResultClassification(expression) + case _ => Violation.violation(s"unexpected case reached: index was a type") + }) case PNamedOperand(id) => // x := e ~ ghost(e) ==> ghost(x) error(left, "ghost error: ghost cannot be assigned to non-ghost", isRightGhost && !ghostIdClassification(id)) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala index 1cf3b63b1..7283fd740 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostLessPrinter.scala @@ -26,10 +26,11 @@ class GhostLessPrinter(classifier: GhostClassifier) extends DefaultPrettyPrinter ) ) - case PFunctionDecl(id, args, res, _, body) => + case PFunctionDecl(id, typeParameters, args, res, _, body) => super.showMember( PFunctionDecl( id, + typeParameters, filterParamList(args), filterResult(res), PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala index 690d90fa0..9ee4120d4 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostTyping.scala @@ -208,7 +208,7 @@ trait GhostTyping extends GhostClassifier { this: TypeInfoImpl => } override def isInterfaceClauseGhost(clause: PInterfaceClause): Boolean = clause match { - case _: PInterfaceName => false + case _: PTypeElement => false case m: PMethodSig => m.isGhost case _: PMPredicateSig => true } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index c6db45808..29f032758 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala @@ -166,7 +166,7 @@ trait GhostWellDef { this: TypeInfoImpl => exp.forall(wellGhostSeparated.valid) }) - case Function(PFunctionDecl(_, args, r, _, _), _, _) => unsafeMessage(! { + case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { args.forall(wellGhostSeparated.valid) && wellGhostSeparated.valid(r) }) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala index b524fc44c..1a68d450f 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GoifyingPrinter.scala @@ -129,11 +129,12 @@ class GoifyingPrinter(info: TypeInfoImpl) extends DefaultPrettyPrinter { ) ) - case PFunctionDecl(id, args, res, spec, body) => + case PFunctionDecl(id, typeParameters, args, res, spec, body) => showDeclarationSpec(DeclarationSpec(getGhostParams(args), getGhostParams(res.outs), spec)) <> super.showMember( PFunctionDecl( id, + typeParameters, getActualParams(args), getActualResult(res), PFunctionSpec(Vector.empty, Vector.empty, Vector.empty, Vector.empty), diff --git a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala new file mode 100644 index 000000000..d93c42b03 --- /dev/null +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -0,0 +1,58 @@ +package viper.gobra.ast + +import org.scalatest.Inside +import org.scalatest.funsuite.AnyFunSuite +import org.scalatest.matchers.should.Matchers +import viper.gobra.ast.frontend.{PBoolType, PIdnDef, PIntType, PInterfaceType, PTypeElement} +import viper.gobra.frontend.info.base.Type +import viper.gobra.util.TypeBounds + +class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { + test ("TypeNode: should correctly substitute simple TypeParameter") { + val typeNode = Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null) + val sub: PartialFunction[PIdnDef, Type.Type] = { + case PIdnDef("z") => Type.StringT + case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) + case PIdnDef("y") => Type.BooleanT + } + + typeNode.substitute(sub) should matchPattern { + case Type.IntT(TypeBounds.DefaultInt) => + } + } + + test("TypeNode: should not substitute anything if type argument is not provided") { + val typeNode = Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null) + val sub: PartialFunction[PIdnDef, Type.Type] = { + case PIdnDef("y") => Type.IntT(TypeBounds.DefaultInt) + } + + typeNode.substitute(sub) shouldBe typeNode + } + + test("TypeNode: should correctly substitute in children (single)") { + val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)) + val sub: PartialFunction[PIdnDef, Type.Type] = { + case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) + } + + typeNode.substitute(sub) should matchPattern { + case Type.MultisetT(Type.IntT(TypeBounds.DefaultInt)) => + } + } + + test("TypeNode: should correctly substitute in children (multiple)") { + val typeNode = Type.MathMapT( + Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null), + Type.TypeParameterT(PIdnDef("y"), PInterfaceType(Vector(PTypeElement(Vector(PBoolType()))), Vector(), Vector()), null) + ) + val sub: PartialFunction[PIdnDef, Type.Type] = { + case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) + case PIdnDef("y") => Type.BooleanT + } + + typeNode.substitute(sub) should matchPattern { + case Type.MathMapT(Type.IntT(TypeBounds.DefaultInt), Type.BooleanT) => + } + } +} diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index dd203575a..9e4393a3b 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -325,6 +325,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { Vector(), Vector(PFunctionDecl( PIdnDef("foo"), + Vector(), inArgs.map(_._1), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector.empty), @@ -361,7 +362,7 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { val program = stubProgram(inArgs, stmt) val ghostLess = ghostLessProg(program) val block = ghostLess match { - case PProgram(_, _, _, Vector(PFunctionDecl(PIdnDef("foo"), _, _, _, Some((_, b))))) => b + case PProgram(_, _, _, Vector(PFunctionDecl(PIdnDef("foo"), _, _, _, _, Some((_, b))))) => b case p => fail(s"Parsing succeeded but with an unexpected program $p") } normalize(block.stmts) match { @@ -416,8 +417,9 @@ class GhostErasureUnitTests extends AnyFunSuite with Matchers with Inside { (actual, expected) match { case (a: PConstDecl, e: PConstDecl) => assert(a == e) case (a: PVarDecl, e: PVarDecl) => assert(a == e) - case (PFunctionDecl(aId, aArgs, aResult, aSpec, aBody), PFunctionDecl(eId, eArgs, eResult, eSpec, eBody)) => + case (PFunctionDecl(aId, aTypeParams, aArgs, aResult, aSpec, aBody), PFunctionDecl(eId, eTypeParams, eArgs, eResult, eSpec, eBody)) => assert(aId == eId) + assert(aTypeParams == eTypeParams) assert(aArgs == eArgs) assert(aResult == eResult) assert(aSpec == eSpec) diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index a8a132b6e..9afc3488f 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -120,13 +120,13 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: spec only function") { frontend.parseFunctionDecl("func foo() { b.bar() }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => } } test("Parser: spec only function with nested blocks") { frontend.parseFunctionDecl("func foo() { if(true) { b.bar() } else { foo() } }", specOnly = true) should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("foo"), Vector(), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => } } @@ -159,7 +159,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { val modes: Set[Boolean] = Set(false, true) modes.foreach(specOnly => { frontend.parseFunctionDecl("func bar()", specOnly) should matchPattern { - case PFunctionDecl(PIdnDef("bar"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => + case PFunctionDecl(PIdnDef("bar"), Vector(), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), false, false), None) => } }) } @@ -171,6 +171,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { frontend.parseExp("bla{42}") should matchPattern { case Right(PCompositeLit(PNamedOperand(PIdnUse("bla")), PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(value, Decimal))))))) if value == 42 => } + } test("Parser: struct literal with inline type") { @@ -236,12 +237,6 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { } } - test("Parser: mistyped sequence 2") { - frontend.parseType("SEQ[int]") should matchPattern { - case Left(_) => - } - } - test("Parser: empty integer sequence literal") { frontend.parseExpOrFail("seq[int] { }") should matchPattern { case PCompositeLit( @@ -717,7 +712,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse simple indexed expressions") { frontend.parseExpOrFail("xs[i]") should matchPattern { - case PIndexedExp(PNamedOperand(PIdnUse("xs")), PNamedOperand(PIdnUse("i"))) => + case PIndexedExp(PNamedOperand(PIdnUse("xs")), Vector(PNamedOperand(PIdnUse("i")))) => } } @@ -728,9 +723,11 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { PNamedOperand(PIdnUse("xs")), PNamedOperand(PIdnUse("ys")) ), - PAdd( - PLength(PNamedOperand(PIdnUse("zs"))), - PIntLit(n, Decimal) + Vector( + PAdd( + PLength(PNamedOperand(PIdnUse("zs"))), + PIntLit(n, Decimal) + ) ) ) if n == BigInt(2) => } @@ -742,11 +739,11 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { PIndexedExp( PIndexedExp( PNamedOperand(PIdnUse("xs")), - PNamedOperand(PIdnUse("i")), + Vector(PNamedOperand(PIdnUse("i"))), ), - PNamedOperand(PIdnUse("j")), + Vector(PNamedOperand(PIdnUse("j"))), ), - PNamedOperand(PIdnUse("k")), + Vector(PNamedOperand(PIdnUse("k"))), ) => } } @@ -785,7 +782,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { PKeyedElement(None, PExpCompositeVal(PBoolLit(false))), )) ), - PIntLit(n, Decimal) + Vector(PIntLit(n, Decimal)) ) if n == BigInt(1) => } } @@ -794,7 +791,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { frontend.parseExpOrFail("seq[1..10][2]") should matchPattern { case PIndexedExp( PRangeSequence(PIntLit(low, Decimal), PIntLit(high, Decimal)), - PIntLit(i, Decimal) + Vector(PIntLit(i, Decimal)) ) if low == BigInt(1) && high == BigInt(10) && i == BigInt(2) => } } @@ -2344,7 +2341,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { frontend.parseExpOrFail("seq(a)[2]") should matchPattern { case PIndexedExp( PSequenceConversion(PNamedOperand(PIdnUse("a"))), - PIntLit(i, Decimal) + Vector(PIntLit(i, Decimal)) ) if i == BigInt(2) => } } @@ -2643,19 +2640,19 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse normal termination measure") { frontend.parseFunctionDecl("decreases n; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), None)), false, false), None) => } } test("Parser: should be able to parse underscore termination measure") { frontend.parseFunctionDecl("decreases _; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false), None) => + case PFunctionDecl(PIdnDef("factorial"), Vector(), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PWildcardMeasure(None)), false, false), None) => } } test("Parser: should be able to parse conditional termination measure" ) { frontend.parseFunctionDecl("decreases n if n>1; decreases _ if n<2; func factorial (n int) int") should matchPattern { - case PFunctionDecl(PIdnDef("factorial"), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false), None) if one == 1 && two == 2 => + case PFunctionDecl(PIdnDef("factorial"), Vector(), Vector(PNamedParameter(PIdnDef("n"), PIntType())), PResult(Vector(PUnnamedParameter(PIntType()))), PFunctionSpec(Vector(), Vector(), Vector(), Vector(PTupleTerminationMeasure(Vector(PNamedOperand(PIdnUse("n"))), Some(PGreater(PNamedOperand(PIdnUse("n")), PIntLit(one, Decimal)))), PWildcardMeasure(Some(PLess(PNamedOperand(PIdnUse("n")), PIntLit(two, Decimal))))), false, false), None) if one == 1 && two == 2 => } } @@ -2686,7 +2683,71 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse a labeled continue statement") { frontend.parseFunctionDecl("func main() {continue l}") should matchPattern { - case PFunctionDecl(_, _, _, _, Some((_, PBlock(Vector(PContinue(Some(p))))))) if p.name == "l" => + case PFunctionDecl(_, _, _, _, _, Some((_, PBlock(Vector(PContinue(Some(p))))))) if p.name == "l" => + } + } + + test("Parser: should be able to parse function with type parameters") { + frontend.parseFunctionDecl("func foo[T any](x T) {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), _, _, _) => + } + } + + test("Parser: should be able to parse type definition with type parameters") { + frontend.parseStmtOrFail("type Bar[T any] struct {}") should matchPattern { + case PSeq(Vector(PTypeDef(Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), PStructType(_), PIdnDef("Bar")))) => + } + } + + test("Parser: should be able to parse union type constraints") { + frontend.parseFunctionDecl("func foo[T int | bool]() {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType(), PBoolType()))), + Vector(), + Vector() + ))), _, _, _, _) => + } + } + + test("Parser: should be able to parse generic function instantiation") { + frontend.parseExpOrFail("foo[T, int](y)") should matchPattern { + case PInvoke(PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PNamedOperand(PIdnUse("T")), PNamedOperand(PIdnUse("int")))), Vector(PNamedOperand(PIdnUse("y"))), _) => + } + } + + test("Parser: should be able to parse struct instantiation with type arguments") { + frontend.parseExpOrFail("Bar[int]{3}") should matchPattern { + case PCompositeLit(PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("int")))), PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(n, Decimal)) + )))) if n == BigInt(3) => + } + } + + test("Parser: should be able to parse comparable type constraint") { + frontend.parseFunctionDecl("func foo[T comparable]() {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), + Vector(), + Vector() + ))), _, _, _, _) => + } + } + + test("Parser: should be able to parse conversion with named type") { + frontend.parseExpOrFail("(E[int])(2)") should matchPattern { + case PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("E")), Vector(PNamedOperand(PIdnUse("int")))), + Vector(PIntLit(_, _)), + None + ) => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index ed9020f20..6da895112 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -15,8 +15,11 @@ import viper.gobra.frontend.{Config, PackageInfo} import viper.gobra.frontend.info.Info import viper.gobra.frontend.info.base.Type import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.util.{Decimal, TypeBounds} import viper.gobra.util.TypeBounds.{DefaultInt, UnboundedInteger} +import scala.collection.immutable.ListMap + class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() @@ -77,7 +80,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { )) ) - val expr = PIndexedExp(base, PIntLit(0)) + val expr = PIndexedExp(base, Vector(PIntLit(0))) assert(frontend.isGhostExpr(expr)()) } @@ -91,7 +94,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { )) ) - val expr = PIndexedExp(base, PIntLit(0)) + val expr = PIndexedExp(base, Vector(PIntLit(0))) frontend.exprType(expr)() should matchPattern { case Type.IntT(DefaultInt) => @@ -99,7 +102,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeChecker: mark a sequence indexed expression with an incorrect left-hand side as not well-defined") { - val expr = PIndexedExp(PIntLit(42), PIntLit(0)) + val expr = PIndexedExp(PIntLit(42), Vector(PIntLit(0))) assert(!frontend.wellDefExpr(expr)().valid) } @@ -112,7 +115,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { )) ) - val expr = PIndexedExp(base, PBoolLit(false)) + val expr = PIndexedExp(base, Vector(PBoolLit(false))) assert(!frontend.wellDefExpr(expr)().valid) } @@ -127,8 +130,8 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { ) ) val expr = PIndexedExp( - PIndexedExp(PNamedOperand(PIdnUse("xs")), PIntLit(2)), - PIntLit(4) + PIndexedExp(PNamedOperand(PIdnUse("xs")), Vector(PIntLit(2))), + Vector(PIntLit(4)) ) frontend.exprType(expr)(inArgs) should matchPattern { case Type.IntT(DefaultInt) => @@ -2046,7 +2049,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should let a simple (integer) sequence index operation be marked a pure") { val expr = PIndexedExp( PLiteral.sequence(PIntType(), Vector(PIntLit(1), PIntLit(2), PIntLit(3))), - PIntLit(2) + Vector(PIntLit(2)) ) assert (frontend.isPureExpr(expr)()) @@ -2591,49 +2594,49 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should mark an indexing operator on an array as non-ghost") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(12), PIntType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))) assert (!frontend.isGhostExpr(expr)(inargs)) } test("TypeChecker: should mark a very simple indexing on an integer array be well-defined") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(12), PIntType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))) assert (frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should mark integer array indexing be well-defined also if the index exceeds the array length") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(12), PIntType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(412)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(412))) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should not let indexing on an integer array be well-defined if the array length happens to be negatieve") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(-12), PIntType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should let array indexing be well-defined if the array is multidimensional") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(10), PArrayType(PIntLit(20), PBoolType()))), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))) assert (frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should not let indexing be well-defined if the base is simply, say, a Boolean literal") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PBoolType()), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should let array indexing be well-defined if applied on an array of (ghost) sets") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PSetType(PIntType()))), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(12)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(12))) assert (frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should assign the correct type to simple indexing on an integer array") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PIntType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(12)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(12))) frontend.exprType(expr)(inargs) should matchPattern { case Type.IntT(DefaultInt) => @@ -2642,7 +2645,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should assign the correct type to simple indexing on a Boolean array") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PBoolType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(12)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(12))) frontend.exprType(expr)(inargs) should matchPattern { case Type.BooleanT => @@ -2651,7 +2654,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should assign the correct type to simple indexing on a multidimensional array") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PArrayType(PIntLit(12), PIntType()))), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(12)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(12))) frontend.exprType(expr)(inargs) should matchPattern { case Type.ArrayT(n, Type.IntT(_)) if n == BigInt(12) => @@ -2660,13 +2663,13 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should mark a small chain of indexing operations as well-defined if the base type allows it") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PArrayType(PIntLit(12), PIntType()))), false)) - val expr = PIndexedExp(PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)), PIntLit(8)) + val expr = PIndexedExp(PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))), Vector(PIntLit(8))) assert (frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should assign the correct type to a small chain of indexing operations") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PArrayType(PIntLit(12), PMultisetType(PBoolType())))), false)) - val expr = PIndexedExp(PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(4)), PIntLit(8)) + val expr = PIndexedExp(PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(4))), Vector(PIntLit(8))) frontend.exprType(expr)(inargs) should matchPattern { case Type.MultisetT(Type.BooleanT) => @@ -2675,31 +2678,31 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should not allow array indexing with a negative index") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PBoolType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(-12)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(-12))) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should allow array indexing with an index that is zero") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PBoolType())), false)) - val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(0)) + val expr = PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(0))) assert (frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should not let a simple array access predicate be well-defined if the index is negative") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PBoolType())), false)) - val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(-4)), PFullPerm()) + val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(-4))), PFullPerm()) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should not let a simple array access predicate be well-defined if the index exceeds the array length") { val inargs = Vector((PNamedParameter(PIdnDef("a"), PArrayType(PIntLit(42), PBoolType())), false)) - val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("a")), PIntLit(42)), PFullPerm()) + val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("a")), Vector(PIntLit(42))), PFullPerm()) assert (!frontend.wellDefExpr(expr)(inargs).valid) } test("TypeChecker: should not let an 'acc' predicate be well-defined when used on a sequence instead of an array") { val inargs = Vector((PNamedParameter(PIdnDef("xs"), PSequenceType(PBoolType())), false)) - val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("xs")), PIntLit(4)), PFullPerm()) + val expr = PAccess(PIndexedExp(PNamedOperand(PIdnUse("xs")), Vector(PIntLit(4))), PFullPerm()) assert (!frontend.wellDefExpr(expr)(inargs).valid) } @@ -3358,31 +3361,859 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { } } + test("TypeChecker: should be able to type instantiation of generic function") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar[int] + val expr = PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType())) + + frontend.exprType(expr)(Vector(), Vector(functionDecl)) should matchPattern { + case Type.FunctionT(Vector(Type.IntT(_)), Type.IntT(_)) => + } + } + + test("TypeChecker: should be able to type invocation of instantiated generic function") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar[int](8) + val expr = PInvoke(PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType())), Vector(PIntLit(BigInt(8))), None) + + frontend.exprType(expr)(Vector(), Vector(functionDecl)) should matchPattern { + case Type.IntT(_) => + } + } + + test("TypeChecker: should not accept generic functions that are not instantiated") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar + val expr = PNamedOperand(PIdnUse("bar")) + + assert (!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should not accept expression type arguments for generic functions") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar[3] + val expr = PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntLit(BigInt(3)))) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should not accept incorrect amount of type arguments for generic function") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar[int, int] + val expr = PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType(), PIntType())) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should be able to type instantiation of generic struct type") { + // type Bar[T any, V any] struct { x T } + val typeDecl = PTypeDef( + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )), + PTypeParameter(PIdnDef("V"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )) + ), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar") + ) + + // Bar[int, bool]{3} + + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PIntType(), PBoolType())), + PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(3, Decimal))))) + ) + + inside (frontend.exprType(expr)(Vector(), Vector(typeDecl))) { + case Type.StructT(l, _, _) => + l should equal (ListMap("x" -> (true, Type.IntT(TypeBounds.DefaultInt)))) + } + } + + test("TypeChecker: should not accept incorrect amount of type arguments for generic type") { + // type Bar[T any, V any] struct { x T } + val typeDecl = PTypeDef( + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )), + PTypeParameter(PIdnDef("V"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )) + ), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar") + ) + + // Bar[int]{3} + + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PIntType())), + PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(3, Decimal))))) + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: should accept generic function call with embedded interface type constraint") { + // type I interface { int | bool } + val interfaceDecl = PTypeDef( + Vector(), + PInterfaceType(Vector(PTypeElement(Vector(PIntType(), PBoolType()))), Vector(), Vector()), + PIdnDef("I") + ) + + // func foo[T I](x T) { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("I"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // foo[int](4) + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())), + Vector(PIntLit(BigInt(4))), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(interfaceDecl, functionDecl)).valid) + } + + test("TypeChecker: valid generic function instantiation int") { + // func foo[T int]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("int"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())), + Vector(), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: invalid generic function instantiation int") { + // func foo[T int]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("int"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[bool]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PBoolType())), + Vector(), + None + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: valid generic function instantiation union") { + // func foo[T int | bool]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("int")), PNamedOperand(PIdnUse("bool"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())), + Vector(), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: invalid generic function instantiation union") { + // func foo[T int | bool]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("int")), PNamedOperand(PIdnUse("bool"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[string]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PStringType())), + Vector(), + None + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: valid generic function instantiation interface") { + // type Bar struct { } + val typeDecl = PTypeDef(Vector(), PStructType(Vector()), PIdnDef("Bar")) + + // func (Bar) m(x int) int { + // return x + 1 + // } + val methodImpl = PMethodDecl( + PIdnDef("m"), + PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("Bar")))), + Vector(PNamedParameter(PIdnDef("x"), PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector( + PReturn(Vector(PAdd(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(1))))) + )))) + ) + + // func foo[T interface { m(int) int}]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(), + Vector(PMethodSig( + PIdnDef("m"), + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // foo[Bar]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PNamedOperand(PIdnUse("Bar")))), + Vector(), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl, methodImpl, functionDecl)).valid) + } + + test("TypeChecker: invalid generic function instantiation interface") { + // type Bar struct { } + val typeDecl = PTypeDef(Vector(), PStructType(Vector()), PIdnDef("Bar")) + + // func (Bar) n(x int) int { + // return x + 1 + // } + val methodImpl = PMethodDecl( + PIdnDef("n"), + PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("Bar")))), + Vector(PNamedParameter(PIdnDef("x"), PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector( + PReturn(Vector(PAdd(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(1))))) + )))) + ) + + // func foo[T interface { m(int) int}]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(), + Vector(PMethodSig( + PIdnDef("m"), + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector( + PReturn(Vector(PAdd(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(1))))) + )))) + ) + + // foo[Bar]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PNamedOperand(PIdnUse("Bar")))), + Vector(), + None + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl, methodImpl, functionDecl)).valid) + } + + test("TypeChecker: valid generic function instantiation comparable with strictly comparable type") { + // func foo[T comparable]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())), + Vector(), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: valid generic function instantiation comparable with (non-strictly) comparable type") { + // type I interface { m() } + val interfaceDecl = PTypeDef(Vector(), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()), PIdnDef("I")) + + // func foo[T comparable]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[I]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PNamedOperand(PIdnUse("I")))), + Vector(), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(interfaceDecl, functionDecl)).valid) + } + + test("TypeChecker: invalid generic function instantiation comparable") { + // type Bar func(int) int + val typeDecl = PTypeDef(Vector(), PFunctionType( + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))) + ), PIdnDef("Bar")) + + // func foo[T comparable]() { } + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[Bar]() + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PNamedOperand(PIdnUse("Bar")))), + Vector(), + None + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl, functionDecl)).valid) + } + + test("TypeChecker: valid generic type instantiation int") { + // type Bar[T int] struct {} + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[int]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PIntType())), + PLiteralValue(Vector()) + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: invalid generic type instantiation int") { + // type Bar[T int] struct {} + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[bool]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PBoolType())), + PLiteralValue(Vector()) + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: valid generic type instantiation union") { + // type Bar[T int | bool] struct {} + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PIntType(), PBoolType()))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[int]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PBoolType())), + PLiteralValue(Vector()) + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: invalid generic type instantiation union") { + // type Bar[T int | bool] struct {} + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PIntType(), PBoolType()))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[string]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PStringType())), + PLiteralValue(Vector()) + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: valid generic type instantiation interface") { + // type Baz struct { } + val typeDecl = PTypeDef(Vector(), PStructType(Vector()), PIdnDef("Baz")) + + // func (Baz) m(x int) int { + // return x + 1 + // } + val methodImpl = PMethodDecl( + PIdnDef("m"), + PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("Baz")))), + Vector(PNamedParameter(PIdnDef("x"), PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector( + PReturn(Vector(PAdd(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(1))))) + )))) + ) + + // type Bar[T interface { m(int) int}] struct {} + val genericTypeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[Baz]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("Baz")))), + PLiteralValue(Vector()) + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl, methodImpl, genericTypeDecl)).valid) + } + + test("TypeChecker: invalid generic type instantiation interface") { + // type Baz struct { } + val typeDecl = PTypeDef(Vector(), PStructType(Vector()), PIdnDef("Baz")) + + // func (Baz) n(x int) int { + // return x + 1 + // } + val methodImpl = PMethodDecl( + PIdnDef("n"), + PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("Baz")))), + Vector(PNamedParameter(PIdnDef("x"), PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector( + PReturn(Vector(PAdd(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(1))))) + )))) + ) + + // type Bar[T interface { m(int) int}] struct {} + val genericTypeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[Baz]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("Baz")))), + PLiteralValue(Vector()) + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl, methodImpl, genericTypeDecl)).valid) + } + + test("TypeChecker: valid generic type instantiation comparable with strictly comparable type") { + // type Bar[T comparable] struct {} + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[int]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PIntType())), + PLiteralValue(Vector()) + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(typeDecl)).valid) + } + + test("TypeChecker: valid generic type instantiation comparable with (non-strictly) comparable type") { + // type I interface { m() } + val interfaceDecl = PTypeDef(Vector(), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()), PIdnDef("I")) + + // type Bar[T comparable] struct { } + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[I]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("I")))), + PLiteralValue(Vector()) + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(interfaceDecl, typeDecl)).valid) + } + + test("TypeChecker: invalid generic type instantiation comparable") { + // type Baz func(int) int + val functionTypeDecl = PTypeDef(Vector(), PFunctionType( + Vector(PUnnamedParameter(PIntType())), + PResult(Vector(PUnnamedParameter(PIntType()))) + ), PIdnDef("Baz")) + + // type Bar[T comparable] struct { } + val typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), Vector(), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // Bar[Baz]{} + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("Baz")))), + PLiteralValue(Vector()) + ) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionTypeDecl, typeDecl)).valid) + } + + test("TypeChecker: should be able to infer second type argument with ints") { + // func foo[T any, V any](x T, y V) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(), Vector())), + PTypeParameter(PIdnDef("V"), PInterfaceType(Vector(), Vector(), Vector())) + ), + Vector( + PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), + PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V"))) + ), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int](3, 2) + val expr = PInvoke( + PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())), + Vector(PIntLit(3), PIntLit(2)), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should be able to infer all type argument with ints") { + // func foo[T any, V any](x T, y V) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(), Vector())), + PTypeParameter(PIdnDef("V"), PInterfaceType(Vector(), Vector(), Vector())) + ), + Vector( + PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), + PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V"))) + ), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo(3, 2) + val expr = PInvoke( + PNamedOperand(PIdnUse("foo")), + Vector(PIntLit(3), PIntLit(2)), + None + ) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should not accept uninstantiated generic function") { + // func foo[T any, V any](x T, y V) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(), Vector())), + PTypeParameter(PIdnDef("V"), PInterfaceType(Vector(), Vector(), Vector())) + ), + Vector( + PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), + PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V"))) + ), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo + val expr = PNamedOperand(PIdnUse("foo")) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should not accept partially instantiated generic function") { + // func foo[T any, V any](x T, y V) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(), Vector())), + PTypeParameter(PIdnDef("V"), PInterfaceType(Vector(), Vector(), Vector())) + ), + Vector( + PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), + PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V"))) + ), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int] + val expr = PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType())) + + assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } + + test("TypeChecker: should accept fully instantiated generic function") { + // func foo[T any, V any](x T, y V) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(), Vector())), + PTypeParameter(PIdnDef("V"), PInterfaceType(Vector(), Vector(), Vector())) + ), + Vector( + PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), + PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V"))) + ), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + // foo[int, int] + val expr = PIndexedExp(PNamedOperand(PIdnUse("foo")), Vector(PIntType(), PIntType())) + + assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) + } /* * Stubs, mocks, and other test setup */ class TestFrontend { - def stubProgram(inArgs: Vector[(PParameter, Boolean)], body : PStatement) : PProgram = PProgram( + def stubProgram(inArgs: Vector[(PParameter, Boolean)], members: Vector[PMember], body : PStatement) : PProgram = PProgram( PPackageClause(PPkgDef("pkg")), Vector(), Vector(), - Vector(PMethodDecl( - PIdnDef("foo"), - PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))), - inArgs.map(_._1), - PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true), - Some(PBodyParameterInfo(inArgs.collect{ case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body))) - )) + members.appended( + PMethodDecl( + PIdnDef("foo"), + PUnnamedReceiver(PMethodReceiveName(PNamedOperand(PIdnUse("self")))), + inArgs.map(_._1), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = true), + Some(PBodyParameterInfo(inArgs.collect { case (n: PNamedParameter, true) => PIdnUse(n.id.name) }), PBlock(Vector(body))) + ) + ) ) - def singleExprProgram(inArgs: Vector[(PParameter, Boolean)], expr : PExpression) : PProgram = { + def singleExprProgram(inArgs: Vector[(PParameter, Boolean)], members: Vector[PMember], expr : PExpression) : PProgram = { val stmt = PShortVarDecl(Vector(expr), Vector(PIdnUnk("n")), Vector(false)) - stubProgram(inArgs, stmt) + stubProgram(inArgs, members, stmt) } - def singleExprTypeInfo(inArgs: Vector[(PParameter, Boolean)], expr : PExpression) : TypeInfoImpl = { - val program = singleExprProgram(inArgs, expr) + def singleExprTypeInfo(inArgs: Vector[(PParameter, Boolean)], members: Vector[PMember], expr : PExpression) : TypeInfoImpl = { + val program = singleExprProgram(inArgs, members, expr) val positions = new Positions val pkg = PPackage( PPackageClause(PPkgDef("pkg")), @@ -3395,16 +4226,16 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { new TypeInfoImpl(tree, Map.empty)(config) } - def exprType(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Type.Type = - singleExprTypeInfo(inArgs, expr).exprType(expr) + def exprType(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector(), members: Vector[PMember] = Vector()) : Type.Type = + singleExprTypeInfo(inArgs, members, expr).exprType(expr) - def isGhostExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Boolean = - singleExprTypeInfo(inArgs, expr).isExprGhost(expr) + def isGhostExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector(), members: Vector[PMember] = Vector()) : Boolean = + singleExprTypeInfo(inArgs, members, expr).isExprGhost(expr) - def isPureExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) : Boolean = - singleExprTypeInfo(inArgs, expr).isPureExpr(expr).isEmpty + def isPureExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector(), members: Vector[PMember] = Vector()) : Boolean = + singleExprTypeInfo(inArgs, members, expr).isPureExpr(expr).isEmpty - def wellDefExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = - singleExprTypeInfo(inArgs, expr).wellDefExpr(expr) + def wellDefExpr(expr : PExpression)(inArgs: Vector[(PParameter, Boolean)] = Vector(), members: Vector[PMember] = Vector()) = + singleExprTypeInfo(inArgs, members, expr).wellDefExpr(expr) } } diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala new file mode 100644 index 000000000..605862709 --- /dev/null +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -0,0 +1,411 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2011-2020 ETH Zurich. + +package viper.gobra.typing + +import org.bitbucket.inkytonik.kiama.util.Positions +import org.scalatest.Inside +import org.scalatest.matchers.should.Matchers +import org.scalatest.funsuite.AnyFunSuite +import viper.gobra.ast.frontend.{PPackage, PPkgDef, PProgram} +import viper.gobra.frontend.PackageInfo +import viper.gobra.frontend.info.implementation.TypeInfoImpl +import viper.gobra.ast.frontend._ +import viper.gobra.frontend.info.Info +import viper.gobra.frontend.Config +import viper.gobra.util.TypeBounds + +class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { + val frontend = new TestFrontend() + + test("TypeChecker: should be able to type non-generic function") { + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("int")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector())) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should be able to type generic function") { + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept generic function that uses type parameters that are not defined") { + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept struct type definition") { + val member = PTypeDef( + Vector(), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("int"))))))), + PIdnDef("Bar") + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept generic type definition") { + val member = PTypeDef( + Vector( + PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )), + PTypeParameter(PIdnDef("V"), PInterfaceType( + Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + Vector(), + Vector() + )) + ), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar") + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept valid assignment of constant to simple type parameter") { + // func foo[T int]() { + // var _ T = 3 // valid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType()))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PNamedOperand(PIdnUse("T"))), Vector(PIntLit(BigInt(3))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept invalid assignment of constant to simple type parameter") { + // func foo[T int]() { + // var _ T = false // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType()))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PNamedOperand(PIdnUse("T"))), Vector(PBoolLit(false)), Vector(PWildcard()), Vector()) + ))) + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept invalid assignment of constant to union type parameter") { + // func foo[T int | bool]() { + // var _ T = 3 // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType(), PBoolType()))), + Vector(), + Vector() + ))), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PNamedOperand(PIdnUse("T"))), Vector(PIntLit(BigInt(3))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept invalid assignment of generic function parameter to static type") { + // func foo[T int](x T) { + // var _ int = x // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType()))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PIntType()), Vector(PNamedOperand(PIdnUse("x"))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept valid assignment of generic interface parameter to interface type") { + // func foo[T interface{ m(); n() }](x T) { + // var _ interface{ m() } = x // valid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector( + PMethodSig(PIdnDef("m"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), isGhost = false), + PMethodSig(PIdnDef("n"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), isGhost = false), + ), Vector()))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl( + Some(PInterfaceType(Vector(), Vector( + PMethodSig(PIdnDef("m"), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), isGhost = false), + ), Vector())), + Vector(PNamedOperand(PIdnUse("x"))), + Vector(PWildcard()), Vector()) + ))) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept invalid assignment of generic union parameter to static type") { + // func foo[T int | bool](x T) { + // var _ int = x // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType(), PBoolType()))), + Vector(), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PIntType()), Vector(PNamedOperand(PIdnUse("x"))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should not accept invalid assignment of interface parameter to generic interface type") { + // func foo[T interface{ m() }](x interface { + // m() + // n() + // }) { + // var _ T = x // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(), + Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PInterfaceType( + Vector(), + Vector( + PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + ), + PMethodSig( + PIdnDef("n"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + ) + ), + Vector() + ))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PIntType()), Vector(PNamedOperand(PIdnUse("x"))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(!frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept assignment to identical type parameter types") { + // func foo[T interface { m() }](x T) { + // var _ T = x // valid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(), + Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), + Vector() + ))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(Some(PNamedOperand(PIdnUse("T"))), Vector(PNamedOperand(PIdnUse("x"))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept comparison of int and int type parameter") { + // func foo[T int](x T) { + // var _ = (x == 3) + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(None, Vector(PEquals(PNamedOperand(PIdnUse("x")), PIntLit(BigInt(3)))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept comparison of two comparable parameters") { + // func foo[T comparable](x T, y T) { + // var _ = (x == y) + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), Vector(), Vector()))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector( + PVarDecl(None, Vector(PEquals(PNamedOperand(PIdnUse("x")), PNamedOperand(PIdnUse("y")))), Vector(PWildcard()), Vector()) + ))) + ) + + assert(frontend.wellDefMember(member).valid) + } + + test("TypeChecker: should accept instantiation of generic function with a type parameter") { + // type Bar[T interface{ m() }] struct {} + var typeDecl = PTypeDef( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()))), + PStructType(Vector()), + PIdnDef("Bar") + ) + + // func foo[T interface{ m() }](x Bar[T]) {} + val functionDecl = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType(Vector(), Vector(PMethodSig( + PIdnDef("m"), + Vector(), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + isGhost = false + )), Vector()))), + Vector(PNamedParameter(PIdnDef("x"), PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("T")))))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + + assert(frontend.wellDefMember(functionDecl, Vector(typeDecl)).valid) + } + + class TestFrontend { + def singleMemberProgram(members: Vector[PMember]): PProgram = + PProgram( + PPackageClause(PPkgDef("pkg")), + Vector(), + Vector(), + members + ) + + def memberTypeInfo(member: PMember)(otherMembers: Vector[PMember]): TypeInfoImpl = { + val program = singleMemberProgram(member +: otherMembers ) + val positions = new Positions + val pkg = PPackage( + PPackageClause(PPkgDef("pkg")), + Vector(program), + new PositionManager(positions), + new PackageInfo("pkg", "pkg", false) + ) + val tree = new Info.GoTree(pkg) + val config = Config() + new TypeInfoImpl(tree, Map.empty)(config) + } + + def wellDefMember(member: PMember, otherMembers: Vector[PMember] = Vector()) = + memberTypeInfo(member)(otherMembers).wellDefMember(member) + } +} diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index dc3a3fbc7..299fb554b 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -64,6 +64,7 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { Vector(), Vector(PFunctionDecl( PIdnDef("foo"), + Vector.empty, inArgs.map(_._1), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector(), isPure = false), @@ -85,7 +86,8 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { new TypeInfoImpl(tree, Map.empty)(config) } - def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = + def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = { singleStmtTypeInfo(inArgs, stmt).wellDefStmt(stmt) + } } }