Add parsing of arrays of arrays

This changes the grammar so that multiple array sizes can be chained
together, and adds arrays of arrays support to TPublicType. In
TPublicType the array sizes are stored using a pointer to a vector, a
plain vector won't work due to bison restrictions.

A larger subset of program interface query tests now pass. Some are
still failing due to unrelated bugs.

BUG=angleproject:2125
TEST=angle_unittests, angle_end2end_tests,
     dEQP-GLES31.functional.shaders.arrays_of_arrays.*
     dEQP-GLES31.functional.uniform_location.nested_array.*
     dEQP-GLES31.functional.program_interface_query.*
     dEQP-GLES31.functional.ubo.*level*array.*

Change-Id: Iee16477a3752b953f5068c0473a2ed62fead8155
Reviewed-on: https://chromium-review.googlesource.com/633944
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index be47819..7417ab7 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -737,7 +737,7 @@
         for (TIntermNode *const &argNode : *arguments)
         {
             const TType &argType = argNode->getAsTyped()->getType();
-            if (argType.isArray())
+            if (mShaderVersion < 310 && argType.isArray())
             {
                 error(line, "constructing from a non-dereferenced array", "constructor");
                 return false;
@@ -1028,7 +1028,7 @@
 bool TParseContext::checkArrayElementIsNotArray(const TSourceLoc &line,
                                                 const TPublicType &elementType)
 {
-    if (elementType.array)
+    if (mShaderVersion < 310 && elementType.isArray())
     {
         error(line, "cannot declare arrays of arrays",
               TType(elementType).getCompleteString().c_str());
@@ -2138,7 +2138,7 @@
     checkPrecisionSpecified(typeSpecifier->getLine(), typeSpecifier->precision,
                             typeSpecifier->getBasicType());
 
-    if (mShaderVersion < 300 && typeSpecifier->array)
+    if (mShaderVersion < 300 && typeSpecifier->isArray())
     {
         error(typeSpecifier->getLine(), "not supported", "first-class array");
         typeSpecifier->clearArrayness();
@@ -2172,7 +2172,7 @@
 
     if (mShaderVersion < 300)
     {
-        if (typeSpecifier.array)
+        if (typeSpecifier.isArray())
         {
             error(typeSpecifier.getLine(), "not supported", "first-class array");
             returnType.clearArrayness();
@@ -2229,7 +2229,7 @@
     {
         case EvqVertexIn:
             // ESSL 3.00 section 4.3.4
-            if (type.array)
+            if (type.isArray())
             {
                 error(qualifierLocation, "cannot be array", getQualifierString(qualifier));
             }
@@ -2263,7 +2263,7 @@
         // ESSL 3.00 sections 4.3.4 and 4.3.6.
         // These restrictions are only implied by the ESSL 3.00 spec, but
         // the ESSL 3.10 spec lists these restrictions explicitly.
-        if (type.array)
+        if (type.isArray())
         {
             error(qualifierLocation, "cannot be an array of structures",
                   getQualifierString(qualifier));
@@ -2483,11 +2483,12 @@
     return declaration;
 }
 
-TIntermDeclaration *TParseContext::parseSingleArrayDeclaration(TPublicType &elementType,
-                                                               const TSourceLoc &identifierLocation,
-                                                               const TString &identifier,
-                                                               const TSourceLoc &indexLocation,
-                                                               unsigned int arraySize)
+TIntermDeclaration *TParseContext::parseSingleArrayDeclaration(
+    TPublicType &elementType,
+    const TSourceLoc &identifierLocation,
+    const TString &identifier,
+    const TSourceLoc &indexLocation,
+    const TVector<unsigned int> &arraySizes)
 {
     mDeferredNonEmptyDeclarationErrorCheck = false;
 
@@ -2499,7 +2500,7 @@
     checkIsValidTypeAndQualifierForArray(indexLocation, elementType);
 
     TType arrayType(elementType);
-    arrayType.makeArray(arraySize);
+    arrayType.makeArrays(arraySizes);
 
     checkGeometryShaderInputAndSetArraySize(indexLocation, identifier.c_str(), &arrayType);
 
@@ -2556,7 +2557,7 @@
     const TSourceLoc &identifierLocation,
     const TString &identifier,
     const TSourceLoc &indexLocation,
-    unsigned int arraySize,
+    const TVector<unsigned int> &arraySizes,
     const TSourceLoc &initLocation,
     TIntermTyped *initializer)
 {
@@ -2570,7 +2571,7 @@
     checkIsValidTypeAndQualifierForArray(indexLocation, elementType);
 
     TType arrayType(elementType);
-    arrayType.makeArray(arraySize);
+    arrayType.makeArrays(arraySizes);
 
     TIntermDeclaration *declaration = new TIntermDeclaration();
     declaration->setLine(identifierLocation);
@@ -2682,7 +2683,7 @@
                                          const TSourceLoc &identifierLocation,
                                          const TString &identifier,
                                          const TSourceLoc &arrayLocation,
-                                         unsigned int arraySize,
+                                         const TVector<unsigned int> &arraySizes,
                                          TIntermDeclaration *declarationOut)
 {
     // If the declaration starting this declarator list was empty (example: int,), some checks were
@@ -2698,7 +2699,7 @@
     if (checkIsValidTypeAndQualifierForArray(arrayLocation, elementType))
     {
         TType arrayType(elementType);
-        arrayType.makeArray(arraySize);
+        arrayType.makeArrays(arraySizes);
 
         checkGeometryShaderInputAndSetArraySize(identifierLocation, identifier.c_str(), &arrayType);
 
@@ -2754,7 +2755,7 @@
                                              const TSourceLoc &identifierLocation,
                                              const TString &identifier,
                                              const TSourceLoc &indexLocation,
-                                             unsigned int arraySize,
+                                             const TVector<unsigned int> &arraySizes,
                                              const TSourceLoc &initLocation,
                                              TIntermTyped *initializer,
                                              TIntermDeclaration *declarationOut)
@@ -2772,7 +2773,7 @@
     checkIsValidTypeAndQualifierForArray(indexLocation, elementType);
 
     TType arrayType(elementType);
-    arrayType.makeArray(arraySize);
+    arrayType.makeArrays(arraySizes);
 
     // initNode will correspond to the whole of "b[n] = initializer".
     TIntermBinary *initNode = nullptr;
@@ -3440,7 +3441,7 @@
     {
         // Array return values are forbidden, but there's also no valid syntax for declaring array
         // return values in ESSL 1.00.
-        ASSERT(type.arraySize == 0 || mDiagnostics->numErrors() > 0);
+        ASSERT(!type.isArray() || mDiagnostics->numErrors() > 0);
 
         if (type.isStructureContainingArrays())
         {
@@ -3462,7 +3463,7 @@
 
 TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType)
 {
-    if (mShaderVersion < 300 && publicType.array)
+    if (mShaderVersion < 300 && publicType.isArray())
     {
         error(publicType.getLine(), "array constructor supported in GLSL ES 3.00 and above only",
               "[]");
@@ -3522,13 +3523,13 @@
 
 TParameter TParseContext::parseParameterArrayDeclarator(const TString *name,
                                                         const TSourceLoc &nameLoc,
-                                                        unsigned int arraySize,
+                                                        const TVector<unsigned int> &arraySizes,
                                                         const TSourceLoc &arrayLoc,
                                                         TPublicType *elementType)
 {
     checkArrayElementIsNotArray(arrayLoc, *elementType);
     TType *arrayType = new TType(*elementType);
-    arrayType->makeArray(arraySize);
+    arrayType->makeArrays(arraySizes);
     return parseParameterDeclarator(arrayType, name, nameLoc);
 }
 
@@ -4665,13 +4666,13 @@
 
 TField *TParseContext::parseStructArrayDeclarator(TString *identifier,
                                                   const TSourceLoc &loc,
-                                                  unsigned int arraySize,
+                                                  const TVector<unsigned int> &arraySizes,
                                                   const TSourceLoc &arraySizeLoc)
 {
     checkIsNotReserved(loc, *identifier);
 
     TType *type       = new TType(EbtVoid, EbpUndefined);
-    type->makeArray(arraySize);
+    type->makeArrays(arraySizes);
 
     return new TField(type, identifier, loc);
 }
@@ -4746,7 +4747,7 @@
     for (TField *declarator : *declaratorList)
     {
         auto declaratorArraySizes = declarator->type()->getArraySizes();
-        // don't allow arrays of arrays
+        // Don't allow arrays of arrays in ESSL < 3.10.
         if (!declaratorArraySizes.empty())
         {
             checkArrayElementIsNotArray(typeSpecifier.getLine(), typeSpecifier);
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index e917db7..6cf5fad 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -221,7 +221,7 @@
                                                     const TSourceLoc &identifierLocation,
                                                     const TString &identifier,
                                                     const TSourceLoc &indexLocation,
-                                                    unsigned int arraySize);
+                                                    const TVector<unsigned int> &arraySizes);
     TIntermDeclaration *parseSingleInitDeclaration(const TPublicType &publicType,
                                                    const TSourceLoc &identifierLocation,
                                                    const TString &identifier,
@@ -234,7 +234,7 @@
                                                         const TSourceLoc &identifierLocation,
                                                         const TString &identifier,
                                                         const TSourceLoc &indexLocation,
-                                                        unsigned int arraySize,
+                                                        const TVector<unsigned int> &arraySizes,
                                                         const TSourceLoc &initLocation,
                                                         TIntermTyped *initializer);
 
@@ -252,7 +252,7 @@
                               const TSourceLoc &identifierLocation,
                               const TString &identifier,
                               const TSourceLoc &arrayLocation,
-                              unsigned int arraySize,
+                              const TVector<unsigned int> &arraySizes,
                               TIntermDeclaration *declarationOut);
     void parseInitDeclarator(const TPublicType &publicType,
                              const TSourceLoc &identifierLocation,
@@ -266,7 +266,7 @@
                                   const TSourceLoc &identifierLocation,
                                   const TString &identifier,
                                   const TSourceLoc &indexLocation,
-                                  unsigned int arraySize,
+                                  const TVector<unsigned int> &arraySizes,
                                   const TSourceLoc &initLocation,
                                   TIntermTyped *initializer,
                                   TIntermDeclaration *declarationOut);
@@ -298,7 +298,7 @@
 
     TParameter parseParameterArrayDeclarator(const TString *name,
                                              const TSourceLoc &nameLoc,
-                                             unsigned int arraySize,
+                                             const TVector<unsigned int> &arraySizes,
                                              const TSourceLoc &arrayLoc,
                                              TPublicType *elementType);
 
@@ -314,7 +314,7 @@
     TField *parseStructDeclarator(TString *identifier, const TSourceLoc &loc);
     TField *parseStructArrayDeclarator(TString *identifier,
                                        const TSourceLoc &loc,
-                                       unsigned int arraySize,
+                                       const TVector<unsigned int> &arraySizes,
                                        const TSourceLoc &arraySizeLoc);
 
     void checkDoesNotHaveDuplicateFieldName(const TFieldList::const_iterator begin,
diff --git a/src/compiler/translator/Types.cpp b/src/compiler/translator/Types.cpp
index 04e885a..d59a3d8 100644
--- a/src/compiler/translator/Types.cpp
+++ b/src/compiler/translator/Types.cpp
@@ -178,9 +178,9 @@
 {
     ASSERT(primarySize <= 4);
     ASSERT(secondarySize <= 4);
-    if (p.array)
+    if (p.isArray())
     {
-        makeArray(p.arraySize);
+        mArraySizes = *p.arraySizes;
     }
     if (p.getUserDef())
     {
@@ -715,6 +715,12 @@
     invalidateMangledName();
 }
 
+void TType::makeArrays(const TVector<unsigned int> &sizes)
+{
+    mArraySizes.insert(mArraySizes.end(), sizes.begin(), sizes.end());
+    invalidateMangledName();
+}
+
 void TType::setArraySize(size_t arrayDimension, unsigned int s)
 {
     ASSERT(arrayDimension < mArraySizes.size());
@@ -940,8 +946,7 @@
     qualifier             = q;
     invariant             = false;
     precision             = EbpUndefined;
-    array                 = false;
-    arraySize             = 0;
+    arraySizes            = nullptr;
 }
 
 void TPublicType::initializeBasicType(TBasicType basicType)
@@ -954,8 +959,7 @@
     qualifier                           = EvqTemporary;
     invariant                           = false;
     precision                           = EbpUndefined;
-    array                               = false;
-    arraySize                           = 0;
+    arraySizes                          = nullptr;
 }
 
 bool TPublicType::isStructureContainingArrays() const
@@ -978,21 +982,24 @@
     return typeSpecifierNonArray.userDef->containsType(t);
 }
 
-void TPublicType::setArraySize(int s)
+void TPublicType::setArraySizes(TVector<unsigned int> *sizes)
 {
-    array     = true;
-    arraySize = s;
+    arraySizes = sizes;
+}
+
+bool TPublicType::isArray() const
+{
+    return arraySizes && !arraySizes->empty();
 }
 
 void TPublicType::clearArrayness()
 {
-    array     = false;
-    arraySize = 0;
+    arraySizes = nullptr;
 }
 
 bool TPublicType::isAggregate() const
 {
-    return array || typeSpecifierNonArray.isMatrix() || typeSpecifierNonArray.isVector();
+    return isArray() || typeSpecifierNonArray.isMatrix() || typeSpecifierNonArray.isVector();
 }
 
 }  // namespace sh
diff --git a/src/compiler/translator/Types.h b/src/compiler/translator/Types.h
index 0ca83c7..63d6242 100644
--- a/src/compiler/translator/Types.h
+++ b/src/compiler/translator/Types.h
@@ -247,8 +247,10 @@
     unsigned int getArraySizeProduct() const;
     bool isUnsizedArray() const;
     unsigned int getOutermostArraySize() const { return mArraySizes.back(); }
-    void makeArray(unsigned int s);
 
+    void makeArray(unsigned int s);
+    // sizes contain new outermost array sizes.
+    void makeArrays(const TVector<unsigned int> &sizes);
     // Here, the array dimension value 0 corresponds to the innermost array.
     void setArraySize(size_t arrayDimension, unsigned int s);
 
@@ -475,7 +477,8 @@
 
     bool isStructureContainingArrays() const;
     bool isStructureContainingType(TBasicType t) const;
-    void setArraySize(int s);
+    void setArraySizes(TVector<unsigned int> *sizes);
+    bool isArray() const;
     void clearArrayness();
     bool isAggregate() const;
 
@@ -485,8 +488,11 @@
     TQualifier qualifier;
     bool invariant;
     TPrecision precision;
-    bool array;
-    int arraySize;
+
+    // Either nullptr or empty in case the type is not an array. The last element is the outermost
+    // array size. Note that due to bison restrictions, copies of the public type created by the
+    // copy constructor share the same arraySizes pointer.
+    const TVector<unsigned int> *arraySizes;
 };
 
 }  // namespace sh
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 706c552..3e506ca 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -86,7 +86,7 @@
             TIntermCase *intermCase;
         };
         union {
-            unsigned int arraySize;
+            TVector<unsigned int> *arraySizes;
             TTypeSpecifierNonArray typeSpecifierNonArray;
             TPublicType type;
             TPrecision precision;
@@ -219,7 +219,8 @@
 %type <interm.param> parameter_declaration parameter_declarator parameter_type_specifier
 %type <interm.layoutQualifier> layout_qualifier_id_list layout_qualifier_id
 
-%type <interm.arraySize> array_specifier
+// Note: array_specifier guaranteed to be non-null.
+%type <interm.arraySizes> array_specifier
 
 %type <interm.type> fully_specified_type type_specifier
 
@@ -686,7 +687,7 @@
         $$ = context->parseParameterDeclarator($1, $2.string, @2);
     }
     | type_specifier identifier array_specifier {
-        $$ = context->parseParameterArrayDeclarator($2.string, @2, $3, @3, &$1);
+        $$ = context->parseParameterArrayDeclarator($2.string, @2, *($3), @3, &$1);
     }
     ;
 
@@ -726,12 +727,12 @@
     }
     | init_declarator_list COMMA identifier array_specifier {
         $$ = $1;
-        context->parseArrayDeclarator($$.type, @3, *$3.string, @4, $4, $$.intermDeclaration);
+        context->parseArrayDeclarator($$.type, @3, *$3.string, @4, *($4), $$.intermDeclaration);
     }
     | init_declarator_list COMMA identifier array_specifier EQUAL initializer {
         ES3_OR_NEWER("=", @5, "first-class arrays (array initializer)");
         $$ = $1;
-        context->parseArrayInitDeclarator($$.type, @3, *$3.string, @4, $4, @5, $6, $$.intermDeclaration);
+        context->parseArrayInitDeclarator($$.type, @3, *$3.string, @4, *($4), @5, $6, $$.intermDeclaration);
     }
     | init_declarator_list COMMA identifier EQUAL initializer {
         $$ = $1;
@@ -750,12 +751,12 @@
     }
     | fully_specified_type identifier array_specifier {
         $$.type = $1;
-        $$.intermDeclaration = context->parseSingleArrayDeclaration($$.type, @2, *$2.string, @3, $3);
+        $$.intermDeclaration = context->parseSingleArrayDeclaration($$.type, @2, *$2.string, @3, *($3));
     }
     | fully_specified_type identifier array_specifier EQUAL initializer {
         ES3_OR_NEWER("[]", @3, "first-class arrays (array initializer)");
         $$.type = $1;
-        $$.intermDeclaration = context->parseSingleArrayInitDeclaration($$.type, @2, *$2.string, @3, $3, @4, $5);
+        $$.intermDeclaration = context->parseSingleArrayInitDeclaration($$.type, @2, *$2.string, @3, *($3), @4, $5);
     }
     | fully_specified_type identifier EQUAL initializer {
         $$.type = $1;
@@ -932,20 +933,35 @@
     }
     | type_specifier_nonarray array_specifier {
         $$.initialize($1, (context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary));
-        $$.setArraySize($2);
+        $$.setArraySizes($2);
     }
     ;
 
 array_specifier
     : LEFT_BRACKET RIGHT_BRACKET {
         ES3_OR_NEWER("[]", @1, "implicitly sized array");
-        $$ = 0u;
+        $$ = new TVector<unsigned int>();
+        $$->push_back(0u);
     }
     | LEFT_BRACKET constant_expression RIGHT_BRACKET {
+        $$ = new TVector<unsigned int>();
         unsigned int size = context->checkIsValidArraySize(@1, $2);
         // Make the type an array even if size check failed.
         // This ensures useless error messages regarding a variable's non-arrayness won't follow.
-        $$ = size;
+        $$->push_back(size);
+    }
+    | array_specifier LEFT_BRACKET RIGHT_BRACKET {
+        ES3_1_ONLY("[]", @2, "arrays of arrays");
+        $$ = $1;
+        $$->insert($$->begin(), 0u);
+    }
+    | array_specifier LEFT_BRACKET constant_expression RIGHT_BRACKET {
+        ES3_1_ONLY("[]", @2, "arrays of arrays");
+        $$ = $1;
+        unsigned int size = context->checkIsValidArraySize(@2, $3);
+        // Make the type an array even if size check failed.
+        // This ensures useless error messages regarding a variable's non-arrayness won't follow.
+        $$->insert($$->begin(), size);
     }
     ;
 
@@ -1226,7 +1242,7 @@
         $$ = context->parseStructDeclarator($1.string, @1);
     }
     | identifier array_specifier {
-        $$ = context->parseStructArrayDeclarator($1.string, @1, $2, @2);
+        $$ = context->parseStructArrayDeclarator($1.string, @1, *($2), @2);
     }
     ;
 
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index ac8e202..ce4aacf 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -327,7 +327,7 @@
             TIntermCase *intermCase;
         };
         union {
-            unsigned int arraySize;
+            TVector<unsigned int> *arraySizes;
             TTypeSpecifierNonArray typeSpecifierNonArray;
             TPublicType type;
             TPrecision precision;
@@ -672,16 +672,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  135
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2769
+#define YYLAST   2897
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  154
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  95
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  295
+#define YYNRULES  297
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  419
+#define YYNSTATES  423
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -742,36 +742,36 @@
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   247,   247,   248,   251,   261,   264,   269,   274,   279,
-     284,   293,   299,   302,   305,   308,   311,   314,   320,   327,
-     333,   337,   345,   348,   354,   358,   365,   370,   377,   385,
-     388,   391,   397,   400,   403,   406,   413,   414,   415,   416,
-     424,   425,   428,   431,   438,   439,   442,   448,   449,   453,
-     460,   461,   464,   467,   470,   476,   477,   480,   486,   487,
-     494,   495,   502,   503,   510,   511,   517,   518,   524,   525,
-     531,   532,   538,   539,   545,   546,   547,   548,   552,   553,
-     554,   558,   562,   566,   570,   577,   580,   586,   593,   600,
-     603,   606,   610,   614,   618,   622,   626,   633,   640,   643,
-     650,   658,   675,   685,   688,   694,   698,   702,   706,   713,
-     720,   723,   727,   731,   736,   743,   747,   751,   755,   760,
-     767,   771,   777,   780,   786,   790,   797,   803,   807,   811,
-     814,   817,   826,   831,   835,   838,   841,   844,   847,   851,
-     854,   858,   861,   864,   867,   870,   873,   880,   887,   890,
-     893,   899,   906,   909,   915,   918,   921,   924,   930,   933,
-     940,   944,   953,   956,   959,   962,   965,   968,   972,   976,
-     980,   984,   988,   992,   996,  1000,  1004,  1008,  1012,  1016,
-    1020,  1024,  1028,  1032,  1036,  1040,  1044,  1048,  1052,  1059,
-    1062,  1065,  1068,  1071,  1074,  1077,  1080,  1083,  1086,  1089,
-    1092,  1095,  1098,  1101,  1104,  1107,  1110,  1113,  1123,  1130,
-    1137,  1140,  1143,  1146,  1149,  1152,  1155,  1158,  1161,  1164,
-    1167,  1170,  1173,  1176,  1179,  1187,  1187,  1190,  1190,  1196,
-    1199,  1205,  1208,  1215,  1219,  1225,  1228,  1234,  1238,  1242,
-    1243,  1249,  1250,  1251,  1252,  1253,  1254,  1255,  1259,  1263,
-    1263,  1263,  1270,  1271,  1275,  1275,  1276,  1276,  1281,  1285,
-    1292,  1296,  1303,  1304,  1308,  1314,  1318,  1327,  1327,  1334,
-    1337,  1343,  1347,  1353,  1353,  1358,  1358,  1362,  1362,  1370,
-    1373,  1379,  1382,  1388,  1392,  1399,  1402,  1405,  1408,  1411,
-    1419,  1425,  1431,  1434,  1440,  1440
+       0,   248,   248,   249,   252,   262,   265,   270,   275,   280,
+     285,   294,   300,   303,   306,   309,   312,   315,   321,   328,
+     334,   338,   346,   349,   355,   359,   366,   371,   378,   386,
+     389,   392,   398,   401,   404,   407,   414,   415,   416,   417,
+     425,   426,   429,   432,   439,   440,   443,   449,   450,   454,
+     461,   462,   465,   468,   471,   477,   478,   481,   487,   488,
+     495,   496,   503,   504,   511,   512,   518,   519,   525,   526,
+     532,   533,   539,   540,   546,   547,   548,   549,   553,   554,
+     555,   559,   563,   567,   571,   578,   581,   587,   594,   601,
+     604,   607,   611,   615,   619,   623,   627,   634,   641,   644,
+     651,   659,   676,   686,   689,   695,   699,   703,   707,   714,
+     721,   724,   728,   732,   737,   744,   748,   752,   756,   761,
+     768,   772,   778,   781,   787,   791,   798,   804,   808,   812,
+     815,   818,   827,   832,   836,   839,   842,   845,   848,   852,
+     855,   859,   862,   865,   868,   871,   874,   881,   888,   891,
+     894,   900,   907,   910,   916,   919,   922,   925,   931,   934,
+     941,   946,   953,   958,   969,   972,   975,   978,   981,   984,
+     988,   992,   996,  1000,  1004,  1008,  1012,  1016,  1020,  1024,
+    1028,  1032,  1036,  1040,  1044,  1048,  1052,  1056,  1060,  1064,
+    1068,  1075,  1078,  1081,  1084,  1087,  1090,  1093,  1096,  1099,
+    1102,  1105,  1108,  1111,  1114,  1117,  1120,  1123,  1126,  1129,
+    1139,  1146,  1153,  1156,  1159,  1162,  1165,  1168,  1171,  1174,
+    1177,  1180,  1183,  1186,  1189,  1192,  1195,  1203,  1203,  1206,
+    1206,  1212,  1215,  1221,  1224,  1231,  1235,  1241,  1244,  1250,
+    1254,  1258,  1259,  1265,  1266,  1267,  1268,  1269,  1270,  1271,
+    1275,  1279,  1279,  1279,  1286,  1287,  1291,  1291,  1292,  1292,
+    1297,  1301,  1308,  1312,  1319,  1320,  1324,  1330,  1334,  1343,
+    1343,  1350,  1353,  1359,  1363,  1369,  1369,  1374,  1374,  1378,
+    1378,  1386,  1389,  1395,  1398,  1404,  1408,  1415,  1418,  1421,
+    1424,  1427,  1435,  1441,  1447,  1450,  1456,  1456
 };
 #endif
 
@@ -868,12 +868,12 @@
 };
 # endif
 
-#define YYPACT_NINF -354
+#define YYPACT_NINF -366
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-354)))
+  (!!((Yystate) == (-366)))
 
