Implement parsing switch statements

Put in some groundwork for parsing switch statements and case labels in
the parser, including definitions for IntermNode classes. Intermediate
functions for adding the statements are stubbed to only generate errors
for now.

Tested by manually disabling shading language version checks for switch
in a Chromium build and checking that the expected errors are generated.

BUG=angle:921

Change-Id: I064b3e0c4c1b724a083cf5bc78eebfdd3794eb1b
Reviewed-on: https://chromium-review.googlesource.com/250380
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index 6ebe86f..7b83fde 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -244,6 +244,21 @@
     return false;
 }
 
+bool TIntermSwitch::replaceChildNode(
+    TIntermNode *original, TIntermNode *replacement)
+{
+    REPLACE_IF_IS(mInit, TIntermTyped, original, replacement);
+    REPLACE_IF_IS(mStatementList, TIntermAggregate, original, replacement);
+    return false;
+}
+
+bool TIntermCase::replaceChildNode(
+    TIntermNode *original, TIntermNode *replacement)
+{
+    REPLACE_IF_IS(mCondition, TIntermTyped, original, replacement);
+    return false;
+}
+
 //
 // Say whether or not an operation node changes the value of a variable.
 //
diff --git a/src/compiler/translator/IntermNode.h b/src/compiler/translator/IntermNode.h
index 3ea3691..5e09718 100644
--- a/src/compiler/translator/IntermNode.h
+++ b/src/compiler/translator/IntermNode.h
@@ -33,6 +33,8 @@
 class TIntermUnary;
 class TIntermConstantUnion;
 class TIntermSelection;
+class TIntermSwitch;
+class TIntermCase;
 class TIntermTyped;
 class TIntermSymbol;
 class TIntermLoop;
@@ -66,6 +68,8 @@
     virtual TIntermBinary *getAsBinaryNode() { return 0; }
     virtual TIntermUnary *getAsUnaryNode() { return 0; }
     virtual TIntermSelection *getAsSelectionNode() { return 0; }
+    virtual TIntermSwitch *getAsSwitchNode() { return 0; }
+    virtual TIntermCase *getAsCaseNode() { return 0; }
     virtual TIntermSymbol *getAsSymbolNode() { return 0; }
     virtual TIntermLoop *getAsLoopNode() { return 0; }
     virtual TIntermRaw *getAsRawNode() { return 0; }
@@ -453,7 +457,7 @@
 };
 
 //
-// For if tests.  Simplified since there is no switch statement.
+// For if tests.
 //
 class TIntermSelection : public TIntermTyped
 {
@@ -489,6 +493,55 @@
     TIntermNode *mFalseBlock;
 };
 
+//
+// Switch statement.
+//
+class TIntermSwitch : public TIntermNode
+{
+  public:
+    TIntermSwitch(TIntermTyped *init, TIntermAggregate *statementList)
+        : TIntermNode(),
+          mInit(init),
+          mStatementList(statementList)
+    {
+    }
+
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(
+        TIntermNode *original, TIntermNode *replacement) override;
+
+    TIntermSwitch *getAsSwitchNode() override { return this; }
+
+  protected:
+    TIntermTyped *mInit;
+    TIntermAggregate *mStatementList;
+};
+
+//
+// Case label.
+//
+class TIntermCase : public TIntermNode
+{
+  public:
+    TIntermCase(TIntermTyped *condition)
+        : TIntermNode(),
+          mCondition(condition)
+    {
+    }
+
+    void traverse(TIntermTraverser *it) override;
+    bool replaceChildNode(
+        TIntermNode *original, TIntermNode *replacement) override;
+
+    TIntermCase *getAsCaseNode() override { return this; }
+
+    bool hasCondition() const { return mCondition != nullptr; }
+    TIntermTyped *getCondition() const { return mCondition; }
+
+  protected:
+    TIntermTyped *mCondition;
+};
+
 enum Visit
 {
     PreVisit,
@@ -525,6 +578,8 @@
     virtual bool visitBinary(Visit, TIntermBinary *) { return true; }
     virtual bool visitUnary(Visit, TIntermUnary *) { return true; }
     virtual bool visitSelection(Visit, TIntermSelection *) { return true; }
+    virtual bool visitSwitch(Visit, TIntermSwitch *) { return true; }
+    virtual bool visitCase(Visit, TIntermCase *) { return true; }
     virtual bool visitAggregate(Visit, TIntermAggregate *) { return true; }
     virtual bool visitLoop(Visit, TIntermLoop *) { return true; }
     virtual bool visitBranch(Visit, TIntermBranch *) { return true; }
diff --git a/src/compiler/translator/IntermTraverse.cpp b/src/compiler/translator/IntermTraverse.cpp
index 72b2033..7a7efb7 100644
--- a/src/compiler/translator/IntermTraverse.cpp
+++ b/src/compiler/translator/IntermTraverse.cpp
@@ -194,6 +194,60 @@
 }
 
 //
+// Traverse a switch node.  Same comments in binary node apply here.
+//
+void TIntermSwitch::traverse(TIntermTraverser *it)
+{
+    bool visit = true;
+
+    if (it->preVisit)
+        visit = it->visitSwitch(PreVisit, this);
+
+    if (visit)
+    {
+        it->incrementDepth(this);
+        if (it->rightToLeft)
+        {
+            if (mStatementList)
+                mStatementList->traverse(it);
+            if (it->inVisit)
+                visit = it->visitSwitch(InVisit, this);
+            if (visit)
+                mInit->traverse(it);
+        }
+        else
+        {
+            mInit->traverse(it);
+            if (it->inVisit)
+                visit = it->visitSwitch(InVisit, this);
+            if (visit && mStatementList)
+                mStatementList->traverse(it);
+        }
+        it->decrementDepth();
+    }
+
+    if (visit && it->postVisit)
+        it->visitSwitch(PostVisit, this);
+}
+
+//
+// Traverse a switch node.  Same comments in binary node apply here.
+//
+void TIntermCase::traverse(TIntermTraverser *it)
+{
+    bool visit = true;
+
+    if (it->preVisit)
+        visit = it->visitCase(PreVisit, this);
+
+    if (visit && mCondition)
+        mCondition->traverse(it);
+
+    if (visit && it->postVisit)
+        it->visitCase(PostVisit, this);
+}
+
+//
 // Traverse a loop node.  Same comments in binary node apply here.
 //
 void TIntermLoop::traverse(TIntermTraverser *it)
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index 5e29cd2..e5dc968 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -458,6 +458,22 @@
     return node;
 }
 
+TIntermSwitch *TIntermediate::addSwitch(
+    TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &line)
+{
+    mInfoSink.info.message(EPrefixInternalError, line,
+        "Switch statements are disabled for now");
+    return nullptr;
+}
+
+TIntermCase *TIntermediate::addCase(
+    TIntermTyped *condition, const TSourceLoc &line)
+{
+    mInfoSink.info.message(EPrefixInternalError, line,
+        "Case labels and default labels are disabled for now");
+    return nullptr;
+}
+
 //
 // Constant terminal nodes.  Has a union that contains bool, float or int constants
 //
diff --git a/src/compiler/translator/Intermediate.h b/src/compiler/translator/Intermediate.h
index cb5b060..b6c2455 100644
--- a/src/compiler/translator/Intermediate.h
+++ b/src/compiler/translator/Intermediate.h
@@ -43,6 +43,10 @@
     TIntermNode *addSelection(TIntermTyped *cond, TIntermNodePair code, const TSourceLoc &);
     TIntermTyped *addSelection(
         TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock, const TSourceLoc &);
+    TIntermSwitch *addSwitch(
+        TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &line);
+    TIntermCase *addCase(
+        TIntermTyped *condition, const TSourceLoc &line);
     TIntermTyped *addComma(
         TIntermTyped *left, TIntermTyped *right, const TSourceLoc &);
     TIntermConstantUnion *addConstantUnion(ConstantUnion *, const TType &, const TSourceLoc &);
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 5c89a3b..f4a29db 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -2608,6 +2608,42 @@
     return publicType;
 }
 
+TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &loc)
+{
+    TIntermSwitch *node = intermediate.addSwitch(init, statementList, loc);
+    if (node == nullptr)
+    {
+        error(loc, "erroneous switch statement", "switch");
+        recover();
+        return nullptr;
+    }
+    return node;
+}
+
+TIntermCase *TParseContext::addCase(TIntermTyped *condition, const TSourceLoc &loc)
+{
+    TIntermCase *node = intermediate.addCase(condition, loc);
+    if (node == nullptr)
+    {
+        error(loc, "erroneous case statement", "case");
+        recover();
+        return nullptr;
+    }
+    return node;
+}
+
+TIntermCase *TParseContext::addDefault(const TSourceLoc &loc)
+{
+    TIntermCase *node = intermediate.addCase(nullptr, loc);
+    if (node == nullptr)
+    {
+        error(loc, "erroneous default statement", "default");
+        recover();
+        return nullptr;
+    }
+    return node;
+}
+
 TIntermTyped *TParseContext::addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc)
 {
     TIntermTyped *node = intermediate.addUnaryMath(op, child, loc);
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index b712730..a4e28de 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -164,6 +164,10 @@
 
     bool structNestingErrorCheck(const TSourceLoc& line, const TField& field);
 
+    TIntermSwitch *addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &loc);
+    TIntermCase *addCase(TIntermTyped *condition, const TSourceLoc &loc);
+    TIntermCase *addDefault(const TSourceLoc &loc);
+
     TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &);
     TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &);
     TIntermTyped *addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right,
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 12a410e..95eaaf6 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -71,6 +71,8 @@
             TIntermNodePair nodePair;
             TIntermTyped* intermTypedNode;
             TIntermAggregate* intermAggregate;
+            TIntermSwitch* intermSwitch;
+            TIntermCase* intermCase;
         };
         union {
             TPublicType type;
@@ -178,6 +180,8 @@
 %type <interm.intermNode> declaration external_declaration
 %type <interm.intermNode> for_init_statement compound_statement_no_new_scope
 %type <interm.nodePair> selection_rest_statement for_rest_statement
+%type <interm.intermSwitch> switch_statement
+%type <interm.intermCase> case_label
 %type <interm.intermNode> iteration_statement jump_statement statement_no_new_scope statement_with_scope
 %type <interm> single_declaration init_declarator_list
 
@@ -1521,12 +1525,14 @@
     | simple_statement    { $$ = $1; }
     ;
 
-// Grammar Note:  No labeled statements; 'goto' is not supported.
+// Grammar Note:  Labeled statements for SWITCH only; 'goto' is not supported.
 
 simple_statement
     : declaration_statement { $$ = $1; }
     | expression_statement  { $$ = $1; }
     | selection_statement   { $$ = $1; }
+    | switch_statement      { $$ = $1; }
+    | case_label            { $$ = $1; }
     | iteration_statement   { $$ = $1; }
     | jump_statement        { $$ = $1; }
     ;
@@ -1599,7 +1605,20 @@
     }
     ;
 
-// Grammar Note:  No 'switch'.  Switch statements not supported.
+switch_statement
+    : SWITCH LEFT_PAREN expression RIGHT_PAREN compound_statement {
+        $$ = context->addSwitch($3, $5, @1);
+    }
+    ;
+
+case_label
+    : CASE constant_expression COLON {
+        $$ = context->addCase($2, @1);
+    }
+    | DEFAULT COLON {
+        $$ = context->addDefault(@1);
+    }
+    ;
 
 condition
     // In 1996 c++ draft, conditions can include single declarations
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index 2f85c46..21b3024 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -286,6 +286,8 @@
             TIntermNodePair nodePair;
             TIntermTyped* intermTypedNode;
             TIntermAggregate* intermAggregate;
+            TIntermSwitch* intermSwitch;
+            TIntermCase* intermCase;
         };
         union {
             TPublicType type;
@@ -619,16 +621,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  114
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2394
+#define YYLAST   2308
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  128
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  91
+#define YYNNTS  93
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  263
+#define YYNRULES  268
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  392
+#define YYNSTATES  404
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -687,33 +689,33 @@
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   205,   205,   206,   209,   233,   236,   241,   246,   251,
-     256,   262,   265,   268,   271,   274,   277,   283,   291,   402,
-     405,   413,   416,   422,   426,   433,   439,   448,   456,   459,
-     469,   472,   475,   478,   488,   489,   490,   491,   499,   500,
-     503,   506,   513,   514,   517,   523,   524,   528,   535,   536,
-     539,   542,   545,   551,   552,   555,   561,   562,   569,   570,
-     577,   578,   585,   586,   592,   593,   599,   600,   606,   607,
-     624,   625,   638,   639,   640,   641,   645,   646,   647,   651,
-     655,   659,   663,   670,   673,   684,   692,   700,   727,   733,
-     744,   748,   752,   756,   763,   819,   822,   829,   837,   858,
-     879,   889,   917,   922,   932,   937,   947,   950,   953,   956,
-     962,   969,   972,   976,   980,   984,   991,   995,   999,  1006,
-    1010,  1014,  1021,  1030,  1036,  1039,  1045,  1051,  1058,  1067,
-    1076,  1084,  1087,  1094,  1098,  1105,  1108,  1112,  1116,  1125,
-    1134,  1142,  1152,  1164,  1167,  1170,  1176,  1183,  1186,  1192,
-    1195,  1198,  1204,  1207,  1222,  1226,  1230,  1234,  1238,  1242,
-    1247,  1252,  1257,  1262,  1267,  1272,  1277,  1282,  1287,  1292,
-    1297,  1302,  1307,  1312,  1317,  1322,  1327,  1332,  1337,  1342,
-    1347,  1351,  1355,  1359,  1363,  1367,  1371,  1375,  1379,  1383,
-    1387,  1391,  1395,  1399,  1403,  1407,  1415,  1423,  1427,  1440,
-    1440,  1443,  1443,  1449,  1452,  1468,  1471,  1480,  1484,  1490,
-    1497,  1512,  1516,  1520,  1521,  1527,  1528,  1529,  1530,  1531,
-    1535,  1536,  1536,  1536,  1546,  1547,  1551,  1551,  1552,  1552,
-    1557,  1560,  1570,  1573,  1579,  1580,  1584,  1592,  1596,  1606,
-    1611,  1628,  1628,  1633,  1633,  1640,  1640,  1648,  1651,  1657,
-    1660,  1666,  1670,  1677,  1680,  1683,  1686,  1689,  1698,  1702,
-    1709,  1712,  1718,  1718
+       0,   209,   209,   210,   213,   237,   240,   245,   250,   255,
+     260,   266,   269,   272,   275,   278,   281,   287,   295,   406,
+     409,   417,   420,   426,   430,   437,   443,   452,   460,   463,
+     473,   476,   479,   482,   492,   493,   494,   495,   503,   504,
+     507,   510,   517,   518,   521,   527,   528,   532,   539,   540,
+     543,   546,   549,   555,   556,   559,   565,   566,   573,   574,
+     581,   582,   589,   590,   596,   597,   603,   604,   610,   611,
+     628,   629,   642,   643,   644,   645,   649,   650,   651,   655,
+     659,   663,   667,   674,   677,   688,   696,   704,   731,   737,
+     748,   752,   756,   760,   767,   823,   826,   833,   841,   862,
+     883,   893,   921,   926,   936,   941,   951,   954,   957,   960,
+     966,   973,   976,   980,   984,   988,   995,   999,  1003,  1010,
+    1014,  1018,  1025,  1034,  1040,  1043,  1049,  1055,  1062,  1071,
+    1080,  1088,  1091,  1098,  1102,  1109,  1112,  1116,  1120,  1129,
+    1138,  1146,  1156,  1168,  1171,  1174,  1180,  1187,  1190,  1196,
+    1199,  1202,  1208,  1211,  1226,  1230,  1234,  1238,  1242,  1246,
+    1251,  1256,  1261,  1266,  1271,  1276,  1281,  1286,  1291,  1296,
+    1301,  1306,  1311,  1316,  1321,  1326,  1331,  1336,  1341,  1346,
+    1351,  1355,  1359,  1363,  1367,  1371,  1375,  1379,  1383,  1387,
+    1391,  1395,  1399,  1403,  1407,  1411,  1419,  1427,  1431,  1444,
+    1444,  1447,  1447,  1453,  1456,  1472,  1475,  1484,  1488,  1494,
+    1501,  1516,  1520,  1524,  1525,  1531,  1532,  1533,  1534,  1535,
+    1536,  1537,  1541,  1542,  1542,  1542,  1552,  1553,  1557,  1557,
+    1558,  1558,  1563,  1566,  1576,  1579,  1585,  1586,  1590,  1598,
+    1602,  1609,  1615,  1618,  1625,  1630,  1647,  1647,  1652,  1652,
+    1659,  1659,  1667,  1670,  1676,  1679,  1685,  1689,  1696,  1699,
+    1702,  1705,  1708,  1717,  1721,  1728,  1731,  1737,  1737
 };
 #endif
 
@@ -773,8 +775,9 @@
   "compound_statement", "$@3", "$@4", "statement_no_new_scope",
   "statement_with_scope", "$@5", "$@6", "compound_statement_no_new_scope",
   "statement_list", "expression_statement", "selection_statement",
-  "selection_rest_statement", "condition", "iteration_statement", "$@7",
-  "$@8", "$@9", "for_init_statement", "conditionopt", "for_rest_statement",
+  "selection_rest_statement", "switch_statement", "case_label",
+  "condition", "iteration_statement", "$@7", "$@8", "$@9",
+  "for_init_statement", "conditionopt", "for_rest_statement",
   "jump_statement", "translation_unit", "external_declaration",
   "function_definition", "$@10", YY_NULLPTR
 };
