From 899389ee33a60e0bb028d3dc621028b0f28094cd Mon Sep 17 00:00:00 2001 From: aboyko Date: Wed, 9 Oct 2024 13:12:53 -0400 Subject: [PATCH] [HQL] expand identification variable definition function --- .../commons/jpql/grammars/Jpql.g4 | 6 +- .../ide/vscode/parser/jpql/JpqlParser.java | 336 ++++++++++-------- 2 files changed, 199 insertions(+), 143 deletions(-) diff --git a/headless-services/commons/jpql/grammars/Jpql.g4 b/headless-services/commons/jpql/grammars/Jpql.g4 index a61dbd0083..7b96bcca7e 100644 --- a/headless-services/commons/jpql/grammars/Jpql.g4 +++ b/headless-services/commons/jpql/grammars/Jpql.g4 @@ -598,18 +598,22 @@ trim_character identification_variable : IDENTIFICATION_VARIABLE - | f=(COUNT + | f=(AVG + | COUNT | DATE | FROM | INNER | KEY | LEFT + | MAX + | MIN | NEW | ORDER | OUTER | POWER | FLOOR | SIGN + | SUM | TIME | TYPE | VALUE) diff --git a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/jpql/JpqlParser.java b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/jpql/JpqlParser.java index 3569f3e016..913d1907a2 100644 --- a/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/jpql/JpqlParser.java +++ b/headless-services/commons/jpql/src/main/java/org/springframework/ide/vscode/parser/jpql/JpqlParser.java @@ -636,6 +636,7 @@ public final IdentificationVariableDeclarationOrCollectionMemberDeclarationConte setState(299); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FLOOR: @@ -643,11 +644,14 @@ public final IdentificationVariableDeclarationOrCollectionMemberDeclarationConte case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -1674,6 +1678,7 @@ public final General_subpathContext general_subpath() throws RecognitionExceptio setState(436); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FLOOR: @@ -1681,11 +1686,14 @@ public final General_subpathContext general_subpath() throws RecognitionExceptio case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -2111,7 +2119,7 @@ public final Update_clauseContext update_clause() throws RecognitionException { setState(478); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447339937792L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 34965833473L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447348326400L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 559461724181L) != 0)) { { setState(475); _errHandler.sync(this); @@ -2371,7 +2379,7 @@ public final Delete_clauseContext delete_clause() throws RecognitionException { setState(521); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447339937792L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 34965833473L) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447348326400L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 559461724181L) != 0)) { { setState(518); _errHandler.sync(this); @@ -3674,6 +3682,7 @@ public final General_derived_pathContext general_derived_path() throws Recogniti setState(692); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FLOOR: @@ -3681,11 +3690,14 @@ public final General_derived_pathContext general_derived_path() throws Recogniti case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -4851,6 +4863,7 @@ public final In_itemContext in_item() throws RecognitionException { setState(844); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FALSE: @@ -4859,11 +4872,14 @@ public final In_itemContext in_item() throws RecognitionException { case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TRUE: case TYPE: @@ -5034,6 +5050,7 @@ public final Null_comparison_expressionContext null_comparison_expression() thro setState(864); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case ENTRY: @@ -5042,11 +5059,14 @@ public final Null_comparison_expressionContext null_comparison_expression() thro case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TREAT: case TYPE: @@ -5632,6 +5652,7 @@ public final Comparison_expressionContext comparison_expression() throws Recogni case T__1: case T__13: case T__14: + case AVG: case CASE: case COALESCE: case COUNT: @@ -5643,12 +5664,15 @@ public final Comparison_expressionContext comparison_expression() throws Recogni case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case NULLIF: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TREAT: case TRUE: @@ -5695,6 +5719,7 @@ public final Comparison_expressionContext comparison_expression() throws Recogni case T__1: case T__13: case T__14: + case AVG: case CASE: case COALESCE: case COUNT: @@ -5704,12 +5729,15 @@ public final Comparison_expressionContext comparison_expression() throws Recogni case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case NULLIF: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TREAT: case TYPE: @@ -5816,6 +5844,7 @@ public final Comparison_expressionContext comparison_expression() throws Recogni switch (_input.LA(1)) { case T__13: case T__14: + case AVG: case COUNT: case DATE: case FLOOR: @@ -5823,11 +5852,14 @@ public final Comparison_expressionContext comparison_expression() throws Recogni case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TREAT: case TYPE: @@ -6696,6 +6728,7 @@ public final Boolean_expressionContext boolean_expression() throws RecognitionEx setState(1041); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FLOOR: @@ -6703,11 +6736,14 @@ public final Boolean_expressionContext boolean_expression() throws RecognitionEx case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TREAT: case TYPE: @@ -6952,6 +6988,7 @@ public final Simple_entity_expressionContext simple_entity_expression() throws R setState(1059); _errHandler.sync(this); switch (_input.LA(1)) { + case AVG: case COUNT: case DATE: case FLOOR: @@ -6959,11 +6996,14 @@ public final Simple_entity_expressionContext simple_entity_expression() throws R case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -8669,18 +8709,22 @@ public final Trim_characterContext trim_character() throws RecognitionException public static class Identification_variableContext extends ParserRuleContext { public Token f; public TerminalNode IDENTIFICATION_VARIABLE() { return getToken(JpqlParser.IDENTIFICATION_VARIABLE, 0); } + public TerminalNode AVG() { return getToken(JpqlParser.AVG, 0); } public TerminalNode COUNT() { return getToken(JpqlParser.COUNT, 0); } public TerminalNode DATE() { return getToken(JpqlParser.DATE, 0); } public TerminalNode FROM() { return getToken(JpqlParser.FROM, 0); } public TerminalNode INNER() { return getToken(JpqlParser.INNER, 0); } public TerminalNode KEY() { return getToken(JpqlParser.KEY, 0); } public TerminalNode LEFT() { return getToken(JpqlParser.LEFT, 0); } + public TerminalNode MAX() { return getToken(JpqlParser.MAX, 0); } + public TerminalNode MIN() { return getToken(JpqlParser.MIN, 0); } public TerminalNode NEW() { return getToken(JpqlParser.NEW, 0); } public TerminalNode ORDER() { return getToken(JpqlParser.ORDER, 0); } public TerminalNode OUTER() { return getToken(JpqlParser.OUTER, 0); } public TerminalNode POWER() { return getToken(JpqlParser.POWER, 0); } public TerminalNode FLOOR() { return getToken(JpqlParser.FLOOR, 0); } public TerminalNode SIGN() { return getToken(JpqlParser.SIGN, 0); } + public TerminalNode SUM() { return getToken(JpqlParser.SUM, 0); } public TerminalNode TIME() { return getToken(JpqlParser.TIME, 0); } public TerminalNode TYPE() { return getToken(JpqlParser.TYPE, 0); } public TerminalNode VALUE() { return getToken(JpqlParser.VALUE, 0); } @@ -8713,6 +8757,7 @@ public final Identification_variableContext identification_variable() throws Rec match(IDENTIFICATION_VARIABLE); } break; + case AVG: case COUNT: case DATE: case FLOOR: @@ -8720,11 +8765,14 @@ public final Identification_variableContext identification_variable() throws Rec case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -8733,7 +8781,7 @@ public final Identification_variableContext identification_variable() throws Rec setState(1329); ((Identification_variableContext)_localctx).f = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447337840640L) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & 606095105L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 5912100447346229248L) != 0) || ((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & 9705910293L) != 0)) ) { ((Identification_variableContext)_localctx).f = (Token)_errHandler.recoverInline(this); } else { @@ -8875,6 +8923,7 @@ public final LiteralContext literal() throws RecognitionException { boolean_literal(); } break; + case AVG: case COUNT: case DATE: case FLOOR: @@ -8882,11 +8931,14 @@ public final LiteralContext literal() throws RecognitionException { case INNER: case KEY: case LEFT: + case MAX: + case MIN: case NEW: case ORDER: case OUTER: case POWER: case SIGN: + case SUM: case TIME: case TYPE: case VALUE: @@ -10116,145 +10168,145 @@ private boolean arithmetic_term_sempred(Arithmetic_termContext _localctx, int pr "\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe"+ "\u0100\u0000\u000b\u0004\u0000\u0017\u0017EEGG\\\\\u0002\u0000\u0016\u0016"+ "&&\u0003\u0000\u0012\u0012\u0014\u0014YY\u0001\u0000ij\u0001\u0000\n\u000b"+ - "\u0001\u0000\f\r\u0003\u0000\u0019\u0019==__\f\u0000\u001f\u001f##239"+ - "9<<>>IIQSWW^^ccff\u0001\u0000oq\u0002\u000000bb\u0002\u0000kkmm\u05ef"+ - "\u0000\u0102\u0001\u0000\u0000\u0000\u0002\u0108\u0001\u0000\u0000\u0000"+ - "\u0004\u010a\u0001\u0000\u0000\u0000\u0006\u0118\u0001\u0000\u0000\u0000"+ - "\b\u011c\u0001\u0000\u0000\u0000\n\u0120\u0001\u0000\u0000\u0000\f\u012b"+ - "\u0001\u0000\u0000\u0000\u000e\u012d\u0001\u0000\u0000\u0000\u0010\u0135"+ - "\u0001\u0000\u0000\u0000\u0012\u013b\u0001\u0000\u0000\u0000\u0014\u0144"+ - "\u0001\u0000\u0000\u0000\u0016\u014d\u0001\u0000\u0000\u0000\u0018\u0151"+ - "\u0001\u0000\u0000\u0000\u001a\u0164\u0001\u0000\u0000\u0000\u001c\u0166"+ - "\u0001\u0000\u0000\u0000\u001e\u0172\u0001\u0000\u0000\u0000 \u017e\u0001"+ - "\u0000\u0000\u0000\"\u018d\u0001\u0000\u0000\u0000$\u0199\u0001\u0000"+ - "\u0000\u0000&\u01a5\u0001\u0000\u0000\u0000(\u01a9\u0001\u0000\u0000\u0000"+ - "*\u01b4\u0001\u0000\u0000\u0000,\u01bf\u0001\u0000\u0000\u0000.\u01c1"+ - "\u0001\u0000\u0000\u00000\u01c8\u0001\u0000\u0000\u00002\u01ce\u0001\u0000"+ - "\u0000\u00004\u01d0\u0001\u0000\u0000\u00006\u01d4\u0001\u0000\u0000\u0000"+ - "8\u01d8\u0001\u0000\u0000\u0000:\u01ec\u0001\u0000\u0000\u0000<\u0200"+ - "\u0001\u0000\u0000\u0000>\u0202\u0001\u0000\u0000\u0000@\u020b\u0001\u0000"+ - "\u0000\u0000B\u0217\u0001\u0000\u0000\u0000D\u0228\u0001\u0000\u0000\u0000"+ - "F\u022a\u0001\u0000\u0000\u0000H\u023c\u0001\u0000\u0000\u0000J\u0253"+ - "\u0001\u0000\u0000\u0000L\u0255\u0001\u0000\u0000\u0000N\u0258\u0001\u0000"+ - "\u0000\u0000P\u0264\u0001\u0000\u0000\u0000R\u0266\u0001\u0000\u0000\u0000"+ - "T\u0269\u0001\u0000\u0000\u0000V\u0276\u0001\u0000\u0000\u0000X\u027b"+ - "\u0001\u0000\u0000\u0000Z\u0286\u0001\u0000\u0000\u0000\\\u029f\u0001"+ - "\u0000\u0000\u0000^\u02a9\u0001\u0000\u0000\u0000`\u02b4\u0001\u0000\u0000"+ - "\u0000b\u02b6\u0001\u0000\u0000\u0000d\u02be\u0001\u0000\u0000\u0000f"+ - "\u02c5\u0001\u0000\u0000\u0000h\u02d2\u0001\u0000\u0000\u0000j\u02dc\u0001"+ - "\u0000\u0000\u0000l\u02e5\u0001\u0000\u0000\u0000n\u02e7\u0001\u0000\u0000"+ - "\u0000p\u02f2\u0001\u0000\u0000\u0000r\u02fe\u0001\u0000\u0000\u0000t"+ - "\u0307\u0001\u0000\u0000\u0000v\u0311\u0001\u0000\u0000\u0000x\u032e\u0001"+ - "\u0000\u0000\u0000z\u0332\u0001\u0000\u0000\u0000|\u034c\u0001\u0000\u0000"+ - "\u0000~\u034e\u0001\u0000\u0000\u0000\u0080\u0360\u0001\u0000\u0000\u0000"+ - "\u0082\u0368\u0001\u0000\u0000\u0000\u0084\u036f\u0001\u0000\u0000\u0000"+ - "\u0086\u037c\u0001\u0000\u0000\u0000\u0088\u0381\u0001\u0000\u0000\u0000"+ - "\u008a\u0384\u0001\u0000\u0000\u0000\u008c\u038b\u0001\u0000\u0000\u0000"+ - "\u008e\u03b8\u0001\u0000\u0000\u0000\u0090\u03c0\u0001\u0000\u0000\u0000"+ - "\u0092\u03c2\u0001\u0000\u0000\u0000\u0094\u03cd\u0001\u0000\u0000\u0000"+ - "\u0096\u03d9\u0001\u0000\u0000\u0000\u0098\u03ec\u0001\u0000\u0000\u0000"+ - "\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u0406\u0001\u0000\u0000\u0000"+ - "\u009e\u0411\u0001\u0000\u0000\u0000\u00a0\u041b\u0001\u0000\u0000\u0000"+ - "\u00a2\u041f\u0001\u0000\u0000\u0000\u00a4\u0423\u0001\u0000\u0000\u0000"+ - "\u00a6\u0428\u0001\u0000\u0000\u0000\u00a8\u042a\u0001\u0000\u0000\u0000"+ - "\u00aa\u0486\u0001\u0000\u0000\u0000\u00ac\u0492\u0001\u0000\u0000\u0000"+ - "\u00ae\u04c5\u0001\u0000\u0000\u0000\u00b0\u04c7\u0001\u0000\u0000\u0000"+ - "\u00b2\u04c9\u0001\u0000\u0000\u0000\u00b4\u04d5\u0001\u0000\u0000\u0000"+ - "\u00b6\u04dc\u0001\u0000\u0000\u0000\u00b8\u04de\u0001\u0000\u0000\u0000"+ - "\u00ba\u04e5\u0001\u0000\u0000\u0000\u00bc\u04eb\u0001\u0000\u0000\u0000"+ - "\u00be\u04f1\u0001\u0000\u0000\u0000\u00c0\u04f3\u0001\u0000\u0000\u0000"+ - "\u00c2\u04ff\u0001\u0000\u0000\u0000\u00c4\u0504\u0001\u0000\u0000\u0000"+ - "\u00c6\u0513\u0001\u0000\u0000\u0000\u00c8\u0515\u0001\u0000\u0000\u0000"+ - "\u00ca\u051a\u0001\u0000\u0000\u0000\u00cc\u0525\u0001\u0000\u0000\u0000"+ - "\u00ce\u052e\u0001\u0000\u0000\u0000\u00d0\u0532\u0001\u0000\u0000\u0000"+ - "\u00d2\u0534\u0001\u0000\u0000\u0000\u00d4\u053d\u0001\u0000\u0000\u0000"+ - "\u00d6\u0547\u0001\u0000\u0000\u0000\u00d8\u0549\u0001\u0000\u0000\u0000"+ - "\u00da\u054b\u0001\u0000\u0000\u0000\u00dc\u054d\u0001\u0000\u0000\u0000"+ - "\u00de\u0551\u0001\u0000\u0000\u0000\u00e0\u0553\u0001\u0000\u0000\u0000"+ - "\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0557\u0001\u0000\u0000\u0000"+ - "\u00e6\u0559\u0001\u0000\u0000\u0000\u00e8\u055b\u0001\u0000\u0000\u0000"+ - "\u00ea\u055d\u0001\u0000\u0000\u0000\u00ec\u055f\u0001\u0000\u0000\u0000"+ - "\u00ee\u0561\u0001\u0000\u0000\u0000\u00f0\u0563\u0001\u0000\u0000\u0000"+ - "\u00f2\u0565\u0001\u0000\u0000\u0000\u00f4\u0567\u0001\u0000\u0000\u0000"+ - "\u00f6\u056f\u0001\u0000\u0000\u0000\u00f8\u0571\u0001\u0000\u0000\u0000"+ - "\u00fa\u0573\u0001\u0000\u0000\u0000\u00fc\u0575\u0001\u0000\u0000\u0000"+ - "\u00fe\u0577\u0001\u0000\u0000\u0000\u0100\u057b\u0001\u0000\u0000\u0000"+ - "\u0102\u0103\u0003\u0002\u0001\u0000\u0103\u0104\u0005\u0000\u0000\u0001"+ - "\u0104\u0001\u0001\u0000\u0000\u0000\u0105\u0109\u0003\u0004\u0002\u0000"+ - "\u0106\u0109\u0003\u0006\u0003\u0000\u0107\u0109\u0003\b\u0004\u0000\u0108"+ - "\u0105\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000\u0000\u0000\u0108"+ - "\u0107\u0001\u0000\u0000\u0000\u0109\u0003\u0001\u0000\u0000\u0000\u010a"+ - "\u010b\u0003@ \u0000\u010b\u010d\u0003\n\u0005\u0000\u010c\u010e\u0003"+ - "L&\u0000\u010d\u010c\u0001\u0000\u0000\u0000\u010d\u010e\u0001\u0000\u0000"+ - "\u0000\u010e\u0110\u0001\u0000\u0000\u0000\u010f\u0111\u0003N\'\u0000"+ - "\u0110\u010f\u0001\u0000\u0000\u0000\u0110\u0111\u0001\u0000\u0000\u0000"+ - "\u0111\u0113\u0001\u0000\u0000\u0000\u0112\u0114\u0003R)\u0000\u0113\u0112"+ - "\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000\u0000\u0000\u0114\u0116"+ - "\u0001\u0000\u0000\u0000\u0115\u0117\u0003T*\u0000\u0116\u0115\u0001\u0000"+ - "\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117\u0005\u0001\u0000"+ - "\u0000\u0000\u0118\u011a\u00038\u001c\u0000\u0119\u011b\u0003L&\u0000"+ - "\u011a\u0119\u0001\u0000\u0000\u0000\u011a\u011b\u0001\u0000\u0000\u0000"+ - "\u011b\u0007\u0001\u0000\u0000\u0000\u011c\u011e\u0003>\u001f\u0000\u011d"+ - "\u011f\u0003L&\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011e\u011f\u0001"+ - "\u0000\u0000\u0000\u011f\t\u0001\u0000\u0000\u0000\u0120\u0121\u00053"+ - "\u0000\u0000\u0121\u0126\u0003\u000e\u0007\u0000\u0122\u0123\u0005\u0001"+ - "\u0000\u0000\u0123\u0125\u0003\f\u0006\u0000\u0124\u0122\u0001\u0000\u0000"+ - "\u0000\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000"+ - "\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u000b\u0001\u0000\u0000"+ - "\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012c\u0003\u000e\u0007"+ - "\u0000\u012a\u012c\u0003 \u0010\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+ - "\u012b\u012a\u0001\u0000\u0000\u0000\u012c\r\u0001\u0000\u0000\u0000\u012d"+ - "\u0132\u0003\u0010\b\u0000\u012e\u0131\u0003\u0012\t\u0000\u012f\u0131"+ - "\u0003\u0014\n\u0000\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u012f\u0001"+ - "\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132\u0130\u0001"+ - "\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u000f\u0001"+ - "\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0137\u0003"+ - "\u00f4z\u0000\u0136\u0138\u0005\u0015\u0000\u0000\u0137\u0136\u0001\u0000"+ - "\u0000\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000"+ - "\u0000\u0000\u0139\u013a\u0003\u00d0h\u0000\u013a\u0011\u0001\u0000\u0000"+ - "\u0000\u013b\u013c\u0003\u0016\u000b\u0000\u013c\u013e\u0003\u001a\r\u0000"+ - "\u013d\u013f\u0005\u0015\u0000\u0000\u013e\u013d\u0001\u0000\u0000\u0000"+ - "\u013e\u013f\u0001\u0000\u0000\u0000\u013f\u0140\u0001\u0000\u0000\u0000"+ - "\u0140\u0142\u0003\u00d0h\u0000\u0141\u0143\u0003\u0018\f\u0000\u0142"+ - "\u0141\u0001\u0000\u0000\u0000\u0142\u0143\u0001\u0000\u0000\u0000\u0143"+ - "\u0013\u0001\u0000\u0000\u0000\u0144\u0145\u0003\u0016\u000b\u0000\u0145"+ - "\u0146\u00051\u0000\u0000\u0146\u0147\u0003\u001a\r\u0000\u0147\u0015"+ - "\u0001\u0000\u0000\u0000\u0148\u014a\u0005>\u0000\u0000\u0149\u014b\u0005"+ - "R\u0000\u0000\u014a\u0149\u0001\u0000\u0000\u0000\u014a\u014b\u0001\u0000"+ - "\u0000\u0000\u014b\u014e\u0001\u0000\u0000\u0000\u014c\u014e\u00059\u0000"+ - "\u0000\u014d\u0148\u0001\u0000\u0000\u0000\u014d\u014c\u0001\u0000\u0000"+ - "\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e\u014f\u0001\u0000\u0000"+ - "\u0000\u014f\u0150\u0005;\u0000\u0000\u0150\u0017\u0001\u0000\u0000\u0000"+ - "\u0151\u0152\u0005O\u0000\u0000\u0152\u0153\u0003n7\u0000\u0153\u0019"+ - "\u0001\u0000\u0000\u0000\u0154\u0165\u0003\u001c\u000e\u0000\u0155\u0165"+ - "\u0003\u001e\u000f\u0000\u0156\u0157\u0005`\u0000\u0000\u0157\u0158\u0005"+ - "\u0002\u0000\u0000\u0158\u0159\u0003\u001c\u000e\u0000\u0159\u015a\u0005"+ - "\u0015\u0000\u0000\u015a\u015b\u0003\u00eau\u0000\u015b\u015c\u0005\u0003"+ - "\u0000\u0000\u015c\u0165\u0001\u0000\u0000\u0000\u015d\u015e\u0005`\u0000"+ - "\u0000\u015e\u015f\u0005\u0002\u0000\u0000\u015f\u0160\u0003\u001e\u000f"+ - "\u0000\u0160\u0161\u0005\u0015\u0000\u0000\u0161\u0162\u0003\u00eau\u0000"+ - "\u0162\u0163\u0005\u0003\u0000\u0000\u0163\u0165\u0001\u0000\u0000\u0000"+ - "\u0164\u0154\u0001\u0000\u0000\u0000\u0164\u0155\u0001\u0000\u0000\u0000"+ - "\u0164\u0156\u0001\u0000\u0000\u0000\u0164\u015d\u0001\u0000\u0000\u0000"+ - "\u0165\u001b\u0001\u0000\u0000\u0000\u0166\u0167\u0003\u00d0h\u0000\u0167"+ - "\u016d\u0005\u0004\u0000\u0000\u0168\u0169\u0003\u00e8t\u0000\u0169\u016a"+ - "\u0005\u0004\u0000\u0000\u016a\u016c\u0001\u0000\u0000\u0000\u016b\u0168"+ - "\u0001\u0000\u0000\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016b"+ - "\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e\u0170"+ - "\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170\u0171"+ - "\u0003\u00ecv\u0000\u0171\u001d\u0001\u0000\u0000\u0000\u0172\u0173\u0003"+ - "\u00d0h\u0000\u0173\u0179\u0005\u0004\u0000\u0000\u0174\u0175\u0003\u00e8"+ - "t\u0000\u0175\u0176\u0005\u0004\u0000\u0000\u0176\u0178\u0001\u0000\u0000"+ - "\u0000\u0177\u0174\u0001\u0000\u0000\u0000\u0178\u017b\u0001\u0000\u0000"+ - "\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000\u0000"+ - "\u0000\u017a\u017c\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000\u0000"+ - "\u0000\u017c\u017d\u0003\u00eew\u0000\u017d\u001f\u0001\u0000\u0000\u0000"+ - "\u017e\u017f\u00057\u0000\u0000\u017f\u0180\u0005\u0002\u0000\u0000\u0180"+ - "\u0181\u00036\u001b\u0000\u0181\u0183\u0005\u0003\u0000\u0000\u0182\u0184"+ - "\u0005\u0015\u0000\u0000\u0183\u0182\u0001\u0000\u0000\u0000\u0183\u0184"+ - "\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0186"+ - "\u0003\u00d0h\u0000\u0186!\u0001\u0000\u0000\u0000\u0187\u018e\u0003$"+ - "\u0012\u0000\u0188\u0189\u0005+\u0000\u0000\u0189\u018a\u0005\u0002\u0000"+ + "\u0001\u0000\f\r\u0003\u0000\u0019\u0019==__\u0010\u0000\u0017\u0017\u001f"+ + "\u001f##2399<<>>EEGGIIQSWW\\\\^^ccff\u0001\u0000oq\u0002\u000000bb\u0002"+ + "\u0000kkmm\u05ef\u0000\u0102\u0001\u0000\u0000\u0000\u0002\u0108\u0001"+ + "\u0000\u0000\u0000\u0004\u010a\u0001\u0000\u0000\u0000\u0006\u0118\u0001"+ + "\u0000\u0000\u0000\b\u011c\u0001\u0000\u0000\u0000\n\u0120\u0001\u0000"+ + "\u0000\u0000\f\u012b\u0001\u0000\u0000\u0000\u000e\u012d\u0001\u0000\u0000"+ + "\u0000\u0010\u0135\u0001\u0000\u0000\u0000\u0012\u013b\u0001\u0000\u0000"+ + "\u0000\u0014\u0144\u0001\u0000\u0000\u0000\u0016\u014d\u0001\u0000\u0000"+ + "\u0000\u0018\u0151\u0001\u0000\u0000\u0000\u001a\u0164\u0001\u0000\u0000"+ + "\u0000\u001c\u0166\u0001\u0000\u0000\u0000\u001e\u0172\u0001\u0000\u0000"+ + "\u0000 \u017e\u0001\u0000\u0000\u0000\"\u018d\u0001\u0000\u0000\u0000"+ + "$\u0199\u0001\u0000\u0000\u0000&\u01a5\u0001\u0000\u0000\u0000(\u01a9"+ + "\u0001\u0000\u0000\u0000*\u01b4\u0001\u0000\u0000\u0000,\u01bf\u0001\u0000"+ + "\u0000\u0000.\u01c1\u0001\u0000\u0000\u00000\u01c8\u0001\u0000\u0000\u0000"+ + "2\u01ce\u0001\u0000\u0000\u00004\u01d0\u0001\u0000\u0000\u00006\u01d4"+ + "\u0001\u0000\u0000\u00008\u01d8\u0001\u0000\u0000\u0000:\u01ec\u0001\u0000"+ + "\u0000\u0000<\u0200\u0001\u0000\u0000\u0000>\u0202\u0001\u0000\u0000\u0000"+ + "@\u020b\u0001\u0000\u0000\u0000B\u0217\u0001\u0000\u0000\u0000D\u0228"+ + "\u0001\u0000\u0000\u0000F\u022a\u0001\u0000\u0000\u0000H\u023c\u0001\u0000"+ + "\u0000\u0000J\u0253\u0001\u0000\u0000\u0000L\u0255\u0001\u0000\u0000\u0000"+ + "N\u0258\u0001\u0000\u0000\u0000P\u0264\u0001\u0000\u0000\u0000R\u0266"+ + "\u0001\u0000\u0000\u0000T\u0269\u0001\u0000\u0000\u0000V\u0276\u0001\u0000"+ + "\u0000\u0000X\u027b\u0001\u0000\u0000\u0000Z\u0286\u0001\u0000\u0000\u0000"+ + "\\\u029f\u0001\u0000\u0000\u0000^\u02a9\u0001\u0000\u0000\u0000`\u02b4"+ + "\u0001\u0000\u0000\u0000b\u02b6\u0001\u0000\u0000\u0000d\u02be\u0001\u0000"+ + "\u0000\u0000f\u02c5\u0001\u0000\u0000\u0000h\u02d2\u0001\u0000\u0000\u0000"+ + "j\u02dc\u0001\u0000\u0000\u0000l\u02e5\u0001\u0000\u0000\u0000n\u02e7"+ + "\u0001\u0000\u0000\u0000p\u02f2\u0001\u0000\u0000\u0000r\u02fe\u0001\u0000"+ + "\u0000\u0000t\u0307\u0001\u0000\u0000\u0000v\u0311\u0001\u0000\u0000\u0000"+ + "x\u032e\u0001\u0000\u0000\u0000z\u0332\u0001\u0000\u0000\u0000|\u034c"+ + "\u0001\u0000\u0000\u0000~\u034e\u0001\u0000\u0000\u0000\u0080\u0360\u0001"+ + "\u0000\u0000\u0000\u0082\u0368\u0001\u0000\u0000\u0000\u0084\u036f\u0001"+ + "\u0000\u0000\u0000\u0086\u037c\u0001\u0000\u0000\u0000\u0088\u0381\u0001"+ + "\u0000\u0000\u0000\u008a\u0384\u0001\u0000\u0000\u0000\u008c\u038b\u0001"+ + "\u0000\u0000\u0000\u008e\u03b8\u0001\u0000\u0000\u0000\u0090\u03c0\u0001"+ + "\u0000\u0000\u0000\u0092\u03c2\u0001\u0000\u0000\u0000\u0094\u03cd\u0001"+ + "\u0000\u0000\u0000\u0096\u03d9\u0001\u0000\u0000\u0000\u0098\u03ec\u0001"+ + "\u0000\u0000\u0000\u009a\u03f9\u0001\u0000\u0000\u0000\u009c\u0406\u0001"+ + "\u0000\u0000\u0000\u009e\u0411\u0001\u0000\u0000\u0000\u00a0\u041b\u0001"+ + "\u0000\u0000\u0000\u00a2\u041f\u0001\u0000\u0000\u0000\u00a4\u0423\u0001"+ + "\u0000\u0000\u0000\u00a6\u0428\u0001\u0000\u0000\u0000\u00a8\u042a\u0001"+ + "\u0000\u0000\u0000\u00aa\u0486\u0001\u0000\u0000\u0000\u00ac\u0492\u0001"+ + "\u0000\u0000\u0000\u00ae\u04c5\u0001\u0000\u0000\u0000\u00b0\u04c7\u0001"+ + "\u0000\u0000\u0000\u00b2\u04c9\u0001\u0000\u0000\u0000\u00b4\u04d5\u0001"+ + "\u0000\u0000\u0000\u00b6\u04dc\u0001\u0000\u0000\u0000\u00b8\u04de\u0001"+ + "\u0000\u0000\u0000\u00ba\u04e5\u0001\u0000\u0000\u0000\u00bc\u04eb\u0001"+ + "\u0000\u0000\u0000\u00be\u04f1\u0001\u0000\u0000\u0000\u00c0\u04f3\u0001"+ + "\u0000\u0000\u0000\u00c2\u04ff\u0001\u0000\u0000\u0000\u00c4\u0504\u0001"+ + "\u0000\u0000\u0000\u00c6\u0513\u0001\u0000\u0000\u0000\u00c8\u0515\u0001"+ + "\u0000\u0000\u0000\u00ca\u051a\u0001\u0000\u0000\u0000\u00cc\u0525\u0001"+ + "\u0000\u0000\u0000\u00ce\u052e\u0001\u0000\u0000\u0000\u00d0\u0532\u0001"+ + "\u0000\u0000\u0000\u00d2\u0534\u0001\u0000\u0000\u0000\u00d4\u053d\u0001"+ + "\u0000\u0000\u0000\u00d6\u0547\u0001\u0000\u0000\u0000\u00d8\u0549\u0001"+ + "\u0000\u0000\u0000\u00da\u054b\u0001\u0000\u0000\u0000\u00dc\u054d\u0001"+ + "\u0000\u0000\u0000\u00de\u0551\u0001\u0000\u0000\u0000\u00e0\u0553\u0001"+ + "\u0000\u0000\u0000\u00e2\u0555\u0001\u0000\u0000\u0000\u00e4\u0557\u0001"+ + "\u0000\u0000\u0000\u00e6\u0559\u0001\u0000\u0000\u0000\u00e8\u055b\u0001"+ + "\u0000\u0000\u0000\u00ea\u055d\u0001\u0000\u0000\u0000\u00ec\u055f\u0001"+ + "\u0000\u0000\u0000\u00ee\u0561\u0001\u0000\u0000\u0000\u00f0\u0563\u0001"+ + "\u0000\u0000\u0000\u00f2\u0565\u0001\u0000\u0000\u0000\u00f4\u0567\u0001"+ + "\u0000\u0000\u0000\u00f6\u056f\u0001\u0000\u0000\u0000\u00f8\u0571\u0001"+ + "\u0000\u0000\u0000\u00fa\u0573\u0001\u0000\u0000\u0000\u00fc\u0575\u0001"+ + "\u0000\u0000\u0000\u00fe\u0577\u0001\u0000\u0000\u0000\u0100\u057b\u0001"+ + "\u0000\u0000\u0000\u0102\u0103\u0003\u0002\u0001\u0000\u0103\u0104\u0005"+ + "\u0000\u0000\u0001\u0104\u0001\u0001\u0000\u0000\u0000\u0105\u0109\u0003"+ + "\u0004\u0002\u0000\u0106\u0109\u0003\u0006\u0003\u0000\u0107\u0109\u0003"+ + "\b\u0004\u0000\u0108\u0105\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000"+ + "\u0000\u0000\u0108\u0107\u0001\u0000\u0000\u0000\u0109\u0003\u0001\u0000"+ + "\u0000\u0000\u010a\u010b\u0003@ \u0000\u010b\u010d\u0003\n\u0005\u0000"+ + "\u010c\u010e\u0003L&\u0000\u010d\u010c\u0001\u0000\u0000\u0000\u010d\u010e"+ + "\u0001\u0000\u0000\u0000\u010e\u0110\u0001\u0000\u0000\u0000\u010f\u0111"+ + "\u0003N\'\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0110\u0111\u0001"+ + "\u0000\u0000\u0000\u0111\u0113\u0001\u0000\u0000\u0000\u0112\u0114\u0003"+ + "R)\u0000\u0113\u0112\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000\u0000"+ + "\u0000\u0114\u0116\u0001\u0000\u0000\u0000\u0115\u0117\u0003T*\u0000\u0116"+ + "\u0115\u0001\u0000\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117"+ + "\u0005\u0001\u0000\u0000\u0000\u0118\u011a\u00038\u001c\u0000\u0119\u011b"+ + "\u0003L&\u0000\u011a\u0119\u0001\u0000\u0000\u0000\u011a\u011b\u0001\u0000"+ + "\u0000\u0000\u011b\u0007\u0001\u0000\u0000\u0000\u011c\u011e\u0003>\u001f"+ + "\u0000\u011d\u011f\u0003L&\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011e"+ + "\u011f\u0001\u0000\u0000\u0000\u011f\t\u0001\u0000\u0000\u0000\u0120\u0121"+ + "\u00053\u0000\u0000\u0121\u0126\u0003\u000e\u0007\u0000\u0122\u0123\u0005"+ + "\u0001\u0000\u0000\u0123\u0125\u0003\f\u0006\u0000\u0124\u0122\u0001\u0000"+ + "\u0000\u0000\u0125\u0128\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000"+ + "\u0000\u0000\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u000b\u0001\u0000"+ + "\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012c\u0003\u000e"+ + "\u0007\u0000\u012a\u012c\u0003 \u0010\u0000\u012b\u0129\u0001\u0000\u0000"+ + "\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012c\r\u0001\u0000\u0000\u0000"+ + "\u012d\u0132\u0003\u0010\b\u0000\u012e\u0131\u0003\u0012\t\u0000\u012f"+ + "\u0131\u0003\u0014\n\u0000\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u012f"+ + "\u0001\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132\u0130"+ + "\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u000f"+ + "\u0001\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0137"+ + "\u0003\u00f4z\u0000\u0136\u0138\u0005\u0015\u0000\u0000\u0137\u0136\u0001"+ + "\u0000\u0000\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u0139\u0001"+ + "\u0000\u0000\u0000\u0139\u013a\u0003\u00d0h\u0000\u013a\u0011\u0001\u0000"+ + "\u0000\u0000\u013b\u013c\u0003\u0016\u000b\u0000\u013c\u013e\u0003\u001a"+ + "\r\u0000\u013d\u013f\u0005\u0015\u0000\u0000\u013e\u013d\u0001\u0000\u0000"+ + "\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f\u0140\u0001\u0000\u0000"+ + "\u0000\u0140\u0142\u0003\u00d0h\u0000\u0141\u0143\u0003\u0018\f\u0000"+ + "\u0142\u0141\u0001\u0000\u0000\u0000\u0142\u0143\u0001\u0000\u0000\u0000"+ + "\u0143\u0013\u0001\u0000\u0000\u0000\u0144\u0145\u0003\u0016\u000b\u0000"+ + "\u0145\u0146\u00051\u0000\u0000\u0146\u0147\u0003\u001a\r\u0000\u0147"+ + "\u0015\u0001\u0000\u0000\u0000\u0148\u014a\u0005>\u0000\u0000\u0149\u014b"+ + "\u0005R\u0000\u0000\u014a\u0149\u0001\u0000\u0000\u0000\u014a\u014b\u0001"+ + "\u0000\u0000\u0000\u014b\u014e\u0001\u0000\u0000\u0000\u014c\u014e\u0005"+ + "9\u0000\u0000\u014d\u0148\u0001\u0000\u0000\u0000\u014d\u014c\u0001\u0000"+ + "\u0000\u0000\u014d\u014e\u0001\u0000\u0000\u0000\u014e\u014f\u0001\u0000"+ + "\u0000\u0000\u014f\u0150\u0005;\u0000\u0000\u0150\u0017\u0001\u0000\u0000"+ + "\u0000\u0151\u0152\u0005O\u0000\u0000\u0152\u0153\u0003n7\u0000\u0153"+ + "\u0019\u0001\u0000\u0000\u0000\u0154\u0165\u0003\u001c\u000e\u0000\u0155"+ + "\u0165\u0003\u001e\u000f\u0000\u0156\u0157\u0005`\u0000\u0000\u0157\u0158"+ + "\u0005\u0002\u0000\u0000\u0158\u0159\u0003\u001c\u000e\u0000\u0159\u015a"+ + "\u0005\u0015\u0000\u0000\u015a\u015b\u0003\u00eau\u0000\u015b\u015c\u0005"+ + "\u0003\u0000\u0000\u015c\u0165\u0001\u0000\u0000\u0000\u015d\u015e\u0005"+ + "`\u0000\u0000\u015e\u015f\u0005\u0002\u0000\u0000\u015f\u0160\u0003\u001e"+ + "\u000f\u0000\u0160\u0161\u0005\u0015\u0000\u0000\u0161\u0162\u0003\u00ea"+ + "u\u0000\u0162\u0163\u0005\u0003\u0000\u0000\u0163\u0165\u0001\u0000\u0000"+ + "\u0000\u0164\u0154\u0001\u0000\u0000\u0000\u0164\u0155\u0001\u0000\u0000"+ + "\u0000\u0164\u0156\u0001\u0000\u0000\u0000\u0164\u015d\u0001\u0000\u0000"+ + "\u0000\u0165\u001b\u0001\u0000\u0000\u0000\u0166\u0167\u0003\u00d0h\u0000"+ + "\u0167\u016d\u0005\u0004\u0000\u0000\u0168\u0169\u0003\u00e8t\u0000\u0169"+ + "\u016a\u0005\u0004\u0000\u0000\u016a\u016c\u0001\u0000\u0000\u0000\u016b"+ + "\u0168\u0001\u0000\u0000\u0000\u016c\u016f\u0001\u0000\u0000\u0000\u016d"+ + "\u016b\u0001\u0000\u0000\u0000\u016d\u016e\u0001\u0000\u0000\u0000\u016e"+ + "\u0170\u0001\u0000\u0000\u0000\u016f\u016d\u0001\u0000\u0000\u0000\u0170"+ + "\u0171\u0003\u00ecv\u0000\u0171\u001d\u0001\u0000\u0000\u0000\u0172\u0173"+ + "\u0003\u00d0h\u0000\u0173\u0179\u0005\u0004\u0000\u0000\u0174\u0175\u0003"+ + "\u00e8t\u0000\u0175\u0176\u0005\u0004\u0000\u0000\u0176\u0178\u0001\u0000"+ + "\u0000\u0000\u0177\u0174\u0001\u0000\u0000\u0000\u0178\u017b\u0001\u0000"+ + "\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000"+ + "\u0000\u0000\u017a\u017c\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000"+ + "\u0000\u0000\u017c\u017d\u0003\u00eew\u0000\u017d\u001f\u0001\u0000\u0000"+ + "\u0000\u017e\u017f\u00057\u0000\u0000\u017f\u0180\u0005\u0002\u0000\u0000"+ + "\u0180\u0181\u00036\u001b\u0000\u0181\u0183\u0005\u0003\u0000\u0000\u0182"+ + "\u0184\u0005\u0015\u0000\u0000\u0183\u0182\u0001\u0000\u0000\u0000\u0183"+ + "\u0184\u0001\u0000\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185"+ + "\u0186\u0003\u00d0h\u0000\u0186!\u0001\u0000\u0000\u0000\u0187\u018e\u0003"+ + "$\u0012\u0000\u0188\u0189\u0005+\u0000\u0000\u0189\u018a\u0005\u0002\u0000"+ "\u0000\u018a\u018b\u0003\u00d0h\u0000\u018b\u018c\u0005\u0003\u0000\u0000"+ "\u018c\u018e\u0001\u0000\u0000\u0000\u018d\u0187\u0001\u0000\u0000\u0000"+ "\u018d\u0188\u0001\u0000\u0000\u0000\u018e#\u0001\u0000\u0000\u0000\u018f"+