-#define YYTABLE_NINF -255
+#define YYTABLE_NINF -257
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -882,48 +882,49 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2377,  -354,  -354,  -354,  -354,   106,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,   -80,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -106,  -354,  -354,  -354,  -101,  -103,
-     -77,  2478,   -42,  -354,   -18,  -354,  1359,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,   -68,  -354,  2276,  -354,  -354,  2666,
-    -354,  -354,  -354,   -15,   -41,  -354,    -3,  -354,  2478,  -354,
-    -354,  -354,  2478,    45,    45,  -354,   -56,   -67,   -92,  -354,
-    2478,  -354,  -354,  1454,  -354,  -354,  -354,   -70,  2478,  -354,
-    -354,     4,   -75,  -354,   403,  -354,  -354,  -354,  -354,   -68,
-     -64,  -354,  1699,     6,  -354,  -354,  2478,    45,  1943,  -354,
-    -354,    24,  -354,  -354,  -354,  -354,  -354,  1699,  1699,  1699,
-    -354,  -354,  -354,  -354,  -354,  -354,  -354,   -86,  -354,  -354,
-    -354,    26,   -49,  1820,    29,  -354,  1699,    -6,    -7,    41,
-     -69,    37,    11,    16,    21,    55,    71,   -98,  -354,    42,
-    -354,  -354,  2054,  2478,    56,  -354,   -41,    53,    54,  -354,
-      65,    66,    57,  1578,    74,  1699,    63,    94,    90,  -354,
-    -354,    60,  -354,  -354,   -13,  -354,  -101,    96,  -354,  -354,
-    -354,  -354,   545,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    1699,    88,  -354,  -354,  1699,    45,   -68,   -12,  -354,   -81,
-    -354,  -354,  -354,   -48,  -354,  -354,  1699,  2572,  -354,  -354,
-    1699,    97,  -354,  -354,  -354,  1699,  1699,  1699,  1699,  1699,
-    1699,  1699,  1699,  1699,  1699,  1699,  1699,  1699,  1699,  1699,
-    1699,  1699,  1699,  1699,  1699,  -354,  -354,  2165,  -354,  -354,
-    -354,  -354,  -354,    95,  -354,  1699,  -354,  -354,    -8,  1699,
-      92,  -354,  -354,  -354,   687,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,  -354,  -354,  -354,  -354,  1699,  1699,  -354,  -354,
-    -354,  -354,  1699,  -354,    -4,  -354,    45,  -354,  -105,  -354,
-    -354,   101,    98,  -354,   107,  -354,  -354,  -354,  -354,  -354,
-      -6,    -6,    -7,    -7,    41,    41,    41,    41,   -69,   -69,
-      37,    11,    16,    21,    55,    71,    28,  -354,   173,    -3,
-     971,  1113,   -45,  -354,   -38,  -354,  1236,   687,  -354,  -354,
-    -354,  -354,  -354,  1699,  -354,  -354,  1699,   108,  -354,  -354,
-    -354,  -354,  1236,    95,  -354,    98,    45,  2478,   109,   104,
-     110,  -354,  1699,  -354,   102,   113,   224,  -354,   114,   111,
-     829,  -354,   112,   -37,  1699,   829,    95,  -354,  1699,  -354,
-    -354,  -354,  -354,   115,    98,  -354,  -354,  -354,  -354
+    2505,  -366,  -366,  -366,  -366,   144,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,   -68,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,   -99,  -366,  -366,  -366,   -97,   -85,
+     -87,  2606,   -45,  -366,   -32,  -366,  1363,  -366,  -366,  -366,
+    -366,  -366,  -366,  -366,   -42,  -366,  2404,  -366,  -366,  2794,
+    -366,  -366,  -366,   -40,   -41,  -366,   -31,  -366,  2606,  -366,
+    -366,  -366,  2606,   -18,   -18,  -366,   -10,  -107,   -51,  -366,
+    2606,  -366,  -366,  1458,   -20,  -366,  -366,   -13,  2606,  -366,
+    -366,   -91,   -50,  -366,   407,  -366,  -366,  -366,  -366,   -42,
+     -67,  -366,  1827,   -64,  -366,  -366,  2606,   -18,  2071,  -366,
+    -366,    16,  -366,  -366,  -366,  -366,  -366,  1827,  1827,  1827,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,   -58,  -366,  -366,
+    -366,    57,   -38,  1948,    24,  -366,  1827,     6,    13,    60,
+     -86,    58,    25,    38,    45,    79,    78,   -94,  -366,    65,
+    -366,  1582,  -366,  2182,  2606,    74,  -366,   -41,    59,    62,
+    -366,    70,    76,    67,  1706,    80,  1827,    71,    81,    73,
+    -366,  -366,    39,  -366,  -366,   -21,  -366,   -97,    84,  -366,
+    -366,  -366,  -366,   549,  -366,  -366,  -366,  -366,  -366,  -366,
+     -20,  1827,   -53,  -366,  -366,  1827,   -18,   -42,   -16,  -366,
+     -82,  -366,  -366,  -366,   -29,  -366,  -366,  1827,  2700,  -366,
+    -366,  1827,    85,  -366,  -366,  -366,  1827,  1827,  1827,  1827,
+    1827,  1827,  1827,  1827,  1827,  1827,  1827,  1827,  1827,  1827,
+    1827,  1827,  1827,  1827,  1827,  1827,  -366,  -366,    82,  -366,
+    2293,  -366,  -366,  -366,  -366,  -366,    83,  -366,  1827,  -366,
+    -366,    -1,  1827,    86,  -366,  -366,  -366,   691,  -366,  -366,
+    -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  -366,  1827,
+    1827,  -366,  -366,  -366,  -366,  1827,  -366,     3,   -20,   -18,
+    -366,   -96,  -366,  -366,    88,    89,  -366,    92,  -366,  -366,
+    -366,  -366,  -366,     6,     6,    13,    13,    60,    60,    60,
+      60,   -86,   -86,    58,    25,    38,    45,    79,    78,    46,
+    -366,  -366,   155,   -31,   975,  1117,   -27,  -366,   -26,  -366,
+    1240,   691,  -366,  -366,  -366,  -366,  -366,  1827,  -366,  -366,
+    1827,    93,  -366,  -366,  -366,  -366,  1240,    83,  -366,    89,
+     -18,  2606,    94,    95,    98,  -366,  1827,  -366,    87,    97,
+     202,  -366,   100,    96,   833,  -366,   101,   -24,  1827,   833,
+      83,  -366,  1827,  -366,  -366,  -366,  -366,   102,    89,  -366,
+    -366,  -366,  -366
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -931,78 +932,79 @@
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,   126,   148,   149,   150,     0,   132,   134,   166,   163,
-     164,   165,   170,   171,   172,   173,   174,   175,   167,   168,
-     169,   176,   177,   178,   179,   180,   181,   135,   136,   137,
-     139,   140,   133,   182,   183,   184,   185,   186,   187,   138,
-     123,   122,   141,   142,   143,   144,   145,   146,     0,   162,
-     189,   191,   207,   209,   192,   194,   195,   196,   197,   199,
-     200,   201,   202,   193,   198,   203,   190,   204,   205,   206,
-     208,   211,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,     0,   188,   224,   293,   294,     0,
+       0,   126,   148,   149,   150,     0,   132,   134,   168,   165,
+     166,   167,   172,   173,   174,   175,   176,   177,   169,   170,
+     171,   178,   179,   180,   181,   182,   183,   135,   136,   137,
+     139,   140,   133,   184,   185,   186,   187,   188,   189,   138,
+     123,   122,   141,   142,   143,   144,   145,   146,     0,   164,
+     191,   193,   209,   211,   194,   196,   197,   198,   199,   201,
+     202,   203,   204,   195,   200,   205,   192,   206,   207,   208,
+     210,   213,   214,   215,   216,   217,   218,   219,   220,   221,
+     222,   223,   224,   225,     0,   190,   226,   295,   296,     0,
       99,    98,     0,   110,   115,   130,     0,   131,   124,   127,