@@ -801,12 +804,12 @@
 };
 # endif
 
-#define YYPACT_NINF -341
+#define YYPACT_NINF -334
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-341)))
+  (!!((Yystate) == (-334)))
 
-#define YYTABLE_NINF -227
+#define YYTABLE_NINF -229
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -815,46 +818,47 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2032,   -25,  -341,  -341,  -341,   147,  -341,  -341,  -341,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,    98,  -341,  -341,
-     -42,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,   -57,
-    -341,  -341,   -55,   -28,   -30,     2,   -66,  -341,    99,    14,
-    1149,  -341,  -341,  2317,    14,  -341,   -19,  -341,  1957,  -341,
-    -341,  -341,  -341,  2317,  -341,  -341,  -341,  -341,  -341,    21,
-      37,  -341,    26,  -341,    55,  -341,  -341,  -341,  -341,  -341,
-    2181,   114,   104,  -341,    53,   -82,  -341,    58,  -341,  2107,
-    -341,  -341,  -341,  1510,  -341,  -341,    56,  2107,  -341,    48,
-     -83,  -341,   377,  -341,  -341,  -341,  -341,   104,  2181,   -38,
-    -341,  1219,  1510,  -341,   129,  2181,   104,  1702,  -341,    73,
-    -341,  -341,  -341,  -341,  1510,  1510,  1510,  -341,  -341,  -341,
-    -341,  -341,  -341,   -60,  -341,  -341,  -341,    77,   -13,  1605,
-      93,  -341,  1510,    44,    15,   100,   -51,    97,    76,    83,
-      85,   119,   118,   -65,  -341,   105,  -341,  -341,  1787,  2107,
-     109,  -341,    37,   101,   103,  -341,   110,   116,   108,  1317,
-     120,   117,  -341,  -341,    47,  -341,  -341,   -10,  -341,   -55,
-      65,  -341,  -341,  -341,  -341,   493,  -341,  -341,  -341,  -341,
-     107,  -341,  -341,  1412,  1510,  -341,   111,  -341,  -341,   104,
-     121,    -8,  -341,   -56,  -341,  -341,  -341,    -3,  -341,  -341,
-    1510,  2249,  -341,  -341,  1510,   124,  -341,  -341,  -341,  1510,
-    1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,
-    1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  1510,  -341,
-    -341,  1872,  -341,  -341,  -341,  -341,  -341,   123,  -341,  1510,
-    -341,  -341,     5,  -341,  -341,   609,  -341,  -341,  -341,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,  1510,  1510,  -341,
-    -341,  -341,  1510,  -341,   122,  -341,  -341,    16,  1510,   104,
-    -341,   -24,  -341,  -341,   125,   126,    73,   130,  -341,  -341,
-    -341,  -341,  -341,  -341,    44,    44,    15,    15,   100,   100,
-     100,   100,   -51,   -51,    97,    76,    83,    85,   119,   118,
-      79,  -341,   169,    26,   841,   957,     7,  -341,  1054,   609,
-    -341,  -341,   128,  -341,  -341,   131,  -341,  1510,  -341,  -341,
-    1510,   132,  -341,  -341,  -341,  -341,  1054,   123,   126,   104,
-    2181,   135,   133,  -341,  -341,   136,  -341,  1510,  -341,   134,
-     139,   216,  -341,   137,   725,  -341,   140,     9,  1510,   725,
-     123,  1510,  -341,  -341,  -341,  -341,   141,   126,  -341,  -341,
-    -341,  -341
+    1946,   -28,  -334,  -334,  -334,   179,  -334,  -334,  -334,  -334,
+    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
+    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
+    -334,  -334,  -334,  -334,  -334,  -334,  -334,    91,  -334,  -334,
+     -40,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
+    -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,   -90,
+    -334,  -334,   -88,   -62,   -64,    10,     5,  -334,   117,    14,
+    1161,  -334,  -334,  2231,    14,  -334,    18,  -334,  1871,  -334,
+    -334,  -334,  -334,  2231,  -334,  -334,  -334,  -334,  -334,   -14,
+      27,  -334,    33,  -334,    55,  -334,  -334,  -334,  -334,  -334,
+    2095,   147,   127,  -334,    73,   -34,  -334,    87,  -334,  2021,
+    -334,  -334,  -334,  1424,  -334,  -334,    67,  2021,  -334,    86,
+      -4,  -334,   389,  -334,  -334,  -334,  -334,   127,  2095,   -21,
+    -334,   260,  1424,  -334,   157,  2095,   127,  1616,  -334,   101,
+    -334,  -334,  -334,  -334,  1424,  1424,  1424,  -334,  -334,  -334,
+    -334,  -334,  -334,    19,  -334,  -334,  -334,   102,    -3,  1519,
+     107,  -334,  1424,    71,   -32,   126,   -48,   134,   103,   106,
+     109,   152,   151,   -71,  -334,   138,  -334,  -334,  1701,  2021,
+     146,  -334,    27,   133,   135,  -334,   144,   154,   136,  1231,
+     155,  1424,   139,   156,   153,  -334,  -334,   119,  -334,  -334,
+      29,  -334,   -88,    17,  -334,  -334,  -334,  -334,   505,  -334,
+    -334,  -334,  -334,  -334,  -334,   149,  -334,  -334,  1326,  1424,
+    -334,   158,  -334,  -334,   127,   150,    60,  -334,   -56,  -334,
+    -334,  -334,     1,  -334,  -334,  1424,  2163,  -334,  -334,  1424,
+     159,  -334,  -334,  -334,  1424,  1424,  1424,  1424,  1424,  1424,
+    1424,  1424,  1424,  1424,  1424,  1424,  1424,  1424,  1424,  1424,
+    1424,  1424,  1424,  1424,  -334,  -334,  1786,  -334,  -334,  -334,
+    -334,  -334,   160,  -334,  1424,  -334,  -334,    61,  1424,   162,
+    -334,  -334,  -334,   621,  -334,  -334,  -334,  -334,  -334,  -334,
+    -334,  -334,  -334,  -334,  -334,  1424,  1424,  -334,  -334,  -334,
+    1424,  -334,   168,  -334,  -334,    62,  1424,   127,  -334,   -25,
+    -334,  -334,   169,   166,   101,   165,  -334,  -334,  -334,  -334,
+    -334,  -334,    71,    71,   -32,   -32,   126,   126,   126,   126,
+     -48,   -48,   134,   103,   106,   109,   152,   151,   116,  -334,
+     205,    33,   853,   969,    15,  -334,    25,  -334,  1066,   621,
+    -334,  -334,   171,  -334,  -334,   172,  -334,  1424,  -334,  -334,
+    1424,   176,  -334,  -334,  -334,  -334,  1066,   160,   173,   166,
+     127,  2095,   177,   175,  -334,  -334,   193,  -334,  1424,  -334,
+     187,   197,   287,  -334,  -334,   198,   737,  -334,   199,    28,
+    1424,   737,   160,  1424,  -334,  -334,  -334,  -334,   202,   166,
+    -334,  -334,  -334,  -334
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -868,70 +872,71 @@
      128,   174,   175,   176,   177,   178,   179,     0,   125,   124,
        0,   154,   180,   182,   195,   196,   183,   184,   185,   186,
      187,   188,   189,   190,   191,   181,   192,   193,   194,     0,
-     198,   261,   262,     0,    96,   106,     0,   111,   116,   132,
-       0,   130,   122,     0,   133,   141,   152,   197,     0,   258,
-     260,   129,   121,     0,   138,   139,     2,     3,   201,     0,
+     198,   266,   267,     0,    96,   106,     0,   111,   116,   132,
+       0,   130,   122,     0,   133,   141,   152,   197,     0,   263,
+     265,   129,   121,     0,   138,   139,     2,     3,   201,     0,
        0,    87,     0,    94,   106,   126,   107,   108,   109,    97,
        0,   106,     0,    88,     2,   117,   131,     0,    93,     0,
-     123,   142,   134,     0,     1,   259,     0,     0,   199,   149,
-       0,   147,     0,   263,    98,   103,   105,   110,     0,   112,
+     123,   142,   134,     0,     1,   264,     0,     0,   199,   149,
+       0,   147,     0,   268,    98,   103,   105,   110,     0,   112,
       99,     0,     0,    86,     0,     0,     0,     0,   203,     4,
        8,     6,     7,     9,     0,     0,     0,    36,    35,    37,
       34,     5,    11,    30,    13,    18,    19,     0,     0,    24,
        0,    38,     0,    42,    45,    48,    53,    56,    58,    60,
       62,    64,    66,    68,    85,     0,    28,    89,     0,     0,
