From 72adaf1aa188635cd68ee803bb0caa4fda551988 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Sun, 23 Apr 2023 21:06:39 +0200 Subject: [PATCH 01/37] add support for parsing generic types and functions --- src/main/antlr4/GoParser.g4 | 100 +++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 0843b0c2c..480cbca9e 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -1,38 +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/blob/4c06ad8cc8130931c75ca0b17cbc1453f3830cd2/golang +// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/5493f3e2458d443f5a475359bf5e7cda87b25559/golang +// Extended with Generics parser grammar GoParser; @@ -67,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?); @@ -87,7 +86,7 @@ varSpec: block: L_CURLY statementList? R_CURLY; -statementList: (eos? statement eos)+; +statementList: (statement EOS)+; statement: declaration @@ -194,7 +193,7 @@ commCase: CASE (sendStmt | recvStmt) | DEFAULT; recvStmt: (expressionList ASSIGN | identifierList DECLARE_ASSIGN)? recvExpr = expression; -forStmt: FOR (expression | forClause | rangeClause)? block; +forStmt: FOR (expression? | forClause | rangeClause?) block; forClause: initStmt = simpleStmt? eos expression? eos postStmt = simpleStmt?; @@ -206,10 +205,12 @@ rangeClause: ( goStmt: GO expression; -type_: typeName | typeLit | L_PAREN type_ R_PAREN; +type_: typeName typeArgs? | typeLit | L_PAREN type_ R_PAREN; typeName: qualifiedIdent | IDENTIFIER; +typeArgs: L_BRACKET typeList COMMA? R_BRACKET; + typeLit: arrayType | structType @@ -229,7 +230,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; @@ -255,6 +262,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 = ( @@ -300,11 +315,13 @@ primaryExpr: ); + + conversion: nonNamedType L_PAREN expression COMMA? R_PAREN; nonNamedType: typeLit | L_PAREN nonNamedType R_PAREN; -operand: literal | operandName | L_PAREN expression R_PAREN; +operand: literal | operandName typeArgs? | L_PAREN expression R_PAREN; literal: basicLit | compositeLit | functionLit; @@ -334,7 +351,7 @@ literalType: | L_BRACKET ELLIPSIS R_BRACKET elementType | sliceType | mapType - | typeName; + | typeName typeArgs?; literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -346,7 +363,7 @@ key: expression | literalValue; element: expression | literalValue; -structType: STRUCT L_CURLY (fieldDecl eos)* R_CURLY; +structType: STRUCT L_CURLY (fieldDecl EOS)* R_CURLY; fieldDecl: ( identifierList type_ @@ -355,7 +372,7 @@ fieldDecl: ( string_: RAW_STRING_LIT | INTERPRETED_STRING_LIT; -embeddedField: STAR? typeName; +embeddedField: STAR? typeName typeArgs?; functionLit: FUNC signature block; // function @@ -384,5 +401,4 @@ eos: SEMI | EOF | EOS - | {closingBracket()}? - ; \ No newline at end of file + | {p.closingBracket()}?; \ No newline at end of file From caea3b6e337b94ce82830c6c6d591066e6410896 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Sun, 23 Apr 2023 21:06:39 +0200 Subject: [PATCH 02/37] add support for parsing generic types and functions --- src/main/antlr4/GoParser.g4 | 100 +++++++++++++++++++-------------- src/main/antlr4/GobraParser.g4 | 10 ++-- 2 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 0843b0c2c..5bbfaa1d1 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -1,38 +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/blob/4c06ad8cc8130931c75ca0b17cbc1453f3830cd2/golang +// Imported to Gobra from https://github.com/antlr/grammars-v4/blob/5493f3e2458d443f5a475359bf5e7cda87b25559/golang +// Extended with Generics parser grammar GoParser; @@ -67,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?); @@ -87,7 +86,7 @@ varSpec: block: L_CURLY statementList? R_CURLY; -statementList: (eos? statement eos)+; +statementList: (statement EOS)+; statement: declaration @@ -194,7 +193,7 @@ commCase: CASE (sendStmt | recvStmt) | DEFAULT; recvStmt: (expressionList ASSIGN | identifierList DECLARE_ASSIGN)? recvExpr = expression; -forStmt: FOR (expression | forClause | rangeClause)? block; +forStmt: FOR (expression? | forClause | rangeClause?) block; forClause: initStmt = simpleStmt? eos expression? eos postStmt = simpleStmt?; @@ -206,10 +205,12 @@ rangeClause: ( goStmt: GO expression; -type_: typeName | typeLit | L_PAREN type_ R_PAREN; +type_: typeName typeArgs? | typeLit | L_PAREN type_ R_PAREN; typeName: qualifiedIdent | IDENTIFIER; +typeArgs: L_BRACKET typeList COMMA? R_BRACKET; + typeLit: arrayType | structType @@ -229,7 +230,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; @@ -255,6 +262,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 = ( @@ -300,11 +315,13 @@ primaryExpr: ); + + conversion: nonNamedType L_PAREN expression COMMA? R_PAREN; nonNamedType: typeLit | L_PAREN nonNamedType R_PAREN; -operand: literal | operandName | L_PAREN expression R_PAREN; +operand: literal | operandName typeArgs? | L_PAREN expression R_PAREN; literal: basicLit | compositeLit | functionLit; @@ -334,7 +351,7 @@ literalType: | L_BRACKET ELLIPSIS R_BRACKET elementType | sliceType | mapType - | typeName; + | typeName typeArgs?; literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -346,7 +363,7 @@ key: expression | literalValue; element: expression | literalValue; -structType: STRUCT L_CURLY (fieldDecl eos)* R_CURLY; +structType: STRUCT L_CURLY (fieldDecl EOS)* R_CURLY; fieldDecl: ( identifierList type_ @@ -355,7 +372,7 @@ fieldDecl: ( string_: RAW_STRING_LIT | INTERPRETED_STRING_LIT; -embeddedField: STAR? typeName; +embeddedField: STAR? typeName typeArgs?; functionLit: FUNC signature block; // function @@ -384,5 +401,4 @@ eos: SEMI | EOF | EOS - | {closingBracket()}? - ; \ No newline at end of file + | {closingBracket()}?; \ No newline at end of file diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 3f08a2fcb..d516d5c2d 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -222,7 +222,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?); @@ -389,7 +389,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; @@ -398,7 +400,7 @@ methodSpec: | GHOST? specification IDENTIFIER parameters; // Added ghostTypeLiterals -type_: typeName | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; +type_: typeName typeArgs? | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; // Added pred types typeLit: @@ -424,7 +426,7 @@ literalType: | sliceType | mapType | ghostTypeLit - | typeName; + | typeName typeArgs?; implicitArray: L_BRACKET ELLIPSIS R_BRACKET elementType; From a90ed7275d46bfb9bb3a606625791494ce4eca02 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Tue, 2 May 2023 16:13:18 +0200 Subject: [PATCH 03/37] modified parse tree translator - generated gobra parser code - added Ast nodes for type parameters and type arguments - modified parse tree translator --- src/main/antlr4/GoParser.g4 | 8 +- .../java/viper/gobra/frontend/GobraLexer.java | 1819 ++++-- .../viper/gobra/frontend/GobraParser.java | 5707 ++++++++++------- .../frontend/GobraParserBaseVisitor.java | 83 +- .../gobra/frontend/GobraParserVisitor.java | 73 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 17 +- .../gobra/frontend/ParseTreeTranslator.scala | 179 +- 7 files changed, 4974 insertions(+), 2912 deletions(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 5bbfaa1d1..0a4b04ec6 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -181,9 +181,9 @@ typeSwitchGuard: (IDENTIFIER DECLARE_ASSIGN)? primaryExpr DOT L_PAREN TYPE R_PAR typeCaseClause: typeSwitchCase COLON statementList?; -typeSwitchCase: CASE typeList | DEFAULT; +typeSwitchCase: CASE typeListSwitch | DEFAULT; -typeList: (type_ | NIL_LIT) (COMMA (type_ | NIL_LIT))*; +typeListSwitch: (type_ | NIL_LIT) (COMMA (type_ | NIL_LIT))*; selectStmt: SELECT L_CURLY commClause* R_CURLY; @@ -193,7 +193,7 @@ commCase: CASE (sendStmt | recvStmt) | DEFAULT; recvStmt: (expressionList ASSIGN | identifierList DECLARE_ASSIGN)? recvExpr = expression; -forStmt: FOR (expression? | forClause | rangeClause?) block; +forStmt: FOR (expression | forClause | rangeClause)? block; forClause: initStmt = simpleStmt? eos expression? eos postStmt = simpleStmt?; @@ -211,6 +211,8 @@ typeName: qualifiedIdent | IDENTIFIER; typeArgs: L_BRACKET typeList COMMA? R_BRACKET; +typeList: type_ (COMMA type_)*; + typeLit: arrayType | structType diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 0d4c2dd0e..bd91c51d9 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,3 +1,4 @@ +// 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; @@ -8,9 +9,9 @@ import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.misc.*; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -214,700 +215,1124 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00a2\u05db\b\1\b"+ - "\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n"+ - "\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21"+ - "\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30"+ - "\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37"+ - "\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t"+ - "*\4+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63"+ - "\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t"+ - "<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4"+ - "H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\t"+ - "S\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^"+ - "\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j"+ - "\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu"+ - "\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080"+ - "\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+ - "\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+ - "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ - "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ - "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ - "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+ - "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ - "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ - "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad"+ - "\t\u00ad\4\u00ae\t\u00ae\3\2\3\2\5\2\u0161\n\2\3\2\3\2\3\3\3\3\3\3\3\3"+ - "\5\3\u0169\n\3\3\3\5\3\u016c\n\3\3\3\5\3\u016f\n\3\3\3\3\3\3\3\3\3\5\3"+ - "\u0175\n\3\5\3\u0177\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+ - "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ - "\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+ - "\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33"+ - "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!"+ - "\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$"+ - "\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)"+ - "\3)\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,"+ - "\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3"+ - "\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3"+ - "\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3"+ - "\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3"+ - "\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3"+ - "8\38\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3;\3"+ - ";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3"+ - ">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3"+ - "A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3"+ - "C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3"+ - "F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+ - "G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K\3K\3K\3K\3"+ - "L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3"+ - "O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+ - "R\3R\3R\3S\3S\3S\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+ - "W\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3"+ - "Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3"+ - "\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`"+ - "\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c"+ - "\3c\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\7f\u0426\nf\ff\16f\u0429\13"+ - "f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3i\3j\3j\3j\3j\3k\3k\3l\3l\3l\3l\3m\3m\3"+ - "n\3n\3o\3o\3p\3p\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3t\3t\3t\3u\3u\3"+ - "u\3u\3v\3v\3v\3w\3w\3w\3x\3x\3x\3y\3y\3y\3z\3z\3{\3{\3{\3|\3|\3}\3}\3"+ - "}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0082\3"+ - "\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085"+ - "\3\u0086\3\u0086\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a"+ - "\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\5\u008b\u0491\n\u008b\3\u008b"+ - "\7\u008b\u0494\n\u008b\f\u008b\16\u008b\u0497\13\u008b\5\u008b\u0499\n"+ - "\u008b\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\5\u008c\u04a0\n\u008c\3"+ - "\u008c\6\u008c\u04a3\n\u008c\r\u008c\16\u008c\u04a4\3\u008c\3\u008c\3"+ - "\u008d\3\u008d\5\u008d\u04ab\n\u008d\3\u008d\5\u008d\u04ae\n\u008d\3\u008d"+ - "\6\u008d\u04b1\n\u008d\r\u008d\16\u008d\u04b2\3\u008d\3\u008d\3\u008e"+ - "\3\u008e\3\u008e\5\u008e\u04ba\n\u008e\3\u008e\6\u008e\u04bd\n\u008e\r"+ - "\u008e\16\u008e\u04be\3\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f"+ - "\3\u008f\3\u0090\5\u0090\u04c9\n\u0090\3\u0090\6\u0090\u04cc\n\u0090\r"+ - "\u0090\16\u0090\u04cd\3\u0090\3\u0090\5\u0090\u04d2\n\u0090\3\u0090\7"+ - "\u0090\u04d5\n\u0090\f\u0090\16\u0090\u04d8\13\u0090\5\u0090\u04da\n\u0090"+ - "\3\u0090\3\u0090\3\u0090\5\u0090\u04df\n\u0090\3\u0090\7\u0090\u04e2\n"+ - "\u0090\f\u0090\16\u0090\u04e5\13\u0090\5\u0090\u04e7\n\u0090\3\u0091\3"+ - "\u0091\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u04f2\n\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093"+ - "\5\u0093\u04fb\n\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0095\3\u0095\5\u0095\u0505\n\u0095\3\u0096\3\u0096\3\u0096\3\u0096"+ - "\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\7\u009a"+ - "\u0525\n\u009a\f\u009a\16\u009a\u0528\13\u009a\3\u009a\3\u009a\3\u009a"+ - "\3\u009a\3\u009b\3\u009b\3\u009b\7\u009b\u0531\n\u009b\f\u009b\16\u009b"+ - "\u0534\13\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009c\6\u009c\u053b"+ - "\n\u009c\r\u009c\16\u009c\u053c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\7\u009d\u0545\n\u009d\f\u009d\16\u009d\u0548\13\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\6\u009e\u0550\n\u009e\r\u009e"+ - "\16\u009e\u0551\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u009f\7\u009f"+ - "\u055a\n\u009f\f\u009f\16\u009f\u055d\13\u009f\3\u009f\3\u009f\3\u00a0"+ - "\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u0565\n\u00a0\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a1\3\u00a1\3\u00a1\3\u00a1\3\u00a1\5\u00a1\u0581\n\u00a1\3\u00a2"+ - "\3\u00a2\5\u00a2\u0585\n\u00a2\3\u00a2\7\u00a2\u0588\n\u00a2\f\u00a2\16"+ - "\u00a2\u058b\13\u00a2\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ - "\3\u00a6\3\u00a6\5\u00a6\u0595\n\u00a6\3\u00a6\3\u00a6\3\u00a7\3\u00a7"+ - "\5\u00a7\u059b\n\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00aa\6\u00aa"+ - "\u05a2\n\u00aa\r\u00aa\16\u00aa\u05a3\3\u00aa\3\u00aa\3\u00ab\3\u00ab"+ - "\3\u00ab\3\u00ab\7\u00ab\u05ac\n\u00ab\f\u00ab\16\u00ab\u05af\13\u00ab"+ - "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac"+ - "\7\u00ac\u05ba\n\u00ac\f\u00ac\16\u00ac\u05bd\13\u00ac\3\u00ac\3\u00ac"+ - "\3\u00ad\6\u00ad\u05c2\n\u00ad\r\u00ad\16\u00ad\u05c3\3\u00ad\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ad\7\u00ad\u05cb\n\u00ad\f\u00ad\16\u00ad\u05ce"+ - "\13\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u05d3\n\u00ad\3\u00ad\3\u00ad"+ - "\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00ae\5\u0546\u05ad\u05cc\2\u00af\4"+ - "\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21"+ - "\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!"+ - "B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:"+ - "t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090"+ - "I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ - "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ - "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ - "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ - "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ - "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ - "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ - "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\u008e\u011c"+ - "\u008f\u011e\u0090\u0120\2\u0122\2\u0124\u0091\u0126\2\u0128\u0092\u012a"+ - "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ - "\u0099\u0138\u009a\u013a\u009b\u013c\u009c\u013e\u009d\u0140\2\u0142\2"+ - "\u0144\2\u0146\2\u0148\2\u014a\2\u014c\2\u014e\2\u0150\2\u0152\2\u0154"+ - "\u009e\u0156\u009f\u0158\u00a0\u015a\u00a1\u015c\u00a2\4\2\3\23\3\2\63"+ - ";\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13"+ - "\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5"+ - "\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb"+ - "\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8"+ - "\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1"+ - "\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22"+ - "\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b"+ - "\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52"+ - "\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b"+ - "\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52"+ - "\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071"+ - "\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452"+ - "\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b"+ - "\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52"+ - "\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac"+ - "\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8"+ - "\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0"+ - "\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381"+ - "\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5"+ - "\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b"+ - "\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670"+ - "\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1"+ - "\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f"+ - "\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc"+ - "\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842"+ - "\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b"+ - "\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987"+ - "\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4"+ - "\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1"+ - "\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12"+ - "\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a"+ - "\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f"+ - "\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7"+ - "\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb"+ - "\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34"+ - "\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63"+ - "\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94"+ - "\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6"+ - "\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10"+ - "\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c"+ - "\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94"+ - "\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0"+ - "\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14"+ - "\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63"+ - "\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf"+ - "\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48"+ - "\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f"+ - "\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7"+ - "\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf"+ - "\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02"+ - "\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041"+ - "\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068"+ - "\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9"+ - "\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f"+ - "\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c"+ - "\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2"+ - "\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a"+ - "\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e"+ - "\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702"+ - "\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e"+ - "\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822"+ - "\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7"+ - "\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2"+ - "\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35"+ - "\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02"+ - "\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee"+ - "\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a"+ - "\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b"+ - "\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8"+ - "\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5"+ - "\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073"+ - "\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109"+ - "\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128"+ - "\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141"+ - "\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32"+ - "\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27"+ - "\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82"+ - "\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0"+ - "\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31"+ - "\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098"+ - "\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133"+ - "\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec"+ - "\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c"+ - "\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721"+ - "\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805"+ - "\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5"+ - "\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932"+ - "\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6"+ - "\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46"+ - "\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3"+ - "\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd"+ - "\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10"+ - "\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e"+ - "\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd"+ - "\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f"+ - "\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40"+ - "\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52"+ - "\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe"+ - "\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc"+ - "\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3"+ - "A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321"+ - "\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2"+ - "\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd"+ - "\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762"+ - "\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a"+ - "\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2"+ - "\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9"+ - "\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b"+ - "\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6"+ - "\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02"+ - "\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1"+ - "\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185"+ - "\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213"+ - "\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291"+ - "\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312"+ - "\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f"+ - "\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c"+ - "\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da"+ - "\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b"+ - "\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c"+ - "\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa"+ - "\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02"+ - "\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b"+ - "\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42"+ - "\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79"+ - "\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2"+ - "\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd"+ - "\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402"+ - "\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8"+ - "\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7"+ - "\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b"+ - "\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554"+ - "\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716"+ - "\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c"+ - "\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945"+ - "\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29"+ - "\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d"+ - "\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f"+ - "\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b"+ - "\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66"+ - "\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e"+ - "\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7"+ - "\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4"+ - "\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0606\2\4\3\2\2\2\2\6"+ - "\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2"+ - "\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34"+ - "\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2("+ - "\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2"+ - "\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2"+ - "@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3"+ - "\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2"+ - "\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2"+ - "\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r"+ - "\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2"+ - "\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2"+ - "\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090"+ - "\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2"+ - "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ - "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ - "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4"+ - "\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2"+ - "\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6"+ - "\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2"+ - "\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8"+ - "\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ - "\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea"+ - "\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2"+ - "\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc"+ - "\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2"+ - "\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e"+ - "\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2"+ - "\2\2\u0118\3\2\2\2\2\u011a\3\2\2\2\2\u011c\3\2\2\2\2\u011e\3\2\2\2\2\u0124"+ - "\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2"+ - "\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\2\u0138"+ - "\3\2\2\2\2\u013a\3\2\2\2\2\u013c\3\2\2\2\2\u013e\3\2\2\2\3\u0154\3\2\2"+ - "\2\3\u0156\3\2\2\2\3\u0158\3\2\2\2\3\u015a\3\2\2\2\3\u015c\3\2\2\2\4\u0160"+ - "\3\2\2\2\6\u0176\3\2\2\2\b\u0178\3\2\2\2\n\u017f\3\2\2\2\f\u0187\3\2\2"+ - "\2\16\u018e\3\2\2\2\20\u0195\3\2\2\2\22\u019c\3\2\2\2\24\u01a3\3\2\2\2"+ - "\26\u01ac\3\2\2\2\30\u01b6\3\2\2\2\32\u01be\3\2\2\2\34\u01c8\3\2\2\2\36"+ - "\u01d4\3\2\2\2 \u01db\3\2\2\2\"\u01e6\3\2\2\2$\u01e9\3\2\2\2&\u01ef\3"+ - "\2\2\2(\u01f8\3\2\2\2*\u01fd\3\2\2\2,\u0204\3\2\2\2.\u020b\3\2\2\2\60"+ - "\u0211\3\2\2\2\62\u0216\3\2\2\2\64\u021d\3\2\2\2\66\u0227\3\2\2\28\u022b"+ - "\3\2\2\2:\u0231\3\2\2\2<\u0234\3\2\2\2>\u0236\3\2\2\2@\u023d\3\2\2\2B"+ - "\u0243\3\2\2\2D\u0250\3\2\2\2F\u0259\3\2\2\2H\u025d\3\2\2\2J\u0261\3\2"+ - "\2\2L\u0267\3\2\2\2N\u0269\3\2\2\2P\u026c\3\2\2\2R\u0271\3\2\2\2T\u0277"+ - "\3\2\2\2V\u027d\3\2\2\2X\u0284\3\2\2\2Z\u028b\3\2\2\2\\\u0294\3\2\2\2"+ - "^\u029a\3\2\2\2`\u02a0\3\2\2\2b\u02a7\3\2\2\2d\u02ad\3\2\2\2f\u02b4\3"+ - "\2\2\2h\u02ba\3\2\2\2j\u02c3\3\2\2\2l\u02cb\3\2\2\2n\u02d1\3\2\2\2p\u02d9"+ - "\3\2\2\2r\u02e0\3\2\2\2t\u02e5\3\2\2\2v\u02ee\3\2\2\2x\u02fd\3\2\2\2z"+ - "\u0303\3\2\2\2|\u0307\3\2\2\2~\u030a\3\2\2\2\u0080\u0311\3\2\2\2\u0082"+ - "\u031b\3\2\2\2\u0084\u0325\3\2\2\2\u0086\u0331\3\2\2\2\u0088\u033a\3\2"+ - "\2\2\u008a\u0344\3\2\2\2\u008c\u034c\3\2\2\2\u008e\u0358\3\2\2\2\u0090"+ - "\u0367\3\2\2\2\u0092\u036d\3\2\2\2\u0094\u0371\3\2\2\2\u0096\u0375\3\2"+ - "\2\2\u0098\u037a\3\2\2\2\u009a\u0382\3\2\2\2\u009c\u038a\3\2\2\2\u009e"+ - "\u038f\3\2\2\2\u00a0\u0399\3\2\2\2\u00a2\u03a0\3\2\2\2\u00a4\u03a5\3\2"+ - "\2\2\u00a6\u03ab\3\2\2\2\u00a8\u03ae\3\2\2\2\u00aa\u03b2\3\2\2\2\u00ac"+ - "\u03b9\3\2\2\2\u00ae\u03be\3\2\2\2\u00b0\u03c3\3\2\2\2\u00b2\u03c8\3\2"+ - "\2\2\u00b4\u03d0\3\2\2\2\u00b6\u03d7\3\2\2\2\u00b8\u03dd\3\2\2\2\u00ba"+ - "\u03eb\3\2\2\2\u00bc\u03ee\3\2\2\2\u00be\u03f4\3\2\2\2\u00c0\u03f9\3\2"+ - "\2\2\u00c2\u0404\3\2\2\2\u00c4\u0408\3\2\2\2\u00c6\u040f\3\2\2\2\u00c8"+ - "\u0418\3\2\2\2\u00ca\u041c\3\2\2\2\u00cc\u0422\3\2\2\2\u00ce\u042c\3\2"+ - "\2\2\u00d0\u042e\3\2\2\2\u00d2\u0432\3\2\2\2\u00d4\u0434\3\2\2\2\u00d6"+ - "\u0438\3\2\2\2\u00d8\u043a\3\2\2\2\u00da\u043e\3\2\2\2\u00dc\u0440\3\2"+ - "\2\2\u00de\u0442\3\2\2\2\u00e0\u0444\3\2\2\2\u00e2\u0446\3\2\2\2\u00e4"+ - "\u0448\3\2\2\2\u00e6\u044d\3\2\2\2\u00e8\u0452\3\2\2\2\u00ea\u0455\3\2"+ - "\2\2\u00ec\u0459\3\2\2\2\u00ee\u045c\3\2\2\2\u00f0\u045f\3\2\2\2\u00f2"+ - "\u0462\3\2\2\2\u00f4\u0465\3\2\2\2\u00f6\u0467\3\2\2\2\u00f8\u046a\3\2"+ - "\2\2\u00fa\u046c\3\2\2\2\u00fc\u046f\3\2\2\2\u00fe\u0471\3\2\2\2\u0100"+ - "\u0473\3\2\2\2\u0102\u0475\3\2\2\2\u0104\u0478\3\2\2\2\u0106\u047b\3\2"+ - "\2\2\u0108\u047e\3\2\2\2\u010a\u0480\3\2\2\2\u010c\u0482\3\2\2\2\u010e"+ - "\u0484\3\2\2\2\u0110\u0486\3\2\2\2\u0112\u0488\3\2\2\2\u0114\u048a\3\2"+ - "\2\2\u0116\u0498\3\2\2\2\u0118\u049c\3\2\2\2\u011a\u04a8\3\2\2\2\u011c"+ - "\u04b6\3\2\2\2\u011e\u04c2\3\2\2\2\u0120\u04e6\3\2\2\2\u0122\u04e8\3\2"+ - "\2\2\u0124\u04f1\3\2\2\2\u0126\u04f7\3\2\2\2\u0128\u04fe\3\2\2\2\u012a"+ - "\u0504\3\2\2\2\u012c\u0506\3\2\2\2\u012e\u050b\3\2\2\2\u0130\u0510\3\2"+ - "\2\2\u0132\u0517\3\2\2\2\u0134\u0522\3\2\2\2\u0136\u052d\3\2\2\2\u0138"+ - "\u053a\3\2\2\2\u013a\u0540\3\2\2\2\u013c\u054f\3\2\2\2\u013e\u0555\3\2"+ - "\2\2\u0140\u0564\3\2\2\2\u0142\u0566\3\2\2\2\u0144\u0582\3\2\2\2\u0146"+ - "\u058c\3\2\2\2\u0148\u058e\3\2\2\2\u014a\u0590\3\2\2\2\u014c\u0592\3\2"+ - "\2\2\u014e\u059a\3\2\2\2\u0150\u059c\3\2\2\2\u0152\u059e\3\2\2\2\u0154"+ - "\u05a1\3\2\2\2\u0156\u05a7\3\2\2\2\u0158\u05b5\3\2\2\2\u015a\u05d2\3\2"+ - "\2\2\u015c\u05d6\3\2\2\2\u015e\u0161\5\6\3\2\u015f\u0161\5\u011e\u008f"+ - "\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0163"+ - "\b\2\2\2\u0163\5\3\2\2\2\u0164\u016e\5\u0144\u00a2\2\u0165\u0166\7\60"+ - "\2\2\u0166\u0168\6\3\2\2\u0167\u0169\5\u0144\u00a2\2\u0168\u0167\3\2\2"+ - "\2\u0168\u0169\3\2\2\2\u0169\u016b\3\2\2\2\u016a\u016c\5\u014c\u00a6\2"+ - "\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c\u016f\3\2\2\2\u016d\u016f"+ - "\5\u014c\u00a6\2\u016e\u0165\3\2\2\2\u016e\u016d\3\2\2\2\u016f\u0177\3"+ - "\2\2\2\u0170\u0171\7\60\2\2\u0171\u0172\6\3\3\2\u0172\u0174\5\u0144\u00a2"+ - "\2\u0173\u0175\5\u014c\u00a6\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2\2"+ - "\u0175\u0177\3\2\2\2\u0176\u0164\3\2\2\2\u0176\u0170\3\2\2\2\u0177\7\3"+ - "\2\2\2\u0178\u0179\7v\2\2\u0179\u017a\7t\2\2\u017a\u017b\7w\2\2\u017b"+ - "\u017c\7g\2\2\u017c\u017d\3\2\2\2\u017d\u017e\b\4\2\2\u017e\t\3\2\2\2"+ - "\u017f\u0180\7h\2\2\u0180\u0181\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183"+ - "\7u\2\2\u0183\u0184\7g\2\2\u0184\u0185\3\2\2\2\u0185\u0186\b\5\2\2\u0186"+ - "\13\3\2\2\2\u0187\u0188\7c\2\2\u0188\u0189\7u\2\2\u0189\u018a\7u\2\2\u018a"+ - "\u018b\7g\2\2\u018b\u018c\7t\2\2\u018c\u018d\7v\2\2\u018d\r\3\2\2\2\u018e"+ - "\u018f\7c\2\2\u018f\u0190\7u\2\2\u0190\u0191\7u\2\2\u0191\u0192\7w\2\2"+ - "\u0192\u0193\7o\2\2\u0193\u0194\7g\2\2\u0194\17\3\2\2\2\u0195\u0196\7"+ - "k\2\2\u0196\u0197\7p\2\2\u0197\u0198\7j\2\2\u0198\u0199\7c\2\2\u0199\u019a"+ - "\7n\2\2\u019a\u019b\7g\2\2\u019b\21\3\2\2\2\u019c\u019d\7g\2\2\u019d\u019e"+ - "\7z\2\2\u019e\u019f\7j\2\2\u019f\u01a0\7c\2\2\u01a0\u01a1\7n\2\2\u01a1"+ - "\u01a2\7g\2\2\u01a2\23\3\2\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7g\2\2\u01a5"+ - "\u01a6\7s\2\2\u01a6\u01a7\7w\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7t\2\2"+ - "\u01a9\u01aa\7g\2\2\u01aa\u01ab\7u\2\2\u01ab\25\3\2\2\2\u01ac\u01ad\7"+ - "r\2\2\u01ad\u01ae\7t\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1"+ - "\7g\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3\7x\2\2\u01b3\u01b4\7g\2\2\u01b4"+ - "\u01b5\7u\2\2\u01b5\27\3\2\2\2\u01b6\u01b7\7g\2\2\u01b7\u01b8\7p\2\2\u01b8"+ - "\u01b9\7u\2\2\u01b9\u01ba\7w\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2"+ - "\u01bc\u01bd\7u\2\2\u01bd\31\3\2\2\2\u01be\u01bf\7k\2\2\u01bf\u01c0\7"+ - "p\2\2\u01c0\u01c1\7x\2\2\u01c1\u01c2\7c\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4"+ - "\7k\2\2\u01c4\u01c5\7c\2\2\u01c5\u01c6\7p\2\2\u01c6\u01c7\7v\2\2\u01c7"+ - "\33\3\2\2\2\u01c8\u01c9\7f\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb\7e\2\2\u01cb"+ - "\u01cc\7t\2\2\u01cc\u01cd\7g\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7u\2\2"+ - "\u01cf\u01d0\7g\2\2\u01d0\u01d1\7u\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3"+ - "\b\16\2\2\u01d3\35\3\2\2\2\u01d4\u01d5\7r\2\2\u01d5\u01d6\7w\2\2\u01d6"+ - "\u01d7\7t\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\b\17"+ - "\2\2\u01da\37\3\2\2\2\u01db\u01dc\7k\2\2\u01dc\u01dd\7o\2\2\u01dd\u01de"+ - "\7r\2\2\u01de\u01df\7n\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7o\2\2\u01e1"+ - "\u01e2\7g\2\2\u01e2\u01e3\7p\2\2\u01e3\u01e4\7v\2\2\u01e4\u01e5\7u\2\2"+ - "\u01e5!\3\2\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7u\2\2\u01e8#\3\2\2\2\u01e9"+ - "\u01ea\7q\2\2\u01ea\u01eb\7n\2\2\u01eb\u01ec\7f\2\2\u01ec\u01ed\3\2\2"+ - "\2\u01ed\u01ee\b\22\2\2\u01ee%\3\2\2\2\u01ef\u01f0\7d\2\2\u01f0\u01f1"+ - "\7g\2\2\u01f1\u01f2\7h\2\2\u01f2\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4"+ - "\u01f5\7g\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\b\23\2\2\u01f7\'\3\2\2\2"+ - "\u01f8\u01f9\7%\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7j\2\2\u01fb\u01fc"+ - "\7u\2\2\u01fc)\3\2\2\2\u01fd\u01fe\7h\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200"+ - "\7t\2\2\u0200\u0201\7c\2\2\u0201\u0202\7n\2\2\u0202\u0203\7n\2\2\u0203"+ - "+\3\2\2\2\u0204\u0205\7g\2\2\u0205\u0206\7z\2\2\u0206\u0207\7k\2\2\u0207"+ - "\u0208\7u\2\2\u0208\u0209\7v\2\2\u0209\u020a\7u\2\2\u020a-\3\2\2\2\u020b"+ - "\u020c\7c\2\2\u020c\u020d\7e\2\2\u020d\u020e\7e\2\2\u020e\u020f\3\2\2"+ - "\2\u020f\u0210\b\27\2\2\u0210/\3\2\2\2\u0211\u0212\7h\2\2\u0212\u0213"+ - "\7q\2\2\u0213\u0214\7n\2\2\u0214\u0215\7f\2\2\u0215\61\3\2\2\2\u0216\u0217"+ - "\7w\2\2\u0217\u0218\7p\2\2\u0218\u0219\7h\2\2\u0219\u021a\7q\2\2\u021a"+ - "\u021b\7n\2\2\u021b\u021c\7f\2\2\u021c\63\3\2\2\2\u021d\u021e\7w\2\2\u021e"+ - "\u021f\7p\2\2\u021f\u0220\7h\2\2\u0220\u0221\7q\2\2\u0221\u0222\7n\2\2"+ - "\u0222\u0223\7f\2\2\u0223\u0224\7k\2\2\u0224\u0225\7p\2\2\u0225\u0226"+ - "\7i\2\2\u0226\65\3\2\2\2\u0227\u0228\7n\2\2\u0228\u0229\7g\2\2\u0229\u022a"+ - "\7v\2\2\u022a\67\3\2\2\2\u022b\u022c\7i\2\2\u022c\u022d\7j\2\2\u022d\u022e"+ - "\7q\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u02309\3\2\2\2\u0231\u0232"+ - "\7k\2\2\u0232\u0233\7p\2\2\u0233;\3\2\2\2\u0234\u0235\7%\2\2\u0235=\3"+ - "\2\2\2\u0236\u0237\7u\2\2\u0237\u0238\7w\2\2\u0238\u0239\7d\2\2\u0239"+ - "\u023a\7u\2\2\u023a\u023b\7g\2\2\u023b\u023c\7v\2\2\u023c?\3\2\2\2\u023d"+ - "\u023e\7w\2\2\u023e\u023f\7p\2\2\u023f\u0240\7k\2\2\u0240\u0241\7q\2\2"+ - "\u0241\u0242\7p\2\2\u0242A\3\2\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2"+ - "\2\u0245\u0246\7v\2\2\u0246\u0247\7g\2\2\u0247\u0248\7t\2\2\u0248\u0249"+ - "\7u\2\2\u0249\u024a\7g\2\2\u024a\u024b\7e\2\2\u024b\u024c\7v\2\2\u024c"+ - "\u024d\7k\2\2\u024d\u024e\7q\2\2\u024e\u024f\7p\2\2\u024fC\3\2\2\2\u0250"+ - "\u0251\7u\2\2\u0251\u0252\7g\2\2\u0252\u0253\7v\2\2\u0253\u0254\7o\2\2"+ - "\u0254\u0255\7k\2\2\u0255\u0256\7p\2\2\u0256\u0257\7w\2\2\u0257\u0258"+ - "\7u\2\2\u0258E\3\2\2\2\u0259\u025a\7?\2\2\u025a\u025b\7?\2\2\u025b\u025c"+ - "\7@\2\2\u025cG\3\2\2\2\u025d\u025e\7/\2\2\u025e\u025f\7/\2\2\u025f\u0260"+ - "\7,\2\2\u0260I\3\2\2\2\u0261\u0262\7c\2\2\u0262\u0263\7r\2\2\u0263\u0264"+ - "\7r\2\2\u0264\u0265\7n\2\2\u0265\u0266\7{\2\2\u0266K\3\2\2\2\u0267\u0268"+ - "\7A\2\2\u0268M\3\2\2\2\u0269\u026a\7#\2\2\u026a\u026b\7>\2\2\u026bO\3"+ - "\2\2\2\u026c\u026d\7#\2\2\u026d\u026e\7@\2\2\u026e\u026f\3\2\2\2\u026f"+ - "\u0270\b(\2\2\u0270Q\3\2\2\2\u0271\u0272\7u\2\2\u0272\u0273\7g\2\2\u0273"+ - "\u0274\7s\2\2\u0274\u0275\3\2\2\2\u0275\u0276\b)\2\2\u0276S\3\2\2\2\u0277"+ - "\u0278\7u\2\2\u0278\u0279\7g\2\2\u0279\u027a\7v\2\2\u027a\u027b\3\2\2"+ - "\2\u027b\u027c\b*\2\2\u027cU\3\2\2\2\u027d\u027e\7o\2\2\u027e\u027f\7"+ - "u\2\2\u027f\u0280\7g\2\2\u0280\u0281\7v\2\2\u0281\u0282\3\2\2\2\u0282"+ - "\u0283\b+\2\2\u0283W\3\2\2\2\u0284\u0285\7f\2\2\u0285\u0286\7k\2\2\u0286"+ - "\u0287\7e\2\2\u0287\u0288\7v\2\2\u0288\u0289\3\2\2\2\u0289\u028a\b,\2"+ - "\2\u028aY\3\2\2\2\u028b\u028c\7q\2\2\u028c\u028d\7r\2\2\u028d\u028e\7"+ - "v\2\2\u028e\u028f\7k\2\2\u028f\u0290\7q\2\2\u0290\u0291\7p\2\2\u0291\u0292"+ - "\3\2\2\2\u0292\u0293\b-\2\2\u0293[\3\2\2\2\u0294\u0295\7n\2\2\u0295\u0296"+ - "\7g\2\2\u0296\u0297\7p\2\2\u0297\u0298\3\2\2\2\u0298\u0299\b.\2\2\u0299"+ - "]\3\2\2\2\u029a\u029b\7p\2\2\u029b\u029c\7g\2\2\u029c\u029d\7y\2\2\u029d"+ - "\u029e\3\2\2\2\u029e\u029f\b/\2\2\u029f_\3\2\2\2\u02a0\u02a1\7o\2\2\u02a1"+ - "\u02a2\7c\2\2\u02a2\u02a3\7m\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5\3\2\2"+ - "\2\u02a5\u02a6\b\60\2\2\u02a6a\3\2\2\2\u02a7\u02a8\7e\2\2\u02a8\u02a9"+ - "\7c\2\2\u02a9\u02aa\7r\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\b\61\2\2\u02ac"+ - "c\3\2\2\2\u02ad\u02ae\7u\2\2\u02ae\u02af\7q\2\2\u02af\u02b0\7o\2\2\u02b0"+ - "\u02b1\7g\2\2\u02b1\u02b2\3\2\2\2\u02b2\u02b3\b\62\2\2\u02b3e\3\2\2\2"+ - "\u02b4\u02b5\7i\2\2\u02b5\u02b6\7g\2\2\u02b6\u02b7\7v\2\2\u02b7\u02b8"+ - "\3\2\2\2\u02b8\u02b9\b\63\2\2\u02b9g\3\2\2\2\u02ba\u02bb\7f\2\2\u02bb"+ - "\u02bc\7q\2\2\u02bc\u02bd\7o\2\2\u02bd\u02be\7c\2\2\u02be\u02bf\7k\2\2"+ - "\u02bf\u02c0\7p\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\b\64\2\2\u02c2i\3"+ - "\2\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7z\2\2\u02c5\u02c6\7k\2\2\u02c6"+ - "\u02c7\7q\2\2\u02c7\u02c8\7o\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02ca\b\65"+ - "\2\2\u02cak\3\2\2\2\u02cb\u02cc\7c\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce"+ - "\7v\2\2\u02ce\u02cf\3\2\2\2\u02cf\u02d0\b\66\2\2\u02d0m\3\2\2\2\u02d1"+ - "\u02d2\7o\2\2\u02d2\u02d3\7c\2\2\u02d3\u02d4\7v\2\2\u02d4\u02d5\7e\2\2"+ - "\u02d5\u02d6\7j\2\2\u02d6\u02d7\3\2\2\2\u02d7\u02d8\b\67\2\2\u02d8o\3"+ - "\2\2\2\u02d9\u02da\7p\2\2\u02da\u02db\7q\2\2\u02db\u02dc\7p\2\2\u02dc"+ - "\u02dd\7g\2\2\u02dd\u02de\3\2\2\2\u02de\u02df\b8\2\2\u02dfq\3\2\2\2\u02e0"+ - "\u02e1\7r\2\2\u02e1\u02e2\7t\2\2\u02e2\u02e3\7g\2\2\u02e3\u02e4\7f\2\2"+ - "\u02e4s\3\2\2\2\u02e5\u02e6\7v\2\2\u02e6\u02e7\7{\2\2\u02e7\u02e8\7r\2"+ - "\2\u02e8\u02e9\7g\2\2\u02e9\u02ea\7Q\2\2\u02ea\u02eb\7h\2\2\u02eb\u02ec"+ - "\3\2\2\2\u02ec\u02ed\b:\2\2\u02edu\3\2\2\2\u02ee\u02ef\7k\2\2\u02ef\u02f0"+ - "\7u\2\2\u02f0\u02f1\7E\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7o\2\2\u02f3"+ - "\u02f4\7r\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2\u02f6\u02f7\7c\2\2"+ - "\u02f7\u02f8\7d\2\2\u02f8\u02f9\7n\2\2\u02f9\u02fa\7g\2\2\u02fa\u02fb"+ - "\3\2\2\2\u02fb\u02fc\b;\2\2\u02fcw\3\2\2\2\u02fd\u02fe\7u\2\2\u02fe\u02ff"+ - "\7j\2\2\u02ff\u0300\7c\2\2\u0300\u0301\7t\2\2\u0301\u0302\7g\2\2\u0302"+ - "y\3\2\2\2\u0303\u0304\7B\2\2\u0304\u0305\3\2\2\2\u0305\u0306\b=\2\2\u0306"+ - "{\3\2\2\2\u0307\u0308\7\60\2\2\u0308\u0309\7\60\2\2\u0309}\3\2\2\2\u030a"+ - "\u030b\7u\2\2\u030b\u030c\7j\2\2\u030c\u030d\7c\2\2\u030d\u030e\7t\2\2"+ - "\u030e\u030f\7g\2\2\u030f\u0310\7f\2\2\u0310\177\3\2\2\2\u0311\u0312\7"+ - "g\2\2\u0312\u0313\7z\2\2\u0313\u0314\7e\2\2\u0314\u0315\7n\2\2\u0315\u0316"+ - "\7w\2\2\u0316\u0317\7u\2\2\u0317\u0318\7k\2\2\u0318\u0319\7x\2\2\u0319"+ - "\u031a\7g\2\2\u031a\u0081\3\2\2\2\u031b\u031c\7r\2\2\u031c\u031d\7t\2"+ - "\2\u031d\u031e\7g\2\2\u031e\u031f\7f\2\2\u031f\u0320\7k\2\2\u0320\u0321"+ - "\7e\2\2\u0321\u0322\7c\2\2\u0322\u0323\7v\2\2\u0323\u0324\7g\2\2\u0324"+ - "\u0083\3\2\2\2\u0325\u0326\7y\2\2\u0326\u0327\7t\2\2\u0327\u0328\7k\2"+ - "\2\u0328\u0329\7v\2\2\u0329\u032a\7g\2\2\u032a\u032b\7R\2\2\u032b\u032c"+ - "\7g\2\2\u032c\u032d\7t\2\2\u032d\u032e\7o\2\2\u032e\u032f\3\2\2\2\u032f"+ - "\u0330\bB\2\2\u0330\u0085\3\2\2\2\u0331\u0332\7p\2\2\u0332\u0333\7q\2"+ - "\2\u0333\u0334\7R\2\2\u0334\u0335\7g\2\2\u0335\u0336\7t\2\2\u0336\u0337"+ - "\7o\2\2\u0337\u0338\3\2\2\2\u0338\u0339\bC\2\2\u0339\u0087\3\2\2\2\u033a"+ - "\u033b\7v\2\2\u033b\u033c\7t\2\2\u033c\u033d\7w\2\2\u033d\u033e\7u\2\2"+ - "\u033e\u033f\7v\2\2\u033f\u0340\7g\2\2\u0340\u0341\7f\2\2\u0341\u0342"+ - "\3\2\2\2\u0342\u0343\bD\2\2\u0343\u0089\3\2\2\2\u0344\u0345\7q\2\2\u0345"+ - "\u0346\7w\2\2\u0346\u0347\7v\2\2\u0347\u0348\7n\2\2\u0348\u0349\7k\2\2"+ - "\u0349\u034a\7p\2\2\u034a\u034b\7g\2\2\u034b\u008b\3\2\2\2\u034c\u034d"+ - "\7k\2\2\u034d\u034e\7p\2\2\u034e\u034f\7k\2\2\u034f\u0350\7v\2\2\u0350"+ - "\u0351\7G\2\2\u0351\u0352\7p\2\2\u0352\u0353\7u\2\2\u0353\u0354\7w\2\2"+ - "\u0354\u0355\7t\2\2\u0355\u0356\7g\2\2\u0356\u0357\7u\2\2\u0357\u008d"+ - "\3\2\2\2\u0358\u0359\7k\2\2\u0359\u035a\7o\2\2\u035a\u035b\7r\2\2\u035b"+ - "\u035c\7q\2\2\u035c\u035d\7t\2\2\u035d\u035e\7v\2\2\u035e\u035f\7T\2\2"+ - "\u035f\u0360\7g\2\2\u0360\u0361\7s\2\2\u0361\u0362\7w\2\2\u0362\u0363"+ - "\7k\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2\2\u0365\u0366\7u\2\2\u0366"+ - "\u008f\3\2\2\2\u0367\u0368\7r\2\2\u0368\u0369\7t\2\2\u0369\u036a\7q\2"+ - "\2\u036a\u036b\7q\2\2\u036b\u036c\7h\2\2\u036c\u0091\3\2\2\2\u036d\u036e"+ - "\7?\2\2\u036e\u036f\7?\2\2\u036f\u0370\7?\2\2\u0370\u0093\3\2\2\2\u0371"+ - "\u0372\7#\2\2\u0372\u0373\7?\2\2\u0373\u0374\7?\2\2\u0374\u0095\3\2\2"+ - "\2\u0375\u0376\7y\2\2\u0376\u0377\7k\2\2\u0377\u0378\7v\2\2\u0378\u0379"+ - "\7j\2\2\u0379\u0097\3\2\2\2\u037a\u037b\7d\2\2\u037b\u037c\7t\2\2\u037c"+ - "\u037d\7g\2\2\u037d\u037e\7c\2\2\u037e\u037f\7m\2\2\u037f\u0380\3\2\2"+ - "\2\u0380\u0381\bL\2\2\u0381\u0099\3\2\2\2\u0382\u0383\7f\2\2\u0383\u0384"+ - "\7g\2\2\u0384\u0385\7h\2\2\u0385\u0386\7c\2\2\u0386\u0387\7w\2\2\u0387"+ - "\u0388\7n\2\2\u0388\u0389\7v\2\2\u0389\u009b\3\2\2\2\u038a\u038b\7h\2"+ - "\2\u038b\u038c\7w\2\2\u038c\u038d\7p\2\2\u038d\u038e\7e\2\2\u038e\u009d"+ - "\3\2\2\2\u038f\u0390\7k\2\2\u0390\u0391\7p\2\2\u0391\u0392\7v\2\2\u0392"+ - "\u0393\7g\2\2\u0393\u0394\7t\2\2\u0394\u0395\7h\2\2\u0395\u0396\7c\2\2"+ - "\u0396\u0397\7e\2\2\u0397\u0398\7g\2\2\u0398\u009f\3\2\2\2\u0399\u039a"+ - "\7u\2\2\u039a\u039b\7g\2\2\u039b\u039c\7n\2\2\u039c\u039d\7g\2\2\u039d"+ - "\u039e\7e\2\2\u039e\u039f\7v\2\2\u039f\u00a1\3\2\2\2\u03a0\u03a1\7e\2"+ - "\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7u\2\2\u03a3\u03a4\7g\2\2\u03a4\u00a3"+ - "\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8\7h\2\2\u03a8"+ - "\u03a9\7g\2\2\u03a9\u03aa\7t\2\2\u03aa\u00a5\3\2\2\2\u03ab\u03ac\7i\2"+ - "\2\u03ac\u03ad\7q\2\2\u03ad\u00a7\3\2\2\2\u03ae\u03af\7o\2\2\u03af\u03b0"+ - "\7c\2\2\u03b0\u03b1\7r\2\2\u03b1\u00a9\3\2\2\2\u03b2\u03b3\7u\2\2\u03b3"+ - "\u03b4\7v\2\2\u03b4\u03b5\7t\2\2\u03b5\u03b6\7w\2\2\u03b6\u03b7\7e\2\2"+ - "\u03b7\u03b8\7v\2\2\u03b8\u00ab\3\2\2\2\u03b9\u03ba\7e\2\2\u03ba\u03bb"+ - "\7j\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7p\2\2\u03bd\u00ad\3\2\2\2\u03be"+ - "\u03bf\7g\2\2\u03bf\u03c0\7n\2\2\u03c0\u03c1\7u\2\2\u03c1\u03c2\7g\2\2"+ - "\u03c2\u00af\3\2\2\2\u03c3\u03c4\7i\2\2\u03c4\u03c5\7q\2\2\u03c5\u03c6"+ - "\7v\2\2\u03c6\u03c7\7q\2\2\u03c7\u00b1\3\2\2\2\u03c8\u03c9\7r\2\2\u03c9"+ - "\u03ca\7c\2\2\u03ca\u03cb\7e\2\2\u03cb\u03cc\7m\2\2\u03cc\u03cd\7c\2\2"+ - "\u03cd\u03ce\7i\2\2\u03ce\u03cf\7g\2\2\u03cf\u00b3\3\2\2\2\u03d0\u03d1"+ - "\7u\2\2\u03d1\u03d2\7y\2\2\u03d2\u03d3\7k\2\2\u03d3\u03d4\7v\2\2\u03d4"+ - "\u03d5\7e\2\2\u03d5\u03d6\7j\2\2\u03d6\u00b5\3\2\2\2\u03d7\u03d8\7e\2"+ - "\2\u03d8\u03d9\7q\2\2\u03d9\u03da\7p\2\2\u03da\u03db\7u\2\2\u03db\u03dc"+ - "\7v\2\2\u03dc\u00b7\3\2\2\2\u03dd\u03de\7h\2\2\u03de\u03df\7c\2\2\u03df"+ - "\u03e0\7n\2\2\u03e0\u03e1\7n\2\2\u03e1\u03e2\7v\2\2\u03e2\u03e3\7j\2\2"+ - "\u03e3\u03e4\7t\2\2\u03e4\u03e5\7q\2\2\u03e5\u03e6\7w\2\2\u03e6\u03e7"+ - "\7i\2\2\u03e7\u03e8\7j\2\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\b\\\2\2\u03ea"+ - "\u00b9\3\2\2\2\u03eb\u03ec\7k\2\2\u03ec\u03ed\7h\2\2\u03ed\u00bb\3\2\2"+ - "\2\u03ee\u03ef\7t\2\2\u03ef\u03f0\7c\2\2\u03f0\u03f1\7p\2\2\u03f1\u03f2"+ - "\7i\2\2\u03f2\u03f3\7g\2\2\u03f3\u00bd\3\2\2\2\u03f4\u03f5\7v\2\2\u03f5"+ - "\u03f6\7{\2\2\u03f6\u03f7\7r\2\2\u03f7\u03f8\7g\2\2\u03f8\u00bf\3\2\2"+ - "\2\u03f9\u03fa\7e\2\2\u03fa\u03fb\7q\2\2\u03fb\u03fc\7p\2\2\u03fc\u03fd"+ - "\7v\2\2\u03fd\u03fe\7k\2\2\u03fe\u03ff\7p\2\2\u03ff\u0400\7w\2\2\u0400"+ - "\u0401\7g\2\2\u0401\u0402\3\2\2\2\u0402\u0403\b`\2\2\u0403\u00c1\3\2\2"+ - "\2\u0404\u0405\7h\2\2\u0405\u0406\7q\2\2\u0406\u0407\7t\2\2\u0407\u00c3"+ - "\3\2\2\2\u0408\u0409\7k\2\2\u0409\u040a\7o\2\2\u040a\u040b\7r\2\2\u040b"+ - "\u040c\7q\2\2\u040c\u040d\7t\2\2\u040d\u040e\7v\2\2\u040e\u00c5\3\2\2"+ - "\2\u040f\u0410\7t\2\2\u0410\u0411\7g\2\2\u0411\u0412\7v\2\2\u0412\u0413"+ - "\7w\2\2\u0413\u0414\7t\2\2\u0414\u0415\7p\2\2\u0415\u0416\3\2\2\2\u0416"+ - "\u0417\bc\2\2\u0417\u00c7\3\2\2\2\u0418\u0419\7x\2\2\u0419\u041a\7c\2"+ - "\2\u041a\u041b\7t\2\2\u041b\u00c9\3\2\2\2\u041c\u041d\7p\2\2\u041d\u041e"+ - "\7k\2\2\u041e\u041f\7n\2\2\u041f\u0420\3\2\2\2\u0420\u0421\be\2\2\u0421"+ - "\u00cb\3\2\2\2\u0422\u0427\5\u014e\u00a7\2\u0423\u0426\5\u014e\u00a7\2"+ - "\u0424\u0426\5\u0150\u00a8\2\u0425\u0423\3\2\2\2\u0425\u0424\3\2\2\2\u0426"+ - "\u0429\3\2\2\2\u0427\u0425\3\2\2\2\u0427\u0428\3\2\2\2\u0428\u042a\3\2"+ - "\2\2\u0429\u0427\3\2\2\2\u042a\u042b\bf\2\2\u042b\u00cd\3\2\2\2\u042c"+ - "\u042d\7*\2\2\u042d\u00cf\3\2\2\2\u042e\u042f\7+\2\2\u042f\u0430\3\2\2"+ - "\2\u0430\u0431\bh\2\2\u0431\u00d1\3\2\2\2\u0432\u0433\7}\2\2\u0433\u00d3"+ - "\3\2\2\2\u0434\u0435\7\177\2\2\u0435\u0436\3\2\2\2\u0436\u0437\bj\2\2"+ - "\u0437\u00d5\3\2\2\2\u0438\u0439\7]\2\2\u0439\u00d7\3\2\2\2\u043a\u043b"+ - "\7_\2\2\u043b\u043c\3\2\2\2\u043c\u043d\bl\2\2\u043d\u00d9\3\2\2\2\u043e"+ - "\u043f\7?\2\2\u043f\u00db\3\2\2\2\u0440\u0441\7.\2\2\u0441\u00dd\3\2\2"+ - "\2\u0442\u0443\7=\2\2\u0443\u00df\3\2\2\2\u0444\u0445\7<\2\2\u0445\u00e1"+ - "\3\2\2\2\u0446\u0447\7\60\2\2\u0447\u00e3\3\2\2\2\u0448\u0449\7-\2\2\u0449"+ - "\u044a\7-\2\2\u044a\u044b\3\2\2\2\u044b\u044c\br\2\2\u044c\u00e5\3\2\2"+ - "\2\u044d\u044e\7/\2\2\u044e\u044f\7/\2\2\u044f\u0450\3\2\2\2\u0450\u0451"+ - "\bs\2\2\u0451\u00e7\3\2\2\2\u0452\u0453\7<\2\2\u0453\u0454\7?\2\2\u0454"+ - "\u00e9\3\2\2\2\u0455\u0456\7\60\2\2\u0456\u0457\7\60\2\2\u0457\u0458\7"+ - "\60\2\2\u0458\u00eb\3\2\2\2\u0459\u045a\7~\2\2\u045a\u045b\7~\2\2\u045b"+ - "\u00ed\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7(\2\2\u045e\u00ef\3\2\2"+ - "\2\u045f\u0460\7?\2\2\u0460\u0461\7?\2\2\u0461\u00f1\3\2\2\2\u0462\u0463"+ - "\7#\2\2\u0463\u0464\7?\2\2\u0464\u00f3\3\2\2\2\u0465\u0466\7>\2\2\u0466"+ - "\u00f5\3\2\2\2\u0467\u0468\7>\2\2\u0468\u0469\7?\2\2\u0469\u00f7\3\2\2"+ - "\2\u046a\u046b\7@\2\2\u046b\u00f9\3\2\2\2\u046c\u046d\7@\2\2\u046d\u046e"+ - "\7?\2\2\u046e\u00fb\3\2\2\2\u046f\u0470\7~\2\2\u0470\u00fd\3\2\2\2\u0471"+ - "\u0472\7\61\2\2\u0472\u00ff\3\2\2\2\u0473\u0474\7\'\2\2\u0474\u0101\3"+ - "\2\2\2\u0475\u0476\7>\2\2\u0476\u0477\7>\2\2\u0477\u0103\3\2\2\2\u0478"+ - "\u0479\7@\2\2\u0479\u047a\7@\2\2\u047a\u0105\3\2\2\2\u047b\u047c\7(\2"+ - "\2\u047c\u047d\7`\2\2\u047d\u0107\3\2\2\2\u047e\u047f\7#\2\2\u047f\u0109"+ - "\3\2\2\2\u0480\u0481\7-\2\2\u0481\u010b\3\2\2\2\u0482\u0483\7/\2\2\u0483"+ - "\u010d\3\2\2\2\u0484\u0485\7`\2\2\u0485\u010f\3\2\2\2\u0486\u0487\7,\2"+ - "\2\u0487\u0111\3\2\2\2\u0488\u0489\7(\2\2\u0489\u0113\3\2\2\2\u048a\u048b"+ - "\7>\2\2\u048b\u048c\7/\2\2\u048c\u0115\3\2\2\2\u048d\u0499\7\62\2\2\u048e"+ - "\u0495\t\2\2\2\u048f\u0491\7a\2\2\u0490\u048f\3\2\2\2\u0490\u0491\3\2"+ - "\2\2\u0491\u0492\3\2\2\2\u0492\u0494\t\3\2\2\u0493\u0490\3\2\2\2\u0494"+ - "\u0497\3\2\2\2\u0495\u0493\3\2\2\2\u0495\u0496\3\2\2\2\u0496\u0499\3\2"+ - "\2\2\u0497\u0495\3\2\2\2\u0498\u048d\3\2\2\2\u0498\u048e\3\2\2\2\u0499"+ - "\u049a\3\2\2\2\u049a\u049b\b\u008b\2\2\u049b\u0117\3\2\2\2\u049c\u049d"+ - "\7\62\2\2\u049d\u04a2\t\4\2\2\u049e\u04a0\7a\2\2\u049f\u049e\3\2\2\2\u049f"+ - "\u04a0\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a3\5\u014a\u00a5\2\u04a2\u049f"+ - "\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a2\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a5"+ - "\u04a6\3\2\2\2\u04a6\u04a7\b\u008c\2\2\u04a7\u0119\3\2\2\2\u04a8\u04aa"+ - "\7\62\2\2\u04a9\u04ab\t\5\2\2\u04aa\u04a9\3\2\2\2\u04aa\u04ab\3\2\2\2"+ - "\u04ab\u04b0\3\2\2\2\u04ac\u04ae\7a\2\2\u04ad\u04ac\3\2\2\2\u04ad\u04ae"+ - "\3\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04b1\5\u0146\u00a3\2\u04b0\u04ad\3"+ - "\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b0\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3"+ - "\u04b4\3\2\2\2\u04b4\u04b5\b\u008d\2\2\u04b5\u011b\3\2\2\2\u04b6\u04b7"+ - "\7\62\2\2\u04b7\u04bc\t\6\2\2\u04b8\u04ba\7a\2\2\u04b9\u04b8\3\2\2\2\u04b9"+ - "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0148\u00a4\2\u04bc\u04b9"+ - "\3\2\2\2\u04bd\u04be\3\2\2\2\u04be\u04bc\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf"+ - "\u04c0\3\2\2\2\u04c0\u04c1\b\u008e\2\2\u04c1\u011d\3\2\2\2\u04c2\u04c3"+ - "\7\62\2\2\u04c3\u04c4\t\6\2\2\u04c4\u04c5\5\u0120\u0090\2\u04c5\u04c6"+ - "\5\u0122\u0091\2\u04c6\u011f\3\2\2\2\u04c7\u04c9\7a\2\2\u04c8\u04c7\3"+ - "\2\2\2\u04c8\u04c9\3\2\2\2\u04c9\u04ca\3\2\2\2\u04ca\u04cc\5\u0148\u00a4"+ - "\2\u04cb\u04c8\3\2\2\2\u04cc\u04cd\3\2\2\2\u04cd\u04cb\3\2\2\2\u04cd\u04ce"+ - "\3\2\2\2\u04ce\u04d9\3\2\2\2\u04cf\u04d6\7\60\2\2\u04d0\u04d2\7a\2\2\u04d1"+ - "\u04d0\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u04d3\3\2\2\2\u04d3\u04d5\5\u0148"+ - "\u00a4\2\u04d4\u04d1\3\2\2\2\u04d5\u04d8\3\2\2\2\u04d6\u04d4\3\2\2\2\u04d6"+ - "\u04d7\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d9\u04cf\3\2"+ - "\2\2\u04d9\u04da\3\2\2\2\u04da\u04e7\3\2\2\2\u04db\u04dc\7\60\2\2\u04dc"+ - "\u04e3\5\u0148\u00a4\2\u04dd\u04df\7a\2\2\u04de\u04dd\3\2\2\2\u04de\u04df"+ - "\3\2\2\2\u04df\u04e0\3\2\2\2\u04e0\u04e2\5\u0148\u00a4\2\u04e1\u04de\3"+ - "\2\2\2\u04e2\u04e5\3\2\2\2\u04e3\u04e1\3\2\2\2\u04e3\u04e4\3\2\2\2\u04e4"+ - "\u04e7\3\2\2\2\u04e5\u04e3\3\2\2\2\u04e6\u04cb\3\2\2\2\u04e6\u04db\3\2"+ - "\2\2\u04e7\u0121\3\2\2\2\u04e8\u04e9\t\7\2\2\u04e9\u04ea\t\b\2\2\u04ea"+ - "\u04eb\5\u0144\u00a2\2\u04eb\u0123\3\2\2\2\u04ec\u04f2\5\u0116\u008b\2"+ - "\u04ed\u04f2\5\u0118\u008c\2\u04ee\u04f2\5\u011a\u008d\2\u04ef\u04f2\5"+ - "\u011c\u008e\2\u04f0\u04f2\5\4\2\2\u04f1\u04ec\3\2\2\2\u04f1\u04ed\3\2"+ - "\2\2\u04f1\u04ee\3\2\2\2\u04f1\u04ef\3\2\2\2\u04f1\u04f0\3\2\2\2\u04f2"+ - "\u04f3\3\2\2\2\u04f3\u04f4\7k\2\2\u04f4\u04f5\3\2\2\2\u04f5\u04f6\b\u0092"+ - "\2\2\u04f6\u0125\3\2\2\2\u04f7\u04fa\7)\2\2\u04f8\u04fb\5\u0140\u00a0"+ - "\2\u04f9\u04fb\5\u012a\u0095\2\u04fa\u04f8\3\2\2\2\u04fa\u04f9\3\2\2\2"+ - "\u04fb\u04fc\3\2\2\2\u04fc\u04fd\7)\2\2\u04fd\u0127\3\2\2\2\u04fe\u04ff"+ - "\5\u0126\u0093\2\u04ff\u0500\3\2\2\2\u0500\u0501\b\u0094\2\2\u0501\u0129"+ - "\3\2\2\2\u0502\u0505\5\u012c\u0096\2\u0503\u0505\5\u012e\u0097\2\u0504"+ - "\u0502\3\2\2\2\u0504\u0503\3\2\2\2\u0505\u012b\3\2\2\2\u0506\u0507\7^"+ - "\2\2\u0507\u0508\5\u0146\u00a3\2\u0508\u0509\5\u0146\u00a3\2\u0509\u050a"+ - "\5\u0146\u00a3\2\u050a\u012d\3\2\2\2\u050b\u050c\7^\2\2\u050c\u050d\7"+ - "z\2\2\u050d\u050e\5\u0148\u00a4\2\u050e\u050f\5\u0148\u00a4\2\u050f\u012f"+ - "\3\2\2\2\u0510\u0511\7^\2\2\u0511\u0512\7w\2\2\u0512\u0513\5\u0148\u00a4"+ - "\2\u0513\u0514\5\u0148\u00a4\2\u0514\u0515\5\u0148\u00a4\2\u0515\u0516"+ - "\5\u0148\u00a4\2\u0516\u0131\3\2\2\2\u0517\u0518\7^\2\2\u0518\u0519\7"+ - "W\2\2\u0519\u051a\5\u0148\u00a4\2\u051a\u051b\5\u0148\u00a4\2\u051b\u051c"+ - "\5\u0148\u00a4\2\u051c\u051d\5\u0148\u00a4\2\u051d\u051e\5\u0148\u00a4"+ - "\2\u051e\u051f\5\u0148\u00a4\2\u051f\u0520\5\u0148\u00a4\2\u0520\u0521"+ - "\5\u0148\u00a4\2\u0521\u0133\3\2\2\2\u0522\u0526\7b\2\2\u0523\u0525\n"+ - "\t\2\2\u0524\u0523\3\2\2\2\u0525\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0526"+ - "\u0527\3\2\2\2\u0527\u0529\3\2\2\2\u0528\u0526\3\2\2\2\u0529\u052a\7b"+ - "\2\2\u052a\u052b\3\2\2\2\u052b\u052c\b\u009a\2\2\u052c\u0135\3\2\2\2\u052d"+ - "\u0532\7$\2\2\u052e\u0531\n\n\2\2\u052f\u0531\5\u0142\u00a1\2\u0530\u052e"+ - "\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0534\3\2\2\2\u0532\u0530\3\2\2\2\u0532"+ - "\u0533\3\2\2\2\u0533\u0535\3\2\2\2\u0534\u0532\3\2\2\2\u0535\u0536\7$"+ - "\2\2\u0536\u0537\3\2\2\2\u0537\u0538\b\u009b\2\2\u0538\u0137\3\2\2\2\u0539"+ - "\u053b\t\13\2\2\u053a\u0539\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053a\3"+ - "\2\2\2\u053c\u053d\3\2\2\2\u053d\u053e\3\2\2\2\u053e\u053f\b\u009c\3\2"+ - "\u053f\u0139\3\2\2\2\u0540\u0541\7\61\2\2\u0541\u0542\7,\2\2\u0542\u0546"+ - "\3\2\2\2\u0543\u0545\13\2\2\2\u0544\u0543\3\2\2\2\u0545\u0548\3\2\2\2"+ - "\u0546\u0547\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\3\2\2\2\u0548\u0546"+ - "\3\2\2\2\u0549\u054a\7,\2\2\u054a\u054b\7\61\2\2\u054b\u054c\3\2\2\2\u054c"+ - "\u054d\b\u009d\3\2\u054d\u013b\3\2\2\2\u054e\u0550\t\f\2\2\u054f\u054e"+ - "\3\2\2\2\u0550\u0551\3\2\2\2\u0551\u054f\3\2\2\2\u0551\u0552\3\2\2\2\u0552"+ - "\u0553\3\2\2\2\u0553\u0554\b\u009e\3\2\u0554\u013d\3\2\2\2\u0555\u0556"+ - "\7\61\2\2\u0556\u0557\7\61\2\2\u0557\u055b\3\2\2\2\u0558\u055a\n\f\2\2"+ - "\u0559\u0558\3\2\2\2\u055a\u055d\3\2\2\2\u055b\u0559\3\2\2\2\u055b\u055c"+ - "\3\2\2\2\u055c\u055e\3\2\2\2\u055d\u055b\3\2\2\2\u055e\u055f\b\u009f\3"+ - "\2\u055f\u013f\3\2\2\2\u0560\u0565\n\r\2\2\u0561\u0565\5\u0130\u0098\2"+ - "\u0562\u0565\5\u0132\u0099\2\u0563\u0565\5\u0142\u00a1\2\u0564\u0560\3"+ - "\2\2\2\u0564\u0561\3\2\2\2\u0564\u0562\3\2\2\2\u0564\u0563\3\2\2\2\u0565"+ - "\u0141\3\2\2\2\u0566\u0580\7^\2\2\u0567\u0568\7w\2\2\u0568\u0569\5\u0148"+ - "\u00a4\2\u0569\u056a\5\u0148\u00a4\2\u056a\u056b\5\u0148\u00a4\2\u056b"+ - "\u056c\5\u0148\u00a4\2\u056c\u0581\3\2\2\2\u056d\u056e\7W\2\2\u056e\u056f"+ - "\5\u0148\u00a4\2\u056f\u0570\5\u0148\u00a4\2\u0570\u0571\5\u0148\u00a4"+ - "\2\u0571\u0572\5\u0148\u00a4\2\u0572\u0573\5\u0148\u00a4\2\u0573\u0574"+ - "\5\u0148\u00a4\2\u0574\u0575\5\u0148\u00a4\2\u0575\u0576\5\u0148\u00a4"+ - "\2\u0576\u0581\3\2\2\2\u0577\u0581\t\16\2\2\u0578\u0579\5\u0146\u00a3"+ - "\2\u0579\u057a\5\u0146\u00a3\2\u057a\u057b\5\u0146\u00a3\2\u057b\u0581"+ - "\3\2\2\2\u057c\u057d\7z\2\2\u057d\u057e\5\u0148\u00a4\2\u057e\u057f\5"+ - "\u0148\u00a4\2\u057f\u0581\3\2\2\2\u0580\u0567\3\2\2\2\u0580\u056d\3\2"+ - "\2\2\u0580\u0577\3\2\2\2\u0580\u0578\3\2\2\2\u0580\u057c\3\2\2\2\u0581"+ - "\u0143\3\2\2\2\u0582\u0589\t\3\2\2\u0583\u0585\7a\2\2\u0584\u0583\3\2"+ - "\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0588\t\3\2\2\u0587"+ - "\u0584\3\2\2\2\u0588\u058b\3\2\2\2\u0589\u0587\3\2\2\2\u0589\u058a\3\2"+ - "\2\2\u058a\u0145\3\2\2\2\u058b\u0589\3\2\2\2\u058c\u058d\t\17\2\2\u058d"+ - "\u0147\3\2\2\2\u058e\u058f\t\20\2\2\u058f\u0149\3\2\2\2\u0590\u0591\t"+ - "\21\2\2\u0591\u014b\3\2\2\2\u0592\u0594\t\22\2\2\u0593\u0595\t\b\2\2\u0594"+ - "\u0593\3\2\2\2\u0594\u0595\3\2\2\2\u0595\u0596\3\2\2\2\u0596\u0597\5\u0144"+ - "\u00a2\2\u0597\u014d\3\2\2\2\u0598\u059b\5\u0152\u00a9\2\u0599\u059b\7"+ - "a\2\2\u059a\u0598\3\2\2\2\u059a\u0599\3\2\2\2\u059b\u014f\3\2\2\2\u059c"+ - "\u059d\t\23\2\2\u059d\u0151\3\2\2\2\u059e\u059f\t\24\2\2\u059f\u0153\3"+ - "\2\2\2\u05a0\u05a2\t\13\2\2\u05a1\u05a0\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3"+ - "\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05a6\b\u00aa"+ - "\3\2\u05a6\u0155\3\2\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9"+ - "\u05ad\3\2\2\2\u05aa\u05ac\n\f\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2"+ - "\2\2\u05ad\u05ae\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af"+ - "\u05ad\3\2\2\2\u05b0\u05b1\7,\2\2\u05b1\u05b2\7\61\2\2\u05b2\u05b3\3\2"+ - "\2\2\u05b3\u05b4\b\u00ab\3\2\u05b4\u0157\3\2\2\2\u05b5\u05b6\7\61\2\2"+ - "\u05b6\u05b7\7\61\2\2\u05b7\u05bb\3\2\2\2\u05b8\u05ba\n\f\2\2\u05b9\u05b8"+ - "\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc"+ - "\u05be\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\b\u00ac\3\2\u05bf\u0159"+ - "\3\2\2\2\u05c0\u05c2\t\f\2\2\u05c1\u05c0\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3"+ - "\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05d3\3\2\2\2\u05c5\u05d3\7="+ - "\2\2\u05c6\u05c7\7\61\2\2\u05c7\u05c8\7,\2\2\u05c8\u05cc\3\2\2\2\u05c9"+ - "\u05cb\13\2\2\2\u05ca\u05c9\3\2\2\2\u05cb\u05ce\3\2\2\2\u05cc\u05cd\3"+ - "\2\2\2\u05cc\u05ca\3\2\2\2\u05cd\u05cf\3\2\2\2\u05ce\u05cc\3\2\2\2\u05cf"+ - "\u05d0\7,\2\2\u05d0\u05d3\7\61\2\2\u05d1\u05d3\7\2\2\3\u05d2\u05c1\3\2"+ - "\2\2\u05d2\u05c5\3\2\2\2\u05d2\u05c6\3\2\2\2\u05d2\u05d1\3\2\2\2\u05d3"+ - "\u05d4\3\2\2\2\u05d4\u05d5\b\u00ad\4\2\u05d5\u015b\3\2\2\2\u05d6\u05d7"+ - "\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u05d9\b\u00ae\4\2\u05d9\u05da\b\u00ae"+ - "\3\2\u05da\u015d\3\2\2\2\64\2\3\u0160\u0168\u016b\u016e\u0174\u0176\u0425"+ - "\u0427\u0490\u0495\u0498\u049f\u04a4\u04aa\u04ad\u04b2\u04b9\u04be\u04c8"+ - "\u04cd\u04d1\u04d6\u04d9\u04de\u04e3\u04e6\u04f1\u04fa\u0504\u0526\u0530"+ - "\u0532\u053c\u0546\u0551\u055b\u0564\u0580\u0584\u0589\u0594\u059a\u05a3"+ - "\u05ad\u05bb\u05c3\u05cc\u05d2\5\4\3\2\2\3\2\4\2\2"; + "\u0004\u0000\u00a0\u05d9\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ + "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ + "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ + "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ + "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ + "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ + "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ + "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ + "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ + "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ + "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ + " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ + "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ + "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ + "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ + "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ + "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ + ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ + "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ + "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ + "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ + "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ + "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ + "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ + "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ + "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ + "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ + "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ + "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ + "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ + "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ + "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ + "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ + "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ + "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ + "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ + "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ + "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ + "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ + "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ + "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ + "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ + "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ + "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ + "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ + "\u00ac\u0007\u00ac\u0001\u0000\u0001\u0000\u0003\u0000\u015f\b\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u0167\b\u0001\u0001\u0001\u0003\u0001\u016a\b\u0001\u0001\u0001"+ + "\u0003\u0001\u016d\b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0003\u0001\u0173\b\u0001\u0003\u0001\u0175\b\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\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\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ + "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + "/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ + "4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "8\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001=\u0001"+ + "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001"+ + "G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001"+ + "O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001P\u0001P\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001"+ + "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001"+ + "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ + "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001"+ + "b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ + "d\u0001d\u0005d\u0424\bd\nd\fd\u0427\td\u0001d\u0001d\u0001e\u0001e\u0001"+ + "f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001"+ + "i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001l\u0001l\u0001"+ + "m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001"+ + "p\u0001q\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001s\u0001"+ + "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001"+ + "v\u0001v\u0001w\u0001w\u0001w\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ + "z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001"+ + "~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083"+ + "\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086"+ + "\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0089\u0001\u0089\u0001\u0089\u0003\u0089\u048f\b\u0089\u0001\u0089"+ + "\u0005\u0089\u0492\b\u0089\n\u0089\f\u0089\u0495\t\u0089\u0003\u0089\u0497"+ + "\b\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003"+ + "\u008a\u049e\b\u008a\u0001\u008a\u0004\u008a\u04a1\b\u008a\u000b\u008a"+ + "\f\u008a\u04a2\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0003\u008b"+ + "\u04a9\b\u008b\u0001\u008b\u0003\u008b\u04ac\b\u008b\u0001\u008b\u0004"+ + "\u008b\u04af\b\u008b\u000b\u008b\f\u008b\u04b0\u0001\u008b\u0001\u008b"+ + "\u0001\u008c\u0001\u008c\u0001\u008c\u0003\u008c\u04b8\b\u008c\u0001\u008c"+ + "\u0004\u008c\u04bb\b\u008c\u000b\u008c\f\u008c\u04bc\u0001\u008c\u0001"+ + "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008e\u0003\u008e\u04c7\b\u008e\u0001\u008e\u0004\u008e\u04ca\b\u008e"+ + "\u000b\u008e\f\u008e\u04cb\u0001\u008e\u0001\u008e\u0003\u008e\u04d0\b"+ + "\u008e\u0001\u008e\u0005\u008e\u04d3\b\u008e\n\u008e\f\u008e\u04d6\t\u008e"+ + "\u0003\u008e\u04d8\b\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0003\u008e"+ + "\u04dd\b\u008e\u0001\u008e\u0005\u008e\u04e0\b\u008e\n\u008e\f\u008e\u04e3"+ + "\t\u008e\u0003\u008e\u04e5\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0003\u0090\u04f0\b\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090"+ + "\u0001\u0091\u0001\u0091\u0001\u0091\u0003\u0091\u04f9\b\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093"+ + "\u0001\u0093\u0003\u0093\u0503\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096"+ + "\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097"+ + "\u0001\u0097\u0001\u0098\u0001\u0098\u0005\u0098\u0523\b\u0098\n\u0098"+ + "\f\u0098\u0526\t\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098"+ + "\u0001\u0099\u0001\u0099\u0001\u0099\u0005\u0099\u052f\b\u0099\n\u0099"+ + "\f\u0099\u0532\t\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u009a\u0004\u009a\u0539\b\u009a\u000b\u009a\f\u009a\u053a\u0001"+ + "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0005"+ + "\u009b\u0543\b\u009b\n\u009b\f\u009b\u0546\t\u009b\u0001\u009b\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0004\u009c\u054e\b\u009c"+ + "\u000b\u009c\f\u009c\u054f\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d"+ + "\u0001\u009d\u0001\u009d\u0005\u009d\u0558\b\u009d\n\u009d\f\u009d\u055b"+ + "\t\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0003\u009e\u0563\b\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0003\u009f\u057f"+ + "\b\u009f\u0001\u00a0\u0001\u00a0\u0003\u00a0\u0583\b\u00a0\u0001\u00a0"+ + "\u0005\u00a0\u0586\b\u00a0\n\u00a0\f\u00a0\u0589\t\u00a0\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001"+ + "\u00a4\u0003\u00a4\u0593\b\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001"+ + "\u00a5\u0003\u00a5\u0599\b\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a8\u0004\u00a8\u05a0\b\u00a8\u000b\u00a8\f\u00a8\u05a1"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ + "\u0005\u00a9\u05aa\b\u00a9\n\u00a9\f\u00a9\u05ad\t\u00a9\u0001\u00a9\u0001"+ + "\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001"+ + "\u00aa\u0001\u00aa\u0005\u00aa\u05b8\b\u00aa\n\u00aa\f\u00aa\u05bb\t\u00aa"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0004\u00ab\u05c0\b\u00ab\u000b\u00ab"+ + "\f\u00ab\u05c1\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0005\u00ab\u05c9\b\u00ab\n\u00ab\f\u00ab\u05cc\t\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0003\u00ab\u05d1\b\u00ab\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u0544\u05ab"+ + "\u05ca\u0000\u00ad\u0002\u0001\u0004\u0002\u0006\u0003\b\u0004\n\u0005"+ + "\f\u0006\u000e\u0007\u0010\b\u0012\t\u0014\n\u0016\u000b\u0018\f\u001a"+ + "\r\u001c\u000e\u001e\u000f \u0010\"\u0011$\u0012&\u0013(\u0014*\u0015"+ + ",\u0016.\u00170\u00182\u00194\u001a6\u001b8\u001c:\u001d<\u001e>\u001f"+ + "@ B!D\"F#H$J%L&N\'P(R)T*V+X,Z-\\.^/`0b1d2f3h4j5l6n7p8r9t:v;x~?\u0080"+ + "@\u0082A\u0084B\u0086C\u0088D\u008aE\u008cF\u008eG\u0090H\u0092I\u0094"+ + "J\u0096K\u0098L\u009aM\u009cN\u009eO\u00a0P\u00a2Q\u00a4R\u00a6S\u00a8"+ + "T\u00aaU\u00acV\u00aeW\u00b0X\u00b2Y\u00b4Z\u00b6[\u00b8\\\u00ba]\u00bc"+ + "^\u00be_\u00c0`\u00c2a\u00c4b\u00c6c\u00c8d\u00cae\u00ccf\u00ceg\u00d0"+ + "h\u00d2i\u00d4j\u00d6k\u00d8l\u00dam\u00dcn\u00deo\u00e0p\u00e2q\u00e4"+ + "r\u00e6s\u00e8t\u00eau\u00ecv\u00eew\u00f0x\u00f2y\u00f4z\u00f6{\u00f8"+ + "|\u00fa}\u00fc~\u00fe\u007f\u0100\u0080\u0102\u0081\u0104\u0082\u0106"+ + "\u0083\u0108\u0084\u010a\u0085\u010c\u0086\u010e\u0087\u0110\u0088\u0112"+ + "\u0089\u0114\u008a\u0116\u008b\u0118\u008c\u011a\u008d\u011c\u008e\u011e"+ + "\u0000\u0120\u0000\u0122\u008f\u0124\u0000\u0126\u0090\u0128\u0091\u012a"+ + "\u0092\u012c\u0093\u012e\u0094\u0130\u0095\u0132\u0096\u0134\u0097\u0136"+ + "\u0098\u0138\u0099\u013a\u009a\u013c\u009b\u013e\u0000\u0140\u0000\u0142"+ + "\u0000\u0144\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014c\u0000\u014e"+ + "\u0000\u0150\u0000\u0152\u009c\u0154\u009d\u0156\u009e\u0158\u009f\u015a"+ + "\u00a0\u0002\u0000\u0001\u0013\u0001\u000019\u0001\u000009\u0002\u0000"+ + "BBbb\u0002\u0000OOoo\u0002\u0000XXxx\u0002\u0000PPpp\u0002\u0000++--\u0001"+ + "\u0000``\u0002\u0000\"\"\\\\\u0002\u0000\t\t \u0002\u0000\n\n\r\r\u0003"+ + "\u0000\n\n\r\r\'\'\t\u0000\"\"\'\'\\\\abffnnrrttvv\u0001\u000007\u0003"+ + "\u000009AFaf\u0001\u000001\u0002\u0000EEee>\u000009\u0660\u0669\u06f0"+ + "\u06f9\u07c0\u07c9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66"+ + "\u0b6f\u0be6\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0de6\u0def\u0e50"+ + "\u0e59\u0ed0\u0ed9\u0f20\u0f29\u1040\u1049\u1090\u1099\u17e0\u17e9\u1810"+ + "\u1819\u1946\u194f\u19d0\u19d9\u1a80\u1a89\u1a90\u1a99\u1b50\u1b59\u1bb0"+ + "\u1bb9\u1c40\u1c49\u1c50\u1c59\u8000\ua620\u8000\ua629\u8000\ua8d0\u8000"+ + "\ua8d9\u8000\ua900\u8000\ua909\u8000\ua9d0\u8000\ua9d9\u8000\ua9f0\u8000"+ + "\ua9f9\u8000\uaa50\u8000\uaa59\u8000\uabf0\u8000\uabf9\u8000\uff10\u8000"+ + "\uff19\u8001\u04a0\u8001\u04a9\u8001\u0d30\u8001\u0d39\u8001\u1066\u8001"+ + "\u106f\u8001\u10f0\u8001\u10f9\u8001\u1136\u8001\u113f\u8001\u11d0\u8001"+ + "\u11d9\u8001\u12f0\u8001\u12f9\u8001\u1450\u8001\u1459\u8001\u14d0\u8001"+ + "\u14d9\u8001\u1650\u8001\u1659\u8001\u16c0\u8001\u16c9\u8001\u1730\u8001"+ + "\u1739\u8001\u18e0\u8001\u18e9\u8001\u1950\u8001\u1959\u8001\u1c50\u8001"+ + "\u1c59\u8001\u1d50\u8001\u1d59\u8001\u1da0\u8001\u1da9\u8001\u6a60\u8001"+ + "\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6b50\u8001\u6b59\u8001\ud7ce\u8001"+ + "\ud7ff\u8001\ue140\u8001\ue149\u8001\ue2f0\u8001\ue2f9\u8001\ue950\u8001"+ + "\ue959\u8001\ufbf0\u8001\ufbf9\u0288\u0000AZaz\u00aa\u00aa\u00b5\u00b5"+ + "\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02c1\u02c6\u02d1\u02e0\u02e4"+ + "\u02ec\u02ec\u02ee\u02ee\u0370\u0374\u0376\u0377\u037a\u037d\u037f\u037f"+ + "\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03f5\u03f7\u0481"+ + "\u048a\u052f\u0531\u0556\u0559\u0559\u0560\u0588\u05d0\u05ea\u05ef\u05f2"+ + "\u0620\u064a\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06e5\u06e6\u06ee\u06ef"+ + "\u06fa\u06fc\u06ff\u06ff\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1"+ + "\u07ca\u07ea\u07f4\u07f5\u07fa\u07fa\u0800\u0815\u081a\u081a\u0824\u0824"+ + "\u0828\u0828\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0\u08c9"+ + "\u0904\u0939\u093d\u093d\u0950\u0950\u0958\u0961\u0971\u0980\u0985\u098c"+ + "\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd"+ + "\u09ce\u09ce\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u09fc\u09fc\u0a05\u0a0a"+ + "\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39"+ + "\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8"+ + "\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1"+ + "\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33"+ + "\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83"+ + "\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f"+ + "\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0c05\u0c0c\u0c0e\u0c10"+ + "\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d\u0c60\u0c61"+ + "\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9"+ + "\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c\u0d0e\u0d10"+ + "\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61\u0d7a\u0d7f"+ + "\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6\u0e01\u0e30"+ + "\u0e32\u0e33\u0e40\u0e46\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a\u0e8c\u0ea3"+ + "\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6"+ + "\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a"+ + "\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e\u1070"+ + "\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa"+ + "\u10fc\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260\u1288"+ + "\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5"+ + "\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5"+ + "\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16f1\u16f8"+ + "\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780\u17b3"+ + "\u17d7\u17d7\u17dc\u17dc\u1820\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa"+ + "\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9"+ + "\u1a00\u1a16\u1a20\u1a54\u1aa7\u1aa7\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0"+ + "\u1bae\u1baf\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c7d\u1c80\u1c88"+ + "\u1c90\u1cba\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa"+ + "\u1d00\u1dbf\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57"+ + "\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc"+ + "\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec"+ + "\u1ff2\u1ff4\u1ff6\u1ffc\u2071\u2071\u207f\u207f\u2090\u209c\u2102\u2102"+ + "\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124\u2126\u2126"+ + "\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149\u214e\u214e"+ + "\u2183\u2184\u2c00\u2ce4\u2ceb\u2cee\u2cf2\u2cf3\u2d00\u2d25\u2d27\u2d27"+ + "\u2d2d\u2d2d\u2d30\u2d67\u2d6f\u2d6f\u2d80\u2d96\u2da0\u2da6\u2da8\u2dae"+ + "\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6\u2dd8\u2dde"+ + "\u2e2f\u2e2f\u3005\u3006\u3031\u3035\u303b\u303c\u3041\u3096\u309d\u309f"+ + "\u30a1\u30fa\u30fc\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf\u31f0\u31ff"+ + "\u3400\u4dbf\u4e00\u8000\ua48c\u8000\ua4d0\u8000\ua4fd\u8000\ua500\u8000"+ + "\ua60c\u8000\ua610\u8000\ua61f\u8000\ua62a\u8000\ua62b\u8000\ua640\u8000"+ + "\ua66e\u8000\ua67f\u8000\ua69d\u8000\ua6a0\u8000\ua6e5\u8000\ua717\u8000"+ + "\ua71f\u8000\ua722\u8000\ua788\u8000\ua78b\u8000\ua7ca\u8000\ua7d0\u8000"+ + "\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000\ua7d5\u8000\ua7d9\u8000\ua7f2\u8000"+ + "\ua801\u8000\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000"+ + "\ua822\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000\ua8f2\u8000"+ + "\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000\ua90a\u8000"+ + "\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000\ua984\u8000"+ + "\ua9b2\u8000\ua9cf\u8000\ua9cf\u8000\ua9e0\u8000\ua9e4\u8000\ua9e6\u8000"+ + "\ua9ef\u8000\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000"+ + "\uaa42\u8000\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa76\u8000\uaa7a\u8000"+ + "\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000\uaab5\u8000"+ + "\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000\uaac2\u8000"+ + "\uaac2\u8000\uaadb\u8000\uaadd\u8000\uaae0\u8000\uaaea\u8000\uaaf2\u8000"+ + "\uaaf4\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000\uab11\u8000"+ + "\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000\uab30\u8000"+ + "\uab5a\u8000\uab5c\u8000\uab69\u8000\uab70\u8000\uabe2\u8000\uac00\u8000"+ + "\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000\uf900\u8000"+ + "\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000\ufb13\u8000"+ + "\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000\ufb2a\u8000"+ + "\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000\ufb40\u8000"+ + "\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000\ufbd3\u8000"+ + "\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000\ufdf0\u8000"+ + "\ufdfb\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000\uff21\u8000"+ + "\uff3a\u8000\uff41\u8000\uff5a\u8000\uff66\u8000\uffbe\u8000\uffc2\u8000"+ + "\uffc7\u8000\uffca\u8000\uffcf\u8000\uffd2\u8000\uffd7\u8000\uffda\u8000"+ + "\uffdc\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001:\u8001<\u8001"+ + "=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001\u0280\u8001"+ + "\u029c\u8001\u02a0\u8001\u02d0\u8001\u0300\u8001\u031f\u8001\u032d\u8001"+ + "\u0340\u8001\u0342\u8001\u0349\u8001\u0350\u8001\u0375\u8001\u0380\u8001"+ + "\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001\u0400\u8001"+ + "\u049d\u8001\u04b0\u8001\u04d3\u8001\u04d8\u8001\u04fb\u8001\u0500\u8001"+ + "\u0527\u8001\u0530\u8001\u0563\u8001\u0570\u8001\u057a\u8001\u057c\u8001"+ + "\u058a\u8001\u058c\u8001\u0592\u8001\u0594\u8001\u0595\u8001\u0597\u8001"+ + "\u05a1\u8001\u05a3\u8001\u05b1\u8001\u05b3\u8001\u05b9\u8001\u05bb\u8001"+ + "\u05bc\u8001\u0600\u8001\u0736\u8001\u0740\u8001\u0755\u8001\u0760\u8001"+ + "\u0767\u8001\u0780\u8001\u0785\u8001\u0787\u8001\u07b0\u8001\u07b2\u8001"+ + "\u07ba\u8001\u0800\u8001\u0805\u8001\u0808\u8001\u0808\u8001\u080a\u8001"+ + "\u0835\u8001\u0837\u8001\u0838\u8001\u083c\u8001\u083c\u8001\u083f\u8001"+ + "\u0855\u8001\u0860\u8001\u0876\u8001\u0880\u8001\u089e\u8001\u08e0\u8001"+ + "\u08f2\u8001\u08f4\u8001\u08f5\u8001\u0900\u8001\u0915\u8001\u0920\u8001"+ + "\u0939\u8001\u0980\u8001\u09b7\u8001\u09be\u8001\u09bf\u8001\u0a00\u8001"+ + "\u0a00\u8001\u0a10\u8001\u0a13\u8001\u0a15\u8001\u0a17\u8001\u0a19\u8001"+ + "\u0a35\u8001\u0a60\u8001\u0a7c\u8001\u0a80\u8001\u0a9c\u8001\u0ac0\u8001"+ + "\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001\u0b00\u8001\u0b35\u8001\u0b40\u8001"+ + "\u0b55\u8001\u0b60\u8001\u0b72\u8001\u0b80\u8001\u0b91\u8001\u0c00\u8001"+ + "\u0c48\u8001\u0c80\u8001\u0cb2\u8001\u0cc0\u8001\u0cf2\u8001\u0d00\u8001"+ + "\u0d23\u8001\u0e80\u8001\u0ea9\u8001\u0eb0\u8001\u0eb1\u8001\u0f00\u8001"+ + "\u0f1c\u8001\u0f27\u8001\u0f27\u8001\u0f30\u8001\u0f45\u8001\u0f70\u8001"+ + "\u0f81\u8001\u0fb0\u8001\u0fc4\u8001\u0fe0\u8001\u0ff6\u8001\u1003\u8001"+ + "\u1037\u8001\u1071\u8001\u1072\u8001\u1075\u8001\u1075\u8001\u1083\u8001"+ + "\u10af\u8001\u10d0\u8001\u10e8\u8001\u1103\u8001\u1126\u8001\u1144\u8001"+ + "\u1144\u8001\u1147\u8001\u1147\u8001\u1150\u8001\u1172\u8001\u1176\u8001"+ + "\u1176\u8001\u1183\u8001\u11b2\u8001\u11c1\u8001\u11c4\u8001\u11da\u8001"+ + "\u11da\u8001\u11dc\u8001\u11dc\u8001\u1200\u8001\u1211\u8001\u1213\u8001"+ + "\u122b\u8001\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001"+ + "\u128d\u8001\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001"+ + "\u12de\u8001\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001"+ + "\u1328\u8001\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001"+ + "\u1339\u8001\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001"+ + "\u1361\u8001\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001"+ + "\u1461\u8001\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001"+ + "\u14c7\u8001\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001"+ + "\u162f\u8001\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001"+ + "\u16b8\u8001\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001"+ + "\u182b\u8001\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001"+ + "\u1909\u8001\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001"+ + "\u192f\u8001\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001"+ + "\u19a7\u8001\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001"+ + "\u19e3\u8001\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001"+ + "\u1a3a\u8001\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001"+ + "\u1a9d\u8001\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001"+ + "\u1c2e\u8001\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001"+ + "\u1d06\u8001\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001"+ + "\u1d46\u8001\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001"+ + "\u1d89\u8001\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1fb0\u8001"+ + "\u1fb0\u8001\u2000\u8001\u2399\u8001\u2480\u8001\u2543\u8001\u2f90\u8001"+ + "\u2ff0\u8001\u3000\u8001\u342e\u8001\u4400\u8001\u4646\u8001\u6800\u8001"+ + "\u6a38\u8001\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001"+ + "\u6aed\u8001\u6b00\u8001\u6b2f\u8001\u6b40\u8001\u6b43\u8001\u6b63\u8001"+ + "\u6b77\u8001\u6b7d\u8001\u6b8f\u8001\u6e40\u8001\u6e7f\u8001\u6f00\u8001"+ + "\u6f4a\u8001\u6f50\u8001\u6f50\u8001\u6f93\u8001\u6f9f\u8001\u6fe0\u8001"+ + "\u6fe1\u8001\u6fe3\u8001\u6fe3\u8001\u7000\u8001\u87f7\u8001\u8800\u8001"+ + "\u8cd5\u8001\u8d00\u8001\u8d08\u8001\uaff0\u8001\uaff3\u8001\uaff5\u8001"+ + "\uaffb\u8001\uaffd\u8001\uaffe\u8001\ub000\u8001\ub122\u8001\ub150\u8001"+ + "\ub152\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001\ubc00\u8001"+ + "\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001\ubc90\u8001"+ + "\ubc99\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001\ud49e\u8001"+ + "\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001\ud4a9\u8001"+ + "\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001\ud4bd\u8001"+ + "\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001\ud50d\u8001"+ + "\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001\ud53b\u8001"+ + "\ud53e\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001\ud54a\u8001"+ + "\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001\ud6c2\u8001"+ + "\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001\ud716\u8001"+ + "\ud734\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001\ud770\u8001"+ + "\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001\ud7c4\u8001"+ + "\ud7cb\u8001\udf00\u8001\udf1e\u8001\ue100\u8001\ue12c\u8001\ue137\u8001"+ + "\ue13d\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001\ue2c0\u8001"+ + "\ue2eb\u8001\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001"+ + "\ue7ee\u8001\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001"+ + "\ue943\u8001\ue94b\u8001\ue94b\u8001\uee00\u8001\uee03\u8001\uee05\u8001"+ + "\uee1f\u8001\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001"+ + "\uee27\u8001\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001"+ + "\uee39\u8001\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001"+ + "\uee47\u8001\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001"+ + "\uee4f\u8001\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001"+ + "\uee57\u8001\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001"+ + "\uee5d\u8001\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001"+ + "\uee64\u8001\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001"+ + "\uee77\u8001\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001"+ + "\uee89\u8001\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001"+ + "\ueea9\u8001\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002"+ + "\ub738\u8002\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002"+ + "\uebe0\u8002\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u0604\u0000\u0002"+ + "\u0001\u0000\u0000\u0000\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006"+ + "\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001"+ + "\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000"+ + "\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000"+ + "\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000"+ + "\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000"+ + "\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000"+ + "\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000"+ + "\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000"+ + "(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001"+ + "\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000"+ + "\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u0000"+ + "6\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001"+ + "\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000"+ + "\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000"+ + "D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001"+ + "\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000"+ + "\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000"+ + "R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001"+ + "\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000"+ + "\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000"+ + "\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d"+ + "\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000"+ + "\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000\u0000"+ + "\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000r"+ + "\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001\u0000"+ + "\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000\u0000"+ + "\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000\u0080"+ + "\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000\u0084"+ + "\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000\u0088"+ + "\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000\u008c"+ + "\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000\u0090"+ + "\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000\u0094"+ + "\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000\u0098"+ + "\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000\u009c"+ + "\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000\u00a0"+ + "\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000\u00a4"+ + "\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000\u00a8"+ + "\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000\u00ac"+ + "\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000\u00b0"+ + "\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000\u00b4"+ + "\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000\u00b8"+ + "\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000\u00bc"+ + "\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000\u00c0"+ + "\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000\u00c4"+ + "\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000\u00c8"+ + "\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000\u00cc"+ + "\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000\u00d0"+ + "\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000\u00d4"+ + "\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000\u00d8"+ + "\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000\u00dc"+ + "\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000\u00e0"+ + "\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000\u00e4"+ + "\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000\u00e8"+ + "\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000\u00ec"+ + "\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000\u00f0"+ + "\u0001\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000\u0000\u0000\u00f4"+ + "\u0001\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000\u0000\u0000\u00f8"+ + "\u0001\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000\u0000\u0000\u00fc"+ + "\u0001\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000\u0000\u0000\u0100"+ + "\u0001\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000\u0000\u0000\u0104"+ + "\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000\u0108"+ + "\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0000\u010c"+ + "\u0001\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000\u0000\u0000\u0110"+ + "\u0001\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000\u0000\u0000\u0114"+ + "\u0001\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000\u0000\u0000\u0118"+ + "\u0001\u0000\u0000\u0000\u0000\u011a\u0001\u0000\u0000\u0000\u0000\u011c"+ + "\u0001\u0000\u0000\u0000\u0000\u0122\u0001\u0000\u0000\u0000\u0000\u0126"+ + "\u0001\u0000\u0000\u0000\u0000\u0128\u0001\u0000\u0000\u0000\u0000\u012a"+ + "\u0001\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000\u0000\u0000\u012e"+ + "\u0001\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000\u0000\u0000\u0132"+ + "\u0001\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000\u0000\u0000\u0136"+ + "\u0001\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000\u0000\u0000\u013a"+ + "\u0001\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000\u0000\u0001\u0152"+ + "\u0001\u0000\u0000\u0000\u0001\u0154\u0001\u0000\u0000\u0000\u0001\u0156"+ + "\u0001\u0000\u0000\u0000\u0001\u0158\u0001\u0000\u0000\u0000\u0001\u015a"+ + "\u0001\u0000\u0000\u0000\u0002\u015e\u0001\u0000\u0000\u0000\u0004\u0174"+ + "\u0001\u0000\u0000\u0000\u0006\u0176\u0001\u0000\u0000\u0000\b\u017d\u0001"+ + "\u0000\u0000\u0000\n\u0185\u0001\u0000\u0000\u0000\f\u018c\u0001\u0000"+ + "\u0000\u0000\u000e\u0193\u0001\u0000\u0000\u0000\u0010\u019a\u0001\u0000"+ + "\u0000\u0000\u0012\u01a1\u0001\u0000\u0000\u0000\u0014\u01aa\u0001\u0000"+ + "\u0000\u0000\u0016\u01b4\u0001\u0000\u0000\u0000\u0018\u01bc\u0001\u0000"+ + "\u0000\u0000\u001a\u01c6\u0001\u0000\u0000\u0000\u001c\u01d2\u0001\u0000"+ + "\u0000\u0000\u001e\u01d9\u0001\u0000\u0000\u0000 \u01e4\u0001\u0000\u0000"+ + "\u0000\"\u01e7\u0001\u0000\u0000\u0000$\u01ed\u0001\u0000\u0000\u0000"+ + "&\u01f6\u0001\u0000\u0000\u0000(\u01fb\u0001\u0000\u0000\u0000*\u0202"+ + "\u0001\u0000\u0000\u0000,\u0209\u0001\u0000\u0000\u0000.\u020f\u0001\u0000"+ + "\u0000\u00000\u0214\u0001\u0000\u0000\u00002\u021b\u0001\u0000\u0000\u0000"+ + "4\u0225\u0001\u0000\u0000\u00006\u0229\u0001\u0000\u0000\u00008\u022f"+ + "\u0001\u0000\u0000\u0000:\u0232\u0001\u0000\u0000\u0000<\u0234\u0001\u0000"+ + "\u0000\u0000>\u023b\u0001\u0000\u0000\u0000@\u0241\u0001\u0000\u0000\u0000"+ + "B\u024e\u0001\u0000\u0000\u0000D\u0257\u0001\u0000\u0000\u0000F\u025b"+ + "\u0001\u0000\u0000\u0000H\u025f\u0001\u0000\u0000\u0000J\u0265\u0001\u0000"+ + "\u0000\u0000L\u0267\u0001\u0000\u0000\u0000N\u026a\u0001\u0000\u0000\u0000"+ + "P\u026f\u0001\u0000\u0000\u0000R\u0275\u0001\u0000\u0000\u0000T\u027b"+ + "\u0001\u0000\u0000\u0000V\u0282\u0001\u0000\u0000\u0000X\u0289\u0001\u0000"+ + "\u0000\u0000Z\u0292\u0001\u0000\u0000\u0000\\\u0298\u0001\u0000\u0000"+ + "\u0000^\u029e\u0001\u0000\u0000\u0000`\u02a5\u0001\u0000\u0000\u0000b"+ + "\u02ab\u0001\u0000\u0000\u0000d\u02b2\u0001\u0000\u0000\u0000f\u02b8\u0001"+ + "\u0000\u0000\u0000h\u02c1\u0001\u0000\u0000\u0000j\u02c9\u0001\u0000\u0000"+ + "\u0000l\u02cf\u0001\u0000\u0000\u0000n\u02d7\u0001\u0000\u0000\u0000p"+ + "\u02de\u0001\u0000\u0000\u0000r\u02e3\u0001\u0000\u0000\u0000t\u02ec\u0001"+ + "\u0000\u0000\u0000v\u02fb\u0001\u0000\u0000\u0000x\u0301\u0001\u0000\u0000"+ + "\u0000z\u0305\u0001\u0000\u0000\u0000|\u0308\u0001\u0000\u0000\u0000~"+ + "\u030f\u0001\u0000\u0000\u0000\u0080\u0319\u0001\u0000\u0000\u0000\u0082"+ + "\u0323\u0001\u0000\u0000\u0000\u0084\u032f\u0001\u0000\u0000\u0000\u0086"+ + "\u0338\u0001\u0000\u0000\u0000\u0088\u0342\u0001\u0000\u0000\u0000\u008a"+ + "\u034a\u0001\u0000\u0000\u0000\u008c\u0356\u0001\u0000\u0000\u0000\u008e"+ + "\u0365\u0001\u0000\u0000\u0000\u0090\u036b\u0001\u0000\u0000\u0000\u0092"+ + "\u036f\u0001\u0000\u0000\u0000\u0094\u0373\u0001\u0000\u0000\u0000\u0096"+ + "\u0378\u0001\u0000\u0000\u0000\u0098\u0380\u0001\u0000\u0000\u0000\u009a"+ + "\u0388\u0001\u0000\u0000\u0000\u009c\u038d\u0001\u0000\u0000\u0000\u009e"+ + "\u0397\u0001\u0000\u0000\u0000\u00a0\u039e\u0001\u0000\u0000\u0000\u00a2"+ + "\u03a3\u0001\u0000\u0000\u0000\u00a4\u03a9\u0001\u0000\u0000\u0000\u00a6"+ + "\u03ac\u0001\u0000\u0000\u0000\u00a8\u03b0\u0001\u0000\u0000\u0000\u00aa"+ + "\u03b7\u0001\u0000\u0000\u0000\u00ac\u03bc\u0001\u0000\u0000\u0000\u00ae"+ + "\u03c1\u0001\u0000\u0000\u0000\u00b0\u03c6\u0001\u0000\u0000\u0000\u00b2"+ + "\u03ce\u0001\u0000\u0000\u0000\u00b4\u03d5\u0001\u0000\u0000\u0000\u00b6"+ + "\u03db\u0001\u0000\u0000\u0000\u00b8\u03e9\u0001\u0000\u0000\u0000\u00ba"+ + "\u03ec\u0001\u0000\u0000\u0000\u00bc\u03f2\u0001\u0000\u0000\u0000\u00be"+ + "\u03f7\u0001\u0000\u0000\u0000\u00c0\u0402\u0001\u0000\u0000\u0000\u00c2"+ + "\u0406\u0001\u0000\u0000\u0000\u00c4\u040d\u0001\u0000\u0000\u0000\u00c6"+ + "\u0416\u0001\u0000\u0000\u0000\u00c8\u041a\u0001\u0000\u0000\u0000\u00ca"+ + "\u0420\u0001\u0000\u0000\u0000\u00cc\u042a\u0001\u0000\u0000\u0000\u00ce"+ + "\u042c\u0001\u0000\u0000\u0000\u00d0\u0430\u0001\u0000\u0000\u0000\u00d2"+ + "\u0432\u0001\u0000\u0000\u0000\u00d4\u0436\u0001\u0000\u0000\u0000\u00d6"+ + "\u0438\u0001\u0000\u0000\u0000\u00d8\u043c\u0001\u0000\u0000\u0000\u00da"+ + "\u043e\u0001\u0000\u0000\u0000\u00dc\u0440\u0001\u0000\u0000\u0000\u00de"+ + "\u0442\u0001\u0000\u0000\u0000\u00e0\u0444\u0001\u0000\u0000\u0000\u00e2"+ + "\u0446\u0001\u0000\u0000\u0000\u00e4\u044b\u0001\u0000\u0000\u0000\u00e6"+ + "\u0450\u0001\u0000\u0000\u0000\u00e8\u0453\u0001\u0000\u0000\u0000\u00ea"+ + "\u0457\u0001\u0000\u0000\u0000\u00ec\u045a\u0001\u0000\u0000\u0000\u00ee"+ + "\u045d\u0001\u0000\u0000\u0000\u00f0\u0460\u0001\u0000\u0000\u0000\u00f2"+ + "\u0463\u0001\u0000\u0000\u0000\u00f4\u0465\u0001\u0000\u0000\u0000\u00f6"+ + "\u0468\u0001\u0000\u0000\u0000\u00f8\u046a\u0001\u0000\u0000\u0000\u00fa"+ + "\u046d\u0001\u0000\u0000\u0000\u00fc\u046f\u0001\u0000\u0000\u0000\u00fe"+ + "\u0471\u0001\u0000\u0000\u0000\u0100\u0473\u0001\u0000\u0000\u0000\u0102"+ + "\u0476\u0001\u0000\u0000\u0000\u0104\u0479\u0001\u0000\u0000\u0000\u0106"+ + "\u047c\u0001\u0000\u0000\u0000\u0108\u047e\u0001\u0000\u0000\u0000\u010a"+ + "\u0480\u0001\u0000\u0000\u0000\u010c\u0482\u0001\u0000\u0000\u0000\u010e"+ + "\u0484\u0001\u0000\u0000\u0000\u0110\u0486\u0001\u0000\u0000\u0000\u0112"+ + "\u0488\u0001\u0000\u0000\u0000\u0114\u0496\u0001\u0000\u0000\u0000\u0116"+ + "\u049a\u0001\u0000\u0000\u0000\u0118\u04a6\u0001\u0000\u0000\u0000\u011a"+ + "\u04b4\u0001\u0000\u0000\u0000\u011c\u04c0\u0001\u0000\u0000\u0000\u011e"+ + "\u04e4\u0001\u0000\u0000\u0000\u0120\u04e6\u0001\u0000\u0000\u0000\u0122"+ + "\u04ef\u0001\u0000\u0000\u0000\u0124\u04f5\u0001\u0000\u0000\u0000\u0126"+ + "\u04fc\u0001\u0000\u0000\u0000\u0128\u0502\u0001\u0000\u0000\u0000\u012a"+ + "\u0504\u0001\u0000\u0000\u0000\u012c\u0509\u0001\u0000\u0000\u0000\u012e"+ + "\u050e\u0001\u0000\u0000\u0000\u0130\u0515\u0001\u0000\u0000\u0000\u0132"+ + "\u0520\u0001\u0000\u0000\u0000\u0134\u052b\u0001\u0000\u0000\u0000\u0136"+ + "\u0538\u0001\u0000\u0000\u0000\u0138\u053e\u0001\u0000\u0000\u0000\u013a"+ + "\u054d\u0001\u0000\u0000\u0000\u013c\u0553\u0001\u0000\u0000\u0000\u013e"+ + "\u0562\u0001\u0000\u0000\u0000\u0140\u0564\u0001\u0000\u0000\u0000\u0142"+ + "\u0580\u0001\u0000\u0000\u0000\u0144\u058a\u0001\u0000\u0000\u0000\u0146"+ + "\u058c\u0001\u0000\u0000\u0000\u0148\u058e\u0001\u0000\u0000\u0000\u014a"+ + "\u0590\u0001\u0000\u0000\u0000\u014c\u0598\u0001\u0000\u0000\u0000\u014e"+ + "\u059a\u0001\u0000\u0000\u0000\u0150\u059c\u0001\u0000\u0000\u0000\u0152"+ + "\u059f\u0001\u0000\u0000\u0000\u0154\u05a5\u0001\u0000\u0000\u0000\u0156"+ + "\u05b3\u0001\u0000\u0000\u0000\u0158\u05d0\u0001\u0000\u0000\u0000\u015a"+ + "\u05d4\u0001\u0000\u0000\u0000\u015c\u015f\u0003\u0004\u0001\u0000\u015d"+ + "\u015f\u0003\u011c\u008d\u0000\u015e\u015c\u0001\u0000\u0000\u0000\u015e"+ + "\u015d\u0001\u0000\u0000\u0000\u015f\u0160\u0001\u0000\u0000\u0000\u0160"+ + "\u0161\u0006\u0000\u0000\u0000\u0161\u0003\u0001\u0000\u0000\u0000\u0162"+ + "\u016c\u0003\u0142\u00a0\u0000\u0163\u0164\u0005.\u0000\u0000\u0164\u0166"+ + "\u0004\u0001\u0000\u0000\u0165\u0167\u0003\u0142\u00a0\u0000\u0166\u0165"+ + "\u0001\u0000\u0000\u0000\u0166\u0167\u0001\u0000\u0000\u0000\u0167\u0169"+ + "\u0001\u0000\u0000\u0000\u0168\u016a\u0003\u014a\u00a4\u0000\u0169\u0168"+ + "\u0001\u0000\u0000\u0000\u0169\u016a\u0001\u0000\u0000\u0000\u016a\u016d"+ + "\u0001\u0000\u0000\u0000\u016b\u016d\u0003\u014a\u00a4\u0000\u016c\u0163"+ + "\u0001\u0000\u0000\u0000\u016c\u016b\u0001\u0000\u0000\u0000\u016d\u0175"+ + "\u0001\u0000\u0000\u0000\u016e\u016f\u0005.\u0000\u0000\u016f\u0170\u0004"+ + "\u0001\u0001\u0000\u0170\u0172\u0003\u0142\u00a0\u0000\u0171\u0173\u0003"+ + "\u014a\u00a4\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u0172\u0173\u0001"+ + "\u0000\u0000\u0000\u0173\u0175\u0001\u0000\u0000\u0000\u0174\u0162\u0001"+ + "\u0000\u0000\u0000\u0174\u016e\u0001\u0000\u0000\u0000\u0175\u0005\u0001"+ + "\u0000\u0000\u0000\u0176\u0177\u0005t\u0000\u0000\u0177\u0178\u0005r\u0000"+ + "\u0000\u0178\u0179\u0005u\u0000\u0000\u0179\u017a\u0005e\u0000\u0000\u017a"+ + "\u017b\u0001\u0000\u0000\u0000\u017b\u017c\u0006\u0002\u0000\u0000\u017c"+ + "\u0007\u0001\u0000\u0000\u0000\u017d\u017e\u0005f\u0000\u0000\u017e\u017f"+ + "\u0005a\u0000\u0000\u017f\u0180\u0005l\u0000\u0000\u0180\u0181\u0005s"+ + "\u0000\u0000\u0181\u0182\u0005e\u0000\u0000\u0182\u0183\u0001\u0000\u0000"+ + "\u0000\u0183\u0184\u0006\u0003\u0000\u0000\u0184\t\u0001\u0000\u0000\u0000"+ + "\u0185\u0186\u0005a\u0000\u0000\u0186\u0187\u0005s\u0000\u0000\u0187\u0188"+ + "\u0005s\u0000\u0000\u0188\u0189\u0005e\u0000\u0000\u0189\u018a\u0005r"+ + "\u0000\u0000\u018a\u018b\u0005t\u0000\u0000\u018b\u000b\u0001\u0000\u0000"+ + "\u0000\u018c\u018d\u0005a\u0000\u0000\u018d\u018e\u0005s\u0000\u0000\u018e"+ + "\u018f\u0005s\u0000\u0000\u018f\u0190\u0005u\u0000\u0000\u0190\u0191\u0005"+ + "m\u0000\u0000\u0191\u0192\u0005e\u0000\u0000\u0192\r\u0001\u0000\u0000"+ + "\u0000\u0193\u0194\u0005i\u0000\u0000\u0194\u0195\u0005n\u0000\u0000\u0195"+ + "\u0196\u0005h\u0000\u0000\u0196\u0197\u0005a\u0000\u0000\u0197\u0198\u0005"+ + "l\u0000\u0000\u0198\u0199\u0005e\u0000\u0000\u0199\u000f\u0001\u0000\u0000"+ + "\u0000\u019a\u019b\u0005e\u0000\u0000\u019b\u019c\u0005x\u0000\u0000\u019c"+ + "\u019d\u0005h\u0000\u0000\u019d\u019e\u0005a\u0000\u0000\u019e\u019f\u0005"+ + "l\u0000\u0000\u019f\u01a0\u0005e\u0000\u0000\u01a0\u0011\u0001\u0000\u0000"+ + "\u0000\u01a1\u01a2\u0005r\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3"+ + "\u01a4\u0005q\u0000\u0000\u01a4\u01a5\u0005u\u0000\u0000\u01a5\u01a6\u0005"+ + "i\u0000\u0000\u01a6\u01a7\u0005r\u0000\u0000\u01a7\u01a8\u0005e\u0000"+ + "\u0000\u01a8\u01a9\u0005s\u0000\u0000\u01a9\u0013\u0001\u0000\u0000\u0000"+ + "\u01aa\u01ab\u0005p\u0000\u0000\u01ab\u01ac\u0005r\u0000\u0000\u01ac\u01ad"+ + "\u0005e\u0000\u0000\u01ad\u01ae\u0005s\u0000\u0000\u01ae\u01af\u0005e"+ + "\u0000\u0000\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1\u0005v\u0000\u0000"+ + "\u01b1\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005s\u0000\u0000\u01b3\u0015"+ + "\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005e\u0000\u0000\u01b5\u01b6\u0005"+ + "n\u0000\u0000\u01b6\u01b7\u0005s\u0000\u0000\u01b7\u01b8\u0005u\u0000"+ + "\u0000\u01b8\u01b9\u0005r\u0000\u0000\u01b9\u01ba\u0005e\u0000\u0000\u01ba"+ + "\u01bb\u0005s\u0000\u0000\u01bb\u0017\u0001\u0000\u0000\u0000\u01bc\u01bd"+ + "\u0005i\u0000\u0000\u01bd\u01be\u0005n\u0000\u0000\u01be\u01bf\u0005v"+ + "\u0000\u0000\u01bf\u01c0\u0005a\u0000\u0000\u01c0\u01c1\u0005r\u0000\u0000"+ + "\u01c1\u01c2\u0005i\u0000\u0000\u01c2\u01c3\u0005a\u0000\u0000\u01c3\u01c4"+ + "\u0005n\u0000\u0000\u01c4\u01c5\u0005t\u0000\u0000\u01c5\u0019\u0001\u0000"+ + "\u0000\u0000\u01c6\u01c7\u0005d\u0000\u0000\u01c7\u01c8\u0005e\u0000\u0000"+ + "\u01c8\u01c9\u0005c\u0000\u0000\u01c9\u01ca\u0005r\u0000\u0000\u01ca\u01cb"+ + "\u0005e\u0000\u0000\u01cb\u01cc\u0005a\u0000\u0000\u01cc\u01cd\u0005s"+ + "\u0000\u0000\u01cd\u01ce\u0005e\u0000\u0000\u01ce\u01cf\u0005s\u0000\u0000"+ + "\u01cf\u01d0\u0001\u0000\u0000\u0000\u01d0\u01d1\u0006\f\u0000\u0000\u01d1"+ + "\u001b\u0001\u0000\u0000\u0000\u01d2\u01d3\u0005p\u0000\u0000\u01d3\u01d4"+ + "\u0005u\u0000\u0000\u01d4\u01d5\u0005r\u0000\u0000\u01d5\u01d6\u0005e"+ + "\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8\u0006\r\u0000"+ + "\u0000\u01d8\u001d\u0001\u0000\u0000\u0000\u01d9\u01da\u0005i\u0000\u0000"+ + "\u01da\u01db\u0005m\u0000\u0000\u01db\u01dc\u0005p\u0000\u0000\u01dc\u01dd"+ + "\u0005l\u0000\u0000\u01dd\u01de\u0005e\u0000\u0000\u01de\u01df\u0005m"+ + "\u0000\u0000\u01df\u01e0\u0005e\u0000\u0000\u01e0\u01e1\u0005n\u0000\u0000"+ + "\u01e1\u01e2\u0005t\u0000\u0000\u01e2\u01e3\u0005s\u0000\u0000\u01e3\u001f"+ + "\u0001\u0000\u0000\u0000\u01e4\u01e5\u0005a\u0000\u0000\u01e5\u01e6\u0005"+ + "s\u0000\u0000\u01e6!\u0001\u0000\u0000\u0000\u01e7\u01e8\u0005o\u0000"+ + "\u0000\u01e8\u01e9\u0005l\u0000\u0000\u01e9\u01ea\u0005d\u0000\u0000\u01ea"+ + "\u01eb\u0001\u0000\u0000\u0000\u01eb\u01ec\u0006\u0010\u0000\u0000\u01ec"+ + "#\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005b\u0000\u0000\u01ee\u01ef\u0005"+ + "e\u0000\u0000\u01ef\u01f0\u0005f\u0000\u0000\u01f0\u01f1\u0005o\u0000"+ + "\u0000\u01f1\u01f2\u0005r\u0000\u0000\u01f2\u01f3\u0005e\u0000\u0000\u01f3"+ + "\u01f4\u0001\u0000\u0000\u0000\u01f4\u01f5\u0006\u0011\u0000\u0000\u01f5"+ + "%\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005#\u0000\u0000\u01f7\u01f8\u0005"+ + "l\u0000\u0000\u01f8\u01f9\u0005h\u0000\u0000\u01f9\u01fa\u0005s\u0000"+ + "\u0000\u01fa\'\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005f\u0000\u0000"+ + "\u01fc\u01fd\u0005o\u0000\u0000\u01fd\u01fe\u0005r\u0000\u0000\u01fe\u01ff"+ + "\u0005a\u0000\u0000\u01ff\u0200\u0005l\u0000\u0000\u0200\u0201\u0005l"+ + "\u0000\u0000\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0005e\u0000\u0000"+ + "\u0203\u0204\u0005x\u0000\u0000\u0204\u0205\u0005i\u0000\u0000\u0205\u0206"+ + "\u0005s\u0000\u0000\u0206\u0207\u0005t\u0000\u0000\u0207\u0208\u0005s"+ + "\u0000\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0005a\u0000\u0000"+ + "\u020a\u020b\u0005c\u0000\u0000\u020b\u020c\u0005c\u0000\u0000\u020c\u020d"+ + "\u0001\u0000\u0000\u0000\u020d\u020e\u0006\u0015\u0000\u0000\u020e-\u0001"+ + "\u0000\u0000\u0000\u020f\u0210\u0005f\u0000\u0000\u0210\u0211\u0005o\u0000"+ + "\u0000\u0211\u0212\u0005l\u0000\u0000\u0212\u0213\u0005d\u0000\u0000\u0213"+ + "/\u0001\u0000\u0000\u0000\u0214\u0215\u0005u\u0000\u0000\u0215\u0216\u0005"+ + "n\u0000\u0000\u0216\u0217\u0005f\u0000\u0000\u0217\u0218\u0005o\u0000"+ + "\u0000\u0218\u0219\u0005l\u0000\u0000\u0219\u021a\u0005d\u0000\u0000\u021a"+ + "1\u0001\u0000\u0000\u0000\u021b\u021c\u0005u\u0000\u0000\u021c\u021d\u0005"+ + "n\u0000\u0000\u021d\u021e\u0005f\u0000\u0000\u021e\u021f\u0005o\u0000"+ + "\u0000\u021f\u0220\u0005l\u0000\u0000\u0220\u0221\u0005d\u0000\u0000\u0221"+ + "\u0222\u0005i\u0000\u0000\u0222\u0223\u0005n\u0000\u0000\u0223\u0224\u0005"+ + "g\u0000\u0000\u02243\u0001\u0000\u0000\u0000\u0225\u0226\u0005l\u0000"+ + "\u0000\u0226\u0227\u0005e\u0000\u0000\u0227\u0228\u0005t\u0000\u0000\u0228"+ + "5\u0001\u0000\u0000\u0000\u0229\u022a\u0005g\u0000\u0000\u022a\u022b\u0005"+ + "h\u0000\u0000\u022b\u022c\u0005o\u0000\u0000\u022c\u022d\u0005s\u0000"+ + "\u0000\u022d\u022e\u0005t\u0000\u0000\u022e7\u0001\u0000\u0000\u0000\u022f"+ + "\u0230\u0005i\u0000\u0000\u0230\u0231\u0005n\u0000\u0000\u02319\u0001"+ + "\u0000\u0000\u0000\u0232\u0233\u0005#\u0000\u0000\u0233;\u0001\u0000\u0000"+ + "\u0000\u0234\u0235\u0005s\u0000\u0000\u0235\u0236\u0005u\u0000\u0000\u0236"+ + "\u0237\u0005b\u0000\u0000\u0237\u0238\u0005s\u0000\u0000\u0238\u0239\u0005"+ + "e\u0000\u0000\u0239\u023a\u0005t\u0000\u0000\u023a=\u0001\u0000\u0000"+ + "\u0000\u023b\u023c\u0005u\u0000\u0000\u023c\u023d\u0005n\u0000\u0000\u023d"+ + "\u023e\u0005i\u0000\u0000\u023e\u023f\u0005o\u0000\u0000\u023f\u0240\u0005"+ + "n\u0000\u0000\u0240?\u0001\u0000\u0000\u0000\u0241\u0242\u0005i\u0000"+ + "\u0000\u0242\u0243\u0005n\u0000\u0000\u0243\u0244\u0005t\u0000\u0000\u0244"+ + "\u0245\u0005e\u0000\u0000\u0245\u0246\u0005r\u0000\u0000\u0246\u0247\u0005"+ + "s\u0000\u0000\u0247\u0248\u0005e\u0000\u0000\u0248\u0249\u0005c\u0000"+ + "\u0000\u0249\u024a\u0005t\u0000\u0000\u024a\u024b\u0005i\u0000\u0000\u024b"+ + "\u024c\u0005o\u0000\u0000\u024c\u024d\u0005n\u0000\u0000\u024dA\u0001"+ + "\u0000\u0000\u0000\u024e\u024f\u0005s\u0000\u0000\u024f\u0250\u0005e\u0000"+ + "\u0000\u0250\u0251\u0005t\u0000\u0000\u0251\u0252\u0005m\u0000\u0000\u0252"+ + "\u0253\u0005i\u0000\u0000\u0253\u0254\u0005n\u0000\u0000\u0254\u0255\u0005"+ + "u\u0000\u0000\u0255\u0256\u0005s\u0000\u0000\u0256C\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0005=\u0000\u0000\u0258\u0259\u0005=\u0000\u0000\u0259"+ + "\u025a\u0005>\u0000\u0000\u025aE\u0001\u0000\u0000\u0000\u025b\u025c\u0005"+ + "-\u0000\u0000\u025c\u025d\u0005-\u0000\u0000\u025d\u025e\u0005*\u0000"+ + "\u0000\u025eG\u0001\u0000\u0000\u0000\u025f\u0260\u0005a\u0000\u0000\u0260"+ + "\u0261\u0005p\u0000\u0000\u0261\u0262\u0005p\u0000\u0000\u0262\u0263\u0005"+ + "l\u0000\u0000\u0263\u0264\u0005y\u0000\u0000\u0264I\u0001\u0000\u0000"+ + "\u0000\u0265\u0266\u0005?\u0000\u0000\u0266K\u0001\u0000\u0000\u0000\u0267"+ + "\u0268\u0005!\u0000\u0000\u0268\u0269\u0005<\u0000\u0000\u0269M\u0001"+ + "\u0000\u0000\u0000\u026a\u026b\u0005!\u0000\u0000\u026b\u026c\u0005>\u0000"+ + "\u0000\u026c\u026d\u0001\u0000\u0000\u0000\u026d\u026e\u0006&\u0000\u0000"+ + "\u026eO\u0001\u0000\u0000\u0000\u026f\u0270\u0005s\u0000\u0000\u0270\u0271"+ + "\u0005e\u0000\u0000\u0271\u0272\u0005q\u0000\u0000\u0272\u0273\u0001\u0000"+ + "\u0000\u0000\u0273\u0274\u0006\'\u0000\u0000\u0274Q\u0001\u0000\u0000"+ + "\u0000\u0275\u0276\u0005s\u0000\u0000\u0276\u0277\u0005e\u0000\u0000\u0277"+ + "\u0278\u0005t\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a"+ + "\u0006(\u0000\u0000\u027aS\u0001\u0000\u0000\u0000\u027b\u027c\u0005m"+ + "\u0000\u0000\u027c\u027d\u0005s\u0000\u0000\u027d\u027e\u0005e\u0000\u0000"+ + "\u027e\u027f\u0005t\u0000\u0000\u027f\u0280\u0001\u0000\u0000\u0000\u0280"+ + "\u0281\u0006)\u0000\u0000\u0281U\u0001\u0000\u0000\u0000\u0282\u0283\u0005"+ + "d\u0000\u0000\u0283\u0284\u0005i\u0000\u0000\u0284\u0285\u0005c\u0000"+ + "\u0000\u0285\u0286\u0005t\u0000\u0000\u0286\u0287\u0001\u0000\u0000\u0000"+ + "\u0287\u0288\u0006*\u0000\u0000\u0288W\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0005o\u0000\u0000\u028a\u028b\u0005p\u0000\u0000\u028b\u028c\u0005t"+ + "\u0000\u0000\u028c\u028d\u0005i\u0000\u0000\u028d\u028e\u0005o\u0000\u0000"+ + "\u028e\u028f\u0005n\u0000\u0000\u028f\u0290\u0001\u0000\u0000\u0000\u0290"+ + "\u0291\u0006+\u0000\u0000\u0291Y\u0001\u0000\u0000\u0000\u0292\u0293\u0005"+ + "l\u0000\u0000\u0293\u0294\u0005e\u0000\u0000\u0294\u0295\u0005n\u0000"+ + "\u0000\u0295\u0296\u0001\u0000\u0000\u0000\u0296\u0297\u0006,\u0000\u0000"+ + "\u0297[\u0001\u0000\u0000\u0000\u0298\u0299\u0005n\u0000\u0000\u0299\u029a"+ + "\u0005e\u0000\u0000\u029a\u029b\u0005w\u0000\u0000\u029b\u029c\u0001\u0000"+ + "\u0000\u0000\u029c\u029d\u0006-\u0000\u0000\u029d]\u0001\u0000\u0000\u0000"+ + "\u029e\u029f\u0005m\u0000\u0000\u029f\u02a0\u0005a\u0000\u0000\u02a0\u02a1"+ + "\u0005k\u0000\u0000\u02a1\u02a2\u0005e\u0000\u0000\u02a2\u02a3\u0001\u0000"+ + "\u0000\u0000\u02a3\u02a4\u0006.\u0000\u0000\u02a4_\u0001\u0000\u0000\u0000"+ + "\u02a5\u02a6\u0005c\u0000\u0000\u02a6\u02a7\u0005a\u0000\u0000\u02a7\u02a8"+ + "\u0005p\u0000\u0000\u02a8\u02a9\u0001\u0000\u0000\u0000\u02a9\u02aa\u0006"+ + "/\u0000\u0000\u02aaa\u0001\u0000\u0000\u0000\u02ab\u02ac\u0005s\u0000"+ + "\u0000\u02ac\u02ad\u0005o\u0000\u0000\u02ad\u02ae\u0005m\u0000\u0000\u02ae"+ + "\u02af\u0005e\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b1"+ + "\u00060\u0000\u0000\u02b1c\u0001\u0000\u0000\u0000\u02b2\u02b3\u0005g"+ + "\u0000\u0000\u02b3\u02b4\u0005e\u0000\u0000\u02b4\u02b5\u0005t\u0000\u0000"+ + "\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b7\u00061\u0000\u0000\u02b7"+ + "e\u0001\u0000\u0000\u0000\u02b8\u02b9\u0005d\u0000\u0000\u02b9\u02ba\u0005"+ + "o\u0000\u0000\u02ba\u02bb\u0005m\u0000\u0000\u02bb\u02bc\u0005a\u0000"+ + "\u0000\u02bc\u02bd\u0005i\u0000\u0000\u02bd\u02be\u0005n\u0000\u0000\u02be"+ + "\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u00062\u0000\u0000\u02c0g\u0001"+ + "\u0000\u0000\u0000\u02c1\u02c2\u0005a\u0000\u0000\u02c2\u02c3\u0005x\u0000"+ + "\u0000\u02c3\u02c4\u0005i\u0000\u0000\u02c4\u02c5\u0005o\u0000\u0000\u02c5"+ + "\u02c6\u0005m\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7\u02c8"+ + "\u00063\u0000\u0000\u02c8i\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005a"+ + "\u0000\u0000\u02ca\u02cb\u0005d\u0000\u0000\u02cb\u02cc\u0005t\u0000\u0000"+ + "\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce\u00064\u0000\u0000\u02ce"+ + "k\u0001\u0000\u0000\u0000\u02cf\u02d0\u0005m\u0000\u0000\u02d0\u02d1\u0005"+ + "a\u0000\u0000\u02d1\u02d2\u0005t\u0000\u0000\u02d2\u02d3\u0005c\u0000"+ + "\u0000\u02d3\u02d4\u0005h\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000\u0000"+ + "\u02d5\u02d6\u00065\u0000\u0000\u02d6m\u0001\u0000\u0000\u0000\u02d7\u02d8"+ + "\u0005n\u0000\u0000\u02d8\u02d9\u0005o\u0000\u0000\u02d9\u02da\u0005n"+ + "\u0000\u0000\u02da\u02db\u0005e\u0000\u0000\u02db\u02dc\u0001\u0000\u0000"+ + "\u0000\u02dc\u02dd\u00066\u0000\u0000\u02ddo\u0001\u0000\u0000\u0000\u02de"+ + "\u02df\u0005p\u0000\u0000\u02df\u02e0\u0005r\u0000\u0000\u02e0\u02e1\u0005"+ + "e\u0000\u0000\u02e1\u02e2\u0005d\u0000\u0000\u02e2q\u0001\u0000\u0000"+ + "\u0000\u02e3\u02e4\u0005t\u0000\u0000\u02e4\u02e5\u0005y\u0000\u0000\u02e5"+ + "\u02e6\u0005p\u0000\u0000\u02e6\u02e7\u0005e\u0000\u0000\u02e7\u02e8\u0005"+ + "O\u0000\u0000\u02e8\u02e9\u0005f\u0000\u0000\u02e9\u02ea\u0001\u0000\u0000"+ + "\u0000\u02ea\u02eb\u00068\u0000\u0000\u02ebs\u0001\u0000\u0000\u0000\u02ec"+ + "\u02ed\u0005i\u0000\u0000\u02ed\u02ee\u0005s\u0000\u0000\u02ee\u02ef\u0005"+ + "C\u0000\u0000\u02ef\u02f0\u0005o\u0000\u0000\u02f0\u02f1\u0005m\u0000"+ + "\u0000\u02f1\u02f2\u0005p\u0000\u0000\u02f2\u02f3\u0005a\u0000\u0000\u02f3"+ + "\u02f4\u0005r\u0000\u0000\u02f4\u02f5\u0005a\u0000\u0000\u02f5\u02f6\u0005"+ + "b\u0000\u0000\u02f6\u02f7\u0005l\u0000\u0000\u02f7\u02f8\u0005e\u0000"+ + "\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9\u02fa\u00069\u0000\u0000"+ + "\u02fau\u0001\u0000\u0000\u0000\u02fb\u02fc\u0005s\u0000\u0000\u02fc\u02fd"+ + "\u0005h\u0000\u0000\u02fd\u02fe\u0005a\u0000\u0000\u02fe\u02ff\u0005r"+ + "\u0000\u0000\u02ff\u0300\u0005e\u0000\u0000\u0300w\u0001\u0000\u0000\u0000"+ + "\u0301\u0302\u0005@\u0000\u0000\u0302\u0303\u0001\u0000\u0000\u0000\u0303"+ + "\u0304\u0006;\u0000\u0000\u0304y\u0001\u0000\u0000\u0000\u0305\u0306\u0005"+ + ".\u0000\u0000\u0306\u0307\u0005.\u0000\u0000\u0307{\u0001\u0000\u0000"+ + "\u0000\u0308\u0309\u0005s\u0000\u0000\u0309\u030a\u0005h\u0000\u0000\u030a"+ + "\u030b\u0005a\u0000\u0000\u030b\u030c\u0005r\u0000\u0000\u030c\u030d\u0005"+ + "e\u0000\u0000\u030d\u030e\u0005d\u0000\u0000\u030e}\u0001\u0000\u0000"+ + "\u0000\u030f\u0310\u0005e\u0000\u0000\u0310\u0311\u0005x\u0000\u0000\u0311"+ + "\u0312\u0005c\u0000\u0000\u0312\u0313\u0005l\u0000\u0000\u0313\u0314\u0005"+ + "u\u0000\u0000\u0314\u0315\u0005s\u0000\u0000\u0315\u0316\u0005i\u0000"+ + "\u0000\u0316\u0317\u0005v\u0000\u0000\u0317\u0318\u0005e\u0000\u0000\u0318"+ + "\u007f\u0001\u0000\u0000\u0000\u0319\u031a\u0005p\u0000\u0000\u031a\u031b"+ + "\u0005r\u0000\u0000\u031b\u031c\u0005e\u0000\u0000\u031c\u031d\u0005d"+ + "\u0000\u0000\u031d\u031e\u0005i\u0000\u0000\u031e\u031f\u0005c\u0000\u0000"+ + "\u031f\u0320\u0005a\u0000\u0000\u0320\u0321\u0005t\u0000\u0000\u0321\u0322"+ + "\u0005e\u0000\u0000\u0322\u0081\u0001\u0000\u0000\u0000\u0323\u0324\u0005"+ + "w\u0000\u0000\u0324\u0325\u0005r\u0000\u0000\u0325\u0326\u0005i\u0000"+ + "\u0000\u0326\u0327\u0005t\u0000\u0000\u0327\u0328\u0005e\u0000\u0000\u0328"+ + "\u0329\u0005P\u0000\u0000\u0329\u032a\u0005e\u0000\u0000\u032a\u032b\u0005"+ + "r\u0000\u0000\u032b\u032c\u0005m\u0000\u0000\u032c\u032d\u0001\u0000\u0000"+ + "\u0000\u032d\u032e\u0006@\u0000\u0000\u032e\u0083\u0001\u0000\u0000\u0000"+ + "\u032f\u0330\u0005n\u0000\u0000\u0330\u0331\u0005o\u0000\u0000\u0331\u0332"+ + "\u0005P\u0000\u0000\u0332\u0333\u0005e\u0000\u0000\u0333\u0334\u0005r"+ + "\u0000\u0000\u0334\u0335\u0005m\u0000\u0000\u0335\u0336\u0001\u0000\u0000"+ + "\u0000\u0336\u0337\u0006A\u0000\u0000\u0337\u0085\u0001\u0000\u0000\u0000"+ + "\u0338\u0339\u0005t\u0000\u0000\u0339\u033a\u0005r\u0000\u0000\u033a\u033b"+ + "\u0005u\u0000\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005t"+ + "\u0000\u0000\u033d\u033e\u0005e\u0000\u0000\u033e\u033f\u0005d\u0000\u0000"+ + "\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0341\u0006B\u0000\u0000\u0341"+ + "\u0087\u0001\u0000\u0000\u0000\u0342\u0343\u0005o\u0000\u0000\u0343\u0344"+ + "\u0005u\u0000\u0000\u0344\u0345\u0005t\u0000\u0000\u0345\u0346\u0005l"+ + "\u0000\u0000\u0346\u0347\u0005i\u0000\u0000\u0347\u0348\u0005n\u0000\u0000"+ + "\u0348\u0349\u0005e\u0000\u0000\u0349\u0089\u0001\u0000\u0000\u0000\u034a"+ + "\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000\u034c\u034d\u0005"+ + "i\u0000\u0000\u034d\u034e\u0005t\u0000\u0000\u034e\u034f\u0005E\u0000"+ + "\u0000\u034f\u0350\u0005n\u0000\u0000\u0350\u0351\u0005s\u0000\u0000\u0351"+ + "\u0352\u0005u\u0000\u0000\u0352\u0353\u0005r\u0000\u0000\u0353\u0354\u0005"+ + "e\u0000\u0000\u0354\u0355\u0005s\u0000\u0000\u0355\u008b\u0001\u0000\u0000"+ + "\u0000\u0356\u0357\u0005i\u0000\u0000\u0357\u0358\u0005m\u0000\u0000\u0358"+ + "\u0359\u0005p\u0000\u0000\u0359\u035a\u0005o\u0000\u0000\u035a\u035b\u0005"+ + "r\u0000\u0000\u035b\u035c\u0005t\u0000\u0000\u035c\u035d\u0005R\u0000"+ + "\u0000\u035d\u035e\u0005e\u0000\u0000\u035e\u035f\u0005q\u0000\u0000\u035f"+ + "\u0360\u0005u\u0000\u0000\u0360\u0361\u0005i\u0000\u0000\u0361\u0362\u0005"+ + "r\u0000\u0000\u0362\u0363\u0005e\u0000\u0000\u0363\u0364\u0005s\u0000"+ + "\u0000\u0364\u008d\u0001\u0000\u0000\u0000\u0365\u0366\u0005p\u0000\u0000"+ + "\u0366\u0367\u0005r\u0000\u0000\u0367\u0368\u0005o\u0000\u0000\u0368\u0369"+ + "\u0005o\u0000\u0000\u0369\u036a\u0005f\u0000\u0000\u036a\u008f\u0001\u0000"+ + "\u0000\u0000\u036b\u036c\u0005=\u0000\u0000\u036c\u036d\u0005=\u0000\u0000"+ + "\u036d\u036e\u0005=\u0000\u0000\u036e\u0091\u0001\u0000\u0000\u0000\u036f"+ + "\u0370\u0005!\u0000\u0000\u0370\u0371\u0005=\u0000\u0000\u0371\u0372\u0005"+ + "=\u0000\u0000\u0372\u0093\u0001\u0000\u0000\u0000\u0373\u0374\u0005w\u0000"+ + "\u0000\u0374\u0375\u0005i\u0000\u0000\u0375\u0376\u0005t\u0000\u0000\u0376"+ + "\u0377\u0005h\u0000\u0000\u0377\u0095\u0001\u0000\u0000\u0000\u0378\u0379"+ + "\u0005b\u0000\u0000\u0379\u037a\u0005r\u0000\u0000\u037a\u037b\u0005e"+ + "\u0000\u0000\u037b\u037c\u0005a\u0000\u0000\u037c\u037d\u0005k\u0000\u0000"+ + "\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0006J\u0000\u0000\u037f"+ + "\u0097\u0001\u0000\u0000\u0000\u0380\u0381\u0005d\u0000\u0000\u0381\u0382"+ + "\u0005e\u0000\u0000\u0382\u0383\u0005f\u0000\u0000\u0383\u0384\u0005a"+ + "\u0000\u0000\u0384\u0385\u0005u\u0000\u0000\u0385\u0386\u0005l\u0000\u0000"+ + "\u0386\u0387\u0005t\u0000\u0000\u0387\u0099\u0001\u0000\u0000\u0000\u0388"+ + "\u0389\u0005f\u0000\u0000\u0389\u038a\u0005u\u0000\u0000\u038a\u038b\u0005"+ + "n\u0000\u0000\u038b\u038c\u0005c\u0000\u0000\u038c\u009b\u0001\u0000\u0000"+ + "\u0000\u038d\u038e\u0005i\u0000\u0000\u038e\u038f\u0005n\u0000\u0000\u038f"+ + "\u0390\u0005t\u0000\u0000\u0390\u0391\u0005e\u0000\u0000\u0391\u0392\u0005"+ + "r\u0000\u0000\u0392\u0393\u0005f\u0000\u0000\u0393\u0394\u0005a\u0000"+ + "\u0000\u0394\u0395\u0005c\u0000\u0000\u0395\u0396\u0005e\u0000\u0000\u0396"+ + "\u009d\u0001\u0000\u0000\u0000\u0397\u0398\u0005s\u0000\u0000\u0398\u0399"+ + "\u0005e\u0000\u0000\u0399\u039a\u0005l\u0000\u0000\u039a\u039b\u0005e"+ + "\u0000\u0000\u039b\u039c\u0005c\u0000\u0000\u039c\u039d\u0005t\u0000\u0000"+ + "\u039d\u009f\u0001\u0000\u0000\u0000\u039e\u039f\u0005c\u0000\u0000\u039f"+ + "\u03a0\u0005a\u0000\u0000\u03a0\u03a1\u0005s\u0000\u0000\u03a1\u03a2\u0005"+ + "e\u0000\u0000\u03a2\u00a1\u0001\u0000\u0000\u0000\u03a3\u03a4\u0005d\u0000"+ + "\u0000\u03a4\u03a5\u0005e\u0000\u0000\u03a5\u03a6\u0005f\u0000\u0000\u03a6"+ + "\u03a7\u0005e\u0000\u0000\u03a7\u03a8\u0005r\u0000\u0000\u03a8\u00a3\u0001"+ + "\u0000\u0000\u0000\u03a9\u03aa\u0005g\u0000\u0000\u03aa\u03ab\u0005o\u0000"+ + "\u0000\u03ab\u00a5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005m\u0000\u0000"+ + "\u03ad\u03ae\u0005a\u0000\u0000\u03ae\u03af\u0005p\u0000\u0000\u03af\u00a7"+ + "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0005s\u0000\u0000\u03b1\u03b2\u0005"+ + "t\u0000\u0000\u03b2\u03b3\u0005r\u0000\u0000\u03b3\u03b4\u0005u\u0000"+ + "\u0000\u03b4\u03b5\u0005c\u0000\u0000\u03b5\u03b6\u0005t\u0000\u0000\u03b6"+ + "\u00a9\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005c\u0000\u0000\u03b8\u03b9"+ + "\u0005h\u0000\u0000\u03b9\u03ba\u0005a\u0000\u0000\u03ba\u03bb\u0005n"+ + "\u0000\u0000\u03bb\u00ab\u0001\u0000\u0000\u0000\u03bc\u03bd\u0005e\u0000"+ + "\u0000\u03bd\u03be\u0005l\u0000\u0000\u03be\u03bf\u0005s\u0000\u0000\u03bf"+ + "\u03c0\u0005e\u0000\u0000\u03c0\u00ad\u0001\u0000\u0000\u0000\u03c1\u03c2"+ + "\u0005g\u0000\u0000\u03c2\u03c3\u0005o\u0000\u0000\u03c3\u03c4\u0005t"+ + "\u0000\u0000\u03c4\u03c5\u0005o\u0000\u0000\u03c5\u00af\u0001\u0000\u0000"+ + "\u0000\u03c6\u03c7\u0005p\u0000\u0000\u03c7\u03c8\u0005a\u0000\u0000\u03c8"+ + "\u03c9\u0005c\u0000\u0000\u03c9\u03ca\u0005k\u0000\u0000\u03ca\u03cb\u0005"+ + "a\u0000\u0000\u03cb\u03cc\u0005g\u0000\u0000\u03cc\u03cd\u0005e\u0000"+ + "\u0000\u03cd\u00b1\u0001\u0000\u0000\u0000\u03ce\u03cf\u0005s\u0000\u0000"+ + "\u03cf\u03d0\u0005w\u0000\u0000\u03d0\u03d1\u0005i\u0000\u0000\u03d1\u03d2"+ + "\u0005t\u0000\u0000\u03d2\u03d3\u0005c\u0000\u0000\u03d3\u03d4\u0005h"+ + "\u0000\u0000\u03d4\u00b3\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005c\u0000"+ + "\u0000\u03d6\u03d7\u0005o\u0000\u0000\u03d7\u03d8\u0005n\u0000\u0000\u03d8"+ + "\u03d9\u0005s\u0000\u0000\u03d9\u03da\u0005t\u0000\u0000\u03da\u00b5\u0001"+ + "\u0000\u0000\u0000\u03db\u03dc\u0005f\u0000\u0000\u03dc\u03dd\u0005a\u0000"+ + "\u0000\u03dd\u03de\u0005l\u0000\u0000\u03de\u03df\u0005l\u0000\u0000\u03df"+ + "\u03e0\u0005t\u0000\u0000\u03e0\u03e1\u0005h\u0000\u0000\u03e1\u03e2\u0005"+ + "r\u0000\u0000\u03e2\u03e3\u0005o\u0000\u0000\u03e3\u03e4\u0005u\u0000"+ + "\u0000\u03e4\u03e5\u0005g\u0000\u0000\u03e5\u03e6\u0005h\u0000\u0000\u03e6"+ + "\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e8\u0006Z\u0000\u0000\u03e8\u00b7"+ + "\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005i\u0000\u0000\u03ea\u03eb\u0005"+ + "f\u0000\u0000\u03eb\u00b9\u0001\u0000\u0000\u0000\u03ec\u03ed\u0005r\u0000"+ + "\u0000\u03ed\u03ee\u0005a\u0000\u0000\u03ee\u03ef\u0005n\u0000\u0000\u03ef"+ + "\u03f0\u0005g\u0000\u0000\u03f0\u03f1\u0005e\u0000\u0000\u03f1\u00bb\u0001"+ + "\u0000\u0000\u0000\u03f2\u03f3\u0005t\u0000\u0000\u03f3\u03f4\u0005y\u0000"+ + "\u0000\u03f4\u03f5\u0005p\u0000\u0000\u03f5\u03f6\u0005e\u0000\u0000\u03f6"+ + "\u00bd\u0001\u0000\u0000\u0000\u03f7\u03f8\u0005c\u0000\u0000\u03f8\u03f9"+ + "\u0005o\u0000\u0000\u03f9\u03fa\u0005n\u0000\u0000\u03fa\u03fb\u0005t"+ + "\u0000\u0000\u03fb\u03fc\u0005i\u0000\u0000\u03fc\u03fd\u0005n\u0000\u0000"+ + "\u03fd\u03fe\u0005u\u0000\u0000\u03fe\u03ff\u0005e\u0000\u0000\u03ff\u0400"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0006^\u0000\u0000\u0401\u00bf\u0001"+ + "\u0000\u0000\u0000\u0402\u0403\u0005f\u0000\u0000\u0403\u0404\u0005o\u0000"+ + "\u0000\u0404\u0405\u0005r\u0000\u0000\u0405\u00c1\u0001\u0000\u0000\u0000"+ + "\u0406\u0407\u0005i\u0000\u0000\u0407\u0408\u0005m\u0000\u0000\u0408\u0409"+ + "\u0005p\u0000\u0000\u0409\u040a\u0005o\u0000\u0000\u040a\u040b\u0005r"+ + "\u0000\u0000\u040b\u040c\u0005t\u0000\u0000\u040c\u00c3\u0001\u0000\u0000"+ + "\u0000\u040d\u040e\u0005r\u0000\u0000\u040e\u040f\u0005e\u0000\u0000\u040f"+ + "\u0410\u0005t\u0000\u0000\u0410\u0411\u0005u\u0000\u0000\u0411\u0412\u0005"+ + "r\u0000\u0000\u0412\u0413\u0005n\u0000\u0000\u0413\u0414\u0001\u0000\u0000"+ + "\u0000\u0414\u0415\u0006a\u0000\u0000\u0415\u00c5\u0001\u0000\u0000\u0000"+ + "\u0416\u0417\u0005v\u0000\u0000\u0417\u0418\u0005a\u0000\u0000\u0418\u0419"+ + "\u0005r\u0000\u0000\u0419\u00c7\u0001\u0000\u0000\u0000\u041a\u041b\u0005"+ + "n\u0000\u0000\u041b\u041c\u0005i\u0000\u0000\u041c\u041d\u0005l\u0000"+ + "\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041f\u0006c\u0000\u0000"+ + "\u041f\u00c9\u0001\u0000\u0000\u0000\u0420\u0425\u0003\u014c\u00a5\u0000"+ + "\u0421\u0424\u0003\u014c\u00a5\u0000\u0422\u0424\u0003\u014e\u00a6\u0000"+ + "\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0422\u0001\u0000\u0000\u0000"+ + "\u0424\u0427\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000\u0000"+ + "\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000"+ + "\u0427\u0425\u0001\u0000\u0000\u0000\u0428\u0429\u0006d\u0000\u0000\u0429"+ + "\u00cb\u0001\u0000\u0000\u0000\u042a\u042b\u0005(\u0000\u0000\u042b\u00cd"+ + "\u0001\u0000\u0000\u0000\u042c\u042d\u0005)\u0000\u0000\u042d\u042e\u0001"+ + "\u0000\u0000\u0000\u042e\u042f\u0006f\u0000\u0000\u042f\u00cf\u0001\u0000"+ + "\u0000\u0000\u0430\u0431\u0005{\u0000\u0000\u0431\u00d1\u0001\u0000\u0000"+ + "\u0000\u0432\u0433\u0005}\u0000\u0000\u0433\u0434\u0001\u0000\u0000\u0000"+ + "\u0434\u0435\u0006h\u0000\u0000\u0435\u00d3\u0001\u0000\u0000\u0000\u0436"+ + "\u0437\u0005[\u0000\u0000\u0437\u00d5\u0001\u0000\u0000\u0000\u0438\u0439"+ + "\u0005]\u0000\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006"+ + "j\u0000\u0000\u043b\u00d7\u0001\u0000\u0000\u0000\u043c\u043d\u0005=\u0000"+ + "\u0000\u043d\u00d9\u0001\u0000\u0000\u0000\u043e\u043f\u0005,\u0000\u0000"+ + "\u043f\u00db\u0001\u0000\u0000\u0000\u0440\u0441\u0005;\u0000\u0000\u0441"+ + "\u00dd\u0001\u0000\u0000\u0000\u0442\u0443\u0005:\u0000\u0000\u0443\u00df"+ + "\u0001\u0000\u0000\u0000\u0444\u0445\u0005.\u0000\u0000\u0445\u00e1\u0001"+ + "\u0000\u0000\u0000\u0446\u0447\u0005+\u0000\u0000\u0447\u0448\u0005+\u0000"+ + "\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a\u0006p\u0000\u0000"+ + "\u044a\u00e3\u0001\u0000\u0000\u0000\u044b\u044c\u0005-\u0000\u0000\u044c"+ + "\u044d\u0005-\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f"+ + "\u0006q\u0000\u0000\u044f\u00e5\u0001\u0000\u0000\u0000\u0450\u0451\u0005"+ + ":\u0000\u0000\u0451\u0452\u0005=\u0000\u0000\u0452\u00e7\u0001\u0000\u0000"+ + "\u0000\u0453\u0454\u0005.\u0000\u0000\u0454\u0455\u0005.\u0000\u0000\u0455"+ + "\u0456\u0005.\u0000\u0000\u0456\u00e9\u0001\u0000\u0000\u0000\u0457\u0458"+ + "\u0005|\u0000\u0000\u0458\u0459\u0005|\u0000\u0000\u0459\u00eb\u0001\u0000"+ + "\u0000\u0000\u045a\u045b\u0005&\u0000\u0000\u045b\u045c\u0005&\u0000\u0000"+ + "\u045c\u00ed\u0001\u0000\u0000\u0000\u045d\u045e\u0005=\u0000\u0000\u045e"+ + "\u045f\u0005=\u0000\u0000\u045f\u00ef\u0001\u0000\u0000\u0000\u0460\u0461"+ + "\u0005!\u0000\u0000\u0461\u0462\u0005=\u0000\u0000\u0462\u00f1\u0001\u0000"+ + "\u0000\u0000\u0463\u0464\u0005<\u0000\u0000\u0464\u00f3\u0001\u0000\u0000"+ + "\u0000\u0465\u0466\u0005<\u0000\u0000\u0466\u0467\u0005=\u0000\u0000\u0467"+ + "\u00f5\u0001\u0000\u0000\u0000\u0468\u0469\u0005>\u0000\u0000\u0469\u00f7"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0005>\u0000\u0000\u046b\u046c\u0005"+ + "=\u0000\u0000\u046c\u00f9\u0001\u0000\u0000\u0000\u046d\u046e\u0005|\u0000"+ + "\u0000\u046e\u00fb\u0001\u0000\u0000\u0000\u046f\u0470\u0005/\u0000\u0000"+ + "\u0470\u00fd\u0001\u0000\u0000\u0000\u0471\u0472\u0005%\u0000\u0000\u0472"+ + "\u00ff\u0001\u0000\u0000\u0000\u0473\u0474\u0005<\u0000\u0000\u0474\u0475"+ + "\u0005<\u0000\u0000\u0475\u0101\u0001\u0000\u0000\u0000\u0476\u0477\u0005"+ + ">\u0000\u0000\u0477\u0478\u0005>\u0000\u0000\u0478\u0103\u0001\u0000\u0000"+ + "\u0000\u0479\u047a\u0005&\u0000\u0000\u047a\u047b\u0005^\u0000\u0000\u047b"+ + "\u0105\u0001\u0000\u0000\u0000\u047c\u047d\u0005!\u0000\u0000\u047d\u0107"+ + "\u0001\u0000\u0000\u0000\u047e\u047f\u0005+\u0000\u0000\u047f\u0109\u0001"+ + "\u0000\u0000\u0000\u0480\u0481\u0005-\u0000\u0000\u0481\u010b\u0001\u0000"+ + "\u0000\u0000\u0482\u0483\u0005^\u0000\u0000\u0483\u010d\u0001\u0000\u0000"+ + "\u0000\u0484\u0485\u0005*\u0000\u0000\u0485\u010f\u0001\u0000\u0000\u0000"+ + "\u0486\u0487\u0005&\u0000\u0000\u0487\u0111\u0001\u0000\u0000\u0000\u0488"+ + "\u0489\u0005<\u0000\u0000\u0489\u048a\u0005-\u0000\u0000\u048a\u0113\u0001"+ + "\u0000\u0000\u0000\u048b\u0497\u00050\u0000\u0000\u048c\u0493\u0007\u0000"+ + "\u0000\u0000\u048d\u048f\u0005_\u0000\u0000\u048e\u048d\u0001\u0000\u0000"+ + "\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0001\u0000\u0000"+ + "\u0000\u0490\u0492\u0007\u0001\u0000\u0000\u0491\u048e\u0001\u0000\u0000"+ + "\u0000\u0492\u0495\u0001\u0000\u0000\u0000\u0493\u0491\u0001\u0000\u0000"+ + "\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0497\u0001\u0000\u0000"+ + "\u0000\u0495\u0493\u0001\u0000\u0000\u0000\u0496\u048b\u0001\u0000\u0000"+ + "\u0000\u0496\u048c\u0001\u0000\u0000\u0000\u0497\u0498\u0001\u0000\u0000"+ + "\u0000\u0498\u0499\u0006\u0089\u0000\u0000\u0499\u0115\u0001\u0000\u0000"+ + "\u0000\u049a\u049b\u00050\u0000\u0000\u049b\u04a0\u0007\u0002\u0000\u0000"+ + "\u049c\u049e\u0005_\u0000\u0000\u049d\u049c\u0001\u0000\u0000\u0000\u049d"+ + "\u049e\u0001\u0000\u0000\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f"+ + "\u04a1\u0003\u0148\u00a3\u0000\u04a0\u049d\u0001\u0000\u0000\u0000\u04a1"+ + "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a2"+ + "\u04a3\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4"+ + "\u04a5\u0006\u008a\u0000\u0000\u04a5\u0117\u0001\u0000\u0000\u0000\u04a6"+ + "\u04a8\u00050\u0000\u0000\u04a7\u04a9\u0007\u0003\u0000\u0000\u04a8\u04a7"+ + "\u0001\u0000\u0000\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04ae"+ + "\u0001\u0000\u0000\u0000\u04aa\u04ac\u0005_\u0000\u0000\u04ab\u04aa\u0001"+ + "\u0000\u0000\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000\u04ac\u04ad\u0001"+ + "\u0000\u0000\u0000\u04ad\u04af\u0003\u0144\u00a1\u0000\u04ae\u04ab\u0001"+ + "\u0000\u0000\u0000\u04af\u04b0\u0001\u0000\u0000\u0000\u04b0\u04ae\u0001"+ + "\u0000\u0000\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001"+ + "\u0000\u0000\u0000\u04b2\u04b3\u0006\u008b\u0000\u0000\u04b3\u0119\u0001"+ + "\u0000\u0000\u0000\u04b4\u04b5\u00050\u0000\u0000\u04b5\u04ba\u0007\u0004"+ + "\u0000\u0000\u04b6\u04b8\u0005_\u0000\u0000\u04b7\u04b6\u0001\u0000\u0000"+ + "\u0000\u04b7\u04b8\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000"+ + "\u0000\u04b9\u04bb\u0003\u0146\u00a2\u0000\u04ba\u04b7\u0001\u0000\u0000"+ + "\u0000\u04bb\u04bc\u0001\u0000\u0000\u0000\u04bc\u04ba\u0001\u0000\u0000"+ + "\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0001\u0000\u0000"+ + "\u0000\u04be\u04bf\u0006\u008c\u0000\u0000\u04bf\u011b\u0001\u0000\u0000"+ + "\u0000\u04c0\u04c1\u00050\u0000\u0000\u04c1\u04c2\u0007\u0004\u0000\u0000"+ + "\u04c2\u04c3\u0003\u011e\u008e\u0000\u04c3\u04c4\u0003\u0120\u008f\u0000"+ + "\u04c4\u011d\u0001\u0000\u0000\u0000\u04c5\u04c7\u0005_\u0000\u0000\u04c6"+ + "\u04c5\u0001\u0000\u0000\u0000\u04c6\u04c7\u0001\u0000\u0000\u0000\u04c7"+ + "\u04c8\u0001\u0000\u0000\u0000\u04c8\u04ca\u0003\u0146\u00a2\u0000\u04c9"+ + "\u04c6\u0001\u0000\u0000\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb"+ + "\u04c9\u0001\u0000\u0000\u0000\u04cb\u04cc\u0001\u0000\u0000\u0000\u04cc"+ + "\u04d7\u0001\u0000\u0000\u0000\u04cd\u04d4\u0005.\u0000\u0000\u04ce\u04d0"+ + "\u0005_\u0000\u0000\u04cf\u04ce\u0001\u0000\u0000\u0000\u04cf\u04d0\u0001"+ + "\u0000\u0000\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d3\u0003"+ + "\u0146\u00a2\u0000\u04d2\u04cf\u0001\u0000\u0000\u0000\u04d3\u04d6\u0001"+ + "\u0000\u0000\u0000\u04d4\u04d2\u0001\u0000\u0000\u0000\u04d4\u04d5\u0001"+ + "\u0000\u0000\u0000\u04d5\u04d8\u0001\u0000\u0000\u0000\u04d6\u04d4\u0001"+ + "\u0000\u0000\u0000\u04d7\u04cd\u0001\u0000\u0000\u0000\u04d7\u04d8\u0001"+ + "\u0000\u0000\u0000\u04d8\u04e5\u0001\u0000\u0000\u0000\u04d9\u04da\u0005"+ + ".\u0000\u0000\u04da\u04e1\u0003\u0146\u00a2\u0000\u04db\u04dd\u0005_\u0000"+ + "\u0000\u04dc\u04db\u0001\u0000\u0000\u0000\u04dc\u04dd\u0001\u0000\u0000"+ + "\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04e0\u0003\u0146\u00a2"+ + "\u0000\u04df\u04dc\u0001\u0000\u0000\u0000\u04e0\u04e3\u0001\u0000\u0000"+ + "\u0000\u04e1\u04df\u0001\u0000\u0000\u0000\u04e1\u04e2\u0001\u0000\u0000"+ + "\u0000\u04e2\u04e5\u0001\u0000\u0000\u0000\u04e3\u04e1\u0001\u0000\u0000"+ + "\u0000\u04e4\u04c9\u0001\u0000\u0000\u0000\u04e4\u04d9\u0001\u0000\u0000"+ + "\u0000\u04e5\u011f\u0001\u0000\u0000\u0000\u04e6\u04e7\u0007\u0005\u0000"+ + "\u0000\u04e7\u04e8\u0007\u0006\u0000\u0000\u04e8\u04e9\u0003\u0142\u00a0"+ + "\u0000\u04e9\u0121\u0001\u0000\u0000\u0000\u04ea\u04f0\u0003\u0114\u0089"+ + "\u0000\u04eb\u04f0\u0003\u0116\u008a\u0000\u04ec\u04f0\u0003\u0118\u008b"+ + "\u0000\u04ed\u04f0\u0003\u011a\u008c\u0000\u04ee\u04f0\u0003\u0002\u0000"+ + "\u0000\u04ef\u04ea\u0001\u0000\u0000\u0000\u04ef\u04eb\u0001\u0000\u0000"+ + "\u0000\u04ef\u04ec\u0001\u0000\u0000\u0000\u04ef\u04ed\u0001\u0000\u0000"+ + "\u0000\u04ef\u04ee\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000"+ + "\u0000\u04f1\u04f2\u0005i\u0000\u0000\u04f2\u04f3\u0001\u0000\u0000\u0000"+ + "\u04f3\u04f4\u0006\u0090\u0000\u0000\u04f4\u0123\u0001\u0000\u0000\u0000"+ + "\u04f5\u04f8\u0005\'\u0000\u0000\u04f6\u04f9\u0003\u013e\u009e\u0000\u04f7"+ + "\u04f9\u0003\u0128\u0093\u0000\u04f8\u04f6\u0001\u0000\u0000\u0000\u04f8"+ + "\u04f7\u0001\u0000\u0000\u0000\u04f9\u04fa\u0001\u0000\u0000\u0000\u04fa"+ + "\u04fb\u0005\'\u0000\u0000\u04fb\u0125\u0001\u0000\u0000\u0000\u04fc\u04fd"+ + "\u0003\u0124\u0091\u0000\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u04ff"+ + "\u0006\u0092\u0000\u0000\u04ff\u0127\u0001\u0000\u0000\u0000\u0500\u0503"+ + "\u0003\u012a\u0094\u0000\u0501\u0503\u0003\u012c\u0095\u0000\u0502\u0500"+ + "\u0001\u0000\u0000\u0000\u0502\u0501\u0001\u0000\u0000\u0000\u0503\u0129"+ + "\u0001\u0000\u0000\u0000\u0504\u0505\u0005\\\u0000\u0000\u0505\u0506\u0003"+ + "\u0144\u00a1\u0000\u0506\u0507\u0003\u0144\u00a1\u0000\u0507\u0508\u0003"+ + "\u0144\u00a1\u0000\u0508\u012b\u0001\u0000\u0000\u0000\u0509\u050a\u0005"+ + "\\\u0000\u0000\u050a\u050b\u0005x\u0000\u0000\u050b\u050c\u0003\u0146"+ + "\u00a2\u0000\u050c\u050d\u0003\u0146\u00a2\u0000\u050d\u012d\u0001\u0000"+ + "\u0000\u0000\u050e\u050f\u0005\\\u0000\u0000\u050f\u0510\u0005u\u0000"+ + "\u0000\u0510\u0511\u0003\u0146\u00a2\u0000\u0511\u0512\u0003\u0146\u00a2"+ + "\u0000\u0512\u0513\u0003\u0146\u00a2\u0000\u0513\u0514\u0003\u0146\u00a2"+ + "\u0000\u0514\u012f\u0001\u0000\u0000\u0000\u0515\u0516\u0005\\\u0000\u0000"+ + "\u0516\u0517\u0005U\u0000\u0000\u0517\u0518\u0003\u0146\u00a2\u0000\u0518"+ + "\u0519\u0003\u0146\u00a2\u0000\u0519\u051a\u0003\u0146\u00a2\u0000\u051a"+ + "\u051b\u0003\u0146\u00a2\u0000\u051b\u051c\u0003\u0146\u00a2\u0000\u051c"+ + "\u051d\u0003\u0146\u00a2\u0000\u051d\u051e\u0003\u0146\u00a2\u0000\u051e"+ + "\u051f\u0003\u0146\u00a2\u0000\u051f\u0131\u0001\u0000\u0000\u0000\u0520"+ + "\u0524\u0005`\u0000\u0000\u0521\u0523\b\u0007\u0000\u0000\u0522\u0521"+ + "\u0001\u0000\u0000\u0000\u0523\u0526\u0001\u0000\u0000\u0000\u0524\u0522"+ + "\u0001\u0000\u0000\u0000\u0524\u0525\u0001\u0000\u0000\u0000\u0525\u0527"+ + "\u0001\u0000\u0000\u0000\u0526\u0524\u0001\u0000\u0000\u0000\u0527\u0528"+ + "\u0005`\u0000\u0000\u0528\u0529\u0001\u0000\u0000\u0000\u0529\u052a\u0006"+ + "\u0098\u0000\u0000\u052a\u0133\u0001\u0000\u0000\u0000\u052b\u0530\u0005"+ + "\"\u0000\u0000\u052c\u052f\b\b\u0000\u0000\u052d\u052f\u0003\u0140\u009f"+ + "\u0000\u052e\u052c\u0001\u0000\u0000\u0000\u052e\u052d\u0001\u0000\u0000"+ + "\u0000\u052f\u0532\u0001\u0000\u0000\u0000\u0530\u052e\u0001\u0000\u0000"+ + "\u0000\u0530\u0531\u0001\u0000\u0000\u0000\u0531\u0533\u0001\u0000\u0000"+ + "\u0000\u0532\u0530\u0001\u0000\u0000\u0000\u0533\u0534\u0005\"\u0000\u0000"+ + "\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0536\u0006\u0099\u0000\u0000"+ + "\u0536\u0135\u0001\u0000\u0000\u0000\u0537\u0539\u0007\t\u0000\u0000\u0538"+ + "\u0537\u0001\u0000\u0000\u0000\u0539\u053a\u0001\u0000\u0000\u0000\u053a"+ + "\u0538\u0001\u0000\u0000\u0000\u053a\u053b\u0001\u0000\u0000\u0000\u053b"+ + "\u053c\u0001\u0000\u0000\u0000\u053c\u053d\u0006\u009a\u0001\u0000\u053d"+ + "\u0137\u0001\u0000\u0000\u0000\u053e\u053f\u0005/\u0000\u0000\u053f\u0540"+ + "\u0005*\u0000\u0000\u0540\u0544\u0001\u0000\u0000\u0000\u0541\u0543\t"+ + "\u0000\u0000\u0000\u0542\u0541\u0001\u0000\u0000\u0000\u0543\u0546\u0001"+ + "\u0000\u0000\u0000\u0544\u0545\u0001\u0000\u0000\u0000\u0544\u0542\u0001"+ + "\u0000\u0000\u0000\u0545\u0547\u0001\u0000\u0000\u0000\u0546\u0544\u0001"+ + "\u0000\u0000\u0000\u0547\u0548\u0005*\u0000\u0000\u0548\u0549\u0005/\u0000"+ + "\u0000\u0549\u054a\u0001\u0000\u0000\u0000\u054a\u054b\u0006\u009b\u0001"+ + "\u0000\u054b\u0139\u0001\u0000\u0000\u0000\u054c\u054e\u0007\n\u0000\u0000"+ + "\u054d\u054c\u0001\u0000\u0000\u0000\u054e\u054f\u0001\u0000\u0000\u0000"+ + "\u054f\u054d\u0001\u0000\u0000\u0000\u054f\u0550\u0001\u0000\u0000\u0000"+ + "\u0550\u0551\u0001\u0000\u0000\u0000\u0551\u0552\u0006\u009c\u0001\u0000"+ + "\u0552\u013b\u0001\u0000\u0000\u0000\u0553\u0554\u0005/\u0000\u0000\u0554"+ + "\u0555\u0005/\u0000\u0000\u0555\u0559\u0001\u0000\u0000\u0000\u0556\u0558"+ + "\b\n\u0000\u0000\u0557\u0556\u0001\u0000\u0000\u0000\u0558\u055b\u0001"+ + "\u0000\u0000\u0000\u0559\u0557\u0001\u0000\u0000\u0000\u0559\u055a\u0001"+ + "\u0000\u0000\u0000\u055a\u055c\u0001\u0000\u0000\u0000\u055b\u0559\u0001"+ + "\u0000\u0000\u0000\u055c\u055d\u0006\u009d\u0001\u0000\u055d\u013d\u0001"+ + "\u0000\u0000\u0000\u055e\u0563\b\u000b\u0000\u0000\u055f\u0563\u0003\u012e"+ + "\u0096\u0000\u0560\u0563\u0003\u0130\u0097\u0000\u0561\u0563\u0003\u0140"+ + "\u009f\u0000\u0562\u055e\u0001\u0000\u0000\u0000\u0562\u055f\u0001\u0000"+ + "\u0000\u0000\u0562\u0560\u0001\u0000\u0000\u0000\u0562\u0561\u0001\u0000"+ + "\u0000\u0000\u0563\u013f\u0001\u0000\u0000\u0000\u0564\u057e\u0005\\\u0000"+ + "\u0000\u0565\u0566\u0005u\u0000\u0000\u0566\u0567\u0003\u0146\u00a2\u0000"+ + "\u0567\u0568\u0003\u0146\u00a2\u0000\u0568\u0569\u0003\u0146\u00a2\u0000"+ + "\u0569\u056a\u0003\u0146\u00a2\u0000\u056a\u057f\u0001\u0000\u0000\u0000"+ + "\u056b\u056c\u0005U\u0000\u0000\u056c\u056d\u0003\u0146\u00a2\u0000\u056d"+ + "\u056e\u0003\u0146\u00a2\u0000\u056e\u056f\u0003\u0146\u00a2\u0000\u056f"+ + "\u0570\u0003\u0146\u00a2\u0000\u0570\u0571\u0003\u0146\u00a2\u0000\u0571"+ + "\u0572\u0003\u0146\u00a2\u0000\u0572\u0573\u0003\u0146\u00a2\u0000\u0573"+ + "\u0574\u0003\u0146\u00a2\u0000\u0574\u057f\u0001\u0000\u0000\u0000\u0575"+ + "\u057f\u0007\f\u0000\u0000\u0576\u0577\u0003\u0144\u00a1\u0000\u0577\u0578"+ + "\u0003\u0144\u00a1\u0000\u0578\u0579\u0003\u0144\u00a1\u0000\u0579\u057f"+ + "\u0001\u0000\u0000\u0000\u057a\u057b\u0005x\u0000\u0000\u057b\u057c\u0003"+ + "\u0146\u00a2\u0000\u057c\u057d\u0003\u0146\u00a2\u0000\u057d\u057f\u0001"+ + "\u0000\u0000\u0000\u057e\u0565\u0001\u0000\u0000\u0000\u057e\u056b\u0001"+ + "\u0000\u0000\u0000\u057e\u0575\u0001\u0000\u0000\u0000\u057e\u0576\u0001"+ + "\u0000\u0000\u0000\u057e\u057a\u0001\u0000\u0000\u0000\u057f\u0141\u0001"+ + "\u0000\u0000\u0000\u0580\u0587\u0007\u0001\u0000\u0000\u0581\u0583\u0005"+ + "_\u0000\u0000\u0582\u0581\u0001\u0000\u0000\u0000\u0582\u0583\u0001\u0000"+ + "\u0000\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0586\u0007\u0001"+ + "\u0000\u0000\u0585\u0582\u0001\u0000\u0000\u0000\u0586\u0589\u0001\u0000"+ + "\u0000\u0000\u0587\u0585\u0001\u0000\u0000\u0000\u0587\u0588\u0001\u0000"+ + "\u0000\u0000\u0588\u0143\u0001\u0000\u0000\u0000\u0589\u0587\u0001\u0000"+ + "\u0000\u0000\u058a\u058b\u0007\r\u0000\u0000\u058b\u0145\u0001\u0000\u0000"+ + "\u0000\u058c\u058d\u0007\u000e\u0000\u0000\u058d\u0147\u0001\u0000\u0000"+ + "\u0000\u058e\u058f\u0007\u000f\u0000\u0000\u058f\u0149\u0001\u0000\u0000"+ + "\u0000\u0590\u0592\u0007\u0010\u0000\u0000\u0591\u0593\u0007\u0006\u0000"+ + "\u0000\u0592\u0591\u0001\u0000\u0000\u0000\u0592\u0593\u0001\u0000\u0000"+ + "\u0000\u0593\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u0003\u0142\u00a0"+ + "\u0000\u0595\u014b\u0001\u0000\u0000\u0000\u0596\u0599\u0003\u0150\u00a7"+ + "\u0000\u0597\u0599\u0005_\u0000\u0000\u0598\u0596\u0001\u0000\u0000\u0000"+ + "\u0598\u0597\u0001\u0000\u0000\u0000\u0599\u014d\u0001\u0000\u0000\u0000"+ + "\u059a\u059b\u0007\u0011\u0000\u0000\u059b\u014f\u0001\u0000\u0000\u0000"+ + "\u059c\u059d\u0007\u0012\u0000\u0000\u059d\u0151\u0001\u0000\u0000\u0000"+ + "\u059e\u05a0\u0007\t\u0000\u0000\u059f\u059e\u0001\u0000\u0000\u0000\u05a0"+ + "\u05a1\u0001\u0000\u0000\u0000\u05a1\u059f\u0001\u0000\u0000\u0000\u05a1"+ + "\u05a2\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000\u0000\u0000\u05a3"+ + "\u05a4\u0006\u00a8\u0001\u0000\u05a4\u0153\u0001\u0000\u0000\u0000\u05a5"+ + "\u05a6\u0005/\u0000\u0000\u05a6\u05a7\u0005*\u0000\u0000\u05a7\u05ab\u0001"+ + "\u0000\u0000\u0000\u05a8\u05aa\b\n\u0000\u0000\u05a9\u05a8\u0001\u0000"+ + "\u0000\u0000\u05aa\u05ad\u0001\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000"+ + "\u0000\u0000\u05ab\u05a9\u0001\u0000\u0000\u0000\u05ac\u05ae\u0001\u0000"+ + "\u0000\u0000\u05ad\u05ab\u0001\u0000\u0000\u0000\u05ae\u05af\u0005*\u0000"+ + "\u0000\u05af\u05b0\u0005/\u0000\u0000\u05b0\u05b1\u0001\u0000\u0000\u0000"+ + "\u05b1\u05b2\u0006\u00a9\u0001\u0000\u05b2\u0155\u0001\u0000\u0000\u0000"+ + "\u05b3\u05b4\u0005/\u0000\u0000\u05b4\u05b5\u0005/\u0000\u0000\u05b5\u05b9"+ + "\u0001\u0000\u0000\u0000\u05b6\u05b8\b\n\u0000\u0000\u05b7\u05b6\u0001"+ + "\u0000\u0000\u0000\u05b8\u05bb\u0001\u0000\u0000\u0000\u05b9\u05b7\u0001"+ + "\u0000\u0000\u0000\u05b9\u05ba\u0001\u0000\u0000\u0000\u05ba\u05bc\u0001"+ + "\u0000\u0000\u0000\u05bb\u05b9\u0001\u0000\u0000\u0000\u05bc\u05bd\u0006"+ + "\u00aa\u0001\u0000\u05bd\u0157\u0001\u0000\u0000\u0000\u05be\u05c0\u0007"+ + "\n\u0000\u0000\u05bf\u05be\u0001\u0000\u0000\u0000\u05c0\u05c1\u0001\u0000"+ + "\u0000\u0000\u05c1\u05bf\u0001\u0000\u0000\u0000\u05c1\u05c2\u0001\u0000"+ + "\u0000\u0000\u05c2\u05d1\u0001\u0000\u0000\u0000\u05c3\u05d1\u0005;\u0000"+ + "\u0000\u05c4\u05c5\u0005/\u0000\u0000\u05c5\u05c6\u0005*\u0000\u0000\u05c6"+ + "\u05ca\u0001\u0000\u0000\u0000\u05c7\u05c9\t\u0000\u0000\u0000\u05c8\u05c7"+ + "\u0001\u0000\u0000\u0000\u05c9\u05cc\u0001\u0000\u0000\u0000\u05ca\u05cb"+ + "\u0001\u0000\u0000\u0000\u05ca\u05c8\u0001\u0000\u0000\u0000\u05cb\u05cd"+ + "\u0001\u0000\u0000\u0000\u05cc\u05ca\u0001\u0000\u0000\u0000\u05cd\u05ce"+ + "\u0005*\u0000\u0000\u05ce\u05d1\u0005/\u0000\u0000\u05cf\u05d1\u0005\u0000"+ + "\u0000\u0001\u05d0\u05bf\u0001\u0000\u0000\u0000\u05d0\u05c3\u0001\u0000"+ + "\u0000\u0000\u05d0\u05c4\u0001\u0000\u0000\u0000\u05d0\u05cf\u0001\u0000"+ + "\u0000\u0000\u05d1\u05d2\u0001\u0000\u0000\u0000\u05d2\u05d3\u0006\u00ab"+ + "\u0002\u0000\u05d3\u0159\u0001\u0000\u0000\u0000\u05d4\u05d5\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\u0001\u0000\u0000\u0000\u05d6\u05d7\u0006\u00ac"+ + "\u0002\u0000\u05d7\u05d8\u0006\u00ac\u0001\u0000\u05d8\u015b\u0001\u0000"+ + "\u0000\u00002\u0000\u0001\u015e\u0166\u0169\u016c\u0172\u0174\u0423\u0425"+ + "\u048e\u0493\u0496\u049d\u04a2\u04a8\u04ab\u04b0\u04b7\u04bc\u04c6\u04cb"+ + "\u04cf\u04d4\u04d7\u04dc\u04e1\u04e4\u04ef\u04f8\u0502\u0524\u052e\u0530"+ + "\u053a\u0544\u054f\u0559\u0562\u057e\u0582\u0587\u0592\u0598\u05a1\u05ab"+ + "\u05b9\u05c1\u05ca\u05d0\u0003\u0002\u0001\u0000\u0000\u0001\u0000\u0002"+ + "\u0000\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -916,4 +1341,4 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 5771a622b..717aba363 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,3 +1,4 @@ +// 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; @@ -8,9 +9,9 @@ import java.util.Iterator; import java.util.ArrayList; -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.12.0", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -70,32 +71,35 @@ public class GobraParser extends GobraParserBase { RULE_statement = 82, RULE_applyStmt = 83, RULE_packageStmt = 84, RULE_specForStmt = 85, RULE_loopSpec = 86, RULE_deferStmt = 87, RULE_basicLit = 88, RULE_primaryExpr = 89, RULE_functionLit = 90, RULE_closureDecl = 91, RULE_predConstructArgs = 92, - RULE_interfaceType = 93, RULE_predicateSpec = 94, RULE_methodSpec = 95, - RULE_type_ = 96, RULE_typeLit = 97, RULE_predType = 98, RULE_predTypeParams = 99, - RULE_literalType = 100, RULE_implicitArray = 101, RULE_slice_ = 102, RULE_low = 103, - RULE_high = 104, RULE_cap = 105, RULE_assign_op = 106, RULE_rangeClause = 107, - RULE_packageClause = 108, RULE_importPath = 109, RULE_declaration = 110, - RULE_constDecl = 111, RULE_constSpec = 112, RULE_identifierList = 113, - RULE_expressionList = 114, RULE_typeDecl = 115, RULE_typeSpec = 116, RULE_varDecl = 117, - RULE_block = 118, RULE_statementList = 119, RULE_simpleStmt = 120, RULE_expressionStmt = 121, - RULE_sendStmt = 122, RULE_incDecStmt = 123, RULE_assignment = 124, RULE_emptyStmt = 125, - RULE_labeledStmt = 126, RULE_returnStmt = 127, RULE_breakStmt = 128, RULE_continueStmt = 129, - RULE_gotoStmt = 130, RULE_fallthroughStmt = 131, RULE_ifStmt = 132, RULE_switchStmt = 133, - RULE_exprSwitchStmt = 134, RULE_exprCaseClause = 135, RULE_exprSwitchCase = 136, - RULE_typeSwitchStmt = 137, RULE_typeSwitchGuard = 138, RULE_typeCaseClause = 139, - RULE_typeSwitchCase = 140, RULE_typeList = 141, RULE_selectStmt = 142, - RULE_commClause = 143, RULE_commCase = 144, RULE_recvStmt = 145, RULE_forStmt = 146, - RULE_forClause = 147, RULE_goStmt = 148, RULE_typeName = 149, RULE_arrayType = 150, - RULE_arrayLength = 151, RULE_elementType = 152, RULE_pointerType = 153, - RULE_sliceType = 154, RULE_mapType = 155, RULE_channelType = 156, RULE_functionType = 157, - RULE_signature = 158, RULE_result = 159, RULE_parameters = 160, RULE_conversion = 161, - RULE_nonNamedType = 162, RULE_operand = 163, RULE_literal = 164, RULE_integer = 165, - RULE_operandName = 166, RULE_qualifiedIdent = 167, RULE_compositeLit = 168, - RULE_literalValue = 169, RULE_elementList = 170, RULE_keyedElement = 171, - RULE_key = 172, RULE_element = 173, RULE_structType = 174, RULE_fieldDecl = 175, - RULE_string_ = 176, RULE_embeddedField = 177, RULE_index = 178, RULE_typeAssertion = 179, - RULE_arguments = 180, RULE_methodExpr = 181, RULE_receiverType = 182, - RULE_eos = 183; + RULE_interfaceType = 93, RULE_interfaceElem = 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_aliasDecl = 118, + RULE_typeDef = 119, RULE_varDecl = 120, RULE_block = 121, RULE_statementList = 122, + RULE_simpleStmt = 123, RULE_expressionStmt = 124, RULE_sendStmt = 125, + RULE_incDecStmt = 126, RULE_assignment = 127, RULE_emptyStmt = 128, RULE_labeledStmt = 129, + RULE_returnStmt = 130, RULE_breakStmt = 131, RULE_continueStmt = 132, + RULE_gotoStmt = 133, RULE_fallthroughStmt = 134, RULE_ifStmt = 135, RULE_switchStmt = 136, + RULE_exprSwitchStmt = 137, RULE_exprCaseClause = 138, RULE_exprSwitchCase = 139, + RULE_typeSwitchStmt = 140, RULE_typeSwitchGuard = 141, RULE_typeCaseClause = 142, + RULE_typeSwitchCase = 143, RULE_typeListSwitch = 144, RULE_selectStmt = 145, + RULE_commClause = 146, RULE_commCase = 147, RULE_recvStmt = 148, RULE_forStmt = 149, + RULE_forClause = 150, RULE_goStmt = 151, RULE_typeName = 152, RULE_typeArgs = 153, + RULE_typeList = 154, RULE_arrayType = 155, RULE_arrayLength = 156, RULE_elementType = 157, + RULE_pointerType = 158, RULE_typeElem = 159, RULE_typeTerm = 160, RULE_sliceType = 161, + RULE_mapType = 162, RULE_channelType = 163, RULE_functionType = 164, RULE_signature = 165, + RULE_result = 166, RULE_parameters = 167, RULE_typeParameters = 168, RULE_typeParamList = 169, + RULE_typeParamDecl = 170, RULE_typeConstraint = 171, RULE_conversion = 172, + RULE_nonNamedType = 173, RULE_operand = 174, RULE_literal = 175, RULE_integer = 176, + RULE_operandName = 177, RULE_qualifiedIdent = 178, RULE_compositeLit = 179, + RULE_literalValue = 180, RULE_elementList = 181, RULE_keyedElement = 182, + RULE_key = 183, RULE_element = 184, RULE_structType = 185, RULE_fieldDecl = 186, + RULE_string_ = 187, RULE_embeddedField = 188, RULE_index = 189, RULE_typeAssertion = 190, + RULE_arguments = 191, RULE_methodExpr = 192, RULE_receiverType = 193, + RULE_eos = 194; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -117,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", - "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" + "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", "typeListSwitch", "selectStmt", "commClause", "commCase", + "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "typeArgs", + "typeList", "arrayType", "arrayLength", "elementType", "pointerType", + "typeElem", "typeTerm", "sliceType", "mapType", "channelType", "functionType", + "signature", "result", "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(); @@ -243,6 +249,7 @@ public GobraParser(TokenStream input) { _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); } + @SuppressWarnings("CheckReturnValue") public static class ExprOnlyContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -265,9 +272,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(368); + setState(390); expression(0); - setState(369); + setState(391); match(EOF); } } @@ -282,6 +289,7 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StmtOnlyContext extends ParserRuleContext { public StatementContext statement() { return getRuleContext(StatementContext.class,0); @@ -304,9 +312,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(393); statement(); - setState(372); + setState(394); match(EOF); } } @@ -321,6 +329,7 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeOnlyContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -343,9 +352,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(374); + setState(396); type_(); - setState(375); + setState(397); match(EOF); } } @@ -360,6 +369,7 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MaybeAddressableIdentifierListContext extends ParserRuleContext { public List maybeAddressableIdentifier() { return getRuleContexts(MaybeAddressableIdentifierContext.class); @@ -389,21 +399,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(377); + setState(399); maybeAddressableIdentifier(); - setState(382); + setState(404); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(378); + setState(400); match(COMMA); - setState(379); + setState(401); maybeAddressableIdentifier(); } } - setState(384); + setState(406); _errHandler.sync(this); _la = _input.LA(1); } @@ -420,6 +430,7 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MaybeAddressableIdentifierContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode ADDR_MOD() { return getToken(GobraParser.ADDR_MOD, 0); } @@ -441,14 +452,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(385); + setState(407); match(IDENTIFIER); - setState(387); + setState(409); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(386); + setState(408); match(ADDR_MOD); } } @@ -466,6 +477,7 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SourceFileContext extends ParserRuleContext { public PackageClauseContext packageClause() { return getRuleContext(PackageClauseContext.class,0); @@ -525,79 +537,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(394); + setState(416); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(389); + setState(411); initPost(); - setState(390); + setState(412); eos(); } } - setState(396); + setState(418); _errHandler.sync(this); _la = _input.LA(1); } - setState(397); + setState(419); packageClause(); - setState(398); + setState(420); eos(); - setState(404); + setState(426); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(399); + setState(421); importDecl(); - setState(400); + setState(422); eos(); } } - setState(406); + setState(428); _errHandler.sync(this); _la = _input.LA(1); } - setState(416); + setState(438); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (ADT - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (CONST - 77)) | (1L << (TYPE - 77)) | (1L << (VAR - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881350095299L) != 0)) { { { - setState(410); + setState(432); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(407); + setState(429); specMember(); } break; case 2: { - setState(408); + setState(430); declaration(); } break; case 3: { - setState(409); + setState(431); ghostMember(); } break; } - setState(412); + setState(434); eos(); } } - setState(418); + setState(440); _errHandler.sync(this); _la = _input.LA(1); } - setState(419); + setState(441); match(EOF); } } @@ -612,6 +624,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class InitPostContext extends ParserRuleContext { public TerminalNode INIT_POST() { return getToken(GobraParser.INIT_POST, 0); } public ExpressionContext expression() { @@ -634,9 +647,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(421); + setState(443); match(INIT_POST); - setState(422); + setState(444); expression(0); } } @@ -651,6 +664,7 @@ public final InitPostContext initPost() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportPreContext extends ParserRuleContext { public TerminalNode IMPORT_PRE() { return getToken(GobraParser.IMPORT_PRE, 0); } public ExpressionContext expression() { @@ -673,9 +687,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(424); + setState(446); match(IMPORT_PRE); - setState(425); + setState(447); expression(0); } } @@ -690,6 +704,7 @@ public final ImportPreContext importPre() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportSpecContext extends ParserRuleContext { public Token alias; public ImportPathContext importPath() { @@ -727,28 +742,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(432); + setState(454); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(427); + setState(449); importPre(); - setState(428); + setState(450); eos(); } } - setState(434); + setState(456); _errHandler.sync(this); _la = _input.LA(1); } - setState(436); + setState(458); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(435); + setState(457); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -762,7 +777,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(438); + setState(460); importPath(); } } @@ -777,6 +792,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportDeclContext extends ParserRuleContext { public TerminalNode IMPORT() { return getToken(GobraParser.IMPORT, 0); } public List importSpec() { @@ -817,56 +833,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(445); + setState(467); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(440); + setState(462); importPre(); - setState(441); + setState(463); eos(); } } - setState(447); + setState(469); _errHandler.sync(this); _la = _input.LA(1); } - setState(461); + setState(483); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(448); + setState(470); match(IMPORT); - setState(449); + setState(471); importSpec(); } break; case 2: { - setState(450); + setState(472); match(IMPORT); - setState(451); + setState(473); match(L_PAREN); - setState(457); + setState(479); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (IMPORT_PRE - 70)) | (1L << (IDENTIFIER - 70)) | (1L << (DOT - 70)))) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { + while (((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & 4400193994753L) != 0) || _la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) { { { - setState(452); + setState(474); importSpec(); - setState(453); + setState(475); eos(); } } - setState(459); + setState(481); _errHandler.sync(this); _la = _input.LA(1); } - setState(460); + setState(482); match(R_PAREN); } break; @@ -884,6 +900,7 @@ public final ImportDeclContext importDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostMemberContext extends ParserRuleContext { public ImplementationProofContext implementationProof() { return getRuleContext(ImplementationProofContext.class,0); @@ -912,34 +929,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 20, RULE_ghostMember); try { - setState(467); + setState(489); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(463); + setState(485); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(464); + setState(486); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(465); + setState(487); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(466); + setState(488); explicitGhostMember(); } break; @@ -956,6 +973,7 @@ public final GhostMemberContext ghostMember() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostStatementContext extends ParserRuleContext { public GhostStatementContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -967,6 +985,7 @@ public void copyFrom(GhostStatementContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class ProofStatementContext extends GhostStatementContext { public Token kind; public ExpressionContext expression() { @@ -983,6 +1002,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchStmt_Context extends GhostStatementContext { public MatchStmtContext matchStmt() { return getRuleContext(MatchStmtContext.class,0); @@ -994,6 +1014,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ExplicitGhostStatementContext extends GhostStatementContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public StatementContext statement() { @@ -1006,6 +1027,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class FoldStatementContext extends GhostStatementContext { public Token fold_stmt; public PredicateAccessContext predicateAccess() { @@ -1026,16 +1048,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 22, RULE_ghostStatement); int _la; try { - setState(476); + setState(498); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(469); + setState(491); match(GHOST); - setState(470); + setState(492); statement(); } break; @@ -1044,7 +1066,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(471); + setState(493); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1055,7 +1077,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(472); + setState(494); predicateAccess(); } break; @@ -1066,10 +1088,10 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(473); + setState(495); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASSERT) | (1L << ASSUME) | (1L << INHALE) | (1L << EXHALE))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { ((ProofStatementContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -1077,7 +1099,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(474); + setState(496); expression(0); } break; @@ -1085,7 +1107,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(475); + setState(497); matchStmt(); } break; @@ -1104,6 +1126,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AuxiliaryStatementContext extends ParserRuleContext { public StatementWithSpecContext statementWithSpec() { return getRuleContext(StatementWithSpecContext.class,0); @@ -1125,7 +1148,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(478); + setState(500); statementWithSpec(); } } @@ -1140,6 +1163,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementWithSpecContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -1165,10 +1189,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(502); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(481); + setState(503); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1184,6 +1208,7 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OutlineStatementContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -1210,24 +1235,25 @@ public T accept(ParseTreeVisitor visitor) { public final OutlineStatementContext outlineStatement(boolean trusted,boolean pure) throws RecognitionException { OutlineStatementContext _localctx = new OutlineStatementContext(_ctx, getState(), trusted, pure); enterRule(_localctx, 28, RULE_outlineStatement); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(483); + setState(505); match(OUTLINE); - setState(484); + setState(506); match(L_PAREN); - setState(486); + setState(508); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(485); + setState(507); statementList(); } - break; } - setState(488); + + setState(510); match(R_PAREN); } } @@ -1242,6 +1268,7 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostPrimaryExprContext extends ParserRuleContext { public RangeContext range() { return getRuleContext(RangeContext.class,0); @@ -1297,97 +1324,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_ghostPrimaryExpr); try { - setState(503); + setState(525); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(490); + setState(512); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(491); + setState(513); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(492); + setState(514); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(493); + setState(515); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(494); + setState(516); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(495); + setState(517); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(496); + setState(518); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(497); + setState(519); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(498); + setState(520); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(499); + setState(521); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(500); + setState(522); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(501); + setState(523); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(502); + setState(524); matchExpr(); } break; @@ -1404,6 +1431,7 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PermissionContext extends ParserRuleContext { public TerminalNode WRITEPERM() { return getToken(GobraParser.WRITEPERM, 0); } public TerminalNode NOPERM() { return getToken(GobraParser.NOPERM, 0); } @@ -1425,7 +1453,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(527); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1448,6 +1476,7 @@ public final PermissionContext permission() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeExprContext extends ParserRuleContext { public TerminalNode TYPE() { return getToken(GobraParser.TYPE, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -1472,13 +1501,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(507); + setState(529); match(TYPE); - setState(508); + setState(530); match(L_BRACKET); - setState(509); + setState(531); type_(); - setState(510); + setState(532); match(R_BRACKET); } } @@ -1493,6 +1522,7 @@ public final TypeExprContext typeExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BoundVariablesContext extends ParserRuleContext { public List boundVariableDecl() { return getRuleContexts(BoundVariableDeclContext.class); @@ -1523,32 +1553,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(512); + setState(534); boundVariableDecl(); - setState(517); + setState(539); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(513); + setState(535); match(COMMA); - setState(514); + setState(536); boundVariableDecl(); } } } - setState(519); + setState(541); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } - setState(521); + setState(543); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(520); + setState(542); match(COMMA); } } @@ -1566,6 +1596,7 @@ public final BoundVariablesContext boundVariables() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BoundVariableDeclContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -1596,25 +1627,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(523); + setState(545); match(IDENTIFIER); - setState(528); + setState(550); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(524); + setState(546); match(COMMA); - setState(525); + setState(547); match(IDENTIFIER); } } - setState(530); + setState(552); _errHandler.sync(this); _la = _input.LA(1); } - setState(531); + setState(553); elementType(); } } @@ -1629,6 +1660,7 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TriggersContext extends ParserRuleContext { public List trigger() { return getRuleContexts(TriggerContext.class); @@ -1654,17 +1686,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(536); + setState(558); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(533); + setState(555); trigger(); } } - setState(538); + setState(560); _errHandler.sync(this); _la = _input.LA(1); } @@ -1681,6 +1713,7 @@ public final TriggersContext triggers() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TriggerContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public List expression() { @@ -1712,27 +1745,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(539); + setState(561); match(L_CURLY); - setState(540); + setState(562); expression(0); - setState(545); + setState(567); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(541); + setState(563); match(COMMA); - setState(542); + setState(564); expression(0); } } - setState(547); + setState(569); _errHandler.sync(this); _la = _input.LA(1); } - setState(548); + setState(570); match(R_CURLY); } } @@ -1747,6 +1780,7 @@ public final TriggerContext trigger() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredicateAccessContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -1768,7 +1802,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(550); + setState(572); primaryExpr(0); } } @@ -1783,6 +1817,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionSomeContext extends ParserRuleContext { public TerminalNode SOME() { return getToken(GobraParser.SOME, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1807,13 +1842,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(552); + setState(574); match(SOME); - setState(553); + setState(575); match(L_PAREN); - setState(554); + setState(576); expression(0); - setState(555); + setState(577); match(R_PAREN); } } @@ -1828,6 +1863,7 @@ public final OptionSomeContext optionSome() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionNoneContext extends ParserRuleContext { public TerminalNode NONE() { return getToken(GobraParser.NONE, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -1852,13 +1888,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(557); + setState(579); match(NONE); - setState(558); + setState(580); match(L_BRACKET); - setState(559); + setState(581); type_(); - setState(560); + setState(582); match(R_BRACKET); } } @@ -1873,6 +1909,7 @@ public final OptionNoneContext optionNone() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OptionGetContext extends ParserRuleContext { public TerminalNode GET() { return getToken(GobraParser.GET, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1897,13 +1934,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(584); match(GET); - setState(563); + setState(585); match(L_PAREN); - setState(564); + setState(586); expression(0); - setState(565); + setState(587); match(R_PAREN); } } @@ -1918,6 +1955,7 @@ public final OptionGetContext optionGet() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SConversionContext extends ParserRuleContext { public Token kind; public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -1946,10 +1984,10 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(567); + setState(589); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { ((SConversionContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -1957,11 +1995,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(568); + setState(590); match(L_PAREN); - setState(569); + setState(591); expression(0); - setState(570); + setState(592); match(R_PAREN); } } @@ -1976,6 +2014,7 @@ public final SConversionContext sConversion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OldContext extends ParserRuleContext { public TerminalNode OLD() { return getToken(GobraParser.OLD, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2006,27 +2045,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(594); match(OLD); - setState(577); + setState(599); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(573); + setState(595); match(L_BRACKET); - setState(574); + setState(596); oldLabelUse(); - setState(575); + setState(597); match(R_BRACKET); } } - setState(579); + setState(601); match(L_PAREN); - setState(580); + setState(602); expression(0); - setState(581); + setState(603); match(R_PAREN); } } @@ -2041,6 +2080,7 @@ public final OldContext old() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OldLabelUseContext extends ParserRuleContext { public LabelUseContext labelUse() { return getRuleContext(LabelUseContext.class,0); @@ -2061,20 +2101,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 56, RULE_oldLabelUse); try { - setState(585); + setState(607); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(583); + setState(605); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(584); + setState(606); match(LHS); } break; @@ -2093,6 +2133,7 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LabelUseContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public LabelUseContext(ParserRuleContext parent, int invokingState) { @@ -2112,7 +2153,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(587); + setState(609); match(IDENTIFIER); } } @@ -2127,6 +2168,7 @@ public final LabelUseContext labelUse() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BeforeContext extends ParserRuleContext { public TerminalNode BEFORE() { return getToken(GobraParser.BEFORE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2151,13 +2193,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(611); match(BEFORE); - setState(590); + setState(612); match(L_PAREN); - setState(591); + setState(613); expression(0); - setState(592); + setState(614); match(R_PAREN); } } @@ -2172,6 +2214,7 @@ public final BeforeContext before() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IsComparableContext extends ParserRuleContext { public TerminalNode IS_COMPARABLE() { return getToken(GobraParser.IS_COMPARABLE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2196,13 +2239,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(616); match(IS_COMPARABLE); - setState(595); + setState(617); match(L_PAREN); - setState(596); + setState(618); expression(0); - setState(597); + setState(619); match(R_PAREN); } } @@ -2217,6 +2260,7 @@ public final IsComparableContext isComparable() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeOfContext extends ParserRuleContext { public TerminalNode TYPE_OF() { return getToken(GobraParser.TYPE_OF, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2241,13 +2285,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(599); + setState(621); match(TYPE_OF); - setState(600); + setState(622); match(L_PAREN); - setState(601); + setState(623); expression(0); - setState(602); + setState(624); match(R_PAREN); } } @@ -2262,6 +2306,7 @@ public final TypeOfContext typeOf() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AccessContext extends ParserRuleContext { public TerminalNode ACCESS() { return getToken(GobraParser.ACCESS, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -2291,25 +2336,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(604); + setState(626); match(ACCESS); - setState(605); + setState(627); match(L_PAREN); - setState(606); + setState(628); expression(0); - setState(609); + setState(631); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(607); + setState(629); match(COMMA); - setState(608); + setState(630); expression(0); } } - setState(611); + setState(633); match(R_PAREN); } } @@ -2324,6 +2369,7 @@ public final AccessContext access() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RangeContext extends ParserRuleContext { public Token kind; public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -2356,10 +2402,10 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(613); + setState(635); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { ((RangeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -2367,15 +2413,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(614); + setState(636); match(L_BRACKET); - setState(615); + setState(637); expression(0); - setState(616); + setState(638); match(DOT_DOT); - setState(617); + setState(639); expression(0); - setState(618); + setState(640); match(R_BRACKET); } } @@ -2390,6 +2436,7 @@ public final RangeContext range() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchExprContext extends ParserRuleContext { public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } public ExpressionContext expression() { @@ -2427,29 +2474,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(620); + setState(642); match(MATCH); - setState(621); + setState(643); expression(0); - setState(622); + setState(644); match(L_CURLY); - setState(628); + setState(650); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(623); + setState(645); matchExprClause(); - setState(624); + setState(646); eos(); } } - setState(630); + setState(652); _errHandler.sync(this); _la = _input.LA(1); } - setState(631); + setState(653); match(R_CURLY); } } @@ -2464,6 +2511,7 @@ public final MatchExprContext matchExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchExprClauseContext extends ParserRuleContext { public MatchCaseContext matchCase() { return getRuleContext(MatchCaseContext.class,0); @@ -2489,11 +2537,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(633); + setState(655); matchCase(); - setState(634); + setState(656); match(COLON); - setState(635); + setState(657); expression(0); } } @@ -2508,6 +2556,7 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdExpContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -2539,29 +2588,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(637); + setState(659); match(L_BRACKET); { - setState(638); + setState(660); seqUpdClause(); - setState(643); + setState(665); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(639); + setState(661); match(COMMA); - setState(640); + setState(662); seqUpdClause(); } } - setState(645); + setState(667); _errHandler.sync(this); _la = _input.LA(1); } } - setState(646); + setState(668); match(R_BRACKET); } } @@ -2576,6 +2625,7 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdClauseContext extends ParserRuleContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -2601,11 +2651,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(648); + setState(670); expression(0); - setState(649); + setState(671); match(ASSIGN); - setState(650); + setState(672); expression(0); } } @@ -2620,6 +2670,7 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostTypeLitContext extends ParserRuleContext { public SqTypeContext sqType() { return getRuleContext(SqTypeContext.class,0); @@ -2648,7 +2699,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 78, RULE_ghostTypeLit); try { - setState(656); + setState(678); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2658,28 +2709,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(652); + setState(674); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(653); + setState(675); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(654); + setState(676); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(655); + setState(677); adtType(); } break; @@ -2698,6 +2749,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DomainTypeContext extends ParserRuleContext { public TerminalNode DOM() { return getToken(GobraParser.DOM, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2732,27 +2784,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(658); + setState(680); match(DOM); - setState(659); + setState(681); match(L_CURLY); - setState(665); + setState(687); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(660); + setState(682); domainClause(); - setState(661); + setState(683); eos(); } } - setState(667); + setState(689); _errHandler.sync(this); _la = _input.LA(1); } - setState(668); + setState(690); match(R_CURLY); } } @@ -2767,6 +2819,7 @@ public final DomainTypeContext domainType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DomainClauseContext extends ParserRuleContext { public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -2797,32 +2850,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 82, RULE_domainClause); try { - setState(679); + setState(701); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(670); + setState(692); match(FUNC); - setState(671); + setState(693); match(IDENTIFIER); - setState(672); + setState(694); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(673); + setState(695); match(AXIOM); - setState(674); + setState(696); match(L_CURLY); - setState(675); + setState(697); expression(0); - setState(676); + setState(698); eos(); - setState(677); + setState(699); match(R_CURLY); } break; @@ -2841,6 +2894,7 @@ public final DomainClauseContext domainClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AdtTypeContext extends ParserRuleContext { public TerminalNode ADT() { return getToken(GobraParser.ADT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2875,27 +2929,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(681); + setState(703); match(ADT); - setState(682); + setState(704); match(L_CURLY); - setState(688); + setState(710); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(683); + setState(705); adtClause(); - setState(684); + setState(706); eos(); } } - setState(690); + setState(712); _errHandler.sync(this); _la = _input.LA(1); } - setState(691); + setState(713); match(R_CURLY); } } @@ -2910,6 +2964,7 @@ public final AdtTypeContext adtType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AdtClauseContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -2944,27 +2999,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(693); + setState(715); match(IDENTIFIER); - setState(694); + setState(716); match(L_CURLY); - setState(700); + setState(722); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(695); + setState(717); fieldDecl(); - setState(696); + setState(718); eos(); } } - setState(702); + setState(724); _errHandler.sync(this); _la = _input.LA(1); } - setState(703); + setState(725); match(R_CURLY); } } @@ -2979,6 +3034,7 @@ public final AdtClauseContext adtClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostSliceTypeContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -3003,13 +3059,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(705); + setState(727); match(GHOST); - setState(706); + setState(728); match(L_BRACKET); - setState(707); + setState(729); match(R_BRACKET); - setState(708); + setState(730); elementType(); } } @@ -3024,6 +3080,7 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SqTypeContext extends ParserRuleContext { public Token kind; public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -3055,7 +3112,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 90, RULE_sqType); int _la; try { - setState(721); + setState(743); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3065,10 +3122,10 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(710); + setState(732); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << OPT))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { ((SqTypeContext)_localctx).kind = (Token)_errHandler.recoverInline(this); } else { @@ -3076,11 +3133,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(711); + setState(733); match(L_BRACKET); - setState(712); + setState(734); type_(); - setState(713); + setState(735); match(R_BRACKET); } } @@ -3088,15 +3145,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(715); + setState(737); ((SqTypeContext)_localctx).kind = match(DICT); - setState(716); + setState(738); match(L_BRACKET); - setState(717); + setState(739); type_(); - setState(718); + setState(740); match(R_BRACKET); - setState(719); + setState(741); type_(); } break; @@ -3115,6 +3172,7 @@ public final SqTypeContext sqType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecificationContext extends ParserRuleContext { public boolean trusted = false; public boolean pure = false;; @@ -3157,14 +3215,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(733); + setState(755); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(728); + setState(750); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3172,20 +3230,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(723); + setState(745); specStatement(); } break; case PURE: { - setState(724); + setState(746); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(726); + setState(748); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3193,21 +3251,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(730); + setState(752); eos(); } } } - setState(735); + setState(757); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } - setState(738); + setState(760); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(736); + setState(758); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3226,6 +3284,7 @@ public final SpecificationContext specification() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecStatementContext extends ParserRuleContext { public Token kind; public AssertionContext assertion() { @@ -3253,42 +3312,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 94, RULE_specStatement); try { - setState(748); + setState(770); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(740); + setState(762); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(741); + setState(763); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(742); + setState(764); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(743); + setState(765); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(744); + setState(766); ((SpecStatementContext)_localctx).kind = match(POST); - setState(745); + setState(767); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(746); + setState(768); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(747); + setState(769); terminationMeasure(); } break; @@ -3307,6 +3366,7 @@ public final SpecStatementContext specStatement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TerminationMeasureContext extends ParserRuleContext { public ExpressionListContext expressionList() { return getRuleContext(ExpressionListContext.class,0); @@ -3332,24 +3392,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(751); + setState(773); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(750); + setState(772); expressionList(); } break; } - setState(755); + setState(777); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(753); + setState(775); match(IF); - setState(754); + setState(776); expression(0); } break; @@ -3367,6 +3427,7 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AssertionContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -3386,7 +3447,7 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 98, RULE_assertion); try { - setState(759); + setState(781); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: @@ -3397,7 +3458,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(758); + setState(780); expression(0); } break; @@ -3414,6 +3475,7 @@ public final AssertionContext assertion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchStmtContext extends ParserRuleContext { public TerminalNode MATCH() { return getToken(GobraParser.MATCH, 0); } public ExpressionContext expression() { @@ -3445,27 +3507,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(761); + setState(783); match(MATCH); - setState(762); + setState(784); expression(0); - setState(763); + setState(785); match(L_CURLY); - setState(767); + setState(789); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(764); + setState(786); matchStmtClause(); } } - setState(769); + setState(791); _errHandler.sync(this); _la = _input.LA(1); } - setState(770); + setState(792); match(R_CURLY); } } @@ -3480,6 +3542,7 @@ public final MatchStmtContext matchStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchStmtClauseContext extends ParserRuleContext { public MatchCaseContext matchCase() { return getRuleContext(MatchCaseContext.class,0); @@ -3502,23 +3565,24 @@ public T accept(ParseTreeVisitor visitor) { public final MatchStmtClauseContext matchStmtClause() throws RecognitionException { MatchStmtClauseContext _localctx = new MatchStmtClauseContext(_ctx, getState()); enterRule(_localctx, 102, RULE_matchStmtClause); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(772); + setState(794); matchCase(); - setState(773); + setState(795); match(COLON); - setState(775); + setState(797); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(774); + setState(796); statementList(); } - break; } + } } catch (RecognitionException re) { @@ -3532,6 +3596,7 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public MatchPatternContext matchPattern() { @@ -3553,22 +3618,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 104, RULE_matchCase); try { - setState(780); + setState(802); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(777); + setState(799); match(CASE); - setState(778); + setState(800); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(779); + setState(801); match(DEFAULT); } break; @@ -3587,6 +3652,7 @@ public final MatchCaseContext matchCase() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternContext extends ParserRuleContext { public MatchPatternContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -3598,6 +3664,7 @@ public void copyFrom(MatchPatternContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternValueContext extends MatchPatternContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -3609,6 +3676,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternCompositeContext extends MatchPatternContext { public LiteralTypeContext literalType() { return getRuleContext(LiteralTypeContext.class,0); @@ -3626,6 +3694,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternBindContext extends MatchPatternContext { public TerminalNode QMARK() { return getToken(GobraParser.QMARK, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -3642,16 +3711,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 106, RULE_matchPattern); int _la; try { - setState(795); + setState(817); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(782); + setState(804); match(QMARK); - setState(783); + setState(805); match(IDENTIFIER); } break; @@ -3659,23 +3728,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(784); + setState(806); literalType(); - setState(785); + setState(807); match(L_CURLY); - setState(790); + setState(812); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << QMARK) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(786); + setState(808); matchPatternList(); - setState(788); + setState(810); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(787); + setState(809); match(COMMA); } } @@ -3683,7 +3752,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(792); + setState(814); match(R_CURLY); } break; @@ -3691,7 +3760,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(794); + setState(816); expression(0); } break; @@ -3708,6 +3777,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MatchPatternListContext extends ParserRuleContext { public List matchPattern() { return getRuleContexts(MatchPatternContext.class); @@ -3737,23 +3807,23 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(797); + setState(819); matchPattern(); - setState(802); + setState(824); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(798); + setState(820); match(COMMA); - setState(799); + setState(821); matchPattern(); } } } - setState(804); + setState(826); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -3770,6 +3840,7 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BlockWithBodyParameterInfoContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -3797,36 +3868,37 @@ public T accept(ParseTreeVisitor visitor) { public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() throws RecognitionException { BlockWithBodyParameterInfoContext _localctx = new BlockWithBodyParameterInfoContext(_ctx, getState()); enterRule(_localctx, 110, RULE_blockWithBodyParameterInfo); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(805); + setState(827); match(L_CURLY); - setState(810); + setState(832); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==SHARE) { { - setState(806); + setState(828); match(SHARE); - setState(807); + setState(829); identifierList(); - setState(808); + setState(830); eos(); } - break; } - setState(813); + + setState(835); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(812); + setState(834); statementList(); } - break; } - setState(815); + + setState(837); match(R_CURLY); } } @@ -3841,6 +3913,7 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecInstanceContext extends ParserRuleContext { public QualifiedIdentContext qualifiedIdent() { return getRuleContext(QualifiedIdentContext.class,0); @@ -3870,42 +3943,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(819); + setState(841); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(817); + setState(839); qualifiedIdent(); } break; case 2: { - setState(818); + setState(840); match(IDENTIFIER); } break; } - setState(829); + setState(851); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(821); + setState(843); match(L_CURLY); - setState(826); + setState(848); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(822); + setState(844); closureSpecParams(); - setState(824); + setState(846); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(823); + setState(845); match(COMMA); } } @@ -3913,7 +3986,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(828); + setState(850); match(R_CURLY); } break; @@ -3931,6 +4004,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecParamsContext extends ParserRuleContext { public List closureSpecParam() { return getRuleContexts(ClosureSpecParamContext.class); @@ -3960,23 +4034,23 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(831); + setState(853); closureSpecParam(); - setState(836); + setState(858); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(832); + setState(854); match(COMMA); - setState(833); + setState(855); closureSpecParam(); } } } - setState(838); + setState(860); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } @@ -3993,6 +4067,7 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureSpecParamContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -4016,19 +4091,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(841); + setState(863); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(839); + setState(861); match(IDENTIFIER); - setState(840); + setState(862); match(COLON); } break; } - setState(843); + setState(865); expression(0); } } @@ -4043,6 +4118,7 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureImplProofStmtContext extends ParserRuleContext { public TerminalNode PROOF() { return getToken(GobraParser.PROOF, 0); } public ExpressionContext expression() { @@ -4072,15 +4148,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(845); + setState(867); match(PROOF); - setState(846); + setState(868); expression(0); - setState(847); + setState(869); match(IMPL); - setState(848); + setState(870); closureSpecInstance(); - setState(849); + setState(871); block(); } } @@ -4095,6 +4171,7 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplementationProofContext extends ParserRuleContext { public List type_() { return getRuleContexts(Type_Context.class); @@ -4141,52 +4218,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(851); + setState(873); type_(); - setState(852); + setState(874); match(IMPL); - setState(853); + setState(875); type_(); - setState(872); + setState(894); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(854); + setState(876); match(L_CURLY); - setState(860); + setState(882); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(855); + setState(877); implementationProofPredicateAlias(); - setState(856); + setState(878); eos(); } } - setState(862); + setState(884); _errHandler.sync(this); _la = _input.LA(1); } - setState(868); + setState(890); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(863); + setState(885); methodImplementationProof(); - setState(864); + setState(886); eos(); } } - setState(870); + setState(892); _errHandler.sync(this); _la = _input.LA(1); } - setState(871); + setState(893); match(R_CURLY); } break; @@ -4204,6 +4281,7 @@ public final ImplementationProofContext implementationProof() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodImplementationProofContext extends ParserRuleContext { public NonLocalReceiverContext nonLocalReceiver() { return getRuleContext(NonLocalReceiverContext.class,0); @@ -4234,28 +4312,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(875); + setState(897); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(874); + setState(896); match(PURE); } } - setState(877); + setState(899); nonLocalReceiver(); - setState(878); + setState(900); match(IDENTIFIER); - setState(879); + setState(901); signature(); - setState(881); + setState(903); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(880); + setState(902); block(); } break; @@ -4273,6 +4351,7 @@ public final MethodImplementationProofContext methodImplementationProof() throws return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class NonLocalReceiverContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TypeNameContext typeName() { @@ -4299,31 +4378,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(883); + setState(905); match(L_PAREN); - setState(885); + setState(907); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(884); + setState(906); match(IDENTIFIER); } break; } - setState(888); + setState(910); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(887); + setState(909); match(STAR); } } - setState(890); + setState(912); typeName(); - setState(891); + setState(913); match(R_PAREN); } } @@ -4338,6 +4417,7 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SelectionContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -4362,24 +4442,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 126, RULE_selection); try { - setState(898); + setState(920); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(893); + setState(915); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(894); + setState(916); type_(); - setState(895); + setState(917); match(DOT); - setState(896); + setState(918); match(IDENTIFIER); } break; @@ -4396,6 +4476,7 @@ public final SelectionContext selection() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplementationProofPredicateAliasContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -4423,24 +4504,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(900); + setState(922); match(PRED); - setState(901); + setState(923); match(IDENTIFIER); - setState(902); + setState(924); match(DECLARE_ASSIGN); - setState(905); + setState(927); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(903); + setState(925); selection(); } break; case 2: { - setState(904); + setState(926); operandName(); } break; @@ -4458,6 +4539,7 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MakeContext extends ParserRuleContext { public TerminalNode MAKE() { return getToken(GobraParser.MAKE, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -4487,25 +4569,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(907); + setState(929); match(MAKE); - setState(908); + setState(930); match(L_PAREN); - setState(909); + setState(931); type_(); - setState(912); + setState(934); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(910); + setState(932); match(COMMA); - setState(911); + setState(933); expressionList(); } } - setState(914); + setState(936); match(R_PAREN); } } @@ -4520,6 +4602,7 @@ public final MakeContext make() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class New_Context extends ParserRuleContext { public TerminalNode NEW() { return getToken(GobraParser.NEW, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -4544,13 +4627,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(916); + setState(938); match(NEW); - setState(917); + setState(939); match(L_PAREN); - setState(918); + setState(940); type_(); - setState(919); + setState(941); match(R_PAREN); } } @@ -4565,6 +4648,7 @@ public final New_Context new_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecMemberContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -4593,20 +4677,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(921); + setState(943); ((SpecMemberContext)_localctx).specification = specification(); - setState(924); + setState(946); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(922); + setState(944); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(923); + setState(945); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4624,6 +4708,7 @@ public final SpecMemberContext specMember() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -4632,6 +4717,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); } @@ -4652,22 +4740,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, 136, RULE_functionDecl); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(926); + setState(948); match(FUNC); - setState(927); + setState(949); match(IDENTIFIER); + setState(951); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==L_BRACKET) { + { + setState(950); + typeParameters(); + } + } + { - setState(928); + setState(953); signature(); - setState(930); + setState(955); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(929); + setState(954); blockWithBodyParameterInfo(); } break; @@ -4686,6 +4785,7 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -4720,21 +4820,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R try { enterOuterAlt(_localctx, 1); { - setState(932); + setState(957); match(FUNC); - setState(933); + setState(958); receiver(); - setState(934); + setState(959); match(IDENTIFIER); { - setState(935); + setState(960); signature(); - setState(937); + setState(962); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(936); + setState(961); blockWithBodyParameterInfo(); } break; @@ -4753,6 +4853,7 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExplicitGhostMemberContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public SpecMemberContext specMember() { @@ -4778,9 +4879,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(939); + setState(964); match(GHOST); - setState(942); + setState(967); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4791,7 +4892,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(940); + setState(965); specMember(); } break; @@ -4799,7 +4900,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(941); + setState(966); declaration(); } break; @@ -4819,6 +4920,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FpredicateDeclContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -4845,18 +4947,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(944); + setState(969); match(PRED); - setState(945); + setState(970); match(IDENTIFIER); - setState(946); + setState(971); parameters(); - setState(948); + setState(973); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(947); + setState(972); predicateBody(); } break; @@ -4874,6 +4976,7 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredicateBodyContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public ExpressionContext expression() { @@ -4900,13 +5003,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(950); + setState(975); match(L_CURLY); - setState(951); + setState(976); expression(0); - setState(952); + setState(977); eos(); - setState(953); + setState(978); match(R_CURLY); } } @@ -4921,6 +5024,7 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MpredicateDeclContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public ReceiverContext receiver() { @@ -4950,20 +5054,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(955); + setState(980); match(PRED); - setState(956); + setState(981); receiver(); - setState(957); + setState(982); match(IDENTIFIER); - setState(958); + setState(983); parameters(); - setState(960); + setState(985); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(959); + setState(984); predicateBody(); } break; @@ -4981,6 +5085,7 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class VarSpecContext extends ParserRuleContext { public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { return getRuleContext(MaybeAddressableIdentifierListContext.class,0); @@ -5009,9 +5114,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(962); + setState(987); maybeAddressableIdentifierList(); - setState(970); + setState(995); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5034,16 +5139,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(963); + setState(988); type_(); - setState(966); + setState(991); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(964); + setState(989); match(ASSIGN); - setState(965); + setState(990); expressionList(); } break; @@ -5052,9 +5157,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(968); + setState(993); match(ASSIGN); - setState(969); + setState(994); expressionList(); } break; @@ -5074,6 +5179,7 @@ public final VarSpecContext varSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ShortVarDeclContext extends ParserRuleContext { public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { return getRuleContext(MaybeAddressableIdentifierListContext.class,0); @@ -5099,11 +5205,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(972); + setState(997); maybeAddressableIdentifierList(); - setState(973); + setState(998); match(DECLARE_ASSIGN); - setState(974); + setState(999); expressionList(); } } @@ -5118,6 +5224,7 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReceiverContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public Type_Context type_() { @@ -5146,31 +5253,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(976); + setState(1001); match(L_PAREN); - setState(978); + setState(1003); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(977); + setState(1002); maybeAddressableIdentifier(); } break; } - setState(980); + setState(1005); type_(); - setState(982); + setState(1007); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(981); + setState(1006); match(COMMA); } } - setState(984); + setState(1009); match(R_PAREN); } } @@ -5185,6 +5292,7 @@ public final ReceiverContext receiver() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParameterDeclContext extends ParserRuleContext { public ActualParameterDeclContext actualParameterDecl() { return getRuleContext(ActualParameterDeclContext.class,0); @@ -5207,20 +5315,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 154, RULE_parameterDecl); try { - setState(988); + setState(1013); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(986); + setState(1011); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(987); + setState(1012); ghostParameterDecl(); } break; @@ -5237,6 +5345,7 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ActualParameterDeclContext extends ParserRuleContext { public ParameterTypeContext parameterType() { return getRuleContext(ParameterTypeContext.class,0); @@ -5261,17 +5370,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(991); + setState(1016); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(990); + setState(1015); identifierList(); } break; } - setState(993); + setState(1018); parameterType(); } } @@ -5286,6 +5395,7 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GhostParameterDeclContext extends ParserRuleContext { public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public ParameterTypeContext parameterType() { @@ -5311,19 +5421,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(995); + setState(1020); match(GHOST); - setState(997); + setState(1022); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(996); + setState(1021); identifierList(); } break; } - setState(999); + setState(1024); parameterType(); } } @@ -5338,6 +5448,7 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParameterTypeContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -5361,17 +5472,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1002); + setState(1027); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1001); + setState(1026); match(ELLIPSIS); } } - setState(1004); + setState(1029); type_(); } } @@ -5386,6 +5497,7 @@ public final ParameterTypeContext parameterType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionContext extends ParserRuleContext { public ExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -5397,6 +5509,7 @@ public void copyFrom(ExpressionContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class ClosureImplSpecExprContext extends ExpressionContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -5412,6 +5525,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class PrimaryExpr_Context extends ExpressionContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -5423,6 +5537,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class QuantificationContext extends ExpressionContext { public BoundVariablesContext boundVariables() { return getRuleContext(BoundVariablesContext.class,0); @@ -5446,6 +5561,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class UnfoldingContext extends ExpressionContext { public TerminalNode UNFOLDING() { return getToken(GobraParser.UNFOLDING, 0); } public PredicateAccessContext predicateAccess() { @@ -5462,6 +5578,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class OrExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5477,6 +5594,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class P41ExprContext extends ExpressionContext { public Token p41_op; public List expression() { @@ -5495,6 +5613,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class UnaryExprContext extends ExpressionContext { public Token unary_op; public ExpressionContext expression() { @@ -5514,6 +5633,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class P42ExprContext extends ExpressionContext { public Token p42_op; public List expression() { @@ -5532,6 +5652,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class TernaryExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5548,6 +5669,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class AddExprContext extends ExpressionContext { public Token add_op; public List expression() { @@ -5569,6 +5691,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ImplicationContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5584,6 +5707,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MulExprContext extends ExpressionContext { public Token mul_op; public List expression() { @@ -5606,6 +5730,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class LetContext extends ExpressionContext { public TerminalNode LET() { return getToken(GobraParser.LET, 0); } public ShortVarDeclContext shortVarDecl() { @@ -5622,6 +5747,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class RelExprContext extends ExpressionContext { public Token rel_op; public List expression() { @@ -5645,6 +5771,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class AndExprContext extends ExpressionContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -5677,19 +5804,19 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1027); + setState(1052); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { _localctx = new UnaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1007); + setState(1032); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)))) != 0)) ) { + if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5697,7 +5824,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1008); + setState(1033); expression(15); } break; @@ -5706,7 +5833,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1009); + setState(1034); primaryExpr(0); } break; @@ -5715,13 +5842,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1010); + setState(1035); match(UNFOLDING); - setState(1011); + setState(1036); predicateAccess(); - setState(1012); + setState(1037); match(IN); - setState(1013); + setState(1038); expression(3); } break; @@ -5730,13 +5857,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1015); + setState(1040); match(LET); - setState(1016); + setState(1041); shortVarDecl(); - setState(1017); + setState(1042); match(IN); - setState(1018); + setState(1043); expression(2); } break; @@ -5745,7 +5872,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1020); + setState(1045); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5755,41 +5882,41 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1021); + setState(1046); boundVariables(); - setState(1022); + setState(1047); match(COLON); - setState(1023); + setState(1048); match(COLON); - setState(1024); + setState(1049); triggers(); - setState(1025); + setState(1050); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1064); + setState(1089); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,79,_ctx); + _alt = getInterpreter().adaptivePredict(_input,80,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1062); + setState(1087); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1029); + setState(1054); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1030); + setState(1055); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & ((1L << (DIV - 126)) | (1L << (MOD - 126)) | (1L << (LSHIFT - 126)) | (1L << (RSHIFT - 126)) | (1L << (BIT_CLEAR - 126)) | (1L << (STAR - 126)) | (1L << (AMPERSAND - 126)))) != 0)) ) { + if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5797,7 +5924,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1031); + setState(1056); expression(14); } break; @@ -5805,12 +5932,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1032); + setState(1057); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1033); + setState(1058); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & ((1L << (PLUS_PLUS - 113)) | (1L << (OR - 113)) | (1L << (PLUS - 113)) | (1L << (MINUS - 113)) | (1L << (CARET - 113)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -5818,7 +5945,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1034); + setState(1059); expression(13); } break; @@ -5826,12 +5953,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1035); + setState(1060); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1036); + setState(1061); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << UNION) | (1L << INTERSECTION) | (1L << SETMINUS))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { ((P42ExprContext)_localctx).p42_op = (Token)_errHandler.recoverInline(this); } else { @@ -5839,7 +5966,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1037); + setState(1062); expression(12); } break; @@ -5847,12 +5974,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1038); + setState(1063); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1039); + setState(1064); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << IN) | (1L << MULTI) | (1L << SUBSET))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { ((P41ExprContext)_localctx).p41_op = (Token)_errHandler.recoverInline(this); } else { @@ -5860,7 +5987,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1040); + setState(1065); expression(11); } break; @@ -5868,12 +5995,12 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1041); + setState(1066); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1042); + setState(1067); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (GHOST_EQUALS - 72)) | (1L << (GHOST_NOT_EQUALS - 72)) | (1L << (EQUALS - 72)) | (1L << (NOT_EQUALS - 72)) | (1L << (LESS - 72)) | (1L << (LESS_OR_EQUALS - 72)) | (1L << (GREATER - 72)) | (1L << (GREATER_OR_EQUALS - 72)))) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { ((RelExprContext)_localctx).rel_op = (Token)_errHandler.recoverInline(this); } else { @@ -5881,7 +6008,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1043); + setState(1068); expression(10); } break; @@ -5889,11 +6016,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1044); + setState(1069); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1045); + setState(1070); match(LOGICAL_AND); - setState(1046); + setState(1071); expression(8); } break; @@ -5901,11 +6028,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1047); + setState(1072); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1048); + setState(1073); match(LOGICAL_OR); - setState(1049); + setState(1074); expression(7); } break; @@ -5913,11 +6040,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1050); + setState(1075); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1051); + setState(1076); match(IMPLIES); - setState(1052); + setState(1077); expression(5); } break; @@ -5925,15 +6052,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1053); + setState(1078); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1054); + setState(1079); match(QMARK); - setState(1055); + setState(1080); expression(0); - setState(1056); + setState(1081); match(COLON); - setState(1057); + setState(1082); expression(4); } break; @@ -5941,20 +6068,20 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1059); + setState(1084); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1060); + setState(1085); match(IMPL); - setState(1061); + setState(1086); closureSpecInstance(); } break; } } } - setState(1066); + setState(1091); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,79,_ctx); + _alt = getInterpreter().adaptivePredict(_input,80,_ctx); } } } @@ -5969,6 +6096,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementContext extends ParserRuleContext { public GhostStatementContext ghostStatement() { return getRuleContext(GhostStatementContext.class,0); @@ -6045,146 +6173,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 164, RULE_statement); try { - setState(1087); + setState(1112); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,80,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1067); + setState(1092); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1068); + setState(1093); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1069); + setState(1094); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1070); + setState(1095); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1071); + setState(1096); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1072); + setState(1097); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1073); + setState(1098); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1074); + setState(1099); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1075); + setState(1100); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1076); + setState(1101); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1077); + setState(1102); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1078); + setState(1103); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1079); + setState(1104); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1080); + setState(1105); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1081); + setState(1106); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1082); + setState(1107); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1083); + setState(1108); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1084); + setState(1109); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1085); + setState(1110); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1086); + setState(1111); closureImplProofStmt(); } break; @@ -6201,6 +6329,7 @@ public final StatementContext statement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ApplyStmtContext extends ParserRuleContext { public TerminalNode APPLY() { return getToken(GobraParser.APPLY, 0); } public ExpressionContext expression() { @@ -6223,9 +6352,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1089); + setState(1114); match(APPLY); - setState(1090); + setState(1115); expression(0); } } @@ -6240,6 +6369,7 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PackageStmtContext extends ParserRuleContext { public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } public ExpressionContext expression() { @@ -6262,23 +6392,24 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); enterRule(_localctx, 168, RULE_packageStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1117); match(PACKAGE); - setState(1093); + setState(1118); expression(0); - setState(1095); + setState(1120); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==L_CURLY) { { - setState(1094); + setState(1119); block(); } - break; } + } } catch (RecognitionException re) { @@ -6292,6 +6423,7 @@ public final PackageStmtContext packageStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SpecForStmtContext extends ParserRuleContext { public LoopSpecContext loopSpec() { return getRuleContext(LoopSpecContext.class,0); @@ -6316,9 +6448,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1097); + setState(1122); loopSpec(); - setState(1098); + setState(1123); forStmt(); } } @@ -6333,6 +6465,7 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LoopSpecContext extends ParserRuleContext { public List INV() { return getTokens(GobraParser.INV); } public TerminalNode INV(int i) { @@ -6372,34 +6505,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1106); + setState(1131); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1100); + setState(1125); match(INV); - setState(1101); + setState(1126); expression(0); - setState(1102); + setState(1127); eos(); } } - setState(1108); + setState(1133); _errHandler.sync(this); _la = _input.LA(1); } - setState(1113); + setState(1138); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1109); + setState(1134); match(DEC); - setState(1110); + setState(1135); terminationMeasure(); - setState(1111); + setState(1136); eos(); } } @@ -6417,6 +6550,7 @@ public final LoopSpecContext loopSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DeferStmtContext extends ParserRuleContext { public Token fold_stmt; public TerminalNode DEFER() { return getToken(GobraParser.DEFER, 0); } @@ -6444,24 +6578,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 174, RULE_deferStmt); int _la; try { - setState(1120); + setState(1145); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1115); + setState(1140); match(DEFER); - setState(1116); + setState(1141); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1117); + setState(1142); match(DEFER); - setState(1118); + setState(1143); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6472,7 +6606,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1119); + setState(1144); predicateAccess(); } break; @@ -6489,6 +6623,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BasicLitContext extends ParserRuleContext { public TerminalNode TRUE() { return getToken(GobraParser.TRUE, 0); } public TerminalNode FALSE() { return getToken(GobraParser.FALSE, 0); } @@ -6517,62 +6652,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 176, RULE_basicLit); try { - setState(1130); + setState(1155); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1122); + setState(1147); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1123); + setState(1148); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1124); + setState(1149); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1125); + setState(1150); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1126); + setState(1151); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1127); + setState(1152); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1128); + setState(1153); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1129); + setState(1154); match(RUNE_LIT); } break; @@ -6589,6 +6724,7 @@ public final BasicLitContext basicLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PrimaryExprContext extends ParserRuleContext { public PrimaryExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -6600,6 +6736,7 @@ public void copyFrom(PrimaryExprContext ctx) { super.copyFrom(ctx); } } + @SuppressWarnings("CheckReturnValue") public static class NewExprContext extends PrimaryExprContext { public New_Context new_() { return getRuleContext(New_Context.class,0); @@ -6611,6 +6748,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MakeExprContext extends PrimaryExprContext { public MakeContext make() { return getRuleContext(MakeContext.class,0); @@ -6622,6 +6760,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class GhostPrimaryExpr_Context extends PrimaryExprContext { public GhostPrimaryExprContext ghostPrimaryExpr() { return getRuleContext(GhostPrimaryExprContext.class,0); @@ -6633,6 +6772,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class InvokePrimaryExprWithSpecContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6651,6 +6791,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class IndexPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6665,6 +6806,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SeqUpdPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6679,6 +6821,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class MethodPrimaryExprContext extends PrimaryExprContext { public MethodExprContext methodExpr() { return getRuleContext(MethodExprContext.class,0); @@ -6690,6 +6833,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class PredConstrPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6704,6 +6848,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class InvokePrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6718,6 +6863,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class OperandPrimaryExprContext extends PrimaryExprContext { public OperandContext operand() { return getRuleContext(OperandContext.class,0); @@ -6729,6 +6875,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class TypeAssertionPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6743,6 +6890,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class BuiltInCallExprContext extends PrimaryExprContext { public Token call_op; public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -6761,6 +6909,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SelectorPrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6774,6 +6923,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class ConversionPrimaryExprContext extends PrimaryExprContext { public ConversionContext conversion() { return getRuleContext(ConversionContext.class,0); @@ -6785,6 +6935,7 @@ public T accept(ParseTreeVisitor visitor) { else return visitor.visitChildren(this); } } + @SuppressWarnings("CheckReturnValue") public static class SlicePrimaryExprContext extends PrimaryExprContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -6816,16 +6967,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1144); + setState(1169); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: { _localctx = new OperandPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1133); + setState(1158); operand(); } break; @@ -6834,7 +6985,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1134); + setState(1159); conversion(); } break; @@ -6843,7 +6994,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1135); + setState(1160); methodExpr(); } break; @@ -6852,7 +7003,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1136); + setState(1161); ghostPrimaryExpr(); } break; @@ -6861,7 +7012,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1137); + setState(1162); new_(); } break; @@ -6870,7 +7021,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1138); + setState(1163); make(); } break; @@ -6879,10 +7030,10 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1139); + setState(1164); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & ((1L << (LEN - 45)) | (1L << (CAP - 45)) | (1L << (DOM - 45)) | (1L << (RANGE - 45)))) != 0)) ) { + if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { ((BuiltInCallExprContext)_localctx).call_op = (Token)_errHandler.recoverInline(this); } else { @@ -6890,36 +7041,36 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1140); + setState(1165); match(L_PAREN); - setState(1141); + setState(1166); expression(0); - setState(1142); + setState(1167); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1168); + setState(1193); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,89,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1166); + setState(1191); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1146); + setState(1171); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1147); + setState(1172); match(DOT); - setState(1148); + setState(1173); match(IDENTIFIER); } break; @@ -6927,9 +7078,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1149); + setState(1174); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1150); + setState(1175); index(); } break; @@ -6937,9 +7088,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1151); + setState(1176); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1152); + setState(1177); slice_(); } break; @@ -6947,9 +7098,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1153); + setState(1178); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1154); + setState(1179); seqUpdExp(); } break; @@ -6957,9 +7108,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1155); + setState(1180); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1156); + setState(1181); typeAssertion(); } break; @@ -6967,9 +7118,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1157); + setState(1182); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1158); + setState(1183); arguments(); } break; @@ -6977,13 +7128,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1159); + setState(1184); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1160); + setState(1185); arguments(); - setState(1161); + setState(1186); match(AS); - setState(1162); + setState(1187); closureSpecInstance(); } break; @@ -6991,18 +7142,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1164); + setState(1189); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1165); + setState(1190); predConstructArgs(); } break; } } } - setState(1170); + setState(1195); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,88,_ctx); + _alt = getInterpreter().adaptivePredict(_input,89,_ctx); } } } @@ -7017,6 +7168,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionLitContext extends ParserRuleContext { public SpecificationContext specification; public SpecificationContext specification() { @@ -7042,9 +7194,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1171); + setState(1196); ((FunctionLitContext)_localctx).specification = specification(); - setState(1172); + setState(1197); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7059,6 +7211,7 @@ public final FunctionLitContext functionLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ClosureDeclContext extends ParserRuleContext { public boolean trusted; public boolean pure; @@ -7091,27 +7244,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1174); + setState(1199); match(FUNC); - setState(1176); + setState(1201); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1175); + setState(1200); match(IDENTIFIER); } } { - setState(1178); + setState(1203); signature(); - setState(1180); + setState(1205); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: { - setState(1179); + setState(1204); blockWithBodyParameterInfo(); } break; @@ -7130,6 +7283,7 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredConstructArgsContext extends ParserRuleContext { public TerminalNode L_PRED() { return getToken(GobraParser.L_PRED, 0); } public TerminalNode R_PRED() { return getToken(GobraParser.R_PRED, 0); } @@ -7155,29 +7309,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1182); + setState(1207); match(L_PRED); - setState(1184); + setState(1209); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1183); + setState(1208); expressionList(); } } - setState(1187); + setState(1212); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1186); + setState(1211); match(COMMA); } } - setState(1189); + setState(1214); match(R_PRED); } } @@ -7192,34 +7346,23 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce return _localctx; } + @SuppressWarnings("CheckReturnValue") 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); } @@ -7238,47 +7381,27 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1191); + setState(1216); match(INTERFACE); - setState(1192); + setState(1217); match(L_CURLY); - setState(1202); + setState(1223); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << GHOST) | (1L << PRED))) != 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(1196); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { - case 1: - { - setState(1193); - methodSpec(); - } - break; - case 2: - { - setState(1194); - typeName(); - } - break; - case 3: - { - setState(1195); - predicateSpec(); - } - break; - } - setState(1198); + setState(1218); + interfaceElem(); + setState(1219); eos(); } } - setState(1204); + setState(1225); _errHandler.sync(this); _la = _input.LA(1); } - setState(1205); + setState(1226); match(R_CURLY); } } @@ -7293,35 +7416,56 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { return _localctx; } - public static class PredicateSpecContext extends ParserRuleContext { - public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } - public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } - public ParametersContext parameters() { - return getRuleContext(ParametersContext.class,0); + @SuppressWarnings("CheckReturnValue") + public static class InterfaceElemContext extends ParserRuleContext { + public MethodSpecContext methodSpec() { + return getRuleContext(MethodSpecContext.class,0); } - public PredicateSpecContext(ParserRuleContext parent, int invokingState) { + 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_predicateSpec; } + @Override public int getRuleIndex() { return RULE_interfaceElem; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitPredicateSpec(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitInterfaceElem(this); else return visitor.visitChildren(this); } } - public final PredicateSpecContext predicateSpec() throws RecognitionException { - PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_predicateSpec); + public final InterfaceElemContext interfaceElem() throws RecognitionException { + InterfaceElemContext _localctx = new InterfaceElemContext(_ctx, getState()); + enterRule(_localctx, 188, RULE_interfaceElem); try { - enterOuterAlt(_localctx, 1); - { - setState(1207); - match(PRED); - setState(1208); - match(IDENTIFIER); - setState(1209); - parameters(); + setState(1231); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1228); + methodSpec(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1229); + typeElem(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1230); + predicateSpec(); + } + break; } } catch (RecognitionException re) { @@ -7335,16 +7479,60 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { return _localctx; } - public static class MethodSpecContext extends ParserRuleContext { - public SpecificationContext specification() { - return getRuleContext(SpecificationContext.class,0); - } + @SuppressWarnings("CheckReturnValue") + public static class PredicateSpecContext extends ParserRuleContext { + public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public ParametersContext parameters() { return getRuleContext(ParametersContext.class,0); } - public ResultContext result() { - return getRuleContext(ResultContext.class,0); + public PredicateSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predicateSpec; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitPredicateSpec(this); + else return visitor.visitChildren(this); + } + } + + public final PredicateSpecContext predicateSpec() throws RecognitionException { + PredicateSpecContext _localctx = new PredicateSpecContext(_ctx, getState()); + enterRule(_localctx, 190, RULE_predicateSpec); + try { + enterOuterAlt(_localctx, 1); + { + setState(1233); + match(PRED); + setState(1234); + match(IDENTIFIER); + setState(1235); + parameters(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MethodSpecContext extends ParserRuleContext { + public SpecificationContext specification() { + return getRuleContext(SpecificationContext.class,0); + } + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public ParametersContext parameters() { + return getRuleContext(ParametersContext.class,0); + } + public ResultContext result() { + return getRuleContext(ResultContext.class,0); } public TerminalNode GHOST() { return getToken(GobraParser.GHOST, 0); } public MethodSpecContext(ParserRuleContext parent, int invokingState) { @@ -7360,53 +7548,53 @@ public T accept(ParseTreeVisitor visitor) { public final MethodSpecContext methodSpec() throws RecognitionException { MethodSpecContext _localctx = new MethodSpecContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_methodSpec); + enterRule(_localctx, 192, RULE_methodSpec); int _la; try { - setState(1226); + setState(1252); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1212); + setState(1238); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1211); + setState(1237); match(GHOST); } } - setState(1214); + setState(1240); specification(); - setState(1215); + setState(1241); match(IDENTIFIER); - setState(1216); + setState(1242); parameters(); - setState(1217); + setState(1243); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1220); + setState(1246); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1219); + setState(1245); match(GHOST); } } - setState(1222); + setState(1248); specification(); - setState(1223); + setState(1249); match(IDENTIFIER); - setState(1224); + setState(1250); parameters(); } break; @@ -7423,10 +7611,14 @@ public final MethodSpecContext methodSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Type_Context extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } + public TypeArgsContext typeArgs() { + return getRuleContext(TypeArgsContext.class,0); + } public TypeLitContext typeLit() { return getRuleContext(TypeLitContext.class,0); } @@ -7451,16 +7643,26 @@ public T accept(ParseTreeVisitor visitor) { public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); - enterRule(_localctx, 192, RULE_type_); + enterRule(_localctx, 194, RULE_type_); try { - setState(1235); + setState(1264); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1228); + setState(1254); typeName(); + setState(1256); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + case 1: + { + setState(1255); + typeArgs(); + } + break; + } } break; case PRED: @@ -7474,7 +7676,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1229); + setState(1258); typeLit(); } break; @@ -7488,18 +7690,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1230); + setState(1259); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1231); + setState(1260); match(L_PAREN); - setState(1232); + setState(1261); type_(); - setState(1233); + setState(1262); match(R_PAREN); } break; @@ -7518,6 +7720,7 @@ public final Type_Context type_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeLitContext extends ParserRuleContext { public ArrayTypeContext arrayType() { return getRuleContext(ArrayTypeContext.class,0); @@ -7559,71 +7762,71 @@ public T accept(ParseTreeVisitor visitor) { public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_typeLit); + enterRule(_localctx, 196, RULE_typeLit); try { - setState(1246); + setState(1275); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1237); + setState(1266); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1238); + setState(1267); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1239); + setState(1268); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1240); + setState(1269); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1241); + setState(1270); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1242); + setState(1271); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1243); + setState(1272); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1244); + setState(1273); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1245); + setState(1274); predType(); } break; @@ -7640,6 +7843,7 @@ public final TypeLitContext typeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredTypeContext extends ParserRuleContext { public TerminalNode PRED() { return getToken(GobraParser.PRED, 0); } public PredTypeParamsContext predTypeParams() { @@ -7658,13 +7862,13 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeContext predType() throws RecognitionException { PredTypeContext _localctx = new PredTypeContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_predType); + enterRule(_localctx, 198, RULE_predType); try { enterOuterAlt(_localctx, 1); { - setState(1248); + setState(1277); match(PRED); - setState(1249); + setState(1278); predTypeParams(); } } @@ -7679,6 +7883,7 @@ public final PredTypeContext predType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PredTypeParamsContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -7705,45 +7910,45 @@ public T accept(ParseTreeVisitor visitor) { public final PredTypeParamsContext predTypeParams() throws RecognitionException { PredTypeParamsContext _localctx = new PredTypeParamsContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_predTypeParams); + enterRule(_localctx, 200, RULE_predTypeParams); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1251); + setState(1280); match(L_PAREN); - setState(1263); + setState(1292); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1252); + setState(1281); type_(); - setState(1257); + setState(1286); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1253); + setState(1282); match(COMMA); - setState(1254); + setState(1283); type_(); } } } - setState(1259); + setState(1288); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,100,_ctx); + _alt = getInterpreter().adaptivePredict(_input,102,_ctx); } - setState(1261); + setState(1290); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1260); + setState(1289); match(COMMA); } } @@ -7751,7 +7956,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1265); + setState(1294); match(R_PAREN); } } @@ -7766,6 +7971,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralTypeContext extends ParserRuleContext { public StructTypeContext structType() { return getRuleContext(StructTypeContext.class,0); @@ -7788,6 +7994,9 @@ public GhostTypeLitContext ghostTypeLit() { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } + public TypeArgsContext typeArgs() { + return getRuleContext(TypeArgsContext.class,0); + } public LiteralTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -7801,58 +8010,69 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralTypeContext literalType() throws RecognitionException { LiteralTypeContext _localctx = new LiteralTypeContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_literalType); + enterRule(_localctx, 202, RULE_literalType); + int _la; try { - setState(1274); + setState(1306); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1267); + setState(1296); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1268); + setState(1297); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1269); + setState(1298); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1270); + setState(1299); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1271); + setState(1300); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1272); + setState(1301); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1273); + setState(1302); typeName(); + setState(1304); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==L_BRACKET) { + { + setState(1303); + typeArgs(); + } + } + } break; } @@ -7868,6 +8088,7 @@ public final LiteralTypeContext literalType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImplicitArrayContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode ELLIPSIS() { return getToken(GobraParser.ELLIPSIS, 0); } @@ -7888,17 +8109,17 @@ public T accept(ParseTreeVisitor visitor) { public final ImplicitArrayContext implicitArray() throws RecognitionException { ImplicitArrayContext _localctx = new ImplicitArrayContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_implicitArray); + enterRule(_localctx, 204, RULE_implicitArray); try { enterOuterAlt(_localctx, 1); { - setState(1276); + setState(1308); match(L_BRACKET); - setState(1277); + setState(1309); match(ELLIPSIS); - setState(1278); + setState(1310); match(R_BRACKET); - setState(1279); + setState(1311); elementType(); } } @@ -7913,6 +8134,7 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Slice_Context extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } @@ -7942,36 +8164,36 @@ public T accept(ParseTreeVisitor visitor) { public final Slice_Context slice_() throws RecognitionException { Slice_Context _localctx = new Slice_Context(_ctx, getState()); - enterRule(_localctx, 204, RULE_slice_); + enterRule(_localctx, 206, RULE_slice_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1281); + setState(1313); match(L_BRACKET); - setState(1297); + setState(1329); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: { - setState(1283); + setState(1315); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1282); + setState(1314); low(); } } - setState(1285); + setState(1317); match(COLON); - setState(1287); + setState(1319); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1286); + setState(1318); high(); } } @@ -7980,28 +8202,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1290); + setState(1322); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1289); + setState(1321); low(); } } - setState(1292); + setState(1324); match(COLON); - setState(1293); + setState(1325); high(); - setState(1294); + setState(1326); match(COLON); - setState(1295); + setState(1327); cap(); } break; } - setState(1299); + setState(1331); match(R_BRACKET); } } @@ -8016,6 +8238,7 @@ public final Slice_Context slice_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LowContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8033,11 +8256,11 @@ public T accept(ParseTreeVisitor visitor) { public final LowContext low() throws RecognitionException { LowContext _localctx = new LowContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_low); + enterRule(_localctx, 208, RULE_low); try { enterOuterAlt(_localctx, 1); { - setState(1301); + setState(1333); expression(0); } } @@ -8052,6 +8275,7 @@ public final LowContext low() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class HighContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8069,11 +8293,11 @@ public T accept(ParseTreeVisitor visitor) { public final HighContext high() throws RecognitionException { HighContext _localctx = new HighContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_high); + enterRule(_localctx, 210, RULE_high); try { enterOuterAlt(_localctx, 1); { - setState(1303); + setState(1335); expression(0); } } @@ -8088,6 +8312,7 @@ public final HighContext high() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CapContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -8105,11 +8330,11 @@ public T accept(ParseTreeVisitor visitor) { public final CapContext cap() throws RecognitionException { CapContext _localctx = new CapContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_cap); + enterRule(_localctx, 212, RULE_cap); try { enterOuterAlt(_localctx, 1); { - setState(1305); + setState(1337); expression(0); } } @@ -8124,6 +8349,7 @@ public final CapContext cap() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class Assign_opContext extends ParserRuleContext { public Token ass_op; public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } @@ -8151,20 +8377,20 @@ public T accept(ParseTreeVisitor visitor) { public final Assign_opContext assign_op() throws RecognitionException { Assign_opContext _localctx = new Assign_opContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_assign_op); + enterRule(_localctx, 214, RULE_assign_op); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1340); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) { + if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { { - setState(1307); + setState(1339); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (OR - 125)) | (1L << (DIV - 125)) | (1L << (MOD - 125)) | (1L << (LSHIFT - 125)) | (1L << (RSHIFT - 125)) | (1L << (BIT_CLEAR - 125)) | (1L << (PLUS - 125)) | (1L << (MINUS - 125)) | (1L << (CARET - 125)) | (1L << (STAR - 125)) | (1L << (AMPERSAND - 125)))) != 0)) ) { + if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -8175,7 +8401,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1310); + setState(1342); match(ASSIGN); } } @@ -8190,6 +8416,7 @@ public final Assign_opContext assign_op() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RangeClauseContext extends ParserRuleContext { public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } public ExpressionContext expression() { @@ -8218,48 +8445,48 @@ public T accept(ParseTreeVisitor visitor) { public final RangeClauseContext rangeClause() throws RecognitionException { RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_rangeClause); + enterRule(_localctx, 216, RULE_rangeClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1318); + setState(1350); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,109,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1312); + setState(1344); expressionList(); - setState(1313); + setState(1345); match(ASSIGN); } break; case 2: { - setState(1315); + setState(1347); maybeAddressableIdentifierList(); - setState(1316); + setState(1348); match(DECLARE_ASSIGN); } break; } - setState(1320); + setState(1352); match(RANGE); - setState(1321); + setState(1353); expression(0); - setState(1326); + setState(1358); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1322); + setState(1354); match(WITH); - setState(1324); + setState(1356); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1323); + setState(1355); match(IDENTIFIER); } } @@ -8280,6 +8507,7 @@ public final RangeClauseContext rangeClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class PackageClauseContext extends ParserRuleContext { public Token packageName; public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } @@ -8297,13 +8525,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_packageClause); + enterRule(_localctx, 218, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1328); + setState(1360); match(PACKAGE); - setState(1329); + setState(1361); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8318,6 +8546,7 @@ public final PackageClauseContext packageClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ImportPathContext extends ParserRuleContext { public String_Context string_() { return getRuleContext(String_Context.class,0); @@ -8335,11 +8564,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_importPath); + enterRule(_localctx, 220, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1331); + setState(1363); string_(); } } @@ -8354,6 +8583,7 @@ public final ImportPathContext importPath() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class DeclarationContext extends ParserRuleContext { public ConstDeclContext constDecl() { return getRuleContext(ConstDeclContext.class,0); @@ -8377,29 +8607,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_declaration); + enterRule(_localctx, 222, RULE_declaration); try { - setState(1336); + setState(1368); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1365); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1334); + setState(1366); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1335); + setState(1367); varDecl(); } break; @@ -8418,6 +8648,7 @@ public final DeclarationContext declaration() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ConstDeclContext extends ParserRuleContext { public TerminalNode CONST() { return getToken(GobraParser.CONST, 0); } public List constSpec() { @@ -8447,43 +8678,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_constDecl); + enterRule(_localctx, 224, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1370); match(CONST); - setState(1350); + setState(1382); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1339); + setState(1371); constSpec(); } break; case L_PAREN: { - setState(1340); + setState(1372); match(L_PAREN); - setState(1346); + setState(1378); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1341); + setState(1373); constSpec(); - setState(1342); + setState(1374); eos(); } } - setState(1348); + setState(1380); _errHandler.sync(this); _la = _input.LA(1); } - setState(1349); + setState(1381); match(R_PAREN); } break; @@ -8503,6 +8734,7 @@ public final ConstDeclContext constDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ConstSpecContext extends ParserRuleContext { public IdentifierListContext identifierList() { return getRuleContext(IdentifierListContext.class,0); @@ -8527,31 +8759,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_constSpec); + enterRule(_localctx, 226, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1352); + setState(1384); identifierList(); - setState(1358); + setState(1390); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1354); + setState(1386); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { - setState(1353); + setState(1385); type_(); } } - setState(1356); + setState(1388); match(ASSIGN); - setState(1357); + setState(1389); expressionList(); } break; @@ -8569,6 +8801,7 @@ public final ConstSpecContext constSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IdentifierListContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -8591,30 +8824,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_identifierList); + enterRule(_localctx, 228, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1392); match(IDENTIFIER); - setState(1365); + setState(1397); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,117,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1361); + setState(1393); match(COMMA); - setState(1362); + setState(1394); match(IDENTIFIER); } } } - setState(1367); + setState(1399); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,117,_ctx); + _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } } } @@ -8629,6 +8862,7 @@ public final IdentifierListContext identifierList() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionListContext extends ParserRuleContext { public List expression() { return getRuleContexts(ExpressionContext.class); @@ -8653,30 +8887,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_expressionList); + enterRule(_localctx, 230, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1368); + setState(1400); expression(0); - setState(1373); + setState(1405); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,118,_ctx); + _alt = getInterpreter().adaptivePredict(_input,121,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1369); + setState(1401); match(COMMA); - setState(1370); + setState(1402); expression(0); } } } - setState(1375); + setState(1407); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,118,_ctx); + _alt = getInterpreter().adaptivePredict(_input,121,_ctx); } } } @@ -8691,6 +8925,7 @@ public final ExpressionListContext expressionList() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeDeclContext extends ParserRuleContext { public TerminalNode TYPE() { return getToken(GobraParser.TYPE, 0); } public List typeSpec() { @@ -8720,43 +8955,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_typeDecl); + enterRule(_localctx, 232, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1376); + setState(1408); match(TYPE); - setState(1388); + setState(1420); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1377); + setState(1409); typeSpec(); } break; case L_PAREN: { - setState(1378); + setState(1410); match(L_PAREN); - setState(1384); + setState(1416); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1379); + setState(1411); typeSpec(); - setState(1380); + setState(1412); eos(); } } - setState(1386); + setState(1418); _errHandler.sync(this); _la = _input.LA(1); } - setState(1387); + setState(1419); match(R_PAREN); } break; @@ -8776,12 +9011,14 @@ public final TypeDeclContext typeDecl() throws RecognitionException { return _localctx; } + @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); } @@ -8795,24 +9032,120 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_typeSpec); - int _la; + enterRule(_localctx, 234, RULE_typeSpec); + try { + setState(1424); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1422); + aliasDecl(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1423); + 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, 236, RULE_aliasDecl); try { enterOuterAlt(_localctx, 1); { - setState(1390); + setState(1426); match(IDENTIFIER); - setState(1392); + setState(1427); + match(ASSIGN); + setState(1428); + 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, 238, RULE_typeDef); + try { + enterOuterAlt(_localctx, 1); + { + setState(1430); + match(IDENTIFIER); + setState(1432); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ASSIGN) { + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { + case 1: { - setState(1391); - match(ASSIGN); + setState(1431); + typeParameters(); } + break; } - - setState(1394); + setState(1434); type_(); } } @@ -8827,6 +9160,7 @@ public final TypeSpecContext typeSpec() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class VarDeclContext extends ParserRuleContext { public TerminalNode VAR() { return getToken(GobraParser.VAR, 0); } public List varSpec() { @@ -8856,43 +9190,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_varDecl); + enterRule(_localctx, 240, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1396); + setState(1436); match(VAR); - setState(1408); + setState(1448); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1397); + setState(1437); varSpec(); } break; case L_PAREN: { - setState(1398); + setState(1438); match(L_PAREN); - setState(1404); + setState(1444); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1399); + setState(1439); varSpec(); - setState(1400); + setState(1440); eos(); } } - setState(1406); + setState(1446); _errHandler.sync(this); _la = _input.LA(1); } - setState(1407); + setState(1447); match(R_PAREN); } break; @@ -8912,6 +9246,7 @@ public final VarDeclContext varDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BlockContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -8931,23 +9266,24 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_block); + enterRule(_localctx, 242, RULE_block); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1410); + setState(1450); match(L_CURLY); - setState(1412); + setState(1452); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1411); + setState(1451); statementList(); } - break; } - setState(1414); + + setState(1454); match(R_CURLY); } } @@ -8962,6 +9298,7 @@ public final BlockContext block() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StatementListContext extends ParserRuleContext { public List statement() { return getRuleContexts(StatementContext.class); @@ -8969,11 +9306,9 @@ public List statement() { public StatementContext statement(int i) { return getRuleContext(StatementContext.class,i); } - public List eos() { - return getRuleContexts(EosContext.class); - } - public EosContext eos(int i) { - return getRuleContext(EosContext.class,i); + public List EOS() { return getTokens(GobraParser.EOS); } + public TerminalNode EOS(int i) { + return getToken(GobraParser.EOS, i); } public StatementListContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -8988,43 +9323,27 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_statementList); + enterRule(_localctx, 244, RULE_statementList); + int _la; try { - int _alt; enterOuterAlt(_localctx, 1); { - setState(1422); + setState(1459); _errHandler.sync(this); - _alt = 1; + _la = _input.LA(1); do { - switch (_alt) { - case 1: - { - { - setState(1417); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { - case 1: - { - setState(1416); - eos(); - } - break; - } - setState(1419); - statement(); - setState(1420); - eos(); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(1424); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,126,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + { + { + setState(1456); + statement(); + setState(1457); + match(EOS); + } + } + setState(1461); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0) ); } } catch (RecognitionException re) { @@ -9038,6 +9357,7 @@ public final StatementListContext statementList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SimpleStmtContext extends ParserRuleContext { public SendStmtContext sendStmt() { return getRuleContext(SendStmtContext.class,0); @@ -9067,43 +9387,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_simpleStmt); + enterRule(_localctx, 246, RULE_simpleStmt); try { - setState(1431); + setState(1468); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1463); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1427); + setState(1464); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1428); + setState(1465); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1429); + setState(1466); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1430); + setState(1467); shortVarDecl(); } break; @@ -9120,6 +9440,7 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExpressionStmtContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -9137,11 +9458,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_expressionStmt); + enterRule(_localctx, 248, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1470); expression(0); } } @@ -9156,6 +9477,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SendStmtContext extends ParserRuleContext { public ExpressionContext channel; public TerminalNode RECEIVE() { return getToken(GobraParser.RECEIVE, 0); } @@ -9178,15 +9500,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_sendStmt); + enterRule(_localctx, 250, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1435); + setState(1472); ((SendStmtContext)_localctx).channel = expression(0); - setState(1436); + setState(1473); match(RECEIVE); - setState(1437); + setState(1474); expression(0); } } @@ -9201,6 +9523,7 @@ public final SendStmtContext sendStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IncDecStmtContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -9220,14 +9543,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_incDecStmt); + enterRule(_localctx, 252, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1439); + setState(1476); expression(0); - setState(1440); + setState(1477); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9250,6 +9573,7 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class AssignmentContext extends ParserRuleContext { public List expressionList() { return getRuleContexts(ExpressionListContext.class); @@ -9273,15 +9597,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_assignment); + enterRule(_localctx, 254, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1442); + setState(1479); expressionList(); - setState(1443); + setState(1480); assign_op(); - setState(1444); + setState(1481); expressionList(); } } @@ -9296,6 +9620,7 @@ public final AssignmentContext assignment() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EmptyStmtContext extends ParserRuleContext { public TerminalNode EOS() { return getToken(GobraParser.EOS, 0); } public TerminalNode SEMI() { return getToken(GobraParser.SEMI, 0); } @@ -9312,12 +9637,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_emptyStmt); + enterRule(_localctx, 256, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1446); + setState(1483); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9340,6 +9665,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LabeledStmtContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public TerminalNode COLON() { return getToken(GobraParser.COLON, 0); } @@ -9359,24 +9685,25 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_labeledStmt); + enterRule(_localctx, 258, RULE_labeledStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1448); + setState(1485); match(IDENTIFIER); - setState(1449); + setState(1486); match(COLON); - setState(1451); + setState(1488); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1450); + setState(1487); statement(); } - break; } + } } catch (RecognitionException re) { @@ -9390,6 +9717,7 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReturnStmtContext extends ParserRuleContext { public TerminalNode RETURN() { return getToken(GobraParser.RETURN, 0); } public ExpressionListContext expressionList() { @@ -9408,22 +9736,23 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_returnStmt); + enterRule(_localctx, 260, RULE_returnStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1453); + setState(1490); match(RETURN); - setState(1455); + setState(1492); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { - case 1: + _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(1454); + setState(1491); expressionList(); } - break; } + } } catch (RecognitionException re) { @@ -9437,6 +9766,7 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class BreakStmtContext extends ParserRuleContext { public TerminalNode BREAK() { return getToken(GobraParser.BREAK, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9453,22 +9783,23 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_breakStmt); + enterRule(_localctx, 262, RULE_breakStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1457); + setState(1494); match(BREAK); - setState(1459); + setState(1496); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==IDENTIFIER) { { - setState(1458); + setState(1495); match(IDENTIFIER); } - break; } + } } catch (RecognitionException re) { @@ -9482,6 +9813,7 @@ public final BreakStmtContext breakStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ContinueStmtContext extends ParserRuleContext { public TerminalNode CONTINUE() { return getToken(GobraParser.CONTINUE, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9498,22 +9830,23 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_continueStmt); + enterRule(_localctx, 264, RULE_continueStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1461); + setState(1498); match(CONTINUE); - setState(1463); + setState(1500); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==IDENTIFIER) { { - setState(1462); + setState(1499); match(IDENTIFIER); } - break; } + } } catch (RecognitionException re) { @@ -9527,6 +9860,7 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GotoStmtContext extends ParserRuleContext { public TerminalNode GOTO() { return getToken(GobraParser.GOTO, 0); } public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } @@ -9543,13 +9877,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_gotoStmt); + enterRule(_localctx, 266, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1465); + setState(1502); match(GOTO); - setState(1466); + setState(1503); match(IDENTIFIER); } } @@ -9564,6 +9898,7 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FallthroughStmtContext extends ParserRuleContext { public TerminalNode FALLTHROUGH() { return getToken(GobraParser.FALLTHROUGH, 0); } public FallthroughStmtContext(ParserRuleContext parent, int invokingState) { @@ -9579,11 +9914,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_fallthroughStmt); + enterRule(_localctx, 268, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1468); + setState(1505); match(FALLTHROUGH); } } @@ -9598,6 +9933,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IfStmtContext extends ParserRuleContext { public TerminalNode IF() { return getToken(GobraParser.IF, 0); } public List block() { @@ -9632,61 +9968,62 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_ifStmt); + enterRule(_localctx, 270, RULE_ifStmt); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1507); match(IF); - setState(1479); + setState(1516); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1471); + setState(1508); expression(0); } break; case 2: { - setState(1472); + setState(1509); eos(); - setState(1473); + setState(1510); expression(0); } break; case 3: { - setState(1475); + setState(1512); simpleStmt(); - setState(1476); + setState(1513); eos(); - setState(1477); + setState(1514); expression(0); } break; } - setState(1481); + setState(1518); block(); - setState(1487); + setState(1524); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { - case 1: + _la = _input.LA(1); + if (_la==ELSE) { { - setState(1482); + setState(1519); match(ELSE); - setState(1485); + setState(1522); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1483); + setState(1520); ifStmt(); } break; case L_CURLY: { - setState(1484); + setState(1521); block(); } break; @@ -9694,8 +10031,8 @@ public final IfStmtContext ifStmt() throws RecognitionException { throw new NoViableAltException(this); } } - break; } + } } catch (RecognitionException re) { @@ -9709,6 +10046,7 @@ public final IfStmtContext ifStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SwitchStmtContext extends ParserRuleContext { public ExprSwitchStmtContext exprSwitchStmt() { return getRuleContext(ExprSwitchStmtContext.class,0); @@ -9729,22 +10067,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_switchStmt); + enterRule(_localctx, 272, RULE_switchStmt); try { - setState(1491); + setState(1528); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1489); + setState(1526); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1490); + setState(1527); typeSwitchStmt(); } break; @@ -9761,6 +10099,7 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprSwitchStmtContext extends ParserRuleContext { public TerminalNode SWITCH() { return getToken(GobraParser.SWITCH, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -9793,24 +10132,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_exprSwitchStmt); + enterRule(_localctx, 274, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1493); + setState(1530); match(SWITCH); - setState(1504); + setState(1541); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1495); + setState(1532); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1494); + setState(1531); expression(0); } } @@ -9819,24 +10158,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1498); + setState(1535); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: { - setState(1497); + setState(1534); simpleStmt(); } break; } - setState(1500); + setState(1537); eos(); - setState(1502); + setState(1539); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1501); + setState(1538); expression(0); } } @@ -9844,23 +10183,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1506); + setState(1543); match(L_CURLY); - setState(1510); + setState(1547); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1507); + setState(1544); exprCaseClause(); } } - setState(1512); + setState(1549); _errHandler.sync(this); _la = _input.LA(1); } - setState(1513); + setState(1550); match(R_CURLY); } } @@ -9875,6 +10214,7 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprCaseClauseContext extends ParserRuleContext { public ExprSwitchCaseContext exprSwitchCase() { return getRuleContext(ExprSwitchCaseContext.class,0); @@ -9896,24 +10236,25 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_exprCaseClause); + enterRule(_localctx, 276, RULE_exprCaseClause); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1552); exprSwitchCase(); - setState(1516); + setState(1553); match(COLON); - setState(1518); + setState(1555); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,141,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1517); + setState(1554); statementList(); } - break; } + } } catch (RecognitionException re) { @@ -9927,6 +10268,7 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ExprSwitchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public ExpressionListContext expressionList() { @@ -9946,24 +10288,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_exprSwitchCase); + enterRule(_localctx, 278, RULE_exprSwitchCase); try { - setState(1523); + setState(1560); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1520); + setState(1557); match(CASE); - setState(1521); + setState(1558); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1522); + setState(1559); match(DEFAULT); } break; @@ -9982,6 +10324,7 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchStmtContext extends ParserRuleContext { public TerminalNode SWITCH() { return getToken(GobraParser.SWITCH, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -10014,58 +10357,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_typeSwitchStmt); + enterRule(_localctx, 280, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1525); + setState(1562); match(SWITCH); - setState(1534); + setState(1571); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1526); + setState(1563); typeSwitchGuard(); } break; case 2: { - setState(1527); + setState(1564); eos(); - setState(1528); + setState(1565); typeSwitchGuard(); } break; case 3: { - setState(1530); + setState(1567); simpleStmt(); - setState(1531); + setState(1568); eos(); - setState(1532); + setState(1569); typeSwitchGuard(); } break; } - setState(1536); + setState(1573); match(L_CURLY); - setState(1540); + setState(1577); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1537); + setState(1574); typeCaseClause(); } } - setState(1542); + setState(1579); _errHandler.sync(this); _la = _input.LA(1); } - setState(1543); + setState(1580); match(R_CURLY); } } @@ -10080,6 +10423,7 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchGuardContext extends ParserRuleContext { public PrimaryExprContext primaryExpr() { return getRuleContext(PrimaryExprContext.class,0); @@ -10103,31 +10447,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_typeSwitchGuard); + enterRule(_localctx, 282, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1547); + setState(1584); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1545); + setState(1582); match(IDENTIFIER); - setState(1546); + setState(1583); match(DECLARE_ASSIGN); } break; } - setState(1549); + setState(1586); primaryExpr(0); - setState(1550); + setState(1587); match(DOT); - setState(1551); + setState(1588); match(L_PAREN); - setState(1552); + setState(1589); match(TYPE); - setState(1553); + setState(1590); match(R_PAREN); } } @@ -10142,6 +10486,7 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeCaseClauseContext extends ParserRuleContext { public TypeSwitchCaseContext typeSwitchCase() { return getRuleContext(TypeSwitchCaseContext.class,0); @@ -10163,24 +10508,25 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 278, RULE_typeCaseClause); + enterRule(_localctx, 284, RULE_typeCaseClause); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1555); + setState(1592); typeSwitchCase(); - setState(1556); + setState(1593); match(COLON); - setState(1558); + setState(1595); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1557); + setState(1594); statementList(); } - break; } + } } catch (RecognitionException re) { @@ -10194,10 +10540,11 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeSwitchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } - public TypeListContext typeList() { - return getRuleContext(TypeListContext.class,0); + public TypeListSwitchContext typeListSwitch() { + return getRuleContext(TypeListSwitchContext.class,0); } public TerminalNode DEFAULT() { return getToken(GobraParser.DEFAULT, 0); } public TypeSwitchCaseContext(ParserRuleContext parent, int invokingState) { @@ -10213,24 +10560,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 280, RULE_typeSwitchCase); + enterRule(_localctx, 286, RULE_typeSwitchCase); try { - setState(1563); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1560); + setState(1597); match(CASE); - setState(1561); - typeList(); + setState(1598); + typeListSwitch(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1562); + setState(1599); match(DEFAULT); } break; @@ -10249,7 +10596,8 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException return _localctx; } - public static class TypeListContext extends ParserRuleContext { + @SuppressWarnings("CheckReturnValue") + public static class TypeListSwitchContext extends ParserRuleContext { public List type_() { return getRuleContexts(Type_Context.class); } @@ -10264,25 +10612,25 @@ public TerminalNode NIL_LIT(int i) { public TerminalNode COMMA(int i) { return getToken(GobraParser.COMMA, i); } - public TypeListContext(ParserRuleContext parent, int invokingState) { + public TypeListSwitchContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_typeList; } + @Override public int getRuleIndex() { return RULE_typeListSwitch; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeList(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeListSwitch(this); else return visitor.visitChildren(this); } } - public final TypeListContext typeList() throws RecognitionException { - TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 282, RULE_typeList); + public final TypeListSwitchContext typeListSwitch() throws RecognitionException { + TypeListSwitchContext _localctx = new TypeListSwitchContext(_ctx, getState()); + enterRule(_localctx, 288, RULE_typeListSwitch); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1567); + setState(1604); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10305,28 +10653,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1565); + setState(1602); type_(); } break; case NIL_LIT: { - setState(1566); + setState(1603); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1576); + setState(1613); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1569); + setState(1606); match(COMMA); - setState(1572); + setState(1609); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10349,13 +10697,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1570); + setState(1607); type_(); } break; case NIL_LIT: { - setState(1571); + setState(1608); match(NIL_LIT); } break; @@ -10364,7 +10712,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1578); + setState(1615); _errHandler.sync(this); _la = _input.LA(1); } @@ -10381,6 +10729,7 @@ public final TypeListContext typeList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SelectStmtContext extends ParserRuleContext { public TerminalNode SELECT() { return getToken(GobraParser.SELECT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -10404,30 +10753,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 284, RULE_selectStmt); + enterRule(_localctx, 290, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1579); + setState(1616); match(SELECT); - setState(1580); + setState(1617); match(L_CURLY); - setState(1584); + setState(1621); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1581); + setState(1618); commClause(); } } - setState(1586); + setState(1623); _errHandler.sync(this); _la = _input.LA(1); } - setState(1587); + setState(1624); match(R_CURLY); } } @@ -10442,6 +10791,7 @@ public final SelectStmtContext selectStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CommClauseContext extends ParserRuleContext { public CommCaseContext commCase() { return getRuleContext(CommCaseContext.class,0); @@ -10463,24 +10813,25 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 286, RULE_commClause); + enterRule(_localctx, 292, RULE_commClause); + int _la; try { enterOuterAlt(_localctx, 1); { - setState(1589); + setState(1626); commCase(); - setState(1590); + setState(1627); match(COLON); - setState(1592); + setState(1629); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { - case 1: + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1591); + setState(1628); statementList(); } - break; } + } } catch (RecognitionException re) { @@ -10494,6 +10845,7 @@ public final CommClauseContext commClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CommCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } public SendStmtContext sendStmt() { @@ -10516,28 +10868,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_commCase); + enterRule(_localctx, 294, RULE_commCase); try { - setState(1600); + setState(1637); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1594); + setState(1631); match(CASE); - setState(1597); + setState(1634); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1595); + setState(1632); sendStmt(); } break; case 2: { - setState(1596); + setState(1633); recvStmt(); } break; @@ -10547,7 +10899,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1599); + setState(1636); match(DEFAULT); } break; @@ -10566,6 +10918,7 @@ public final CommCaseContext commCase() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class RecvStmtContext extends ParserRuleContext { public ExpressionContext recvExpr; public ExpressionContext expression() { @@ -10592,31 +10945,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 290, RULE_recvStmt); + enterRule(_localctx, 296, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1608); + setState(1645); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,155,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1602); + setState(1639); expressionList(); - setState(1603); + setState(1640); match(ASSIGN); } break; case 2: { - setState(1605); + setState(1642); identifierList(); - setState(1606); + setState(1643); match(DECLARE_ASSIGN); } break; } - setState(1610); + setState(1647); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -10631,6 +10984,7 @@ public final RecvStmtContext recvStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ForStmtContext extends ParserRuleContext { public TerminalNode FOR() { return getToken(GobraParser.FOR, 0); } public BlockContext block() { @@ -10658,35 +11012,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 292, RULE_forStmt); + enterRule(_localctx, 298, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1649); match(FOR); - setState(1616); + setState(1653); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: { - setState(1613); + setState(1650); expression(0); } break; case 2: { - setState(1614); + setState(1651); forClause(); } break; case 3: { - setState(1615); + setState(1652); rangeClause(); } break; } - setState(1618); + setState(1655); block(); } } @@ -10701,6 +11055,7 @@ public final ForStmtContext forStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ForClauseContext extends ParserRuleContext { public SimpleStmtContext initStmt; public SimpleStmtContext postStmt; @@ -10732,41 +11087,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 294, RULE_forClause); + enterRule(_localctx, 300, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1621); + setState(1658); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1620); + setState(1657); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1623); + setState(1660); eos(); - setState(1625); + setState(1662); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1624); + setState(1661); expression(0); } break; } - setState(1627); + setState(1664); eos(); - setState(1629); + setState(1666); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1628); + setState(1665); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10784,6 +11139,7 @@ public final ForClauseContext forClause() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class GoStmtContext extends ParserRuleContext { public TerminalNode GO() { return getToken(GobraParser.GO, 0); } public ExpressionContext expression() { @@ -10802,13 +11158,13 @@ public T accept(ParseTreeVisitor visitor) { public final GoStmtContext goStmt() throws RecognitionException { GoStmtContext _localctx = new GoStmtContext(_ctx, getState()); - enterRule(_localctx, 296, RULE_goStmt); + enterRule(_localctx, 302, RULE_goStmt); try { enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1668); match(GO); - setState(1632); + setState(1669); expression(0); } } @@ -10823,6 +11179,7 @@ public final GoStmtContext goStmt() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeNameContext extends ParserRuleContext { public QualifiedIdentContext qualifiedIdent() { return getRuleContext(QualifiedIdentContext.class,0); @@ -10841,22 +11198,22 @@ public T accept(ParseTreeVisitor visitor) { public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); - enterRule(_localctx, 298, RULE_typeName); + enterRule(_localctx, 304, RULE_typeName); try { - setState(1636); + setState(1673); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1634); + setState(1671); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1635); + setState(1672); match(IDENTIFIER); } break; @@ -10873,6 +11230,125 @@ public final TypeNameContext typeName() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class TypeArgsContext extends ParserRuleContext { + public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } + public TypeListContext typeList() { + return getRuleContext(TypeListContext.class,0); + } + public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } + public TerminalNode COMMA() { return getToken(GobraParser.COMMA, 0); } + public TypeArgsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeArgs; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeArgs(this); + else return visitor.visitChildren(this); + } + } + + public final TypeArgsContext typeArgs() throws RecognitionException { + TypeArgsContext _localctx = new TypeArgsContext(_ctx, getState()); + enterRule(_localctx, 306, RULE_typeArgs); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1675); + match(L_BRACKET); + setState(1676); + typeList(); + setState(1678); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1677); + match(COMMA); + } + } + + setState(1680); + 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 TypeListContext extends ParserRuleContext { + public List type_() { + return getRuleContexts(Type_Context.class); + } + public Type_Context type_(int i) { + return getRuleContext(Type_Context.class,i); + } + public List COMMA() { return getTokens(GobraParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(GobraParser.COMMA, i); + } + public TypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeList; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 308, RULE_typeList); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1682); + type_(); + setState(1687); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,165,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1683); + match(COMMA); + setState(1684); + type_(); + } + } + } + setState(1689); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,165,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") public static class ArrayTypeContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public ArrayLengthContext arrayLength() { @@ -10895,17 +11371,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 300, RULE_arrayType); + enterRule(_localctx, 310, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1638); + setState(1690); match(L_BRACKET); - setState(1639); + setState(1691); arrayLength(); - setState(1640); + setState(1692); match(R_BRACKET); - setState(1641); + setState(1693); elementType(); } } @@ -10920,6 +11396,7 @@ public final ArrayTypeContext arrayType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ArrayLengthContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -10927,22 +11404,99 @@ public ExpressionContext expression() { public ArrayLengthContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_arrayLength; } + @Override public int getRuleIndex() { return RULE_arrayLength; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitArrayLength(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayLengthContext arrayLength() throws RecognitionException { + ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); + enterRule(_localctx, 312, RULE_arrayLength); + try { + enterOuterAlt(_localctx, 1); + { + setState(1695); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElementTypeContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public ElementTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elementType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitElementType(this); + else return visitor.visitChildren(this); + } + } + + public final ElementTypeContext elementType() throws RecognitionException { + ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); + enterRule(_localctx, 314, RULE_elementType); + try { + enterOuterAlt(_localctx, 1); + { + setState(1697); + type_(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PointerTypeContext extends ParserRuleContext { + public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public PointerTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pointerType; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitArrayLength(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitPointerType(this); else return visitor.visitChildren(this); } } - public final ArrayLengthContext arrayLength() throws RecognitionException { - ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 302, RULE_arrayLength); + public final PointerTypeContext pointerType() throws RecognitionException { + PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); + enterRule(_localctx, 316, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1643); - expression(0); + setState(1699); + match(STAR); + setState(1700); + type_(); } } catch (RecognitionException re) { @@ -10956,29 +11510,56 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { return _localctx; } - public static class ElementTypeContext extends ParserRuleContext { - public Type_Context type_() { - return getRuleContext(Type_Context.class,0); + @SuppressWarnings("CheckReturnValue") + public static class TypeElemContext extends ParserRuleContext { + public List typeTerm() { + return getRuleContexts(TypeTermContext.class); } - public ElementTypeContext(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_elementType; } + @Override public int getRuleIndex() { return RULE_typeElem; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitElementType(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeElem(this); else return visitor.visitChildren(this); } } - public final ElementTypeContext elementType() throws RecognitionException { - ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 304, RULE_elementType); + public final TypeElemContext typeElem() throws RecognitionException { + TypeElemContext _localctx = new TypeElemContext(_ctx, getState()); + enterRule(_localctx, 318, RULE_typeElem); try { + int _alt; enterOuterAlt(_localctx, 1); { - setState(1645); - type_(); + setState(1702); + typeTerm(); + setState(1707); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1703); + match(OR); + setState(1704); + typeTerm(); + } + } + } + setState(1709); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + } } } catch (RecognitionException re) { @@ -10992,31 +11573,29 @@ public final ElementTypeContext elementType() throws RecognitionException { return _localctx; } - public static class PointerTypeContext extends ParserRuleContext { - public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } + @SuppressWarnings("CheckReturnValue") + public static class TypeTermContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); } - public PointerTypeContext(ParserRuleContext parent, int invokingState) { + public TypeTermContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_pointerType; } + @Override public int getRuleIndex() { return RULE_typeTerm; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitPointerType(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeTerm(this); else return visitor.visitChildren(this); } } - public final PointerTypeContext pointerType() throws RecognitionException { - PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_pointerType); + public final TypeTermContext typeTerm() throws RecognitionException { + TypeTermContext _localctx = new TypeTermContext(_ctx, getState()); + enterRule(_localctx, 320, RULE_typeTerm); try { enterOuterAlt(_localctx, 1); { - setState(1647); - match(STAR); - setState(1648); + setState(1710); type_(); } } @@ -11031,6 +11610,7 @@ public final PointerTypeContext pointerType() throws RecognitionException { return _localctx; } + @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); } @@ -11050,15 +11630,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_sliceType); + enterRule(_localctx, 322, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1650); + setState(1712); match(L_BRACKET); - setState(1651); + setState(1713); match(R_BRACKET); - setState(1652); + setState(1714); elementType(); } } @@ -11073,6 +11653,7 @@ public final SliceTypeContext sliceType() throws RecognitionException { 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); } @@ -11096,19 +11677,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_mapType); + enterRule(_localctx, 324, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1654); + setState(1716); match(MAP); - setState(1655); + setState(1717); match(L_BRACKET); - setState(1656); + setState(1718); type_(); - setState(1657); + setState(1719); match(R_BRACKET); - setState(1658); + setState(1720); elementType(); } } @@ -11123,6 +11704,7 @@ public final MapTypeContext mapType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ChannelTypeContext extends ParserRuleContext { public ElementTypeContext elementType() { return getRuleContext(ElementTypeContext.class,0); @@ -11142,37 +11724,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_channelType); + enterRule(_localctx, 326, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1665); + setState(1727); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: { - setState(1660); + setState(1722); match(CHAN); } break; case 2: { - setState(1661); + setState(1723); match(CHAN); - setState(1662); + setState(1724); match(RECEIVE); } break; case 3: { - setState(1663); + setState(1725); match(RECEIVE); - setState(1664); + setState(1726); match(CHAN); } break; } - setState(1667); + setState(1729); elementType(); } } @@ -11187,6 +11769,7 @@ public final ChannelTypeContext channelType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FunctionTypeContext extends ParserRuleContext { public TerminalNode FUNC() { return getToken(GobraParser.FUNC, 0); } public SignatureContext signature() { @@ -11205,13 +11788,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_functionType); + enterRule(_localctx, 328, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1731); match(FUNC); - setState(1670); + setState(1732); signature(); } } @@ -11226,6 +11809,7 @@ public final FunctionTypeContext functionType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class SignatureContext extends ParserRuleContext { public ParametersContext parameters() { return getRuleContext(ParametersContext.class,0); @@ -11246,24 +11830,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_signature); + enterRule(_localctx, 330, RULE_signature); try { - setState(1676); + setState(1738); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1672); + setState(1734); parameters(); - setState(1673); + setState(1735); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1675); + setState(1737); parameters(); } break; @@ -11280,6 +11864,7 @@ public final SignatureContext signature() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ResultContext extends ParserRuleContext { public ParametersContext parameters() { return getRuleContext(ParametersContext.class,0); @@ -11300,22 +11885,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_result); + enterRule(_localctx, 332, RULE_result); try { - setState(1680); + setState(1742); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1678); + setState(1740); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1679); + setState(1741); type_(); } break; @@ -11332,6 +11917,7 @@ public final ResultContext result() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ParametersContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -11358,45 +11944,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_parameters); + enterRule(_localctx, 334, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1682); + setState(1744); match(L_PAREN); - setState(1694); + setState(1756); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << ADT) | (1L << PRED))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (FUNC - 77)) | (1L << (INTERFACE - 77)) | (1L << (MAP - 77)) | (1L << (STRUCT - 77)) | (1L << (CHAN - 77)) | (1L << (IDENTIFIER - 77)) | (1L << (L_PAREN - 77)) | (1L << (L_BRACKET - 77)) | (1L << (ELLIPSIS - 77)) | (1L << (STAR - 77)) | (1L << (RECEIVE - 77)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 83350678101032960L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441152431101575619L) != 0)) { { - setState(1683); + setState(1745); parameterDecl(); - setState(1688); + setState(1750); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,164,_ctx); + _alt = getInterpreter().adaptivePredict(_input,170,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1684); + setState(1746); match(COMMA); - setState(1685); + setState(1747); parameterDecl(); } } } - setState(1690); + setState(1752); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,164,_ctx); + _alt = getInterpreter().adaptivePredict(_input,170,_ctx); } - setState(1692); + setState(1754); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1691); + setState(1753); match(COMMA); } } @@ -11404,7 +11990,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1696); + setState(1758); match(R_PAREN); } } @@ -11419,6 +12005,204 @@ 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, 336, RULE_typeParameters); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1760); + match(L_BRACKET); + setState(1761); + typeParamList(); + setState(1763); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1762); + match(COMMA); + } + } + + setState(1765); + 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, 338, RULE_typeParamList); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1767); + typeParamDecl(); + setState(1772); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,174,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1768); + match(COMMA); + setState(1769); + typeParamDecl(); + } + } + } + setState(1774); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,174,_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, 340, RULE_typeParamDecl); + try { + enterOuterAlt(_localctx, 1); + { + setState(1775); + identifierList(); + setState(1776); + 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, 342, RULE_typeConstraint); + try { + enterOuterAlt(_localctx, 1); + { + setState(1778); + 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); @@ -11442,28 +12226,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_conversion); + enterRule(_localctx, 344, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1698); + setState(1780); nonNamedType(); - setState(1699); + setState(1781); match(L_PAREN); - setState(1700); + setState(1782); expression(0); - setState(1702); + setState(1784); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1701); + setState(1783); match(COMMA); } } - setState(1704); + setState(1786); match(R_PAREN); } } @@ -11478,6 +12262,7 @@ public final ConversionContext conversion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class NonNamedTypeContext extends ParserRuleContext { public TypeLitContext typeLit() { return getRuleContext(TypeLitContext.class,0); @@ -11500,9 +12285,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_nonNamedType); + enterRule(_localctx, 346, RULE_nonNamedType); try { - setState(1711); + setState(1793); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -11516,18 +12301,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1706); + setState(1788); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1707); + setState(1789); match(L_PAREN); - setState(1708); + setState(1790); nonNamedType(); - setState(1709); + setState(1791); match(R_PAREN); } break; @@ -11546,6 +12331,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OperandContext extends ParserRuleContext { public LiteralContext literal() { return getRuleContext(LiteralContext.class,0); @@ -11553,6 +12339,9 @@ public LiteralContext literal() { public OperandNameContext operandName() { return getRuleContext(OperandNameContext.class,0); } + public TypeArgsContext typeArgs() { + return getRuleContext(TypeArgsContext.class,0); + } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -11571,33 +12360,43 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_operand); + enterRule(_localctx, 348, RULE_operand); try { - setState(1719); + setState(1804); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1713); + setState(1795); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1714); + setState(1796); operandName(); + setState(1798); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { + case 1: + { + setState(1797); + typeArgs(); + } + break; + } } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1715); + setState(1800); match(L_PAREN); - setState(1716); + setState(1801); expression(0); - setState(1717); + setState(1802); match(R_PAREN); } break; @@ -11614,6 +12413,7 @@ public final OperandContext operand() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralContext extends ParserRuleContext { public BasicLitContext basicLit() { return getRuleContext(BasicLitContext.class,0); @@ -11637,9 +12437,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_literal); + enterRule(_localctx, 350, RULE_literal); try { - setState(1724); + setState(1809); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11656,7 +12456,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1721); + setState(1806); basicLit(); } break; @@ -11674,7 +12474,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1722); + setState(1807); compositeLit(); } break; @@ -11687,7 +12487,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1723); + setState(1808); functionLit(); } break; @@ -11706,6 +12506,7 @@ public final LiteralContext literal() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IntegerContext extends ParserRuleContext { public TerminalNode DECIMAL_LIT() { return getToken(GobraParser.DECIMAL_LIT, 0); } public TerminalNode BINARY_LIT() { return getToken(GobraParser.BINARY_LIT, 0); } @@ -11726,14 +12527,14 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_integer); + enterRule(_localctx, 352, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1726); + setState(1811); _la = _input.LA(1); - if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & ((1L << (DECIMAL_LIT - 138)) | (1L << (BINARY_LIT - 138)) | (1L << (OCTAL_LIT - 138)) | (1L << (HEX_LIT - 138)) | (1L << (IMAGINARY_LIT - 138)) | (1L << (RUNE_LIT - 138)))) != 0)) ) { + if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11754,6 +12555,7 @@ public final IntegerContext integer() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class OperandNameContext extends ParserRuleContext { public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } public OperandNameContext(ParserRuleContext parent, int invokingState) { @@ -11769,11 +12571,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_operandName); + enterRule(_localctx, 354, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1728); + setState(1813); match(IDENTIFIER); } } @@ -11788,6 +12590,7 @@ public final OperandNameContext operandName() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class QualifiedIdentContext extends ParserRuleContext { public List IDENTIFIER() { return getTokens(GobraParser.IDENTIFIER); } public TerminalNode IDENTIFIER(int i) { @@ -11807,15 +12610,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_qualifiedIdent); + enterRule(_localctx, 356, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1730); + setState(1815); match(IDENTIFIER); - setState(1731); + setState(1816); match(DOT); - setState(1732); + setState(1817); match(IDENTIFIER); } } @@ -11830,6 +12633,7 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class CompositeLitContext extends ParserRuleContext { public LiteralTypeContext literalType() { return getRuleContext(LiteralTypeContext.class,0); @@ -11850,13 +12654,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_compositeLit); + enterRule(_localctx, 358, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1734); + setState(1819); literalType(); - setState(1735); + setState(1820); literalValue(); } } @@ -11871,6 +12675,7 @@ public final CompositeLitContext compositeLit() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class LiteralValueContext extends ParserRuleContext { public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } public TerminalNode R_CURLY() { return getToken(GobraParser.R_CURLY, 0); } @@ -11891,26 +12696,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_literalValue); + enterRule(_localctx, 360, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1737); + setState(1822); match(L_CURLY); - setState(1742); + setState(1827); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_CURLY - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1738); + setState(1823); elementList(); - setState(1740); + setState(1825); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1739); + setState(1824); match(COMMA); } } @@ -11918,7 +12723,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1744); + setState(1829); match(R_CURLY); } } @@ -11933,6 +12738,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ElementListContext extends ParserRuleContext { public List keyedElement() { return getRuleContexts(KeyedElementContext.class); @@ -11957,30 +12763,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_elementList); + enterRule(_localctx, 362, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1746); + setState(1831); keyedElement(); - setState(1751); + setState(1836); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + _alt = getInterpreter().adaptivePredict(_input,182,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1747); + setState(1832); match(COMMA); - setState(1748); + setState(1833); keyedElement(); } } } - setState(1753); + setState(1838); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,173,_ctx); + _alt = getInterpreter().adaptivePredict(_input,182,_ctx); } } } @@ -11995,6 +12801,7 @@ public final ElementListContext elementList() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class KeyedElementContext extends ParserRuleContext { public ElementContext element() { return getRuleContext(ElementContext.class,0); @@ -12016,23 +12823,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_keyedElement); + enterRule(_localctx, 364, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1757); + setState(1842); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,183,_ctx) ) { case 1: { - setState(1754); + setState(1839); key(); - setState(1755); + setState(1840); match(COLON); } break; } - setState(1759); + setState(1844); element(); } } @@ -12047,6 +12854,7 @@ public final KeyedElementContext keyedElement() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class KeyContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -12067,9 +12875,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_key); + enterRule(_localctx, 366, RULE_key); try { - setState(1763); + setState(1848); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12137,14 +12945,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1761); + setState(1846); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1762); + setState(1847); literalValue(); } break; @@ -12163,6 +12971,7 @@ public final KeyContext key() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ElementContext extends ParserRuleContext { public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -12183,9 +12992,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_element); + enterRule(_localctx, 368, RULE_element); try { - setState(1767); + setState(1852); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12253,14 +13062,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1765); + setState(1850); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1766); + setState(1851); literalValue(); } break; @@ -12279,6 +13088,7 @@ public final ElementContext element() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class StructTypeContext extends ParserRuleContext { public TerminalNode STRUCT() { return getToken(GobraParser.STRUCT, 0); } public TerminalNode L_CURLY() { return getToken(GobraParser.L_CURLY, 0); } @@ -12289,11 +13099,9 @@ public List fieldDecl() { public FieldDeclContext fieldDecl(int i) { return getRuleContext(FieldDeclContext.class,i); } - public List eos() { - return getRuleContexts(EosContext.class); - } - public EosContext eos(int i) { - return getRuleContext(EosContext.class,i); + public List EOS() { return getTokens(GobraParser.EOS); } + public TerminalNode EOS(int i) { + return getToken(GobraParser.EOS, i); } public StructTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -12308,32 +13116,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_structType); + enterRule(_localctx, 370, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1769); + setState(1854); match(STRUCT); - setState(1770); + setState(1855); match(L_CURLY); - setState(1776); + setState(1861); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1771); + setState(1856); fieldDecl(); - setState(1772); - eos(); + setState(1857); + match(EOS); } } - setState(1778); + setState(1863); _errHandler.sync(this); _la = _input.LA(1); } - setState(1779); + setState(1864); match(R_CURLY); } } @@ -12348,6 +13156,7 @@ public final StructTypeContext structType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class FieldDeclContext extends ParserRuleContext { public String_Context tag; public IdentifierListContext identifierList() { @@ -12375,34 +13184,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_fieldDecl); + enterRule(_localctx, 372, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1785); + setState(1870); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { case 1: { - setState(1781); + setState(1866); identifierList(); - setState(1782); + setState(1867); type_(); } break; case 2: { - setState(1784); + setState(1869); embeddedField(); } break; } - setState(1788); + setState(1873); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,179,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { case 1: { - setState(1787); + setState(1872); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -12420,6 +13229,7 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class String_Context extends ParserRuleContext { public TerminalNode RAW_STRING_LIT() { return getToken(GobraParser.RAW_STRING_LIT, 0); } public TerminalNode INTERPRETED_STRING_LIT() { return getToken(GobraParser.INTERPRETED_STRING_LIT, 0); } @@ -12436,12 +13246,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 352, RULE_string_); + enterRule(_localctx, 374, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1790); + setState(1875); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -12464,11 +13274,15 @@ public final String_Context string_() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EmbeddedFieldContext extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } + public TypeArgsContext typeArgs() { + return getRuleContext(TypeArgsContext.class,0); + } public EmbeddedFieldContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -12482,23 +13296,33 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_embeddedField); + enterRule(_localctx, 376, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1793); + setState(1878); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1792); + setState(1877); match(STAR); } } - setState(1795); + setState(1880); typeName(); + setState(1882); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { + case 1: + { + setState(1881); + typeArgs(); + } + break; + } } } catch (RecognitionException re) { @@ -12512,6 +13336,7 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class IndexContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } public ExpressionContext expression() { @@ -12531,15 +13356,15 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_index); + enterRule(_localctx, 378, RULE_index); try { enterOuterAlt(_localctx, 1); { - setState(1797); + setState(1884); match(L_BRACKET); - setState(1798); + setState(1885); expression(0); - setState(1799); + setState(1886); match(R_BRACKET); } } @@ -12554,6 +13379,7 @@ public final IndexContext index() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class TypeAssertionContext extends ParserRuleContext { public TerminalNode DOT() { return getToken(GobraParser.DOT, 0); } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } @@ -12574,17 +13400,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_typeAssertion); + enterRule(_localctx, 380, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1801); + setState(1888); match(DOT); - setState(1802); + setState(1889); match(L_PAREN); - setState(1803); + setState(1890); type_(); - setState(1804); + setState(1891); match(R_PAREN); } } @@ -12599,6 +13425,7 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ArgumentsContext extends ParserRuleContext { public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public TerminalNode R_PAREN() { return getToken(GobraParser.R_PAREN, 0); } @@ -12626,39 +13453,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_arguments); + enterRule(_localctx, 382, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1893); match(L_PAREN); - setState(1821); + setState(1908); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << LET) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << ADT) | (1L << MATCH) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (WRITEPERM - 65)) | (1L << (NOPERM - 65)) | (1L << (TRUSTED - 65)) | (1L << (FUNC - 65)) | (1L << (INTERFACE - 65)) | (1L << (MAP - 65)) | (1L << (STRUCT - 65)) | (1L << (CHAN - 65)) | (1L << (RANGE - 65)) | (1L << (TYPE - 65)) | (1L << (NIL_LIT - 65)) | (1L << (IDENTIFIER - 65)) | (1L << (L_PAREN - 65)) | (1L << (L_BRACKET - 65)))) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & ((1L << (EXCLAMATION - 131)) | (1L << (PLUS - 131)) | (1L << (MINUS - 131)) | (1L << (CARET - 131)) | (1L << (STAR - 131)) | (1L << (AMPERSAND - 131)) | (1L << (RECEIVE - 131)) | (1L << (DECIMAL_LIT - 131)) | (1L << (BINARY_LIT - 131)) | (1L << (OCTAL_LIT - 131)) | (1L << (HEX_LIT - 131)) | (1L << (IMAGINARY_LIT - 131)) | (1L << (RUNE_LIT - 131)) | (1L << (RAW_STRING_LIT - 131)) | (1L << (INTERPRETED_STRING_LIT - 131)))) != 0)) { + 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(1813); + setState(1900); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,182,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { case 1: { - setState(1807); + setState(1894); expressionList(); } break; case 2: { - setState(1808); + setState(1895); nonNamedType(); - setState(1811); + setState(1898); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,181,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { case 1: { - setState(1809); + setState(1896); match(COMMA); - setState(1810); + setState(1897); expressionList(); } break; @@ -12666,22 +13493,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1816); + setState(1903); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1815); + setState(1902); match(ELLIPSIS); } } - setState(1819); + setState(1906); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1818); + setState(1905); match(COMMA); } } @@ -12689,7 +13516,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1823); + setState(1910); match(R_PAREN); } } @@ -12704,6 +13531,7 @@ public final ArgumentsContext arguments() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class MethodExprContext extends ParserRuleContext { public NonNamedTypeContext nonNamedType() { return getRuleContext(NonNamedTypeContext.class,0); @@ -12723,15 +13551,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_methodExpr); + enterRule(_localctx, 384, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1825); + setState(1912); nonNamedType(); - setState(1826); + setState(1913); match(DOT); - setState(1827); + setState(1914); match(IDENTIFIER); } } @@ -12746,6 +13574,7 @@ public final MethodExprContext methodExpr() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class ReceiverTypeContext extends ParserRuleContext { public Type_Context type_() { return getRuleContext(Type_Context.class,0); @@ -12763,11 +13592,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_receiverType); + enterRule(_localctx, 386, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1829); + setState(1916); type_(); } } @@ -12782,6 +13611,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") public static class EosContext extends ParserRuleContext { public TerminalNode SEMI() { return getToken(GobraParser.SEMI, 0); } public TerminalNode EOF() { return getToken(GobraParser.EOF, 0); } @@ -12799,36 +13629,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_eos); + enterRule(_localctx, 388, RULE_eos); try { - setState(1835); + setState(1922); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1918); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1832); + setState(1919); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1833); + setState(1920); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1834); + setState(1921); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12851,7 +13681,7 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return expression_sempred((ExpressionContext)_localctx, predIndex); case 89: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 183: + case 194: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -12911,742 +13741,1243 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a2\u0730\4\2\t"+ - "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ - "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ - "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ - "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ - "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ - "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ - "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ - "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ - "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+ - "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+ - "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+ - "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+ - "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+ - "\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+ - "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+ - "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+ - "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ - "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ - "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ - "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ - "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6\t\u00b6"+ - "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\3\2\3\2\3\2\3\3\3\3\3"+ - "\3\3\4\3\4\3\4\3\5\3\5\3\5\7\5\u017f\n\5\f\5\16\5\u0182\13\5\3\6\3\6\5"+ - "\6\u0186\n\6\3\7\3\7\3\7\7\7\u018b\n\7\f\7\16\7\u018e\13\7\3\7\3\7\3\7"+ - "\3\7\3\7\7\7\u0195\n\7\f\7\16\7\u0198\13\7\3\7\3\7\3\7\5\7\u019d\n\7\3"+ - "\7\3\7\7\7\u01a1\n\7\f\7\16\7\u01a4\13\7\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3"+ - "\t\3\n\3\n\3\n\7\n\u01b1\n\n\f\n\16\n\u01b4\13\n\3\n\5\n\u01b7\n\n\3\n"+ - "\3\n\3\13\3\13\3\13\7\13\u01be\n\13\f\13\16\13\u01c1\13\13\3\13\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\7\13\u01ca\n\13\f\13\16\13\u01cd\13\13\3\13\5"+ - "\13\u01d0\n\13\3\f\3\f\3\f\3\f\5\f\u01d6\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ - "\r\5\r\u01df\n\r\3\16\3\16\3\17\3\17\3\17\3\20\3\20\3\20\5\20\u01e9\n"+ - "\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\21\3\21\5\21\u01fa\n\21\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+ - "\3\24\7\24\u0206\n\24\f\24\16\24\u0209\13\24\3\24\5\24\u020c\n\24\3\25"+ - "\3\25\3\25\7\25\u0211\n\25\f\25\16\25\u0214\13\25\3\25\3\25\3\26\7\26"+ - "\u0219\n\26\f\26\16\26\u021c\13\26\3\27\3\27\3\27\3\27\7\27\u0222\n\27"+ - "\f\27\16\27\u0225\13\27\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+ - "\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3"+ - "\34\3\35\3\35\3\35\3\35\3\35\5\35\u0244\n\35\3\35\3\35\3\35\3\35\3\36"+ - "\3\36\5\36\u024c\n\36\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\""+ - "\3\"\3\"\3\"\3#\3#\3#\3#\3#\5#\u0264\n#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%"+ - "\3%\3%\3%\3%\3%\7%\u0275\n%\f%\16%\u0278\13%\3%\3%\3&\3&\3&\3&\3\'\3\'"+ - "\3\'\3\'\7\'\u0284\n\'\f\'\16\'\u0287\13\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3"+ - ")\3)\5)\u0293\n)\3*\3*\3*\3*\3*\7*\u029a\n*\f*\16*\u029d\13*\3*\3*\3+"+ - "\3+\3+\3+\3+\3+\3+\3+\3+\5+\u02aa\n+\3,\3,\3,\3,\3,\7,\u02b1\n,\f,\16"+ - ",\u02b4\13,\3,\3,\3-\3-\3-\3-\3-\7-\u02bd\n-\f-\16-\u02c0\13-\3-\3-\3"+ - ".\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u02d4\n/\3\60\3\60\3"+ - "\60\3\60\3\60\5\60\u02db\n\60\3\60\7\60\u02de\n\60\f\60\16\60\u02e1\13"+ - "\60\3\60\3\60\5\60\u02e5\n\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ - "\5\61\u02ef\n\61\3\62\5\62\u02f2\n\62\3\62\3\62\5\62\u02f6\n\62\3\63\3"+ - "\63\5\63\u02fa\n\63\3\64\3\64\3\64\3\64\7\64\u0300\n\64\f\64\16\64\u0303"+ - "\13\64\3\64\3\64\3\65\3\65\3\65\5\65\u030a\n\65\3\66\3\66\3\66\5\66\u030f"+ - "\n\66\3\67\3\67\3\67\3\67\3\67\3\67\5\67\u0317\n\67\5\67\u0319\n\67\3"+ - "\67\3\67\3\67\5\67\u031e\n\67\38\38\38\78\u0323\n8\f8\168\u0326\138\3"+ - "9\39\39\39\39\59\u032d\n9\39\59\u0330\n9\39\39\3:\3:\5:\u0336\n:\3:\3"+ - ":\3:\5:\u033b\n:\5:\u033d\n:\3:\5:\u0340\n:\3;\3;\3;\7;\u0345\n;\f;\16"+ - ";\u0348\13;\3<\3<\5<\u034c\n<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3"+ - ">\3>\7>\u035d\n>\f>\16>\u0360\13>\3>\3>\3>\7>\u0365\n>\f>\16>\u0368\13"+ - ">\3>\5>\u036b\n>\3?\5?\u036e\n?\3?\3?\3?\3?\5?\u0374\n?\3@\3@\5@\u0378"+ - "\n@\3@\5@\u037b\n@\3@\3@\3@\3A\3A\3A\3A\3A\5A\u0385\nA\3B\3B\3B\3B\3B"+ - "\5B\u038c\nB\3C\3C\3C\3C\3C\5C\u0393\nC\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E"+ - "\5E\u039f\nE\3F\3F\3F\3F\5F\u03a5\nF\3G\3G\3G\3G\3G\5G\u03ac\nG\3H\3H"+ - "\3H\5H\u03b1\nH\3I\3I\3I\3I\5I\u03b7\nI\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K"+ - "\5K\u03c3\nK\3L\3L\3L\3L\5L\u03c9\nL\3L\3L\5L\u03cd\nL\3M\3M\3M\3M\3N"+ - "\3N\5N\u03d5\nN\3N\3N\5N\u03d9\nN\3N\3N\3O\3O\5O\u03df\nO\3P\5P\u03e2"+ - "\nP\3P\3P\3Q\3Q\5Q\u03e8\nQ\3Q\3Q\3R\5R\u03ed\nR\3R\3R\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0406\nS\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3S\3S\3S\7S\u0429\nS\fS\16S\u042c\13S\3T\3T\3T\3T\3T\3T\3"+ - "T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\3T\5T\u0442\nT\3U\3U\3U\3V\3V\3"+ - "V\5V\u044a\nV\3W\3W\3W\3X\3X\3X\3X\7X\u0453\nX\fX\16X\u0456\13X\3X\3X"+ - "\3X\3X\5X\u045c\nX\3Y\3Y\3Y\3Y\3Y\5Y\u0463\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z"+ - "\5Z\u046d\nZ\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u047b\n[\3[\3[\3["+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\3[\7[\u0491\n[\f[\16"+ - "[\u0494\13[\3\\\3\\\3\\\3]\3]\5]\u049b\n]\3]\3]\5]\u049f\n]\3^\3^\5^\u04a3"+ - "\n^\3^\5^\u04a6\n^\3^\3^\3_\3_\3_\3_\3_\5_\u04af\n_\3_\3_\7_\u04b3\n_"+ - "\f_\16_\u04b6\13_\3_\3_\3`\3`\3`\3`\3a\5a\u04bf\na\3a\3a\3a\3a\3a\3a\5"+ - "a\u04c7\na\3a\3a\3a\3a\5a\u04cd\na\3b\3b\3b\3b\3b\3b\3b\5b\u04d6\nb\3"+ - "c\3c\3c\3c\3c\3c\3c\3c\3c\5c\u04e1\nc\3d\3d\3d\3e\3e\3e\3e\7e\u04ea\n"+ - "e\fe\16e\u04ed\13e\3e\5e\u04f0\ne\5e\u04f2\ne\3e\3e\3f\3f\3f\3f\3f\3f"+ - "\3f\5f\u04fd\nf\3g\3g\3g\3g\3g\3h\3h\5h\u0506\nh\3h\3h\5h\u050a\nh\3h"+ - "\5h\u050d\nh\3h\3h\3h\3h\3h\5h\u0514\nh\3h\3h\3i\3i\3j\3j\3k\3k\3l\5l"+ - "\u051f\nl\3l\3l\3m\3m\3m\3m\3m\3m\5m\u0529\nm\3m\3m\3m\3m\5m\u052f\nm"+ - "\5m\u0531\nm\3n\3n\3n\3o\3o\3p\3p\3p\5p\u053b\np\3q\3q\3q\3q\3q\3q\7q"+ - "\u0543\nq\fq\16q\u0546\13q\3q\5q\u0549\nq\3r\3r\5r\u054d\nr\3r\3r\5r\u0551"+ - "\nr\3s\3s\3s\7s\u0556\ns\fs\16s\u0559\13s\3t\3t\3t\7t\u055e\nt\ft\16t"+ - "\u0561\13t\3u\3u\3u\3u\3u\3u\7u\u0569\nu\fu\16u\u056c\13u\3u\5u\u056f"+ - "\nu\3v\3v\5v\u0573\nv\3v\3v\3w\3w\3w\3w\3w\3w\7w\u057d\nw\fw\16w\u0580"+ - "\13w\3w\5w\u0583\nw\3x\3x\5x\u0587\nx\3x\3x\3y\5y\u058c\ny\3y\3y\3y\6"+ - "y\u0591\ny\ry\16y\u0592\3z\3z\3z\3z\3z\5z\u059a\nz\3{\3{\3|\3|\3|\3|\3"+ - "}\3}\3}\3~\3~\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u05ae"+ - "\n\u0080\3\u0081\3\u0081\5\u0081\u05b2\n\u0081\3\u0082\3\u0082\5\u0082"+ - "\u05b6\n\u0082\3\u0083\3\u0083\5\u0083\u05ba\n\u0083\3\u0084\3\u0084\3"+ - "\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\3\u0086\3\u0086\5\u0086\u05ca\n\u0086\3\u0086\3\u0086\3\u0086"+ - "\3\u0086\5\u0086\u05d0\n\u0086\5\u0086\u05d2\n\u0086\3\u0087\3\u0087\5"+ - "\u0087\u05d6\n\u0087\3\u0088\3\u0088\5\u0088\u05da\n\u0088\3\u0088\5\u0088"+ - "\u05dd\n\u0088\3\u0088\3\u0088\5\u0088\u05e1\n\u0088\5\u0088\u05e3\n\u0088"+ - "\3\u0088\3\u0088\7\u0088\u05e7\n\u0088\f\u0088\16\u0088\u05ea\13\u0088"+ - "\3\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u05f1\n\u0089\3\u008a"+ - "\3\u008a\3\u008a\5\u008a\u05f6\n\u008a\3\u008b\3\u008b\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u0601\n\u008b\3\u008b"+ - "\3\u008b\7\u008b\u0605\n\u008b\f\u008b\16\u008b\u0608\13\u008b\3\u008b"+ - "\3\u008b\3\u008c\3\u008c\5\u008c\u060e\n\u008c\3\u008c\3\u008c\3\u008c"+ - "\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\5\u008d\u0619\n\u008d"+ - "\3\u008e\3\u008e\3\u008e\5\u008e\u061e\n\u008e\3\u008f\3\u008f\5\u008f"+ - "\u0622\n\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u0627\n\u008f\7\u008f\u0629"+ - "\n\u008f\f\u008f\16\u008f\u062c\13\u008f\3\u0090\3\u0090\3\u0090\7\u0090"+ - "\u0631\n\u0090\f\u0090\16\u0090\u0634\13\u0090\3\u0090\3\u0090\3\u0091"+ - "\3\u0091\3\u0091\5\u0091\u063b\n\u0091\3\u0092\3\u0092\3\u0092\5\u0092"+ - "\u0640\n\u0092\3\u0092\5\u0092\u0643\n\u0092\3\u0093\3\u0093\3\u0093\3"+ - "\u0093\3\u0093\3\u0093\5\u0093\u064b\n\u0093\3\u0093\3\u0093\3\u0094\3"+ - "\u0094\3\u0094\3\u0094\5\u0094\u0653\n\u0094\3\u0094\3\u0094\3\u0095\5"+ - "\u0095\u0658\n\u0095\3\u0095\3\u0095\5\u0095\u065c\n\u0095\3\u0095\3\u0095"+ - "\5\u0095\u0660\n\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\5\u0097"+ - "\u0667\n\u0097\3\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099"+ - "\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009e\3\u009e\3\u009e"+ - "\3\u009e\3\u009e\5\u009e\u0684\n\u009e\3\u009e\3\u009e\3\u009f\3\u009f"+ - "\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\5\u00a0\u068f\n\u00a0\3\u00a1"+ - "\3\u00a1\5\u00a1\u0693\n\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a2\7\u00a2"+ - "\u0699\n\u00a2\f\u00a2\16\u00a2\u069c\13\u00a2\3\u00a2\5\u00a2\u069f\n"+ - "\u00a2\5\u00a2\u06a1\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\3"+ - "\u00a3\5\u00a3\u06a9\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3"+ - "\u00a4\3\u00a4\5\u00a4\u06b2\n\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a5\3"+ - "\u00a5\3\u00a5\5\u00a5\u06ba\n\u00a5\3\u00a6\3\u00a6\3\u00a6\5\u00a6\u06bf"+ - "\n\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9"+ - "\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u06cf\n\u00ab"+ - "\5\u00ab\u06d1\n\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\7\u00ac"+ - "\u06d8\n\u00ac\f\u00ac\16\u00ac\u06db\13\u00ac\3\u00ad\3\u00ad\3\u00ad"+ - "\5\u00ad\u06e0\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\5\u00ae\u06e6\n"+ - "\u00ae\3\u00af\3\u00af\5\u00af\u06ea\n\u00af\3\u00b0\3\u00b0\3\u00b0\3"+ - "\u00b0\3\u00b0\7\u00b0\u06f1\n\u00b0\f\u00b0\16\u00b0\u06f4\13\u00b0\3"+ - "\u00b0\3\u00b0\3\u00b1\3\u00b1\3\u00b1\3\u00b1\5\u00b1\u06fc\n\u00b1\3"+ - "\u00b1\5\u00b1\u06ff\n\u00b1\3\u00b2\3\u00b2\3\u00b3\5\u00b3\u0704\n\u00b3"+ - "\3\u00b3\3\u00b3\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5\3\u00b5\3\u00b5"+ - "\3\u00b5\3\u00b5\3\u00b6\3\u00b6\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u0716"+ - "\n\u00b6\5\u00b6\u0718\n\u00b6\3\u00b6\5\u00b6\u071b\n\u00b6\3\u00b6\5"+ - "\u00b6\u071e\n\u00b6\5\u00b6\u0720\n\u00b6\3\u00b6\3\u00b6\3\u00b7\3\u00b7"+ - "\3\u00b7\3\u00b7\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\5\u00b9"+ - "\u072e\n\u00b9\3\u00b9\3\u02df\4\u00a4\u00b4\u00ba\2\4\6\b\n\f\16\20\22"+ - "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ - "rtvxz|~\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\2\25\4\2ggrr\3\2\31\32\3\2\7\n\3\2CD\3\2*,\4\2*,..\3\2\u0085"+ - "\u008b\3\2\26\27\4\2\u0080\u0084\u0089\u008a\6\2%%ss\177\177\u0086\u0088"+ - "\3\2!#\3\2\36 \4\2JKy~\6\2//\62\62\65\65__\4\2\177\u0084\u0086\u008a\3"+ - "\2st\4\2pp\u00a1\u00a1\4\2\u008c\u008f\u0091\u0092\3\2\u0098\u0099\2\u0794"+ - "\2\u0172\3\2\2\2\4\u0175\3\2\2\2\6\u0178\3\2\2\2\b\u017b\3\2\2\2\n\u0183"+ - "\3\2\2\2\f\u018c\3\2\2\2\16\u01a7\3\2\2\2\20\u01aa\3\2\2\2\22\u01b2\3"+ - "\2\2\2\24\u01bf\3\2\2\2\26\u01d5\3\2\2\2\30\u01de\3\2\2\2\32\u01e0\3\2"+ - "\2\2\34\u01e2\3\2\2\2\36\u01e5\3\2\2\2 \u01f9\3\2\2\2\"\u01fb\3\2\2\2"+ - "$\u01fd\3\2\2\2&\u0202\3\2\2\2(\u020d\3\2\2\2*\u021a\3\2\2\2,\u021d\3"+ - "\2\2\2.\u0228\3\2\2\2\60\u022a\3\2\2\2\62\u022f\3\2\2\2\64\u0234\3\2\2"+ - "\2\66\u0239\3\2\2\28\u023e\3\2\2\2:\u024b\3\2\2\2<\u024d\3\2\2\2>\u024f"+ - "\3\2\2\2@\u0254\3\2\2\2B\u0259\3\2\2\2D\u025e\3\2\2\2F\u0267\3\2\2\2H"+ - "\u026e\3\2\2\2J\u027b\3\2\2\2L\u027f\3\2\2\2N\u028a\3\2\2\2P\u0292\3\2"+ - "\2\2R\u0294\3\2\2\2T\u02a9\3\2\2\2V\u02ab\3\2\2\2X\u02b7\3\2\2\2Z\u02c3"+ - "\3\2\2\2\\\u02d3\3\2\2\2^\u02df\3\2\2\2`\u02ee\3\2\2\2b\u02f1\3\2\2\2"+ - "d\u02f9\3\2\2\2f\u02fb\3\2\2\2h\u0306\3\2\2\2j\u030e\3\2\2\2l\u031d\3"+ - "\2\2\2n\u031f\3\2\2\2p\u0327\3\2\2\2r\u0335\3\2\2\2t\u0341\3\2\2\2v\u034b"+ - "\3\2\2\2x\u034f\3\2\2\2z\u0355\3\2\2\2|\u036d\3\2\2\2~\u0375\3\2\2\2\u0080"+ - "\u0384\3\2\2\2\u0082\u0386\3\2\2\2\u0084\u038d\3\2\2\2\u0086\u0396\3\2"+ - "\2\2\u0088\u039b\3\2\2\2\u008a\u03a0\3\2\2\2\u008c\u03a6\3\2\2\2\u008e"+ - "\u03ad\3\2\2\2\u0090\u03b2\3\2\2\2\u0092\u03b8\3\2\2\2\u0094\u03bd\3\2"+ - "\2\2\u0096\u03c4\3\2\2\2\u0098\u03ce\3\2\2\2\u009a\u03d2\3\2\2\2\u009c"+ - "\u03de\3\2\2\2\u009e\u03e1\3\2\2\2\u00a0\u03e5\3\2\2\2\u00a2\u03ec\3\2"+ - "\2\2\u00a4\u0405\3\2\2\2\u00a6\u0441\3\2\2\2\u00a8\u0443\3\2\2\2\u00aa"+ - "\u0446\3\2\2\2\u00ac\u044b\3\2\2\2\u00ae\u0454\3\2\2\2\u00b0\u0462\3\2"+ - "\2\2\u00b2\u046c\3\2\2\2\u00b4\u047a\3\2\2\2\u00b6\u0495\3\2\2\2\u00b8"+ - "\u0498\3\2\2\2\u00ba\u04a0\3\2\2\2\u00bc\u04a9\3\2\2\2\u00be\u04b9\3\2"+ - "\2\2\u00c0\u04cc\3\2\2\2\u00c2\u04d5\3\2\2\2\u00c4\u04e0\3\2\2\2\u00c6"+ - "\u04e2\3\2\2\2\u00c8\u04e5\3\2\2\2\u00ca\u04fc\3\2\2\2\u00cc\u04fe\3\2"+ - "\2\2\u00ce\u0503\3\2\2\2\u00d0\u0517\3\2\2\2\u00d2\u0519\3\2\2\2\u00d4"+ - "\u051b\3\2\2\2\u00d6\u051e\3\2\2\2\u00d8\u0528\3\2\2\2\u00da\u0532\3\2"+ - "\2\2\u00dc\u0535\3\2\2\2\u00de\u053a\3\2\2\2\u00e0\u053c\3\2\2\2\u00e2"+ - "\u054a\3\2\2\2\u00e4\u0552\3\2\2\2\u00e6\u055a\3\2\2\2\u00e8\u0562\3\2"+ - "\2\2\u00ea\u0570\3\2\2\2\u00ec\u0576\3\2\2\2\u00ee\u0584\3\2\2\2\u00f0"+ - "\u0590\3\2\2\2\u00f2\u0599\3\2\2\2\u00f4\u059b\3\2\2\2\u00f6\u059d\3\2"+ - "\2\2\u00f8\u05a1\3\2\2\2\u00fa\u05a4\3\2\2\2\u00fc\u05a8\3\2\2\2\u00fe"+ - "\u05aa\3\2\2\2\u0100\u05af\3\2\2\2\u0102\u05b3\3\2\2\2\u0104\u05b7\3\2"+ - "\2\2\u0106\u05bb\3\2\2\2\u0108\u05be\3\2\2\2\u010a\u05c0\3\2\2\2\u010c"+ - "\u05d5\3\2\2\2\u010e\u05d7\3\2\2\2\u0110\u05ed\3\2\2\2\u0112\u05f5\3\2"+ - "\2\2\u0114\u05f7\3\2\2\2\u0116\u060d\3\2\2\2\u0118\u0615\3\2\2\2\u011a"+ - "\u061d\3\2\2\2\u011c\u0621\3\2\2\2\u011e\u062d\3\2\2\2\u0120\u0637\3\2"+ - "\2\2\u0122\u0642\3\2\2\2\u0124\u064a\3\2\2\2\u0126\u064e\3\2\2\2\u0128"+ - "\u0657\3\2\2\2\u012a\u0661\3\2\2\2\u012c\u0666\3\2\2\2\u012e\u0668\3\2"+ - "\2\2\u0130\u066d\3\2\2\2\u0132\u066f\3\2\2\2\u0134\u0671\3\2\2\2\u0136"+ - "\u0674\3\2\2\2\u0138\u0678\3\2\2\2\u013a\u0683\3\2\2\2\u013c\u0687\3\2"+ - "\2\2\u013e\u068e\3\2\2\2\u0140\u0692\3\2\2\2\u0142\u0694\3\2\2\2\u0144"+ - "\u06a4\3\2\2\2\u0146\u06b1\3\2\2\2\u0148\u06b9\3\2\2\2\u014a\u06be\3\2"+ - "\2\2\u014c\u06c0\3\2\2\2\u014e\u06c2\3\2\2\2\u0150\u06c4\3\2\2\2\u0152"+ - "\u06c8\3\2\2\2\u0154\u06cb\3\2\2\2\u0156\u06d4\3\2\2\2\u0158\u06df\3\2"+ - "\2\2\u015a\u06e5\3\2\2\2\u015c\u06e9\3\2\2\2\u015e\u06eb\3\2\2\2\u0160"+ - "\u06fb\3\2\2\2\u0162\u0700\3\2\2\2\u0164\u0703\3\2\2\2\u0166\u0707\3\2"+ - "\2\2\u0168\u070b\3\2\2\2\u016a\u0710\3\2\2\2\u016c\u0723\3\2\2\2\u016e"+ - "\u0727\3\2\2\2\u0170\u072d\3\2\2\2\u0172\u0173\5\u00a4S\2\u0173\u0174"+ - "\7\2\2\3\u0174\3\3\2\2\2\u0175\u0176\5\u00a6T\2\u0176\u0177\7\2\2\3\u0177"+ - "\5\3\2\2\2\u0178\u0179\5\u00c2b\2\u0179\u017a\7\2\2\3\u017a\7\3\2\2\2"+ - "\u017b\u0180\5\n\6\2\u017c\u017d\7o\2\2\u017d\u017f\5\n\6\2\u017e\u017c"+ - "\3\2\2\2\u017f\u0182\3\2\2\2\u0180\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181"+ - "\t\3\2\2\2\u0182\u0180\3\2\2\2\u0183\u0185\7g\2\2\u0184\u0186\7>\2\2\u0185"+ - "\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\13\3\2\2\2\u0187\u0188\5\16\b"+ - "\2\u0188\u0189\5\u0170\u00b9\2\u0189\u018b\3\2\2\2\u018a\u0187\3\2\2\2"+ - "\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u018f"+ - "\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0190\5\u00dan\2\u0190\u0196\5\u0170"+ - "\u00b9\2\u0191\u0192\5\24\13\2\u0192\u0193\5\u0170\u00b9\2\u0193\u0195"+ - "\3\2\2\2\u0194\u0191\3\2\2\2\u0195\u0198\3\2\2\2\u0196\u0194\3\2\2\2\u0196"+ - "\u0197\3\2\2\2\u0197\u01a2\3\2\2\2\u0198\u0196\3\2\2\2\u0199\u019d\5\u0088"+ - "E\2\u019a\u019d\5\u00dep\2\u019b\u019d\5\26\f\2\u019c\u0199\3\2\2\2\u019c"+ - "\u019a\3\2\2\2\u019c\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u019f\5\u0170"+ - "\u00b9\2\u019f\u01a1\3\2\2\2\u01a0\u019c\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ - "\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a5\3\2\2\2\u01a4\u01a2\3\2"+ - "\2\2\u01a5\u01a6\7\2\2\3\u01a6\r\3\2\2\2\u01a7\u01a8\7G\2\2\u01a8\u01a9"+ - "\5\u00a4S\2\u01a9\17\3\2\2\2\u01aa\u01ab\7H\2\2\u01ab\u01ac\5\u00a4S\2"+ - "\u01ac\21\3\2\2\2\u01ad\u01ae\5\20\t\2\u01ae\u01af\5\u0170\u00b9\2\u01af"+ - "\u01b1\3\2\2\2\u01b0\u01ad\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2"+ - "\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5"+ - "\u01b7\t\2\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\3\2"+ - "\2\2\u01b8\u01b9\5\u00dco\2\u01b9\23\3\2\2\2\u01ba\u01bb\5\20\t\2\u01bb"+ - "\u01bc\5\u0170\u00b9\2\u01bc\u01be\3\2\2\2\u01bd\u01ba\3\2\2\2\u01be\u01c1"+ - "\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01cf\3\2\2\2\u01c1"+ - "\u01bf\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01d0\5\22\n\2\u01c4\u01c5\7c"+ - "\2\2\u01c5\u01cb\7h\2\2\u01c6\u01c7\5\22\n\2\u01c7\u01c8\5\u0170\u00b9"+ - "\2\u01c8\u01ca\3\2\2\2\u01c9\u01c6\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9"+ - "\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce"+ - "\u01d0\7i\2\2\u01cf\u01c2\3\2\2\2\u01cf\u01c4\3\2\2\2\u01d0\25\3\2\2\2"+ - "\u01d1\u01d6\5z>\2\u01d2\u01d6\5\u0090I\2\u01d3\u01d6\5\u0094K\2\u01d4"+ - "\u01d6\5\u008eH\2\u01d5\u01d1\3\2\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d3"+ - "\3\2\2\2\u01d5\u01d4\3\2\2\2\u01d6\27\3\2\2\2\u01d7\u01d8\7\35\2\2\u01d8"+ - "\u01df\5\u00a6T\2\u01d9\u01da\t\3\2\2\u01da\u01df\5.\30\2\u01db\u01dc"+ - "\t\4\2\2\u01dc\u01df\5\u00a4S\2\u01dd\u01df\5f\64\2\u01de\u01d7\3\2\2"+ - "\2\u01de\u01d9\3\2\2\2\u01de\u01db\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\31"+ - "\3\2\2\2\u01e0\u01e1\5\34\17\2\u01e1\33\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3"+ - "\u01e4\5\36\20\2\u01e4\35\3\2\2\2\u01e5\u01e6\7F\2\2\u01e6\u01e8\7h\2"+ - "\2\u01e7\u01e9\5\u00f0y\2\u01e8\u01e7\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9"+ - "\u01ea\3\2\2\2\u01ea\u01eb\7i\2\2\u01eb\37\3\2\2\2\u01ec\u01fa\5F$\2\u01ed"+ - "\u01fa\5D#\2\u01ee\u01fa\5B\"\2\u01ef\u01fa\5$\23\2\u01f0\u01fa\5@!\2"+ - "\u01f1\u01fa\58\35\2\u01f2\u01fa\5> \2\u01f3\u01fa\5\66\34\2\u01f4\u01fa"+ - "\5\62\32\2\u01f5\u01fa\5\60\31\2\u01f6\u01fa\5\64\33\2\u01f7\u01fa\5\""+ - "\22\2\u01f8\u01fa\5H%\2\u01f9\u01ec\3\2\2\2\u01f9\u01ed\3\2\2\2\u01f9"+ - "\u01ee\3\2\2\2\u01f9\u01ef\3\2\2\2\u01f9\u01f0\3\2\2\2\u01f9\u01f1\3\2"+ - "\2\2\u01f9\u01f2\3\2\2\2\u01f9\u01f3\3\2\2\2\u01f9\u01f4\3\2\2\2\u01f9"+ - "\u01f5\3\2\2\2\u01f9\u01f6\3\2\2\2\u01f9\u01f7\3\2\2\2\u01f9\u01f8\3\2"+ - "\2\2\u01fa!\3\2\2\2\u01fb\u01fc\t\5\2\2\u01fc#\3\2\2\2\u01fd\u01fe\7`"+ - "\2\2\u01fe\u01ff\7l\2\2\u01ff\u0200\5\u00c2b\2\u0200\u0201\7m\2\2\u0201"+ - "%\3\2\2\2\u0202\u0207\5(\25\2\u0203\u0204\7o\2\2\u0204\u0206\5(\25\2\u0205"+ - "\u0203\3\2\2\2\u0206\u0209\3\2\2\2\u0207\u0205\3\2\2\2\u0207\u0208\3\2"+ - "\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u020a\u020c\7o\2\2\u020b"+ - "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\'\3\2\2\2\u020d\u0212\7g\2\2"+ - "\u020e\u020f\7o\2\2\u020f\u0211\7g\2\2\u0210\u020e\3\2\2\2\u0211\u0214"+ - "\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+ - "\u0212\3\2\2\2\u0215\u0216\5\u0132\u009a\2\u0216)\3\2\2\2\u0217\u0219"+ - "\5,\27\2\u0218\u0217\3\2\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+ - "\u021b\3\2\2\2\u021b+\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\7j\2\2\u021e"+ - "\u0223\5\u00a4S\2\u021f\u0220\7o\2\2\u0220\u0222\5\u00a4S\2\u0221\u021f"+ - "\3\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ - "\u0226\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7k\2\2\u0227-\3\2\2\2\u0228"+ - "\u0229\5\u00b4[\2\u0229/\3\2\2\2\u022a\u022b\7\63\2\2\u022b\u022c\7h\2"+ - "\2\u022c\u022d\5\u00a4S\2\u022d\u022e\7i\2\2\u022e\61\3\2\2\2\u022f\u0230"+ - "\79\2\2\u0230\u0231\7l\2\2\u0231\u0232\5\u00c2b\2\u0232\u0233\7m\2\2\u0233"+ - "\63\3\2\2\2\u0234\u0235\7\64\2\2\u0235\u0236\7h\2\2\u0236\u0237\5\u00a4"+ - "S\2\u0237\u0238\7i\2\2\u0238\65\3\2\2\2\u0239\u023a\t\6\2\2\u023a\u023b"+ - "\7h\2\2\u023b\u023c\5\u00a4S\2\u023c\u023d\7i\2\2\u023d\67\3\2\2\2\u023e"+ - "\u0243\7\23\2\2\u023f\u0240\7l\2\2\u0240\u0241\5:\36\2\u0241\u0242\7m"+ - "\2\2\u0242\u0244\3\2\2\2\u0243\u023f\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+ - "\u0245\3\2\2\2\u0245\u0246\7h\2\2\u0246\u0247\5\u00a4S\2\u0247\u0248\7"+ - "i\2\2\u02489\3\2\2\2\u0249\u024c\5<\37\2\u024a\u024c\7\25\2\2\u024b\u0249"+ - "\3\2\2\2\u024b\u024a\3\2\2\2\u024c;\3\2\2\2\u024d\u024e\7g\2\2\u024e="+ - "\3\2\2\2\u024f\u0250\7\24\2\2\u0250\u0251\7h\2\2\u0251\u0252\5\u00a4S"+ - "\2\u0252\u0253\7i\2\2\u0253?\3\2\2\2\u0254\u0255\7<\2\2\u0255\u0256\7"+ - "h\2\2\u0256\u0257\5\u00a4S\2\u0257\u0258\7i\2\2\u0258A\3\2\2\2\u0259\u025a"+ - "\7;\2\2\u025a\u025b\7h\2\2\u025b\u025c\5\u00a4S\2\u025c\u025d\7i\2\2\u025d"+ - "C\3\2\2\2\u025e\u025f\7\30\2\2\u025f\u0260\7h\2\2\u0260\u0263\5\u00a4"+ - "S\2\u0261\u0262\7o\2\2\u0262\u0264\5\u00a4S\2\u0263\u0261\3\2\2\2\u0263"+ - "\u0264\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266\7i\2\2\u0266E\3\2\2\2\u0267"+ - "\u0268\t\6\2\2\u0268\u0269\7l\2\2\u0269\u026a\5\u00a4S\2\u026a\u026b\7"+ - "?\2\2\u026b\u026c\5\u00a4S\2\u026c\u026d\7m\2\2\u026dG\3\2\2\2\u026e\u026f"+ - "\78\2\2\u026f\u0270\5\u00a4S\2\u0270\u0276\7j\2\2\u0271\u0272\5J&\2\u0272"+ - "\u0273\5\u0170\u00b9\2\u0273\u0275\3\2\2\2\u0274\u0271\3\2\2\2\u0275\u0278"+ - "\3\2\2\2\u0276\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0279\3\2\2\2\u0278"+ - "\u0276\3\2\2\2\u0279\u027a\7k\2\2\u027aI\3\2\2\2\u027b\u027c\5j\66\2\u027c"+ - "\u027d\7q\2\2\u027d\u027e\5\u00a4S\2\u027eK\3\2\2\2\u027f\u0280\7l\2\2"+ - "\u0280\u0285\5N(\2\u0281\u0282\7o\2\2\u0282\u0284\5N(\2\u0283\u0281\3"+ - "\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2\2\2\u0286"+ - "\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u0289\7m\2\2\u0289M\3\2\2\2\u028a"+ - "\u028b\5\u00a4S\2\u028b\u028c\7n\2\2\u028c\u028d\5\u00a4S\2\u028dO\3\2"+ - "\2\2\u028e\u0293\5\\/\2\u028f\u0293\5Z.\2\u0290\u0293\5R*\2\u0291\u0293"+ - "\5V,\2\u0292\u028e\3\2\2\2\u0292\u028f\3\2\2\2\u0292\u0290\3\2\2\2\u0292"+ - "\u0291\3\2\2\2\u0293Q\3\2\2\2\u0294\u0295\7\65\2\2\u0295\u029b\7j\2\2"+ - "\u0296\u0297\5T+\2\u0297\u0298\5\u0170\u00b9\2\u0298\u029a\3\2\2\2\u0299"+ - "\u0296\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c\3\2"+ - "\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7k\2\2\u029f"+ - "S\3\2\2\2\u02a0\u02a1\7O\2\2\u02a1\u02a2\7g\2\2\u02a2\u02aa\5\u013e\u00a0"+ - "\2\u02a3\u02a4\7\66\2\2\u02a4\u02a5\7j\2\2\u02a5\u02a6\5\u00a4S\2\u02a6"+ - "\u02a7\5\u0170\u00b9\2\u02a7\u02a8\7k\2\2\u02a8\u02aa\3\2\2\2\u02a9\u02a0"+ - "\3\2\2\2\u02a9\u02a3\3\2\2\2\u02aaU\3\2\2\2\u02ab\u02ac\7\67\2\2\u02ac"+ - "\u02b2\7j\2\2\u02ad\u02ae\5X-\2\u02ae\u02af\5\u0170\u00b9\2\u02af\u02b1"+ - "\3\2\2\2\u02b0\u02ad\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b2"+ - "\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b6\7k"+ - "\2\2\u02b6W\3\2\2\2\u02b7\u02b8\7g\2\2\u02b8\u02be\7j\2\2\u02b9\u02ba"+ - "\5\u0160\u00b1\2\u02ba\u02bb\5\u0170\u00b9\2\u02bb\u02bd\3\2\2\2\u02bc"+ - "\u02b9\3\2\2\2\u02bd\u02c0\3\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2"+ - "\2\2\u02bf\u02c1\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1\u02c2\7k\2\2\u02c2"+ - "Y\3\2\2\2\u02c3\u02c4\7\35\2\2\u02c4\u02c5\7l\2\2\u02c5\u02c6\7m\2\2\u02c6"+ - "\u02c7\5\u0132\u009a\2\u02c7[\3\2\2\2\u02c8\u02c9\t\7\2\2\u02c9\u02ca"+ - "\7l\2\2\u02ca\u02cb\5\u00c2b\2\u02cb\u02cc\7m\2\2\u02cc\u02d4\3\2\2\2"+ - "\u02cd\u02ce\7-\2\2\u02ce\u02cf\7l\2\2\u02cf\u02d0\5\u00c2b\2\u02d0\u02d1"+ - "\7m\2\2\u02d1\u02d2\5\u00c2b\2\u02d2\u02d4\3\2\2\2\u02d3\u02c8\3\2\2\2"+ - "\u02d3\u02cd\3\2\2\2\u02d4]\3\2\2\2\u02d5\u02db\5`\61\2\u02d6\u02d7\7"+ - "\20\2\2\u02d7\u02db\b\60\1\2\u02d8\u02d9\7E\2\2\u02d9\u02db\b\60\1\2\u02da"+ - "\u02d5\3\2\2\2\u02da\u02d6\3\2\2\2\u02da\u02d8\3\2\2\2\u02db\u02dc\3\2"+ - "\2\2\u02dc\u02de\5\u0170\u00b9\2\u02dd\u02da\3\2\2\2\u02de\u02e1\3\2\2"+ - "\2\u02df\u02e0\3\2\2\2\u02df\u02dd\3\2\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02df"+ - "\3\2\2\2\u02e2\u02e3\7\20\2\2\u02e3\u02e5\b\60\1\2\u02e4\u02e2\3\2\2\2"+ - "\u02e4\u02e5\3\2\2\2\u02e5_\3\2\2\2\u02e6\u02e7\7\13\2\2\u02e7\u02ef\5"+ - "d\63\2\u02e8\u02e9\7\f\2\2\u02e9\u02ef\5d\63\2\u02ea\u02eb\7\r\2\2\u02eb"+ - "\u02ef\5d\63\2\u02ec\u02ed\7\17\2\2\u02ed\u02ef\5b\62\2\u02ee\u02e6\3"+ - "\2\2\2\u02ee\u02e8\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ef"+ - "a\3\2\2\2\u02f0\u02f2\5\u00e6t\2\u02f1\u02f0\3\2\2\2\u02f1\u02f2\3\2\2"+ - "\2\u02f2\u02f5\3\2\2\2\u02f3\u02f4\7^\2\2\u02f4\u02f6\5\u00a4S\2\u02f5"+ - "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6c\3\2\2\2\u02f7\u02fa\3\2\2\2"+ - "\u02f8\u02fa\5\u00a4S\2\u02f9\u02f7\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa"+ - "e\3\2\2\2\u02fb\u02fc\78\2\2\u02fc\u02fd\5\u00a4S\2\u02fd\u0301\7j\2\2"+ - "\u02fe\u0300\5h\65\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff"+ - "\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304"+ - "\u0305\7k\2\2\u0305g\3\2\2\2\u0306\u0307\5j\66\2\u0307\u0309\7q\2\2\u0308"+ - "\u030a\5\u00f0y\2\u0309\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ai\3\2\2"+ - "\2\u030b\u030c\7R\2\2\u030c\u030f\5l\67\2\u030d\u030f\7N\2\2\u030e\u030b"+ - "\3\2\2\2\u030e\u030d\3\2\2\2\u030fk\3\2\2\2\u0310\u0311\7\'\2\2\u0311"+ - "\u031e\7g\2\2\u0312\u0313\5\u00caf\2\u0313\u0318\7j\2\2\u0314\u0316\5"+ - "n8\2\u0315\u0317\7o\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317"+ - "\u0319\3\2\2\2\u0318\u0314\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u031a\3\2"+ - "\2\2\u031a\u031b\7k\2\2\u031b\u031e\3\2\2\2\u031c\u031e\5\u00a4S\2\u031d"+ - "\u0310\3\2\2\2\u031d\u0312\3\2\2\2\u031d\u031c\3\2\2\2\u031em\3\2\2\2"+ - "\u031f\u0324\5l\67\2\u0320\u0321\7o\2\2\u0321\u0323\5l\67\2\u0322\u0320"+ - "\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+ - "o\3\2\2\2\u0326\u0324\3\2\2\2\u0327\u032c\7j\2\2\u0328\u0329\7=\2\2\u0329"+ - "\u032a\5\u00e4s\2\u032a\u032b\5\u0170\u00b9\2\u032b\u032d\3\2\2\2\u032c"+ - "\u0328\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032f\3\2\2\2\u032e\u0330\5\u00f0"+ - "y\2\u032f\u032e\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0331\3\2\2\2\u0331"+ - "\u0332\7k\2\2\u0332q\3\2\2\2\u0333\u0336\5\u0150\u00a9\2\u0334\u0336\7"+ - "g\2\2\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u033f\3\2\2\2\u0337"+ - "\u033c\7j\2\2\u0338\u033a\5t;\2\u0339\u033b\7o\2\2\u033a\u0339\3\2\2\2"+ - "\u033a\u033b\3\2\2\2\u033b\u033d\3\2\2\2\u033c\u0338\3\2\2\2\u033c\u033d"+ - "\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u0340\7k\2\2\u033f\u0337\3\2\2\2\u033f"+ - "\u0340\3\2\2\2\u0340s\3\2\2\2\u0341\u0346\5v<\2\u0342\u0343\7o\2\2\u0343"+ - "\u0345\5v<\2\u0344\u0342\3\2\2\2\u0345\u0348\3\2\2\2\u0346\u0344\3\2\2"+ - "\2\u0346\u0347\3\2\2\2\u0347u\3\2\2\2\u0348\u0346\3\2\2\2\u0349\u034a"+ - "\7g\2\2\u034a\u034c\7q\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c"+ - "\u034d\3\2\2\2\u034d\u034e\5\u00a4S\2\u034ew\3\2\2\2\u034f\u0350\7I\2"+ - "\2\u0350\u0351\5\u00a4S\2\u0351\u0352\7\21\2\2\u0352\u0353\5r:\2\u0353"+ - "\u0354\5\u00eex\2\u0354y\3\2\2\2\u0355\u0356\5\u00c2b\2\u0356\u0357\7"+ - "\21\2\2\u0357\u036a\5\u00c2b\2\u0358\u035e\7j\2\2\u0359\u035a\5\u0082"+ - "B\2\u035a\u035b\5\u0170\u00b9\2\u035b\u035d\3\2\2\2\u035c\u0359\3\2\2"+ - "\2\u035d\u0360\3\2\2\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0366"+ - "\3\2\2\2\u0360\u035e\3\2\2\2\u0361\u0362\5|?\2\u0362\u0363\5\u0170\u00b9"+ - "\2\u0363\u0365\3\2\2\2\u0364\u0361\3\2\2\2\u0365\u0368\3\2\2\2\u0366\u0364"+ - "\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u0369\3\2\2\2\u0368\u0366\3\2\2\2\u0369"+ - "\u036b\7k\2\2\u036a\u0358\3\2\2\2\u036a\u036b\3\2\2\2\u036b{\3\2\2\2\u036c"+ - "\u036e\7\20\2\2\u036d\u036c\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036f\3"+ - "\2\2\2\u036f\u0370\5~@\2\u0370\u0371\7g\2\2\u0371\u0373\5\u013e\u00a0"+ - "\2\u0372\u0374\5\u00eex\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374"+ - "}\3\2\2\2\u0375\u0377\7h\2\2\u0376\u0378\7g\2\2\u0377\u0376\3\2\2\2\u0377"+ - "\u0378\3\2\2\2\u0378\u037a\3\2\2\2\u0379\u037b\7\u0089\2\2\u037a\u0379"+ - "\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\5\u012c\u0097"+ - "\2\u037d\u037e\7i\2\2\u037e\177\3\2\2\2\u037f\u0385\5\u00b4[\2\u0380\u0381"+ - "\5\u00c2b\2\u0381\u0382\7r\2\2\u0382\u0383\7g\2\2\u0383\u0385\3\2\2\2"+ - "\u0384\u037f\3\2\2\2\u0384\u0380\3\2\2\2\u0385\u0081\3\2\2\2\u0386\u0387"+ - "\7:\2\2\u0387\u0388\7g\2\2\u0388\u038b\7u\2\2\u0389\u038c\5\u0080A\2\u038a"+ - "\u038c\5\u014e\u00a8\2\u038b\u0389\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u0083"+ - "\3\2\2\2\u038d\u038e\7\61\2\2\u038e\u038f\7h\2\2\u038f\u0392\5\u00c2b"+ - "\2\u0390\u0391\7o\2\2\u0391\u0393\5\u00e6t\2\u0392\u0390\3\2\2\2\u0392"+ - "\u0393\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0395\7i\2\2\u0395\u0085\3\2"+ - "\2\2\u0396\u0397\7\60\2\2\u0397\u0398\7h\2\2\u0398\u0399\5\u00c2b\2\u0399"+ - "\u039a\7i\2\2\u039a\u0087\3\2\2\2\u039b\u039e\5^\60\2\u039c\u039f\5\u008a"+ - "F\2\u039d\u039f\5\u008cG\2\u039e\u039c\3\2\2\2\u039e\u039d\3\2\2\2\u039f"+ - "\u0089\3\2\2\2\u03a0\u03a1\7O\2\2\u03a1\u03a2\7g\2\2\u03a2\u03a4\5\u013e"+ - "\u00a0\2\u03a3\u03a5\5p9\2\u03a4\u03a3\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5"+ - "\u008b\3\2\2\2\u03a6\u03a7\7O\2\2\u03a7\u03a8\5\u009aN\2\u03a8\u03a9\7"+ - "g\2\2\u03a9\u03ab\5\u013e\u00a0\2\u03aa\u03ac\5p9\2\u03ab\u03aa\3\2\2"+ - "\2\u03ab\u03ac\3\2\2\2\u03ac\u008d\3\2\2\2\u03ad\u03b0\7\35\2\2\u03ae"+ - "\u03b1\5\u0088E\2\u03af\u03b1\5\u00dep\2\u03b0\u03ae\3\2\2\2\u03b0\u03af"+ - "\3\2\2\2\u03b1\u008f\3\2\2\2\u03b2\u03b3\7:\2\2\u03b3\u03b4\7g\2\2\u03b4"+ - "\u03b6\5\u0142\u00a2\2\u03b5\u03b7\5\u0092J\2\u03b6\u03b5\3\2\2\2\u03b6"+ - "\u03b7\3\2\2\2\u03b7\u0091\3\2\2\2\u03b8\u03b9\7j\2\2\u03b9\u03ba\5\u00a4"+ - "S\2\u03ba\u03bb\5\u0170\u00b9\2\u03bb\u03bc\7k\2\2\u03bc\u0093\3\2\2\2"+ - "\u03bd\u03be\7:\2\2\u03be\u03bf\5\u009aN\2\u03bf\u03c0\7g\2\2\u03c0\u03c2"+ - "\5\u0142\u00a2\2\u03c1\u03c3\5\u0092J\2\u03c2\u03c1\3\2\2\2\u03c2\u03c3"+ - "\3\2\2\2\u03c3\u0095\3\2\2\2\u03c4\u03cc\5\b\5\2\u03c5\u03c8\5\u00c2b"+ - "\2\u03c6\u03c7\7n\2\2\u03c7\u03c9\5\u00e6t\2\u03c8\u03c6\3\2\2\2\u03c8"+ - "\u03c9\3\2\2\2\u03c9\u03cd\3\2\2\2\u03ca\u03cb\7n\2\2\u03cb\u03cd\5\u00e6"+ - "t\2\u03cc\u03c5\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u0097\3\2\2\2\u03ce"+ - "\u03cf\5\b\5\2\u03cf\u03d0\7u\2\2\u03d0\u03d1\5\u00e6t\2\u03d1\u0099\3"+ - "\2\2\2\u03d2\u03d4\7h\2\2\u03d3\u03d5\5\n\6\2\u03d4\u03d3\3\2\2\2\u03d4"+ - "\u03d5\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\5\u00c2b\2\u03d7\u03d9"+ - "\7o\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ - "\u03db\7i\2\2\u03db\u009b\3\2\2\2\u03dc\u03df\5\u009eP\2\u03dd\u03df\5"+ - "\u00a0Q\2\u03de\u03dc\3\2\2\2\u03de\u03dd\3\2\2\2\u03df\u009d\3\2\2\2"+ - "\u03e0\u03e2\5\u00e4s\2\u03e1\u03e0\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2"+ - "\u03e3\3\2\2\2\u03e3\u03e4\5\u00a2R\2\u03e4\u009f\3\2\2\2\u03e5\u03e7"+ - "\7\35\2\2\u03e6\u03e8\5\u00e4s\2\u03e7\u03e6\3\2\2\2\u03e7\u03e8\3\2\2"+ - "\2\u03e8\u03e9\3\2\2\2\u03e9\u03ea\5\u00a2R\2\u03ea\u00a1\3\2\2\2\u03eb"+ - "\u03ed\7v\2\2\u03ec\u03eb\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+ - "\2\2\u03ee\u03ef\5\u00c2b\2\u03ef\u00a3\3\2\2\2\u03f0\u03f1\bS\1\2\u03f1"+ - "\u03f2\t\b\2\2\u03f2\u0406\5\u00a4S\21\u03f3\u0406\5\u00b4[\2\u03f4\u03f5"+ - "\7\33\2\2\u03f5\u03f6\5.\30\2\u03f6\u03f7\7\36\2\2\u03f7\u03f8\5\u00a4"+ - "S\5\u03f8\u0406\3\2\2\2\u03f9\u03fa\7\34\2\2\u03fa\u03fb\5\u0098M\2\u03fb"+ - "\u03fc\7\36\2\2\u03fc\u03fd\5\u00a4S\4\u03fd\u0406\3\2\2\2\u03fe\u03ff"+ - "\t\t\2\2\u03ff\u0400\5&\24\2\u0400\u0401\7q\2\2\u0401\u0402\7q\2\2\u0402"+ - "\u0403\5*\26\2\u0403\u0404\5\u00a4S\3\u0404\u0406\3\2\2\2\u0405\u03f0"+ - "\3\2\2\2\u0405\u03f3\3\2\2\2\u0405\u03f4\3\2\2\2\u0405\u03f9\3\2\2\2\u0405"+ - "\u03fe\3\2\2\2\u0406\u042a\3\2\2\2\u0407\u0408\f\17\2\2\u0408\u0409\t"+ - "\n\2\2\u0409\u0429\5\u00a4S\20\u040a\u040b\f\16\2\2\u040b\u040c\t\13\2"+ - "\2\u040c\u0429\5\u00a4S\17\u040d\u040e\f\r\2\2\u040e\u040f\t\f\2\2\u040f"+ - "\u0429\5\u00a4S\16\u0410\u0411\f\f\2\2\u0411\u0412\t\r\2\2\u0412\u0429"+ - "\5\u00a4S\r\u0413\u0414\f\13\2\2\u0414\u0415\t\16\2\2\u0415\u0429\5\u00a4"+ - "S\f\u0416\u0417\f\t\2\2\u0417\u0418\7x\2\2\u0418\u0429\5\u00a4S\n\u0419"+ - "\u041a\f\b\2\2\u041a\u041b\7w\2\2\u041b\u0429\5\u00a4S\t\u041c\u041d\f"+ - "\7\2\2\u041d\u041e\7$\2\2\u041e\u0429\5\u00a4S\7\u041f\u0420\f\6\2\2\u0420"+ - "\u0421\7\'\2\2\u0421\u0422\5\u00a4S\2\u0422\u0423\7q\2\2\u0423\u0424\5"+ - "\u00a4S\6\u0424\u0429\3\2\2\2\u0425\u0426\f\n\2\2\u0426\u0427\7\21\2\2"+ - "\u0427\u0429\5r:\2\u0428\u0407\3\2\2\2\u0428\u040a\3\2\2\2\u0428\u040d"+ - "\3\2\2\2\u0428\u0410\3\2\2\2\u0428\u0413\3\2\2\2\u0428\u0416\3\2\2\2\u0428"+ - "\u0419\3\2\2\2\u0428\u041c\3\2\2\2\u0428\u041f\3\2\2\2\u0428\u0425\3\2"+ - "\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a\u042b\3\2\2\2\u042b"+ - "\u00a5\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0442\5\30\r\2\u042e\u0442\5"+ - "\32\16\2\u042f\u0442\5\u00aaV\2\u0430\u0442\5\u00a8U\2\u0431\u0442\5\u00de"+ - "p\2\u0432\u0442\5\u00fe\u0080\2\u0433\u0442\5\u00f2z\2\u0434\u0442\5\u012a"+ - "\u0096\2\u0435\u0442\5\u0100\u0081\2\u0436\u0442\5\u0102\u0082\2\u0437"+ - "\u0442\5\u0104\u0083\2\u0438\u0442\5\u0106\u0084\2\u0439\u0442\5\u0108"+ - "\u0085\2\u043a\u0442\5\u00eex\2\u043b\u0442\5\u010a\u0086\2\u043c\u0442"+ - "\5\u010c\u0087\2\u043d\u0442\5\u011e\u0090\2\u043e\u0442\5\u00acW\2\u043f"+ - "\u0442\5\u00b0Y\2\u0440\u0442\5x=\2\u0441\u042d\3\2\2\2\u0441\u042e\3"+ - "\2\2\2\u0441\u042f\3\2\2\2\u0441\u0430\3\2\2\2\u0441\u0431\3\2\2\2\u0441"+ - "\u0432\3\2\2\2\u0441\u0433\3\2\2\2\u0441\u0434\3\2\2\2\u0441\u0435\3\2"+ - "\2\2\u0441\u0436\3\2\2\2\u0441\u0437\3\2\2\2\u0441\u0438\3\2\2\2\u0441"+ - "\u0439\3\2\2\2\u0441\u043a\3\2\2\2\u0441\u043b\3\2\2\2\u0441\u043c\3\2"+ - "\2\2\u0441\u043d\3\2\2\2\u0441\u043e\3\2\2\2\u0441\u043f\3\2\2\2\u0441"+ - "\u0440\3\2\2\2\u0442\u00a7\3\2\2\2\u0443\u0444\7&\2\2\u0444\u0445\5\u00a4"+ - "S\2\u0445\u00a9\3\2\2\2\u0446\u0447\7Z\2\2\u0447\u0449\5\u00a4S\2\u0448"+ - "\u044a\5\u00eex\2\u0449\u0448\3\2\2\2\u0449\u044a\3\2\2\2\u044a\u00ab"+ - "\3\2\2\2\u044b\u044c\5\u00aeX\2\u044c\u044d\5\u0126\u0094\2\u044d\u00ad"+ - "\3\2\2\2\u044e\u044f\7\16\2\2\u044f\u0450\5\u00a4S\2\u0450\u0451\5\u0170"+ - "\u00b9\2\u0451\u0453\3\2\2\2\u0452\u044e\3\2\2\2\u0453\u0456\3\2\2\2\u0454"+ - "\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u045b\3\2\2\2\u0456\u0454\3\2"+ - "\2\2\u0457\u0458\7\17\2\2\u0458\u0459\5b\62\2\u0459\u045a\5\u0170\u00b9"+ - "\2\u045a\u045c\3\2\2\2\u045b\u0457\3\2\2\2\u045b\u045c\3\2\2\2\u045c\u00af"+ - "\3\2\2\2\u045d\u045e\7S\2\2\u045e\u0463\5\u00a4S\2\u045f\u0460\7S\2\2"+ - "\u0460\u0461\t\3\2\2\u0461\u0463\5.\30\2\u0462\u045d\3\2\2\2\u0462\u045f"+ - "\3\2\2\2\u0463\u00b1\3\2\2\2\u0464\u046d\7\5\2\2\u0465\u046d\7\6\2\2\u0466"+ - "\u046d\7f\2\2\u0467\u046d\5\u014c\u00a7\2\u0468\u046d\5\u0162\u00b2\2"+ - "\u0469\u046d\7\3\2\2\u046a\u046d\7\u0091\2\2\u046b\u046d\7\u0092\2\2\u046c"+ - "\u0464\3\2\2\2\u046c\u0465\3\2\2\2\u046c\u0466\3\2\2\2\u046c\u0467\3\2"+ - "\2\2\u046c\u0468\3\2\2\2\u046c\u0469\3\2\2\2\u046c\u046a\3\2\2\2\u046c"+ - "\u046b\3\2\2\2\u046d\u00b3\3\2\2\2\u046e\u046f\b[\1\2\u046f\u047b\5\u0148"+ - "\u00a5\2\u0470\u047b\5\u0144\u00a3\2\u0471\u047b\5\u016c\u00b7\2\u0472"+ - "\u047b\5 \21\2\u0473\u047b\5\u0086D\2\u0474\u047b\5\u0084C\2\u0475\u0476"+ - "\t\17\2\2\u0476\u0477\7h\2\2\u0477\u0478\5\u00a4S\2\u0478\u0479\7i\2\2"+ - "\u0479\u047b\3\2\2\2\u047a\u046e\3\2\2\2\u047a\u0470\3\2\2\2\u047a\u0471"+ - "\3\2\2\2\u047a\u0472\3\2\2\2\u047a\u0473\3\2\2\2\u047a\u0474\3\2\2\2\u047a"+ - "\u0475\3\2\2\2\u047b\u0492\3\2\2\2\u047c\u047d\f\13\2\2\u047d\u047e\7"+ - "r\2\2\u047e\u0491\7g\2\2\u047f\u0480\f\n\2\2\u0480\u0491\5\u0166\u00b4"+ - "\2\u0481\u0482\f\t\2\2\u0482\u0491\5\u00ceh\2\u0483\u0484\f\b\2\2\u0484"+ - "\u0491\5L\'\2\u0485\u0486\f\7\2\2\u0486\u0491\5\u0168\u00b5\2\u0487\u0488"+ - "\f\6\2\2\u0488\u0491\5\u016a\u00b6\2\u0489\u048a\f\5\2\2\u048a\u048b\5"+ - "\u016a\u00b6\2\u048b\u048c\7\22\2\2\u048c\u048d\5r:\2\u048d\u0491\3\2"+ - "\2\2\u048e\u048f\f\4\2\2\u048f\u0491\5\u00ba^\2\u0490\u047c\3\2\2\2\u0490"+ - "\u047f\3\2\2\2\u0490\u0481\3\2\2\2\u0490\u0483\3\2\2\2\u0490\u0485\3\2"+ - "\2\2\u0490\u0487\3\2\2\2\u0490\u0489\3\2\2\2\u0490\u048e\3\2\2\2\u0491"+ - "\u0494\3\2\2\2\u0492\u0490\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u00b5\3\2"+ - "\2\2\u0494\u0492\3\2\2\2\u0495\u0496\5^\60\2\u0496\u0497\5\u00b8]\2\u0497"+ - "\u00b7\3\2\2\2\u0498\u049a\7O\2\2\u0499\u049b\7g\2\2\u049a\u0499\3\2\2"+ - "\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u013e\u00a0\2"+ - "\u049d\u049f\5p9\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u00b9"+ - "\3\2\2\2\u04a0\u04a2\7(\2\2\u04a1\u04a3\5\u00e6t\2\u04a2\u04a1\3\2\2\2"+ - "\u04a2\u04a3\3\2\2\2\u04a3\u04a5\3\2\2\2\u04a4\u04a6\7o\2\2\u04a5\u04a4"+ - "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7\u04a8\7)\2\2\u04a8"+ - "\u00bb\3\2\2\2\u04a9\u04aa\7P\2\2\u04aa\u04b4\7j\2\2\u04ab\u04af\5\u00c0"+ - "a\2\u04ac\u04af\5\u012c\u0097\2\u04ad\u04af\5\u00be`\2\u04ae\u04ab\3\2"+ - "\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04ad\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\5\u0170\u00b9\2\u04b1\u04b3\3\2\2\2\u04b2\u04ae\3\2\2\2\u04b3\u04b6"+ - "\3\2\2\2\u04b4\u04b2\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b7\3\2\2\2\u04b6"+ - "\u04b4\3\2\2\2\u04b7\u04b8\7k\2\2\u04b8\u00bd\3\2\2\2\u04b9\u04ba\7:\2"+ - "\2\u04ba\u04bb\7g\2\2\u04bb\u04bc\5\u0142\u00a2\2\u04bc\u00bf\3\2\2\2"+ - "\u04bd\u04bf\7\35\2\2\u04be\u04bd\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf\u04c0"+ - "\3\2\2\2\u04c0\u04c1\5^\60\2\u04c1\u04c2\7g\2\2\u04c2\u04c3\5\u0142\u00a2"+ - "\2\u04c3\u04c4\5\u0140\u00a1\2\u04c4\u04cd\3\2\2\2\u04c5\u04c7\7\35\2"+ - "\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04c9"+ - "\5^\60\2\u04c9\u04ca\7g\2\2\u04ca\u04cb\5\u0142\u00a2\2\u04cb\u04cd\3"+ - "\2\2\2\u04cc\u04be\3\2\2\2\u04cc\u04c6\3\2\2\2\u04cd\u00c1\3\2\2\2\u04ce"+ - "\u04d6\5\u012c\u0097\2\u04cf\u04d6\5\u00c4c\2\u04d0\u04d6\5P)\2\u04d1"+ - "\u04d2\7h\2\2\u04d2\u04d3\5\u00c2b\2\u04d3\u04d4\7i\2\2\u04d4\u04d6\3"+ - "\2\2\2\u04d5\u04ce\3\2\2\2\u04d5\u04cf\3\2\2\2\u04d5\u04d0\3\2\2\2\u04d5"+ - "\u04d1\3\2\2\2\u04d6\u00c3\3\2\2\2\u04d7\u04e1\5\u012e\u0098\2\u04d8\u04e1"+ - "\5\u015e\u00b0\2\u04d9\u04e1\5\u0134\u009b\2\u04da\u04e1\5\u013c\u009f"+ - "\2\u04db\u04e1\5\u00bc_\2\u04dc\u04e1\5\u0136\u009c\2\u04dd\u04e1\5\u0138"+ - "\u009d\2\u04de\u04e1\5\u013a\u009e\2\u04df\u04e1\5\u00c6d\2\u04e0\u04d7"+ - "\3\2\2\2\u04e0\u04d8\3\2\2\2\u04e0\u04d9\3\2\2\2\u04e0\u04da\3\2\2\2\u04e0"+ - "\u04db\3\2\2\2\u04e0\u04dc\3\2\2\2\u04e0\u04dd\3\2\2\2\u04e0\u04de\3\2"+ - "\2\2\u04e0\u04df\3\2\2\2\u04e1\u00c5\3\2\2\2\u04e2\u04e3\7:\2\2\u04e3"+ - "\u04e4\5\u00c8e\2\u04e4\u00c7\3\2\2\2\u04e5\u04f1\7h\2\2\u04e6\u04eb\5"+ - "\u00c2b\2\u04e7\u04e8\7o\2\2\u04e8\u04ea\5\u00c2b\2\u04e9\u04e7\3\2\2"+ - "\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ef"+ - "\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7o\2\2\u04ef\u04ee\3\2\2\2\u04ef"+ - "\u04f0\3\2\2\2\u04f0\u04f2\3\2\2\2\u04f1\u04e6\3\2\2\2\u04f1\u04f2\3\2"+ - "\2\2\u04f2\u04f3\3\2\2\2\u04f3\u04f4\7i\2\2\u04f4\u00c9\3\2\2\2\u04f5"+ - "\u04fd\5\u015e\u00b0\2\u04f6\u04fd\5\u012e\u0098\2\u04f7\u04fd\5\u00cc"+ - "g\2\u04f8\u04fd\5\u0136\u009c\2\u04f9\u04fd\5\u0138\u009d\2\u04fa\u04fd"+ - "\5P)\2\u04fb\u04fd\5\u012c\u0097\2\u04fc\u04f5\3\2\2\2\u04fc\u04f6\3\2"+ - "\2\2\u04fc\u04f7\3\2\2\2\u04fc\u04f8\3\2\2\2\u04fc\u04f9\3\2\2\2\u04fc"+ - "\u04fa\3\2\2\2\u04fc\u04fb\3\2\2\2\u04fd\u00cb\3\2\2\2\u04fe\u04ff\7l"+ - "\2\2\u04ff\u0500\7v\2\2\u0500\u0501\7m\2\2\u0501\u0502\5\u0132\u009a\2"+ - "\u0502\u00cd\3\2\2\2\u0503\u0513\7l\2\2\u0504\u0506\5\u00d0i\2\u0505\u0504"+ - "\3\2\2\2\u0505\u0506\3\2\2\2\u0506\u0507\3\2\2\2\u0507\u0509\7q\2\2\u0508"+ - "\u050a\5\u00d2j\2\u0509\u0508\3\2\2\2\u0509\u050a\3\2\2\2\u050a\u0514"+ - "\3\2\2\2\u050b\u050d\5\u00d0i\2\u050c\u050b\3\2\2\2\u050c\u050d\3\2\2"+ - "\2\u050d\u050e\3\2\2\2\u050e\u050f\7q\2\2\u050f\u0510\5\u00d2j\2\u0510"+ - "\u0511\7q\2\2\u0511\u0512\5\u00d4k\2\u0512\u0514\3\2\2\2\u0513\u0505\3"+ - "\2\2\2\u0513\u050c\3\2\2\2\u0514\u0515\3\2\2\2\u0515\u0516\7m\2\2\u0516"+ - "\u00cf\3\2\2\2\u0517\u0518\5\u00a4S\2\u0518\u00d1\3\2\2\2\u0519\u051a"+ - "\5\u00a4S\2\u051a\u00d3\3\2\2\2\u051b\u051c\5\u00a4S\2\u051c\u00d5\3\2"+ - "\2\2\u051d\u051f\t\20\2\2\u051e\u051d\3\2\2\2\u051e\u051f\3\2\2\2\u051f"+ - "\u0520\3\2\2\2\u0520\u0521\7n\2\2\u0521\u00d7\3\2\2\2\u0522\u0523\5\u00e6"+ - "t\2\u0523\u0524\7n\2\2\u0524\u0529\3\2\2\2\u0525\u0526\5\b\5\2\u0526\u0527"+ - "\7u\2\2\u0527\u0529\3\2\2\2\u0528\u0522\3\2\2\2\u0528\u0525\3\2\2\2\u0528"+ - "\u0529\3\2\2\2\u0529\u052a\3\2\2\2\u052a\u052b\7_\2\2\u052b\u0530\5\u00a4"+ - "S\2\u052c\u052e\7L\2\2\u052d\u052f\7g\2\2\u052e\u052d\3\2\2\2\u052e\u052f"+ - "\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052c\3\2\2\2\u0530\u0531\3\2\2\2\u0531"+ - "\u00d9\3\2\2\2\u0532\u0533\7Z\2\2\u0533\u0534\7g\2\2\u0534\u00db\3\2\2"+ - "\2\u0535\u0536\5\u0162\u00b2\2\u0536\u00dd\3\2\2\2\u0537\u053b\5\u00e0"+ - "q\2\u0538\u053b\5\u00e8u\2\u0539\u053b\5\u00ecw\2\u053a\u0537\3\2\2\2"+ - "\u053a\u0538\3\2\2\2\u053a\u0539\3\2\2\2\u053b\u00df\3\2\2\2\u053c\u0548"+ - "\7\\\2\2\u053d\u0549\5\u00e2r\2\u053e\u0544\7h\2\2\u053f\u0540\5\u00e2"+ - "r\2\u0540\u0541\5\u0170\u00b9\2\u0541\u0543\3\2\2\2\u0542\u053f\3\2\2"+ - "\2\u0543\u0546\3\2\2\2\u0544\u0542\3\2\2\2\u0544\u0545\3\2\2\2\u0545\u0547"+ - "\3\2\2\2\u0546\u0544\3\2\2\2\u0547\u0549\7i\2\2\u0548\u053d\3\2\2\2\u0548"+ - "\u053e\3\2\2\2\u0549\u00e1\3\2\2\2\u054a\u0550\5\u00e4s\2\u054b\u054d"+ - "\5\u00c2b\2\u054c\u054b\3\2\2\2\u054c\u054d\3\2\2\2\u054d\u054e\3\2\2"+ - "\2\u054e\u054f\7n\2\2\u054f\u0551\5\u00e6t\2\u0550\u054c\3\2\2\2\u0550"+ - "\u0551\3\2\2\2\u0551\u00e3\3\2\2\2\u0552\u0557\7g\2\2\u0553\u0554\7o\2"+ - "\2\u0554\u0556\7g\2\2\u0555\u0553\3\2\2\2\u0556\u0559\3\2\2\2\u0557\u0555"+ - "\3\2\2\2\u0557\u0558\3\2\2\2\u0558\u00e5\3\2\2\2\u0559\u0557\3\2\2\2\u055a"+ - "\u055f\5\u00a4S\2\u055b\u055c\7o\2\2\u055c\u055e\5\u00a4S\2\u055d\u055b"+ - "\3\2\2\2\u055e\u0561\3\2\2\2\u055f\u055d\3\2\2\2\u055f\u0560\3\2\2\2\u0560"+ - "\u00e7\3\2\2\2\u0561\u055f\3\2\2\2\u0562\u056e\7`\2\2\u0563\u056f\5\u00ea"+ - "v\2\u0564\u056a\7h\2\2\u0565\u0566\5\u00eav\2\u0566\u0567\5\u0170\u00b9"+ - "\2\u0567\u0569\3\2\2\2\u0568\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568"+ - "\3\2\2\2\u056a\u056b\3\2\2\2\u056b\u056d\3\2\2\2\u056c\u056a\3\2\2\2\u056d"+ - "\u056f\7i\2\2\u056e\u0563\3\2\2\2\u056e\u0564\3\2\2\2\u056f\u00e9\3\2"+ - "\2\2\u0570\u0572\7g\2\2\u0571\u0573\7n\2\2\u0572\u0571\3\2\2\2\u0572\u0573"+ - "\3\2\2\2\u0573\u0574\3\2\2\2\u0574\u0575\5\u00c2b\2\u0575\u00eb\3\2\2"+ - "\2\u0576\u0582\7e\2\2\u0577\u0583\5\u0096L\2\u0578\u057e\7h\2\2\u0579"+ - "\u057a\5\u0096L\2\u057a\u057b\5\u0170\u00b9\2\u057b\u057d\3\2\2\2\u057c"+ - "\u0579\3\2\2\2\u057d\u0580\3\2\2\2\u057e\u057c\3\2\2\2\u057e\u057f\3\2"+ - "\2\2\u057f\u0581\3\2\2\2\u0580\u057e\3\2\2\2\u0581\u0583\7i\2\2\u0582"+ - "\u0577\3\2\2\2\u0582\u0578\3\2\2\2\u0583\u00ed\3\2\2\2\u0584\u0586\7j"+ - "\2\2\u0585\u0587\5\u00f0y\2\u0586\u0585\3\2\2\2\u0586\u0587\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u0589\7k\2\2\u0589\u00ef\3\2\2\2\u058a\u058c\5\u0170"+ - "\u00b9\2\u058b\u058a\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d"+ - "\u058e\5\u00a6T\2\u058e\u058f\5\u0170\u00b9\2\u058f\u0591\3\2\2\2\u0590"+ - "\u058b\3\2\2\2\u0591\u0592\3\2\2\2\u0592\u0590\3\2\2\2\u0592\u0593\3\2"+ - "\2\2\u0593\u00f1\3\2\2\2\u0594\u059a\5\u00f6|\2\u0595\u059a\5\u00f8}\2"+ - "\u0596\u059a\5\u00fa~\2\u0597\u059a\5\u00f4{\2\u0598\u059a\5\u0098M\2"+ - "\u0599\u0594\3\2\2\2\u0599\u0595\3\2\2\2\u0599\u0596\3\2\2\2\u0599\u0597"+ - "\3\2\2\2\u0599\u0598\3\2\2\2\u059a\u00f3\3\2\2\2\u059b\u059c\5\u00a4S"+ - "\2\u059c\u00f5\3\2\2\2\u059d\u059e\5\u00a4S\2\u059e\u059f\7\u008b\2\2"+ - "\u059f\u05a0\5\u00a4S\2\u05a0\u00f7\3\2\2\2\u05a1\u05a2\5\u00a4S\2\u05a2"+ - "\u05a3\t\21\2\2\u05a3\u00f9\3\2\2\2\u05a4\u05a5\5\u00e6t\2\u05a5\u05a6"+ - "\5\u00d6l\2\u05a6\u05a7\5\u00e6t\2\u05a7\u00fb\3\2\2\2\u05a8\u05a9\t\22"+ - "\2\2\u05a9\u00fd\3\2\2\2\u05aa\u05ab\7g\2\2\u05ab\u05ad\7q\2\2\u05ac\u05ae"+ - "\5\u00a6T\2\u05ad\u05ac\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ae\u00ff\3\2\2"+ - "\2\u05af\u05b1\7d\2\2\u05b0\u05b2\5\u00e6t\2\u05b1\u05b0\3\2\2\2\u05b1"+ - "\u05b2\3\2\2\2\u05b2\u0101\3\2\2\2\u05b3\u05b5\7M\2\2\u05b4\u05b6\7g\2"+ - "\2\u05b5\u05b4\3\2\2\2\u05b5\u05b6\3\2\2\2\u05b6\u0103\3\2\2\2\u05b7\u05b9"+ - "\7a\2\2\u05b8\u05ba\7g\2\2\u05b9\u05b8\3\2\2\2\u05b9\u05ba\3\2\2\2\u05ba"+ - "\u0105\3\2\2\2\u05bb\u05bc\7Y\2\2\u05bc\u05bd\7g\2\2\u05bd\u0107\3\2\2"+ - "\2\u05be\u05bf\7]\2\2\u05bf\u0109\3\2\2\2\u05c0\u05c9\7^\2\2\u05c1\u05ca"+ - "\5\u00a4S\2\u05c2\u05c3\5\u0170\u00b9\2\u05c3\u05c4\5\u00a4S\2\u05c4\u05ca"+ - "\3\2\2\2\u05c5\u05c6\5\u00f2z\2\u05c6\u05c7\5\u0170\u00b9\2\u05c7\u05c8"+ - "\5\u00a4S\2\u05c8\u05ca\3\2\2\2\u05c9\u05c1\3\2\2\2\u05c9\u05c2\3\2\2"+ - "\2\u05c9\u05c5\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05d1\5\u00eex\2\u05cc"+ - "\u05cf\7X\2\2\u05cd\u05d0\5\u010a\u0086\2\u05ce\u05d0\5\u00eex\2\u05cf"+ - "\u05cd\3\2\2\2\u05cf\u05ce\3\2\2\2\u05d0\u05d2\3\2\2\2\u05d1\u05cc\3\2"+ - "\2\2\u05d1\u05d2\3\2\2\2\u05d2\u010b\3\2\2\2\u05d3\u05d6\5\u010e\u0088"+ - "\2\u05d4\u05d6\5\u0114\u008b\2\u05d5\u05d3\3\2\2\2\u05d5\u05d4\3\2\2\2"+ - "\u05d6\u010d\3\2\2\2\u05d7\u05e2\7[\2\2\u05d8\u05da\5\u00a4S\2\u05d9\u05d8"+ - "\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05e3\3\2\2\2\u05db\u05dd\5\u00f2z"+ - "\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\3\2\2\2\u05de\u05e0"+ - "\5\u0170\u00b9\2\u05df\u05e1\5\u00a4S\2\u05e0\u05df\3\2\2\2\u05e0\u05e1"+ - "\3\2\2\2\u05e1\u05e3\3\2\2\2\u05e2\u05d9\3\2\2\2\u05e2\u05dc\3\2\2\2\u05e3"+ - "\u05e4\3\2\2\2\u05e4\u05e8\7j\2\2\u05e5\u05e7\5\u0110\u0089\2\u05e6\u05e5"+ - "\3\2\2\2\u05e7\u05ea\3\2\2\2\u05e8\u05e6\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9"+ - "\u05eb\3\2\2\2\u05ea\u05e8\3\2\2\2\u05eb\u05ec\7k\2\2\u05ec\u010f\3\2"+ - "\2\2\u05ed\u05ee\5\u0112\u008a\2\u05ee\u05f0\7q\2\2\u05ef\u05f1\5\u00f0"+ - "y\2\u05f0\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0111\3\2\2\2\u05f2"+ - "\u05f3\7R\2\2\u05f3\u05f6\5\u00e6t\2\u05f4\u05f6\7N\2\2\u05f5\u05f2\3"+ - "\2\2\2\u05f5\u05f4\3\2\2\2\u05f6\u0113\3\2\2\2\u05f7\u0600\7[\2\2\u05f8"+ - "\u0601\5\u0116\u008c\2\u05f9\u05fa\5\u0170\u00b9\2\u05fa\u05fb\5\u0116"+ - "\u008c\2\u05fb\u0601\3\2\2\2\u05fc\u05fd\5\u00f2z\2\u05fd\u05fe\5\u0170"+ - "\u00b9\2\u05fe\u05ff\5\u0116\u008c\2\u05ff\u0601\3\2\2\2\u0600\u05f8\3"+ - "\2\2\2\u0600\u05f9\3\2\2\2\u0600\u05fc\3\2\2\2\u0601\u0602\3\2\2\2\u0602"+ - "\u0606\7j\2\2\u0603\u0605\5\u0118\u008d\2\u0604\u0603\3\2\2\2\u0605\u0608"+ - "\3\2\2\2\u0606\u0604\3\2\2\2\u0606\u0607\3\2\2\2\u0607\u0609\3\2\2\2\u0608"+ - "\u0606\3\2\2\2\u0609\u060a\7k\2\2\u060a\u0115\3\2\2\2\u060b\u060c\7g\2"+ - "\2\u060c\u060e\7u\2\2\u060d\u060b\3\2\2\2\u060d\u060e\3\2\2\2\u060e\u060f"+ - "\3\2\2\2\u060f\u0610\5\u00b4[\2\u0610\u0611\7r\2\2\u0611\u0612\7h\2\2"+ - "\u0612\u0613\7`\2\2\u0613\u0614\7i\2\2\u0614\u0117\3\2\2\2\u0615\u0616"+ - "\5\u011a\u008e\2\u0616\u0618\7q\2\2\u0617\u0619\5\u00f0y\2\u0618\u0617"+ - "\3\2\2\2\u0618\u0619\3\2\2\2\u0619\u0119\3\2\2\2\u061a\u061b\7R\2\2\u061b"+ - "\u061e\5\u011c\u008f\2\u061c\u061e\7N\2\2\u061d\u061a\3\2\2\2\u061d\u061c"+ - "\3\2\2\2\u061e\u011b\3\2\2\2\u061f\u0622\5\u00c2b\2\u0620\u0622\7f\2\2"+ - "\u0621\u061f\3\2\2\2\u0621\u0620\3\2\2\2\u0622\u062a\3\2\2\2\u0623\u0626"+ - "\7o\2\2\u0624\u0627\5\u00c2b\2\u0625\u0627\7f\2\2\u0626\u0624\3\2\2\2"+ - "\u0626\u0625\3\2\2\2\u0627\u0629\3\2\2\2\u0628\u0623\3\2\2\2\u0629\u062c"+ - "\3\2\2\2\u062a\u0628\3\2\2\2\u062a\u062b\3\2\2\2\u062b\u011d\3\2\2\2\u062c"+ - "\u062a\3\2\2\2\u062d\u062e\7Q\2\2\u062e\u0632\7j\2\2\u062f\u0631\5\u0120"+ - "\u0091\2\u0630\u062f\3\2\2\2\u0631\u0634\3\2\2\2\u0632\u0630\3\2\2\2\u0632"+ - "\u0633\3\2\2\2\u0633\u0635\3\2\2\2\u0634\u0632\3\2\2\2\u0635\u0636\7k"+ - "\2\2\u0636\u011f\3\2\2\2\u0637\u0638\5\u0122\u0092\2\u0638\u063a\7q\2"+ - "\2\u0639\u063b\5\u00f0y\2\u063a\u0639\3\2\2\2\u063a\u063b\3\2\2\2\u063b"+ - "\u0121\3\2\2\2\u063c\u063f\7R\2\2\u063d\u0640\5\u00f6|\2\u063e\u0640\5"+ - "\u0124\u0093\2\u063f\u063d\3\2\2\2\u063f\u063e\3\2\2\2\u0640\u0643\3\2"+ - "\2\2\u0641\u0643\7N\2\2\u0642\u063c\3\2\2\2\u0642\u0641\3\2\2\2\u0643"+ - "\u0123\3\2\2\2\u0644\u0645\5\u00e6t\2\u0645\u0646\7n\2\2\u0646\u064b\3"+ - "\2\2\2\u0647\u0648\5\u00e4s\2\u0648\u0649\7u\2\2\u0649\u064b\3\2\2\2\u064a"+ - "\u0644\3\2\2\2\u064a\u0647\3\2\2\2\u064a\u064b\3\2\2\2\u064b\u064c\3\2"+ - "\2\2\u064c\u064d\5\u00a4S\2\u064d\u0125\3\2\2\2\u064e\u0652\7b\2\2\u064f"+ - "\u0653\5\u00a4S\2\u0650\u0653\5\u0128\u0095\2\u0651\u0653\5\u00d8m\2\u0652"+ - "\u064f\3\2\2\2\u0652\u0650\3\2\2\2\u0652\u0651\3\2\2\2\u0652\u0653\3\2"+ - "\2\2\u0653\u0654\3\2\2\2\u0654\u0655\5\u00eex\2\u0655\u0127\3\2\2\2\u0656"+ - "\u0658\5\u00f2z\2\u0657\u0656\3\2\2\2\u0657\u0658\3\2\2\2\u0658\u0659"+ - "\3\2\2\2\u0659\u065b\5\u0170\u00b9\2\u065a\u065c\5\u00a4S\2\u065b\u065a"+ - "\3\2\2\2\u065b\u065c\3\2\2\2\u065c\u065d\3\2\2\2\u065d\u065f\5\u0170\u00b9"+ - "\2\u065e\u0660\5\u00f2z\2\u065f\u065e\3\2\2\2\u065f\u0660\3\2\2\2\u0660"+ - "\u0129\3\2\2\2\u0661\u0662\7T\2\2\u0662\u0663\5\u00a4S\2\u0663\u012b\3"+ - "\2\2\2\u0664\u0667\5\u0150\u00a9\2\u0665\u0667\7g\2\2\u0666\u0664\3\2"+ - "\2\2\u0666\u0665\3\2\2\2\u0667\u012d\3\2\2\2\u0668\u0669\7l\2\2\u0669"+ - "\u066a\5\u0130\u0099\2\u066a\u066b\7m\2\2\u066b\u066c\5\u0132\u009a\2"+ - "\u066c\u012f\3\2\2\2\u066d\u066e\5\u00a4S\2\u066e\u0131\3\2\2\2\u066f"+ - "\u0670\5\u00c2b\2\u0670\u0133\3\2\2\2\u0671\u0672\7\u0089\2\2\u0672\u0673"+ - "\5\u00c2b\2\u0673\u0135\3\2\2\2\u0674\u0675\7l\2\2\u0675\u0676\7m\2\2"+ - "\u0676\u0677\5\u0132\u009a\2\u0677\u0137\3\2\2\2\u0678\u0679\7U\2\2\u0679"+ - "\u067a\7l\2\2\u067a\u067b\5\u00c2b\2\u067b\u067c\7m\2\2\u067c\u067d\5"+ - "\u0132\u009a\2\u067d\u0139\3\2\2\2\u067e\u0684\7W\2\2\u067f\u0680\7W\2"+ - "\2\u0680\u0684\7\u008b\2\2\u0681\u0682\7\u008b\2\2\u0682\u0684\7W\2\2"+ - "\u0683\u067e\3\2\2\2\u0683\u067f\3\2\2\2\u0683\u0681\3\2\2\2\u0684\u0685"+ - "\3\2\2\2\u0685\u0686\5\u0132\u009a\2\u0686\u013b\3\2\2\2\u0687\u0688\7"+ - "O\2\2\u0688\u0689\5\u013e\u00a0\2\u0689\u013d\3\2\2\2\u068a\u068b\5\u0142"+ - "\u00a2\2\u068b\u068c\5\u0140\u00a1\2\u068c\u068f\3\2\2\2\u068d\u068f\5"+ - "\u0142\u00a2\2\u068e\u068a\3\2\2\2\u068e\u068d\3\2\2\2\u068f\u013f\3\2"+ - "\2\2\u0690\u0693\5\u0142\u00a2\2\u0691\u0693\5\u00c2b\2\u0692\u0690\3"+ - "\2\2\2\u0692\u0691\3\2\2\2\u0693\u0141\3\2\2\2\u0694\u06a0\7h\2\2\u0695"+ - "\u069a\5\u009cO\2\u0696\u0697\7o\2\2\u0697\u0699\5\u009cO\2\u0698\u0696"+ - "\3\2\2\2\u0699\u069c\3\2\2\2\u069a\u0698\3\2\2\2\u069a\u069b\3\2\2\2\u069b"+ - "\u069e\3\2\2\2\u069c\u069a\3\2\2\2\u069d\u069f\7o\2\2\u069e\u069d\3\2"+ - "\2\2\u069e\u069f\3\2\2\2\u069f\u06a1\3\2\2\2\u06a0\u0695\3\2\2\2\u06a0"+ - "\u06a1\3\2\2\2\u06a1\u06a2\3\2\2\2\u06a2\u06a3\7i\2\2\u06a3\u0143\3\2"+ - "\2\2\u06a4\u06a5\5\u0146\u00a4\2\u06a5\u06a6\7h\2\2\u06a6\u06a8\5\u00a4"+ - "S\2\u06a7\u06a9\7o\2\2\u06a8\u06a7\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa"+ - "\3\2\2\2\u06aa\u06ab\7i\2\2\u06ab\u0145\3\2\2\2\u06ac\u06b2\5\u00c4c\2"+ - "\u06ad\u06ae\7h\2\2\u06ae\u06af\5\u0146\u00a4\2\u06af\u06b0\7i\2\2\u06b0"+ - "\u06b2\3\2\2\2\u06b1\u06ac\3\2\2\2\u06b1\u06ad\3\2\2\2\u06b2\u0147\3\2"+ - "\2\2\u06b3\u06ba\5\u014a\u00a6\2\u06b4\u06ba\5\u014e\u00a8\2\u06b5\u06b6"+ - "\7h\2\2\u06b6\u06b7\5\u00a4S\2\u06b7\u06b8\7i\2\2\u06b8\u06ba\3\2\2\2"+ - "\u06b9\u06b3\3\2\2\2\u06b9\u06b4\3\2\2\2\u06b9\u06b5\3\2\2\2\u06ba\u0149"+ - "\3\2\2\2\u06bb\u06bf\5\u00b2Z\2\u06bc\u06bf\5\u0152\u00aa\2\u06bd\u06bf"+ - "\5\u00b6\\\2\u06be\u06bb\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2"+ - "\2\u06bf\u014b\3\2\2\2\u06c0\u06c1\t\23\2\2\u06c1\u014d\3\2\2\2\u06c2"+ - "\u06c3\7g\2\2\u06c3\u014f\3\2\2\2\u06c4\u06c5\7g\2\2\u06c5\u06c6\7r\2"+ - "\2\u06c6\u06c7\7g\2\2\u06c7\u0151\3\2\2\2\u06c8\u06c9\5\u00caf\2\u06c9"+ - "\u06ca\5\u0154\u00ab\2\u06ca\u0153\3\2\2\2\u06cb\u06d0\7j\2\2\u06cc\u06ce"+ - "\5\u0156\u00ac\2\u06cd\u06cf\7o\2\2\u06ce\u06cd\3\2\2\2\u06ce\u06cf\3"+ - "\2\2\2\u06cf\u06d1\3\2\2\2\u06d0\u06cc\3\2\2\2\u06d0\u06d1\3\2\2\2\u06d1"+ - "\u06d2\3\2\2\2\u06d2\u06d3\7k\2\2\u06d3\u0155\3\2\2\2\u06d4\u06d9\5\u0158"+ - "\u00ad\2\u06d5\u06d6\7o\2\2\u06d6\u06d8\5\u0158\u00ad\2\u06d7\u06d5\3"+ - "\2\2\2\u06d8\u06db\3\2\2\2\u06d9\u06d7\3\2\2\2\u06d9\u06da\3\2\2\2\u06da"+ - "\u0157\3\2\2\2\u06db\u06d9\3\2\2\2\u06dc\u06dd\5\u015a\u00ae\2\u06dd\u06de"+ - "\7q\2\2\u06de\u06e0\3\2\2\2\u06df\u06dc\3\2\2\2\u06df\u06e0\3\2\2\2\u06e0"+ - "\u06e1\3\2\2\2\u06e1\u06e2\5\u015c\u00af\2\u06e2\u0159\3\2\2\2\u06e3\u06e6"+ - "\5\u00a4S\2\u06e4\u06e6\5\u0154\u00ab\2\u06e5\u06e3\3\2\2\2\u06e5\u06e4"+ - "\3\2\2\2\u06e6\u015b\3\2\2\2\u06e7\u06ea\5\u00a4S\2\u06e8\u06ea\5\u0154"+ - "\u00ab\2\u06e9\u06e7\3\2\2\2\u06e9\u06e8\3\2\2\2\u06ea\u015d\3\2\2\2\u06eb"+ - "\u06ec\7V\2\2\u06ec\u06f2\7j\2\2\u06ed\u06ee\5\u0160\u00b1\2\u06ee\u06ef"+ - "\5\u0170\u00b9\2\u06ef\u06f1\3\2\2\2\u06f0\u06ed\3\2\2\2\u06f1\u06f4\3"+ - "\2\2\2\u06f2\u06f0\3\2\2\2\u06f2\u06f3\3\2\2\2\u06f3\u06f5\3\2\2\2\u06f4"+ - "\u06f2\3\2\2\2\u06f5\u06f6\7k\2\2\u06f6\u015f\3\2\2\2\u06f7\u06f8\5\u00e4"+ - "s\2\u06f8\u06f9\5\u00c2b\2\u06f9\u06fc\3\2\2\2\u06fa\u06fc\5\u0164\u00b3"+ - "\2\u06fb\u06f7\3\2\2\2\u06fb\u06fa\3\2\2\2\u06fc\u06fe\3\2\2\2\u06fd\u06ff"+ - "\5\u0162\u00b2\2\u06fe\u06fd\3\2\2\2\u06fe\u06ff\3\2\2\2\u06ff\u0161\3"+ - "\2\2\2\u0700\u0701\t\24\2\2\u0701\u0163\3\2\2\2\u0702\u0704\7\u0089\2"+ - "\2\u0703\u0702\3\2\2\2\u0703\u0704\3\2\2\2\u0704\u0705\3\2\2\2\u0705\u0706"+ - "\5\u012c\u0097\2\u0706\u0165\3\2\2\2\u0707\u0708\7l\2\2\u0708\u0709\5"+ - "\u00a4S\2\u0709\u070a\7m\2\2\u070a\u0167\3\2\2\2\u070b\u070c\7r\2\2\u070c"+ - "\u070d\7h\2\2\u070d\u070e\5\u00c2b\2\u070e\u070f\7i\2\2\u070f\u0169\3"+ - "\2\2\2\u0710\u071f\7h\2\2\u0711\u0718\5\u00e6t\2\u0712\u0715\5\u0146\u00a4"+ - "\2\u0713\u0714\7o\2\2\u0714\u0716\5\u00e6t\2\u0715\u0713\3\2\2\2\u0715"+ - "\u0716\3\2\2\2\u0716\u0718\3\2\2\2\u0717\u0711\3\2\2\2\u0717\u0712\3\2"+ - "\2\2\u0718\u071a\3\2\2\2\u0719\u071b\7v\2\2\u071a\u0719\3\2\2\2\u071a"+ - "\u071b\3\2\2\2\u071b\u071d\3\2\2\2\u071c\u071e\7o\2\2\u071d\u071c\3\2"+ - "\2\2\u071d\u071e\3\2\2\2\u071e\u0720\3\2\2\2\u071f\u0717\3\2\2\2\u071f"+ - "\u0720\3\2\2\2\u0720\u0721\3\2\2\2\u0721\u0722\7i\2\2\u0722\u016b\3\2"+ - "\2\2\u0723\u0724\5\u0146\u00a4\2\u0724\u0725\7r\2\2\u0725\u0726\7g\2\2"+ - "\u0726\u016d\3\2\2\2\u0727\u0728\5\u00c2b\2\u0728\u016f\3\2\2\2\u0729"+ - "\u072e\7p\2\2\u072a\u072e\7\2\2\3\u072b\u072e\7\u00a1\2\2\u072c\u072e"+ - "\6\u00b9\24\2\u072d\u0729\3\2\2\2\u072d\u072a\3\2\2\2\u072d\u072b\3\2"+ - "\2\2\u072d\u072c\3\2\2\2\u072e\u0171\3\2\2\2\u00bd\u0180\u0185\u018c\u0196"+ - "\u019c\u01a2\u01b2\u01b6\u01bf\u01cb\u01cf\u01d5\u01de\u01e8\u01f9\u0207"+ - "\u020b\u0212\u021a\u0223\u0243\u024b\u0263\u0276\u0285\u0292\u029b\u02a9"+ - "\u02b2\u02be\u02d3\u02da\u02df\u02e4\u02ee\u02f1\u02f5\u02f9\u0301\u0309"+ - "\u030e\u0316\u0318\u031d\u0324\u032c\u032f\u0335\u033a\u033c\u033f\u0346"+ - "\u034b\u035e\u0366\u036a\u036d\u0373\u0377\u037a\u0384\u038b\u0392\u039e"+ - "\u03a4\u03ab\u03b0\u03b6\u03c2\u03c8\u03cc\u03d4\u03d8\u03de\u03e1\u03e7"+ - "\u03ec\u0405\u0428\u042a\u0441\u0449\u0454\u045b\u0462\u046c\u047a\u0490"+ - "\u0492\u049a\u049e\u04a2\u04a5\u04ae\u04b4\u04be\u04c6\u04cc\u04d5\u04e0"+ - "\u04eb\u04ef\u04f1\u04fc\u0505\u0509\u050c\u0513\u051e\u0528\u052e\u0530"+ - "\u053a\u0544\u0548\u054c\u0550\u0557\u055f\u056a\u056e\u0572\u057e\u0582"+ - "\u0586\u058b\u0592\u0599\u05ad\u05b1\u05b5\u05b9\u05c9\u05cf\u05d1\u05d5"+ - "\u05d9\u05dc\u05e0\u05e2\u05e8\u05f0\u05f5\u0600\u0606\u060d\u0618\u061d"+ - "\u0621\u0626\u062a\u0632\u063a\u063f\u0642\u064a\u0652\u0657\u065b\u065f"+ - "\u0666\u0683\u068e\u0692\u069a\u069e\u06a0\u06a8\u06b1\u06b9\u06be\u06ce"+ - "\u06d0\u06d9\u06df\u06e5\u06e9\u06f2\u06fb\u06fe\u0703\u0715\u0717\u071a"+ - "\u071d\u071f\u072d"; + "\u0004\u0001\u00a0\u0785\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ + "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ + "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ + "\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+ + "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+ + "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+ + "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+ + "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+ + "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+ + "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+ + "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+ + "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+ + ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+ + "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+ + "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+ + ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+ + "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007"+ + "E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007"+ + "J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007"+ + "O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007"+ + "T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007"+ + "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+ + "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+ + "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+ + "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+ + "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0002r\u0007"+ + "r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007v\u0002w\u0007"+ + "w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007{\u0002|\u0007"+ + "|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f\u0002\u0080\u0007"+ + "\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082\u0002\u0083\u0007"+ + "\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085\u0002\u0086\u0007"+ + "\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088\u0002\u0089\u0007"+ + "\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b\u0002\u008c\u0007"+ + "\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e\u0002\u008f\u0007"+ + "\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091\u0002\u0092\u0007"+ + "\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094\u0002\u0095\u0007"+ + "\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097\u0002\u0098\u0007"+ + "\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a\u0002\u009b\u0007"+ + "\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d\u0002\u009e\u0007"+ + "\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0\u0002\u00a1\u0007"+ + "\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3\u0002\u00a4\u0007"+ + "\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6\u0002\u00a7\u0007"+ + "\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9\u0002\u00aa\u0007"+ + "\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac\u0002\u00ad\u0007"+ + "\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\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\u0002\u00c2\u0007"+ + "\u00c2\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\u0193\b\u0003\n\u0003\f\u0003\u0196\t\u0003\u0001\u0004"+ + "\u0001\u0004\u0003\u0004\u019a\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u019f\b\u0005\n\u0005\f\u0005\u01a2\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01a9\b\u0005\n"+ + "\u0005\f\u0005\u01ac\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u01b1\b\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01b5\b\u0005"+ + "\n\u0005\f\u0005\u01b8\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ + "\u0001\b\u0005\b\u01c5\b\b\n\b\f\b\u01c8\t\b\u0001\b\u0003\b\u01cb\b\b"+ + "\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01d2\b\t\n\t\f\t\u01d5"+ + "\t\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0005\t\u01de"+ + "\b\t\n\t\f\t\u01e1\t\t\u0001\t\u0003\t\u01e4\b\t\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0003\n\u01ea\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01f3\b\u000b\u0001"+ + "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0003\u000e\u01fd\b\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+ + "\u020e\b\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012"+ + "\u021a\b\u0012\n\u0012\f\u0012\u021d\t\u0012\u0001\u0012\u0003\u0012\u0220"+ + "\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0225\b\u0013"+ + "\n\u0013\f\u0013\u0228\t\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0005"+ + "\u0014\u022d\b\u0014\n\u0014\f\u0014\u0230\t\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0005\u0015\u0236\b\u0015\n\u0015\f\u0015\u0239"+ + "\t\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\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\u0003"+ + "\u001b\u0258\b\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001c\u0001\u001c\u0003\u001c\u0260\b\u001c\u0001\u001d\u0001\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0278\b!\u0001!\u0001"+ + "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0005#\u0289\b#\n#\f#\u028c\t#\u0001#\u0001"+ + "#\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005%\u0298"+ + "\b%\n%\f%\u029b\t%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0003\'\u02a7\b\'\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0005(\u02ae\b(\n(\f(\u02b1\t(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u02be\b)\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0005*\u02c5\b*\n*\f*\u02c8\t*\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001+\u0001+\u0005+\u02d1\b+\n+\f+\u02d4\t+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0003-\u02e8\b-\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0003.\u02ef\b.\u0001.\u0005.\u02f2\b.\n.\f.\u02f5\t."+ + "\u0001.\u0001.\u0003.\u02f9\b.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0003/\u0303\b/\u00010\u00030\u0306\b0\u00010\u00010\u0003"+ + "0\u030a\b0\u00011\u00011\u00031\u030e\b1\u00012\u00012\u00012\u00012\u0005"+ + "2\u0314\b2\n2\f2\u0317\t2\u00012\u00012\u00013\u00013\u00013\u00033\u031e"+ + "\b3\u00014\u00014\u00014\u00034\u0323\b4\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00035\u032b\b5\u00035\u032d\b5\u00015\u00015\u00015\u00035\u0332"+ + "\b5\u00016\u00016\u00016\u00056\u0337\b6\n6\f6\u033a\t6\u00017\u00017"+ + "\u00017\u00017\u00017\u00037\u0341\b7\u00017\u00037\u0344\b7\u00017\u0001"+ + "7\u00018\u00018\u00038\u034a\b8\u00018\u00018\u00018\u00038\u034f\b8\u0003"+ + "8\u0351\b8\u00018\u00038\u0354\b8\u00019\u00019\u00019\u00059\u0359\b"+ + "9\n9\f9\u035c\t9\u0001:\u0001:\u0003:\u0360\b:\u0001:\u0001:\u0001;\u0001"+ + ";\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ + "<\u0001<\u0005<\u0371\b<\n<\f<\u0374\t<\u0001<\u0001<\u0001<\u0005<\u0379"+ + "\b<\n<\f<\u037c\t<\u0001<\u0003<\u037f\b<\u0001=\u0003=\u0382\b=\u0001"+ + "=\u0001=\u0001=\u0001=\u0003=\u0388\b=\u0001>\u0001>\u0003>\u038c\b>\u0001"+ + ">\u0003>\u038f\b>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0399\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u03a0\b@\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0003A\u03a7\bA\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0003C\u03b3\bC\u0001D\u0001"+ + "D\u0001D\u0003D\u03b8\bD\u0001D\u0001D\u0003D\u03bc\bD\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u03c3\bE\u0001F\u0001F\u0001F\u0003F\u03c8\bF\u0001"+ + "G\u0001G\u0001G\u0001G\u0003G\u03ce\bG\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03da\bI\u0001J\u0001J\u0001"+ + "J\u0001J\u0003J\u03e0\bJ\u0001J\u0001J\u0003J\u03e4\bJ\u0001K\u0001K\u0001"+ + "K\u0001K\u0001L\u0001L\u0003L\u03ec\bL\u0001L\u0001L\u0003L\u03f0\bL\u0001"+ + "L\u0001L\u0001M\u0001M\u0003M\u03f6\bM\u0001N\u0003N\u03f9\bN\u0001N\u0001"+ + "N\u0001O\u0001O\u0003O\u03ff\bO\u0001O\u0001O\u0001P\u0003P\u0404\bP\u0001"+ + "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0003Q\u041d\bQ\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0005Q\u0440\bQ\nQ"+ + "\fQ\u0443\tQ\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0003R\u0459\bR\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0003"+ + "T\u0461\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0005V\u046a"+ + "\bV\nV\fV\u046d\tV\u0001V\u0001V\u0001V\u0001V\u0003V\u0473\bV\u0001W"+ + "\u0001W\u0001W\u0001W\u0001W\u0003W\u047a\bW\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0003X\u0484\bX\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u0492"+ + "\bY\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0005Y\u04a8\bY\nY\fY\u04ab\tY\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0003"+ + "[\u04b2\b[\u0001[\u0001[\u0003[\u04b6\b[\u0001\\\u0001\\\u0003\\\u04ba"+ + "\b\\\u0001\\\u0003\\\u04bd\b\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u04c6\b]\n]\f]\u04c9\t]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0003^\u04d0\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0003`\u04d7\b`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04df\b`\u0001`\u0001`\u0001"+ + "`\u0001`\u0003`\u04e5\b`\u0001a\u0001a\u0003a\u04e9\ba\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0003a\u04f1\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0003b\u04fc\bb\u0001c\u0001c\u0001c\u0001"+ + "d\u0001d\u0001d\u0001d\u0005d\u0505\bd\nd\fd\u0508\td\u0001d\u0003d\u050b"+ + "\bd\u0003d\u050d\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0003e\u0519\be\u0003e\u051b\be\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001g\u0001g\u0003g\u0524\bg\u0001g\u0001g\u0003g\u0528\bg\u0001"+ + "g\u0003g\u052b\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0532\bg\u0001"+ + "g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u053d"+ + "\bk\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u0547"+ + "\bl\u0001l\u0001l\u0001l\u0001l\u0003l\u054d\bl\u0003l\u054f\bl\u0001"+ + "m\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u0559\bo\u0001"+ + "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0005p\u0561\bp\np\fp\u0564\tp\u0001"+ + "p\u0003p\u0567\bp\u0001q\u0001q\u0003q\u056b\bq\u0001q\u0001q\u0003q\u056f"+ + "\bq\u0001r\u0001r\u0001r\u0005r\u0574\br\nr\fr\u0577\tr\u0001s\u0001s"+ + "\u0001s\u0005s\u057c\bs\ns\fs\u057f\ts\u0001t\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0005t\u0587\bt\nt\ft\u058a\tt\u0001t\u0003t\u058d\bt\u0001u"+ + "\u0001u\u0003u\u0591\bu\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0003"+ + "w\u0599\bw\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005"+ + "x\u05a3\bx\nx\fx\u05a6\tx\u0001x\u0003x\u05a9\bx\u0001y\u0001y\u0003y"+ + "\u05ad\by\u0001y\u0001y\u0001z\u0001z\u0001z\u0004z\u05b4\bz\u000bz\f"+ + "z\u05b5\u0001{\u0001{\u0001{\u0001{\u0001{\u0003{\u05bd\b{\u0001|\u0001"+ + "|\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0003\u0081\u05d1\b\u0081\u0001\u0082\u0001\u0082\u0003\u0082"+ + "\u05d5\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083\u05d9\b\u0083\u0001"+ + "\u0084\u0001\u0084\u0003\u0084\u05dd\b\u0084\u0001\u0085\u0001\u0085\u0001"+ + "\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003"+ + "\u0087\u05ed\b\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003"+ + "\u0087\u05f3\b\u0087\u0003\u0087\u05f5\b\u0087\u0001\u0088\u0001\u0088"+ + "\u0003\u0088\u05f9\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u05fd\b"+ + "\u0089\u0001\u0089\u0003\u0089\u0600\b\u0089\u0001\u0089\u0001\u0089\u0003"+ + "\u0089\u0604\b\u0089\u0003\u0089\u0606\b\u0089\u0001\u0089\u0001\u0089"+ + "\u0005\u0089\u060a\b\u0089\n\u0089\f\u0089\u060d\t\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003\u008a\u0614\b\u008a\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u0619\b\u008b\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0003\u008c\u0624\b\u008c\u0001\u008c\u0001\u008c\u0005"+ + "\u008c\u0628\b\u008c\n\u008c\f\u008c\u062b\t\u008c\u0001\u008c\u0001\u008c"+ + "\u0001\u008d\u0001\u008d\u0003\u008d\u0631\b\u008d\u0001\u008d\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0003\u008e\u063c\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0003\u008f\u0641\b\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u0645\b"+ + "\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u064a\b\u0090\u0005"+ + "\u0090\u064c\b\u0090\n\u0090\f\u0090\u064f\t\u0090\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0005\u0091\u0654\b\u0091\n\u0091\f\u0091\u0657\t\u0091\u0001"+ + "\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u065e"+ + "\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u0663\b\u0093"+ + "\u0001\u0093\u0003\u0093\u0666\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u066e\b\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0003\u0095"+ + "\u0676\b\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0003\u0096\u067b\b"+ + "\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u067f\b\u0096\u0001\u0096\u0001"+ + "\u0096\u0003\u0096\u0683\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0098\u0001\u0098\u0003\u0098\u068a\b\u0098\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0003\u0099\u068f\b\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0005\u009a\u0696\b\u009a\n\u009a\f\u009a\u0699\t\u009a"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c"+ + "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e"+ + "\u0001\u009f\u0001\u009f\u0001\u009f\u0005\u009f\u06aa\b\u009f\n\u009f"+ + "\f\u009f\u06ad\t\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a3\u0003\u00a3\u06c0\b\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0003\u00a5\u06cb\b\u00a5\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06cf\b"+ + "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0005\u00a7\u06d5"+ + "\b\u00a7\n\u00a7\f\u00a7\u06d8\t\u00a7\u0001\u00a7\u0003\u00a7\u06db\b"+ + "\u00a7\u0003\u00a7\u06dd\b\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a8\u0003\u00a8\u06e4\b\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ + "\u00a9\u0001\u00a9\u0001\u00a9\u0005\u00a9\u06eb\b\u00a9\n\u00a9\f\u00a9"+ + "\u06ee\t\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u06f9\b\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0003\u00ad\u0702\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ + "\u0003\u00ae\u0707\b\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ + "\u0003\u00ae\u070d\b\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0003\u00af"+ + "\u0712\b\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0003\u00b4\u0722\b\u00b4\u0003\u00b4"+ + "\u0724\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ + "\u0005\u00b5\u072b\b\u00b5\n\u00b5\f\u00b5\u072e\t\u00b5\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b6\u0003\u00b6\u0733\b\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b7\u0001\u00b7\u0003\u00b7\u0739\b\u00b7\u0001\u00b8\u0001\u00b8\u0003"+ + "\u00b8\u073d\b\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ + "\u00b9\u0005\u00b9\u0744\b\u00b9\n\u00b9\f\u00b9\u0747\t\u00b9\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0003\u00ba"+ + "\u074f\b\u00ba\u0001\u00ba\u0003\u00ba\u0752\b\u00ba\u0001\u00bb\u0001"+ + "\u00bb\u0001\u00bc\u0003\u00bc\u0757\b\u00bc\u0001\u00bc\u0001\u00bc\u0003"+ + "\u00bc\u075b\b\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u076b\b\u00bf\u0003"+ + "\u00bf\u076d\b\u00bf\u0001\u00bf\u0003\u00bf\u0770\b\u00bf\u0001\u00bf"+ + "\u0003\u00bf\u0773\b\u00bf\u0003\u00bf\u0775\b\u00bf\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001"+ + "\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0003\u00c2\u0783"+ + "\b\u00c2\u0001\u00c2\u0001\u02f3\u0002\u00a2\u00b2\u00c3\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\u0172\u0174\u0176"+ + "\u0178\u017a\u017c\u017e\u0180\u0182\u0184\u0000\u0013\u0002\u0000eep"+ + "p\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\u0000qr\u0002\u0000nn\u009f\u009f\u0002\u0000"+ + "\u008a\u008d\u008f\u0090\u0001\u0000\u0096\u0097\u07e8\u0000\u0186\u0001"+ + "\u0000\u0000\u0000\u0002\u0189\u0001\u0000\u0000\u0000\u0004\u018c\u0001"+ + "\u0000\u0000\u0000\u0006\u018f\u0001\u0000\u0000\u0000\b\u0197\u0001\u0000"+ + "\u0000\u0000\n\u01a0\u0001\u0000\u0000\u0000\f\u01bb\u0001\u0000\u0000"+ + "\u0000\u000e\u01be\u0001\u0000\u0000\u0000\u0010\u01c6\u0001\u0000\u0000"+ + "\u0000\u0012\u01d3\u0001\u0000\u0000\u0000\u0014\u01e9\u0001\u0000\u0000"+ + "\u0000\u0016\u01f2\u0001\u0000\u0000\u0000\u0018\u01f4\u0001\u0000\u0000"+ + "\u0000\u001a\u01f6\u0001\u0000\u0000\u0000\u001c\u01f9\u0001\u0000\u0000"+ + "\u0000\u001e\u020d\u0001\u0000\u0000\u0000 \u020f\u0001\u0000\u0000\u0000"+ + "\"\u0211\u0001\u0000\u0000\u0000$\u0216\u0001\u0000\u0000\u0000&\u0221"+ + "\u0001\u0000\u0000\u0000(\u022e\u0001\u0000\u0000\u0000*\u0231\u0001\u0000"+ + "\u0000\u0000,\u023c\u0001\u0000\u0000\u0000.\u023e\u0001\u0000\u0000\u0000"+ + "0\u0243\u0001\u0000\u0000\u00002\u0248\u0001\u0000\u0000\u00004\u024d"+ + "\u0001\u0000\u0000\u00006\u0252\u0001\u0000\u0000\u00008\u025f\u0001\u0000"+ + "\u0000\u0000:\u0261\u0001\u0000\u0000\u0000<\u0263\u0001\u0000\u0000\u0000"+ + ">\u0268\u0001\u0000\u0000\u0000@\u026d\u0001\u0000\u0000\u0000B\u0272"+ + "\u0001\u0000\u0000\u0000D\u027b\u0001\u0000\u0000\u0000F\u0282\u0001\u0000"+ + "\u0000\u0000H\u028f\u0001\u0000\u0000\u0000J\u0293\u0001\u0000\u0000\u0000"+ + "L\u029e\u0001\u0000\u0000\u0000N\u02a6\u0001\u0000\u0000\u0000P\u02a8"+ + "\u0001\u0000\u0000\u0000R\u02bd\u0001\u0000\u0000\u0000T\u02bf\u0001\u0000"+ + "\u0000\u0000V\u02cb\u0001\u0000\u0000\u0000X\u02d7\u0001\u0000\u0000\u0000"+ + "Z\u02e7\u0001\u0000\u0000\u0000\\\u02f3\u0001\u0000\u0000\u0000^\u0302"+ + "\u0001\u0000\u0000\u0000`\u0305\u0001\u0000\u0000\u0000b\u030d\u0001\u0000"+ + "\u0000\u0000d\u030f\u0001\u0000\u0000\u0000f\u031a\u0001\u0000\u0000\u0000"+ + "h\u0322\u0001\u0000\u0000\u0000j\u0331\u0001\u0000\u0000\u0000l\u0333"+ + "\u0001\u0000\u0000\u0000n\u033b\u0001\u0000\u0000\u0000p\u0349\u0001\u0000"+ + "\u0000\u0000r\u0355\u0001\u0000\u0000\u0000t\u035f\u0001\u0000\u0000\u0000"+ + "v\u0363\u0001\u0000\u0000\u0000x\u0369\u0001\u0000\u0000\u0000z\u0381"+ + "\u0001\u0000\u0000\u0000|\u0389\u0001\u0000\u0000\u0000~\u0398\u0001\u0000"+ + "\u0000\u0000\u0080\u039a\u0001\u0000\u0000\u0000\u0082\u03a1\u0001\u0000"+ + "\u0000\u0000\u0084\u03aa\u0001\u0000\u0000\u0000\u0086\u03af\u0001\u0000"+ + "\u0000\u0000\u0088\u03b4\u0001\u0000\u0000\u0000\u008a\u03bd\u0001\u0000"+ + "\u0000\u0000\u008c\u03c4\u0001\u0000\u0000\u0000\u008e\u03c9\u0001\u0000"+ + "\u0000\u0000\u0090\u03cf\u0001\u0000\u0000\u0000\u0092\u03d4\u0001\u0000"+ + "\u0000\u0000\u0094\u03db\u0001\u0000\u0000\u0000\u0096\u03e5\u0001\u0000"+ + "\u0000\u0000\u0098\u03e9\u0001\u0000\u0000\u0000\u009a\u03f5\u0001\u0000"+ + "\u0000\u0000\u009c\u03f8\u0001\u0000\u0000\u0000\u009e\u03fc\u0001\u0000"+ + "\u0000\u0000\u00a0\u0403\u0001\u0000\u0000\u0000\u00a2\u041c\u0001\u0000"+ + "\u0000\u0000\u00a4\u0458\u0001\u0000\u0000\u0000\u00a6\u045a\u0001\u0000"+ + "\u0000\u0000\u00a8\u045d\u0001\u0000\u0000\u0000\u00aa\u0462\u0001\u0000"+ + "\u0000\u0000\u00ac\u046b\u0001\u0000\u0000\u0000\u00ae\u0479\u0001\u0000"+ + "\u0000\u0000\u00b0\u0483\u0001\u0000\u0000\u0000\u00b2\u0491\u0001\u0000"+ + "\u0000\u0000\u00b4\u04ac\u0001\u0000\u0000\u0000\u00b6\u04af\u0001\u0000"+ + "\u0000\u0000\u00b8\u04b7\u0001\u0000\u0000\u0000\u00ba\u04c0\u0001\u0000"+ + "\u0000\u0000\u00bc\u04cf\u0001\u0000\u0000\u0000\u00be\u04d1\u0001\u0000"+ + "\u0000\u0000\u00c0\u04e4\u0001\u0000\u0000\u0000\u00c2\u04f0\u0001\u0000"+ + "\u0000\u0000\u00c4\u04fb\u0001\u0000\u0000\u0000\u00c6\u04fd\u0001\u0000"+ + "\u0000\u0000\u00c8\u0500\u0001\u0000\u0000\u0000\u00ca\u051a\u0001\u0000"+ + "\u0000\u0000\u00cc\u051c\u0001\u0000\u0000\u0000\u00ce\u0521\u0001\u0000"+ + "\u0000\u0000\u00d0\u0535\u0001\u0000\u0000\u0000\u00d2\u0537\u0001\u0000"+ + "\u0000\u0000\u00d4\u0539\u0001\u0000\u0000\u0000\u00d6\u053c\u0001\u0000"+ + "\u0000\u0000\u00d8\u0546\u0001\u0000\u0000\u0000\u00da\u0550\u0001\u0000"+ + "\u0000\u0000\u00dc\u0553\u0001\u0000\u0000\u0000\u00de\u0558\u0001\u0000"+ + "\u0000\u0000\u00e0\u055a\u0001\u0000\u0000\u0000\u00e2\u0568\u0001\u0000"+ + "\u0000\u0000\u00e4\u0570\u0001\u0000\u0000\u0000\u00e6\u0578\u0001\u0000"+ + "\u0000\u0000\u00e8\u0580\u0001\u0000\u0000\u0000\u00ea\u0590\u0001\u0000"+ + "\u0000\u0000\u00ec\u0592\u0001\u0000\u0000\u0000\u00ee\u0596\u0001\u0000"+ + "\u0000\u0000\u00f0\u059c\u0001\u0000\u0000\u0000\u00f2\u05aa\u0001\u0000"+ + "\u0000\u0000\u00f4\u05b3\u0001\u0000\u0000\u0000\u00f6\u05bc\u0001\u0000"+ + "\u0000\u0000\u00f8\u05be\u0001\u0000\u0000\u0000\u00fa\u05c0\u0001\u0000"+ + "\u0000\u0000\u00fc\u05c4\u0001\u0000\u0000\u0000\u00fe\u05c7\u0001\u0000"+ + "\u0000\u0000\u0100\u05cb\u0001\u0000\u0000\u0000\u0102\u05cd\u0001\u0000"+ + "\u0000\u0000\u0104\u05d2\u0001\u0000\u0000\u0000\u0106\u05d6\u0001\u0000"+ + "\u0000\u0000\u0108\u05da\u0001\u0000\u0000\u0000\u010a\u05de\u0001\u0000"+ + "\u0000\u0000\u010c\u05e1\u0001\u0000\u0000\u0000\u010e\u05e3\u0001\u0000"+ + "\u0000\u0000\u0110\u05f8\u0001\u0000\u0000\u0000\u0112\u05fa\u0001\u0000"+ + "\u0000\u0000\u0114\u0610\u0001\u0000\u0000\u0000\u0116\u0618\u0001\u0000"+ + "\u0000\u0000\u0118\u061a\u0001\u0000\u0000\u0000\u011a\u0630\u0001\u0000"+ + "\u0000\u0000\u011c\u0638\u0001\u0000\u0000\u0000\u011e\u0640\u0001\u0000"+ + "\u0000\u0000\u0120\u0644\u0001\u0000\u0000\u0000\u0122\u0650\u0001\u0000"+ + "\u0000\u0000\u0124\u065a\u0001\u0000\u0000\u0000\u0126\u0665\u0001\u0000"+ + "\u0000\u0000\u0128\u066d\u0001\u0000\u0000\u0000\u012a\u0671\u0001\u0000"+ + "\u0000\u0000\u012c\u067a\u0001\u0000\u0000\u0000\u012e\u0684\u0001\u0000"+ + "\u0000\u0000\u0130\u0689\u0001\u0000\u0000\u0000\u0132\u068b\u0001\u0000"+ + "\u0000\u0000\u0134\u0692\u0001\u0000\u0000\u0000\u0136\u069a\u0001\u0000"+ + "\u0000\u0000\u0138\u069f\u0001\u0000\u0000\u0000\u013a\u06a1\u0001\u0000"+ + "\u0000\u0000\u013c\u06a3\u0001\u0000\u0000\u0000\u013e\u06a6\u0001\u0000"+ + "\u0000\u0000\u0140\u06ae\u0001\u0000\u0000\u0000\u0142\u06b0\u0001\u0000"+ + "\u0000\u0000\u0144\u06b4\u0001\u0000\u0000\u0000\u0146\u06bf\u0001\u0000"+ + "\u0000\u0000\u0148\u06c3\u0001\u0000\u0000\u0000\u014a\u06ca\u0001\u0000"+ + "\u0000\u0000\u014c\u06ce\u0001\u0000\u0000\u0000\u014e\u06d0\u0001\u0000"+ + "\u0000\u0000\u0150\u06e0\u0001\u0000\u0000\u0000\u0152\u06e7\u0001\u0000"+ + "\u0000\u0000\u0154\u06ef\u0001\u0000\u0000\u0000\u0156\u06f2\u0001\u0000"+ + "\u0000\u0000\u0158\u06f4\u0001\u0000\u0000\u0000\u015a\u0701\u0001\u0000"+ + "\u0000\u0000\u015c\u070c\u0001\u0000\u0000\u0000\u015e\u0711\u0001\u0000"+ + "\u0000\u0000\u0160\u0713\u0001\u0000\u0000\u0000\u0162\u0715\u0001\u0000"+ + "\u0000\u0000\u0164\u0717\u0001\u0000\u0000\u0000\u0166\u071b\u0001\u0000"+ + "\u0000\u0000\u0168\u071e\u0001\u0000\u0000\u0000\u016a\u0727\u0001\u0000"+ + "\u0000\u0000\u016c\u0732\u0001\u0000\u0000\u0000\u016e\u0738\u0001\u0000"+ + "\u0000\u0000\u0170\u073c\u0001\u0000\u0000\u0000\u0172\u073e\u0001\u0000"+ + "\u0000\u0000\u0174\u074e\u0001\u0000\u0000\u0000\u0176\u0753\u0001\u0000"+ + "\u0000\u0000\u0178\u0756\u0001\u0000\u0000\u0000\u017a\u075c\u0001\u0000"+ + "\u0000\u0000\u017c\u0760\u0001\u0000\u0000\u0000\u017e\u0765\u0001\u0000"+ + "\u0000\u0000\u0180\u0778\u0001\u0000\u0000\u0000\u0182\u077c\u0001\u0000"+ + "\u0000\u0000\u0184\u0782\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00a2"+ + "Q\u0000\u0187\u0188\u0005\u0000\u0000\u0001\u0188\u0001\u0001\u0000\u0000"+ + "\u0000\u0189\u018a\u0003\u00a4R\u0000\u018a\u018b\u0005\u0000\u0000\u0001"+ + "\u018b\u0003\u0001\u0000\u0000\u0000\u018c\u018d\u0003\u00c2a\u0000\u018d"+ + "\u018e\u0005\u0000\u0000\u0001\u018e\u0005\u0001\u0000\u0000\u0000\u018f"+ + "\u0194\u0003\b\u0004\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0193"+ + "\u0003\b\u0004\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0196\u0001"+ + "\u0000\u0000\u0000\u0194\u0192\u0001\u0000\u0000\u0000\u0194\u0195\u0001"+ + "\u0000\u0000\u0000\u0195\u0007\u0001\u0000\u0000\u0000\u0196\u0194\u0001"+ + "\u0000\u0000\u0000\u0197\u0199\u0005e\u0000\u0000\u0198\u019a\u0005<\u0000"+ + "\u0000\u0199\u0198\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000"+ + "\u0000\u019a\t\u0001\u0000\u0000\u0000\u019b\u019c\u0003\f\u0006\u0000"+ + "\u019c\u019d\u0003\u0184\u00c2\u0000\u019d\u019f\u0001\u0000\u0000\u0000"+ + "\u019e\u019b\u0001\u0000\u0000\u0000\u019f\u01a2\u0001\u0000\u0000\u0000"+ + "\u01a0\u019e\u0001\u0000\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000"+ + "\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000"+ + "\u01a3\u01a4\u0003\u00dam\u0000\u01a4\u01aa\u0003\u0184\u00c2\u0000\u01a5"+ + "\u01a6\u0003\u0012\t\u0000\u01a6\u01a7\u0003\u0184\u00c2\u0000\u01a7\u01a9"+ + "\u0001\u0000\u0000\u0000\u01a8\u01a5\u0001\u0000\u0000\u0000\u01a9\u01ac"+ + "\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa\u01ab"+ + "\u0001\u0000\u0000\u0000\u01ab\u01b6\u0001\u0000\u0000\u0000\u01ac\u01aa"+ + "\u0001\u0000\u0000\u0000\u01ad\u01b1\u0003\u0086C\u0000\u01ae\u01b1\u0003"+ + "\u00deo\u0000\u01af\u01b1\u0003\u0014\n\u0000\u01b0\u01ad\u0001\u0000"+ + "\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b0\u01af\u0001\u0000"+ + "\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b3\u0003\u0184"+ + "\u00c2\u0000\u01b3\u01b5\u0001\u0000\u0000\u0000\u01b4\u01b0\u0001\u0000"+ + "\u0000\u0000\u01b5\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000"+ + "\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b9\u0001\u0000"+ + "\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005\u0000"+ + "\u0000\u0001\u01ba\u000b\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005E\u0000"+ + "\u0000\u01bc\u01bd\u0003\u00a2Q\u0000\u01bd\r\u0001\u0000\u0000\u0000"+ + "\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a2Q\u0000\u01c0\u000f"+ + "\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u000e\u0007\u0000\u01c2\u01c3"+ + "\u0003\u0184\u00c2\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4\u01c1"+ + "\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4"+ + "\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01ca"+ + "\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cb"+ + "\u0007\u0000\u0000\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca\u01cb"+ + "\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd"+ + "\u0003\u00dcn\u0000\u01cd\u0011\u0001\u0000\u0000\u0000\u01ce\u01cf\u0003"+ + "\u000e\u0007\u0000\u01cf\u01d0\u0003\u0184\u00c2\u0000\u01d0\u01d2\u0001"+ + "\u0000\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001"+ + "\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d4\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001"+ + "\u0000\u0000\u0000\u01d6\u01d7\u0005a\u0000\u0000\u01d7\u01e4\u0003\u0010"+ + "\b\u0000\u01d8\u01d9\u0005a\u0000\u0000\u01d9\u01df\u0005f\u0000\u0000"+ + "\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003\u0184\u00c2\u0000\u01dc"+ + "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ + "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ + "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1"+ + "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005g\u0000\u0000\u01e3\u01d6"+ + "\u0001\u0000\u0000\u0000\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0013"+ + "\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003x<\u0000\u01e6\u01ea\u0003\u008e"+ + "G\u0000\u01e7\u01ea\u0003\u0092I\u0000\u01e8\u01ea\u0003\u008cF\u0000"+ + "\u01e9\u01e5\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000"+ + "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000"+ + "\u01ea\u0015\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000"+ + "\u01ec\u01f3\u0003\u00a4R\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee"+ + "\u01f3\u0003,\u0016\u0000\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3"+ + "\u0003\u00a2Q\u0000\u01f1\u01f3\u0003d2\u0000\u01f2\u01eb\u0001\u0000"+ + "\u0000\u0000\u01f2\u01ed\u0001\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000"+ + "\u0000\u0000\u01f2\u01f1\u0001\u0000\u0000\u0000\u01f3\u0017\u0001\u0000"+ + "\u0000\u0000\u01f4\u01f5\u0003\u001a\r\u0000\u01f5\u0019\u0001\u0000\u0000"+ + "\u0000\u01f6\u01f7\u0003\\.\u0000\u01f7\u01f8\u0003\u001c\u000e\u0000"+ + "\u01f8\u001b\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa"+ + "\u01fc\u0005f\u0000\u0000\u01fb\u01fd\u0003\u00f4z\u0000\u01fc\u01fb\u0001"+ + "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001"+ + "\u0000\u0000\u0000\u01fe\u01ff\u0005g\u0000\u0000\u01ff\u001d\u0001\u0000"+ + "\u0000\u0000\u0200\u020e\u0003D\"\u0000\u0201\u020e\u0003B!\u0000\u0202"+ + "\u020e\u0003@ \u0000\u0203\u020e\u0003\"\u0011\u0000\u0204\u020e\u0003"+ + ">\u001f\u0000\u0205\u020e\u00036\u001b\u0000\u0206\u020e\u0003<\u001e"+ + "\u0000\u0207\u020e\u00034\u001a\u0000\u0208\u020e\u00030\u0018\u0000\u0209"+ + "\u020e\u0003.\u0017\u0000\u020a\u020e\u00032\u0019\u0000\u020b\u020e\u0003"+ + " \u0010\u0000\u020c\u020e\u0003F#\u0000\u020d\u0200\u0001\u0000\u0000"+ + "\u0000\u020d\u0201\u0001\u0000\u0000\u0000\u020d\u0202\u0001\u0000\u0000"+ + "\u0000\u020d\u0203\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000"+ + "\u0000\u020d\u0205\u0001\u0000\u0000\u0000\u020d\u0206\u0001\u0000\u0000"+ + "\u0000\u020d\u0207\u0001\u0000\u0000\u0000\u020d\u0208\u0001\u0000\u0000"+ + "\u0000\u020d\u0209\u0001\u0000\u0000\u0000\u020d\u020a\u0001\u0000\u0000"+ + "\u0000\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000"+ + "\u0000\u020e\u001f\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0003\u0000"+ + "\u0000\u0210!\u0001\u0000\u0000\u0000\u0211\u0212\u0005^\u0000\u0000\u0212"+ + "\u0213\u0005j\u0000\u0000\u0213\u0214\u0003\u00c2a\u0000\u0214\u0215\u0005"+ + "k\u0000\u0000\u0215#\u0001\u0000\u0000\u0000\u0216\u021b\u0003&\u0013"+ + "\u0000\u0217\u0218\u0005m\u0000\u0000\u0218\u021a\u0003&\u0013\u0000\u0219"+ + "\u0217\u0001\u0000\u0000\u0000\u021a\u021d\u0001\u0000\u0000\u0000\u021b"+ + "\u0219\u0001\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c"+ + "\u021f\u0001\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021e"+ + "\u0220\u0005m\u0000\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220"+ + "\u0001\u0000\u0000\u0000\u0220%\u0001\u0000\u0000\u0000\u0221\u0226\u0005"+ + "e\u0000\u0000\u0222\u0223\u0005m\u0000\u0000\u0223\u0225\u0005e\u0000"+ + "\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000"+ + "\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000"+ + "\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000"+ + "\u0000\u0229\u022a\u0003\u013a\u009d\u0000\u022a\'\u0001\u0000\u0000\u0000"+ + "\u022b\u022d\u0003*\u0015\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ + "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ + "\u022f\u0001\u0000\u0000\u0000\u022f)\u0001\u0000\u0000\u0000\u0230\u022e"+ + "\u0001\u0000\u0000\u0000\u0231\u0232\u0005h\u0000\u0000\u0232\u0237\u0003"+ + "\u00a2Q\u0000\u0233\u0234\u0005m\u0000\u0000\u0234\u0236\u0003\u00a2Q"+ + "\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000"+ + "\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000"+ + "\u0000\u0238\u023a\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000"+ + "\u0000\u023a\u023b\u0005i\u0000\u0000\u023b+\u0001\u0000\u0000\u0000\u023c"+ + "\u023d\u0003\u00b2Y\u0000\u023d-\u0001\u0000\u0000\u0000\u023e\u023f\u0005"+ + "1\u0000\u0000\u023f\u0240\u0005f\u0000\u0000\u0240\u0241\u0003\u00a2Q"+ + "\u0000\u0241\u0242\u0005g\u0000\u0000\u0242/\u0001\u0000\u0000\u0000\u0243"+ + "\u0244\u00057\u0000\u0000\u0244\u0245\u0005j\u0000\u0000\u0245\u0246\u0003"+ + "\u00c2a\u0000\u0246\u0247\u0005k\u0000\u0000\u02471\u0001\u0000\u0000"+ + "\u0000\u0248\u0249\u00052\u0000\u0000\u0249\u024a\u0005f\u0000\u0000\u024a"+ + "\u024b\u0003\u00a2Q\u0000\u024b\u024c\u0005g\u0000\u0000\u024c3\u0001"+ + "\u0000\u0000\u0000\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f\u0005"+ + "f\u0000\u0000\u024f\u0250\u0003\u00a2Q\u0000\u0250\u0251\u0005g\u0000"+ + "\u0000\u02515\u0001\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000\u0000"+ + "\u0253\u0254\u0005j\u0000\u0000\u0254\u0255\u00038\u001c\u0000\u0255\u0256"+ + "\u0005k\u0000\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253\u0001"+ + "\u0000\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0001"+ + "\u0000\u0000\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0003\u00a2"+ + "Q\u0000\u025b\u025c\u0005g\u0000\u0000\u025c7\u0001\u0000\u0000\u0000"+ + "\u025d\u0260\u0003:\u001d\u0000\u025e\u0260\u0005\u0013\u0000\u0000\u025f"+ + "\u025d\u0001\u0000\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000\u0260"+ + "9\u0001\u0000\u0000\u0000\u0261\u0262\u0005e\u0000\u0000\u0262;\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0005\u0012\u0000\u0000\u0264\u0265\u0005"+ + "f\u0000\u0000\u0265\u0266\u0003\u00a2Q\u0000\u0266\u0267\u0005g\u0000"+ + "\u0000\u0267=\u0001\u0000\u0000\u0000\u0268\u0269\u0005:\u0000\u0000\u0269"+ + "\u026a\u0005f\u0000\u0000\u026a\u026b\u0003\u00a2Q\u0000\u026b\u026c\u0005"+ + "g\u0000\u0000\u026c?\u0001\u0000\u0000\u0000\u026d\u026e\u00059\u0000"+ + "\u0000\u026e\u026f\u0005f\u0000\u0000\u026f\u0270\u0003\u00a2Q\u0000\u0270"+ + "\u0271\u0005g\u0000\u0000\u0271A\u0001\u0000\u0000\u0000\u0272\u0273\u0005"+ + "\u0016\u0000\u0000\u0273\u0274\u0005f\u0000\u0000\u0274\u0277\u0003\u00a2"+ + "Q\u0000\u0275\u0276\u0005m\u0000\u0000\u0276\u0278\u0003\u00a2Q\u0000"+ + "\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000"+ + "\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0005g\u0000\u0000\u027a"+ + "C\u0001\u0000\u0000\u0000\u027b\u027c\u0007\u0004\u0000\u0000\u027c\u027d"+ + "\u0005j\u0000\u0000\u027d\u027e\u0003\u00a2Q\u0000\u027e\u027f\u0005="+ + "\u0000\u0000\u027f\u0280\u0003\u00a2Q\u0000\u0280\u0281\u0005k\u0000\u0000"+ + "\u0281E\u0001\u0000\u0000\u0000\u0282\u0283\u00056\u0000\u0000\u0283\u0284"+ + "\u0003\u00a2Q\u0000\u0284\u028a\u0005h\u0000\u0000\u0285\u0286\u0003H"+ + "$\u0000\u0286\u0287\u0003\u0184\u00c2\u0000\u0287\u0289\u0001\u0000\u0000"+ + "\u0000\u0288\u0285\u0001\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000"+ + "\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000"+ + "\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000"+ + "\u0000\u028d\u028e\u0005i\u0000\u0000\u028eG\u0001\u0000\u0000\u0000\u028f"+ + "\u0290\u0003h4\u0000\u0290\u0291\u0005o\u0000\u0000\u0291\u0292\u0003"+ + "\u00a2Q\u0000\u0292I\u0001\u0000\u0000\u0000\u0293\u0294\u0005j\u0000"+ + "\u0000\u0294\u0299\u0003L&\u0000\u0295\u0296\u0005m\u0000\u0000\u0296"+ + "\u0298\u0003L&\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u029b\u0001"+ + "\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001"+ + "\u0000\u0000\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+ + "\u0000\u0000\u0000\u029c\u029d\u0005k\u0000\u0000\u029dK\u0001\u0000\u0000"+ + "\u0000\u029e\u029f\u0003\u00a2Q\u0000\u029f\u02a0\u0005l\u0000\u0000\u02a0"+ + "\u02a1\u0003\u00a2Q\u0000\u02a1M\u0001\u0000\u0000\u0000\u02a2\u02a7\u0003"+ + "Z-\u0000\u02a3\u02a7\u0003X,\u0000\u02a4\u02a7\u0003P(\u0000\u02a5\u02a7"+ + "\u0003T*\u0000\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001\u0000"+ + "\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001\u0000"+ + "\u0000\u0000\u02a7O\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000\u0000"+ + "\u02a9\u02af\u0005h\u0000\u0000\u02aa\u02ab\u0003R)\u0000\u02ab\u02ac"+ + "\u0003\u0184\u00c2\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad\u02aa"+ + "\u0001\u0000\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad"+ + "\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b2"+ + "\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b3"+ + "\u0005i\u0000\u0000\u02b3Q\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005M"+ + "\u0000\u0000\u02b5\u02b6\u0005e\u0000\u0000\u02b6\u02be\u0003\u014a\u00a5"+ + "\u0000\u02b7\u02b8\u00054\u0000\u0000\u02b8\u02b9\u0005h\u0000\u0000\u02b9"+ + "\u02ba\u0003\u00a2Q\u0000\u02ba\u02bb\u0003\u0184\u00c2\u0000\u02bb\u02bc"+ + "\u0005i\u0000\u0000\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001"+ + "\u0000\u0000\u0000\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beS\u0001\u0000"+ + "\u0000\u0000\u02bf\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005h\u0000\u0000"+ + "\u02c1\u02c2\u0003V+\u0000\u02c2\u02c3\u0003\u0184\u00c2\u0000\u02c3\u02c5"+ + "\u0001\u0000\u0000\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8"+ + "\u0001\u0000\u0000\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7"+ + "\u0001\u0000\u0000\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6"+ + "\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02caU\u0001\u0000"+ + "\u0000\u0000\u02cb\u02cc\u0005e\u0000\u0000\u02cc\u02d2\u0005h\u0000\u0000"+ + "\u02cd\u02ce\u0003\u0174\u00ba\u0000\u02ce\u02cf\u0003\u0184\u00c2\u0000"+ + "\u02cf\u02d1\u0001\u0000\u0000\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000"+ + "\u02d1\u02d4\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000"+ + "\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000"+ + "\u02d4\u02d2\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005i\u0000\u0000\u02d6"+ + "W\u0001\u0000\u0000\u0000\u02d7\u02d8\u0005\u001b\u0000\u0000\u02d8\u02d9"+ + "\u0005j\u0000\u0000\u02d9\u02da\u0005k\u0000\u0000\u02da\u02db\u0003\u013a"+ + "\u009d\u0000\u02dbY\u0001\u0000\u0000\u0000\u02dc\u02dd\u0007\u0005\u0000"+ + "\u0000\u02dd\u02de\u0005j\u0000\u0000\u02de\u02df\u0003\u00c2a\u0000\u02df"+ + "\u02e0\u0005k\u0000\u0000\u02e0\u02e8\u0001\u0000\u0000\u0000\u02e1\u02e2"+ + "\u0005+\u0000\u0000\u02e2\u02e3\u0005j\u0000\u0000\u02e3\u02e4\u0003\u00c2"+ + "a\u0000\u02e4\u02e5\u0005k\u0000\u0000\u02e5\u02e6\u0003\u00c2a\u0000"+ + "\u02e6\u02e8\u0001\u0000\u0000\u0000\u02e7\u02dc\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e1\u0001\u0000\u0000\u0000\u02e8[\u0001\u0000\u0000\u0000\u02e9"+ + "\u02ef\u0003^/\u0000\u02ea\u02eb\u0005\u000e\u0000\u0000\u02eb\u02ef\u0006"+ + ".\uffff\uffff\u0000\u02ec\u02ed\u0005C\u0000\u0000\u02ed\u02ef\u0006."+ + "\uffff\uffff\u0000\u02ee\u02e9\u0001\u0000\u0000\u0000\u02ee\u02ea\u0001"+ + "\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001"+ + "\u0000\u0000\u0000\u02f0\u02f2\u0003\u0184\u00c2\u0000\u02f1\u02ee\u0001"+ + "\u0000\u0000\u0000\u02f2\u02f5\u0001\u0000\u0000\u0000\u02f3\u02f4\u0001"+ + "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f4\u02f8\u0001"+ + "\u0000\u0000\u0000\u02f5\u02f3\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005"+ + "\u000e\u0000\u0000\u02f7\u02f9\u0006.\uffff\uffff\u0000\u02f8\u02f6\u0001"+ + "\u0000\u0000\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9]\u0001\u0000"+ + "\u0000\u0000\u02fa\u02fb\u0005\t\u0000\u0000\u02fb\u0303\u0003b1\u0000"+ + "\u02fc\u02fd\u0005\n\u0000\u0000\u02fd\u0303\u0003b1\u0000\u02fe\u02ff"+ + "\u0005\u000b\u0000\u0000\u02ff\u0303\u0003b1\u0000\u0300\u0301\u0005\r"+ + "\u0000\u0000\u0301\u0303\u0003`0\u0000\u0302\u02fa\u0001\u0000\u0000\u0000"+ + "\u0302\u02fc\u0001\u0000\u0000\u0000\u0302\u02fe\u0001\u0000\u0000\u0000"+ + "\u0302\u0300\u0001\u0000\u0000\u0000\u0303_\u0001\u0000\u0000\u0000\u0304"+ + "\u0306\u0003\u00e6s\u0000\u0305\u0304\u0001\u0000\u0000\u0000\u0305\u0306"+ + "\u0001\u0000\u0000\u0000\u0306\u0309\u0001\u0000\u0000\u0000\u0307\u0308"+ + "\u0005\\\u0000\u0000\u0308\u030a\u0003\u00a2Q\u0000\u0309\u0307\u0001"+ + "\u0000\u0000\u0000\u0309\u030a\u0001\u0000\u0000\u0000\u030aa\u0001\u0000"+ + "\u0000\u0000\u030b\u030e\u0001\u0000\u0000\u0000\u030c\u030e\u0003\u00a2"+ + "Q\u0000\u030d\u030b\u0001\u0000\u0000\u0000\u030d\u030c\u0001\u0000\u0000"+ + "\u0000\u030ec\u0001\u0000\u0000\u0000\u030f\u0310\u00056\u0000\u0000\u0310"+ + "\u0311\u0003\u00a2Q\u0000\u0311\u0315\u0005h\u0000\u0000\u0312\u0314\u0003"+ + "f3\u0000\u0313\u0312\u0001\u0000\u0000\u0000\u0314\u0317\u0001\u0000\u0000"+ + "\u0000\u0315\u0313\u0001\u0000\u0000\u0000\u0315\u0316\u0001\u0000\u0000"+ + "\u0000\u0316\u0318\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000\u0000"+ + "\u0000\u0318\u0319\u0005i\u0000\u0000\u0319e\u0001\u0000\u0000\u0000\u031a"+ + "\u031b\u0003h4\u0000\u031b\u031d\u0005o\u0000\u0000\u031c\u031e\u0003"+ + "\u00f4z\u0000\u031d\u031c\u0001\u0000\u0000\u0000\u031d\u031e\u0001\u0000"+ + "\u0000\u0000\u031eg\u0001\u0000\u0000\u0000\u031f\u0320\u0005P\u0000\u0000"+ + "\u0320\u0323\u0003j5\u0000\u0321\u0323\u0005L\u0000\u0000\u0322\u031f"+ + "\u0001\u0000\u0000\u0000\u0322\u0321\u0001\u0000\u0000\u0000\u0323i\u0001"+ + "\u0000\u0000\u0000\u0324\u0325\u0005%\u0000\u0000\u0325\u0332\u0005e\u0000"+ + "\u0000\u0326\u0327\u0003\u00cae\u0000\u0327\u032c\u0005h\u0000\u0000\u0328"+ + "\u032a\u0003l6\u0000\u0329\u032b\u0005m\u0000\u0000\u032a\u0329\u0001"+ + "\u0000\u0000\u0000\u032a\u032b\u0001\u0000\u0000\u0000\u032b\u032d\u0001"+ + "\u0000\u0000\u0000\u032c\u0328\u0001\u0000\u0000\u0000\u032c\u032d\u0001"+ + "\u0000\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000\u032e\u032f\u0005"+ + "i\u0000\u0000\u032f\u0332\u0001\u0000\u0000\u0000\u0330\u0332\u0003\u00a2"+ + "Q\u0000\u0331\u0324\u0001\u0000\u0000\u0000\u0331\u0326\u0001\u0000\u0000"+ + "\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0332k\u0001\u0000\u0000\u0000"+ + "\u0333\u0338\u0003j5\u0000\u0334\u0335\u0005m\u0000\u0000\u0335\u0337"+ + "\u0003j5\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0337\u033a\u0001\u0000"+ + "\u0000\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0339\u0001\u0000"+ + "\u0000\u0000\u0339m\u0001\u0000\u0000\u0000\u033a\u0338\u0001\u0000\u0000"+ + "\u0000\u033b\u0340\u0005h\u0000\u0000\u033c\u033d\u0005;\u0000\u0000\u033d"+ + "\u033e\u0003\u00e4r\u0000\u033e\u033f\u0003\u0184\u00c2\u0000\u033f\u0341"+ + "\u0001\u0000\u0000\u0000\u0340\u033c\u0001\u0000\u0000\u0000\u0340\u0341"+ + "\u0001\u0000\u0000\u0000\u0341\u0343\u0001\u0000\u0000\u0000\u0342\u0344"+ + "\u0003\u00f4z\u0000\u0343\u0342\u0001\u0000\u0000\u0000\u0343\u0344\u0001"+ + "\u0000\u0000\u0000\u0344\u0345\u0001\u0000\u0000\u0000\u0345\u0346\u0005"+ + "i\u0000\u0000\u0346o\u0001\u0000\u0000\u0000\u0347\u034a\u0003\u0164\u00b2"+ + "\u0000\u0348\u034a\u0005e\u0000\u0000\u0349\u0347\u0001\u0000\u0000\u0000"+ + "\u0349\u0348\u0001\u0000\u0000\u0000\u034a\u0353\u0001\u0000\u0000\u0000"+ + "\u034b\u0350\u0005h\u0000\u0000\u034c\u034e\u0003r9\u0000\u034d\u034f"+ + "\u0005m\u0000\u0000\u034e\u034d\u0001\u0000\u0000\u0000\u034e\u034f\u0001"+ + "\u0000\u0000\u0000\u034f\u0351\u0001\u0000\u0000\u0000\u0350\u034c\u0001"+ + "\u0000\u0000\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0352\u0001"+ + "\u0000\u0000\u0000\u0352\u0354\u0005i\u0000\u0000\u0353\u034b\u0001\u0000"+ + "\u0000\u0000\u0353\u0354\u0001\u0000\u0000\u0000\u0354q\u0001\u0000\u0000"+ + "\u0000\u0355\u035a\u0003t:\u0000\u0356\u0357\u0005m\u0000\u0000\u0357"+ + "\u0359\u0003t:\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0359\u035c\u0001"+ + "\u0000\u0000\u0000\u035a\u0358\u0001\u0000\u0000\u0000\u035a\u035b\u0001"+ + "\u0000\u0000\u0000\u035bs\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000"+ + "\u0000\u0000\u035d\u035e\u0005e\u0000\u0000\u035e\u0360\u0005o\u0000\u0000"+ + "\u035f\u035d\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000"+ + "\u0360\u0361\u0001\u0000\u0000\u0000\u0361\u0362\u0003\u00a2Q\u0000\u0362"+ + "u\u0001\u0000\u0000\u0000\u0363\u0364\u0005G\u0000\u0000\u0364\u0365\u0003"+ + "\u00a2Q\u0000\u0365\u0366\u0005\u000f\u0000\u0000\u0366\u0367\u0003p8"+ + "\u0000\u0367\u0368\u0003\u00f2y\u0000\u0368w\u0001\u0000\u0000\u0000\u0369"+ + "\u036a\u0003\u00c2a\u0000\u036a\u036b\u0005\u000f\u0000\u0000\u036b\u037e"+ + "\u0003\u00c2a\u0000\u036c\u0372\u0005h\u0000\u0000\u036d\u036e\u0003\u0080"+ + "@\u0000\u036e\u036f\u0003\u0184\u00c2\u0000\u036f\u0371\u0001\u0000\u0000"+ + "\u0000\u0370\u036d\u0001\u0000\u0000\u0000\u0371\u0374\u0001\u0000\u0000"+ + "\u0000\u0372\u0370\u0001\u0000\u0000\u0000\u0372\u0373\u0001\u0000\u0000"+ + "\u0000\u0373\u037a\u0001\u0000\u0000\u0000\u0374\u0372\u0001\u0000\u0000"+ + "\u0000\u0375\u0376\u0003z=\u0000\u0376\u0377\u0003\u0184\u00c2\u0000\u0377"+ + "\u0379\u0001\u0000\u0000\u0000\u0378\u0375\u0001\u0000\u0000\u0000\u0379"+ + "\u037c\u0001\u0000\u0000\u0000\u037a\u0378\u0001\u0000\u0000\u0000\u037a"+ + "\u037b\u0001\u0000\u0000\u0000\u037b\u037d\u0001\u0000\u0000\u0000\u037c"+ + "\u037a\u0001\u0000\u0000\u0000\u037d\u037f\u0005i\u0000\u0000\u037e\u036c"+ + "\u0001\u0000\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037fy\u0001"+ + "\u0000\u0000\u0000\u0380\u0382\u0005\u000e\u0000\u0000\u0381\u0380\u0001"+ + "\u0000\u0000\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0001"+ + "\u0000\u0000\u0000\u0383\u0384\u0003|>\u0000\u0384\u0385\u0005e\u0000"+ + "\u0000\u0385\u0387\u0003\u014a\u00a5\u0000\u0386\u0388\u0003\u00f2y\u0000"+ + "\u0387\u0386\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000"+ + "\u0388{\u0001\u0000\u0000\u0000\u0389\u038b\u0005f\u0000\u0000\u038a\u038c"+ + "\u0005e\u0000\u0000\u038b\u038a\u0001\u0000\u0000\u0000\u038b\u038c\u0001"+ + "\u0000\u0000\u0000\u038c\u038e\u0001\u0000\u0000\u0000\u038d\u038f\u0005"+ + "\u0087\u0000\u0000\u038e\u038d\u0001\u0000\u0000\u0000\u038e\u038f\u0001"+ + "\u0000\u0000\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0003"+ + "\u0130\u0098\u0000\u0391\u0392\u0005g\u0000\u0000\u0392}\u0001\u0000\u0000"+ + "\u0000\u0393\u0399\u0003\u00b2Y\u0000\u0394\u0395\u0003\u00c2a\u0000\u0395"+ + "\u0396\u0005p\u0000\u0000\u0396\u0397\u0005e\u0000\u0000\u0397\u0399\u0001"+ + "\u0000\u0000\u0000\u0398\u0393\u0001\u0000\u0000\u0000\u0398\u0394\u0001"+ + "\u0000\u0000\u0000\u0399\u007f\u0001\u0000\u0000\u0000\u039a\u039b\u0005"+ + "8\u0000\u0000\u039b\u039c\u0005e\u0000\u0000\u039c\u039f\u0005s\u0000"+ + "\u0000\u039d\u03a0\u0003~?\u0000\u039e\u03a0\u0003\u0162\u00b1\u0000\u039f"+ + "\u039d\u0001\u0000\u0000\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u03a0"+ + "\u0081\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005/\u0000\u0000\u03a2\u03a3"+ + "\u0005f\u0000\u0000\u03a3\u03a6\u0003\u00c2a\u0000\u03a4\u03a5\u0005m"+ + "\u0000\u0000\u03a5\u03a7\u0003\u00e6s\u0000\u03a6\u03a4\u0001\u0000\u0000"+ + "\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u03a8\u0001\u0000\u0000"+ + "\u0000\u03a8\u03a9\u0005g\u0000\u0000\u03a9\u0083\u0001\u0000\u0000\u0000"+ + "\u03aa\u03ab\u0005.\u0000\u0000\u03ab\u03ac\u0005f\u0000\u0000\u03ac\u03ad"+ + "\u0003\u00c2a\u0000\u03ad\u03ae\u0005g\u0000\u0000\u03ae\u0085\u0001\u0000"+ + "\u0000\u0000\u03af\u03b2\u0003\\.\u0000\u03b0\u03b3\u0003\u0088D\u0000"+ + "\u03b1\u03b3\u0003\u008aE\u0000\u03b2\u03b0\u0001\u0000\u0000\u0000\u03b2"+ + "\u03b1\u0001\u0000\u0000\u0000\u03b3\u0087\u0001\u0000\u0000\u0000\u03b4"+ + "\u03b5\u0005M\u0000\u0000\u03b5\u03b7\u0005e\u0000\u0000\u03b6\u03b8\u0003"+ + "\u0150\u00a8\u0000\u03b7\u03b6\u0001\u0000\u0000\u0000\u03b7\u03b8\u0001"+ + "\u0000\u0000\u0000\u03b8\u03b9\u0001\u0000\u0000\u0000\u03b9\u03bb\u0003"+ + "\u014a\u00a5\u0000\u03ba\u03bc\u0003n7\u0000\u03bb\u03ba\u0001\u0000\u0000"+ + "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u0089\u0001\u0000\u0000"+ + "\u0000\u03bd\u03be\u0005M\u0000\u0000\u03be\u03bf\u0003\u0098L\u0000\u03bf"+ + "\u03c0\u0005e\u0000\u0000\u03c0\u03c2\u0003\u014a\u00a5\u0000\u03c1\u03c3"+ + "\u0003n7\u0000\u03c2\u03c1\u0001\u0000\u0000\u0000\u03c2\u03c3\u0001\u0000"+ + "\u0000\u0000\u03c3\u008b\u0001\u0000\u0000\u0000\u03c4\u03c7\u0005\u001b"+ + "\u0000\u0000\u03c5\u03c8\u0003\u0086C\u0000\u03c6\u03c8\u0003\u00deo\u0000"+ + "\u03c7\u03c5\u0001\u0000\u0000\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000"+ + "\u03c8\u008d\u0001\u0000\u0000\u0000\u03c9\u03ca\u00058\u0000\u0000\u03ca"+ + "\u03cb\u0005e\u0000\u0000\u03cb\u03cd\u0003\u014e\u00a7\u0000\u03cc\u03ce"+ + "\u0003\u0090H\u0000\u03cd\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001"+ + "\u0000\u0000\u0000\u03ce\u008f\u0001\u0000\u0000\u0000\u03cf\u03d0\u0005"+ + "h\u0000\u0000\u03d0\u03d1\u0003\u00a2Q\u0000\u03d1\u03d2\u0003\u0184\u00c2"+ + "\u0000\u03d2\u03d3\u0005i\u0000\u0000\u03d3\u0091\u0001\u0000\u0000\u0000"+ + "\u03d4\u03d5\u00058\u0000\u0000\u03d5\u03d6\u0003\u0098L\u0000\u03d6\u03d7"+ + "\u0005e\u0000\u0000\u03d7\u03d9\u0003\u014e\u00a7\u0000\u03d8\u03da\u0003"+ + "\u0090H\u0000\u03d9\u03d8\u0001\u0000\u0000\u0000\u03d9\u03da\u0001\u0000"+ + "\u0000\u0000\u03da\u0093\u0001\u0000\u0000\u0000\u03db\u03e3\u0003\u0006"+ + "\u0003\u0000\u03dc\u03df\u0003\u00c2a\u0000\u03dd\u03de\u0005l\u0000\u0000"+ + "\u03de\u03e0\u0003\u00e6s\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03df"+ + "\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e4\u0001\u0000\u0000\u0000\u03e1"+ + "\u03e2\u0005l\u0000\u0000\u03e2\u03e4\u0003\u00e6s\u0000\u03e3\u03dc\u0001"+ + "\u0000\u0000\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e4\u0095\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e6\u0003\u0006\u0003\u0000\u03e6\u03e7\u0005"+ + "s\u0000\u0000\u03e7\u03e8\u0003\u00e6s\u0000\u03e8\u0097\u0001\u0000\u0000"+ + "\u0000\u03e9\u03eb\u0005f\u0000\u0000\u03ea\u03ec\u0003\b\u0004\u0000"+ + "\u03eb\u03ea\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000"+ + "\u03ec\u03ed\u0001\u0000\u0000\u0000\u03ed\u03ef\u0003\u00c2a\u0000\u03ee"+ + "\u03f0\u0005m\u0000\u0000\u03ef\u03ee\u0001\u0000\u0000\u0000\u03ef\u03f0"+ + "\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2"+ + "\u0005g\u0000\u0000\u03f2\u0099\u0001\u0000\u0000\u0000\u03f3\u03f6\u0003"+ + "\u009cN\u0000\u03f4\u03f6\u0003\u009eO\u0000\u03f5\u03f3\u0001\u0000\u0000"+ + "\u0000\u03f5\u03f4\u0001\u0000\u0000\u0000\u03f6\u009b\u0001\u0000\u0000"+ + "\u0000\u03f7\u03f9\u0003\u00e4r\u0000\u03f8\u03f7\u0001\u0000\u0000\u0000"+ + "\u03f8\u03f9\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000"+ + "\u03fa\u03fb\u0003\u00a0P\u0000\u03fb\u009d\u0001\u0000\u0000\u0000\u03fc"+ + "\u03fe\u0005\u001b\u0000\u0000\u03fd\u03ff\u0003\u00e4r\u0000\u03fe\u03fd"+ + "\u0001\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400"+ + "\u0001\u0000\u0000\u0000\u0400\u0401\u0003\u00a0P\u0000\u0401\u009f\u0001"+ + "\u0000\u0000\u0000\u0402\u0404\u0005t\u0000\u0000\u0403\u0402\u0001\u0000"+ + "\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000"+ + "\u0000\u0000\u0405\u0406\u0003\u00c2a\u0000\u0406\u00a1\u0001\u0000\u0000"+ + "\u0000\u0407\u0408\u0006Q\uffff\uffff\u0000\u0408\u0409\u0007\u0006\u0000"+ + "\u0000\u0409\u041d\u0003\u00a2Q\u000f\u040a\u041d\u0003\u00b2Y\u0000\u040b"+ + "\u040c\u0005\u0019\u0000\u0000\u040c\u040d\u0003,\u0016\u0000\u040d\u040e"+ + "\u0005\u001c\u0000\u0000\u040e\u040f\u0003\u00a2Q\u0003\u040f\u041d\u0001"+ + "\u0000\u0000\u0000\u0410\u0411\u0005\u001a\u0000\u0000\u0411\u0412\u0003"+ + "\u0096K\u0000\u0412\u0413\u0005\u001c\u0000\u0000\u0413\u0414\u0003\u00a2"+ + "Q\u0002\u0414\u041d\u0001\u0000\u0000\u0000\u0415\u0416\u0007\u0007\u0000"+ + "\u0000\u0416\u0417\u0003$\u0012\u0000\u0417\u0418\u0005o\u0000\u0000\u0418"+ + "\u0419\u0005o\u0000\u0000\u0419\u041a\u0003(\u0014\u0000\u041a\u041b\u0003"+ + "\u00a2Q\u0001\u041b\u041d\u0001\u0000\u0000\u0000\u041c\u0407\u0001\u0000"+ + "\u0000\u0000\u041c\u040a\u0001\u0000\u0000\u0000\u041c\u040b\u0001\u0000"+ + "\u0000\u0000\u041c\u0410\u0001\u0000\u0000\u0000\u041c\u0415\u0001\u0000"+ + "\u0000\u0000\u041d\u0441\u0001\u0000\u0000\u0000\u041e\u041f\n\r\u0000"+ + "\u0000\u041f\u0420\u0007\b\u0000\u0000\u0420\u0440\u0003\u00a2Q\u000e"+ + "\u0421\u0422\n\f\u0000\u0000\u0422\u0423\u0007\t\u0000\u0000\u0423\u0440"+ + "\u0003\u00a2Q\r\u0424\u0425\n\u000b\u0000\u0000\u0425\u0426\u0007\n\u0000"+ + "\u0000\u0426\u0440\u0003\u00a2Q\f\u0427\u0428\n\n\u0000\u0000\u0428\u0429"+ + "\u0007\u000b\u0000\u0000\u0429\u0440\u0003\u00a2Q\u000b\u042a\u042b\n"+ + "\t\u0000\u0000\u042b\u042c\u0007\f\u0000\u0000\u042c\u0440\u0003\u00a2"+ + "Q\n\u042d\u042e\n\u0007\u0000\u0000\u042e\u042f\u0005v\u0000\u0000\u042f"+ + "\u0440\u0003\u00a2Q\b\u0430\u0431\n\u0006\u0000\u0000\u0431\u0432\u0005"+ + "u\u0000\u0000\u0432\u0440\u0003\u00a2Q\u0007\u0433\u0434\n\u0005\u0000"+ + "\u0000\u0434\u0435\u0005\"\u0000\u0000\u0435\u0440\u0003\u00a2Q\u0005"+ + "\u0436\u0437\n\u0004\u0000\u0000\u0437\u0438\u0005%\u0000\u0000\u0438"+ + "\u0439\u0003\u00a2Q\u0000\u0439\u043a\u0005o\u0000\u0000\u043a\u043b\u0003"+ + "\u00a2Q\u0004\u043b\u0440\u0001\u0000\u0000\u0000\u043c\u043d\n\b\u0000"+ + "\u0000\u043d\u043e\u0005\u000f\u0000\u0000\u043e\u0440\u0003p8\u0000\u043f"+ + "\u041e\u0001\u0000\u0000\u0000\u043f\u0421\u0001\u0000\u0000\u0000\u043f"+ + "\u0424\u0001\u0000\u0000\u0000\u043f\u0427\u0001\u0000\u0000\u0000\u043f"+ + "\u042a\u0001\u0000\u0000\u0000\u043f\u042d\u0001\u0000\u0000\u0000\u043f"+ + "\u0430\u0001\u0000\u0000\u0000\u043f\u0433\u0001\u0000\u0000\u0000\u043f"+ + "\u0436\u0001\u0000\u0000\u0000\u043f\u043c\u0001\u0000\u0000\u0000\u0440"+ + "\u0443\u0001\u0000\u0000\u0000\u0441\u043f\u0001\u0000\u0000\u0000\u0441"+ + "\u0442\u0001\u0000\u0000\u0000\u0442\u00a3\u0001\u0000\u0000\u0000\u0443"+ + "\u0441\u0001\u0000\u0000\u0000\u0444\u0459\u0003\u0016\u000b\u0000\u0445"+ + "\u0459\u0003\u0018\f\u0000\u0446\u0459\u0003\u00a8T\u0000\u0447\u0459"+ + "\u0003\u00a6S\u0000\u0448\u0459\u0003\u00deo\u0000\u0449\u0459\u0003\u0102"+ + "\u0081\u0000\u044a\u0459\u0003\u00f6{\u0000\u044b\u0459\u0003\u012e\u0097"+ + "\u0000\u044c\u0459\u0003\u0104\u0082\u0000\u044d\u0459\u0003\u0106\u0083"+ + "\u0000\u044e\u0459\u0003\u0108\u0084\u0000\u044f\u0459\u0003\u010a\u0085"+ + "\u0000\u0450\u0459\u0003\u010c\u0086\u0000\u0451\u0459\u0003\u00f2y\u0000"+ + "\u0452\u0459\u0003\u010e\u0087\u0000\u0453\u0459\u0003\u0110\u0088\u0000"+ + "\u0454\u0459\u0003\u0122\u0091\u0000\u0455\u0459\u0003\u00aaU\u0000\u0456"+ + "\u0459\u0003\u00aeW\u0000\u0457\u0459\u0003v;\u0000\u0458\u0444\u0001"+ + "\u0000\u0000\u0000\u0458\u0445\u0001\u0000\u0000\u0000\u0458\u0446\u0001"+ + "\u0000\u0000\u0000\u0458\u0447\u0001\u0000\u0000\u0000\u0458\u0448\u0001"+ + "\u0000\u0000\u0000\u0458\u0449\u0001\u0000\u0000\u0000\u0458\u044a\u0001"+ + "\u0000\u0000\u0000\u0458\u044b\u0001\u0000\u0000\u0000\u0458\u044c\u0001"+ + "\u0000\u0000\u0000\u0458\u044d\u0001\u0000\u0000\u0000\u0458\u044e\u0001"+ + "\u0000\u0000\u0000\u0458\u044f\u0001\u0000\u0000\u0000\u0458\u0450\u0001"+ + "\u0000\u0000\u0000\u0458\u0451\u0001\u0000\u0000\u0000\u0458\u0452\u0001"+ + "\u0000\u0000\u0000\u0458\u0453\u0001\u0000\u0000\u0000\u0458\u0454\u0001"+ + "\u0000\u0000\u0000\u0458\u0455\u0001\u0000\u0000\u0000\u0458\u0456\u0001"+ + "\u0000\u0000\u0000\u0458\u0457\u0001\u0000\u0000\u0000\u0459\u00a5\u0001"+ + "\u0000\u0000\u0000\u045a\u045b\u0005$\u0000\u0000\u045b\u045c\u0003\u00a2"+ + "Q\u0000\u045c\u00a7\u0001\u0000\u0000\u0000\u045d\u045e\u0005X\u0000\u0000"+ + "\u045e\u0460\u0003\u00a2Q\u0000\u045f\u0461\u0003\u00f2y\u0000\u0460\u045f"+ + "\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000\u0000\u0461\u00a9"+ + "\u0001\u0000\u0000\u0000\u0462\u0463\u0003\u00acV\u0000\u0463\u0464\u0003"+ + "\u012a\u0095\u0000\u0464\u00ab\u0001\u0000\u0000\u0000\u0465\u0466\u0005"+ + "\f\u0000\u0000\u0466\u0467\u0003\u00a2Q\u0000\u0467\u0468\u0003\u0184"+ + "\u00c2\u0000\u0468\u046a\u0001\u0000\u0000\u0000\u0469\u0465\u0001\u0000"+ + "\u0000\u0000\u046a\u046d\u0001\u0000\u0000\u0000\u046b\u0469\u0001\u0000"+ + "\u0000\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u0472\u0001\u0000"+ + "\u0000\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046e\u046f\u0005\r\u0000"+ + "\u0000\u046f\u0470\u0003`0\u0000\u0470\u0471\u0003\u0184\u00c2\u0000\u0471"+ + "\u0473\u0001\u0000\u0000\u0000\u0472\u046e\u0001\u0000\u0000\u0000\u0472"+ + "\u0473\u0001\u0000\u0000\u0000\u0473\u00ad\u0001\u0000\u0000\u0000\u0474"+ + "\u0475\u0005Q\u0000\u0000\u0475\u047a\u0003\u00a2Q\u0000\u0476\u0477\u0005"+ + "Q\u0000\u0000\u0477\u0478\u0007\u0001\u0000\u0000\u0478\u047a\u0003,\u0016"+ + "\u0000\u0479\u0474\u0001\u0000\u0000\u0000\u0479\u0476\u0001\u0000\u0000"+ + "\u0000\u047a\u00af\u0001\u0000\u0000\u0000\u047b\u0484\u0005\u0003\u0000"+ + "\u0000\u047c\u0484\u0005\u0004\u0000\u0000\u047d\u0484\u0005d\u0000\u0000"+ + "\u047e\u0484\u0003\u0160\u00b0\u0000\u047f\u0484\u0003\u0176\u00bb\u0000"+ + "\u0480\u0484\u0005\u0001\u0000\u0000\u0481\u0484\u0005\u008f\u0000\u0000"+ + "\u0482\u0484\u0005\u0090\u0000\u0000\u0483\u047b\u0001\u0000\u0000\u0000"+ + "\u0483\u047c\u0001\u0000\u0000\u0000\u0483\u047d\u0001\u0000\u0000\u0000"+ + "\u0483\u047e\u0001\u0000\u0000\u0000\u0483\u047f\u0001\u0000\u0000\u0000"+ + "\u0483\u0480\u0001\u0000\u0000\u0000\u0483\u0481\u0001\u0000\u0000\u0000"+ + "\u0483\u0482\u0001\u0000\u0000\u0000\u0484\u00b1\u0001\u0000\u0000\u0000"+ + "\u0485\u0486\u0006Y\uffff\uffff\u0000\u0486\u0492\u0003\u015c\u00ae\u0000"+ + "\u0487\u0492\u0003\u0158\u00ac\u0000\u0488\u0492\u0003\u0180\u00c0\u0000"+ + "\u0489\u0492\u0003\u001e\u000f\u0000\u048a\u0492\u0003\u0084B\u0000\u048b"+ + "\u0492\u0003\u0082A\u0000\u048c\u048d\u0007\r\u0000\u0000\u048d\u048e"+ + "\u0005f\u0000\u0000\u048e\u048f\u0003\u00a2Q\u0000\u048f\u0490\u0005g"+ + "\u0000\u0000\u0490\u0492\u0001\u0000\u0000\u0000\u0491\u0485\u0001\u0000"+ + "\u0000\u0000\u0491\u0487\u0001\u0000\u0000\u0000\u0491\u0488\u0001\u0000"+ + "\u0000\u0000\u0491\u0489\u0001\u0000\u0000\u0000\u0491\u048a\u0001\u0000"+ + "\u0000\u0000\u0491\u048b\u0001\u0000\u0000\u0000\u0491\u048c\u0001\u0000"+ + "\u0000\u0000\u0492\u04a9\u0001\u0000\u0000\u0000\u0493\u0494\n\t\u0000"+ + "\u0000\u0494\u0495\u0005p\u0000\u0000\u0495\u04a8\u0005e\u0000\u0000\u0496"+ + "\u0497\n\b\u0000\u0000\u0497\u04a8\u0003\u017a\u00bd\u0000\u0498\u0499"+ + "\n\u0007\u0000\u0000\u0499\u04a8\u0003\u00ceg\u0000\u049a\u049b\n\u0006"+ + "\u0000\u0000\u049b\u04a8\u0003J%\u0000\u049c\u049d\n\u0005\u0000\u0000"+ + "\u049d\u04a8\u0003\u017c\u00be\u0000\u049e\u049f\n\u0004\u0000\u0000\u049f"+ + "\u04a8\u0003\u017e\u00bf\u0000\u04a0\u04a1\n\u0003\u0000\u0000\u04a1\u04a2"+ + "\u0003\u017e\u00bf\u0000\u04a2\u04a3\u0005\u0010\u0000\u0000\u04a3\u04a4"+ + "\u0003p8\u0000\u04a4\u04a8\u0001\u0000\u0000\u0000\u04a5\u04a6\n\u0002"+ + "\u0000\u0000\u04a6\u04a8\u0003\u00b8\\\u0000\u04a7\u0493\u0001\u0000\u0000"+ + "\u0000\u04a7\u0496\u0001\u0000\u0000\u0000\u04a7\u0498\u0001\u0000\u0000"+ + "\u0000\u04a7\u049a\u0001\u0000\u0000\u0000\u04a7\u049c\u0001\u0000\u0000"+ + "\u0000\u04a7\u049e\u0001\u0000\u0000\u0000\u04a7\u04a0\u0001\u0000\u0000"+ + "\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04ab\u0001\u0000\u0000"+ + "\u0000\u04a9\u04a7\u0001\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000"+ + "\u0000\u04aa\u00b3\u0001\u0000\u0000\u0000\u04ab\u04a9\u0001\u0000\u0000"+ + "\u0000\u04ac\u04ad\u0003\\.\u0000\u04ad\u04ae\u0003\u00b6[\u0000\u04ae"+ + "\u00b5\u0001\u0000\u0000\u0000\u04af\u04b1\u0005M\u0000\u0000\u04b0\u04b2"+ + "\u0005e\u0000\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001"+ + "\u0000\u0000\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b5\u0003"+ + "\u014a\u00a5\u0000\u04b4\u04b6\u0003n7\u0000\u04b5\u04b4\u0001\u0000\u0000"+ + "\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u00b7\u0001\u0000\u0000"+ + "\u0000\u04b7\u04b9\u0005&\u0000\u0000\u04b8\u04ba\u0003\u00e6s\u0000\u04b9"+ + "\u04b8\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba"+ + "\u04bc\u0001\u0000\u0000\u0000\u04bb\u04bd\u0005m\u0000\u0000\u04bc\u04bb"+ + "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be"+ + "\u0001\u0000\u0000\u0000\u04be\u04bf\u0005\'\u0000\u0000\u04bf\u00b9\u0001"+ + "\u0000\u0000\u0000\u04c0\u04c1\u0005N\u0000\u0000\u04c1\u04c7\u0005h\u0000"+ + "\u0000\u04c2\u04c3\u0003\u00bc^\u0000\u04c3\u04c4\u0003\u0184\u00c2\u0000"+ + "\u04c4\u04c6\u0001\u0000\u0000\u0000\u04c5\u04c2\u0001\u0000\u0000\u0000"+ + "\u04c6\u04c9\u0001\u0000\u0000\u0000\u04c7\u04c5\u0001\u0000\u0000\u0000"+ + "\u04c7\u04c8\u0001\u0000\u0000\u0000\u04c8\u04ca\u0001\u0000\u0000\u0000"+ + "\u04c9\u04c7\u0001\u0000\u0000\u0000\u04ca\u04cb\u0005i\u0000\u0000\u04cb"+ + "\u00bb\u0001\u0000\u0000\u0000\u04cc\u04d0\u0003\u00c0`\u0000\u04cd\u04d0"+ + "\u0003\u013e\u009f\u0000\u04ce\u04d0\u0003\u00be_\u0000\u04cf\u04cc\u0001"+ + "\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000\u04cf\u04ce\u0001"+ + "\u0000\u0000\u0000\u04d0\u00bd\u0001\u0000\u0000\u0000\u04d1\u04d2\u0005"+ + "8\u0000\u0000\u04d2\u04d3\u0005e\u0000\u0000\u04d3\u04d4\u0003\u014e\u00a7"+ + "\u0000\u04d4\u00bf\u0001\u0000\u0000\u0000\u04d5\u04d7\u0005\u001b\u0000"+ + "\u0000\u04d6\u04d5\u0001\u0000\u0000\u0000\u04d6\u04d7\u0001\u0000\u0000"+ + "\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003\\.\u0000"+ + "\u04d9\u04da\u0005e\u0000\u0000\u04da\u04db\u0003\u014e\u00a7\u0000\u04db"+ + "\u04dc\u0003\u014c\u00a6\u0000\u04dc\u04e5\u0001\u0000\u0000\u0000\u04dd"+ + "\u04df\u0005\u001b\u0000\u0000\u04de\u04dd\u0001\u0000\u0000\u0000\u04de"+ + "\u04df\u0001\u0000\u0000\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+ + "\u04e1\u0003\\.\u0000\u04e1\u04e2\u0005e\u0000\u0000\u04e2\u04e3\u0003"+ + "\u014e\u00a7\u0000\u04e3\u04e5\u0001\u0000\u0000\u0000\u04e4\u04d6\u0001"+ + "\u0000\u0000\u0000\u04e4\u04de\u0001\u0000\u0000\u0000\u04e5\u00c1\u0001"+ + "\u0000\u0000\u0000\u04e6\u04e8\u0003\u0130\u0098\u0000\u04e7\u04e9\u0003"+ + "\u0132\u0099\u0000\u04e8\u04e7\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001"+ + "\u0000\u0000\u0000\u04e9\u04f1\u0001\u0000\u0000\u0000\u04ea\u04f1\u0003"+ + "\u00c4b\u0000\u04eb\u04f1\u0003N\'\u0000\u04ec\u04ed\u0005f\u0000\u0000"+ + "\u04ed\u04ee\u0003\u00c2a\u0000\u04ee\u04ef\u0005g\u0000\u0000\u04ef\u04f1"+ + "\u0001\u0000\u0000\u0000\u04f0\u04e6\u0001\u0000\u0000\u0000\u04f0\u04ea"+ + "\u0001\u0000\u0000\u0000\u04f0\u04eb\u0001\u0000\u0000\u0000\u04f0\u04ec"+ + "\u0001\u0000\u0000\u0000\u04f1\u00c3\u0001\u0000\u0000\u0000\u04f2\u04fc"+ + "\u0003\u0136\u009b\u0000\u04f3\u04fc\u0003\u0172\u00b9\u0000\u04f4\u04fc"+ + "\u0003\u013c\u009e\u0000\u04f5\u04fc\u0003\u0148\u00a4\u0000\u04f6\u04fc"+ + "\u0003\u00ba]\u0000\u04f7\u04fc\u0003\u0142\u00a1\u0000\u04f8\u04fc\u0003"+ + "\u0144\u00a2\u0000\u04f9\u04fc\u0003\u0146\u00a3\u0000\u04fa\u04fc\u0003"+ + "\u00c6c\u0000\u04fb\u04f2\u0001\u0000\u0000\u0000\u04fb\u04f3\u0001\u0000"+ + "\u0000\u0000\u04fb\u04f4\u0001\u0000\u0000\u0000\u04fb\u04f5\u0001\u0000"+ + "\u0000\u0000\u04fb\u04f6\u0001\u0000\u0000\u0000\u04fb\u04f7\u0001\u0000"+ + "\u0000\u0000\u04fb\u04f8\u0001\u0000\u0000\u0000\u04fb\u04f9\u0001\u0000"+ + "\u0000\u0000\u04fb\u04fa\u0001\u0000\u0000\u0000\u04fc\u00c5\u0001\u0000"+ + "\u0000\u0000\u04fd\u04fe\u00058\u0000\u0000\u04fe\u04ff\u0003\u00c8d\u0000"+ + "\u04ff\u00c7\u0001\u0000\u0000\u0000\u0500\u050c\u0005f\u0000\u0000\u0501"+ + "\u0506\u0003\u00c2a\u0000\u0502\u0503\u0005m\u0000\u0000\u0503\u0505\u0003"+ + "\u00c2a\u0000\u0504\u0502\u0001\u0000\u0000\u0000\u0505\u0508\u0001\u0000"+ + "\u0000\u0000\u0506\u0504\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ + "\u0000\u0000\u0507\u050a\u0001\u0000\u0000\u0000\u0508\u0506\u0001\u0000"+ + "\u0000\u0000\u0509\u050b\u0005m\u0000\u0000\u050a\u0509\u0001\u0000\u0000"+ + "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050d\u0001\u0000\u0000"+ + "\u0000\u050c\u0501\u0001\u0000\u0000\u0000\u050c\u050d\u0001\u0000\u0000"+ + "\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0005g\u0000\u0000"+ + "\u050f\u00c9\u0001\u0000\u0000\u0000\u0510\u051b\u0003\u0172\u00b9\u0000"+ + "\u0511\u051b\u0003\u0136\u009b\u0000\u0512\u051b\u0003\u00ccf\u0000\u0513"+ + "\u051b\u0003\u0142\u00a1\u0000\u0514\u051b\u0003\u0144\u00a2\u0000\u0515"+ + "\u051b\u0003N\'\u0000\u0516\u0518\u0003\u0130\u0098\u0000\u0517\u0519"+ + "\u0003\u0132\u0099\u0000\u0518\u0517\u0001\u0000\u0000\u0000\u0518\u0519"+ + "\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000\u0000\u0000\u051a\u0510"+ + "\u0001\u0000\u0000\u0000\u051a\u0511\u0001\u0000\u0000\u0000\u051a\u0512"+ + "\u0001\u0000\u0000\u0000\u051a\u0513\u0001\u0000\u0000\u0000\u051a\u0514"+ + "\u0001\u0000\u0000\u0000\u051a\u0515\u0001\u0000\u0000\u0000\u051a\u0516"+ + "\u0001\u0000\u0000\u0000\u051b\u00cb\u0001\u0000\u0000\u0000\u051c\u051d"+ + "\u0005j\u0000\u0000\u051d\u051e\u0005t\u0000\u0000\u051e\u051f\u0005k"+ + "\u0000\u0000\u051f\u0520\u0003\u013a\u009d\u0000\u0520\u00cd\u0001\u0000"+ + "\u0000\u0000\u0521\u0531\u0005j\u0000\u0000\u0522\u0524\u0003\u00d0h\u0000"+ + "\u0523\u0522\u0001\u0000\u0000\u0000\u0523\u0524\u0001\u0000\u0000\u0000"+ + "\u0524\u0525\u0001\u0000\u0000\u0000\u0525\u0527\u0005o\u0000\u0000\u0526"+ + "\u0528\u0003\u00d2i\u0000\u0527\u0526\u0001\u0000\u0000\u0000\u0527\u0528"+ + "\u0001\u0000\u0000\u0000\u0528\u0532\u0001\u0000\u0000\u0000\u0529\u052b"+ + "\u0003\u00d0h\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001"+ + "\u0000\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0005"+ + "o\u0000\u0000\u052d\u052e\u0003\u00d2i\u0000\u052e\u052f\u0005o\u0000"+ + "\u0000\u052f\u0530\u0003\u00d4j\u0000\u0530\u0532\u0001\u0000\u0000\u0000"+ + "\u0531\u0523\u0001\u0000\u0000\u0000\u0531\u052a\u0001\u0000\u0000\u0000"+ + "\u0532\u0533\u0001\u0000\u0000\u0000\u0533\u0534\u0005k\u0000\u0000\u0534"+ + "\u00cf\u0001\u0000\u0000\u0000\u0535\u0536\u0003\u00a2Q\u0000\u0536\u00d1"+ + "\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u00a2Q\u0000\u0538\u00d3\u0001"+ + "\u0000\u0000\u0000\u0539\u053a\u0003\u00a2Q\u0000\u053a\u00d5\u0001\u0000"+ + "\u0000\u0000\u053b\u053d\u0007\u000e\u0000\u0000\u053c\u053b\u0001\u0000"+ + "\u0000\u0000\u053c\u053d\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000"+ + "\u0000\u0000\u053e\u053f\u0005l\u0000\u0000\u053f\u00d7\u0001\u0000\u0000"+ + "\u0000\u0540\u0541\u0003\u00e6s\u0000\u0541\u0542\u0005l\u0000\u0000\u0542"+ + "\u0547\u0001\u0000\u0000\u0000\u0543\u0544\u0003\u0006\u0003\u0000\u0544"+ + "\u0545\u0005s\u0000\u0000\u0545\u0547\u0001\u0000\u0000\u0000\u0546\u0540"+ + "\u0001\u0000\u0000\u0000\u0546\u0543\u0001\u0000\u0000\u0000\u0546\u0547"+ + "\u0001\u0000\u0000\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549"+ + "\u0005]\u0000\u0000\u0549\u054e\u0003\u00a2Q\u0000\u054a\u054c\u0005J"+ + "\u0000\u0000\u054b\u054d\u0005e\u0000\u0000\u054c\u054b\u0001\u0000\u0000"+ + "\u0000\u054c\u054d\u0001\u0000\u0000\u0000\u054d\u054f\u0001\u0000\u0000"+ + "\u0000\u054e\u054a\u0001\u0000\u0000\u0000\u054e\u054f\u0001\u0000\u0000"+ + "\u0000\u054f\u00d9\u0001\u0000\u0000\u0000\u0550\u0551\u0005X\u0000\u0000"+ + "\u0551\u0552\u0005e\u0000\u0000\u0552\u00db\u0001\u0000\u0000\u0000\u0553"+ + "\u0554\u0003\u0176\u00bb\u0000\u0554\u00dd\u0001\u0000\u0000\u0000\u0555"+ + "\u0559\u0003\u00e0p\u0000\u0556\u0559\u0003\u00e8t\u0000\u0557\u0559\u0003"+ + "\u00f0x\u0000\u0558\u0555\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000"+ + "\u0000\u0000\u0558\u0557\u0001\u0000\u0000\u0000\u0559\u00df\u0001\u0000"+ + "\u0000\u0000\u055a\u0566\u0005Z\u0000\u0000\u055b\u0567\u0003\u00e2q\u0000"+ + "\u055c\u0562\u0005f\u0000\u0000\u055d\u055e\u0003\u00e2q\u0000\u055e\u055f"+ + "\u0003\u0184\u00c2\u0000\u055f\u0561\u0001\u0000\u0000\u0000\u0560\u055d"+ + "\u0001\u0000\u0000\u0000\u0561\u0564\u0001\u0000\u0000\u0000\u0562\u0560"+ + "\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0565"+ + "\u0001\u0000\u0000\u0000\u0564\u0562\u0001\u0000\u0000\u0000\u0565\u0567"+ + "\u0005g\u0000\u0000\u0566\u055b\u0001\u0000\u0000\u0000\u0566\u055c\u0001"+ + "\u0000\u0000\u0000\u0567\u00e1\u0001\u0000\u0000\u0000\u0568\u056e\u0003"+ + "\u00e4r\u0000\u0569\u056b\u0003\u00c2a\u0000\u056a\u0569\u0001\u0000\u0000"+ + "\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000"+ + "\u0000\u056c\u056d\u0005l\u0000\u0000\u056d\u056f\u0003\u00e6s\u0000\u056e"+ + "\u056a\u0001\u0000\u0000\u0000\u056e\u056f\u0001\u0000\u0000\u0000\u056f"+ + "\u00e3\u0001\u0000\u0000\u0000\u0570\u0575\u0005e\u0000\u0000\u0571\u0572"+ + "\u0005m\u0000\u0000\u0572\u0574\u0005e\u0000\u0000\u0573\u0571\u0001\u0000"+ + "\u0000\u0000\u0574\u0577\u0001\u0000\u0000\u0000\u0575\u0573\u0001\u0000"+ + "\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576\u00e5\u0001\u0000"+ + "\u0000\u0000\u0577\u0575\u0001\u0000\u0000\u0000\u0578\u057d\u0003\u00a2"+ + "Q\u0000\u0579\u057a\u0005m\u0000\u0000\u057a\u057c\u0003\u00a2Q\u0000"+ + "\u057b\u0579\u0001\u0000\u0000\u0000\u057c\u057f\u0001\u0000\u0000\u0000"+ + "\u057d\u057b\u0001\u0000\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000"+ + "\u057e\u00e7\u0001\u0000\u0000\u0000\u057f\u057d\u0001\u0000\u0000\u0000"+ + "\u0580\u058c\u0005^\u0000\u0000\u0581\u058d\u0003\u00eau\u0000\u0582\u0588"+ + "\u0005f\u0000\u0000\u0583\u0584\u0003\u00eau\u0000\u0584\u0585\u0003\u0184"+ + "\u00c2\u0000\u0585\u0587\u0001\u0000\u0000\u0000\u0586\u0583\u0001\u0000"+ + "\u0000\u0000\u0587\u058a\u0001\u0000\u0000\u0000\u0588\u0586\u0001\u0000"+ + "\u0000\u0000\u0588\u0589\u0001\u0000\u0000\u0000\u0589\u058b\u0001\u0000"+ + "\u0000\u0000\u058a\u0588\u0001\u0000\u0000\u0000\u058b\u058d\u0005g\u0000"+ + "\u0000\u058c\u0581\u0001\u0000\u0000\u0000\u058c\u0582\u0001\u0000\u0000"+ + "\u0000\u058d\u00e9\u0001\u0000\u0000\u0000\u058e\u0591\u0003\u00ecv\u0000"+ + "\u058f\u0591\u0003\u00eew\u0000\u0590\u058e\u0001\u0000\u0000\u0000\u0590"+ + "\u058f\u0001\u0000\u0000\u0000\u0591\u00eb\u0001\u0000\u0000\u0000\u0592"+ + "\u0593\u0005e\u0000\u0000\u0593\u0594\u0005l\u0000\u0000\u0594\u0595\u0003"+ + "\u00c2a\u0000\u0595\u00ed\u0001\u0000\u0000\u0000\u0596\u0598\u0005e\u0000"+ + "\u0000\u0597\u0599\u0003\u0150\u00a8\u0000\u0598\u0597\u0001\u0000\u0000"+ + "\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000"+ + "\u0000\u059a\u059b\u0003\u00c2a\u0000\u059b\u00ef\u0001\u0000\u0000\u0000"+ + "\u059c\u05a8\u0005c\u0000\u0000\u059d\u05a9\u0003\u0094J\u0000\u059e\u05a4"+ + "\u0005f\u0000\u0000\u059f\u05a0\u0003\u0094J\u0000\u05a0\u05a1\u0003\u0184"+ + "\u00c2\u0000\u05a1\u05a3\u0001\u0000\u0000\u0000\u05a2\u059f\u0001\u0000"+ + "\u0000\u0000\u05a3\u05a6\u0001\u0000\u0000\u0000\u05a4\u05a2\u0001\u0000"+ + "\u0000\u0000\u05a4\u05a5\u0001\u0000\u0000\u0000\u05a5\u05a7\u0001\u0000"+ + "\u0000\u0000\u05a6\u05a4\u0001\u0000\u0000\u0000\u05a7\u05a9\u0005g\u0000"+ + "\u0000\u05a8\u059d\u0001\u0000\u0000\u0000\u05a8\u059e\u0001\u0000\u0000"+ + "\u0000\u05a9\u00f1\u0001\u0000\u0000\u0000\u05aa\u05ac\u0005h\u0000\u0000"+ + "\u05ab\u05ad\u0003\u00f4z\u0000\u05ac\u05ab\u0001\u0000\u0000\u0000\u05ac"+ + "\u05ad\u0001\u0000\u0000\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae"+ + "\u05af\u0005i\u0000\u0000\u05af\u00f3\u0001\u0000\u0000\u0000\u05b0\u05b1"+ + "\u0003\u00a4R\u0000\u05b1\u05b2\u0005\u009f\u0000\u0000\u05b2\u05b4\u0001"+ + "\u0000\u0000\u0000\u05b3\u05b0\u0001\u0000\u0000\u0000\u05b4\u05b5\u0001"+ + "\u0000\u0000\u0000\u05b5\u05b3\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001"+ + "\u0000\u0000\u0000\u05b6\u00f5\u0001\u0000\u0000\u0000\u05b7\u05bd\u0003"+ + "\u00fa}\u0000\u05b8\u05bd\u0003\u00fc~\u0000\u05b9\u05bd\u0003\u00fe\u007f"+ + "\u0000\u05ba\u05bd\u0003\u00f8|\u0000\u05bb\u05bd\u0003\u0096K\u0000\u05bc"+ + "\u05b7\u0001\u0000\u0000\u0000\u05bc\u05b8\u0001\u0000\u0000\u0000\u05bc"+ + "\u05b9\u0001\u0000\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000\u0000\u05bc"+ + "\u05bb\u0001\u0000\u0000\u0000\u05bd\u00f7\u0001\u0000\u0000\u0000\u05be"+ + "\u05bf\u0003\u00a2Q\u0000\u05bf\u00f9\u0001\u0000\u0000\u0000\u05c0\u05c1"+ + "\u0003\u00a2Q\u0000\u05c1\u05c2\u0005\u0089\u0000\u0000\u05c2\u05c3\u0003"+ + "\u00a2Q\u0000\u05c3\u00fb\u0001\u0000\u0000\u0000\u05c4\u05c5\u0003\u00a2"+ + "Q\u0000\u05c5\u05c6\u0007\u000f\u0000\u0000\u05c6\u00fd\u0001\u0000\u0000"+ + "\u0000\u05c7\u05c8\u0003\u00e6s\u0000\u05c8\u05c9\u0003\u00d6k\u0000\u05c9"+ + "\u05ca\u0003\u00e6s\u0000\u05ca\u00ff\u0001\u0000\u0000\u0000\u05cb\u05cc"+ + "\u0007\u0010\u0000\u0000\u05cc\u0101\u0001\u0000\u0000\u0000\u05cd\u05ce"+ + "\u0005e\u0000\u0000\u05ce\u05d0\u0005o\u0000\u0000\u05cf\u05d1\u0003\u00a4"+ + "R\u0000\u05d0\u05cf\u0001\u0000\u0000\u0000\u05d0\u05d1\u0001\u0000\u0000"+ + "\u0000\u05d1\u0103\u0001\u0000\u0000\u0000\u05d2\u05d4\u0005b\u0000\u0000"+ + "\u05d3\u05d5\u0003\u00e6s\u0000\u05d4\u05d3\u0001\u0000\u0000\u0000\u05d4"+ + "\u05d5\u0001\u0000\u0000\u0000\u05d5\u0105\u0001\u0000\u0000\u0000\u05d6"+ + "\u05d8\u0005K\u0000\u0000\u05d7\u05d9\u0005e\u0000\u0000\u05d8\u05d7\u0001"+ + "\u0000\u0000\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u0107\u0001"+ + "\u0000\u0000\u0000\u05da\u05dc\u0005_\u0000\u0000\u05db\u05dd\u0005e\u0000"+ + "\u0000\u05dc\u05db\u0001\u0000\u0000\u0000\u05dc\u05dd\u0001\u0000\u0000"+ + "\u0000\u05dd\u0109\u0001\u0000\u0000\u0000\u05de\u05df\u0005W\u0000\u0000"+ + "\u05df\u05e0\u0005e\u0000\u0000\u05e0\u010b\u0001\u0000\u0000\u0000\u05e1"+ + "\u05e2\u0005[\u0000\u0000\u05e2\u010d\u0001\u0000\u0000\u0000\u05e3\u05ec"+ + "\u0005\\\u0000\u0000\u05e4\u05ed\u0003\u00a2Q\u0000\u05e5\u05e6\u0003"+ + "\u0184\u00c2\u0000\u05e6\u05e7\u0003\u00a2Q\u0000\u05e7\u05ed\u0001\u0000"+ + "\u0000\u0000\u05e8\u05e9\u0003\u00f6{\u0000\u05e9\u05ea\u0003\u0184\u00c2"+ + "\u0000\u05ea\u05eb\u0003\u00a2Q\u0000\u05eb\u05ed\u0001\u0000\u0000\u0000"+ + "\u05ec\u05e4\u0001\u0000\u0000\u0000\u05ec\u05e5\u0001\u0000\u0000\u0000"+ + "\u05ec\u05e8\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000"+ + "\u05ee\u05f4\u0003\u00f2y\u0000\u05ef\u05f2\u0005V\u0000\u0000\u05f0\u05f3"+ + "\u0003\u010e\u0087\u0000\u05f1\u05f3\u0003\u00f2y\u0000\u05f2\u05f0\u0001"+ + "\u0000\u0000\u0000\u05f2\u05f1\u0001\u0000\u0000\u0000\u05f3\u05f5\u0001"+ + "\u0000\u0000\u0000\u05f4\u05ef\u0001\u0000\u0000\u0000\u05f4\u05f5\u0001"+ + "\u0000\u0000\u0000\u05f5\u010f\u0001\u0000\u0000\u0000\u05f6\u05f9\u0003"+ + "\u0112\u0089\u0000\u05f7\u05f9\u0003\u0118\u008c\u0000\u05f8\u05f6\u0001"+ + "\u0000\u0000\u0000\u05f8\u05f7\u0001\u0000\u0000\u0000\u05f9\u0111\u0001"+ + "\u0000\u0000\u0000\u05fa\u0605\u0005Y\u0000\u0000\u05fb\u05fd\u0003\u00a2"+ + "Q\u0000\u05fc\u05fb\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ + "\u0000\u05fd\u0606\u0001\u0000\u0000\u0000\u05fe\u0600\u0003\u00f6{\u0000"+ + "\u05ff\u05fe\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000\u0000\u0000"+ + "\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0603\u0003\u0184\u00c2\u0000"+ + "\u0602\u0604\u0003\u00a2Q\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0603"+ + "\u0604\u0001\u0000\u0000\u0000\u0604\u0606\u0001\u0000\u0000\u0000\u0605"+ + "\u05fc\u0001\u0000\u0000\u0000\u0605\u05ff\u0001\u0000\u0000\u0000\u0606"+ + "\u0607\u0001\u0000\u0000\u0000\u0607\u060b\u0005h\u0000\u0000\u0608\u060a"+ + "\u0003\u0114\u008a\u0000\u0609\u0608\u0001\u0000\u0000\u0000\u060a\u060d"+ + "\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000\u0000\u060b\u060c"+ + "\u0001\u0000\u0000\u0000\u060c\u060e\u0001\u0000\u0000\u0000\u060d\u060b"+ + "\u0001\u0000\u0000\u0000\u060e\u060f\u0005i\u0000\u0000\u060f\u0113\u0001"+ + "\u0000\u0000\u0000\u0610\u0611\u0003\u0116\u008b\u0000\u0611\u0613\u0005"+ + "o\u0000\u0000\u0612\u0614\u0003\u00f4z\u0000\u0613\u0612\u0001\u0000\u0000"+ + "\u0000\u0613\u0614\u0001\u0000\u0000\u0000\u0614\u0115\u0001\u0000\u0000"+ + "\u0000\u0615\u0616\u0005P\u0000\u0000\u0616\u0619\u0003\u00e6s\u0000\u0617"+ + "\u0619\u0005L\u0000\u0000\u0618\u0615\u0001\u0000\u0000\u0000\u0618\u0617"+ + "\u0001\u0000\u0000\u0000\u0619\u0117\u0001\u0000\u0000\u0000\u061a\u0623"+ + "\u0005Y\u0000\u0000\u061b\u0624\u0003\u011a\u008d\u0000\u061c\u061d\u0003"+ + "\u0184\u00c2\u0000\u061d\u061e\u0003\u011a\u008d\u0000\u061e\u0624\u0001"+ + "\u0000\u0000\u0000\u061f\u0620\u0003\u00f6{\u0000\u0620\u0621\u0003\u0184"+ + "\u00c2\u0000\u0621\u0622\u0003\u011a\u008d\u0000\u0622\u0624\u0001\u0000"+ + "\u0000\u0000\u0623\u061b\u0001\u0000\u0000\u0000\u0623\u061c\u0001\u0000"+ + "\u0000\u0000\u0623\u061f\u0001\u0000\u0000\u0000\u0624\u0625\u0001\u0000"+ + "\u0000\u0000\u0625\u0629\u0005h\u0000\u0000\u0626\u0628\u0003\u011c\u008e"+ + "\u0000\u0627\u0626\u0001\u0000\u0000\u0000\u0628\u062b\u0001\u0000\u0000"+ + "\u0000\u0629\u0627\u0001\u0000\u0000\u0000\u0629\u062a\u0001\u0000\u0000"+ + "\u0000\u062a\u062c\u0001\u0000\u0000\u0000\u062b\u0629\u0001\u0000\u0000"+ + "\u0000\u062c\u062d\u0005i\u0000\u0000\u062d\u0119\u0001\u0000\u0000\u0000"+ + "\u062e\u062f\u0005e\u0000\u0000\u062f\u0631\u0005s\u0000\u0000\u0630\u062e"+ + "\u0001\u0000\u0000\u0000\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0632"+ + "\u0001\u0000\u0000\u0000\u0632\u0633\u0003\u00b2Y\u0000\u0633\u0634\u0005"+ + "p\u0000\u0000\u0634\u0635\u0005f\u0000\u0000\u0635\u0636\u0005^\u0000"+ + "\u0000\u0636\u0637\u0005g\u0000\u0000\u0637\u011b\u0001\u0000\u0000\u0000"+ + "\u0638\u0639\u0003\u011e\u008f\u0000\u0639\u063b\u0005o\u0000\u0000\u063a"+ + "\u063c\u0003\u00f4z\u0000\u063b\u063a\u0001\u0000\u0000\u0000\u063b\u063c"+ + "\u0001\u0000\u0000\u0000\u063c\u011d\u0001\u0000\u0000\u0000\u063d\u063e"+ + "\u0005P\u0000\u0000\u063e\u0641\u0003\u0120\u0090\u0000\u063f\u0641\u0005"+ + "L\u0000\u0000\u0640\u063d\u0001\u0000\u0000\u0000\u0640\u063f\u0001\u0000"+ + "\u0000\u0000\u0641\u011f\u0001\u0000\u0000\u0000\u0642\u0645\u0003\u00c2"+ + "a\u0000\u0643\u0645\u0005d\u0000\u0000\u0644\u0642\u0001\u0000\u0000\u0000"+ + "\u0644\u0643\u0001\u0000\u0000\u0000\u0645\u064d\u0001\u0000\u0000\u0000"+ + "\u0646\u0649\u0005m\u0000\u0000\u0647\u064a\u0003\u00c2a\u0000\u0648\u064a"+ + "\u0005d\u0000\u0000\u0649\u0647\u0001\u0000\u0000\u0000\u0649\u0648\u0001"+ + "\u0000\u0000\u0000\u064a\u064c\u0001\u0000\u0000\u0000\u064b\u0646\u0001"+ + "\u0000\u0000\u0000\u064c\u064f\u0001\u0000\u0000\u0000\u064d\u064b\u0001"+ + "\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0121\u0001"+ + "\u0000\u0000\u0000\u064f\u064d\u0001\u0000\u0000\u0000\u0650\u0651\u0005"+ + "O\u0000\u0000\u0651\u0655\u0005h\u0000\u0000\u0652\u0654\u0003\u0124\u0092"+ + "\u0000\u0653\u0652\u0001\u0000\u0000\u0000\u0654\u0657\u0001\u0000\u0000"+ + "\u0000\u0655\u0653\u0001\u0000\u0000\u0000\u0655\u0656\u0001\u0000\u0000"+ + "\u0000\u0656\u0658\u0001\u0000\u0000\u0000\u0657\u0655\u0001\u0000\u0000"+ + "\u0000\u0658\u0659\u0005i\u0000\u0000\u0659\u0123\u0001\u0000\u0000\u0000"+ + "\u065a\u065b\u0003\u0126\u0093\u0000\u065b\u065d\u0005o\u0000\u0000\u065c"+ + "\u065e\u0003\u00f4z\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065d\u065e"+ + "\u0001\u0000\u0000\u0000\u065e\u0125\u0001\u0000\u0000\u0000\u065f\u0662"+ + "\u0005P\u0000\u0000\u0660\u0663\u0003\u00fa}\u0000\u0661\u0663\u0003\u0128"+ + "\u0094\u0000\u0662\u0660\u0001\u0000\u0000\u0000\u0662\u0661\u0001\u0000"+ + "\u0000\u0000\u0663\u0666\u0001\u0000\u0000\u0000\u0664\u0666\u0005L\u0000"+ + "\u0000\u0665\u065f\u0001\u0000\u0000\u0000\u0665\u0664\u0001\u0000\u0000"+ + "\u0000\u0666\u0127\u0001\u0000\u0000\u0000\u0667\u0668\u0003\u00e6s\u0000"+ + "\u0668\u0669\u0005l\u0000\u0000\u0669\u066e\u0001\u0000\u0000\u0000\u066a"+ + "\u066b\u0003\u00e4r\u0000\u066b\u066c\u0005s\u0000\u0000\u066c\u066e\u0001"+ + "\u0000\u0000\u0000\u066d\u0667\u0001\u0000\u0000\u0000\u066d\u066a\u0001"+ + "\u0000\u0000\u0000\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0001"+ + "\u0000\u0000\u0000\u066f\u0670\u0003\u00a2Q\u0000\u0670\u0129\u0001\u0000"+ + "\u0000\u0000\u0671\u0675\u0005`\u0000\u0000\u0672\u0676\u0003\u00a2Q\u0000"+ + "\u0673\u0676\u0003\u012c\u0096\u0000\u0674\u0676\u0003\u00d8l\u0000\u0675"+ + "\u0672\u0001\u0000\u0000\u0000\u0675\u0673\u0001\u0000\u0000\u0000\u0675"+ + "\u0674\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000\u0000\u0676"+ + "\u0677\u0001\u0000\u0000\u0000\u0677\u0678\u0003\u00f2y\u0000\u0678\u012b"+ + "\u0001\u0000\u0000\u0000\u0679\u067b\u0003\u00f6{\u0000\u067a\u0679\u0001"+ + "\u0000\u0000\u0000\u067a\u067b\u0001\u0000\u0000\u0000\u067b\u067c\u0001"+ + "\u0000\u0000\u0000\u067c\u067e\u0003\u0184\u00c2\u0000\u067d\u067f\u0003"+ + "\u00a2Q\u0000\u067e\u067d\u0001\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ + "\u0000\u0000\u067f\u0680\u0001\u0000\u0000\u0000\u0680\u0682\u0003\u0184"+ + "\u00c2\u0000\u0681\u0683\u0003\u00f6{\u0000\u0682\u0681\u0001\u0000\u0000"+ + "\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683\u012d\u0001\u0000\u0000"+ + "\u0000\u0684\u0685\u0005R\u0000\u0000\u0685\u0686\u0003\u00a2Q\u0000\u0686"+ + "\u012f\u0001\u0000\u0000\u0000\u0687\u068a\u0003\u0164\u00b2\u0000\u0688"+ + "\u068a\u0005e\u0000\u0000\u0689\u0687\u0001\u0000\u0000\u0000\u0689\u0688"+ + "\u0001\u0000\u0000\u0000\u068a\u0131\u0001\u0000\u0000\u0000\u068b\u068c"+ + "\u0005j\u0000\u0000\u068c\u068e\u0003\u0134\u009a\u0000\u068d\u068f\u0005"+ + "m\u0000\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000"+ + "\u0000\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0005k\u0000"+ + "\u0000\u0691\u0133\u0001\u0000\u0000\u0000\u0692\u0697\u0003\u00c2a\u0000"+ + "\u0693\u0694\u0005m\u0000\u0000\u0694\u0696\u0003\u00c2a\u0000\u0695\u0693"+ + "\u0001\u0000\u0000\u0000\u0696\u0699\u0001\u0000\u0000\u0000\u0697\u0695"+ + "\u0001\u0000\u0000\u0000\u0697\u0698\u0001\u0000\u0000\u0000\u0698\u0135"+ + "\u0001\u0000\u0000\u0000\u0699\u0697\u0001\u0000\u0000\u0000\u069a\u069b"+ + "\u0005j\u0000\u0000\u069b\u069c\u0003\u0138\u009c\u0000\u069c\u069d\u0005"+ + "k\u0000\u0000\u069d\u069e\u0003\u013a\u009d\u0000\u069e\u0137\u0001\u0000"+ + "\u0000\u0000\u069f\u06a0\u0003\u00a2Q\u0000\u06a0\u0139\u0001\u0000\u0000"+ + "\u0000\u06a1\u06a2\u0003\u00c2a\u0000\u06a2\u013b\u0001\u0000\u0000\u0000"+ + "\u06a3\u06a4\u0005\u0087\u0000\u0000\u06a4\u06a5\u0003\u00c2a\u0000\u06a5"+ + "\u013d\u0001\u0000\u0000\u0000\u06a6\u06ab\u0003\u0140\u00a0\u0000\u06a7"+ + "\u06a8\u0005}\u0000\u0000\u06a8\u06aa\u0003\u0140\u00a0\u0000\u06a9\u06a7"+ + "\u0001\u0000\u0000\u0000\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06a9"+ + "\u0001\u0000\u0000\u0000\u06ab\u06ac\u0001\u0000\u0000\u0000\u06ac\u013f"+ + "\u0001\u0000\u0000\u0000\u06ad\u06ab\u0001\u0000\u0000\u0000\u06ae\u06af"+ + "\u0003\u00c2a\u0000\u06af\u0141\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005"+ + "j\u0000\u0000\u06b1\u06b2\u0005k\u0000\u0000\u06b2\u06b3\u0003\u013a\u009d"+ + "\u0000\u06b3\u0143\u0001\u0000\u0000\u0000\u06b4\u06b5\u0005S\u0000\u0000"+ + "\u06b5\u06b6\u0005j\u0000\u0000\u06b6\u06b7\u0003\u00c2a\u0000\u06b7\u06b8"+ + "\u0005k\u0000\u0000\u06b8\u06b9\u0003\u013a\u009d\u0000\u06b9\u0145\u0001"+ + "\u0000\u0000\u0000\u06ba\u06c0\u0005U\u0000\u0000\u06bb\u06bc\u0005U\u0000"+ + "\u0000\u06bc\u06c0\u0005\u0089\u0000\u0000\u06bd\u06be\u0005\u0089\u0000"+ + "\u0000\u06be\u06c0\u0005U\u0000\u0000\u06bf\u06ba\u0001\u0000\u0000\u0000"+ + "\u06bf\u06bb\u0001\u0000\u0000\u0000\u06bf\u06bd\u0001\u0000\u0000\u0000"+ + "\u06c0\u06c1\u0001\u0000\u0000\u0000\u06c1\u06c2\u0003\u013a\u009d\u0000"+ + "\u06c2\u0147\u0001\u0000\u0000\u0000\u06c3\u06c4\u0005M\u0000\u0000\u06c4"+ + "\u06c5\u0003\u014a\u00a5\u0000\u06c5\u0149\u0001\u0000\u0000\u0000\u06c6"+ + "\u06c7\u0003\u014e\u00a7\u0000\u06c7\u06c8\u0003\u014c\u00a6\u0000\u06c8"+ + "\u06cb\u0001\u0000\u0000\u0000\u06c9\u06cb\u0003\u014e\u00a7\u0000\u06ca"+ + "\u06c6\u0001\u0000\u0000\u0000\u06ca\u06c9\u0001\u0000\u0000\u0000\u06cb"+ + "\u014b\u0001\u0000\u0000\u0000\u06cc\u06cf\u0003\u014e\u00a7\u0000\u06cd"+ + "\u06cf\u0003\u00c2a\u0000\u06ce\u06cc\u0001\u0000\u0000\u0000\u06ce\u06cd"+ + "\u0001\u0000\u0000\u0000\u06cf\u014d\u0001\u0000\u0000\u0000\u06d0\u06dc"+ + "\u0005f\u0000\u0000\u06d1\u06d6\u0003\u009aM\u0000\u06d2\u06d3\u0005m"+ + "\u0000\u0000\u06d3\u06d5\u0003\u009aM\u0000\u06d4\u06d2\u0001\u0000\u0000"+ + "\u0000\u06d5\u06d8\u0001\u0000\u0000\u0000\u06d6\u06d4\u0001\u0000\u0000"+ + "\u0000\u06d6\u06d7\u0001\u0000\u0000\u0000\u06d7\u06da\u0001\u0000\u0000"+ + "\u0000\u06d8\u06d6\u0001\u0000\u0000\u0000\u06d9\u06db\u0005m\u0000\u0000"+ + "\u06da\u06d9\u0001\u0000\u0000\u0000\u06da\u06db\u0001\u0000\u0000\u0000"+ + "\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06d1\u0001\u0000\u0000\u0000"+ + "\u06dc\u06dd\u0001\u0000\u0000\u0000\u06dd\u06de\u0001\u0000\u0000\u0000"+ + "\u06de\u06df\u0005g\u0000\u0000\u06df\u014f\u0001\u0000\u0000\u0000\u06e0"+ + "\u06e1\u0005j\u0000\u0000\u06e1\u06e3\u0003\u0152\u00a9\u0000\u06e2\u06e4"+ + "\u0005m\u0000\u0000\u06e3\u06e2\u0001\u0000\u0000\u0000\u06e3\u06e4\u0001"+ + "\u0000\u0000\u0000\u06e4\u06e5\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ + "k\u0000\u0000\u06e6\u0151\u0001\u0000\u0000\u0000\u06e7\u06ec\u0003\u0154"+ + "\u00aa\u0000\u06e8\u06e9\u0005m\u0000\u0000\u06e9\u06eb\u0003\u0154\u00aa"+ + "\u0000\u06ea\u06e8\u0001\u0000\u0000\u0000\u06eb\u06ee\u0001\u0000\u0000"+ + "\u0000\u06ec\u06ea\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ + "\u0000\u06ed\u0153\u0001\u0000\u0000\u0000\u06ee\u06ec\u0001\u0000\u0000"+ + "\u0000\u06ef\u06f0\u0003\u00e4r\u0000\u06f0\u06f1\u0003\u0156\u00ab\u0000"+ + "\u06f1\u0155\u0001\u0000\u0000\u0000\u06f2\u06f3\u0003\u013e\u009f\u0000"+ + "\u06f3\u0157\u0001\u0000\u0000\u0000\u06f4\u06f5\u0003\u015a\u00ad\u0000"+ + "\u06f5\u06f6\u0005f\u0000\u0000\u06f6\u06f8\u0003\u00a2Q\u0000\u06f7\u06f9"+ + "\u0005m\u0000\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001"+ + "\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0005"+ + "g\u0000\u0000\u06fb\u0159\u0001\u0000\u0000\u0000\u06fc\u0702\u0003\u00c4"+ + "b\u0000\u06fd\u06fe\u0005f\u0000\u0000\u06fe\u06ff\u0003\u015a\u00ad\u0000"+ + "\u06ff\u0700\u0005g\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ + "\u06fc\u0001\u0000\u0000\u0000\u0701\u06fd\u0001\u0000\u0000\u0000\u0702"+ + "\u015b\u0001\u0000\u0000\u0000\u0703\u070d\u0003\u015e\u00af\u0000\u0704"+ + "\u0706\u0003\u0162\u00b1\u0000\u0705\u0707\u0003\u0132\u0099\u0000\u0706"+ + "\u0705\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707"+ + "\u070d\u0001\u0000\u0000\u0000\u0708\u0709\u0005f\u0000\u0000\u0709\u070a"+ + "\u0003\u00a2Q\u0000\u070a\u070b\u0005g\u0000\u0000\u070b\u070d\u0001\u0000"+ + "\u0000\u0000\u070c\u0703\u0001\u0000\u0000\u0000\u070c\u0704\u0001\u0000"+ + "\u0000\u0000\u070c\u0708\u0001\u0000\u0000\u0000\u070d\u015d\u0001\u0000"+ + "\u0000\u0000\u070e\u0712\u0003\u00b0X\u0000\u070f\u0712\u0003\u0166\u00b3"+ + "\u0000\u0710\u0712\u0003\u00b4Z\u0000\u0711\u070e\u0001\u0000\u0000\u0000"+ + "\u0711\u070f\u0001\u0000\u0000\u0000\u0711\u0710\u0001\u0000\u0000\u0000"+ + "\u0712\u015f\u0001\u0000\u0000\u0000\u0713\u0714\u0007\u0011\u0000\u0000"+ + "\u0714\u0161\u0001\u0000\u0000\u0000\u0715\u0716\u0005e\u0000\u0000\u0716"+ + "\u0163\u0001\u0000\u0000\u0000\u0717\u0718\u0005e\u0000\u0000\u0718\u0719"+ + "\u0005p\u0000\u0000\u0719\u071a\u0005e\u0000\u0000\u071a\u0165\u0001\u0000"+ + "\u0000\u0000\u071b\u071c\u0003\u00cae\u0000\u071c\u071d\u0003\u0168\u00b4"+ + "\u0000\u071d\u0167\u0001\u0000\u0000\u0000\u071e\u0723\u0005h\u0000\u0000"+ + "\u071f\u0721\u0003\u016a\u00b5\u0000\u0720\u0722\u0005m\u0000\u0000\u0721"+ + "\u0720\u0001\u0000\u0000\u0000\u0721\u0722\u0001\u0000\u0000\u0000\u0722"+ + "\u0724\u0001\u0000\u0000\u0000\u0723\u071f\u0001\u0000\u0000\u0000\u0723"+ + "\u0724\u0001\u0000\u0000\u0000\u0724\u0725\u0001\u0000\u0000\u0000\u0725"+ + "\u0726\u0005i\u0000\u0000\u0726\u0169\u0001\u0000\u0000\u0000\u0727\u072c"+ + "\u0003\u016c\u00b6\u0000\u0728\u0729\u0005m\u0000\u0000\u0729\u072b\u0003"+ + "\u016c\u00b6\u0000\u072a\u0728\u0001\u0000\u0000\u0000\u072b\u072e\u0001"+ + "\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000\u0000\u072c\u072d\u0001"+ + "\u0000\u0000\u0000\u072d\u016b\u0001\u0000\u0000\u0000\u072e\u072c\u0001"+ + "\u0000\u0000\u0000\u072f\u0730\u0003\u016e\u00b7\u0000\u0730\u0731\u0005"+ + "o\u0000\u0000\u0731\u0733\u0001\u0000\u0000\u0000\u0732\u072f\u0001\u0000"+ + "\u0000\u0000\u0732\u0733\u0001\u0000\u0000\u0000\u0733\u0734\u0001\u0000"+ + "\u0000\u0000\u0734\u0735\u0003\u0170\u00b8\u0000\u0735\u016d\u0001\u0000"+ + "\u0000\u0000\u0736\u0739\u0003\u00a2Q\u0000\u0737\u0739\u0003\u0168\u00b4"+ + "\u0000\u0738\u0736\u0001\u0000\u0000\u0000\u0738\u0737\u0001\u0000\u0000"+ + "\u0000\u0739\u016f\u0001\u0000\u0000\u0000\u073a\u073d\u0003\u00a2Q\u0000"+ + "\u073b\u073d\u0003\u0168\u00b4\u0000\u073c\u073a\u0001\u0000\u0000\u0000"+ + "\u073c\u073b\u0001\u0000\u0000\u0000\u073d\u0171\u0001\u0000\u0000\u0000"+ + "\u073e\u073f\u0005T\u0000\u0000\u073f\u0745\u0005h\u0000\u0000\u0740\u0741"+ + "\u0003\u0174\u00ba\u0000\u0741\u0742\u0005\u009f\u0000\u0000\u0742\u0744"+ + "\u0001\u0000\u0000\u0000\u0743\u0740\u0001\u0000\u0000\u0000\u0744\u0747"+ + "\u0001\u0000\u0000\u0000\u0745\u0743\u0001\u0000\u0000\u0000\u0745\u0746"+ + "\u0001\u0000\u0000\u0000\u0746\u0748\u0001\u0000\u0000\u0000\u0747\u0745"+ + "\u0001\u0000\u0000\u0000\u0748\u0749\u0005i\u0000\u0000\u0749\u0173\u0001"+ + "\u0000\u0000\u0000\u074a\u074b\u0003\u00e4r\u0000\u074b\u074c\u0003\u00c2"+ + "a\u0000\u074c\u074f\u0001\u0000\u0000\u0000\u074d\u074f\u0003\u0178\u00bc"+ + "\u0000\u074e\u074a\u0001\u0000\u0000\u0000\u074e\u074d\u0001\u0000\u0000"+ + "\u0000\u074f\u0751\u0001\u0000\u0000\u0000\u0750\u0752\u0003\u0176\u00bb"+ + "\u0000\u0751\u0750\u0001\u0000\u0000\u0000\u0751\u0752\u0001\u0000\u0000"+ + "\u0000\u0752\u0175\u0001\u0000\u0000\u0000\u0753\u0754\u0007\u0012\u0000"+ + "\u0000\u0754\u0177\u0001\u0000\u0000\u0000\u0755\u0757\u0005\u0087\u0000"+ + "\u0000\u0756\u0755\u0001\u0000\u0000\u0000\u0756\u0757\u0001\u0000\u0000"+ + "\u0000\u0757\u0758\u0001\u0000\u0000\u0000\u0758\u075a\u0003\u0130\u0098"+ + "\u0000\u0759\u075b\u0003\u0132\u0099\u0000\u075a\u0759\u0001\u0000\u0000"+ + "\u0000\u075a\u075b\u0001\u0000\u0000\u0000\u075b\u0179\u0001\u0000\u0000"+ + "\u0000\u075c\u075d\u0005j\u0000\u0000\u075d\u075e\u0003\u00a2Q\u0000\u075e"+ + "\u075f\u0005k\u0000\u0000\u075f\u017b\u0001\u0000\u0000\u0000\u0760\u0761"+ + "\u0005p\u0000\u0000\u0761\u0762\u0005f\u0000\u0000\u0762\u0763\u0003\u00c2"+ + "a\u0000\u0763\u0764\u0005g\u0000\u0000\u0764\u017d\u0001\u0000\u0000\u0000"+ + "\u0765\u0774\u0005f\u0000\u0000\u0766\u076d\u0003\u00e6s\u0000\u0767\u076a"+ + "\u0003\u015a\u00ad\u0000\u0768\u0769\u0005m\u0000\u0000\u0769\u076b\u0003"+ + "\u00e6s\u0000\u076a\u0768\u0001\u0000\u0000\u0000\u076a\u076b\u0001\u0000"+ + "\u0000\u0000\u076b\u076d\u0001\u0000\u0000\u0000\u076c\u0766\u0001\u0000"+ + "\u0000\u0000\u076c\u0767\u0001\u0000\u0000\u0000\u076d\u076f\u0001\u0000"+ + "\u0000\u0000\u076e\u0770\u0005t\u0000\u0000\u076f\u076e\u0001\u0000\u0000"+ + "\u0000\u076f\u0770\u0001\u0000\u0000\u0000\u0770\u0772\u0001\u0000\u0000"+ + "\u0000\u0771\u0773\u0005m\u0000\u0000\u0772\u0771\u0001\u0000\u0000\u0000"+ + "\u0772\u0773\u0001\u0000\u0000\u0000\u0773\u0775\u0001\u0000\u0000\u0000"+ + "\u0774\u076c\u0001\u0000\u0000\u0000\u0774\u0775\u0001\u0000\u0000\u0000"+ + "\u0775\u0776\u0001\u0000\u0000\u0000\u0776\u0777\u0005g\u0000\u0000\u0777"+ + "\u017f\u0001\u0000\u0000\u0000\u0778\u0779\u0003\u015a\u00ad\u0000\u0779"+ + "\u077a\u0005p\u0000\u0000\u077a\u077b\u0005e\u0000\u0000\u077b\u0181\u0001"+ + "\u0000\u0000\u0000\u077c\u077d\u0003\u00c2a\u0000\u077d\u0183\u0001\u0000"+ + "\u0000\u0000\u077e\u0783\u0005n\u0000\u0000\u077f\u0783\u0005\u0000\u0000"+ + "\u0001\u0780\u0783\u0005\u009f\u0000\u0000\u0781\u0783\u0004\u00c2\u0012"+ + "\u0000\u0782\u077e\u0001\u0000\u0000\u0000\u0782\u077f\u0001\u0000\u0000"+ + "\u0000\u0782\u0780\u0001\u0000\u0000\u0000\u0782\u0781\u0001\u0000\u0000"+ + "\u0000\u0783\u0185\u0001\u0000\u0000\u0000\u00c5\u0194\u0199\u01a0\u01aa"+ + "\u01b0\u01b6\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2\u01fc\u020d\u021b"+ + "\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299\u02a6\u02af\u02bd"+ + "\u02c6\u02d2\u02e7\u02ee\u02f3\u02f8\u0302\u0305\u0309\u030d\u0315\u031d"+ + "\u0322\u032a\u032c\u0331\u0338\u0340\u0343\u0349\u034e\u0350\u0353\u035a"+ + "\u035f\u0372\u037a\u037e\u0381\u0387\u038b\u038e\u0398\u039f\u03a6\u03b2"+ + "\u03b7\u03bb\u03c2\u03c7\u03cd\u03d9\u03df\u03e3\u03eb\u03ef\u03f5\u03f8"+ + "\u03fe\u0403\u041c\u043f\u0441\u0458\u0460\u046b\u0472\u0479\u0483\u0491"+ + "\u04a7\u04a9\u04b1\u04b5\u04b9\u04bc\u04c7\u04cf\u04d6\u04de\u04e4\u04e8"+ + "\u04f0\u04fb\u0506\u050a\u050c\u0518\u051a\u0523\u0527\u052a\u0531\u053c"+ + "\u0546\u054c\u054e\u0558\u0562\u0566\u056a\u056e\u0575\u057d\u0588\u058c"+ + "\u0590\u0598\u05a4\u05a8\u05ac\u05b5\u05bc\u05d0\u05d4\u05d8\u05dc\u05ec"+ + "\u05f2\u05f4\u05f8\u05fc\u05ff\u0603\u0605\u060b\u0613\u0618\u0623\u0629"+ + "\u0630\u063b\u0640\u0644\u0649\u064d\u0655\u065d\u0662\u0665\u066d\u0675"+ + "\u067a\u067e\u0682\u0689\u068e\u0697\u06ab\u06bf\u06ca\u06ce\u06d6\u06da"+ + "\u06dc\u06e3\u06ec\u06f8\u0701\u0706\u070c\u0711\u0721\u0723\u072c\u0732"+ + "\u0738\u073c\u0745\u074e\u0751\u0756\u075a\u076a\u076c\u076f\u0772\u0774"+ + "\u0782"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -13655,4 +14986,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 27688feeb..46ab410f0 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,3 +1,4 @@ +// 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; @@ -9,6 +10,7 @@ * @param The return type of the visit operation. Use {@link Void} for * operations with no return type. */ +@SuppressWarnings("CheckReturnValue") public class GobraParserBaseVisitor extends AbstractParseTreeVisitor implements GobraParserVisitor { /** * {@inheritDoc} @@ -899,6 +901,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} * @@ -1060,6 +1069,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} * @@ -1234,7 +1257,7 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple *

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

*/ - @Override public T visitTypeList(GobraParser.TypeListContext ctx) { return visitChildren(ctx); } + @Override public T visitTypeListSwitch(GobraParser.TypeListSwitchContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1291,6 +1314,20 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

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

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

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

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

+ */ + @Override public T visitTypeList(GobraParser.TypeListContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1319,6 +1356,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} * @@ -1368,6 +1419,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} * @@ -1529,4 +1608,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} +} \ No newline at end of file diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 79f5cf002..aa43a3174 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,3 +1,4 @@ +// 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; @@ -808,6 +809,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 @@ -946,6 +953,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 @@ -1091,11 +1110,11 @@ public interface GobraParserVisitor extends ParseTreeVisitor { */ T visitTypeSwitchCase(GobraParser.TypeSwitchCaseContext ctx); /** - * Visit a parse tree produced by {@link GobraParser#typeList}. + * Visit a parse tree produced by {@link GobraParser#typeListSwitch}. * @param ctx the parse tree * @return the visitor result */ - T visitTypeList(GobraParser.TypeListContext ctx); + T visitTypeListSwitch(GobraParser.TypeListSwitchContext ctx); /** * Visit a parse tree produced by {@link GobraParser#selectStmt}. * @param ctx the parse tree @@ -1144,6 +1163,18 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitTypeName(GobraParser.TypeNameContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeArgs}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeArgs(GobraParser.TypeArgsContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#typeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeList(GobraParser.TypeListContext ctx); /** * Visit a parse tree produced by {@link GobraParser#arrayType}. * @param ctx the parse tree @@ -1168,6 +1199,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 @@ -1210,6 +1253,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 @@ -1348,4 +1415,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} +} \ No newline at end of file diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index dcc5c3a65..f5999ce55 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -168,6 +168,7 @@ sealed trait PFunctionOrMethodDecl extends PNode with PScope { case class PFunctionDecl( id: PIdnDef, + typeParameters: Vector[PTypeParameter], args: Vector[PParameter], result: PResult, spec: PFunctionSpec, @@ -190,10 +191,16 @@ sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostif def right: PType } -case class PTypeDef(right: PType, left: PIdnDef) extends PTypeDecl +case class PTypeDef(right: PType, left: PIdnDef, typeParameters: Vector[PTypeParameter]) extends PTypeDecl case class PTypeAlias(right: PType, left: PIdnDef) extends PTypeDecl +sealed trait PTypeConstraint extends PNode + +case class PSimpleTypeConstraint(t: PType) extends PTypeConstraint + +case class PUnionTypeConstraint(ts: Vector[PTypeConstraint]) extends PTypeConstraint + /** * Statements @@ -616,9 +623,11 @@ sealed trait PLiteralType extends PNode * 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 + + var typeArgs: Vector[PType] = Vector.empty } /** @@ -767,6 +776,10 @@ case class PIdnDef(name: String) extends PDefLikeId case class PIdnUse(name: String) extends PUseLikeId case class PIdnUnk(name: String) extends PUnkLikeId +case class PTypeParameter(name: String, restriction: PTypeConstraint) extends PDefLikeId + +case class PTypeArgument(name: String) extends PUseLikeId + sealed trait PLabelNode extends PNode { def name: String } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 73425dd07..8751cc765 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -208,6 +208,26 @@ 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 = { + if (has(ctx.typeName())) { + val typeName = visitTypeName(ctx.typeName()) + + if (has(ctx.typeArgs())) { + typeName.typeArgs = visitTypeArgs(ctx.typeArgs()) + } + + typeName + } else { + visitNode[PType](ctx.type_()) + } + } + 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 @@ -216,6 +236,26 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } } + /** + * {@inheritDoc } + * + *

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

+ */ + override def visitTypeArgs(ctx: TypeArgsContext): Vector[PType] = { + visitTypeList(ctx.typeList()) + } + + /** + * {@inheritDoc } + * + *

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

+ */ + override def visitTypeList(ctx: TypeListContext): Vector[PType] = { + visitListNode[PType](ctx.type_()) + } + /** * {@inheritDoc } * @@ -318,11 +358,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitEmbeddedField(ctx: EmbeddedFieldContext): PEmbeddedType = { - visitChildren(ctx) match { + val embeddedType = visitChildren(ctx) match { case name : PUnqualifiedTypeName => PEmbeddedName(name) case Vector("*", name : PUnqualifiedTypeName) => PEmbeddedPointer(name) case _ : PDot | Vector("*", _ : PDot) => fail(ctx, "Imported types are not yet supported as embedded interface names") } + + embeddedType.typ.typeArgs = visitTypeArgs(ctx.typeArgs()) + embeddedType } //endregion @@ -406,16 +449,29 @@ 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 { + val methodDecls = visitNodeIf[PMethodSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.methodSpec())) + val embedded = visitNodeIf[PType, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.typeElem())).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 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): PType = { + if (ctx.typeTerm().length > 1) { + fail(ctx, "Union types are not yet supported.") + } + + visitNode[PType](ctx.typeTerm(0)) + } /** * {@inheritDoc } @@ -728,17 +784,82 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitTypeSpec(ctx: GobraParser.TypeSpecContext): PTypeDecl = { + visitChildren(ctx) match { + case aliasDeclCtx : AliasDeclContext => visitAliasDecl(aliasDeclCtx) + case typeDefCtx : TypeDefContext => visitTypeDef(typeDefCtx) + case _ => unexpected(ctx) + } + } + + /** + * {@inheritDoc } + * + *

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

+ */ + 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) } + /** + * {@inheritDoc } + * + *

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

+ */ + override def visitTypeDef(ctx: TypeDefContext): PTypeDecl = { + val left = goIdnDef.get(ctx.IDENTIFIER()) + val right = visitNode[PType](ctx.type_()) + val typeParameters = visitTypeParameters(ctx.typeParameters()) + + PTypeDef(right, left, typeParameters) + } + + /** + * {@inheritDoc } + * + *

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

+ */ + override def visitTypeParameters(ctx: TypeParametersContext): Vector[PTypeParameter] = { + visitTypeParamList(ctx.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] = { + val ids = visitIdentifierList(ctx.identifierList()) + val constraint = visitTypeConstraint(ctx.typeConstraint()) + + ids.map(id => PTypeParameter(id.name, constraint)).toVector + } + + /** + * {@inheritDoc } + * + *

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

+ */ + override def visitTypeConstraint(ctx: TypeConstraintContext): PTypeConstraint = { + PSimpleTypeConstraint(visitTypeElem(ctx.typeElem())) + } /** * {@inheritDoc } @@ -821,8 +942,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 +954,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 = visitTypeParameters(ctx.typeParameters()) 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) } @@ -1010,7 +1132,13 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * @return the visitor result */ override def visitOperand(ctx: GobraParser.OperandContext): PExpression = { + val typeArgs = visitTypeArgs(ctx.typeArgs()) + visitChildren(ctx) match { + case op : PNamedOperand => { + op.typeArgs = typeArgs + op + } case e : PExpression => e case Vector("(", e : PExpression, ")") => e case _ => fail(ctx) @@ -1064,6 +1192,23 @@ 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 = { + val typeArgs = visitTypeArgs(ctx.typeArgs()) + + visitChildren(ctx) match { + case typeName : PTypeName => { + typeName.typeArgs = typeArgs + typeName + } + case x : PLiteralType => x + } + } /** Translates the rule * literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -1851,7 +1996,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole *

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

*/ - override def visitTypeList(ctx: TypeListContext): Vector[PExpressionOrType] = { + override def visitTypeListSwitch(ctx: TypeListSwitchContext): Vector[PExpressionOrType] = { val types = visitListNode[PType](ctx.type_()) // Need to check whether this includes nil, since it's a predeclared identifier and not a type if (has(ctx.NIL_LIT()) && !ctx.NIL_LIT().isEmpty) types.appended(PNilLit().at(ctx.NIL_LIT(0))) else types @@ -1866,7 +2011,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitTypeCaseClause(ctx: TypeCaseClauseContext): PTypeSwitchCase = { val body = PBlock(visitStatementList(ctx.statementList())) .at(if (has(ctx.statementList())) ctx.statementList() else ctx) // If we have no statement list, we need to position at the context - val left = visitTypeList(ctx.typeSwitchCase().typeList()) + val left = visitTypeListSwitch(ctx.typeSwitchCase().typeListSwitch()) PTypeSwitchCase(left, body).at(ctx) } From 2917a1a571a0d72419f385eed828e5a2a45f3956 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 8 May 2023 17:28:59 +0200 Subject: [PATCH 04/37] changed typeArgument rule to index instead - modified parser and parse tree translator accordingly - implemented ambiguity resolution for indexed expression (normal index expression or type arguments) --- src/main/antlr4/GoParser.g4 | 18 +- src/main/antlr4/GobraParser.g4 | 4 +- .../viper/gobra/frontend/GobraParser.java | 4871 ++++++++--------- .../frontend/GobraParserBaseVisitor.java | 16 +- .../gobra/frontend/GobraParserVisitor.java | 16 +- .../scala/viper/gobra/ast/frontend/Ast.scala | 3 +- .../viper/gobra/ast/frontend/AstPattern.scala | 6 +- .../gobra/ast/frontend/PrettyPrinter.scala | 15 +- .../gobra/frontend/ParseTreeTranslator.scala | 124 +- .../scala/viper/gobra/frontend/Parser.scala | 2 +- .../resolution/AmbiguityResolution.scala | 33 +- .../ghost/separation/GhostLessPrinter.scala | 3 +- .../ghost/separation/GoifyingPrinter.scala | 3 +- 13 files changed, 2493 insertions(+), 2621 deletions(-) diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 0a4b04ec6..861d0042d 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -181,9 +181,9 @@ typeSwitchGuard: (IDENTIFIER DECLARE_ASSIGN)? primaryExpr DOT L_PAREN TYPE R_PAR typeCaseClause: typeSwitchCase COLON statementList?; -typeSwitchCase: CASE typeListSwitch | DEFAULT; +typeSwitchCase: CASE typeList | DEFAULT; -typeListSwitch: (type_ | NIL_LIT) (COMMA (type_ | NIL_LIT))*; +typeList: (type_ | NIL_LIT) (COMMA (type_ | NIL_LIT))*; selectStmt: SELECT L_CURLY commClause* R_CURLY; @@ -205,14 +205,10 @@ rangeClause: ( goStmt: GO expression; -type_: typeName typeArgs? | typeLit | L_PAREN type_ R_PAREN; +type_: typeName index? | typeLit | L_PAREN type_ R_PAREN; typeName: qualifiedIdent | IDENTIFIER; -typeArgs: L_BRACKET typeList COMMA? R_BRACKET; - -typeList: type_ (COMMA type_)*; - typeLit: arrayType | structType @@ -323,7 +319,7 @@ conversion: nonNamedType L_PAREN expression COMMA? R_PAREN; nonNamedType: typeLit | L_PAREN nonNamedType R_PAREN; -operand: literal | operandName typeArgs? | L_PAREN expression R_PAREN; +operand: literal | operandName | L_PAREN expression R_PAREN; literal: basicLit | compositeLit | functionLit; @@ -353,7 +349,7 @@ literalType: | L_BRACKET ELLIPSIS R_BRACKET elementType | sliceType | mapType - | typeName typeArgs?; + | typeName index?; literalValue: L_CURLY (elementList COMMA?)? R_CURLY; @@ -374,11 +370,11 @@ fieldDecl: ( string_: RAW_STRING_LIT | INTERPRETED_STRING_LIT; -embeddedField: STAR? typeName typeArgs?; +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 d516d5c2d..8f8d8199a 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -400,7 +400,7 @@ methodSpec: | GHOST? specification IDENTIFIER parameters; // Added ghostTypeLiterals -type_: typeName typeArgs? | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; +type_: typeName index? | typeLit | ghostTypeLit | L_PAREN type_ R_PAREN; // Added pred types typeLit: @@ -426,7 +426,7 @@ literalType: | sliceType | mapType | ghostTypeLit - | typeName typeArgs?; + | typeName index?; implicitArray: L_BRACKET ELLIPSIS R_BRACKET elementType; diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 717aba363..0cb459365 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -85,21 +85,21 @@ public class GobraParser extends GobraParserBase { RULE_gotoStmt = 133, RULE_fallthroughStmt = 134, RULE_ifStmt = 135, RULE_switchStmt = 136, RULE_exprSwitchStmt = 137, RULE_exprCaseClause = 138, RULE_exprSwitchCase = 139, RULE_typeSwitchStmt = 140, RULE_typeSwitchGuard = 141, RULE_typeCaseClause = 142, - RULE_typeSwitchCase = 143, RULE_typeListSwitch = 144, RULE_selectStmt = 145, + RULE_typeSwitchCase = 143, RULE_typeList = 144, RULE_selectStmt = 145, RULE_commClause = 146, RULE_commCase = 147, RULE_recvStmt = 148, RULE_forStmt = 149, - RULE_forClause = 150, RULE_goStmt = 151, RULE_typeName = 152, RULE_typeArgs = 153, - RULE_typeList = 154, RULE_arrayType = 155, RULE_arrayLength = 156, RULE_elementType = 157, - RULE_pointerType = 158, RULE_typeElem = 159, RULE_typeTerm = 160, RULE_sliceType = 161, - RULE_mapType = 162, RULE_channelType = 163, RULE_functionType = 164, RULE_signature = 165, - RULE_result = 166, RULE_parameters = 167, RULE_typeParameters = 168, RULE_typeParamList = 169, - RULE_typeParamDecl = 170, RULE_typeConstraint = 171, RULE_conversion = 172, - RULE_nonNamedType = 173, RULE_operand = 174, RULE_literal = 175, RULE_integer = 176, - RULE_operandName = 177, RULE_qualifiedIdent = 178, RULE_compositeLit = 179, - RULE_literalValue = 180, RULE_elementList = 181, RULE_keyedElement = 182, - RULE_key = 183, RULE_element = 184, RULE_structType = 185, RULE_fieldDecl = 186, - RULE_string_ = 187, RULE_embeddedField = 188, RULE_index = 189, RULE_typeAssertion = 190, - RULE_arguments = 191, RULE_methodExpr = 192, RULE_receiverType = 193, - RULE_eos = 194; + RULE_forClause = 150, RULE_goStmt = 151, RULE_typeName = 152, RULE_arrayType = 153, + RULE_arrayLength = 154, RULE_elementType = 155, RULE_pointerType = 156, + RULE_typeElem = 157, RULE_typeTerm = 158, RULE_sliceType = 159, RULE_mapType = 160, + RULE_channelType = 161, RULE_functionType = 162, RULE_signature = 163, + RULE_result = 164, RULE_parameters = 165, RULE_typeParameters = 166, RULE_typeParamList = 167, + RULE_typeParamDecl = 168, RULE_typeConstraint = 169, RULE_conversion = 170, + RULE_nonNamedType = 171, RULE_operand = 172, RULE_literal = 173, RULE_integer = 174, + RULE_operandName = 175, RULE_qualifiedIdent = 176, RULE_compositeLit = 177, + RULE_literalValue = 178, RULE_elementList = 179, RULE_keyedElement = 180, + RULE_key = 181, RULE_element = 182, RULE_structType = 183, RULE_fieldDecl = 184, + RULE_string_ = 185, RULE_embeddedField = 186, RULE_index = 187, RULE_typeAssertion = 188, + RULE_arguments = 189, RULE_methodExpr = 190, RULE_receiverType = 191, + RULE_eos = 192; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -131,16 +131,16 @@ private static String[] makeRuleNames() { "labeledStmt", "returnStmt", "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", "typeCaseClause", - "typeSwitchCase", "typeListSwitch", "selectStmt", "commClause", "commCase", - "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "typeArgs", - "typeList", "arrayType", "arrayLength", "elementType", "pointerType", - "typeElem", "typeTerm", "sliceType", "mapType", "channelType", "functionType", - "signature", "result", "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" + "typeSwitchCase", "typeList", "selectStmt", "commClause", "commCase", + "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "arrayType", + "arrayLength", "elementType", "pointerType", "typeElem", "typeTerm", + "sliceType", "mapType", "channelType", "functionType", "signature", "result", + "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(); @@ -272,9 +272,9 @@ public final ExprOnlyContext exprOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(390); + setState(386); expression(0); - setState(391); + setState(387); match(EOF); } } @@ -312,9 +312,9 @@ public final StmtOnlyContext stmtOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(393); + setState(389); statement(); - setState(394); + setState(390); match(EOF); } } @@ -352,9 +352,9 @@ public final TypeOnlyContext typeOnly() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(396); + setState(392); type_(); - setState(397); + setState(393); match(EOF); } } @@ -399,21 +399,21 @@ public final MaybeAddressableIdentifierListContext maybeAddressableIdentifierLis try { enterOuterAlt(_localctx, 1); { - setState(399); + setState(395); maybeAddressableIdentifier(); - setState(404); + setState(400); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(400); + setState(396); match(COMMA); - setState(401); + setState(397); maybeAddressableIdentifier(); } } - setState(406); + setState(402); _errHandler.sync(this); _la = _input.LA(1); } @@ -452,14 +452,14 @@ public final MaybeAddressableIdentifierContext maybeAddressableIdentifier() thro try { enterOuterAlt(_localctx, 1); { - setState(407); + setState(403); match(IDENTIFIER); - setState(409); + setState(405); _errHandler.sync(this); _la = _input.LA(1); if (_la==ADDR_MOD) { { - setState(408); + setState(404); match(ADDR_MOD); } } @@ -537,79 +537,79 @@ public final SourceFileContext sourceFile() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(416); + setState(412); _errHandler.sync(this); _la = _input.LA(1); while (_la==INIT_POST) { { { - setState(411); + setState(407); initPost(); - setState(412); + setState(408); eos(); } } - setState(418); + setState(414); _errHandler.sync(this); _la = _input.LA(1); } - setState(419); + setState(415); packageClause(); - setState(420); + setState(416); eos(); - setState(426); + setState(422); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE || _la==IMPORT) { { { - setState(421); + setState(417); importDecl(); - setState(422); + setState(418); eos(); } } - setState(428); + setState(424); _errHandler.sync(this); _la = _input.LA(1); } - setState(438); + setState(434); _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(432); + setState(428); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: { - setState(429); + setState(425); specMember(); } break; case 2: { - setState(430); + setState(426); declaration(); } break; case 3: { - setState(431); + setState(427); ghostMember(); } break; } - setState(434); + setState(430); eos(); } } - setState(440); + setState(436); _errHandler.sync(this); _la = _input.LA(1); } - setState(441); + setState(437); match(EOF); } } @@ -647,9 +647,9 @@ public final InitPostContext initPost() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(439); match(INIT_POST); - setState(444); + setState(440); expression(0); } } @@ -687,9 +687,9 @@ public final ImportPreContext importPre() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(446); + setState(442); match(IMPORT_PRE); - setState(447); + setState(443); expression(0); } } @@ -742,28 +742,28 @@ public final ImportSpecContext importSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(450); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(449); + setState(445); importPre(); - setState(450); + setState(446); eos(); } } - setState(456); + setState(452); _errHandler.sync(this); _la = _input.LA(1); } - setState(458); + setState(454); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER || _la==DOT) { { - setState(457); + setState(453); ((ImportSpecContext)_localctx).alias = _input.LT(1); _la = _input.LA(1); if ( !(_la==IDENTIFIER || _la==DOT) ) { @@ -777,7 +777,7 @@ public final ImportSpecContext importSpec() throws RecognitionException { } } - setState(460); + setState(456); importPath(); } } @@ -833,56 +833,56 @@ public final ImportDeclContext importDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(467); + setState(463); _errHandler.sync(this); _la = _input.LA(1); while (_la==IMPORT_PRE) { { { - setState(462); + setState(458); importPre(); - setState(463); + setState(459); eos(); } } - setState(469); + setState(465); _errHandler.sync(this); _la = _input.LA(1); } - setState(483); + setState(479); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(470); + setState(466); match(IMPORT); - setState(471); + setState(467); importSpec(); } break; case 2: { - setState(472); + setState(468); match(IMPORT); - setState(473); + setState(469); match(L_PAREN); - setState(479); + setState(475); _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(474); + setState(470); importSpec(); - setState(475); + setState(471); eos(); } } - setState(481); + setState(477); _errHandler.sync(this); _la = _input.LA(1); } - setState(482); + setState(478); match(R_PAREN); } break; @@ -929,34 +929,34 @@ public final GhostMemberContext ghostMember() throws RecognitionException { GhostMemberContext _localctx = new GhostMemberContext(_ctx, getState()); enterRule(_localctx, 20, RULE_ghostMember); try { - setState(489); + setState(485); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(485); + setState(481); implementationProof(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(486); + setState(482); fpredicateDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(487); + setState(483); mpredicateDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(488); + setState(484); explicitGhostMember(); } break; @@ -1048,16 +1048,16 @@ public final GhostStatementContext ghostStatement() throws RecognitionException enterRule(_localctx, 22, RULE_ghostStatement); int _la; try { - setState(498); + setState(494); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: _localctx = new ExplicitGhostStatementContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(491); + setState(487); match(GHOST); - setState(492); + setState(488); statement(); } break; @@ -1066,7 +1066,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new FoldStatementContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(493); + setState(489); ((FoldStatementContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -1077,7 +1077,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(494); + setState(490); predicateAccess(); } break; @@ -1088,7 +1088,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new ProofStatementContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(495); + setState(491); ((ProofStatementContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 480L) != 0)) ) { @@ -1099,7 +1099,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _errHandler.reportMatch(this); consume(); } - setState(496); + setState(492); expression(0); } break; @@ -1107,7 +1107,7 @@ public final GhostStatementContext ghostStatement() throws RecognitionException _localctx = new MatchStmt_Context(_localctx); enterOuterAlt(_localctx, 4); { - setState(497); + setState(493); matchStmt(); } break; @@ -1148,7 +1148,7 @@ public final AuxiliaryStatementContext auxiliaryStatement() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(500); + setState(496); statementWithSpec(); } } @@ -1189,10 +1189,10 @@ public final StatementWithSpecContext statementWithSpec() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(498); ((StatementWithSpecContext)_localctx).specification = specification(); { - setState(503); + setState(499); outlineStatement(((StatementWithSpecContext)_localctx).specification.trusted, ((StatementWithSpecContext)_localctx).specification.pure); } } @@ -1239,21 +1239,21 @@ public final OutlineStatementContext outlineStatement(boolean trusted,boolean pu try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(501); match(OUTLINE); - setState(506); + setState(502); match(L_PAREN); - setState(508); + setState(504); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(507); + setState(503); statementList(); } } - setState(510); + setState(506); match(R_PAREN); } } @@ -1324,97 +1324,97 @@ public final GhostPrimaryExprContext ghostPrimaryExpr() throws RecognitionExcept GhostPrimaryExprContext _localctx = new GhostPrimaryExprContext(_ctx, getState()); enterRule(_localctx, 30, RULE_ghostPrimaryExpr); try { - setState(525); + setState(521); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(512); + setState(508); range(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(513); + setState(509); access(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(514); + setState(510); typeOf(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(515); + setState(511); typeExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(516); + setState(512); isComparable(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(517); + setState(513); old(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(518); + setState(514); before(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(519); + setState(515); sConversion(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(520); + setState(516); optionNone(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(521); + setState(517); optionSome(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(522); + setState(518); optionGet(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(523); + setState(519); permission(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(524); + setState(520); matchExpr(); } break; @@ -1453,7 +1453,7 @@ public final PermissionContext permission() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(523); _la = _input.LA(1); if ( !(_la==WRITEPERM || _la==NOPERM) ) { _errHandler.recoverInline(this); @@ -1501,13 +1501,13 @@ public final TypeExprContext typeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(525); match(TYPE); - setState(530); + setState(526); match(L_BRACKET); - setState(531); + setState(527); type_(); - setState(532); + setState(528); match(R_BRACKET); } } @@ -1553,32 +1553,32 @@ public final BoundVariablesContext boundVariables() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(534); + setState(530); boundVariableDecl(); - setState(539); + setState(535); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(535); + setState(531); match(COMMA); - setState(536); + setState(532); boundVariableDecl(); } } } - setState(541); + setState(537); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } - setState(543); + setState(539); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(542); + setState(538); match(COMMA); } } @@ -1627,25 +1627,25 @@ public final BoundVariableDeclContext boundVariableDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(545); + setState(541); match(IDENTIFIER); - setState(550); + setState(546); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(546); + setState(542); match(COMMA); - setState(547); + setState(543); match(IDENTIFIER); } } - setState(552); + setState(548); _errHandler.sync(this); _la = _input.LA(1); } - setState(553); + setState(549); elementType(); } } @@ -1686,17 +1686,17 @@ public final TriggersContext triggers() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(558); + setState(554); _errHandler.sync(this); _la = _input.LA(1); while (_la==L_CURLY) { { { - setState(555); + setState(551); trigger(); } } - setState(560); + setState(556); _errHandler.sync(this); _la = _input.LA(1); } @@ -1745,27 +1745,27 @@ public final TriggerContext trigger() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(561); + setState(557); match(L_CURLY); - setState(562); + setState(558); expression(0); - setState(567); + setState(563); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(563); + setState(559); match(COMMA); - setState(564); + setState(560); expression(0); } } - setState(569); + setState(565); _errHandler.sync(this); _la = _input.LA(1); } - setState(570); + setState(566); match(R_CURLY); } } @@ -1802,7 +1802,7 @@ public final PredicateAccessContext predicateAccess() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(568); primaryExpr(0); } } @@ -1842,13 +1842,13 @@ public final OptionSomeContext optionSome() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(574); + setState(570); match(SOME); - setState(575); + setState(571); match(L_PAREN); - setState(576); + setState(572); expression(0); - setState(577); + setState(573); match(R_PAREN); } } @@ -1888,13 +1888,13 @@ public final OptionNoneContext optionNone() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(579); + setState(575); match(NONE); - setState(580); + setState(576); match(L_BRACKET); - setState(581); + setState(577); type_(); - setState(582); + setState(578); match(R_BRACKET); } } @@ -1934,13 +1934,13 @@ public final OptionGetContext optionGet() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(580); match(GET); - setState(585); + setState(581); match(L_PAREN); - setState(586); + setState(582); expression(0); - setState(587); + setState(583); match(R_PAREN); } } @@ -1984,7 +1984,7 @@ public final SConversionContext sConversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(589); + setState(585); ((SConversionContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -1995,11 +1995,11 @@ public final SConversionContext sConversion() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(590); + setState(586); match(L_PAREN); - setState(591); + setState(587); expression(0); - setState(592); + setState(588); match(R_PAREN); } } @@ -2045,27 +2045,27 @@ public final OldContext old() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(594); + setState(590); match(OLD); - setState(599); + setState(595); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(595); + setState(591); match(L_BRACKET); - setState(596); + setState(592); oldLabelUse(); - setState(597); + setState(593); match(R_BRACKET); } } - setState(601); + setState(597); match(L_PAREN); - setState(602); + setState(598); expression(0); - setState(603); + setState(599); match(R_PAREN); } } @@ -2101,20 +2101,20 @@ public final OldLabelUseContext oldLabelUse() throws RecognitionException { OldLabelUseContext _localctx = new OldLabelUseContext(_ctx, getState()); enterRule(_localctx, 56, RULE_oldLabelUse); try { - setState(607); + setState(603); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(605); + setState(601); labelUse(); } break; case LHS: enterOuterAlt(_localctx, 2); { - setState(606); + setState(602); match(LHS); } break; @@ -2153,7 +2153,7 @@ public final LabelUseContext labelUse() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(609); + setState(605); match(IDENTIFIER); } } @@ -2193,13 +2193,13 @@ public final BeforeContext before() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(611); + setState(607); match(BEFORE); - setState(612); + setState(608); match(L_PAREN); - setState(613); + setState(609); expression(0); - setState(614); + setState(610); match(R_PAREN); } } @@ -2239,13 +2239,13 @@ public final IsComparableContext isComparable() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(616); + setState(612); match(IS_COMPARABLE); - setState(617); + setState(613); match(L_PAREN); - setState(618); + setState(614); expression(0); - setState(619); + setState(615); match(R_PAREN); } } @@ -2285,13 +2285,13 @@ public final TypeOfContext typeOf() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(621); + setState(617); match(TYPE_OF); - setState(622); + setState(618); match(L_PAREN); - setState(623); + setState(619); expression(0); - setState(624); + setState(620); match(R_PAREN); } } @@ -2336,25 +2336,25 @@ public final AccessContext access() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(626); + setState(622); match(ACCESS); - setState(627); + setState(623); match(L_PAREN); - setState(628); + setState(624); expression(0); - setState(631); + setState(627); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(629); + setState(625); match(COMMA); - setState(630); + setState(626); expression(0); } } - setState(633); + setState(629); match(R_PAREN); } } @@ -2402,7 +2402,7 @@ public final RangeContext range() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(635); + setState(631); ((RangeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7696581394432L) != 0)) ) { @@ -2413,15 +2413,15 @@ public final RangeContext range() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(636); + setState(632); match(L_BRACKET); - setState(637); + setState(633); expression(0); - setState(638); + setState(634); match(DOT_DOT); - setState(639); + setState(635); expression(0); - setState(640); + setState(636); match(R_BRACKET); } } @@ -2474,29 +2474,29 @@ public final MatchExprContext matchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(642); + setState(638); match(MATCH); - setState(643); + setState(639); expression(0); - setState(644); + setState(640); match(L_CURLY); - setState(650); + setState(646); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(645); + setState(641); matchExprClause(); - setState(646); + setState(642); eos(); } } - setState(652); + setState(648); _errHandler.sync(this); _la = _input.LA(1); } - setState(653); + setState(649); match(R_CURLY); } } @@ -2537,11 +2537,11 @@ public final MatchExprClauseContext matchExprClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(655); + setState(651); matchCase(); - setState(656); + setState(652); match(COLON); - setState(657); + setState(653); expression(0); } } @@ -2588,29 +2588,29 @@ public final SeqUpdExpContext seqUpdExp() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(659); + setState(655); match(L_BRACKET); { - setState(660); + setState(656); seqUpdClause(); - setState(665); + setState(661); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(661); + setState(657); match(COMMA); - setState(662); + setState(658); seqUpdClause(); } } - setState(667); + setState(663); _errHandler.sync(this); _la = _input.LA(1); } } - setState(668); + setState(664); match(R_BRACKET); } } @@ -2651,11 +2651,11 @@ public final SeqUpdClauseContext seqUpdClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(670); + setState(666); expression(0); - setState(671); + setState(667); match(ASSIGN); - setState(672); + setState(668); expression(0); } } @@ -2699,7 +2699,7 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { GhostTypeLitContext _localctx = new GhostTypeLitContext(_ctx, getState()); enterRule(_localctx, 78, RULE_ghostTypeLit); try { - setState(678); + setState(674); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -2709,28 +2709,28 @@ public final GhostTypeLitContext ghostTypeLit() throws RecognitionException { case OPT: enterOuterAlt(_localctx, 1); { - setState(674); + setState(670); sqType(); } break; case GHOST: enterOuterAlt(_localctx, 2); { - setState(675); + setState(671); ghostSliceType(); } break; case DOM: enterOuterAlt(_localctx, 3); { - setState(676); + setState(672); domainType(); } break; case ADT: enterOuterAlt(_localctx, 4); { - setState(677); + setState(673); adtType(); } break; @@ -2784,27 +2784,27 @@ public final DomainTypeContext domainType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(680); + setState(676); match(DOM); - setState(681); + setState(677); match(L_CURLY); - setState(687); + setState(683); _errHandler.sync(this); _la = _input.LA(1); while (_la==AXIOM || _la==FUNC) { { { - setState(682); + setState(678); domainClause(); - setState(683); + setState(679); eos(); } } - setState(689); + setState(685); _errHandler.sync(this); _la = _input.LA(1); } - setState(690); + setState(686); match(R_CURLY); } } @@ -2850,32 +2850,32 @@ public final DomainClauseContext domainClause() throws RecognitionException { DomainClauseContext _localctx = new DomainClauseContext(_ctx, getState()); enterRule(_localctx, 82, RULE_domainClause); try { - setState(701); + setState(697); _errHandler.sync(this); switch (_input.LA(1)) { case FUNC: enterOuterAlt(_localctx, 1); { - setState(692); + setState(688); match(FUNC); - setState(693); + setState(689); match(IDENTIFIER); - setState(694); + setState(690); signature(); } break; case AXIOM: enterOuterAlt(_localctx, 2); { - setState(695); + setState(691); match(AXIOM); - setState(696); + setState(692); match(L_CURLY); - setState(697); + setState(693); expression(0); - setState(698); + setState(694); eos(); - setState(699); + setState(695); match(R_CURLY); } break; @@ -2929,27 +2929,27 @@ public final AdtTypeContext adtType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(699); match(ADT); - setState(704); + setState(700); match(L_CURLY); - setState(710); + setState(706); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(705); + setState(701); adtClause(); - setState(706); + setState(702); eos(); } } - setState(712); + setState(708); _errHandler.sync(this); _la = _input.LA(1); } - setState(713); + setState(709); match(R_CURLY); } } @@ -2999,27 +2999,27 @@ public final AdtClauseContext adtClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(715); + setState(711); match(IDENTIFIER); - setState(716); + setState(712); match(L_CURLY); - setState(722); + setState(718); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(717); + setState(713); fieldDecl(); - setState(718); + setState(714); eos(); } } - setState(724); + setState(720); _errHandler.sync(this); _la = _input.LA(1); } - setState(725); + setState(721); match(R_CURLY); } } @@ -3059,13 +3059,13 @@ public final GhostSliceTypeContext ghostSliceType() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(727); + setState(723); match(GHOST); - setState(728); + setState(724); match(L_BRACKET); - setState(729); + setState(725); match(R_BRACKET); - setState(730); + setState(726); elementType(); } } @@ -3112,7 +3112,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterRule(_localctx, 90, RULE_sqType); int _la; try { - setState(743); + setState(739); _errHandler.sync(this); switch (_input.LA(1)) { case SEQ: @@ -3122,7 +3122,7 @@ public final SqTypeContext sqType() throws RecognitionException { enterOuterAlt(_localctx, 1); { { - setState(732); + setState(728); ((SqTypeContext)_localctx).kind = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 25288767438848L) != 0)) ) { @@ -3133,11 +3133,11 @@ public final SqTypeContext sqType() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(733); + setState(729); match(L_BRACKET); - setState(734); + setState(730); type_(); - setState(735); + setState(731); match(R_BRACKET); } } @@ -3145,15 +3145,15 @@ public final SqTypeContext sqType() throws RecognitionException { case DICT: enterOuterAlt(_localctx, 2); { - setState(737); + setState(733); ((SqTypeContext)_localctx).kind = match(DICT); - setState(738); + setState(734); match(L_BRACKET); - setState(739); + setState(735); type_(); - setState(740); + setState(736); match(R_BRACKET); - setState(741); + setState(737); type_(); } break; @@ -3215,14 +3215,14 @@ public final SpecificationContext specification() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(755); + setState(751); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=1 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1+1 ) { { { - setState(750); + setState(746); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -3230,20 +3230,20 @@ public final SpecificationContext specification() throws RecognitionException { case POST: case DEC: { - setState(745); + setState(741); specStatement(); } break; case PURE: { - setState(746); + setState(742); match(PURE); ((SpecificationContext)_localctx).pure = true; } break; case TRUSTED: { - setState(748); + setState(744); match(TRUSTED); ((SpecificationContext)_localctx).trusted = true; } @@ -3251,21 +3251,21 @@ public final SpecificationContext specification() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(752); + setState(748); eos(); } } } - setState(757); + setState(753); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } - setState(760); + setState(756); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(758); + setState(754); match(PURE); ((SpecificationContext)_localctx).pure = true; } @@ -3312,42 +3312,42 @@ public final SpecStatementContext specStatement() throws RecognitionException { SpecStatementContext _localctx = new SpecStatementContext(_ctx, getState()); enterRule(_localctx, 94, RULE_specStatement); try { - setState(770); + setState(766); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: enterOuterAlt(_localctx, 1); { - setState(762); + setState(758); ((SpecStatementContext)_localctx).kind = match(PRE); - setState(763); + setState(759); assertion(); } break; case PRESERVES: enterOuterAlt(_localctx, 2); { - setState(764); + setState(760); ((SpecStatementContext)_localctx).kind = match(PRESERVES); - setState(765); + setState(761); assertion(); } break; case POST: enterOuterAlt(_localctx, 3); { - setState(766); + setState(762); ((SpecStatementContext)_localctx).kind = match(POST); - setState(767); + setState(763); assertion(); } break; case DEC: enterOuterAlt(_localctx, 4); { - setState(768); + setState(764); ((SpecStatementContext)_localctx).kind = match(DEC); - setState(769); + setState(765); terminationMeasure(); } break; @@ -3392,24 +3392,24 @@ public final TerminationMeasureContext terminationMeasure() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(773); + setState(769); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: { - setState(772); + setState(768); expressionList(); } break; } - setState(777); + setState(773); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(775); + setState(771); match(IF); - setState(776); + setState(772); expression(0); } break; @@ -3447,7 +3447,7 @@ public final AssertionContext assertion() throws RecognitionException { AssertionContext _localctx = new AssertionContext(_ctx, getState()); enterRule(_localctx, 98, RULE_assertion); try { - setState(781); + setState(777); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: @@ -3458,7 +3458,7 @@ public final AssertionContext assertion() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(780); + setState(776); expression(0); } break; @@ -3507,27 +3507,27 @@ public final MatchStmtContext matchStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(783); + setState(779); match(MATCH); - setState(784); + setState(780); expression(0); - setState(785); + setState(781); match(L_CURLY); - setState(789); + setState(785); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(786); + setState(782); matchStmtClause(); } } - setState(791); + setState(787); _errHandler.sync(this); _la = _input.LA(1); } - setState(792); + setState(788); match(R_CURLY); } } @@ -3569,16 +3569,16 @@ public final MatchStmtClauseContext matchStmtClause() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(794); + setState(790); matchCase(); - setState(795); + setState(791); match(COLON); - setState(797); + setState(793); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(796); + setState(792); statementList(); } } @@ -3618,22 +3618,22 @@ public final MatchCaseContext matchCase() throws RecognitionException { MatchCaseContext _localctx = new MatchCaseContext(_ctx, getState()); enterRule(_localctx, 104, RULE_matchCase); try { - setState(802); + setState(798); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(799); + setState(795); match(CASE); - setState(800); + setState(796); matchPattern(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(801); + setState(797); match(DEFAULT); } break; @@ -3711,16 +3711,16 @@ public final MatchPatternContext matchPattern() throws RecognitionException { enterRule(_localctx, 106, RULE_matchPattern); int _la; try { - setState(817); + setState(813); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: _localctx = new MatchPatternBindContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(804); + setState(800); match(QMARK); - setState(805); + setState(801); match(IDENTIFIER); } break; @@ -3728,23 +3728,23 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternCompositeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(806); + setState(802); literalType(); - setState(807); + setState(803); match(L_CURLY); - setState(812); + setState(808); _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(808); + setState(804); matchPatternList(); - setState(810); + setState(806); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(809); + setState(805); match(COMMA); } } @@ -3752,7 +3752,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { } } - setState(814); + setState(810); match(R_CURLY); } break; @@ -3760,7 +3760,7 @@ public final MatchPatternContext matchPattern() throws RecognitionException { _localctx = new MatchPatternValueContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(816); + setState(812); expression(0); } break; @@ -3807,23 +3807,23 @@ public final MatchPatternListContext matchPatternList() throws RecognitionExcept int _alt; enterOuterAlt(_localctx, 1); { - setState(819); + setState(815); matchPattern(); - setState(824); + setState(820); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(820); + setState(816); match(COMMA); - setState(821); + setState(817); matchPattern(); } } } - setState(826); + setState(822); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -3872,33 +3872,33 @@ public final BlockWithBodyParameterInfoContext blockWithBodyParameterInfo() thro try { enterOuterAlt(_localctx, 1); { - setState(827); + setState(823); match(L_CURLY); - setState(832); + setState(828); _errHandler.sync(this); _la = _input.LA(1); if (_la==SHARE) { { - setState(828); + setState(824); match(SHARE); - setState(829); + setState(825); identifierList(); - setState(830); + setState(826); eos(); } } - setState(835); + setState(831); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(834); + setState(830); statementList(); } } - setState(837); + setState(833); match(R_CURLY); } } @@ -3943,42 +3943,42 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(841); + setState(837); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(839); + setState(835); qualifiedIdent(); } break; case 2: { - setState(840); + setState(836); match(IDENTIFIER); } break; } - setState(851); + setState(847); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(843); + setState(839); match(L_CURLY); - setState(848); + setState(844); _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(844); + setState(840); closureSpecParams(); - setState(846); + setState(842); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(845); + setState(841); match(COMMA); } } @@ -3986,7 +3986,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition } } - setState(850); + setState(846); match(R_CURLY); } break; @@ -4034,23 +4034,23 @@ public final ClosureSpecParamsContext closureSpecParams() throws RecognitionExce int _alt; enterOuterAlt(_localctx, 1); { - setState(853); + setState(849); closureSpecParam(); - setState(858); + setState(854); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(854); + setState(850); match(COMMA); - setState(855); + setState(851); closureSpecParam(); } } } - setState(860); + setState(856); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } @@ -4091,19 +4091,19 @@ public final ClosureSpecParamContext closureSpecParam() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(863); + setState(859); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(861); + setState(857); match(IDENTIFIER); - setState(862); + setState(858); match(COLON); } break; } - setState(865); + setState(861); expression(0); } } @@ -4148,15 +4148,15 @@ public final ClosureImplProofStmtContext closureImplProofStmt() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(867); + setState(863); match(PROOF); - setState(868); + setState(864); expression(0); - setState(869); + setState(865); match(IMPL); - setState(870); + setState(866); closureSpecInstance(); - setState(871); + setState(867); block(); } } @@ -4218,52 +4218,52 @@ public final ImplementationProofContext implementationProof() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(873); + setState(869); type_(); - setState(874); + setState(870); match(IMPL); - setState(875); + setState(871); type_(); - setState(894); + setState(890); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(876); + setState(872); match(L_CURLY); - setState(882); + setState(878); _errHandler.sync(this); _la = _input.LA(1); while (_la==PRED) { { { - setState(877); + setState(873); implementationProofPredicateAlias(); - setState(878); + setState(874); eos(); } } - setState(884); + setState(880); _errHandler.sync(this); _la = _input.LA(1); } - setState(890); + setState(886); _errHandler.sync(this); _la = _input.LA(1); while (_la==PURE || _la==L_PAREN) { { { - setState(885); + setState(881); methodImplementationProof(); - setState(886); + setState(882); eos(); } } - setState(892); + setState(888); _errHandler.sync(this); _la = _input.LA(1); } - setState(893); + setState(889); match(R_CURLY); } break; @@ -4312,28 +4312,28 @@ public final MethodImplementationProofContext methodImplementationProof() throws try { enterOuterAlt(_localctx, 1); { - setState(897); + setState(893); _errHandler.sync(this); _la = _input.LA(1); if (_la==PURE) { { - setState(896); + setState(892); match(PURE); } } - setState(899); + setState(895); nonLocalReceiver(); - setState(900); + setState(896); match(IDENTIFIER); - setState(901); + setState(897); signature(); - setState(903); + setState(899); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { case 1: { - setState(902); + setState(898); block(); } break; @@ -4378,31 +4378,31 @@ public final NonLocalReceiverContext nonLocalReceiver() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(905); + setState(901); match(L_PAREN); - setState(907); + setState(903); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { - setState(906); + setState(902); match(IDENTIFIER); } break; } - setState(910); + setState(906); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(909); + setState(905); match(STAR); } } - setState(912); + setState(908); typeName(); - setState(913); + setState(909); match(R_PAREN); } } @@ -4442,24 +4442,24 @@ public final SelectionContext selection() throws RecognitionException { SelectionContext _localctx = new SelectionContext(_ctx, getState()); enterRule(_localctx, 126, RULE_selection); try { - setState(920); + setState(916); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(915); + setState(911); primaryExpr(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(916); + setState(912); type_(); - setState(917); + setState(913); match(DOT); - setState(918); + setState(914); match(IDENTIFIER); } break; @@ -4504,24 +4504,24 @@ public final ImplementationProofPredicateAliasContext implementationProofPredica try { enterOuterAlt(_localctx, 1); { - setState(922); + setState(918); match(PRED); - setState(923); + setState(919); match(IDENTIFIER); - setState(924); + setState(920); match(DECLARE_ASSIGN); - setState(927); + setState(923); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,61,_ctx) ) { case 1: { - setState(925); + setState(921); selection(); } break; case 2: { - setState(926); + setState(922); operandName(); } break; @@ -4569,25 +4569,25 @@ public final MakeContext make() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(929); + setState(925); match(MAKE); - setState(930); + setState(926); match(L_PAREN); - setState(931); + setState(927); type_(); - setState(934); + setState(930); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(932); + setState(928); match(COMMA); - setState(933); + setState(929); expressionList(); } } - setState(936); + setState(932); match(R_PAREN); } } @@ -4627,13 +4627,13 @@ public final New_Context new_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(938); + setState(934); match(NEW); - setState(939); + setState(935); match(L_PAREN); - setState(940); + setState(936); type_(); - setState(941); + setState(937); match(R_PAREN); } } @@ -4677,20 +4677,20 @@ public final SpecMemberContext specMember() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(943); + setState(939); ((SpecMemberContext)_localctx).specification = specification(); - setState(946); + setState(942); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(944); + setState(940); functionDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; case 2: { - setState(945); + setState(941); methodDecl(((SpecMemberContext)_localctx).specification.trusted, ((SpecMemberContext)_localctx).specification.pure); } break; @@ -4744,29 +4744,29 @@ public final FunctionDeclContext functionDecl(boolean trusted,boolean pure) thro try { enterOuterAlt(_localctx, 1); { - setState(948); + setState(944); match(FUNC); - setState(949); + setState(945); match(IDENTIFIER); - setState(951); + setState(947); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(950); + setState(946); typeParameters(); } } { - setState(953); + setState(949); signature(); - setState(955); + setState(951); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(954); + setState(950); blockWithBodyParameterInfo(); } break; @@ -4820,21 +4820,21 @@ public final MethodDeclContext methodDecl(boolean trusted,boolean pure) throws R try { enterOuterAlt(_localctx, 1); { - setState(957); + setState(953); match(FUNC); - setState(958); + setState(954); receiver(); - setState(959); + setState(955); match(IDENTIFIER); { - setState(960); + setState(956); signature(); - setState(962); + setState(958); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { case 1: { - setState(961); + setState(957); blockWithBodyParameterInfo(); } break; @@ -4879,9 +4879,9 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(964); + setState(960); match(GHOST); - setState(967); + setState(963); _errHandler.sync(this); switch (_input.LA(1)) { case PRE: @@ -4892,7 +4892,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TRUSTED: case FUNC: { - setState(965); + setState(961); specMember(); } break; @@ -4900,7 +4900,7 @@ public final ExplicitGhostMemberContext explicitGhostMember() throws Recognition case TYPE: case VAR: { - setState(966); + setState(962); declaration(); } break; @@ -4947,18 +4947,18 @@ public final FpredicateDeclContext fpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(969); + setState(965); match(PRED); - setState(970); + setState(966); match(IDENTIFIER); - setState(971); + setState(967); parameters(); - setState(973); + setState(969); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(972); + setState(968); predicateBody(); } break; @@ -5003,13 +5003,13 @@ public final PredicateBodyContext predicateBody() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(975); + setState(971); match(L_CURLY); - setState(976); + setState(972); expression(0); - setState(977); + setState(973); eos(); - setState(978); + setState(974); match(R_CURLY); } } @@ -5054,20 +5054,20 @@ public final MpredicateDeclContext mpredicateDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(980); + setState(976); match(PRED); - setState(981); + setState(977); receiver(); - setState(982); + setState(978); match(IDENTIFIER); - setState(983); + setState(979); parameters(); - setState(985); + setState(981); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) { case 1: { - setState(984); + setState(980); predicateBody(); } break; @@ -5114,9 +5114,9 @@ public final VarSpecContext varSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(987); + setState(983); maybeAddressableIdentifierList(); - setState(995); + setState(991); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -5139,16 +5139,16 @@ public final VarSpecContext varSpec() throws RecognitionException { case STAR: case RECEIVE: { - setState(988); + setState(984); type_(); - setState(991); + setState(987); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,70,_ctx) ) { case 1: { - setState(989); + setState(985); match(ASSIGN); - setState(990); + setState(986); expressionList(); } break; @@ -5157,9 +5157,9 @@ public final VarSpecContext varSpec() throws RecognitionException { break; case ASSIGN: { - setState(993); + setState(989); match(ASSIGN); - setState(994); + setState(990); expressionList(); } break; @@ -5205,11 +5205,11 @@ public final ShortVarDeclContext shortVarDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(997); + setState(993); maybeAddressableIdentifierList(); - setState(998); + setState(994); match(DECLARE_ASSIGN); - setState(999); + setState(995); expressionList(); } } @@ -5253,31 +5253,31 @@ public final ReceiverContext receiver() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1001); + setState(997); match(L_PAREN); - setState(1003); + setState(999); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(1002); + setState(998); maybeAddressableIdentifier(); } break; } - setState(1005); + setState(1001); type_(); - setState(1007); + setState(1003); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1006); + setState(1002); match(COMMA); } } - setState(1009); + setState(1005); match(R_PAREN); } } @@ -5315,20 +5315,20 @@ public final ParameterDeclContext parameterDecl() throws RecognitionException { ParameterDeclContext _localctx = new ParameterDeclContext(_ctx, getState()); enterRule(_localctx, 154, RULE_parameterDecl); try { - setState(1013); + setState(1009); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1011); + setState(1007); actualParameterDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1012); + setState(1008); ghostParameterDecl(); } break; @@ -5370,17 +5370,17 @@ public final ActualParameterDeclContext actualParameterDecl() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(1016); + setState(1012); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(1015); + setState(1011); identifierList(); } break; } - setState(1018); + setState(1014); parameterType(); } } @@ -5421,19 +5421,19 @@ public final GhostParameterDeclContext ghostParameterDecl() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(1020); + setState(1016); match(GHOST); - setState(1022); + setState(1018); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: { - setState(1021); + setState(1017); identifierList(); } break; } - setState(1024); + setState(1020); parameterType(); } } @@ -5472,17 +5472,17 @@ public final ParameterTypeContext parameterType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1027); + setState(1023); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1026); + setState(1022); match(ELLIPSIS); } } - setState(1029); + setState(1025); type_(); } } @@ -5804,7 +5804,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1052); + setState(1048); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: @@ -5813,7 +5813,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1032); + setState(1028); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 127L) != 0)) ) { @@ -5824,7 +5824,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1033); + setState(1029); expression(15); } break; @@ -5833,7 +5833,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new PrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1034); + setState(1030); primaryExpr(0); } break; @@ -5842,13 +5842,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new UnfoldingContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1035); + setState(1031); match(UNFOLDING); - setState(1036); + setState(1032); predicateAccess(); - setState(1037); + setState(1033); match(IN); - setState(1038); + setState(1034); expression(3); } break; @@ -5857,13 +5857,13 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new LetContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1040); + setState(1036); match(LET); - setState(1041); + setState(1037); shortVarDecl(); - setState(1042); + setState(1038); match(IN); - setState(1043); + setState(1039); expression(2); } break; @@ -5872,7 +5872,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _localctx = new QuantificationContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1045); + setState(1041); _la = _input.LA(1); if ( !(_la==FORALL || _la==EXISTS) ) { _errHandler.recoverInline(this); @@ -5882,21 +5882,21 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1046); + setState(1042); boundVariables(); - setState(1047); + setState(1043); match(COLON); - setState(1048); + setState(1044); match(COLON); - setState(1049); + setState(1045); triggers(); - setState(1050); + setState(1046); expression(1); } break; } _ctx.stop = _input.LT(-1); - setState(1089); + setState(1085); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,80,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -5904,16 +5904,16 @@ private ExpressionContext expression(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1087); + setState(1083); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: { _localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1054); + setState(1050); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(1055); + setState(1051); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 126)) & ~0x3f) == 0 && ((1L << (_la - 126)) & 1567L) != 0)) ) { @@ -5924,7 +5924,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1056); + setState(1052); expression(14); } break; @@ -5932,9 +5932,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AddExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1057); + setState(1053); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(1058); + setState(1054); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); if ( !(_la==WAND || ((((_la - 113)) & ~0x3f) == 0 && ((1L << (_la - 113)) & 3674113L) != 0)) ) { @@ -5945,7 +5945,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1059); + setState(1055); expression(13); } break; @@ -5953,9 +5953,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P42ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1060); + setState(1056); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(1061); + setState(1057); ((P42ExprContext)_localctx).p42_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 15032385536L) != 0)) ) { @@ -5966,7 +5966,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1062); + setState(1058); expression(12); } break; @@ -5974,9 +5974,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new P41ExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1063); + setState(1059); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(1064); + setState(1060); ((P41ExprContext)_localctx).p41_op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1879048192L) != 0)) ) { @@ -5987,7 +5987,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1065); + setState(1061); expression(11); } break; @@ -5995,9 +5995,9 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new RelExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1066); + setState(1062); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1067); + setState(1063); ((RelExprContext)_localctx).rel_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & 8866461766385667L) != 0)) ) { @@ -6008,7 +6008,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1068); + setState(1064); expression(10); } break; @@ -6016,11 +6016,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1069); + setState(1065); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1070); + setState(1066); match(LOGICAL_AND); - setState(1071); + setState(1067); expression(8); } break; @@ -6028,11 +6028,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1072); + setState(1068); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1073); + setState(1069); match(LOGICAL_OR); - setState(1074); + setState(1070); expression(7); } break; @@ -6040,11 +6040,11 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ImplicationContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1075); + setState(1071); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1076); + setState(1072); match(IMPLIES); - setState(1077); + setState(1073); expression(5); } break; @@ -6052,15 +6052,15 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1078); + setState(1074); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1079); + setState(1075); match(QMARK); - setState(1080); + setState(1076); expression(0); - setState(1081); + setState(1077); match(COLON); - setState(1082); + setState(1078); expression(4); } break; @@ -6068,18 +6068,18 @@ private ExpressionContext expression(int _p) throws RecognitionException { { _localctx = new ClosureImplSpecExprContext(new ExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(1084); + setState(1080); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1085); + setState(1081); match(IMPL); - setState(1086); + setState(1082); closureSpecInstance(); } break; } } } - setState(1091); + setState(1087); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,80,_ctx); } @@ -6173,146 +6173,146 @@ public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 164, RULE_statement); try { - setState(1112); + setState(1108); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1092); + setState(1088); ghostStatement(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1093); + setState(1089); auxiliaryStatement(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1094); + setState(1090); packageStmt(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1095); + setState(1091); applyStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1096); + setState(1092); declaration(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1097); + setState(1093); labeledStmt(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1098); + setState(1094); simpleStmt(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1099); + setState(1095); goStmt(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1100); + setState(1096); returnStmt(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(1101); + setState(1097); breakStmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(1102); + setState(1098); continueStmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(1103); + setState(1099); gotoStmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(1104); + setState(1100); fallthroughStmt(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(1105); + setState(1101); block(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(1106); + setState(1102); ifStmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(1107); + setState(1103); switchStmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(1108); + setState(1104); selectStmt(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(1109); + setState(1105); specForStmt(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(1110); + setState(1106); deferStmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(1111); + setState(1107); closureImplProofStmt(); } break; @@ -6352,9 +6352,9 @@ public final ApplyStmtContext applyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1114); + setState(1110); match(APPLY); - setState(1115); + setState(1111); expression(0); } } @@ -6396,16 +6396,16 @@ public final PackageStmtContext packageStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1117); + setState(1113); match(PACKAGE); - setState(1118); + setState(1114); expression(0); - setState(1120); + setState(1116); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_CURLY) { { - setState(1119); + setState(1115); block(); } } @@ -6448,9 +6448,9 @@ public final SpecForStmtContext specForStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1122); + setState(1118); loopSpec(); - setState(1123); + setState(1119); forStmt(); } } @@ -6505,34 +6505,34 @@ public final LoopSpecContext loopSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1131); + setState(1127); _errHandler.sync(this); _la = _input.LA(1); while (_la==INV) { { { - setState(1125); + setState(1121); match(INV); - setState(1126); + setState(1122); expression(0); - setState(1127); + setState(1123); eos(); } } - setState(1133); + setState(1129); _errHandler.sync(this); _la = _input.LA(1); } - setState(1138); + setState(1134); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEC) { { - setState(1134); + setState(1130); match(DEC); - setState(1135); + setState(1131); terminationMeasure(); - setState(1136); + setState(1132); eos(); } } @@ -6578,24 +6578,24 @@ public final DeferStmtContext deferStmt() throws RecognitionException { enterRule(_localctx, 174, RULE_deferStmt); int _la; try { - setState(1145); + setState(1141); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,85,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1140); + setState(1136); match(DEFER); - setState(1141); + setState(1137); expression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1142); + setState(1138); match(DEFER); - setState(1143); + setState(1139); ((DeferStmtContext)_localctx).fold_stmt = _input.LT(1); _la = _input.LA(1); if ( !(_la==FOLD || _la==UNFOLD) ) { @@ -6606,7 +6606,7 @@ public final DeferStmtContext deferStmt() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1144); + setState(1140); predicateAccess(); } break; @@ -6652,62 +6652,62 @@ public final BasicLitContext basicLit() throws RecognitionException { BasicLitContext _localctx = new BasicLitContext(_ctx, getState()); enterRule(_localctx, 176, RULE_basicLit); try { - setState(1155); + setState(1151); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1147); + setState(1143); match(TRUE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1148); + setState(1144); match(FALSE); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1149); + setState(1145); match(NIL_LIT); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1150); + setState(1146); integer(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1151); + setState(1147); string_(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1152); + setState(1148); match(FLOAT_LIT); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1153); + setState(1149); match(IMAGINARY_LIT); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1154); + setState(1150); match(RUNE_LIT); } break; @@ -6967,7 +6967,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1169); + setState(1165); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) { case 1: @@ -6976,7 +6976,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(1158); + setState(1154); operand(); } break; @@ -6985,7 +6985,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new ConversionPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1159); + setState(1155); conversion(); } break; @@ -6994,7 +6994,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MethodPrimaryExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1160); + setState(1156); methodExpr(); } break; @@ -7003,7 +7003,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new GhostPrimaryExpr_Context(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1161); + setState(1157); ghostPrimaryExpr(); } break; @@ -7012,7 +7012,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new NewExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1162); + setState(1158); new_(); } break; @@ -7021,7 +7021,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new MakeExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1163); + setState(1159); make(); } break; @@ -7030,7 +7030,7 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _localctx = new BuiltInCallExprContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(1164); + setState(1160); ((BuiltInCallExprContext)_localctx).call_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 45)) & ~0x3f) == 0 && ((1L << (_la - 45)) & 281474976710729L) != 0)) ) { @@ -7041,17 +7041,17 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1165); + setState(1161); match(L_PAREN); - setState(1166); + setState(1162); expression(0); - setState(1167); + setState(1163); match(R_PAREN); } break; } _ctx.stop = _input.LT(-1); - setState(1193); + setState(1189); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,89,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -7059,18 +7059,18 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(1191); + setState(1187); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) { case 1: { _localctx = new SelectorPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1171); + setState(1167); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1172); + setState(1168); match(DOT); - setState(1173); + setState(1169); match(IDENTIFIER); } break; @@ -7078,9 +7078,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new IndexPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1174); + setState(1170); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(1175); + setState(1171); index(); } break; @@ -7088,9 +7088,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SlicePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1176); + setState(1172); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(1177); + setState(1173); slice_(); } break; @@ -7098,9 +7098,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new SeqUpdPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1178); + setState(1174); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(1179); + setState(1175); seqUpdExp(); } break; @@ -7108,9 +7108,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new TypeAssertionPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1180); + setState(1176); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(1181); + setState(1177); typeAssertion(); } break; @@ -7118,9 +7118,9 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1182); + setState(1178); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(1183); + setState(1179); arguments(); } break; @@ -7128,13 +7128,13 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new InvokePrimaryExprWithSpecContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1184); + setState(1180); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1185); + setState(1181); arguments(); - setState(1186); + setState(1182); match(AS); - setState(1187); + setState(1183); closureSpecInstance(); } break; @@ -7142,16 +7142,16 @@ private PrimaryExprContext primaryExpr(int _p) throws RecognitionException { { _localctx = new PredConstrPrimaryExprContext(new PrimaryExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpr); - setState(1189); + setState(1185); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(1190); + setState(1186); predConstructArgs(); } break; } } } - setState(1195); + setState(1191); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,89,_ctx); } @@ -7194,9 +7194,9 @@ public final FunctionLitContext functionLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1196); + setState(1192); ((FunctionLitContext)_localctx).specification = specification(); - setState(1197); + setState(1193); closureDecl(((FunctionLitContext)_localctx).specification.trusted, ((FunctionLitContext)_localctx).specification.pure); } } @@ -7244,27 +7244,27 @@ public final ClosureDeclContext closureDecl(boolean trusted,boolean pure) throws try { enterOuterAlt(_localctx, 1); { - setState(1199); + setState(1195); match(FUNC); - setState(1201); + setState(1197); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1200); + setState(1196); match(IDENTIFIER); } } { - setState(1203); + setState(1199); signature(); - setState(1205); + setState(1201); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: { - setState(1204); + setState(1200); blockWithBodyParameterInfo(); } break; @@ -7309,29 +7309,29 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(1207); + setState(1203); match(L_PRED); - setState(1209); + setState(1205); _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(1208); + setState(1204); expressionList(); } } - setState(1212); + setState(1208); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1211); + setState(1207); match(COMMA); } } - setState(1214); + setState(1210); match(R_PRED); } } @@ -7381,27 +7381,27 @@ public final InterfaceTypeContext interfaceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1216); + setState(1212); match(INTERFACE); - setState(1217); + setState(1213); match(L_CURLY); - setState(1223); + setState(1219); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & 288393170444877879L) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & 1441151881345761731L) != 0)) { { { - setState(1218); + setState(1214); interfaceElem(); - setState(1219); + setState(1215); eos(); } } - setState(1225); + setState(1221); _errHandler.sync(this); _la = _input.LA(1); } - setState(1226); + setState(1222); match(R_CURLY); } } @@ -7442,27 +7442,27 @@ public final InterfaceElemContext interfaceElem() throws RecognitionException { InterfaceElemContext _localctx = new InterfaceElemContext(_ctx, getState()); enterRule(_localctx, 188, RULE_interfaceElem); try { - setState(1231); + setState(1227); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1228); + setState(1224); methodSpec(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1229); + setState(1225); typeElem(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1230); + setState(1226); predicateSpec(); } break; @@ -7503,11 +7503,11 @@ public final PredicateSpecContext predicateSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1233); + setState(1229); match(PRED); - setState(1234); + setState(1230); match(IDENTIFIER); - setState(1235); + setState(1231); parameters(); } } @@ -7551,50 +7551,50 @@ public final MethodSpecContext methodSpec() throws RecognitionException { enterRule(_localctx, 192, RULE_methodSpec); int _la; try { - setState(1252); + setState(1248); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1238); + setState(1234); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1237); + setState(1233); match(GHOST); } } - setState(1240); + setState(1236); specification(); - setState(1241); + setState(1237); match(IDENTIFIER); - setState(1242); + setState(1238); parameters(); - setState(1243); + setState(1239); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1246); + setState(1242); _errHandler.sync(this); _la = _input.LA(1); if (_la==GHOST) { { - setState(1245); + setState(1241); match(GHOST); } } - setState(1248); + setState(1244); specification(); - setState(1249); + setState(1245); match(IDENTIFIER); - setState(1250); + setState(1246); parameters(); } break; @@ -7616,8 +7616,8 @@ public static class Type_Context extends ParserRuleContext { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } - public TypeArgsContext typeArgs() { - return getRuleContext(TypeArgsContext.class,0); + public IndexContext index() { + return getRuleContext(IndexContext.class,0); } public TypeLitContext typeLit() { return getRuleContext(TypeLitContext.class,0); @@ -7645,21 +7645,21 @@ public final Type_Context type_() throws RecognitionException { Type_Context _localctx = new Type_Context(_ctx, getState()); enterRule(_localctx, 194, RULE_type_); try { - setState(1264); + setState(1260); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(1254); + setState(1250); typeName(); - setState(1256); + setState(1252); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { - setState(1255); - typeArgs(); + setState(1251); + index(); } break; } @@ -7676,7 +7676,7 @@ public final Type_Context type_() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 2); { - setState(1258); + setState(1254); typeLit(); } break; @@ -7690,18 +7690,18 @@ public final Type_Context type_() throws RecognitionException { case ADT: enterOuterAlt(_localctx, 3); { - setState(1259); + setState(1255); ghostTypeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 4); { - setState(1260); + setState(1256); match(L_PAREN); - setState(1261); + setState(1257); type_(); - setState(1262); + setState(1258); match(R_PAREN); } break; @@ -7764,69 +7764,69 @@ public final TypeLitContext typeLit() throws RecognitionException { TypeLitContext _localctx = new TypeLitContext(_ctx, getState()); enterRule(_localctx, 196, RULE_typeLit); try { - setState(1275); + setState(1271); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1266); + setState(1262); arrayType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1267); + setState(1263); structType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1268); + setState(1264); pointerType(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1269); + setState(1265); functionType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1270); + setState(1266); interfaceType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1271); + setState(1267); sliceType(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1272); + setState(1268); mapType(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(1273); + setState(1269); channelType(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(1274); + setState(1270); predType(); } break; @@ -7866,9 +7866,9 @@ public final PredTypeContext predType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1277); + setState(1273); match(PRED); - setState(1278); + setState(1274); predTypeParams(); } } @@ -7916,39 +7916,39 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1280); + setState(1276); match(L_PAREN); - setState(1292); + setState(1288); _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(1281); + setState(1277); type_(); - setState(1286); + setState(1282); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1282); + setState(1278); match(COMMA); - setState(1283); + setState(1279); type_(); } } } - setState(1288); + setState(1284); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); } - setState(1290); + setState(1286); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1289); + setState(1285); match(COMMA); } } @@ -7956,7 +7956,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException } } - setState(1294); + setState(1290); match(R_PAREN); } } @@ -7994,8 +7994,8 @@ public GhostTypeLitContext ghostTypeLit() { public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } - public TypeArgsContext typeArgs() { - return getRuleContext(TypeArgsContext.class,0); + public IndexContext index() { + return getRuleContext(IndexContext.class,0); } public LiteralTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -8013,63 +8013,63 @@ public final LiteralTypeContext literalType() throws RecognitionException { enterRule(_localctx, 202, RULE_literalType); int _la; try { - setState(1306); + setState(1302); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1296); + setState(1292); structType(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1297); + setState(1293); arrayType(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1298); + setState(1294); implicitArray(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1299); + setState(1295); sliceType(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1300); + setState(1296); mapType(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(1301); + setState(1297); ghostTypeLit(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(1302); + setState(1298); typeName(); - setState(1304); + setState(1300); _errHandler.sync(this); _la = _input.LA(1); if (_la==L_BRACKET) { { - setState(1303); - typeArgs(); + setState(1299); + index(); } } @@ -8113,13 +8113,13 @@ public final ImplicitArrayContext implicitArray() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1304); match(L_BRACKET); - setState(1309); + setState(1305); match(ELLIPSIS); - setState(1310); + setState(1306); match(R_BRACKET); - setState(1311); + setState(1307); elementType(); } } @@ -8169,31 +8169,31 @@ public final Slice_Context slice_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1313); + setState(1309); match(L_BRACKET); - setState(1329); + setState(1325); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,110,_ctx) ) { case 1: { - setState(1315); + setState(1311); _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(1314); + setState(1310); low(); } } - setState(1317); + setState(1313); match(COLON); - setState(1319); + setState(1315); _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(1318); + setState(1314); high(); } } @@ -8202,28 +8202,28 @@ public final Slice_Context slice_() throws RecognitionException { break; case 2: { - setState(1322); + setState(1318); _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(1321); + setState(1317); low(); } } - setState(1324); + setState(1320); match(COLON); - setState(1325); + setState(1321); high(); - setState(1326); + setState(1322); match(COLON); - setState(1327); + setState(1323); cap(); } break; } - setState(1331); + setState(1327); match(R_BRACKET); } } @@ -8260,7 +8260,7 @@ public final LowContext low() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1333); + setState(1329); expression(0); } } @@ -8297,7 +8297,7 @@ public final HighContext high() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1335); + setState(1331); expression(0); } } @@ -8334,7 +8334,7 @@ public final CapContext cap() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1337); + setState(1333); expression(0); } } @@ -8382,12 +8382,12 @@ public final Assign_opContext assign_op() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1340); + setState(1336); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) { { - setState(1339); + setState(1335); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & 4031L) != 0)) ) { @@ -8401,7 +8401,7 @@ public final Assign_opContext assign_op() throws RecognitionException { } } - setState(1342); + setState(1338); match(ASSIGN); } } @@ -8450,43 +8450,43 @@ public final RangeClauseContext rangeClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1350); + setState(1346); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { case 1: { - setState(1344); + setState(1340); expressionList(); - setState(1345); + setState(1341); match(ASSIGN); } break; case 2: { - setState(1347); + setState(1343); maybeAddressableIdentifierList(); - setState(1348); + setState(1344); match(DECLARE_ASSIGN); } break; } - setState(1352); + setState(1348); match(RANGE); - setState(1353); + setState(1349); expression(0); - setState(1358); + setState(1354); _errHandler.sync(this); _la = _input.LA(1); if (_la==WITH) { { - setState(1354); + setState(1350); match(WITH); - setState(1356); + setState(1352); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1355); + setState(1351); match(IDENTIFIER); } } @@ -8529,9 +8529,9 @@ public final PackageClauseContext packageClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1360); + setState(1356); match(PACKAGE); - setState(1361); + setState(1357); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -8568,7 +8568,7 @@ public final ImportPathContext importPath() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1363); + setState(1359); string_(); } } @@ -8609,27 +8609,27 @@ public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); enterRule(_localctx, 222, RULE_declaration); try { - setState(1368); + setState(1364); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1365); + setState(1361); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1366); + setState(1362); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1367); + setState(1363); varDecl(); } break; @@ -8683,38 +8683,38 @@ public final ConstDeclContext constDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1370); + setState(1366); match(CONST); - setState(1382); + setState(1378); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1371); + setState(1367); constSpec(); } break; case L_PAREN: { - setState(1372); + setState(1368); match(L_PAREN); - setState(1378); + setState(1374); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1373); + setState(1369); constSpec(); - setState(1374); + setState(1370); eos(); } } - setState(1380); + setState(1376); _errHandler.sync(this); _la = _input.LA(1); } - setState(1381); + setState(1377); match(R_PAREN); } break; @@ -8764,26 +8764,26 @@ public final ConstSpecContext constSpec() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1384); + setState(1380); identifierList(); - setState(1390); + setState(1386); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1386); + setState(1382); _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(1385); + setState(1381); type_(); } } - setState(1388); + setState(1384); match(ASSIGN); - setState(1389); + setState(1385); expressionList(); } break; @@ -8829,23 +8829,23 @@ public final IdentifierListContext identifierList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1392); + setState(1388); match(IDENTIFIER); - setState(1397); + setState(1393); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1393); + setState(1389); match(COMMA); - setState(1394); + setState(1390); match(IDENTIFIER); } } } - setState(1399); + setState(1395); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,120,_ctx); } @@ -8892,23 +8892,23 @@ public final ExpressionListContext expressionList() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(1400); + setState(1396); expression(0); - setState(1405); + setState(1401); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1401); + setState(1397); match(COMMA); - setState(1402); + setState(1398); expression(0); } } } - setState(1407); + setState(1403); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,121,_ctx); } @@ -8960,38 +8960,38 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1408); + setState(1404); match(TYPE); - setState(1420); + setState(1416); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1409); + setState(1405); typeSpec(); } break; case L_PAREN: { - setState(1410); + setState(1406); match(L_PAREN); - setState(1416); + setState(1412); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1411); + setState(1407); typeSpec(); - setState(1412); + setState(1408); eos(); } } - setState(1418); + setState(1414); _errHandler.sync(this); _la = _input.LA(1); } - setState(1419); + setState(1415); match(R_PAREN); } break; @@ -9034,20 +9034,20 @@ public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); enterRule(_localctx, 234, RULE_typeSpec); try { - setState(1424); + setState(1420); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1422); + setState(1418); aliasDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1423); + setState(1419); typeDef(); } break; @@ -9088,11 +9088,11 @@ public final AliasDeclContext aliasDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1426); + setState(1422); match(IDENTIFIER); - setState(1427); + setState(1423); match(ASSIGN); - setState(1428); + setState(1424); type_(); } } @@ -9133,19 +9133,19 @@ public final TypeDefContext typeDef() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1430); + setState(1426); match(IDENTIFIER); - setState(1432); + setState(1428); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: { - setState(1431); + setState(1427); typeParameters(); } break; } - setState(1434); + setState(1430); type_(); } } @@ -9195,38 +9195,38 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1436); + setState(1432); match(VAR); - setState(1448); + setState(1444); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1437); + setState(1433); varSpec(); } break; case L_PAREN: { - setState(1438); + setState(1434); match(L_PAREN); - setState(1444); + setState(1440); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1439); + setState(1435); varSpec(); - setState(1440); + setState(1436); eos(); } } - setState(1446); + setState(1442); _errHandler.sync(this); _la = _input.LA(1); } - setState(1447); + setState(1443); match(R_PAREN); } break; @@ -9271,19 +9271,19 @@ public final BlockContext block() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1450); + setState(1446); match(L_CURLY); - setState(1452); + setState(1448); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1451); + setState(1447); statementList(); } } - setState(1454); + setState(1450); match(R_CURLY); } } @@ -9328,19 +9328,19 @@ public final StatementListContext statementList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1459); + setState(1455); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(1456); + setState(1452); statement(); - setState(1457); + setState(1453); match(EOS); } } - setState(1461); + setState(1457); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0) ); @@ -9389,41 +9389,41 @@ public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); enterRule(_localctx, 246, RULE_simpleStmt); try { - setState(1468); + setState(1464); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1463); + setState(1459); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1464); + setState(1460); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1465); + setState(1461); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1466); + setState(1462); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1467); + setState(1463); shortVarDecl(); } break; @@ -9462,7 +9462,7 @@ public final ExpressionStmtContext expressionStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1470); + setState(1466); expression(0); } } @@ -9504,11 +9504,11 @@ public final SendStmtContext sendStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1472); + setState(1468); ((SendStmtContext)_localctx).channel = expression(0); - setState(1473); + setState(1469); match(RECEIVE); - setState(1474); + setState(1470); expression(0); } } @@ -9548,9 +9548,9 @@ public final IncDecStmtContext incDecStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1476); + setState(1472); expression(0); - setState(1477); + setState(1473); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -9601,11 +9601,11 @@ public final AssignmentContext assignment() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1479); + setState(1475); expressionList(); - setState(1480); + setState(1476); assign_op(); - setState(1481); + setState(1477); expressionList(); } } @@ -9642,7 +9642,7 @@ public final EmptyStmtContext emptyStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1483); + setState(1479); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -9690,16 +9690,16 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1481); match(IDENTIFIER); - setState(1486); + setState(1482); match(COLON); - setState(1488); + setState(1484); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1487); + setState(1483); statement(); } } @@ -9741,14 +9741,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1490); + setState(1486); match(RETURN); - setState(1492); + setState(1488); _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(1491); + setState(1487); expressionList(); } } @@ -9788,14 +9788,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1490); match(BREAK); - setState(1496); + setState(1492); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1495); + setState(1491); match(IDENTIFIER); } } @@ -9835,14 +9835,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1498); + setState(1494); match(CONTINUE); - setState(1500); + setState(1496); _errHandler.sync(this); _la = _input.LA(1); if (_la==IDENTIFIER) { { - setState(1499); + setState(1495); match(IDENTIFIER); } } @@ -9881,9 +9881,9 @@ public final GotoStmtContext gotoStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1502); + setState(1498); match(GOTO); - setState(1503); + setState(1499); match(IDENTIFIER); } } @@ -9918,7 +9918,7 @@ public final FallthroughStmtContext fallthroughStmt() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1505); + setState(1501); match(FALLTHROUGH); } } @@ -9973,57 +9973,57 @@ public final IfStmtContext ifStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1507); + setState(1503); match(IF); - setState(1516); + setState(1512); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1508); + setState(1504); expression(0); } break; case 2: { - setState(1509); + setState(1505); eos(); - setState(1510); + setState(1506); expression(0); } break; case 3: { - setState(1512); + setState(1508); simpleStmt(); - setState(1513); + setState(1509); eos(); - setState(1514); + setState(1510); expression(0); } break; } - setState(1518); + setState(1514); block(); - setState(1524); + setState(1520); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELSE) { { - setState(1519); + setState(1515); match(ELSE); - setState(1522); + setState(1518); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1520); + setState(1516); ifStmt(); } break; case L_CURLY: { - setState(1521); + setState(1517); block(); } break; @@ -10069,20 +10069,20 @@ public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); enterRule(_localctx, 272, RULE_switchStmt); try { - setState(1528); + setState(1524); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1526); + setState(1522); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1527); + setState(1523); typeSwitchStmt(); } break; @@ -10137,19 +10137,19 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1530); + setState(1526); match(SWITCH); - setState(1541); + setState(1537); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1532); + setState(1528); _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(1531); + setState(1527); expression(0); } } @@ -10158,24 +10158,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1535); + setState(1531); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { case 1: { - setState(1534); + setState(1530); simpleStmt(); } break; } - setState(1537); + setState(1533); eos(); - setState(1539); + setState(1535); _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(1538); + setState(1534); expression(0); } } @@ -10183,23 +10183,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1543); + setState(1539); match(L_CURLY); - setState(1547); + setState(1543); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1544); + setState(1540); exprCaseClause(); } } - setState(1549); + setState(1545); _errHandler.sync(this); _la = _input.LA(1); } - setState(1550); + setState(1546); match(R_CURLY); } } @@ -10241,16 +10241,16 @@ public final ExprCaseClauseContext exprCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1552); + setState(1548); exprSwitchCase(); - setState(1553); + setState(1549); match(COLON); - setState(1555); + setState(1551); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1554); + setState(1550); statementList(); } } @@ -10290,22 +10290,22 @@ public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 278, RULE_exprSwitchCase); try { - setState(1560); + setState(1556); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1557); + setState(1553); match(CASE); - setState(1558); + setState(1554); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1559); + setState(1555); match(DEFAULT); } break; @@ -10362,53 +10362,53 @@ public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1562); + setState(1558); match(SWITCH); - setState(1571); + setState(1567); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1563); + setState(1559); typeSwitchGuard(); } break; case 2: { - setState(1564); + setState(1560); eos(); - setState(1565); + setState(1561); typeSwitchGuard(); } break; case 3: { - setState(1567); + setState(1563); simpleStmt(); - setState(1568); + setState(1564); eos(); - setState(1569); + setState(1565); typeSwitchGuard(); } break; } - setState(1573); + setState(1569); match(L_CURLY); - setState(1577); + setState(1573); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1574); + setState(1570); typeCaseClause(); } } - setState(1579); + setState(1575); _errHandler.sync(this); _la = _input.LA(1); } - setState(1580); + setState(1576); match(R_CURLY); } } @@ -10451,27 +10451,27 @@ public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(1584); + setState(1580); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1582); + setState(1578); match(IDENTIFIER); - setState(1583); + setState(1579); match(DECLARE_ASSIGN); } break; } - setState(1586); + setState(1582); primaryExpr(0); - setState(1587); + setState(1583); match(DOT); - setState(1588); + setState(1584); match(L_PAREN); - setState(1589); + setState(1585); match(TYPE); - setState(1590); + setState(1586); match(R_PAREN); } } @@ -10513,16 +10513,16 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1592); + setState(1588); typeSwitchCase(); - setState(1593); + setState(1589); match(COLON); - setState(1595); + setState(1591); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1594); + setState(1590); statementList(); } } @@ -10543,8 +10543,8 @@ public final TypeCaseClauseContext typeCaseClause() throws RecognitionException @SuppressWarnings("CheckReturnValue") public static class TypeSwitchCaseContext extends ParserRuleContext { public TerminalNode CASE() { return getToken(GobraParser.CASE, 0); } - public TypeListSwitchContext typeListSwitch() { - return getRuleContext(TypeListSwitchContext.class,0); + public TypeListContext typeList() { + return getRuleContext(TypeListContext.class,0); } public TerminalNode DEFAULT() { return getToken(GobraParser.DEFAULT, 0); } public TypeSwitchCaseContext(ParserRuleContext parent, int invokingState) { @@ -10562,22 +10562,22 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); enterRule(_localctx, 286, RULE_typeSwitchCase); try { - setState(1600); + setState(1596); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1597); + setState(1593); match(CASE); - setState(1598); - typeListSwitch(); + setState(1594); + typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1599); + setState(1595); match(DEFAULT); } break; @@ -10597,7 +10597,7 @@ public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException } @SuppressWarnings("CheckReturnValue") - public static class TypeListSwitchContext extends ParserRuleContext { + public static class TypeListContext extends ParserRuleContext { public List type_() { return getRuleContexts(Type_Context.class); } @@ -10612,25 +10612,25 @@ public TerminalNode NIL_LIT(int i) { public TerminalNode COMMA(int i) { return getToken(GobraParser.COMMA, i); } - public TypeListSwitchContext(ParserRuleContext parent, int invokingState) { + public TypeListContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_typeListSwitch; } + @Override public int getRuleIndex() { return RULE_typeList; } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeListSwitch(this); + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeList(this); else return visitor.visitChildren(this); } } - public final TypeListSwitchContext typeListSwitch() throws RecognitionException { - TypeListSwitchContext _localctx = new TypeListSwitchContext(_ctx, getState()); - enterRule(_localctx, 288, RULE_typeListSwitch); + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 288, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1604); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10653,28 +10653,28 @@ public final TypeListSwitchContext typeListSwitch() throws RecognitionException case STAR: case RECEIVE: { - setState(1602); + setState(1598); type_(); } break; case NIL_LIT: { - setState(1603); + setState(1599); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1613); + setState(1609); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1606); + setState(1602); match(COMMA); - setState(1609); + setState(1605); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -10697,13 +10697,13 @@ public final TypeListSwitchContext typeListSwitch() throws RecognitionException case STAR: case RECEIVE: { - setState(1607); + setState(1603); type_(); } break; case NIL_LIT: { - setState(1608); + setState(1604); match(NIL_LIT); } break; @@ -10712,7 +10712,7 @@ public final TypeListSwitchContext typeListSwitch() throws RecognitionException } } } - setState(1615); + setState(1611); _errHandler.sync(this); _la = _input.LA(1); } @@ -10758,25 +10758,25 @@ public final SelectStmtContext selectStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1616); + setState(1612); match(SELECT); - setState(1617); + setState(1613); match(L_CURLY); - setState(1621); + setState(1617); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1618); + setState(1614); commClause(); } } - setState(1623); + setState(1619); _errHandler.sync(this); _la = _input.LA(1); } - setState(1624); + setState(1620); match(R_CURLY); } } @@ -10818,16 +10818,16 @@ public final CommClauseContext commClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1626); + setState(1622); commCase(); - setState(1627); + setState(1623); match(COLON); - setState(1629); + setState(1625); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { { - setState(1628); + setState(1624); statementList(); } } @@ -10870,26 +10870,26 @@ public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); enterRule(_localctx, 294, RULE_commCase); try { - setState(1637); + setState(1633); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1631); + setState(1627); match(CASE); - setState(1634); + setState(1630); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,156,_ctx) ) { case 1: { - setState(1632); + setState(1628); sendStmt(); } break; case 2: { - setState(1633); + setState(1629); recvStmt(); } break; @@ -10899,7 +10899,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1636); + setState(1632); match(DEFAULT); } break; @@ -10949,27 +10949,27 @@ public final RecvStmtContext recvStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1641); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { case 1: { - setState(1639); + setState(1635); expressionList(); - setState(1640); + setState(1636); match(ASSIGN); } break; case 2: { - setState(1642); + setState(1638); identifierList(); - setState(1643); + setState(1639); match(DECLARE_ASSIGN); } break; } - setState(1647); + setState(1643); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -11016,31 +11016,31 @@ public final ForStmtContext forStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1649); + setState(1645); match(FOR); - setState(1653); + setState(1649); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: { - setState(1650); + setState(1646); expression(0); } break; case 2: { - setState(1651); + setState(1647); forClause(); } break; case 3: { - setState(1652); + setState(1648); rangeClause(); } break; } - setState(1655); + setState(1651); block(); } } @@ -11092,36 +11092,36 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1658); + setState(1654); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,160,_ctx) ) { case 1: { - setState(1657); + setState(1653); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1660); + setState(1656); eos(); - setState(1662); + setState(1658); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,161,_ctx) ) { case 1: { - setState(1661); + setState(1657); expression(0); } break; } - setState(1664); + setState(1660); eos(); - setState(1666); + setState(1662); _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(1665); + setState(1661); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -11162,9 +11162,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1668); + setState(1664); match(GO); - setState(1669); + setState(1665); expression(0); } } @@ -11200,20 +11200,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 304, RULE_typeName); try { - setState(1673); + setState(1669); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,163,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1671); + setState(1667); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1672); + setState(1668); match(IDENTIFIER); } break; @@ -11230,124 +11230,6 @@ public final TypeNameContext typeName() throws RecognitionException { return _localctx; } - @SuppressWarnings("CheckReturnValue") - public static class TypeArgsContext extends ParserRuleContext { - public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } - public TypeListContext typeList() { - return getRuleContext(TypeListContext.class,0); - } - public TerminalNode R_BRACKET() { return getToken(GobraParser.R_BRACKET, 0); } - public TerminalNode COMMA() { return getToken(GobraParser.COMMA, 0); } - public TypeArgsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_typeArgs; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeArgs(this); - else return visitor.visitChildren(this); - } - } - - public final TypeArgsContext typeArgs() throws RecognitionException { - TypeArgsContext _localctx = new TypeArgsContext(_ctx, getState()); - enterRule(_localctx, 306, RULE_typeArgs); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(1675); - match(L_BRACKET); - setState(1676); - typeList(); - setState(1678); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(1677); - match(COMMA); - } - } - - setState(1680); - 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 TypeListContext extends ParserRuleContext { - public List type_() { - return getRuleContexts(Type_Context.class); - } - public Type_Context type_(int i) { - return getRuleContext(Type_Context.class,i); - } - public List COMMA() { return getTokens(GobraParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(GobraParser.COMMA, i); - } - public TypeListContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_typeList; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitTypeList(this); - else return visitor.visitChildren(this); - } - } - - public final TypeListContext typeList() throws RecognitionException { - TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 308, RULE_typeList); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(1682); - type_(); - setState(1687); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,165,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(1683); - match(COMMA); - setState(1684); - type_(); - } - } - } - setState(1689); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,165,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - @SuppressWarnings("CheckReturnValue") public static class ArrayTypeContext extends ParserRuleContext { public TerminalNode L_BRACKET() { return getToken(GobraParser.L_BRACKET, 0); } @@ -11371,17 +11253,17 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayTypeContext arrayType() throws RecognitionException { ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 310, RULE_arrayType); + enterRule(_localctx, 306, RULE_arrayType); try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1671); match(L_BRACKET); - setState(1691); + setState(1672); arrayLength(); - setState(1692); + setState(1673); match(R_BRACKET); - setState(1693); + setState(1674); elementType(); } } @@ -11414,11 +11296,11 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLengthContext arrayLength() throws RecognitionException { ArrayLengthContext _localctx = new ArrayLengthContext(_ctx, getState()); - enterRule(_localctx, 312, RULE_arrayLength); + enterRule(_localctx, 308, RULE_arrayLength); try { enterOuterAlt(_localctx, 1); { - setState(1695); + setState(1676); expression(0); } } @@ -11451,11 +11333,11 @@ public T accept(ParseTreeVisitor visitor) { public final ElementTypeContext elementType() throws RecognitionException { ElementTypeContext _localctx = new ElementTypeContext(_ctx, getState()); - enterRule(_localctx, 314, RULE_elementType); + enterRule(_localctx, 310, RULE_elementType); try { enterOuterAlt(_localctx, 1); { - setState(1697); + setState(1678); type_(); } } @@ -11489,13 +11371,13 @@ public T accept(ParseTreeVisitor visitor) { public final PointerTypeContext pointerType() throws RecognitionException { PointerTypeContext _localctx = new PointerTypeContext(_ctx, getState()); - enterRule(_localctx, 316, RULE_pointerType); + enterRule(_localctx, 312, RULE_pointerType); try { enterOuterAlt(_localctx, 1); { - setState(1699); + setState(1680); match(STAR); - setState(1700); + setState(1681); type_(); } } @@ -11535,30 +11417,30 @@ public T accept(ParseTreeVisitor visitor) { public final TypeElemContext typeElem() throws RecognitionException { TypeElemContext _localctx = new TypeElemContext(_ctx, getState()); - enterRule(_localctx, 318, RULE_typeElem); + enterRule(_localctx, 314, RULE_typeElem); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1702); + setState(1683); typeTerm(); - setState(1707); + setState(1688); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + _alt = getInterpreter().adaptivePredict(_input,164,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1703); + setState(1684); match(OR); - setState(1704); + setState(1685); typeTerm(); } } } - setState(1709); + setState(1690); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,166,_ctx); + _alt = getInterpreter().adaptivePredict(_input,164,_ctx); } } } @@ -11591,11 +11473,11 @@ public T accept(ParseTreeVisitor visitor) { public final TypeTermContext typeTerm() throws RecognitionException { TypeTermContext _localctx = new TypeTermContext(_ctx, getState()); - enterRule(_localctx, 320, RULE_typeTerm); + enterRule(_localctx, 316, RULE_typeTerm); try { enterOuterAlt(_localctx, 1); { - setState(1710); + setState(1691); type_(); } } @@ -11630,15 +11512,15 @@ public T accept(ParseTreeVisitor visitor) { public final SliceTypeContext sliceType() throws RecognitionException { SliceTypeContext _localctx = new SliceTypeContext(_ctx, getState()); - enterRule(_localctx, 322, RULE_sliceType); + enterRule(_localctx, 318, RULE_sliceType); try { enterOuterAlt(_localctx, 1); { - setState(1712); + setState(1693); match(L_BRACKET); - setState(1713); + setState(1694); match(R_BRACKET); - setState(1714); + setState(1695); elementType(); } } @@ -11677,19 +11559,19 @@ public T accept(ParseTreeVisitor visitor) { public final MapTypeContext mapType() throws RecognitionException { MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 324, RULE_mapType); + enterRule(_localctx, 320, RULE_mapType); try { enterOuterAlt(_localctx, 1); { - setState(1716); + setState(1697); match(MAP); - setState(1717); + setState(1698); match(L_BRACKET); - setState(1718); + setState(1699); type_(); - setState(1719); + setState(1700); match(R_BRACKET); - setState(1720); + setState(1701); elementType(); } } @@ -11724,37 +11606,37 @@ public T accept(ParseTreeVisitor visitor) { public final ChannelTypeContext channelType() throws RecognitionException { ChannelTypeContext _localctx = new ChannelTypeContext(_ctx, getState()); - enterRule(_localctx, 326, RULE_channelType); + enterRule(_localctx, 322, RULE_channelType); try { enterOuterAlt(_localctx, 1); { - setState(1727); + setState(1708); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,165,_ctx) ) { case 1: { - setState(1722); + setState(1703); match(CHAN); } break; case 2: { - setState(1723); + setState(1704); match(CHAN); - setState(1724); + setState(1705); match(RECEIVE); } break; case 3: { - setState(1725); + setState(1706); match(RECEIVE); - setState(1726); + setState(1707); match(CHAN); } break; } - setState(1729); + setState(1710); elementType(); } } @@ -11788,13 +11670,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTypeContext functionType() throws RecognitionException { FunctionTypeContext _localctx = new FunctionTypeContext(_ctx, getState()); - enterRule(_localctx, 328, RULE_functionType); + enterRule(_localctx, 324, RULE_functionType); try { enterOuterAlt(_localctx, 1); { - setState(1731); + setState(1712); match(FUNC); - setState(1732); + setState(1713); signature(); } } @@ -11830,24 +11712,24 @@ public T accept(ParseTreeVisitor visitor) { public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); - enterRule(_localctx, 330, RULE_signature); + enterRule(_localctx, 326, RULE_signature); try { - setState(1738); + setState(1719); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1734); + setState(1715); parameters(); - setState(1735); + setState(1716); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1737); + setState(1718); parameters(); } break; @@ -11885,22 +11767,22 @@ public T accept(ParseTreeVisitor visitor) { public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); - enterRule(_localctx, 332, RULE_result); + enterRule(_localctx, 328, RULE_result); try { - setState(1742); + setState(1723); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1740); + setState(1721); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1741); + setState(1722); type_(); } break; @@ -11944,45 +11826,45 @@ public T accept(ParseTreeVisitor visitor) { public final ParametersContext parameters() throws RecognitionException { ParametersContext _localctx = new ParametersContext(_ctx, getState()); - enterRule(_localctx, 334, RULE_parameters); + enterRule(_localctx, 330, RULE_parameters); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1744); + setState(1725); match(L_PAREN); - setState(1756); + setState(1737); _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(1745); + setState(1726); parameterDecl(); - setState(1750); + setState(1731); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,168,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1746); + setState(1727); match(COMMA); - setState(1747); + setState(1728); parameterDecl(); } } } - setState(1752); + setState(1733); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,170,_ctx); + _alt = getInterpreter().adaptivePredict(_input,168,_ctx); } - setState(1754); + setState(1735); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1753); + setState(1734); match(COMMA); } } @@ -11990,7 +11872,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1758); + setState(1739); match(R_PAREN); } } @@ -12026,26 +11908,26 @@ public T accept(ParseTreeVisitor visitor) { public final TypeParametersContext typeParameters() throws RecognitionException { TypeParametersContext _localctx = new TypeParametersContext(_ctx, getState()); - enterRule(_localctx, 336, RULE_typeParameters); + enterRule(_localctx, 332, RULE_typeParameters); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1760); + setState(1741); match(L_BRACKET); - setState(1761); + setState(1742); typeParamList(); - setState(1763); + setState(1744); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1762); + setState(1743); match(COMMA); } } - setState(1765); + setState(1746); match(R_BRACKET); } } @@ -12085,30 +11967,30 @@ public T accept(ParseTreeVisitor visitor) { public final TypeParamListContext typeParamList() throws RecognitionException { TypeParamListContext _localctx = new TypeParamListContext(_ctx, getState()); - enterRule(_localctx, 338, RULE_typeParamList); + enterRule(_localctx, 334, RULE_typeParamList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1767); + setState(1748); typeParamDecl(); - setState(1772); + setState(1753); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,174,_ctx); + _alt = getInterpreter().adaptivePredict(_input,172,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1768); + setState(1749); match(COMMA); - setState(1769); + setState(1750); typeParamDecl(); } } } - setState(1774); + setState(1755); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,174,_ctx); + _alt = getInterpreter().adaptivePredict(_input,172,_ctx); } } } @@ -12144,13 +12026,13 @@ public T accept(ParseTreeVisitor visitor) { public final TypeParamDeclContext typeParamDecl() throws RecognitionException { TypeParamDeclContext _localctx = new TypeParamDeclContext(_ctx, getState()); - enterRule(_localctx, 340, RULE_typeParamDecl); + enterRule(_localctx, 336, RULE_typeParamDecl); try { enterOuterAlt(_localctx, 1); { - setState(1775); + setState(1756); identifierList(); - setState(1776); + setState(1757); typeConstraint(); } } @@ -12183,11 +12065,11 @@ public T accept(ParseTreeVisitor visitor) { public final TypeConstraintContext typeConstraint() throws RecognitionException { TypeConstraintContext _localctx = new TypeConstraintContext(_ctx, getState()); - enterRule(_localctx, 342, RULE_typeConstraint); + enterRule(_localctx, 338, RULE_typeConstraint); try { enterOuterAlt(_localctx, 1); { - setState(1778); + setState(1759); typeElem(); } } @@ -12226,28 +12108,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConversionContext conversion() throws RecognitionException { ConversionContext _localctx = new ConversionContext(_ctx, getState()); - enterRule(_localctx, 344, RULE_conversion); + enterRule(_localctx, 340, RULE_conversion); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1780); + setState(1761); nonNamedType(); - setState(1781); + setState(1762); match(L_PAREN); - setState(1782); + setState(1763); expression(0); - setState(1784); + setState(1765); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1783); + setState(1764); match(COMMA); } } - setState(1786); + setState(1767); match(R_PAREN); } } @@ -12285,9 +12167,9 @@ public T accept(ParseTreeVisitor visitor) { public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); - enterRule(_localctx, 346, RULE_nonNamedType); + enterRule(_localctx, 342, RULE_nonNamedType); try { - setState(1793); + setState(1774); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -12301,18 +12183,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1788); + setState(1769); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1789); + setState(1770); match(L_PAREN); - setState(1790); + setState(1771); nonNamedType(); - setState(1791); + setState(1772); match(R_PAREN); } break; @@ -12339,9 +12221,6 @@ public LiteralContext literal() { public OperandNameContext operandName() { return getRuleContext(OperandNameContext.class,0); } - public TypeArgsContext typeArgs() { - return getRuleContext(TypeArgsContext.class,0); - } public TerminalNode L_PAREN() { return getToken(GobraParser.L_PAREN, 0); } public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); @@ -12360,43 +12239,33 @@ public T accept(ParseTreeVisitor visitor) { public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); - enterRule(_localctx, 348, RULE_operand); + enterRule(_localctx, 344, RULE_operand); try { - setState(1804); + setState(1782); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,175,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1795); + setState(1776); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1796); + setState(1777); operandName(); - setState(1798); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,177,_ctx) ) { - case 1: - { - setState(1797); - typeArgs(); - } - break; - } } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1800); + setState(1778); match(L_PAREN); - setState(1801); + setState(1779); expression(0); - setState(1802); + setState(1780); match(R_PAREN); } break; @@ -12437,9 +12306,9 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 350, RULE_literal); + enterRule(_localctx, 346, RULE_literal); try { - setState(1809); + setState(1787); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12456,7 +12325,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1806); + setState(1784); basicLit(); } break; @@ -12474,7 +12343,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1807); + setState(1785); compositeLit(); } break; @@ -12487,7 +12356,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1808); + setState(1786); functionLit(); } break; @@ -12527,12 +12396,12 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerContext integer() throws RecognitionException { IntegerContext _localctx = new IntegerContext(_ctx, getState()); - enterRule(_localctx, 352, RULE_integer); + enterRule(_localctx, 348, RULE_integer); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1811); + setState(1789); _la = _input.LA(1); if ( !(((((_la - 138)) & ~0x3f) == 0 && ((1L << (_la - 138)) & 111L) != 0)) ) { _errHandler.recoverInline(this); @@ -12571,11 +12440,11 @@ public T accept(ParseTreeVisitor visitor) { public final OperandNameContext operandName() throws RecognitionException { OperandNameContext _localctx = new OperandNameContext(_ctx, getState()); - enterRule(_localctx, 354, RULE_operandName); + enterRule(_localctx, 350, RULE_operandName); try { enterOuterAlt(_localctx, 1); { - setState(1813); + setState(1791); match(IDENTIFIER); } } @@ -12610,15 +12479,15 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedIdentContext qualifiedIdent() throws RecognitionException { QualifiedIdentContext _localctx = new QualifiedIdentContext(_ctx, getState()); - enterRule(_localctx, 356, RULE_qualifiedIdent); + enterRule(_localctx, 352, RULE_qualifiedIdent); try { enterOuterAlt(_localctx, 1); { - setState(1815); + setState(1793); match(IDENTIFIER); - setState(1816); + setState(1794); match(DOT); - setState(1817); + setState(1795); match(IDENTIFIER); } } @@ -12654,13 +12523,13 @@ public T accept(ParseTreeVisitor visitor) { public final CompositeLitContext compositeLit() throws RecognitionException { CompositeLitContext _localctx = new CompositeLitContext(_ctx, getState()); - enterRule(_localctx, 358, RULE_compositeLit); + enterRule(_localctx, 354, RULE_compositeLit); try { enterOuterAlt(_localctx, 1); { - setState(1819); + setState(1797); literalType(); - setState(1820); + setState(1798); literalValue(); } } @@ -12696,26 +12565,26 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralValueContext literalValue() throws RecognitionException { LiteralValueContext _localctx = new LiteralValueContext(_ctx, getState()); - enterRule(_localctx, 360, RULE_literalValue); + enterRule(_localctx, 356, RULE_literalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1822); + setState(1800); match(L_CURLY); - setState(1827); + setState(1805); _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(1823); + setState(1801); elementList(); - setState(1825); + setState(1803); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1824); + setState(1802); match(COMMA); } } @@ -12723,7 +12592,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1829); + setState(1807); match(R_CURLY); } } @@ -12763,30 +12632,30 @@ public T accept(ParseTreeVisitor visitor) { public final ElementListContext elementList() throws RecognitionException { ElementListContext _localctx = new ElementListContext(_ctx, getState()); - enterRule(_localctx, 362, RULE_elementList); + enterRule(_localctx, 358, RULE_elementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1831); + setState(1809); keyedElement(); - setState(1836); + setState(1814); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,182,_ctx); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1832); + setState(1810); match(COMMA); - setState(1833); + setState(1811); keyedElement(); } } } - setState(1838); + setState(1816); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,182,_ctx); + _alt = getInterpreter().adaptivePredict(_input,179,_ctx); } } } @@ -12823,23 +12692,23 @@ public T accept(ParseTreeVisitor visitor) { public final KeyedElementContext keyedElement() throws RecognitionException { KeyedElementContext _localctx = new KeyedElementContext(_ctx, getState()); - enterRule(_localctx, 364, RULE_keyedElement); + enterRule(_localctx, 360, RULE_keyedElement); try { enterOuterAlt(_localctx, 1); { - setState(1842); + setState(1820); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,183,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { case 1: { - setState(1839); + setState(1817); key(); - setState(1840); + setState(1818); match(COLON); } break; } - setState(1844); + setState(1822); element(); } } @@ -12875,9 +12744,9 @@ public T accept(ParseTreeVisitor visitor) { public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); - enterRule(_localctx, 366, RULE_key); + enterRule(_localctx, 362, RULE_key); try { - setState(1848); + setState(1826); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -12945,14 +12814,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1846); + setState(1824); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1847); + setState(1825); literalValue(); } break; @@ -12992,9 +12861,9 @@ public T accept(ParseTreeVisitor visitor) { public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); - enterRule(_localctx, 368, RULE_element); + enterRule(_localctx, 364, RULE_element); try { - setState(1852); + setState(1830); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -13062,14 +12931,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1850); + setState(1828); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1851); + setState(1829); literalValue(); } break; @@ -13116,32 +12985,32 @@ public T accept(ParseTreeVisitor visitor) { public final StructTypeContext structType() throws RecognitionException { StructTypeContext _localctx = new StructTypeContext(_ctx, getState()); - enterRule(_localctx, 370, RULE_structType); + enterRule(_localctx, 366, RULE_structType); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1854); + setState(1832); match(STRUCT); - setState(1855); + setState(1833); match(L_CURLY); - setState(1861); + setState(1839); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1856); + setState(1834); fieldDecl(); - setState(1857); + setState(1835); match(EOS); } } - setState(1863); + setState(1841); _errHandler.sync(this); _la = _input.LA(1); } - setState(1864); + setState(1842); match(R_CURLY); } } @@ -13184,34 +13053,34 @@ public T accept(ParseTreeVisitor visitor) { public final FieldDeclContext fieldDecl() throws RecognitionException { FieldDeclContext _localctx = new FieldDeclContext(_ctx, getState()); - enterRule(_localctx, 372, RULE_fieldDecl); + enterRule(_localctx, 368, RULE_fieldDecl); try { enterOuterAlt(_localctx, 1); { - setState(1870); + setState(1848); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,184,_ctx) ) { case 1: { - setState(1866); + setState(1844); identifierList(); - setState(1867); + setState(1845); type_(); } break; case 2: { - setState(1869); + setState(1847); embeddedField(); } break; } - setState(1873); + setState(1851); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,188,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,185,_ctx) ) { case 1: { - setState(1872); + setState(1850); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -13246,12 +13115,12 @@ public T accept(ParseTreeVisitor visitor) { public final String_Context string_() throws RecognitionException { String_Context _localctx = new String_Context(_ctx, getState()); - enterRule(_localctx, 374, RULE_string_); + enterRule(_localctx, 370, RULE_string_); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1875); + setState(1853); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -13280,8 +13149,8 @@ public TypeNameContext typeName() { return getRuleContext(TypeNameContext.class,0); } public TerminalNode STAR() { return getToken(GobraParser.STAR, 0); } - public TypeArgsContext typeArgs() { - return getRuleContext(TypeArgsContext.class,0); + public IndexContext index() { + return getRuleContext(IndexContext.class,0); } public EmbeddedFieldContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -13296,30 +13165,30 @@ public T accept(ParseTreeVisitor visitor) { public final EmbeddedFieldContext embeddedField() throws RecognitionException { EmbeddedFieldContext _localctx = new EmbeddedFieldContext(_ctx, getState()); - enterRule(_localctx, 376, RULE_embeddedField); + enterRule(_localctx, 372, RULE_embeddedField); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1878); + setState(1856); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1877); + setState(1855); match(STAR); } } - setState(1880); + setState(1858); typeName(); - setState(1882); + setState(1860); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,187,_ctx) ) { case 1: { - setState(1881); - typeArgs(); + setState(1859); + index(); } break; } @@ -13339,10 +13208,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); } @@ -13356,15 +13232,45 @@ public T accept(ParseTreeVisitor visitor) { public final IndexContext index() throws RecognitionException { IndexContext _localctx = new IndexContext(_ctx, getState()); - enterRule(_localctx, 378, RULE_index); + enterRule(_localctx, 374, RULE_index); + int _la; try { + int _alt; enterOuterAlt(_localctx, 1); { - setState(1884); + setState(1862); match(L_BRACKET); - setState(1885); + setState(1863); expression(0); - setState(1886); + setState(1868); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,188,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1864); + match(COMMA); + setState(1865); + expression(0); + } + } + } + setState(1870); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,188,_ctx); + } + setState(1872); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1871); + match(COMMA); + } + } + + setState(1874); match(R_BRACKET); } } @@ -13400,17 +13306,17 @@ public T accept(ParseTreeVisitor visitor) { public final TypeAssertionContext typeAssertion() throws RecognitionException { TypeAssertionContext _localctx = new TypeAssertionContext(_ctx, getState()); - enterRule(_localctx, 380, RULE_typeAssertion); + enterRule(_localctx, 376, RULE_typeAssertion); try { enterOuterAlt(_localctx, 1); { - setState(1888); + setState(1876); match(DOT); - setState(1889); + setState(1877); match(L_PAREN); - setState(1890); + setState(1878); type_(); - setState(1891); + setState(1879); match(R_PAREN); } } @@ -13453,39 +13359,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentsContext arguments() throws RecognitionException { ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); - enterRule(_localctx, 382, RULE_arguments); + enterRule(_localctx, 378, RULE_arguments); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1893); + setState(1881); match(L_PAREN); - setState(1908); + setState(1896); _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(1900); + setState(1888); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,192,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { case 1: { - setState(1894); + setState(1882); expressionList(); } break; case 2: { - setState(1895); + setState(1883); nonNamedType(); - setState(1898); + setState(1886); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,191,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { case 1: { - setState(1896); + setState(1884); match(COMMA); - setState(1897); + setState(1885); expressionList(); } break; @@ -13493,22 +13399,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1903); + setState(1891); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1902); + setState(1890); match(ELLIPSIS); } } - setState(1906); + setState(1894); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1905); + setState(1893); match(COMMA); } } @@ -13516,7 +13422,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1910); + setState(1898); match(R_PAREN); } } @@ -13551,15 +13457,15 @@ public T accept(ParseTreeVisitor visitor) { public final MethodExprContext methodExpr() throws RecognitionException { MethodExprContext _localctx = new MethodExprContext(_ctx, getState()); - enterRule(_localctx, 384, RULE_methodExpr); + enterRule(_localctx, 380, RULE_methodExpr); try { enterOuterAlt(_localctx, 1); { - setState(1912); + setState(1900); nonNamedType(); - setState(1913); + setState(1901); match(DOT); - setState(1914); + setState(1902); match(IDENTIFIER); } } @@ -13592,11 +13498,11 @@ public T accept(ParseTreeVisitor visitor) { public final ReceiverTypeContext receiverType() throws RecognitionException { ReceiverTypeContext _localctx = new ReceiverTypeContext(_ctx, getState()); - enterRule(_localctx, 386, RULE_receiverType); + enterRule(_localctx, 382, RULE_receiverType); try { enterOuterAlt(_localctx, 1); { - setState(1916); + setState(1904); type_(); } } @@ -13629,36 +13535,36 @@ public T accept(ParseTreeVisitor visitor) { public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); - enterRule(_localctx, 388, RULE_eos); + enterRule(_localctx, 384, RULE_eos); try { - setState(1922); + setState(1910); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,196,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1918); + setState(1906); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1919); + setState(1907); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1920); + setState(1908); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1921); + setState(1909); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -13681,7 +13587,7 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return expression_sempred((ExpressionContext)_localctx, predIndex); case 89: return primaryExpr_sempred((PrimaryExprContext)_localctx, predIndex); - case 194: + case 192: return eos_sempred((EosContext)_localctx, predIndex); } return true; @@ -13741,7 +13647,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a0\u0785\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a0\u0779\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"+ @@ -13792,1192 +13698,1183 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\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\u0002\u00c2\u0007"+ - "\u00c2\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\u0193\b\u0003\n\u0003\f\u0003\u0196\t\u0003\u0001\u0004"+ - "\u0001\u0004\u0003\u0004\u019a\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u019f\b\u0005\n\u0005\f\u0005\u01a2\t\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01a9\b\u0005\n"+ - "\u0005\f\u0005\u01ac\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u01b1\b\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u01b5\b\u0005"+ - "\n\u0005\f\u0005\u01b8\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ - "\u0001\b\u0005\b\u01c5\b\b\n\b\f\b\u01c8\t\b\u0001\b\u0003\b\u01cb\b\b"+ - "\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01d2\b\t\n\t\f\t\u01d5"+ - "\t\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0005\t\u01de"+ - "\b\t\n\t\f\t\u01e1\t\t\u0001\t\u0003\t\u01e4\b\t\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0003\n\u01ea\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01f3\b\u000b\u0001"+ - "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0003\u000e\u01fd\b\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ + "\u00bf\u0002\u00c0\u0007\u00c0\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\u018f\b\u0003\n\u0003\f\u0003"+ + "\u0192\t\u0003\u0001\u0004\u0001\u0004\u0003\u0004\u0196\b\u0004\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u019b\b\u0005\n\u0005\f\u0005"+ + "\u019e\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u01a5\b\u0005\n\u0005\f\u0005\u01a8\t\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0003\u0005\u01ad\b\u0005\u0001\u0005\u0001\u0005\u0005"+ + "\u0005\u01b1\b\u0005\n\u0005\f\u0005\u01b4\t\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\b\u0001\b\u0001\b\u0005\b\u01c1\b\b\n\b\f\b\u01c4\t\b\u0001\b\u0003"+ + "\b\u01c7\b\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0005\t\u01ce\b\t"+ + "\n\t\f\t\u01d1\t\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0005\t\u01da\b\t\n\t\f\t\u01dd\t\t\u0001\t\u0003\t\u01e0\b\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0003\n\u01e6\b\n\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u01ef"+ + "\b\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0003\u000e\u01f9\b\u000e\u0001\u000e\u0001\u000e\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+ - "\u020e\b\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012"+ - "\u021a\b\u0012\n\u0012\f\u0012\u021d\t\u0012\u0001\u0012\u0003\u0012\u0220"+ - "\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0225\b\u0013"+ - "\n\u0013\f\u0013\u0228\t\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0005"+ - "\u0014\u022d\b\u0014\n\u0014\f\u0014\u0230\t\u0014\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0005\u0015\u0236\b\u0015\n\u0015\f\u0015\u0239"+ - "\t\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\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\u0003"+ - "\u001b\u0258\b\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001c\u0001\u001c\u0003\u001c\u0260\b\u001c\u0001\u001d\u0001\u001d\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0278\b!\u0001!\u0001"+ - "!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0005#\u0289\b#\n#\f#\u028c\t#\u0001#\u0001"+ - "#\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005%\u0298"+ - "\b%\n%\f%\u029b\t%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001"+ - "\'\u0001\'\u0001\'\u0003\'\u02a7\b\'\u0001(\u0001(\u0001(\u0001(\u0001"+ - "(\u0005(\u02ae\b(\n(\f(\u02b1\t(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u02be\b)\u0001*\u0001*\u0001"+ - "*\u0001*\u0001*\u0005*\u02c5\b*\n*\f*\u02c8\t*\u0001*\u0001*\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0005+\u02d1\b+\n+\f+\u02d4\t+\u0001+\u0001+\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0003-\u02e8\b-\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0003.\u02ef\b.\u0001.\u0005.\u02f2\b.\n.\f.\u02f5\t."+ - "\u0001.\u0001.\u0003.\u02f9\b.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0003/\u0303\b/\u00010\u00030\u0306\b0\u00010\u00010\u0003"+ - "0\u030a\b0\u00011\u00011\u00031\u030e\b1\u00012\u00012\u00012\u00012\u0005"+ - "2\u0314\b2\n2\f2\u0317\t2\u00012\u00012\u00013\u00013\u00013\u00033\u031e"+ - "\b3\u00014\u00014\u00014\u00034\u0323\b4\u00015\u00015\u00015\u00015\u0001"+ - "5\u00015\u00035\u032b\b5\u00035\u032d\b5\u00015\u00015\u00015\u00035\u0332"+ - "\b5\u00016\u00016\u00016\u00056\u0337\b6\n6\f6\u033a\t6\u00017\u00017"+ - "\u00017\u00017\u00017\u00037\u0341\b7\u00017\u00037\u0344\b7\u00017\u0001"+ - "7\u00018\u00018\u00038\u034a\b8\u00018\u00018\u00018\u00038\u034f\b8\u0003"+ - "8\u0351\b8\u00018\u00038\u0354\b8\u00019\u00019\u00019\u00059\u0359\b"+ - "9\n9\f9\u035c\t9\u0001:\u0001:\u0003:\u0360\b:\u0001:\u0001:\u0001;\u0001"+ + "\u0003\u000f\u020a\b\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0005\u0012\u0216\b\u0012\n\u0012\f\u0012\u0219\t\u0012\u0001\u0012\u0003"+ + "\u0012\u021c\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0221"+ + "\b\u0013\n\u0013\f\u0013\u0224\t\u0013\u0001\u0013\u0001\u0013\u0001\u0014"+ + "\u0005\u0014\u0229\b\u0014\n\u0014\f\u0014\u022c\t\u0014\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u0232\b\u0015\n\u0015\f\u0015"+ + "\u0235\t\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\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"+ + "\u0003\u001b\u0254\b\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ + "\u0001\u001c\u0001\u001c\u0003\u001c\u025c\b\u001c\u0001\u001d\u0001\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f"+ + "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0003!\u0274\b!\u0001"+ + "!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0005#\u0285\b#\n#\f#\u0288\t#\u0001"+ + "#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0005"+ + "%\u0294\b%\n%\f%\u0297\t%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0003\'\u02a3\b\'\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0005(\u02aa\b(\n(\f(\u02ad\t(\u0001(\u0001(\u0001)\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0003)\u02ba\b)\u0001*\u0001"+ + "*\u0001*\u0001*\u0001*\u0005*\u02c1\b*\n*\f*\u02c4\t*\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0005+\u02cd\b+\n+\f+\u02d0\t+\u0001+\u0001"+ + "+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0003-\u02e4\b-\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0003.\u02eb\b.\u0001.\u0005.\u02ee\b.\n.\f.\u02f1"+ + "\t.\u0001.\u0001.\u0003.\u02f5\b.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0003/\u02ff\b/\u00010\u00030\u0302\b0\u00010\u00010\u0003"+ + "0\u0306\b0\u00011\u00011\u00031\u030a\b1\u00012\u00012\u00012\u00012\u0005"+ + "2\u0310\b2\n2\f2\u0313\t2\u00012\u00012\u00013\u00013\u00013\u00033\u031a"+ + "\b3\u00014\u00014\u00014\u00034\u031f\b4\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00035\u0327\b5\u00035\u0329\b5\u00015\u00015\u00015\u00035\u032e"+ + "\b5\u00016\u00016\u00016\u00056\u0333\b6\n6\f6\u0336\t6\u00017\u00017"+ + "\u00017\u00017\u00017\u00037\u033d\b7\u00017\u00037\u0340\b7\u00017\u0001"+ + "7\u00018\u00018\u00038\u0346\b8\u00018\u00018\u00018\u00038\u034b\b8\u0003"+ + "8\u034d\b8\u00018\u00038\u0350\b8\u00019\u00019\u00019\u00059\u0355\b"+ + "9\n9\f9\u0358\t9\u0001:\u0001:\u0003:\u035c\b:\u0001:\u0001:\u0001;\u0001"+ ";\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "<\u0001<\u0005<\u0371\b<\n<\f<\u0374\t<\u0001<\u0001<\u0001<\u0005<\u0379"+ - "\b<\n<\f<\u037c\t<\u0001<\u0003<\u037f\b<\u0001=\u0003=\u0382\b=\u0001"+ - "=\u0001=\u0001=\u0001=\u0003=\u0388\b=\u0001>\u0001>\u0003>\u038c\b>\u0001"+ - ">\u0003>\u038f\b>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0003?\u0399\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u03a0\b@\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0003A\u03a7\bA\u0001A\u0001A\u0001B\u0001"+ - "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0003C\u03b3\bC\u0001D\u0001"+ - "D\u0001D\u0003D\u03b8\bD\u0001D\u0001D\u0003D\u03bc\bD\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0003E\u03c3\bE\u0001F\u0001F\u0001F\u0003F\u03c8\bF\u0001"+ - "G\u0001G\u0001G\u0001G\u0003G\u03ce\bG\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03da\bI\u0001J\u0001J\u0001"+ - "J\u0001J\u0003J\u03e0\bJ\u0001J\u0001J\u0003J\u03e4\bJ\u0001K\u0001K\u0001"+ - "K\u0001K\u0001L\u0001L\u0003L\u03ec\bL\u0001L\u0001L\u0003L\u03f0\bL\u0001"+ - "L\u0001L\u0001M\u0001M\u0003M\u03f6\bM\u0001N\u0003N\u03f9\bN\u0001N\u0001"+ - "N\u0001O\u0001O\u0003O\u03ff\bO\u0001O\u0001O\u0001P\u0003P\u0404\bP\u0001"+ + "<\u0001<\u0005<\u036d\b<\n<\f<\u0370\t<\u0001<\u0001<\u0001<\u0005<\u0375"+ + "\b<\n<\f<\u0378\t<\u0001<\u0003<\u037b\b<\u0001=\u0003=\u037e\b=\u0001"+ + "=\u0001=\u0001=\u0001=\u0003=\u0384\b=\u0001>\u0001>\u0003>\u0388\b>\u0001"+ + ">\u0003>\u038b\b>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0395\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0003@\u039c\b@\u0001"+ + "A\u0001A\u0001A\u0001A\u0001A\u0003A\u03a3\bA\u0001A\u0001A\u0001B\u0001"+ + "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0003C\u03af\bC\u0001D\u0001"+ + "D\u0001D\u0003D\u03b4\bD\u0001D\u0001D\u0003D\u03b8\bD\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u03bf\bE\u0001F\u0001F\u0001F\u0003F\u03c4\bF\u0001"+ + "G\u0001G\u0001G\u0001G\u0003G\u03ca\bG\u0001H\u0001H\u0001H\u0001H\u0001"+ + "H\u0001I\u0001I\u0001I\u0001I\u0001I\u0003I\u03d6\bI\u0001J\u0001J\u0001"+ + "J\u0001J\u0003J\u03dc\bJ\u0001J\u0001J\u0003J\u03e0\bJ\u0001K\u0001K\u0001"+ + "K\u0001K\u0001L\u0001L\u0003L\u03e8\bL\u0001L\u0001L\u0003L\u03ec\bL\u0001"+ + "L\u0001L\u0001M\u0001M\u0003M\u03f2\bM\u0001N\u0003N\u03f5\bN\u0001N\u0001"+ + "N\u0001O\u0001O\u0003O\u03fb\bO\u0001O\u0001O\u0001P\u0003P\u0400\bP\u0001"+ "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0003Q\u041d\bQ\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0003Q\u0419\bQ\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0005Q\u0440\bQ\nQ"+ - "\fQ\u0443\tQ\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0005Q\u043c\bQ\nQ"+ + "\fQ\u043f\tQ\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "R\u0001R\u0003R\u0459\bR\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0003"+ - "T\u0461\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0005V\u046a"+ - "\bV\nV\fV\u046d\tV\u0001V\u0001V\u0001V\u0001V\u0003V\u0473\bV\u0001W"+ - "\u0001W\u0001W\u0001W\u0001W\u0003W\u047a\bW\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0003X\u0484\bX\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u0492"+ + "R\u0001R\u0003R\u0455\bR\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0003"+ + "T\u045d\bT\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0005V\u0466"+ + "\bV\nV\fV\u0469\tV\u0001V\u0001V\u0001V\u0001V\u0003V\u046f\bV\u0001W"+ + "\u0001W\u0001W\u0001W\u0001W\u0003W\u0476\bW\u0001X\u0001X\u0001X\u0001"+ + "X\u0001X\u0001X\u0001X\u0001X\u0003X\u0480\bX\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0003Y\u048e"+ "\bY\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0005Y\u04a8\bY\nY\fY\u04ab\tY\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0003"+ - "[\u04b2\b[\u0001[\u0001[\u0003[\u04b6\b[\u0001\\\u0001\\\u0003\\\u04ba"+ - "\b\\\u0001\\\u0003\\\u04bd\b\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ - "]\u0001]\u0005]\u04c6\b]\n]\f]\u04c9\t]\u0001]\u0001]\u0001^\u0001^\u0001"+ - "^\u0003^\u04d0\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0003`\u04d7\b`\u0001"+ - "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04df\b`\u0001`\u0001`\u0001"+ - "`\u0001`\u0003`\u04e5\b`\u0001a\u0001a\u0003a\u04e9\ba\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0003a\u04f1\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0003b\u04fc\bb\u0001c\u0001c\u0001c\u0001"+ - "d\u0001d\u0001d\u0001d\u0005d\u0505\bd\nd\fd\u0508\td\u0001d\u0003d\u050b"+ - "\bd\u0003d\u050d\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0003e\u0519\be\u0003e\u051b\be\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0001g\u0001g\u0003g\u0524\bg\u0001g\u0001g\u0003g\u0528\bg\u0001"+ - "g\u0003g\u052b\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u0532\bg\u0001"+ - "g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u053d"+ - "\bk\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u0547"+ - "\bl\u0001l\u0001l\u0001l\u0001l\u0003l\u054d\bl\u0003l\u054f\bl\u0001"+ - "m\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u0559\bo\u0001"+ - "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0005p\u0561\bp\np\fp\u0564\tp\u0001"+ - "p\u0003p\u0567\bp\u0001q\u0001q\u0003q\u056b\bq\u0001q\u0001q\u0003q\u056f"+ - "\bq\u0001r\u0001r\u0001r\u0005r\u0574\br\nr\fr\u0577\tr\u0001s\u0001s"+ - "\u0001s\u0005s\u057c\bs\ns\fs\u057f\ts\u0001t\u0001t\u0001t\u0001t\u0001"+ - "t\u0001t\u0005t\u0587\bt\nt\ft\u058a\tt\u0001t\u0003t\u058d\bt\u0001u"+ - "\u0001u\u0003u\u0591\bu\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0003"+ - "w\u0599\bw\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005"+ - "x\u05a3\bx\nx\fx\u05a6\tx\u0001x\u0003x\u05a9\bx\u0001y\u0001y\u0003y"+ - "\u05ad\by\u0001y\u0001y\u0001z\u0001z\u0001z\u0004z\u05b4\bz\u000bz\f"+ - "z\u05b5\u0001{\u0001{\u0001{\u0001{\u0001{\u0003{\u05bd\b{\u0001|\u0001"+ + "Y\u0005Y\u04a4\bY\nY\fY\u04a7\tY\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0003"+ + "[\u04ae\b[\u0001[\u0001[\u0003[\u04b2\b[\u0001\\\u0001\\\u0003\\\u04b6"+ + "\b\\\u0001\\\u0003\\\u04b9\b\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u04c2\b]\n]\f]\u04c5\t]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "^\u0003^\u04cc\b^\u0001_\u0001_\u0001_\u0001_\u0001`\u0003`\u04d3\b`\u0001"+ + "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0003`\u04db\b`\u0001`\u0001`\u0001"+ + "`\u0001`\u0003`\u04e1\b`\u0001a\u0001a\u0003a\u04e5\ba\u0001a\u0001a\u0001"+ + "a\u0001a\u0001a\u0001a\u0003a\u04ed\ba\u0001b\u0001b\u0001b\u0001b\u0001"+ + "b\u0001b\u0001b\u0001b\u0001b\u0003b\u04f8\bb\u0001c\u0001c\u0001c\u0001"+ + "d\u0001d\u0001d\u0001d\u0005d\u0501\bd\nd\fd\u0504\td\u0001d\u0003d\u0507"+ + "\bd\u0003d\u0509\bd\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ + "e\u0001e\u0001e\u0003e\u0515\be\u0003e\u0517\be\u0001f\u0001f\u0001f\u0001"+ + "f\u0001f\u0001g\u0001g\u0003g\u0520\bg\u0001g\u0001g\u0003g\u0524\bg\u0001"+ + "g\u0003g\u0527\bg\u0001g\u0001g\u0001g\u0001g\u0001g\u0003g\u052e\bg\u0001"+ + "g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001j\u0001k\u0003k\u0539"+ + "\bk\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001l\u0001l\u0003l\u0543"+ + "\bl\u0001l\u0001l\u0001l\u0001l\u0003l\u0549\bl\u0003l\u054b\bl\u0001"+ + "m\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001o\u0003o\u0555\bo\u0001"+ + "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0005p\u055d\bp\np\fp\u0560\tp\u0001"+ + "p\u0003p\u0563\bp\u0001q\u0001q\u0003q\u0567\bq\u0001q\u0001q\u0003q\u056b"+ + "\bq\u0001r\u0001r\u0001r\u0005r\u0570\br\nr\fr\u0573\tr\u0001s\u0001s"+ + "\u0001s\u0005s\u0578\bs\ns\fs\u057b\ts\u0001t\u0001t\u0001t\u0001t\u0001"+ + "t\u0001t\u0005t\u0583\bt\nt\ft\u0586\tt\u0001t\u0003t\u0589\bt\u0001u"+ + "\u0001u\u0003u\u058d\bu\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0003"+ + "w\u0595\bw\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0005"+ + "x\u059f\bx\nx\fx\u05a2\tx\u0001x\u0003x\u05a5\bx\u0001y\u0001y\u0003y"+ + "\u05a9\by\u0001y\u0001y\u0001z\u0001z\u0001z\u0004z\u05b0\bz\u000bz\f"+ + "z\u05b1\u0001{\u0001{\u0001{\u0001{\u0001{\u0003{\u05b9\b{\u0001|\u0001"+ "|\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f"+ "\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0003\u0081\u05d1\b\u0081\u0001\u0082\u0001\u0082\u0003\u0082"+ - "\u05d5\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083\u05d9\b\u0083\u0001"+ - "\u0084\u0001\u0084\u0003\u0084\u05dd\b\u0084\u0001\u0085\u0001\u0085\u0001"+ + "\u0001\u0081\u0003\u0081\u05cd\b\u0081\u0001\u0082\u0001\u0082\u0003\u0082"+ + "\u05d1\b\u0082\u0001\u0083\u0001\u0083\u0003\u0083\u05d5\b\u0083\u0001"+ + "\u0084\u0001\u0084\u0003\u0084\u05d9\b\u0084\u0001\u0085\u0001\u0085\u0001"+ "\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001"+ "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003"+ - "\u0087\u05ed\b\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003"+ - "\u0087\u05f3\b\u0087\u0003\u0087\u05f5\b\u0087\u0001\u0088\u0001\u0088"+ - "\u0003\u0088\u05f9\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u05fd\b"+ - "\u0089\u0001\u0089\u0003\u0089\u0600\b\u0089\u0001\u0089\u0001\u0089\u0003"+ - "\u0089\u0604\b\u0089\u0003\u0089\u0606\b\u0089\u0001\u0089\u0001\u0089"+ - "\u0005\u0089\u060a\b\u0089\n\u0089\f\u0089\u060d\t\u0089\u0001\u0089\u0001"+ - "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003\u008a\u0614\b\u008a\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u0619\b\u008b\u0001\u008c\u0001"+ + "\u0087\u05e9\b\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0003"+ + "\u0087\u05ef\b\u0087\u0003\u0087\u05f1\b\u0087\u0001\u0088\u0001\u0088"+ + "\u0003\u0088\u05f5\b\u0088\u0001\u0089\u0001\u0089\u0003\u0089\u05f9\b"+ + "\u0089\u0001\u0089\u0003\u0089\u05fc\b\u0089\u0001\u0089\u0001\u0089\u0003"+ + "\u0089\u0600\b\u0089\u0003\u0089\u0602\b\u0089\u0001\u0089\u0001\u0089"+ + "\u0005\u0089\u0606\b\u0089\n\u0089\f\u0089\u0609\t\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0003\u008a\u0610\b\u008a\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0003\u008b\u0615\b\u008b\u0001\u008c\u0001"+ "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0003\u008c\u0624\b\u008c\u0001\u008c\u0001\u008c\u0005"+ - "\u008c\u0628\b\u008c\n\u008c\f\u008c\u062b\t\u008c\u0001\u008c\u0001\u008c"+ - "\u0001\u008d\u0001\u008d\u0003\u008d\u0631\b\u008d\u0001\u008d\u0001\u008d"+ + "\u008c\u0001\u008c\u0003\u008c\u0620\b\u008c\u0001\u008c\u0001\u008c\u0005"+ + "\u008c\u0624\b\u008c\n\u008c\f\u008c\u0627\t\u008c\u0001\u008c\u0001\u008c"+ + "\u0001\u008d\u0001\u008d\u0003\u008d\u062d\b\u008d\u0001\u008d\u0001\u008d"+ "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0003\u008e\u063c\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0003\u008f\u0641\b\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u0645\b"+ - "\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u064a\b\u0090\u0005"+ - "\u0090\u064c\b\u0090\n\u0090\f\u0090\u064f\t\u0090\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0005\u0091\u0654\b\u0091\n\u0091\f\u0091\u0657\t\u0091\u0001"+ - "\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u065e"+ - "\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u0663\b\u0093"+ - "\u0001\u0093\u0003\u0093\u0666\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u066e\b\u0094\u0001\u0094"+ + "\u0001\u008e\u0003\u008e\u0638\b\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0003\u008f\u063d\b\u008f\u0001\u0090\u0001\u0090\u0003\u0090\u0641\b"+ + "\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0003\u0090\u0646\b\u0090\u0005"+ + "\u0090\u0648\b\u0090\n\u0090\f\u0090\u064b\t\u0090\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0005\u0091\u0650\b\u0091\n\u0091\f\u0091\u0653\t\u0091\u0001"+ + "\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u065a"+ + "\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0003\u0093\u065f\b\u0093"+ + "\u0001\u0093\u0003\u0093\u0662\b\u0093\u0001\u0094\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0003\u0094\u066a\b\u0094\u0001\u0094"+ "\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0003\u0095"+ - "\u0676\b\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0003\u0096\u067b\b"+ - "\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u067f\b\u0096\u0001\u0096\u0001"+ - "\u0096\u0003\u0096\u0683\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0098\u0001\u0098\u0003\u0098\u068a\b\u0098\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0003\u0099\u068f\b\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0005\u009a\u0696\b\u009a\n\u009a\f\u009a\u0699\t\u009a"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c"+ - "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e"+ - "\u0001\u009f\u0001\u009f\u0001\u009f\u0005\u009f\u06aa\b\u009f\n\u009f"+ - "\f\u009f\u06ad\t\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ - "\u0001\u00a3\u0003\u00a3\u06c0\b\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0003\u00a5\u06cb\b\u00a5\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06cf\b"+ - "\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0005\u00a7\u06d5"+ - "\b\u00a7\n\u00a7\f\u00a7\u06d8\t\u00a7\u0001\u00a7\u0003\u00a7\u06db\b"+ - "\u00a7\u0003\u00a7\u06dd\b\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001"+ - "\u00a8\u0001\u00a8\u0003\u00a8\u06e4\b\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ - "\u00a9\u0001\u00a9\u0001\u00a9\u0005\u00a9\u06eb\b\u00a9\n\u00a9\f\u00a9"+ - "\u06ee\t\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003\u00ac\u06f9\b\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ad\u0003\u00ad\u0702\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ - "\u0003\u00ae\u0707\b\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ - "\u0003\u00ae\u070d\b\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0003\u00af"+ - "\u0712\b\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ - "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0003\u00b4\u0722\b\u00b4\u0003\u00b4"+ - "\u0724\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ - "\u0005\u00b5\u072b\b\u00b5\n\u00b5\f\u00b5\u072e\t\u00b5\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b6\u0003\u00b6\u0733\b\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b7\u0001\u00b7\u0003\u00b7\u0739\b\u00b7\u0001\u00b8\u0001\u00b8\u0003"+ - "\u00b8\u073d\b\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001"+ - "\u00b9\u0005\u00b9\u0744\b\u00b9\n\u00b9\f\u00b9\u0747\t\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0003\u00ba"+ - "\u074f\b\u00ba\u0001\u00ba\u0003\u00ba\u0752\b\u00ba\u0001\u00bb\u0001"+ - "\u00bb\u0001\u00bc\u0003\u00bc\u0757\b\u00bc\u0001\u00bc\u0001\u00bc\u0003"+ - "\u00bc\u075b\b\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0003\u00bf\u076b\b\u00bf\u0003"+ - "\u00bf\u076d\b\u00bf\u0001\u00bf\u0003\u00bf\u0770\b\u00bf\u0001\u00bf"+ - "\u0003\u00bf\u0773\b\u00bf\u0003\u00bf\u0775\b\u00bf\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001"+ - "\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0003\u00c2\u0783"+ - "\b\u00c2\u0001\u00c2\u0001\u02f3\u0002\u00a2\u00b2\u00c3\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\u0172\u0174\u0176"+ - "\u0178\u017a\u017c\u017e\u0180\u0182\u0184\u0000\u0013\u0002\u0000eep"+ - "p\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\u0000qr\u0002\u0000nn\u009f\u009f\u0002\u0000"+ - "\u008a\u008d\u008f\u0090\u0001\u0000\u0096\u0097\u07e8\u0000\u0186\u0001"+ - "\u0000\u0000\u0000\u0002\u0189\u0001\u0000\u0000\u0000\u0004\u018c\u0001"+ - "\u0000\u0000\u0000\u0006\u018f\u0001\u0000\u0000\u0000\b\u0197\u0001\u0000"+ - "\u0000\u0000\n\u01a0\u0001\u0000\u0000\u0000\f\u01bb\u0001\u0000\u0000"+ - "\u0000\u000e\u01be\u0001\u0000\u0000\u0000\u0010\u01c6\u0001\u0000\u0000"+ - "\u0000\u0012\u01d3\u0001\u0000\u0000\u0000\u0014\u01e9\u0001\u0000\u0000"+ - "\u0000\u0016\u01f2\u0001\u0000\u0000\u0000\u0018\u01f4\u0001\u0000\u0000"+ - "\u0000\u001a\u01f6\u0001\u0000\u0000\u0000\u001c\u01f9\u0001\u0000\u0000"+ - "\u0000\u001e\u020d\u0001\u0000\u0000\u0000 \u020f\u0001\u0000\u0000\u0000"+ - "\"\u0211\u0001\u0000\u0000\u0000$\u0216\u0001\u0000\u0000\u0000&\u0221"+ - "\u0001\u0000\u0000\u0000(\u022e\u0001\u0000\u0000\u0000*\u0231\u0001\u0000"+ - "\u0000\u0000,\u023c\u0001\u0000\u0000\u0000.\u023e\u0001\u0000\u0000\u0000"+ - "0\u0243\u0001\u0000\u0000\u00002\u0248\u0001\u0000\u0000\u00004\u024d"+ - "\u0001\u0000\u0000\u00006\u0252\u0001\u0000\u0000\u00008\u025f\u0001\u0000"+ - "\u0000\u0000:\u0261\u0001\u0000\u0000\u0000<\u0263\u0001\u0000\u0000\u0000"+ - ">\u0268\u0001\u0000\u0000\u0000@\u026d\u0001\u0000\u0000\u0000B\u0272"+ - "\u0001\u0000\u0000\u0000D\u027b\u0001\u0000\u0000\u0000F\u0282\u0001\u0000"+ - "\u0000\u0000H\u028f\u0001\u0000\u0000\u0000J\u0293\u0001\u0000\u0000\u0000"+ - "L\u029e\u0001\u0000\u0000\u0000N\u02a6\u0001\u0000\u0000\u0000P\u02a8"+ - "\u0001\u0000\u0000\u0000R\u02bd\u0001\u0000\u0000\u0000T\u02bf\u0001\u0000"+ - "\u0000\u0000V\u02cb\u0001\u0000\u0000\u0000X\u02d7\u0001\u0000\u0000\u0000"+ - "Z\u02e7\u0001\u0000\u0000\u0000\\\u02f3\u0001\u0000\u0000\u0000^\u0302"+ - "\u0001\u0000\u0000\u0000`\u0305\u0001\u0000\u0000\u0000b\u030d\u0001\u0000"+ - "\u0000\u0000d\u030f\u0001\u0000\u0000\u0000f\u031a\u0001\u0000\u0000\u0000"+ - "h\u0322\u0001\u0000\u0000\u0000j\u0331\u0001\u0000\u0000\u0000l\u0333"+ - "\u0001\u0000\u0000\u0000n\u033b\u0001\u0000\u0000\u0000p\u0349\u0001\u0000"+ - "\u0000\u0000r\u0355\u0001\u0000\u0000\u0000t\u035f\u0001\u0000\u0000\u0000"+ - "v\u0363\u0001\u0000\u0000\u0000x\u0369\u0001\u0000\u0000\u0000z\u0381"+ - "\u0001\u0000\u0000\u0000|\u0389\u0001\u0000\u0000\u0000~\u0398\u0001\u0000"+ - "\u0000\u0000\u0080\u039a\u0001\u0000\u0000\u0000\u0082\u03a1\u0001\u0000"+ - "\u0000\u0000\u0084\u03aa\u0001\u0000\u0000\u0000\u0086\u03af\u0001\u0000"+ - "\u0000\u0000\u0088\u03b4\u0001\u0000\u0000\u0000\u008a\u03bd\u0001\u0000"+ - "\u0000\u0000\u008c\u03c4\u0001\u0000\u0000\u0000\u008e\u03c9\u0001\u0000"+ - "\u0000\u0000\u0090\u03cf\u0001\u0000\u0000\u0000\u0092\u03d4\u0001\u0000"+ - "\u0000\u0000\u0094\u03db\u0001\u0000\u0000\u0000\u0096\u03e5\u0001\u0000"+ - "\u0000\u0000\u0098\u03e9\u0001\u0000\u0000\u0000\u009a\u03f5\u0001\u0000"+ - "\u0000\u0000\u009c\u03f8\u0001\u0000\u0000\u0000\u009e\u03fc\u0001\u0000"+ - "\u0000\u0000\u00a0\u0403\u0001\u0000\u0000\u0000\u00a2\u041c\u0001\u0000"+ - "\u0000\u0000\u00a4\u0458\u0001\u0000\u0000\u0000\u00a6\u045a\u0001\u0000"+ - "\u0000\u0000\u00a8\u045d\u0001\u0000\u0000\u0000\u00aa\u0462\u0001\u0000"+ - "\u0000\u0000\u00ac\u046b\u0001\u0000\u0000\u0000\u00ae\u0479\u0001\u0000"+ - "\u0000\u0000\u00b0\u0483\u0001\u0000\u0000\u0000\u00b2\u0491\u0001\u0000"+ - "\u0000\u0000\u00b4\u04ac\u0001\u0000\u0000\u0000\u00b6\u04af\u0001\u0000"+ - "\u0000\u0000\u00b8\u04b7\u0001\u0000\u0000\u0000\u00ba\u04c0\u0001\u0000"+ - "\u0000\u0000\u00bc\u04cf\u0001\u0000\u0000\u0000\u00be\u04d1\u0001\u0000"+ - "\u0000\u0000\u00c0\u04e4\u0001\u0000\u0000\u0000\u00c2\u04f0\u0001\u0000"+ - "\u0000\u0000\u00c4\u04fb\u0001\u0000\u0000\u0000\u00c6\u04fd\u0001\u0000"+ - "\u0000\u0000\u00c8\u0500\u0001\u0000\u0000\u0000\u00ca\u051a\u0001\u0000"+ - "\u0000\u0000\u00cc\u051c\u0001\u0000\u0000\u0000\u00ce\u0521\u0001\u0000"+ - "\u0000\u0000\u00d0\u0535\u0001\u0000\u0000\u0000\u00d2\u0537\u0001\u0000"+ - "\u0000\u0000\u00d4\u0539\u0001\u0000\u0000\u0000\u00d6\u053c\u0001\u0000"+ - "\u0000\u0000\u00d8\u0546\u0001\u0000\u0000\u0000\u00da\u0550\u0001\u0000"+ - "\u0000\u0000\u00dc\u0553\u0001\u0000\u0000\u0000\u00de\u0558\u0001\u0000"+ - "\u0000\u0000\u00e0\u055a\u0001\u0000\u0000\u0000\u00e2\u0568\u0001\u0000"+ - "\u0000\u0000\u00e4\u0570\u0001\u0000\u0000\u0000\u00e6\u0578\u0001\u0000"+ - "\u0000\u0000\u00e8\u0580\u0001\u0000\u0000\u0000\u00ea\u0590\u0001\u0000"+ - "\u0000\u0000\u00ec\u0592\u0001\u0000\u0000\u0000\u00ee\u0596\u0001\u0000"+ - "\u0000\u0000\u00f0\u059c\u0001\u0000\u0000\u0000\u00f2\u05aa\u0001\u0000"+ - "\u0000\u0000\u00f4\u05b3\u0001\u0000\u0000\u0000\u00f6\u05bc\u0001\u0000"+ - "\u0000\u0000\u00f8\u05be\u0001\u0000\u0000\u0000\u00fa\u05c0\u0001\u0000"+ - "\u0000\u0000\u00fc\u05c4\u0001\u0000\u0000\u0000\u00fe\u05c7\u0001\u0000"+ - "\u0000\u0000\u0100\u05cb\u0001\u0000\u0000\u0000\u0102\u05cd\u0001\u0000"+ - "\u0000\u0000\u0104\u05d2\u0001\u0000\u0000\u0000\u0106\u05d6\u0001\u0000"+ - "\u0000\u0000\u0108\u05da\u0001\u0000\u0000\u0000\u010a\u05de\u0001\u0000"+ - "\u0000\u0000\u010c\u05e1\u0001\u0000\u0000\u0000\u010e\u05e3\u0001\u0000"+ - "\u0000\u0000\u0110\u05f8\u0001\u0000\u0000\u0000\u0112\u05fa\u0001\u0000"+ - "\u0000\u0000\u0114\u0610\u0001\u0000\u0000\u0000\u0116\u0618\u0001\u0000"+ - "\u0000\u0000\u0118\u061a\u0001\u0000\u0000\u0000\u011a\u0630\u0001\u0000"+ - "\u0000\u0000\u011c\u0638\u0001\u0000\u0000\u0000\u011e\u0640\u0001\u0000"+ - "\u0000\u0000\u0120\u0644\u0001\u0000\u0000\u0000\u0122\u0650\u0001\u0000"+ - "\u0000\u0000\u0124\u065a\u0001\u0000\u0000\u0000\u0126\u0665\u0001\u0000"+ - "\u0000\u0000\u0128\u066d\u0001\u0000\u0000\u0000\u012a\u0671\u0001\u0000"+ - "\u0000\u0000\u012c\u067a\u0001\u0000\u0000\u0000\u012e\u0684\u0001\u0000"+ - "\u0000\u0000\u0130\u0689\u0001\u0000\u0000\u0000\u0132\u068b\u0001\u0000"+ - "\u0000\u0000\u0134\u0692\u0001\u0000\u0000\u0000\u0136\u069a\u0001\u0000"+ - "\u0000\u0000\u0138\u069f\u0001\u0000\u0000\u0000\u013a\u06a1\u0001\u0000"+ - "\u0000\u0000\u013c\u06a3\u0001\u0000\u0000\u0000\u013e\u06a6\u0001\u0000"+ - "\u0000\u0000\u0140\u06ae\u0001\u0000\u0000\u0000\u0142\u06b0\u0001\u0000"+ - "\u0000\u0000\u0144\u06b4\u0001\u0000\u0000\u0000\u0146\u06bf\u0001\u0000"+ - "\u0000\u0000\u0148\u06c3\u0001\u0000\u0000\u0000\u014a\u06ca\u0001\u0000"+ - "\u0000\u0000\u014c\u06ce\u0001\u0000\u0000\u0000\u014e\u06d0\u0001\u0000"+ - "\u0000\u0000\u0150\u06e0\u0001\u0000\u0000\u0000\u0152\u06e7\u0001\u0000"+ - "\u0000\u0000\u0154\u06ef\u0001\u0000\u0000\u0000\u0156\u06f2\u0001\u0000"+ - "\u0000\u0000\u0158\u06f4\u0001\u0000\u0000\u0000\u015a\u0701\u0001\u0000"+ - "\u0000\u0000\u015c\u070c\u0001\u0000\u0000\u0000\u015e\u0711\u0001\u0000"+ - "\u0000\u0000\u0160\u0713\u0001\u0000\u0000\u0000\u0162\u0715\u0001\u0000"+ - "\u0000\u0000\u0164\u0717\u0001\u0000\u0000\u0000\u0166\u071b\u0001\u0000"+ - "\u0000\u0000\u0168\u071e\u0001\u0000\u0000\u0000\u016a\u0727\u0001\u0000"+ - "\u0000\u0000\u016c\u0732\u0001\u0000\u0000\u0000\u016e\u0738\u0001\u0000"+ - "\u0000\u0000\u0170\u073c\u0001\u0000\u0000\u0000\u0172\u073e\u0001\u0000"+ - "\u0000\u0000\u0174\u074e\u0001\u0000\u0000\u0000\u0176\u0753\u0001\u0000"+ - "\u0000\u0000\u0178\u0756\u0001\u0000\u0000\u0000\u017a\u075c\u0001\u0000"+ - "\u0000\u0000\u017c\u0760\u0001\u0000\u0000\u0000\u017e\u0765\u0001\u0000"+ - "\u0000\u0000\u0180\u0778\u0001\u0000\u0000\u0000\u0182\u077c\u0001\u0000"+ - "\u0000\u0000\u0184\u0782\u0001\u0000\u0000\u0000\u0186\u0187\u0003\u00a2"+ - "Q\u0000\u0187\u0188\u0005\u0000\u0000\u0001\u0188\u0001\u0001\u0000\u0000"+ - "\u0000\u0189\u018a\u0003\u00a4R\u0000\u018a\u018b\u0005\u0000\u0000\u0001"+ - "\u018b\u0003\u0001\u0000\u0000\u0000\u018c\u018d\u0003\u00c2a\u0000\u018d"+ - "\u018e\u0005\u0000\u0000\u0001\u018e\u0005\u0001\u0000\u0000\u0000\u018f"+ - "\u0194\u0003\b\u0004\u0000\u0190\u0191\u0005m\u0000\u0000\u0191\u0193"+ - "\u0003\b\u0004\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0196\u0001"+ - "\u0000\u0000\u0000\u0194\u0192\u0001\u0000\u0000\u0000\u0194\u0195\u0001"+ - "\u0000\u0000\u0000\u0195\u0007\u0001\u0000\u0000\u0000\u0196\u0194\u0001"+ - "\u0000\u0000\u0000\u0197\u0199\u0005e\u0000\u0000\u0198\u019a\u0005<\u0000"+ - "\u0000\u0199\u0198\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000"+ - "\u0000\u019a\t\u0001\u0000\u0000\u0000\u019b\u019c\u0003\f\u0006\u0000"+ - "\u019c\u019d\u0003\u0184\u00c2\u0000\u019d\u019f\u0001\u0000\u0000\u0000"+ - "\u019e\u019b\u0001\u0000\u0000\u0000\u019f\u01a2\u0001\u0000\u0000\u0000"+ - "\u01a0\u019e\u0001\u0000\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000"+ - "\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000"+ - "\u01a3\u01a4\u0003\u00dam\u0000\u01a4\u01aa\u0003\u0184\u00c2\u0000\u01a5"+ - "\u01a6\u0003\u0012\t\u0000\u01a6\u01a7\u0003\u0184\u00c2\u0000\u01a7\u01a9"+ - "\u0001\u0000\u0000\u0000\u01a8\u01a5\u0001\u0000\u0000\u0000\u01a9\u01ac"+ - "\u0001\u0000\u0000\u0000\u01aa\u01a8\u0001\u0000\u0000\u0000\u01aa\u01ab"+ - "\u0001\u0000\u0000\u0000\u01ab\u01b6\u0001\u0000\u0000\u0000\u01ac\u01aa"+ - "\u0001\u0000\u0000\u0000\u01ad\u01b1\u0003\u0086C\u0000\u01ae\u01b1\u0003"+ - "\u00deo\u0000\u01af\u01b1\u0003\u0014\n\u0000\u01b0\u01ad\u0001\u0000"+ - "\u0000\u0000\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b0\u01af\u0001\u0000"+ - "\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b3\u0003\u0184"+ - "\u00c2\u0000\u01b3\u01b5\u0001\u0000\u0000\u0000\u01b4\u01b0\u0001\u0000"+ - "\u0000\u0000\u01b5\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000"+ - "\u0000\u0000\u01b6\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b9\u0001\u0000"+ - "\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005\u0000"+ - "\u0000\u0001\u01ba\u000b\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005E\u0000"+ - "\u0000\u01bc\u01bd\u0003\u00a2Q\u0000\u01bd\r\u0001\u0000\u0000\u0000"+ - "\u01be\u01bf\u0005F\u0000\u0000\u01bf\u01c0\u0003\u00a2Q\u0000\u01c0\u000f"+ - "\u0001\u0000\u0000\u0000\u01c1\u01c2\u0003\u000e\u0007\u0000\u01c2\u01c3"+ - "\u0003\u0184\u00c2\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4\u01c1"+ - "\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000\u0000\u0000\u01c6\u01c4"+ - "\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01ca"+ - "\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cb"+ - "\u0007\u0000\u0000\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca\u01cb"+ - "\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000\u01cc\u01cd"+ - "\u0003\u00dcn\u0000\u01cd\u0011\u0001\u0000\u0000\u0000\u01ce\u01cf\u0003"+ - "\u000e\u0007\u0000\u01cf\u01d0\u0003\u0184\u00c2\u0000\u01d0\u01d2\u0001"+ - "\u0000\u0000\u0000\u01d1\u01ce\u0001\u0000\u0000\u0000\u01d2\u01d5\u0001"+ - "\u0000\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d4\u01e3\u0001\u0000\u0000\u0000\u01d5\u01d3\u0001"+ - "\u0000\u0000\u0000\u01d6\u01d7\u0005a\u0000\u0000\u01d7\u01e4\u0003\u0010"+ - "\b\u0000\u01d8\u01d9\u0005a\u0000\u0000\u01d9\u01df\u0005f\u0000\u0000"+ - "\u01da\u01db\u0003\u0010\b\u0000\u01db\u01dc\u0003\u0184\u00c2\u0000\u01dc"+ - "\u01de\u0001\u0000\u0000\u0000\u01dd\u01da\u0001\u0000\u0000\u0000\u01de"+ - "\u01e1\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000\u01df"+ - "\u01e0\u0001\u0000\u0000\u0000\u01e0\u01e2\u0001\u0000\u0000\u0000\u01e1"+ - "\u01df\u0001\u0000\u0000\u0000\u01e2\u01e4\u0005g\u0000\u0000\u01e3\u01d6"+ - "\u0001\u0000\u0000\u0000\u01e3\u01d8\u0001\u0000\u0000\u0000\u01e4\u0013"+ - "\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003x<\u0000\u01e6\u01ea\u0003\u008e"+ - "G\u0000\u01e7\u01ea\u0003\u0092I\u0000\u01e8\u01ea\u0003\u008cF\u0000"+ - "\u01e9\u01e5\u0001\u0000\u0000\u0000\u01e9\u01e6\u0001\u0000\u0000\u0000"+ - "\u01e9\u01e7\u0001\u0000\u0000\u0000\u01e9\u01e8\u0001\u0000\u0000\u0000"+ - "\u01ea\u0015\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u001b\u0000\u0000"+ - "\u01ec\u01f3\u0003\u00a4R\u0000\u01ed\u01ee\u0007\u0001\u0000\u0000\u01ee"+ - "\u01f3\u0003,\u0016\u0000\u01ef\u01f0\u0007\u0002\u0000\u0000\u01f0\u01f3"+ - "\u0003\u00a2Q\u0000\u01f1\u01f3\u0003d2\u0000\u01f2\u01eb\u0001\u0000"+ - "\u0000\u0000\u01f2\u01ed\u0001\u0000\u0000\u0000\u01f2\u01ef\u0001\u0000"+ - "\u0000\u0000\u01f2\u01f1\u0001\u0000\u0000\u0000\u01f3\u0017\u0001\u0000"+ - "\u0000\u0000\u01f4\u01f5\u0003\u001a\r\u0000\u01f5\u0019\u0001\u0000\u0000"+ - "\u0000\u01f6\u01f7\u0003\\.\u0000\u01f7\u01f8\u0003\u001c\u000e\u0000"+ - "\u01f8\u001b\u0001\u0000\u0000\u0000\u01f9\u01fa\u0005D\u0000\u0000\u01fa"+ - "\u01fc\u0005f\u0000\u0000\u01fb\u01fd\u0003\u00f4z\u0000\u01fc\u01fb\u0001"+ - "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01fe\u0001"+ - "\u0000\u0000\u0000\u01fe\u01ff\u0005g\u0000\u0000\u01ff\u001d\u0001\u0000"+ - "\u0000\u0000\u0200\u020e\u0003D\"\u0000\u0201\u020e\u0003B!\u0000\u0202"+ - "\u020e\u0003@ \u0000\u0203\u020e\u0003\"\u0011\u0000\u0204\u020e\u0003"+ - ">\u001f\u0000\u0205\u020e\u00036\u001b\u0000\u0206\u020e\u0003<\u001e"+ - "\u0000\u0207\u020e\u00034\u001a\u0000\u0208\u020e\u00030\u0018\u0000\u0209"+ - "\u020e\u0003.\u0017\u0000\u020a\u020e\u00032\u0019\u0000\u020b\u020e\u0003"+ - " \u0010\u0000\u020c\u020e\u0003F#\u0000\u020d\u0200\u0001\u0000\u0000"+ - "\u0000\u020d\u0201\u0001\u0000\u0000\u0000\u020d\u0202\u0001\u0000\u0000"+ - "\u0000\u020d\u0203\u0001\u0000\u0000\u0000\u020d\u0204\u0001\u0000\u0000"+ - "\u0000\u020d\u0205\u0001\u0000\u0000\u0000\u020d\u0206\u0001\u0000\u0000"+ - "\u0000\u020d\u0207\u0001\u0000\u0000\u0000\u020d\u0208\u0001\u0000\u0000"+ - "\u0000\u020d\u0209\u0001\u0000\u0000\u0000\u020d\u020a\u0001\u0000\u0000"+ - "\u0000\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000"+ - "\u0000\u020e\u001f\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0003\u0000"+ - "\u0000\u0210!\u0001\u0000\u0000\u0000\u0211\u0212\u0005^\u0000\u0000\u0212"+ - "\u0213\u0005j\u0000\u0000\u0213\u0214\u0003\u00c2a\u0000\u0214\u0215\u0005"+ - "k\u0000\u0000\u0215#\u0001\u0000\u0000\u0000\u0216\u021b\u0003&\u0013"+ - "\u0000\u0217\u0218\u0005m\u0000\u0000\u0218\u021a\u0003&\u0013\u0000\u0219"+ - "\u0217\u0001\u0000\u0000\u0000\u021a\u021d\u0001\u0000\u0000\u0000\u021b"+ - "\u0219\u0001\u0000\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c"+ - "\u021f\u0001\u0000\u0000\u0000\u021d\u021b\u0001\u0000\u0000\u0000\u021e"+ - "\u0220\u0005m\u0000\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220"+ - "\u0001\u0000\u0000\u0000\u0220%\u0001\u0000\u0000\u0000\u0221\u0226\u0005"+ - "e\u0000\u0000\u0222\u0223\u0005m\u0000\u0000\u0223\u0225\u0005e\u0000"+ - "\u0000\u0224\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000"+ - "\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000"+ - "\u0000\u0227\u0229\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000"+ - "\u0000\u0229\u022a\u0003\u013a\u009d\u0000\u022a\'\u0001\u0000\u0000\u0000"+ - "\u022b\u022d\u0003*\u0015\u0000\u022c\u022b\u0001\u0000\u0000\u0000\u022d"+ - "\u0230\u0001\u0000\u0000\u0000\u022e\u022c\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u0001\u0000\u0000\u0000\u022f)\u0001\u0000\u0000\u0000\u0230\u022e"+ - "\u0001\u0000\u0000\u0000\u0231\u0232\u0005h\u0000\u0000\u0232\u0237\u0003"+ - "\u00a2Q\u0000\u0233\u0234\u0005m\u0000\u0000\u0234\u0236\u0003\u00a2Q"+ - "\u0000\u0235\u0233\u0001\u0000\u0000\u0000\u0236\u0239\u0001\u0000\u0000"+ - "\u0000\u0237\u0235\u0001\u0000\u0000\u0000\u0237\u0238\u0001\u0000\u0000"+ - "\u0000\u0238\u023a\u0001\u0000\u0000\u0000\u0239\u0237\u0001\u0000\u0000"+ - "\u0000\u023a\u023b\u0005i\u0000\u0000\u023b+\u0001\u0000\u0000\u0000\u023c"+ - "\u023d\u0003\u00b2Y\u0000\u023d-\u0001\u0000\u0000\u0000\u023e\u023f\u0005"+ - "1\u0000\u0000\u023f\u0240\u0005f\u0000\u0000\u0240\u0241\u0003\u00a2Q"+ - "\u0000\u0241\u0242\u0005g\u0000\u0000\u0242/\u0001\u0000\u0000\u0000\u0243"+ - "\u0244\u00057\u0000\u0000\u0244\u0245\u0005j\u0000\u0000\u0245\u0246\u0003"+ - "\u00c2a\u0000\u0246\u0247\u0005k\u0000\u0000\u02471\u0001\u0000\u0000"+ - "\u0000\u0248\u0249\u00052\u0000\u0000\u0249\u024a\u0005f\u0000\u0000\u024a"+ - "\u024b\u0003\u00a2Q\u0000\u024b\u024c\u0005g\u0000\u0000\u024c3\u0001"+ - "\u0000\u0000\u0000\u024d\u024e\u0007\u0004\u0000\u0000\u024e\u024f\u0005"+ - "f\u0000\u0000\u024f\u0250\u0003\u00a2Q\u0000\u0250\u0251\u0005g\u0000"+ - "\u0000\u02515\u0001\u0000\u0000\u0000\u0252\u0257\u0005\u0011\u0000\u0000"+ - "\u0253\u0254\u0005j\u0000\u0000\u0254\u0255\u00038\u001c\u0000\u0255\u0256"+ - "\u0005k\u0000\u0000\u0256\u0258\u0001\u0000\u0000\u0000\u0257\u0253\u0001"+ - "\u0000\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u0259\u0001"+ - "\u0000\u0000\u0000\u0259\u025a\u0005f\u0000\u0000\u025a\u025b\u0003\u00a2"+ - "Q\u0000\u025b\u025c\u0005g\u0000\u0000\u025c7\u0001\u0000\u0000\u0000"+ - "\u025d\u0260\u0003:\u001d\u0000\u025e\u0260\u0005\u0013\u0000\u0000\u025f"+ - "\u025d\u0001\u0000\u0000\u0000\u025f\u025e\u0001\u0000\u0000\u0000\u0260"+ - "9\u0001\u0000\u0000\u0000\u0261\u0262\u0005e\u0000\u0000\u0262;\u0001"+ - "\u0000\u0000\u0000\u0263\u0264\u0005\u0012\u0000\u0000\u0264\u0265\u0005"+ - "f\u0000\u0000\u0265\u0266\u0003\u00a2Q\u0000\u0266\u0267\u0005g\u0000"+ - "\u0000\u0267=\u0001\u0000\u0000\u0000\u0268\u0269\u0005:\u0000\u0000\u0269"+ - "\u026a\u0005f\u0000\u0000\u026a\u026b\u0003\u00a2Q\u0000\u026b\u026c\u0005"+ - "g\u0000\u0000\u026c?\u0001\u0000\u0000\u0000\u026d\u026e\u00059\u0000"+ - "\u0000\u026e\u026f\u0005f\u0000\u0000\u026f\u0270\u0003\u00a2Q\u0000\u0270"+ - "\u0271\u0005g\u0000\u0000\u0271A\u0001\u0000\u0000\u0000\u0272\u0273\u0005"+ - "\u0016\u0000\u0000\u0273\u0274\u0005f\u0000\u0000\u0274\u0277\u0003\u00a2"+ - "Q\u0000\u0275\u0276\u0005m\u0000\u0000\u0276\u0278\u0003\u00a2Q\u0000"+ - "\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000\u0000\u0000"+ - "\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0005g\u0000\u0000\u027a"+ - "C\u0001\u0000\u0000\u0000\u027b\u027c\u0007\u0004\u0000\u0000\u027c\u027d"+ - "\u0005j\u0000\u0000\u027d\u027e\u0003\u00a2Q\u0000\u027e\u027f\u0005="+ - "\u0000\u0000\u027f\u0280\u0003\u00a2Q\u0000\u0280\u0281\u0005k\u0000\u0000"+ - "\u0281E\u0001\u0000\u0000\u0000\u0282\u0283\u00056\u0000\u0000\u0283\u0284"+ - "\u0003\u00a2Q\u0000\u0284\u028a\u0005h\u0000\u0000\u0285\u0286\u0003H"+ - "$\u0000\u0286\u0287\u0003\u0184\u00c2\u0000\u0287\u0289\u0001\u0000\u0000"+ - "\u0000\u0288\u0285\u0001\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000"+ - "\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000"+ - "\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000"+ - "\u0000\u028d\u028e\u0005i\u0000\u0000\u028eG\u0001\u0000\u0000\u0000\u028f"+ - "\u0290\u0003h4\u0000\u0290\u0291\u0005o\u0000\u0000\u0291\u0292\u0003"+ - "\u00a2Q\u0000\u0292I\u0001\u0000\u0000\u0000\u0293\u0294\u0005j\u0000"+ - "\u0000\u0294\u0299\u0003L&\u0000\u0295\u0296\u0005m\u0000\u0000\u0296"+ - "\u0298\u0003L&\u0000\u0297\u0295\u0001\u0000\u0000\u0000\u0298\u029b\u0001"+ - "\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u029a\u0001"+ - "\u0000\u0000\u0000\u029a\u029c\u0001\u0000\u0000\u0000\u029b\u0299\u0001"+ - "\u0000\u0000\u0000\u029c\u029d\u0005k\u0000\u0000\u029dK\u0001\u0000\u0000"+ - "\u0000\u029e\u029f\u0003\u00a2Q\u0000\u029f\u02a0\u0005l\u0000\u0000\u02a0"+ - "\u02a1\u0003\u00a2Q\u0000\u02a1M\u0001\u0000\u0000\u0000\u02a2\u02a7\u0003"+ - "Z-\u0000\u02a3\u02a7\u0003X,\u0000\u02a4\u02a7\u0003P(\u0000\u02a5\u02a7"+ - "\u0003T*\u0000\u02a6\u02a2\u0001\u0000\u0000\u0000\u02a6\u02a3\u0001\u0000"+ - "\u0000\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a5\u0001\u0000"+ - "\u0000\u0000\u02a7O\u0001\u0000\u0000\u0000\u02a8\u02a9\u00053\u0000\u0000"+ - "\u02a9\u02af\u0005h\u0000\u0000\u02aa\u02ab\u0003R)\u0000\u02ab\u02ac"+ - "\u0003\u0184\u00c2\u0000\u02ac\u02ae\u0001\u0000\u0000\u0000\u02ad\u02aa"+ - "\u0001\u0000\u0000\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad"+ - "\u0001\u0000\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b2"+ - "\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b3"+ - "\u0005i\u0000\u0000\u02b3Q\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005M"+ - "\u0000\u0000\u02b5\u02b6\u0005e\u0000\u0000\u02b6\u02be\u0003\u014a\u00a5"+ - "\u0000\u02b7\u02b8\u00054\u0000\u0000\u02b8\u02b9\u0005h\u0000\u0000\u02b9"+ - "\u02ba\u0003\u00a2Q\u0000\u02ba\u02bb\u0003\u0184\u00c2\u0000\u02bb\u02bc"+ - "\u0005i\u0000\u0000\u02bc\u02be\u0001\u0000\u0000\u0000\u02bd\u02b4\u0001"+ - "\u0000\u0000\u0000\u02bd\u02b7\u0001\u0000\u0000\u0000\u02beS\u0001\u0000"+ - "\u0000\u0000\u02bf\u02c0\u00055\u0000\u0000\u02c0\u02c6\u0005h\u0000\u0000"+ - "\u02c1\u02c2\u0003V+\u0000\u02c2\u02c3\u0003\u0184\u00c2\u0000\u02c3\u02c5"+ - "\u0001\u0000\u0000\u0000\u02c4\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c8"+ - "\u0001\u0000\u0000\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7"+ - "\u0001\u0000\u0000\u0000\u02c7\u02c9\u0001\u0000\u0000\u0000\u02c8\u02c6"+ - "\u0001\u0000\u0000\u0000\u02c9\u02ca\u0005i\u0000\u0000\u02caU\u0001\u0000"+ - "\u0000\u0000\u02cb\u02cc\u0005e\u0000\u0000\u02cc\u02d2\u0005h\u0000\u0000"+ - "\u02cd\u02ce\u0003\u0174\u00ba\u0000\u02ce\u02cf\u0003\u0184\u00c2\u0000"+ - "\u02cf\u02d1\u0001\u0000\u0000\u0000\u02d0\u02cd\u0001\u0000\u0000\u0000"+ - "\u02d1\u02d4\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000"+ - "\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000"+ - "\u02d4\u02d2\u0001\u0000\u0000\u0000\u02d5\u02d6\u0005i\u0000\u0000\u02d6"+ - "W\u0001\u0000\u0000\u0000\u02d7\u02d8\u0005\u001b\u0000\u0000\u02d8\u02d9"+ - "\u0005j\u0000\u0000\u02d9\u02da\u0005k\u0000\u0000\u02da\u02db\u0003\u013a"+ - "\u009d\u0000\u02dbY\u0001\u0000\u0000\u0000\u02dc\u02dd\u0007\u0005\u0000"+ - "\u0000\u02dd\u02de\u0005j\u0000\u0000\u02de\u02df\u0003\u00c2a\u0000\u02df"+ - "\u02e0\u0005k\u0000\u0000\u02e0\u02e8\u0001\u0000\u0000\u0000\u02e1\u02e2"+ - "\u0005+\u0000\u0000\u02e2\u02e3\u0005j\u0000\u0000\u02e3\u02e4\u0003\u00c2"+ - "a\u0000\u02e4\u02e5\u0005k\u0000\u0000\u02e5\u02e6\u0003\u00c2a\u0000"+ - "\u02e6\u02e8\u0001\u0000\u0000\u0000\u02e7\u02dc\u0001\u0000\u0000\u0000"+ - "\u02e7\u02e1\u0001\u0000\u0000\u0000\u02e8[\u0001\u0000\u0000\u0000\u02e9"+ - "\u02ef\u0003^/\u0000\u02ea\u02eb\u0005\u000e\u0000\u0000\u02eb\u02ef\u0006"+ - ".\uffff\uffff\u0000\u02ec\u02ed\u0005C\u0000\u0000\u02ed\u02ef\u0006."+ - "\uffff\uffff\u0000\u02ee\u02e9\u0001\u0000\u0000\u0000\u02ee\u02ea\u0001"+ - "\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001"+ - "\u0000\u0000\u0000\u02f0\u02f2\u0003\u0184\u00c2\u0000\u02f1\u02ee\u0001"+ - "\u0000\u0000\u0000\u02f2\u02f5\u0001\u0000\u0000\u0000\u02f3\u02f4\u0001"+ - "\u0000\u0000\u0000\u02f3\u02f1\u0001\u0000\u0000\u0000\u02f4\u02f8\u0001"+ - "\u0000\u0000\u0000\u02f5\u02f3\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005"+ - "\u000e\u0000\u0000\u02f7\u02f9\u0006.\uffff\uffff\u0000\u02f8\u02f6\u0001"+ - "\u0000\u0000\u0000\u02f8\u02f9\u0001\u0000\u0000\u0000\u02f9]\u0001\u0000"+ - "\u0000\u0000\u02fa\u02fb\u0005\t\u0000\u0000\u02fb\u0303\u0003b1\u0000"+ - "\u02fc\u02fd\u0005\n\u0000\u0000\u02fd\u0303\u0003b1\u0000\u02fe\u02ff"+ - "\u0005\u000b\u0000\u0000\u02ff\u0303\u0003b1\u0000\u0300\u0301\u0005\r"+ - "\u0000\u0000\u0301\u0303\u0003`0\u0000\u0302\u02fa\u0001\u0000\u0000\u0000"+ - "\u0302\u02fc\u0001\u0000\u0000\u0000\u0302\u02fe\u0001\u0000\u0000\u0000"+ - "\u0302\u0300\u0001\u0000\u0000\u0000\u0303_\u0001\u0000\u0000\u0000\u0304"+ - "\u0306\u0003\u00e6s\u0000\u0305\u0304\u0001\u0000\u0000\u0000\u0305\u0306"+ - "\u0001\u0000\u0000\u0000\u0306\u0309\u0001\u0000\u0000\u0000\u0307\u0308"+ - "\u0005\\\u0000\u0000\u0308\u030a\u0003\u00a2Q\u0000\u0309\u0307\u0001"+ - "\u0000\u0000\u0000\u0309\u030a\u0001\u0000\u0000\u0000\u030aa\u0001\u0000"+ - "\u0000\u0000\u030b\u030e\u0001\u0000\u0000\u0000\u030c\u030e\u0003\u00a2"+ - "Q\u0000\u030d\u030b\u0001\u0000\u0000\u0000\u030d\u030c\u0001\u0000\u0000"+ - "\u0000\u030ec\u0001\u0000\u0000\u0000\u030f\u0310\u00056\u0000\u0000\u0310"+ - "\u0311\u0003\u00a2Q\u0000\u0311\u0315\u0005h\u0000\u0000\u0312\u0314\u0003"+ - "f3\u0000\u0313\u0312\u0001\u0000\u0000\u0000\u0314\u0317\u0001\u0000\u0000"+ - "\u0000\u0315\u0313\u0001\u0000\u0000\u0000\u0315\u0316\u0001\u0000\u0000"+ - "\u0000\u0316\u0318\u0001\u0000\u0000\u0000\u0317\u0315\u0001\u0000\u0000"+ - "\u0000\u0318\u0319\u0005i\u0000\u0000\u0319e\u0001\u0000\u0000\u0000\u031a"+ - "\u031b\u0003h4\u0000\u031b\u031d\u0005o\u0000\u0000\u031c\u031e\u0003"+ - "\u00f4z\u0000\u031d\u031c\u0001\u0000\u0000\u0000\u031d\u031e\u0001\u0000"+ - "\u0000\u0000\u031eg\u0001\u0000\u0000\u0000\u031f\u0320\u0005P\u0000\u0000"+ - "\u0320\u0323\u0003j5\u0000\u0321\u0323\u0005L\u0000\u0000\u0322\u031f"+ - "\u0001\u0000\u0000\u0000\u0322\u0321\u0001\u0000\u0000\u0000\u0323i\u0001"+ - "\u0000\u0000\u0000\u0324\u0325\u0005%\u0000\u0000\u0325\u0332\u0005e\u0000"+ - "\u0000\u0326\u0327\u0003\u00cae\u0000\u0327\u032c\u0005h\u0000\u0000\u0328"+ - "\u032a\u0003l6\u0000\u0329\u032b\u0005m\u0000\u0000\u032a\u0329\u0001"+ - "\u0000\u0000\u0000\u032a\u032b\u0001\u0000\u0000\u0000\u032b\u032d\u0001"+ - "\u0000\u0000\u0000\u032c\u0328\u0001\u0000\u0000\u0000\u032c\u032d\u0001"+ - "\u0000\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000\u032e\u032f\u0005"+ - "i\u0000\u0000\u032f\u0332\u0001\u0000\u0000\u0000\u0330\u0332\u0003\u00a2"+ - "Q\u0000\u0331\u0324\u0001\u0000\u0000\u0000\u0331\u0326\u0001\u0000\u0000"+ - "\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0332k\u0001\u0000\u0000\u0000"+ - "\u0333\u0338\u0003j5\u0000\u0334\u0335\u0005m\u0000\u0000\u0335\u0337"+ - "\u0003j5\u0000\u0336\u0334\u0001\u0000\u0000\u0000\u0337\u033a\u0001\u0000"+ - "\u0000\u0000\u0338\u0336\u0001\u0000\u0000\u0000\u0338\u0339\u0001\u0000"+ - "\u0000\u0000\u0339m\u0001\u0000\u0000\u0000\u033a\u0338\u0001\u0000\u0000"+ - "\u0000\u033b\u0340\u0005h\u0000\u0000\u033c\u033d\u0005;\u0000\u0000\u033d"+ - "\u033e\u0003\u00e4r\u0000\u033e\u033f\u0003\u0184\u00c2\u0000\u033f\u0341"+ - "\u0001\u0000\u0000\u0000\u0340\u033c\u0001\u0000\u0000\u0000\u0340\u0341"+ - "\u0001\u0000\u0000\u0000\u0341\u0343\u0001\u0000\u0000\u0000\u0342\u0344"+ - "\u0003\u00f4z\u0000\u0343\u0342\u0001\u0000\u0000\u0000\u0343\u0344\u0001"+ - "\u0000\u0000\u0000\u0344\u0345\u0001\u0000\u0000\u0000\u0345\u0346\u0005"+ - "i\u0000\u0000\u0346o\u0001\u0000\u0000\u0000\u0347\u034a\u0003\u0164\u00b2"+ - "\u0000\u0348\u034a\u0005e\u0000\u0000\u0349\u0347\u0001\u0000\u0000\u0000"+ - "\u0349\u0348\u0001\u0000\u0000\u0000\u034a\u0353\u0001\u0000\u0000\u0000"+ - "\u034b\u0350\u0005h\u0000\u0000\u034c\u034e\u0003r9\u0000\u034d\u034f"+ - "\u0005m\u0000\u0000\u034e\u034d\u0001\u0000\u0000\u0000\u034e\u034f\u0001"+ - "\u0000\u0000\u0000\u034f\u0351\u0001\u0000\u0000\u0000\u0350\u034c\u0001"+ - "\u0000\u0000\u0000\u0350\u0351\u0001\u0000\u0000\u0000\u0351\u0352\u0001"+ - "\u0000\u0000\u0000\u0352\u0354\u0005i\u0000\u0000\u0353\u034b\u0001\u0000"+ - "\u0000\u0000\u0353\u0354\u0001\u0000\u0000\u0000\u0354q\u0001\u0000\u0000"+ - "\u0000\u0355\u035a\u0003t:\u0000\u0356\u0357\u0005m\u0000\u0000\u0357"+ - "\u0359\u0003t:\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0359\u035c\u0001"+ - "\u0000\u0000\u0000\u035a\u0358\u0001\u0000\u0000\u0000\u035a\u035b\u0001"+ - "\u0000\u0000\u0000\u035bs\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000"+ - "\u0000\u0000\u035d\u035e\u0005e\u0000\u0000\u035e\u0360\u0005o\u0000\u0000"+ - "\u035f\u035d\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000"+ - "\u0360\u0361\u0001\u0000\u0000\u0000\u0361\u0362\u0003\u00a2Q\u0000\u0362"+ - "u\u0001\u0000\u0000\u0000\u0363\u0364\u0005G\u0000\u0000\u0364\u0365\u0003"+ - "\u00a2Q\u0000\u0365\u0366\u0005\u000f\u0000\u0000\u0366\u0367\u0003p8"+ - "\u0000\u0367\u0368\u0003\u00f2y\u0000\u0368w\u0001\u0000\u0000\u0000\u0369"+ - "\u036a\u0003\u00c2a\u0000\u036a\u036b\u0005\u000f\u0000\u0000\u036b\u037e"+ - "\u0003\u00c2a\u0000\u036c\u0372\u0005h\u0000\u0000\u036d\u036e\u0003\u0080"+ - "@\u0000\u036e\u036f\u0003\u0184\u00c2\u0000\u036f\u0371\u0001\u0000\u0000"+ - "\u0000\u0370\u036d\u0001\u0000\u0000\u0000\u0371\u0374\u0001\u0000\u0000"+ - "\u0000\u0372\u0370\u0001\u0000\u0000\u0000\u0372\u0373\u0001\u0000\u0000"+ - "\u0000\u0373\u037a\u0001\u0000\u0000\u0000\u0374\u0372\u0001\u0000\u0000"+ - "\u0000\u0375\u0376\u0003z=\u0000\u0376\u0377\u0003\u0184\u00c2\u0000\u0377"+ - "\u0379\u0001\u0000\u0000\u0000\u0378\u0375\u0001\u0000\u0000\u0000\u0379"+ - "\u037c\u0001\u0000\u0000\u0000\u037a\u0378\u0001\u0000\u0000\u0000\u037a"+ - "\u037b\u0001\u0000\u0000\u0000\u037b\u037d\u0001\u0000\u0000\u0000\u037c"+ - "\u037a\u0001\u0000\u0000\u0000\u037d\u037f\u0005i\u0000\u0000\u037e\u036c"+ - "\u0001\u0000\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037fy\u0001"+ - "\u0000\u0000\u0000\u0380\u0382\u0005\u000e\u0000\u0000\u0381\u0380\u0001"+ - "\u0000\u0000\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0001"+ - "\u0000\u0000\u0000\u0383\u0384\u0003|>\u0000\u0384\u0385\u0005e\u0000"+ - "\u0000\u0385\u0387\u0003\u014a\u00a5\u0000\u0386\u0388\u0003\u00f2y\u0000"+ - "\u0387\u0386\u0001\u0000\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000"+ - "\u0388{\u0001\u0000\u0000\u0000\u0389\u038b\u0005f\u0000\u0000\u038a\u038c"+ - "\u0005e\u0000\u0000\u038b\u038a\u0001\u0000\u0000\u0000\u038b\u038c\u0001"+ - "\u0000\u0000\u0000\u038c\u038e\u0001\u0000\u0000\u0000\u038d\u038f\u0005"+ - "\u0087\u0000\u0000\u038e\u038d\u0001\u0000\u0000\u0000\u038e\u038f\u0001"+ - "\u0000\u0000\u0000\u038f\u0390\u0001\u0000\u0000\u0000\u0390\u0391\u0003"+ - "\u0130\u0098\u0000\u0391\u0392\u0005g\u0000\u0000\u0392}\u0001\u0000\u0000"+ - "\u0000\u0393\u0399\u0003\u00b2Y\u0000\u0394\u0395\u0003\u00c2a\u0000\u0395"+ - "\u0396\u0005p\u0000\u0000\u0396\u0397\u0005e\u0000\u0000\u0397\u0399\u0001"+ - "\u0000\u0000\u0000\u0398\u0393\u0001\u0000\u0000\u0000\u0398\u0394\u0001"+ - "\u0000\u0000\u0000\u0399\u007f\u0001\u0000\u0000\u0000\u039a\u039b\u0005"+ - "8\u0000\u0000\u039b\u039c\u0005e\u0000\u0000\u039c\u039f\u0005s\u0000"+ - "\u0000\u039d\u03a0\u0003~?\u0000\u039e\u03a0\u0003\u0162\u00b1\u0000\u039f"+ - "\u039d\u0001\u0000\u0000\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u03a0"+ - "\u0081\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005/\u0000\u0000\u03a2\u03a3"+ - "\u0005f\u0000\u0000\u03a3\u03a6\u0003\u00c2a\u0000\u03a4\u03a5\u0005m"+ - "\u0000\u0000\u03a5\u03a7\u0003\u00e6s\u0000\u03a6\u03a4\u0001\u0000\u0000"+ - "\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u03a8\u0001\u0000\u0000"+ - "\u0000\u03a8\u03a9\u0005g\u0000\u0000\u03a9\u0083\u0001\u0000\u0000\u0000"+ - "\u03aa\u03ab\u0005.\u0000\u0000\u03ab\u03ac\u0005f\u0000\u0000\u03ac\u03ad"+ - "\u0003\u00c2a\u0000\u03ad\u03ae\u0005g\u0000\u0000\u03ae\u0085\u0001\u0000"+ - "\u0000\u0000\u03af\u03b2\u0003\\.\u0000\u03b0\u03b3\u0003\u0088D\u0000"+ - "\u03b1\u03b3\u0003\u008aE\u0000\u03b2\u03b0\u0001\u0000\u0000\u0000\u03b2"+ - "\u03b1\u0001\u0000\u0000\u0000\u03b3\u0087\u0001\u0000\u0000\u0000\u03b4"+ - "\u03b5\u0005M\u0000\u0000\u03b5\u03b7\u0005e\u0000\u0000\u03b6\u03b8\u0003"+ - "\u0150\u00a8\u0000\u03b7\u03b6\u0001\u0000\u0000\u0000\u03b7\u03b8\u0001"+ - "\u0000\u0000\u0000\u03b8\u03b9\u0001\u0000\u0000\u0000\u03b9\u03bb\u0003"+ - "\u014a\u00a5\u0000\u03ba\u03bc\u0003n7\u0000\u03bb\u03ba\u0001\u0000\u0000"+ - "\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u0089\u0001\u0000\u0000"+ - "\u0000\u03bd\u03be\u0005M\u0000\u0000\u03be\u03bf\u0003\u0098L\u0000\u03bf"+ - "\u03c0\u0005e\u0000\u0000\u03c0\u03c2\u0003\u014a\u00a5\u0000\u03c1\u03c3"+ - "\u0003n7\u0000\u03c2\u03c1\u0001\u0000\u0000\u0000\u03c2\u03c3\u0001\u0000"+ - "\u0000\u0000\u03c3\u008b\u0001\u0000\u0000\u0000\u03c4\u03c7\u0005\u001b"+ - "\u0000\u0000\u03c5\u03c8\u0003\u0086C\u0000\u03c6\u03c8\u0003\u00deo\u0000"+ - "\u03c7\u03c5\u0001\u0000\u0000\u0000\u03c7\u03c6\u0001\u0000\u0000\u0000"+ - "\u03c8\u008d\u0001\u0000\u0000\u0000\u03c9\u03ca\u00058\u0000\u0000\u03ca"+ - "\u03cb\u0005e\u0000\u0000\u03cb\u03cd\u0003\u014e\u00a7\u0000\u03cc\u03ce"+ - "\u0003\u0090H\u0000\u03cd\u03cc\u0001\u0000\u0000\u0000\u03cd\u03ce\u0001"+ - "\u0000\u0000\u0000\u03ce\u008f\u0001\u0000\u0000\u0000\u03cf\u03d0\u0005"+ - "h\u0000\u0000\u03d0\u03d1\u0003\u00a2Q\u0000\u03d1\u03d2\u0003\u0184\u00c2"+ - "\u0000\u03d2\u03d3\u0005i\u0000\u0000\u03d3\u0091\u0001\u0000\u0000\u0000"+ - "\u03d4\u03d5\u00058\u0000\u0000\u03d5\u03d6\u0003\u0098L\u0000\u03d6\u03d7"+ - "\u0005e\u0000\u0000\u03d7\u03d9\u0003\u014e\u00a7\u0000\u03d8\u03da\u0003"+ - "\u0090H\u0000\u03d9\u03d8\u0001\u0000\u0000\u0000\u03d9\u03da\u0001\u0000"+ - "\u0000\u0000\u03da\u0093\u0001\u0000\u0000\u0000\u03db\u03e3\u0003\u0006"+ - "\u0003\u0000\u03dc\u03df\u0003\u00c2a\u0000\u03dd\u03de\u0005l\u0000\u0000"+ - "\u03de\u03e0\u0003\u00e6s\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03df"+ - "\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e4\u0001\u0000\u0000\u0000\u03e1"+ - "\u03e2\u0005l\u0000\u0000\u03e2\u03e4\u0003\u00e6s\u0000\u03e3\u03dc\u0001"+ - "\u0000\u0000\u0000\u03e3\u03e1\u0001\u0000\u0000\u0000\u03e4\u0095\u0001"+ - "\u0000\u0000\u0000\u03e5\u03e6\u0003\u0006\u0003\u0000\u03e6\u03e7\u0005"+ - "s\u0000\u0000\u03e7\u03e8\u0003\u00e6s\u0000\u03e8\u0097\u0001\u0000\u0000"+ - "\u0000\u03e9\u03eb\u0005f\u0000\u0000\u03ea\u03ec\u0003\b\u0004\u0000"+ - "\u03eb\u03ea\u0001\u0000\u0000\u0000\u03eb\u03ec\u0001\u0000\u0000\u0000"+ - "\u03ec\u03ed\u0001\u0000\u0000\u0000\u03ed\u03ef\u0003\u00c2a\u0000\u03ee"+ - "\u03f0\u0005m\u0000\u0000\u03ef\u03ee\u0001\u0000\u0000\u0000\u03ef\u03f0"+ - "\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000\u03f1\u03f2"+ - "\u0005g\u0000\u0000\u03f2\u0099\u0001\u0000\u0000\u0000\u03f3\u03f6\u0003"+ - "\u009cN\u0000\u03f4\u03f6\u0003\u009eO\u0000\u03f5\u03f3\u0001\u0000\u0000"+ - "\u0000\u03f5\u03f4\u0001\u0000\u0000\u0000\u03f6\u009b\u0001\u0000\u0000"+ - "\u0000\u03f7\u03f9\u0003\u00e4r\u0000\u03f8\u03f7\u0001\u0000\u0000\u0000"+ - "\u03f8\u03f9\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000"+ - "\u03fa\u03fb\u0003\u00a0P\u0000\u03fb\u009d\u0001\u0000\u0000\u0000\u03fc"+ - "\u03fe\u0005\u001b\u0000\u0000\u03fd\u03ff\u0003\u00e4r\u0000\u03fe\u03fd"+ - "\u0001\u0000\u0000\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400"+ - "\u0001\u0000\u0000\u0000\u0400\u0401\u0003\u00a0P\u0000\u0401\u009f\u0001"+ - "\u0000\u0000\u0000\u0402\u0404\u0005t\u0000\u0000\u0403\u0402\u0001\u0000"+ - "\u0000\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0001\u0000"+ - "\u0000\u0000\u0405\u0406\u0003\u00c2a\u0000\u0406\u00a1\u0001\u0000\u0000"+ - "\u0000\u0407\u0408\u0006Q\uffff\uffff\u0000\u0408\u0409\u0007\u0006\u0000"+ - "\u0000\u0409\u041d\u0003\u00a2Q\u000f\u040a\u041d\u0003\u00b2Y\u0000\u040b"+ - "\u040c\u0005\u0019\u0000\u0000\u040c\u040d\u0003,\u0016\u0000\u040d\u040e"+ - "\u0005\u001c\u0000\u0000\u040e\u040f\u0003\u00a2Q\u0003\u040f\u041d\u0001"+ - "\u0000\u0000\u0000\u0410\u0411\u0005\u001a\u0000\u0000\u0411\u0412\u0003"+ - "\u0096K\u0000\u0412\u0413\u0005\u001c\u0000\u0000\u0413\u0414\u0003\u00a2"+ - "Q\u0002\u0414\u041d\u0001\u0000\u0000\u0000\u0415\u0416\u0007\u0007\u0000"+ - "\u0000\u0416\u0417\u0003$\u0012\u0000\u0417\u0418\u0005o\u0000\u0000\u0418"+ - "\u0419\u0005o\u0000\u0000\u0419\u041a\u0003(\u0014\u0000\u041a\u041b\u0003"+ - "\u00a2Q\u0001\u041b\u041d\u0001\u0000\u0000\u0000\u041c\u0407\u0001\u0000"+ - "\u0000\u0000\u041c\u040a\u0001\u0000\u0000\u0000\u041c\u040b\u0001\u0000"+ - "\u0000\u0000\u041c\u0410\u0001\u0000\u0000\u0000\u041c\u0415\u0001\u0000"+ - "\u0000\u0000\u041d\u0441\u0001\u0000\u0000\u0000\u041e\u041f\n\r\u0000"+ - "\u0000\u041f\u0420\u0007\b\u0000\u0000\u0420\u0440\u0003\u00a2Q\u000e"+ - "\u0421\u0422\n\f\u0000\u0000\u0422\u0423\u0007\t\u0000\u0000\u0423\u0440"+ - "\u0003\u00a2Q\r\u0424\u0425\n\u000b\u0000\u0000\u0425\u0426\u0007\n\u0000"+ - "\u0000\u0426\u0440\u0003\u00a2Q\f\u0427\u0428\n\n\u0000\u0000\u0428\u0429"+ - "\u0007\u000b\u0000\u0000\u0429\u0440\u0003\u00a2Q\u000b\u042a\u042b\n"+ - "\t\u0000\u0000\u042b\u042c\u0007\f\u0000\u0000\u042c\u0440\u0003\u00a2"+ - "Q\n\u042d\u042e\n\u0007\u0000\u0000\u042e\u042f\u0005v\u0000\u0000\u042f"+ - "\u0440\u0003\u00a2Q\b\u0430\u0431\n\u0006\u0000\u0000\u0431\u0432\u0005"+ - "u\u0000\u0000\u0432\u0440\u0003\u00a2Q\u0007\u0433\u0434\n\u0005\u0000"+ - "\u0000\u0434\u0435\u0005\"\u0000\u0000\u0435\u0440\u0003\u00a2Q\u0005"+ - "\u0436\u0437\n\u0004\u0000\u0000\u0437\u0438\u0005%\u0000\u0000\u0438"+ - "\u0439\u0003\u00a2Q\u0000\u0439\u043a\u0005o\u0000\u0000\u043a\u043b\u0003"+ - "\u00a2Q\u0004\u043b\u0440\u0001\u0000\u0000\u0000\u043c\u043d\n\b\u0000"+ - "\u0000\u043d\u043e\u0005\u000f\u0000\u0000\u043e\u0440\u0003p8\u0000\u043f"+ - "\u041e\u0001\u0000\u0000\u0000\u043f\u0421\u0001\u0000\u0000\u0000\u043f"+ - "\u0424\u0001\u0000\u0000\u0000\u043f\u0427\u0001\u0000\u0000\u0000\u043f"+ - "\u042a\u0001\u0000\u0000\u0000\u043f\u042d\u0001\u0000\u0000\u0000\u043f"+ - "\u0430\u0001\u0000\u0000\u0000\u043f\u0433\u0001\u0000\u0000\u0000\u043f"+ - "\u0436\u0001\u0000\u0000\u0000\u043f\u043c\u0001\u0000\u0000\u0000\u0440"+ - "\u0443\u0001\u0000\u0000\u0000\u0441\u043f\u0001\u0000\u0000\u0000\u0441"+ - "\u0442\u0001\u0000\u0000\u0000\u0442\u00a3\u0001\u0000\u0000\u0000\u0443"+ - "\u0441\u0001\u0000\u0000\u0000\u0444\u0459\u0003\u0016\u000b\u0000\u0445"+ - "\u0459\u0003\u0018\f\u0000\u0446\u0459\u0003\u00a8T\u0000\u0447\u0459"+ - "\u0003\u00a6S\u0000\u0448\u0459\u0003\u00deo\u0000\u0449\u0459\u0003\u0102"+ - "\u0081\u0000\u044a\u0459\u0003\u00f6{\u0000\u044b\u0459\u0003\u012e\u0097"+ - "\u0000\u044c\u0459\u0003\u0104\u0082\u0000\u044d\u0459\u0003\u0106\u0083"+ - "\u0000\u044e\u0459\u0003\u0108\u0084\u0000\u044f\u0459\u0003\u010a\u0085"+ - "\u0000\u0450\u0459\u0003\u010c\u0086\u0000\u0451\u0459\u0003\u00f2y\u0000"+ - "\u0452\u0459\u0003\u010e\u0087\u0000\u0453\u0459\u0003\u0110\u0088\u0000"+ - "\u0454\u0459\u0003\u0122\u0091\u0000\u0455\u0459\u0003\u00aaU\u0000\u0456"+ - "\u0459\u0003\u00aeW\u0000\u0457\u0459\u0003v;\u0000\u0458\u0444\u0001"+ - "\u0000\u0000\u0000\u0458\u0445\u0001\u0000\u0000\u0000\u0458\u0446\u0001"+ - "\u0000\u0000\u0000\u0458\u0447\u0001\u0000\u0000\u0000\u0458\u0448\u0001"+ - "\u0000\u0000\u0000\u0458\u0449\u0001\u0000\u0000\u0000\u0458\u044a\u0001"+ - "\u0000\u0000\u0000\u0458\u044b\u0001\u0000\u0000\u0000\u0458\u044c\u0001"+ - "\u0000\u0000\u0000\u0458\u044d\u0001\u0000\u0000\u0000\u0458\u044e\u0001"+ - "\u0000\u0000\u0000\u0458\u044f\u0001\u0000\u0000\u0000\u0458\u0450\u0001"+ - "\u0000\u0000\u0000\u0458\u0451\u0001\u0000\u0000\u0000\u0458\u0452\u0001"+ - "\u0000\u0000\u0000\u0458\u0453\u0001\u0000\u0000\u0000\u0458\u0454\u0001"+ - "\u0000\u0000\u0000\u0458\u0455\u0001\u0000\u0000\u0000\u0458\u0456\u0001"+ - "\u0000\u0000\u0000\u0458\u0457\u0001\u0000\u0000\u0000\u0459\u00a5\u0001"+ - "\u0000\u0000\u0000\u045a\u045b\u0005$\u0000\u0000\u045b\u045c\u0003\u00a2"+ - "Q\u0000\u045c\u00a7\u0001\u0000\u0000\u0000\u045d\u045e\u0005X\u0000\u0000"+ - "\u045e\u0460\u0003\u00a2Q\u0000\u045f\u0461\u0003\u00f2y\u0000\u0460\u045f"+ - "\u0001\u0000\u0000\u0000\u0460\u0461\u0001\u0000\u0000\u0000\u0461\u00a9"+ - "\u0001\u0000\u0000\u0000\u0462\u0463\u0003\u00acV\u0000\u0463\u0464\u0003"+ - "\u012a\u0095\u0000\u0464\u00ab\u0001\u0000\u0000\u0000\u0465\u0466\u0005"+ - "\f\u0000\u0000\u0466\u0467\u0003\u00a2Q\u0000\u0467\u0468\u0003\u0184"+ - "\u00c2\u0000\u0468\u046a\u0001\u0000\u0000\u0000\u0469\u0465\u0001\u0000"+ - "\u0000\u0000\u046a\u046d\u0001\u0000\u0000\u0000\u046b\u0469\u0001\u0000"+ - "\u0000\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u0472\u0001\u0000"+ - "\u0000\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046e\u046f\u0005\r\u0000"+ - "\u0000\u046f\u0470\u0003`0\u0000\u0470\u0471\u0003\u0184\u00c2\u0000\u0471"+ - "\u0473\u0001\u0000\u0000\u0000\u0472\u046e\u0001\u0000\u0000\u0000\u0472"+ - "\u0473\u0001\u0000\u0000\u0000\u0473\u00ad\u0001\u0000\u0000\u0000\u0474"+ - "\u0475\u0005Q\u0000\u0000\u0475\u047a\u0003\u00a2Q\u0000\u0476\u0477\u0005"+ - "Q\u0000\u0000\u0477\u0478\u0007\u0001\u0000\u0000\u0478\u047a\u0003,\u0016"+ - "\u0000\u0479\u0474\u0001\u0000\u0000\u0000\u0479\u0476\u0001\u0000\u0000"+ - "\u0000\u047a\u00af\u0001\u0000\u0000\u0000\u047b\u0484\u0005\u0003\u0000"+ - "\u0000\u047c\u0484\u0005\u0004\u0000\u0000\u047d\u0484\u0005d\u0000\u0000"+ - "\u047e\u0484\u0003\u0160\u00b0\u0000\u047f\u0484\u0003\u0176\u00bb\u0000"+ - "\u0480\u0484\u0005\u0001\u0000\u0000\u0481\u0484\u0005\u008f\u0000\u0000"+ - "\u0482\u0484\u0005\u0090\u0000\u0000\u0483\u047b\u0001\u0000\u0000\u0000"+ - "\u0483\u047c\u0001\u0000\u0000\u0000\u0483\u047d\u0001\u0000\u0000\u0000"+ - "\u0483\u047e\u0001\u0000\u0000\u0000\u0483\u047f\u0001\u0000\u0000\u0000"+ - "\u0483\u0480\u0001\u0000\u0000\u0000\u0483\u0481\u0001\u0000\u0000\u0000"+ - "\u0483\u0482\u0001\u0000\u0000\u0000\u0484\u00b1\u0001\u0000\u0000\u0000"+ - "\u0485\u0486\u0006Y\uffff\uffff\u0000\u0486\u0492\u0003\u015c\u00ae\u0000"+ - "\u0487\u0492\u0003\u0158\u00ac\u0000\u0488\u0492\u0003\u0180\u00c0\u0000"+ - "\u0489\u0492\u0003\u001e\u000f\u0000\u048a\u0492\u0003\u0084B\u0000\u048b"+ - "\u0492\u0003\u0082A\u0000\u048c\u048d\u0007\r\u0000\u0000\u048d\u048e"+ - "\u0005f\u0000\u0000\u048e\u048f\u0003\u00a2Q\u0000\u048f\u0490\u0005g"+ - "\u0000\u0000\u0490\u0492\u0001\u0000\u0000\u0000\u0491\u0485\u0001\u0000"+ - "\u0000\u0000\u0491\u0487\u0001\u0000\u0000\u0000\u0491\u0488\u0001\u0000"+ - "\u0000\u0000\u0491\u0489\u0001\u0000\u0000\u0000\u0491\u048a\u0001\u0000"+ - "\u0000\u0000\u0491\u048b\u0001\u0000\u0000\u0000\u0491\u048c\u0001\u0000"+ - "\u0000\u0000\u0492\u04a9\u0001\u0000\u0000\u0000\u0493\u0494\n\t\u0000"+ - "\u0000\u0494\u0495\u0005p\u0000\u0000\u0495\u04a8\u0005e\u0000\u0000\u0496"+ - "\u0497\n\b\u0000\u0000\u0497\u04a8\u0003\u017a\u00bd\u0000\u0498\u0499"+ - "\n\u0007\u0000\u0000\u0499\u04a8\u0003\u00ceg\u0000\u049a\u049b\n\u0006"+ - "\u0000\u0000\u049b\u04a8\u0003J%\u0000\u049c\u049d\n\u0005\u0000\u0000"+ - "\u049d\u04a8\u0003\u017c\u00be\u0000\u049e\u049f\n\u0004\u0000\u0000\u049f"+ - "\u04a8\u0003\u017e\u00bf\u0000\u04a0\u04a1\n\u0003\u0000\u0000\u04a1\u04a2"+ - "\u0003\u017e\u00bf\u0000\u04a2\u04a3\u0005\u0010\u0000\u0000\u04a3\u04a4"+ - "\u0003p8\u0000\u04a4\u04a8\u0001\u0000\u0000\u0000\u04a5\u04a6\n\u0002"+ - "\u0000\u0000\u04a6\u04a8\u0003\u00b8\\\u0000\u04a7\u0493\u0001\u0000\u0000"+ - "\u0000\u04a7\u0496\u0001\u0000\u0000\u0000\u04a7\u0498\u0001\u0000\u0000"+ - "\u0000\u04a7\u049a\u0001\u0000\u0000\u0000\u04a7\u049c\u0001\u0000\u0000"+ - "\u0000\u04a7\u049e\u0001\u0000\u0000\u0000\u04a7\u04a0\u0001\u0000\u0000"+ - "\u0000\u04a7\u04a5\u0001\u0000\u0000\u0000\u04a8\u04ab\u0001\u0000\u0000"+ - "\u0000\u04a9\u04a7\u0001\u0000\u0000\u0000\u04a9\u04aa\u0001\u0000\u0000"+ - "\u0000\u04aa\u00b3\u0001\u0000\u0000\u0000\u04ab\u04a9\u0001\u0000\u0000"+ - "\u0000\u04ac\u04ad\u0003\\.\u0000\u04ad\u04ae\u0003\u00b6[\u0000\u04ae"+ - "\u00b5\u0001\u0000\u0000\u0000\u04af\u04b1\u0005M\u0000\u0000\u04b0\u04b2"+ - "\u0005e\u0000\u0000\u04b1\u04b0\u0001\u0000\u0000\u0000\u04b1\u04b2\u0001"+ - "\u0000\u0000\u0000\u04b2\u04b3\u0001\u0000\u0000\u0000\u04b3\u04b5\u0003"+ - "\u014a\u00a5\u0000\u04b4\u04b6\u0003n7\u0000\u04b5\u04b4\u0001\u0000\u0000"+ - "\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u00b7\u0001\u0000\u0000"+ - "\u0000\u04b7\u04b9\u0005&\u0000\u0000\u04b8\u04ba\u0003\u00e6s\u0000\u04b9"+ - "\u04b8\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba"+ - "\u04bc\u0001\u0000\u0000\u0000\u04bb\u04bd\u0005m\u0000\u0000\u04bc\u04bb"+ - "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be"+ - "\u0001\u0000\u0000\u0000\u04be\u04bf\u0005\'\u0000\u0000\u04bf\u00b9\u0001"+ - "\u0000\u0000\u0000\u04c0\u04c1\u0005N\u0000\u0000\u04c1\u04c7\u0005h\u0000"+ - "\u0000\u04c2\u04c3\u0003\u00bc^\u0000\u04c3\u04c4\u0003\u0184\u00c2\u0000"+ - "\u04c4\u04c6\u0001\u0000\u0000\u0000\u04c5\u04c2\u0001\u0000\u0000\u0000"+ - "\u04c6\u04c9\u0001\u0000\u0000\u0000\u04c7\u04c5\u0001\u0000\u0000\u0000"+ - "\u04c7\u04c8\u0001\u0000\u0000\u0000\u04c8\u04ca\u0001\u0000\u0000\u0000"+ - "\u04c9\u04c7\u0001\u0000\u0000\u0000\u04ca\u04cb\u0005i\u0000\u0000\u04cb"+ - "\u00bb\u0001\u0000\u0000\u0000\u04cc\u04d0\u0003\u00c0`\u0000\u04cd\u04d0"+ - "\u0003\u013e\u009f\u0000\u04ce\u04d0\u0003\u00be_\u0000\u04cf\u04cc\u0001"+ - "\u0000\u0000\u0000\u04cf\u04cd\u0001\u0000\u0000\u0000\u04cf\u04ce\u0001"+ - "\u0000\u0000\u0000\u04d0\u00bd\u0001\u0000\u0000\u0000\u04d1\u04d2\u0005"+ - "8\u0000\u0000\u04d2\u04d3\u0005e\u0000\u0000\u04d3\u04d4\u0003\u014e\u00a7"+ - "\u0000\u04d4\u00bf\u0001\u0000\u0000\u0000\u04d5\u04d7\u0005\u001b\u0000"+ - "\u0000\u04d6\u04d5\u0001\u0000\u0000\u0000\u04d6\u04d7\u0001\u0000\u0000"+ - "\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003\\.\u0000"+ - "\u04d9\u04da\u0005e\u0000\u0000\u04da\u04db\u0003\u014e\u00a7\u0000\u04db"+ - "\u04dc\u0003\u014c\u00a6\u0000\u04dc\u04e5\u0001\u0000\u0000\u0000\u04dd"+ - "\u04df\u0005\u001b\u0000\u0000\u04de\u04dd\u0001\u0000\u0000\u0000\u04de"+ - "\u04df\u0001\u0000\u0000\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+ - "\u04e1\u0003\\.\u0000\u04e1\u04e2\u0005e\u0000\u0000\u04e2\u04e3\u0003"+ - "\u014e\u00a7\u0000\u04e3\u04e5\u0001\u0000\u0000\u0000\u04e4\u04d6\u0001"+ - "\u0000\u0000\u0000\u04e4\u04de\u0001\u0000\u0000\u0000\u04e5\u00c1\u0001"+ - "\u0000\u0000\u0000\u04e6\u04e8\u0003\u0130\u0098\u0000\u04e7\u04e9\u0003"+ - "\u0132\u0099\u0000\u04e8\u04e7\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001"+ - "\u0000\u0000\u0000\u04e9\u04f1\u0001\u0000\u0000\u0000\u04ea\u04f1\u0003"+ - "\u00c4b\u0000\u04eb\u04f1\u0003N\'\u0000\u04ec\u04ed\u0005f\u0000\u0000"+ - "\u04ed\u04ee\u0003\u00c2a\u0000\u04ee\u04ef\u0005g\u0000\u0000\u04ef\u04f1"+ - "\u0001\u0000\u0000\u0000\u04f0\u04e6\u0001\u0000\u0000\u0000\u04f0\u04ea"+ - "\u0001\u0000\u0000\u0000\u04f0\u04eb\u0001\u0000\u0000\u0000\u04f0\u04ec"+ - "\u0001\u0000\u0000\u0000\u04f1\u00c3\u0001\u0000\u0000\u0000\u04f2\u04fc"+ - "\u0003\u0136\u009b\u0000\u04f3\u04fc\u0003\u0172\u00b9\u0000\u04f4\u04fc"+ - "\u0003\u013c\u009e\u0000\u04f5\u04fc\u0003\u0148\u00a4\u0000\u04f6\u04fc"+ - "\u0003\u00ba]\u0000\u04f7\u04fc\u0003\u0142\u00a1\u0000\u04f8\u04fc\u0003"+ - "\u0144\u00a2\u0000\u04f9\u04fc\u0003\u0146\u00a3\u0000\u04fa\u04fc\u0003"+ - "\u00c6c\u0000\u04fb\u04f2\u0001\u0000\u0000\u0000\u04fb\u04f3\u0001\u0000"+ - "\u0000\u0000\u04fb\u04f4\u0001\u0000\u0000\u0000\u04fb\u04f5\u0001\u0000"+ - "\u0000\u0000\u04fb\u04f6\u0001\u0000\u0000\u0000\u04fb\u04f7\u0001\u0000"+ - "\u0000\u0000\u04fb\u04f8\u0001\u0000\u0000\u0000\u04fb\u04f9\u0001\u0000"+ - "\u0000\u0000\u04fb\u04fa\u0001\u0000\u0000\u0000\u04fc\u00c5\u0001\u0000"+ - "\u0000\u0000\u04fd\u04fe\u00058\u0000\u0000\u04fe\u04ff\u0003\u00c8d\u0000"+ - "\u04ff\u00c7\u0001\u0000\u0000\u0000\u0500\u050c\u0005f\u0000\u0000\u0501"+ - "\u0506\u0003\u00c2a\u0000\u0502\u0503\u0005m\u0000\u0000\u0503\u0505\u0003"+ - "\u00c2a\u0000\u0504\u0502\u0001\u0000\u0000\u0000\u0505\u0508\u0001\u0000"+ - "\u0000\u0000\u0506\u0504\u0001\u0000\u0000\u0000\u0506\u0507\u0001\u0000"+ - "\u0000\u0000\u0507\u050a\u0001\u0000\u0000\u0000\u0508\u0506\u0001\u0000"+ - "\u0000\u0000\u0509\u050b\u0005m\u0000\u0000\u050a\u0509\u0001\u0000\u0000"+ - "\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050d\u0001\u0000\u0000"+ - "\u0000\u050c\u0501\u0001\u0000\u0000\u0000\u050c\u050d\u0001\u0000\u0000"+ - "\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0005g\u0000\u0000"+ - "\u050f\u00c9\u0001\u0000\u0000\u0000\u0510\u051b\u0003\u0172\u00b9\u0000"+ - "\u0511\u051b\u0003\u0136\u009b\u0000\u0512\u051b\u0003\u00ccf\u0000\u0513"+ - "\u051b\u0003\u0142\u00a1\u0000\u0514\u051b\u0003\u0144\u00a2\u0000\u0515"+ - "\u051b\u0003N\'\u0000\u0516\u0518\u0003\u0130\u0098\u0000\u0517\u0519"+ - "\u0003\u0132\u0099\u0000\u0518\u0517\u0001\u0000\u0000\u0000\u0518\u0519"+ - "\u0001\u0000\u0000\u0000\u0519\u051b\u0001\u0000\u0000\u0000\u051a\u0510"+ - "\u0001\u0000\u0000\u0000\u051a\u0511\u0001\u0000\u0000\u0000\u051a\u0512"+ - "\u0001\u0000\u0000\u0000\u051a\u0513\u0001\u0000\u0000\u0000\u051a\u0514"+ - "\u0001\u0000\u0000\u0000\u051a\u0515\u0001\u0000\u0000\u0000\u051a\u0516"+ - "\u0001\u0000\u0000\u0000\u051b\u00cb\u0001\u0000\u0000\u0000\u051c\u051d"+ - "\u0005j\u0000\u0000\u051d\u051e\u0005t\u0000\u0000\u051e\u051f\u0005k"+ - "\u0000\u0000\u051f\u0520\u0003\u013a\u009d\u0000\u0520\u00cd\u0001\u0000"+ - "\u0000\u0000\u0521\u0531\u0005j\u0000\u0000\u0522\u0524\u0003\u00d0h\u0000"+ - "\u0523\u0522\u0001\u0000\u0000\u0000\u0523\u0524\u0001\u0000\u0000\u0000"+ - "\u0524\u0525\u0001\u0000\u0000\u0000\u0525\u0527\u0005o\u0000\u0000\u0526"+ - "\u0528\u0003\u00d2i\u0000\u0527\u0526\u0001\u0000\u0000\u0000\u0527\u0528"+ - "\u0001\u0000\u0000\u0000\u0528\u0532\u0001\u0000\u0000\u0000\u0529\u052b"+ - "\u0003\u00d0h\u0000\u052a\u0529\u0001\u0000\u0000\u0000\u052a\u052b\u0001"+ - "\u0000\u0000\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0005"+ - "o\u0000\u0000\u052d\u052e\u0003\u00d2i\u0000\u052e\u052f\u0005o\u0000"+ - "\u0000\u052f\u0530\u0003\u00d4j\u0000\u0530\u0532\u0001\u0000\u0000\u0000"+ - "\u0531\u0523\u0001\u0000\u0000\u0000\u0531\u052a\u0001\u0000\u0000\u0000"+ - "\u0532\u0533\u0001\u0000\u0000\u0000\u0533\u0534\u0005k\u0000\u0000\u0534"+ - "\u00cf\u0001\u0000\u0000\u0000\u0535\u0536\u0003\u00a2Q\u0000\u0536\u00d1"+ - "\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u00a2Q\u0000\u0538\u00d3\u0001"+ - "\u0000\u0000\u0000\u0539\u053a\u0003\u00a2Q\u0000\u053a\u00d5\u0001\u0000"+ - "\u0000\u0000\u053b\u053d\u0007\u000e\u0000\u0000\u053c\u053b\u0001\u0000"+ - "\u0000\u0000\u053c\u053d\u0001\u0000\u0000\u0000\u053d\u053e\u0001\u0000"+ - "\u0000\u0000\u053e\u053f\u0005l\u0000\u0000\u053f\u00d7\u0001\u0000\u0000"+ - "\u0000\u0540\u0541\u0003\u00e6s\u0000\u0541\u0542\u0005l\u0000\u0000\u0542"+ - "\u0547\u0001\u0000\u0000\u0000\u0543\u0544\u0003\u0006\u0003\u0000\u0544"+ - "\u0545\u0005s\u0000\u0000\u0545\u0547\u0001\u0000\u0000\u0000\u0546\u0540"+ - "\u0001\u0000\u0000\u0000\u0546\u0543\u0001\u0000\u0000\u0000\u0546\u0547"+ - "\u0001\u0000\u0000\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549"+ - "\u0005]\u0000\u0000\u0549\u054e\u0003\u00a2Q\u0000\u054a\u054c\u0005J"+ - "\u0000\u0000\u054b\u054d\u0005e\u0000\u0000\u054c\u054b\u0001\u0000\u0000"+ - "\u0000\u054c\u054d\u0001\u0000\u0000\u0000\u054d\u054f\u0001\u0000\u0000"+ - "\u0000\u054e\u054a\u0001\u0000\u0000\u0000\u054e\u054f\u0001\u0000\u0000"+ - "\u0000\u054f\u00d9\u0001\u0000\u0000\u0000\u0550\u0551\u0005X\u0000\u0000"+ - "\u0551\u0552\u0005e\u0000\u0000\u0552\u00db\u0001\u0000\u0000\u0000\u0553"+ - "\u0554\u0003\u0176\u00bb\u0000\u0554\u00dd\u0001\u0000\u0000\u0000\u0555"+ - "\u0559\u0003\u00e0p\u0000\u0556\u0559\u0003\u00e8t\u0000\u0557\u0559\u0003"+ - "\u00f0x\u0000\u0558\u0555\u0001\u0000\u0000\u0000\u0558\u0556\u0001\u0000"+ - "\u0000\u0000\u0558\u0557\u0001\u0000\u0000\u0000\u0559\u00df\u0001\u0000"+ - "\u0000\u0000\u055a\u0566\u0005Z\u0000\u0000\u055b\u0567\u0003\u00e2q\u0000"+ - "\u055c\u0562\u0005f\u0000\u0000\u055d\u055e\u0003\u00e2q\u0000\u055e\u055f"+ - "\u0003\u0184\u00c2\u0000\u055f\u0561\u0001\u0000\u0000\u0000\u0560\u055d"+ - "\u0001\u0000\u0000\u0000\u0561\u0564\u0001\u0000\u0000\u0000\u0562\u0560"+ - "\u0001\u0000\u0000\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0565"+ - "\u0001\u0000\u0000\u0000\u0564\u0562\u0001\u0000\u0000\u0000\u0565\u0567"+ - "\u0005g\u0000\u0000\u0566\u055b\u0001\u0000\u0000\u0000\u0566\u055c\u0001"+ - "\u0000\u0000\u0000\u0567\u00e1\u0001\u0000\u0000\u0000\u0568\u056e\u0003"+ - "\u00e4r\u0000\u0569\u056b\u0003\u00c2a\u0000\u056a\u0569\u0001\u0000\u0000"+ - "\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b\u056c\u0001\u0000\u0000"+ - "\u0000\u056c\u056d\u0005l\u0000\u0000\u056d\u056f\u0003\u00e6s\u0000\u056e"+ - "\u056a\u0001\u0000\u0000\u0000\u056e\u056f\u0001\u0000\u0000\u0000\u056f"+ - "\u00e3\u0001\u0000\u0000\u0000\u0570\u0575\u0005e\u0000\u0000\u0571\u0572"+ - "\u0005m\u0000\u0000\u0572\u0574\u0005e\u0000\u0000\u0573\u0571\u0001\u0000"+ - "\u0000\u0000\u0574\u0577\u0001\u0000\u0000\u0000\u0575\u0573\u0001\u0000"+ - "\u0000\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576\u00e5\u0001\u0000"+ - "\u0000\u0000\u0577\u0575\u0001\u0000\u0000\u0000\u0578\u057d\u0003\u00a2"+ - "Q\u0000\u0579\u057a\u0005m\u0000\u0000\u057a\u057c\u0003\u00a2Q\u0000"+ - "\u057b\u0579\u0001\u0000\u0000\u0000\u057c\u057f\u0001\u0000\u0000\u0000"+ - "\u057d\u057b\u0001\u0000\u0000\u0000\u057d\u057e\u0001\u0000\u0000\u0000"+ - "\u057e\u00e7\u0001\u0000\u0000\u0000\u057f\u057d\u0001\u0000\u0000\u0000"+ - "\u0580\u058c\u0005^\u0000\u0000\u0581\u058d\u0003\u00eau\u0000\u0582\u0588"+ - "\u0005f\u0000\u0000\u0583\u0584\u0003\u00eau\u0000\u0584\u0585\u0003\u0184"+ - "\u00c2\u0000\u0585\u0587\u0001\u0000\u0000\u0000\u0586\u0583\u0001\u0000"+ - "\u0000\u0000\u0587\u058a\u0001\u0000\u0000\u0000\u0588\u0586\u0001\u0000"+ - "\u0000\u0000\u0588\u0589\u0001\u0000\u0000\u0000\u0589\u058b\u0001\u0000"+ - "\u0000\u0000\u058a\u0588\u0001\u0000\u0000\u0000\u058b\u058d\u0005g\u0000"+ - "\u0000\u058c\u0581\u0001\u0000\u0000\u0000\u058c\u0582\u0001\u0000\u0000"+ - "\u0000\u058d\u00e9\u0001\u0000\u0000\u0000\u058e\u0591\u0003\u00ecv\u0000"+ - "\u058f\u0591\u0003\u00eew\u0000\u0590\u058e\u0001\u0000\u0000\u0000\u0590"+ - "\u058f\u0001\u0000\u0000\u0000\u0591\u00eb\u0001\u0000\u0000\u0000\u0592"+ - "\u0593\u0005e\u0000\u0000\u0593\u0594\u0005l\u0000\u0000\u0594\u0595\u0003"+ - "\u00c2a\u0000\u0595\u00ed\u0001\u0000\u0000\u0000\u0596\u0598\u0005e\u0000"+ - "\u0000\u0597\u0599\u0003\u0150\u00a8\u0000\u0598\u0597\u0001\u0000\u0000"+ - "\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599\u059a\u0001\u0000\u0000"+ - "\u0000\u059a\u059b\u0003\u00c2a\u0000\u059b\u00ef\u0001\u0000\u0000\u0000"+ - "\u059c\u05a8\u0005c\u0000\u0000\u059d\u05a9\u0003\u0094J\u0000\u059e\u05a4"+ - "\u0005f\u0000\u0000\u059f\u05a0\u0003\u0094J\u0000\u05a0\u05a1\u0003\u0184"+ - "\u00c2\u0000\u05a1\u05a3\u0001\u0000\u0000\u0000\u05a2\u059f\u0001\u0000"+ - "\u0000\u0000\u05a3\u05a6\u0001\u0000\u0000\u0000\u05a4\u05a2\u0001\u0000"+ - "\u0000\u0000\u05a4\u05a5\u0001\u0000\u0000\u0000\u05a5\u05a7\u0001\u0000"+ - "\u0000\u0000\u05a6\u05a4\u0001\u0000\u0000\u0000\u05a7\u05a9\u0005g\u0000"+ - "\u0000\u05a8\u059d\u0001\u0000\u0000\u0000\u05a8\u059e\u0001\u0000\u0000"+ - "\u0000\u05a9\u00f1\u0001\u0000\u0000\u0000\u05aa\u05ac\u0005h\u0000\u0000"+ - "\u05ab\u05ad\u0003\u00f4z\u0000\u05ac\u05ab\u0001\u0000\u0000\u0000\u05ac"+ - "\u05ad\u0001\u0000\u0000\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae"+ - "\u05af\u0005i\u0000\u0000\u05af\u00f3\u0001\u0000\u0000\u0000\u05b0\u05b1"+ - "\u0003\u00a4R\u0000\u05b1\u05b2\u0005\u009f\u0000\u0000\u05b2\u05b4\u0001"+ - "\u0000\u0000\u0000\u05b3\u05b0\u0001\u0000\u0000\u0000\u05b4\u05b5\u0001"+ - "\u0000\u0000\u0000\u05b5\u05b3\u0001\u0000\u0000\u0000\u05b5\u05b6\u0001"+ - "\u0000\u0000\u0000\u05b6\u00f5\u0001\u0000\u0000\u0000\u05b7\u05bd\u0003"+ - "\u00fa}\u0000\u05b8\u05bd\u0003\u00fc~\u0000\u05b9\u05bd\u0003\u00fe\u007f"+ - "\u0000\u05ba\u05bd\u0003\u00f8|\u0000\u05bb\u05bd\u0003\u0096K\u0000\u05bc"+ - "\u05b7\u0001\u0000\u0000\u0000\u05bc\u05b8\u0001\u0000\u0000\u0000\u05bc"+ - "\u05b9\u0001\u0000\u0000\u0000\u05bc\u05ba\u0001\u0000\u0000\u0000\u05bc"+ - "\u05bb\u0001\u0000\u0000\u0000\u05bd\u00f7\u0001\u0000\u0000\u0000\u05be"+ - "\u05bf\u0003\u00a2Q\u0000\u05bf\u00f9\u0001\u0000\u0000\u0000\u05c0\u05c1"+ - "\u0003\u00a2Q\u0000\u05c1\u05c2\u0005\u0089\u0000\u0000\u05c2\u05c3\u0003"+ - "\u00a2Q\u0000\u05c3\u00fb\u0001\u0000\u0000\u0000\u05c4\u05c5\u0003\u00a2"+ - "Q\u0000\u05c5\u05c6\u0007\u000f\u0000\u0000\u05c6\u00fd\u0001\u0000\u0000"+ - "\u0000\u05c7\u05c8\u0003\u00e6s\u0000\u05c8\u05c9\u0003\u00d6k\u0000\u05c9"+ - "\u05ca\u0003\u00e6s\u0000\u05ca\u00ff\u0001\u0000\u0000\u0000\u05cb\u05cc"+ - "\u0007\u0010\u0000\u0000\u05cc\u0101\u0001\u0000\u0000\u0000\u05cd\u05ce"+ - "\u0005e\u0000\u0000\u05ce\u05d0\u0005o\u0000\u0000\u05cf\u05d1\u0003\u00a4"+ - "R\u0000\u05d0\u05cf\u0001\u0000\u0000\u0000\u05d0\u05d1\u0001\u0000\u0000"+ - "\u0000\u05d1\u0103\u0001\u0000\u0000\u0000\u05d2\u05d4\u0005b\u0000\u0000"+ - "\u05d3\u05d5\u0003\u00e6s\u0000\u05d4\u05d3\u0001\u0000\u0000\u0000\u05d4"+ - "\u05d5\u0001\u0000\u0000\u0000\u05d5\u0105\u0001\u0000\u0000\u0000\u05d6"+ - "\u05d8\u0005K\u0000\u0000\u05d7\u05d9\u0005e\u0000\u0000\u05d8\u05d7\u0001"+ - "\u0000\u0000\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u0107\u0001"+ - "\u0000\u0000\u0000\u05da\u05dc\u0005_\u0000\u0000\u05db\u05dd\u0005e\u0000"+ - "\u0000\u05dc\u05db\u0001\u0000\u0000\u0000\u05dc\u05dd\u0001\u0000\u0000"+ - "\u0000\u05dd\u0109\u0001\u0000\u0000\u0000\u05de\u05df\u0005W\u0000\u0000"+ - "\u05df\u05e0\u0005e\u0000\u0000\u05e0\u010b\u0001\u0000\u0000\u0000\u05e1"+ - "\u05e2\u0005[\u0000\u0000\u05e2\u010d\u0001\u0000\u0000\u0000\u05e3\u05ec"+ - "\u0005\\\u0000\u0000\u05e4\u05ed\u0003\u00a2Q\u0000\u05e5\u05e6\u0003"+ - "\u0184\u00c2\u0000\u05e6\u05e7\u0003\u00a2Q\u0000\u05e7\u05ed\u0001\u0000"+ - "\u0000\u0000\u05e8\u05e9\u0003\u00f6{\u0000\u05e9\u05ea\u0003\u0184\u00c2"+ - "\u0000\u05ea\u05eb\u0003\u00a2Q\u0000\u05eb\u05ed\u0001\u0000\u0000\u0000"+ - "\u05ec\u05e4\u0001\u0000\u0000\u0000\u05ec\u05e5\u0001\u0000\u0000\u0000"+ - "\u05ec\u05e8\u0001\u0000\u0000\u0000\u05ed\u05ee\u0001\u0000\u0000\u0000"+ - "\u05ee\u05f4\u0003\u00f2y\u0000\u05ef\u05f2\u0005V\u0000\u0000\u05f0\u05f3"+ - "\u0003\u010e\u0087\u0000\u05f1\u05f3\u0003\u00f2y\u0000\u05f2\u05f0\u0001"+ - "\u0000\u0000\u0000\u05f2\u05f1\u0001\u0000\u0000\u0000\u05f3\u05f5\u0001"+ - "\u0000\u0000\u0000\u05f4\u05ef\u0001\u0000\u0000\u0000\u05f4\u05f5\u0001"+ - "\u0000\u0000\u0000\u05f5\u010f\u0001\u0000\u0000\u0000\u05f6\u05f9\u0003"+ - "\u0112\u0089\u0000\u05f7\u05f9\u0003\u0118\u008c\u0000\u05f8\u05f6\u0001"+ - "\u0000\u0000\u0000\u05f8\u05f7\u0001\u0000\u0000\u0000\u05f9\u0111\u0001"+ - "\u0000\u0000\u0000\u05fa\u0605\u0005Y\u0000\u0000\u05fb\u05fd\u0003\u00a2"+ - "Q\u0000\u05fc\u05fb\u0001\u0000\u0000\u0000\u05fc\u05fd\u0001\u0000\u0000"+ - "\u0000\u05fd\u0606\u0001\u0000\u0000\u0000\u05fe\u0600\u0003\u00f6{\u0000"+ - "\u05ff\u05fe\u0001\u0000\u0000\u0000\u05ff\u0600\u0001\u0000\u0000\u0000"+ - "\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0603\u0003\u0184\u00c2\u0000"+ - "\u0602\u0604\u0003\u00a2Q\u0000\u0603\u0602\u0001\u0000\u0000\u0000\u0603"+ - "\u0604\u0001\u0000\u0000\u0000\u0604\u0606\u0001\u0000\u0000\u0000\u0605"+ - "\u05fc\u0001\u0000\u0000\u0000\u0605\u05ff\u0001\u0000\u0000\u0000\u0606"+ - "\u0607\u0001\u0000\u0000\u0000\u0607\u060b\u0005h\u0000\u0000\u0608\u060a"+ - "\u0003\u0114\u008a\u0000\u0609\u0608\u0001\u0000\u0000\u0000\u060a\u060d"+ - "\u0001\u0000\u0000\u0000\u060b\u0609\u0001\u0000\u0000\u0000\u060b\u060c"+ - "\u0001\u0000\u0000\u0000\u060c\u060e\u0001\u0000\u0000\u0000\u060d\u060b"+ - "\u0001\u0000\u0000\u0000\u060e\u060f\u0005i\u0000\u0000\u060f\u0113\u0001"+ - "\u0000\u0000\u0000\u0610\u0611\u0003\u0116\u008b\u0000\u0611\u0613\u0005"+ - "o\u0000\u0000\u0612\u0614\u0003\u00f4z\u0000\u0613\u0612\u0001\u0000\u0000"+ - "\u0000\u0613\u0614\u0001\u0000\u0000\u0000\u0614\u0115\u0001\u0000\u0000"+ - "\u0000\u0615\u0616\u0005P\u0000\u0000\u0616\u0619\u0003\u00e6s\u0000\u0617"+ - "\u0619\u0005L\u0000\u0000\u0618\u0615\u0001\u0000\u0000\u0000\u0618\u0617"+ - "\u0001\u0000\u0000\u0000\u0619\u0117\u0001\u0000\u0000\u0000\u061a\u0623"+ - "\u0005Y\u0000\u0000\u061b\u0624\u0003\u011a\u008d\u0000\u061c\u061d\u0003"+ - "\u0184\u00c2\u0000\u061d\u061e\u0003\u011a\u008d\u0000\u061e\u0624\u0001"+ - "\u0000\u0000\u0000\u061f\u0620\u0003\u00f6{\u0000\u0620\u0621\u0003\u0184"+ - "\u00c2\u0000\u0621\u0622\u0003\u011a\u008d\u0000\u0622\u0624\u0001\u0000"+ - "\u0000\u0000\u0623\u061b\u0001\u0000\u0000\u0000\u0623\u061c\u0001\u0000"+ - "\u0000\u0000\u0623\u061f\u0001\u0000\u0000\u0000\u0624\u0625\u0001\u0000"+ - "\u0000\u0000\u0625\u0629\u0005h\u0000\u0000\u0626\u0628\u0003\u011c\u008e"+ - "\u0000\u0627\u0626\u0001\u0000\u0000\u0000\u0628\u062b\u0001\u0000\u0000"+ - "\u0000\u0629\u0627\u0001\u0000\u0000\u0000\u0629\u062a\u0001\u0000\u0000"+ - "\u0000\u062a\u062c\u0001\u0000\u0000\u0000\u062b\u0629\u0001\u0000\u0000"+ - "\u0000\u062c\u062d\u0005i\u0000\u0000\u062d\u0119\u0001\u0000\u0000\u0000"+ - "\u062e\u062f\u0005e\u0000\u0000\u062f\u0631\u0005s\u0000\u0000\u0630\u062e"+ - "\u0001\u0000\u0000\u0000\u0630\u0631\u0001\u0000\u0000\u0000\u0631\u0632"+ - "\u0001\u0000\u0000\u0000\u0632\u0633\u0003\u00b2Y\u0000\u0633\u0634\u0005"+ - "p\u0000\u0000\u0634\u0635\u0005f\u0000\u0000\u0635\u0636\u0005^\u0000"+ - "\u0000\u0636\u0637\u0005g\u0000\u0000\u0637\u011b\u0001\u0000\u0000\u0000"+ - "\u0638\u0639\u0003\u011e\u008f\u0000\u0639\u063b\u0005o\u0000\u0000\u063a"+ - "\u063c\u0003\u00f4z\u0000\u063b\u063a\u0001\u0000\u0000\u0000\u063b\u063c"+ - "\u0001\u0000\u0000\u0000\u063c\u011d\u0001\u0000\u0000\u0000\u063d\u063e"+ - "\u0005P\u0000\u0000\u063e\u0641\u0003\u0120\u0090\u0000\u063f\u0641\u0005"+ - "L\u0000\u0000\u0640\u063d\u0001\u0000\u0000\u0000\u0640\u063f\u0001\u0000"+ - "\u0000\u0000\u0641\u011f\u0001\u0000\u0000\u0000\u0642\u0645\u0003\u00c2"+ - "a\u0000\u0643\u0645\u0005d\u0000\u0000\u0644\u0642\u0001\u0000\u0000\u0000"+ - "\u0644\u0643\u0001\u0000\u0000\u0000\u0645\u064d\u0001\u0000\u0000\u0000"+ - "\u0646\u0649\u0005m\u0000\u0000\u0647\u064a\u0003\u00c2a\u0000\u0648\u064a"+ - "\u0005d\u0000\u0000\u0649\u0647\u0001\u0000\u0000\u0000\u0649\u0648\u0001"+ - "\u0000\u0000\u0000\u064a\u064c\u0001\u0000\u0000\u0000\u064b\u0646\u0001"+ - "\u0000\u0000\u0000\u064c\u064f\u0001\u0000\u0000\u0000\u064d\u064b\u0001"+ - "\u0000\u0000\u0000\u064d\u064e\u0001\u0000\u0000\u0000\u064e\u0121\u0001"+ - "\u0000\u0000\u0000\u064f\u064d\u0001\u0000\u0000\u0000\u0650\u0651\u0005"+ - "O\u0000\u0000\u0651\u0655\u0005h\u0000\u0000\u0652\u0654\u0003\u0124\u0092"+ - "\u0000\u0653\u0652\u0001\u0000\u0000\u0000\u0654\u0657\u0001\u0000\u0000"+ - "\u0000\u0655\u0653\u0001\u0000\u0000\u0000\u0655\u0656\u0001\u0000\u0000"+ - "\u0000\u0656\u0658\u0001\u0000\u0000\u0000\u0657\u0655\u0001\u0000\u0000"+ - "\u0000\u0658\u0659\u0005i\u0000\u0000\u0659\u0123\u0001\u0000\u0000\u0000"+ - "\u065a\u065b\u0003\u0126\u0093\u0000\u065b\u065d\u0005o\u0000\u0000\u065c"+ - "\u065e\u0003\u00f4z\u0000\u065d\u065c\u0001\u0000\u0000\u0000\u065d\u065e"+ - "\u0001\u0000\u0000\u0000\u065e\u0125\u0001\u0000\u0000\u0000\u065f\u0662"+ - "\u0005P\u0000\u0000\u0660\u0663\u0003\u00fa}\u0000\u0661\u0663\u0003\u0128"+ - "\u0094\u0000\u0662\u0660\u0001\u0000\u0000\u0000\u0662\u0661\u0001\u0000"+ - "\u0000\u0000\u0663\u0666\u0001\u0000\u0000\u0000\u0664\u0666\u0005L\u0000"+ - "\u0000\u0665\u065f\u0001\u0000\u0000\u0000\u0665\u0664\u0001\u0000\u0000"+ - "\u0000\u0666\u0127\u0001\u0000\u0000\u0000\u0667\u0668\u0003\u00e6s\u0000"+ - "\u0668\u0669\u0005l\u0000\u0000\u0669\u066e\u0001\u0000\u0000\u0000\u066a"+ - "\u066b\u0003\u00e4r\u0000\u066b\u066c\u0005s\u0000\u0000\u066c\u066e\u0001"+ - "\u0000\u0000\u0000\u066d\u0667\u0001\u0000\u0000\u0000\u066d\u066a\u0001"+ - "\u0000\u0000\u0000\u066d\u066e\u0001\u0000\u0000\u0000\u066e\u066f\u0001"+ - "\u0000\u0000\u0000\u066f\u0670\u0003\u00a2Q\u0000\u0670\u0129\u0001\u0000"+ - "\u0000\u0000\u0671\u0675\u0005`\u0000\u0000\u0672\u0676\u0003\u00a2Q\u0000"+ - "\u0673\u0676\u0003\u012c\u0096\u0000\u0674\u0676\u0003\u00d8l\u0000\u0675"+ - "\u0672\u0001\u0000\u0000\u0000\u0675\u0673\u0001\u0000\u0000\u0000\u0675"+ - "\u0674\u0001\u0000\u0000\u0000\u0675\u0676\u0001\u0000\u0000\u0000\u0676"+ - "\u0677\u0001\u0000\u0000\u0000\u0677\u0678\u0003\u00f2y\u0000\u0678\u012b"+ - "\u0001\u0000\u0000\u0000\u0679\u067b\u0003\u00f6{\u0000\u067a\u0679\u0001"+ - "\u0000\u0000\u0000\u067a\u067b\u0001\u0000\u0000\u0000\u067b\u067c\u0001"+ - "\u0000\u0000\u0000\u067c\u067e\u0003\u0184\u00c2\u0000\u067d\u067f\u0003"+ - "\u00a2Q\u0000\u067e\u067d\u0001\u0000\u0000\u0000\u067e\u067f\u0001\u0000"+ - "\u0000\u0000\u067f\u0680\u0001\u0000\u0000\u0000\u0680\u0682\u0003\u0184"+ - "\u00c2\u0000\u0681\u0683\u0003\u00f6{\u0000\u0682\u0681\u0001\u0000\u0000"+ - "\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683\u012d\u0001\u0000\u0000"+ - "\u0000\u0684\u0685\u0005R\u0000\u0000\u0685\u0686\u0003\u00a2Q\u0000\u0686"+ - "\u012f\u0001\u0000\u0000\u0000\u0687\u068a\u0003\u0164\u00b2\u0000\u0688"+ - "\u068a\u0005e\u0000\u0000\u0689\u0687\u0001\u0000\u0000\u0000\u0689\u0688"+ - "\u0001\u0000\u0000\u0000\u068a\u0131\u0001\u0000\u0000\u0000\u068b\u068c"+ - "\u0005j\u0000\u0000\u068c\u068e\u0003\u0134\u009a\u0000\u068d\u068f\u0005"+ - "m\u0000\u0000\u068e\u068d\u0001\u0000\u0000\u0000\u068e\u068f\u0001\u0000"+ - "\u0000\u0000\u068f\u0690\u0001\u0000\u0000\u0000\u0690\u0691\u0005k\u0000"+ - "\u0000\u0691\u0133\u0001\u0000\u0000\u0000\u0692\u0697\u0003\u00c2a\u0000"+ - "\u0693\u0694\u0005m\u0000\u0000\u0694\u0696\u0003\u00c2a\u0000\u0695\u0693"+ - "\u0001\u0000\u0000\u0000\u0696\u0699\u0001\u0000\u0000\u0000\u0697\u0695"+ - "\u0001\u0000\u0000\u0000\u0697\u0698\u0001\u0000\u0000\u0000\u0698\u0135"+ - "\u0001\u0000\u0000\u0000\u0699\u0697\u0001\u0000\u0000\u0000\u069a\u069b"+ - "\u0005j\u0000\u0000\u069b\u069c\u0003\u0138\u009c\u0000\u069c\u069d\u0005"+ - "k\u0000\u0000\u069d\u069e\u0003\u013a\u009d\u0000\u069e\u0137\u0001\u0000"+ - "\u0000\u0000\u069f\u06a0\u0003\u00a2Q\u0000\u06a0\u0139\u0001\u0000\u0000"+ - "\u0000\u06a1\u06a2\u0003\u00c2a\u0000\u06a2\u013b\u0001\u0000\u0000\u0000"+ - "\u06a3\u06a4\u0005\u0087\u0000\u0000\u06a4\u06a5\u0003\u00c2a\u0000\u06a5"+ - "\u013d\u0001\u0000\u0000\u0000\u06a6\u06ab\u0003\u0140\u00a0\u0000\u06a7"+ - "\u06a8\u0005}\u0000\u0000\u06a8\u06aa\u0003\u0140\u00a0\u0000\u06a9\u06a7"+ - "\u0001\u0000\u0000\u0000\u06aa\u06ad\u0001\u0000\u0000\u0000\u06ab\u06a9"+ - "\u0001\u0000\u0000\u0000\u06ab\u06ac\u0001\u0000\u0000\u0000\u06ac\u013f"+ - "\u0001\u0000\u0000\u0000\u06ad\u06ab\u0001\u0000\u0000\u0000\u06ae\u06af"+ - "\u0003\u00c2a\u0000\u06af\u0141\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005"+ - "j\u0000\u0000\u06b1\u06b2\u0005k\u0000\u0000\u06b2\u06b3\u0003\u013a\u009d"+ - "\u0000\u06b3\u0143\u0001\u0000\u0000\u0000\u06b4\u06b5\u0005S\u0000\u0000"+ - "\u06b5\u06b6\u0005j\u0000\u0000\u06b6\u06b7\u0003\u00c2a\u0000\u06b7\u06b8"+ - "\u0005k\u0000\u0000\u06b8\u06b9\u0003\u013a\u009d\u0000\u06b9\u0145\u0001"+ - "\u0000\u0000\u0000\u06ba\u06c0\u0005U\u0000\u0000\u06bb\u06bc\u0005U\u0000"+ - "\u0000\u06bc\u06c0\u0005\u0089\u0000\u0000\u06bd\u06be\u0005\u0089\u0000"+ - "\u0000\u06be\u06c0\u0005U\u0000\u0000\u06bf\u06ba\u0001\u0000\u0000\u0000"+ - "\u06bf\u06bb\u0001\u0000\u0000\u0000\u06bf\u06bd\u0001\u0000\u0000\u0000"+ - "\u06c0\u06c1\u0001\u0000\u0000\u0000\u06c1\u06c2\u0003\u013a\u009d\u0000"+ - "\u06c2\u0147\u0001\u0000\u0000\u0000\u06c3\u06c4\u0005M\u0000\u0000\u06c4"+ - "\u06c5\u0003\u014a\u00a5\u0000\u06c5\u0149\u0001\u0000\u0000\u0000\u06c6"+ - "\u06c7\u0003\u014e\u00a7\u0000\u06c7\u06c8\u0003\u014c\u00a6\u0000\u06c8"+ - "\u06cb\u0001\u0000\u0000\u0000\u06c9\u06cb\u0003\u014e\u00a7\u0000\u06ca"+ - "\u06c6\u0001\u0000\u0000\u0000\u06ca\u06c9\u0001\u0000\u0000\u0000\u06cb"+ - "\u014b\u0001\u0000\u0000\u0000\u06cc\u06cf\u0003\u014e\u00a7\u0000\u06cd"+ - "\u06cf\u0003\u00c2a\u0000\u06ce\u06cc\u0001\u0000\u0000\u0000\u06ce\u06cd"+ - "\u0001\u0000\u0000\u0000\u06cf\u014d\u0001\u0000\u0000\u0000\u06d0\u06dc"+ - "\u0005f\u0000\u0000\u06d1\u06d6\u0003\u009aM\u0000\u06d2\u06d3\u0005m"+ - "\u0000\u0000\u06d3\u06d5\u0003\u009aM\u0000\u06d4\u06d2\u0001\u0000\u0000"+ - "\u0000\u06d5\u06d8\u0001\u0000\u0000\u0000\u06d6\u06d4\u0001\u0000\u0000"+ - "\u0000\u06d6\u06d7\u0001\u0000\u0000\u0000\u06d7\u06da\u0001\u0000\u0000"+ - "\u0000\u06d8\u06d6\u0001\u0000\u0000\u0000\u06d9\u06db\u0005m\u0000\u0000"+ - "\u06da\u06d9\u0001\u0000\u0000\u0000\u06da\u06db\u0001\u0000\u0000\u0000"+ - "\u06db\u06dd\u0001\u0000\u0000\u0000\u06dc\u06d1\u0001\u0000\u0000\u0000"+ - "\u06dc\u06dd\u0001\u0000\u0000\u0000\u06dd\u06de\u0001\u0000\u0000\u0000"+ - "\u06de\u06df\u0005g\u0000\u0000\u06df\u014f\u0001\u0000\u0000\u0000\u06e0"+ - "\u06e1\u0005j\u0000\u0000\u06e1\u06e3\u0003\u0152\u00a9\u0000\u06e2\u06e4"+ - "\u0005m\u0000\u0000\u06e3\u06e2\u0001\u0000\u0000\u0000\u06e3\u06e4\u0001"+ - "\u0000\u0000\u0000\u06e4\u06e5\u0001\u0000\u0000\u0000\u06e5\u06e6\u0005"+ - "k\u0000\u0000\u06e6\u0151\u0001\u0000\u0000\u0000\u06e7\u06ec\u0003\u0154"+ - "\u00aa\u0000\u06e8\u06e9\u0005m\u0000\u0000\u06e9\u06eb\u0003\u0154\u00aa"+ - "\u0000\u06ea\u06e8\u0001\u0000\u0000\u0000\u06eb\u06ee\u0001\u0000\u0000"+ - "\u0000\u06ec\u06ea\u0001\u0000\u0000\u0000\u06ec\u06ed\u0001\u0000\u0000"+ - "\u0000\u06ed\u0153\u0001\u0000\u0000\u0000\u06ee\u06ec\u0001\u0000\u0000"+ - "\u0000\u06ef\u06f0\u0003\u00e4r\u0000\u06f0\u06f1\u0003\u0156\u00ab\u0000"+ - "\u06f1\u0155\u0001\u0000\u0000\u0000\u06f2\u06f3\u0003\u013e\u009f\u0000"+ - "\u06f3\u0157\u0001\u0000\u0000\u0000\u06f4\u06f5\u0003\u015a\u00ad\u0000"+ - "\u06f5\u06f6\u0005f\u0000\u0000\u06f6\u06f8\u0003\u00a2Q\u0000\u06f7\u06f9"+ - "\u0005m\u0000\u0000\u06f8\u06f7\u0001\u0000\u0000\u0000\u06f8\u06f9\u0001"+ - "\u0000\u0000\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb\u0005"+ - "g\u0000\u0000\u06fb\u0159\u0001\u0000\u0000\u0000\u06fc\u0702\u0003\u00c4"+ - "b\u0000\u06fd\u06fe\u0005f\u0000\u0000\u06fe\u06ff\u0003\u015a\u00ad\u0000"+ - "\u06ff\u0700\u0005g\u0000\u0000\u0700\u0702\u0001\u0000\u0000\u0000\u0701"+ - "\u06fc\u0001\u0000\u0000\u0000\u0701\u06fd\u0001\u0000\u0000\u0000\u0702"+ - "\u015b\u0001\u0000\u0000\u0000\u0703\u070d\u0003\u015e\u00af\u0000\u0704"+ - "\u0706\u0003\u0162\u00b1\u0000\u0705\u0707\u0003\u0132\u0099\u0000\u0706"+ - "\u0705\u0001\u0000\u0000\u0000\u0706\u0707\u0001\u0000\u0000\u0000\u0707"+ - "\u070d\u0001\u0000\u0000\u0000\u0708\u0709\u0005f\u0000\u0000\u0709\u070a"+ - "\u0003\u00a2Q\u0000\u070a\u070b\u0005g\u0000\u0000\u070b\u070d\u0001\u0000"+ - "\u0000\u0000\u070c\u0703\u0001\u0000\u0000\u0000\u070c\u0704\u0001\u0000"+ - "\u0000\u0000\u070c\u0708\u0001\u0000\u0000\u0000\u070d\u015d\u0001\u0000"+ - "\u0000\u0000\u070e\u0712\u0003\u00b0X\u0000\u070f\u0712\u0003\u0166\u00b3"+ - "\u0000\u0710\u0712\u0003\u00b4Z\u0000\u0711\u070e\u0001\u0000\u0000\u0000"+ - "\u0711\u070f\u0001\u0000\u0000\u0000\u0711\u0710\u0001\u0000\u0000\u0000"+ - "\u0712\u015f\u0001\u0000\u0000\u0000\u0713\u0714\u0007\u0011\u0000\u0000"+ - "\u0714\u0161\u0001\u0000\u0000\u0000\u0715\u0716\u0005e\u0000\u0000\u0716"+ - "\u0163\u0001\u0000\u0000\u0000\u0717\u0718\u0005e\u0000\u0000\u0718\u0719"+ - "\u0005p\u0000\u0000\u0719\u071a\u0005e\u0000\u0000\u071a\u0165\u0001\u0000"+ - "\u0000\u0000\u071b\u071c\u0003\u00cae\u0000\u071c\u071d\u0003\u0168\u00b4"+ - "\u0000\u071d\u0167\u0001\u0000\u0000\u0000\u071e\u0723\u0005h\u0000\u0000"+ - "\u071f\u0721\u0003\u016a\u00b5\u0000\u0720\u0722\u0005m\u0000\u0000\u0721"+ - "\u0720\u0001\u0000\u0000\u0000\u0721\u0722\u0001\u0000\u0000\u0000\u0722"+ - "\u0724\u0001\u0000\u0000\u0000\u0723\u071f\u0001\u0000\u0000\u0000\u0723"+ - "\u0724\u0001\u0000\u0000\u0000\u0724\u0725\u0001\u0000\u0000\u0000\u0725"+ - "\u0726\u0005i\u0000\u0000\u0726\u0169\u0001\u0000\u0000\u0000\u0727\u072c"+ - "\u0003\u016c\u00b6\u0000\u0728\u0729\u0005m\u0000\u0000\u0729\u072b\u0003"+ - "\u016c\u00b6\u0000\u072a\u0728\u0001\u0000\u0000\u0000\u072b\u072e\u0001"+ - "\u0000\u0000\u0000\u072c\u072a\u0001\u0000\u0000\u0000\u072c\u072d\u0001"+ - "\u0000\u0000\u0000\u072d\u016b\u0001\u0000\u0000\u0000\u072e\u072c\u0001"+ - "\u0000\u0000\u0000\u072f\u0730\u0003\u016e\u00b7\u0000\u0730\u0731\u0005"+ - "o\u0000\u0000\u0731\u0733\u0001\u0000\u0000\u0000\u0732\u072f\u0001\u0000"+ - "\u0000\u0000\u0732\u0733\u0001\u0000\u0000\u0000\u0733\u0734\u0001\u0000"+ - "\u0000\u0000\u0734\u0735\u0003\u0170\u00b8\u0000\u0735\u016d\u0001\u0000"+ - "\u0000\u0000\u0736\u0739\u0003\u00a2Q\u0000\u0737\u0739\u0003\u0168\u00b4"+ - "\u0000\u0738\u0736\u0001\u0000\u0000\u0000\u0738\u0737\u0001\u0000\u0000"+ - "\u0000\u0739\u016f\u0001\u0000\u0000\u0000\u073a\u073d\u0003\u00a2Q\u0000"+ - "\u073b\u073d\u0003\u0168\u00b4\u0000\u073c\u073a\u0001\u0000\u0000\u0000"+ - "\u073c\u073b\u0001\u0000\u0000\u0000\u073d\u0171\u0001\u0000\u0000\u0000"+ - "\u073e\u073f\u0005T\u0000\u0000\u073f\u0745\u0005h\u0000\u0000\u0740\u0741"+ - "\u0003\u0174\u00ba\u0000\u0741\u0742\u0005\u009f\u0000\u0000\u0742\u0744"+ - "\u0001\u0000\u0000\u0000\u0743\u0740\u0001\u0000\u0000\u0000\u0744\u0747"+ - "\u0001\u0000\u0000\u0000\u0745\u0743\u0001\u0000\u0000\u0000\u0745\u0746"+ - "\u0001\u0000\u0000\u0000\u0746\u0748\u0001\u0000\u0000\u0000\u0747\u0745"+ - "\u0001\u0000\u0000\u0000\u0748\u0749\u0005i\u0000\u0000\u0749\u0173\u0001"+ - "\u0000\u0000\u0000\u074a\u074b\u0003\u00e4r\u0000\u074b\u074c\u0003\u00c2"+ - "a\u0000\u074c\u074f\u0001\u0000\u0000\u0000\u074d\u074f\u0003\u0178\u00bc"+ - "\u0000\u074e\u074a\u0001\u0000\u0000\u0000\u074e\u074d\u0001\u0000\u0000"+ - "\u0000\u074f\u0751\u0001\u0000\u0000\u0000\u0750\u0752\u0003\u0176\u00bb"+ - "\u0000\u0751\u0750\u0001\u0000\u0000\u0000\u0751\u0752\u0001\u0000\u0000"+ - "\u0000\u0752\u0175\u0001\u0000\u0000\u0000\u0753\u0754\u0007\u0012\u0000"+ - "\u0000\u0754\u0177\u0001\u0000\u0000\u0000\u0755\u0757\u0005\u0087\u0000"+ - "\u0000\u0756\u0755\u0001\u0000\u0000\u0000\u0756\u0757\u0001\u0000\u0000"+ - "\u0000\u0757\u0758\u0001\u0000\u0000\u0000\u0758\u075a\u0003\u0130\u0098"+ - "\u0000\u0759\u075b\u0003\u0132\u0099\u0000\u075a\u0759\u0001\u0000\u0000"+ - "\u0000\u075a\u075b\u0001\u0000\u0000\u0000\u075b\u0179\u0001\u0000\u0000"+ - "\u0000\u075c\u075d\u0005j\u0000\u0000\u075d\u075e\u0003\u00a2Q\u0000\u075e"+ - "\u075f\u0005k\u0000\u0000\u075f\u017b\u0001\u0000\u0000\u0000\u0760\u0761"+ - "\u0005p\u0000\u0000\u0761\u0762\u0005f\u0000\u0000\u0762\u0763\u0003\u00c2"+ - "a\u0000\u0763\u0764\u0005g\u0000\u0000\u0764\u017d\u0001\u0000\u0000\u0000"+ - "\u0765\u0774\u0005f\u0000\u0000\u0766\u076d\u0003\u00e6s\u0000\u0767\u076a"+ - "\u0003\u015a\u00ad\u0000\u0768\u0769\u0005m\u0000\u0000\u0769\u076b\u0003"+ - "\u00e6s\u0000\u076a\u0768\u0001\u0000\u0000\u0000\u076a\u076b\u0001\u0000"+ - "\u0000\u0000\u076b\u076d\u0001\u0000\u0000\u0000\u076c\u0766\u0001\u0000"+ - "\u0000\u0000\u076c\u0767\u0001\u0000\u0000\u0000\u076d\u076f\u0001\u0000"+ - "\u0000\u0000\u076e\u0770\u0005t\u0000\u0000\u076f\u076e\u0001\u0000\u0000"+ - "\u0000\u076f\u0770\u0001\u0000\u0000\u0000\u0770\u0772\u0001\u0000\u0000"+ - "\u0000\u0771\u0773\u0005m\u0000\u0000\u0772\u0771\u0001\u0000\u0000\u0000"+ - "\u0772\u0773\u0001\u0000\u0000\u0000\u0773\u0775\u0001\u0000\u0000\u0000"+ - "\u0774\u076c\u0001\u0000\u0000\u0000\u0774\u0775\u0001\u0000\u0000\u0000"+ - "\u0775\u0776\u0001\u0000\u0000\u0000\u0776\u0777\u0005g\u0000\u0000\u0777"+ - "\u017f\u0001\u0000\u0000\u0000\u0778\u0779\u0003\u015a\u00ad\u0000\u0779"+ - "\u077a\u0005p\u0000\u0000\u077a\u077b\u0005e\u0000\u0000\u077b\u0181\u0001"+ - "\u0000\u0000\u0000\u077c\u077d\u0003\u00c2a\u0000\u077d\u0183\u0001\u0000"+ - "\u0000\u0000\u077e\u0783\u0005n\u0000\u0000\u077f\u0783\u0005\u0000\u0000"+ - "\u0001\u0780\u0783\u0005\u009f\u0000\u0000\u0781\u0783\u0004\u00c2\u0012"+ - "\u0000\u0782\u077e\u0001\u0000\u0000\u0000\u0782\u077f\u0001\u0000\u0000"+ - "\u0000\u0782\u0780\u0001\u0000\u0000\u0000\u0782\u0781\u0001\u0000\u0000"+ - "\u0000\u0783\u0185\u0001\u0000\u0000\u0000\u00c5\u0194\u0199\u01a0\u01aa"+ - "\u01b0\u01b6\u01c6\u01ca\u01d3\u01df\u01e3\u01e9\u01f2\u01fc\u020d\u021b"+ - "\u021f\u0226\u022e\u0237\u0257\u025f\u0277\u028a\u0299\u02a6\u02af\u02bd"+ - "\u02c6\u02d2\u02e7\u02ee\u02f3\u02f8\u0302\u0305\u0309\u030d\u0315\u031d"+ - "\u0322\u032a\u032c\u0331\u0338\u0340\u0343\u0349\u034e\u0350\u0353\u035a"+ - "\u035f\u0372\u037a\u037e\u0381\u0387\u038b\u038e\u0398\u039f\u03a6\u03b2"+ - "\u03b7\u03bb\u03c2\u03c7\u03cd\u03d9\u03df\u03e3\u03eb\u03ef\u03f5\u03f8"+ - "\u03fe\u0403\u041c\u043f\u0441\u0458\u0460\u046b\u0472\u0479\u0483\u0491"+ - "\u04a7\u04a9\u04b1\u04b5\u04b9\u04bc\u04c7\u04cf\u04d6\u04de\u04e4\u04e8"+ - "\u04f0\u04fb\u0506\u050a\u050c\u0518\u051a\u0523\u0527\u052a\u0531\u053c"+ - "\u0546\u054c\u054e\u0558\u0562\u0566\u056a\u056e\u0575\u057d\u0588\u058c"+ - "\u0590\u0598\u05a4\u05a8\u05ac\u05b5\u05bc\u05d0\u05d4\u05d8\u05dc\u05ec"+ - "\u05f2\u05f4\u05f8\u05fc\u05ff\u0603\u0605\u060b\u0613\u0618\u0623\u0629"+ - "\u0630\u063b\u0640\u0644\u0649\u064d\u0655\u065d\u0662\u0665\u066d\u0675"+ - "\u067a\u067e\u0682\u0689\u068e\u0697\u06ab\u06bf\u06ca\u06ce\u06d6\u06da"+ - "\u06dc\u06e3\u06ec\u06f8\u0701\u0706\u070c\u0711\u0721\u0723\u072c\u0732"+ - "\u0738\u073c\u0745\u074e\u0751\u0756\u075a\u076a\u076c\u076f\u0772\u0774"+ - "\u0782"; + "\u0672\b\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0003\u0096\u0677\b"+ + "\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u067b\b\u0096\u0001\u0096\u0001"+ + "\u0096\u0003\u0096\u067f\b\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0098\u0001\u0098\u0003\u0098\u0686\b\u0098\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001"+ + "\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0005\u009d\u0697\b\u009d\n\u009d\f\u009d\u069a\t\u009d\u0001\u009e"+ + "\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0003\u00a1\u06ad\b\u00a1"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0003\u00a3\u06b8\b\u00a3\u0001\u00a4"+ + "\u0001\u00a4\u0003\u00a4\u06bc\b\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0005\u00a5\u06c2\b\u00a5\n\u00a5\f\u00a5\u06c5\t\u00a5\u0001"+ + "\u00a5\u0003\u00a5\u06c8\b\u00a5\u0003\u00a5\u06ca\b\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0003\u00a6\u06d1\b\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0005\u00a7"+ + "\u06d8\b\u00a7\n\u00a7\f\u00a7\u06db\t\u00a7\u0001\u00a8\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001"+ + "\u00aa\u0003\u00aa\u06e6\b\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0003\u00ab\u06ef\b\u00ab\u0001"+ + "\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0003"+ + "\u00ac\u06f7\b\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u06fc"+ + "\b\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00b0\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b2\u0001\u00b2\u0001\u00b2\u0003\u00b2\u070c\b\u00b2\u0003\u00b2\u070e"+ + "\b\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0005"+ + "\u00b3\u0715\b\u00b3\n\u00b3\f\u00b3\u0718\t\u00b3\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0003\u00b4\u071d\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0003\u00b5\u0723\b\u00b5\u0001\u00b6\u0001\u00b6\u0003\u00b6"+ + "\u0727\b\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0005\u00b7\u072e\b\u00b7\n\u00b7\f\u00b7\u0731\t\u00b7\u0001\u00b7\u0001"+ + "\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0003\u00b8\u0739"+ + "\b\u00b8\u0001\u00b8\u0003\u00b8\u073c\b\u00b8\u0001\u00b9\u0001\u00b9"+ + "\u0001\u00ba\u0003\u00ba\u0741\b\u00ba\u0001\u00ba\u0001\u00ba\u0003\u00ba"+ + "\u0745\b\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0005\u00bb"+ + "\u074b\b\u00bb\n\u00bb\f\u00bb\u074e\t\u00bb\u0001\u00bb\u0003\u00bb\u0751"+ + "\b\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00bd\u0003\u00bd\u075f\b\u00bd\u0003\u00bd\u0761\b\u00bd\u0001\u00bd"+ + "\u0003\u00bd\u0764\b\u00bd\u0001\u00bd\u0003\u00bd\u0767\b\u00bd\u0003"+ + "\u00bd\u0769\b\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001"+ + "\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c0\u0003\u00c0\u0777\b\u00c0\u0001\u00c0\u0001\u02ef\u0002"+ + "\u00a2\u00b2\u00c1\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ + "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfh"+ + "jlnprtvxz|~\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\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\u0000qr\u0002\u0000nn\u009f"+ + "\u009f\u0002\u0000\u008a\u008d\u008f\u0090\u0001\u0000\u0096\u0097\u07dd"+ + "\u0000\u0182\u0001\u0000\u0000\u0000\u0002\u0185\u0001\u0000\u0000\u0000"+ + "\u0004\u0188\u0001\u0000\u0000\u0000\u0006\u018b\u0001\u0000\u0000\u0000"+ + "\b\u0193\u0001\u0000\u0000\u0000\n\u019c\u0001\u0000\u0000\u0000\f\u01b7"+ + "\u0001\u0000\u0000\u0000\u000e\u01ba\u0001\u0000\u0000\u0000\u0010\u01c2"+ + "\u0001\u0000\u0000\u0000\u0012\u01cf\u0001\u0000\u0000\u0000\u0014\u01e5"+ + "\u0001\u0000\u0000\u0000\u0016\u01ee\u0001\u0000\u0000\u0000\u0018\u01f0"+ + "\u0001\u0000\u0000\u0000\u001a\u01f2\u0001\u0000\u0000\u0000\u001c\u01f5"+ + "\u0001\u0000\u0000\u0000\u001e\u0209\u0001\u0000\u0000\u0000 \u020b\u0001"+ + "\u0000\u0000\u0000\"\u020d\u0001\u0000\u0000\u0000$\u0212\u0001\u0000"+ + "\u0000\u0000&\u021d\u0001\u0000\u0000\u0000(\u022a\u0001\u0000\u0000\u0000"+ + "*\u022d\u0001\u0000\u0000\u0000,\u0238\u0001\u0000\u0000\u0000.\u023a"+ + "\u0001\u0000\u0000\u00000\u023f\u0001\u0000\u0000\u00002\u0244\u0001\u0000"+ + "\u0000\u00004\u0249\u0001\u0000\u0000\u00006\u024e\u0001\u0000\u0000\u0000"+ + "8\u025b\u0001\u0000\u0000\u0000:\u025d\u0001\u0000\u0000\u0000<\u025f"+ + "\u0001\u0000\u0000\u0000>\u0264\u0001\u0000\u0000\u0000@\u0269\u0001\u0000"+ + "\u0000\u0000B\u026e\u0001\u0000\u0000\u0000D\u0277\u0001\u0000\u0000\u0000"+ + "F\u027e\u0001\u0000\u0000\u0000H\u028b\u0001\u0000\u0000\u0000J\u028f"+ + "\u0001\u0000\u0000\u0000L\u029a\u0001\u0000\u0000\u0000N\u02a2\u0001\u0000"+ + "\u0000\u0000P\u02a4\u0001\u0000\u0000\u0000R\u02b9\u0001\u0000\u0000\u0000"+ + "T\u02bb\u0001\u0000\u0000\u0000V\u02c7\u0001\u0000\u0000\u0000X\u02d3"+ + "\u0001\u0000\u0000\u0000Z\u02e3\u0001\u0000\u0000\u0000\\\u02ef\u0001"+ + "\u0000\u0000\u0000^\u02fe\u0001\u0000\u0000\u0000`\u0301\u0001\u0000\u0000"+ + "\u0000b\u0309\u0001\u0000\u0000\u0000d\u030b\u0001\u0000\u0000\u0000f"+ + "\u0316\u0001\u0000\u0000\u0000h\u031e\u0001\u0000\u0000\u0000j\u032d\u0001"+ + "\u0000\u0000\u0000l\u032f\u0001\u0000\u0000\u0000n\u0337\u0001\u0000\u0000"+ + "\u0000p\u0345\u0001\u0000\u0000\u0000r\u0351\u0001\u0000\u0000\u0000t"+ + "\u035b\u0001\u0000\u0000\u0000v\u035f\u0001\u0000\u0000\u0000x\u0365\u0001"+ + "\u0000\u0000\u0000z\u037d\u0001\u0000\u0000\u0000|\u0385\u0001\u0000\u0000"+ + "\u0000~\u0394\u0001\u0000\u0000\u0000\u0080\u0396\u0001\u0000\u0000\u0000"+ + "\u0082\u039d\u0001\u0000\u0000\u0000\u0084\u03a6\u0001\u0000\u0000\u0000"+ + "\u0086\u03ab\u0001\u0000\u0000\u0000\u0088\u03b0\u0001\u0000\u0000\u0000"+ + "\u008a\u03b9\u0001\u0000\u0000\u0000\u008c\u03c0\u0001\u0000\u0000\u0000"+ + "\u008e\u03c5\u0001\u0000\u0000\u0000\u0090\u03cb\u0001\u0000\u0000\u0000"+ + "\u0092\u03d0\u0001\u0000\u0000\u0000\u0094\u03d7\u0001\u0000\u0000\u0000"+ + "\u0096\u03e1\u0001\u0000\u0000\u0000\u0098\u03e5\u0001\u0000\u0000\u0000"+ + "\u009a\u03f1\u0001\u0000\u0000\u0000\u009c\u03f4\u0001\u0000\u0000\u0000"+ + "\u009e\u03f8\u0001\u0000\u0000\u0000\u00a0\u03ff\u0001\u0000\u0000\u0000"+ + "\u00a2\u0418\u0001\u0000\u0000\u0000\u00a4\u0454\u0001\u0000\u0000\u0000"+ + "\u00a6\u0456\u0001\u0000\u0000\u0000\u00a8\u0459\u0001\u0000\u0000\u0000"+ + "\u00aa\u045e\u0001\u0000\u0000\u0000\u00ac\u0467\u0001\u0000\u0000\u0000"+ + "\u00ae\u0475\u0001\u0000\u0000\u0000\u00b0\u047f\u0001\u0000\u0000\u0000"+ + "\u00b2\u048d\u0001\u0000\u0000\u0000\u00b4\u04a8\u0001\u0000\u0000\u0000"+ + "\u00b6\u04ab\u0001\u0000\u0000\u0000\u00b8\u04b3\u0001\u0000\u0000\u0000"+ + "\u00ba\u04bc\u0001\u0000\u0000\u0000\u00bc\u04cb\u0001\u0000\u0000\u0000"+ + "\u00be\u04cd\u0001\u0000\u0000\u0000\u00c0\u04e0\u0001\u0000\u0000\u0000"+ + "\u00c2\u04ec\u0001\u0000\u0000\u0000\u00c4\u04f7\u0001\u0000\u0000\u0000"+ + "\u00c6\u04f9\u0001\u0000\u0000\u0000\u00c8\u04fc\u0001\u0000\u0000\u0000"+ + "\u00ca\u0516\u0001\u0000\u0000\u0000\u00cc\u0518\u0001\u0000\u0000\u0000"+ + "\u00ce\u051d\u0001\u0000\u0000\u0000\u00d0\u0531\u0001\u0000\u0000\u0000"+ + "\u00d2\u0533\u0001\u0000\u0000\u0000\u00d4\u0535\u0001\u0000\u0000\u0000"+ + "\u00d6\u0538\u0001\u0000\u0000\u0000\u00d8\u0542\u0001\u0000\u0000\u0000"+ + "\u00da\u054c\u0001\u0000\u0000\u0000\u00dc\u054f\u0001\u0000\u0000\u0000"+ + "\u00de\u0554\u0001\u0000\u0000\u0000\u00e0\u0556\u0001\u0000\u0000\u0000"+ + "\u00e2\u0564\u0001\u0000\u0000\u0000\u00e4\u056c\u0001\u0000\u0000\u0000"+ + "\u00e6\u0574\u0001\u0000\u0000\u0000\u00e8\u057c\u0001\u0000\u0000\u0000"+ + "\u00ea\u058c\u0001\u0000\u0000\u0000\u00ec\u058e\u0001\u0000\u0000\u0000"+ + "\u00ee\u0592\u0001\u0000\u0000\u0000\u00f0\u0598\u0001\u0000\u0000\u0000"+ + "\u00f2\u05a6\u0001\u0000\u0000\u0000\u00f4\u05af\u0001\u0000\u0000\u0000"+ + "\u00f6\u05b8\u0001\u0000\u0000\u0000\u00f8\u05ba\u0001\u0000\u0000\u0000"+ + "\u00fa\u05bc\u0001\u0000\u0000\u0000\u00fc\u05c0\u0001\u0000\u0000\u0000"+ + "\u00fe\u05c3\u0001\u0000\u0000\u0000\u0100\u05c7\u0001\u0000\u0000\u0000"+ + "\u0102\u05c9\u0001\u0000\u0000\u0000\u0104\u05ce\u0001\u0000\u0000\u0000"+ + "\u0106\u05d2\u0001\u0000\u0000\u0000\u0108\u05d6\u0001\u0000\u0000\u0000"+ + "\u010a\u05da\u0001\u0000\u0000\u0000\u010c\u05dd\u0001\u0000\u0000\u0000"+ + "\u010e\u05df\u0001\u0000\u0000\u0000\u0110\u05f4\u0001\u0000\u0000\u0000"+ + "\u0112\u05f6\u0001\u0000\u0000\u0000\u0114\u060c\u0001\u0000\u0000\u0000"+ + "\u0116\u0614\u0001\u0000\u0000\u0000\u0118\u0616\u0001\u0000\u0000\u0000"+ + "\u011a\u062c\u0001\u0000\u0000\u0000\u011c\u0634\u0001\u0000\u0000\u0000"+ + "\u011e\u063c\u0001\u0000\u0000\u0000\u0120\u0640\u0001\u0000\u0000\u0000"+ + "\u0122\u064c\u0001\u0000\u0000\u0000\u0124\u0656\u0001\u0000\u0000\u0000"+ + "\u0126\u0661\u0001\u0000\u0000\u0000\u0128\u0669\u0001\u0000\u0000\u0000"+ + "\u012a\u066d\u0001\u0000\u0000\u0000\u012c\u0676\u0001\u0000\u0000\u0000"+ + "\u012e\u0680\u0001\u0000\u0000\u0000\u0130\u0685\u0001\u0000\u0000\u0000"+ + "\u0132\u0687\u0001\u0000\u0000\u0000\u0134\u068c\u0001\u0000\u0000\u0000"+ + "\u0136\u068e\u0001\u0000\u0000\u0000\u0138\u0690\u0001\u0000\u0000\u0000"+ + "\u013a\u0693\u0001\u0000\u0000\u0000\u013c\u069b\u0001\u0000\u0000\u0000"+ + "\u013e\u069d\u0001\u0000\u0000\u0000\u0140\u06a1\u0001\u0000\u0000\u0000"+ + "\u0142\u06ac\u0001\u0000\u0000\u0000\u0144\u06b0\u0001\u0000\u0000\u0000"+ + "\u0146\u06b7\u0001\u0000\u0000\u0000\u0148\u06bb\u0001\u0000\u0000\u0000"+ + "\u014a\u06bd\u0001\u0000\u0000\u0000\u014c\u06cd\u0001\u0000\u0000\u0000"+ + "\u014e\u06d4\u0001\u0000\u0000\u0000\u0150\u06dc\u0001\u0000\u0000\u0000"+ + "\u0152\u06df\u0001\u0000\u0000\u0000\u0154\u06e1\u0001\u0000\u0000\u0000"+ + "\u0156\u06ee\u0001\u0000\u0000\u0000\u0158\u06f6\u0001\u0000\u0000\u0000"+ + "\u015a\u06fb\u0001\u0000\u0000\u0000\u015c\u06fd\u0001\u0000\u0000\u0000"+ + "\u015e\u06ff\u0001\u0000\u0000\u0000\u0160\u0701\u0001\u0000\u0000\u0000"+ + "\u0162\u0705\u0001\u0000\u0000\u0000\u0164\u0708\u0001\u0000\u0000\u0000"+ + "\u0166\u0711\u0001\u0000\u0000\u0000\u0168\u071c\u0001\u0000\u0000\u0000"+ + "\u016a\u0722\u0001\u0000\u0000\u0000\u016c\u0726\u0001\u0000\u0000\u0000"+ + "\u016e\u0728\u0001\u0000\u0000\u0000\u0170\u0738\u0001\u0000\u0000\u0000"+ + "\u0172\u073d\u0001\u0000\u0000\u0000\u0174\u0740\u0001\u0000\u0000\u0000"+ + "\u0176\u0746\u0001\u0000\u0000\u0000\u0178\u0754\u0001\u0000\u0000\u0000"+ + "\u017a\u0759\u0001\u0000\u0000\u0000\u017c\u076c\u0001\u0000\u0000\u0000"+ + "\u017e\u0770\u0001\u0000\u0000\u0000\u0180\u0776\u0001\u0000\u0000\u0000"+ + "\u0182\u0183\u0003\u00a2Q\u0000\u0183\u0184\u0005\u0000\u0000\u0001\u0184"+ + "\u0001\u0001\u0000\u0000\u0000\u0185\u0186\u0003\u00a4R\u0000\u0186\u0187"+ + "\u0005\u0000\u0000\u0001\u0187\u0003\u0001\u0000\u0000\u0000\u0188\u0189"+ + "\u0003\u00c2a\u0000\u0189\u018a\u0005\u0000\u0000\u0001\u018a\u0005\u0001"+ + "\u0000\u0000\u0000\u018b\u0190\u0003\b\u0004\u0000\u018c\u018d\u0005m"+ + "\u0000\u0000\u018d\u018f\u0003\b\u0004\u0000\u018e\u018c\u0001\u0000\u0000"+ + "\u0000\u018f\u0192\u0001\u0000\u0000\u0000\u0190\u018e\u0001\u0000\u0000"+ + "\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u0007\u0001\u0000\u0000"+ + "\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0195\u0005e\u0000\u0000"+ + "\u0194\u0196\u0005<\u0000\u0000\u0195\u0194\u0001\u0000\u0000\u0000\u0195"+ + "\u0196\u0001\u0000\u0000\u0000\u0196\t\u0001\u0000\u0000\u0000\u0197\u0198"+ + "\u0003\f\u0006\u0000\u0198\u0199\u0003\u0180\u00c0\u0000\u0199\u019b\u0001"+ + "\u0000\u0000\u0000\u019a\u0197\u0001\u0000\u0000\u0000\u019b\u019e\u0001"+ + "\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000\u019c\u019d\u0001"+ + "\u0000\u0000\u0000\u019d\u019f\u0001\u0000\u0000\u0000\u019e\u019c\u0001"+ + "\u0000\u0000\u0000\u019f\u01a0\u0003\u00dam\u0000\u01a0\u01a6\u0003\u0180"+ + "\u00c0\u0000\u01a1\u01a2\u0003\u0012\t\u0000\u01a2\u01a3\u0003\u0180\u00c0"+ + "\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a1\u0001\u0000\u0000"+ + "\u0000\u01a5\u01a8\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000"+ + "\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01b2\u0001\u0000\u0000"+ + "\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a9\u01ad\u0003\u0086C\u0000"+ + "\u01aa\u01ad\u0003\u00deo\u0000\u01ab\u01ad\u0003\u0014\n\u0000\u01ac"+ + "\u01a9\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ac"+ + "\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae"+ + "\u01af\u0003\u0180\u00c0\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0"+ + "\u01ac\u0001\u0000\u0000\u0000\u01b1\u01b4\u0001\u0000\u0000\u0000\u01b2"+ + "\u01b0\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3"+ + "\u01b5\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b5"+ + "\u01b6\u0005\u0000\u0000\u0001\u01b6\u000b\u0001\u0000\u0000\u0000\u01b7"+ + "\u01b8\u0005E\u0000\u0000\u01b8\u01b9\u0003\u00a2Q\u0000\u01b9\r\u0001"+ + "\u0000\u0000\u0000\u01ba\u01bb\u0005F\u0000\u0000\u01bb\u01bc\u0003\u00a2"+ + "Q\u0000\u01bc\u000f\u0001\u0000\u0000\u0000\u01bd\u01be\u0003\u000e\u0007"+ + "\u0000\u01be\u01bf\u0003\u0180\u00c0\u0000\u01bf\u01c1\u0001\u0000\u0000"+ + "\u0000\u01c0\u01bd\u0001\u0000\u0000\u0000\u01c1\u01c4\u0001\u0000\u0000"+ + "\u0000\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c3\u0001\u0000\u0000"+ + "\u0000\u01c3\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000"+ + "\u0000\u01c5\u01c7\u0007\u0000\u0000\u0000\u01c6\u01c5\u0001\u0000\u0000"+ + "\u0000\u01c6\u01c7\u0001\u0000\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000"+ + "\u0000\u01c8\u01c9\u0003\u00dcn\u0000\u01c9\u0011\u0001\u0000\u0000\u0000"+ + "\u01ca\u01cb\u0003\u000e\u0007\u0000\u01cb\u01cc\u0003\u0180\u00c0\u0000"+ + "\u01cc\u01ce\u0001\u0000\u0000\u0000\u01cd\u01ca\u0001\u0000\u0000\u0000"+ + "\u01ce\u01d1\u0001\u0000\u0000\u0000\u01cf\u01cd\u0001\u0000\u0000\u0000"+ + "\u01cf\u01d0\u0001\u0000\u0000\u0000\u01d0\u01df\u0001\u0000\u0000\u0000"+ + "\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d2\u01d3\u0005a\u0000\u0000\u01d3"+ + "\u01e0\u0003\u0010\b\u0000\u01d4\u01d5\u0005a\u0000\u0000\u01d5\u01db"+ + "\u0005f\u0000\u0000\u01d6\u01d7\u0003\u0010\b\u0000\u01d7\u01d8\u0003"+ + "\u0180\u00c0\u0000\u01d8\u01da\u0001\u0000\u0000\u0000\u01d9\u01d6\u0001"+ + "\u0000\u0000\u0000\u01da\u01dd\u0001\u0000\u0000\u0000\u01db\u01d9\u0001"+ + "\u0000\u0000\u0000\u01db\u01dc\u0001\u0000\u0000\u0000\u01dc\u01de\u0001"+ + "\u0000\u0000\u0000\u01dd\u01db\u0001\u0000\u0000\u0000\u01de\u01e0\u0005"+ + "g\u0000\u0000\u01df\u01d2\u0001\u0000\u0000\u0000\u01df\u01d4\u0001\u0000"+ + "\u0000\u0000\u01e0\u0013\u0001\u0000\u0000\u0000\u01e1\u01e6\u0003x<\u0000"+ + "\u01e2\u01e6\u0003\u008eG\u0000\u01e3\u01e6\u0003\u0092I\u0000\u01e4\u01e6"+ + "\u0003\u008cF\u0000\u01e5\u01e1\u0001\u0000\u0000\u0000\u01e5\u01e2\u0001"+ + "\u0000\u0000\u0000\u01e5\u01e3\u0001\u0000\u0000\u0000\u01e5\u01e4\u0001"+ + "\u0000\u0000\u0000\u01e6\u0015\u0001\u0000\u0000\u0000\u01e7\u01e8\u0005"+ + "\u001b\u0000\u0000\u01e8\u01ef\u0003\u00a4R\u0000\u01e9\u01ea\u0007\u0001"+ + "\u0000\u0000\u01ea\u01ef\u0003,\u0016\u0000\u01eb\u01ec\u0007\u0002\u0000"+ + "\u0000\u01ec\u01ef\u0003\u00a2Q\u0000\u01ed\u01ef\u0003d2\u0000\u01ee"+ + "\u01e7\u0001\u0000\u0000\u0000\u01ee\u01e9\u0001\u0000\u0000\u0000\u01ee"+ + "\u01eb\u0001\u0000\u0000\u0000\u01ee\u01ed\u0001\u0000\u0000\u0000\u01ef"+ + "\u0017\u0001\u0000\u0000\u0000\u01f0\u01f1\u0003\u001a\r\u0000\u01f1\u0019"+ + "\u0001\u0000\u0000\u0000\u01f2\u01f3\u0003\\.\u0000\u01f3\u01f4\u0003"+ + "\u001c\u000e\u0000\u01f4\u001b\u0001\u0000\u0000\u0000\u01f5\u01f6\u0005"+ + "D\u0000\u0000\u01f6\u01f8\u0005f\u0000\u0000\u01f7\u01f9\u0003\u00f4z"+ + "\u0000\u01f8\u01f7\u0001\u0000\u0000\u0000\u01f8\u01f9\u0001\u0000\u0000"+ + "\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0005g\u0000\u0000"+ + "\u01fb\u001d\u0001\u0000\u0000\u0000\u01fc\u020a\u0003D\"\u0000\u01fd"+ + "\u020a\u0003B!\u0000\u01fe\u020a\u0003@ \u0000\u01ff\u020a\u0003\"\u0011"+ + "\u0000\u0200\u020a\u0003>\u001f\u0000\u0201\u020a\u00036\u001b\u0000\u0202"+ + "\u020a\u0003<\u001e\u0000\u0203\u020a\u00034\u001a\u0000\u0204\u020a\u0003"+ + "0\u0018\u0000\u0205\u020a\u0003.\u0017\u0000\u0206\u020a\u00032\u0019"+ + "\u0000\u0207\u020a\u0003 \u0010\u0000\u0208\u020a\u0003F#\u0000\u0209"+ + "\u01fc\u0001\u0000\u0000\u0000\u0209\u01fd\u0001\u0000\u0000\u0000\u0209"+ + "\u01fe\u0001\u0000\u0000\u0000\u0209\u01ff\u0001\u0000\u0000\u0000\u0209"+ + "\u0200\u0001\u0000\u0000\u0000\u0209\u0201\u0001\u0000\u0000\u0000\u0209"+ + "\u0202\u0001\u0000\u0000\u0000\u0209\u0203\u0001\u0000\u0000\u0000\u0209"+ + "\u0204\u0001\u0000\u0000\u0000\u0209\u0205\u0001\u0000\u0000\u0000\u0209"+ + "\u0206\u0001\u0000\u0000\u0000\u0209\u0207\u0001\u0000\u0000\u0000\u0209"+ + "\u0208\u0001\u0000\u0000\u0000\u020a\u001f\u0001\u0000\u0000\u0000\u020b"+ + "\u020c\u0007\u0003\u0000\u0000\u020c!\u0001\u0000\u0000\u0000\u020d\u020e"+ + "\u0005^\u0000\u0000\u020e\u020f\u0005j\u0000\u0000\u020f\u0210\u0003\u00c2"+ + "a\u0000\u0210\u0211\u0005k\u0000\u0000\u0211#\u0001\u0000\u0000\u0000"+ + "\u0212\u0217\u0003&\u0013\u0000\u0213\u0214\u0005m\u0000\u0000\u0214\u0216"+ + "\u0003&\u0013\u0000\u0215\u0213\u0001\u0000\u0000\u0000\u0216\u0219\u0001"+ + "\u0000\u0000\u0000\u0217\u0215\u0001\u0000\u0000\u0000\u0217\u0218\u0001"+ + "\u0000\u0000\u0000\u0218\u021b\u0001\u0000\u0000\u0000\u0219\u0217\u0001"+ + "\u0000\u0000\u0000\u021a\u021c\u0005m\u0000\u0000\u021b\u021a\u0001\u0000"+ + "\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c%\u0001\u0000\u0000"+ + "\u0000\u021d\u0222\u0005e\u0000\u0000\u021e\u021f\u0005m\u0000\u0000\u021f"+ + "\u0221\u0005e\u0000\u0000\u0220\u021e\u0001\u0000\u0000\u0000\u0221\u0224"+ + "\u0001\u0000\u0000\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223"+ + "\u0001\u0000\u0000\u0000\u0223\u0225\u0001\u0000\u0000\u0000\u0224\u0222"+ + "\u0001\u0000\u0000\u0000\u0225\u0226\u0003\u0136\u009b\u0000\u0226\'\u0001"+ + "\u0000\u0000\u0000\u0227\u0229\u0003*\u0015\u0000\u0228\u0227\u0001\u0000"+ + "\u0000\u0000\u0229\u022c\u0001\u0000\u0000\u0000\u022a\u0228\u0001\u0000"+ + "\u0000\u0000\u022a\u022b\u0001\u0000\u0000\u0000\u022b)\u0001\u0000\u0000"+ + "\u0000\u022c\u022a\u0001\u0000\u0000\u0000\u022d\u022e\u0005h\u0000\u0000"+ + "\u022e\u0233\u0003\u00a2Q\u0000\u022f\u0230\u0005m\u0000\u0000\u0230\u0232"+ + "\u0003\u00a2Q\u0000\u0231\u022f\u0001\u0000\u0000\u0000\u0232\u0235\u0001"+ + "\u0000\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001"+ + "\u0000\u0000\u0000\u0234\u0236\u0001\u0000\u0000\u0000\u0235\u0233\u0001"+ + "\u0000\u0000\u0000\u0236\u0237\u0005i\u0000\u0000\u0237+\u0001\u0000\u0000"+ + "\u0000\u0238\u0239\u0003\u00b2Y\u0000\u0239-\u0001\u0000\u0000\u0000\u023a"+ + "\u023b\u00051\u0000\u0000\u023b\u023c\u0005f\u0000\u0000\u023c\u023d\u0003"+ + "\u00a2Q\u0000\u023d\u023e\u0005g\u0000\u0000\u023e/\u0001\u0000\u0000"+ + "\u0000\u023f\u0240\u00057\u0000\u0000\u0240\u0241\u0005j\u0000\u0000\u0241"+ + "\u0242\u0003\u00c2a\u0000\u0242\u0243\u0005k\u0000\u0000\u02431\u0001"+ + "\u0000\u0000\u0000\u0244\u0245\u00052\u0000\u0000\u0245\u0246\u0005f\u0000"+ + "\u0000\u0246\u0247\u0003\u00a2Q\u0000\u0247\u0248\u0005g\u0000\u0000\u0248"+ + "3\u0001\u0000\u0000\u0000\u0249\u024a\u0007\u0004\u0000\u0000\u024a\u024b"+ + "\u0005f\u0000\u0000\u024b\u024c\u0003\u00a2Q\u0000\u024c\u024d\u0005g"+ + "\u0000\u0000\u024d5\u0001\u0000\u0000\u0000\u024e\u0253\u0005\u0011\u0000"+ + "\u0000\u024f\u0250\u0005j\u0000\u0000\u0250\u0251\u00038\u001c\u0000\u0251"+ + "\u0252\u0005k\u0000\u0000\u0252\u0254\u0001\u0000\u0000\u0000\u0253\u024f"+ + "\u0001\u0000\u0000\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0255"+ + "\u0001\u0000\u0000\u0000\u0255\u0256\u0005f\u0000\u0000\u0256\u0257\u0003"+ + "\u00a2Q\u0000\u0257\u0258\u0005g\u0000\u0000\u02587\u0001\u0000\u0000"+ + "\u0000\u0259\u025c\u0003:\u001d\u0000\u025a\u025c\u0005\u0013\u0000\u0000"+ + "\u025b\u0259\u0001\u0000\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025c9\u0001\u0000\u0000\u0000\u025d\u025e\u0005e\u0000\u0000\u025e;"+ + "\u0001\u0000\u0000\u0000\u025f\u0260\u0005\u0012\u0000\u0000\u0260\u0261"+ + "\u0005f\u0000\u0000\u0261\u0262\u0003\u00a2Q\u0000\u0262\u0263\u0005g"+ + "\u0000\u0000\u0263=\u0001\u0000\u0000\u0000\u0264\u0265\u0005:\u0000\u0000"+ + "\u0265\u0266\u0005f\u0000\u0000\u0266\u0267\u0003\u00a2Q\u0000\u0267\u0268"+ + "\u0005g\u0000\u0000\u0268?\u0001\u0000\u0000\u0000\u0269\u026a\u00059"+ + "\u0000\u0000\u026a\u026b\u0005f\u0000\u0000\u026b\u026c\u0003\u00a2Q\u0000"+ + "\u026c\u026d\u0005g\u0000\u0000\u026dA\u0001\u0000\u0000\u0000\u026e\u026f"+ + "\u0005\u0016\u0000\u0000\u026f\u0270\u0005f\u0000\u0000\u0270\u0273\u0003"+ + "\u00a2Q\u0000\u0271\u0272\u0005m\u0000\u0000\u0272\u0274\u0003\u00a2Q"+ + "\u0000\u0273\u0271\u0001\u0000\u0000\u0000\u0273\u0274\u0001\u0000\u0000"+ + "\u0000\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0276\u0005g\u0000\u0000"+ + "\u0276C\u0001\u0000\u0000\u0000\u0277\u0278\u0007\u0004\u0000\u0000\u0278"+ + "\u0279\u0005j\u0000\u0000\u0279\u027a\u0003\u00a2Q\u0000\u027a\u027b\u0005"+ + "=\u0000\u0000\u027b\u027c\u0003\u00a2Q\u0000\u027c\u027d\u0005k\u0000"+ + "\u0000\u027dE\u0001\u0000\u0000\u0000\u027e\u027f\u00056\u0000\u0000\u027f"+ + "\u0280\u0003\u00a2Q\u0000\u0280\u0286\u0005h\u0000\u0000\u0281\u0282\u0003"+ + "H$\u0000\u0282\u0283\u0003\u0180\u00c0\u0000\u0283\u0285\u0001\u0000\u0000"+ + "\u0000\u0284\u0281\u0001\u0000\u0000\u0000\u0285\u0288\u0001\u0000\u0000"+ + "\u0000\u0286\u0284\u0001\u0000\u0000\u0000\u0286\u0287\u0001\u0000\u0000"+ + "\u0000\u0287\u0289\u0001\u0000\u0000\u0000\u0288\u0286\u0001\u0000\u0000"+ + "\u0000\u0289\u028a\u0005i\u0000\u0000\u028aG\u0001\u0000\u0000\u0000\u028b"+ + "\u028c\u0003h4\u0000\u028c\u028d\u0005o\u0000\u0000\u028d\u028e\u0003"+ + "\u00a2Q\u0000\u028eI\u0001\u0000\u0000\u0000\u028f\u0290\u0005j\u0000"+ + "\u0000\u0290\u0295\u0003L&\u0000\u0291\u0292\u0005m\u0000\u0000\u0292"+ + "\u0294\u0003L&\u0000\u0293\u0291\u0001\u0000\u0000\u0000\u0294\u0297\u0001"+ + "\u0000\u0000\u0000\u0295\u0293\u0001\u0000\u0000\u0000\u0295\u0296\u0001"+ + "\u0000\u0000\u0000\u0296\u0298\u0001\u0000\u0000\u0000\u0297\u0295\u0001"+ + "\u0000\u0000\u0000\u0298\u0299\u0005k\u0000\u0000\u0299K\u0001\u0000\u0000"+ + "\u0000\u029a\u029b\u0003\u00a2Q\u0000\u029b\u029c\u0005l\u0000\u0000\u029c"+ + "\u029d\u0003\u00a2Q\u0000\u029dM\u0001\u0000\u0000\u0000\u029e\u02a3\u0003"+ + "Z-\u0000\u029f\u02a3\u0003X,\u0000\u02a0\u02a3\u0003P(\u0000\u02a1\u02a3"+ + "\u0003T*\u0000\u02a2\u029e\u0001\u0000\u0000\u0000\u02a2\u029f\u0001\u0000"+ + "\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000\u02a2\u02a1\u0001\u0000"+ + "\u0000\u0000\u02a3O\u0001\u0000\u0000\u0000\u02a4\u02a5\u00053\u0000\u0000"+ + "\u02a5\u02ab\u0005h\u0000\u0000\u02a6\u02a7\u0003R)\u0000\u02a7\u02a8"+ + "\u0003\u0180\u00c0\u0000\u02a8\u02aa\u0001\u0000\u0000\u0000\u02a9\u02a6"+ + "\u0001\u0000\u0000\u0000\u02aa\u02ad\u0001\u0000\u0000\u0000\u02ab\u02a9"+ + "\u0001\u0000\u0000\u0000\u02ab\u02ac\u0001\u0000\u0000\u0000\u02ac\u02ae"+ + "\u0001\u0000\u0000\u0000\u02ad\u02ab\u0001\u0000\u0000\u0000\u02ae\u02af"+ + "\u0005i\u0000\u0000\u02afQ\u0001\u0000\u0000\u0000\u02b0\u02b1\u0005M"+ + "\u0000\u0000\u02b1\u02b2\u0005e\u0000\u0000\u02b2\u02ba\u0003\u0146\u00a3"+ + "\u0000\u02b3\u02b4\u00054\u0000\u0000\u02b4\u02b5\u0005h\u0000\u0000\u02b5"+ + "\u02b6\u0003\u00a2Q\u0000\u02b6\u02b7\u0003\u0180\u00c0\u0000\u02b7\u02b8"+ + "\u0005i\u0000\u0000\u02b8\u02ba\u0001\u0000\u0000\u0000\u02b9\u02b0\u0001"+ + "\u0000\u0000\u0000\u02b9\u02b3\u0001\u0000\u0000\u0000\u02baS\u0001\u0000"+ + "\u0000\u0000\u02bb\u02bc\u00055\u0000\u0000\u02bc\u02c2\u0005h\u0000\u0000"+ + "\u02bd\u02be\u0003V+\u0000\u02be\u02bf\u0003\u0180\u00c0\u0000\u02bf\u02c1"+ + "\u0001\u0000\u0000\u0000\u02c0\u02bd\u0001\u0000\u0000\u0000\u02c1\u02c4"+ + "\u0001\u0000\u0000\u0000\u02c2\u02c0\u0001\u0000\u0000\u0000\u02c2\u02c3"+ + "\u0001\u0000\u0000\u0000\u02c3\u02c5\u0001\u0000\u0000\u0000\u02c4\u02c2"+ + "\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005i\u0000\u0000\u02c6U\u0001\u0000"+ + "\u0000\u0000\u02c7\u02c8\u0005e\u0000\u0000\u02c8\u02ce\u0005h\u0000\u0000"+ + "\u02c9\u02ca\u0003\u0170\u00b8\u0000\u02ca\u02cb\u0003\u0180\u00c0\u0000"+ + "\u02cb\u02cd\u0001\u0000\u0000\u0000\u02cc\u02c9\u0001\u0000\u0000\u0000"+ + "\u02cd\u02d0\u0001\u0000\u0000\u0000\u02ce\u02cc\u0001\u0000\u0000\u0000"+ + "\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02d1\u0001\u0000\u0000\u0000"+ + "\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005i\u0000\u0000\u02d2"+ + "W\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005\u001b\u0000\u0000\u02d4\u02d5"+ + "\u0005j\u0000\u0000\u02d5\u02d6\u0005k\u0000\u0000\u02d6\u02d7\u0003\u0136"+ + "\u009b\u0000\u02d7Y\u0001\u0000\u0000\u0000\u02d8\u02d9\u0007\u0005\u0000"+ + "\u0000\u02d9\u02da\u0005j\u0000\u0000\u02da\u02db\u0003\u00c2a\u0000\u02db"+ + "\u02dc\u0005k\u0000\u0000\u02dc\u02e4\u0001\u0000\u0000\u0000\u02dd\u02de"+ + "\u0005+\u0000\u0000\u02de\u02df\u0005j\u0000\u0000\u02df\u02e0\u0003\u00c2"+ + "a\u0000\u02e0\u02e1\u0005k\u0000\u0000\u02e1\u02e2\u0003\u00c2a\u0000"+ + "\u02e2\u02e4\u0001\u0000\u0000\u0000\u02e3\u02d8\u0001\u0000\u0000\u0000"+ + "\u02e3\u02dd\u0001\u0000\u0000\u0000\u02e4[\u0001\u0000\u0000\u0000\u02e5"+ + "\u02eb\u0003^/\u0000\u02e6\u02e7\u0005\u000e\u0000\u0000\u02e7\u02eb\u0006"+ + ".\uffff\uffff\u0000\u02e8\u02e9\u0005C\u0000\u0000\u02e9\u02eb\u0006."+ + "\uffff\uffff\u0000\u02ea\u02e5\u0001\u0000\u0000\u0000\u02ea\u02e6\u0001"+ + "\u0000\u0000\u0000\u02ea\u02e8\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001"+ + "\u0000\u0000\u0000\u02ec\u02ee\u0003\u0180\u00c0\u0000\u02ed\u02ea\u0001"+ + "\u0000\u0000\u0000\u02ee\u02f1\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001"+ + "\u0000\u0000\u0000\u02ef\u02ed\u0001\u0000\u0000\u0000\u02f0\u02f4\u0001"+ + "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f3\u0005"+ + "\u000e\u0000\u0000\u02f3\u02f5\u0006.\uffff\uffff\u0000\u02f4\u02f2\u0001"+ + "\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5]\u0001\u0000"+ + "\u0000\u0000\u02f6\u02f7\u0005\t\u0000\u0000\u02f7\u02ff\u0003b1\u0000"+ + "\u02f8\u02f9\u0005\n\u0000\u0000\u02f9\u02ff\u0003b1\u0000\u02fa\u02fb"+ + "\u0005\u000b\u0000\u0000\u02fb\u02ff\u0003b1\u0000\u02fc\u02fd\u0005\r"+ + "\u0000\u0000\u02fd\u02ff\u0003`0\u0000\u02fe\u02f6\u0001\u0000\u0000\u0000"+ + "\u02fe\u02f8\u0001\u0000\u0000\u0000\u02fe\u02fa\u0001\u0000\u0000\u0000"+ + "\u02fe\u02fc\u0001\u0000\u0000\u0000\u02ff_\u0001\u0000\u0000\u0000\u0300"+ + "\u0302\u0003\u00e6s\u0000\u0301\u0300\u0001\u0000\u0000\u0000\u0301\u0302"+ + "\u0001\u0000\u0000\u0000\u0302\u0305\u0001\u0000\u0000\u0000\u0303\u0304"+ + "\u0005\\\u0000\u0000\u0304\u0306\u0003\u00a2Q\u0000\u0305\u0303\u0001"+ + "\u0000\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306a\u0001\u0000"+ + "\u0000\u0000\u0307\u030a\u0001\u0000\u0000\u0000\u0308\u030a\u0003\u00a2"+ + "Q\u0000\u0309\u0307\u0001\u0000\u0000\u0000\u0309\u0308\u0001\u0000\u0000"+ + "\u0000\u030ac\u0001\u0000\u0000\u0000\u030b\u030c\u00056\u0000\u0000\u030c"+ + "\u030d\u0003\u00a2Q\u0000\u030d\u0311\u0005h\u0000\u0000\u030e\u0310\u0003"+ + "f3\u0000\u030f\u030e\u0001\u0000\u0000\u0000\u0310\u0313\u0001\u0000\u0000"+ + "\u0000\u0311\u030f\u0001\u0000\u0000\u0000\u0311\u0312\u0001\u0000\u0000"+ + "\u0000\u0312\u0314\u0001\u0000\u0000\u0000\u0313\u0311\u0001\u0000\u0000"+ + "\u0000\u0314\u0315\u0005i\u0000\u0000\u0315e\u0001\u0000\u0000\u0000\u0316"+ + "\u0317\u0003h4\u0000\u0317\u0319\u0005o\u0000\u0000\u0318\u031a\u0003"+ + "\u00f4z\u0000\u0319\u0318\u0001\u0000\u0000\u0000\u0319\u031a\u0001\u0000"+ + "\u0000\u0000\u031ag\u0001\u0000\u0000\u0000\u031b\u031c\u0005P\u0000\u0000"+ + "\u031c\u031f\u0003j5\u0000\u031d\u031f\u0005L\u0000\u0000\u031e\u031b"+ + "\u0001\u0000\u0000\u0000\u031e\u031d\u0001\u0000\u0000\u0000\u031fi\u0001"+ + "\u0000\u0000\u0000\u0320\u0321\u0005%\u0000\u0000\u0321\u032e\u0005e\u0000"+ + "\u0000\u0322\u0323\u0003\u00cae\u0000\u0323\u0328\u0005h\u0000\u0000\u0324"+ + "\u0326\u0003l6\u0000\u0325\u0327\u0005m\u0000\u0000\u0326\u0325\u0001"+ + "\u0000\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u0329\u0001"+ + "\u0000\u0000\u0000\u0328\u0324\u0001\u0000\u0000\u0000\u0328\u0329\u0001"+ + "\u0000\u0000\u0000\u0329\u032a\u0001\u0000\u0000\u0000\u032a\u032b\u0005"+ + "i\u0000\u0000\u032b\u032e\u0001\u0000\u0000\u0000\u032c\u032e\u0003\u00a2"+ + "Q\u0000\u032d\u0320\u0001\u0000\u0000\u0000\u032d\u0322\u0001\u0000\u0000"+ + "\u0000\u032d\u032c\u0001\u0000\u0000\u0000\u032ek\u0001\u0000\u0000\u0000"+ + "\u032f\u0334\u0003j5\u0000\u0330\u0331\u0005m\u0000\u0000\u0331\u0333"+ + "\u0003j5\u0000\u0332\u0330\u0001\u0000\u0000\u0000\u0333\u0336\u0001\u0000"+ + "\u0000\u0000\u0334\u0332\u0001\u0000\u0000\u0000\u0334\u0335\u0001\u0000"+ + "\u0000\u0000\u0335m\u0001\u0000\u0000\u0000\u0336\u0334\u0001\u0000\u0000"+ + "\u0000\u0337\u033c\u0005h\u0000\u0000\u0338\u0339\u0005;\u0000\u0000\u0339"+ + "\u033a\u0003\u00e4r\u0000\u033a\u033b\u0003\u0180\u00c0\u0000\u033b\u033d"+ + "\u0001\u0000\u0000\u0000\u033c\u0338\u0001\u0000\u0000\u0000\u033c\u033d"+ + "\u0001\u0000\u0000\u0000\u033d\u033f\u0001\u0000\u0000\u0000\u033e\u0340"+ + "\u0003\u00f4z\u0000\u033f\u033e\u0001\u0000\u0000\u0000\u033f\u0340\u0001"+ + "\u0000\u0000\u0000\u0340\u0341\u0001\u0000\u0000\u0000\u0341\u0342\u0005"+ + "i\u0000\u0000\u0342o\u0001\u0000\u0000\u0000\u0343\u0346\u0003\u0160\u00b0"+ + "\u0000\u0344\u0346\u0005e\u0000\u0000\u0345\u0343\u0001\u0000\u0000\u0000"+ + "\u0345\u0344\u0001\u0000\u0000\u0000\u0346\u034f\u0001\u0000\u0000\u0000"+ + "\u0347\u034c\u0005h\u0000\u0000\u0348\u034a\u0003r9\u0000\u0349\u034b"+ + "\u0005m\u0000\u0000\u034a\u0349\u0001\u0000\u0000\u0000\u034a\u034b\u0001"+ + "\u0000\u0000\u0000\u034b\u034d\u0001\u0000\u0000\u0000\u034c\u0348\u0001"+ + "\u0000\u0000\u0000\u034c\u034d\u0001\u0000\u0000\u0000\u034d\u034e\u0001"+ + "\u0000\u0000\u0000\u034e\u0350\u0005i\u0000\u0000\u034f\u0347\u0001\u0000"+ + "\u0000\u0000\u034f\u0350\u0001\u0000\u0000\u0000\u0350q\u0001\u0000\u0000"+ + "\u0000\u0351\u0356\u0003t:\u0000\u0352\u0353\u0005m\u0000\u0000\u0353"+ + "\u0355\u0003t:\u0000\u0354\u0352\u0001\u0000\u0000\u0000\u0355\u0358\u0001"+ + "\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0356\u0357\u0001"+ + "\u0000\u0000\u0000\u0357s\u0001\u0000\u0000\u0000\u0358\u0356\u0001\u0000"+ + "\u0000\u0000\u0359\u035a\u0005e\u0000\u0000\u035a\u035c\u0005o\u0000\u0000"+ + "\u035b\u0359\u0001\u0000\u0000\u0000\u035b\u035c\u0001\u0000\u0000\u0000"+ + "\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0003\u00a2Q\u0000\u035e"+ + "u\u0001\u0000\u0000\u0000\u035f\u0360\u0005G\u0000\u0000\u0360\u0361\u0003"+ + "\u00a2Q\u0000\u0361\u0362\u0005\u000f\u0000\u0000\u0362\u0363\u0003p8"+ + "\u0000\u0363\u0364\u0003\u00f2y\u0000\u0364w\u0001\u0000\u0000\u0000\u0365"+ + "\u0366\u0003\u00c2a\u0000\u0366\u0367\u0005\u000f\u0000\u0000\u0367\u037a"+ + "\u0003\u00c2a\u0000\u0368\u036e\u0005h\u0000\u0000\u0369\u036a\u0003\u0080"+ + "@\u0000\u036a\u036b\u0003\u0180\u00c0\u0000\u036b\u036d\u0001\u0000\u0000"+ + "\u0000\u036c\u0369\u0001\u0000\u0000\u0000\u036d\u0370\u0001\u0000\u0000"+ + "\u0000\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036f\u0001\u0000\u0000"+ + "\u0000\u036f\u0376\u0001\u0000\u0000\u0000\u0370\u036e\u0001\u0000\u0000"+ + "\u0000\u0371\u0372\u0003z=\u0000\u0372\u0373\u0003\u0180\u00c0\u0000\u0373"+ + "\u0375\u0001\u0000\u0000\u0000\u0374\u0371\u0001\u0000\u0000\u0000\u0375"+ + "\u0378\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000\u0000\u0000\u0376"+ + "\u0377\u0001\u0000\u0000\u0000\u0377\u0379\u0001\u0000\u0000\u0000\u0378"+ + "\u0376\u0001\u0000\u0000\u0000\u0379\u037b\u0005i\u0000\u0000\u037a\u0368"+ + "\u0001\u0000\u0000\u0000\u037a\u037b\u0001\u0000\u0000\u0000\u037by\u0001"+ + "\u0000\u0000\u0000\u037c\u037e\u0005\u000e\u0000\u0000\u037d\u037c\u0001"+ + "\u0000\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u037f\u0001"+ + "\u0000\u0000\u0000\u037f\u0380\u0003|>\u0000\u0380\u0381\u0005e\u0000"+ + "\u0000\u0381\u0383\u0003\u0146\u00a3\u0000\u0382\u0384\u0003\u00f2y\u0000"+ + "\u0383\u0382\u0001\u0000\u0000\u0000\u0383\u0384\u0001\u0000\u0000\u0000"+ + "\u0384{\u0001\u0000\u0000\u0000\u0385\u0387\u0005f\u0000\u0000\u0386\u0388"+ + "\u0005e\u0000\u0000\u0387\u0386\u0001\u0000\u0000\u0000\u0387\u0388\u0001"+ + "\u0000\u0000\u0000\u0388\u038a\u0001\u0000\u0000\u0000\u0389\u038b\u0005"+ + "\u0087\u0000\u0000\u038a\u0389\u0001\u0000\u0000\u0000\u038a\u038b\u0001"+ + "\u0000\u0000\u0000\u038b\u038c\u0001\u0000\u0000\u0000\u038c\u038d\u0003"+ + "\u0130\u0098\u0000\u038d\u038e\u0005g\u0000\u0000\u038e}\u0001\u0000\u0000"+ + "\u0000\u038f\u0395\u0003\u00b2Y\u0000\u0390\u0391\u0003\u00c2a\u0000\u0391"+ + "\u0392\u0005p\u0000\u0000\u0392\u0393\u0005e\u0000\u0000\u0393\u0395\u0001"+ + "\u0000\u0000\u0000\u0394\u038f\u0001\u0000\u0000\u0000\u0394\u0390\u0001"+ + "\u0000\u0000\u0000\u0395\u007f\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ + "8\u0000\u0000\u0397\u0398\u0005e\u0000\u0000\u0398\u039b\u0005s\u0000"+ + "\u0000\u0399\u039c\u0003~?\u0000\u039a\u039c\u0003\u015e\u00af\u0000\u039b"+ + "\u0399\u0001\u0000\u0000\u0000\u039b\u039a\u0001\u0000\u0000\u0000\u039c"+ + "\u0081\u0001\u0000\u0000\u0000\u039d\u039e\u0005/\u0000\u0000\u039e\u039f"+ + "\u0005f\u0000\u0000\u039f\u03a2\u0003\u00c2a\u0000\u03a0\u03a1\u0005m"+ + "\u0000\u0000\u03a1\u03a3\u0003\u00e6s\u0000\u03a2\u03a0\u0001\u0000\u0000"+ + "\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000"+ + "\u0000\u03a4\u03a5\u0005g\u0000\u0000\u03a5\u0083\u0001\u0000\u0000\u0000"+ + "\u03a6\u03a7\u0005.\u0000\u0000\u03a7\u03a8\u0005f\u0000\u0000\u03a8\u03a9"+ + "\u0003\u00c2a\u0000\u03a9\u03aa\u0005g\u0000\u0000\u03aa\u0085\u0001\u0000"+ + "\u0000\u0000\u03ab\u03ae\u0003\\.\u0000\u03ac\u03af\u0003\u0088D\u0000"+ + "\u03ad\u03af\u0003\u008aE\u0000\u03ae\u03ac\u0001\u0000\u0000\u0000\u03ae"+ + "\u03ad\u0001\u0000\u0000\u0000\u03af\u0087\u0001\u0000\u0000\u0000\u03b0"+ + "\u03b1\u0005M\u0000\u0000\u03b1\u03b3\u0005e\u0000\u0000\u03b2\u03b4\u0003"+ + "\u014c\u00a6\u0000\u03b3\u03b2\u0001\u0000\u0000\u0000\u03b3\u03b4\u0001"+ + "\u0000\u0000\u0000\u03b4\u03b5\u0001\u0000\u0000\u0000\u03b5\u03b7\u0003"+ + "\u0146\u00a3\u0000\u03b6\u03b8\u0003n7\u0000\u03b7\u03b6\u0001\u0000\u0000"+ + "\u0000\u03b7\u03b8\u0001\u0000\u0000\u0000\u03b8\u0089\u0001\u0000\u0000"+ + "\u0000\u03b9\u03ba\u0005M\u0000\u0000\u03ba\u03bb\u0003\u0098L\u0000\u03bb"+ + "\u03bc\u0005e\u0000\u0000\u03bc\u03be\u0003\u0146\u00a3\u0000\u03bd\u03bf"+ + "\u0003n7\u0000\u03be\u03bd\u0001\u0000\u0000\u0000\u03be\u03bf\u0001\u0000"+ + "\u0000\u0000\u03bf\u008b\u0001\u0000\u0000\u0000\u03c0\u03c3\u0005\u001b"+ + "\u0000\u0000\u03c1\u03c4\u0003\u0086C\u0000\u03c2\u03c4\u0003\u00deo\u0000"+ + "\u03c3\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c2\u0001\u0000\u0000\u0000"+ + "\u03c4\u008d\u0001\u0000\u0000\u0000\u03c5\u03c6\u00058\u0000\u0000\u03c6"+ + "\u03c7\u0005e\u0000\u0000\u03c7\u03c9\u0003\u014a\u00a5\u0000\u03c8\u03ca"+ + "\u0003\u0090H\u0000\u03c9\u03c8\u0001\u0000\u0000\u0000\u03c9\u03ca\u0001"+ + "\u0000\u0000\u0000\u03ca\u008f\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005"+ + "h\u0000\u0000\u03cc\u03cd\u0003\u00a2Q\u0000\u03cd\u03ce\u0003\u0180\u00c0"+ + "\u0000\u03ce\u03cf\u0005i\u0000\u0000\u03cf\u0091\u0001\u0000\u0000\u0000"+ + "\u03d0\u03d1\u00058\u0000\u0000\u03d1\u03d2\u0003\u0098L\u0000\u03d2\u03d3"+ + "\u0005e\u0000\u0000\u03d3\u03d5\u0003\u014a\u00a5\u0000\u03d4\u03d6\u0003"+ + "\u0090H\u0000\u03d5\u03d4\u0001\u0000\u0000\u0000\u03d5\u03d6\u0001\u0000"+ + "\u0000\u0000\u03d6\u0093\u0001\u0000\u0000\u0000\u03d7\u03df\u0003\u0006"+ + "\u0003\u0000\u03d8\u03db\u0003\u00c2a\u0000\u03d9\u03da\u0005l\u0000\u0000"+ + "\u03da\u03dc\u0003\u00e6s\u0000\u03db\u03d9\u0001\u0000\u0000\u0000\u03db"+ + "\u03dc\u0001\u0000\u0000\u0000\u03dc\u03e0\u0001\u0000\u0000\u0000\u03dd"+ + "\u03de\u0005l\u0000\u0000\u03de\u03e0\u0003\u00e6s\u0000\u03df\u03d8\u0001"+ + "\u0000\u0000\u0000\u03df\u03dd\u0001\u0000\u0000\u0000\u03e0\u0095\u0001"+ + "\u0000\u0000\u0000\u03e1\u03e2\u0003\u0006\u0003\u0000\u03e2\u03e3\u0005"+ + "s\u0000\u0000\u03e3\u03e4\u0003\u00e6s\u0000\u03e4\u0097\u0001\u0000\u0000"+ + "\u0000\u03e5\u03e7\u0005f\u0000\u0000\u03e6\u03e8\u0003\b\u0004\u0000"+ + "\u03e7\u03e6\u0001\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000"+ + "\u03e8\u03e9\u0001\u0000\u0000\u0000\u03e9\u03eb\u0003\u00c2a\u0000\u03ea"+ + "\u03ec\u0005m\u0000\u0000\u03eb\u03ea\u0001\u0000\u0000\u0000\u03eb\u03ec"+ + "\u0001\u0000\u0000\u0000\u03ec\u03ed\u0001\u0000\u0000\u0000\u03ed\u03ee"+ + "\u0005g\u0000\u0000\u03ee\u0099\u0001\u0000\u0000\u0000\u03ef\u03f2\u0003"+ + "\u009cN\u0000\u03f0\u03f2\u0003\u009eO\u0000\u03f1\u03ef\u0001\u0000\u0000"+ + "\u0000\u03f1\u03f0\u0001\u0000\u0000\u0000\u03f2\u009b\u0001\u0000\u0000"+ + "\u0000\u03f3\u03f5\u0003\u00e4r\u0000\u03f4\u03f3\u0001\u0000\u0000\u0000"+ + "\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6\u0001\u0000\u0000\u0000"+ + "\u03f6\u03f7\u0003\u00a0P\u0000\u03f7\u009d\u0001\u0000\u0000\u0000\u03f8"+ + "\u03fa\u0005\u001b\u0000\u0000\u03f9\u03fb\u0003\u00e4r\u0000\u03fa\u03f9"+ + "\u0001\u0000\u0000\u0000\u03fa\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc"+ + "\u0001\u0000\u0000\u0000\u03fc\u03fd\u0003\u00a0P\u0000\u03fd\u009f\u0001"+ + "\u0000\u0000\u0000\u03fe\u0400\u0005t\u0000\u0000\u03ff\u03fe\u0001\u0000"+ + "\u0000\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401\u0001\u0000"+ + "\u0000\u0000\u0401\u0402\u0003\u00c2a\u0000\u0402\u00a1\u0001\u0000\u0000"+ + "\u0000\u0403\u0404\u0006Q\uffff\uffff\u0000\u0404\u0405\u0007\u0006\u0000"+ + "\u0000\u0405\u0419\u0003\u00a2Q\u000f\u0406\u0419\u0003\u00b2Y\u0000\u0407"+ + "\u0408\u0005\u0019\u0000\u0000\u0408\u0409\u0003,\u0016\u0000\u0409\u040a"+ + "\u0005\u001c\u0000\u0000\u040a\u040b\u0003\u00a2Q\u0003\u040b\u0419\u0001"+ + "\u0000\u0000\u0000\u040c\u040d\u0005\u001a\u0000\u0000\u040d\u040e\u0003"+ + "\u0096K\u0000\u040e\u040f\u0005\u001c\u0000\u0000\u040f\u0410\u0003\u00a2"+ + "Q\u0002\u0410\u0419\u0001\u0000\u0000\u0000\u0411\u0412\u0007\u0007\u0000"+ + "\u0000\u0412\u0413\u0003$\u0012\u0000\u0413\u0414\u0005o\u0000\u0000\u0414"+ + "\u0415\u0005o\u0000\u0000\u0415\u0416\u0003(\u0014\u0000\u0416\u0417\u0003"+ + "\u00a2Q\u0001\u0417\u0419\u0001\u0000\u0000\u0000\u0418\u0403\u0001\u0000"+ + "\u0000\u0000\u0418\u0406\u0001\u0000\u0000\u0000\u0418\u0407\u0001\u0000"+ + "\u0000\u0000\u0418\u040c\u0001\u0000\u0000\u0000\u0418\u0411\u0001\u0000"+ + "\u0000\u0000\u0419\u043d\u0001\u0000\u0000\u0000\u041a\u041b\n\r\u0000"+ + "\u0000\u041b\u041c\u0007\b\u0000\u0000\u041c\u043c\u0003\u00a2Q\u000e"+ + "\u041d\u041e\n\f\u0000\u0000\u041e\u041f\u0007\t\u0000\u0000\u041f\u043c"+ + "\u0003\u00a2Q\r\u0420\u0421\n\u000b\u0000\u0000\u0421\u0422\u0007\n\u0000"+ + "\u0000\u0422\u043c\u0003\u00a2Q\f\u0423\u0424\n\n\u0000\u0000\u0424\u0425"+ + "\u0007\u000b\u0000\u0000\u0425\u043c\u0003\u00a2Q\u000b\u0426\u0427\n"+ + "\t\u0000\u0000\u0427\u0428\u0007\f\u0000\u0000\u0428\u043c\u0003\u00a2"+ + "Q\n\u0429\u042a\n\u0007\u0000\u0000\u042a\u042b\u0005v\u0000\u0000\u042b"+ + "\u043c\u0003\u00a2Q\b\u042c\u042d\n\u0006\u0000\u0000\u042d\u042e\u0005"+ + "u\u0000\u0000\u042e\u043c\u0003\u00a2Q\u0007\u042f\u0430\n\u0005\u0000"+ + "\u0000\u0430\u0431\u0005\"\u0000\u0000\u0431\u043c\u0003\u00a2Q\u0005"+ + "\u0432\u0433\n\u0004\u0000\u0000\u0433\u0434\u0005%\u0000\u0000\u0434"+ + "\u0435\u0003\u00a2Q\u0000\u0435\u0436\u0005o\u0000\u0000\u0436\u0437\u0003"+ + "\u00a2Q\u0004\u0437\u043c\u0001\u0000\u0000\u0000\u0438\u0439\n\b\u0000"+ + "\u0000\u0439\u043a\u0005\u000f\u0000\u0000\u043a\u043c\u0003p8\u0000\u043b"+ + "\u041a\u0001\u0000\u0000\u0000\u043b\u041d\u0001\u0000\u0000\u0000\u043b"+ + "\u0420\u0001\u0000\u0000\u0000\u043b\u0423\u0001\u0000\u0000\u0000\u043b"+ + "\u0426\u0001\u0000\u0000\u0000\u043b\u0429\u0001\u0000\u0000\u0000\u043b"+ + "\u042c\u0001\u0000\u0000\u0000\u043b\u042f\u0001\u0000\u0000\u0000\u043b"+ + "\u0432\u0001\u0000\u0000\u0000\u043b\u0438\u0001\u0000\u0000\u0000\u043c"+ + "\u043f\u0001\u0000\u0000\u0000\u043d\u043b\u0001\u0000\u0000\u0000\u043d"+ + "\u043e\u0001\u0000\u0000\u0000\u043e\u00a3\u0001\u0000\u0000\u0000\u043f"+ + "\u043d\u0001\u0000\u0000\u0000\u0440\u0455\u0003\u0016\u000b\u0000\u0441"+ + "\u0455\u0003\u0018\f\u0000\u0442\u0455\u0003\u00a8T\u0000\u0443\u0455"+ + "\u0003\u00a6S\u0000\u0444\u0455\u0003\u00deo\u0000\u0445\u0455\u0003\u0102"+ + "\u0081\u0000\u0446\u0455\u0003\u00f6{\u0000\u0447\u0455\u0003\u012e\u0097"+ + "\u0000\u0448\u0455\u0003\u0104\u0082\u0000\u0449\u0455\u0003\u0106\u0083"+ + "\u0000\u044a\u0455\u0003\u0108\u0084\u0000\u044b\u0455\u0003\u010a\u0085"+ + "\u0000\u044c\u0455\u0003\u010c\u0086\u0000\u044d\u0455\u0003\u00f2y\u0000"+ + "\u044e\u0455\u0003\u010e\u0087\u0000\u044f\u0455\u0003\u0110\u0088\u0000"+ + "\u0450\u0455\u0003\u0122\u0091\u0000\u0451\u0455\u0003\u00aaU\u0000\u0452"+ + "\u0455\u0003\u00aeW\u0000\u0453\u0455\u0003v;\u0000\u0454\u0440\u0001"+ + "\u0000\u0000\u0000\u0454\u0441\u0001\u0000\u0000\u0000\u0454\u0442\u0001"+ + "\u0000\u0000\u0000\u0454\u0443\u0001\u0000\u0000\u0000\u0454\u0444\u0001"+ + "\u0000\u0000\u0000\u0454\u0445\u0001\u0000\u0000\u0000\u0454\u0446\u0001"+ + "\u0000\u0000\u0000\u0454\u0447\u0001\u0000\u0000\u0000\u0454\u0448\u0001"+ + "\u0000\u0000\u0000\u0454\u0449\u0001\u0000\u0000\u0000\u0454\u044a\u0001"+ + "\u0000\u0000\u0000\u0454\u044b\u0001\u0000\u0000\u0000\u0454\u044c\u0001"+ + "\u0000\u0000\u0000\u0454\u044d\u0001\u0000\u0000\u0000\u0454\u044e\u0001"+ + "\u0000\u0000\u0000\u0454\u044f\u0001\u0000\u0000\u0000\u0454\u0450\u0001"+ + "\u0000\u0000\u0000\u0454\u0451\u0001\u0000\u0000\u0000\u0454\u0452\u0001"+ + "\u0000\u0000\u0000\u0454\u0453\u0001\u0000\u0000\u0000\u0455\u00a5\u0001"+ + "\u0000\u0000\u0000\u0456\u0457\u0005$\u0000\u0000\u0457\u0458\u0003\u00a2"+ + "Q\u0000\u0458\u00a7\u0001\u0000\u0000\u0000\u0459\u045a\u0005X\u0000\u0000"+ + "\u045a\u045c\u0003\u00a2Q\u0000\u045b\u045d\u0003\u00f2y\u0000\u045c\u045b"+ + "\u0001\u0000\u0000\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u00a9"+ + "\u0001\u0000\u0000\u0000\u045e\u045f\u0003\u00acV\u0000\u045f\u0460\u0003"+ + "\u012a\u0095\u0000\u0460\u00ab\u0001\u0000\u0000\u0000\u0461\u0462\u0005"+ + "\f\u0000\u0000\u0462\u0463\u0003\u00a2Q\u0000\u0463\u0464\u0003\u0180"+ + "\u00c0\u0000\u0464\u0466\u0001\u0000\u0000\u0000\u0465\u0461\u0001\u0000"+ + "\u0000\u0000\u0466\u0469\u0001\u0000\u0000\u0000\u0467\u0465\u0001\u0000"+ + "\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u046e\u0001\u0000"+ + "\u0000\u0000\u0469\u0467\u0001\u0000\u0000\u0000\u046a\u046b\u0005\r\u0000"+ + "\u0000\u046b\u046c\u0003`0\u0000\u046c\u046d\u0003\u0180\u00c0\u0000\u046d"+ + "\u046f\u0001\u0000\u0000\u0000\u046e\u046a\u0001\u0000\u0000\u0000\u046e"+ + "\u046f\u0001\u0000\u0000\u0000\u046f\u00ad\u0001\u0000\u0000\u0000\u0470"+ + "\u0471\u0005Q\u0000\u0000\u0471\u0476\u0003\u00a2Q\u0000\u0472\u0473\u0005"+ + "Q\u0000\u0000\u0473\u0474\u0007\u0001\u0000\u0000\u0474\u0476\u0003,\u0016"+ + "\u0000\u0475\u0470\u0001\u0000\u0000\u0000\u0475\u0472\u0001\u0000\u0000"+ + "\u0000\u0476\u00af\u0001\u0000\u0000\u0000\u0477\u0480\u0005\u0003\u0000"+ + "\u0000\u0478\u0480\u0005\u0004\u0000\u0000\u0479\u0480\u0005d\u0000\u0000"+ + "\u047a\u0480\u0003\u015c\u00ae\u0000\u047b\u0480\u0003\u0172\u00b9\u0000"+ + "\u047c\u0480\u0005\u0001\u0000\u0000\u047d\u0480\u0005\u008f\u0000\u0000"+ + "\u047e\u0480\u0005\u0090\u0000\u0000\u047f\u0477\u0001\u0000\u0000\u0000"+ + "\u047f\u0478\u0001\u0000\u0000\u0000\u047f\u0479\u0001\u0000\u0000\u0000"+ + "\u047f\u047a\u0001\u0000\u0000\u0000\u047f\u047b\u0001\u0000\u0000\u0000"+ + "\u047f\u047c\u0001\u0000\u0000\u0000\u047f\u047d\u0001\u0000\u0000\u0000"+ + "\u047f\u047e\u0001\u0000\u0000\u0000\u0480\u00b1\u0001\u0000\u0000\u0000"+ + "\u0481\u0482\u0006Y\uffff\uffff\u0000\u0482\u048e\u0003\u0158\u00ac\u0000"+ + "\u0483\u048e\u0003\u0154\u00aa\u0000\u0484\u048e\u0003\u017c\u00be\u0000"+ + "\u0485\u048e\u0003\u001e\u000f\u0000\u0486\u048e\u0003\u0084B\u0000\u0487"+ + "\u048e\u0003\u0082A\u0000\u0488\u0489\u0007\r\u0000\u0000\u0489\u048a"+ + "\u0005f\u0000\u0000\u048a\u048b\u0003\u00a2Q\u0000\u048b\u048c\u0005g"+ + "\u0000\u0000\u048c\u048e\u0001\u0000\u0000\u0000\u048d\u0481\u0001\u0000"+ + "\u0000\u0000\u048d\u0483\u0001\u0000\u0000\u0000\u048d\u0484\u0001\u0000"+ + "\u0000\u0000\u048d\u0485\u0001\u0000\u0000\u0000\u048d\u0486\u0001\u0000"+ + "\u0000\u0000\u048d\u0487\u0001\u0000\u0000\u0000\u048d\u0488\u0001\u0000"+ + "\u0000\u0000\u048e\u04a5\u0001\u0000\u0000\u0000\u048f\u0490\n\t\u0000"+ + "\u0000\u0490\u0491\u0005p\u0000\u0000\u0491\u04a4\u0005e\u0000\u0000\u0492"+ + "\u0493\n\b\u0000\u0000\u0493\u04a4\u0003\u0176\u00bb\u0000\u0494\u0495"+ + "\n\u0007\u0000\u0000\u0495\u04a4\u0003\u00ceg\u0000\u0496\u0497\n\u0006"+ + "\u0000\u0000\u0497\u04a4\u0003J%\u0000\u0498\u0499\n\u0005\u0000\u0000"+ + "\u0499\u04a4\u0003\u0178\u00bc\u0000\u049a\u049b\n\u0004\u0000\u0000\u049b"+ + "\u04a4\u0003\u017a\u00bd\u0000\u049c\u049d\n\u0003\u0000\u0000\u049d\u049e"+ + "\u0003\u017a\u00bd\u0000\u049e\u049f\u0005\u0010\u0000\u0000\u049f\u04a0"+ + "\u0003p8\u0000\u04a0\u04a4\u0001\u0000\u0000\u0000\u04a1\u04a2\n\u0002"+ + "\u0000\u0000\u04a2\u04a4\u0003\u00b8\\\u0000\u04a3\u048f\u0001\u0000\u0000"+ + "\u0000\u04a3\u0492\u0001\u0000\u0000\u0000\u04a3\u0494\u0001\u0000\u0000"+ + "\u0000\u04a3\u0496\u0001\u0000\u0000\u0000\u04a3\u0498\u0001\u0000\u0000"+ + "\u0000\u04a3\u049a\u0001\u0000\u0000\u0000\u04a3\u049c\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a1\u0001\u0000\u0000\u0000\u04a4\u04a7\u0001\u0000\u0000"+ + "\u0000\u04a5\u04a3\u0001\u0000\u0000\u0000\u04a5\u04a6\u0001\u0000\u0000"+ + "\u0000\u04a6\u00b3\u0001\u0000\u0000\u0000\u04a7\u04a5\u0001\u0000\u0000"+ + "\u0000\u04a8\u04a9\u0003\\.\u0000\u04a9\u04aa\u0003\u00b6[\u0000\u04aa"+ + "\u00b5\u0001\u0000\u0000\u0000\u04ab\u04ad\u0005M\u0000\u0000\u04ac\u04ae"+ + "\u0005e\u0000\u0000\u04ad\u04ac\u0001\u0000\u0000\u0000\u04ad\u04ae\u0001"+ + "\u0000\u0000\u0000\u04ae\u04af\u0001\u0000\u0000\u0000\u04af\u04b1\u0003"+ + "\u0146\u00a3\u0000\u04b0\u04b2\u0003n7\u0000\u04b1\u04b0\u0001\u0000\u0000"+ + "\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2\u00b7\u0001\u0000\u0000"+ + "\u0000\u04b3\u04b5\u0005&\u0000\u0000\u04b4\u04b6\u0003\u00e6s\u0000\u04b5"+ + "\u04b4\u0001\u0000\u0000\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6"+ + "\u04b8\u0001\u0000\u0000\u0000\u04b7\u04b9\u0005m\u0000\u0000\u04b8\u04b7"+ + "\u0001\u0000\u0000\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba"+ + "\u0001\u0000\u0000\u0000\u04ba\u04bb\u0005\'\u0000\u0000\u04bb\u00b9\u0001"+ + "\u0000\u0000\u0000\u04bc\u04bd\u0005N\u0000\u0000\u04bd\u04c3\u0005h\u0000"+ + "\u0000\u04be\u04bf\u0003\u00bc^\u0000\u04bf\u04c0\u0003\u0180\u00c0\u0000"+ + "\u04c0\u04c2\u0001\u0000\u0000\u0000\u04c1\u04be\u0001\u0000\u0000\u0000"+ + "\u04c2\u04c5\u0001\u0000\u0000\u0000\u04c3\u04c1\u0001\u0000\u0000\u0000"+ + "\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4\u04c6\u0001\u0000\u0000\u0000"+ + "\u04c5\u04c3\u0001\u0000\u0000\u0000\u04c6\u04c7\u0005i\u0000\u0000\u04c7"+ + "\u00bb\u0001\u0000\u0000\u0000\u04c8\u04cc\u0003\u00c0`\u0000\u04c9\u04cc"+ + "\u0003\u013a\u009d\u0000\u04ca\u04cc\u0003\u00be_\u0000\u04cb\u04c8\u0001"+ + "\u0000\u0000\u0000\u04cb\u04c9\u0001\u0000\u0000\u0000\u04cb\u04ca\u0001"+ + "\u0000\u0000\u0000\u04cc\u00bd\u0001\u0000\u0000\u0000\u04cd\u04ce\u0005"+ + "8\u0000\u0000\u04ce\u04cf\u0005e\u0000\u0000\u04cf\u04d0\u0003\u014a\u00a5"+ + "\u0000\u04d0\u00bf\u0001\u0000\u0000\u0000\u04d1\u04d3\u0005\u001b\u0000"+ + "\u0000\u04d2\u04d1\u0001\u0000\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000"+ + "\u0000\u04d3\u04d4\u0001\u0000\u0000\u0000\u04d4\u04d5\u0003\\.\u0000"+ + "\u04d5\u04d6\u0005e\u0000\u0000\u04d6\u04d7\u0003\u014a\u00a5\u0000\u04d7"+ + "\u04d8\u0003\u0148\u00a4\u0000\u04d8\u04e1\u0001\u0000\u0000\u0000\u04d9"+ + "\u04db\u0005\u001b\u0000\u0000\u04da\u04d9\u0001\u0000\u0000\u0000\u04da"+ + "\u04db\u0001\u0000\u0000\u0000\u04db\u04dc\u0001\u0000\u0000\u0000\u04dc"+ + "\u04dd\u0003\\.\u0000\u04dd\u04de\u0005e\u0000\u0000\u04de\u04df\u0003"+ + "\u014a\u00a5\u0000\u04df\u04e1\u0001\u0000\u0000\u0000\u04e0\u04d2\u0001"+ + "\u0000\u0000\u0000\u04e0\u04da\u0001\u0000\u0000\u0000\u04e1\u00c1\u0001"+ + "\u0000\u0000\u0000\u04e2\u04e4\u0003\u0130\u0098\u0000\u04e3\u04e5\u0003"+ + "\u0176\u00bb\u0000\u04e4\u04e3\u0001\u0000\u0000\u0000\u04e4\u04e5\u0001"+ + "\u0000\u0000\u0000\u04e5\u04ed\u0001\u0000\u0000\u0000\u04e6\u04ed\u0003"+ + "\u00c4b\u0000\u04e7\u04ed\u0003N\'\u0000\u04e8\u04e9\u0005f\u0000\u0000"+ + "\u04e9\u04ea\u0003\u00c2a\u0000\u04ea\u04eb\u0005g\u0000\u0000\u04eb\u04ed"+ + "\u0001\u0000\u0000\u0000\u04ec\u04e2\u0001\u0000\u0000\u0000\u04ec\u04e6"+ + "\u0001\u0000\u0000\u0000\u04ec\u04e7\u0001\u0000\u0000\u0000\u04ec\u04e8"+ + "\u0001\u0000\u0000\u0000\u04ed\u00c3\u0001\u0000\u0000\u0000\u04ee\u04f8"+ + "\u0003\u0132\u0099\u0000\u04ef\u04f8\u0003\u016e\u00b7\u0000\u04f0\u04f8"+ + "\u0003\u0138\u009c\u0000\u04f1\u04f8\u0003\u0144\u00a2\u0000\u04f2\u04f8"+ + "\u0003\u00ba]\u0000\u04f3\u04f8\u0003\u013e\u009f\u0000\u04f4\u04f8\u0003"+ + "\u0140\u00a0\u0000\u04f5\u04f8\u0003\u0142\u00a1\u0000\u04f6\u04f8\u0003"+ + "\u00c6c\u0000\u04f7\u04ee\u0001\u0000\u0000\u0000\u04f7\u04ef\u0001\u0000"+ + "\u0000\u0000\u04f7\u04f0\u0001\u0000\u0000\u0000\u04f7\u04f1\u0001\u0000"+ + "\u0000\u0000\u04f7\u04f2\u0001\u0000\u0000\u0000\u04f7\u04f3\u0001\u0000"+ + "\u0000\u0000\u04f7\u04f4\u0001\u0000\u0000\u0000\u04f7\u04f5\u0001\u0000"+ + "\u0000\u0000\u04f7\u04f6\u0001\u0000\u0000\u0000\u04f8\u00c5\u0001\u0000"+ + "\u0000\u0000\u04f9\u04fa\u00058\u0000\u0000\u04fa\u04fb\u0003\u00c8d\u0000"+ + "\u04fb\u00c7\u0001\u0000\u0000\u0000\u04fc\u0508\u0005f\u0000\u0000\u04fd"+ + "\u0502\u0003\u00c2a\u0000\u04fe\u04ff\u0005m\u0000\u0000\u04ff\u0501\u0003"+ + "\u00c2a\u0000\u0500\u04fe\u0001\u0000\u0000\u0000\u0501\u0504\u0001\u0000"+ + "\u0000\u0000\u0502\u0500\u0001\u0000\u0000\u0000\u0502\u0503\u0001\u0000"+ + "\u0000\u0000\u0503\u0506\u0001\u0000\u0000\u0000\u0504\u0502\u0001\u0000"+ + "\u0000\u0000\u0505\u0507\u0005m\u0000\u0000\u0506\u0505\u0001\u0000\u0000"+ + "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0509\u0001\u0000\u0000"+ + "\u0000\u0508\u04fd\u0001\u0000\u0000\u0000\u0508\u0509\u0001\u0000\u0000"+ + "\u0000\u0509\u050a\u0001\u0000\u0000\u0000\u050a\u050b\u0005g\u0000\u0000"+ + "\u050b\u00c9\u0001\u0000\u0000\u0000\u050c\u0517\u0003\u016e\u00b7\u0000"+ + "\u050d\u0517\u0003\u0132\u0099\u0000\u050e\u0517\u0003\u00ccf\u0000\u050f"+ + "\u0517\u0003\u013e\u009f\u0000\u0510\u0517\u0003\u0140\u00a0\u0000\u0511"+ + "\u0517\u0003N\'\u0000\u0512\u0514\u0003\u0130\u0098\u0000\u0513\u0515"+ + "\u0003\u0176\u00bb\u0000\u0514\u0513\u0001\u0000\u0000\u0000\u0514\u0515"+ + "\u0001\u0000\u0000\u0000\u0515\u0517\u0001\u0000\u0000\u0000\u0516\u050c"+ + "\u0001\u0000\u0000\u0000\u0516\u050d\u0001\u0000\u0000\u0000\u0516\u050e"+ + "\u0001\u0000\u0000\u0000\u0516\u050f\u0001\u0000\u0000\u0000\u0516\u0510"+ + "\u0001\u0000\u0000\u0000\u0516\u0511\u0001\u0000\u0000\u0000\u0516\u0512"+ + "\u0001\u0000\u0000\u0000\u0517\u00cb\u0001\u0000\u0000\u0000\u0518\u0519"+ + "\u0005j\u0000\u0000\u0519\u051a\u0005t\u0000\u0000\u051a\u051b\u0005k"+ + "\u0000\u0000\u051b\u051c\u0003\u0136\u009b\u0000\u051c\u00cd\u0001\u0000"+ + "\u0000\u0000\u051d\u052d\u0005j\u0000\u0000\u051e\u0520\u0003\u00d0h\u0000"+ + "\u051f\u051e\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000"+ + "\u0520\u0521\u0001\u0000\u0000\u0000\u0521\u0523\u0005o\u0000\u0000\u0522"+ + "\u0524\u0003\u00d2i\u0000\u0523\u0522\u0001\u0000\u0000\u0000\u0523\u0524"+ + "\u0001\u0000\u0000\u0000\u0524\u052e\u0001\u0000\u0000\u0000\u0525\u0527"+ + "\u0003\u00d0h\u0000\u0526\u0525\u0001\u0000\u0000\u0000\u0526\u0527\u0001"+ + "\u0000\u0000\u0000\u0527\u0528\u0001\u0000\u0000\u0000\u0528\u0529\u0005"+ + "o\u0000\u0000\u0529\u052a\u0003\u00d2i\u0000\u052a\u052b\u0005o\u0000"+ + "\u0000\u052b\u052c\u0003\u00d4j\u0000\u052c\u052e\u0001\u0000\u0000\u0000"+ + "\u052d\u051f\u0001\u0000\u0000\u0000\u052d\u0526\u0001\u0000\u0000\u0000"+ + "\u052e\u052f\u0001\u0000\u0000\u0000\u052f\u0530\u0005k\u0000\u0000\u0530"+ + "\u00cf\u0001\u0000\u0000\u0000\u0531\u0532\u0003\u00a2Q\u0000\u0532\u00d1"+ + "\u0001\u0000\u0000\u0000\u0533\u0534\u0003\u00a2Q\u0000\u0534\u00d3\u0001"+ + "\u0000\u0000\u0000\u0535\u0536\u0003\u00a2Q\u0000\u0536\u00d5\u0001\u0000"+ + "\u0000\u0000\u0537\u0539\u0007\u000e\u0000\u0000\u0538\u0537\u0001\u0000"+ + "\u0000\u0000\u0538\u0539\u0001\u0000\u0000\u0000\u0539\u053a\u0001\u0000"+ + "\u0000\u0000\u053a\u053b\u0005l\u0000\u0000\u053b\u00d7\u0001\u0000\u0000"+ + "\u0000\u053c\u053d\u0003\u00e6s\u0000\u053d\u053e\u0005l\u0000\u0000\u053e"+ + "\u0543\u0001\u0000\u0000\u0000\u053f\u0540\u0003\u0006\u0003\u0000\u0540"+ + "\u0541\u0005s\u0000\u0000\u0541\u0543\u0001\u0000\u0000\u0000\u0542\u053c"+ + "\u0001\u0000\u0000\u0000\u0542\u053f\u0001\u0000\u0000\u0000\u0542\u0543"+ + "\u0001\u0000\u0000\u0000\u0543\u0544\u0001\u0000\u0000\u0000\u0544\u0545"+ + "\u0005]\u0000\u0000\u0545\u054a\u0003\u00a2Q\u0000\u0546\u0548\u0005J"+ + "\u0000\u0000\u0547\u0549\u0005e\u0000\u0000\u0548\u0547\u0001\u0000\u0000"+ + "\u0000\u0548\u0549\u0001\u0000\u0000\u0000\u0549\u054b\u0001\u0000\u0000"+ + "\u0000\u054a\u0546\u0001\u0000\u0000\u0000\u054a\u054b\u0001\u0000\u0000"+ + "\u0000\u054b\u00d9\u0001\u0000\u0000\u0000\u054c\u054d\u0005X\u0000\u0000"+ + "\u054d\u054e\u0005e\u0000\u0000\u054e\u00db\u0001\u0000\u0000\u0000\u054f"+ + "\u0550\u0003\u0172\u00b9\u0000\u0550\u00dd\u0001\u0000\u0000\u0000\u0551"+ + "\u0555\u0003\u00e0p\u0000\u0552\u0555\u0003\u00e8t\u0000\u0553\u0555\u0003"+ + "\u00f0x\u0000\u0554\u0551\u0001\u0000\u0000\u0000\u0554\u0552\u0001\u0000"+ + "\u0000\u0000\u0554\u0553\u0001\u0000\u0000\u0000\u0555\u00df\u0001\u0000"+ + "\u0000\u0000\u0556\u0562\u0005Z\u0000\u0000\u0557\u0563\u0003\u00e2q\u0000"+ + "\u0558\u055e\u0005f\u0000\u0000\u0559\u055a\u0003\u00e2q\u0000\u055a\u055b"+ + "\u0003\u0180\u00c0\u0000\u055b\u055d\u0001\u0000\u0000\u0000\u055c\u0559"+ + "\u0001\u0000\u0000\u0000\u055d\u0560\u0001\u0000\u0000\u0000\u055e\u055c"+ + "\u0001\u0000\u0000\u0000\u055e\u055f\u0001\u0000\u0000\u0000\u055f\u0561"+ + "\u0001\u0000\u0000\u0000\u0560\u055e\u0001\u0000\u0000\u0000\u0561\u0563"+ + "\u0005g\u0000\u0000\u0562\u0557\u0001\u0000\u0000\u0000\u0562\u0558\u0001"+ + "\u0000\u0000\u0000\u0563\u00e1\u0001\u0000\u0000\u0000\u0564\u056a\u0003"+ + "\u00e4r\u0000\u0565\u0567\u0003\u00c2a\u0000\u0566\u0565\u0001\u0000\u0000"+ + "\u0000\u0566\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u0001\u0000\u0000"+ + "\u0000\u0568\u0569\u0005l\u0000\u0000\u0569\u056b\u0003\u00e6s\u0000\u056a"+ + "\u0566\u0001\u0000\u0000\u0000\u056a\u056b\u0001\u0000\u0000\u0000\u056b"+ + "\u00e3\u0001\u0000\u0000\u0000\u056c\u0571\u0005e\u0000\u0000\u056d\u056e"+ + "\u0005m\u0000\u0000\u056e\u0570\u0005e\u0000\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\u00e5\u0001\u0000"+ + "\u0000\u0000\u0573\u0571\u0001\u0000\u0000\u0000\u0574\u0579\u0003\u00a2"+ + "Q\u0000\u0575\u0576\u0005m\u0000\u0000\u0576\u0578\u0003\u00a2Q\u0000"+ + "\u0577\u0575\u0001\u0000\u0000\u0000\u0578\u057b\u0001\u0000\u0000\u0000"+ + "\u0579\u0577\u0001\u0000\u0000\u0000\u0579\u057a\u0001\u0000\u0000\u0000"+ + "\u057a\u00e7\u0001\u0000\u0000\u0000\u057b\u0579\u0001\u0000\u0000\u0000"+ + "\u057c\u0588\u0005^\u0000\u0000\u057d\u0589\u0003\u00eau\u0000\u057e\u0584"+ + "\u0005f\u0000\u0000\u057f\u0580\u0003\u00eau\u0000\u0580\u0581\u0003\u0180"+ + "\u00c0\u0000\u0581\u0583\u0001\u0000\u0000\u0000\u0582\u057f\u0001\u0000"+ + "\u0000\u0000\u0583\u0586\u0001\u0000\u0000\u0000\u0584\u0582\u0001\u0000"+ + "\u0000\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0587\u0001\u0000"+ + "\u0000\u0000\u0586\u0584\u0001\u0000\u0000\u0000\u0587\u0589\u0005g\u0000"+ + "\u0000\u0588\u057d\u0001\u0000\u0000\u0000\u0588\u057e\u0001\u0000\u0000"+ + "\u0000\u0589\u00e9\u0001\u0000\u0000\u0000\u058a\u058d\u0003\u00ecv\u0000"+ + "\u058b\u058d\u0003\u00eew\u0000\u058c\u058a\u0001\u0000\u0000\u0000\u058c"+ + "\u058b\u0001\u0000\u0000\u0000\u058d\u00eb\u0001\u0000\u0000\u0000\u058e"+ + "\u058f\u0005e\u0000\u0000\u058f\u0590\u0005l\u0000\u0000\u0590\u0591\u0003"+ + "\u00c2a\u0000\u0591\u00ed\u0001\u0000\u0000\u0000\u0592\u0594\u0005e\u0000"+ + "\u0000\u0593\u0595\u0003\u014c\u00a6\u0000\u0594\u0593\u0001\u0000\u0000"+ + "\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000\u0000"+ + "\u0000\u0596\u0597\u0003\u00c2a\u0000\u0597\u00ef\u0001\u0000\u0000\u0000"+ + "\u0598\u05a4\u0005c\u0000\u0000\u0599\u05a5\u0003\u0094J\u0000\u059a\u05a0"+ + "\u0005f\u0000\u0000\u059b\u059c\u0003\u0094J\u0000\u059c\u059d\u0003\u0180"+ + "\u00c0\u0000\u059d\u059f\u0001\u0000\u0000\u0000\u059e\u059b\u0001\u0000"+ + "\u0000\u0000\u059f\u05a2\u0001\u0000\u0000\u0000\u05a0\u059e\u0001\u0000"+ + "\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a3\u0001\u0000"+ + "\u0000\u0000\u05a2\u05a0\u0001\u0000\u0000\u0000\u05a3\u05a5\u0005g\u0000"+ + "\u0000\u05a4\u0599\u0001\u0000\u0000\u0000\u05a4\u059a\u0001\u0000\u0000"+ + "\u0000\u05a5\u00f1\u0001\u0000\u0000\u0000\u05a6\u05a8\u0005h\u0000\u0000"+ + "\u05a7\u05a9\u0003\u00f4z\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a8"+ + "\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa"+ + "\u05ab\u0005i\u0000\u0000\u05ab\u00f3\u0001\u0000\u0000\u0000\u05ac\u05ad"+ + "\u0003\u00a4R\u0000\u05ad\u05ae\u0005\u009f\u0000\u0000\u05ae\u05b0\u0001"+ + "\u0000\u0000\u0000\u05af\u05ac\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ + "\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001"+ + "\u0000\u0000\u0000\u05b2\u00f5\u0001\u0000\u0000\u0000\u05b3\u05b9\u0003"+ + "\u00fa}\u0000\u05b4\u05b9\u0003\u00fc~\u0000\u05b5\u05b9\u0003\u00fe\u007f"+ + "\u0000\u05b6\u05b9\u0003\u00f8|\u0000\u05b7\u05b9\u0003\u0096K\u0000\u05b8"+ + "\u05b3\u0001\u0000\u0000\u0000\u05b8\u05b4\u0001\u0000\u0000\u0000\u05b8"+ + "\u05b5\u0001\u0000\u0000\u0000\u05b8\u05b6\u0001\u0000\u0000\u0000\u05b8"+ + "\u05b7\u0001\u0000\u0000\u0000\u05b9\u00f7\u0001\u0000\u0000\u0000\u05ba"+ + "\u05bb\u0003\u00a2Q\u0000\u05bb\u00f9\u0001\u0000\u0000\u0000\u05bc\u05bd"+ + "\u0003\u00a2Q\u0000\u05bd\u05be\u0005\u0089\u0000\u0000\u05be\u05bf\u0003"+ + "\u00a2Q\u0000\u05bf\u00fb\u0001\u0000\u0000\u0000\u05c0\u05c1\u0003\u00a2"+ + "Q\u0000\u05c1\u05c2\u0007\u000f\u0000\u0000\u05c2\u00fd\u0001\u0000\u0000"+ + "\u0000\u05c3\u05c4\u0003\u00e6s\u0000\u05c4\u05c5\u0003\u00d6k\u0000\u05c5"+ + "\u05c6\u0003\u00e6s\u0000\u05c6\u00ff\u0001\u0000\u0000\u0000\u05c7\u05c8"+ + "\u0007\u0010\u0000\u0000\u05c8\u0101\u0001\u0000\u0000\u0000\u05c9\u05ca"+ + "\u0005e\u0000\u0000\u05ca\u05cc\u0005o\u0000\u0000\u05cb\u05cd\u0003\u00a4"+ + "R\u0000\u05cc\u05cb\u0001\u0000\u0000\u0000\u05cc\u05cd\u0001\u0000\u0000"+ + "\u0000\u05cd\u0103\u0001\u0000\u0000\u0000\u05ce\u05d0\u0005b\u0000\u0000"+ + "\u05cf\u05d1\u0003\u00e6s\u0000\u05d0\u05cf\u0001\u0000\u0000\u0000\u05d0"+ + "\u05d1\u0001\u0000\u0000\u0000\u05d1\u0105\u0001\u0000\u0000\u0000\u05d2"+ + "\u05d4\u0005K\u0000\u0000\u05d3\u05d5\u0005e\u0000\u0000\u05d4\u05d3\u0001"+ + "\u0000\u0000\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5\u0107\u0001"+ + "\u0000\u0000\u0000\u05d6\u05d8\u0005_\u0000\u0000\u05d7\u05d9\u0005e\u0000"+ + "\u0000\u05d8\u05d7\u0001\u0000\u0000\u0000\u05d8\u05d9\u0001\u0000\u0000"+ + "\u0000\u05d9\u0109\u0001\u0000\u0000\u0000\u05da\u05db\u0005W\u0000\u0000"+ + "\u05db\u05dc\u0005e\u0000\u0000\u05dc\u010b\u0001\u0000\u0000\u0000\u05dd"+ + "\u05de\u0005[\u0000\u0000\u05de\u010d\u0001\u0000\u0000\u0000\u05df\u05e8"+ + "\u0005\\\u0000\u0000\u05e0\u05e9\u0003\u00a2Q\u0000\u05e1\u05e2\u0003"+ + "\u0180\u00c0\u0000\u05e2\u05e3\u0003\u00a2Q\u0000\u05e3\u05e9\u0001\u0000"+ + "\u0000\u0000\u05e4\u05e5\u0003\u00f6{\u0000\u05e5\u05e6\u0003\u0180\u00c0"+ + "\u0000\u05e6\u05e7\u0003\u00a2Q\u0000\u05e7\u05e9\u0001\u0000\u0000\u0000"+ + "\u05e8\u05e0\u0001\u0000\u0000\u0000\u05e8\u05e1\u0001\u0000\u0000\u0000"+ + "\u05e8\u05e4\u0001\u0000\u0000\u0000\u05e9\u05ea\u0001\u0000\u0000\u0000"+ + "\u05ea\u05f0\u0003\u00f2y\u0000\u05eb\u05ee\u0005V\u0000\u0000\u05ec\u05ef"+ + "\u0003\u010e\u0087\u0000\u05ed\u05ef\u0003\u00f2y\u0000\u05ee\u05ec\u0001"+ + "\u0000\u0000\u0000\u05ee\u05ed\u0001\u0000\u0000\u0000\u05ef\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f0\u05eb\u0001\u0000\u0000\u0000\u05f0\u05f1\u0001"+ + "\u0000\u0000\u0000\u05f1\u010f\u0001\u0000\u0000\u0000\u05f2\u05f5\u0003"+ + "\u0112\u0089\u0000\u05f3\u05f5\u0003\u0118\u008c\u0000\u05f4\u05f2\u0001"+ + "\u0000\u0000\u0000\u05f4\u05f3\u0001\u0000\u0000\u0000\u05f5\u0111\u0001"+ + "\u0000\u0000\u0000\u05f6\u0601\u0005Y\u0000\u0000\u05f7\u05f9\u0003\u00a2"+ + "Q\u0000\u05f8\u05f7\u0001\u0000\u0000\u0000\u05f8\u05f9\u0001\u0000\u0000"+ + "\u0000\u05f9\u0602\u0001\u0000\u0000\u0000\u05fa\u05fc\u0003\u00f6{\u0000"+ + "\u05fb\u05fa\u0001\u0000\u0000\u0000\u05fb\u05fc\u0001\u0000\u0000\u0000"+ + "\u05fc\u05fd\u0001\u0000\u0000\u0000\u05fd\u05ff\u0003\u0180\u00c0\u0000"+ + "\u05fe\u0600\u0003\u00a2Q\u0000\u05ff\u05fe\u0001\u0000\u0000\u0000\u05ff"+ + "\u0600\u0001\u0000\u0000\u0000\u0600\u0602\u0001\u0000\u0000\u0000\u0601"+ + "\u05f8\u0001\u0000\u0000\u0000\u0601\u05fb\u0001\u0000\u0000\u0000\u0602"+ + "\u0603\u0001\u0000\u0000\u0000\u0603\u0607\u0005h\u0000\u0000\u0604\u0606"+ + "\u0003\u0114\u008a\u0000\u0605\u0604\u0001\u0000\u0000\u0000\u0606\u0609"+ + "\u0001\u0000\u0000\u0000\u0607\u0605\u0001\u0000\u0000\u0000\u0607\u0608"+ + "\u0001\u0000\u0000\u0000\u0608\u060a\u0001\u0000\u0000\u0000\u0609\u0607"+ + "\u0001\u0000\u0000\u0000\u060a\u060b\u0005i\u0000\u0000\u060b\u0113\u0001"+ + "\u0000\u0000\u0000\u060c\u060d\u0003\u0116\u008b\u0000\u060d\u060f\u0005"+ + "o\u0000\u0000\u060e\u0610\u0003\u00f4z\u0000\u060f\u060e\u0001\u0000\u0000"+ + "\u0000\u060f\u0610\u0001\u0000\u0000\u0000\u0610\u0115\u0001\u0000\u0000"+ + "\u0000\u0611\u0612\u0005P\u0000\u0000\u0612\u0615\u0003\u00e6s\u0000\u0613"+ + "\u0615\u0005L\u0000\u0000\u0614\u0611\u0001\u0000\u0000\u0000\u0614\u0613"+ + "\u0001\u0000\u0000\u0000\u0615\u0117\u0001\u0000\u0000\u0000\u0616\u061f"+ + "\u0005Y\u0000\u0000\u0617\u0620\u0003\u011a\u008d\u0000\u0618\u0619\u0003"+ + "\u0180\u00c0\u0000\u0619\u061a\u0003\u011a\u008d\u0000\u061a\u0620\u0001"+ + "\u0000\u0000\u0000\u061b\u061c\u0003\u00f6{\u0000\u061c\u061d\u0003\u0180"+ + "\u00c0\u0000\u061d\u061e\u0003\u011a\u008d\u0000\u061e\u0620\u0001\u0000"+ + "\u0000\u0000\u061f\u0617\u0001\u0000\u0000\u0000\u061f\u0618\u0001\u0000"+ + "\u0000\u0000\u061f\u061b\u0001\u0000\u0000\u0000\u0620\u0621\u0001\u0000"+ + "\u0000\u0000\u0621\u0625\u0005h\u0000\u0000\u0622\u0624\u0003\u011c\u008e"+ + "\u0000\u0623\u0622\u0001\u0000\u0000\u0000\u0624\u0627\u0001\u0000\u0000"+ + "\u0000\u0625\u0623\u0001\u0000\u0000\u0000\u0625\u0626\u0001\u0000\u0000"+ + "\u0000\u0626\u0628\u0001\u0000\u0000\u0000\u0627\u0625\u0001\u0000\u0000"+ + "\u0000\u0628\u0629\u0005i\u0000\u0000\u0629\u0119\u0001\u0000\u0000\u0000"+ + "\u062a\u062b\u0005e\u0000\u0000\u062b\u062d\u0005s\u0000\u0000\u062c\u062a"+ + "\u0001\u0000\u0000\u0000\u062c\u062d\u0001\u0000\u0000\u0000\u062d\u062e"+ + "\u0001\u0000\u0000\u0000\u062e\u062f\u0003\u00b2Y\u0000\u062f\u0630\u0005"+ + "p\u0000\u0000\u0630\u0631\u0005f\u0000\u0000\u0631\u0632\u0005^\u0000"+ + "\u0000\u0632\u0633\u0005g\u0000\u0000\u0633\u011b\u0001\u0000\u0000\u0000"+ + "\u0634\u0635\u0003\u011e\u008f\u0000\u0635\u0637\u0005o\u0000\u0000\u0636"+ + "\u0638\u0003\u00f4z\u0000\u0637\u0636\u0001\u0000\u0000\u0000\u0637\u0638"+ + "\u0001\u0000\u0000\u0000\u0638\u011d\u0001\u0000\u0000\u0000\u0639\u063a"+ + "\u0005P\u0000\u0000\u063a\u063d\u0003\u0120\u0090\u0000\u063b\u063d\u0005"+ + "L\u0000\u0000\u063c\u0639\u0001\u0000\u0000\u0000\u063c\u063b\u0001\u0000"+ + "\u0000\u0000\u063d\u011f\u0001\u0000\u0000\u0000\u063e\u0641\u0003\u00c2"+ + "a\u0000\u063f\u0641\u0005d\u0000\u0000\u0640\u063e\u0001\u0000\u0000\u0000"+ + "\u0640\u063f\u0001\u0000\u0000\u0000\u0641\u0649\u0001\u0000\u0000\u0000"+ + "\u0642\u0645\u0005m\u0000\u0000\u0643\u0646\u0003\u00c2a\u0000\u0644\u0646"+ + "\u0005d\u0000\u0000\u0645\u0643\u0001\u0000\u0000\u0000\u0645\u0644\u0001"+ + "\u0000\u0000\u0000\u0646\u0648\u0001\u0000\u0000\u0000\u0647\u0642\u0001"+ + "\u0000\u0000\u0000\u0648\u064b\u0001\u0000\u0000\u0000\u0649\u0647\u0001"+ + "\u0000\u0000\u0000\u0649\u064a\u0001\u0000\u0000\u0000\u064a\u0121\u0001"+ + "\u0000\u0000\u0000\u064b\u0649\u0001\u0000\u0000\u0000\u064c\u064d\u0005"+ + "O\u0000\u0000\u064d\u0651\u0005h\u0000\u0000\u064e\u0650\u0003\u0124\u0092"+ + "\u0000\u064f\u064e\u0001\u0000\u0000\u0000\u0650\u0653\u0001\u0000\u0000"+ + "\u0000\u0651\u064f\u0001\u0000\u0000\u0000\u0651\u0652\u0001\u0000\u0000"+ + "\u0000\u0652\u0654\u0001\u0000\u0000\u0000\u0653\u0651\u0001\u0000\u0000"+ + "\u0000\u0654\u0655\u0005i\u0000\u0000\u0655\u0123\u0001\u0000\u0000\u0000"+ + "\u0656\u0657\u0003\u0126\u0093\u0000\u0657\u0659\u0005o\u0000\u0000\u0658"+ + "\u065a\u0003\u00f4z\u0000\u0659\u0658\u0001\u0000\u0000\u0000\u0659\u065a"+ + "\u0001\u0000\u0000\u0000\u065a\u0125\u0001\u0000\u0000\u0000\u065b\u065e"+ + "\u0005P\u0000\u0000\u065c\u065f\u0003\u00fa}\u0000\u065d\u065f\u0003\u0128"+ + "\u0094\u0000\u065e\u065c\u0001\u0000\u0000\u0000\u065e\u065d\u0001\u0000"+ + "\u0000\u0000\u065f\u0662\u0001\u0000\u0000\u0000\u0660\u0662\u0005L\u0000"+ + "\u0000\u0661\u065b\u0001\u0000\u0000\u0000\u0661\u0660\u0001\u0000\u0000"+ + "\u0000\u0662\u0127\u0001\u0000\u0000\u0000\u0663\u0664\u0003\u00e6s\u0000"+ + "\u0664\u0665\u0005l\u0000\u0000\u0665\u066a\u0001\u0000\u0000\u0000\u0666"+ + "\u0667\u0003\u00e4r\u0000\u0667\u0668\u0005s\u0000\u0000\u0668\u066a\u0001"+ + "\u0000\u0000\u0000\u0669\u0663\u0001\u0000\u0000\u0000\u0669\u0666\u0001"+ + "\u0000\u0000\u0000\u0669\u066a\u0001\u0000\u0000\u0000\u066a\u066b\u0001"+ + "\u0000\u0000\u0000\u066b\u066c\u0003\u00a2Q\u0000\u066c\u0129\u0001\u0000"+ + "\u0000\u0000\u066d\u0671\u0005`\u0000\u0000\u066e\u0672\u0003\u00a2Q\u0000"+ + "\u066f\u0672\u0003\u012c\u0096\u0000\u0670\u0672\u0003\u00d8l\u0000\u0671"+ + "\u066e\u0001\u0000\u0000\u0000\u0671\u066f\u0001\u0000\u0000\u0000\u0671"+ + "\u0670\u0001\u0000\u0000\u0000\u0671\u0672\u0001\u0000\u0000\u0000\u0672"+ + "\u0673\u0001\u0000\u0000\u0000\u0673\u0674\u0003\u00f2y\u0000\u0674\u012b"+ + "\u0001\u0000\u0000\u0000\u0675\u0677\u0003\u00f6{\u0000\u0676\u0675\u0001"+ + "\u0000\u0000\u0000\u0676\u0677\u0001\u0000\u0000\u0000\u0677\u0678\u0001"+ + "\u0000\u0000\u0000\u0678\u067a\u0003\u0180\u00c0\u0000\u0679\u067b\u0003"+ + "\u00a2Q\u0000\u067a\u0679\u0001\u0000\u0000\u0000\u067a\u067b\u0001\u0000"+ + "\u0000\u0000\u067b\u067c\u0001\u0000\u0000\u0000\u067c\u067e\u0003\u0180"+ + "\u00c0\u0000\u067d\u067f\u0003\u00f6{\u0000\u067e\u067d\u0001\u0000\u0000"+ + "\u0000\u067e\u067f\u0001\u0000\u0000\u0000\u067f\u012d\u0001\u0000\u0000"+ + "\u0000\u0680\u0681\u0005R\u0000\u0000\u0681\u0682\u0003\u00a2Q\u0000\u0682"+ + "\u012f\u0001\u0000\u0000\u0000\u0683\u0686\u0003\u0160\u00b0\u0000\u0684"+ + "\u0686\u0005e\u0000\u0000\u0685\u0683\u0001\u0000\u0000\u0000\u0685\u0684"+ + "\u0001\u0000\u0000\u0000\u0686\u0131\u0001\u0000\u0000\u0000\u0687\u0688"+ + "\u0005j\u0000\u0000\u0688\u0689\u0003\u0134\u009a\u0000\u0689\u068a\u0005"+ + "k\u0000\u0000\u068a\u068b\u0003\u0136\u009b\u0000\u068b\u0133\u0001\u0000"+ + "\u0000\u0000\u068c\u068d\u0003\u00a2Q\u0000\u068d\u0135\u0001\u0000\u0000"+ + "\u0000\u068e\u068f\u0003\u00c2a\u0000\u068f\u0137\u0001\u0000\u0000\u0000"+ + "\u0690\u0691\u0005\u0087\u0000\u0000\u0691\u0692\u0003\u00c2a\u0000\u0692"+ + "\u0139\u0001\u0000\u0000\u0000\u0693\u0698\u0003\u013c\u009e\u0000\u0694"+ + "\u0695\u0005}\u0000\u0000\u0695\u0697\u0003\u013c\u009e\u0000\u0696\u0694"+ + "\u0001\u0000\u0000\u0000\u0697\u069a\u0001\u0000\u0000\u0000\u0698\u0696"+ + "\u0001\u0000\u0000\u0000\u0698\u0699\u0001\u0000\u0000\u0000\u0699\u013b"+ + "\u0001\u0000\u0000\u0000\u069a\u0698\u0001\u0000\u0000\u0000\u069b\u069c"+ + "\u0003\u00c2a\u0000\u069c\u013d\u0001\u0000\u0000\u0000\u069d\u069e\u0005"+ + "j\u0000\u0000\u069e\u069f\u0005k\u0000\u0000\u069f\u06a0\u0003\u0136\u009b"+ + "\u0000\u06a0\u013f\u0001\u0000\u0000\u0000\u06a1\u06a2\u0005S\u0000\u0000"+ + "\u06a2\u06a3\u0005j\u0000\u0000\u06a3\u06a4\u0003\u00c2a\u0000\u06a4\u06a5"+ + "\u0005k\u0000\u0000\u06a5\u06a6\u0003\u0136\u009b\u0000\u06a6\u0141\u0001"+ + "\u0000\u0000\u0000\u06a7\u06ad\u0005U\u0000\u0000\u06a8\u06a9\u0005U\u0000"+ + "\u0000\u06a9\u06ad\u0005\u0089\u0000\u0000\u06aa\u06ab\u0005\u0089\u0000"+ + "\u0000\u06ab\u06ad\u0005U\u0000\u0000\u06ac\u06a7\u0001\u0000\u0000\u0000"+ + "\u06ac\u06a8\u0001\u0000\u0000\u0000\u06ac\u06aa\u0001\u0000\u0000\u0000"+ + "\u06ad\u06ae\u0001\u0000\u0000\u0000\u06ae\u06af\u0003\u0136\u009b\u0000"+ + "\u06af\u0143\u0001\u0000\u0000\u0000\u06b0\u06b1\u0005M\u0000\u0000\u06b1"+ + "\u06b2\u0003\u0146\u00a3\u0000\u06b2\u0145\u0001\u0000\u0000\u0000\u06b3"+ + "\u06b4\u0003\u014a\u00a5\u0000\u06b4\u06b5\u0003\u0148\u00a4\u0000\u06b5"+ + "\u06b8\u0001\u0000\u0000\u0000\u06b6\u06b8\u0003\u014a\u00a5\u0000\u06b7"+ + "\u06b3\u0001\u0000\u0000\u0000\u06b7\u06b6\u0001\u0000\u0000\u0000\u06b8"+ + "\u0147\u0001\u0000\u0000\u0000\u06b9\u06bc\u0003\u014a\u00a5\u0000\u06ba"+ + "\u06bc\u0003\u00c2a\u0000\u06bb\u06b9\u0001\u0000\u0000\u0000\u06bb\u06ba"+ + "\u0001\u0000\u0000\u0000\u06bc\u0149\u0001\u0000\u0000\u0000\u06bd\u06c9"+ + "\u0005f\u0000\u0000\u06be\u06c3\u0003\u009aM\u0000\u06bf\u06c0\u0005m"+ + "\u0000\u0000\u06c0\u06c2\u0003\u009aM\u0000\u06c1\u06bf\u0001\u0000\u0000"+ + "\u0000\u06c2\u06c5\u0001\u0000\u0000\u0000\u06c3\u06c1\u0001\u0000\u0000"+ + "\u0000\u06c3\u06c4\u0001\u0000\u0000\u0000\u06c4\u06c7\u0001\u0000\u0000"+ + "\u0000\u06c5\u06c3\u0001\u0000\u0000\u0000\u06c6\u06c8\u0005m\u0000\u0000"+ + "\u06c7\u06c6\u0001\u0000\u0000\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000"+ + "\u06c8\u06ca\u0001\u0000\u0000\u0000\u06c9\u06be\u0001\u0000\u0000\u0000"+ + "\u06c9\u06ca\u0001\u0000\u0000\u0000\u06ca\u06cb\u0001\u0000\u0000\u0000"+ + "\u06cb\u06cc\u0005g\u0000\u0000\u06cc\u014b\u0001\u0000\u0000\u0000\u06cd"+ + "\u06ce\u0005j\u0000\u0000\u06ce\u06d0\u0003\u014e\u00a7\u0000\u06cf\u06d1"+ + "\u0005m\u0000\u0000\u06d0\u06cf\u0001\u0000\u0000\u0000\u06d0\u06d1\u0001"+ + "\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d3\u0005"+ + "k\u0000\u0000\u06d3\u014d\u0001\u0000\u0000\u0000\u06d4\u06d9\u0003\u0150"+ + "\u00a8\u0000\u06d5\u06d6\u0005m\u0000\u0000\u06d6\u06d8\u0003\u0150\u00a8"+ + "\u0000\u06d7\u06d5\u0001\u0000\u0000\u0000\u06d8\u06db\u0001\u0000\u0000"+ + "\u0000\u06d9\u06d7\u0001\u0000\u0000\u0000\u06d9\u06da\u0001\u0000\u0000"+ + "\u0000\u06da\u014f\u0001\u0000\u0000\u0000\u06db\u06d9\u0001\u0000\u0000"+ + "\u0000\u06dc\u06dd\u0003\u00e4r\u0000\u06dd\u06de\u0003\u0152\u00a9\u0000"+ + "\u06de\u0151\u0001\u0000\u0000\u0000\u06df\u06e0\u0003\u013a\u009d\u0000"+ + "\u06e0\u0153\u0001\u0000\u0000\u0000\u06e1\u06e2\u0003\u0156\u00ab\u0000"+ + "\u06e2\u06e3\u0005f\u0000\u0000\u06e3\u06e5\u0003\u00a2Q\u0000\u06e4\u06e6"+ + "\u0005m\u0000\u0000\u06e5\u06e4\u0001\u0000\u0000\u0000\u06e5\u06e6\u0001"+ + "\u0000\u0000\u0000\u06e6\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8\u0005"+ + "g\u0000\u0000\u06e8\u0155\u0001\u0000\u0000\u0000\u06e9\u06ef\u0003\u00c4"+ + "b\u0000\u06ea\u06eb\u0005f\u0000\u0000\u06eb\u06ec\u0003\u0156\u00ab\u0000"+ + "\u06ec\u06ed\u0005g\u0000\u0000\u06ed\u06ef\u0001\u0000\u0000\u0000\u06ee"+ + "\u06e9\u0001\u0000\u0000\u0000\u06ee\u06ea\u0001\u0000\u0000\u0000\u06ef"+ + "\u0157\u0001\u0000\u0000\u0000\u06f0\u06f7\u0003\u015a\u00ad\u0000\u06f1"+ + "\u06f7\u0003\u015e\u00af\u0000\u06f2\u06f3\u0005f\u0000\u0000\u06f3\u06f4"+ + "\u0003\u00a2Q\u0000\u06f4\u06f5\u0005g\u0000\u0000\u06f5\u06f7\u0001\u0000"+ + "\u0000\u0000\u06f6\u06f0\u0001\u0000\u0000\u0000\u06f6\u06f1\u0001\u0000"+ + "\u0000\u0000\u06f6\u06f2\u0001\u0000\u0000\u0000\u06f7\u0159\u0001\u0000"+ + "\u0000\u0000\u06f8\u06fc\u0003\u00b0X\u0000\u06f9\u06fc\u0003\u0162\u00b1"+ + "\u0000\u06fa\u06fc\u0003\u00b4Z\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000"+ + "\u06fb\u06f9\u0001\u0000\u0000\u0000\u06fb\u06fa\u0001\u0000\u0000\u0000"+ + "\u06fc\u015b\u0001\u0000\u0000\u0000\u06fd\u06fe\u0007\u0011\u0000\u0000"+ + "\u06fe\u015d\u0001\u0000\u0000\u0000\u06ff\u0700\u0005e\u0000\u0000\u0700"+ + "\u015f\u0001\u0000\u0000\u0000\u0701\u0702\u0005e\u0000\u0000\u0702\u0703"+ + "\u0005p\u0000\u0000\u0703\u0704\u0005e\u0000\u0000\u0704\u0161\u0001\u0000"+ + "\u0000\u0000\u0705\u0706\u0003\u00cae\u0000\u0706\u0707\u0003\u0164\u00b2"+ + "\u0000\u0707\u0163\u0001\u0000\u0000\u0000\u0708\u070d\u0005h\u0000\u0000"+ + "\u0709\u070b\u0003\u0166\u00b3\u0000\u070a\u070c\u0005m\u0000\u0000\u070b"+ + "\u070a\u0001\u0000\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c"+ + "\u070e\u0001\u0000\u0000\u0000\u070d\u0709\u0001\u0000\u0000\u0000\u070d"+ + "\u070e\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f"+ + "\u0710\u0005i\u0000\u0000\u0710\u0165\u0001\u0000\u0000\u0000\u0711\u0716"+ + "\u0003\u0168\u00b4\u0000\u0712\u0713\u0005m\u0000\u0000\u0713\u0715\u0003"+ + "\u0168\u00b4\u0000\u0714\u0712\u0001\u0000\u0000\u0000\u0715\u0718\u0001"+ + "\u0000\u0000\u0000\u0716\u0714\u0001\u0000\u0000\u0000\u0716\u0717\u0001"+ + "\u0000\u0000\u0000\u0717\u0167\u0001\u0000\u0000\u0000\u0718\u0716\u0001"+ + "\u0000\u0000\u0000\u0719\u071a\u0003\u016a\u00b5\u0000\u071a\u071b\u0005"+ + "o\u0000\u0000\u071b\u071d\u0001\u0000\u0000\u0000\u071c\u0719\u0001\u0000"+ + "\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d\u071e\u0001\u0000"+ + "\u0000\u0000\u071e\u071f\u0003\u016c\u00b6\u0000\u071f\u0169\u0001\u0000"+ + "\u0000\u0000\u0720\u0723\u0003\u00a2Q\u0000\u0721\u0723\u0003\u0164\u00b2"+ + "\u0000\u0722\u0720\u0001\u0000\u0000\u0000\u0722\u0721\u0001\u0000\u0000"+ + "\u0000\u0723\u016b\u0001\u0000\u0000\u0000\u0724\u0727\u0003\u00a2Q\u0000"+ + "\u0725\u0727\u0003\u0164\u00b2\u0000\u0726\u0724\u0001\u0000\u0000\u0000"+ + "\u0726\u0725\u0001\u0000\u0000\u0000\u0727\u016d\u0001\u0000\u0000\u0000"+ + "\u0728\u0729\u0005T\u0000\u0000\u0729\u072f\u0005h\u0000\u0000\u072a\u072b"+ + "\u0003\u0170\u00b8\u0000\u072b\u072c\u0005\u009f\u0000\u0000\u072c\u072e"+ + "\u0001\u0000\u0000\u0000\u072d\u072a\u0001\u0000\u0000\u0000\u072e\u0731"+ + "\u0001\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000\u0000\u072f\u0730"+ + "\u0001\u0000\u0000\u0000\u0730\u0732\u0001\u0000\u0000\u0000\u0731\u072f"+ + "\u0001\u0000\u0000\u0000\u0732\u0733\u0005i\u0000\u0000\u0733\u016f\u0001"+ + "\u0000\u0000\u0000\u0734\u0735\u0003\u00e4r\u0000\u0735\u0736\u0003\u00c2"+ + "a\u0000\u0736\u0739\u0001\u0000\u0000\u0000\u0737\u0739\u0003\u0174\u00ba"+ + "\u0000\u0738\u0734\u0001\u0000\u0000\u0000\u0738\u0737\u0001\u0000\u0000"+ + "\u0000\u0739\u073b\u0001\u0000\u0000\u0000\u073a\u073c\u0003\u0172\u00b9"+ + "\u0000\u073b\u073a\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000\u0000"+ + "\u0000\u073c\u0171\u0001\u0000\u0000\u0000\u073d\u073e\u0007\u0012\u0000"+ + "\u0000\u073e\u0173\u0001\u0000\u0000\u0000\u073f\u0741\u0005\u0087\u0000"+ + "\u0000\u0740\u073f\u0001\u0000\u0000\u0000\u0740\u0741\u0001\u0000\u0000"+ + "\u0000\u0741\u0742\u0001\u0000\u0000\u0000\u0742\u0744\u0003\u0130\u0098"+ + "\u0000\u0743\u0745\u0003\u0176\u00bb\u0000\u0744\u0743\u0001\u0000\u0000"+ + "\u0000\u0744\u0745\u0001\u0000\u0000\u0000\u0745\u0175\u0001\u0000\u0000"+ + "\u0000\u0746\u0747\u0005j\u0000\u0000\u0747\u074c\u0003\u00a2Q\u0000\u0748"+ + "\u0749\u0005m\u0000\u0000\u0749\u074b\u0003\u00a2Q\u0000\u074a\u0748\u0001"+ + "\u0000\u0000\u0000\u074b\u074e\u0001\u0000\u0000\u0000\u074c\u074a\u0001"+ + "\u0000\u0000\u0000\u074c\u074d\u0001\u0000\u0000\u0000\u074d\u0750\u0001"+ + "\u0000\u0000\u0000\u074e\u074c\u0001\u0000\u0000\u0000\u074f\u0751\u0005"+ + "m\u0000\u0000\u0750\u074f\u0001\u0000\u0000\u0000\u0750\u0751\u0001\u0000"+ + "\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0005k\u0000"+ + "\u0000\u0753\u0177\u0001\u0000\u0000\u0000\u0754\u0755\u0005p\u0000\u0000"+ + "\u0755\u0756\u0005f\u0000\u0000\u0756\u0757\u0003\u00c2a\u0000\u0757\u0758"+ + "\u0005g\u0000\u0000\u0758\u0179\u0001\u0000\u0000\u0000\u0759\u0768\u0005"+ + "f\u0000\u0000\u075a\u0761\u0003\u00e6s\u0000\u075b\u075e\u0003\u0156\u00ab"+ + "\u0000\u075c\u075d\u0005m\u0000\u0000\u075d\u075f\u0003\u00e6s\u0000\u075e"+ + "\u075c\u0001\u0000\u0000\u0000\u075e\u075f\u0001\u0000\u0000\u0000\u075f"+ + "\u0761\u0001\u0000\u0000\u0000\u0760\u075a\u0001\u0000\u0000\u0000\u0760"+ + "\u075b\u0001\u0000\u0000\u0000\u0761\u0763\u0001\u0000\u0000\u0000\u0762"+ + "\u0764\u0005t\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0763\u0764"+ + "\u0001\u0000\u0000\u0000\u0764\u0766\u0001\u0000\u0000\u0000\u0765\u0767"+ + "\u0005m\u0000\u0000\u0766\u0765\u0001\u0000\u0000\u0000\u0766\u0767\u0001"+ + "\u0000\u0000\u0000\u0767\u0769\u0001\u0000\u0000\u0000\u0768\u0760\u0001"+ + "\u0000\u0000\u0000\u0768\u0769\u0001\u0000\u0000\u0000\u0769\u076a\u0001"+ + "\u0000\u0000\u0000\u076a\u076b\u0005g\u0000\u0000\u076b\u017b\u0001\u0000"+ + "\u0000\u0000\u076c\u076d\u0003\u0156\u00ab\u0000\u076d\u076e\u0005p\u0000"+ + "\u0000\u076e\u076f\u0005e\u0000\u0000\u076f\u017d\u0001\u0000\u0000\u0000"+ + "\u0770\u0771\u0003\u00c2a\u0000\u0771\u017f\u0001\u0000\u0000\u0000\u0772"+ + "\u0777\u0005n\u0000\u0000\u0773\u0777\u0005\u0000\u0000\u0001\u0774\u0777"+ + "\u0005\u009f\u0000\u0000\u0775\u0777\u0004\u00c0\u0012\u0000\u0776\u0772"+ + "\u0001\u0000\u0000\u0000\u0776\u0773\u0001\u0000\u0000\u0000\u0776\u0774"+ + "\u0001\u0000\u0000\u0000\u0776\u0775\u0001\u0000\u0000\u0000\u0777\u0181"+ + "\u0001\u0000\u0000\u0000\u00c4\u0190\u0195\u019c\u01a6\u01ac\u01b2\u01c2"+ + "\u01c6\u01cf\u01db\u01df\u01e5\u01ee\u01f8\u0209\u0217\u021b\u0222\u022a"+ + "\u0233\u0253\u025b\u0273\u0286\u0295\u02a2\u02ab\u02b9\u02c2\u02ce\u02e3"+ + "\u02ea\u02ef\u02f4\u02fe\u0301\u0305\u0309\u0311\u0319\u031e\u0326\u0328"+ + "\u032d\u0334\u033c\u033f\u0345\u034a\u034c\u034f\u0356\u035b\u036e\u0376"+ + "\u037a\u037d\u0383\u0387\u038a\u0394\u039b\u03a2\u03ae\u03b3\u03b7\u03be"+ + "\u03c3\u03c9\u03d5\u03db\u03df\u03e7\u03eb\u03f1\u03f4\u03fa\u03ff\u0418"+ + "\u043b\u043d\u0454\u045c\u0467\u046e\u0475\u047f\u048d\u04a3\u04a5\u04ad"+ + "\u04b1\u04b5\u04b8\u04c3\u04cb\u04d2\u04da\u04e0\u04e4\u04ec\u04f7\u0502"+ + "\u0506\u0508\u0514\u0516\u051f\u0523\u0526\u052d\u0538\u0542\u0548\u054a"+ + "\u0554\u055e\u0562\u0566\u056a\u0571\u0579\u0584\u0588\u058c\u0594\u05a0"+ + "\u05a4\u05a8\u05b1\u05b8\u05cc\u05d0\u05d4\u05d8\u05e8\u05ee\u05f0\u05f4"+ + "\u05f8\u05fb\u05ff\u0601\u0607\u060f\u0614\u061f\u0625\u062c\u0637\u063c"+ + "\u0640\u0645\u0649\u0651\u0659\u065e\u0661\u0669\u0671\u0676\u067a\u067e"+ + "\u0685\u0698\u06ac\u06b7\u06bb\u06c3\u06c7\u06c9\u06d0\u06d9\u06e5\u06ee"+ + "\u06f6\u06fb\u070b\u070d\u0716\u071c\u0722\u0726\u072f\u0738\u073b\u0740"+ + "\u0744\u074c\u0750\u075e\u0760\u0763\u0766\u0768\u0776"; 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 46ab410f0..a96813938 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1257,7 +1257,7 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple *

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

*/ - @Override public T visitTypeListSwitch(GobraParser.TypeListSwitchContext ctx) { return visitChildren(ctx); } + @Override public T visitTypeList(GobraParser.TypeListContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1314,20 +1314,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitTypeName(GobraParser.TypeNameContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

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

- */ - @Override public T visitTypeArgs(GobraParser.TypeArgsContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

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

- */ - @Override public T visitTypeList(GobraParser.TypeListContext 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 aa43a3174..df0c88e1f 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1110,11 +1110,11 @@ public interface GobraParserVisitor extends ParseTreeVisitor { */ T visitTypeSwitchCase(GobraParser.TypeSwitchCaseContext ctx); /** - * Visit a parse tree produced by {@link GobraParser#typeListSwitch}. + * Visit a parse tree produced by {@link GobraParser#typeList}. * @param ctx the parse tree * @return the visitor result */ - T visitTypeListSwitch(GobraParser.TypeListSwitchContext ctx); + T visitTypeList(GobraParser.TypeListContext ctx); /** * Visit a parse tree produced by {@link GobraParser#selectStmt}. * @param ctx the parse tree @@ -1163,18 +1163,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitTypeName(GobraParser.TypeNameContext ctx); - /** - * Visit a parse tree produced by {@link GobraParser#typeArgs}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitTypeArgs(GobraParser.TypeArgsContext ctx); - /** - * Visit a parse tree produced by {@link GobraParser#typeList}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitTypeList(GobraParser.TypeListContext ctx); /** * Visit a parse tree produced by {@link GobraParser#arrayType}. * @param ctx the parse tree diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index f5999ce55..53748fbe0 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -472,7 +472,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 PAssignee /** * Represents Go's built-in "len(`exp`)" function that returns the diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 3a6cfdc9c..82bc11844 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -54,7 +54,11 @@ object AstPattern { def id: PIdnUse } - case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic + sealed trait Parameterizable { + var typeArgs: Vector[Type] = Vector.empty + } + + case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic with Parameterizable 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 eaddcec2b..e0e94d44d 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -95,8 +95,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) <> @@ -165,6 +165,9 @@ 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(showIdList(typeParameters)) 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) <> @@ -187,7 +190,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(right, left, typeParameters) => "type" <+> showId(left) <+> showType(right) <> showTypeParameters(typeParameters) case PTypeAlias(right, left) => "type" <+> showId(left) <+> "=" <+> showType(right) } @@ -443,7 +446,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) <> showList(index)(showExprOrType) case PSliceExp(base, low, high, cap) => { val lowP = low.fold(emptyDoc)(showExpr) @@ -730,8 +733,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/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 8751cc765..b587439b5 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -215,16 +215,12 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitType_(ctx: Type_Context): PType = { - if (has(ctx.typeName())) { - val typeName = visitTypeName(ctx.typeName()) - - if (has(ctx.typeArgs())) { - typeName.typeArgs = visitTypeArgs(ctx.typeArgs()) - } - - typeName - } else { - visitNode[PType](ctx.type_()) + visitChildren(ctx) match { + case Vector(typeName: PTypeName, index: Vector[PType]) => + typeName.typeArgs = index + typeName + case typeName: PTypeName => typeName + case _ => unexpected(ctx) } } @@ -236,26 +232,6 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole } } - /** - * {@inheritDoc } - * - *

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

- */ - override def visitTypeArgs(ctx: TypeArgsContext): Vector[PType] = { - visitTypeList(ctx.typeList()) - } - - /** - * {@inheritDoc } - * - *

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

- */ - override def visitTypeList(ctx: TypeListContext): Vector[PType] = { - visitListNode[PType](ctx.type_()) - } - /** * {@inheritDoc } * @@ -358,14 +334,19 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link #visitChildren} on {@code ctx}.

*/ override def visitEmbeddedField(ctx: EmbeddedFieldContext): PEmbeddedType = { - val embeddedType = visitChildren(ctx) match { + visitChildren(ctx) match { case name : PUnqualifiedTypeName => PEmbeddedName(name) + case Vector(name: PUnqualifiedTypeName, index: Vector[PType]) => + val embeddedName = PEmbeddedName(name) + embeddedName.typ.typeArgs = index + embeddedName 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]) => + val embeddedPointer = PEmbeddedPointer(name) + embeddedPointer.typ.typeArgs = index + embeddedPointer + case _ : PDot | Vector(_: PDot, _: Vector[PType]) | Vector("*", _ : PDot) | Vector("*", _ :PDot, _ : Vector[PType]) => fail(ctx, "Imported types are not yet supported as embedded interface names") } - - embeddedType.typ.typeArgs = visitTypeArgs(ctx.typeArgs()) - embeddedType } //endregion @@ -466,11 +447,14 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeElem(ctx: TypeElemContext): PType = { - if (ctx.typeTerm().length > 1) { - fail(ctx, "Union types are not yet supported.") - } + val typeElements = visitListNode[PType](ctx.typeTerm()) - visitNode[PType](ctx.typeTerm(0)) + if (typeElements.length > 1) { + fail(ctx, "Union types are currently not implemented yet") + // TODO discuss this with Felix (cannot use a simple PInterfaceType) + } else { + typeElements.head + } } /** @@ -801,7 +785,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val left = goIdnDef.get(ctx.IDENTIFIER()) val right = visitNode[PType](ctx.type_()) - PTypeAlias(right, left) + PTypeAlias(right, left).at(ctx) } /** @@ -811,21 +795,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeDef(ctx: TypeDefContext): PTypeDecl = { - val left = goIdnDef.get(ctx.IDENTIFIER()) - val right = visitNode[PType](ctx.type_()) - val typeParameters = visitTypeParameters(ctx.typeParameters()) - - PTypeDef(right, left, typeParameters) - } - - /** - * {@inheritDoc } - * - *

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

- */ - override def visitTypeParameters(ctx: TypeParametersContext): Vector[PTypeParameter] = { - visitTypeParamList(ctx.typeParamList()) + visitChildren(ctx) match { + case Vector(idnDef: PIdnDef, typeParameters: Vector[PTypeParameter], pType: PType) => PTypeDef(pType, idnDef, typeParameters).at(ctx) + case Vector(idnDef: PIdnDef, pType: PType) => PTypeDef(pType, idnDef, Vector.empty).at(ctx) + } } /** @@ -835,7 +808,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeParamList(ctx: TypeParamListContext): Vector[PTypeParameter] = { - ctx.typeParamDecl().asScala.flatMap(typeParamDeclCtx => visitTypeParamDecl(typeParamDeclCtx)).toVector + visitListNode[PTypeParameter](ctx.typeParamDecl()) } /** @@ -845,10 +818,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeParamDecl(ctx: TypeParamDeclContext): Vector[PTypeParameter] = { - val ids = visitIdentifierList(ctx.identifierList()) - val constraint = visitTypeConstraint(ctx.typeConstraint()) - - ids.map(id => PTypeParameter(id.name, constraint)).toVector + visitChildren(ctx) match { + case Vector(identifierList: Vector[PIdnDef], typeConstraint: PTypeConstraint) => + identifierList.map(id => PTypeParameter(id.name, typeConstraint).at(id)) + } } /** @@ -858,7 +831,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeConstraint(ctx: TypeConstraintContext): PTypeConstraint = { - PSimpleTypeConstraint(visitTypeElem(ctx.typeElem())) + PSimpleTypeConstraint(visitNode[PType](ctx.typeElem())).at(ctx) } /** @@ -1132,13 +1105,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * @return the visitor result */ override def visitOperand(ctx: GobraParser.OperandContext): PExpression = { - val typeArgs = visitTypeArgs(ctx.typeArgs()) - visitChildren(ctx) match { - case op : PNamedOperand => { - op.typeArgs = typeArgs - op - } case e : PExpression => e case Vector("(", e : PExpression, ")") => e case _ => fail(ctx) @@ -1199,13 +1166,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitLiteralType(ctx: LiteralTypeContext): PLiteralType = { - val typeArgs = visitTypeArgs(ctx.typeArgs()) - visitChildren(ctx) match { - case typeName : PTypeName => { - typeName.typeArgs = typeArgs + case Vector(typeName: PTypeName, index: Vector[PType]) => + typeName.typeArgs = index typeName - } case x : PLiteralType => x } } @@ -1337,7 +1301,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 { @@ -1454,7 +1418,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 @@ -1996,7 +1968,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole *

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

*/ - override def visitTypeListSwitch(ctx: TypeListSwitchContext): Vector[PExpressionOrType] = { + override def visitTypeList(ctx: TypeListContext): Vector[PExpressionOrType] = { val types = visitListNode[PType](ctx.type_()) // Need to check whether this includes nil, since it's a predeclared identifier and not a type if (has(ctx.NIL_LIT()) && !ctx.NIL_LIT().isEmpty) types.appended(PNilLit().at(ctx.NIL_LIT(0))) else types @@ -2011,7 +1983,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitTypeCaseClause(ctx: TypeCaseClauseContext): PTypeSwitchCase = { val body = PBlock(visitStatementList(ctx.statementList())) .at(if (has(ctx.statementList())) ctx.statementList() else ctx) // If we have no statement list, we need to position at the context - val left = visitTypeListSwitch(ctx.typeSwitchCase().typeListSwitch()) + val left = visitTypeList(ctx.typeSwitchCase().typeList()) PTypeSwitchCase(left, body).at(ctx) } diff --git a/src/main/scala/viper/gobra/frontend/Parser.scala b/src/main/scala/viper/gobra/frontend/Parser.scala index bc80f19e5..7ebfe569f 100644 --- a/src/main/scala/viper/gobra/frontend/Parser.scala +++ b/src/main/scala/viper/gobra/frontend/Parser.scala @@ -308,7 +308,7 @@ object Parser { 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/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index 64b51d831..2254912be 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 @@ -43,8 +43,14 @@ 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 { @@ -122,9 +128,26 @@ 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) => + val indexes = asTypeList(n.index) + if (indexes.isEmpty) return None + val indexesResolved = indexes.get.map(resolve) + if (!indexesResolved.forall(_.nonEmpty)) return None + val indexTypePatterns = indexesResolved.map { + case t : Option[ap.Type] => t + case _ => None + } + if (!indexTypePatterns.forall(_.nonEmpty)) return None + f.typeArgs = indexTypePatterns.map(_.get) + Some(f) + 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/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/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), From b1f787802e11ef29b552cd0976c981ee45286625 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 8 May 2023 22:32:14 +0200 Subject: [PATCH 05/37] fix a few things such that compilation can succeed --- build.sbt | 2 +- src/main/antlr4/GoParser.g4 | 4 +- .../viper/gobra/frontend/GobraParser.java | 66 +++++++++---------- .../scala/viper/gobra/frontend/Desugar.scala | 9 ++- .../gobra/frontend/ParseTreeTranslator.scala | 6 +- .../implementation/property/Implements.scala | 2 +- .../resolution/MemberResolution.scala | 2 +- .../implementation/typing/ExprTyping.scala | 41 +++++++----- .../info/implementation/typing/IdTyping.scala | 6 +- .../typing/ghost/GhostExprTyping.scala | 5 +- .../ghost/separation/GhostAssignability.scala | 5 +- .../ghost/separation/GhostWellDef.scala | 3 +- .../viper/gobra/parsing/ParserUnitTests.scala | 37 ++++++----- 13 files changed, 105 insertions(+), 83 deletions(-) diff --git a/build.sbt b/build.sbt index d2dfacf37..dca34e1c5 100644 --- a/build.sbt +++ b/build.sbt @@ -34,7 +34,7 @@ lazy val gobra = (project in file(".")) libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.9", // for SystemUtils libraryDependencies += "org.apache.commons" % "commons-text" % "1.9", // for escaping strings in parser preprocessor libraryDependencies += "commons-codec" % "commons-codec" % "1.15", // for obtaining the hex encoding of a string - libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.9.2", + libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.12.0", scalacOptions ++= Seq( "-encoding", "UTF-8", // Enforce UTF-8, instead of relying on properly set locales diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index 861d0042d..f64dc3d70 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -86,7 +86,7 @@ varSpec: block: L_CURLY statementList? R_CURLY; -statementList: (statement EOS)+; +statementList: (statement eos)+; statement: declaration @@ -361,7 +361,7 @@ key: expression | literalValue; element: expression | literalValue; -structType: STRUCT L_CURLY (fieldDecl EOS)* R_CURLY; +structType: STRUCT L_CURLY (fieldDecl eos)* R_CURLY; fieldDecl: ( identifierList type_ diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 0cb459365..e6cad4a17 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -6392,7 +6392,6 @@ public T accept(ParseTreeVisitor visitor) { public final PackageStmtContext packageStmt() throws RecognitionException { PackageStmtContext _localctx = new PackageStmtContext(_ctx, getState()); enterRule(_localctx, 168, RULE_packageStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -6402,14 +6401,14 @@ public final PackageStmtContext packageStmt() throws RecognitionException { expression(0); setState(1116); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==L_CURLY) { + switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) { + case 1: { setState(1115); block(); } + break; } - } } catch (RecognitionException re) { @@ -9306,9 +9305,11 @@ public List statement() { public StatementContext statement(int i) { return getRuleContext(StatementContext.class,i); } - public List EOS() { return getTokens(GobraParser.EOS); } - public TerminalNode EOS(int i) { - return getToken(GobraParser.EOS, i); + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); } public StatementListContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -9337,7 +9338,7 @@ public final StatementListContext statementList() throws RecognitionException { setState(1452); statement(); setState(1453); - match(EOS); + eos(); } } setState(1457); @@ -9686,7 +9687,6 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); enterRule(_localctx, 258, RULE_labeledStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -9696,14 +9696,14 @@ public final LabeledStmtContext labeledStmt() throws RecognitionException { match(COLON); setState(1484); _errHandler.sync(this); - _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 571956122151714810L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 3019359876175L) != 0) || ((((_la - 131)) & ~0x3f) == 0 && ((1L << (_la - 131)) & 1587199L) != 0)) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + case 1: { setState(1483); statement(); } + break; } - } } catch (RecognitionException re) { @@ -9737,7 +9737,6 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); enterRule(_localctx, 260, RULE_returnStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -9745,14 +9744,14 @@ public final ReturnStmtContext returnStmt() throws RecognitionException { match(RETURN); setState(1488); _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)) { + switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + case 1: { setState(1487); expressionList(); } + break; } - } } catch (RecognitionException re) { @@ -9784,7 +9783,6 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); enterRule(_localctx, 262, RULE_breakStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -9792,14 +9790,14 @@ public final BreakStmtContext breakStmt() throws RecognitionException { match(BREAK); setState(1492); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==IDENTIFIER) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + case 1: { setState(1491); match(IDENTIFIER); } + break; } - } } catch (RecognitionException re) { @@ -9831,7 +9829,6 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); enterRule(_localctx, 264, RULE_continueStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -9839,14 +9836,14 @@ public final ContinueStmtContext continueStmt() throws RecognitionException { match(CONTINUE); setState(1496); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==IDENTIFIER) { + switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) { + case 1: { setState(1495); match(IDENTIFIER); } + break; } - } } catch (RecognitionException re) { @@ -9969,7 +9966,6 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); enterRule(_localctx, 270, RULE_ifStmt); - int _la; try { enterOuterAlt(_localctx, 1); { @@ -10007,8 +10003,8 @@ public final IfStmtContext ifStmt() throws RecognitionException { block(); setState(1520); _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ELSE) { + switch ( getInterpreter().adaptivePredict(_input,137,_ctx) ) { + case 1: { setState(1515); match(ELSE); @@ -10031,8 +10027,8 @@ public final IfStmtContext ifStmt() throws RecognitionException { throw new NoViableAltException(this); } } + break; } - } } catch (RecognitionException re) { @@ -12968,9 +12964,11 @@ public List fieldDecl() { public FieldDeclContext fieldDecl(int i) { return getRuleContext(FieldDeclContext.class,i); } - public List EOS() { return getTokens(GobraParser.EOS); } - public TerminalNode EOS(int i) { - return getToken(GobraParser.EOS, i); + public List eos() { + return getRuleContexts(EosContext.class); + } + public EosContext eos(int i) { + return getRuleContext(EosContext.class,i); } public StructTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -13003,7 +13001,7 @@ public final StructTypeContext structType() throws RecognitionException { setState(1834); fieldDecl(); setState(1835); - match(EOS); + eos(); } } setState(1841); @@ -14602,7 +14600,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u05a7\u05a9\u0003\u00f4z\u0000\u05a8\u05a7\u0001\u0000\u0000\u0000\u05a8"+ "\u05a9\u0001\u0000\u0000\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa"+ "\u05ab\u0005i\u0000\u0000\u05ab\u00f3\u0001\u0000\u0000\u0000\u05ac\u05ad"+ - "\u0003\u00a4R\u0000\u05ad\u05ae\u0005\u009f\u0000\u0000\u05ae\u05b0\u0001"+ + "\u0003\u00a4R\u0000\u05ad\u05ae\u0003\u0180\u00c0\u0000\u05ae\u05b0\u0001"+ "\u0000\u0000\u0000\u05af\u05ac\u0001\u0000\u0000\u0000\u05b0\u05b1\u0001"+ "\u0000\u0000\u0000\u05b1\u05af\u0001\u0000\u0000\u0000\u05b1\u05b2\u0001"+ "\u0000\u0000\u0000\u05b2\u00f5\u0001\u0000\u0000\u0000\u05b3\u05b9\u0003"+ @@ -14814,7 +14812,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0725\u0727\u0003\u0164\u00b2\u0000\u0726\u0724\u0001\u0000\u0000\u0000"+ "\u0726\u0725\u0001\u0000\u0000\u0000\u0727\u016d\u0001\u0000\u0000\u0000"+ "\u0728\u0729\u0005T\u0000\u0000\u0729\u072f\u0005h\u0000\u0000\u072a\u072b"+ - "\u0003\u0170\u00b8\u0000\u072b\u072c\u0005\u009f\u0000\u0000\u072c\u072e"+ + "\u0003\u0170\u00b8\u0000\u072b\u072c\u0003\u0180\u00c0\u0000\u072c\u072e"+ "\u0001\u0000\u0000\u0000\u072d\u072a\u0001\u0000\u0000\u0000\u072e\u0731"+ "\u0001\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000\u0000\u072f\u0730"+ "\u0001\u0000\u0000\u0000\u0730\u0732\u0001\u0000\u0000\u0000\u0731\u072f"+ diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 0eff086cd..cd8e4d42b 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2424,8 +2424,13 @@ object Desugar { } 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 function case properly here + } + } + def indexedExprD(expr : ap.IndexedExp)(ctx : FunctionContext, info : TypeInfo)(src : Meta) : Writer[in.IndexedExp] = indexedExprD(expr.base, expr.index)(ctx, info)(src) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index b587439b5..4c6cffb0b 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -220,7 +220,9 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole typeName.typeArgs = index typeName case typeName: PTypeName => typeName - case _ => unexpected(ctx) + case typeLit: PTypeLit => typeLit + case pType: PType => pType + case _ => fail(ctx) } } @@ -930,7 +932,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole 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 = visitTypeParameters(ctx.typeParameters()) + 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 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..98a6e0dcf 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 @@ -39,7 +39,7 @@ 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))) => + case Some(ap.NamedType(_, st.NamedType(PTypeDef(int: PInterfaceType, _, _), _, context))) => // TODO handle this context.symbType(int) match { case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) case _ => 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 896553697..7548a5a18 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 @@ -181,7 +181,7 @@ trait MemberResolution { this: TypeInfoImpl => 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 NamedType(PTypeDef(t: PInterfaceType, _, _), _, _) => InterfaceT(t, ctxt) // TODO handle this case _ => ??? } ).promoteItf(e.typ.name)) 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 979af8e2e..4cb574f30 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 @@ -299,8 +299,9 @@ 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 ++ { + case n : PIndexedExp => resolve(n) match { + case Some(ap.Function(id, symb)) => noMessages // TODO handle this properly + 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 { @@ -351,6 +352,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => 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 ++ @@ -664,22 +666,25 @@ 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 n : PIndexedExp => resolve(n) match { + case Some(ap.Function(id, symb)) => NilType // TODO handle this case properly + 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") + } + } case PSliceExp(base, low, high, cap) => val baseType = exprType(base) 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 0f1b234fd..a71bb32e0 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,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => } }) - case Function(PFunctionDecl(_, args, r, _, _), _, _) => unsafeMessage(! { + case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { + // TODO handle this args.forall(wellDefMisc.valid) && miscType.valid(r) }) @@ -204,7 +205,8 @@ 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) => + // TODO handle this FunctionT(args map context.typ, context.typ(r)) case Closure(PFunctionLit(_, PClosureDecl(args, r, _, _)), _, context) => 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..cdeac97ac 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 @@ -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/separation/GhostAssignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostAssignability.scala index 80deb079e..962fdc6ac 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 @@ -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).forall { + case Left(expression) => !ghostExprResultClassification(expression) + case Right(pType) => !ghostTypeClassification(pType) + }) 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/GhostWellDef.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ghost/separation/GhostWellDef.scala index c6db45808..207d853ad 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,8 @@ trait GhostWellDef { this: TypeInfoImpl => exp.forall(wellGhostSeparated.valid) }) - case Function(PFunctionDecl(_, args, r, _, _), _, _) => unsafeMessage(! { + // TODO check this with Felix + case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { args.forall(wellGhostSeparated.valid) && wellGhostSeparated.valid(r) }) diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 6f0ea8526..7d70f260e 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") { @@ -717,7 +718,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 +729,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 +745,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 +788,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 +797,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 +2347,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 +2646,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 +2689,7 @@ 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" => } } } From 864e185642afe69f2bfc9a7486e6564f0298c594 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 15 May 2023 14:09:07 +0200 Subject: [PATCH 06/37] add some tests for generics - add tests - fix some issues in the parse tree translator and the pretty printer --- .../scala/viper/gobra/ast/frontend/Ast.scala | 6 +- .../gobra/ast/frontend/PrettyPrinter.scala | 14 +++-- .../gobra/frontend/ParseTreeTranslator.scala | 63 ++++++++++--------- .../viper/gobra/parsing/ParserUnitTests.scala | 39 +++++++++--- 4 files changed, 77 insertions(+), 45 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 53748fbe0..df2016832 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -199,7 +199,7 @@ sealed trait PTypeConstraint extends PNode case class PSimpleTypeConstraint(t: PType) extends PTypeConstraint -case class PUnionTypeConstraint(ts: Vector[PTypeConstraint]) extends PTypeConstraint +case class PUnionTypeConstraint(ts: Vector[PType]) extends PTypeConstraint /** @@ -637,7 +637,7 @@ sealed trait PTypeName extends PActualType with PLiteralType { sealed trait PUnqualifiedTypeName extends PTypeName object PUnqualifiedTypeName { - def unapply(arg: PUnqualifiedTypeName): Option[String] = Some(arg.name) + def unapply(arg: PUnqualifiedTypeName): Option[(String, Vector[PType])] = Some((arg.name, arg.typeArgs)) } /** @@ -777,7 +777,7 @@ case class PIdnDef(name: String) extends PDefLikeId case class PIdnUse(name: String) extends PUseLikeId case class PIdnUnk(name: String) extends PUnkLikeId -case class PTypeParameter(name: String, restriction: PTypeConstraint) extends PDefLikeId +case class PTypeParameter(name: String, constraint: PTypeConstraint) extends PDefLikeId case class PTypeArgument(name: String) extends PUseLikeId diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index e0e94d44d..c7d025c57 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -49,6 +49,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: PTypeConstraint => showTypeConstraint(n) case PPos(_) => emptyDoc } @@ -166,11 +167,11 @@ 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(showIdList(typeParameters)) else emptyDoc + if (typeParameters.nonEmpty) brackets(ssep(typeParameters map (p => p.name <+> showTypeConstraint(p.constraint)), 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)) } @@ -190,7 +191,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showTypeDecl(decl: PTypeDecl): Doc = decl match { - case PTypeDef(right, left, typeParameters) => "type" <+> showId(left) <+> showType(right) <> showTypeParameters(typeParameters) + case PTypeDef(right, left, typeParameters) => "type" <+> showId(left) <> showTypeParameters(typeParameters) <+> showType(right) case PTypeAlias(right, left) => "type" <+> showId(left) <+> "=" <+> showType(right) } @@ -446,7 +447,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) => showExprOrType(base) <> showList(index)(showExprOrType) + case PIndexedExp(base, index) => showExprOrType(base) <> brackets(showList(index)(showExprOrType)) case PSliceExp(base, low, high, cap) => { val lowP = low.fold(emptyDoc)(showExpr) @@ -673,6 +674,11 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case PMPredicateSig(id, args) => "pred" <+> showId(id) <> parens(showParameterList(args)) } + def showTypeConstraint(n: PTypeConstraint): Doc = n match { + case PSimpleTypeConstraint(t) => showType(t) + case PUnionTypeConstraint(ts) => ssep(ts map showType, space <> verticalbar <> space) + } + // ids def showId(id: PIdnNode): Doc = id.name diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 4c6cffb0b..00459a963 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._ @@ -433,9 +434,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitInterfaceType(ctx: GobraParser.InterfaceTypeContext): PInterfaceType = { val methodDecls = visitNodeIf[PMethodSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.methodSpec())) - val embedded = visitNodeIf[PType, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.typeElem())).map { - case tn: PUnqualifiedTypeName => PInterfaceName(tn).at(ctx) - case _: PDot => fail(ctx, "Imported types are not yet supported as embedded fields.") + val embedded = visitListNodeIf[PType, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.typeElem()), _.typeElem().typeTerm()).map { + case Vector(tn: PUnqualifiedTypeName) => PInterfaceName(tn).at(ctx) + case Vector(_: PDot) => fail(ctx, "Imported types are not yet supported as embedded fields.") + case x if x.length > 1 => fail(ctx, "Union types are not yet supported as embedded types") case _ => fail(ctx, s"Interface embeds predeclared type.") } val predicateDecls = visitNodeIf[PMPredicateSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.predicateSpec())) @@ -448,15 +450,8 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole *

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

*/ - override def visitTypeElem(ctx: TypeElemContext): PType = { - val typeElements = visitListNode[PType](ctx.typeTerm()) - - if (typeElements.length > 1) { - fail(ctx, "Union types are currently not implemented yet") - // TODO discuss this with Felix (cannot use a simple PInterfaceType) - } else { - typeElements.head - } + override def visitTypeElem(ctx: TypeElemContext): Vector[PType] = { + visitListNode[PType](ctx.typeTerm()) } /** @@ -763,20 +758,6 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole visitListNode[PTypeDecl](ctx.typeSpec()) } - /** - * {@inheritDoc } - * - *

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

- */ - override def visitTypeSpec(ctx: GobraParser.TypeSpecContext): PTypeDecl = { - visitChildren(ctx) match { - case aliasDeclCtx : AliasDeclContext => visitAliasDecl(aliasDeclCtx) - case typeDefCtx : TypeDefContext => visitTypeDef(typeDefCtx) - case _ => unexpected(ctx) - } - } - /** * {@inheritDoc } * @@ -798,11 +779,22 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitTypeDef(ctx: TypeDefContext): PTypeDecl = { visitChildren(ctx) match { - case Vector(idnDef: PIdnDef, typeParameters: Vector[PTypeParameter], pType: PType) => PTypeDef(pType, idnDef, typeParameters).at(ctx) - case Vector(idnDef: PIdnDef, pType: PType) => PTypeDef(pType, idnDef, Vector.empty).at(ctx) + case Vector(goIdnDef(id), typeParameters: Vector[PTypeParameter], pType: PType) => PTypeDef(pType, id, typeParameters).at(ctx) + case Vector(goIdnDef(id), pType: PType) => PTypeDef(pType, id, Vector.empty).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 } * @@ -810,7 +802,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeParamList(ctx: TypeParamListContext): Vector[PTypeParameter] = { - visitListNode[PTypeParameter](ctx.typeParamDecl()) + ctx.typeParamDecl().asScala.flatMap(typeParamDeclCtx => visitTypeParamDecl(typeParamDeclCtx)).toVector } /** @@ -821,7 +813,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitTypeParamDecl(ctx: TypeParamDeclContext): Vector[PTypeParameter] = { visitChildren(ctx) match { - case Vector(identifierList: Vector[PIdnDef], typeConstraint: PTypeConstraint) => + case Vector(idnDefList(identifierList), typeConstraint: PTypeConstraint) => identifierList.map(id => PTypeParameter(id.name, typeConstraint).at(id)) } } @@ -833,7 +825,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole * {@link # visitChildren} on {@code ctx}.

*/ override def visitTypeConstraint(ctx: TypeConstraintContext): PTypeConstraint = { - PSimpleTypeConstraint(visitNode[PType](ctx.typeElem())).at(ctx) + visitNode[Vector[PType]](ctx.typeElem()) match { + case Vector(pType: PType) => PSimpleTypeConstraint(pType).at(ctx) + case pTypes => PUnionTypeConstraint(pTypes).at(ctx) + } } /** @@ -2508,6 +2503,12 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole case c if cond(c) => visitNode(c) }.asInstanceOf[Vector[P]] } + + def visitListNodeIf[P <: PNode, C <: ParserRuleContext](ctx: java.util.List[C], cond: (C => Boolean), select : (C => java.util.List[_ <: ParserRuleContext])): Vector[Vector[P]] = { + ctx.asScala.toVector.collect { + case c if cond(c) => visitListNode(select(c)) + }.asInstanceOf[Vector[Vector[P]]] + } //endregion //region Error reporting and positioning diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 7d70f260e..73903d482 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -237,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( @@ -2354,7 +2348,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should parse type equality") { frontend.parseExpOrFail("typeOf(a) == type[int]") should matchPattern { - case PEquals(PTypeOf(_), PTypeExpr(PUnqualifiedTypeName("int"))) => + case PEquals(PTypeOf(_), PTypeExpr(PUnqualifiedTypeName("int", Vector()))) => } } @@ -2692,4 +2686,35 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { 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 interface{}]() {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter("T", PSimpleTypeConstraint(_))), _, _, _, _) => + } + } + + test("Parser: should be able to parse type definition with type parameters") { + frontend.parseStmtOrFail("type Bar[T interface{}] struct {}") should matchPattern { + case PSeq(Vector(PTypeDef(PStructType(_), PIdnDef("Bar"), Vector(PTypeParameter("T", PSimpleTypeConstraint(_)))))) => + } + } + + 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("T", PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), _, _, _, _) => + } + } + + 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(PUnqualifiedTypeName("Bar", Vector(PNamedOperand(PIdnUse("int")))), PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(n, Decimal)) + )))) if n == BigInt(3) => + } + } } From f822f7f6986d2b9609aad2e24aa51d7a7a23ec5a Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Wed, 17 May 2023 09:10:35 +0200 Subject: [PATCH 07/37] started expression typing --- .../scala/viper/gobra/ast/frontend/Ast.scala | 7 +- .../viper/gobra/ast/frontend/AstPattern.scala | 2 +- .../gobra/ast/frontend/PrettyPrinter.scala | 3 +- .../scala/viper/gobra/frontend/Desugar.scala | 6 +- .../gobra/frontend/ParseTreeTranslator.scala | 2 +- .../frontend/info/base/SymbolTable.scala | 12 +- .../viper/gobra/frontend/info/base/Type.scala | 15 +- .../resolution/AmbiguityResolution.scala | 14 +- .../resolution/NameResolution.scala | 1 + .../implementation/typing/ExprTyping.scala | 31 ++++- .../info/implementation/typing/IdTyping.scala | 11 +- .../implementation/typing/MiscTyping.scala | 1 + .../implementation/typing/TypeTyping.scala | 3 + .../viper/gobra/parsing/ParserUnitTests.scala | 6 +- .../gobra/typing/ExprTypingUnitTests.scala | 130 ++++++++++++------ .../gobra/typing/MemberTypingUnitTests.scala | 80 +++++++++++ .../gobra/typing/StmtTypingUnitTests.scala | 6 +- 17 files changed, 255 insertions(+), 75 deletions(-) create mode 100644 src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index df2016832..c7cd8fde0 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -777,10 +777,6 @@ case class PIdnDef(name: String) extends PDefLikeId case class PIdnUse(name: String) extends PUseLikeId case class PIdnUnk(name: String) extends PUnkLikeId -case class PTypeParameter(name: String, constraint: PTypeConstraint) extends PDefLikeId - -case class PTypeArgument(name: String) extends PUseLikeId - sealed trait PLabelNode extends PNode { def name: String } @@ -851,6 +847,9 @@ case class PEmbeddedName(typ: PUnqualifiedTypeName) extends PEmbeddedType case class PEmbeddedPointer(typ: PUnqualifiedTypeName) extends PEmbeddedType +case class PTypeParameter(id: PIdnDef, constraint: PTypeConstraint) extends PNode + +case class PTypeArgument(id: PIdnUse) extends PActualType /** * Ghost diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 82bc11844..fe61665e4 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -55,7 +55,7 @@ object AstPattern { } sealed trait Parameterizable { - var typeArgs: Vector[Type] = Vector.empty + var typeArgs: Vector[PType] = Vector.empty } case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic with Parameterizable diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index c7d025c57..8632b5f2a 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -167,7 +167,7 @@ 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 (p => p.name <+> showTypeConstraint(p.constraint)), comma <> space)) else emptyDoc + if (typeParameters.nonEmpty) brackets(ssep(typeParameters map (p => showId(p.id) <+> showTypeConstraint(p.constraint)), comma <> space)) else emptyDoc def showFunctionLit(lit: PFunctionLit): Doc = lit match { case PFunctionLit(id, PClosureDecl(args, result, spec, body)) => @@ -631,6 +631,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter ) case PMethodReceiveName(t) => showType(t) case PMethodReceivePointer(t) => "*" <> showType(t) + case PTypeArgument(id) => showId(id) // TODO handle this } def showGhostType(typ : PGhostType) : Doc = typ match { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index cd8e4d42b..f23033977 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2749,7 +2749,8 @@ object Desugar { for { dArgs <- sequence(args.map { x => option(x.map(exprD(ctx, info)(_))) }) idT = info.typ(base) match { - case FunctionT(fnArgs, AssertionT) => in.PredT(fnArgs.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) + // TODO handle this + case FunctionT(fnArgs, AssertionT, _) => in.PredT(fnArgs.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) case _: AbstractType => violation(dArgs.length == dArgs.flatten.length, "non-applied arguments in abstract type") // The result can have arguments, namely the arguments that are provided. @@ -3747,8 +3748,7 @@ object Desugar { 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) => + case Type.FunctionT(args, result, _) => // TODO handle this val res = result match { case InternalTupleT(r) => r case r: Type => Vector(r) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 00459a963..183f83fa4 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -814,7 +814,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole override def visitTypeParamDecl(ctx: TypeParamDeclContext): Vector[PTypeParameter] = { visitChildren(ctx) match { case Vector(idnDefList(identifierList), typeConstraint: PTypeConstraint) => - identifierList.map(id => PTypeParameter(id.name, typeConstraint).at(id)) + identifierList.map(id => PTypeParameter(id, typeConstraint).at(id)) } } 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..fb3865216 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 @@ -162,6 +168,10 @@ object SymbolTable extends Environments[Entity] { 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 c0eb1bdf1..09e178a5c 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -90,7 +90,16 @@ object Type { } } - case class FunctionT(args: Vector[Type], result: Type) extends PrettyType(s"func(${args.mkString(",")}) $result") + // TODO check if we need to ad type parameters to function type info + case class FunctionT(args: Vector[Type], result: Type, typeParameters: Vector[TypeParameterT]) + extends PrettyType(s"func(${args.mkString(",")}) $result") { + + def instantiate(typeParameter: TypeParameterT, typ: Type): Unit = { + val newArgs = args.map(arg => if (arg == typeParameter) typ else arg) + + FunctionT(args, result, typeParameters) + } + } case class PredT(args: Vector[Type]) extends PrettyType(s"pred(${args.mkString(",")})") @@ -116,6 +125,10 @@ object Type { case object SortT extends PrettyType("Type") + case class TypeParameterT(name: String) extends PrettyType(s"${name}IamATypeParameter") + + case class UnionT(types: Vector[Type]) extends PrettyType(s"${types.mkString(" | ")}") + sealed trait GhostType extends Type case object AssertionT extends PrettyType("assertion") with GhostType 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 2254912be..c96e6ea6f 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 @@ -130,17 +130,13 @@ trait AmbiguityResolution { this: TypeInfoImpl => case n: PIndexedExp => resolve(n.base) match { case Some(f: ap.Parameterizable) => - val indexes = asTypeList(n.index) - if (indexes.isEmpty) return None - val indexesResolved = indexes.get.map(resolve) - if (!indexesResolved.forall(_.nonEmpty)) return None - val indexTypePatterns = indexesResolved.map { - case t : Option[ap.Type] => t + asTypeList(n.index) match { + case Some(typeArgs) => { + f.typeArgs = typeArgs + Some(f) + } case _ => None } - if (!indexTypePatterns.forall(_.nonEmpty)) return None - f.typeArgs = indexTypePatterns.map(_.get) - Some(f) case _ if n.index.length == 1 => { exprOrType(n.index.head) match { case Left(expression) => Some(ap.IndexedExp(n.base, expression)) 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 b9b9da4db..d4d57bf62 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/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 4cb574f30..f77004100 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 @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.typing -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, noMessages} +import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, message, noMessages} 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._ @@ -14,6 +14,8 @@ import viper.gobra.frontend.info.implementation.TypeInfoImpl import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} +import scala.collection.immutable.Map.from + trait ExprTyping extends BaseTyping { this: TypeInfoImpl => import viper.gobra.util.Violation._ @@ -253,6 +255,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => c.callee.isInstanceOf[ap.Function] && c.callee.id.name == Constants.INIT_FUNC_NAME) // arguments have to be assignable to function val wellTypedArgs = exprType(callee) match { + // TODO handle this case FunctionT(args, _) => // TODO: add special assignment if (n.spec.nonEmpty) wellDefCallWithSpec(n) else if (n.args.isEmpty && args.isEmpty) noMessages @@ -277,6 +280,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } val pureArgsMsgs = p.args.flatMap(isPureExpr) val argAssignMsgs = exprType(callee) match { + // TODO handle this case FunctionT(args, _) => // TODO: add special assignment if (n.args.isEmpty && args.isEmpty) noMessages else multiAssignableTo.errors(n.args map exprType, args)(n) ++ n.args.flatMap(isExpr(_).out) @@ -300,7 +304,12 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case PBitNegation(op) => isExpr(op).out ++ assignableTo.errors(typ(op), UNTYPED_INT_CONST)(op) case n : PIndexedExp => resolve(n) match { - case Some(ap.Function(id, symb)) => noMessages // TODO handle this properly + case Some(ap.Function(id, symb)) => + n.index.flatMap(isType(_).out) ++ error(n, "wrong amount of type arguments provided", n.index.length != symb.typeParameters.length) ++ n.index.flatMap(i => { + val idxType = typeSymbType(asType(i).get) + // TODO check here that idxType conforms to the type constraint of the type parameter + noMessages + }) case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { val baseType = exprType(base) val idxType = exprType(index) @@ -565,6 +574,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case p@PPredConstructor(base, _) => { def wellTypedApp(base: PPredConstructorBase): Messages = miscType(base) match { + // TODO handle this case FunctionT(args, AssertionT) => val unappliedPositions = p.args.zipWithIndex.filter(_._1.isEmpty).map(_._2) val givenArgs = p.args.zipWithIndex.filterNot(x => unappliedPositions.contains(x._2)).map(_._1.get) @@ -590,6 +600,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } else { // the typing function should be defined for these arguments as `msgs` is empty abstractT.typing(givenArgTypes) match { + // TODO handle this case FunctionT(args, AssertionT) => if (givenArgs.isEmpty && args.isEmpty) { noMessages @@ -656,6 +667,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => AssertionT case (Left(callee), Some(_: ap.FunctionCall | _: ap.PredicateCall | _: ap.ClosureCall)) => exprType(callee) match { + // TODO handle this case FunctionT(_, res) => res case t: AbstractType => val argTypes = n.args map exprType @@ -667,7 +679,14 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } case n : PIndexedExp => resolve(n) match { - case Some(ap.Function(id, symb)) => NilType // TODO handle this case properly + case Some(ap.Function(id, symb)) => + val typeArguments = symb.typeParameters.map(_.id.name).zip(n.index.map(i => typeSymbType(asType(i).get))).toMap + val argumentTypes = symb.args.map(_.typ).map { + case PTypeArgument(id) => typeArguments(id.name) + case n => typeSymbType(n) + } + + FunctionT(argumentTypes, VoidType) case Some(ap.IndexedExp(base, index)) => val baseType = exprType(base) val idxType = exprType(index) @@ -744,6 +763,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => base match { case PFPredBase(id) => idType(id) match { + // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -755,6 +775,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.Predicate | _: ap.ReceivedPredicate | _: ap.ImplicitlyReceivedInterfacePredicate) => val recvWithIdT = exprOrTypeType(p.recvWithId) recvWithIdT match { + // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -765,6 +786,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.PredicateExpr) => val recvWithIdT = exprOrTypeType(p.recvWithId) recvWithIdT match { + // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -861,6 +883,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) typOfExprOrType(n.base) match { + // TODO handle this case FunctionT(fArgs, _) => if (index >= fArgs.length-1 && fArgs.lastOption.exists(_.isInstanceOf[VariadicT])) { fArgs.lastOption.map(_.asInstanceOf[VariadicT].elem) @@ -888,6 +911,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) typOfExprOrType(n.base) match { + // TODO handle this case FunctionT(fArgs, AssertionT) => fArgs.lift(index) case _: AbstractType => /* the abstract type cannot be resolved without creating a loop in kiama for the same reason as above @@ -920,6 +944,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = const.args.indexWhere { _.exists(y => y.eq(expr)) } violation(index >= 0, s"violation of assumption: a numeric expression $expr does not occur as an argument of its parent $const") typ(const.id) match { + // TODO handle this case FunctionT(args, AssertionT) => Some(args(index)) case _: AbstractType => // here too, resolving the abstract type would cause a cycle in kiama 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 a71bb32e0..7548e5ce3 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 @@ -139,6 +139,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => wellDefMisc.valid(typ) }) + case TypeParameter(_, _, _) => LocalMessages(noMessages) // TODO handle this + case _: MethodImpl => LocalMessages(noMessages) // not typed case _: MethodSpec => LocalMessages(noMessages) // not typed @@ -162,6 +164,9 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => AdtClauseT(types, a.decl, a.adtDecl, this) case BuiltInType(tag, _, _) => tag.typ + + case TypeParameter(decl, _, context) => TypeParameterT(id.name) // TODO verify this + case _ => violation(s"expected type, but got $id") } } @@ -205,8 +210,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") }) - case Function(PFunctionDecl(_, _, args, r, _, _), _, context) => - // TODO handle this + // TODO handle this + case Function(PFunctionDecl(_, typeParameters, args, r, _, _), _, context) => FunctionT(args map context.typ, context.typ(r)) case Closure(PFunctionLit(_, PClosureDecl(args, r, _, _)), _, context) => @@ -251,6 +256,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/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 059966248..609d33286 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -33,6 +33,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case n: PParameter => isType(n.typ).out case n: PReceiver => isType(n.typ).out case _: PResult => noMessages // children already taken care of + case n : PTypeParameter => noMessages // TODO handle this (I guess children should be already checked automatically) case n: PEmbeddedName => isType(n.typ).out case n: PEmbeddedPointer => isType(n.typ).out 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 15f131f3c..def384d33 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 @@ -73,6 +73,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } case t: PExpressionAndType => wellDefExprAndType(t).out + case t: PTypeArgument => noMessages // TODO handle this } lazy val typeSymbType: Typing[PType] = { @@ -143,6 +144,8 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PNamedOperand => idSymType(n.id) + case n: PTypeArgument => idSymType(n.id) // TODO verify this + case n: PDeref => resolve(n) match { case Some(p: ap.PointerType) => PointerT(typeSymbType(p.base)) diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 73903d482..5a6a6ce5b 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2689,19 +2689,19 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse function with type parameters") { frontend.parseFunctionDecl("func foo[T interface{}]() {}") should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter("T", PSimpleTypeConstraint(_))), _, _, _, _) => + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), _, _, _, _) => } } test("Parser: should be able to parse type definition with type parameters") { frontend.parseStmtOrFail("type Bar[T interface{}] struct {}") should matchPattern { - case PSeq(Vector(PTypeDef(PStructType(_), PIdnDef("Bar"), Vector(PTypeParameter("T", PSimpleTypeConstraint(_)))))) => + case PSeq(Vector(PTypeDef(PStructType(_), PIdnDef("Bar"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_)))))) => } } 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("T", PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), _, _, _, _) => + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), _, _, _, _) => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 84f1f3aff..f836de2ae 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -77,7 +77,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 +91,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 +99,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 +112,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 +127,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 +2046,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 +2591,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 +2642,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 +2651,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 +2660,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 +2675,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 +3358,71 @@ 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"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PNamedParameter(PIdnDef("x"), PTypeArgument(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PTypeArgument(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + // bar[int](4) + val expr = PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType())) + + frontend.exprType(expr)(Vector(), Vector(functionDecl)) should matchPattern { + // TODO consider if we really want to put the resolved type arguments into the FuntionT or not + // TODO continue with type argument + 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"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PNamedParameter(PIdnDef("x"), PTypeArgument(PIdnUse("T")))), + PResult(Vector(PUnnamedParameter(PTypeArgument(PIdnUse("T"))))), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some((PBodyParameterInfo(Vector()), PBlock(Vector()))) + ) + + val expr = PInvoke(PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType())), Vector(PIntLit(BigInt(8))), None) + + frontend.exprType(expr)(Vector(), Vector(functionDecl)) should matchPattern { + case Type.VoidType => + } + } /* * 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")), @@ -3396,16 +3436,16 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { new TypeInfoImpl(tree, context)(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..efeef2a95 --- /dev/null +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -0,0 +1,80 @@ +// 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 + +class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { + val frontend = new TestFrontend() + + test("TypeChecker: should be able to type non-generic function") { + val testValue = frontend.wellDefMember( + PFunctionDecl( + PIdnDef("foo"), + Vector(), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("int")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + Some(PBodyParameterInfo(Vector()), PBlock(Vector())) + ) + ) + + assert(testValue.valid) + } + + test("TypeChecker: should be able to type generic function") { + val testValue = frontend.wellDefMember( + PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), + PResult(Vector()), + PFunctionSpec(Vector(), Vector(), Vector(), Vector()), + None + ) + ) + + assert(testValue.valid) + } + + class TestFrontend { + def singleMemberProgram(member: PMember): PProgram = + PProgram( + PPackageClause(PPkgDef("pkg")), + Vector(), + Vector(), + Vector(member) + ) + + def memberTypeInfo(member: PMember): TypeInfoImpl = { + val program = singleMemberProgram(member) + 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 context = new Info.Context() + val config = Config() + new TypeInfoImpl(tree, context)(config) + } + + def wellDefMember(member: PMember) = + memberTypeInfo(member).wellDefMember(member) + } +} diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index 4675ee774..a213bad83 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -46,6 +46,8 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { ))().valid) } + test("TypeChecker: valid") + class TestFrontend { /** @@ -64,6 +66,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), @@ -86,7 +89,8 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { new TypeInfoImpl(tree, context)(config) } - def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = + def wellDefStmt(stmt : PStatement)(inArgs: Vector[(PParameter, Boolean)] = Vector()) = { singleStmtTypeInfo(inArgs, stmt).wellDefStmt(stmt) + } } } From e8c0846ed433b37b98f2e13807c4c98c74e30fc4 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Wed, 24 May 2023 22:52:57 +0200 Subject: [PATCH 08/37] expression typing of generic function instantiation working --- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 - .../viper/gobra/ast/frontend/AstPattern.scala | 1 + .../gobra/ast/frontend/PrettyPrinter.scala | 1 - .../scala/viper/gobra/frontend/Desugar.scala | 4 +- .../viper/gobra/frontend/info/base/Type.scala | 60 +++++++++++++---- .../resolution/AmbiguityResolution.scala | 3 +- .../implementation/typing/ExprTyping.scala | 29 ++++---- .../info/implementation/typing/IdTyping.scala | 2 +- .../implementation/typing/MiscTyping.scala | 1 - .../implementation/typing/TypeTyping.scala | 3 - .../viper/gobra/ast/TypeNodeUnitTests.scala | 55 ++++++++++++++++ .../viper/gobra/parsing/ParserUnitTests.scala | 4 +- .../gobra/typing/ExprTypingUnitTests.scala | 66 ++++++++++++++++--- .../gobra/typing/MemberTypingUnitTests.scala | 49 ++++++++------ 14 files changed, 214 insertions(+), 66 deletions(-) create mode 100644 src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c7cd8fde0..959a28487 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -849,8 +849,6 @@ case class PEmbeddedPointer(typ: PUnqualifiedTypeName) extends PEmbeddedType case class PTypeParameter(id: PIdnDef, constraint: PTypeConstraint) extends PNode -case class PTypeArgument(id: PIdnUse) extends PActualType - /** * Ghost */ diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index fe61665e4..c4d4a2b22 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -23,6 +23,7 @@ object AstPattern { case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic 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 diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 8632b5f2a..36e7294b1 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -631,7 +631,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter ) case PMethodReceiveName(t) => showType(t) case PMethodReceivePointer(t) => "*" <> showType(t) - case PTypeArgument(id) => showId(id) // TODO handle this } def showGhostType(typ : PGhostType) : Doc = typ match { diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index f23033977..c7a34bdc8 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2750,7 +2750,7 @@ object Desugar { dArgs <- sequence(args.map { x => option(x.map(exprD(ctx, info)(_))) }) idT = info.typ(base) match { // TODO handle this - case FunctionT(fnArgs, AssertionT, _) => in.PredT(fnArgs.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) + case FunctionT(fnArgs, AssertionT) => in.PredT(fnArgs.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) case _: AbstractType => violation(dArgs.length == dArgs.flatten.length, "non-applied arguments in abstract type") // The result can have arguments, namely the arguments that are provided. @@ -3748,7 +3748,7 @@ object Desugar { 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, _) => // TODO handle this + case Type.FunctionT(args, result) => // TODO handle this val res = result match { case InternalTupleT(r) => r case r: Type => Vector(r) 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 09e178a5c..69fc1a838 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,23 @@ 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, PIdnNode, PImport, PInterfaceType, PNode, PStructType, PTypeConstraint, PTypeDecl} +import viper.gobra.ast.internal.Node +import viper.gobra.ast.internal.utility.Nodes 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.{NoInfo, Position} +import viper.silver.ast.utility.Visitor +import viper.silver.ast.utility.rewriter.Rewritable 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 @@ -91,15 +98,8 @@ object Type { } // TODO check if we need to ad type parameters to function type info - case class FunctionT(args: Vector[Type], result: Type, typeParameters: Vector[TypeParameterT]) - extends PrettyType(s"func(${args.mkString(",")}) $result") { - - def instantiate(typeParameter: TypeParameterT, typ: Type): Unit = { - val newArgs = args.map(arg => if (arg == typeParameter) typ else arg) - - FunctionT(args, result, typeParameters) - } - } + 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(",")})") @@ -125,9 +125,7 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(name: String) extends PrettyType(s"${name}IamATypeParameter") - - case class UnionT(types: Vector[Type]) extends PrettyType(s"${types.mkString(" | ")}") + case class TypeParameterT(id: PIdnDef, constraint: PTypeConstraint) extends PrettyType(s"${id.name}IamATypeParameter") sealed trait GhostType extends Type @@ -213,4 +211,38 @@ 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 { + def substitute(f: PartialFunction[PIdnDef, Type]): this.type = { + this.transform({ + case TypeParameterT(id, _) if f.isDefinedAt(id) => f(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] + } + } } 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 c96e6ea6f..3cacc4965 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 @@ -57,6 +57,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => 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)) @@ -135,7 +136,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => f.typeArgs = typeArgs Some(f) } - case _ => None + case _ => Some(f) } case _ if n.index.length == 1 => { exprOrType(n.index.head) match { 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 f77004100..0e9c58c67 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 @@ -37,6 +37,8 @@ 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 => error(n,s"cannot use generic function $id without instantiation", + !tree.parent(n).head.isInstanceOf[PIndexedExp]) case _ => noMessages } // no more checks to avoid cycles @@ -305,10 +307,13 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case n : PIndexedExp => resolve(n) match { case Some(ap.Function(id, symb)) => - n.index.flatMap(isType(_).out) ++ error(n, "wrong amount of type arguments provided", n.index.length != symb.typeParameters.length) ++ n.index.flatMap(i => { - val idxType = typeSymbType(asType(i).get) - // TODO check here that idxType conforms to the type constraint of the type parameter - noMessages + error(n, s"got ${n.index.length} type arguments but want ${symb.typeParameters.length}", n.index.length != symb.typeParameters.length) ++ n.index.flatMap(i => { + asType(i) match { + case Some(idxType) => + // TODO check here that idxType conforms to the type constraint of the type parameter (with assignableTo or implements?) + noMessages + case None => error(i, s"$i is not a type") + } }) case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { val baseType = exprType(base) @@ -679,14 +684,15 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } case n : PIndexedExp => resolve(n) match { - case Some(ap.Function(id, symb)) => - val typeArguments = symb.typeParameters.map(_.id.name).zip(n.index.map(i => typeSymbType(asType(i).get))).toMap - val argumentTypes = symb.args.map(_.typ).map { - case PTypeArgument(id) => typeArguments(id.name) - case n => typeSymbType(n) - } - FunctionT(argumentTypes, VoidType) + + case Some(f@ap.Function(id, symb)) => + // TODO handle type parameter instantiations that have to be inferred + val typeArgs = f.typeArgs.map(typeSymbType) + val substitution = symb.typeParameters.map(_.id).zip(typeArgs).toMap + + FunctionT(symb.args.map(miscType), miscType(symb.result)).substitute(substitution) + case Some(ap.IndexedExp(base, index)) => val baseType = exprType(base) val idxType = exprType(index) @@ -879,6 +885,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => // PInvoke and thus, `expr` can onlu appear in `n` as an argument lazy val errorMessage = s"violation of assumption: a numeric expression $expr does not occur as an argument of its parent $n" resolve(n) match { + case Some(ap.FunctionCall(_, args)) => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) 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 7548e5ce3..0779578eb 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 @@ -165,7 +165,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, context) => TypeParameterT(id.name) // TODO verify this + case TypeParameter(decl, _, context) => TypeParameterT(decl.id, decl.constraint) // TODO handle this case _ => violation(s"expected type, but got $id") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 609d33286..059966248 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -33,7 +33,6 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => case n: PParameter => isType(n.typ).out case n: PReceiver => isType(n.typ).out case _: PResult => noMessages // children already taken care of - case n : PTypeParameter => noMessages // TODO handle this (I guess children should be already checked automatically) case n: PEmbeddedName => isType(n.typ).out case n: PEmbeddedPointer => isType(n.typ).out 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 def384d33..15f131f3c 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 @@ -73,7 +73,6 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } case t: PExpressionAndType => wellDefExprAndType(t).out - case t: PTypeArgument => noMessages // TODO handle this } lazy val typeSymbType: Typing[PType] = { @@ -144,8 +143,6 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PNamedOperand => idSymType(n.id) - case n: PTypeArgument => idSymType(n.id) // TODO verify this - case n: PDeref => resolve(n) match { case Some(p: ap.PointerType) => PointerT(typeSymbType(p.base)) 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..8b6f630b7 --- /dev/null +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -0,0 +1,55 @@ +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, PSimpleTypeConstraint, PTypeParameter} +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"), PSimpleTypeConstraint(PIntType())) + 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"), PSimpleTypeConstraint(PIntType())) + 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"), PSimpleTypeConstraint(PIntType()))) + 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"), PSimpleTypeConstraint(PIntType())), Type.TypeParameterT(PIdnDef("y"), PSimpleTypeConstraint(PBoolType()))) + 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/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 5a6a6ce5b..7c4772207 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2688,8 +2688,8 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { } test("Parser: should be able to parse function with type parameters") { - frontend.parseFunctionDecl("func foo[T interface{}]() {}") should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), _, _, _, _) => + frontend.parseFunctionDecl("func foo[T interface{}](x T) {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), _, _, _) => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index f836de2ae..e2d342758 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3363,18 +3363,16 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { val functionDecl = PFunctionDecl( PIdnDef("bar"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), - Vector(PNamedParameter(PIdnDef("x"), PTypeArgument(PIdnUse("T")))), - PResult(Vector(PUnnamedParameter(PTypeArgument(PIdnUse("T"))))), + 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](4) + // bar[int] val expr = PIndexedExp(PNamedOperand(PIdnUse("bar")), Vector(PIntType())) frontend.exprType(expr)(Vector(), Vector(functionDecl)) should matchPattern { - // TODO consider if we really want to put the resolved type arguments into the FuntionT or not - // TODO continue with type argument case Type.FunctionT(Vector(Type.IntT(_)), Type.IntT(_)) => } } @@ -3384,19 +3382,71 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { val functionDecl = PFunctionDecl( PIdnDef("bar"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), - Vector(PNamedParameter(PIdnDef("x"), PTypeArgument(PIdnUse("T")))), - PResult(Vector(PUnnamedParameter(PTypeArgument(PIdnUse("T"))))), + 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.VoidType => + 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"), PSimpleTypeConstraint(PInterfaceType(Vector(), 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") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), 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") { + // func bar[T any](x T) T {} + val functionDecl = PFunctionDecl( + PIdnDef("bar"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), 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) + } + /* * Stubs, mocks, and other test setup */ class TestFrontend { diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index efeef2a95..ecaaee9ff 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -21,33 +21,42 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { val frontend = new TestFrontend() test("TypeChecker: should be able to type non-generic function") { - val testValue = frontend.wellDefMember( - PFunctionDecl( - PIdnDef("foo"), - Vector(), - Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("int")))), - PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector()), - Some(PBodyParameterInfo(Vector()), PBlock(Vector())) - ) + 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(testValue.valid) + assert(frontend.wellDefMember(member).valid) } test("TypeChecker: should be able to type generic function") { - val testValue = frontend.wellDefMember( - PFunctionDecl( - PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), - Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), - PResult(Vector()), - PFunctionSpec(Vector(), Vector(), Vector(), Vector()), - None - ) + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), 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"), PSimpleTypeConstraint(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 ) - assert(testValue.valid) + assert(!frontend.wellDefMember(member).valid) } class TestFrontend { From e9c0878136787a9f3189e1406a8494688df39498 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 29 May 2023 15:22:13 +0200 Subject: [PATCH 09/37] implement parse tree translator for instantiated generic types --- .../scala/viper/gobra/ast/frontend/Ast.scala | 13 ++++++++-- .../gobra/ast/frontend/PrettyPrinter.scala | 8 +++++++ .../gobra/frontend/ParseTreeTranslator.scala | 16 ++++--------- .../implementation/typing/TypeTyping.scala | 9 +++++++ .../viper/gobra/parsing/ParserUnitTests.scala | 4 ++-- .../gobra/typing/ExprTypingUnitTests.scala | 24 +++++++++++++++++++ .../gobra/typing/MemberTypingUnitTests.scala | 13 ++++++++++ .../gobra/typing/StmtTypingUnitTests.scala | 2 -- 8 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 959a28487..753584303 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -620,6 +620,11 @@ sealed trait PActualType extends PType sealed trait PLiteralType extends PNode +sealed trait PParameterizedType extends PType { + def typ: PType + def typeArgs: Vector[PType] +} + /** * Represents a named type in Go. * @see [[https://go.dev/ref/spec#TypeName]] @@ -627,8 +632,12 @@ sealed trait PLiteralType extends PNode sealed trait PTypeName extends PActualType with PLiteralType { def id : PUseLikeId val name: String = id.name +} + +case class PParameterizedTypeName(typ: PTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PLiteralType - var typeArgs: Vector[PType] = Vector.empty +case class PParameterizedUnqualifiedTypeName(typ: PUnqualifiedTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PUnqualifiedTypeName { + override def id: PUseLikeId = typ.id } /** @@ -637,7 +646,7 @@ sealed trait PTypeName extends PActualType with PLiteralType { sealed trait PUnqualifiedTypeName extends PTypeName object PUnqualifiedTypeName { - def unapply(arg: PUnqualifiedTypeName): Option[(String, Vector[PType])] = Some((arg.name, arg.typeArgs)) + def unapply(arg: PUnqualifiedTypeName): Option[String] = Some(arg.name) } /** diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 36e7294b1..fa3568ec0 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -169,6 +169,9 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showTypeParameters(typeParameters: Vector[PTypeParameter]): Doc = if (typeParameters.nonEmpty) brackets(ssep(typeParameters map (p => showId(p.id) <+> showTypeConstraint(p.constraint)), comma <> space)) else emptyDoc + 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) <> @@ -584,7 +587,12 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // types + def showParameterizedType(typ: PParameterizedType): Doc = { + showType(typ.typ) <> 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) } diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 183f83fa4..2db9a8aee 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -217,9 +217,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitType_(ctx: Type_Context): PType = { visitChildren(ctx) match { - case Vector(typeName: PTypeName, index: Vector[PType]) => - typeName.typeArgs = index - typeName + case Vector(typeName: PTypeName, index: Vector[PType]) => PParameterizedTypeName(typeName, index) case typeName: PTypeName => typeName case typeLit: PTypeLit => typeLit case pType: PType => pType @@ -340,14 +338,10 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole visitChildren(ctx) match { case name : PUnqualifiedTypeName => PEmbeddedName(name) case Vector(name: PUnqualifiedTypeName, index: Vector[PType]) => - val embeddedName = PEmbeddedName(name) - embeddedName.typ.typeArgs = index - embeddedName + PEmbeddedName(PParameterizedUnqualifiedTypeName(name, index)) case Vector("*", name : PUnqualifiedTypeName) => PEmbeddedPointer(name) case Vector("*", name : PUnqualifiedTypeName, index: Vector[PType]) => - val embeddedPointer = PEmbeddedPointer(name) - embeddedPointer.typ.typeArgs = index - embeddedPointer + 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") } } @@ -1164,9 +1158,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitLiteralType(ctx: LiteralTypeContext): PLiteralType = { visitChildren(ctx) match { - case Vector(typeName: PTypeName, index: Vector[PType]) => - typeName.typeArgs = index - typeName + case Vector(typeName: PTypeName, index: Vector[PType]) => PParameterizedTypeName(typeName, index) case x : PLiteralType => x } } 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 15f131f3c..3dbbba411 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 @@ -83,11 +83,20 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case _ => t } createTyping { + case typ: PParameterizedType => handleTypeAlias(parameterizedTypeSymbType(typ)) case typ: PActualType => handleTypeAlias(actualTypeSymbType(typ)) case typ: PGhostType => handleTypeAlias(ghostTypeSymbType(typ)) } } + private[typing] def parameterizedTypeSymbType(typ: PParameterizedType): Type = { + + val baseType = typeSymbType(typ.typ) + val typArgTypes = typ.typeArgs map typeSymbType + val substitution = typ..map(_.id).zip(typeArgs).toMap + baseType.substitute() + } + private[typing] def actualTypeSymbType(typ: PActualType): Type = typ match { case PBoolType() => BooleanT diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 7c4772207..f92d15c83 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2348,7 +2348,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should parse type equality") { frontend.parseExpOrFail("typeOf(a) == type[int]") should matchPattern { - case PEquals(PTypeOf(_), PTypeExpr(PUnqualifiedTypeName("int", Vector()))) => + case PEquals(PTypeOf(_), PTypeExpr(PUnqualifiedTypeName("int"))) => } } @@ -2713,7 +2713,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse struct instantiation with type arguments") { frontend.parseExpOrFail("Bar[int]{3}") should matchPattern { - case PCompositeLit(PUnqualifiedTypeName("Bar", Vector(PNamedOperand(PIdnUse("int")))), PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(n, Decimal)) + case PCompositeLit(PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PNamedOperand(PIdnUse("int")))), PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(n, Decimal)) )))) if n == BigInt(3) => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index e2d342758..56a4a4a15 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -15,6 +15,7 @@ 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 import viper.gobra.util.TypeBounds.{DefaultInt, UnboundedInteger} class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { @@ -3447,6 +3448,29 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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( + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar"), + Vector( + PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), + PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) + ) + ) + + // Bar[int, bool]{3} + + val expr = PCompositeLit( + PParameterizedTypeName(PNamedOperand(PIdnUse("Bar")), Vector(PIntType(), PBoolType())), + PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(3, Decimal))))) + ) + + frontend.exprType(expr)(Vector(), Vector(typeDecl)) should matchPattern { + case _ => + } + } + /* * Stubs, mocks, and other test setup */ class TestFrontend { diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index ecaaee9ff..a8fda34d3 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -59,6 +59,19 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(!frontend.wellDefMember(member).valid) } + test("TypeChecker: should accept generic type definition") { + val member = PTypeDef( + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar"), + Vector( + PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), + PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) + ) + ) + + assert(frontend.wellDefMember(member).valid) + } + class TestFrontend { def singleMemberProgram(member: PMember): PProgram = PProgram( diff --git a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala index a213bad83..a1e8ca956 100644 --- a/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/StmtTypingUnitTests.scala @@ -46,8 +46,6 @@ class StmtTypingUnitTests extends AnyFunSuite with Matchers with Inside { ))().valid) } - test("TypeChecker: valid") - class TestFrontend { /** From 6b10b398db32bf1c39b411c69322739cdedc7f43 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Tue, 30 May 2023 13:44:36 +0200 Subject: [PATCH 10/37] implement typing of generic types --- .../scala/viper/gobra/ast/frontend/Ast.scala | 12 +++--- .../gobra/ast/frontend/PrettyPrinter.scala | 2 +- .../gobra/frontend/ParseTreeTranslator.scala | 4 +- .../viper/gobra/frontend/info/base/Type.scala | 2 +- .../info/implementation/typing/IdTyping.scala | 2 +- .../implementation/typing/TypeTyping.scala | 22 +++++++--- .../gobra/typing/ExprTypingUnitTests.scala | 40 +++++++++++++++---- .../gobra/typing/MemberTypingUnitTests.scala | 20 +++++++--- 8 files changed, 74 insertions(+), 30 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 753584303..59b9e5aad 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -191,7 +191,7 @@ sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostif def right: PType } -case class PTypeDef(right: PType, left: PIdnDef, typeParameters: Vector[PTypeParameter]) extends PTypeDecl +case class PTypeDef(typeParameters: Vector[PTypeParameter], right: PType, left: PIdnDef) extends PTypeDecl with PScope case class PTypeAlias(right: PType, left: PIdnDef) extends PTypeDecl @@ -620,8 +620,8 @@ sealed trait PActualType extends PType sealed trait PLiteralType extends PNode -sealed trait PParameterizedType extends PType { - def typ: PType +sealed trait PParameterizedType extends PActualType { + def typeName: PTypeName def typeArgs: Vector[PType] } @@ -634,10 +634,10 @@ sealed trait PTypeName extends PActualType with PLiteralType { val name: String = id.name } -case class PParameterizedTypeName(typ: PTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PLiteralType +case class PParameterizedTypeName(typeName: PTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PLiteralType -case class PParameterizedUnqualifiedTypeName(typ: PUnqualifiedTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PUnqualifiedTypeName { - override def id: PUseLikeId = typ.id +case class PParameterizedUnqualifiedTypeName(typeName: PUnqualifiedTypeName, typeArgs: Vector[PType]) extends PParameterizedType with PUnqualifiedTypeName { + override def id: PUseLikeId = typeName.id } /** diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index fa3568ec0..a6f65954d 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -588,7 +588,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter // types def showParameterizedType(typ: PParameterizedType): Doc = { - showType(typ.typ) <> showTypeArguments(typ.typeArgs) + showType(typ.typeName) <> showTypeArguments(typ.typeArgs) } def showType(typ: PType): Doc = typ match { diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 2db9a8aee..28430f89b 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -773,8 +773,8 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitTypeDef(ctx: TypeDefContext): PTypeDecl = { visitChildren(ctx) match { - case Vector(goIdnDef(id), typeParameters: Vector[PTypeParameter], pType: PType) => PTypeDef(pType, id, typeParameters).at(ctx) - case Vector(goIdnDef(id), pType: PType) => PTypeDef(pType, id, Vector.empty).at(ctx) + 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) } } 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 69fc1a838..f9c2a4262 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -125,7 +125,7 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(id: PIdnDef, constraint: PTypeConstraint) extends PrettyType(s"${id.name}IamATypeParameter") + case class TypeParameterT(id: PIdnDef, constraint: PTypeConstraint) extends PrettyType(s"${id.name}") sealed trait GhostType extends Type 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 0779578eb..d1cc82e8e 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 @@ -165,7 +165,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, context) => TypeParameterT(decl.id, decl.constraint) // TODO handle this + case TypeParameter(decl, _, _) => TypeParameterT(decl.id, decl.constraint) // TODO handle this case _ => violation(s"expected type, but got $id") } 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 3dbbba411..12bfa2ea3 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 @@ -29,10 +30,20 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } implicit lazy val wellDefType: WellDefinedness[PType] = createWellDef { + case typ: PParameterizedType => wellDefParameterizedType(typ) case typ: PActualType => wellDefActualType(typ) case typ: PGhostType => wellDefGhostType(typ) } + private[typing] def wellDefParameterizedType(typ: PParameterizedType): Messages = entity(typ.typeName.id) match { + case NamedType(decl, _, _) => + error(typ, s"got ${typ.typeArgs.length} type arguments but want ${decl.typeParameters.length}", typ.typeArgs.length != decl.typeParameters.length) ++ typ.typeArgs.flatMap(arg => { + val argType = typeSymbType(arg) + // TODO check that arg conforms to declaration (assignableTo or implements?) + noMessages + }) + } + private[typing] def wellDefActualType(typ: PActualType): Messages = typ match { case _: PBoolType | _: PIntegerType | _: PFloatType | _: PStringType | _: PPermissionType => noMessages @@ -89,12 +100,11 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } } - private[typing] def parameterizedTypeSymbType(typ: PParameterizedType): Type = { - - val baseType = typeSymbType(typ.typ) - val typArgTypes = typ.typeArgs map typeSymbType - val substitution = typ..map(_.id).zip(typeArgs).toMap - baseType.substitute() + private[typing] def parameterizedTypeSymbType(typ: PParameterizedType): Type = 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[typing] def actualTypeSymbType(typ: PActualType): Type = typ match { diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 56a4a4a15..5e3513bfe 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -15,9 +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 +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() @@ -3414,7 +3416,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert (!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) } - test("TypeChecker: should not accept expression type arguments") { + test("TypeChecker: should not accept expression type arguments for generic functions") { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), @@ -3431,7 +3433,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(!frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) } - test("TypeChecker: should not accept incorrect amount of type arguments") { + 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"), @@ -3451,12 +3453,12 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should be able to type instantiation of generic struct type") { // type Bar[T any, V any] struct { x T } val typeDecl = PTypeDef( - PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), - PIdnDef("Bar"), Vector( PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) - ) + ), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar") ) // Bar[int, bool]{3} @@ -3466,11 +3468,33 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { PLiteralValue(Vector(PKeyedElement(None, PExpCompositeVal(PIntLit(3, Decimal))))) ) - frontend.exprType(expr)(Vector(), Vector(typeDecl)) should matchPattern { - case _ => + 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"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), + PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), 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) + } + /* * Stubs, mocks, and other test setup */ class TestFrontend { diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index a8fda34d3..0171e2654 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -36,7 +36,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should be able to type generic function") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PNamedOperand(PIdnUse("any"))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -49,7 +49,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should not accept generic function that uses type parameters that are not defined") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PNamedOperand(PIdnUse("any"))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -59,14 +59,24 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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( - PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), - PIdnDef("Bar"), Vector( PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) - ) + ), + PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), + PIdnDef("Bar") ) assert(frontend.wellDefMember(member).valid) From 7971b35ad48bc658f831317676b5e6f90c90ba69 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Wed, 31 May 2023 09:42:09 +0200 Subject: [PATCH 11/37] add first prototype of assignability --- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 + .../gobra/ast/frontend/PrettyPrinter.scala | 8 +- .../viper/gobra/frontend/info/base/Type.scala | 10 +- .../property/Assignability.scala | 22 +++- .../property/UnderlyingType.scala | 9 +- .../resolution/MemberResolution.scala | 2 +- .../implementation/typing/ExprTyping.scala | 1 + .../info/implementation/typing/IdTyping.scala | 8 +- .../viper/gobra/ast/TypeNodeUnitTests.scala | 8 +- .../viper/gobra/parsing/ParserUnitTests.scala | 2 +- .../gobra/typing/MemberTypingUnitTests.scala | 117 ++++++++++++++++++ 11 files changed, 174 insertions(+), 15 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 59b9e5aad..22cca0baf 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -201,6 +201,8 @@ case class PSimpleTypeConstraint(t: PType) extends PTypeConstraint case class PUnionTypeConstraint(ts: Vector[PType]) extends PTypeConstraint +case class PComparableTypeConstraint() extends PTypeConstraint + /** * Statements diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index a6f65954d..9e8a80ce1 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -49,6 +49,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 n: PTypeConstraint => showTypeConstraint(n) case PPos(_) => emptyDoc } @@ -167,7 +168,10 @@ 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 (p => showId(p.id) <+> showTypeConstraint(p.constraint)), comma <> space)) else emptyDoc + if (typeParameters.nonEmpty) brackets(ssep(typeParameters map showTypeParameter, comma <> space)) else emptyDoc + + def showTypeParameter(typeParameter: PTypeParameter): Doc = + showId(typeParameter.id) <+> showTypeConstraint(typeParameter.constraint) def showTypeArguments(typeArgs: Vector[PType]): Doc = if (typeArgs.nonEmpty) brackets(ssep(typeArgs map showType, comma <> space)) else emptyDoc @@ -194,7 +198,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter } def showTypeDecl(decl: PTypeDecl): Doc = decl match { - case PTypeDef(right, left, typeParameters) => "type" <+> showId(left) <> showTypeParameters(typeParameters) <+> showType(right) + case PTypeDef(typeParameters, right, left) => "type" <+> showId(left) <> showTypeParameters(typeParameters) <+> showType(right) case PTypeAlias(right, left) => "type" <+> showId(left) <+> "=" <+> showType(right) } 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 f9c2a4262..a4dcc1ea8 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -125,7 +125,15 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(id: PIdnDef, constraint: PTypeConstraint) extends PrettyType(s"${id.name}") + case class TypeParameterT(id: PIdnDef, constraint: TypeConstraint) extends PrettyType(s"${id.name}") + + sealed trait TypeConstraint + + case class SimpleTypeConstraint(t: Type) extends TypeConstraint + + case class UnionTypeConstraint(ts: Vector[Type]) extends TypeConstraint + + case class ComparableTypeConstraint() extends TypeConstraint sealed trait GhostType extends Type 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 4c0bd33fb..12e990244 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 @@ -82,14 +82,30 @@ 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 underlyingType(r).isInstanceOf[InterfaceT] && !isTypeParameter(underlyingType(r)) => 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 (NilType, r) if isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { + case SimpleTypeConstraint(t) => assignableTo.result(NilType, t) + case UnionTypeConstraint(ts) => propForall(ts map (t => (NilType, t)), assignableTo) + case ComparableTypeConstraint() => errorProp() + } + case (l, r) if isDefinedType(l) && isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { + case SimpleTypeConstraint(t) => assignableTo.result(l, t) + case UnionTypeConstraint(ts) => propForall(ts map (t => (l, t)), assignableTo) + case ComparableTypeConstraint() => errorProp() + } + case (l, r) if isTypeParameter(l) && isDefinedType(r) => l.asInstanceOf[TypeParameterT].constraint match { + case SimpleTypeConstraint(t) => assignableTo.result(t, r) + case UnionTypeConstraint(ts) => propForall(ts map (t => (t, r)), assignableTo) + case ComparableTypeConstraint() => errorProp() + } // for ghost types case (BooleanT, AssertionT) => successProp 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..554966a26 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 @@ -6,10 +6,10 @@ 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.ast.frontend.{PDeref, PDot, PEmbeddedName, PEmbeddedPointer, PEmbeddedType, PInterfaceType, PNamedOperand, PStructType, PType, PTypeAlias, PTypeDecl, PTypeDef} 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 @@ -215,4 +215,9 @@ trait UnderlyingType { this: TypeInfoImpl => 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/MemberResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/MemberResolution.scala index 7548a5a18..06e5ee27d 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 @@ -181,7 +181,7 @@ trait MemberResolution { this: TypeInfoImpl => topLevel +: es.map(e => interfaceMethodSet( entity(e.typ.id) match { // TODO: might break for imported interfaces - case NamedType(PTypeDef(t: PInterfaceType, _, _), _, _) => InterfaceT(t, ctxt) // TODO handle this + case NamedType(PTypeDef(_, t: PInterfaceType, _), _, _) => InterfaceT(t, ctxt) // TODO handle this case _ => ??? } ).promoteItf(e.typ.name)) 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 0e9c58c67..0733e4764 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 @@ -635,6 +635,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 // TODO verify this with Felix case Some(t) => error(exp, s"$exp is not assignable to type $t") case None => noMessages // no type inferred from context } 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 d1cc82e8e..0aeb7f007 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 @@ -165,7 +165,13 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, _) => TypeParameterT(decl.id, decl.constraint) // TODO handle this + case TypeParameter(decl, _, _) => + val constraintT = decl.constraint match { + case PSimpleTypeConstraint(t) => SimpleTypeConstraint(symbType(t)) + case PUnionTypeConstraint(ts) => UnionTypeConstraint(ts map symbType) + case PComparableTypeConstraint() => ComparableTypeConstraint() + } + TypeParameterT(decl.id, constraintT) case _ => violation(s"expected type, but got $id") } diff --git a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala index 8b6f630b7..594ddb53f 100644 --- a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -9,7 +9,7 @@ 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"), PSimpleTypeConstraint(PIntType())) + val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("z") => Type.StringT case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) @@ -22,7 +22,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should not substitute anything if type argument is not provided") { - val typeNode = Type.TypeParameterT(PIdnDef("x"), PSimpleTypeConstraint(PIntType())) + val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("y") => Type.IntT(TypeBounds.DefaultInt) } @@ -31,7 +31,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (single)") { - val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), PSimpleTypeConstraint(PIntType()))) + val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt)))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) } @@ -42,7 +42,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (multiple)") { - val typeNode = Type.MathMapT(Type.TypeParameterT(PIdnDef("x"), PSimpleTypeConstraint(PIntType())), Type.TypeParameterT(PIdnDef("y"), PSimpleTypeConstraint(PBoolType()))) + val typeNode = Type.MathMapT(Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))), Type.TypeParameterT(PIdnDef("y"), Type.SimpleTypeConstraint(Type.BooleanT))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) case PIdnDef("y") => Type.BooleanT diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index f92d15c83..685c70367 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2695,7 +2695,7 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { test("Parser: should be able to parse type definition with type parameters") { frontend.parseStmtOrFail("type Bar[T interface{}] struct {}") should matchPattern { - case PSeq(Vector(PTypeDef(PStructType(_), PIdnDef("Bar"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_)))))) => + case PSeq(Vector(PTypeDef(Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), PStructType(_), PIdnDef("Bar")))) => } } diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index 0171e2654..801d168c2 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -16,6 +16,7 @@ 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() @@ -82,6 +83,122 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(frontend.wellDefMember(member).valid) } + test("TypeChecker: foo1") { + // func foo[T int]() { + // var _ T = 3 // valid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PIntType()))), + 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: foo2") { + // func foo[T int]() { + // var _ T = false // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PIntType()))), + 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: foo3") { + // func foo[T int | bool]() { + // var _ T = 3 // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), + 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: foo41") { + // func foo[T int](x T) { + // var _ int = x // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(PInterfaceName(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: foo42") { + // func foo[T interface{ m(); n() }](x T) { + // var _ interface{ m() } = x // valid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(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: foo5") { + // func foo5[T int | bool](x T) { + // var _ int = x // invalid + // } + val member = PFunctionDecl( + PIdnDef("foo"), + Vector(PTypeParameter(PIdnDef("T"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), + 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) + } + class TestFrontend { def singleMemberProgram(member: PMember): PProgram = PProgram( From 11598966c84f0bbf1f4db57086e3af1fced13523 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 5 Jun 2023 22:09:02 +0200 Subject: [PATCH 12/37] implement assignability with type parameters --- src/main/scala/viper/gobra/ast/frontend/Ast.scala | 4 ++-- .../frontend/info/implementation/property/Assignability.scala | 4 ++-- .../frontend/info/implementation/property/Implements.scala | 4 ++++ .../info/implementation/property/UnderlyingType.scala | 1 + .../info/implementation/resolution/MemberResolution.scala | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index 22cca0baf..bf35d943c 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -199,7 +199,7 @@ sealed trait PTypeConstraint extends PNode case class PSimpleTypeConstraint(t: PType) extends PTypeConstraint -case class PUnionTypeConstraint(ts: Vector[PType]) extends PTypeConstraint +case class PUnionTypeConstraint(ts: Vector[PType]) extends PTypeConstraint // TODO remove this case class PComparableTypeConstraint() extends PTypeConstraint @@ -758,7 +758,7 @@ 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[PInterfaceName], // TODO replace this with all sorts of types methSpecs: Vector[PMethodSig], predSpecs: Vector[PMPredicateSig] ) extends PTypeLit with PUnorderedScope 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 12e990244..72fc8a3dd 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 @@ -96,12 +96,12 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case UnionTypeConstraint(ts) => propForall(ts map (t => (NilType, t)), assignableTo) case ComparableTypeConstraint() => errorProp() } - case (l, r) if isDefinedType(l) && isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { + case (l, r) if !isDefinedType(l) && isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { case SimpleTypeConstraint(t) => assignableTo.result(l, t) case UnionTypeConstraint(ts) => propForall(ts map (t => (l, t)), assignableTo) case ComparableTypeConstraint() => errorProp() } - case (l, r) if isTypeParameter(l) && isDefinedType(r) => l.asInstanceOf[TypeParameterT].constraint match { + case (l, r) if isTypeParameter(l) && !isDefinedType(r) => l.asInstanceOf[TypeParameterT].constraint match { case SimpleTypeConstraint(t) => assignableTo.result(t, r) case UnionTypeConstraint(ts) => propForall(ts map (t => (t, r)), assignableTo) case ComparableTypeConstraint() => errorProp() 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 98a6e0dcf..38b3fac9d 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 @@ -54,6 +54,10 @@ trait Implements { this: TypeInfoImpl => def syntaxImplements(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { case (NilType, _: Type.InterfaceT) => successProp + case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => constraint match { + case Type.SimpleTypeConstraint(t) => syntaxImplements(t, r) + case _ => failedProp("Not implemented yet") // TODO handle other constraints + } case (_, _: Type.InterfaceT) => supportedSortForInterfaces(l) and { val itfMemberSet = memberSet(r) 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 554966a26..c432a65ce 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 @@ -44,6 +44,7 @@ trait UnderlyingType { this: TypeInfoImpl => case value : PType => Some(value, this) case _ => None } + // TODO handle type parameters case _ => None // type not defined } case PDot(_, id) => entity(id) match { 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 06e5ee27d..5961a2bae 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 @@ -182,7 +182,7 @@ trait MemberResolution { this: TypeInfoImpl => entity(e.typ.id) match { // TODO: might break for imported interfaces case NamedType(PTypeDef(_, t: PInterfaceType, _), _, _) => InterfaceT(t, ctxt) // TODO handle this - case _ => ??? + case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) } ).promoteItf(e.typ.name)) } From ca0c310b5ebb892a2d6cb2a00ecb96bee3502c1e Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 8 Jun 2023 13:48:05 +0200 Subject: [PATCH 13/37] changed type constraint to be an interface --- .../scala/viper/gobra/ast/frontend/Ast.scala | 21 ++++++-------- .../gobra/ast/frontend/PrettyPrinter.scala | 15 ++++++---- .../gobra/frontend/ParseTreeTranslator.scala | 29 +++++-------------- .../viper/gobra/frontend/info/base/Type.scala | 17 ++--------- .../property/Assignability.scala | 25 ++-------------- .../implementation/property/Implements.scala | 26 ++++++++--------- .../property/TypeIdentity.scala | 2 -- .../resolution/MemberResolution.scala | 16 +++++----- .../info/implementation/typing/IdTyping.scala | 9 ++---- .../implementation/typing/TypeTyping.scala | 4 +-- .../typing/ghost/separation/GhostTyping.scala | 2 +- .../viper/gobra/ast/TypeNodeUnitTests.scala | 13 +++++---- .../viper/gobra/parsing/ParserUnitTests.scala | 10 +++---- .../gobra/typing/ExprTypingUnitTests.scala | 18 ++++++------ .../gobra/typing/MemberTypingUnitTests.scala | 22 +++++++------- 15 files changed, 91 insertions(+), 138 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index bf35d943c..34e7b1372 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -195,14 +195,6 @@ case class PTypeDef(typeParameters: Vector[PTypeParameter], right: PType, left: case class PTypeAlias(right: PType, left: PIdnDef) extends PTypeDecl -sealed trait PTypeConstraint extends PNode - -case class PSimpleTypeConstraint(t: PType) extends PTypeConstraint - -case class PUnionTypeConstraint(ts: Vector[PType]) extends PTypeConstraint // TODO remove this - -case class PComparableTypeConstraint() extends PTypeConstraint - /** * Statements @@ -616,7 +608,7 @@ 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 @@ -688,6 +680,7 @@ sealed trait PFloatType extends PType case class PFloat32() extends PPredeclaredType("float32") with PFloatType case class PFloat64() extends PPredeclaredType("float64") with PFloatType +case class PComparable() extends PPredeclaredType("comparable") // TODO: add more types // TODO: ellipsis type @@ -758,14 +751,18 @@ case class PFunctionType(args: Vector[PParameter], result: PResult) extends PTyp case class PPredType(args: Vector[PType]) extends PTypeLit case class PInterfaceType( - embedded: Vector[PInterfaceName], // TODO replace this with all sorts of types + 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 + +case class PUnderlyingType(typ: PType) extends PTypeTerm // TODO implement this // 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. @@ -858,7 +855,7 @@ case class PEmbeddedName(typ: PUnqualifiedTypeName) extends PEmbeddedType case class PEmbeddedPointer(typ: PUnqualifiedTypeName) extends PEmbeddedType -case class PTypeParameter(id: PIdnDef, constraint: PTypeConstraint) extends PNode +case class PTypeParameter(id: PIdnDef, constraint: PTypeElement) extends PNode /** * Ghost diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index 9e8a80ce1..c375e7fc2 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -50,7 +50,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter case n: PBodyParameterInfo => showBodyParameterInfo(n) case n: PTerminationMeasure => showTerminationMeasure(n) case n: PTypeParameter => showTypeParameter(n) - case n: PTypeConstraint => showTypeConstraint(n) case PPos(_) => emptyDoc } @@ -171,7 +170,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter if (typeParameters.nonEmpty) brackets(ssep(typeParameters map showTypeParameter, comma <> space)) else emptyDoc def showTypeParameter(typeParameter: PTypeParameter): Doc = - showId(typeParameter.id) <+> showTypeConstraint(typeParameter.constraint) + showId(typeParameter.id) <+> showTypeElement(typeParameter.constraint) def showTypeArguments(typeArgs: Vector[PType]): Doc = if (typeArgs.nonEmpty) brackets(ssep(typeArgs map showType, comma <> space)) else emptyDoc @@ -679,16 +678,20 @@ 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 showTypeConstraint(n: PTypeConstraint): Doc = n match { - case PSimpleTypeConstraint(t) => showType(t) - case PUnionTypeConstraint(ts) => ssep(ts map showType, space <> verticalbar <> space) + 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) + case PUnderlyingType(t: PType) => tilde <> showType(t) } // ids diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 28430f89b..d35aba7d0 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -428,12 +428,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitInterfaceType(ctx: GobraParser.InterfaceTypeContext): PInterfaceType = { val methodDecls = visitNodeIf[PMethodSig, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.methodSpec())) - val embedded = visitListNodeIf[PType, InterfaceElemContext](ctx.interfaceElem(), ctx => has(ctx.typeElem()), _.typeElem().typeTerm()).map { - case Vector(tn: PUnqualifiedTypeName) => PInterfaceName(tn).at(ctx) - case Vector(_: PDot) => fail(ctx, "Imported types are not yet supported as embedded fields.") - case x if x.length > 1 => fail(ctx, "Union types are not yet supported as embedded types") - case _ => fail(ctx, s"Interface embeds predeclared type.") - } + 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) } @@ -444,8 +439,11 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole *

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

*/ - override def visitTypeElem(ctx: TypeElemContext): Vector[PType] = { - visitListNode[PType](ctx.typeTerm()) + 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) } /** @@ -807,24 +805,11 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ override def visitTypeParamDecl(ctx: TypeParamDeclContext): Vector[PTypeParameter] = { visitChildren(ctx) match { - case Vector(idnDefList(identifierList), typeConstraint: PTypeConstraint) => + case Vector(idnDefList(identifierList), typeConstraint: PTypeElement) => identifierList.map(id => PTypeParameter(id, typeConstraint).at(id)) } } - /** - * {@inheritDoc } - * - *

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

- */ - override def visitTypeConstraint(ctx: TypeConstraintContext): PTypeConstraint = { - visitNode[Vector[PType]](ctx.typeElem()) match { - case Vector(pType: PType) => PSimpleTypeConstraint(pType).at(ctx) - case pTypes => PUnionTypeConstraint(pTypes).at(ctx) - } - } - /** * {@inheritDoc } * 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 a4dcc1ea8..da7978ae2 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,13 @@ 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, PIdnDef, PIdnNode, PImport, PInterfaceType, PNode, PStructType, PTypeConstraint, PTypeDecl} +import viper.gobra.ast.frontend.{PAdtClause, PAdtType, PDomainType, PIdnDef, PImport, PInterfaceType, PNode, PStructType, PTypeDecl, PTypeElement} import viper.gobra.ast.internal.Node -import viper.gobra.ast.internal.utility.Nodes 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.{NoInfo, Position} -import viper.silver.ast.utility.Visitor -import viper.silver.ast.utility.rewriter.Rewritable +import viper.silver.ast.Position import scala.annotation.tailrec import scala.collection.immutable.ListMap @@ -125,15 +122,7 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(id: PIdnDef, constraint: TypeConstraint) extends PrettyType(s"${id.name}") - - sealed trait TypeConstraint - - case class SimpleTypeConstraint(t: Type) extends TypeConstraint - - case class UnionTypeConstraint(ts: Vector[Type]) extends TypeConstraint - - case class ComparableTypeConstraint() extends TypeConstraint + case class TypeParameterT(id: PIdnDef, constraint: InterfaceT) extends PrettyType(s"${id.name}") sealed trait GhostType extends Type 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 72fc8a3dd..ab294e584 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 @@ -63,13 +63,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" } { @@ -91,21 +84,9 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => 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 (NilType, r) if isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { - case SimpleTypeConstraint(t) => assignableTo.result(NilType, t) - case UnionTypeConstraint(ts) => propForall(ts map (t => (NilType, t)), assignableTo) - case ComparableTypeConstraint() => errorProp() - } - case (l, r) if !isDefinedType(l) && isTypeParameter(r) => r.asInstanceOf[TypeParameterT].constraint match { - case SimpleTypeConstraint(t) => assignableTo.result(l, t) - case UnionTypeConstraint(ts) => propForall(ts map (t => (l, t)), assignableTo) - case ComparableTypeConstraint() => errorProp() - } - case (l, r) if isTypeParameter(l) && !isDefinedType(r) => l.asInstanceOf[TypeParameterT].constraint match { - case SimpleTypeConstraint(t) => assignableTo.result(t, r) - case UnionTypeConstraint(ts) => propForall(ts map (t => (t, r)), assignableTo) - case ComparableTypeConstraint() => errorProp() - } + case (NilType, TypeParameterT(_, constraint)) => assignableTo.result(NilType, constraint) + case (l, TypeParameterT(_, constraint)) if !isDefinedType(l) => assignableTo.result(l, constraint) + case (TypeParameterT(_, constraint), r) if !isDefinedType(r) => assignableTo.result(constraint, r) // for ghost types case (BooleanT, AssertionT) => successProp 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 38b3fac9d..9deb53e77 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} @@ -38,14 +38,17 @@ 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))) => // TODO handle this - context.symbType(int) match { - case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) - case _ => - } - 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 _ => failedProp("Not implemented yet") // TODO implement other cases + } } override def interfaceImplementations: Map[Type.InterfaceT, Set[Type]] = { @@ -54,10 +57,7 @@ trait Implements { this: TypeInfoImpl => def syntaxImplements(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { case (NilType, _: Type.InterfaceT) => successProp - case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => constraint match { - case Type.SimpleTypeConstraint(t) => syntaxImplements(t, r) - case _ => failedProp("Not implemented yet") // TODO handle other constraints - } + case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => syntaxImplements(constraint, r) case (_, _: Type.InterfaceT) => supportedSortForInterfaces(l) and { val itfMemberSet = memberSet(r) 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..029d82801 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,8 +70,6 @@ trait TypeIdentity extends BaseProperty { this: TypeInfoImpl => case (VoidType, VoidType) => true - - case _ => false } 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 5961a2bae..efea6baca 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 @@ -20,6 +20,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 @@ -178,13 +179,14 @@ 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) // TODO handle this - case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) - } - ).promoteItf(e.typ.name)) + topLevel +: es.map(_.terms).map { + case Vector(t: PTypeName) => interfaceMethodSet( + symbType(t) match { + case i: InterfaceT => i + case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) // TODO handle this properly (non interface types) + }).promoteItf(t.name) + case _ => AdvancedMemberSet.empty[TypeMember] // TODO handle this properly (union types, underlying types) + } } } 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 0aeb7f007..a5011c395 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 @@ -165,13 +165,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, _) => - val constraintT = decl.constraint match { - case PSimpleTypeConstraint(t) => SimpleTypeConstraint(symbType(t)) - case PUnionTypeConstraint(ts) => UnionTypeConstraint(ts map symbType) - case PComparableTypeConstraint() => ComparableTypeConstraint() - } - TypeParameterT(decl.id, constraintT) + case TypeParameter(decl, _, ctx) => + TypeParameterT(decl.id, InterfaceT(PInterfaceType(Vector(decl.constraint), Vector(), Vector()), ctx)) case _ => violation(s"expected type, but got $id") } 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 12bfa2ea3..b08ba4e4c 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 @@ -249,7 +249,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 => @@ -270,7 +270,7 @@ 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 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/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala index 594ddb53f..e94bf6a0c 100644 --- a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -3,13 +3,13 @@ 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, PSimpleTypeConstraint, PTypeParameter} +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"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))) + val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(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) @@ -22,7 +22,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should not substitute anything if type argument is not provided") { - val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))) + val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("y") => Type.IntT(TypeBounds.DefaultInt) } @@ -31,7 +31,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (single)") { - val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt)))) + val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) } @@ -42,7 +42,10 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (multiple)") { - val typeNode = Type.MathMapT(Type.TypeParameterT(PIdnDef("x"), Type.SimpleTypeConstraint(Type.IntT(TypeBounds.DefaultInt))), Type.TypeParameterT(PIdnDef("y"), Type.SimpleTypeConstraint(Type.BooleanT))) + val typeNode = Type.MathMapT( + Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)), + Type.TypeParameterT(PIdnDef("y"), Type.InterfaceT(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 diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 685c70367..219496fee 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2688,20 +2688,20 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { } test("Parser: should be able to parse function with type parameters") { - frontend.parseFunctionDecl("func foo[T interface{}](x T) {}") should matchPattern { - case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), _, _, _) => + frontend.parseFunctionDecl("func foo[T any](x T) {}") should matchPattern { + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), _, _, _) => } } test("Parser: should be able to parse type definition with type parameters") { - frontend.parseStmtOrFail("type Bar[T interface{}] struct {}") should matchPattern { - case PSeq(Vector(PTypeDef(Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(_))), PStructType(_), PIdnDef("Bar")))) => + frontend.parseStmtOrFail("type Bar[T any] struct {}") should matchPattern { + case PSeq(Vector(PTypeDef(Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), 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"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), _, _, _, _) => + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType(), PBoolType())))), _, _, _, _) => } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 5e3513bfe..cb025be27 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3365,7 +3365,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -3384,7 +3384,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -3403,7 +3403,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -3420,7 +3420,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -3437,7 +3437,7 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector(PUnnamedParameter(PNamedOperand(PIdnUse("T"))))), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -3454,8 +3454,8 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // type Bar[T any, V any] struct { x T } val typeDecl = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), - PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) + PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) ), PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), PIdnDef("Bar") @@ -3478,8 +3478,8 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // type Bar[T any, V any] struct { x T } val typeDecl = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), - PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) + PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) ), PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), PIdnDef("Bar") diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index 801d168c2..c87c64b08 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -37,7 +37,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should be able to type generic function") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PNamedOperand(PIdnUse("any"))))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -50,7 +50,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should not accept generic function that uses type parameters that are not defined") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PNamedOperand(PIdnUse("any"))))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T"))), PNamedParameter(PIdnDef("y"), PNamedOperand(PIdnUse("V")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -73,8 +73,8 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should accept generic type definition") { val member = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))), - PTypeParameter(PIdnDef("V"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector(), Vector()))) + PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), + PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) ), PStructType(Vector(PFieldDecls(Vector(PFieldDecl(PIdnDef("x"), PNamedOperand(PIdnUse("T"))))))), PIdnDef("Bar") @@ -89,7 +89,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PIntType()))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -107,7 +107,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PIntType()))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -125,7 +125,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType(), PBoolType())))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -143,7 +143,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(PInterfaceName(PIntType())), Vector(), Vector())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -161,10 +161,10 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PSimpleTypeConstraint(PInterfaceType(Vector(), Vector( + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(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()))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -187,7 +187,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PUnionTypeConstraint(Vector(PIntType(), PBoolType())))), + Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType(), PBoolType())))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), From c0b00aade1708c5efbcde4a389e08ff419b5dfe5 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 12 Jun 2023 11:49:16 +0200 Subject: [PATCH 14/37] handle expression typing of integer constants properly --- .../property/Assignability.scala | 19 +++++-- .../implementation/property/Implements.scala | 2 +- .../implementation/resolution/TypeSet.scala | 52 +++++++++++++++++++ .../implementation/typing/ExprTyping.scala | 5 +- .../gobra/typing/ExprTypingUnitTests.scala | 28 ++++++++++ 5 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala 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 ab294e584..76ac136c5 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 @@ -84,9 +85,10 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => 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 (NilType, TypeParameterT(_, constraint)) => assignableTo.result(NilType, constraint) - case (l, TypeParameterT(_, constraint)) if !isDefinedType(l) => assignableTo.result(l, constraint) - case (TypeParameterT(_, constraint), r) if !isDefinedType(r) => assignableTo.result(constraint, r) + case (UNTYPED_INT_CONST, TypeParameterT(_, constraint)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint)) + case (NilType, TypeParameterT(_, constraint)) => assignableToAll(NilType, TypeSet.from(constraint)) + case (l, TypeParameterT(_, constraint)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint)) + case (TypeParameterT(_, constraint), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint), r) // for ghost types case (BooleanT, AssertionT) => successProp @@ -334,4 +336,15 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => case _ => true } } + + private def assignableToAll(t: Type, typeSet: TypeSet) = typeSet match { + case TypeSet.UnboundedTypeSet => errorProp() + case TypeSet.BoundedTypeSet(ts) => propForall(ts.map((t, _)), assignableTo) + } + + 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/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 9deb53e77..8ad39f5e0 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 @@ -40,7 +40,7 @@ trait Implements { this: TypeInfoImpl => def addDemandedEmbeddedInterfaceImplements(itf: Type.InterfaceT): Unit = { 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))) => + case Some(ap.NamedType(_, st.NamedType(PTypeDef(_, int: PInterfaceType, _), _, context))) => context.symbType(int) match { case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) case _ => 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..28f30f4b1 --- /dev/null +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -0,0 +1,52 @@ +package viper.gobra.frontend.info.implementation.resolution + +import viper.gobra.frontend.info.base.Type._ +import viper.gobra.ast.frontend._ +import viper.gobra.frontend.info.ExternalTypeInfo +sealed trait TypeSet + +object TypeSet { + case object UnboundedTypeSet extends TypeSet + case class BoundedTypeSet(ts: Set[Type]) extends TypeSet + + def from(constraint: Type): TypeSet = constraint match { + case InterfaceT(pInterface, ctx) => typeSetFromInterfaceType(pInterface, ctx) + } + + private def typeSetFromInterfaceType(inter: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = inter match { + case PInterfaceType(embedded, _, _) => if (embedded.isEmpty) UnboundedTypeSet else intersect(embedded.map(el => typeSetFromElement(el, ctx))) + } + + private def typeSetFromElement(element: PTypeElement, ctx: ExternalTypeInfo): TypeSet = + if (element.terms.isEmpty) UnboundedTypeSet else union(element.terms.map(term => typeSetFromTerm(term, ctx))) + + private def typeSetFromTerm(term: PTypeTerm, ctx: ExternalTypeInfo): TypeSet = term match { + case PComparable() => UnboundedTypeSet + case i: PInterfaceType => typeSetFromInterfaceType(i, ctx) + case t: PType => BoundedTypeSet(Set(ctx.symbType(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 (UnboundedTypeSet, _) => UnboundedTypeSet + case (_, UnboundedTypeSet) => UnboundedTypeSet + 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) { + case (UnboundedTypeSet, ts) => ts + case (ts, UnboundedTypeSet) => ts + case (BoundedTypeSet(x), BoundedTypeSet(y)) => BoundedTypeSet(x intersect y) + } + } +} 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 0733e4764..333784a76 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 @@ -827,8 +827,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) diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index cb025be27..40da9706c 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3495,6 +3495,34 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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"), PTypeElement(Vector(PNamedOperand(PIdnUse("I")))))), + 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) + } + /* * Stubs, mocks, and other test setup */ class TestFrontend { From 4253b7e8f2db6a21450a92c67ea25664f4089c27 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 12 Jun 2023 13:03:06 +0200 Subject: [PATCH 15/37] embed non interface type constraints into interfaces --- .../viper/gobra/frontend/info/base/Type.scala | 2 +- .../property/Assignability.scala | 8 +-- .../implementation/property/Implements.scala | 2 +- .../implementation/resolution/TypeSet.scala | 4 +- .../info/implementation/typing/IdTyping.scala | 6 +- .../viper/gobra/ast/TypeNodeUnitTests.scala | 10 +-- .../gobra/typing/MemberTypingUnitTests.scala | 64 +++++++++++++++++-- 7 files changed, 73 insertions(+), 23 deletions(-) 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 da7978ae2..afe2553bb 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -122,7 +122,7 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(id: PIdnDef, constraint: InterfaceT) extends PrettyType(s"${id.name}") + case class TypeParameterT(id: PIdnDef, constraint: PInterfaceType) extends PrettyType(s"${id.name}") sealed trait GhostType extends Type 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 76ac136c5..ebb1c70ec 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 @@ -85,10 +85,10 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => 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)) - case (NilType, TypeParameterT(_, constraint)) => assignableToAll(NilType, TypeSet.from(constraint)) - case (l, TypeParameterT(_, constraint)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint)) - case (TypeParameterT(_, constraint), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint), r) + 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 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 8ad39f5e0..0344bce5d 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 @@ -57,7 +57,7 @@ trait Implements { this: TypeInfoImpl => def syntaxImplements(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { case (NilType, _: Type.InterfaceT) => successProp - case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => syntaxImplements(constraint, r) + case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => syntaxImplements(symbType(constraint), r) case (_, _: Type.InterfaceT) => supportedSortForInterfaces(l) and { val itfMemberSet = memberSet(r) 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 index 28f30f4b1..697d9dc4d 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -9,9 +9,7 @@ object TypeSet { case object UnboundedTypeSet extends TypeSet case class BoundedTypeSet(ts: Set[Type]) extends TypeSet - def from(constraint: Type): TypeSet = constraint match { - case InterfaceT(pInterface, ctx) => typeSetFromInterfaceType(pInterface, ctx) - } + def from(constraint: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = typeSetFromInterfaceType(constraint, ctx) private def typeSetFromInterfaceType(inter: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = inter match { case PInterfaceType(embedded, _, _) => if (embedded.isEmpty) UnboundedTypeSet else intersect(embedded.map(el => typeSetFromElement(el, ctx))) 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 a5011c395..bb63d05b0 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 @@ -165,8 +165,10 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, ctx) => - TypeParameterT(decl.id, InterfaceT(PInterfaceType(Vector(decl.constraint), Vector(), Vector()), ctx)) + case TypeParameter(decl, _, ctx) => decl.constraint match { + case PTypeElement(Vector(t: PInterfaceType)) => TypeParameterT(decl.id, t) + case _ => TypeParameterT(decl.id, PInterfaceType(Vector(decl.constraint), Vector(), Vector())) + } case _ => violation(s"expected type, but got $id") } diff --git a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala index e94bf6a0c..b7aa826b1 100644 --- a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -9,7 +9,7 @@ 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"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)) + val typeNode = Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector())) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("z") => Type.StringT case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) @@ -22,7 +22,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should not substitute anything if type argument is not provided") { - val typeNode = Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)) + val typeNode = Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector())) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("y") => Type.IntT(TypeBounds.DefaultInt) } @@ -31,7 +31,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (single)") { - val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null))) + val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()))) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) } @@ -43,8 +43,8 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeNode: should correctly substitute in children (multiple)") { val typeNode = Type.MathMapT( - Type.TypeParameterT(PIdnDef("x"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()), null)), - Type.TypeParameterT(PIdnDef("y"), Type.InterfaceT(PInterfaceType(Vector(PTypeElement(Vector(PBoolType()))), Vector(), Vector()), null)) + Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector())), + Type.TypeParameterT(PIdnDef("y"), PInterfaceType(Vector(PTypeElement(Vector(PBoolType()))), Vector(), Vector())) ) val sub: PartialFunction[PIdnDef, Type.Type] = { case PIdnDef("x") => Type.IntT(TypeBounds.DefaultInt) diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index c87c64b08..9faef8bbe 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -83,7 +83,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(frontend.wellDefMember(member).valid) } - test("TypeChecker: foo1") { + test("TypeChecker: should accept valid assignment of constant to simple type parameter") { // func foo[T int]() { // var _ T = 3 // valid // } @@ -101,7 +101,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(frontend.wellDefMember(member).valid) } - test("TypeChecker: foo2") { + test("TypeChecker: should not accept invalid assignment of constant to simple type parameter") { // func foo[T int]() { // var _ T = false // invalid // } @@ -119,7 +119,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(!frontend.wellDefMember(member).valid) } - test("TypeChecker: foo3") { + test("TypeChecker: should not accept invalid assignment of constant to union type parameter") { // func foo[T int | bool]() { // var _ T = 3 // invalid // } @@ -137,7 +137,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(!frontend.wellDefMember(member).valid) } - test("TypeChecker: foo41") { + test("TypeChecker: should not accept invalid assignment of generic function parameter to static type") { // func foo[T int](x T) { // var _ int = x // invalid // } @@ -155,7 +155,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(!frontend.wellDefMember(member).valid) } - test("TypeChecker: foo42") { + 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 // } @@ -181,8 +181,8 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(frontend.wellDefMember(member).valid) } - test("TypeChecker: foo5") { - // func foo5[T int | bool](x T) { + 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( @@ -199,6 +199,56 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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"), PTypeElement(Vector(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) + } + class TestFrontend { def singleMemberProgram(member: PMember): PProgram = PProgram( From 4139ed6030a35bad1b1efe0b0f032a028ef6cd5d Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 15 Jun 2023 15:53:00 +0200 Subject: [PATCH 16/37] implemented satisfiability, comparability, identity, type merging and underlying type of type parameters --- src/main/resources/builtin/builtin.gobra | 2 + .../scala/viper/gobra/ast/frontend/Ast.scala | 4 +- .../gobra/ast/frontend/PrettyPrinter.scala | 2 +- .../gobra/frontend/ParseTreeTranslator.scala | 5 +- .../viper/gobra/frontend/info/base/Type.scala | 4 +- .../info/implementation/TypeInfoImpl.scala | 1 + .../property/Assignability.scala | 16 +- .../property/Comparability.scala | 44 +- .../implementation/property/Implements.scala | 2 +- .../property/Satisfiability.scala | 30 + .../property/TypeIdentity.scala | 2 + .../implementation/property/TypeMerging.scala | 3 +- .../property/UnderlyingType.scala | 6 +- .../implementation/resolution/TypeSet.scala | 38 +- .../implementation/typing/ExprTyping.scala | 14 +- .../info/implementation/typing/IdTyping.scala | 5 +- .../implementation/typing/TypeTyping.scala | 11 +- .../viper/gobra/ast/TypeNodeUnitTests.scala | 10 +- .../viper/gobra/parsing/ParserUnitTests.scala | 29 +- .../gobra/typing/ExprTypingUnitTests.scala | 562 +++++++++++++++++- .../gobra/typing/MemberTypingUnitTests.scala | 126 +++- 21 files changed, 829 insertions(+), 87 deletions(-) create mode 100644 src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala 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 34e7b1372..f1f1373e0 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -680,7 +680,7 @@ sealed trait PFloatType extends PType case class PFloat32() extends PPredeclaredType("float32") with PFloatType case class PFloat64() extends PPredeclaredType("float64") with PFloatType -case class PComparable() extends PPredeclaredType("comparable") + // TODO: add more types // TODO: ellipsis type @@ -855,7 +855,7 @@ case class PEmbeddedName(typ: PUnqualifiedTypeName) extends PEmbeddedType case class PEmbeddedPointer(typ: PUnqualifiedTypeName) extends PEmbeddedType -case class PTypeParameter(id: PIdnDef, constraint: PTypeElement) extends PNode +case class PTypeParameter(id: PIdnDef, constraint: PInterfaceType) extends PNode /** * Ghost diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index c375e7fc2..f1463b426 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -170,7 +170,7 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter if (typeParameters.nonEmpty) brackets(ssep(typeParameters map showTypeParameter, comma <> space)) else emptyDoc def showTypeParameter(typeParameter: PTypeParameter): Doc = - showId(typeParameter.id) <+> showTypeElement(typeParameter.constraint) + showId(typeParameter.id) <+> showType(typeParameter.constraint) def showTypeArguments(typeArgs: Vector[PType]): Doc = if (typeArgs.nonEmpty) brackets(ssep(typeArgs map showType, comma <> space)) else emptyDoc diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index d35aba7d0..804abdb45 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -805,8 +805,11 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole */ 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) => - identifierList.map(id => PTypeParameter(id, typeConstraint).at(id)) + // embed non interface type constraint in interface + identifierList.map(id => PTypeParameter(id, PInterfaceType(Vector(typeConstraint), Vector(), Vector())).at(id)) } } 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 afe2553bb..75906988f 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -122,7 +122,7 @@ object Type { case object SortT extends PrettyType("Type") - case class TypeParameterT(id: PIdnDef, constraint: PInterfaceType) extends PrettyType(s"${id.name}") + case class TypeParameterT(id: PIdnDef, constraint: PInterfaceType, context: ExternalTypeInfo) extends PrettyType(s"${id.name}") sealed trait GhostType extends Type @@ -212,7 +212,7 @@ object Type { trait TypeNode extends Node { def substitute(f: PartialFunction[PIdnDef, Type]): this.type = { this.transform({ - case TypeParameterT(id, _) if f.isDefinedAt(id) => f(id) + case TypeParameterT(id, _, _) if f.isDefinedAt(id) => f(id) }) } 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 cc1a2863f..6b0536257 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/TypeInfoImpl.scala @@ -58,6 +58,7 @@ class TypeInfoImpl(final val tree: Info.GoTree, final val context: Info.Context, 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 ebb1c70ec..403b59cdb 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 @@ -79,16 +79,16 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => && identicalTypes(underlyingType(l), underlyingType(r)) && !isTypeParameter(l) && !isTypeParameter(r) => successProp - case (l, r) if underlyingType(r).isInstanceOf[InterfaceT] && !isTypeParameter(underlyingType(r)) => 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) && !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) + case (UNTYPED_INT_CONST, TypeParameterT(_, constraint, ctx)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint, ctx)) + case (NilType, TypeParameterT(_, constraint, ctx)) => assignableToAll(NilType, TypeSet.from(constraint, ctx)) + case (l, TypeParameterT(_, constraint, ctx)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint, ctx)) + case (TypeParameterT(_, constraint, ctx), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint, ctx), r) // for ghost types case (BooleanT, AssertionT) => successProp @@ -338,13 +338,13 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => } private def assignableToAll(t: Type, typeSet: TypeSet) = typeSet match { - case TypeSet.UnboundedTypeSet => errorProp() + case _: TypeSet.UnboundedTypeSet => errorProp() case TypeSet.BoundedTypeSet(ts) => propForall(ts.map((t, _)), assignableTo) } private def allAssignableTo(typeSet: TypeSet, t: Type) = (typeSet, t) match { - case (TypeSet.UnboundedTypeSet, _: InterfaceT) => successProp - case (TypeSet.UnboundedTypeSet, _) => errorProp() + 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..049ccde34 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, t.context)) + 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 0344bce5d..9f764cca2 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 @@ -57,7 +57,7 @@ trait Implements { this: TypeInfoImpl => def syntaxImplements(l: Type, r: Type): PropertyResult = (l, underlyingType(r)) match { case (NilType, _: Type.InterfaceT) => successProp - case (Type.TypeParameterT(_, constraint), _: Type.InterfaceT) => syntaxImplements(symbType(constraint), r) + case (Type.TypeParameterT(_, constraint, _), _: Type.InterfaceT) => syntaxImplements(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..ed7a0fcfc --- /dev/null +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala @@ -0,0 +1,30 @@ +package viper.gobra.frontend.info.implementation.property + +import org.bitbucket.inkytonik.kiama.util.Messaging.error +import viper.gobra.ast.frontend.{PIdnUse, PInterfaceType, PNamedOperand, PType, PTypeElement} +import viper.gobra.frontend.info.base.Type.InterfaceT +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[(PType, PInterfaceType)] = createProperty { + case (t, PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), methSpecs, _)) => + comparableType.result(symbType(t)) and goImplements.result(t, PInterfaceType(Vector(), methSpecs, Vector())) + case (t, constraintType) => + goImplements.result(t, constraintType) + } + + private lazy val goImplements: Property[(PType, PInterfaceType)] = createProperty { + case (pType: PType, interfacePType: PInterfaceType) => + val typ = symbType(pType) + val interfaceTypeSet = TypeSet.from(interfacePType, this) + + (pType match { + case i: PInterfaceType => + failedProp("is not a subset of the allowed type set", !TypeSet.isSubset(TypeSet.from(i, this), interfaceTypeSet)) + case _ => + failedProp("is not an element of the allowed type set", !TypeSet.contains(interfaceTypeSet, typ)) + }) and syntaxImplements(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 029d82801..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,6 +70,8 @@ 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 c432a65ce..23872c025 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 @@ -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)) + case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => + underlyingType(ctx.symbType(t)) // TODO verify this with Felix case t => t } @@ -44,7 +46,7 @@ trait UnderlyingType { this: TypeInfoImpl => case value : PType => Some(value, this) case _ => None } - // TODO handle type parameters + // TODO handle this for type parameters case _ => None // type not defined } case PDot(_, id) => entity(id) match { @@ -218,7 +220,7 @@ trait UnderlyingType { this: TypeInfoImpl => } def isTypeParameter(t: Type): Boolean = t match { - case TypeParameterT(_, _) => true + case TypeParameterT(_, _, _) => true case _ => false } } 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 index 697d9dc4d..5e591764e 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -6,22 +6,25 @@ import viper.gobra.frontend.info.ExternalTypeInfo sealed trait TypeSet object TypeSet { - case object UnboundedTypeSet extends TypeSet + case class UnboundedTypeSet(isComparable: Boolean = false) extends TypeSet case class BoundedTypeSet(ts: Set[Type]) extends TypeSet def from(constraint: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = typeSetFromInterfaceType(constraint, ctx) private def typeSetFromInterfaceType(inter: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = inter match { - case PInterfaceType(embedded, _, _) => if (embedded.isEmpty) UnboundedTypeSet else intersect(embedded.map(el => typeSetFromElement(el, ctx))) + case PInterfaceType(embedded, _, _) => if (embedded.isEmpty) UnboundedTypeSet() else intersect(embedded.map(el => typeSetFromElement(el, ctx))) } private def typeSetFromElement(element: PTypeElement, ctx: ExternalTypeInfo): TypeSet = - if (element.terms.isEmpty) UnboundedTypeSet else union(element.terms.map(term => typeSetFromTerm(term, ctx))) + if (element.terms.isEmpty) UnboundedTypeSet() else union(element.terms.map(term => typeSetFromTerm(term, ctx))) private def typeSetFromTerm(term: PTypeTerm, ctx: ExternalTypeInfo): TypeSet = term match { - case PComparable() => UnboundedTypeSet - case i: PInterfaceType => typeSetFromInterfaceType(i, ctx) - case t: PType => BoundedTypeSet(Set(ctx.symbType(t))) + case PNamedOperand(PIdnUse("comparable")) => UnboundedTypeSet(isComparable = true) + case pType: PType => ctx.symbType(pType) match { + case DeclaredT(decl, ctx) => typeSetFromTerm(decl.right, ctx) + case InterfaceT(i, _) => typeSetFromInterfaceType(i, ctx) + case t => BoundedTypeSet(Set(t)) + } } def empty(): TypeSet = { @@ -32,8 +35,9 @@ object TypeSet { case 0 => empty() case 1 => tss.head case _ => tss.fold(empty()) { - case (UnboundedTypeSet, _) => UnboundedTypeSet - case (_, UnboundedTypeSet) => UnboundedTypeSet + 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) } } @@ -41,10 +45,22 @@ object TypeSet { def intersect(tss: Vector[TypeSet]): TypeSet = tss.size match { case 0 => empty() case 1 => tss.head - case _ => tss.fold(UnboundedTypeSet) { - case (UnboundedTypeSet, ts) => ts - case (ts, UnboundedTypeSet) => ts + 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) + } } 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 333784a76..f5e114658 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 @@ -11,6 +11,7 @@ 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} @@ -307,14 +308,11 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case n : PIndexedExp => resolve(n) match { case Some(ap.Function(id, symb)) => - error(n, s"got ${n.index.length} type arguments but want ${symb.typeParameters.length}", n.index.length != symb.typeParameters.length) ++ n.index.flatMap(i => { - asType(i) match { - case Some(idxType) => - // TODO check here that idxType conforms to the type constraint of the type parameter (with assignableTo or implements?) - noMessages - case None => error(i, s"$i is not a type") - } - }) + error(n, s"got ${n.index.length} type arguments but want ${symb.typeParameters.length}", n.index.length != symb.typeParameters.length) ++ + n.index.zip(n.index.map(asType)).zip(symb.typeParameters).flatMap { + case ((i, None), _) => error(i, s"$i is not a type") + case ((i, Some(idxPType)), typeParam) => satisfies.errors((idxPType, typeParam.constraint))(i) + } case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { val baseType = exprType(base) val idxType = exprType(index) 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 bb63d05b0..90d8a750c 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 @@ -165,10 +165,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case BuiltInType(tag, _, _) => tag.typ - case TypeParameter(decl, _, ctx) => decl.constraint match { - case PTypeElement(Vector(t: PInterfaceType)) => TypeParameterT(decl.id, t) - case _ => TypeParameterT(decl.id, PInterfaceType(Vector(decl.constraint), Vector(), Vector())) - } + case TypeParameter(decl, _, ctx) => TypeParameterT(decl.id, decl.constraint, ctx) case _ => violation(s"expected type, but got $id") } 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 b08ba4e4c..cb8d92089 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 @@ -37,11 +37,10 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefParameterizedType(typ: PParameterizedType): Messages = entity(typ.typeName.id) match { case NamedType(decl, _, _) => - error(typ, s"got ${typ.typeArgs.length} type arguments but want ${decl.typeParameters.length}", typ.typeArgs.length != decl.typeParameters.length) ++ typ.typeArgs.flatMap(arg => { - val argType = typeSymbType(arg) - // TODO check that arg conforms to declaration (assignableTo or implements?) - noMessages - }) + error(typ, s"got ${typ.typeArgs.length} type arguments but want ${decl.typeParameters.length}", typ.typeArgs.length != decl.typeParameters.length) ++ + typ.typeArgs.zip(decl.typeParameters).flatMap { + case (arg, typeParam) => satisfies.errors((arg, typeParam.constraint))(arg) + } } private[typing] def wellDefActualType(typ: PActualType): Messages = typ match { @@ -275,7 +274,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => 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/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala index b7aa826b1..d93c42b03 100644 --- a/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala +++ b/src/test/scala/viper/gobra/ast/TypeNodeUnitTests.scala @@ -9,7 +9,7 @@ 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())) + 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) @@ -22,7 +22,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } 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())) + 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) } @@ -31,7 +31,7 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { } test("TypeNode: should correctly substitute in children (single)") { - val typeNode = Type.MultisetT(Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector()))) + 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) } @@ -43,8 +43,8 @@ class TypeNodeUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeNode: should correctly substitute in children (multiple)") { val typeNode = Type.MathMapT( - Type.TypeParameterT(PIdnDef("x"), PInterfaceType(Vector(PTypeElement(Vector(PIntType()))), Vector(), Vector())), - Type.TypeParameterT(PIdnDef("y"), PInterfaceType(Vector(PTypeElement(Vector(PBoolType()))), Vector(), Vector())) + 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) diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index 219496fee..d1f38312f 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2689,19 +2689,32 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { 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"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), _, _, _) => + 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"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), PStructType(_), PIdnDef("Bar")))) => + 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"), PTypeElement(Vector(PIntType(), PBoolType())))), _, _, _, _) => + case PFunctionDecl(PIdnDef("foo"), Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType(), PBoolType()))), + Vector(), + Vector() + ))), _, _, _, _) => } } @@ -2717,4 +2730,14 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { )))) 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() + ))), _, _, _, _) => + } + } } diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 40da9706c..478d6092c 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -3365,7 +3365,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -3384,7 +3388,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -3403,7 +3411,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -3420,7 +3432,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -3437,7 +3453,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func bar[T any](x T) T {} val functionDecl = PFunctionDecl( PIdnDef("bar"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -3454,8 +3474,16 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // type Bar[T any, V any] struct { x T } val typeDecl = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), - PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) + 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") @@ -3478,8 +3506,16 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // type Bar[T any, V any] struct { x T } val typeDecl = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), - PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) + 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") @@ -3506,7 +3542,11 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { // func foo[T I](x T) { } val functionDecl = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("I")))))), + 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()), @@ -3523,6 +3563,508 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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) + } + /* * Stubs, mocks, and other test setup */ class TestFrontend { diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index 9faef8bbe..0a9f45979 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -37,7 +37,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should be able to type generic function") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -50,7 +54,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should not accept generic function that uses type parameters that are not defined") { val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any")))))), + 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()), @@ -73,8 +81,16 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { test("TypeChecker: should accept generic type definition") { val member = PTypeDef( Vector( - PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))), - PTypeParameter(PIdnDef("V"), PTypeElement(Vector(PNamedOperand(PIdnUse("any"))))) + 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") @@ -89,7 +105,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType()))), + Vector(), + Vector() + ))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -107,7 +127,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType()))), + Vector(), + Vector() + ))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -125,7 +149,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType(), PBoolType())))), + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( + Vector(PTypeElement(Vector(PIntType(), PBoolType()))), + Vector(), + Vector() + ))), Vector(), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -143,7 +171,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType())))), + 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()), @@ -161,10 +193,10 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PInterfaceType(Vector(), Vector( + 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()))), Vector(PNamedParameter(PIdnDef("x"), PNamedOperand(PIdnUse("T")))), PResult(Vector()), PFunctionSpec(Vector(), Vector(), Vector(), Vector()), @@ -187,7 +219,11 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PIntType(), PBoolType())))), + 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()), @@ -208,7 +244,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { // } val member = PFunctionDecl( PIdnDef("foo"), - Vector(PTypeParameter(PIdnDef("T"), PTypeElement(Vector(PInterfaceType( + Vector(PTypeParameter(PIdnDef("T"), PInterfaceType( Vector(), Vector(PMethodSig( PIdnDef("m"), @@ -218,7 +254,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { isGhost = false )), Vector() - ))))), + ))), Vector(PNamedParameter(PIdnDef("x"), PInterfaceType( Vector(), Vector( @@ -249,6 +285,70 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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) + } + class TestFrontend { def singleMemberProgram(member: PMember): PProgram = PProgram( From 4aa1b02f4e7f22d570665757dd7c97f34d0d48e3 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Mon, 19 Jun 2023 15:36:43 +0200 Subject: [PATCH 17/37] implement generic type instantiation with PIndexedExp --- src/main/antlr4/GoParser.g4 | 2 +- .../viper/gobra/frontend/GobraParser.java | 210 +++++++++--------- .../scala/viper/gobra/ast/frontend/Ast.scala | 10 +- .../viper/gobra/ast/frontend/AstPattern.scala | 4 +- .../frontend/info/base/SymbolTable.scala | 3 +- .../viper/gobra/frontend/info/base/Type.scala | 2 +- .../property/Assignability.scala | 8 +- .../property/Comparability.scala | 2 +- .../property/UnderlyingType.scala | 3 +- .../resolution/AmbiguityResolution.scala | 3 + .../resolution/MemberResolution.scala | 2 +- .../implementation/resolution/TypeSet.scala | 19 +- .../implementation/typing/ExprTyping.scala | 196 ++++++++-------- .../implementation/typing/TypeTyping.scala | 46 ++-- src/test/resources/generics/adder.gobra | 19 ++ src/test/resources/generics/container.gobra | 12 + .../resources/generics/devirtualize1.gobra | 20 ++ .../resources/generics/devirtualize2.gobra | 28 +++ src/test/resources/generics/dottype.gobra | 76 +++++++ src/test/resources/generics/eface.gobra | 43 ++++ src/test/resources/generics/index.gobra | 27 +++ .../viper/gobra/parsing/ParserUnitTests.scala | 10 + .../gobra/typing/MemberTypingUnitTests.scala | 12 +- 23 files changed, 515 insertions(+), 242 deletions(-) create mode 100644 src/test/resources/generics/adder.gobra create mode 100644 src/test/resources/generics/container.gobra create mode 100644 src/test/resources/generics/devirtualize1.gobra create mode 100644 src/test/resources/generics/devirtualize2.gobra create mode 100644 src/test/resources/generics/dottype.gobra create mode 100644 src/test/resources/generics/eface.gobra create mode 100644 src/test/resources/generics/index.gobra diff --git a/src/main/antlr4/GoParser.g4 b/src/main/antlr4/GoParser.g4 index f64dc3d70..e7ed74f11 100644 --- a/src/main/antlr4/GoParser.g4 +++ b/src/main/antlr4/GoParser.g4 @@ -315,7 +315,7 @@ primaryExpr: -conversion: nonNamedType L_PAREN expression COMMA? R_PAREN; +conversion: type_ L_PAREN expression COMMA? R_PAREN; nonNamedType: typeLit | L_PAREN nonNamedType R_PAREN; diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index e6cad4a17..8c8e2a4bc 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -12082,8 +12082,8 @@ public final TypeConstraintContext typeConstraint() throws RecognitionException @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() { @@ -12110,7 +12110,7 @@ public final ConversionContext conversion() throws RecognitionException { enterOuterAlt(_localctx, 1); { setState(1761); - nonNamedType(); + type_(); setState(1762); match(L_PAREN); setState(1763); @@ -14771,108 +14771,108 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u0000\u06da\u014f\u0001\u0000\u0000\u0000\u06db\u06d9\u0001\u0000\u0000"+ "\u0000\u06dc\u06dd\u0003\u00e4r\u0000\u06dd\u06de\u0003\u0152\u00a9\u0000"+ "\u06de\u0151\u0001\u0000\u0000\u0000\u06df\u06e0\u0003\u013a\u009d\u0000"+ - "\u06e0\u0153\u0001\u0000\u0000\u0000\u06e1\u06e2\u0003\u0156\u00ab\u0000"+ - "\u06e2\u06e3\u0005f\u0000\u0000\u06e3\u06e5\u0003\u00a2Q\u0000\u06e4\u06e6"+ - "\u0005m\u0000\u0000\u06e5\u06e4\u0001\u0000\u0000\u0000\u06e5\u06e6\u0001"+ - "\u0000\u0000\u0000\u06e6\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8\u0005"+ - "g\u0000\u0000\u06e8\u0155\u0001\u0000\u0000\u0000\u06e9\u06ef\u0003\u00c4"+ - "b\u0000\u06ea\u06eb\u0005f\u0000\u0000\u06eb\u06ec\u0003\u0156\u00ab\u0000"+ - "\u06ec\u06ed\u0005g\u0000\u0000\u06ed\u06ef\u0001\u0000\u0000\u0000\u06ee"+ - "\u06e9\u0001\u0000\u0000\u0000\u06ee\u06ea\u0001\u0000\u0000\u0000\u06ef"+ - "\u0157\u0001\u0000\u0000\u0000\u06f0\u06f7\u0003\u015a\u00ad\u0000\u06f1"+ - "\u06f7\u0003\u015e\u00af\u0000\u06f2\u06f3\u0005f\u0000\u0000\u06f3\u06f4"+ - "\u0003\u00a2Q\u0000\u06f4\u06f5\u0005g\u0000\u0000\u06f5\u06f7\u0001\u0000"+ - "\u0000\u0000\u06f6\u06f0\u0001\u0000\u0000\u0000\u06f6\u06f1\u0001\u0000"+ - "\u0000\u0000\u06f6\u06f2\u0001\u0000\u0000\u0000\u06f7\u0159\u0001\u0000"+ - "\u0000\u0000\u06f8\u06fc\u0003\u00b0X\u0000\u06f9\u06fc\u0003\u0162\u00b1"+ - "\u0000\u06fa\u06fc\u0003\u00b4Z\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000"+ - "\u06fb\u06f9\u0001\u0000\u0000\u0000\u06fb\u06fa\u0001\u0000\u0000\u0000"+ - "\u06fc\u015b\u0001\u0000\u0000\u0000\u06fd\u06fe\u0007\u0011\u0000\u0000"+ - "\u06fe\u015d\u0001\u0000\u0000\u0000\u06ff\u0700\u0005e\u0000\u0000\u0700"+ - "\u015f\u0001\u0000\u0000\u0000\u0701\u0702\u0005e\u0000\u0000\u0702\u0703"+ - "\u0005p\u0000\u0000\u0703\u0704\u0005e\u0000\u0000\u0704\u0161\u0001\u0000"+ - "\u0000\u0000\u0705\u0706\u0003\u00cae\u0000\u0706\u0707\u0003\u0164\u00b2"+ - "\u0000\u0707\u0163\u0001\u0000\u0000\u0000\u0708\u070d\u0005h\u0000\u0000"+ - "\u0709\u070b\u0003\u0166\u00b3\u0000\u070a\u070c\u0005m\u0000\u0000\u070b"+ - "\u070a\u0001\u0000\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c"+ - "\u070e\u0001\u0000\u0000\u0000\u070d\u0709\u0001\u0000\u0000\u0000\u070d"+ - "\u070e\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f"+ - "\u0710\u0005i\u0000\u0000\u0710\u0165\u0001\u0000\u0000\u0000\u0711\u0716"+ - "\u0003\u0168\u00b4\u0000\u0712\u0713\u0005m\u0000\u0000\u0713\u0715\u0003"+ - "\u0168\u00b4\u0000\u0714\u0712\u0001\u0000\u0000\u0000\u0715\u0718\u0001"+ - "\u0000\u0000\u0000\u0716\u0714\u0001\u0000\u0000\u0000\u0716\u0717\u0001"+ - "\u0000\u0000\u0000\u0717\u0167\u0001\u0000\u0000\u0000\u0718\u0716\u0001"+ - "\u0000\u0000\u0000\u0719\u071a\u0003\u016a\u00b5\u0000\u071a\u071b\u0005"+ - "o\u0000\u0000\u071b\u071d\u0001\u0000\u0000\u0000\u071c\u0719\u0001\u0000"+ - "\u0000\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d\u071e\u0001\u0000"+ - "\u0000\u0000\u071e\u071f\u0003\u016c\u00b6\u0000\u071f\u0169\u0001\u0000"+ - "\u0000\u0000\u0720\u0723\u0003\u00a2Q\u0000\u0721\u0723\u0003\u0164\u00b2"+ - "\u0000\u0722\u0720\u0001\u0000\u0000\u0000\u0722\u0721\u0001\u0000\u0000"+ - "\u0000\u0723\u016b\u0001\u0000\u0000\u0000\u0724\u0727\u0003\u00a2Q\u0000"+ - "\u0725\u0727\u0003\u0164\u00b2\u0000\u0726\u0724\u0001\u0000\u0000\u0000"+ - "\u0726\u0725\u0001\u0000\u0000\u0000\u0727\u016d\u0001\u0000\u0000\u0000"+ - "\u0728\u0729\u0005T\u0000\u0000\u0729\u072f\u0005h\u0000\u0000\u072a\u072b"+ - "\u0003\u0170\u00b8\u0000\u072b\u072c\u0003\u0180\u00c0\u0000\u072c\u072e"+ - "\u0001\u0000\u0000\u0000\u072d\u072a\u0001\u0000\u0000\u0000\u072e\u0731"+ - "\u0001\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000\u0000\u072f\u0730"+ - "\u0001\u0000\u0000\u0000\u0730\u0732\u0001\u0000\u0000\u0000\u0731\u072f"+ - "\u0001\u0000\u0000\u0000\u0732\u0733\u0005i\u0000\u0000\u0733\u016f\u0001"+ - "\u0000\u0000\u0000\u0734\u0735\u0003\u00e4r\u0000\u0735\u0736\u0003\u00c2"+ - "a\u0000\u0736\u0739\u0001\u0000\u0000\u0000\u0737\u0739\u0003\u0174\u00ba"+ - "\u0000\u0738\u0734\u0001\u0000\u0000\u0000\u0738\u0737\u0001\u0000\u0000"+ - "\u0000\u0739\u073b\u0001\u0000\u0000\u0000\u073a\u073c\u0003\u0172\u00b9"+ - "\u0000\u073b\u073a\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000\u0000"+ - "\u0000\u073c\u0171\u0001\u0000\u0000\u0000\u073d\u073e\u0007\u0012\u0000"+ - "\u0000\u073e\u0173\u0001\u0000\u0000\u0000\u073f\u0741\u0005\u0087\u0000"+ - "\u0000\u0740\u073f\u0001\u0000\u0000\u0000\u0740\u0741\u0001\u0000\u0000"+ - "\u0000\u0741\u0742\u0001\u0000\u0000\u0000\u0742\u0744\u0003\u0130\u0098"+ - "\u0000\u0743\u0745\u0003\u0176\u00bb\u0000\u0744\u0743\u0001\u0000\u0000"+ - "\u0000\u0744\u0745\u0001\u0000\u0000\u0000\u0745\u0175\u0001\u0000\u0000"+ - "\u0000\u0746\u0747\u0005j\u0000\u0000\u0747\u074c\u0003\u00a2Q\u0000\u0748"+ - "\u0749\u0005m\u0000\u0000\u0749\u074b\u0003\u00a2Q\u0000\u074a\u0748\u0001"+ - "\u0000\u0000\u0000\u074b\u074e\u0001\u0000\u0000\u0000\u074c\u074a\u0001"+ - "\u0000\u0000\u0000\u074c\u074d\u0001\u0000\u0000\u0000\u074d\u0750\u0001"+ - "\u0000\u0000\u0000\u074e\u074c\u0001\u0000\u0000\u0000\u074f\u0751\u0005"+ - "m\u0000\u0000\u0750\u074f\u0001\u0000\u0000\u0000\u0750\u0751\u0001\u0000"+ - "\u0000\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0005k\u0000"+ - "\u0000\u0753\u0177\u0001\u0000\u0000\u0000\u0754\u0755\u0005p\u0000\u0000"+ - "\u0755\u0756\u0005f\u0000\u0000\u0756\u0757\u0003\u00c2a\u0000\u0757\u0758"+ - "\u0005g\u0000\u0000\u0758\u0179\u0001\u0000\u0000\u0000\u0759\u0768\u0005"+ - "f\u0000\u0000\u075a\u0761\u0003\u00e6s\u0000\u075b\u075e\u0003\u0156\u00ab"+ - "\u0000\u075c\u075d\u0005m\u0000\u0000\u075d\u075f\u0003\u00e6s\u0000\u075e"+ - "\u075c\u0001\u0000\u0000\u0000\u075e\u075f\u0001\u0000\u0000\u0000\u075f"+ - "\u0761\u0001\u0000\u0000\u0000\u0760\u075a\u0001\u0000\u0000\u0000\u0760"+ - "\u075b\u0001\u0000\u0000\u0000\u0761\u0763\u0001\u0000\u0000\u0000\u0762"+ - "\u0764\u0005t\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0763\u0764"+ - "\u0001\u0000\u0000\u0000\u0764\u0766\u0001\u0000\u0000\u0000\u0765\u0767"+ - "\u0005m\u0000\u0000\u0766\u0765\u0001\u0000\u0000\u0000\u0766\u0767\u0001"+ - "\u0000\u0000\u0000\u0767\u0769\u0001\u0000\u0000\u0000\u0768\u0760\u0001"+ - "\u0000\u0000\u0000\u0768\u0769\u0001\u0000\u0000\u0000\u0769\u076a\u0001"+ - "\u0000\u0000\u0000\u076a\u076b\u0005g\u0000\u0000\u076b\u017b\u0001\u0000"+ - "\u0000\u0000\u076c\u076d\u0003\u0156\u00ab\u0000\u076d\u076e\u0005p\u0000"+ - "\u0000\u076e\u076f\u0005e\u0000\u0000\u076f\u017d\u0001\u0000\u0000\u0000"+ - "\u0770\u0771\u0003\u00c2a\u0000\u0771\u017f\u0001\u0000\u0000\u0000\u0772"+ - "\u0777\u0005n\u0000\u0000\u0773\u0777\u0005\u0000\u0000\u0001\u0774\u0777"+ - "\u0005\u009f\u0000\u0000\u0775\u0777\u0004\u00c0\u0012\u0000\u0776\u0772"+ - "\u0001\u0000\u0000\u0000\u0776\u0773\u0001\u0000\u0000\u0000\u0776\u0774"+ - "\u0001\u0000\u0000\u0000\u0776\u0775\u0001\u0000\u0000\u0000\u0777\u0181"+ - "\u0001\u0000\u0000\u0000\u00c4\u0190\u0195\u019c\u01a6\u01ac\u01b2\u01c2"+ - "\u01c6\u01cf\u01db\u01df\u01e5\u01ee\u01f8\u0209\u0217\u021b\u0222\u022a"+ - "\u0233\u0253\u025b\u0273\u0286\u0295\u02a2\u02ab\u02b9\u02c2\u02ce\u02e3"+ - "\u02ea\u02ef\u02f4\u02fe\u0301\u0305\u0309\u0311\u0319\u031e\u0326\u0328"+ - "\u032d\u0334\u033c\u033f\u0345\u034a\u034c\u034f\u0356\u035b\u036e\u0376"+ - "\u037a\u037d\u0383\u0387\u038a\u0394\u039b\u03a2\u03ae\u03b3\u03b7\u03be"+ - "\u03c3\u03c9\u03d5\u03db\u03df\u03e7\u03eb\u03f1\u03f4\u03fa\u03ff\u0418"+ - "\u043b\u043d\u0454\u045c\u0467\u046e\u0475\u047f\u048d\u04a3\u04a5\u04ad"+ - "\u04b1\u04b5\u04b8\u04c3\u04cb\u04d2\u04da\u04e0\u04e4\u04ec\u04f7\u0502"+ - "\u0506\u0508\u0514\u0516\u051f\u0523\u0526\u052d\u0538\u0542\u0548\u054a"+ - "\u0554\u055e\u0562\u0566\u056a\u0571\u0579\u0584\u0588\u058c\u0594\u05a0"+ - "\u05a4\u05a8\u05b1\u05b8\u05cc\u05d0\u05d4\u05d8\u05e8\u05ee\u05f0\u05f4"+ - "\u05f8\u05fb\u05ff\u0601\u0607\u060f\u0614\u061f\u0625\u062c\u0637\u063c"+ - "\u0640\u0645\u0649\u0651\u0659\u065e\u0661\u0669\u0671\u0676\u067a\u067e"+ - "\u0685\u0698\u06ac\u06b7\u06bb\u06c3\u06c7\u06c9\u06d0\u06d9\u06e5\u06ee"+ - "\u06f6\u06fb\u070b\u070d\u0716\u071c\u0722\u0726\u072f\u0738\u073b\u0740"+ - "\u0744\u074c\u0750\u075e\u0760\u0763\u0766\u0768\u0776"; + "\u06e0\u0153\u0001\u0000\u0000\u0000\u06e1\u06e2\u0003\u00c2a\u0000\u06e2"+ + "\u06e3\u0005f\u0000\u0000\u06e3\u06e5\u0003\u00a2Q\u0000\u06e4\u06e6\u0005"+ + "m\u0000\u0000\u06e5\u06e4\u0001\u0000\u0000\u0000\u06e5\u06e6\u0001\u0000"+ + "\u0000\u0000\u06e6\u06e7\u0001\u0000\u0000\u0000\u06e7\u06e8\u0005g\u0000"+ + "\u0000\u06e8\u0155\u0001\u0000\u0000\u0000\u06e9\u06ef\u0003\u00c4b\u0000"+ + "\u06ea\u06eb\u0005f\u0000\u0000\u06eb\u06ec\u0003\u0156\u00ab\u0000\u06ec"+ + "\u06ed\u0005g\u0000\u0000\u06ed\u06ef\u0001\u0000\u0000\u0000\u06ee\u06e9"+ + "\u0001\u0000\u0000\u0000\u06ee\u06ea\u0001\u0000\u0000\u0000\u06ef\u0157"+ + "\u0001\u0000\u0000\u0000\u06f0\u06f7\u0003\u015a\u00ad\u0000\u06f1\u06f7"+ + "\u0003\u015e\u00af\u0000\u06f2\u06f3\u0005f\u0000\u0000\u06f3\u06f4\u0003"+ + "\u00a2Q\u0000\u06f4\u06f5\u0005g\u0000\u0000\u06f5\u06f7\u0001\u0000\u0000"+ + "\u0000\u06f6\u06f0\u0001\u0000\u0000\u0000\u06f6\u06f1\u0001\u0000\u0000"+ + "\u0000\u06f6\u06f2\u0001\u0000\u0000\u0000\u06f7\u0159\u0001\u0000\u0000"+ + "\u0000\u06f8\u06fc\u0003\u00b0X\u0000\u06f9\u06fc\u0003\u0162\u00b1\u0000"+ + "\u06fa\u06fc\u0003\u00b4Z\u0000\u06fb\u06f8\u0001\u0000\u0000\u0000\u06fb"+ + "\u06f9\u0001\u0000\u0000\u0000\u06fb\u06fa\u0001\u0000\u0000\u0000\u06fc"+ + "\u015b\u0001\u0000\u0000\u0000\u06fd\u06fe\u0007\u0011\u0000\u0000\u06fe"+ + "\u015d\u0001\u0000\u0000\u0000\u06ff\u0700\u0005e\u0000\u0000\u0700\u015f"+ + "\u0001\u0000\u0000\u0000\u0701\u0702\u0005e\u0000\u0000\u0702\u0703\u0005"+ + "p\u0000\u0000\u0703\u0704\u0005e\u0000\u0000\u0704\u0161\u0001\u0000\u0000"+ + "\u0000\u0705\u0706\u0003\u00cae\u0000\u0706\u0707\u0003\u0164\u00b2\u0000"+ + "\u0707\u0163\u0001\u0000\u0000\u0000\u0708\u070d\u0005h\u0000\u0000\u0709"+ + "\u070b\u0003\u0166\u00b3\u0000\u070a\u070c\u0005m\u0000\u0000\u070b\u070a"+ + "\u0001\u0000\u0000\u0000\u070b\u070c\u0001\u0000\u0000\u0000\u070c\u070e"+ + "\u0001\u0000\u0000\u0000\u070d\u0709\u0001\u0000\u0000\u0000\u070d\u070e"+ + "\u0001\u0000\u0000\u0000\u070e\u070f\u0001\u0000\u0000\u0000\u070f\u0710"+ + "\u0005i\u0000\u0000\u0710\u0165\u0001\u0000\u0000\u0000\u0711\u0716\u0003"+ + "\u0168\u00b4\u0000\u0712\u0713\u0005m\u0000\u0000\u0713\u0715\u0003\u0168"+ + "\u00b4\u0000\u0714\u0712\u0001\u0000\u0000\u0000\u0715\u0718\u0001\u0000"+ + "\u0000\u0000\u0716\u0714\u0001\u0000\u0000\u0000\u0716\u0717\u0001\u0000"+ + "\u0000\u0000\u0717\u0167\u0001\u0000\u0000\u0000\u0718\u0716\u0001\u0000"+ + "\u0000\u0000\u0719\u071a\u0003\u016a\u00b5\u0000\u071a\u071b\u0005o\u0000"+ + "\u0000\u071b\u071d\u0001\u0000\u0000\u0000\u071c\u0719\u0001\u0000\u0000"+ + "\u0000\u071c\u071d\u0001\u0000\u0000\u0000\u071d\u071e\u0001\u0000\u0000"+ + "\u0000\u071e\u071f\u0003\u016c\u00b6\u0000\u071f\u0169\u0001\u0000\u0000"+ + "\u0000\u0720\u0723\u0003\u00a2Q\u0000\u0721\u0723\u0003\u0164\u00b2\u0000"+ + "\u0722\u0720\u0001\u0000\u0000\u0000\u0722\u0721\u0001\u0000\u0000\u0000"+ + "\u0723\u016b\u0001\u0000\u0000\u0000\u0724\u0727\u0003\u00a2Q\u0000\u0725"+ + "\u0727\u0003\u0164\u00b2\u0000\u0726\u0724\u0001\u0000\u0000\u0000\u0726"+ + "\u0725\u0001\u0000\u0000\u0000\u0727\u016d\u0001\u0000\u0000\u0000\u0728"+ + "\u0729\u0005T\u0000\u0000\u0729\u072f\u0005h\u0000\u0000\u072a\u072b\u0003"+ + "\u0170\u00b8\u0000\u072b\u072c\u0003\u0180\u00c0\u0000\u072c\u072e\u0001"+ + "\u0000\u0000\u0000\u072d\u072a\u0001\u0000\u0000\u0000\u072e\u0731\u0001"+ + "\u0000\u0000\u0000\u072f\u072d\u0001\u0000\u0000\u0000\u072f\u0730\u0001"+ + "\u0000\u0000\u0000\u0730\u0732\u0001\u0000\u0000\u0000\u0731\u072f\u0001"+ + "\u0000\u0000\u0000\u0732\u0733\u0005i\u0000\u0000\u0733\u016f\u0001\u0000"+ + "\u0000\u0000\u0734\u0735\u0003\u00e4r\u0000\u0735\u0736\u0003\u00c2a\u0000"+ + "\u0736\u0739\u0001\u0000\u0000\u0000\u0737\u0739\u0003\u0174\u00ba\u0000"+ + "\u0738\u0734\u0001\u0000\u0000\u0000\u0738\u0737\u0001\u0000\u0000\u0000"+ + "\u0739\u073b\u0001\u0000\u0000\u0000\u073a\u073c\u0003\u0172\u00b9\u0000"+ + "\u073b\u073a\u0001\u0000\u0000\u0000\u073b\u073c\u0001\u0000\u0000\u0000"+ + "\u073c\u0171\u0001\u0000\u0000\u0000\u073d\u073e\u0007\u0012\u0000\u0000"+ + "\u073e\u0173\u0001\u0000\u0000\u0000\u073f\u0741\u0005\u0087\u0000\u0000"+ + "\u0740\u073f\u0001\u0000\u0000\u0000\u0740\u0741\u0001\u0000\u0000\u0000"+ + "\u0741\u0742\u0001\u0000\u0000\u0000\u0742\u0744\u0003\u0130\u0098\u0000"+ + "\u0743\u0745\u0003\u0176\u00bb\u0000\u0744\u0743\u0001\u0000\u0000\u0000"+ + "\u0744\u0745\u0001\u0000\u0000\u0000\u0745\u0175\u0001\u0000\u0000\u0000"+ + "\u0746\u0747\u0005j\u0000\u0000\u0747\u074c\u0003\u00a2Q\u0000\u0748\u0749"+ + "\u0005m\u0000\u0000\u0749\u074b\u0003\u00a2Q\u0000\u074a\u0748\u0001\u0000"+ + "\u0000\u0000\u074b\u074e\u0001\u0000\u0000\u0000\u074c\u074a\u0001\u0000"+ + "\u0000\u0000\u074c\u074d\u0001\u0000\u0000\u0000\u074d\u0750\u0001\u0000"+ + "\u0000\u0000\u074e\u074c\u0001\u0000\u0000\u0000\u074f\u0751\u0005m\u0000"+ + "\u0000\u0750\u074f\u0001\u0000\u0000\u0000\u0750\u0751\u0001\u0000\u0000"+ + "\u0000\u0751\u0752\u0001\u0000\u0000\u0000\u0752\u0753\u0005k\u0000\u0000"+ + "\u0753\u0177\u0001\u0000\u0000\u0000\u0754\u0755\u0005p\u0000\u0000\u0755"+ + "\u0756\u0005f\u0000\u0000\u0756\u0757\u0003\u00c2a\u0000\u0757\u0758\u0005"+ + "g\u0000\u0000\u0758\u0179\u0001\u0000\u0000\u0000\u0759\u0768\u0005f\u0000"+ + "\u0000\u075a\u0761\u0003\u00e6s\u0000\u075b\u075e\u0003\u0156\u00ab\u0000"+ + "\u075c\u075d\u0005m\u0000\u0000\u075d\u075f\u0003\u00e6s\u0000\u075e\u075c"+ + "\u0001\u0000\u0000\u0000\u075e\u075f\u0001\u0000\u0000\u0000\u075f\u0761"+ + "\u0001\u0000\u0000\u0000\u0760\u075a\u0001\u0000\u0000\u0000\u0760\u075b"+ + "\u0001\u0000\u0000\u0000\u0761\u0763\u0001\u0000\u0000\u0000\u0762\u0764"+ + "\u0005t\u0000\u0000\u0763\u0762\u0001\u0000\u0000\u0000\u0763\u0764\u0001"+ + "\u0000\u0000\u0000\u0764\u0766\u0001\u0000\u0000\u0000\u0765\u0767\u0005"+ + "m\u0000\u0000\u0766\u0765\u0001\u0000\u0000\u0000\u0766\u0767\u0001\u0000"+ + "\u0000\u0000\u0767\u0769\u0001\u0000\u0000\u0000\u0768\u0760\u0001\u0000"+ + "\u0000\u0000\u0768\u0769\u0001\u0000\u0000\u0000\u0769\u076a\u0001\u0000"+ + "\u0000\u0000\u076a\u076b\u0005g\u0000\u0000\u076b\u017b\u0001\u0000\u0000"+ + "\u0000\u076c\u076d\u0003\u0156\u00ab\u0000\u076d\u076e\u0005p\u0000\u0000"+ + "\u076e\u076f\u0005e\u0000\u0000\u076f\u017d\u0001\u0000\u0000\u0000\u0770"+ + "\u0771\u0003\u00c2a\u0000\u0771\u017f\u0001\u0000\u0000\u0000\u0772\u0777"+ + "\u0005n\u0000\u0000\u0773\u0777\u0005\u0000\u0000\u0001\u0774\u0777\u0005"+ + "\u009f\u0000\u0000\u0775\u0777\u0004\u00c0\u0012\u0000\u0776\u0772\u0001"+ + "\u0000\u0000\u0000\u0776\u0773\u0001\u0000\u0000\u0000\u0776\u0774\u0001"+ + "\u0000\u0000\u0000\u0776\u0775\u0001\u0000\u0000\u0000\u0777\u0181\u0001"+ + "\u0000\u0000\u0000\u00c4\u0190\u0195\u019c\u01a6\u01ac\u01b2\u01c2\u01c6"+ + "\u01cf\u01db\u01df\u01e5\u01ee\u01f8\u0209\u0217\u021b\u0222\u022a\u0233"+ + "\u0253\u025b\u0273\u0286\u0295\u02a2\u02ab\u02b9\u02c2\u02ce\u02e3\u02ea"+ + "\u02ef\u02f4\u02fe\u0301\u0305\u0309\u0311\u0319\u031e\u0326\u0328\u032d"+ + "\u0334\u033c\u033f\u0345\u034a\u034c\u034f\u0356\u035b\u036e\u0376\u037a"+ + "\u037d\u0383\u0387\u038a\u0394\u039b\u03a2\u03ae\u03b3\u03b7\u03be\u03c3"+ + "\u03c9\u03d5\u03db\u03df\u03e7\u03eb\u03f1\u03f4\u03fa\u03ff\u0418\u043b"+ + "\u043d\u0454\u045c\u0467\u046e\u0475\u047f\u048d\u04a3\u04a5\u04ad\u04b1"+ + "\u04b5\u04b8\u04c3\u04cb\u04d2\u04da\u04e0\u04e4\u04ec\u04f7\u0502\u0506"+ + "\u0508\u0514\u0516\u051f\u0523\u0526\u052d\u0538\u0542\u0548\u054a\u0554"+ + "\u055e\u0562\u0566\u056a\u0571\u0579\u0584\u0588\u058c\u0594\u05a0\u05a4"+ + "\u05a8\u05b1\u05b8\u05cc\u05d0\u05d4\u05d8\u05e8\u05ee\u05f0\u05f4\u05f8"+ + "\u05fb\u05ff\u0601\u0607\u060f\u0614\u061f\u0625\u062c\u0637\u063c\u0640"+ + "\u0645\u0649\u0651\u0659\u065e\u0661\u0669\u0671\u0676\u067a\u067e\u0685"+ + "\u0698\u06ac\u06b7\u06bb\u06c3\u06c7\u06c9\u06d0\u06d9\u06e5\u06ee\u06f6"+ + "\u06fb\u070b\u070d\u0716\u071c\u0722\u0726\u072f\u0738\u073b\u0740\u0744"+ + "\u074c\u0750\u075e\u0760\u0763\u0766\u0768\u0776"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index f1f1373e0..c1326fe84 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -155,6 +155,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 @@ -173,7 +177,7 @@ case class PFunctionDecl( 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, @@ -191,7 +195,7 @@ sealed trait PTypeDecl extends PActualMember with PActualStatement with PGhostif def right: PType } -case class PTypeDef(typeParameters: Vector[PTypeParameter], right: PType, left: PIdnDef) extends PTypeDecl with PScope +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 @@ -467,7 +471,7 @@ 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: Vector[PExpressionOrType]) 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 diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index c4d4a2b22..78f7403ab 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -20,7 +20,7 @@ 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) extends Type with Symbolic with Parameterizable 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 @@ -56,7 +56,7 @@ object AstPattern { } sealed trait Parameterizable { - var typeArgs: Vector[PType] = Vector.empty + var typeArgs: Vector[PType] = Vector() } case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic with Parameterizable 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 fb3865216..4ba45d720 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -159,9 +159,10 @@ 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 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 75906988f..e1eab012c 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -94,7 +94,7 @@ object Type { } } - // TODO check if we need to ad type parameters to function type info + // TODO check if we need to add type parameters to function type info case class FunctionT(args: Vector[Type], result: Type) extends PrettyType(s"func(${args.mkString(",")}) $result") 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 403b59cdb..7cf73835c 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 @@ -85,10 +85,10 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => 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, ctx)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint, ctx)) - case (NilType, TypeParameterT(_, constraint, ctx)) => assignableToAll(NilType, TypeSet.from(constraint, ctx)) - case (l, TypeParameterT(_, constraint, ctx)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint, ctx)) - case (TypeParameterT(_, constraint, ctx), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint, ctx), r) + case (UNTYPED_INT_CONST, TypeParameterT(_, constraint, ctx)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint, this)) + case (NilType, TypeParameterT(_, constraint, ctx)) => assignableToAll(NilType, TypeSet.from(constraint, this)) + case (l, TypeParameterT(_, constraint, ctx)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint, this)) + case (TypeParameterT(_, constraint, ctx), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint, this), r) // for ghost types case (BooleanT, AssertionT) => successProp 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 049ccde34..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 @@ -52,7 +52,7 @@ trait Comparability extends BaseProperty { this: TypeInfoImpl => private lazy val strictlyComparableType: Property[Type] = createBinaryProperty("strictly comparable") { case Single(st) => st match { - case t: TypeParameterT => allStrictlyComparableTypes(TypeSet.from(t.constraint, t.context)) + case t: TypeParameterT => allStrictlyComparableTypes(TypeSet.from(t.constraint, this)) case _ => underlyingType(st) match { case t: StructT => structMemberSet(t).collect { 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 23872c025..fbea7deb3 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 @@ -22,8 +22,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val underlyingType: Type => Type = attr[Type, Type] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right)) - case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => - underlyingType(ctx.symbType(t)) // TODO verify this with Felix + case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => underlyingType(ctx.symbType(t)) // TODO verify this with Felix case t => t } 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 3cacc4965..7d88cf994 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,9 @@ trait AmbiguityResolution { this: TypeInfoImpl => case _ => Left(n) }) + case n: PIndexedExp => + 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) 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 efea6baca..22551beb8 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 @@ -181,7 +181,7 @@ trait MemberResolution { this: TypeInfoImpl => AdvancedMemberSet.union { topLevel +: es.map(_.terms).map { case Vector(t: PTypeName) => interfaceMethodSet( - symbType(t) match { + underlyingType(symbType(t)) match { case i: InterfaceT => i case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) // TODO handle this properly (non interface types) }).promoteItf(t.name) 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 index 5e591764e..b5452f767 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -3,25 +3,27 @@ package viper.gobra.frontend.info.implementation.resolution import viper.gobra.frontend.info.base.Type._ import viper.gobra.ast.frontend._ import viper.gobra.frontend.info.ExternalTypeInfo +import viper.gobra.frontend.info.implementation.TypeInfoImpl + +import scala.annotation.tailrec sealed trait TypeSet object TypeSet { case class UnboundedTypeSet(isComparable: Boolean = false) extends TypeSet case class BoundedTypeSet(ts: Set[Type]) extends TypeSet - def from(constraint: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = typeSetFromInterfaceType(constraint, ctx) + def from(constraint: PInterfaceType, ctx: TypeInfoImpl): TypeSet = typeSetFromInterfaceType(constraint, ctx) - private def typeSetFromInterfaceType(inter: PInterfaceType, ctx: ExternalTypeInfo): TypeSet = inter match { + 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: ExternalTypeInfo): TypeSet = + 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: ExternalTypeInfo): TypeSet = term match { + private def typeSetFromTerm(term: PTypeTerm, ctx: TypeInfoImpl): TypeSet = term match { case PNamedOperand(PIdnUse("comparable")) => UnboundedTypeSet(isComparable = true) - case pType: PType => ctx.symbType(pType) match { - case DeclaredT(decl, ctx) => typeSetFromTerm(decl.right, ctx) + case pType: PType => ctx.underlyingType(ctx.symbType(pType)) match { case InterfaceT(i, _) => typeSetFromInterfaceType(i, ctx) case t => BoundedTypeSet(Set(t)) } @@ -63,4 +65,9 @@ object TypeSet { 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 f5e114658..865919c77 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 @@ -15,7 +15,6 @@ import viper.gobra.frontend.info.implementation.resolution.TypeSet import viper.gobra.util.TypeBounds.{BoundedIntegerKind, UnboundedInteger} import viper.gobra.util.{Constants, TypeBounds, Violation} -import scala.collection.immutable.Map.from trait ExprTyping extends BaseTyping { this: TypeInfoImpl => @@ -96,6 +95,66 @@ 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(f@ap.Function(id, symb)) => + wellDefTypeArguments(n, f.typeArgs, symb.decl) + case Some(nt@ap.NamedType(id, symb)) if symb.decl.isInstanceOf[PTypeDef] => + wellDefTypeArguments(n, nt.typeArgs, symb.decl.asInstanceOf[PTypeDef]) + 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] { @@ -193,6 +252,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 { @@ -249,7 +332,7 @@ 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)) => @@ -306,67 +389,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case PBitNegation(op) => isExpr(op).out ++ assignableTo.errors(typ(op), UNTYPED_INT_CONST)(op) - case n : PIndexedExp => resolve(n) match { - case Some(ap.Function(id, symb)) => - error(n, s"got ${n.index.length} type arguments but want ${symb.typeParameters.length}", n.index.length != symb.typeParameters.length) ++ - n.index.zip(n.index.map(asType)).zip(symb.typeParameters).flatMap { - case ((i, None), _) => error(i, s"$i is not a type") - case ((i, Some(idxPType)), typeParam) => satisfies.errors((idxPType, typeParam.constraint))(i) - } - 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 n@PSliceExp(base, low, high, cap) => isExpr(base).out ++ low.fold(noMessages)(isExpr(_).out) ++ high.fold(noMessages)(isExpr(_).out) ++ @@ -447,6 +469,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) @@ -682,34 +716,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 n : PIndexedExp => resolve(n) match { - - - case Some(f@ap.Function(id, symb)) => - // TODO handle type parameter instantiations that have to be inferred - val typeArgs = f.typeArgs.map(typeSymbType) - val substitution = symb.typeParameters.map(_.id).zip(typeArgs).toMap - - FunctionT(symb.args.map(miscType), miscType(symb.result)).substitute(substitution) - - 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") - } - } - case PSliceExp(base, low, high, cap) => val baseType = exprType(base) (underlyingType(baseType), low map exprType, high map exprType, cap map exprType) match { @@ -887,7 +893,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => // PInvoke and thus, `expr` can onlu appear in `n` as an argument lazy val errorMessage = s"violation of assumption: a numeric expression $expr does not occur as an argument of its parent $n" resolve(n) match { - case Some(ap.FunctionCall(_, args)) => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) @@ -1094,6 +1099,13 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"unexpected argument ${expr.exp} of type $t passed to len") } + private[typing] def wellDefTypeArguments(n: PNode, typeArgs: Vector[PType], decl: PWithTypeParameters): Messages = { + error(n, s"got ${typeArgs.length} type arguments but want ${decl.typeParameters.length}", typeArgs.length != decl.typeParameters.length) ++ + typeArgs.zip(typeArgs).zip(decl.typeParameters).flatMap { + case ((i, idxPType), typeParam) => satisfies.errors((idxPType, typeParam.constraint))(i) + } + } + /** * 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/TypeTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/TypeTyping.scala index cb8d92089..05ea8ec78 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 @@ -30,19 +30,10 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => } implicit lazy val wellDefType: WellDefinedness[PType] = createWellDef { - case typ: PParameterizedType => wellDefParameterizedType(typ) case typ: PActualType => wellDefActualType(typ) case typ: PGhostType => wellDefGhostType(typ) } - private[typing] def wellDefParameterizedType(typ: PParameterizedType): Messages = entity(typ.typeName.id) match { - case NamedType(decl, _, _) => - error(typ, s"got ${typ.typeArgs.length} type arguments but want ${decl.typeParameters.length}", typ.typeArgs.length != decl.typeParameters.length) ++ - typ.typeArgs.zip(decl.typeParameters).flatMap { - case (arg, typeParam) => satisfies.errors((arg, typeParam.constraint))(arg) - } - } - private[typing] def wellDefActualType(typ: PActualType): Messages = typ match { case _: PBoolType | _: PIntegerType | _: PFloatType | _: PStringType | _: PPermissionType => noMessages @@ -82,6 +73,11 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => isRecursiveInterface } + case t: PParameterizedType => entity(t.typeName.id) match { + case NamedType(decl, _, _) => + wellDefTypeArguments(t, t.typeArgs, decl) + } + case t: PExpressionAndType => wellDefExprAndType(t).out } @@ -93,19 +89,11 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case _ => t } createTyping { - case typ: PParameterizedType => handleTypeAlias(parameterizedTypeSymbType(typ)) case typ: PActualType => handleTypeAlias(actualTypeSymbType(typ)) case typ: PGhostType => handleTypeAlias(ghostTypeSymbType(typ)) } } - private[typing] def parameterizedTypeSymbType(typ: PParameterizedType): Type = 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[typing] def actualTypeSymbType(typ: PActualType): Type = typ match { case PBoolType() => BooleanT @@ -178,6 +166,30 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case _ => violation(s"expected type, but got $n") } + + case n: PIndexedExp => + resolve(n) match { + case Some(f@ap.Function(id, symb)) => + // TODO handle type parameter instantiations that have to be inferred + val typeArgs = f.typeArgs.map(typeSymbType) + val substitution = symb.typeParameters.map(_.id).zip(typeArgs).toMap + + FunctionT(symb.args.map(miscType), miscType(symb.result)).substitute(substitution) + + case Some(t@ap.NamedType(id, symb)) if symb.decl.isInstanceOf[PTypeDef] => + val typeArgs = t.typeArgs.map(typeSymbType) + val typeDecl = symb.decl.asInstanceOf[PTypeDef] + val substitution = typeDecl.typeParameters.map(_.id).zip(typeArgs).toMap + + underlyingType(symbType(symb.decl.right)).substitute(substitution) + } + + 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 = { diff --git a/src/test/resources/generics/adder.gobra b/src/test/resources/generics/adder.gobra new file mode 100644 index 000000000..843336786 --- /dev/null +++ b/src/test/resources/generics/adder.gobra @@ -0,0 +1,19 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +type AddType interface { + int | int64 | string +} + +// Add can add numbers or strings +func Add[T AddType](a, b T) T { + return a + b +} + +func main() { + Add[int](5, 3) + Add[string]("ab", "cd") +} \ No newline at end of file diff --git a/src/test/resources/generics/container.gobra b/src/test/resources/generics/container.gobra new file mode 100644 index 000000000..4eadfb97c --- /dev/null +++ b/src/test/resources/generics/container.gobra @@ -0,0 +1,12 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +type Container[T any] struct { + val T +} + +func main() { +} diff --git a/src/test/resources/generics/devirtualize1.gobra b/src/test/resources/generics/devirtualize1.gobra new file mode 100644 index 000000000..19832d373 --- /dev/null +++ b/src/test/resources/generics/devirtualize1.gobra @@ -0,0 +1,20 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +type S struct { + x int +} + +func (t *S) M1() { +} + +func F[T any](x T) any { + return x +} + +func main() { + F[*S](&S{}).(interface{ M1() }).M1() // TODO change this to function without instantiation +} diff --git a/src/test/resources/generics/devirtualize2.gobra b/src/test/resources/generics/devirtualize2.gobra new file mode 100644 index 000000000..3ee0ede76 --- /dev/null +++ b/src/test/resources/generics/devirtualize2.gobra @@ -0,0 +1,28 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +type S struct { + x int +} + +func (t *S) M1() { +} +func (t *S) M2() { +} + +type I interface { + M1() +} + +func F[T I](x T) I { + return x +} + +func main() { + F[*S](&S{}).(interface{ M2() }).M2() // TODO change this to function without instantiation +} + +// TODO make it work diff --git a/src/test/resources/generics/dottype.gobra b/src/test/resources/generics/dottype.gobra new file mode 100644 index 000000000..b2cd11fc4 --- /dev/null +++ b/src/test/resources/generics/dottype.gobra @@ -0,0 +1,76 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +func f[T any](x interface{}) T { + return x.(T) +} +func f2[T any](x interface{}) (T, bool) { + t, ok := x.(T) + return t, ok +} + +type I interface { + foo() +} + +type myint int + +func (myint) foo() { +} + +type myfloat float64 + +func (myfloat) foo() { +} + +func g[T I](x I) T { + return x.(T) +} +func g2[T I](x I) (T, bool) { + t, ok := x.(T) + return t, ok +} + +func h[T any](x interface{}) struct{ a, b T } { + return x.(struct{ a, b T }) +} + +func k[T any](x interface{}) interface{ bar() T } { + return x.(interface{ bar() T }) +} + +type mybar int + +func (x mybar) bar() int { + return int(x) +} + +type large struct{ a, b, c, d, e, f int } // TODO failes in function body because is not allowed there + +func main() { + var i interface{} = int(3) + var j I = myint(3) + // var x interface{} = float64(3) TODO fails because float is not identityPreserving + // var y I = myfloat(3) TODO fails because 3 cannot be converted to float (can fix it when using underlyingType in conversion) + + f[int](i) + f2[int](i) + // f2[int](x) + + g[myint](j) + g2[myint](j) + // g2[myint](y) + + var _ = h[int](struct{ a, b int }{3, 5}).a + + k[int](mybar(3)).bar() + + var _ = f[large](large{}).a + l2, ok := f2[large](large{}) + + var _ = l2 + var _ = ok +} diff --git a/src/test/resources/generics/eface.gobra b/src/test/resources/generics/eface.gobra new file mode 100644 index 000000000..46974075b --- /dev/null +++ b/src/test/resources/generics/eface.gobra @@ -0,0 +1,43 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +type E[T any] interface { +} + +func f[T any](x E[T]) interface{} { + return x +} + +func g[T any](x interface{}) E[T] { + return x +} + +type I[T any] interface { + foo() +} + +type myint int + +func (x myint) foo() {} + +func h[T any](x I[T]) interface{ foo() } { + return x +} + +func i[T any](x interface{ foo() }) I[T] { + return x +} + +func main() { + _ = f[int](1) != 1 + _ = f[int](2) != (interface{})(2) + _ = g[int](3) != 3 + _ = g[int](4) != (E[int])(4) + _ = h[int](myint(5)) != myint(5) + _ = h[int](myint(6)) != interface{ foo() }(myint(6)) + _ = i[int](myint(7)) != myint(7) + _ = i[int](myint(8)) != I[int](myint(8)) +} diff --git a/src/test/resources/generics/index.gobra b/src/test/resources/generics/index.gobra new file mode 100644 index 000000000..ac57d02ca --- /dev/null +++ b/src/test/resources/generics/index.gobra @@ -0,0 +1,27 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +// Index returns the index of x in s, or -1 if not found. +func Index[T comparable](s []T, x T) int { + for i, v := range s { + // v and x are type T, which has the comparable + // constraint, so we can use == here. + if v == x { + return i + } + } + return -1 +} + +func main() { + // Index works on a slice of ints + si := []int{10, 20, 15, -10} + Index[int](si, 15) + + // Index also works on a slice of strings + ss := []string{"foo", "bar", "baz"} + Index[string](ss, "hello") +} \ No newline at end of file diff --git a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala index d1f38312f..ef3138839 100644 --- a/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala +++ b/src/test/scala/viper/gobra/parsing/ParserUnitTests.scala @@ -2740,4 +2740,14 @@ class ParserUnitTests extends AnyFunSuite with Matchers with Inside { ))), _, _, _, _) => } } + + 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/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index 0a9f45979..cd3a8089d 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -350,16 +350,16 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { } class TestFrontend { - def singleMemberProgram(member: PMember): PProgram = + def singleMemberProgram(members: Vector[PMember]): PProgram = PProgram( PPackageClause(PPkgDef("pkg")), Vector(), Vector(), - Vector(member) + members ) - def memberTypeInfo(member: PMember): TypeInfoImpl = { - val program = singleMemberProgram(member) + def memberTypeInfo(member: PMember)(otherMembers: Vector[PMember]): TypeInfoImpl = { + val program = singleMemberProgram(member +: otherMembers ) val positions = new Positions val pkg = PPackage( PPackageClause(PPkgDef("pkg")), @@ -373,7 +373,7 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { new TypeInfoImpl(tree, context)(config) } - def wellDefMember(member: PMember) = - memberTypeInfo(member).wellDefMember(member) + def wellDefMember(member: PMember, otherMembers: Vector[PMember] = Vector()) = + memberTypeInfo(member)(otherMembers).wellDefMember(member) } } From 04836b0538b8b23165dc5dcc423266e27e7a840e Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 22 Jun 2023 16:12:33 +0200 Subject: [PATCH 18/37] add fact test --- src/test/resources/generics/fact.gobra | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/resources/generics/fact.gobra diff --git a/src/test/resources/generics/fact.gobra b/src/test/resources/generics/fact.gobra new file mode 100644 index 000000000..259d7a6e4 --- /dev/null +++ b/src/test/resources/generics/fact.gobra @@ -0,0 +1,18 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pkg + +func fact[T interface{ int | int64 | float64 }](n T) T { + if n == 1 { + return 1 + } + return n * fact(n-1) +} + +func main() { + var _ = fact[int](5) // TODO remove instantiation + var _ = fact[int64](5) + var _ = fact[float64](5.0) // TODO remove instantiation +} \ No newline at end of file From 162b2570a5f50622b4356c788e3d5b447f40c781 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 22 Jun 2023 17:09:31 +0200 Subject: [PATCH 19/37] implement simple Go type inference --- .../viper/gobra/frontend/info/base/Type.scala | 6 + .../property/Satisfiability.scala | 17 ++- .../implementation/typing/ExprTyping.scala | 75 ++++++++--- .../implementation/typing/TypeTyping.scala | 3 +- src/test/resources/generics/fact.gobra | 18 --- .../gobra/typing/ExprTypingUnitTests.scala | 124 ++++++++++++++++++ .../gobra/typing/MemberTypingUnitTests.scala | 33 +++++ 7 files changed, 231 insertions(+), 45 deletions(-) delete mode 100644 src/test/resources/generics/fact.gobra 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 e1eab012c..f2d0a15bd 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -216,6 +216,12 @@ object Type { }) } + def uninstantiatedTypeParameters: Seq[TypeParameterT] = { + this.deepCollect({ + case t: TypeParameterT => t + }) + } + override def info: Parser.Info = Source.Parser.Unsourced override def withChildren(children: Seq[Any], pos: Option[(Position, Position)], forceRewrite: Boolean): this.type = { 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 index ed7a0fcfc..2d4375e12 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala @@ -2,27 +2,26 @@ package viper.gobra.frontend.info.implementation.property import org.bitbucket.inkytonik.kiama.util.Messaging.error import viper.gobra.ast.frontend.{PIdnUse, PInterfaceType, PNamedOperand, PType, PTypeElement} -import viper.gobra.frontend.info.base.Type.InterfaceT +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[(PType, PInterfaceType)] = createProperty { + lazy val satisfies: Property[(Type, PInterfaceType)] = createProperty { case (t, PInterfaceType(Vector(PTypeElement(Vector(PNamedOperand(PIdnUse("comparable"))))), methSpecs, _)) => - comparableType.result(symbType(t)) and goImplements.result(t, PInterfaceType(Vector(), methSpecs, Vector())) + comparableType.result(t) and goImplements.result(t, PInterfaceType(Vector(), methSpecs, Vector())) case (t, constraintType) => goImplements.result(t, constraintType) } - private lazy val goImplements: Property[(PType, PInterfaceType)] = createProperty { - case (pType: PType, interfacePType: PInterfaceType) => - val typ = symbType(pType) + private lazy val goImplements: Property[(Type, PInterfaceType)] = createProperty { + case (typ: Type, interfacePType: PInterfaceType) => val interfaceTypeSet = TypeSet.from(interfacePType, this) - (pType match { - case i: PInterfaceType => - failedProp("is not a subset of the allowed type set", !TypeSet.isSubset(TypeSet.from(i, this), interfaceTypeSet)) + (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 syntaxImplements(typ, InterfaceT(interfacePType, this)) 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 865919c77..5592c667c 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,6 +7,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, message, 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._ @@ -37,8 +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 => error(n,s"cannot use generic function $id without instantiation", - !tree.parent(n).head.isInstanceOf[PIndexedExp]) + 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 @@ -99,9 +103,12 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PIndexedExp => resolve(n) match { case Some(f@ap.Function(id, symb)) => - wellDefTypeArguments(n, f.typeArgs, symb.decl) + tree.parent(n).head match { + case _: PInvoke => wellDefPartialIndexTypeArguments(n, symb.decl, f.typeArgs) + case _ => wellDefFullIndexTypeArguments(n, symb.decl, f.typeArgs) + } case Some(nt@ap.NamedType(id, symb)) if symb.decl.isInstanceOf[PTypeDef] => - wellDefTypeArguments(n, nt.typeArgs, symb.decl.asInstanceOf[PTypeDef]) + wellDefFullIndexTypeArguments(n, symb.decl.asInstanceOf[PTypeDef], nt.typeArgs) case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { val baseType = exprType(base) val idxType = exprType(index) @@ -339,13 +346,32 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => 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 { - // TODO handle this - 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(id, symb) => + if (f.uninstantiatedTypeParameters.isEmpty) (noMessages, f) + else { + // do type inference + val typeMap = args.filter(isTypeParameter).zip(argTypes).map { + case (TypeParameterT(id, _, _), typ) => (PIdnDef(id.name), typ) + }.toMap[PIdnDef, Type] + + val inferredType = f.substitute(typeMap) + + (wellDefTypeArguments(callee, symb.decl, typeMap) ++ inferredType.uninstantiatedTypeParameters.flatMap(typeParam => { + error(n, s"cannot infer ${typeParam.id}") + }), 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") } @@ -703,10 +729,17 @@ 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 { - // TODO handle this - case FunctionT(_, res) => res + case f: FunctionT => pattern match { + case fc: FunctionCall => + // do type inference + val typeMap = f.args.filter(isTypeParameter).zip(fc.args.map(exprType)).map { + case (TypeParameterT(id, _, _), typ) => (PIdnDef(id.name), typ) + }.toMap[PIdnDef, Type] + 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 @@ -1099,11 +1132,21 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"unexpected argument ${expr.exp} of type $t passed to len") } - private[typing] def wellDefTypeArguments(n: PNode, typeArgs: Vector[PType], decl: PWithTypeParameters): Messages = { + 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) ++ - typeArgs.zip(typeArgs).zip(decl.typeParameters).flatMap { - case ((i, idxPType), typeParam) => satisfies.errors((idxPType, typeParam.constraint))(i) - } + 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) + } + + 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 + }) } /** 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 05ea8ec78..ac3ea2830 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 @@ -75,7 +75,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case t: PParameterizedType => entity(t.typeName.id) match { case NamedType(decl, _, _) => - wellDefTypeArguments(t, t.typeArgs, decl) + wellDefFullIndexTypeArguments(t, decl, t.typeArgs) } case t: PExpressionAndType => wellDefExprAndType(t).out @@ -170,7 +170,6 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PIndexedExp => resolve(n) match { case Some(f@ap.Function(id, symb)) => - // TODO handle type parameter instantiations that have to be inferred val typeArgs = f.typeArgs.map(typeSymbType) val substitution = symb.typeParameters.map(_.id).zip(typeArgs).toMap diff --git a/src/test/resources/generics/fact.gobra b/src/test/resources/generics/fact.gobra deleted file mode 100644 index 259d7a6e4..000000000 --- a/src/test/resources/generics/fact.gobra +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -func fact[T interface{ int | int64 | float64 }](n T) T { - if n == 1 { - return 1 - } - return n * fact(n-1) -} - -func main() { - var _ = fact[int](5) // TODO remove instantiation - var _ = fact[int64](5) - var _ = fact[float64](5.0) // TODO remove instantiation -} \ No newline at end of file diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 478d6092c..5d7dc3641 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -4065,6 +4065,130 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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) + } + + PIfStmt(Vector(PIfClause(None, PEquals(PNamedOperand(PIdnUse("n")), PIntLit(BigInt(1))), PBlock(Vector( /* * Stubs, mocks, and other test setup */ class TestFrontend { diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index cd3a8089d..e495b1776 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -349,6 +349,39 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { 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( From b00f8fb8e3324db4ede9e4a698a9c520a684a541 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 22 Jun 2023 17:34:33 +0200 Subject: [PATCH 20/37] adjust GhostErasureUnitTest --- .../scala/viper/gobra/erasing/GhostErasureUnitTests.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala index f65633b21..c8a8f07ad 100644 --- a/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala +++ b/src/test/scala/viper/gobra/erasing/GhostErasureUnitTests.scala @@ -326,6 +326,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), @@ -363,7 +364,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 { @@ -418,8 +419,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) From 1ed090dd7c9a7d1cbfb73c1b70c2cad852d5975b Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 22 Jun 2023 17:46:13 +0200 Subject: [PATCH 21/37] Trigger CI/CD --- removeme | 1 + 1 file changed, 1 insertion(+) create mode 100644 removeme diff --git a/removeme b/removeme new file mode 100644 index 000000000..69d2df5dc --- /dev/null +++ b/removeme @@ -0,0 +1 @@ +trigger CI From 1ed447173ec30c45fa9804165fba9738952c4fc8 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 6 Jul 2023 16:41:55 +0200 Subject: [PATCH 22/37] [skip ci] remove lost line --- src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala index 5d7dc3641..d3c1ce87d 100644 --- a/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/ExprTypingUnitTests.scala @@ -4188,7 +4188,6 @@ class ExprTypingUnitTests extends AnyFunSuite with Matchers with Inside { assert(frontend.wellDefExpr(expr)(Vector(), Vector(functionDecl)).valid) } - PIfStmt(Vector(PIfClause(None, PEquals(PNamedOperand(PIdnUse("n")), PIntLit(BigInt(1))), PBlock(Vector( /* * Stubs, mocks, and other test setup */ class TestFrontend { From 9e21e21c9b0daf6cfa64cfd2ca22af18a613b33a Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 6 Jul 2023 17:54:14 +0200 Subject: [PATCH 23/37] fix bug introduced in ghost assignability --- .../typing/ghost/separation/GhostAssignability.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 962fdc6ac..f935bfed0 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 @@ -97,9 +97,9 @@ 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", index.map(exprOrType).forall { - case Left(expression) => !ghostExprResultClassification(expression) - case Right(pType) => !ghostTypeClassification(pType) + error(left, "ghost error: ghost index are not permitted in index expressions", index.map(exprOrType).exists { + case Left(expression) => ghostExprResultClassification(expression) + case Right(pType) => ghostTypeClassification(pType) }) case PNamedOperand(id) => // x := e ~ ghost(e) ==> ghost(x) From 26e627c1421ae1d10c37a2850b7d1dba681c2c7e Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 6 Jul 2023 18:57:05 +0200 Subject: [PATCH 24/37] fix printing of types --- src/main/scala/viper/gobra/frontend/info/base/Type.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 f2d0a15bd..a82dd6f16 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -60,9 +60,9 @@ 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(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends Type + case class AdtClauseT(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends PrettyType(decl.id.toString) case class MapT(key: Type, elem: Type) extends PrettyType(s"map[$key]$elem") @@ -116,6 +116,7 @@ object Type { case class InternalTupleT(ts: Vector[Type]) extends PrettyType(s"(${ts.mkString(",")})") + // TODO decide how to display this (define toString) case class InternalSingleMulti(sin: Type, mul: InternalTupleT) extends Type case class ImportT(decl: PImport) extends PrettyType(decl.formatted) @@ -247,5 +248,8 @@ object Type { val newNode = constructorMirror(children: _*) newNode.asInstanceOf[this.type] } + + // Override toString method to prevent that the toString method of the internal Node is used + override def toString: String = ??? } } From 30fe086292f55f88584d10cee54a601b10bef577 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 17:21:12 +0200 Subject: [PATCH 25/37] fix type inference --- src/main/scala/viper/gobra/frontend/info/base/Type.scala | 7 ++++--- .../info/implementation/property/UnderlyingType.scala | 2 +- .../info/implementation/resolution/MemberResolution.scala | 2 +- .../frontend/info/implementation/typing/ExprTyping.scala | 6 +++--- 4 files changed, 9 insertions(+), 8 deletions(-) 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 a82dd6f16..3ff0e2e0a 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -217,10 +217,11 @@ object Type { }) } - def uninstantiatedTypeParameters: Seq[TypeParameterT] = { + def uninstantiatedTypeParameters(symb: SymbolTable.WithTypeParameters): Seq[PIdnDef] = { + // need symbol table entry to filter out type parameters that are not from own definitions (these could be type parameters from a function body) this.deepCollect({ - case t: TypeParameterT => t - }) + case t: TypeParameterT => t.id + }).intersect(symb.typeParameters.map(_.id)) } override def info: Parser.Info = Source.Parser.Unsourced 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 fbea7deb3..6139fd945 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 @@ -213,7 +213,7 @@ 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 } } 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 22551beb8..1bcefd071 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 @@ -185,7 +185,7 @@ trait MemberResolution { this: TypeInfoImpl => case i: InterfaceT => i case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) // TODO handle this properly (non interface types) }).promoteItf(t.name) - case _ => AdvancedMemberSet.empty[TypeMember] // TODO handle this properly (union types, underlying types) + case _ => AdvancedMemberSet.empty[TypeMember] // TODO implement nameless interfaces } } } 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 5592c667c..d6fe82e65 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 @@ -352,7 +352,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case f@FunctionT(args, _) => val (inferenceErrors: Messages, inferredFunctionType: FunctionT) = c.callee match { case ap.Function(id, symb) => - if (f.uninstantiatedTypeParameters.isEmpty) (noMessages, f) + if (f.uninstantiatedTypeParameters(symb).isEmpty) (noMessages, f) else { // do type inference val typeMap = args.filter(isTypeParameter).zip(argTypes).map { @@ -361,8 +361,8 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val inferredType = f.substitute(typeMap) - (wellDefTypeArguments(callee, symb.decl, typeMap) ++ inferredType.uninstantiatedTypeParameters.flatMap(typeParam => { - error(n, s"cannot infer ${typeParam.id}") + (wellDefTypeArguments(callee, symb.decl, typeMap) ++ inferredType.uninstantiatedTypeParameters(symb).flatMap(typeParam => { + error(n, s"cannot infer ${typeParam}") }), inferredType) } case _ => (noMessages, f) From ee2cf0a3d503e378b9df5f9423f3df224a2f7738 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 18:08:30 +0200 Subject: [PATCH 26/37] Add type parameters to the desugar --- removeme | 1 - .../viper/gobra/ast/frontend/PrettyPrinter.scala | 1 + src/main/scala/viper/gobra/ast/internal/Program.scala | 11 +++++++++++ src/main/scala/viper/gobra/frontend/Desugar.scala | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) delete mode 100644 removeme diff --git a/removeme b/removeme deleted file mode 100644 index 69d2df5dc..000000000 --- a/removeme +++ /dev/null @@ -1 +0,0 @@ -trigger CI diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index f1463b426..d5a138035 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -626,6 +626,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) diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index a23f14046..c1e0fd36f 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1376,6 +1376,17 @@ 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") { + + /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */ + 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 c7a34bdc8..e8d076b90 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -3777,6 +3777,8 @@ object Desugar { case Type.PermissionT => in.PermissionT(addrMod) + case Type.TypeParameterT(id, _, _) => in.TypeParameterT(id.name, addrMod) + case _ => Violation.violation(s"got unexpected type $t") } From d9f6eed6fcc61c114b49d7f915239ed81a883b0c Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 18:15:08 +0200 Subject: [PATCH 27/37] added some tests from master --- src/main/resources/stubs/strconv/atoi.gobra | 1 + src/main/resources/stubs/strings/strings.gobra | 1 + .../regressions/features/closures/closures-calldesc2.gobra | 1 + .../regressions/features/closures/closures-calldesc4-map.gobra | 1 + 4 files changed, 4 insertions(+) diff --git a/src/main/resources/stubs/strconv/atoi.gobra b/src/main/resources/stubs/strconv/atoi.gobra index 3b94ea29d..454e456e0 100644 --- a/src/main/resources/stubs/strconv/atoi.gobra +++ b/src/main/resources/stubs/strconv/atoi.gobra @@ -44,6 +44,7 @@ pure func (e *NumError) Unwrap() error { return e.Err } ghost requires exp >= 0 ensures res == (exp == 0 ? 1 : (base * Exp(base, exp - 1))) +decreases exp pure func Exp(base int, exp int) (res int) { return exp == 0 ? 1 : (base * Exp(base, exp - 1)) } diff --git a/src/main/resources/stubs/strings/strings.gobra b/src/main/resources/stubs/strings/strings.gobra index 22dbf3819..0307bf577 100644 --- a/src/main/resources/stubs/strings/strings.gobra +++ b/src/main/resources/stubs/strings/strings.gobra @@ -202,6 +202,7 @@ func Map(mapping func(rune) rune, s string) string // the result of (len(s) * count) overflows. requires count >= 0 ensures res == (count == 0? "" : s + Repeat(s, count - 1)) +decreases count pure func Repeat(s string, count int) (res string) /*{ if count == 0 { return "" diff --git a/src/test/resources/regressions/features/closures/closures-calldesc2.gobra b/src/test/resources/regressions/features/closures/closures-calldesc2.gobra index 6f39c6b9f..bc8ffc64c 100644 --- a/src/test/resources/regressions/features/closures/closures-calldesc2.gobra +++ b/src/test/resources/regressions/features/closures/closures-calldesc2.gobra @@ -33,6 +33,7 @@ func hof(ghost cs Calls, f func(ghost seq[int], int)int)(res int) { ghost ensures forall k int :: k > 0 && len(s) == k ==> res == s[k-1] + seqSum(s[:(k-1)]) +decreases len(s) pure func seqSum(s seq[int]) (res int) { return len(s) == 0 ? 0 : (s[len(s)-1] + seqSum(s[:(len(s)-1)])) } diff --git a/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra b/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra index ebfe9f7f8..53c6d6e88 100644 --- a/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra +++ b/src/test/resources/regressions/features/closures/closures-calldesc4-map.gobra @@ -112,6 +112,7 @@ func test2() { ghost ensures forall k int :: k > 0 && len(s) == k ==> res == s[k-1] + seqSum(s[:(k-1)]) +decreases len(s) pure func seqSum(s seq[int]) (res int) { return len(s) == 0 ? 0 : (s[len(s)-1] + seqSum(s[:(len(s)-1)])) } From 3725a9b0fb2327a5a2dbced1a9074df176b7799d Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 18:20:58 +0200 Subject: [PATCH 28/37] remove change to be consistent with master --- src/main/scala/viper/gobra/frontend/info/base/Type.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3ff0e2e0a..a921620cd 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -60,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 PrettyType("adt{...}") + case class AdtT(decl: PAdtType, context: ExternalTypeInfo) extends Type case class AdtClauseT(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends PrettyType(decl.id.toString) From d0fd09abbb30072c2151a2e3209e0f7aa6f4aa3a Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 18:47:46 +0200 Subject: [PATCH 29/37] Revert "remove change to be consistent with master" This reverts commit 3725a9b0fb2327a5a2dbced1a9074df176b7799d. --- src/main/scala/viper/gobra/frontend/info/base/Type.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a921620cd..3ff0e2e0a 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -60,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(fields: Map[String, Type], decl: PAdtClause, adtT: PAdtType, context: ExternalTypeInfo) extends PrettyType(decl.id.toString) From 91da1d20bff4a0c568e0fe24f5307500397fef7f Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 19:35:50 +0200 Subject: [PATCH 30/37] clean up some stuff --- .../scala/viper/gobra/ast/frontend/Ast.scala | 2 - .../gobra/ast/frontend/PrettyPrinter.scala | 1 - .../viper/gobra/ast/internal/Program.scala | 3 - .../scala/viper/gobra/frontend/Desugar.scala | 4 +- .../viper/gobra/frontend/info/base/Type.scala | 19 +++-- .../implementation/property/Implements.scala | 2 +- .../property/UnderlyingType.scala | 5 +- .../resolution/MemberResolution.scala | 4 +- .../implementation/typing/ExprTyping.scala | 22 ++---- .../info/implementation/typing/IdTyping.scala | 6 +- .../ghost/separation/GhostWellDef.scala | 1 - src/test/resources/generics/adder.gobra | 19 ----- src/test/resources/generics/container.gobra | 12 --- .../resources/generics/devirtualize1.gobra | 20 ----- .../resources/generics/devirtualize2.gobra | 28 ------- src/test/resources/generics/dottype.gobra | 76 ------------------- src/test/resources/generics/eface.gobra | 43 ----------- src/test/resources/generics/index.gobra | 27 ------- 18 files changed, 31 insertions(+), 263 deletions(-) delete mode 100644 src/test/resources/generics/adder.gobra delete mode 100644 src/test/resources/generics/container.gobra delete mode 100644 src/test/resources/generics/devirtualize1.gobra delete mode 100644 src/test/resources/generics/devirtualize2.gobra delete mode 100644 src/test/resources/generics/dottype.gobra delete mode 100644 src/test/resources/generics/eface.gobra delete mode 100644 src/test/resources/generics/index.gobra diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index c1326fe84..fd2d9d235 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -766,8 +766,6 @@ case class PTypeElement(terms: Vector[PTypeTerm]) extends PInterfaceClause sealed trait PTypeTerm extends PNode -case class PUnderlyingType(typ: PType) extends PTypeTerm // TODO implement this - // 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. case class PMethodSig(id: PIdnDef, args: Vector[PParameter], result: PResult, spec: PFunctionSpec, isGhost: Boolean) extends PInterfaceClause with PDependentDef with PScope with PCodeRootWithResult diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index d5a138035..3a7906eca 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -692,7 +692,6 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter def showTypeTerm(n: PTypeTerm): Doc = n match { case t: PType => showType(t) - case PUnderlyingType(t: PType) => tilde <> showType(t) } // ids diff --git a/src/main/scala/viper/gobra/ast/internal/Program.scala b/src/main/scala/viper/gobra/ast/internal/Program.scala index c1e0fd36f..c78e0ce7c 100644 --- a/src/main/scala/viper/gobra/ast/internal/Program.scala +++ b/src/main/scala/viper/gobra/ast/internal/Program.scala @@ -1377,13 +1377,10 @@ case object SortT extends PrettyType("sort") { } case class TypeParameterT(name: String, addressability: Addressability) extends PrettyType(s"$name") { - - /** Returns whether 'this' is equals to 't' without considering the addressability modifier of the types. */ override def equalsWithoutMod(t: Type): Boolean = t match { case TypeParameterT(n, _) => n == name case _ => false } - override def withAddressability(newAddressability: Addressability): Type = TypeParameterT(name, newAddressability) } diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index e8d076b90..4b932f712 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2427,7 +2427,7 @@ object Desugar { 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 function case properly here + // TODO handle instantiated generic functions here in the future } } @@ -3748,7 +3748,7 @@ object Desugar { 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) => // TODO handle this + case Type.FunctionT(args, result) => val res = result match { case InternalTupleT(r) => r case r: Type => Vector(r) 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 3ff0e2e0a..6c1cba632 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/Type.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/Type.scala @@ -8,7 +8,7 @@ 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, PIdnDef, PImport, PInterfaceType, PNode, PStructType, PTypeDecl, PTypeElement} +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 @@ -94,7 +94,6 @@ object Type { } } - // TODO check if we need to add type parameters to function type info case class FunctionT(args: Vector[Type], result: Type) extends PrettyType(s"func(${args.mkString(",")}) $result") @@ -116,7 +115,6 @@ object Type { case class InternalTupleT(ts: Vector[Type]) extends PrettyType(s"(${ts.mkString(",")})") - // TODO decide how to display this (define toString) case class InternalSingleMulti(sin: Type, mul: InternalTupleT) extends Type case class ImportT(decl: PImport) extends PrettyType(decl.formatted) @@ -211,14 +209,23 @@ object Type { 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] = { - // need symbol table entry to filter out type parameters that are not from own definitions (these could be type parameters from a function body) + /** + * 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)) @@ -250,7 +257,9 @@ object Type { newNode.asInstanceOf[this.type] } - // Override toString method to prevent that the toString method of the internal Node is used + /** + * 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/property/Implements.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Implements.scala index 9f764cca2..d4db1d6ce 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 @@ -47,7 +47,7 @@ trait Implements { this: TypeInfoImpl => } case _ => } - case _ => failedProp("Not implemented yet") // TODO implement other cases + case _ => } } 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 6139fd945..085669d2e 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 @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.property -import viper.gobra.ast.frontend.{PDeref, PDot, PEmbeddedName, PEmbeddedPointer, PEmbeddedType, PInterfaceType, PNamedOperand, PStructType, PType, PTypeAlias, PTypeDecl, PTypeDef} +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, TypeParameterT} @@ -22,7 +22,7 @@ trait UnderlyingType { this: TypeInfoImpl => lazy val underlyingType: Type => Type = attr[Type, Type] { case Single(DeclaredT(t: PTypeDecl, context: ExternalTypeInfo)) => underlyingType(context.symbType(t.right)) - case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => underlyingType(ctx.symbType(t)) // TODO verify this with Felix + case Single(TypeParameterT(_, t: PInterfaceType, ctx)) => underlyingType(ctx.symbType(t)) case t => t } @@ -45,7 +45,6 @@ trait UnderlyingType { this: TypeInfoImpl => case value : PType => Some(value, this) case _ => None } - // TODO handle this for type parameters case _ => None // type not defined } case PDot(_, id) => entity(id) match { 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 1bcefd071..8b2b71d9f 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 @@ -183,9 +183,9 @@ trait MemberResolution { this: TypeInfoImpl => case Vector(t: PTypeName) => interfaceMethodSet( underlyingType(symbType(t)) match { case i: InterfaceT => i - case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) // TODO handle this properly (non interface types) + case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) }).promoteItf(t.name) - case _ => AdvancedMemberSet.empty[TypeMember] // TODO implement nameless interfaces + case _ => AdvancedMemberSet.empty[TypeMember] // TODO implement nameless interfaces in the future } } } 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 d6fe82e65..0c81a6530 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 @@ -6,7 +6,7 @@ package viper.gobra.frontend.info.implementation.typing -import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, check, error, message, noMessages} +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} @@ -102,12 +102,12 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PIndexedExp => resolve(n) match { - case Some(f@ap.Function(id, symb)) => + case Some(f@ap.Function(_, symb)) => tree.parent(n).head match { case _: PInvoke => wellDefPartialIndexTypeArguments(n, symb.decl, f.typeArgs) case _ => wellDefFullIndexTypeArguments(n, symb.decl, f.typeArgs) } - case Some(nt@ap.NamedType(id, symb)) if symb.decl.isInstanceOf[PTypeDef] => + case Some(nt@ap.NamedType(_, symb)) if symb.decl.isInstanceOf[PTypeDef] => wellDefFullIndexTypeArguments(n, symb.decl.asInstanceOf[PTypeDef], nt.typeArgs) case Some(ap.IndexedExp(base, index)) => isExpr(base).out ++ isExpr(index).out ++ { val baseType = exprType(base) @@ -351,7 +351,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val wellTypedArgs = exprType(callee) match { case f@FunctionT(args, _) => val (inferenceErrors: Messages, inferredFunctionType: FunctionT) = c.callee match { - case ap.Function(id, symb) => + case ap.Function(_, symb) => if (f.uninstantiatedTypeParameters(symb).isEmpty) (noMessages, f) else { // do type inference @@ -392,7 +392,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } val pureArgsMsgs = p.args.flatMap(isPureExpr) val argAssignMsgs = exprType(callee) match { - // TODO handle this case FunctionT(args, _) => // TODO: add special assignment if (n.args.isEmpty && args.isEmpty) noMessages else multiAssignableTo.errors(n.args map exprType, args)(n) ++ n.args.flatMap(isExpr(_).out) @@ -637,7 +636,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case p@PPredConstructor(base, _) => { def wellTypedApp(base: PPredConstructorBase): Messages = miscType(base) match { - // TODO handle this case FunctionT(args, AssertionT) => val unappliedPositions = p.args.zipWithIndex.filter(_._1.isEmpty).map(_._2) val givenArgs = p.args.zipWithIndex.filterNot(x => unappliedPositions.contains(x._2)).map(_._1.get) @@ -663,7 +661,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => } else { // the typing function should be defined for these arguments as `msgs` is empty abstractT.typing(givenArgTypes) match { - // TODO handle this case FunctionT(args, AssertionT) => if (givenArgs.isEmpty && args.isEmpty) { noMessages @@ -693,7 +690,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 // TODO verify this with Felix + 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 } @@ -807,7 +804,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => base match { case PFPredBase(id) => idType(id) match { - // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -819,7 +815,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.Predicate | _: ap.ReceivedPredicate | _: ap.ImplicitlyReceivedInterfacePredicate) => val recvWithIdT = exprOrTypeType(p.recvWithId) recvWithIdT match { - // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -830,7 +825,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case Some(_: ap.PredicateExpr) => val recvWithIdT = exprOrTypeType(p.recvWithId) recvWithIdT match { - // TODO handle this case FunctionT(fnArgs, AssertionT) => PredT(fnArgs.zip(args).collect{ case (typ, None) => typ }) case _: AbstractType => @@ -930,7 +924,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) typOfExprOrType(n.base) match { - // TODO handle this case FunctionT(fArgs, _) => if (index >= fArgs.length-1 && fArgs.lastOption.exists(_.isInstanceOf[VariadicT])) { fArgs.lastOption.map(_.asInstanceOf[VariadicT].elem) @@ -958,7 +951,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = args.indexWhere(_.eq(expr)) violation(index >= 0, errorMessage) typOfExprOrType(n.base) match { - // TODO handle this case FunctionT(fArgs, AssertionT) => fArgs.lift(index) case _: AbstractType => /* the abstract type cannot be resolved without creating a loop in kiama for the same reason as above @@ -991,7 +983,6 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val index = const.args.indexWhere { _.exists(y => y.eq(expr)) } violation(index >= 0, s"violation of assumption: a numeric expression $expr does not occur as an argument of its parent $const") typ(const.id) match { - // TODO handle this case FunctionT(args, AssertionT) => Some(args(index)) case _: AbstractType => // here too, resolving the abstract type would cause a cycle in kiama @@ -1141,6 +1132,9 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => 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 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 90d8a750c..a69e1ad62 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 @@ -89,7 +89,6 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => }) case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { - // TODO handle this args.forall(wellDefMisc.valid) && miscType.valid(r) }) @@ -139,7 +138,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => wellDefMisc.valid(typ) }) - case TypeParameter(_, _, _) => LocalMessages(noMessages) // TODO handle this + case TypeParameter(_, _, _) => LocalMessages(noMessages) case _: MethodImpl => LocalMessages(noMessages) // not typed @@ -210,8 +209,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") }) - // TODO handle this - case Function(PFunctionDecl(_, typeParameters, args, r, _, _), _, context) => + case Function(PFunctionDecl(_, _, args, r, _, _), _, context) => FunctionT(args map context.typ, context.typ(r)) case Closure(PFunctionLit(_, PClosureDecl(args, r, _, _)), _, context) => 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 207d853ad..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,6 @@ trait GhostWellDef { this: TypeInfoImpl => exp.forall(wellGhostSeparated.valid) }) - // TODO check this with Felix case Function(PFunctionDecl(_, _, args, r, _, _), _, _) => unsafeMessage(! { args.forall(wellGhostSeparated.valid) && wellGhostSeparated.valid(r) }) diff --git a/src/test/resources/generics/adder.gobra b/src/test/resources/generics/adder.gobra deleted file mode 100644 index 843336786..000000000 --- a/src/test/resources/generics/adder.gobra +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -type AddType interface { - int | int64 | string -} - -// Add can add numbers or strings -func Add[T AddType](a, b T) T { - return a + b -} - -func main() { - Add[int](5, 3) - Add[string]("ab", "cd") -} \ No newline at end of file diff --git a/src/test/resources/generics/container.gobra b/src/test/resources/generics/container.gobra deleted file mode 100644 index 4eadfb97c..000000000 --- a/src/test/resources/generics/container.gobra +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -type Container[T any] struct { - val T -} - -func main() { -} diff --git a/src/test/resources/generics/devirtualize1.gobra b/src/test/resources/generics/devirtualize1.gobra deleted file mode 100644 index 19832d373..000000000 --- a/src/test/resources/generics/devirtualize1.gobra +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -type S struct { - x int -} - -func (t *S) M1() { -} - -func F[T any](x T) any { - return x -} - -func main() { - F[*S](&S{}).(interface{ M1() }).M1() // TODO change this to function without instantiation -} diff --git a/src/test/resources/generics/devirtualize2.gobra b/src/test/resources/generics/devirtualize2.gobra deleted file mode 100644 index 3ee0ede76..000000000 --- a/src/test/resources/generics/devirtualize2.gobra +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -type S struct { - x int -} - -func (t *S) M1() { -} -func (t *S) M2() { -} - -type I interface { - M1() -} - -func F[T I](x T) I { - return x -} - -func main() { - F[*S](&S{}).(interface{ M2() }).M2() // TODO change this to function without instantiation -} - -// TODO make it work diff --git a/src/test/resources/generics/dottype.gobra b/src/test/resources/generics/dottype.gobra deleted file mode 100644 index b2cd11fc4..000000000 --- a/src/test/resources/generics/dottype.gobra +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -func f[T any](x interface{}) T { - return x.(T) -} -func f2[T any](x interface{}) (T, bool) { - t, ok := x.(T) - return t, ok -} - -type I interface { - foo() -} - -type myint int - -func (myint) foo() { -} - -type myfloat float64 - -func (myfloat) foo() { -} - -func g[T I](x I) T { - return x.(T) -} -func g2[T I](x I) (T, bool) { - t, ok := x.(T) - return t, ok -} - -func h[T any](x interface{}) struct{ a, b T } { - return x.(struct{ a, b T }) -} - -func k[T any](x interface{}) interface{ bar() T } { - return x.(interface{ bar() T }) -} - -type mybar int - -func (x mybar) bar() int { - return int(x) -} - -type large struct{ a, b, c, d, e, f int } // TODO failes in function body because is not allowed there - -func main() { - var i interface{} = int(3) - var j I = myint(3) - // var x interface{} = float64(3) TODO fails because float is not identityPreserving - // var y I = myfloat(3) TODO fails because 3 cannot be converted to float (can fix it when using underlyingType in conversion) - - f[int](i) - f2[int](i) - // f2[int](x) - - g[myint](j) - g2[myint](j) - // g2[myint](y) - - var _ = h[int](struct{ a, b int }{3, 5}).a - - k[int](mybar(3)).bar() - - var _ = f[large](large{}).a - l2, ok := f2[large](large{}) - - var _ = l2 - var _ = ok -} diff --git a/src/test/resources/generics/eface.gobra b/src/test/resources/generics/eface.gobra deleted file mode 100644 index 46974075b..000000000 --- a/src/test/resources/generics/eface.gobra +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -type E[T any] interface { -} - -func f[T any](x E[T]) interface{} { - return x -} - -func g[T any](x interface{}) E[T] { - return x -} - -type I[T any] interface { - foo() -} - -type myint int - -func (x myint) foo() {} - -func h[T any](x I[T]) interface{ foo() } { - return x -} - -func i[T any](x interface{ foo() }) I[T] { - return x -} - -func main() { - _ = f[int](1) != 1 - _ = f[int](2) != (interface{})(2) - _ = g[int](3) != 3 - _ = g[int](4) != (E[int])(4) - _ = h[int](myint(5)) != myint(5) - _ = h[int](myint(6)) != interface{ foo() }(myint(6)) - _ = i[int](myint(7)) != myint(7) - _ = i[int](myint(8)) != I[int](myint(8)) -} diff --git a/src/test/resources/generics/index.gobra b/src/test/resources/generics/index.gobra deleted file mode 100644 index ac57d02ca..000000000 --- a/src/test/resources/generics/index.gobra +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package pkg - -// Index returns the index of x in s, or -1 if not found. -func Index[T comparable](s []T, x T) int { - for i, v := range s { - // v and x are type T, which has the comparable - // constraint, so we can use == here. - if v == x { - return i - } - } - return -1 -} - -func main() { - // Index works on a slice of ints - si := []int{10, 20, 15, -10} - Index[int](si, 15) - - // Index also works on a slice of strings - ss := []string{"foo", "bar", "baz"} - Index[string](ss, "hello") -} \ No newline at end of file From a13e324e28794a871097ae306f8b5cfc8f82bf73 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 19:59:39 +0200 Subject: [PATCH 31/37] regenerate parser after merge --- src/main/antlr4/.antlr/GoLexer.java | 606 ++ .../java/viper/gobra/frontend/GobraLexer.java | 2 +- .../viper/gobra/frontend/GobraParser.java | 5546 +++++++++-------- .../frontend/GobraParserBaseVisitor.java | 2 +- .../gobra/frontend/GobraParserVisitor.java | 2 +- 5 files changed, 3669 insertions(+), 2489 deletions(-) create mode 100644 src/main/antlr4/.antlr/GoLexer.java diff --git a/src/main/antlr4/.antlr/GoLexer.java b/src/main/antlr4/.antlr/GoLexer.java new file mode 100644 index 000000000..c58ff8645 --- /dev/null +++ b/src/main/antlr4/.antlr/GoLexer.java @@ -0,0 +1,606 @@ +// Generated from s:\GitHub\gobra\src\main\antlr4\GoLexer.g4 by ANTLR 4.9.2 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class GoLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BREAK=1, DEFAULT=2, FUNC=3, INTERFACE=4, SELECT=5, CASE=6, DEFER=7, GO=8, + MAP=9, STRUCT=10, CHAN=11, ELSE=12, GOTO=13, PACKAGE=14, SWITCH=15, CONST=16, + FALLTHROUGH=17, IF=18, RANGE=19, TYPE=20, CONTINUE=21, FOR=22, IMPORT=23, + RETURN=24, VAR=25, NIL_LIT=26, IDENTIFIER=27, L_PAREN=28, R_PAREN=29, + L_CURLY=30, R_CURLY=31, L_BRACKET=32, R_BRACKET=33, ASSIGN=34, COMMA=35, + SEMI=36, COLON=37, DOT=38, PLUS_PLUS=39, MINUS_MINUS=40, DECLARE_ASSIGN=41, + ELLIPSIS=42, LOGICAL_OR=43, LOGICAL_AND=44, EQUALS=45, NOT_EQUALS=46, + LESS=47, LESS_OR_EQUALS=48, GREATER=49, GREATER_OR_EQUALS=50, OR=51, DIV=52, + MOD=53, LSHIFT=54, RSHIFT=55, BIT_CLEAR=56, EXCLAMATION=57, PLUS=58, MINUS=59, + CARET=60, STAR=61, AMPERSAND=62, RECEIVE=63, DECIMAL_LIT=64, BINARY_LIT=65, + OCTAL_LIT=66, HEX_LIT=67, FLOAT_LIT=68, DECIMAL_FLOAT_LIT=69, HEX_FLOAT_LIT=70, + IMAGINARY_LIT=71, RUNE_LIT=72, BYTE_VALUE=73, OCTAL_BYTE_VALUE=74, HEX_BYTE_VALUE=75, + LITTLE_U_VALUE=76, BIG_U_VALUE=77, RAW_STRING_LIT=78, INTERPRETED_STRING_LIT=79, + WS=80, COMMENT=81, TERMINATOR=82, LINE_COMMENT=83, WS_NLSEMI=84, COMMENT_NLSEMI=85, + LINE_COMMENT_NLSEMI=86, EOS=87, OTHER=88; + public static final int + NLSEMI=1; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "NLSEMI" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", + "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", + "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", + "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", + "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", + "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", + "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", + "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", + "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", + "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", "DECIMALS", + "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", "UNICODE_DIGIT", + "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", + "EOS", "OTHER" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'", + "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", + "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", + "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", + null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", + "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", + "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", + "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", + "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", + "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", + "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", + "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", + "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", + "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", + "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", + "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", + "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", + "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", + "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", + "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", + "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", "EOS", "OTHER" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public GoLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "GoLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2Z\u0349\b\1\b\1\4"+ + "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ + "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ + "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ + "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ + " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ + "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+ + "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+ + "=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+ + "I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t"+ + "T\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_"+ + "\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\3\2\3\2\3\2\3\2\3\2\3\2\3\2"+ + "\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7"+ + "\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13"+ + "\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\16\3\16"+ + "\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\24"+ + "\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30"+ + "\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32"+ + "\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\7\34\u017a"+ + "\n\34\f\34\16\34\u017d\13\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3"+ + "\37\3\37\3 \3 \3 \3 \3!\3!\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'"+ + "\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3*\3*\3*\3+\3+\3+\3+\3,\3,\3,\3-\3"+ + "-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\63\3\63\3"+ + "\63\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3\67\38\38\38\39\39\39\3:"+ + "\3:\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3@\3@\3A\3A\3A\5A\u01e5\nA\3A\7A"+ + "\u01e8\nA\fA\16A\u01eb\13A\5A\u01ed\nA\3A\3A\3B\3B\3B\5B\u01f4\nB\3B\6"+ + "B\u01f7\nB\rB\16B\u01f8\3B\3B\3C\3C\5C\u01ff\nC\3C\5C\u0202\nC\3C\6C\u0205"+ + "\nC\rC\16C\u0206\3C\3C\3D\3D\3D\5D\u020e\nD\3D\6D\u0211\nD\rD\16D\u0212"+ + "\3D\3D\3E\3E\5E\u0219\nE\3E\3E\3F\3F\3F\5F\u0220\nF\3F\5F\u0223\nF\3F"+ + "\5F\u0226\nF\3F\3F\3F\5F\u022b\nF\5F\u022d\nF\3G\3G\3G\3G\3G\3H\5H\u0235"+ + "\nH\3H\6H\u0238\nH\rH\16H\u0239\3H\3H\5H\u023e\nH\3H\7H\u0241\nH\fH\16"+ + "H\u0244\13H\5H\u0246\nH\3H\3H\3H\5H\u024b\nH\3H\7H\u024e\nH\fH\16H\u0251"+ + "\13H\5H\u0253\nH\3I\3I\5I\u0257\nI\3I\3I\3J\3J\3J\3J\3J\5J\u0260\nJ\3"+ + "J\3J\3J\3J\3K\3K\3K\5K\u0269\nK\3K\3K\3L\3L\3L\3L\3M\3M\5M\u0273\nM\3"+ + "N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3"+ + "Q\3Q\3Q\3Q\3Q\3R\3R\7R\u0293\nR\fR\16R\u0296\13R\3R\3R\3R\3R\3S\3S\3S"+ + "\7S\u029f\nS\fS\16S\u02a2\13S\3S\3S\3S\3S\3T\6T\u02a9\nT\rT\16T\u02aa"+ + "\3T\3T\3U\3U\3U\3U\7U\u02b3\nU\fU\16U\u02b6\13U\3U\3U\3U\3U\3U\3V\6V\u02be"+ + "\nV\rV\16V\u02bf\3V\3V\3W\3W\3W\3W\7W\u02c8\nW\fW\16W\u02cb\13W\3W\3W"+ + "\3X\3X\3X\3X\5X\u02d3\nX\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y"+ + "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\5Y\u02ef\nY\3Z\3Z\5Z\u02f3\nZ\3Z\7Z"+ + "\u02f6\nZ\fZ\16Z\u02f9\13Z\3[\3[\3\\\3\\\3]\3]\3^\3^\5^\u0303\n^\3^\3"+ + "^\3_\3_\5_\u0309\n_\3`\3`\3a\3a\3b\6b\u0310\nb\rb\16b\u0311\3b\3b\3c\3"+ + "c\3c\3c\7c\u031a\nc\fc\16c\u031d\13c\3c\3c\3c\3c\3c\3d\3d\3d\3d\7d\u0328"+ + "\nd\fd\16d\u032b\13d\3d\3d\3e\6e\u0330\ne\re\16e\u0331\3e\3e\3e\3e\3e"+ + "\7e\u0339\ne\fe\16e\u033c\13e\3e\3e\3e\5e\u0341\ne\3e\3e\3f\3f\3f\3f\3"+ + "f\5\u02b4\u031b\u033a\2g\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f"+ + "\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64"+ + "\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d"+ + "\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088"+ + "E\u008aF\u008cG\u008eH\u0090\2\u0092\2\u0094I\u0096\2\u0098J\u009aK\u009c"+ + "L\u009eM\u00a0N\u00a2O\u00a4P\u00a6Q\u00a8R\u00aaS\u00acT\u00aeU\u00b0"+ + "\2\u00b2\2\u00b4\2\u00b6\2\u00b8\2\u00ba\2\u00bc\2\u00be\2\u00c0\2\u00c2"+ + "\2\u00c4V\u00c6W\u00c8X\u00caY\u00ccZ\4\2\3\23\3\2\63;\3\2\62;\4\2DDd"+ + "d\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f"+ + "\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2"+ + "\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb"+ + "\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68"+ + "\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71"+ + "\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042"+ + "\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951"+ + "\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2"+ + "\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db"+ + "\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2"+ + "\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb"+ + "\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2"+ + "\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb"+ + "\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0"+ + "\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7"+ + "\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3"+ + "\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372"+ + "\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388"+ + "\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9"+ + "\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589"+ + "\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673"+ + "\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe"+ + "\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3"+ + "\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817"+ + "\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862"+ + "\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f"+ + "\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991"+ + "\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb"+ + "\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2"+ + "\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a"+ + "\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b"+ + "\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93"+ + "\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf"+ + "\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e"+ + "\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37"+ + "\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73"+ + "\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b"+ + "\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac"+ + "\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14"+ + "\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63"+ + "\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac"+ + "\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3"+ + "\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f"+ + "\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81"+ + "\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2"+ + "\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84"+ + "\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96"+ + "\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9"+ + "\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2"+ + "\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49"+ + "\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052"+ + "\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072"+ + "\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf"+ + "\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258"+ + "\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292"+ + "\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7"+ + "\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382"+ + "\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681"+ + "\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710"+ + "\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772"+ + "\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882"+ + "\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920"+ + "\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02"+ + "\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d"+ + "\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f"+ + "\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3"+ + "\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22"+ + "\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d"+ + "\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0"+ + "\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd"+ + "\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081"+ + "\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115"+ + "\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a"+ + "\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b"+ + "\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62"+ + "\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29"+ + "\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2"+ + "\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8"+ + "\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007"+ + "\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1"+ + "\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2"+ + "\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e"+ + "\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642"+ + "\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a"+ + "\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809"+ + "\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9"+ + "\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962"+ + "\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1"+ + "\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62"+ + "\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8"+ + "\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2"+ + "\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18"+ + "\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72"+ + "\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f"+ + "\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21"+ + "\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43"+ + "\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94"+ + "\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c"+ + "\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4"+ + "\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082"+ + "\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342"+ + "\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca"+ + "\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529"+ + "\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802"+ + "\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e"+ + "\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6"+ + "\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1"+ + "\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62"+ + "\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37"+ + "\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82"+ + "\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea"+ + "\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3"+ + "\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d"+ + "\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1"+ + "\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a"+ + "\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352"+ + "\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1"+ + "\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602"+ + "\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1"+ + "\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52"+ + "\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a"+ + "\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a"+ + "\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545"+ + "\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2"+ + "\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91"+ + "\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002"+ + "\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c"+ + "\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458"+ + "\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae"+ + "\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509"+ + "\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540"+ + "\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa"+ + "\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736"+ + "\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac"+ + "\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05"+ + "\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b"+ + "\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44"+ + "\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53"+ + "\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d"+ + "\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69"+ + "\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80"+ + "\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead"+ + "\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4"+ + "\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0375\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2"+ + "\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2"+ + "\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3"+ + "\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2"+ + "\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66"+ + "\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2"+ + "\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2"+ + "\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\"+ + "\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2"+ + "\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2"+ + "\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2"+ + "\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a"+ + "\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0094\3\2\2\2\2\u0098\3\2\2"+ + "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ + "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ + "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\3\u00c4\3\2\2\2\3\u00c6\3\2\2\2\3\u00c8"+ + "\3\2\2\2\3\u00ca\3\2\2\2\3\u00cc\3\2\2\2\4\u00ce\3\2\2\2\6\u00d6\3\2\2"+ + "\2\b\u00de\3\2\2\2\n\u00e3\3\2\2\2\f\u00ed\3\2\2\2\16\u00f4\3\2\2\2\20"+ + "\u00f9\3\2\2\2\22\u00ff\3\2\2\2\24\u0102\3\2\2\2\26\u0106\3\2\2\2\30\u010d"+ + "\3\2\2\2\32\u0112\3\2\2\2\34\u0117\3\2\2\2\36\u011c\3\2\2\2 \u0124\3\2"+ + "\2\2\"\u012b\3\2\2\2$\u0131\3\2\2\2&\u013f\3\2\2\2(\u0142\3\2\2\2*\u0148"+ + "\3\2\2\2,\u014d\3\2\2\2.\u0158\3\2\2\2\60\u015c\3\2\2\2\62\u0163\3\2\2"+ + "\2\64\u016c\3\2\2\2\66\u0170\3\2\2\28\u0176\3\2\2\2:\u0180\3\2\2\2<\u0182"+ + "\3\2\2\2>\u0186\3\2\2\2@\u0188\3\2\2\2B\u018c\3\2\2\2D\u018e\3\2\2\2F"+ + "\u0192\3\2\2\2H\u0194\3\2\2\2J\u0196\3\2\2\2L\u0198\3\2\2\2N\u019a\3\2"+ + "\2\2P\u019c\3\2\2\2R\u01a1\3\2\2\2T\u01a6\3\2\2\2V\u01a9\3\2\2\2X\u01ad"+ + "\3\2\2\2Z\u01b0\3\2\2\2\\\u01b3\3\2\2\2^\u01b6\3\2\2\2`\u01b9\3\2\2\2"+ + "b\u01bb\3\2\2\2d\u01be\3\2\2\2f\u01c0\3\2\2\2h\u01c3\3\2\2\2j\u01c5\3"+ + "\2\2\2l\u01c7\3\2\2\2n\u01c9\3\2\2\2p\u01cc\3\2\2\2r\u01cf\3\2\2\2t\u01d2"+ + "\3\2\2\2v\u01d4\3\2\2\2x\u01d6\3\2\2\2z\u01d8\3\2\2\2|\u01da\3\2\2\2~"+ + "\u01dc\3\2\2\2\u0080\u01de\3\2\2\2\u0082\u01ec\3\2\2\2\u0084\u01f0\3\2"+ + "\2\2\u0086\u01fc\3\2\2\2\u0088\u020a\3\2\2\2\u008a\u0218\3\2\2\2\u008c"+ + "\u022c\3\2\2\2\u008e\u022e\3\2\2\2\u0090\u0252\3\2\2\2\u0092\u0254\3\2"+ + "\2\2\u0094\u025f\3\2\2\2\u0096\u0265\3\2\2\2\u0098\u026c\3\2\2\2\u009a"+ + "\u0272\3\2\2\2\u009c\u0274\3\2\2\2\u009e\u0279\3\2\2\2\u00a0\u027e\3\2"+ + "\2\2\u00a2\u0285\3\2\2\2\u00a4\u0290\3\2\2\2\u00a6\u029b\3\2\2\2\u00a8"+ + "\u02a8\3\2\2\2\u00aa\u02ae\3\2\2\2\u00ac\u02bd\3\2\2\2\u00ae\u02c3\3\2"+ + "\2\2\u00b0\u02d2\3\2\2\2\u00b2\u02d4\3\2\2\2\u00b4\u02f0\3\2\2\2\u00b6"+ + "\u02fa\3\2\2\2\u00b8\u02fc\3\2\2\2\u00ba\u02fe\3\2\2\2\u00bc\u0300\3\2"+ + "\2\2\u00be\u0308\3\2\2\2\u00c0\u030a\3\2\2\2\u00c2\u030c\3\2\2\2\u00c4"+ + "\u030f\3\2\2\2\u00c6\u0315\3\2\2\2\u00c8\u0323\3\2\2\2\u00ca\u0340\3\2"+ + "\2\2\u00cc\u0344\3\2\2\2\u00ce\u00cf\7d\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1"+ + "\7g\2\2\u00d1\u00d2\7c\2\2\u00d2\u00d3\7m\2\2\u00d3\u00d4\3\2\2\2\u00d4"+ + "\u00d5\b\2\2\2\u00d5\5\3\2\2\2\u00d6\u00d7\7f\2\2\u00d7\u00d8\7g\2\2\u00d8"+ + "\u00d9\7h\2\2\u00d9\u00da\7c\2\2\u00da\u00db\7w\2\2\u00db\u00dc\7n\2\2"+ + "\u00dc\u00dd\7v\2\2\u00dd\7\3\2\2\2\u00de\u00df\7h\2\2\u00df\u00e0\7w"+ + "\2\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2\u00e2\t\3\2\2\2\u00e3\u00e4"+ + "\7k\2\2\u00e4\u00e5\7p\2\2\u00e5\u00e6\7v\2\2\u00e6\u00e7\7g\2\2\u00e7"+ + "\u00e8\7t\2\2\u00e8\u00e9\7h\2\2\u00e9\u00ea\7c\2\2\u00ea\u00eb\7e\2\2"+ + "\u00eb\u00ec\7g\2\2\u00ec\13\3\2\2\2\u00ed\u00ee\7u\2\2\u00ee\u00ef\7"+ + "g\2\2\u00ef\u00f0\7n\2\2\u00f0\u00f1\7g\2\2\u00f1\u00f2\7e\2\2\u00f2\u00f3"+ + "\7v\2\2\u00f3\r\3\2\2\2\u00f4\u00f5\7e\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7"+ + "\7u\2\2\u00f7\u00f8\7g\2\2\u00f8\17\3\2\2\2\u00f9\u00fa\7f\2\2\u00fa\u00fb"+ + "\7g\2\2\u00fb\u00fc\7h\2\2\u00fc\u00fd\7g\2\2\u00fd\u00fe\7t\2\2\u00fe"+ + "\21\3\2\2\2\u00ff\u0100\7i\2\2\u0100\u0101\7q\2\2\u0101\23\3\2\2\2\u0102"+ + "\u0103\7o\2\2\u0103\u0104\7c\2\2\u0104\u0105\7r\2\2\u0105\25\3\2\2\2\u0106"+ + "\u0107\7u\2\2\u0107\u0108\7v\2\2\u0108\u0109\7t\2\2\u0109\u010a\7w\2\2"+ + "\u010a\u010b\7e\2\2\u010b\u010c\7v\2\2\u010c\27\3\2\2\2\u010d\u010e\7"+ + "e\2\2\u010e\u010f\7j\2\2\u010f\u0110\7c\2\2\u0110\u0111\7p\2\2\u0111\31"+ + "\3\2\2\2\u0112\u0113\7g\2\2\u0113\u0114\7n\2\2\u0114\u0115\7u\2\2\u0115"+ + "\u0116\7g\2\2\u0116\33\3\2\2\2\u0117\u0118\7i\2\2\u0118\u0119\7q\2\2\u0119"+ + "\u011a\7v\2\2\u011a\u011b\7q\2\2\u011b\35\3\2\2\2\u011c\u011d\7r\2\2\u011d"+ + "\u011e\7c\2\2\u011e\u011f\7e\2\2\u011f\u0120\7m\2\2\u0120\u0121\7c\2\2"+ + "\u0121\u0122\7i\2\2\u0122\u0123\7g\2\2\u0123\37\3\2\2\2\u0124\u0125\7"+ + "u\2\2\u0125\u0126\7y\2\2\u0126\u0127\7k\2\2\u0127\u0128\7v\2\2\u0128\u0129"+ + "\7e\2\2\u0129\u012a\7j\2\2\u012a!\3\2\2\2\u012b\u012c\7e\2\2\u012c\u012d"+ + "\7q\2\2\u012d\u012e\7p\2\2\u012e\u012f\7u\2\2\u012f\u0130\7v\2\2\u0130"+ + "#\3\2\2\2\u0131\u0132\7h\2\2\u0132\u0133\7c\2\2\u0133\u0134\7n\2\2\u0134"+ + "\u0135\7n\2\2\u0135\u0136\7v\2\2\u0136\u0137\7j\2\2\u0137\u0138\7t\2\2"+ + "\u0138\u0139\7q\2\2\u0139\u013a\7w\2\2\u013a\u013b\7i\2\2\u013b\u013c"+ + "\7j\2\2\u013c\u013d\3\2\2\2\u013d\u013e\b\22\2\2\u013e%\3\2\2\2\u013f"+ + "\u0140\7k\2\2\u0140\u0141\7h\2\2\u0141\'\3\2\2\2\u0142\u0143\7t\2\2\u0143"+ + "\u0144\7c\2\2\u0144\u0145\7p\2\2\u0145\u0146\7i\2\2\u0146\u0147\7g\2\2"+ + "\u0147)\3\2\2\2\u0148\u0149\7v\2\2\u0149\u014a\7{\2\2\u014a\u014b\7r\2"+ + "\2\u014b\u014c\7g\2\2\u014c+\3\2\2\2\u014d\u014e\7e\2\2\u014e\u014f\7"+ + "q\2\2\u014f\u0150\7p\2\2\u0150\u0151\7v\2\2\u0151\u0152\7k\2\2\u0152\u0153"+ + "\7p\2\2\u0153\u0154\7w\2\2\u0154\u0155\7g\2\2\u0155\u0156\3\2\2\2\u0156"+ + "\u0157\b\26\2\2\u0157-\3\2\2\2\u0158\u0159\7h\2\2\u0159\u015a\7q\2\2\u015a"+ + "\u015b\7t\2\2\u015b/\3\2\2\2\u015c\u015d\7k\2\2\u015d\u015e\7o\2\2\u015e"+ + "\u015f\7r\2\2\u015f\u0160\7q\2\2\u0160\u0161\7t\2\2\u0161\u0162\7v\2\2"+ + "\u0162\61\3\2\2\2\u0163\u0164\7t\2\2\u0164\u0165\7g\2\2\u0165\u0166\7"+ + "v\2\2\u0166\u0167\7w\2\2\u0167\u0168\7t\2\2\u0168\u0169\7p\2\2\u0169\u016a"+ + "\3\2\2\2\u016a\u016b\b\31\2\2\u016b\63\3\2\2\2\u016c\u016d\7x\2\2\u016d"+ + "\u016e\7c\2\2\u016e\u016f\7t\2\2\u016f\65\3\2\2\2\u0170\u0171\7p\2\2\u0171"+ + "\u0172\7k\2\2\u0172\u0173\7n\2\2\u0173\u0174\3\2\2\2\u0174\u0175\b\33"+ + "\2\2\u0175\67\3\2\2\2\u0176\u017b\5\u00be_\2\u0177\u017a\5\u00be_\2\u0178"+ + "\u017a\5\u00c0`\2\u0179\u0177\3\2\2\2\u0179\u0178\3\2\2\2\u017a\u017d"+ + "\3\2\2\2\u017b\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c\u017e\3\2\2\2\u017d"+ + "\u017b\3\2\2\2\u017e\u017f\b\34\2\2\u017f9\3\2\2\2\u0180\u0181\7*\2\2"+ + "\u0181;\3\2\2\2\u0182\u0183\7+\2\2\u0183\u0184\3\2\2\2\u0184\u0185\b\36"+ + "\2\2\u0185=\3\2\2\2\u0186\u0187\7}\2\2\u0187?\3\2\2\2\u0188\u0189\7\177"+ + "\2\2\u0189\u018a\3\2\2\2\u018a\u018b\b \2\2\u018bA\3\2\2\2\u018c\u018d"+ + "\7]\2\2\u018dC\3\2\2\2\u018e\u018f\7_\2\2\u018f\u0190\3\2\2\2\u0190\u0191"+ + "\b\"\2\2\u0191E\3\2\2\2\u0192\u0193\7?\2\2\u0193G\3\2\2\2\u0194\u0195"+ + "\7.\2\2\u0195I\3\2\2\2\u0196\u0197\7=\2\2\u0197K\3\2\2\2\u0198\u0199\7"+ + "<\2\2\u0199M\3\2\2\2\u019a\u019b\7\60\2\2\u019bO\3\2\2\2\u019c\u019d\7"+ + "-\2\2\u019d\u019e\7-\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\b(\2\2\u01a0"+ + "Q\3\2\2\2\u01a1\u01a2\7/\2\2\u01a2\u01a3\7/\2\2\u01a3\u01a4\3\2\2\2\u01a4"+ + "\u01a5\b)\2\2\u01a5S\3\2\2\2\u01a6\u01a7\7<\2\2\u01a7\u01a8\7?\2\2\u01a8"+ + "U\3\2\2\2\u01a9\u01aa\7\60\2\2\u01aa\u01ab\7\60\2\2\u01ab\u01ac\7\60\2"+ + "\2\u01acW\3\2\2\2\u01ad\u01ae\7~\2\2\u01ae\u01af\7~\2\2\u01afY\3\2\2\2"+ + "\u01b0\u01b1\7(\2\2\u01b1\u01b2\7(\2\2\u01b2[\3\2\2\2\u01b3\u01b4\7?\2"+ + "\2\u01b4\u01b5\7?\2\2\u01b5]\3\2\2\2\u01b6\u01b7\7#\2\2\u01b7\u01b8\7"+ + "?\2\2\u01b8_\3\2\2\2\u01b9\u01ba\7>\2\2\u01baa\3\2\2\2\u01bb\u01bc\7>"+ + "\2\2\u01bc\u01bd\7?\2\2\u01bdc\3\2\2\2\u01be\u01bf\7@\2\2\u01bfe\3\2\2"+ + "\2\u01c0\u01c1\7@\2\2\u01c1\u01c2\7?\2\2\u01c2g\3\2\2\2\u01c3\u01c4\7"+ + "~\2\2\u01c4i\3\2\2\2\u01c5\u01c6\7\61\2\2\u01c6k\3\2\2\2\u01c7\u01c8\7"+ + "\'\2\2\u01c8m\3\2\2\2\u01c9\u01ca\7>\2\2\u01ca\u01cb\7>\2\2\u01cbo\3\2"+ + "\2\2\u01cc\u01cd\7@\2\2\u01cd\u01ce\7@\2\2\u01ceq\3\2\2\2\u01cf\u01d0"+ + "\7(\2\2\u01d0\u01d1\7`\2\2\u01d1s\3\2\2\2\u01d2\u01d3\7#\2\2\u01d3u\3"+ + "\2\2\2\u01d4\u01d5\7-\2\2\u01d5w\3\2\2\2\u01d6\u01d7\7/\2\2\u01d7y\3\2"+ + "\2\2\u01d8\u01d9\7`\2\2\u01d9{\3\2\2\2\u01da\u01db\7,\2\2\u01db}\3\2\2"+ + "\2\u01dc\u01dd\7(\2\2\u01dd\177\3\2\2\2\u01de\u01df\7>\2\2\u01df\u01e0"+ + "\7/\2\2\u01e0\u0081\3\2\2\2\u01e1\u01ed\7\62\2\2\u01e2\u01e9\t\2\2\2\u01e3"+ + "\u01e5\7a\2\2\u01e4\u01e3\3\2\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\3\2"+ + "\2\2\u01e6\u01e8\t\3\2\2\u01e7\u01e4\3\2\2\2\u01e8\u01eb\3\2\2\2\u01e9"+ + "\u01e7\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01ed\3\2\2\2\u01eb\u01e9\3\2"+ + "\2\2\u01ec\u01e1\3\2\2\2\u01ec\u01e2\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee"+ + "\u01ef\bA\2\2\u01ef\u0083\3\2\2\2\u01f0\u01f1\7\62\2\2\u01f1\u01f6\t\4"+ + "\2\2\u01f2\u01f4\7a\2\2\u01f3\u01f2\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4"+ + "\u01f5\3\2\2\2\u01f5\u01f7\5\u00ba]\2\u01f6\u01f3\3\2\2\2\u01f7\u01f8"+ + "\3\2\2\2\u01f8\u01f6\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa"+ + "\u01fb\bB\2\2\u01fb\u0085\3\2\2\2\u01fc\u01fe\7\62\2\2\u01fd\u01ff\t\5"+ + "\2\2\u01fe\u01fd\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0204\3\2\2\2\u0200"+ + "\u0202\7a\2\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203\3\2"+ + "\2\2\u0203\u0205\5\u00b6[\2\u0204\u0201\3\2\2\2\u0205\u0206\3\2\2\2\u0206"+ + "\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u0209\bC"+ + "\2\2\u0209\u0087\3\2\2\2\u020a\u020b\7\62\2\2\u020b\u0210\t\6\2\2\u020c"+ + "\u020e\7a\2\2\u020d\u020c\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\3\2"+ + "\2\2\u020f\u0211\5\u00b8\\\2\u0210\u020d\3\2\2\2\u0211\u0212\3\2\2\2\u0212"+ + "\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0214\3\2\2\2\u0214\u0215\bD"+ + "\2\2\u0215\u0089\3\2\2\2\u0216\u0219\5\u008cF\2\u0217\u0219\5\u008eG\2"+ + "\u0218\u0216\3\2\2\2\u0218\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u021b"+ + "\bE\2\2\u021b\u008b\3\2\2\2\u021c\u0225\5\u00b4Z\2\u021d\u021f\7\60\2"+ + "\2\u021e\u0220\5\u00b4Z\2\u021f\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220"+ + "\u0222\3\2\2\2\u0221\u0223\5\u00bc^\2\u0222\u0221\3\2\2\2\u0222\u0223"+ + "\3\2\2\2\u0223\u0226\3\2\2\2\u0224\u0226\5\u00bc^\2\u0225\u021d\3\2\2"+ + "\2\u0225\u0224\3\2\2\2\u0226\u022d\3\2\2\2\u0227\u0228\7\60\2\2\u0228"+ + "\u022a\5\u00b4Z\2\u0229\u022b\5\u00bc^\2\u022a\u0229\3\2\2\2\u022a\u022b"+ + "\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u021c\3\2\2\2\u022c\u0227\3\2\2\2\u022d"+ + "\u008d\3\2\2\2\u022e\u022f\7\62\2\2\u022f\u0230\t\6\2\2\u0230\u0231\5"+ + "\u0090H\2\u0231\u0232\5\u0092I\2\u0232\u008f\3\2\2\2\u0233\u0235\7a\2"+ + "\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0238"+ + "\5\u00b8\\\2\u0237\u0234\3\2\2\2\u0238\u0239\3\2\2\2\u0239\u0237\3\2\2"+ + "\2\u0239\u023a\3\2\2\2\u023a\u0245\3\2\2\2\u023b\u0242\7\60\2\2\u023c"+ + "\u023e\7a\2\2\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2"+ + "\2\2\u023f\u0241\5\u00b8\\\2\u0240\u023d\3\2\2\2\u0241\u0244\3\2\2\2\u0242"+ + "\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0246\3\2\2\2\u0244\u0242\3\2"+ + "\2\2\u0245\u023b\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0253\3\2\2\2\u0247"+ + "\u0248\7\60\2\2\u0248\u024f\5\u00b8\\\2\u0249\u024b\7a\2\2\u024a\u0249"+ + "\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024e\5\u00b8\\"+ + "\2\u024d\u024a\3\2\2\2\u024e\u0251\3\2\2\2\u024f\u024d\3\2\2\2\u024f\u0250"+ + "\3\2\2\2\u0250\u0253\3\2\2\2\u0251\u024f\3\2\2\2\u0252\u0237\3\2\2\2\u0252"+ + "\u0247\3\2\2\2\u0253\u0091\3\2\2\2\u0254\u0256\t\7\2\2\u0255\u0257\t\b"+ + "\2\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2\2\2\u0257\u0258\3\2\2\2\u0258"+ + "\u0259\5\u00b4Z\2\u0259\u0093\3\2\2\2\u025a\u0260\5\u0082A\2\u025b\u0260"+ + "\5\u0084B\2\u025c\u0260\5\u0086C\2\u025d\u0260\5\u0088D\2\u025e\u0260"+ + "\5\u008aE\2\u025f\u025a\3\2\2\2\u025f\u025b\3\2\2\2\u025f\u025c\3\2\2"+ + "\2\u025f\u025d\3\2\2\2\u025f\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0262"+ + "\7k\2\2\u0262\u0263\3\2\2\2\u0263\u0264\bJ\2\2\u0264\u0095\3\2\2\2\u0265"+ + "\u0268\7)\2\2\u0266\u0269\5\u00b0X\2\u0267\u0269\5\u009aM\2\u0268\u0266"+ + "\3\2\2\2\u0268\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b\7)\2\2\u026b"+ + "\u0097\3\2\2\2\u026c\u026d\5\u0096K\2\u026d\u026e\3\2\2\2\u026e\u026f"+ + "\bL\2\2\u026f\u0099\3\2\2\2\u0270\u0273\5\u009cN\2\u0271\u0273\5\u009e"+ + "O\2\u0272\u0270\3\2\2\2\u0272\u0271\3\2\2\2\u0273\u009b\3\2\2\2\u0274"+ + "\u0275\7^\2\2\u0275\u0276\5\u00b6[\2\u0276\u0277\5\u00b6[\2\u0277\u0278"+ + "\5\u00b6[\2\u0278\u009d\3\2\2\2\u0279\u027a\7^\2\2\u027a\u027b\7z\2\2"+ + "\u027b\u027c\5\u00b8\\\2\u027c\u027d\5\u00b8\\\2\u027d\u009f\3\2\2\2\u027e"+ + "\u027f\7^\2\2\u027f\u0280\7w\2\2\u0280\u0281\5\u00b8\\\2\u0281\u0282\5"+ + "\u00b8\\\2\u0282\u0283\5\u00b8\\\2\u0283\u0284\5\u00b8\\\2\u0284\u00a1"+ + "\3\2\2\2\u0285\u0286\7^\2\2\u0286\u0287\7W\2\2\u0287\u0288\5\u00b8\\\2"+ + "\u0288\u0289\5\u00b8\\\2\u0289\u028a\5\u00b8\\\2\u028a\u028b\5\u00b8\\"+ + "\2\u028b\u028c\5\u00b8\\\2\u028c\u028d\5\u00b8\\\2\u028d\u028e\5\u00b8"+ + "\\\2\u028e\u028f\5\u00b8\\\2\u028f\u00a3\3\2\2\2\u0290\u0294\7b\2\2\u0291"+ + "\u0293\n\t\2\2\u0292\u0291\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2"+ + "\2\2\u0294\u0295\3\2\2\2\u0295\u0297\3\2\2\2\u0296\u0294\3\2\2\2\u0297"+ + "\u0298\7b\2\2\u0298\u0299\3\2\2\2\u0299\u029a\bR\2\2\u029a\u00a5\3\2\2"+ + "\2\u029b\u02a0\7$\2\2\u029c\u029f\n\n\2\2\u029d\u029f\5\u00b2Y\2\u029e"+ + "\u029c\3\2\2\2\u029e\u029d\3\2\2\2\u029f\u02a2\3\2\2\2\u02a0\u029e\3\2"+ + "\2\2\u02a0\u02a1\3\2\2\2\u02a1\u02a3\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a3"+ + "\u02a4\7$\2\2\u02a4\u02a5\3\2\2\2\u02a5\u02a6\bS\2\2\u02a6\u00a7\3\2\2"+ + "\2\u02a7\u02a9\t\13\2\2\u02a8\u02a7\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa"+ + "\u02a8\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\bT"+ + "\3\2\u02ad\u00a9\3\2\2\2\u02ae\u02af\7\61\2\2\u02af\u02b0\7,\2\2\u02b0"+ + "\u02b4\3\2\2\2\u02b1\u02b3\13\2\2\2\u02b2\u02b1\3\2\2\2\u02b3\u02b6\3"+ + "\2\2\2\u02b4\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6"+ + "\u02b4\3\2\2\2\u02b7\u02b8\7,\2\2\u02b8\u02b9\7\61\2\2\u02b9\u02ba\3\2"+ + "\2\2\u02ba\u02bb\bU\3\2\u02bb\u00ab\3\2\2\2\u02bc\u02be\t\f\2\2\u02bd"+ + "\u02bc\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02bd\3\2\2\2\u02bf\u02c0\3\2"+ + "\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\bV\3\2\u02c2\u00ad\3\2\2\2\u02c3"+ + "\u02c4\7\61\2\2\u02c4\u02c5\7\61\2\2\u02c5\u02c9\3\2\2\2\u02c6\u02c8\n"+ + "\f\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2\u02c9"+ + "\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cd\bW"+ + "\3\2\u02cd\u00af\3\2\2\2\u02ce\u02d3\n\r\2\2\u02cf\u02d3\5\u00a0P\2\u02d0"+ + "\u02d3\5\u00a2Q\2\u02d1\u02d3\5\u00b2Y\2\u02d2\u02ce\3\2\2\2\u02d2\u02cf"+ + "\3\2\2\2\u02d2\u02d0\3\2\2\2\u02d2\u02d1\3\2\2\2\u02d3\u00b1\3\2\2\2\u02d4"+ + "\u02ee\7^\2\2\u02d5\u02d6\7w\2\2\u02d6\u02d7\5\u00b8\\\2\u02d7\u02d8\5"+ + "\u00b8\\\2\u02d8\u02d9\5\u00b8\\\2\u02d9\u02da\5\u00b8\\\2\u02da\u02ef"+ + "\3\2\2\2\u02db\u02dc\7W\2\2\u02dc\u02dd\5\u00b8\\\2\u02dd\u02de\5\u00b8"+ + "\\\2\u02de\u02df\5\u00b8\\\2\u02df\u02e0\5\u00b8\\\2\u02e0\u02e1\5\u00b8"+ + "\\\2\u02e1\u02e2\5\u00b8\\\2\u02e2\u02e3\5\u00b8\\\2\u02e3\u02e4\5\u00b8"+ + "\\\2\u02e4\u02ef\3\2\2\2\u02e5\u02ef\t\16\2\2\u02e6\u02e7\5\u00b6[\2\u02e7"+ + "\u02e8\5\u00b6[\2\u02e8\u02e9\5\u00b6[\2\u02e9\u02ef\3\2\2\2\u02ea\u02eb"+ + "\7z\2\2\u02eb\u02ec\5\u00b8\\\2\u02ec\u02ed\5\u00b8\\\2\u02ed\u02ef\3"+ + "\2\2\2\u02ee\u02d5\3\2\2\2\u02ee\u02db\3\2\2\2\u02ee\u02e5\3\2\2\2\u02ee"+ + "\u02e6\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ef\u00b3\3\2\2\2\u02f0\u02f7\t\3"+ + "\2\2\u02f1\u02f3\7a\2\2\u02f2\u02f1\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+ + "\u02f4\3\2\2\2\u02f4\u02f6\t\3\2\2\u02f5\u02f2\3\2\2\2\u02f6\u02f9\3\2"+ + "\2\2\u02f7\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u00b5\3\2\2\2\u02f9"+ + "\u02f7\3\2\2\2\u02fa\u02fb\t\17\2\2\u02fb\u00b7\3\2\2\2\u02fc\u02fd\t"+ + "\20\2\2\u02fd\u00b9\3\2\2\2\u02fe\u02ff\t\21\2\2\u02ff\u00bb\3\2\2\2\u0300"+ + "\u0302\t\22\2\2\u0301\u0303\t\b\2\2\u0302\u0301\3\2\2\2\u0302\u0303\3"+ + "\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\5\u00b4Z\2\u0305\u00bd\3\2\2\2"+ + "\u0306\u0309\5\u00c2a\2\u0307\u0309\7a\2\2\u0308\u0306\3\2\2\2\u0308\u0307"+ + "\3\2\2\2\u0309\u00bf\3\2\2\2\u030a\u030b\t\23\2\2\u030b\u00c1\3\2\2\2"+ + "\u030c\u030d\t\24\2\2\u030d\u00c3\3\2\2\2\u030e\u0310\t\13\2\2\u030f\u030e"+ + "\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+ + "\u0313\3\2\2\2\u0313\u0314\bb\3\2\u0314\u00c5\3\2\2\2\u0315\u0316\7\61"+ + "\2\2\u0316\u0317\7,\2\2\u0317\u031b\3\2\2\2\u0318\u031a\n\f\2\2\u0319"+ + "\u0318\3\2\2\2\u031a\u031d\3\2\2\2\u031b\u031c\3\2\2\2\u031b\u0319\3\2"+ + "\2\2\u031c\u031e\3\2\2\2\u031d\u031b\3\2\2\2\u031e\u031f\7,\2\2\u031f"+ + "\u0320\7\61\2\2\u0320\u0321\3\2\2\2\u0321\u0322\bc\3\2\u0322\u00c7\3\2"+ + "\2\2\u0323\u0324\7\61\2\2\u0324\u0325\7\61\2\2\u0325\u0329\3\2\2\2\u0326"+ + "\u0328\n\f\2\2\u0327\u0326\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3\2"+ + "\2\2\u0329\u032a\3\2\2\2\u032a\u032c\3\2\2\2\u032b\u0329\3\2\2\2\u032c"+ + "\u032d\bd\3\2\u032d\u00c9\3\2\2\2\u032e\u0330\t\f\2\2\u032f\u032e\3\2"+ + "\2\2\u0330\u0331\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332"+ + "\u0341\3\2\2\2\u0333\u0341\7=\2\2\u0334\u0335\7\61\2\2\u0335\u0336\7,"+ + "\2\2\u0336\u033a\3\2\2\2\u0337\u0339\13\2\2\2\u0338\u0337\3\2\2\2\u0339"+ + "\u033c\3\2\2\2\u033a\u033b\3\2\2\2\u033a\u0338\3\2\2\2\u033b\u033d\3\2"+ + "\2\2\u033c\u033a\3\2\2\2\u033d\u033e\7,\2\2\u033e\u0341\7\61\2\2\u033f"+ + "\u0341\7\2\2\3\u0340\u032f\3\2\2\2\u0340\u0333\3\2\2\2\u0340\u0334\3\2"+ + "\2\2\u0340\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0343\be\4\2\u0343"+ + "\u00cb\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\bf"+ + "\4\2\u0347\u0348\bf\3\2\u0348\u00cd\3\2\2\2\65\2\3\u0179\u017b\u01e4\u01e9"+ + "\u01ec\u01f3\u01f8\u01fe\u0201\u0206\u020d\u0212\u0218\u021f\u0222\u0225"+ + "\u022a\u022c\u0234\u0239\u023d\u0242\u0245\u024a\u024f\u0252\u0256\u025f"+ + "\u0268\u0272\u0294\u029e\u02a0\u02aa\u02b4\u02bf\u02c9\u02d2\u02ee\u02f2"+ + "\u02f7\u0302\u0308\u0311\u031b\u0329\u0331\u033a\u0340\5\4\3\2\2\3\2\4"+ + "\2\2"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file 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 29a2f5369..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; diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 9ae923b2a..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; From ecfd59e7ede7a81555f9c8351451cbe7470be125 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 20:15:46 +0200 Subject: [PATCH 32/37] add dependency --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index dca34e1c5..ce407ccc9 100644 --- a/build.sbt +++ b/build.sbt @@ -35,6 +35,7 @@ lazy val gobra = (project in file(".")) libraryDependencies += "org.apache.commons" % "commons-text" % "1.9", // for escaping strings in parser preprocessor libraryDependencies += "commons-codec" % "commons-codec" % "1.15", // for obtaining the hex encoding of a string libraryDependencies += "org.antlr" % "antlr4-runtime" % "4.12.0", + libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.3.7", // used for EitherT scalacOptions ++= Seq( "-encoding", "UTF-8", // Enforce UTF-8, instead of relying on properly set locales From 4bf94a5ef23bbeb192040dcc8e8c427f57ff61e5 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Thu, 24 Aug 2023 20:21:12 +0200 Subject: [PATCH 33/37] adapted member typing unit test --- src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala index e495b1776..605862709 100644 --- a/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala +++ b/src/test/scala/viper/gobra/typing/MemberTypingUnitTests.scala @@ -401,9 +401,8 @@ class MemberTypingUnitTests extends AnyFunSuite with Matchers with Inside { new PackageInfo("pkg", "pkg", false) ) val tree = new Info.GoTree(pkg) - val context = new Info.Context() val config = Config() - new TypeInfoImpl(tree, context)(config) + new TypeInfoImpl(tree, Map.empty)(config) } def wellDefMember(member: PMember, otherMembers: Vector[PMember] = Vector()) = From fc874a69b491ae92505d18480a80db79824aca84 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Fri, 25 Aug 2023 01:27:15 +0200 Subject: [PATCH 34/37] fix type parameter inference and refactor --- src/main/antlr4/.antlr/GoLexer.java | 606 ------------------ .../scala/viper/gobra/frontend/Desugar.scala | 1 - .../gobra/frontend/ParseTreeTranslator.scala | 7 +- .../property/Assignability.scala | 6 + .../implementation/property/Implements.scala | 1 + .../property/UnderlyingType.scala | 2 +- .../resolution/AmbiguityResolution.scala | 1 + .../resolution/MemberResolution.scala | 9 +- .../implementation/typing/ExprTyping.scala | 15 +- .../info/implementation/typing/IdTyping.scala | 4 +- .../implementation/typing/TypeTyping.scala | 1 + .../ghost/separation/GhostAssignability.scala | 2 +- 12 files changed, 28 insertions(+), 627 deletions(-) delete mode 100644 src/main/antlr4/.antlr/GoLexer.java diff --git a/src/main/antlr4/.antlr/GoLexer.java b/src/main/antlr4/.antlr/GoLexer.java deleted file mode 100644 index c58ff8645..000000000 --- a/src/main/antlr4/.antlr/GoLexer.java +++ /dev/null @@ -1,606 +0,0 @@ -// Generated from s:\GitHub\gobra\src\main\antlr4\GoLexer.g4 by ANTLR 4.9.2 -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) -public class GoLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - BREAK=1, DEFAULT=2, FUNC=3, INTERFACE=4, SELECT=5, CASE=6, DEFER=7, GO=8, - MAP=9, STRUCT=10, CHAN=11, ELSE=12, GOTO=13, PACKAGE=14, SWITCH=15, CONST=16, - FALLTHROUGH=17, IF=18, RANGE=19, TYPE=20, CONTINUE=21, FOR=22, IMPORT=23, - RETURN=24, VAR=25, NIL_LIT=26, IDENTIFIER=27, L_PAREN=28, R_PAREN=29, - L_CURLY=30, R_CURLY=31, L_BRACKET=32, R_BRACKET=33, ASSIGN=34, COMMA=35, - SEMI=36, COLON=37, DOT=38, PLUS_PLUS=39, MINUS_MINUS=40, DECLARE_ASSIGN=41, - ELLIPSIS=42, LOGICAL_OR=43, LOGICAL_AND=44, EQUALS=45, NOT_EQUALS=46, - LESS=47, LESS_OR_EQUALS=48, GREATER=49, GREATER_OR_EQUALS=50, OR=51, DIV=52, - MOD=53, LSHIFT=54, RSHIFT=55, BIT_CLEAR=56, EXCLAMATION=57, PLUS=58, MINUS=59, - CARET=60, STAR=61, AMPERSAND=62, RECEIVE=63, DECIMAL_LIT=64, BINARY_LIT=65, - OCTAL_LIT=66, HEX_LIT=67, FLOAT_LIT=68, DECIMAL_FLOAT_LIT=69, HEX_FLOAT_LIT=70, - IMAGINARY_LIT=71, RUNE_LIT=72, BYTE_VALUE=73, OCTAL_BYTE_VALUE=74, HEX_BYTE_VALUE=75, - LITTLE_U_VALUE=76, BIG_U_VALUE=77, RAW_STRING_LIT=78, INTERPRETED_STRING_LIT=79, - WS=80, COMMENT=81, TERMINATOR=82, LINE_COMMENT=83, WS_NLSEMI=84, COMMENT_NLSEMI=85, - LINE_COMMENT_NLSEMI=86, EOS=87, OTHER=88; - public static final int - NLSEMI=1; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "NLSEMI" - }; - - private static String[] makeRuleNames() { - return new String[] { - "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", "GO", - "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", - "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", - "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", - "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", - "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", - "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", - "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", - "HEX_FLOAT_LIT", "HEX_MANTISSA", "HEX_EXPONENT", "IMAGINARY_LIT", "RUNE", - "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", "HEX_BYTE_VALUE", "LITTLE_U_VALUE", - "BIG_U_VALUE", "RAW_STRING_LIT", "INTERPRETED_STRING_LIT", "WS", "COMMENT", - "TERMINATOR", "LINE_COMMENT", "UNICODE_VALUE", "ESCAPED_VALUE", "DECIMALS", - "OCTAL_DIGIT", "HEX_DIGIT", "BIN_DIGIT", "EXPONENT", "LETTER", "UNICODE_DIGIT", - "UNICODE_LETTER", "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", - "EOS", "OTHER" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, "'break'", "'default'", "'func'", "'interface'", "'select'", "'case'", - "'defer'", "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", - "'package'", "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", - "'type'", "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", - null, "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", - "':'", "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", - "'!='", "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", - "'&^'", "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", "CASE", "DEFER", - "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", "SWITCH", "CONST", - "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", - "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", - "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", - "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", "ELLIPSIS", "LOGICAL_OR", - "LOGICAL_AND", "EQUALS", "NOT_EQUALS", "LESS", "LESS_OR_EQUALS", "GREATER", - "GREATER_OR_EQUALS", "OR", "DIV", "MOD", "LSHIFT", "RSHIFT", "BIT_CLEAR", - "EXCLAMATION", "PLUS", "MINUS", "CARET", "STAR", "AMPERSAND", "RECEIVE", - "DECIMAL_LIT", "BINARY_LIT", "OCTAL_LIT", "HEX_LIT", "FLOAT_LIT", "DECIMAL_FLOAT_LIT", - "HEX_FLOAT_LIT", "IMAGINARY_LIT", "RUNE_LIT", "BYTE_VALUE", "OCTAL_BYTE_VALUE", - "HEX_BYTE_VALUE", "LITTLE_U_VALUE", "BIG_U_VALUE", "RAW_STRING_LIT", - "INTERPRETED_STRING_LIT", "WS", "COMMENT", "TERMINATOR", "LINE_COMMENT", - "WS_NLSEMI", "COMMENT_NLSEMI", "LINE_COMMENT_NLSEMI", "EOS", "OTHER" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public GoLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "GoLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2Z\u0349\b\1\b\1\4"+ - "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ - "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ - "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ - "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ - " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ - "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+ - "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+ - "=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+ - "I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t"+ - "T\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_"+ - "\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\3\2\3\2\3\2\3\2\3\2\3\2\3\2"+ - "\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7"+ - "\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13"+ - "\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\16\3\16"+ - "\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\24"+ - "\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26"+ - "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30"+ - "\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32"+ - "\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\7\34\u017a"+ - "\n\34\f\34\16\34\u017d\13\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\36\3"+ - "\37\3\37\3 \3 \3 \3 \3!\3!\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'"+ - "\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3*\3*\3*\3+\3+\3+\3+\3,\3,\3,\3-\3"+ - "-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\63\3\63\3"+ - "\63\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67\3\67\38\38\38\39\39\39\3:"+ - "\3:\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3@\3@\3@\3A\3A\3A\5A\u01e5\nA\3A\7A"+ - "\u01e8\nA\fA\16A\u01eb\13A\5A\u01ed\nA\3A\3A\3B\3B\3B\5B\u01f4\nB\3B\6"+ - "B\u01f7\nB\rB\16B\u01f8\3B\3B\3C\3C\5C\u01ff\nC\3C\5C\u0202\nC\3C\6C\u0205"+ - "\nC\rC\16C\u0206\3C\3C\3D\3D\3D\5D\u020e\nD\3D\6D\u0211\nD\rD\16D\u0212"+ - "\3D\3D\3E\3E\5E\u0219\nE\3E\3E\3F\3F\3F\5F\u0220\nF\3F\5F\u0223\nF\3F"+ - "\5F\u0226\nF\3F\3F\3F\5F\u022b\nF\5F\u022d\nF\3G\3G\3G\3G\3G\3H\5H\u0235"+ - "\nH\3H\6H\u0238\nH\rH\16H\u0239\3H\3H\5H\u023e\nH\3H\7H\u0241\nH\fH\16"+ - "H\u0244\13H\5H\u0246\nH\3H\3H\3H\5H\u024b\nH\3H\7H\u024e\nH\fH\16H\u0251"+ - "\13H\5H\u0253\nH\3I\3I\5I\u0257\nI\3I\3I\3J\3J\3J\3J\3J\5J\u0260\nJ\3"+ - "J\3J\3J\3J\3K\3K\3K\5K\u0269\nK\3K\3K\3L\3L\3L\3L\3M\3M\5M\u0273\nM\3"+ - "N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3"+ - "Q\3Q\3Q\3Q\3Q\3R\3R\7R\u0293\nR\fR\16R\u0296\13R\3R\3R\3R\3R\3S\3S\3S"+ - "\7S\u029f\nS\fS\16S\u02a2\13S\3S\3S\3S\3S\3T\6T\u02a9\nT\rT\16T\u02aa"+ - "\3T\3T\3U\3U\3U\3U\7U\u02b3\nU\fU\16U\u02b6\13U\3U\3U\3U\3U\3U\3V\6V\u02be"+ - "\nV\rV\16V\u02bf\3V\3V\3W\3W\3W\3W\7W\u02c8\nW\fW\16W\u02cb\13W\3W\3W"+ - "\3X\3X\3X\3X\5X\u02d3\nX\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y"+ - "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\5Y\u02ef\nY\3Z\3Z\5Z\u02f3\nZ\3Z\7Z"+ - "\u02f6\nZ\fZ\16Z\u02f9\13Z\3[\3[\3\\\3\\\3]\3]\3^\3^\5^\u0303\n^\3^\3"+ - "^\3_\3_\5_\u0309\n_\3`\3`\3a\3a\3b\6b\u0310\nb\rb\16b\u0311\3b\3b\3c\3"+ - "c\3c\3c\7c\u031a\nc\fc\16c\u031d\13c\3c\3c\3c\3c\3c\3d\3d\3d\3d\7d\u0328"+ - "\nd\fd\16d\u032b\13d\3d\3d\3e\6e\u0330\ne\re\16e\u0331\3e\3e\3e\3e\3e"+ - "\7e\u0339\ne\fe\16e\u033c\13e\3e\3e\3e\5e\u0341\ne\3e\3e\3f\3f\3f\3f\3"+ - "f\5\u02b4\u031b\u033a\2g\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f"+ - "\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64"+ - "\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d"+ - "\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088"+ - "E\u008aF\u008cG\u008eH\u0090\2\u0092\2\u0094I\u0096\2\u0098J\u009aK\u009c"+ - "L\u009eM\u00a0N\u00a2O\u00a4P\u00a6Q\u00a8R\u00aaS\u00acT\u00aeU\u00b0"+ - "\2\u00b2\2\u00b4\2\u00b6\2\u00b8\2\u00ba\2\u00bc\2\u00be\2\u00c0\2\u00c2"+ - "\2\u00c4V\u00c6W\u00c8X\u00caY\u00ccZ\4\2\3\23\3\2\63;\3\2\62;\4\2DDd"+ - "d\4\2QQqq\4\2ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f"+ - "\17\17\5\2\f\f\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2"+ - "\62\63\4\2GGgg\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb"+ - "\2\u0968\2\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68"+ - "\2\u0b71\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71"+ - "\2\u0de8\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042"+ - "\2\u104b\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951"+ - "\2\u19d2\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2"+ - "\2\u1bbb\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db"+ - "\2\ua902\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2"+ - "\2\uabfb\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb"+ - "\3\u1138\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2"+ - "\3\u14db\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb"+ - "\3\u1c52\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0"+ - "\3\ud801\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7"+ - "\2\u00b7\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3"+ - "\2\u02c8\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372"+ - "\2\u0376\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388"+ - "\2\u038a\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9"+ - "\2\u0483\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589"+ - "\2\u05d2\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673"+ - "\2\u06d5\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe"+ - "\2\u0701\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3"+ - "\2\u07b3\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817"+ - "\2\u081c\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862"+ - "\2\u086c\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f"+ - "\2\u0952\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991"+ - "\2\u0992\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb"+ - "\2\u09bf\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2"+ - "\2\u09f3\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a"+ - "\2\u0a2c\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b"+ - "\2\u0a5e\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93"+ - "\2\u0a95\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf"+ - "\2\u0abf\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e"+ - "\2\u0b11\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37"+ - "\2\u0b3b\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73"+ - "\2\u0b85\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b"+ - "\2\u0b9c\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac"+ - "\2\u0bb0\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14"+ - "\2\u0c2a\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63"+ - "\2\u0c82\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac"+ - "\2\u0cb5\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3"+ - "\2\u0cf3\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f"+ - "\2\u0d3f\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81"+ - "\2\u0d87\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2"+ - "\2\u0dc8\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84"+ - "\2\u0e86\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96"+ - "\2\u0e99\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9"+ - "\2\u0eac\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2"+ - "\2\u0ec6\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49"+ - "\2\u0f4b\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052"+ - "\2\u1057\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072"+ - "\2\u1077\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf"+ - "\2\u10cf\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258"+ - "\2\u125a\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292"+ - "\2\u12b2\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7"+ - "\2\u12ca\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382"+ - "\2\u1391\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681"+ - "\2\u1683\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710"+ - "\2\u1713\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772"+ - "\2\u1782\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882"+ - "\2\u1886\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920"+ - "\2\u1952\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02"+ - "\2\u1a18\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d"+ - "\2\u1b85\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f"+ - "\2\u1c51\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3"+ - "\2\u1cf7\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22"+ - "\2\u1f47\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d"+ - "\2\u1f5f\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0"+ - "\2\u1fc0\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd"+ - "\2\u1fe2\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081"+ - "\2\u2081\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115"+ - "\2\u2117\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a"+ - "\2\u212a\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b"+ - "\2\u2150\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62"+ - "\2\u2ce6\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29"+ - "\2\u2d2f\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2"+ - "\2\u2da8\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8"+ - "\2\u2dca\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007"+ - "\2\u3008\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1"+ - "\2\u30a3\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2"+ - "\2\u31bc\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e"+ - "\2\ua4d2\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642"+ - "\2\ua670\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a"+ - "\2\ua78d\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809"+ - "\2\ua80c\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9"+ - "\2\ua8fd\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962"+ - "\2\ua97e\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1"+ - "\2\ua9fc\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62"+ - "\2\uaa78\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8"+ - "\2\uaabb\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2"+ - "\2\uaaec\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18"+ - "\2\uab22\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72"+ - "\2\uabe4\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f"+ - "\2\ufa72\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21"+ - "\2\ufb2a\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43"+ - "\2\ufb45\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94"+ - "\2\ufdc9\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c"+ - "\2\uff43\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4"+ - "\2\uffd9\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082"+ - "\3\u00fc\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342"+ - "\3\u0344\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca"+ - "\3\u03d1\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529"+ - "\3\u0532\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802"+ - "\3\u0807\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e"+ - "\3\u0841\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6"+ - "\3\u08f7\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1"+ - "\3\u0a02\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62"+ - "\3\u0a7e\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37"+ - "\3\u0b42\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82"+ - "\3\u0cb4\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea"+ - "\3\u1105\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3"+ - "\3\u11c6\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d"+ - "\3\u1282\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1"+ - "\3\u12aa\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a"+ - "\3\u132c\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352"+ - "\3\u1352\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1"+ - "\3\u14c6\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602"+ - "\3\u1631\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1"+ - "\3\u1901\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52"+ - "\3\u1a52\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a"+ - "\3\u1c0c\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a"+ - "\3\u1d0b\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545"+ - "\3\u3002\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2"+ - "\3\u6aef\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91"+ - "\3\u6f02\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002"+ - "\3\u87ee\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c"+ - "\3\ubc72\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458"+ - "\3\ud49e\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae"+ - "\3\ud4b0\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509"+ - "\3\ud50c\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540"+ - "\3\ud542\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa"+ - "\3\ud6c2\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736"+ - "\3\ud738\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac"+ - "\3\ud7c4\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05"+ - "\3\uee07\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b"+ - "\3\uee34\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44"+ - "\3\uee49\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53"+ - "\3\uee54\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d"+ - "\3\uee5f\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69"+ - "\3\uee6c\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80"+ - "\3\uee82\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead"+ - "\3\ueebd\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4"+ - "\uceb2\4\uebe2\4\uf802\4\ufa1f\4\u0375\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2"+ - "\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2"+ - "\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\3"+ - "\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2"+ - "\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66"+ - "\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2"+ - "\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2"+ - "\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\"+ - "\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2"+ - "\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2"+ - "\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2"+ - "\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a"+ - "\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0094\3\2\2\2\2\u0098\3\2\2"+ - "\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2"+ - "\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2"+ - "\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\3\u00c4\3\2\2\2\3\u00c6\3\2\2\2\3\u00c8"+ - "\3\2\2\2\3\u00ca\3\2\2\2\3\u00cc\3\2\2\2\4\u00ce\3\2\2\2\6\u00d6\3\2\2"+ - "\2\b\u00de\3\2\2\2\n\u00e3\3\2\2\2\f\u00ed\3\2\2\2\16\u00f4\3\2\2\2\20"+ - "\u00f9\3\2\2\2\22\u00ff\3\2\2\2\24\u0102\3\2\2\2\26\u0106\3\2\2\2\30\u010d"+ - "\3\2\2\2\32\u0112\3\2\2\2\34\u0117\3\2\2\2\36\u011c\3\2\2\2 \u0124\3\2"+ - "\2\2\"\u012b\3\2\2\2$\u0131\3\2\2\2&\u013f\3\2\2\2(\u0142\3\2\2\2*\u0148"+ - "\3\2\2\2,\u014d\3\2\2\2.\u0158\3\2\2\2\60\u015c\3\2\2\2\62\u0163\3\2\2"+ - "\2\64\u016c\3\2\2\2\66\u0170\3\2\2\28\u0176\3\2\2\2:\u0180\3\2\2\2<\u0182"+ - "\3\2\2\2>\u0186\3\2\2\2@\u0188\3\2\2\2B\u018c\3\2\2\2D\u018e\3\2\2\2F"+ - "\u0192\3\2\2\2H\u0194\3\2\2\2J\u0196\3\2\2\2L\u0198\3\2\2\2N\u019a\3\2"+ - "\2\2P\u019c\3\2\2\2R\u01a1\3\2\2\2T\u01a6\3\2\2\2V\u01a9\3\2\2\2X\u01ad"+ - "\3\2\2\2Z\u01b0\3\2\2\2\\\u01b3\3\2\2\2^\u01b6\3\2\2\2`\u01b9\3\2\2\2"+ - "b\u01bb\3\2\2\2d\u01be\3\2\2\2f\u01c0\3\2\2\2h\u01c3\3\2\2\2j\u01c5\3"+ - "\2\2\2l\u01c7\3\2\2\2n\u01c9\3\2\2\2p\u01cc\3\2\2\2r\u01cf\3\2\2\2t\u01d2"+ - "\3\2\2\2v\u01d4\3\2\2\2x\u01d6\3\2\2\2z\u01d8\3\2\2\2|\u01da\3\2\2\2~"+ - "\u01dc\3\2\2\2\u0080\u01de\3\2\2\2\u0082\u01ec\3\2\2\2\u0084\u01f0\3\2"+ - "\2\2\u0086\u01fc\3\2\2\2\u0088\u020a\3\2\2\2\u008a\u0218\3\2\2\2\u008c"+ - "\u022c\3\2\2\2\u008e\u022e\3\2\2\2\u0090\u0252\3\2\2\2\u0092\u0254\3\2"+ - "\2\2\u0094\u025f\3\2\2\2\u0096\u0265\3\2\2\2\u0098\u026c\3\2\2\2\u009a"+ - "\u0272\3\2\2\2\u009c\u0274\3\2\2\2\u009e\u0279\3\2\2\2\u00a0\u027e\3\2"+ - "\2\2\u00a2\u0285\3\2\2\2\u00a4\u0290\3\2\2\2\u00a6\u029b\3\2\2\2\u00a8"+ - "\u02a8\3\2\2\2\u00aa\u02ae\3\2\2\2\u00ac\u02bd\3\2\2\2\u00ae\u02c3\3\2"+ - "\2\2\u00b0\u02d2\3\2\2\2\u00b2\u02d4\3\2\2\2\u00b4\u02f0\3\2\2\2\u00b6"+ - "\u02fa\3\2\2\2\u00b8\u02fc\3\2\2\2\u00ba\u02fe\3\2\2\2\u00bc\u0300\3\2"+ - "\2\2\u00be\u0308\3\2\2\2\u00c0\u030a\3\2\2\2\u00c2\u030c\3\2\2\2\u00c4"+ - "\u030f\3\2\2\2\u00c6\u0315\3\2\2\2\u00c8\u0323\3\2\2\2\u00ca\u0340\3\2"+ - "\2\2\u00cc\u0344\3\2\2\2\u00ce\u00cf\7d\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1"+ - "\7g\2\2\u00d1\u00d2\7c\2\2\u00d2\u00d3\7m\2\2\u00d3\u00d4\3\2\2\2\u00d4"+ - "\u00d5\b\2\2\2\u00d5\5\3\2\2\2\u00d6\u00d7\7f\2\2\u00d7\u00d8\7g\2\2\u00d8"+ - "\u00d9\7h\2\2\u00d9\u00da\7c\2\2\u00da\u00db\7w\2\2\u00db\u00dc\7n\2\2"+ - "\u00dc\u00dd\7v\2\2\u00dd\7\3\2\2\2\u00de\u00df\7h\2\2\u00df\u00e0\7w"+ - "\2\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2\u00e2\t\3\2\2\2\u00e3\u00e4"+ - "\7k\2\2\u00e4\u00e5\7p\2\2\u00e5\u00e6\7v\2\2\u00e6\u00e7\7g\2\2\u00e7"+ - "\u00e8\7t\2\2\u00e8\u00e9\7h\2\2\u00e9\u00ea\7c\2\2\u00ea\u00eb\7e\2\2"+ - "\u00eb\u00ec\7g\2\2\u00ec\13\3\2\2\2\u00ed\u00ee\7u\2\2\u00ee\u00ef\7"+ - "g\2\2\u00ef\u00f0\7n\2\2\u00f0\u00f1\7g\2\2\u00f1\u00f2\7e\2\2\u00f2\u00f3"+ - "\7v\2\2\u00f3\r\3\2\2\2\u00f4\u00f5\7e\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7"+ - "\7u\2\2\u00f7\u00f8\7g\2\2\u00f8\17\3\2\2\2\u00f9\u00fa\7f\2\2\u00fa\u00fb"+ - "\7g\2\2\u00fb\u00fc\7h\2\2\u00fc\u00fd\7g\2\2\u00fd\u00fe\7t\2\2\u00fe"+ - "\21\3\2\2\2\u00ff\u0100\7i\2\2\u0100\u0101\7q\2\2\u0101\23\3\2\2\2\u0102"+ - "\u0103\7o\2\2\u0103\u0104\7c\2\2\u0104\u0105\7r\2\2\u0105\25\3\2\2\2\u0106"+ - "\u0107\7u\2\2\u0107\u0108\7v\2\2\u0108\u0109\7t\2\2\u0109\u010a\7w\2\2"+ - "\u010a\u010b\7e\2\2\u010b\u010c\7v\2\2\u010c\27\3\2\2\2\u010d\u010e\7"+ - "e\2\2\u010e\u010f\7j\2\2\u010f\u0110\7c\2\2\u0110\u0111\7p\2\2\u0111\31"+ - "\3\2\2\2\u0112\u0113\7g\2\2\u0113\u0114\7n\2\2\u0114\u0115\7u\2\2\u0115"+ - "\u0116\7g\2\2\u0116\33\3\2\2\2\u0117\u0118\7i\2\2\u0118\u0119\7q\2\2\u0119"+ - "\u011a\7v\2\2\u011a\u011b\7q\2\2\u011b\35\3\2\2\2\u011c\u011d\7r\2\2\u011d"+ - "\u011e\7c\2\2\u011e\u011f\7e\2\2\u011f\u0120\7m\2\2\u0120\u0121\7c\2\2"+ - "\u0121\u0122\7i\2\2\u0122\u0123\7g\2\2\u0123\37\3\2\2\2\u0124\u0125\7"+ - "u\2\2\u0125\u0126\7y\2\2\u0126\u0127\7k\2\2\u0127\u0128\7v\2\2\u0128\u0129"+ - "\7e\2\2\u0129\u012a\7j\2\2\u012a!\3\2\2\2\u012b\u012c\7e\2\2\u012c\u012d"+ - "\7q\2\2\u012d\u012e\7p\2\2\u012e\u012f\7u\2\2\u012f\u0130\7v\2\2\u0130"+ - "#\3\2\2\2\u0131\u0132\7h\2\2\u0132\u0133\7c\2\2\u0133\u0134\7n\2\2\u0134"+ - "\u0135\7n\2\2\u0135\u0136\7v\2\2\u0136\u0137\7j\2\2\u0137\u0138\7t\2\2"+ - "\u0138\u0139\7q\2\2\u0139\u013a\7w\2\2\u013a\u013b\7i\2\2\u013b\u013c"+ - "\7j\2\2\u013c\u013d\3\2\2\2\u013d\u013e\b\22\2\2\u013e%\3\2\2\2\u013f"+ - "\u0140\7k\2\2\u0140\u0141\7h\2\2\u0141\'\3\2\2\2\u0142\u0143\7t\2\2\u0143"+ - "\u0144\7c\2\2\u0144\u0145\7p\2\2\u0145\u0146\7i\2\2\u0146\u0147\7g\2\2"+ - "\u0147)\3\2\2\2\u0148\u0149\7v\2\2\u0149\u014a\7{\2\2\u014a\u014b\7r\2"+ - "\2\u014b\u014c\7g\2\2\u014c+\3\2\2\2\u014d\u014e\7e\2\2\u014e\u014f\7"+ - "q\2\2\u014f\u0150\7p\2\2\u0150\u0151\7v\2\2\u0151\u0152\7k\2\2\u0152\u0153"+ - "\7p\2\2\u0153\u0154\7w\2\2\u0154\u0155\7g\2\2\u0155\u0156\3\2\2\2\u0156"+ - "\u0157\b\26\2\2\u0157-\3\2\2\2\u0158\u0159\7h\2\2\u0159\u015a\7q\2\2\u015a"+ - "\u015b\7t\2\2\u015b/\3\2\2\2\u015c\u015d\7k\2\2\u015d\u015e\7o\2\2\u015e"+ - "\u015f\7r\2\2\u015f\u0160\7q\2\2\u0160\u0161\7t\2\2\u0161\u0162\7v\2\2"+ - "\u0162\61\3\2\2\2\u0163\u0164\7t\2\2\u0164\u0165\7g\2\2\u0165\u0166\7"+ - "v\2\2\u0166\u0167\7w\2\2\u0167\u0168\7t\2\2\u0168\u0169\7p\2\2\u0169\u016a"+ - "\3\2\2\2\u016a\u016b\b\31\2\2\u016b\63\3\2\2\2\u016c\u016d\7x\2\2\u016d"+ - "\u016e\7c\2\2\u016e\u016f\7t\2\2\u016f\65\3\2\2\2\u0170\u0171\7p\2\2\u0171"+ - "\u0172\7k\2\2\u0172\u0173\7n\2\2\u0173\u0174\3\2\2\2\u0174\u0175\b\33"+ - "\2\2\u0175\67\3\2\2\2\u0176\u017b\5\u00be_\2\u0177\u017a\5\u00be_\2\u0178"+ - "\u017a\5\u00c0`\2\u0179\u0177\3\2\2\2\u0179\u0178\3\2\2\2\u017a\u017d"+ - "\3\2\2\2\u017b\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c\u017e\3\2\2\2\u017d"+ - "\u017b\3\2\2\2\u017e\u017f\b\34\2\2\u017f9\3\2\2\2\u0180\u0181\7*\2\2"+ - "\u0181;\3\2\2\2\u0182\u0183\7+\2\2\u0183\u0184\3\2\2\2\u0184\u0185\b\36"+ - "\2\2\u0185=\3\2\2\2\u0186\u0187\7}\2\2\u0187?\3\2\2\2\u0188\u0189\7\177"+ - "\2\2\u0189\u018a\3\2\2\2\u018a\u018b\b \2\2\u018bA\3\2\2\2\u018c\u018d"+ - "\7]\2\2\u018dC\3\2\2\2\u018e\u018f\7_\2\2\u018f\u0190\3\2\2\2\u0190\u0191"+ - "\b\"\2\2\u0191E\3\2\2\2\u0192\u0193\7?\2\2\u0193G\3\2\2\2\u0194\u0195"+ - "\7.\2\2\u0195I\3\2\2\2\u0196\u0197\7=\2\2\u0197K\3\2\2\2\u0198\u0199\7"+ - "<\2\2\u0199M\3\2\2\2\u019a\u019b\7\60\2\2\u019bO\3\2\2\2\u019c\u019d\7"+ - "-\2\2\u019d\u019e\7-\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\b(\2\2\u01a0"+ - "Q\3\2\2\2\u01a1\u01a2\7/\2\2\u01a2\u01a3\7/\2\2\u01a3\u01a4\3\2\2\2\u01a4"+ - "\u01a5\b)\2\2\u01a5S\3\2\2\2\u01a6\u01a7\7<\2\2\u01a7\u01a8\7?\2\2\u01a8"+ - "U\3\2\2\2\u01a9\u01aa\7\60\2\2\u01aa\u01ab\7\60\2\2\u01ab\u01ac\7\60\2"+ - "\2\u01acW\3\2\2\2\u01ad\u01ae\7~\2\2\u01ae\u01af\7~\2\2\u01afY\3\2\2\2"+ - "\u01b0\u01b1\7(\2\2\u01b1\u01b2\7(\2\2\u01b2[\3\2\2\2\u01b3\u01b4\7?\2"+ - "\2\u01b4\u01b5\7?\2\2\u01b5]\3\2\2\2\u01b6\u01b7\7#\2\2\u01b7\u01b8\7"+ - "?\2\2\u01b8_\3\2\2\2\u01b9\u01ba\7>\2\2\u01baa\3\2\2\2\u01bb\u01bc\7>"+ - "\2\2\u01bc\u01bd\7?\2\2\u01bdc\3\2\2\2\u01be\u01bf\7@\2\2\u01bfe\3\2\2"+ - "\2\u01c0\u01c1\7@\2\2\u01c1\u01c2\7?\2\2\u01c2g\3\2\2\2\u01c3\u01c4\7"+ - "~\2\2\u01c4i\3\2\2\2\u01c5\u01c6\7\61\2\2\u01c6k\3\2\2\2\u01c7\u01c8\7"+ - "\'\2\2\u01c8m\3\2\2\2\u01c9\u01ca\7>\2\2\u01ca\u01cb\7>\2\2\u01cbo\3\2"+ - "\2\2\u01cc\u01cd\7@\2\2\u01cd\u01ce\7@\2\2\u01ceq\3\2\2\2\u01cf\u01d0"+ - "\7(\2\2\u01d0\u01d1\7`\2\2\u01d1s\3\2\2\2\u01d2\u01d3\7#\2\2\u01d3u\3"+ - "\2\2\2\u01d4\u01d5\7-\2\2\u01d5w\3\2\2\2\u01d6\u01d7\7/\2\2\u01d7y\3\2"+ - "\2\2\u01d8\u01d9\7`\2\2\u01d9{\3\2\2\2\u01da\u01db\7,\2\2\u01db}\3\2\2"+ - "\2\u01dc\u01dd\7(\2\2\u01dd\177\3\2\2\2\u01de\u01df\7>\2\2\u01df\u01e0"+ - "\7/\2\2\u01e0\u0081\3\2\2\2\u01e1\u01ed\7\62\2\2\u01e2\u01e9\t\2\2\2\u01e3"+ - "\u01e5\7a\2\2\u01e4\u01e3\3\2\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\3\2"+ - "\2\2\u01e6\u01e8\t\3\2\2\u01e7\u01e4\3\2\2\2\u01e8\u01eb\3\2\2\2\u01e9"+ - "\u01e7\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01ed\3\2\2\2\u01eb\u01e9\3\2"+ - "\2\2\u01ec\u01e1\3\2\2\2\u01ec\u01e2\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee"+ - "\u01ef\bA\2\2\u01ef\u0083\3\2\2\2\u01f0\u01f1\7\62\2\2\u01f1\u01f6\t\4"+ - "\2\2\u01f2\u01f4\7a\2\2\u01f3\u01f2\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4"+ - "\u01f5\3\2\2\2\u01f5\u01f7\5\u00ba]\2\u01f6\u01f3\3\2\2\2\u01f7\u01f8"+ - "\3\2\2\2\u01f8\u01f6\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa"+ - "\u01fb\bB\2\2\u01fb\u0085\3\2\2\2\u01fc\u01fe\7\62\2\2\u01fd\u01ff\t\5"+ - "\2\2\u01fe\u01fd\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0204\3\2\2\2\u0200"+ - "\u0202\7a\2\2\u0201\u0200\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203\3\2"+ - "\2\2\u0203\u0205\5\u00b6[\2\u0204\u0201\3\2\2\2\u0205\u0206\3\2\2\2\u0206"+ - "\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u0209\bC"+ - "\2\2\u0209\u0087\3\2\2\2\u020a\u020b\7\62\2\2\u020b\u0210\t\6\2\2\u020c"+ - "\u020e\7a\2\2\u020d\u020c\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u020f\3\2"+ - "\2\2\u020f\u0211\5\u00b8\\\2\u0210\u020d\3\2\2\2\u0211\u0212\3\2\2\2\u0212"+ - "\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0214\3\2\2\2\u0214\u0215\bD"+ - "\2\2\u0215\u0089\3\2\2\2\u0216\u0219\5\u008cF\2\u0217\u0219\5\u008eG\2"+ - "\u0218\u0216\3\2\2\2\u0218\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u021b"+ - "\bE\2\2\u021b\u008b\3\2\2\2\u021c\u0225\5\u00b4Z\2\u021d\u021f\7\60\2"+ - "\2\u021e\u0220\5\u00b4Z\2\u021f\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220"+ - "\u0222\3\2\2\2\u0221\u0223\5\u00bc^\2\u0222\u0221\3\2\2\2\u0222\u0223"+ - "\3\2\2\2\u0223\u0226\3\2\2\2\u0224\u0226\5\u00bc^\2\u0225\u021d\3\2\2"+ - "\2\u0225\u0224\3\2\2\2\u0226\u022d\3\2\2\2\u0227\u0228\7\60\2\2\u0228"+ - "\u022a\5\u00b4Z\2\u0229\u022b\5\u00bc^\2\u022a\u0229\3\2\2\2\u022a\u022b"+ - "\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u021c\3\2\2\2\u022c\u0227\3\2\2\2\u022d"+ - "\u008d\3\2\2\2\u022e\u022f\7\62\2\2\u022f\u0230\t\6\2\2\u0230\u0231\5"+ - "\u0090H\2\u0231\u0232\5\u0092I\2\u0232\u008f\3\2\2\2\u0233\u0235\7a\2"+ - "\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0238"+ - "\5\u00b8\\\2\u0237\u0234\3\2\2\2\u0238\u0239\3\2\2\2\u0239\u0237\3\2\2"+ - "\2\u0239\u023a\3\2\2\2\u023a\u0245\3\2\2\2\u023b\u0242\7\60\2\2\u023c"+ - "\u023e\7a\2\2\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2"+ - "\2\2\u023f\u0241\5\u00b8\\\2\u0240\u023d\3\2\2\2\u0241\u0244\3\2\2\2\u0242"+ - "\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0246\3\2\2\2\u0244\u0242\3\2"+ - "\2\2\u0245\u023b\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0253\3\2\2\2\u0247"+ - "\u0248\7\60\2\2\u0248\u024f\5\u00b8\\\2\u0249\u024b\7a\2\2\u024a\u0249"+ - "\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024e\5\u00b8\\"+ - "\2\u024d\u024a\3\2\2\2\u024e\u0251\3\2\2\2\u024f\u024d\3\2\2\2\u024f\u0250"+ - "\3\2\2\2\u0250\u0253\3\2\2\2\u0251\u024f\3\2\2\2\u0252\u0237\3\2\2\2\u0252"+ - "\u0247\3\2\2\2\u0253\u0091\3\2\2\2\u0254\u0256\t\7\2\2\u0255\u0257\t\b"+ - "\2\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2\2\2\u0257\u0258\3\2\2\2\u0258"+ - "\u0259\5\u00b4Z\2\u0259\u0093\3\2\2\2\u025a\u0260\5\u0082A\2\u025b\u0260"+ - "\5\u0084B\2\u025c\u0260\5\u0086C\2\u025d\u0260\5\u0088D\2\u025e\u0260"+ - "\5\u008aE\2\u025f\u025a\3\2\2\2\u025f\u025b\3\2\2\2\u025f\u025c\3\2\2"+ - "\2\u025f\u025d\3\2\2\2\u025f\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0262"+ - "\7k\2\2\u0262\u0263\3\2\2\2\u0263\u0264\bJ\2\2\u0264\u0095\3\2\2\2\u0265"+ - "\u0268\7)\2\2\u0266\u0269\5\u00b0X\2\u0267\u0269\5\u009aM\2\u0268\u0266"+ - "\3\2\2\2\u0268\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u026b\7)\2\2\u026b"+ - "\u0097\3\2\2\2\u026c\u026d\5\u0096K\2\u026d\u026e\3\2\2\2\u026e\u026f"+ - "\bL\2\2\u026f\u0099\3\2\2\2\u0270\u0273\5\u009cN\2\u0271\u0273\5\u009e"+ - "O\2\u0272\u0270\3\2\2\2\u0272\u0271\3\2\2\2\u0273\u009b\3\2\2\2\u0274"+ - "\u0275\7^\2\2\u0275\u0276\5\u00b6[\2\u0276\u0277\5\u00b6[\2\u0277\u0278"+ - "\5\u00b6[\2\u0278\u009d\3\2\2\2\u0279\u027a\7^\2\2\u027a\u027b\7z\2\2"+ - "\u027b\u027c\5\u00b8\\\2\u027c\u027d\5\u00b8\\\2\u027d\u009f\3\2\2\2\u027e"+ - "\u027f\7^\2\2\u027f\u0280\7w\2\2\u0280\u0281\5\u00b8\\\2\u0281\u0282\5"+ - "\u00b8\\\2\u0282\u0283\5\u00b8\\\2\u0283\u0284\5\u00b8\\\2\u0284\u00a1"+ - "\3\2\2\2\u0285\u0286\7^\2\2\u0286\u0287\7W\2\2\u0287\u0288\5\u00b8\\\2"+ - "\u0288\u0289\5\u00b8\\\2\u0289\u028a\5\u00b8\\\2\u028a\u028b\5\u00b8\\"+ - "\2\u028b\u028c\5\u00b8\\\2\u028c\u028d\5\u00b8\\\2\u028d\u028e\5\u00b8"+ - "\\\2\u028e\u028f\5\u00b8\\\2\u028f\u00a3\3\2\2\2\u0290\u0294\7b\2\2\u0291"+ - "\u0293\n\t\2\2\u0292\u0291\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2"+ - "\2\2\u0294\u0295\3\2\2\2\u0295\u0297\3\2\2\2\u0296\u0294\3\2\2\2\u0297"+ - "\u0298\7b\2\2\u0298\u0299\3\2\2\2\u0299\u029a\bR\2\2\u029a\u00a5\3\2\2"+ - "\2\u029b\u02a0\7$\2\2\u029c\u029f\n\n\2\2\u029d\u029f\5\u00b2Y\2\u029e"+ - "\u029c\3\2\2\2\u029e\u029d\3\2\2\2\u029f\u02a2\3\2\2\2\u02a0\u029e\3\2"+ - "\2\2\u02a0\u02a1\3\2\2\2\u02a1\u02a3\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a3"+ - "\u02a4\7$\2\2\u02a4\u02a5\3\2\2\2\u02a5\u02a6\bS\2\2\u02a6\u00a7\3\2\2"+ - "\2\u02a7\u02a9\t\13\2\2\u02a8\u02a7\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa"+ - "\u02a8\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\bT"+ - "\3\2\u02ad\u00a9\3\2\2\2\u02ae\u02af\7\61\2\2\u02af\u02b0\7,\2\2\u02b0"+ - "\u02b4\3\2\2\2\u02b1\u02b3\13\2\2\2\u02b2\u02b1\3\2\2\2\u02b3\u02b6\3"+ - "\2\2\2\u02b4\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6"+ - "\u02b4\3\2\2\2\u02b7\u02b8\7,\2\2\u02b8\u02b9\7\61\2\2\u02b9\u02ba\3\2"+ - "\2\2\u02ba\u02bb\bU\3\2\u02bb\u00ab\3\2\2\2\u02bc\u02be\t\f\2\2\u02bd"+ - "\u02bc\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02bd\3\2\2\2\u02bf\u02c0\3\2"+ - "\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c2\bV\3\2\u02c2\u00ad\3\2\2\2\u02c3"+ - "\u02c4\7\61\2\2\u02c4\u02c5\7\61\2\2\u02c5\u02c9\3\2\2\2\u02c6\u02c8\n"+ - "\f\2\2\u02c7\u02c6\3\2\2\2\u02c8\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2\u02c9"+ - "\u02ca\3\2\2\2\u02ca\u02cc\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02cd\bW"+ - "\3\2\u02cd\u00af\3\2\2\2\u02ce\u02d3\n\r\2\2\u02cf\u02d3\5\u00a0P\2\u02d0"+ - "\u02d3\5\u00a2Q\2\u02d1\u02d3\5\u00b2Y\2\u02d2\u02ce\3\2\2\2\u02d2\u02cf"+ - "\3\2\2\2\u02d2\u02d0\3\2\2\2\u02d2\u02d1\3\2\2\2\u02d3\u00b1\3\2\2\2\u02d4"+ - "\u02ee\7^\2\2\u02d5\u02d6\7w\2\2\u02d6\u02d7\5\u00b8\\\2\u02d7\u02d8\5"+ - "\u00b8\\\2\u02d8\u02d9\5\u00b8\\\2\u02d9\u02da\5\u00b8\\\2\u02da\u02ef"+ - "\3\2\2\2\u02db\u02dc\7W\2\2\u02dc\u02dd\5\u00b8\\\2\u02dd\u02de\5\u00b8"+ - "\\\2\u02de\u02df\5\u00b8\\\2\u02df\u02e0\5\u00b8\\\2\u02e0\u02e1\5\u00b8"+ - "\\\2\u02e1\u02e2\5\u00b8\\\2\u02e2\u02e3\5\u00b8\\\2\u02e3\u02e4\5\u00b8"+ - "\\\2\u02e4\u02ef\3\2\2\2\u02e5\u02ef\t\16\2\2\u02e6\u02e7\5\u00b6[\2\u02e7"+ - "\u02e8\5\u00b6[\2\u02e8\u02e9\5\u00b6[\2\u02e9\u02ef\3\2\2\2\u02ea\u02eb"+ - "\7z\2\2\u02eb\u02ec\5\u00b8\\\2\u02ec\u02ed\5\u00b8\\\2\u02ed\u02ef\3"+ - "\2\2\2\u02ee\u02d5\3\2\2\2\u02ee\u02db\3\2\2\2\u02ee\u02e5\3\2\2\2\u02ee"+ - "\u02e6\3\2\2\2\u02ee\u02ea\3\2\2\2\u02ef\u00b3\3\2\2\2\u02f0\u02f7\t\3"+ - "\2\2\u02f1\u02f3\7a\2\2\u02f2\u02f1\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+ - "\u02f4\3\2\2\2\u02f4\u02f6\t\3\2\2\u02f5\u02f2\3\2\2\2\u02f6\u02f9\3\2"+ - "\2\2\u02f7\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u00b5\3\2\2\2\u02f9"+ - "\u02f7\3\2\2\2\u02fa\u02fb\t\17\2\2\u02fb\u00b7\3\2\2\2\u02fc\u02fd\t"+ - "\20\2\2\u02fd\u00b9\3\2\2\2\u02fe\u02ff\t\21\2\2\u02ff\u00bb\3\2\2\2\u0300"+ - "\u0302\t\22\2\2\u0301\u0303\t\b\2\2\u0302\u0301\3\2\2\2\u0302\u0303\3"+ - "\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\5\u00b4Z\2\u0305\u00bd\3\2\2\2"+ - "\u0306\u0309\5\u00c2a\2\u0307\u0309\7a\2\2\u0308\u0306\3\2\2\2\u0308\u0307"+ - "\3\2\2\2\u0309\u00bf\3\2\2\2\u030a\u030b\t\23\2\2\u030b\u00c1\3\2\2\2"+ - "\u030c\u030d\t\24\2\2\u030d\u00c3\3\2\2\2\u030e\u0310\t\13\2\2\u030f\u030e"+ - "\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+ - "\u0313\3\2\2\2\u0313\u0314\bb\3\2\u0314\u00c5\3\2\2\2\u0315\u0316\7\61"+ - "\2\2\u0316\u0317\7,\2\2\u0317\u031b\3\2\2\2\u0318\u031a\n\f\2\2\u0319"+ - "\u0318\3\2\2\2\u031a\u031d\3\2\2\2\u031b\u031c\3\2\2\2\u031b\u0319\3\2"+ - "\2\2\u031c\u031e\3\2\2\2\u031d\u031b\3\2\2\2\u031e\u031f\7,\2\2\u031f"+ - "\u0320\7\61\2\2\u0320\u0321\3\2\2\2\u0321\u0322\bc\3\2\u0322\u00c7\3\2"+ - "\2\2\u0323\u0324\7\61\2\2\u0324\u0325\7\61\2\2\u0325\u0329\3\2\2\2\u0326"+ - "\u0328\n\f\2\2\u0327\u0326\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3\2"+ - "\2\2\u0329\u032a\3\2\2\2\u032a\u032c\3\2\2\2\u032b\u0329\3\2\2\2\u032c"+ - "\u032d\bd\3\2\u032d\u00c9\3\2\2\2\u032e\u0330\t\f\2\2\u032f\u032e\3\2"+ - "\2\2\u0330\u0331\3\2\2\2\u0331\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332"+ - "\u0341\3\2\2\2\u0333\u0341\7=\2\2\u0334\u0335\7\61\2\2\u0335\u0336\7,"+ - "\2\2\u0336\u033a\3\2\2\2\u0337\u0339\13\2\2\2\u0338\u0337\3\2\2\2\u0339"+ - "\u033c\3\2\2\2\u033a\u033b\3\2\2\2\u033a\u0338\3\2\2\2\u033b\u033d\3\2"+ - "\2\2\u033c\u033a\3\2\2\2\u033d\u033e\7,\2\2\u033e\u0341\7\61\2\2\u033f"+ - "\u0341\7\2\2\3\u0340\u032f\3\2\2\2\u0340\u0333\3\2\2\2\u0340\u0334\3\2"+ - "\2\2\u0340\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0343\be\4\2\u0343"+ - "\u00cb\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0347\bf"+ - "\4\2\u0347\u0348\bf\3\2\u0348\u00cd\3\2\2\2\65\2\3\u0179\u017b\u01e4\u01e9"+ - "\u01ec\u01f3\u01f8\u01fe\u0201\u0206\u020d\u0212\u0218\u021f\u0222\u0225"+ - "\u022a\u022c\u0234\u0239\u023d\u0242\u0245\u024a\u024f\u0252\u0256\u025f"+ - "\u0268\u0272\u0294\u029e\u02a0\u02aa\u02b4\u02bf\u02c9\u02d2\u02ee\u02f2"+ - "\u02f7\u0302\u0308\u0311\u031b\u0329\u0331\u033a\u0340\5\4\3\2\2\3\2\4"+ - "\2\2"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 543392bd0..9045eea1e 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -2780,7 +2780,6 @@ object Desugar extends LazyLogging { for { dArgs <- sequence(args.map { x => option(x.map(exprD(ctx, info)(_))) }) idT = info.typ(base) match { - // TODO handle this case FunctionT(fnArgs, AssertionT) => in.PredT(fnArgs.map(typeD(_, Addressability.rValue)(src)), Addressability.rValue) case _: AbstractType => violation(dArgs.length == dArgs.flatten.length, "non-applied arguments in abstract type") diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 1775b59dd..c6bd8135c 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -809,7 +809,7 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole 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(id)) + identifierList.map(id => PTypeParameter(id, PInterfaceType(Vector(typeConstraint), Vector(), Vector()).at(typeConstraint)).at(id)) } } @@ -2491,11 +2491,6 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole }.asInstanceOf[Vector[P]] } - def visitListNodeIf[P <: PNode, C <: ParserRuleContext](ctx: java.util.List[C], cond: (C => Boolean), select : (C => java.util.List[_ <: ParserRuleContext])): Vector[Vector[P]] = { - ctx.asScala.toVector.collect { - case c if cond(c) => visitListNode(select(c)) - }.asInstanceOf[Vector[Vector[P]]] - } //endregion //region Error reporting and positioning 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 dbc3bf1e1..7d7acce2d 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 @@ -337,11 +337,17 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => } } + /** + * 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() 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 d4db1d6ce..69e7a255c 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 @@ -57,6 +57,7 @@ trait Implements { this: TypeInfoImpl => def syntaxImplements(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) => syntaxImplements(symbType(constraint), r) case (_, _: Type.InterfaceT) => supportedSortForInterfaces(l) and { 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 085669d2e..d9cf4f82d 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 @@ -218,7 +218,7 @@ trait UnderlyingType { this: TypeInfoImpl => } def isTypeParameter(t: Type): Boolean = t match { - case TypeParameterT(_, _, _) => true + 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 7d88cf994..e7a2bb063 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 @@ -36,6 +36,7 @@ trait AmbiguityResolution { this: TypeInfoImpl => }) 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 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 5e403f6df..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 @@ -179,11 +179,12 @@ trait MemberResolution { this: TypeInfoImpl => AdvancedMemberSet.init[TypeMember](predSpecs.map(m => ctxt.createMPredSpec(m))) AdvancedMemberSet.union { topLevel +: es.map(_.terms).map { - case Vector(t: PTypeName) => interfaceMethodSet( + case Vector(t: PTypeName) => underlyingType(symbType(t)) match { - case i: InterfaceT => i - case _ => InterfaceT(PInterfaceType(Vector(), Vector(), Vector()), ctxt) - }).promoteItf(t.name) + 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/typing/ExprTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/ExprTyping.scala index 66df1d282..5a1677597 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 @@ -355,9 +355,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => if (f.uninstantiatedTypeParameters(symb).isEmpty) (noMessages, f) else { // do type inference - val typeMap = args.filter(isTypeParameter).zip(argTypes).map { - case (TypeParameterT(id, _, _), typ) => (PIdnDef(id.name), typ) - }.toMap[PIdnDef, Type] + val typeMap = inferTypeArgumentsFromCall(args, argTypes) val inferredType = f.substitute(typeMap) @@ -731,9 +729,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case f: FunctionT => pattern match { case fc: FunctionCall => // do type inference - val typeMap = f.args.filter(isTypeParameter).zip(fc.args.map(exprType)).map { - case (TypeParameterT(id, _, _), typ) => (PIdnDef(id.name), typ) - }.toMap[PIdnDef, Type] + val typeMap = inferTypeArgumentsFromCall(f.args, fc.args.map(exprType)) f.substitute(typeMap).result case _ => f.result } @@ -1143,6 +1139,13 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => }) } + /** + * 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 733ddae2c..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 @@ -138,7 +138,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => wellDefMisc.valid(typ) }) - case TypeParameter(_, _, _) => LocalMessages(noMessages) + case _: TypeParameter => LocalMessages(noMessages) case _: MethodImpl => LocalMessages(noMessages) // not typed @@ -254,7 +254,7 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case Wildcard(decl, _) => getWildcardType(decl) - case TypeParameter(_, _, _) => SortT + case _: TypeParameter => SortT case e => violation(s"untypable: $e") } 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 da8423a28..5a0aa3a57 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 @@ -181,6 +181,7 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => val substitution = typeDecl.typeParameters.map(_.id).zip(typeArgs).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 { 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 f935bfed0..b6acff09c 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 @@ -99,7 +99,7 @@ trait GhostAssignability { error(left, "ghost error: ghost cannot be assigned to index expressions", isRightGhost) ++ error(left, "ghost error: ghost index are not permitted in index expressions", index.map(exprOrType).exists { case Left(expression) => ghostExprResultClassification(expression) - case Right(pType) => ghostTypeClassification(pType) + case _ => Violation.violation(s"unexpected case reached: index was a type") }) case PNamedOperand(id) => // x := e ~ ghost(e) ==> ghost(x) From aa375f8cf453510272588d9bb7e7e122b4bf37a3 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Fri, 25 Aug 2023 08:38:05 +0200 Subject: [PATCH 35/37] make parameterizable stateless --- .../viper/gobra/ast/frontend/AstPattern.scala | 14 ++++++++++---- .../resolution/AmbiguityResolution.scala | 7 ++----- .../info/implementation/typing/ExprTyping.scala | 16 ++++++++-------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala index 78f7403ab..ecd97d6de 100644 --- a/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala +++ b/src/main/scala/viper/gobra/ast/frontend/AstPattern.scala @@ -20,7 +20,9 @@ object AstPattern { sealed trait Type extends Pattern - case class NamedType(id: PIdnUse, symb: st.ActualTypeEntity) extends Type with Symbolic with Parameterizable + 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 @@ -55,11 +57,15 @@ object AstPattern { def id: PIdnUse } - sealed trait Parameterizable { - var typeArgs: Vector[PType] = Vector() + sealed trait Parameterizable extends Pattern { + def typeArgs: Vector[PType] + + def withTypeArgs(typeArgs: Vector[PType]): Parameterizable } - case class Function(id: PIdnUse, symb: st.Function) extends FunctionKind with Symbolic with 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/frontend/info/implementation/resolution/AmbiguityResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/AmbiguityResolution.scala index e7a2bb063..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 @@ -136,11 +136,8 @@ trait AmbiguityResolution { this: TypeInfoImpl => case n: PIndexedExp => resolve(n.base) match { case Some(f: ap.Parameterizable) => asTypeList(n.index) match { - case Some(typeArgs) => { - f.typeArgs = typeArgs - Some(f) - } - case _ => Some(f) + case Some(typeArgs) => Some(f.withTypeArgs(typeArgs)) + case _ => None } case _ if n.index.length == 1 => { exprOrType(n.index.head) match { 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 5a1677597..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 @@ -38,7 +38,7 @@ 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 => + 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") @@ -102,13 +102,13 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => case n: PIndexedExp => resolve(n) match { - case Some(f@ap.Function(_, symb)) => + case Some(ap.Function(_, symb, typeArgs)) => tree.parent(n).head match { - case _: PInvoke => wellDefPartialIndexTypeArguments(n, symb.decl, f.typeArgs) - case _ => wellDefFullIndexTypeArguments(n, symb.decl, f.typeArgs) + case _: PInvoke => wellDefPartialIndexTypeArguments(n, symb.decl, typeArgs) + case _ => wellDefFullIndexTypeArguments(n, symb.decl, typeArgs) } - case Some(nt@ap.NamedType(_, symb)) if symb.decl.isInstanceOf[PTypeDef] => - wellDefFullIndexTypeArguments(n, symb.decl.asInstanceOf[PTypeDef], nt.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) @@ -263,7 +263,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => resolve(n) match { case Some(_: ap.Function) => symbType(n) - case Some(ap.NamedType(_, symb)) if symb.decl.isInstanceOf[PTypeDef] => symbType(n) + case Some(ap.NamedType(_, symb, _)) if symb.decl.isInstanceOf[PTypeDef] => symbType(n) case Some(ap.IndexedExp(base, index)) => val baseType = exprType(base) @@ -351,7 +351,7 @@ trait ExprTyping extends BaseTyping { this: TypeInfoImpl => val wellTypedArgs = exprType(callee) match { case f@FunctionT(args, _) => val (inferenceErrors: Messages, inferredFunctionType: FunctionT) = c.callee match { - case ap.Function(_, symb) => + case ap.Function(_, symb, _) => if (f.uninstantiatedTypeParameters(symb).isEmpty) (noMessages, f) else { // do type inference From f5375648597fd6caa849812bb49228800d967463 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Fri, 25 Aug 2023 08:57:18 +0200 Subject: [PATCH 36/37] unapplied type args --- src/main/scala/viper/gobra/frontend/Desugar.scala | 8 ++++---- .../info/implementation/property/Assignability.scala | 8 ++++---- .../info/implementation/property/Implements.scala | 2 +- .../info/implementation/property/Satisfiability.scala | 3 +-- .../info/implementation/resolution/TypeSet.scala | 2 -- .../info/implementation/typing/StmtTyping.scala | 2 +- .../info/implementation/typing/TypeTyping.scala | 10 ++++------ .../implementation/typing/ghost/GhostExprTyping.scala | 4 ++-- .../implementation/typing/ghost/GhostMiscTyping.scala | 4 ++-- .../implementation/typing/ghost/GhostStmtTyping.scala | 6 +++--- .../typing/ghost/separation/GhostAssignability.scala | 4 ++-- 11 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index 9045eea1e..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") } @@ -4154,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/info/implementation/property/Assignability.scala b/src/main/scala/viper/gobra/frontend/info/implementation/property/Assignability.scala index 7d7acce2d..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 @@ -85,10 +85,10 @@ trait Assignability extends BaseProperty { this: TypeInfoImpl => 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, ctx)) => assignableToAll(UNTYPED_INT_CONST, TypeSet.from(constraint, this)) - case (NilType, TypeParameterT(_, constraint, ctx)) => assignableToAll(NilType, TypeSet.from(constraint, this)) - case (l, TypeParameterT(_, constraint, ctx)) if !isDefinedType(l) => assignableToAll(l, TypeSet.from(constraint, this)) - case (TypeParameterT(_, constraint, ctx), r) if !isDefinedType(r) => allAssignableTo(TypeSet.from(constraint, this), r) + 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 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 69e7a255c..bce8f113f 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 @@ -40,7 +40,7 @@ trait Implements { this: TypeInfoImpl => def addDemandedEmbeddedInterfaceImplements(itf: Type.InterfaceT): Unit = { 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))) => + case Some(ap.NamedType(_, st.NamedType(PTypeDef(_, int: PInterfaceType, _), _, context), _)) => context.symbType(int) match { case embeddedItfT: Type.InterfaceT => _guaranteedImplements ++= Set((itf, embeddedItfT)) case _ => 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 index 2d4375e12..16d218983 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala @@ -1,7 +1,6 @@ package viper.gobra.frontend.info.implementation.property -import org.bitbucket.inkytonik.kiama.util.Messaging.error -import viper.gobra.ast.frontend.{PIdnUse, PInterfaceType, PNamedOperand, PType, PTypeElement} +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 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 index b5452f767..34b890963 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -2,10 +2,8 @@ package viper.gobra.frontend.info.implementation.resolution import viper.gobra.frontend.info.base.Type._ import viper.gobra.ast.frontend._ -import viper.gobra.frontend.info.ExternalTypeInfo import viper.gobra.frontend.info.implementation.TypeInfoImpl -import scala.annotation.tailrec sealed trait TypeSet object TypeSet { 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 5a0aa3a57..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 @@ -169,16 +169,14 @@ trait TypeTyping extends BaseTyping { this: TypeInfoImpl => case n: PIndexedExp => resolve(n) match { - case Some(f@ap.Function(id, symb)) => - val typeArgs = f.typeArgs.map(typeSymbType) - val substitution = symb.typeParameters.map(_.id).zip(typeArgs).toMap + 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(t@ap.NamedType(id, symb)) if symb.decl.isInstanceOf[PTypeDef] => - val typeArgs = t.typeArgs.map(typeSymbType) + 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).toMap + 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") 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 cdeac97ac..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 } 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 b6acff09c..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") } From b11a8d82507aee5b1037bf2401f53ba5754d5268 Mon Sep 17 00:00:00 2001 From: Colin Pfingstl Date: Fri, 25 Aug 2023 13:49:19 +0200 Subject: [PATCH 37/37] document type set, underlying type and rename syntaxImplements --- .../info/implementation/property/Implements.scala | 6 +++--- .../info/implementation/property/Satisfiability.scala | 2 +- .../info/implementation/property/UnderlyingType.scala | 1 + .../info/implementation/resolution/TypeSet.scala | 11 +++++++++++ .../typing/ghost/GhostMemberTyping.scala | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) 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 bce8f113f..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 @@ -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)) } @@ -55,10 +55,10 @@ trait Implements { this: TypeInfoImpl => (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) => syntaxImplements(symbType(constraint), r) + 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 index 16d218983..f31603d9c 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/property/Satisfiability.scala @@ -23,6 +23,6 @@ trait Satisfiability extends BaseProperty { this: TypeInfoImpl => 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 syntaxImplements(typ, InterfaceT(interfacePType, this)) + }) and implementsMemberSet(typ, InterfaceT(interfacePType, this)) } } 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 d9cf4f82d..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 @@ -22,6 +22,7 @@ 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 } 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 index 34b890963..50e6dd38b 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/TypeSet.scala @@ -6,10 +6,21 @@ 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 { 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)