-     120,   129,   128,   147,   158,   210,     0,   290,   292,     0,
-       2,     3,   227,     0,     0,    89,     0,    97,     0,   106,
+     120,   129,   128,   147,   158,   212,     0,   292,   294,     0,
+       2,     3,   229,     0,     0,    89,     0,    97,     0,   106,
      100,   108,     0,   109,     0,    90,     2,   116,     0,    95,
-       0,   125,   121,     0,   159,     1,   291,     0,     0,   225,
-     157,   154,     0,   152,     0,   295,   101,   105,   107,   103,
-     111,   102,     0,   117,    88,    96,     0,     0,     0,   229,
+       0,   125,   121,     0,   159,     1,   293,     0,     0,   227,
+     157,   154,     0,   152,     0,   297,   101,   105,   107,   103,
+     111,   102,     0,   117,    88,    96,     0,     0,     0,   231,
       10,     4,     8,     6,     7,     9,    31,     0,     0,     0,
      160,    38,    37,    39,    36,     5,    12,    32,    14,    19,
       20,     0,     0,    25,     0,    40,     0,    44,    47,    50,
       55,    58,    60,    62,    64,    66,    68,    70,    87,     0,
-      29,    91,     0,     0,     0,   151,     0,     0,     0,   275,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,   258,
-     262,    40,    72,    85,     0,   238,     0,   147,   241,   260,
-     240,   239,     0,   242,   243,   244,   245,   246,   247,   104,
-       0,   112,   237,   119,     0,     0,   235,     0,   233,     0,
-     230,    33,    34,     0,    16,    17,     0,     0,    23,    22,
-       0,   162,    26,    28,    35,     0,     0,     0,     0,     0,
+      29,     0,    91,     0,     0,     0,   151,     0,     0,     0,
+     277,     0,     0,     0,     0,     0,     0,     0,     0,   251,
+     260,   264,    40,    72,    85,     0,   240,     0,   147,   243,
+     262,   242,   241,     0,   244,   245,   246,   247,   248,   249,
+     104,     0,   112,   239,   119,     0,     0,   237,     0,   235,
+       0,   232,    33,    34,     0,    16,    17,     0,     0,    23,
+      22,     0,   164,    26,    28,    35,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   161,   228,     0,   155,   156,
-     153,   286,   285,   256,   277,     0,   289,   287,     0,     0,
-       0,   270,   273,   248,     0,    75,    76,    78,    77,    80,
-      81,    82,    83,    84,    79,    74,     0,     0,   263,   259,
-     261,   114,     0,   118,     0,   236,     0,   231,     0,    92,
-      11,     0,    18,    30,    15,    21,    27,    41,    42,    43,
-      46,    45,    48,    49,    53,    54,    51,    52,    56,    57,
-      59,    61,    63,    65,    67,    69,     0,   226,     0,     0,
-       0,     0,     0,   288,     0,   269,     0,   250,    73,    86,
-     113,   232,   234,     0,    93,    13,     0,     0,   255,   257,
-     280,   279,   282,   256,   267,   271,     0,     0,     0,     0,
-       0,    71,     0,   281,     0,     0,   266,   264,     0,     0,
-       0,   251,     0,     0,   283,     0,   256,   268,     0,   253,
-     274,   252,    94,     0,   284,   278,   265,   272,   276
+       0,     0,     0,     0,     0,     0,   161,   162,     0,   230,
+       0,   155,   156,   153,   288,   287,   258,   279,     0,   291,
+     289,     0,     0,     0,   272,   275,   250,     0,    75,    76,
+      78,    77,    80,    81,    82,    83,    84,    79,    74,     0,
+       0,   265,   261,   263,   114,     0,   118,     0,   238,     0,
+     233,     0,    92,    11,     0,    18,    30,    15,    21,    27,
+      41,    42,    43,    46,    45,    48,    49,    53,    54,    51,
+      52,    56,    57,    59,    61,    63,    65,    67,    69,     0,
+     163,   228,     0,     0,     0,     0,     0,   290,     0,   271,
+       0,   252,    73,    86,   113,   234,   236,     0,    93,    13,
+       0,     0,   257,   259,   282,   281,   284,   258,   269,   273,
+       0,     0,     0,     0,     0,    71,     0,   283,     0,     0,
+     268,   266,     0,     0,     0,   253,     0,     0,   285,     0,
+     258,   270,     0,   255,   276,   254,    94,     0,   286,   280,
+     267,   274,   278
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -354,   -47,  -354,  -354,  -354,  -354,  -354,  -354,    -1,  -354,
-    -354,  -354,  -354,   -60,  -354,   -99,   -93,  -170,   -85,   -29,
-     -28,   -27,   -23,   -22,   -24,  -354,  -128,  -143,  -354,  -135,
-    -205,  -354,    14,    17,  -354,  -354,  -354,   132,   143,   140,
-    -354,  -354,  -330,  -354,   -87,  -354,   -90,  -354,   -89,   258,
-    -354,  -354,    58,     0,  -112,  -354,  -354,  -354,  -354,  -122,
-    -145,    22,   -58,  -232,   -95,  -221,  -342,  -127,  -354,  -354,
-    -133,  -353,  -354,  -354,  -113,   -34,   -88,  -354,  -354,  -354,
-    -354,  -354,  -108,  -354,  -354,  -354,  -354,  -354,  -354,  -354,
-    -354,  -354,   169,  -354,  -354
+    -366,   -47,  -366,  -366,  -366,  -366,  -366,  -366,   -15,  -366,
+    -366,  -366,  -366,     4,  -366,   -83,   -80,  -142,   -84,   -39,
+     -48,   -44,   -37,   -36,   -46,  -366,  -128,  -144,  -366,  -157,
+    -195,  -366,    17,    23,  -366,  -366,  -366,   122,   128,   126,
+    -366,  -366,  -344,  -366,   -78,  -366,   -92,  -366,   -89,   247,
+    -366,  -366,    47,     0,  -112,  -366,  -366,  -366,  -366,  -122,
+    -148,     7,   -74,  -227,  -109,  -224,  -353,  -145,  -366,  -366,
+    -151,  -365,  -366,  -366,  -113,   -43,  -106,  -366,  -366,  -366,
+    -366,  -366,  -126,  -366,  -366,  -366,  -366,  -366,  -366,  -366,
+    -366,  -366,   156,  -366,  -366
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   246,   175,   176,   177,   331,   178,   179,   180,   181,
-     182,   183,   184,   221,   186,   187,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   222,   223,   316,   224,
-     199,   130,   225,   226,    89,    90,    91,   119,   120,   121,
+      -1,   247,   175,   176,   177,   334,   178,   179,   180,   181,
+     182,   183,   184,   222,   186,   187,   188,   189,   190,   191,
+     192,   193,   194,   195,   196,   197,   223,   224,   319,   225,
+     199,   130,   226,   227,    89,    90,    91,   119,   120,   121,
       92,    93,    94,    95,    96,    97,    98,    99,   100,   101,