-       0,   146,     0,     0,     0,   243,     0,     0,     0,     0,
-       0,   221,   230,   234,    38,    70,    83,     0,   212,     0,
-     152,   215,   232,   214,   213,     0,   216,   217,   218,   219,
-     100,   102,   104,     0,     0,   118,     0,   211,   120,     0,
-     209,     0,   207,     0,   204,    31,    32,     0,    15,    16,
-       0,     0,    22,    21,     0,    23,    25,    27,    33,     0,
+       0,   146,     0,     0,     0,   248,     0,     0,     0,     0,
+       0,     0,     0,     0,   223,   232,   236,    38,    70,    83,
+       0,   212,     0,   152,   215,   234,   214,   213,     0,   216,
+     217,   218,   219,   220,   221,   100,   102,   104,     0,     0,
+     118,     0,   211,   120,     0,   209,     0,   207,     0,   204,
+      31,    32,     0,    15,    16,     0,     0,    22,    21,     0,
+      23,    25,    27,    33,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   153,
-     202,     0,   150,   151,   148,   254,   253,   228,   245,     0,
-     257,   255,     0,   241,   220,     0,    73,    74,    76,    75,
-      78,    79,    80,    81,    82,    77,    72,     0,     0,   235,
-     231,   233,     0,   113,     0,   115,   119,     0,     0,     0,
-     205,     0,    90,    10,     0,    17,     2,     3,    14,    20,
-      26,    39,    40,    41,    44,    43,    46,    47,    51,    52,
-      49,    50,    54,    55,    57,    59,    61,    63,    65,    67,
-       0,   200,     0,     0,     0,     0,     0,   256,     0,   222,
+       0,     0,     0,     0,   153,   202,     0,   150,   151,   148,
+     259,   258,   230,   250,     0,   262,   260,     0,     0,     0,
+     243,   246,   222,     0,    73,    74,    76,    75,    78,    79,
+      80,    81,    82,    77,    72,     0,     0,   237,   233,   235,
+       0,   113,     0,   115,   119,     0,     0,     0,   205,     0,
+      90,    10,     0,    17,     2,     3,    14,    20,    26,    39,
+      40,    41,    44,    43,    46,    47,    51,    52,    49,    50,
+      54,    55,    57,    59,    61,    63,    65,    67,     0,   200,
+       0,     0,     0,     0,     0,   261,     0,   242,     0,   224,
       71,    84,     0,   114,   206,     0,   208,     0,    91,    12,
-       0,     0,   227,   229,   248,   247,   250,   228,   239,     0,
-       0,     0,     0,   101,   210,     0,    69,     0,   249,     0,
-       0,   238,   236,     0,     0,   223,     0,     0,   251,     0,
-     228,     0,   225,   242,   224,    92,     0,   252,   246,   237,
-     240,   244
+       0,     0,   229,   231,   253,   252,   255,   230,     0,   244,
+       0,     0,     0,     0,   101,   210,     0,    69,     0,   254,
+       0,     0,   240,   238,   241,     0,     0,   225,     0,     0,
+     256,     0,   230,     0,   227,   247,   226,    92,     0,   257,
+     251,   239,   245,   249
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -341,   -39,  -341,  -341,  -341,  -341,  -341,  -341,    20,  -341,
-    -341,  -341,  -341,    54,  -341,   -47,   -41,  -123,   -44,    -6,
-       3,    -7,    -2,     4,     6,  -341,   -98,  -129,  -341,  -137,
-    -124,  -341,     8,    13,  -341,  -341,  -341,   138,   164,   158,
-     142,  -341,  -341,  -317,  -341,  -341,   -99,    25,   -68,   257,
-    -341,  -341,    82,     1,     0,  -341,  -341,  -341,  -103,  -125,
-      46,   -31,  -209,   -64,  -199,  -318,  -341,  -341,  -341,  -110,
-    -340,  -341,  -341,   -88,    -1,   -63,  -341,  -341,   -80,  -341,
-    -341,  -341,  -341,  -341,  -341,  -341,  -341,  -341,   195,  -341,
-    -341
+    -334,   -39,  -334,  -334,  -334,  -334,  -334,  -334,    76,  -334,
+    -334,  -334,  -334,  -100,  -334,   -12,   -11,   -86,   -15,    78,
+      89,    85,    90,    92,    93,  -334,  -104,  -126,  -334,  -136,
+    -120,  -334,     4,    12,  -334,  -334,  -334,   223,   258,   253,
+     228,  -334,  -334,  -324,  -334,  -334,  -102,   -44,   -68,   352,
+    -334,  -334,   178,   -45,     0,  -334,  -334,  -334,   -99,  -132,
+     137,    51,  -211,    16,  -186,  -325,    -6,  -334,  -334,   -26,
+    -333,  -334,  -334,   -89,    80,    26,  -334,  -334,  -334,  -334,
+       2,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,  -334,
+     292,  -334,  -334
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   220,   151,   152,   153,   304,   154,   155,   156,   157,
-     158,   159,   160,   194,   162,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   195,   196,   287,   197,
-     175,   109,   198,   199,    63,    64,    65,   125,    99,   100,
+      -1,   225,   151,   152,   153,   312,   154,   155,   156,   157,
+     158,   159,   160,   197,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   198,   199,   295,   200,
+     175,   109,   201,   202,    63,    64,    65,   125,    99,   100,
      126,    66,    67,    68,    69,   101,    70,    71,    72,    73,
       74,   120,   121,    75,   176,    77,   179,   117,   137,   138,
-     221,   222,   218,   201,   202,   203,   204,   275,   362,   383,
-     332,   333,   334,   384,   205,   206,   207,   372,   361,   208,
-     338,   267,   335,   356,   369,   370,   209,    78,    79,    80,
-      92
+     226,   227,   223,   204,   205,   206,   207,   283,   373,   395,
+     340,   341,   342,   396,   208,   209,   210,   383,   211,   212,
+     372,   213,   348,   272,   343,   366,   380,   381,   214,    78,
+      79,    80,    92
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -939,314 +944,283 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      76,    89,   110,   217,   123,   295,   291,   216,    61,   227,
-     135,    95,   224,    62,   178,   174,   353,   371,   135,    81,
-     301,   359,   181,     7,   131,   228,   229,   257,   182,   105,
-     236,   132,   127,   174,    86,    87,   246,   247,   135,   359,
-     389,   136,    96,    97,    98,   102,   230,    90,   103,   136,
-     231,    82,   272,   224,    27,    28,   382,    29,   302,    91,
-     127,   382,   258,   129,    95,    37,    88,   219,   213,   136,
-      76,   248,   249,    76,   111,   214,   261,    93,    76,   135,
-     135,    94,   347,    76,   116,   217,    61,   113,   210,   294,
-     348,    62,   233,   305,   106,    96,    97,    98,   234,   112,
-      76,   288,   303,   299,   289,   310,   300,   -95,   288,    76,
-     136,   136,   357,   119,   386,   174,   288,    76,   288,   337,
-     288,   330,   200,   318,   319,   320,   321,   299,    76,   118,
-     344,   242,   336,   243,   122,    76,   224,    76,    84,    85,
-     291,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,     2,     3,     4,    96,    97,    98,   130,   340,   341,
-     286,   180,   135,   239,   240,   241,   133,   161,   342,   -28,
-     177,   113,   390,    81,   345,   104,    87,   -29,    76,    76,
-      86,    87,   232,   244,   245,   161,   250,   251,   262,   263,
-     288,   350,   308,   136,   174,   314,   315,   237,   225,   226,
-     174,   358,   252,   316,   317,   200,   322,   323,   253,   254,
-     255,   256,   259,   292,   268,   265,   238,   266,   296,   358,
-     269,   366,   270,   365,   273,   351,   274,   298,  -154,   343,
-     377,  -226,   349,   380,  -198,   363,   367,   288,   364,   360,
-     374,   387,   375,   376,   379,   352,   324,   326,   378,   174,
-     381,   309,   217,   327,   385,   391,   325,   360,   124,   128,
-     328,    76,    83,   329,   264,   297,   211,   161,   346,   388,
-     212,   354,   355,   115,   339,   200,   368,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   110,   311,   312,   313,   161,   161,   161,   161,
+      76,    89,   110,   123,    61,   229,   222,   135,   303,   174,
+     232,   221,    62,   161,    90,   135,    81,   363,   178,    95,
+     309,   262,   299,     7,   370,   106,    91,   174,   111,   105,
+     112,   161,   127,   241,   382,   135,    86,    87,   116,   251,
+     252,   136,   370,    93,   230,   231,   229,    94,    82,   136,
+      96,    97,    98,   277,    27,    28,   263,    29,   310,   401,
+     127,   394,   243,   129,    95,    37,   394,   224,    88,   136,
+      76,   279,   131,    76,   253,   254,   135,   135,    76,   132,
+     266,   357,    61,    76,   247,   218,   248,   174,   215,   358,
+      62,   161,   219,   222,   118,    96,    97,    98,   302,   313,
+      76,   181,   238,   119,   233,   234,   311,   182,   239,    76,
+     136,   136,   296,   318,   174,   -95,   102,    76,   161,   103,
+     367,   -28,   203,   113,   113,   235,   296,   338,    76,   236,
+     368,    84,    85,   398,   229,    76,   296,    76,   344,   296,
+     296,   122,   346,   297,   319,   320,   321,   161,   161,   161,
      161,   161,   161,   161,   161,   161,   161,   161,   161,   161,