-     102,   142,   143,   200,   134,   104,   105,   203,   138,   158,
-     159,   247,   248,   243,   228,   229,   230,   231,   304,   389,
-     410,   358,   359,   360,   411,   232,   233,   234,   397,   235,
-     398,   236,   388,   237,   366,   293,   361,   382,   394,   395,
-     238,   106,   107,   108,   116
+     102,   142,   143,   200,   134,   104,   105,   204,   138,   158,
+     159,   248,   249,   244,   229,   230,   231,   232,   307,   393,
+     414,   362,   363,   364,   415,   233,   234,   235,   401,   236,
+     402,   237,   392,   238,   370,   296,   365,   386,   398,   399,
+     239,   106,   107,   108,   116
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1010,198 +1012,140 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-     103,   113,   123,   145,   122,   198,   131,   132,   321,   242,
-     300,   320,   323,   250,    87,   153,   202,    88,   379,   140,
-     283,   328,   110,   111,   114,   254,   255,   373,   117,   123,
-     396,   122,   131,   123,   253,   374,   386,   239,   241,   115,
-     262,   157,   154,   156,   272,   273,   256,   127,   155,   157,
-     257,   156,   386,   416,   112,   284,   205,   250,   409,   329,
-     118,   141,   206,   409,   133,   133,   131,   245,   133,   157,
-     201,   156,   152,   185,   151,   240,   149,   150,   298,   274,
-     275,   287,   259,   330,   126,   111,   383,   198,   260,   317,
-     370,   103,   317,   384,   413,   124,   103,   242,   125,   317,
-     317,   242,   344,   345,   346,   347,   103,   251,   252,   137,
-       2,     3,     4,   157,   157,   156,   156,   336,   103,   139,
-      87,   332,   103,    88,   317,   326,   264,   318,   327,   317,
-     103,   144,   363,   326,   325,   268,   371,   269,   103,   265,
-     266,   267,   250,   204,   227,   244,   320,   110,   111,   356,
-     270,   271,   276,   277,   -30,   185,   103,   258,   103,   263,
-     362,   288,   289,   278,   364,   317,   376,   279,   390,   340,
-     341,   280,   281,   368,   369,   285,   417,   342,   343,   242,
-     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
-     282,   348,   349,   291,   292,   294,   295,   296,   157,   315,
-     156,   301,   103,   103,   299,   337,   338,   339,   185,   185,
-     185,   185,   185,   185,   185,   185,   185,   185,   185,   185,
-     185,   185,   185,   185,   302,   303,   -29,   322,   -24,  -254,
-     365,   385,   227,   391,   375,   317,   377,   -31,   392,   401,
-     400,   406,   404,   402,   405,   198,   378,   385,   218,   350,
-     408,   351,   412,   352,   147,   418,   335,   403,   353,   355,
-     354,   146,   148,   109,   290,   242,   380,   324,   372,   414,
-     367,   407,   415,   381,   393,   136,     0,     0,     0,   387,
-       0,     0,     0,     0,     0,     0,     0,   103,     0,     0,
-       0,     0,     0,     0,     0,   387,     0,   131,   132,     0,
-       0,     0,     0,     0,   227,     0,     0,     0,     0,     0,
-       0,     0,     0,   185,     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,   399,
+     103,   113,   123,   145,   131,   198,   288,   132,   243,   323,
+     251,   383,   254,   122,   324,   153,   203,    87,   326,   140,
+     331,   303,   400,    88,   284,   133,   390,   273,   274,   123,
+     131,   114,   152,   123,   110,   111,   377,   240,   242,   263,
+     122,   157,   390,   115,   378,   420,   117,   127,   205,   157,
+     118,   413,   156,   255,   256,   251,   413,   301,   332,   285,
+     156,   141,   275,   276,   131,   133,   112,   246,   201,   157,
+     126,   111,   241,   198,   257,   245,   149,   150,   258,   201,
+     156,   206,   290,   154,   110,   111,   325,   207,   198,   155,
+     133,   103,   124,   260,   139,   125,   103,   243,   374,   261,
+     335,   243,   333,   144,   387,   388,   103,   417,   320,   137,
+     320,   320,   201,   320,   157,   157,   320,   339,   103,   321,
+     151,   329,   103,    87,   330,   156,   156,   202,   359,    88,
+     103,   347,   348,   349,   350,   328,   320,   185,   103,   367,
+     329,   366,   251,   375,   228,   368,   -30,   323,     2,     3,
+       4,   266,   267,   268,   264,   269,   103,   270,   103,   308,
+     309,   310,   311,   312,   313,   314,   315,   316,   317,   271,
+     272,   252,   253,   277,   278,   372,   373,   279,   318,   291,
+     292,   243,   394,   320,   380,   421,   343,   344,   259,   280,
+     265,   345,   346,   351,   352,   281,   282,   283,   286,   294,
+     297,   157,   295,   103,   103,   185,   298,   299,   306,   304,
+     302,   305,   156,   389,   -29,   360,   -24,  -256,   381,   410,
+     185,   379,   -31,   396,   369,   404,   320,   408,   409,   389,
+     405,   406,   354,   228,   219,   412,   395,   355,   358,   407,
+     353,   416,   422,   338,   147,   356,   146,   357,   148,   198,
+     382,   418,   109,   327,   293,   376,   384,   411,   419,   385,
+     397,     0,   136,     0,   371,     0,     0,     0,   243,     0,
+     340,   341,   342,   185,   185,   185,   185,   185,   185,   185,
+     185,   185,   185,   185,   185,   185,   185,   185,   185,     0,
+     103,     0,   391,     0,     0,     0,     0,     0,     0,   131,
+       0,     0,   132,     0,     0,     0,     0,   228,   391,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     227,   227,     0,     0,     0,     0,   227,   227,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   227,     0,     0,     0,     0,   103,     0,     0,
+       0,     0,     0,   403,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     227,     0,     0,     0,     0,   227,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,   207,   208,   209,
-       0,   210,   211,   212,   213,   214,   215,   216,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,   217,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,     0,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,   160,   161,    86,   162,   163,   164,
-     165,   166,     0,     0,   167,   168,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   169,     0,     0,     0,   218,   219,     0,
-       0,     0,     0,   220,   171,   172,   173,   174,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,   207,
-     208,   209,     0,   210,   211,   212,   213,   214,   215,   216,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,   217,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,     0,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,   160,   161,    86,   162,
-     163,   164,   165,   166,     0,     0,   167,   168,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   169,     0,     0,     0,   218,
-     319,     0,     0,     0,     0,   220,   171,   172,   173,   174,
+       0,     0,     0,     0,   228,   228,     0,     0,     0,     0,
+     228,   228,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   185,     0,     0,     0,     0,   228,     0,     0,     0,
+       0,   103,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   228,     0,     0,     0,     0,   228,
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,   207,   208,   209,     0,   210,   211,   212,   213,   214,
-     215,   216,    12,    13,    14,    15,    16,    17,    18,    19,
+      11,   208,   209,   210,     0,   211,   212,   213,   214,   215,
+     216,   217,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
       40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-     217,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+     218,    50,    51,    52,    53,    54,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,     0,    67,
       68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
       78,    79,    80,    81,    82,    83,    84,    85,   160,   161,
       86,   162,   163,   164,   165,   166,     0,     0,   167,   168,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,   169,     0,     0,
-       0,   218,     0,     0,     0,     0,     0,   220,   171,   172,
+       0,   219,   220,     0,     0,     0,     0,   221,   171,   172,
      173,   174,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,   207,   208,   209,     0,   210,   211,   212,
-     213,   214,   215,   216,    12,    13,    14,    15,    16,    17,
+       9,    10,    11,   208,   209,   210,     0,   211,   212,   213,
+     214,   215,   216,   217,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
       28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
       38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,   217,    50,    51,    52,    53,    54,    55,    56,
+      48,    49,   218,    50,    51,    52,    53,    54,    55,    56,
       57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
        0,    67,    68,    69,    70,    71,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
      160,   161,    86,   162,   163,   164,   165,   166,     0,     0,
      167,   168,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,   169,
-       0,     0,     0,   144,     0,     0,     0,     0,     0,   220,
+       0,     0,     0,   219,   322,     0,     0,     0,     0,   221,
      171,   172,   173,   174,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,   207,   208,   209,     0,   210,
-     211,   212,   213,   214,   215,   216,    12,    13,    14,    15,
+       7,     8,     9,    10,    11,   208,   209,   210,     0,   211,
+     212,   213,   214,   215,   216,   217,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,   217,    50,    51,    52,    53,    54,
+      46,    47,    48,    49,   218,    50,    51,    52,    53,    54,
       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
       65,    66,     0,    67,    68,    69,    70,    71,    72,    73,
       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
       84,    85,   160,   161,    86,   162,   163,   164,   165,   166,
        0,     0,   167,   168,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   169,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   220,   171,   172,   173,   174,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
+       0,   169,     0,     0,     0,   219,     0,     0,     0,     0,
+       0,   221,   171,   172,   173,   174,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,   208,   209,   210,
+       0,   211,   212,   213,   214,   215,   216,   217,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,     0,    50,    51,    52,
+      44,    45,    46,    47,    48,    49,   218,    50,    51,    52,
       53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,     0,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
       82,    83,    84,    85,   160,   161,    86,   162,   163,   164,
      165,   166,     0,     0,   167,   168,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     1,
-       2,     3,     4,   169,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,   220,   171,   172,   173,   174,     0,     0,
-       0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,     0,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,   160,   161,    86,
-     162,   163,   164,   165,   166,     0,     0,   167,   168,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     1,     2,     3,     4,   169,     6,     7,     8,
-       9,    10,    11,     0,     0,     0,     0,   171,   172,   173,
-     174,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,     0,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-       0,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
-       0,   128,    86,     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,     0,   129,
-      33,    34,    35,    36,    37,    38,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    48,    49,     0,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,     0,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,     0,    85,   160,   161,    86,   162,   163,
-     164,   165,   166,     0,     0,   167,   168,     0,     0,     0,
+       0,     0,     0,   169,     0,     0,     0,   144,     0,     0,
+       0,     0,     0,   221,   171,   172,   173,   174,     1,     2,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,   208,
+     209,   210,     0,   211,   212,   213,   214,   215,   216,   217,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,   218,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,     0,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,   160,   161,    86,   162,
+     163,   164,   165,   166,     0,     0,   167,   168,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   169,     0,     0,   170,     8,     9,
-      10,    11,     0,     0,     0,   171,   172,   173,   174,     0,
-       0,     0,     0,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,     0,     0,
-       0,     0,     0,     0,    33,    34,    35,    36,    37,    38,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
-      49,     0,    50,    51,    52,    53,    54,    55,    56,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,     0,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,     0,    85,   160,
-     161,    86,   162,   163,   164,   165,   166,     0,     0,   167,
-     168,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   169,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,   297,   171,
-     172,   173,   174,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
-       0,     0,     0,     0,     0,    33,    34,    35,    36,    37,
-      38,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      48,    49,     0,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-       0,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    81,    82,    83,     0,    85,
-     160,   161,    86,   162,   163,   164,   165,   166,     0,     0,
-     167,   168,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   169,
-       8,     9,    10,    11,     0,     0,     0,     0,     0,     0,
-     171,   172,   173,   174,     0,    12,    13,    14,    15,    16,
+       0,     0,     0,     0,     0,   169,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   221,   171,   172,   173,   174,
+       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,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+       0,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,     0,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,   160,   161,
+      86,   162,   163,   164,   165,   166,     0,     0,   167,   168,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     1,     2,     3,     4,   169,     6,     7,
+       8,     9,    10,    11,     0,     0,     0,   221,   171,   172,
+     173,   174,     0,     0,     0,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-       0,     0,     0,     0,     0,     0,    33,    34,    35,    36,
-      37,    38,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    48,   261,     0,    50,    51,    52,    53,    54,    55,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,     0,    50,    51,    52,    53,    54,    55,
       56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
       66,     0,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,     0,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
       85,   160,   161,    86,   162,   163,   164,   165,   166,     0,
        0,   167,   168,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     1,     2,     3,     4,
@@ -1214,62 +1158,21 @@
       53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,     0,    67,    68,    69,    70,    71,
       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,     0,     0,    86,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     1,     2,     3,
-       4,     0,     6,     7,     8,     9,    10,    11,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   249,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,     0,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,     0,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,     0,     0,    86,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     1,     2,
-       3,     4,     0,     6,     7,     8,     9,    10,    11,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   286,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,     0,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,     0,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,     0,     0,    86,     0,
-       0,     0,     0,     0,     0,     0,   135,     0,     0,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     357,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
-      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,     0,    67,    68,
-      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    84,    85,     0,     0,    86,
-       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,    29,
-      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-       0,    50,    51,    52,    53,    54,    55,    56,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,     0,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    81,    82,    83,    84,    85,     0,     0,
-      86,     1,     2,     3,     4,     0,     6,     7,     8,     9,
+      82,    83,    84,    85,     0,   128,    86,     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,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      19,    20,    21,    22,    23,    24,    25,    26,     0,     0,
+       0,     0,     0,   129,    33,    34,    35,    36,    37,    38,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
       49,     0,    50,    51,    52,    53,    54,    55,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,     0,
       67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    83,    84,    85,     0,
-       0,    86,     8,     9,    10,    11,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    12,    13,    14,
+      77,    78,    79,    80,    81,    82,    83,     0,    85,   160,
+     161,    86,   162,   163,   164,   165,   166,     0,     0,   167,
+     168,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   169,     0,
+       0,   170,     8,     9,    10,    11,     0,     0,     0,   171,
+     172,   173,   174,     0,     0,     0,     0,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,     0,     0,     0,     0,     0,     0,    33,    34,
       35,    36,    37,    38,     0,     0,     0,     0,     0,     0,
@@ -1277,8 +1180,11 @@
       54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
       64,    65,    66,     0,    67,    68,    69,    70,    71,    72,
       73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      83,     0,    85,     0,   333,    86,     8,     9,    10,    11,
-     334,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      83,     0,    85,   160,   161,    86,   162,   163,   164,   165,
+     166,     0,     0,   167,   168,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   169,     0,     0,   287,     8,     9,    10,    11,
+       0,     0,     0,   171,   172,   173,   174,     0,     0,     0,
        0,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,     0,     0,     0,     0,
        0,     0,    33,    34,    35,    36,    37,    38,     0,     0,
@@ -1286,80 +1192,161 @@
       50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
       60,    61,    62,    63,    64,    65,    66,     0,    67,    68,
       69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,     0,    85,     0,     0,    86
+      79,    80,    81,    82,    83,     0,    85,   160,   161,    86,
+     162,   163,   164,   165,   166,     0,     0,   167,   168,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   169,     8,     9,    10,
+      11,     0,     0,     0,     0,     0,   300,   171,   172,   173,
+     174,     0,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
+       0,     0,     0,    33,    34,    35,    36,    37,    38,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    48,    49,
+       0,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    65,    66,     0,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,     0,    85,   160,   161,
+      86,   162,   163,   164,   165,   166,     0,     0,   167,   168,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   169,     8,     9,
+      10,    11,     0,     0,     0,     0,     0,     0,   171,   172,
+     173,   174,     0,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,     0,     0,
+       0,     0,     0,     0,    33,    34,    35,    36,    37,    38,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    48,
+     262,     0,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    63,    64,    65,    66,     0,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,     0,    85,   160,
+     161,    86,   162,   163,   164,   165,   166,     0,     0,   167,
+     168,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     1,     2,     3,     4,   169,     6,
+       7,     8,     9,    10,    11,     0,     0,     0,     0,   171,
+     172,   173,   174,     0,     0,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,     0,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,     0,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,     0,     0,    86,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     1,     2,     3,     4,     0,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   250,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,     0,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,     0,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,     0,     0,    86,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     1,     2,     3,     4,
+       0,     6,     7,     8,     9,    10,    11,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   289,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,     0,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,     0,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,     0,     0,    86,     0,     0,     0,
+       0,     0,     0,     0,   135,     0,     0,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   361,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,     0,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,     0,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,     0,     0,    86,     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,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,     0,    50,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,     0,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,     0,     0,    86,     1,
+       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,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,     0,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    65,    66,     0,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,     0,     0,    86,
+       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,     0,    33,    34,    35,    36,
+      37,    38,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    48,    49,     0,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,     0,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,     0,
+      85,     0,   336,    86,     8,     9,    10,    11,   337,     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,     0,
+      33,    34,    35,    36,    37,    38,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    48,    49,     0,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,     0,    67,    68,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,     0,    85,     0,     0,    86
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    48,    91,   116,    91,   133,    96,    96,   240,   152,
-     215,   232,   244,   158,     0,   127,   138,     0,   360,    60,
-     118,   102,   102,   103,   130,   111,   112,   132,   131,   118,
-     383,   118,   122,   122,   169,   140,   366,   149,   150,   140,
-     183,   130,   134,   130,   113,   114,   132,    94,   140,   138,
-     136,   138,   382,   406,   134,   153,   131,   202,   400,   140,
-     137,   102,   137,   405,   132,   132,   156,   156,   132,   158,
-     140,   158,   139,   133,   130,   139,   123,   124,   213,   148,
-     149,   203,   131,   131,   102,   103,   131,   215,   137,   137,
-     322,    91,   137,   131,   131,   137,    96,   240,   140,   137,
-     137,   244,   272,   273,   274,   275,   106,   167,   168,   109,
-       4,     5,     6,   202,   203,   202,   203,   260,   118,   134,
-     106,   256,   122,   106,   137,   137,   186,   140,   140,   137,
-     130,   134,   140,   137,   246,   142,   140,   144,   138,   145,
-     146,   147,   287,   139,   144,   139,   367,   102,   103,   284,
-     109,   110,   115,   116,   130,   215,   156,   131,   158,   130,
-     295,   105,   106,   152,   299,   137,   138,   151,   373,   268,
-     269,   150,   117,   316,   317,   133,   408,   270,   271,   322,
-     120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
-     119,   276,   277,   140,   140,   130,   130,   140,   287,   139,
-     287,   138,   202,   203,   130,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   130,   135,   130,   139,   131,   134,
-     138,   366,   232,   376,   133,   137,    63,   130,   130,   135,
-     131,    17,   140,   133,   131,   373,   359,   382,   134,   278,
-     139,   279,   140,   280,   122,   140,   257,   392,   281,   283,
-     282,   118,   122,     5,   206,   408,   361,   245,   326,   404,
-     304,   398,   405,   361,   382,   106,    -1,    -1,    -1,   366,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   287,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   382,    -1,   387,   387,    -1,
-      -1,    -1,    -1,    -1,   304,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   373,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   386,
+       0,    48,    91,   116,    96,   133,   201,    96,   152,   233,
+     158,   364,   169,    91,   241,   127,   138,     0,   245,    60,
+     102,   216,   387,     0,   118,   132,   370,   113,   114,   118,
+     122,   130,   139,   122,   102,   103,   132,   149,   150,   183,
+     118,   130,   386,   140,   140,   410,   131,    94,   139,   138,
+     137,   404,   130,   111,   112,   203,   409,   214,   140,   153,
+     138,   102,   148,   149,   156,   132,   134,   156,   132,   158,
+     102,   103,   139,   201,   132,   139,   123,   124,   136,   132,
+     158,   131,   204,   134,   102,   103,   139,   137,   216,   140,
+     132,    91,   137,   131,   134,   140,    96,   241,   325,   137,
+     257,   245,   131,   134,   131,   131,   106,   131,   137,   109,
+     137,   137,   132,   137,   203,   204,   137,   261,   118,   140,
+     130,   137,   122,   106,   140,   203,   204,   140,   285,   106,
+     130,   273,   274,   275,   276,   247,   137,   133,   138,   140,
+     137,   298,   290,   140,   144,   302,   130,   371,     4,     5,
+       6,   145,   146,   147,   130,   142,   156,   144,   158,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   109,
+     110,   167,   168,   115,   116,   319,   320,   152,   139,   105,
+     106,   325,   377,   137,   138,   412,   269,   270,   131,   151,
+     186,   271,   272,   277,   278,   150,   117,   119,   133,   140,
+     130,   290,   140,   203,   204,   201,   130,   140,   135,   138,
+     130,   130,   290,   370,   130,   133,   131,   134,    63,    17,
+     216,   133,   130,   130,   138,   131,   137,   140,   131,   386,
+     135,   133,   280,   233,   134,   139,   380,   281,   284,   396,
+     279,   140,   140,   258,   122,   282,   118,   283,   122,   377,
+     363,   408,     5,   246,   207,   329,   365,   402,   409,   365,
+     386,    -1,   106,    -1,   307,    -1,    -1,    -1,   412,    -1,
+     266,   267,   268,   269,   270,   271,   272,   273,   274,   275,
+     276,   277,   278,   279,   280,   281,   282,   283,   284,    -1,
+     290,    -1,   370,    -1,    -1,    -1,    -1,    -1,    -1,   391,
+      -1,    -1,   391,    -1,    -1,    -1,    -1,   307,   386,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     360,   361,    -1,    -1,    -1,    -1,   366,   367,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   382,    -1,    -1,    -1,    -1,   387,    -1,    -1,
+      -1,    -1,    -1,   390,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     400,    -1,    -1,    -1,    -1,   405,     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,    42,    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,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    -1,    82,    83,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
-     107,   108,    -1,    -1,   111,   112,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   130,    -1,    -1,    -1,   134,   135,    -1,
-      -1,    -1,    -1,   140,   141,   142,   143,   144,     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,    42,    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,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    -1,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,    -1,    -1,   111,   112,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,   134,
-     135,    -1,    -1,    -1,    -1,   140,   141,   142,   143,   144,
+      -1,    -1,    -1,    -1,   364,   365,    -1,    -1,    -1,    -1,
+     370,   371,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   377,    -1,    -1,    -1,    -1,   386,    -1,    -1,    -1,
+      -1,   391,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   404,    -1,    -1,    -1,    -1,   409,
        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,