-     161,   161,     0,     0,     0,     0,     0,     0,     0,     0,
-     373,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   200,   200,     0,     0,   200,   200,
-       0,     0,     0,     0,     0,     0,   161,     0,     0,     0,
-       0,     0,   161,     0,     0,     0,   200,     0,     0,     0,
-      76,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   200,     0,     0,     0,     0,   200,
+     161,   161,   161,   299,   135,   326,   327,   328,   329,   350,
+     351,   307,   296,   307,   308,   345,   354,   130,    76,    76,
+     352,   177,   402,     2,     3,     4,   355,    96,    97,    98,
+     244,   245,   246,   104,    87,   133,   174,   316,   136,   180,
+     161,    81,   174,    86,    87,   -29,   161,   237,   203,   249,
+     250,   242,   369,   284,   285,   286,   287,   288,   289,   290,
+     291,   292,   293,   255,   256,   267,   268,   296,   360,   257,
+     369,   258,   294,   259,   377,   322,   323,   376,   324,   325,
+     330,   331,   389,   260,   261,   264,   371,   270,   273,   271,
+     275,   280,   362,   174,   399,   300,   306,   161,   274,   278,
+     281,   361,   282,  -154,   371,   304,    76,   222,  -228,  -198,
+       8,     9,    10,    11,   347,   353,   359,   296,   374,   375,
+     378,   194,   386,   203,   387,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+     388,   390,   391,   110,   392,    31,    32,    33,    34,    35,
+      36,   393,   317,   397,    40,    41,   403,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,   385,    56,    57,    58,   332,   139,    60,   140,   141,
+     142,   143,   203,   203,   334,   144,   145,   333,   203,   203,
+     335,   216,   124,   336,   128,   337,   217,    83,   356,   364,
+     269,   305,   384,   349,   146,   400,   203,   220,   379,   365,
+     115,    76,     0,     0,     0,   147,   148,   149,   150,     0,
+       0,     0,     0,     0,     0,     0,   203,     0,     0,     0,
+       0,   203,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,   183,   184,   185,     0,   186,   187,   188,
+     189,   190,   191,   192,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,   193,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+       0,    56,    57,    58,    59,   139,    60,   140,   141,   142,
+     143,     0,     0,     0,   144,   145,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   146,     0,     0,     0,   194,   195,     0,
+       0,     0,     0,   196,   147,   148,   149,   150,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,   183,
+     184,   185,     0,   186,   187,   188,   189,   190,   191,   192,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,     0,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,   193,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
+      59,   139,    60,   140,   141,   142,   143,     0,     0,     0,
+     144,   145,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   146,
+       0,     0,     0,   194,   298,     0,     0,     0,     0,   196,
+     147,   148,   149,   150,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   183,   184,   185,     0,   186,
+     187,   188,   189,   190,   191,   192,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,   193,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,   139,    60,   140,
+     141,   142,   143,     0,     0,     0,   144,   145,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   146,     0,     0,     0,   194,
+       0,     0,     0,     0,     0,   196,   147,   148,   149,   150,
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,   183,   184,   185,     0,   186,   187,   188,   189,     0,
-       0,   161,    12,    13,    14,    15,    16,    17,    18,    19,
+      11,   183,   184,   185,     0,   186,   187,   188,   189,   190,
+     191,   192,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,   190,    42,    43,    44,    45,    46,    47,
+      39,    40,    41,   193,    42,    43,    44,    45,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
       57,    58,    59,   139,    60,   140,   141,   142,   143,     0,
        0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   146,     0,     0,     0,   191,   192,     0,     0,     0,
-       0,   193,   147,   148,   149,   150,     1,     2,     3,     4,
+       0,   146,     0,     0,     0,   122,     0,     0,     0,     0,
+       0,   196,   147,   148,   149,   150,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,   183,   184,   185,
-       0,   186,   187,   188,   189,     0,     0,     0,    12,    13,
+       0,   186,   187,   188,   189,   190,   191,   192,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,     0,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,   190,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,   193,
       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
       52,    53,    54,    55,     0,    56,    57,    58,    59,   139,
       60,   140,   141,   142,   143,     0,     0,     0,   144,   145,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   146,     0,     0,
-       0,   191,   290,     0,     0,     0,     0,   193,   147,   148,
+       0,     0,     0,     0,     0,     0,     0,   196,   147,   148,
      149,   150,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,   183,   184,   185,     0,   186,   187,   188,
-     189,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,     0,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,   190,    42,    43,    44,    45,
+      37,    38,    39,    40,    41,     0,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
        0,    56,    57,    58,    59,   139,    60,   140,   141,   142,
      143,     0,     0,     0,   144,   145,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   146,     0,     0,     0,   191,     0,     0,
-       0,     0,     0,   193,   147,   148,   149,   150,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,   183,
-     184,   185,     0,   186,   187,   188,   189,     0,     0,     0,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,     0,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,   190,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
-      59,   139,    60,   140,   141,   142,   143,     0,     0,     0,
-     144,   145,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   146,
-       0,     0,     0,   122,     0,     0,     0,     0,     0,   193,
-     147,   148,   149,   150,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,   183,   184,   185,     0,   186,
-     187,   188,   189,     0,     0,     0,    12,    13,    14,    15,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
+       2,     3,     4,   146,     6,     7,     8,     9,    10,    11,
+       0,     0,     0,   196,   147,   148,   149,   150,     0,     0,
+       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
+      58,    59,   139,    60,   140,   141,   142,   143,     0,     0,
+       0,   144,   145,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     2,     3,     4,     0,     0,
+     146,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,   147,   148,   149,   150,     0,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40,    41,   190,    42,    43,
+      26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
+      35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,    59,   139,    60,   140,
+      54,    55,     0,    56,    57,    58,     0,   107,    60,     0,
+       0,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,     0,     0,     0,     0,   108,    31,    32,    33,    34,
+      35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,     0,   139,    60,   140,
      141,   142,   143,     0,     0,     0,   144,   145,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   146,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   193,   147,   148,   149,   150,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,    59,   139,    60,   140,   141,   142,   143,     0,
-       0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   134,     2,     3,
-       4,   146,     6,     7,     8,     9,    10,    11,     0,     0,
-       0,   193,   147,   148,   149,   150,     0,     0,     0,    12,
+       0,     0,     0,     0,     0,   146,     8,     9,    10,    11,
+       0,     0,     0,     0,     0,   276,   147,   148,   149,   150,
+       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,     0,     0,     0,     0,
+       0,    31,    32,    33,    34,    35,    36,     0,     0,     0,
+      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
+      58,     0,   139,    60,   140,   141,   142,   143,     0,     0,
+       0,   144,   145,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     146,     0,     0,   301,     8,     9,    10,    11,     0,     0,
+       0,   147,   148,   149,   150,     0,     0,     0,     0,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,     0,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      23,    24,    25,    26,     0,     0,     0,     0,     0,    31,
+      32,    33,    34,    35,    36,     0,     0,     0,    40,    41,
        0,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,     0,    56,    57,    58,    59,
+      51,    52,    53,    54,    55,     0,    56,    57,    58,     0,
      139,    60,   140,   141,   142,   143,     0,     0,     0,   144,
      145,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     2,     3,     4,     0,     0,   146,     8,
+       0,     0,     0,     0,     0,     0,     0,     0,   146,     8,
        9,    10,    11,     0,     0,     0,     0,     0,     0,   147,
      148,   149,   150,     0,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
        0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
-       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-       0,    56,    57,    58,     0,   107,    60,     0,     0,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
-       0,     0,     0,   108,    31,    32,    33,    34,    35,    36,
-       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
+       0,     0,     0,    40,   240,     0,    42,    43,    44,    45,
       46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
        0,    56,    57,    58,     0,   139,    60,   140,   141,   142,
      143,     0,     0,     0,   144,   145,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