@@ -1373,7 +1360,7 @@
      103,   104,   105,   106,   107,   108,    -1,    -1,   111,   112,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    -1,    -1,
-      -1,   134,    -1,    -1,    -1,    -1,    -1,   140,   141,   142,
+      -1,   134,   135,    -1,    -1,    -1,    -1,   140,   141,   142,
      143,   144,     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,
@@ -1387,7 +1374,7 @@
      101,   102,   103,   104,   105,   106,   107,   108,    -1,    -1,
      111,   112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,
-      -1,    -1,    -1,   134,    -1,    -1,    -1,    -1,    -1,   140,
+      -1,    -1,    -1,   134,   135,    -1,    -1,    -1,    -1,   140,
      141,   142,   143,   144,     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,
@@ -1401,88 +1388,58 @@
       99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
       -1,    -1,   111,   112,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   130,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   130,    -1,    -1,    -1,   134,    -1,    -1,    -1,    -1,
       -1,   140,   141,   142,   143,   144,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
+       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,    42,    43,    44,    45,    46,
       47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-      57,    58,    59,    60,    61,    62,    -1,    64,    65,    66,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
       67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
       77,    78,    79,    80,    -1,    82,    83,    84,    85,    86,
       87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
       97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
      107,   108,    -1,    -1,   111,   112,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,   130,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,   140,   141,   142,   143,   144,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    -1,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    -1,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
-     104,   105,   106,   107,   108,    -1,    -1,   111,   112,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     3,     4,     5,     6,   130,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,   141,   142,   143,
-     144,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    -1,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      -1,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-      -1,   102,   103,    -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,    -1,   140,
-      46,    47,    48,    49,    50,    51,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    61,    62,    -1,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
-      76,    77,    78,    79,    80,    -1,    82,    83,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    -1,   100,   101,   102,   103,   104,   105,
-     106,   107,   108,    -1,    -1,   111,   112,    -1,    -1,    -1,
+      -1,    -1,    -1,   130,    -1,    -1,    -1,   134,    -1,    -1,
+      -1,    -1,    -1,   140,   141,   142,   143,   144,     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,    42,    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,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    -1,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,    -1,    -1,   111,   112,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   130,    -1,    -1,   133,    10,    11,
-      12,    13,    -1,    -1,    -1,   141,   142,   143,   144,    -1,
-      -1,    -1,    -1,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    -1,    -1,
-      -1,    -1,    -1,    -1,    46,    47,    48,    49,    50,    51,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
-      62,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    -1,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    -1,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,    -1,    -1,   111,
-     112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,   140,   141,
-     142,   143,   144,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
-      -1,    -1,    -1,    -1,    -1,    46,    47,    48,    49,    50,
-      51,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      61,    62,    -1,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      -1,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    -1,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,    -1,    -1,
-     111,   112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,
-      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,
-     141,   142,   143,   144,    -1,    25,    26,    27,    28,    29,
+      -1,    -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   140,   141,   142,   143,   144,
+       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,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+      -1,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    -1,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,    -1,    -1,   111,   112,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     3,     4,     5,     6,   130,     8,     9,
+      10,    11,    12,    13,    -1,    -1,    -1,   140,   141,   142,
+     143,   144,    -1,    -1,    -1,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
-      -1,    -1,    -1,    -1,    -1,    -1,    46,    47,    48,    49,
-      50,    51,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    61,    62,    -1,    64,    65,    66,    67,    68,    69,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    61,    62,    -1,    64,    65,    66,    67,    68,    69,
       70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
       80,    -1,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    -1,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
      100,   101,   102,   103,   104,   105,   106,   107,   108,    -1,
       -1,   111,   112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
@@ -1495,9 +1452,102 @@
       67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
       77,    78,    79,    80,    -1,    82,    83,    84,    85,    86,
       87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,    -1,   102,   103,    -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,    -1,   140,    46,    47,    48,    49,    50,    51,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
+      62,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    -1,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    -1,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,    -1,    -1,   111,
+     112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    -1,
+      -1,   133,    10,    11,    12,    13,    -1,    -1,    -1,   141,
+     142,   143,   144,    -1,    -1,    -1,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    -1,    -1,    -1,    -1,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    61,    62,    -1,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    -1,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    -1,   100,   101,   102,   103,   104,   105,   106,   107,
+     108,    -1,    -1,   111,   112,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   130,    -1,    -1,   133,    10,    11,    12,    13,
+      -1,    -1,    -1,   141,   142,   143,   144,    -1,    -1,    -1,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    46,    47,    48,    49,    50,    51,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    62,    -1,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    -1,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    -1,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,    -1,    -1,   111,   112,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   130,    10,    11,    12,
+      13,    -1,    -1,    -1,    -1,    -1,   140,   141,   142,   143,
+     144,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    46,    47,    48,    49,    50,    51,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    62,
+      -1,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    -1,    82,
+      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
+      93,    94,    95,    96,    97,    98,    -1,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,    -1,    -1,   111,   112,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    10,    11,
+      12,    13,    -1,    -1,    -1,    -1,    -1,    -1,   141,   142,
+     143,   144,    -1,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    -1,    -1,
+      -1,    -1,    -1,    -1,    46,    47,    48,    49,    50,    51,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,
+      62,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    -1,
+      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
+      92,    93,    94,    95,    96,    97,    98,    -1,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,    -1,    -1,   111,
+     112,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,   130,     8,
+       9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,   141,
+     142,   143,   144,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    -1,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    -1,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,    -1,    -1,   103,    -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,   135,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    61,    62,    -1,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    -1,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
+      98,    99,   100,    -1,    -1,   103,    -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,   135,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    61,    62,    -1,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    -1,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
       97,    98,    99,   100,    -1,    -1,   103,    -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,     0,    -1,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   135,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
@@ -1506,10 +1556,9 @@
       66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
       76,    77,    78,    79,    80,    -1,    82,    83,    84,    85,
       86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,    98,    99,   100,    -1,    -1,   103,    -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,   135,
+      96,    97,    98,    99,   100,    -1,    -1,   103,     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,    42,    43,    44,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
@@ -1517,11 +1566,10 @@
       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
       75,    76,    77,    78,    79,    80,    -1,    82,    83,    84,
       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,    -1,    -1,   103,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      95,    96,    97,    98,    99,   100,    -1,    -1,   103,     3,
+       4,     5,     6,    -1,     8,     9,    10,    11,    12,    13,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     135,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
       34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
       44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
       54,    55,    56,    57,    58,    59,    60,    61,    62,    -1,
@@ -1529,45 +1577,25 @@
       74,    75,    76,    77,    78,    79,    80,    -1,    82,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
       94,    95,    96,    97,    98,    99,   100,    -1,    -1,   103,
-       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,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      -1,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    -1,    82,
-      83,    84,    85,    86,    87,    88,    89,    90,    91,    92,
-      93,    94,    95,    96,    97,    98,    99,   100,    -1,    -1,
-     103,     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,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      62,    -1,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    -1,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,    -1,
-      -1,   103,    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,    -1,    46,    47,
-      48,    49,    50,    51,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    61,    62,    -1,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    74,    75,    76,    77,
-      78,    79,    80,    -1,    82,    83,    84,    85,    86,    87,
-      88,    89,    90,    91,    92,    93,    94,    95,    96,    97,
-      98,    -1,   100,    -1,   102,   103,    10,    11,    12,    13,
-     108,    -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,    -1,    46,    47,    48,    49,    50,    51,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    61,    62,    -1,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    -1,    82,    83,
-      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    -1,   100,    -1,    -1,   103
+      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,    -1,    46,    47,    48,    49,
+      50,    51,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    61,    62,    -1,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    -1,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    -1,
+     100,    -1,   102,   103,    10,    11,    12,    13,   108,    -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,    -1,
+      46,    47,    48,    49,    50,    51,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    61,    62,    -1,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    -1,    82,    83,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    98,    -1,   100,    -1,    -1,   103
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1594,28 +1622,29 @@
      133,   141,   142,   143,   144,   156,   157,   158,   160,   161,
      162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
      172,   173,   174,   175,   176,   177,   178,   179,   180,   184,
-     207,   140,   213,   211,   139,   131,   137,    14,    15,    16,
-      18,    19,    20,    21,    22,    23,    24,    63,   134,   135,
-     140,   167,   180,   181,   183,   186,   187,   207,   218,   219,
-     220,   221,   229,   230,   231,   233,   235,   237,   244,   208,
-     139,   208,   181,   217,   139,   202,   155,   215,   216,   135,
-     214,   167,   167,   183,   111,   112,   132,   136,   131,   131,
-     137,    62,   181,   130,   167,   145,   146,   147,   142,   144,
-     109,   110,   113,   114,   148,   149,   115,   116,   152,   151,
-     150,   117,   119,   118,   153,   133,   135,   213,   105,   106,
-     206,   140,   140,   239,   130,   130,   140,   140,   183,   130,
-     184,   138,   130,   135,   222,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   139,   182,   137,   140,   135,
-     219,   217,   139,   217,   215,   208,   137,   140,   102,   140,
-     131,   159,   183,   102,   108,   162,   181,   167,   167,   167,
-     169,   169,   170,   170,   171,   171,   171,   171,   172,   172,
-     173,   174,   175,   176,   177,   178,   183,   135,   225,   226,
-     227,   240,   183,   140,   183,   138,   238,   229,   181,   181,
-     217,   140,   216,   132,   140,   133,   138,    63,   228,   220,
-     218,   230,   241,   131,   131,   183,   196,   198,   236,   223,
-     184,   181,   130,   236,   242,   243,   225,   232,   234,   155,
-     131,   135,   133,   183,   140,   131,    17,   221,   139,   220,
-     224,   228,   140,   131,   183,   224,   225,   217,   140
+     207,   132,   140,   213,   211,   139,   131,   137,    14,    15,
+      16,    18,    19,    20,    21,    22,    23,    24,    63,   134,
+     135,   140,   167,   180,   181,   183,   186,   187,   207,   218,
+     219,   220,   221,   229,   230,   231,   233,   235,   237,   244,
+     208,   139,   208,   181,   217,   139,   202,   155,   215,   216,
+     135,   214,   167,   167,   183,   111,   112,   132,   136,   131,
+     131,   137,    62,   181,   130,   167,   145,   146,   147,   142,
+     144,   109,   110,   113,   114,   148,   149,   115,   116,   152,
+     151,   150,   117,   119,   118,   153,   133,   133,   184,   135,
+     213,   105,   106,   206,   140,   140,   239,   130,   130,   140,
+     140,   183,   130,   184,   138,   130,   135,   222,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   129,   139,   182,
+     137,   140,   135,   219,   217,   139,   217,   215,   208,   137,
+     140,   102,   140,   131,   159,   183,   102,   108,   162,   181,
+     167,   167,   167,   169,   169,   170,   170,   171,   171,   171,
+     171,   172,   172,   173,   174,   175,   176,   177,   178,   183,
+     133,   135,   225,   226,   227,   240,   183,   140,   183,   138,
+     238,   229,   181,   181,   217,   140,   216,   132,   140,   133,
+     138,    63,   228,   220,   218,   230,   241,   131,   131,   183,
+     196,   198,   236,   223,   184,   181,   130,   236,   242,   243,
+     225,   232,   234,   155,   131,   135,   133,   183,   140,   131,
+      17,   221,   139,   220,   224,   228,   140,   131,   183,   224,
+     225,   217,   140
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1637,20 +1666,20 @@
      200,   200,   201,   201,   201,   201,   201,   201,   201,   201,
      201,   201,   201,   201,   201,   201,   201,   202,   203,   203,
      203,   204,   205,   205,   206,   206,   206,   206,   207,   207,