+       2,     3,     4,   146,     6,     7,     8,     9,    10,    11,
+       0,     0,     0,     0,   147,   148,   149,   150,     0,     0,
+       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
+      58,    59,     0,    60,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   134,     2,     3,     4,     0,     6,
+       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   228,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,     0,    60,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   134,
+       2,     3,     4,     0,     6,     7,     8,     9,    10,    11,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   146,     0,     0,   215,     8,     9,    10,
-      11,     0,     0,     0,   147,   148,   149,   150,     0,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
-       0,     0,    31,    32,    33,    34,    35,    36,     0,     0,
-       0,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,     0,   139,    60,   140,   141,   142,   143,     0,
-       0,     0,   144,   145,     0,     0,     0,     0,     0,     0,
+     265,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
+      58,    59,     0,    60,     0,     0,     0,     0,     0,     0,
+       0,   114,     0,     0,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   339,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,     0,    60,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   146,     8,     9,    10,    11,     0,     0,     0,     0,
-       0,   271,   147,   148,   149,   150,     0,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,     0,     0,     0,     0,     0,    31,    32,    33,
-      34,    35,    36,     0,     0,     0,    40,    41,     0,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,     0,    56,    57,    58,     0,   139,    60,
-     140,   141,   142,   143,     0,     0,     0,   144,   145,     0,
+       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,     0,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,     0,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,     0,    56,    57,
+      58,    59,     0,    60,   134,     2,     3,     4,     0,     6,
+       7,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,     0,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,     0,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,     0,    56,    57,    58,    59,     0,    60,     2,
+       3,     4,     0,     0,     0,     8,     9,    10,    11,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   146,     0,     0,   293,
-       8,     9,    10,    11,     0,     0,     0,   147,   148,   149,
-     150,     0,     0,     0,     0,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-       0,     0,     0,     0,     0,    31,    32,    33,    34,    35,
-      36,     0,     0,     0,    40,    41,     0,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,     0,    56,    57,    58,     0,   139,    60,   140,   141,
-     142,   143,     0,     0,     0,   144,   145,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   146,     8,     9,    10,    11,     0,
-       0,     0,     0,     0,     0,   147,   148,   149,   150,     0,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,    26,     0,     0,     0,     0,     0,
       31,    32,    33,    34,    35,    36,     0,     0,     0,    40,
-     235,     0,    42,    43,    44,    45,    46,    47,    48,    49,
+      41,     0,    42,    43,    44,    45,    46,    47,    48,    49,
       50,    51,    52,    53,    54,    55,     0,    56,    57,    58,
-       0,   139,    60,   140,   141,   142,   143,     0,     0,     0,
-     144,   145,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   134,     2,     3,     4,   146,
-       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
-     147,   148,   149,   150,     0,     0,     0,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     134,     2,     3,     4,     0,     6,     7,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   223,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,    59,     0,    60,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   134,     2,     3,     4,     0,
-       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   260,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
-       0,     0,     0,     0,     0,     0,     0,   114,     0,     0,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   331,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,    59,     0,    60,     1,     2,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,     0,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,     0,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,     0,    56,    57,    58,    59,     0,    60,
-     134,     2,     3,     4,     0,     6,     7,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,     0,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,    59,     0,    60,     2,     3,     4,     0,     0,
-       0,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,     0,    60,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,     0,     0,     0,     0,     0,    31,    32,
+      33,    34,    35,    36,     0,     0,     0,    40,    41,     0,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,     0,    56,    57,    58,     0,   314,
+     315,     8,     9,    10,    11,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,     0,     0,     0,     0,     0,    31,    32,    33,    34,
       35,    36,     0,     0,     0,    40,    41,     0,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,     0,    56,    57,    58,     0,     0,    60,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
-       0,     0,     0,     0,    31,    32,    33,    34,    35,    36,
-       0,     0,     0,    40,    41,     0,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-       0,    56,    57,    58,     0,   306,   307,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
-       0,     0,    31,    32,    33,    34,    35,    36,     0,     0,
-       0,    40,    41,     0,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,     0,    56,
-      57,    58,     0,     0,    60
+      54,    55,     0,    56,    57,    58,     0,     0,    60
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    40,    70,   132,    92,   214,   205,   131,     0,   146,
-     109,     9,   137,     0,   117,   113,   334,   357,   117,    44,
-      76,   338,   105,     9,   106,    85,    86,    92,   111,    68,
-     159,   113,   100,   131,    76,    77,    87,    88,   137,   356,
-     380,   109,    40,    41,    42,   111,   106,   104,   114,   117,
-     110,    76,   189,   178,    40,    41,   374,    43,   114,   114,
-     128,   379,   127,   102,     9,    51,   108,   135,   106,   137,
-      70,   122,   123,    73,    73,   113,   179,   105,    78,   178,
-     179,   111,   106,    83,    83,   214,    78,   106,   127,   213,
-     114,    78,   105,   230,    69,    40,    41,    42,   111,    74,
-     100,   111,   105,   111,   114,   234,   114,   105,   111,   109,
-     178,   179,   105,    76,   105,   213,   111,   117,   111,   114,
-     111,   258,   122,   246,   247,   248,   249,   111,   128,   108,
-     114,   116,   269,   118,   108,   135,   261,   137,    40,    41,
-     339,    94,    95,    96,    97,    98,    99,   100,   101,   102,
-     103,     4,     5,     6,    40,    41,    42,   104,   287,   288,
-     113,   113,   261,   119,   120,   121,   108,   113,   292,   104,
-     114,   106,   381,    44,   298,    76,    77,   104,   178,   179,
-      76,    77,   105,    83,    84,   131,    89,    90,    79,    80,
-     111,   112,   231,   261,   292,   242,   243,   104,   144,   145,
-     298,   338,   126,   244,   245,   205,   250,   251,   125,   124,
-      91,    93,   107,   106,   104,   114,   162,   114,   107,   356,
-     104,   350,   114,   347,   104,    56,   109,   106,   104,   107,
-     367,   108,   107,    17,   104,   107,   104,   111,   107,   338,
-     105,   378,   109,   107,   105,   333,   252,   254,   114,   347,
-     113,   231,   381,   255,   114,   114,   253,   356,    94,   101,
-     256,   261,     5,   257,   182,   219,   128,   213,   299,   379,
-     128,   335,   335,    78,   275,   275,   356,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   360,   239,   240,   241,   242,   243,   244,   245,
-     246,   247,   248,   249,   250,   251,   252,   253,   254,   255,
-     256,   257,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     359,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   334,   335,    -1,    -1,   338,   339,
-      -1,    -1,    -1,    -1,    -1,    -1,   292,    -1,    -1,    -1,
-      -1,    -1,   298,    -1,    -1,    -1,   356,    -1,    -1,    -1,
-     360,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   374,    -1,    -1,    -1,    -1,   379,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    -1,    18,    19,    20,    21,    -1,
-      -1,   347,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    -1,
-      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   104,    -1,    -1,    -1,   108,   109,    -1,    -1,    -1,
-      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      -1,    18,    19,    20,    21,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    -1,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    -1,    -1,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-      -1,   108,   109,    -1,    -1,    -1,    -1,   114,   115,   116,
-     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
+       0,    40,    70,    92,     0,   137,   132,   109,   219,   113,
+     146,   131,     0,   113,   104,   117,    44,   342,   117,     9,
+      76,    92,   208,     9,   348,    69,   114,   131,    73,    68,
+      74,   131,   100,   159,   367,   137,    76,    77,    83,    87,
+      88,   109,   366,   105,   144,   145,   178,   111,    76,   117,
+      40,    41,    42,   189,    40,    41,   127,    43,   114,   392,
+     128,   386,   162,   102,     9,    51,   391,   135,   108,   137,
+      70,   191,   106,    73,   122,   123,   178,   179,    78,   113,
+     179,   106,    78,    83,   116,   106,   118,   191,   127,   114,
+      78,   191,   113,   219,   108,    40,    41,    42,   218,   235,
+     100,   105,   105,    76,    85,    86,   105,   111,   111,   109,
+     178,   179,   111,   239,   218,   105,   111,   117,   218,   114,
+     105,   104,   122,   106,   106,   106,   111,   263,   128,   110,
+     105,    40,    41,   105,   266,   135,   111,   137,   274,   111,
+     111,   108,   278,   114,   244,   245,   246,   247,   248,   249,
+     250,   251,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   349,   266,   251,   252,   253,   254,   295,
+     296,   111,   111,   111,   114,   114,   114,   104,   178,   179,
+     300,   114,   393,     4,     5,     6,   306,    40,    41,    42,
+     119,   120,   121,    76,    77,   108,   300,   236,   266,   113,
+     300,    44,   306,    76,    77,   104,   306,   105,   208,    83,
+      84,   104,   348,    94,    95,    96,    97,    98,    99,   100,
+     101,   102,   103,    89,    90,    79,    80,   111,   112,   126,
+     366,   125,   113,   124,   360,   247,   248,   357,   249,   250,
+     255,   256,   378,    91,    93,   107,   348,   114,   104,   114,
+     114,   112,   341,   357,   390,   106,   106,   357,   104,   104,
+     104,    56,   109,   104,   366,   107,   266,   393,   108,   104,
+      10,    11,    12,    13,   112,   107,   107,   111,   107,   107,
+     104,   108,   105,   283,   109,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+     107,   114,   105,   371,    17,    45,    46,    47,    48,    49,
+      50,   113,   236,   114,    54,    55,   114,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,   370,    72,    73,    74,   257,    76,    77,    78,    79,
+      80,    81,   342,   343,   259,    85,    86,   258,   348,   349,
+     260,   128,    94,   261,   101,   262,   128,     5,   307,   343,
+     182,   224,   368,   283,   104,   391,   366,   107,   366,   343,
+      78,   371,    -1,    -1,    -1,   115,   116,   117,   118,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   386,    -1,    -1,    -1,
+      -1,   391,     3,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    -1,    18,    19,    20,
-      21,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
       41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
       51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
@@ -1254,10 +1228,10 @@
       -1,    72,    73,    74,    75,    76,    77,    78,    79,    80,
       81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   104,    -1,    -1,    -1,   108,    -1,    -1,
+      -1,    -1,    -1,   104,    -1,    -1,    -1,   108,   109,    -1,
       -1,    -1,    -1,   114,   115,   116,   117,   118,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    -1,    18,    19,    20,    21,    -1,    -1,    -1,
+      15,    16,    -1,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    -1,    43,    44,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
@@ -1266,10 +1240,10 @@
       75,    76,    77,    78,    79,    80,    81,    -1,    -1,    -1,
       85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,
-      -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,   114,
+      -1,    -1,    -1,   108,   109,    -1,    -1,    -1,    -1,   114,
      115,   116,   117,   118,     3,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    -1,    18,
-      19,    20,    21,    -1,    -1,    -1,    25,    26,    27,    28,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
       49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
@@ -1277,152 +1251,165 @@
       69,    70,    -1,    72,    73,    74,    75,    76,    77,    78,
       79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,
       -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
        3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
       43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
       73,    74,    75,    76,    77,    78,    79,    80,    81,    -1,
       -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
-       6,   104,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,   114,   115,   116,   117,   118,    -1,    -1,    -1,    25,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   104,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
+      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      -1,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    -1,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    -1,    -1,    -1,    85,    86,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
+     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      -1,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,     5,     6,   104,     8,     9,    10,    11,    12,    13,
+      -1,    -1,    -1,   114,   115,   116,   117,   118,    -1,    -1,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    -1,    -1,
+      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     4,     5,     6,    -1,    -1,
+     104,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,   115,   116,   117,   118,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    -1,
+      -1,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,   114,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    78,
+      79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   104,    10,    11,    12,    13,
+      -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
+      -1,    45,    46,    47,    48,    49,    50,    -1,    -1,    -1,
+      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
+      74,    -1,    76,    77,    78,    79,    80,    81,    -1,    -1,
+      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     104,    -1,    -1,   107,    10,    11,    12,    13,    -1,    -1,
+      -1,   115,   116,   117,   118,    -1,    -1,    -1,    -1,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    -1,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,
+      46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
       -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
+      66,    67,    68,    69,    70,    -1,    72,    73,    74,    -1,
       76,    77,    78,    79,    80,    81,    -1,    -1,    -1,    85,
       86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     4,     5,     6,    -1,    -1,   104,    10,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    10,
       11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,   115,
      116,   117,   118,    -1,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
       -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
       -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    -1,    76,    77,    -1,    -1,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
-      -1,    -1,    -1,   114,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
       -1,    72,    73,    74,    -1,    76,    77,    78,    79,    80,
       81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,     5,     6,   104,     8,     9,    10,    11,    12,    13,
+      -1,    -1,    -1,    -1,   115,   116,   117,   118,    -1,    -1,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
+      74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,     8,
+       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    -1,    77,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   104,    -1,    -1,   107,    10,    11,    12,
-      13,    -1,    -1,    -1,   115,   116,   117,   118,    -1,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    -1,    76,    77,    78,    79,    80,    81,    -1,
-      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
+     109,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
+      74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     0,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    -1,    77,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   104,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
-      -1,   114,   115,   116,   117,   118,    -1,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    -1,    76,    77,
-      78,    79,    80,    81,    -1,    -1,    -1,    85,    86,    -1,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    -1,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
+      74,    75,    -1,    77,     3,     4,     5,     6,    -1,     8,
+       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    -1,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    -1,    72,    73,    74,    75,    -1,    77,     4,
+       5,     6,    -1,    -1,    -1,    10,    11,    12,    13,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,   107,
-      10,    11,    12,    13,    -1,    -1,    -1,   115,   116,   117,
-     118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
-      50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    -1,    72,    73,    74,    -1,    76,    77,    78,    79,
-      80,    81,    -1,    -1,    -1,    85,    86,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   104,    10,    11,    12,    13,    -1,
-      -1,    -1,    -1,    -1,    -1,   115,   116,   117,   118,    -1,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
       45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    54,
       55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
-      -1,    76,    77,    78,    79,    80,    81,    -1,    -1,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,   104,
-       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
-     115,   116,   117,   118,    -1,    -1,    -1,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       3,     4,     5,     6,    -1,     8,     9,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   109,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
-       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   109,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   109,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    75,    -1,    77,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    -1,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,    54,    55,    -1,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    75,    -1,    77,
-       3,     4,     5,     6,    -1,     8,     9,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    -1,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    75,    -1,    77,     4,     5,     6,    -1,    -1,
-      -1,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    77,    10,    11,    12,    13,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,
+      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
+      77,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
       39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
       49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    -1,    -1,    77,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
-      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    -1,    76,    77,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    -1,    -1,    77
+      69,    70,    -1,    72,    73,    74,    -1,    -1,    77
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1436,11 +1423,11 @@
       54,    55,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    72,    73,    74,    75,
       77,   160,   161,   162,   163,   164,   169,   170,   171,   172,
-     174,   175,   176,   177,   178,   181,   182,   183,   215,   216,
-     217,    44,    76,   177,    40,    41,    76,    77,   108,   129,
-     104,   114,   218,   105,   111,     9,    40,    41,    42,   166,
+     174,   175,   176,   177,   178,   181,   182,   183,   217,   218,
+     219,    44,    76,   177,    40,    41,    76,    77,   108,   129,
+     104,   114,   220,   105,   111,     9,    40,    41,    42,   166,
      167,   173,   111,   114,    76,   129,   175,    76,   114,   159,
-     176,   181,   175,   106,     0,   216,   181,   185,   108,    76,
+     176,   181,   175,   106,     0,   218,   181,   185,   108,    76,
      179,   180,   108,   201,   166,   165,   168,   176,   167,   129,
      104,   106,   113,   108,     3,   174,   176,   186,   187,    76,
       78,    79,    80,    81,    85,    86,   104,   115,   116,   117,
@@ -1448,27 +1435,28 @@
      140,   141,   142,   143,   144,   145,   146,   147,   148,   149,
      150,   151,   152,   153,   154,   158,   182,   114,   186,   184,
      113,   105,   111,    14,    15,    16,    18,    19,    20,    21,
-      56,   108,   109,   114,   141,   154,   155,   157,   160,   161,
-     182,   191,   192,   193,   194,   202,   203,   204,   207,   214,
-     129,   165,   168,   106,   113,   107,   158,   155,   190,   176,
-     129,   188,   189,   109,   187,   141,   141,   157,    85,    86,
-     106,   110,   105,   105,   111,    55,   155,   104,   141,   119,
-     120,   121,   116,   118,    83,    84,    87,    88,   122,   123,
-      89,    90,   126,   125,   124,    91,    93,    92,   127,   107,
-     109,   186,    79,    80,   180,   114,   114,   209,   104,   104,
-     114,   114,   157,   104,   109,   195,    94,    95,    96,    97,
-      98,    99,   100,   101,   102,   103,   113,   156,   111,   114,
-     109,   192,   106,   107,   158,   190,   107,   188,   106,   111,
-     114,    76,   114,   105,   133,   157,    76,    77,   129,   136,
-     155,   141,   141,   141,   143,   143,   144,   144,   145,   145,
-     145,   145,   146,   146,   147,   148,   149,   150,   151,   152,
-     157,   109,   198,   199,   200,   210,   157,   114,   208,   202,
+      22,    23,    24,    56,   108,   109,   114,   141,   154,   155,
+     157,   160,   161,   182,   191,   192,   193,   194,   202,   203,
+     204,   206,   207,   209,   216,   129,   165,   168,   106,   113,
+     107,   158,   155,   190,   176,   129,   188,   189,   109,   187,
+     141,   141,   157,    85,    86,   106,   110,   105,   105,   111,
+      55,   155,   104,   141,   119,   120,   121,   116,   118,    83,
+      84,    87,    88,   122,   123,    89,    90,   126,   125,   124,
+      91,    93,    92,   127,   107,   109,   186,    79,    80,   180,
+     114,   114,   211,   104,   104,   114,   114,   157,   104,   158,
+     112,   104,   109,   195,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   113,   156,   111,   114,   109,   192,
+     106,   107,   158,   190,   107,   188,   106,   111,   114,    76,
+     114,   105,   133,   157,    76,    77,   129,   136,   155,   141,
+     141,   141,   143,   143,   144,   144,   145,   145,   145,   145,
+     146,   146,   147,   148,   149,   150,   151,   152,   157,   109,
+     198,   199,   200,   212,   157,   114,   157,   112,   210,   202,
      155,   155,   158,   107,   114,   158,   189,   106,   114,   107,