-     208,   208,   209,   209,   209,   209,   209,   209,   209,   209,
+     208,   208,   208,   208,   209,   209,   209,   209,   209,   209,
      209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
      209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
      209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
      209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
      209,   209,   209,   209,   209,   209,   209,   209,   209,   209,
-     209,   209,   209,   209,   209,   211,   210,   212,   210,   213,
-     213,   214,   214,   215,   215,   216,   216,   217,   218,   219,
-     219,   220,   220,   220,   220,   220,   220,   220,   221,   222,
-     223,   221,   224,   224,   226,   225,   227,   225,   228,   228,
-     229,   229,   230,   230,   231,   232,   232,   234,   233,   235,
-     235,   236,   236,   238,   237,   239,   237,   240,   237,   241,
-     241,   242,   242,   243,   243,   244,   244,   244,   244,   244,
-     245,   245,   246,   246,   248,   247
+     209,   209,   209,   209,   209,   209,   209,   211,   210,   212,
+     210,   213,   213,   214,   214,   215,   215,   216,   216,   217,
+     218,   219,   219,   220,   220,   220,   220,   220,   220,   220,
+     221,   222,   223,   221,   224,   224,   226,   225,   227,   225,
+     228,   228,   229,   229,   230,   230,   231,   232,   232,   234,
+     233,   235,   235,   236,   236,   238,   237,   239,   237,   240,
+     237,   241,   241,   242,   242,   243,   243,   244,   244,   244,
+     244,   244,   245,   245,   246,   246,   248,   247
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1672,20 +1701,20 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     4,     1,     3,     1,     3,     3,     1,     1,     2,
-       2,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     3,     3,     4,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     0,     6,     0,     5,     1,
-       2,     3,     4,     1,     3,     1,     2,     1,     1,     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,     0,     6,     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
+       1,     1,     1,     1,     1,     1,     1,     0,     6,     0,
+       5,     1,     2,     3,     4,     1,     3,     1,     2,     1,
+       1,     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,     0,
+       6,     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
 };
 
 
@@ -3292,7 +3321,7 @@
   case 104:
 
     {
-        (yyval.interm.param) = context->parseParameterArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), (yyvsp[0].interm.arraySize), (yylsp[0]), &(yyvsp[-2].interm.type));
+        (yyval.interm.param) = context->parseParameterArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), *((yyvsp[0].interm.arraySizes)), (yylsp[0]), &(yyvsp[-2].interm.type));
     }
 
     break;
@@ -3363,7 +3392,7 @@
 
     {
         (yyval.interm) = (yyvsp[-3].interm);
-        context->parseArrayDeclarator((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), (yyvsp[0].interm.arraySize), (yyval.interm).intermDeclaration);
+        context->parseArrayDeclarator((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), *((yyvsp[0].interm.arraySizes)), (yyval.interm).intermDeclaration);
     }
 
     break;
@@ -3373,7 +3402,7 @@
     {
         ES3_OR_NEWER("=", (yylsp[-1]), "first-class arrays (array initializer)");
         (yyval.interm) = (yyvsp[-5].interm);
-        context->parseArrayInitDeclarator((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), (yyvsp[-2].interm.arraySize), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration);
+        context->parseArrayInitDeclarator((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode), (yyval.interm).intermDeclaration);
     }
 
     break;
@@ -3409,7 +3438,7 @@
 
     {
         (yyval.interm).type = (yyvsp[-2].interm.type);
-        (yyval.interm).intermDeclaration = context->parseSingleArrayDeclaration((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), (yyvsp[0].interm.arraySize));
+        (yyval.interm).intermDeclaration = context->parseSingleArrayDeclaration((yyval.interm).type, (yylsp[-1]), *(yyvsp[-1].lex).string, (yylsp[0]), *((yyvsp[0].interm.arraySizes)));
     }
 
     break;
@@ -3419,7 +3448,7 @@
     {
         ES3_OR_NEWER("[]", (yylsp[-2]), "first-class arrays (array initializer)");
         (yyval.interm).type = (yyvsp[-4].interm.type);
-        (yyval.interm).intermDeclaration = context->parseSingleArrayInitDeclaration((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), (yyvsp[-2].interm.arraySize), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode));
+        (yyval.interm).intermDeclaration = context->parseSingleArrayInitDeclaration((yyval.interm).type, (yylsp[-3]), *(yyvsp[-3].lex).string, (yylsp[-2]), *((yyvsp[-2].interm.arraySizes)), (yylsp[-1]), (yyvsp[0].interm.intermTypedNode));
     }
 
     break;
@@ -3763,7 +3792,7 @@
 
     {
         (yyval.interm.type).initialize((yyvsp[-1].interm.typeSpecifierNonArray), (context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary));
-        (yyval.interm.type).setArraySize((yyvsp[0].interm.arraySize));
+        (yyval.interm.type).setArraySizes((yyvsp[0].interm.arraySizes));
     }
 
     break;
@@ -3772,7 +3801,8 @@
 
     {
         ES3_OR_NEWER("[]", (yylsp[-1]), "implicitly sized array");
-        (yyval.interm.arraySize) = 0u;
+        (yyval.interm.arraySizes) = new TVector<unsigned int>();
+        (yyval.interm.arraySizes)->push_back(0u);
     }
 
     break;
@@ -3780,10 +3810,11 @@
   case 161:
 
     {
+        (yyval.interm.arraySizes) = new TVector<unsigned int>();
         unsigned int size = context->checkIsValidArraySize((yylsp[-2]), (yyvsp[-1].interm.intermTypedNode));
         // Make the type an array even if size check failed.
         // This ensures useless error messages regarding a variable's non-arrayness won't follow.
-        (yyval.interm.arraySize) = size;
+        (yyval.interm.arraySizes)->push_back(size);
     }
 
     break;
@@ -3791,7 +3822,9 @@
   case 162:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtVoid, (yylsp[0]));
+        ES3_1_ONLY("[]", (yylsp[-1]), "arrays of arrays");
+        (yyval.interm.arraySizes) = (yyvsp[-2].interm.arraySizes);
+        (yyval.interm.arraySizes)->insert((yyval.interm.arraySizes)->begin(), 0u);
     }
 
     break;
@@ -3799,7 +3832,12 @@
   case 163:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        ES3_1_ONLY("[]", (yylsp[-2]), "arrays of arrays");
+        (yyval.interm.arraySizes) = (yyvsp[-3].interm.arraySizes);
+        unsigned int size = context->checkIsValidArraySize((yylsp[-2]), (yyvsp[-1].interm.intermTypedNode));
+        // Make the type an array even if size check failed.
+        // This ensures useless error messages regarding a variable's non-arrayness won't follow.
+        (yyval.interm.arraySizes)->insert((yyval.interm.arraySizes)->begin(), size);
     }
 
     break;
@@ -3807,7 +3845,7 @@
   case 164:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtVoid, (yylsp[0]));
     }
 
     break;
@@ -3815,7 +3853,7 @@
   case 165:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
     }
 
     break;
@@ -3823,7 +3861,7 @@
   case 166:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
     }
 
     break;
@@ -3831,8 +3869,7 @@
   case 167:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
     }
 
     break;
@@ -3840,8 +3877,7 @@
   case 168:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
     }
 
     break;
@@ -3850,7 +3886,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3858,8 +3894,8 @@
   case 170:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
     }
 
     break;
@@ -3867,8 +3903,8 @@
   case 171:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
     }
 
     break;
@@ -3877,7 +3913,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3885,8 +3921,8 @@
   case 173:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
     }
 
     break;
@@ -3894,8 +3930,8 @@
   case 174:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
     }
 
     break;
@@ -3904,7 +3940,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3912,8 +3948,8 @@
   case 176:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
     }
 
     break;
@@ -3921,8 +3957,8 @@
   case 177:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
     }
 
     break;
@@ -3931,7 +3967,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3939,8 +3975,8 @@
   case 179:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
     }
 
     break;
@@ -3948,8 +3984,8 @@
   case 180:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
     }
 
     break;
@@ -3958,7 +3994,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 2);
     }
 
     break;
@@ -3967,7 +4003,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 3);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 3);
     }
 
     break;
@@ -3976,7 +4012,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 2);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 4);
     }
 
     break;
@@ -3985,7 +4021,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 3);
     }
 
     break;
@@ -3994,7 +4030,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 2);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 2);
     }
 
     break;
@@ -4003,7 +4039,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 4);
     }
 
     break;
@@ -4012,7 +4048,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 3);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 2);
     }
 
     break;
@@ -4020,6 +4056,24 @@
   case 188:
 
     {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 4);
+    }
+
+    break;
+
+  case 189:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 3);
+    }
+
+    break;
+
+  case 190:
+
+    {
         if (!context->checkCanUseExtension((yylsp[0]), TExtension::EXT_YUV_target))
         {
             context->error((yylsp[0]), "unsupported type", "yuvCscStandardEXT");
@@ -4029,7 +4083,7 @@
 
     break;
 
-  case 189:
+  case 191:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2D, (yylsp[0]));
@@ -4037,7 +4091,7 @@
 
     break;
 
-  case 190:
+  case 192:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler3D, (yylsp[0]));
@@ -4045,7 +4099,7 @@
 
     break;
 
-  case 191:
+  case 193:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCube, (yylsp[0]));
@@ -4053,7 +4107,7 @@
 
     break;
 
-  case 192:
+  case 194:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArray, (yylsp[0]));
@@ -4061,7 +4115,7 @@
 
     break;
 
-  case 193:
+  case 195:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DMS, (yylsp[0]));
@@ -4069,7 +4123,7 @@
 
     break;
 
-  case 194:
+  case 196:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2D, (yylsp[0]));
@@ -4077,7 +4131,7 @@
 
     break;
 
-  case 195:
+  case 197:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler3D, (yylsp[0]));
@@ -4085,7 +4139,7 @@
 
     break;
 
-  case 196:
+  case 198:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtISamplerCube, (yylsp[0]));
@@ -4093,7 +4147,7 @@
 
     break;
 
-  case 197:
+  case 199:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DArray, (yylsp[0]));
@@ -4101,7 +4155,7 @@
 
     break;
 
-  case 198:
+  case 200:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DMS, (yylsp[0]));
@@ -4109,7 +4163,7 @@
 
     break;
 
-  case 199:
+  case 201:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2D, (yylsp[0]));
@@ -4117,7 +4171,7 @@
 
     break;
 
-  case 200:
+  case 202:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler3D, (yylsp[0]));
@@ -4125,7 +4179,7 @@
 
     break;
 
-  case 201:
+  case 203:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUSamplerCube, (yylsp[0]));
@@ -4133,7 +4187,7 @@
 
     break;
 
-  case 202:
+  case 204:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DArray, (yylsp[0]));
@@ -4141,7 +4195,7 @@
 
     break;
 
-  case 203:
+  case 205:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DMS, (yylsp[0]));
@@ -4149,7 +4203,7 @@
 
     break;
 
-  case 204:
+  case 206:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DShadow, (yylsp[0]));
@@ -4157,7 +4211,7 @@
 
     break;
 
-  case 205:
+  case 207:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCubeShadow, (yylsp[0]));
@@ -4165,7 +4219,7 @@
 
     break;
 
-  case 206:
+  case 208:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArrayShadow, (yylsp[0]));
@@ -4173,7 +4227,7 @@
 
     break;
 