-     112,    56,   201,   193,   191,   203,   211,   105,   157,   171,
-     174,   206,   196,   107,   107,   158,   155,   104,   206,   212,
-     213,   198,   205,   129,   105,   109,   107,   157,   114,   105,
-      17,   113,   193,   197,   201,   114,   105,   157,   197,   198,
-     190,   114
+     112,    56,   201,   193,   191,   203,   213,   105,   105,   157,
+     171,   174,   208,   196,   107,   107,   158,   155,   104,   208,
+     214,   215,   198,   205,   194,   129,   105,   109,   107,   157,
+     114,   105,    17,   113,   193,   197,   201,   114,   105,   157,
+     197,   198,   190,   114
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1496,11 +1484,11 @@
      182,   182,   182,   182,   182,   182,   182,   182,   182,   184,
      183,   185,   183,   186,   186,   187,   187,   188,   188,   189,
      189,   190,   191,   192,   192,   193,   193,   193,   193,   193,
-     194,   195,   196,   194,   197,   197,   199,   198,   200,   198,
-     201,   201,   202,   202,   203,   203,   204,   205,   205,   206,
-     206,   208,   207,   209,   207,   210,   207,   211,   211,   212,
-     212,   213,   213,   214,   214,   214,   214,   214,   215,   215,
-     216,   216,   218,   217
+     193,   193,   194,   195,   196,   194,   197,   197,   199,   198,
+     200,   198,   201,   201,   202,   202,   203,   203,   204,   205,
+     205,   206,   207,   207,   208,   208,   210,   209,   211,   209,
+     212,   209,   213,   213,   214,   214,   215,   215,   216,   216,
+     216,   216,   216,   217,   217,   218,   218,   220,   219
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1528,11 +1516,11 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     0,
        6,     0,     5,     1,     2,     3,     4,     1,     3,     1,
        4,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       2,     0,     0,     5,     1,     1,     0,     2,     0,     2,
-       2,     3,     1,     2,     1,     2,     5,     3,     1,     1,
-       4,     0,     6,     0,     8,     0,     7,     1,     1,     1,
-       0,     2,     3,     2,     2,     2,     3,     2,     1,     2,
-       1,     1,     0,     3
+       1,     1,     2,     0,     0,     5,     1,     1,     0,     2,
+       0,     2,     2,     3,     1,     2,     1,     2,     5,     3,
+       1,     5,     3,     2,     1,     4,     0,     6,     0,     8,
+       0,     7,     1,     1,     1,     0,     2,     3,     2,     2,
+       2,     3,     2,     1,     2,     1,     1,     0,     3
 };
 
 
@@ -4504,36 +4492,48 @@
 
   case 218:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
 
     break;
 
   case 219:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
 
     break;
 
   case 220:
 
-    { (yyval.interm.intermAggregate) = 0; }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 221:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 222:
 
-    { context->symbolTable.pop(); }
+    { (yyval.interm.intermAggregate) = 0; }
 
     break;
 
   case 223:
 
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 224:
+
+    { context->symbolTable.pop(); }
+
+    break;
+
+  case 225:
+
     {
         if ((yyvsp[-2].interm.intermAggregate) != 0) {
             (yyvsp[-2].interm.intermAggregate)->setOp(EOpSequence);
@@ -4544,27 +4544,15 @@
 
     break;
 
-  case 224:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 225:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
   case 226:
 
-    { context->symbolTable.push(); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 227:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
@@ -4582,13 +4570,25 @@
 
   case 230:
 
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 231:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 232:
+
     {
         (yyval.interm.intermNode) = 0;
     }
 
     break;
 
-  case 231:
+  case 233:
 
     {
         if ((yyvsp[-1].interm.intermAggregate)) {
@@ -4600,7 +4600,7 @@
 
     break;
 
-  case 232:
+  case 234:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[0].interm.intermNode), (yyloc));
@@ -4608,7 +4608,7 @@
 
     break;
 
-  case 233:
+  case 235:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[-1].interm.intermAggregate), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4616,19 +4616,19 @@
 
     break;
 
-  case 234:
+  case 236:
 
     { (yyval.interm.intermNode) = 0; }
 
     break;
 
-  case 235:
+  case 237:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
 
     break;
 
-  case 236:
+  case 238:
 
     {
         if (context->boolErrorCheck((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4638,7 +4638,7 @@
 
     break;
 
-  case 237:
+  case 239:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4647,7 +4647,7 @@
 
     break;
 
-  case 238:
+  case 240:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4656,7 +4656,31 @@
 
     break;
 
-  case 239:
+  case 241:
+
+    {
+        (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermAggregate), (yylsp[-4]));
+    }
+
+    break;
+
+  case 242:
+
+    {
+        (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
+    }
+
+    break;
+
+  case 243:
+
+    {
+        (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
+    }
+
+    break;
+
+  case 244:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4666,7 +4690,7 @@
 
     break;
 
-  case 240:
+  case 245:
 
     {
         TIntermNode* intermNode;
@@ -4685,13 +4709,13 @@
 
     break;
 
-  case 241:
+  case 246:
 
     { context->symbolTable.push(); ++context->mLoopNestingLevel; }
 
     break;
 
-  case 242:
+  case 247:
 
     {
         context->symbolTable.pop();
@@ -4701,13 +4725,13 @@
 
     break;
 
-  case 243:
+  case 248:
 
     { ++context->mLoopNestingLevel; }
 
     break;
 
-  case 244:
+  case 249:
 
     {
         if (context->boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4719,13 +4743,13 @@
 
     break;
 
-  case 245:
+  case 250:
 
     { context->symbolTable.push(); ++context->mLoopNestingLevel; }
 
     break;
 
-  case 246:
+  case 251:
 
     {
         context->symbolTable.pop();
@@ -4735,7 +4759,7 @@
 
     break;
 
-  case 247:
+  case 252:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4743,7 +4767,7 @@
 
     break;
 
-  case 248:
+  case 253:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4751,7 +4775,7 @@
 
     break;
 
-  case 249:
+  case 254:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4759,7 +4783,7 @@
 
     break;
 
-  case 250:
+  case 255:
 
     {
         (yyval.interm.intermTypedNode) = 0;
@@ -4767,7 +4791,7 @@
 
     break;
 
-  case 251:
+  case 256:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
@@ -4776,7 +4800,7 @@
 
     break;
 
-  case 252:
+  case 257:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@@ -4785,7 +4809,7 @@
 
     break;
 
-  case 253:
+  case 258:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
@@ -4793,7 +4817,7 @@
 
     break;
 
-  case 254:
+  case 259:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
@@ -4801,7 +4825,7 @@
 
     break;
 
-  case 255:
+  case 260:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
@@ -4809,7 +4833,7 @@
 
     break;
 
-  case 256:
+  case 261:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4817,7 +4841,7 @@
 
     break;
 
-  case 257:
+  case 262:
 
     {
         FRAG_ONLY("discard", (yylsp[-1]));
@@ -4826,7 +4850,7 @@
 
     break;
 
-  case 258:
+  case 263:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4835,7 +4859,7 @@
 
     break;
 
-  case 259:
+  case 264:
 
     {
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
@@ -4844,7 +4868,7 @@
 
     break;
 
-  case 260:
+  case 265:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4852,7 +4876,7 @@
 
     break;
 
-  case 261:
+  case 266:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
@@ -4860,7 +4884,7 @@
 
     break;
 
-  case 262:
+  case 267:
 
     {
         TFunction* function = (yyvsp[0].interm).function;
@@ -4950,7 +4974,7 @@
 
     break;
 
-  case 263:
+  case 268:
 
     {
         //?? Check that all paths return a value if return type != void ?
diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h
index 20c6dae..6d804f9 100644
--- a/src/compiler/translator/glslang_tab.h
+++ b/src/compiler/translator/glslang_tab.h
@@ -204,6 +204,8 @@
             TIntermNodePair nodePair;
             TIntermTyped* intermTypedNode;
             TIntermAggregate* intermAggregate;
+            TIntermSwitch* intermSwitch;
+            TIntermCase* intermCase;
         };
         union {
             TPublicType type;