-  case 207:
+  case 209:
 
     {
         constexpr std::array<TExtension, 3u> extensions{ { TExtension::NV_EGL_stream_consumer_external,
@@ -4188,7 +4242,7 @@
 
     break;
 
-  case 208:
+  case 210:
 
     {
         if (!context->checkCanUseExtension((yylsp[0]), TExtension::EXT_YUV_target))
@@ -4200,7 +4254,7 @@
 
     break;
 
-  case 209:
+  case 211:
 
     {
         if (!context->checkCanUseExtension((yylsp[0]), TExtension::ARB_texture_rectangle))
@@ -4212,7 +4266,7 @@
 
     break;
 
-  case 210:
+  case 212:
 
     {
         (yyval.interm.typeSpecifierNonArray) = (yyvsp[0].interm.typeSpecifierNonArray);
@@ -4220,7 +4274,7 @@
 
     break;
 
-  case 211:
+  case 213:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2D, (yylsp[0]));
@@ -4228,7 +4282,7 @@
 
     break;
 
-  case 212:
+  case 214:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2D, (yylsp[0]));
@@ -4236,7 +4290,7 @@
 
     break;
 
-  case 213:
+  case 215:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2D, (yylsp[0]));
@@ -4244,7 +4298,7 @@
 
     break;
 
-  case 214:
+  case 216:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtImage3D, (yylsp[0]));
@@ -4252,7 +4306,7 @@
 
     break;
 
-  case 215:
+  case 217:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage3D, (yylsp[0]));
@@ -4260,7 +4314,7 @@
 
     break;
 
-  case 216:
+  case 218:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage3D, (yylsp[0]));
@@ -4268,7 +4322,7 @@
 
     break;
 
-  case 217:
+  case 219:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2DArray, (yylsp[0]));
@@ -4276,7 +4330,7 @@
 
     break;
 
-  case 218:
+  case 220:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2DArray, (yylsp[0]));
@@ -4284,7 +4338,7 @@
 
     break;
 
-  case 219:
+  case 221:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2DArray, (yylsp[0]));
@@ -4292,7 +4346,7 @@
 
     break;
 
-  case 220:
+  case 222:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtImageCube, (yylsp[0]));
@@ -4300,7 +4354,7 @@
 
     break;
 
-  case 221:
+  case 223:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtIImageCube, (yylsp[0]));
@@ -4308,7 +4362,7 @@
 
     break;
 
-  case 222:
+  case 224:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUImageCube, (yylsp[0]));
@@ -4316,7 +4370,7 @@
 
     break;
 
-  case 223:
+  case 225:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtAtomicCounter, (yylsp[0]));
@@ -4324,7 +4378,7 @@
 
     break;
 
-  case 224:
+  case 226:
 
     {
         // This is for user defined type names. The lexical phase looked up the type.
@@ -4334,13 +4388,13 @@
 
     break;
 
-  case 225:
+  case 227:
 
     { context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string); }
 
     break;
 
-  case 226:
+  case 228:
 
     {
         (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
@@ -4348,13 +4402,13 @@
 
     break;
 
-  case 227:
+  case 229:
 
     { context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string); }
 
     break;
 
-  case 228:
+  case 230:
 
     {
         (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-4]), (yyloc), NewPoolTString(""), (yyvsp[-1].interm.fieldList));
@@ -4362,7 +4416,7 @@
 
     break;
 
-  case 229:
+  case 231:
 
     {
         (yyval.interm.fieldList) = context->addStructFieldList((yyvsp[0].interm.fieldList), (yylsp[0]));
@@ -4370,7 +4424,7 @@
 
     break;
 
-  case 230:
+  case 232:
 
     {
         (yyval.interm.fieldList) = context->combineStructFieldLists((yyvsp[-1].interm.fieldList), (yyvsp[0].interm.fieldList), (yylsp[0]));
@@ -4378,7 +4432,7 @@
 
     break;
 
-  case 231:
+  case 233:
 
     {
         (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
@@ -4386,7 +4440,7 @@
 
     break;
 
-  case 232:
+  case 234:
 
     {
         // ES3 Only, but errors should be handled elsewhere
@@ -4395,7 +4449,7 @@
 
     break;
 
-  case 233:
+  case 235:
 
     {
         (yyval.interm.fieldList) = NewPoolTFieldList();
@@ -4404,7 +4458,7 @@
 
     break;
 
-  case 234:
+  case 236:
 
     {
         (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field));
@@ -4412,7 +4466,7 @@
 
     break;
 
-  case 235:
+  case 237:
 
     {
         (yyval.interm.field) = context->parseStructDeclarator((yyvsp[0].lex).string, (yylsp[0]));
@@ -4420,29 +4474,17 @@
 
     break;
 
-  case 236:
-
-    {
-        (yyval.interm.field) = context->parseStructArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), (yyvsp[0].interm.arraySize), (yylsp[0]));
-    }
-
-    break;
-
-  case 237:
-
-    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-
-    break;
-
   case 238:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    {
+        (yyval.interm.field) = context->parseStructArrayDeclarator((yyvsp[-1].lex).string, (yylsp[-1]), *((yyvsp[0].interm.arraySizes)), (yylsp[0]));
+    }
 
     break;
 
   case 239:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
+    { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
@@ -4454,7 +4496,7 @@
 
   case 241:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
@@ -4472,30 +4514,42 @@
 
   case 244:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 245:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
   case 246:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
 
     break;
 
   case 247:
 
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
 
     break;
 
   case 248:
 
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 249:
+
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 250:
+
     {
         (yyval.interm.intermBlock) = new TIntermBlock();
         (yyval.interm.intermBlock)->setLine((yyloc));
@@ -4503,19 +4557,19 @@
 
     break;
 
-  case 249:
+  case 251:
 
     { context->symbolTable.push(); }
 
     break;
 
-  case 250:
+  case 252:
 
     { context->symbolTable.pop(); }
 
     break;
 
-  case 251:
+  case 253:
 
     {
         (yyvsp[-2].interm.intermBlock)->setLine((yyloc));
@@ -4524,27 +4578,15 @@
 
     break;
 
-  case 252:
+  case 254:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
-  case 253:
-
-    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-
-    break;
-
-  case 254:
-
-    { context->symbolTable.push(); }
-
-    break;
-
   case 255:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
+    { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
@@ -4556,12 +4598,24 @@
 
   case 257:
 
-    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
   case 258:
 
+    { context->symbolTable.push(); }
+
+    break;
+
+  case 259:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
+
+    break;
+
+  case 260:
+
     {
         (yyval.interm.intermBlock) = new TIntermBlock();
         (yyval.interm.intermBlock)->setLine((yyloc));
@@ -4569,7 +4623,7 @@
 
     break;
 
-  case 259:
+  case 261:
 
     {
         (yyvsp[-1].interm.intermBlock)->setLine((yyloc));
@@ -4578,7 +4632,7 @@
 
     break;
 
-  case 260:
+  case 262:
 
     {
         (yyval.interm.intermBlock) = new TIntermBlock();
@@ -4587,7 +4641,7 @@
 
     break;
 
-  case 261:
+  case 263:
 
     {
         (yyval.interm.intermBlock) = (yyvsp[-1].interm.intermBlock);
@@ -4596,19 +4650,19 @@
 
     break;
 
-  case 262:
+  case 264:
 
     { (yyval.interm.intermNode) = context->addEmptyStatement((yyloc)); }
 
     break;
 
-  case 263:
+  case 265:
 
     { (yyval.interm.intermNode) = (yyvsp[-1].interm.intermTypedNode); }
 
     break;
 
-  case 264:
+  case 266:
 
     {
         (yyval.interm.intermNode) = context->addIfElse((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yylsp[-4]));
@@ -4616,7 +4670,7 @@
 
     break;
 
-  case 265:
+  case 267:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4625,7 +4679,7 @@
 
     break;
 
-  case 266:
+  case 268:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4634,13 +4688,13 @@
 
     break;
 
-  case 267:
+  case 269:
 
     { context->incrSwitchNestingLevel(); }
 
     break;
 
-  case 268:
+  case 270:
 
     {
         (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermBlock), (yylsp[-5]));
@@ -4649,7 +4703,7 @@
 
     break;
 
-  case 269:
+  case 271:
 
     {
         (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4657,7 +4711,7 @@
 
     break;
 
-  case 270:
+  case 272:
 
     {
         (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
@@ -4665,7 +4719,7 @@
 
     break;
 
-  case 271:
+  case 273:
 
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4674,7 +4728,7 @@
 
     break;
 
-  case 272:
+  case 274:
 
     {
         (yyval.interm.intermNode) = context->addConditionInitializer((yyvsp[-3].interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode), (yylsp[-2]));
@@ -4682,13 +4736,13 @@
 
     break;
 
-  case 273:
+  case 275:
 
     { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
-  case 274:
+  case 276:
 
     {
         context->symbolTable.pop();
@@ -4698,13 +4752,13 @@
 
     break;
 
-  case 275:
+  case 277:
 
     { context->incrLoopNestingLevel(); }
 
     break;
 
-  case 276:
+  case 278:
 
     {
         (yyval.interm.intermNode) = context->addLoop(ELoopDoWhile, 0, (yyvsp[-2].interm.intermTypedNode), 0, (yyvsp[-5].interm.intermNode), (yylsp[-4]));
@@ -4713,34 +4767,18 @@
 
     break;
 
-  case 277:
-
-    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
-
-    break;
-
-  case 278:
-
-    {
-        context->symbolTable.pop();
-        (yyval.interm.intermNode) = context->addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), (yyvsp[-2].interm.nodePair).node1, reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
-        context->decrLoopNestingLevel();
-    }
-
-    break;
-
   case 279:
 
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
+    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
   case 280:
 
     {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+        context->symbolTable.pop();
+        (yyval.interm.intermNode) = context->addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), (yyvsp[-2].interm.nodePair).node1, reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
+        context->decrLoopNestingLevel();
     }
 
     break;
@@ -4756,7 +4794,7 @@
   case 282:
 
     {
-        (yyval.interm.intermNode) = nullptr;
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4764,13 +4802,29 @@
   case 283:
 
     {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 284:
+
+    {
+        (yyval.interm.intermNode) = nullptr;
+    }
+
+    break;
+
+  case 285:
+
+    {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
 
     break;
 
-  case 284:
+  case 286:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4779,7 +4833,7 @@
 
     break;
 
-  case 285:
+  case 287:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
@@ -4787,7 +4841,7 @@
 
     break;
 
-  case 286:
+  case 288:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
@@ -4795,7 +4849,7 @@
 
     break;
 
-  case 287:
+  case 289:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
@@ -4803,7 +4857,7 @@
 
     break;
 
-  case 288:
+  case 290:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4811,7 +4865,7 @@
 
     break;
 
-  case 289:
+  case 291:
 
     {
         (yyval.interm.intermNode) = context->addBranch(EOpKill, (yylsp[-1]));
@@ -4819,7 +4873,7 @@
 
     break;
 
-  case 290:
+  case 292:
 
     {
         (yyval.interm.intermBlock) = new TIntermBlock();
@@ -4830,7 +4884,7 @@
 
     break;
 
-  case 291:
+  case 293:
 
     {
         (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode));
@@ -4838,31 +4892,31 @@
 
     break;
 
-  case 292:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
-  case 293:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
   case 294:
 
     {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 295:
+
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 296:
+
+    {
         context->parseFunctionDefinitionHeader((yylsp[0]), &((yyvsp[0].interm).function), &((yyvsp[0].interm).intermFunctionPrototype));
     }
 
     break;
 
-  case 295:
+  case 297:
 
     {
         (yyval.interm.intermNode) = context->addFunctionDefinition((yyvsp[-2].interm).intermFunctionPrototype, (yyvsp[0].interm.intermBlock), (yylsp[-2]));
diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h
index 5624803..1f53085 100644
--- a/src/compiler/translator/glslang_tab.h
+++ b/src/compiler/translator/glslang_tab.h
@@ -238,7 +238,7 @@
             TIntermCase *intermCase;
         };
         union {
-            unsigned int arraySize;
+            TVector<unsigned int> *arraySizes;
             TTypeSpecifierNonArray typeSpecifierNonArray;
             TPublicType type;
             TPrecision precision;