Add support for images in the compiler

The patch adds support for GLSL ES 3.1 image types.

Internal format layout qualifiers for images are added.

Support for the readonly and writeonly qualifiers are added. The other
memory qualifiers are omitted as to make the patch simpler.

Tests are added which check for correct and incorrect usage of images,
internal format layout and memory qualifiers.

BUG=angleproject:1442

TEST=angle_unittests
TEST=angle_end2end_tests

Change-Id: Ie4d3acb2a195de11b405ad54110a04c4c1de0b7e
Reviewed-on: https://chromium-review.googlesource.com/378855
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/BaseTypes.h b/src/compiler/translator/BaseTypes.h
index a3d9a60..9afb7d1 100644
--- a/src/compiler/translator/BaseTypes.h
+++ b/src/compiler/translator/BaseTypes.h
@@ -76,19 +76,98 @@
     EbtSampler2DShadow,
     EbtSamplerCubeShadow,
     EbtSampler2DArrayShadow,
-    EbtGuardSamplerEnd,    // non type: see implementation of IsSampler()
-    EbtGSampler2D,         // non type: represents sampler2D, isampler2D, and usampler2D
-    EbtGSampler3D,         // non type: represents sampler3D, isampler3D, and usampler3D
-    EbtGSamplerCube,       // non type: represents samplerCube, isamplerCube, and usamplerCube
-    EbtGSampler2DArray,    // non type: represents sampler2DArray, isampler2DArray, and usampler2DArray
+    EbtGuardSamplerEnd,  // non type: see implementation of IsSampler()
+    EbtGSampler2D,       // non type: represents sampler2D, isampler2D, and usampler2D
+    EbtGSampler3D,       // non type: represents sampler3D, isampler3D, and usampler3D
+    EbtGSamplerCube,     // non type: represents samplerCube, isamplerCube, and usamplerCube
+    EbtGSampler2DArray,  // non type: represents sampler2DArray, isampler2DArray, and
+                         // usampler2DArray
+
+    // images
+    EbtGuardImageBegin,
+    EbtImage2D,
+    EbtIImage2D,
+    EbtUImage2D,
+    EbtImage3D,
+    EbtIImage3D,
+    EbtUImage3D,
+    EbtImage2DArray,
+    EbtIImage2DArray,
+    EbtUImage2DArray,
+    EbtImageCube,
+    EbtIImageCube,
+    EbtUImageCube,
+    EbtGuardImageEnd,
+
+    EbtGuardGImageBegin,
+    EbtGImage2D,       // non type: represents image2D, uimage2D, iimage2D
+    EbtGImage3D,       // non type: represents image3D, uimage3D, iimage3D
+    EbtGImage2DArray,  // non type: represents image2DArray, uimage2DArray, iimage2DArray
+    EbtGImageCube,     // non type: represents imageCube, uimageCube, iimageCube
+    EbtGuardGImageEnd,
+
     EbtStruct,
     EbtInterfaceBlock,
-    EbtAddress,            // should be deprecated??
+    EbtAddress,  // should be deprecated??
 
     // end of list
     EbtLast
 };
 
+inline TBasicType convertGImageToFloatImage(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtGImage2D:
+            return EbtImage2D;
+        case EbtGImage3D:
+            return EbtImage3D;
+        case EbtGImage2DArray:
+            return EbtImage2DArray;
+        case EbtGImageCube:
+            return EbtImageCube;
+        default:
+            UNREACHABLE();
+    }
+    return EbtLast;
+}
+
+inline TBasicType convertGImageToIntImage(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtGImage2D:
+            return EbtIImage2D;
+        case EbtGImage3D:
+            return EbtIImage3D;
+        case EbtGImage2DArray:
+            return EbtIImage2DArray;
+        case EbtGImageCube:
+            return EbtIImageCube;
+        default:
+            UNREACHABLE();
+    }
+    return EbtLast;
+}
+
+inline TBasicType convertGImageToUnsignedImage(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtGImage2D:
+            return EbtUImage2D;
+        case EbtGImage3D:
+            return EbtUImage3D;
+        case EbtGImage2DArray:
+            return EbtUImage2DArray;
+        case EbtGImageCube:
+            return EbtUImageCube;
+        default:
+            UNREACHABLE();
+    }
+    return EbtLast;
+}
+
 const char* getBasicString(TBasicType t);
 
 inline bool IsSampler(TBasicType type)
@@ -96,6 +175,22 @@
     return type > EbtGuardSamplerBegin && type < EbtGuardSamplerEnd;
 }
 
+inline bool IsImage(TBasicType type)
+{
+    return type > EbtGuardImageBegin && type < EbtGuardImageEnd;
+}
+
+inline bool IsGImage(TBasicType type)
+{
+    return type > EbtGuardGImageBegin && type < EbtGuardGImageEnd;
+}
+
+inline bool IsOpaqueType(TBasicType type)
+{
+    // TODO (mradev): add atomic types as opaque.
+    return IsSampler(type) || IsImage(type);
+}
+
 inline bool IsIntegerSampler(TBasicType type)
 {
     switch (type)
@@ -126,6 +221,56 @@
     return false;
 }
 
+inline bool IsFloatImage(TBasicType type)
+{
+    switch (type)
+    {
+        case EbtImage2D:
+        case EbtImage3D:
+        case EbtImage2DArray:
+        case EbtImageCube:
+            return true;
+        default:
+            break;
+    }
+
+    return false;
+}
+
+inline bool IsIntegerImage(TBasicType type)
+{
+
+    switch (type)
+    {
+        case EbtIImage2D:
+        case EbtIImage3D:
+        case EbtIImage2DArray:
+        case EbtIImageCube:
+            return true;
+        default:
+            break;
+    }
+
+    return false;
+}
+
+inline bool IsUnsignedImage(TBasicType type)
+{
+
+    switch (type)
+    {
+        case EbtUImage2D:
+        case EbtUImage3D:
+        case EbtUImage2DArray:
+        case EbtUImageCube:
+            return true;
+        default:
+            break;
+    }
+
+    return false;
+}
+
 inline bool IsSampler2D(TBasicType type)
 {
     switch (type)
@@ -283,7 +428,7 @@
 
 inline bool SupportsPrecision(TBasicType type)
 {
-    return type == EbtFloat || type == EbtInt || type == EbtUInt || IsSampler(type);
+    return type == EbtFloat || type == EbtInt || type == EbtUInt || IsOpaqueType(type);
 }
 
 //
@@ -360,6 +505,10 @@
     EvqGlobalInvocationID,
     EvqLocalInvocationIndex,
 
+    // GLSL ES 3.1 memory qualifiers
+    EvqReadOnly,
+    EvqWriteOnly,
+
     // end of list
     EvqLast
 };
@@ -369,6 +518,24 @@
     return (qualifier == EvqTemporary || qualifier == EvqGlobal);
 }
 
+enum TLayoutImageInternalFormat
+{
+    EiifUnspecified,
+    EiifRGBA32F,
+    EiifRGBA16F,
+    EiifR32F,
+    EiifRGBA32UI,
+    EiifRGBA16UI,
+    EiifRGBA8UI,
+    EiifR32UI,
+    EiifRGBA32I,
+    EiifRGBA16I,
+    EiifRGBA8I,
+    EiifR32I,
+    EiifRGBA8,
+    EiifRGBA8_SNORM
+};
+
 enum TLayoutMatrixPacking
 {
     EmpUnspecified,
@@ -394,6 +561,9 @@
     // Compute shader layout qualifiers.
     sh::WorkGroupSize localSize;
 
+    // Image format layout qualifier
+    TLayoutImageInternalFormat imageInternalFormat;
+
     static TLayoutQualifier create()
     {
         TLayoutQualifier layoutQualifier;
@@ -405,20 +575,23 @@
 
         layoutQualifier.localSize.fill(-1);
 
+        layoutQualifier.imageInternalFormat = EiifUnspecified;
         return layoutQualifier;
     }
 
     bool isEmpty() const
     {
         return location == -1 && matrixPacking == EmpUnspecified &&
-               blockStorage == EbsUnspecified && !localSize.isAnyValueSet();
+               blockStorage == EbsUnspecified && !localSize.isAnyValueSet() &&
+               imageInternalFormat == EiifUnspecified;
     }
 
     bool isCombinationValid() const
     {
         bool workSizeSpecified = localSize.isAnyValueSet();
         bool otherLayoutQualifiersSpecified =
-            (location != -1 || matrixPacking != EmpUnspecified || blockStorage != EbsUnspecified);
+            (location != -1 || matrixPacking != EmpUnspecified || blockStorage != EbsUnspecified ||
+             imageInternalFormat != EiifUnspecified);
 
         // we can have either the work group size specified, or the other layout qualifiers
         return !(workSizeSpecified && otherLayoutQualifiersSpecified);
@@ -430,6 +603,26 @@
     }
 };
 
+struct TMemoryQualifier
+{
+    // GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers
+    // An image can be qualified as both readonly and writeonly. It still can be can be used with
+    // imageSize().
+    bool readonly;
+    bool writeonly;
+    static TMemoryQualifier create()
+    {
+        TMemoryQualifier memoryQualifier;
+
+        memoryQualifier.readonly  = false;
+        memoryQualifier.writeonly = false;
+
+        return memoryQualifier;
+    }
+
+    bool isEmpty() { return !readonly && !writeonly; }
+};
+
 inline const char *getWorkGroupSizeString(size_t dimension)
 {
     switch (dimension)
@@ -500,6 +693,8 @@
     case EvqLocalInvocationID:      return "LocalInvocationID";
     case EvqGlobalInvocationID:     return "GlobalInvocationID";
     case EvqLocalInvocationIndex:   return "LocalInvocationIndex";
+    case EvqReadOnly:               return "readonly";
+    case EvqWriteOnly:              return "writeonly";
     default: UNREACHABLE();         return "unknown qualifier";
     }
     // clang-format on
@@ -528,4 +723,40 @@
     }
 }
 
+inline const char *getImageInternalFormatString(TLayoutImageInternalFormat iifq)
+{
+    switch (iifq)
+    {
+        case EiifRGBA32F:
+            return "rgba32f";
+        case EiifRGBA16F:
+            return "rgba16f";
+        case EiifR32F:
+            return "r32f";
+        case EiifRGBA32UI:
+            return "rgba32ui";
+        case EiifRGBA16UI:
+            return "rgba16ui";
+        case EiifRGBA8UI:
+            return "rgba8ui";
+        case EiifR32UI:
+            return "r32ui";
+        case EiifRGBA32I:
+            return "rgba32i";
+        case EiifRGBA16I:
+            return "rgba16i";
+        case EiifRGBA8I:
+            return "rgba8i";
+        case EiifR32I:
+            return "r32i";
+        case EiifRGBA8:
+            return "rgba8";
+        case EiifRGBA8_SNORM:
+            return "rgba8_snorm";
+        default:
+            UNREACHABLE();
+            return "unknown internal image format";
+    }
+}
+
 #endif // COMPILER_TRANSLATOR_BASETYPES_H_
diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp
index eb5dd58..8e1fc19 100644
--- a/src/compiler/translator/Compiler.cpp
+++ b/src/compiler/translator/Compiler.cpp
@@ -517,14 +517,10 @@
     symbolTable.push();   // ESSL3_1_BUILTINS
 
     TPublicType integer;
-    integer.setBasicType(EbtInt);
-    integer.initializeSizeForScalarTypes();
-    integer.array = false;
+    integer.initializeBasicType(EbtInt);
 
     TPublicType floatingPoint;
-    floatingPoint.setBasicType(EbtFloat);
-    floatingPoint.initializeSizeForScalarTypes();
-    floatingPoint.array = false;
+    floatingPoint.initializeBasicType(EbtFloat);
 
     switch(shaderType)
     {
@@ -563,9 +559,7 @@
 {
     ASSERT(samplerType > EbtGuardSamplerBegin && samplerType < EbtGuardSamplerEnd);
     TPublicType sampler;
-    sampler.initializeSizeForScalarTypes();
-    sampler.setBasicType(samplerType);
-    sampler.array         = false;
+    sampler.initializeBasicType(samplerType);
     symbolTable.setDefaultPrecision(sampler, EbpLow);
 }
 
diff --git a/src/compiler/translator/Initialize.cpp b/src/compiler/translator/Initialize.cpp
index 759834f..db4ca8e 100644
--- a/src/compiler/translator/Initialize.cpp
+++ b/src/compiler/translator/Initialize.cpp
@@ -18,6 +18,7 @@
 
 void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInResources &resources, TSymbolTable &symbolTable)
 {
+    const TType *voidType = TCache::getType(EbtVoid);
     const TType *float1 = TCache::getType(EbtFloat);
     const TType *float2 = TCache::getType(EbtFloat, 2);
     const TType *float3 = TCache::getType(EbtFloat, 3);
@@ -469,6 +470,26 @@
     symbolTable.insertBuiltIn(ESSL3_BUILTINS, gvec4, "textureProjGradOffset", gsampler3D, float4, float3, float3, int3);
     symbolTable.insertBuiltIn(ESSL3_BUILTINS, float1, "textureProjGradOffset", sampler2DShadow, float4, float2, float2, int2);
 
+    const TType *gimage2D      = TCache::getType(EbtGImage2D);
+    const TType *gimage3D      = TCache::getType(EbtGImage3D);
+    const TType *gimage2DArray = TCache::getType(EbtGImage2DArray);
+    const TType *gimageCube    = TCache::getType(EbtGImageCube);
+
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage2D, int2, gvec4);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage3D, int3, gvec4);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimage2DArray, int3, gvec4);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, voidType, "imageStore", gimageCube, int3, gvec4);
+
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage2D, int2);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage3D, int3);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimage2DArray, int3);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "imageLoad", gimageCube, int3);
+
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int2, "imageSize", gimage2D);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int3, "imageSize", gimage3D);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int3, "imageSize", gimage2DArray);
+    symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, int3, "imageSize", gimageCube);
+
     //
     // Depth range in window coordinates
     //
diff --git a/src/compiler/translator/IntermNode.h b/src/compiler/translator/IntermNode.h
index 4c37034..f465a5d 100644
--- a/src/compiler/translator/IntermNode.h
+++ b/src/compiler/translator/IntermNode.h
@@ -150,6 +150,7 @@
     TBasicType getBasicType() const { return mType.getBasicType(); }
     TQualifier getQualifier() const { return mType.getQualifier(); }
     TPrecision getPrecision() const { return mType.getPrecision(); }
+    TMemoryQualifier getMemoryQualifier() const { return mType.getMemoryQualifier(); }
     int getCols() const { return mType.getCols(); }
     int getRows() const { return mType.getRows(); }
     int getNominalSize() const { return mType.getNominalSize(); }
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 4301559..2be8e7e 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -49,6 +49,32 @@
     return true;
 }
 
+// If SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS is enabled, layout qualifiers are spilled whenever
+// variables with specified layout qualifiers are copied. Additional checks are needed against the
+// type and storage qualifier of the variable to verify that layout qualifiers have to be outputted.
+// TODO (mradev): Fix layout qualifier spilling in ScalarizeVecAndMatConstructorArgs and remove
+// NeedsToWriteLayoutQualifier.
+bool NeedsToWriteLayoutQualifier(const TType &type)
+{
+    if (type.getBasicType() == EbtInterfaceBlock)
+    {
+        return false;
+    }
+
+    const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier();
+
+    if ((type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn) &&
+        layoutQualifier.location >= 0)
+    {
+        return true;
+    }
+    if (IsImage(type.getBasicType()) && layoutQualifier.imageInternalFormat != EiifUnspecified)
+    {
+        return true;
+    }
+    return false;
+}
+
 }  // namespace
 
 TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink,
@@ -92,15 +118,30 @@
 
 void TOutputGLSLBase::writeLayoutQualifier(const TType &type)
 {
+    if (!NeedsToWriteLayoutQualifier(type))
+    {
+        return;
+    }
+
+    TInfoSinkBase &out                      = objSink();
+    const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier();
+    out << "layout(";
+
     if (type.getQualifier() == EvqFragmentOut || type.getQualifier() == EvqVertexIn)
     {
-        const TLayoutQualifier &layoutQualifier = type.getLayoutQualifier();
         if (layoutQualifier.location >= 0)
         {
-            TInfoSinkBase &out = objSink();
-            out << "layout(location = " << layoutQualifier.location << ") ";
+            out << "location = " << layoutQualifier.location;
         }
     }
+
+    if (IsImage(type.getBasicType()) && layoutQualifier.imageInternalFormat != EiifUnspecified)
+    {
+        ASSERT(type.getQualifier() == EvqTemporary || type.getQualifier() == EvqUniform);
+        out << getImageInternalFormatString(layoutQualifier.imageInternalFormat);
+    }
+
+    out << ") ";
 }
 
 void TOutputGLSLBase::writeVariableType(const TType &type)
@@ -141,6 +182,20 @@
             out << type.getQualifierString() << " ";
         }
     }
+
+    const TMemoryQualifier &memoryQualifier = type.getMemoryQualifier();
+    if (memoryQualifier.readonly)
+    {
+        ASSERT(IsImage(type.getBasicType()));
+        out << "readonly ";
+    }
+
+    if (memoryQualifier.writeonly)
+    {
+        ASSERT(IsImage(type.getBasicType()));
+        out << "writeonly ";
+    }
+
     // Declare the struct if we have not done so already.
     if (type.getBasicType() == EbtStruct && !structDeclared(type.getStruct()))
     {
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 70c0c27..96785cf 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -22,6 +22,49 @@
 //
 ////////////////////////////////////////////////////////////////////////
 
+namespace
+{
+
+const int kWebGLMaxStructNesting = 4;
+
+bool ContainsSampler(const TType &type)
+{
+    if (IsSampler(type.getBasicType()))
+        return true;
+
+    if (type.getBasicType() == EbtStruct || type.isInterfaceBlock())
+    {
+        const TFieldList &fields = type.getStruct()->fields();
+        for (unsigned int i = 0; i < fields.size(); ++i)
+        {
+            if (ContainsSampler(*fields[i]->type()))
+                return true;
+        }
+    }
+
+    return false;
+}
+
+bool ContainsImage(const TType &type)
+{
+    if (IsImage(type.getBasicType()))
+        return true;
+
+    if (type.getBasicType() == EbtStruct || type.isInterfaceBlock())
+    {
+        const TFieldList &fields = type.getStruct()->fields();
+        for (unsigned int i = 0; i < fields.size(); ++i)
+        {
+            if (ContainsImage(*fields[i]->type()))
+                return true;
+        }
+    }
+
+    return false;
+}
+
+}  // namespace
+
 //
 // Look at a '.' field selector string and change it into offsets
 // for a vector.
@@ -237,6 +280,11 @@
                     error(line, "No precision specified (sampler)", "");
                     return;
                 }
+                if (IsImage(type))
+                {
+                    error(line, "No precision specified (image)", "");
+                    return;
+                }
         }
     }
 }
@@ -346,6 +394,10 @@
             {
                 message = "can't modify a sampler";
             }
+            if (IsImage(node->getBasicType()))
+            {
+                message = "can't modify an image";
+            }
     }
 
     if (message == 0 && binaryNode == 0 && symNode == 0)
@@ -576,6 +628,11 @@
             error(line, "cannot convert a sampler", "constructor");
             return false;
         }
+        if (op != EOpConstructStruct && IsImage(argTyped->getBasicType()))
+        {
+            error(line, "cannot convert an image", "constructor");
+            return false;
+        }
         if (argTyped->getBasicType() == EbtVoid)
         {
             error(line, "cannot convert a void", "constructor");
@@ -662,7 +719,7 @@
 {
     if (pType.type == EbtStruct)
     {
-        if (containsSampler(*pType.userDef))
+        if (ContainsSampler(*pType.userDef))
         {
             error(line, reason, getBasicString(pType.type), "(structure contains a sampler)");
             return false;
@@ -679,6 +736,31 @@
     return true;
 }
 
+bool TParseContext::checkIsNotImage(const TSourceLoc &line,
+                                    const TTypeSpecifierNonArray &pType,
+                                    const char *reason)
+{
+    if (pType.type == EbtStruct)
+    {
+        if (ContainsImage(*pType.userDef))
+        {
+            error(line, reason, getBasicString(pType.type), "(structure contains an image)");
+
+            return false;
+        }
+
+        return true;
+    }
+    else if (IsImage(pType.type))
+    {
+        error(line, reason, getBasicString(pType.type));
+
+        return false;
+    }
+
+    return true;
+}
+
 void TParseContext::checkDeclaratorLocationIsNotSpecified(const TSourceLoc &line,
                                                           const TPublicType &pType)
 {
@@ -699,33 +781,34 @@
     }
 }
 
+void TParseContext::checkOutParameterIsNotOpaqueType(const TSourceLoc &line,
+                                                     TQualifier qualifier,
+                                                     const TType &type)
+{
+    checkOutParameterIsNotSampler(line, qualifier, type);
+    checkOutParameterIsNotImage(line, qualifier, type);
+}
+
 void TParseContext::checkOutParameterIsNotSampler(const TSourceLoc &line,
                                                   TQualifier qualifier,
                                                   const TType &type)
 {
-    if ((qualifier == EvqOut || qualifier == EvqInOut) && type.getBasicType() != EbtStruct &&
-        IsSampler(type.getBasicType()))
+    ASSERT(qualifier == EvqOut || qualifier == EvqInOut);
+    if (IsSampler(type.getBasicType()))
     {
         error(line, "samplers cannot be output parameters", type.getBasicString());
     }
 }
 
-bool TParseContext::containsSampler(const TType &type)
+void TParseContext::checkOutParameterIsNotImage(const TSourceLoc &line,
+                                                TQualifier qualifier,
+                                                const TType &type)
 {
-    if (IsSampler(type.getBasicType()))
-        return true;
-
-    if (type.getBasicType() == EbtStruct || type.isInterfaceBlock())
+    ASSERT(qualifier == EvqOut || qualifier == EvqInOut);
+    if (IsImage(type.getBasicType()))
     {
-        const TFieldList &fields = type.getStruct()->fields();
-        for (unsigned int i = 0; i < fields.size(); ++i)
-        {
-            if (containsSampler(*fields[i]->type()))
-                return true;
-        }
+        error(line, "images cannot be output parameters", type.getBasicString());
     }
-
-    return false;
 }
 
 // Do size checking for an array type's size.
@@ -926,7 +1009,16 @@
 
     if (typeQualifier.qualifier == EvqOut || typeQualifier.qualifier == EvqInOut)
     {
-        checkOutParameterIsNotSampler(line, typeQualifier.qualifier, *type);
+        checkOutParameterIsNotOpaqueType(line, typeQualifier.qualifier, *type);
+    }
+
+    if (!IsImage(type->getBasicType()))
+    {
+        checkIsMemoryQualifierNotSpecified(typeQualifier.memoryQualifier, line);
+    }
+    else
+    {
+        type->setMemoryQualifier(typeQualifier.memoryQualifier);
     }
 
     type->setQualifier(typeQualifier.qualifier);
@@ -991,6 +1083,12 @@
     {
         return;
     }
+    if (publicType.qualifier != EvqUniform &&
+        !checkIsNotImage(identifierLocation, publicType.typeSpecifierNonArray,
+                         "images must be uniform"))
+    {
+        return;
+    }
 
     // check for layout qualifier issues
     const TLayoutQualifier layoutQualifier = publicType.layoutQualifier;
@@ -1015,6 +1113,89 @@
     {
         checkLocationIsNotSpecified(identifierLocation, publicType.layoutQualifier);
     }
+
+    if (IsImage(publicType.getBasicType()))
+    {
+
+        switch (layoutQualifier.imageInternalFormat)
+        {
+            case EiifRGBA32F:
+            case EiifRGBA16F:
+            case EiifR32F:
+            case EiifRGBA8:
+            case EiifRGBA8_SNORM:
+                if (!IsFloatImage(publicType.getBasicType()))
+                {
+                    error(identifierLocation,
+                          "internal image format requires a floating image type",
+                          getBasicString(publicType.getBasicType()));
+                    return;
+                }
+                break;
+            case EiifRGBA32I:
+            case EiifRGBA16I:
+            case EiifRGBA8I:
+            case EiifR32I:
+                if (!IsIntegerImage(publicType.getBasicType()))
+                {
+                    error(identifierLocation,
+                          "internal image format requires an integer image type",
+                          getBasicString(publicType.getBasicType()));
+                    return;
+                }
+                break;
+            case EiifRGBA32UI:
+            case EiifRGBA16UI:
+            case EiifRGBA8UI:
+            case EiifR32UI:
+                if (!IsUnsignedImage(publicType.getBasicType()))
+                {
+                    error(identifierLocation,
+                          "internal image format requires an unsigned image type",
+                          getBasicString(publicType.getBasicType()));
+                    return;
+                }
+                break;
+            case EiifUnspecified:
+                error(identifierLocation, "layout qualifier", "No image internal format specified");
+                return;
+            default:
+                error(identifierLocation, "layout qualifier", "unrecognized token");
+                return;
+        }
+
+        // GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers
+        switch (layoutQualifier.imageInternalFormat)
+        {
+            case EiifR32F:
+            case EiifR32I:
+            case EiifR32UI:
+                break;
+            default:
+                if (!publicType.memoryQualifier.readonly && !publicType.memoryQualifier.writeonly)
+                {
+                    error(identifierLocation, "layout qualifier",
+                          "Except for images with the r32f, r32i and r32ui format qualifiers, "
+                          "image variables must be qualified readonly and/or writeonly");
+                    return;
+                }
+                break;
+        }
+    }
+    else
+    {
+
+        if (!checkInternalFormatIsNotSpecified(identifierLocation,
+                                               layoutQualifier.imageInternalFormat))
+        {
+            return;
+        }
+
+        if (!checkIsMemoryQualifierNotSpecified(publicType.memoryQualifier, identifierLocation))
+        {
+            return;
+        }
+    }
 }
 
 void TParseContext::checkLayoutQualifierSupported(const TSourceLoc &location,
@@ -1045,6 +1226,18 @@
     return true;
 }
 
+bool TParseContext::checkInternalFormatIsNotSpecified(const TSourceLoc &location,
+                                                      TLayoutImageInternalFormat internalFormat)
+{
+    if (internalFormat != EiifUnspecified)
+    {
+        error(location, "invalid layout qualifier:", getImageInternalFormatString(internalFormat),
+              "only valid when used with images");
+        return false;
+    }
+    return true;
+}
+
 void TParseContext::functionCallLValueErrorCheck(const TFunction *fnCandidate,
                                                  TIntermAggregate *fnCall)
 {
@@ -1396,6 +1589,7 @@
     returnType.qualifier       = typeQualifier.qualifier;
     returnType.invariant       = typeQualifier.invariant;
     returnType.layoutQualifier = typeQualifier.layoutQualifier;
+    returnType.memoryQualifier = typeQualifier.memoryQualifier;
     returnType.precision       = typeSpecifier.precision;
 
     if (typeQualifier.precision != EbpUndefined)
@@ -1527,6 +1721,38 @@
     }
 }
 
+void TParseContext::checkLocalVariableConstStorageQualifier(const TQualifierWrapperBase &qualifier)
+{
+    if (qualifier.getType() == QtStorage)
+    {
+        const TStorageQualifierWrapper &storageQualifier =
+            static_cast<const TStorageQualifierWrapper &>(qualifier);
+        if (!declaringFunction() && storageQualifier.getQualifier() != EvqConst &&
+            !symbolTable.atGlobalLevel())
+        {
+            error(storageQualifier.getLine(),
+                  "Local variables can only use the const storage qualifier.",
+                  storageQualifier.getQualifierString().c_str());
+        }
+    }
+}
+
+bool TParseContext::checkIsMemoryQualifierNotSpecified(const TMemoryQualifier &memoryQualifier,
+                                                       const TSourceLoc &location)
+{
+    if (memoryQualifier.readonly)
+    {
+        error(location, "Only allowed with images.", "readonly");
+        return false;
+    }
+    if (memoryQualifier.writeonly)
+    {
+        error(location, "Only allowed with images.", "writeonly");
+        return false;
+    }
+    return true;
+}
+
 TIntermAggregate *TParseContext::parseSingleDeclaration(TPublicType &publicType,
                                                         const TSourceLoc &identifierOrTypeLocation,
                                                         const TString &identifier)
@@ -1729,6 +1955,7 @@
 
     checkInvariantVariableQualifier(typeQualifier.invariant, type.getQualifier(),
                                     typeQualifier.line);
+    checkIsMemoryQualifierNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
 
     symbolTable.addInvariantVarying(std::string(identifier->c_str()));
 
@@ -1919,6 +2146,10 @@
         return;
     }
 
+    checkIsMemoryQualifierNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
+
+    checkInternalFormatIsNotSpecified(typeQualifier.line, layoutQualifier.imageInternalFormat);
+
     if (typeQualifier.qualifier == EvqComputeIn)
     {
         if (mComputeShaderLocalSizeDeclared &&
@@ -2272,9 +2503,10 @@
     {
         error(location, "no qualifiers allowed for function return", "layout");
     }
-    // make sure a sampler is not involved as well...
+    // make sure a sampler or an image is not involved as well...
     checkIsNotSampler(location, type.typeSpecifierNonArray,
                       "samplers can't be function return values");
+    checkIsNotImage(location, type.typeSpecifierNonArray, "images can't be function return values");
     if (mShaderVersion < 300)
     {
         // Array return values are forbidden, but there's also no valid syntax for declaring array
@@ -2413,6 +2645,8 @@
         error(typeQualifier.line, "invalid qualifier on interface block member", "invariant");
     }
 
+    checkIsMemoryQualifierNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
+
     TLayoutQualifier blockLayoutQualifier = typeQualifier.layoutQualifier;
     checkLocationIsNotSpecified(typeQualifier.line, blockLayoutQualifier);
 
@@ -2428,6 +2662,8 @@
 
     checkWorkGroupSizeIsNotSpecified(nameLine, blockLayoutQualifier);
 
+    checkInternalFormatIsNotSpecified(nameLine, blockLayoutQualifier.imageInternalFormat);
+
     TSymbol *blockNameSymbol = new TInterfaceBlockName(&blockName);
     if (!symbolTable.declare(blockNameSymbol))
     {
@@ -2445,6 +2681,12 @@
                   "sampler types are not allowed in interface blocks");
         }
 
+        if (IsImage(fieldType->getBasicType()))
+        {
+            error(field->line(), "unsupported type", fieldType->getBasicString(),
+                  "image types are not allowed in interface blocks");
+        }
+
         const TQualifier qualifier = fieldType->getQualifier();
         switch (qualifier)
         {
@@ -2567,12 +2809,6 @@
     --mStructNestingLevel;
 }
 
-namespace
-{
-const int kWebGLMaxStructNesting = 4;
-
-}  // namespace
-
 void TParseContext::checkIsBelowStructNestingLimit(const TSourceLoc &line, const TField &field)
 {
     if (!IsWebGLBasedSpec(mShaderSpec))
@@ -2896,6 +3132,72 @@
         error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str(),
               "location requires an argument");
     }
+    else if (qualifierType == "rgba32f")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA32F;
+    }
+    else if (qualifierType == "rgba16f")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA16F;
+    }
+    else if (qualifierType == "r32f")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifR32F;
+    }
+    else if (qualifierType == "rgba8")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA8;
+    }
+    else if (qualifierType == "rgba8_snorm")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA8_SNORM;
+    }
+    else if (qualifierType == "rgba32i")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA32I;
+    }
+    else if (qualifierType == "rgba16i")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA16I;
+    }
+    else if (qualifierType == "rgba8i")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA8I;
+    }
+    else if (qualifierType == "r32i")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifR32I;
+    }
+    else if (qualifierType == "rgba32ui")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA32UI;
+    }
+    else if (qualifierType == "rgba16ui")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA16UI;
+    }
+    else if (qualifierType == "rgba8ui")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifRGBA8UI;
+    }
+    else if (qualifierType == "r32ui")
+    {
+        checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
+        qualifier.imageInternalFormat = EiifR32UI;
+    }
+
     else
     {
         error(qualifierTypeLine, "invalid layout qualifier", qualifierType.c_str());
@@ -2991,6 +3293,7 @@
 
     typeSpecifier->qualifier       = typeQualifier.qualifier;
     typeSpecifier->layoutQualifier = typeQualifier.layoutQualifier;
+    typeSpecifier->memoryQualifier = typeQualifier.memoryQualifier;
     typeSpecifier->invariant       = typeQualifier.invariant;
     if (typeQualifier.precision != EbpUndefined)
     {
@@ -3021,6 +3324,7 @@
         type->setPrecision(typeSpecifier.precision);
         type->setQualifier(typeSpecifier.qualifier);
         type->setLayoutQualifier(typeSpecifier.layoutQualifier);
+        type->setMemoryQualifier(typeSpecifier.memoryQualifier);
         type->setInvariant(typeSpecifier.invariant);
 
         // don't allow arrays of arrays
@@ -3082,6 +3386,12 @@
         {
             error(field.line(), "invalid qualifier on struct member", "invariant");
         }
+        if (IsImage(field.type()->getBasicType()))
+        {
+            error(field.line(), "disallowed type in struct", field.type()->getBasicString());
+        }
+
+        checkIsMemoryQualifierNotSpecified(field.type()->getMemoryQualifier(), field.line());
 
         checkLocationIsNotSpecified(field.line(), field.type()->getLayoutQualifier());
     }
@@ -3208,7 +3518,7 @@
         case EOpNegative:
         case EOpPositive:
             if (child->getBasicType() == EbtStruct || child->getBasicType() == EbtBool ||
-                child->isArray() || IsSampler(child->getBasicType()))
+                child->isArray() || IsOpaqueType(child->getBasicType()))
             {
                 return nullptr;
             }
@@ -3373,6 +3683,14 @@
                       GetOperatorString(op));
                 return false;
             }
+
+            if ((op == EOpAssign || op == EOpInitialize) &&
+                left->getType().isStructureContainingImages())
+            {
+                error(loc, "undefined operation for structs containing images",
+                      GetOperatorString(op));
+                return false;
+            }
         case EOpLessThan:
         case EOpGreaterThan:
         case EOpLessThanEqual:
@@ -3738,6 +4056,83 @@
     }
 }
 
+// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers
+void TParseContext::checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate *functionCall)
+{
+    ASSERT(!functionCall->isUserDefined());
+    const TString &name = functionCall->getFunctionSymbolInfo()->getName();
+
+    if (name.compare(0, 5, "image") == 0)
+    {
+        TIntermSequence *arguments = functionCall->getSequence();
+        TIntermNode *imageNode     = (*arguments)[0];
+        TIntermSymbol *imageSymbol = imageNode->getAsSymbolNode();
+
+        const TMemoryQualifier &memoryQualifier = imageSymbol->getMemoryQualifier();
+
+        if (name.compare(5, 5, "Store") == 0)
+        {
+            if (memoryQualifier.readonly)
+            {
+                error(imageNode->getLine(),
+                      "'imageStore' cannot be used with images qualified as 'readonly'",
+                      imageSymbol->getSymbol().c_str());
+            }
+        }
+        else if (name.compare(5, 4, "Load") == 0)
+        {
+            if (memoryQualifier.writeonly)
+            {
+                error(imageNode->getLine(),
+                      "'imageLoad' cannot be used with images qualified as 'writeonly'",
+                      imageSymbol->getSymbol().c_str());
+            }
+        }
+    }
+}
+
+// GLSL ES 3.10 Revision 4, 13.51 Matching of Memory Qualifiers in Function Parameters
+void TParseContext::checkImageMemoryAccessForUserDefinedFunctions(
+    const TFunction *functionDefinition,
+    const TIntermAggregate *functionCall)
+{
+    ASSERT(functionCall->isUserDefined());
+
+    const TIntermSequence &arguments = *functionCall->getSequence();
+
+    ASSERT(functionDefinition->getParamCount() == arguments.size());
+
+    for (size_t i = 0; i < arguments.size(); ++i)
+    {
+        const TType &functionArgumentType  = arguments[i]->getAsTyped()->getType();
+        const TType &functionParameterType = *functionDefinition->getParam(i).type;
+        ASSERT(functionArgumentType.getBasicType() == functionParameterType.getBasicType());
+
+        if (IsImage(functionArgumentType.getBasicType()))
+        {
+            const TMemoryQualifier &functionArgumentMemoryQualifier =
+                functionArgumentType.getMemoryQualifier();
+            const TMemoryQualifier &functionParameterMemoryQualifier =
+                functionParameterType.getMemoryQualifier();
+            if (functionArgumentMemoryQualifier.readonly &&
+                !functionParameterMemoryQualifier.readonly)
+            {
+                error(functionCall->getLine(),
+                      "Function call discards the 'readonly' qualifier from image",
+                      arguments[i]->getAsSymbolNode()->getSymbol().c_str());
+            }
+
+            if (functionArgumentMemoryQualifier.writeonly &&
+                !functionParameterMemoryQualifier.writeonly)
+            {
+                error(functionCall->getLine(),
+                      "Function call discards the 'writeonly' qualifier from image",
+                      arguments[i]->getAsSymbolNode()->getSymbol().c_str());
+            }
+        }
+    }
+}
+
 TIntermTyped *TParseContext::addFunctionCallOrMethod(TFunction *fnCall,
                                                      TIntermNode *paramNode,
                                                      TIntermNode *thisNode,
@@ -3887,6 +4282,12 @@
                     aggregate->setBuiltInFunctionPrecision();
 
                     checkTextureOffsetConst(aggregate);
+
+                    checkImageMemoryAccessForBuiltinFunctions(aggregate);
+                }
+                else
+                {
+                    checkImageMemoryAccessForUserDefinedFunctions(fnCandidate, aggregate);
                 }
 
                 callNode = aggregate;
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index 6ca3a3c..df34dd3 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -162,12 +162,12 @@
     bool checkIsNotSampler(const TSourceLoc &line,
                            const TTypeSpecifierNonArray &pType,
                            const char *reason);
+    bool checkIsNotImage(const TSourceLoc &line,
+                         const TTypeSpecifierNonArray &pType,
+                         const char *reason);
     void checkDeclaratorLocationIsNotSpecified(const TSourceLoc &line, const TPublicType &pType);
     void checkLocationIsNotSpecified(const TSourceLoc &location,
                                      const TLayoutQualifier &layoutQualifier);
-    void checkOutParameterIsNotSampler(const TSourceLoc &line,
-                                       TQualifier qualifier,
-                                       const TType &type);
     void checkIsParameterQualifierValid(const TSourceLoc &line,
                                         const TTypeQualifierBuilder &typeQualifierBuilder,
                                         TType *type);
@@ -179,7 +179,8 @@
                                        int versionRequired);
     bool checkWorkGroupSizeIsNotSpecified(const TSourceLoc &location,
                                           const TLayoutQualifier &layoutQualifier);
-
+    bool checkInternalFormatIsNotSpecified(const TSourceLoc &location,
+                                           TLayoutImageInternalFormat internalFormat);
     void functionCallLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *fnCall);
     void checkInvariantVariableQualifier(bool invariant,
                                          const TQualifier qualifier,
@@ -187,7 +188,7 @@
     void checkInputOutputTypeIsValidES3(const TQualifier qualifier,
                                         const TPublicType &type,
                                         const TSourceLoc &qualifierLocation);
-
+    void checkLocalVariableConstStorageQualifier(const TQualifierWrapperBase &qualifier);
     const TPragma &pragma() const { return mDirectiveHandler.pragma(); }
     const TExtensionBehavior &extensionBehavior() const { return mDirectiveHandler.extensionBehavior(); }
     bool supportsExtension(const char *extension);
@@ -195,7 +196,6 @@
     void handleExtensionDirective(const TSourceLoc &loc, const char *extName, const char *behavior);
     void handlePragmaDirective(const TSourceLoc &loc, const char *name, const char *value, bool stdgl);
 
-    bool containsSampler(const TType &type);
     const TFunction* findFunction(
         const TSourceLoc &line, TFunction *pfnCall, int inputShaderVersion, bool *builtIn = 0);
     bool executeInitializer(const TSourceLoc &line,
@@ -356,6 +356,9 @@
     TIntermBranch *addBranch(TOperator op, TIntermTyped *returnValue, const TSourceLoc &loc);
 
     void checkTextureOffsetConst(TIntermAggregate *functionCall);
+    void checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate *functionCall);
+    void checkImageMemoryAccessForUserDefinedFunctions(const TFunction *functionDefinition,
+                                                       const TIntermAggregate *functionCall);
     TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall,
                                           TIntermNode *paramNode,
                                           TIntermNode *thisNode,
@@ -392,6 +395,18 @@
     // Assumes that multiplication op has already been set based on the types.
     bool isMultiplicationTypeCombinationValid(TOperator op, const TType &left, const TType &right);
 
+    bool checkIsMemoryQualifierNotSpecified(const TMemoryQualifier &memoryQualifier,
+                                            const TSourceLoc &location);
+    void checkOutParameterIsNotImage(const TSourceLoc &line,
+                                     TQualifier qualifier,
+                                     const TType &type);
+    void checkOutParameterIsNotOpaqueType(const TSourceLoc &line,
+                                          TQualifier qualifier,
+                                          const TType &type);
+    void checkOutParameterIsNotSampler(const TSourceLoc &line,
+                                       TQualifier qualifier,
+                                       const TType &type);
+
     TIntermTyped *addBinaryMathInternal(
         TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
     TIntermTyped *createAssign(
diff --git a/src/compiler/translator/QualifierTypes.cpp b/src/compiler/translator/QualifierTypes.cpp
index 30d8c4e..a9bee15 100644
--- a/src/compiler/translator/QualifierTypes.cpp
+++ b/src/compiler/translator/QualifierTypes.cpp
@@ -48,6 +48,11 @@
         }
     }
 
+    if (rightQualifier.imageInternalFormat != EiifUnspecified)
+    {
+        joinedQualifier.imageInternalFormat = rightQualifier.imageInternalFormat;
+    }
+
     return joinedQualifier;
 }
 }  // namespace sh
@@ -191,6 +196,31 @@
                 }
                 break;
             }
+            case QtMemory:
+            {
+                // Go over all of the memory qualifiers up until the current one and check for
+                // repetitions.
+                // Having both readonly and writeonly in a sequence is valid.
+                // GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers
+                TQualifier currentQualifier =
+                    static_cast<const TMemoryQualifierWrapper *>(qualifiers[i])->getQualifier();
+                for (size_t j = 1; j < i; ++j)
+                {
+                    if (qualifiers[j]->getType() == QtMemory)
+                    {
+                        const TMemoryQualifierWrapper *previousQualifierWrapper =
+                            static_cast<const TMemoryQualifierWrapper *>(qualifiers[j]);
+                        TQualifier previousQualifier = previousQualifierWrapper->getQualifier();
+                        if (currentQualifier == previousQualifier)
+                        {
+                            *errorMessage = previousQualifierWrapper->getQualifierString().c_str();
+                            *errorMessage += " specified multiple times";
+                            return true;
+                        }
+                    }
+                }
+                break;
+            }
             default:
                 UNREACHABLE();
         }
@@ -263,6 +293,13 @@
                 }
                 foundStorage = true;
                 break;
+            case QtMemory:
+                if (foundPrecision)
+                {
+                    *errorMessage = "Precision qualifiers have to be after memory qualifiers.";
+                    return false;
+                }
+                break;
             case QtPrecision:
                 foundPrecision = true;
                 break;
@@ -392,6 +429,22 @@
     return true;
 }
 
+bool JoinMemoryQualifier(TMemoryQualifier *joinedMemoryQualifier, TQualifier memoryQualifier)
+{
+    switch (memoryQualifier)
+    {
+        case EvqReadOnly:
+            joinedMemoryQualifier->readonly = true;
+            break;
+        case EvqWriteOnly:
+            joinedMemoryQualifier->writeonly = true;
+            break;
+        default:
+            UNREACHABLE();
+    }
+    return true;
+}
+
 TTypeQualifier GetVariableTypeQualifierFromSortedSequence(
     const TTypeQualifierBuilder::QualifierSequence &sortedSequence,
     TDiagnostics *diagnostics)
@@ -445,6 +498,11 @@
                     static_cast<const TPrecisionQualifierWrapper *>(qualifier)->getQualifier();
                 ASSERT(typeQualifier.precision != EbpUndefined);
                 break;
+            case QtMemory:
+                isQualifierValid = JoinMemoryQualifier(
+                    &typeQualifier.memoryQualifier,
+                    static_cast<const TMemoryQualifierWrapper *>(qualifier)->getQualifier());
+                break;
             default:
                 UNREACHABLE();
         }
@@ -474,6 +532,11 @@
             case QtInterpolation:
             case QtLayout:
                 break;
+            case QtMemory:
+                isQualifierValid = JoinMemoryQualifier(
+                    &typeQualifier.memoryQualifier,
+                    static_cast<const TMemoryQualifierWrapper *>(qualifier)->getQualifier());
+                break;
             case QtStorage:
                 isQualifierValid = JoinParameterStorageQualifier(
                     &typeQualifier.qualifier,
@@ -548,6 +611,11 @@
     }
 }
 
+unsigned int TMemoryQualifierWrapper::getRank() const
+{
+    return 4u;
+}
+
 unsigned int TPrecisionQualifierWrapper::getRank() const
 {
     return 5u;
@@ -555,6 +623,7 @@
 
 TTypeQualifier::TTypeQualifier(TQualifier scope, const TSourceLoc &loc)
     : layoutQualifier(TLayoutQualifier::create()),
+      memoryQualifier(TMemoryQualifier::create()),
       precision(EbpUndefined),
       qualifier(scope),
       invariant(false),
diff --git a/src/compiler/translator/QualifierTypes.h b/src/compiler/translator/QualifierTypes.h
index 0bcc39a..a65b119 100644
--- a/src/compiler/translator/QualifierTypes.h
+++ b/src/compiler/translator/QualifierTypes.h
@@ -27,7 +27,8 @@
     QtInterpolation,
     QtLayout,
     QtStorage,
-    QtPrecision
+    QtPrecision,
+    QtMemory
 };
 
 class TQualifierWrapperBase : angle::NonCopyable
@@ -127,6 +128,24 @@
     TPrecision mPrecisionQualifier;
 };
 
+class TMemoryQualifierWrapper final : public TQualifierWrapperBase
+{
+  public:
+    TMemoryQualifierWrapper(TQualifier memoryQualifier, const TSourceLoc &line)
+        : TQualifierWrapperBase(line), mMemoryQualifier(memoryQualifier)
+    {
+    }
+    ~TMemoryQualifierWrapper() {}
+
+    TQualifierType getType() const { return QtMemory; }
+    TString getQualifierString() const { return ::getQualifierString(mMemoryQualifier); }
+    TQualifier getQualifier() const { return mMemoryQualifier; }
+    unsigned int getRank() const;
+
+  private:
+    TQualifier mMemoryQualifier;
+};
+
 // TTypeQualifier tightly covers type_qualifier from the grammar
 struct TTypeQualifier
 {
@@ -134,6 +153,7 @@
     TTypeQualifier(TQualifier scope, const TSourceLoc &loc);
 
     TLayoutQualifier layoutQualifier;
+    TMemoryQualifier memoryQualifier;
     TPrecision precision;
     TQualifier qualifier;
     bool invariant;
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index aa23776..92121e8 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -249,6 +249,43 @@
         insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name, TCache::getType(EbtISampler2DArray), ptype2, ptype3, ptype4, ptype5);
         insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
     }
+    else if (IsGImage(ptype1->getBasicType()))
+    {
+        insertUnmangledBuiltIn(name);
+
+        const TType *floatType    = TCache::getType(EbtFloat, 4);
+        const TType *intType      = TCache::getType(EbtInt, 4);
+        const TType *unsignedType = TCache::getType(EbtUInt, 4);
+
+        const TType *floatImage =
+            TCache::getType(convertGImageToFloatImage(ptype1->getBasicType()));
+        const TType *intImage = TCache::getType(convertGImageToIntImage(ptype1->getBasicType()));
+        const TType *unsignedImage =
+            TCache::getType(convertGImageToUnsignedImage(ptype1->getBasicType()));
+
+        // GLSL ES 3.10, Revision 4, 8.12 Image Functions
+        if (rvalue->getBasicType() == EbtGVec4)
+        {
+            // imageLoad
+            insertBuiltIn(level, floatType, name, floatImage, ptype2, ptype3, ptype4, ptype5);
+            insertBuiltIn(level, intType, name, intImage, ptype2, ptype3, ptype4, ptype5);
+            insertBuiltIn(level, unsignedType, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
+        }
+        else if (rvalue->getBasicType() == EbtVoid)
+        {
+            // imageStore
+            insertBuiltIn(level, rvalue, name, floatImage, ptype2, floatType, ptype4, ptype5);
+            insertBuiltIn(level, rvalue, name, intImage, ptype2, intType, ptype4, ptype5);
+            insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, unsignedType, ptype4, ptype5);
+        }
+        else
+        {
+            // imageSize
+            insertBuiltIn(level, rvalue, name, floatImage, ptype2, ptype3, ptype4, ptype5);
+            insertBuiltIn(level, rvalue, name, intImage, ptype2, ptype3, ptype4, ptype5);
+            insertBuiltIn(level, rvalue, name, unsignedImage, ptype2, ptype3, ptype4, ptype5);
+        }
+    }
     else if (IsGenType(rvalue) || IsGenType(ptype1) || IsGenType(ptype2) || IsGenType(ptype3))
     {
         ASSERT(!ptype4 && !ptype5);
diff --git a/src/compiler/translator/Types.cpp b/src/compiler/translator/Types.cpp
index 598be28..7ae004e 100644
--- a/src/compiler/translator/Types.cpp
+++ b/src/compiler/translator/Types.cpp
@@ -44,6 +44,30 @@
         case EbtSampler2DArrayShadow: return "sampler2DArrayShadow";
         case EbtStruct:               return "structure";
         case EbtInterfaceBlock:       return "interface block";
+        case EbtImage2D:
+            return "image2D";
+        case EbtIImage2D:
+            return "iimage2D";
+        case EbtUImage2D:
+            return "uimage2D";
+        case EbtImage3D:
+            return "image3D";
+        case EbtIImage3D:
+            return "iimage3D";
+        case EbtUImage3D:
+            return "uimage3D";
+        case EbtImage2DArray:
+            return "image2DArray";
+        case EbtIImage2DArray:
+            return "iimage2DArray";
+        case EbtUImage2DArray:
+            return "uimage2DArray";
+        case EbtImageCube:
+            return "imageCube";
+        case EbtIImageCube:
+            return "iimageCube";
+        case EbtUImageCube:
+            return "uimageCube";
         default: UNREACHABLE();       return "unknown type";
     }
 }
@@ -53,6 +77,7 @@
       precision(p.precision),
       qualifier(p.qualifier),
       invariant(p.invariant),
+      memoryQualifier(p.memoryQualifier),
       layoutQualifier(p.layoutQualifier),
       primarySize(p.getPrimarySize()),
       secondarySize(p.getSecondarySize()),
@@ -283,6 +308,42 @@
       case EbtSampler2DArrayShadow:
         mangledName += "s2as";
         break;
+      case EbtImage2D:
+          mangledName += "im2";
+          break;
+      case EbtIImage2D:
+          mangledName += "iim2";
+          break;
+      case EbtUImage2D:
+          mangledName += "uim2";
+          break;
+      case EbtImage3D:
+          mangledName += "im3";
+          break;
+      case EbtIImage3D:
+          mangledName += "iim3";
+          break;
+      case EbtUImage3D:
+          mangledName += "uim3";
+          break;
+      case EbtImage2DArray:
+          mangledName += "im2a";
+          break;
+      case EbtIImage2DArray:
+          mangledName += "iim2a";
+          break;
+      case EbtUImage2DArray:
+          mangledName += "uim2a";
+          break;
+      case EbtImageCube:
+          mangledName += "imc";
+          break;
+      case EbtIImageCube:
+          mangledName += "iimc";
+          break;
+      case EbtUImageCube:
+          mangledName += "uimc";
+          break;
       case EbtStruct:
         mangledName += structure->mangledName();
         break;
@@ -381,6 +442,17 @@
     return false;
 }
 
+bool TStructure::containsImages() const
+{
+    for (size_t i = 0; i < mFields->size(); ++i)
+    {
+        const TType *fieldType = (*mFields)[i]->type();
+        if (IsImage(fieldType->getBasicType()) || fieldType->isStructureContainingImages())
+            return true;
+    }
+    return false;
+}
+
 void TStructure::createSamplerSymbols(const TString &structName,
                                       const TString &structAPIName,
                                       const unsigned int arrayOfStructsSize,
diff --git a/src/compiler/translator/Types.h b/src/compiler/translator/Types.h
index ab1b6c3..22751f7 100644
--- a/src/compiler/translator/Types.h
+++ b/src/compiler/translator/Types.h
@@ -114,6 +114,7 @@
     bool containsArrays() const;
     bool containsType(TBasicType t) const;
     bool containsSamplers() const;
+    bool containsImages() const;
 
     void createSamplerSymbols(const TString &structName,
                               const TString &structAPIName,
@@ -229,10 +230,18 @@
   public:
     POOL_ALLOCATOR_NEW_DELETE();
     TType()
-        : type(EbtVoid), precision(EbpUndefined), qualifier(EvqGlobal), invariant(false),
+        : type(EbtVoid),
+          precision(EbpUndefined),
+          qualifier(EvqGlobal),
+          invariant(false),
+          memoryQualifier(TMemoryQualifier::create()),
           layoutQualifier(TLayoutQualifier::create()),
-          primarySize(0), secondarySize(0), array(false), arraySize(0),
-          interfaceBlock(nullptr), structure(nullptr)
+          primarySize(0),
+          secondarySize(0),
+          array(false),
+          arraySize(0),
+          interfaceBlock(nullptr),
+          structure(nullptr)
     {
     }
     explicit TType(TBasicType t, unsigned char ps = 1, unsigned char ss = 1)
@@ -240,6 +249,7 @@
           precision(EbpUndefined),
           qualifier(EvqGlobal),
           invariant(false),
+          memoryQualifier(TMemoryQualifier::create()),
           layoutQualifier(TLayoutQualifier::create()),
           primarySize(ps),
           secondarySize(ss),
@@ -249,12 +259,24 @@
           structure(0)
     {
     }
-    TType(TBasicType t, TPrecision p, TQualifier q = EvqTemporary,
-          unsigned char ps = 1, unsigned char ss = 1, bool a = false)
-        : type(t), precision(p), qualifier(q), invariant(false),
+    TType(TBasicType t,
+          TPrecision p,
+          TQualifier q     = EvqTemporary,
+          unsigned char ps = 1,
+          unsigned char ss = 1,
+          bool a           = false)
+        : type(t),
+          precision(p),
+          qualifier(q),
+          invariant(false),
+          memoryQualifier(TMemoryQualifier::create()),
           layoutQualifier(TLayoutQualifier::create()),
-          primarySize(ps), secondarySize(ss), array(a), arraySize(0),
-          interfaceBlock(0), structure(0)
+          primarySize(ps),
+          secondarySize(ss),
+          array(a),
+          arraySize(0),
+          interfaceBlock(0),
+          structure(0)
     {
     }
     explicit TType(const TPublicType &p);
@@ -263,6 +285,7 @@
           precision(p),
           qualifier(EvqTemporary),
           invariant(false),
+          memoryQualifier(TMemoryQualifier::create()),
           layoutQualifier(TLayoutQualifier::create()),
           primarySize(1),
           secondarySize(1),
@@ -272,12 +295,22 @@
           structure(userDef)
     {
     }
-    TType(TInterfaceBlock *interfaceBlockIn, TQualifier qualifierIn,
-          TLayoutQualifier layoutQualifierIn, int arraySizeIn)
-        : type(EbtInterfaceBlock), precision(EbpUndefined), qualifier(qualifierIn),
-          invariant(false), layoutQualifier(layoutQualifierIn),
-          primarySize(1), secondarySize(1), array(arraySizeIn > 0), arraySize(arraySizeIn),
-          interfaceBlock(interfaceBlockIn), structure(0)
+    TType(TInterfaceBlock *interfaceBlockIn,
+          TQualifier qualifierIn,
+          TLayoutQualifier layoutQualifierIn,
+          int arraySizeIn)
+        : type(EbtInterfaceBlock),
+          precision(EbpUndefined),
+          qualifier(qualifierIn),
+          invariant(false),
+          memoryQualifier(TMemoryQualifier::create()),
+          layoutQualifier(layoutQualifierIn),
+          primarySize(1),
+          secondarySize(1),
+          array(arraySizeIn > 0),
+          arraySize(arraySizeIn),
+          interfaceBlock(interfaceBlockIn),
+          structure(0)
     {
     }
 
@@ -322,6 +355,9 @@
 
     void setInvariant(bool i) { invariant = i; }
 
+    TMemoryQualifier getMemoryQualifier() const { return memoryQualifier; }
+    void setMemoryQualifier(const TMemoryQualifier &mq) { memoryQualifier = mq; }
+
     TLayoutQualifier getLayoutQualifier() const
     {
         return layoutQualifier;
@@ -547,6 +583,11 @@
         return structure ? structure->containsSamplers() : false;
     }
 
+    bool isStructureContainingImages() const
+    {
+        return structure ? structure->containsImages() : false;
+    }
+
     void createSamplerSymbols(const TString &structName,
                               const TString &structAPIName,
                               const unsigned int arrayOfStructsSize,
@@ -573,6 +614,7 @@
     TPrecision precision;
     TQualifier qualifier;
     bool invariant;
+    TMemoryQualifier memoryQualifier;
     TLayoutQualifier layoutQualifier;
     unsigned char primarySize; // size of vector or cols matrix
     unsigned char secondarySize; // rows of a matrix
@@ -641,6 +683,7 @@
 {
     TTypeSpecifierNonArray typeSpecifierNonArray;
     TLayoutQualifier layoutQualifier;
+    TMemoryQualifier memoryQualifier;
     TQualifier qualifier;
     bool invariant;
     TPrecision precision;
@@ -651,6 +694,7 @@
     {
         typeSpecifierNonArray = typeSpecifier;
         layoutQualifier       = TLayoutQualifier::create();
+        memoryQualifier       = TMemoryQualifier::create();
         qualifier             = q;
         invariant             = false;
         precision             = EbpUndefined;
@@ -658,16 +702,25 @@
         arraySize             = 0;
     }
 
+    void initializeBasicType(TBasicType basicType)
+    {
+        typeSpecifierNonArray.type          = basicType;
+        typeSpecifierNonArray.primarySize   = 1;
+        typeSpecifierNonArray.secondarySize = 1;
+        layoutQualifier                     = TLayoutQualifier::create();
+        memoryQualifier                     = TMemoryQualifier::create();
+        qualifier                           = EvqTemporary;
+        invariant                           = false;
+        precision                           = EbpUndefined;
+        array                               = false;
+        arraySize                           = 0;
+    }
+
     TBasicType getBasicType() const { return typeSpecifierNonArray.type; }
     void setBasicType(TBasicType basicType) { typeSpecifierNonArray.type = basicType; }
 
     unsigned char getPrimarySize() const { return typeSpecifierNonArray.primarySize; }
     unsigned char getSecondarySize() const { return typeSpecifierNonArray.secondarySize; }
-    void initializeSizeForScalarTypes()
-    {
-        typeSpecifierNonArray.primarySize   = 1;
-        typeSpecifierNonArray.secondarySize = 1;
-    }
 
     const TType *getUserDef() const { return typeSpecifierNonArray.userDef; }
     const TSourceLoc &getLine() const { return typeSpecifierNonArray.line; }
diff --git a/src/compiler/translator/glslang.l b/src/compiler/translator/glslang.l
index 7fe2893..ed82498 100644
--- a/src/compiler/translator/glslang.l
+++ b/src/compiler/translator/glslang.l
@@ -71,6 +71,7 @@
 static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
 static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
 static int ES2_ident_ES3_keyword(TParseContext *context, int token);
+static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
 static int uint_constant(TParseContext *context);
 static int int_constant(TParseContext *context);
 static int float_constant(yyscan_t yyscanner);
@@ -187,11 +188,24 @@
 
 "layout"  { return ES2_ident_ES3_keyword(context, LAYOUT); }
 
+"image2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
+"iimage2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
+"uimage2D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
+"image2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
+"iimage2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
+"uimage2DArray" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
+"image3D"  { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
+"uimage3D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
+"iimage3D" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
+"iimageCube" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
+"uimageCube" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
+"imageCube"	{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
+"readonly" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); }
+"writeonly" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
+
     /* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
 "coherent"          |
 "restrict"          |
-"readonly"          |
-"writeonly"         |
 "resource"          |
 "atomic_uint"       |
 "noperspective"     |
@@ -204,23 +218,11 @@
 
 "filter"            |
 "image1D"           |
-"image2D"           |
-"image3D"           |
-"imageCube"	        |
 "iimage1D"          |
-"iimage2D"          |
-"iimage3D"          |
-"iimageCube"        |
 "uimage1D"          |
-"uimage2D"          |
-"uimage3D"          |
-"uimageCube"        |
 "image1DArray"      |
-"image2DArray"      |
 "iimage1DArray"     |
-"iimage2DArray"     |
 "uimage1DArray"     |
-"uimage2DArray"     |
 "image1DShadow"     |
 "image2DShadow"     |
 "image1DArrayShadow" |
@@ -463,6 +465,24 @@
     return token;
 }
 
+int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
+{
+    struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
+    yyscan_t yyscanner = (yyscan_t) context->getScanner();
+
+    if (context->getShaderVersion() < 300)
+    {
+        yylval->lex.string = NewPoolTString(yytext);
+        return check_type(yyscanner);
+    }
+    else if (context->getShaderVersion() == 300)
+    {
+        return reserved_word(yyscanner);
+    }
+
+    return token;
+}
+
 int ES2_ident_ES3_keyword(TParseContext *context, int token)
 {
     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 7476f62..d1132c6 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -166,11 +166,14 @@
 %token <lex> MATRIX2 MATRIX3 MATRIX4 IN_QUAL OUT_QUAL INOUT_QUAL UNIFORM VARYING
 %token <lex> MATRIX2x3 MATRIX3x2 MATRIX2x4 MATRIX4x2 MATRIX3x4 MATRIX4x3
 %token <lex> CENTROID FLAT SMOOTH
+%token <lex> READONLY WRITEONLY
 %token <lex> STRUCT VOID_TYPE WHILE
 %token <lex> SAMPLER2D SAMPLERCUBE SAMPLER_EXTERNAL_OES SAMPLER2DRECT SAMPLER2DARRAY
 %token <lex> ISAMPLER2D ISAMPLER3D ISAMPLERCUBE ISAMPLER2DARRAY
 %token <lex> USAMPLER2D USAMPLER3D USAMPLERCUBE USAMPLER2DARRAY
 %token <lex> SAMPLER3D SAMPLER3DRECT SAMPLER2DSHADOW SAMPLERCUBESHADOW SAMPLER2DARRAYSHADOW
+%token <lex> IMAGE2D IIMAGE2D UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D IMAGE2DARRAY IIMAGE2DARRAY UIMAGE2DARRAY
+%token <lex> IMAGECUBE IIMAGECUBE UIMAGECUBE
 %token <lex> LAYOUT
 
 %token <lex> IDENTIFIER TYPE_NAME FLOATCONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT
@@ -215,8 +218,8 @@
 
 %type <interm.precision> precision_qualifier
 %type <interm.layoutQualifier> layout_qualifier
-%type <interm.qualifier> storage_qualifier interpolation_qualifier
-%type <interm.qualifierWrapper> single_type_qualifier invariant_qualifier
+%type <interm.qualifier> interpolation_qualifier
+%type <interm.qualifierWrapper> storage_qualifier single_type_qualifier invariant_qualifier
 %type <interm.typeQualifierBuilder> type_qualifier
 
 %type <interm.typeSpecifierNonArray> type_specifier_nonarray struct_specifier
@@ -854,11 +857,8 @@
 
 single_type_qualifier
     : storage_qualifier {
-        if (!context->declaringFunction() && $1 != EvqConst && !context->symbolTable.atGlobalLevel())
-        {
-            context->error(@1, "Local variables can only use the const storage qualifier.", getQualifierString($1));
-        }
-        $$ = new TStorageQualifierWrapper($1, @1);
+        context->checkLocalVariableConstStorageQualifier(*$1);
+        $$ = $1;
     }
     | layout_qualifier {
         context->checkIsAtGlobalLevel(@1, "layout");
@@ -883,43 +883,43 @@
         VERTEX_ONLY("attribute", @1);
         ES2_ONLY("attribute", @1);
         context->checkIsAtGlobalLevel(@1, "attribute");
-        $$ = EvqAttribute;
+        $$ = new TStorageQualifierWrapper(EvqAttribute, @1);
     }
     | VARYING {
         ES2_ONLY("varying", @1);
         context->checkIsAtGlobalLevel(@1, "varying");
         if (context->getShaderType() == GL_VERTEX_SHADER)
-            $$ = EvqVaryingOut;
+            $$ = new TStorageQualifierWrapper(EvqVaryingOut, @1);
         else
-            $$ = EvqVaryingIn;
+            $$ = new TStorageQualifierWrapper(EvqVaryingIn, @1);
     }
     | CONST_QUAL {
-        $$ = EvqConst;
+        $$ = new TStorageQualifierWrapper(EvqConst, @1);
     }
     | IN_QUAL {
         if (context->declaringFunction())
         {
-            $$ = EvqIn;
+            $$ = new TStorageQualifierWrapper(EvqIn, @1);
         }
         else if (context->getShaderType() == GL_FRAGMENT_SHADER)
         {
             ES3_OR_NEWER("in", @1, "storage qualifier");
-            $$ = EvqFragmentIn;
+            $$ = new TStorageQualifierWrapper(EvqFragmentIn, @1);
         }
         else if (context->getShaderType() == GL_VERTEX_SHADER)
         {
             ES3_OR_NEWER("in", @1, "storage qualifier");
-            $$ = EvqVertexIn;
+            $$ = new TStorageQualifierWrapper(EvqVertexIn, @1);
         }
         else
         {
-            $$ = EvqComputeIn;
+            $$ = new TStorageQualifierWrapper(EvqComputeIn, @1);
         }
     }
     | OUT_QUAL {
         if (context->declaringFunction())
         {
-            $$ = EvqOut;
+            $$ = new TStorageQualifierWrapper(EvqOut, @1);
         }
         else
         {
@@ -927,11 +927,11 @@
             NON_COMPUTE_ONLY("out", @1);
             if (context->getShaderType() == GL_FRAGMENT_SHADER)
             {
-                $$ = EvqFragmentOut;
+                $$ = new TStorageQualifierWrapper(EvqFragmentOut, @1);
             }
             else
             {
-                $$ = EvqVertexOut;
+                $$ = new TStorageQualifierWrapper(EvqVertexOut, @1);
             }
         }
     }
@@ -940,15 +940,21 @@
         {
             context->error(@1, "invalid inout qualifier", "'inout' can be only used with function parameters");
         }
-        $$ = EvqInOut;
+        $$ = new TStorageQualifierWrapper(EvqInOut, @1);
     }
     | CENTROID {
         ES3_OR_NEWER("centroid", @1, "storage qualifier");
-        $$ = EvqCentroid;
+        $$ = new TStorageQualifierWrapper(EvqCentroid, @1);
     }
     | UNIFORM {
         context->checkIsAtGlobalLevel(@1, "uniform");
-        $$ = EvqUniform;
+        $$ = new TStorageQualifierWrapper(EvqUniform, @1);
+    }
+    | READONLY {
+        $$ = new TMemoryQualifierWrapper(EvqReadOnly, @1);
+    }
+    | WRITEONLY {
+        $$ = new TMemoryQualifierWrapper(EvqWriteOnly, @1);
     }
     ;
 
@@ -1182,6 +1188,42 @@
     | struct_specifier {
         $$ = $1;
     }
+    | IMAGE2D {
+        $$.initialize(EbtImage2D, @1);
+    }
+    | IIMAGE2D {
+        $$.initialize(EbtIImage2D, @1);
+    }
+    | UIMAGE2D {
+        $$.initialize(EbtUImage2D, @1);
+    }
+    | IMAGE3D {
+        $$.initialize(EbtImage3D, @1);
+    }
+    | IIMAGE3D {
+        $$.initialize(EbtIImage3D, @1);
+    }
+    | UIMAGE3D {
+        $$.initialize(EbtUImage3D, @1);
+    }
+    | IMAGE2DARRAY {
+        $$.initialize(EbtImage2DArray, @1);
+    }
+    | IIMAGE2DARRAY {
+        $$.initialize(EbtIImage2DArray, @1);
+    }
+    | UIMAGE2DARRAY {
+        $$.initialize(EbtUImage2DArray, @1);
+    }
+    | IMAGECUBE {
+        $$.initialize(EbtImageCube, @1);
+    }
+    | IIMAGECUBE {
+        $$.initialize(EbtIImageCube, @1);
+    }
+    | UIMAGECUBE {
+        $$.initialize(EbtUImageCube, @1);
+    }
     | TYPE_NAME {
         //
         // This is for user defined type names.  The lexical phase looked up the
diff --git a/src/compiler/translator/glslang_lex.cpp b/src/compiler/translator/glslang_lex.cpp
index 8ad7b14..0e23a0f 100644
--- a/src/compiler/translator/glslang_lex.cpp
+++ b/src/compiler/translator/glslang_lex.cpp
@@ -409,618 +409,414 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[820] =
-    {   0,
-        0,    0,    0,    0,  241,  239,  238,  238,  222,  228,
-      233,  217,  218,  226,  225,  214,  223,  221,  227,  180,
-      180,  215,  211,  229,  216,  230,  234,  177,  219,  220,
-      232,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  212,  231,  213,  224,  237,  236,  240,  235,  208,
-      194,  213,  202,  197,  192,  200,  190,  201,  191,  186,
-      193,  185,  179,  180,    0,  183,    0,  220,  212,  219,
-      209,  205,  207,  206,  210,  177,  198,  204,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+        static yyconst flex_int16_t yy_accept[820] = {
+            0,   0,   0,   0,   0,   241, 239, 238, 238, 222, 228, 233, 217, 218, 226, 225, 214,
+            223, 221, 227, 180, 180, 215, 211, 229, 216, 230, 234, 177, 219, 220, 232, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 212, 231, 213, 224, 237, 236, 240, 235, 208, 194, 213, 202, 197, 192, 200, 190,
+            201, 191, 186, 193, 185, 179, 180, 0,   183, 0,   220, 212, 219, 209, 205, 207, 206,
+            210, 177, 198, 204, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
 
-       12,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,   15,  177,  177,   23,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  199,  203,  235,    0,  189,  185,    0,  188,  182,
-        0,  184,  178,  195,  196,  177,  136,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-       13,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+            12,  177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 15,  177, 177,
+            23,  177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            199, 203, 235, 0,   189, 185, 0,   188, 182, 0,   184, 178, 195, 196, 177, 136, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 13,  177, 177, 177, 177, 177, 177, 177, 177, 177,
 
-      177,   27,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,   24,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,    0,  186,
-        0,  185,  187,  181,  177,  177,  177,   30,  177,  177,
-       18,  174,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,   16,  139,  177,  177,  177,  177,   21,  177,
-      177,  143,  155,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  152,    4,   35,   36,   37,
+            177, 27,  177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 24,  177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 0,   186, 0,
+            185, 187, 181, 177, 177, 177, 30,  177, 177, 18,  174, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 16,  139, 177, 177, 177, 177, 21,  177, 177, 143, 155, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 152, 4,   35,  36,  37,
 
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  142,   31,  177,  177,   28,  177,
-      177,  177,  177,  177,  177,  177,   47,   48,   49,   29,
-      177,  177,  177,  177,  177,  177,   10,   53,   54,   55,
-      177,  137,  177,  177,    7,  177,  177,  177,  177,  164,
-      165,  166,  177,   32,  177,  156,   26,  167,  168,  169,
-        2,  161,  162,  163,  177,  177,  177,   25,  159,  177,
-      177,  177,   50,   51,   52,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,   86,  177,  177,  177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 142, 31,  177, 177, 28,  177, 177, 177, 177, 177,
+            177, 177, 47,  48,  49,  29,  177, 177, 177, 177, 177, 177, 10,  53,  54,  55,  177,
+            137, 177, 177, 7,   177, 177, 177, 177, 164, 165, 166, 177, 32,  177, 156, 26,  167,
+            168, 169, 2,   161, 162, 163, 177, 177, 177, 25,  159, 177, 177, 177, 50,  51,  52,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 98,  177, 177, 177,
 
-      177,  177,  177,  177,  153,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  138,  177,  177,  176,
-       56,   57,   58,  177,  177,   14,  177,   91,  177,  177,
-      177,  177,   89,  177,  177,  177,  154,  149,   92,  177,
-      177,  177,  177,  177,  177,  144,  177,  177,  177,   78,
-       38,   41,   43,   42,   39,   45,   44,   46,   40,  177,
-      177,  177,  177,  160,  135,  177,  177,  147,  177,  177,
-      177,   34,   87,  173,   22,  148,   77,  177,  158,   17,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,   19,   33,  177,  177,  177,  177,
+            177, 177, 177, 177, 153, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 138,
+            177, 177, 176, 56,  57,  58,  177, 177, 14,  177, 103, 177, 177, 177, 177, 101, 177,
+            177, 177, 154, 149, 104, 177, 177, 177, 177, 177, 177, 144, 177, 177, 177, 78,  38,
+            41,  43,  42,  39,  45,  44,  46,  40,  177, 177, 177, 177, 160, 135, 177, 177, 147,
+            177, 177, 177, 34,  99,  173, 22,  148, 77,  177, 158, 17,  177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 19,  33,  177, 177, 177, 177,
 
-      177,  177,   93,   94,   95,  177,  177,  177,  177,  177,
-        3,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  140,  177,  177,  177,  177,  177,    8,  177,
-      177,    9,  177,  177,  177,  177,   20,   79,   11,  150,
-       97,   98,   99,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  145,  177,  177,  177,   81,
-       83,   80,  177,  177,  177,  177,  177,  177,  177,  141,
-      101,  102,  103,  177,  177,  157,  177,  146,  177,  177,
-        6,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-       96,  151,    1,  177,  177,  177,  177,  177,  175,  177,
+            177, 177, 105, 79,  85,  177, 177, 177, 177, 177, 3,   177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 140, 177, 177, 177, 177, 177, 8,   177, 177, 9,   177, 177,
+            177, 177, 20,  93,  11,  150, 106, 80,  87,  177, 177, 177, 177, 177, 177, 177, 177,
+            177, 177, 177, 177, 145, 177, 177, 177, 91,  95,  94,  177, 177, 177, 177, 177, 177,
+            177, 141, 107, 81,  86,  177, 177, 157, 177, 146, 177, 177, 6,   177, 177, 177, 177,
+            177, 177, 177, 177, 177, 90,  151, 1,   177, 177, 177, 177, 177, 175, 177,
 
-       90,    5,  170,   59,   62,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  177,   82,  177,
-      177,  177,  177,  100,  177,  177,  177,  177,  177,  120,
-       66,   67,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,   88,  177,  177,  177,  104,
-      122,   70,   71,  177,  177,   84,  177,  177,  177,  177,
-      177,  177,  177,  115,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  129,  177,  177,  177,  177,   60,
-      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  116,  105,  177,  106,  177,  177,  177,  130,
+            102, 5,   170, 59,  62,  177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177,
+            177, 92,  177, 177, 177, 177, 88,  177, 177, 177, 177, 177, 120, 66,  67,  177, 177,
+            177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 100, 177, 177, 177, 89,  122,
+            70,  71,  177, 177, 96,  177, 177, 177, 177, 177, 177, 177, 115, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 129, 177, 177, 177, 177, 60,  177, 177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 177, 116, 108, 177, 82,  177, 177, 177, 130,
 
-      177,  177,   68,  177,  177,  177,  177,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  117,  177,  177,  131,
-      177,  177,   72,  107,  108,  177,  111,  177,  112,  177,
-      177,  177,  177,  177,   85,  177,  177,  177,  177,   64,
-      177,   63,  126,  177,  177,  109,  110,  177,  177,  177,
-      177,  177,  177,  177,  177,  177,  177,  124,  127,  118,
-      177,   65,  177,  177,  177,  177,  177,  177,  177,  177,
-      125,  128,  177,  177,  121,   69,  177,  177,  171,  177,
-      177,  177,   74,  177,  177,  123,   73,  177,  177,  177,
-      177,  177,  177,  132,  177,  177,  177,  177,  177,  177,
+            177, 177, 68,  177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 117,
+            177, 177, 131, 177, 177, 72,  109, 83,  177, 111, 177, 112, 177, 177, 177, 177, 177,
+            97,  177, 177, 177, 177, 64,  177, 63,  126, 177, 177, 110, 84,  177, 177, 177, 177,
+            177, 177, 177, 177, 177, 177, 124, 127, 118, 177, 65,  177, 177, 177, 177, 177, 177,
+            177, 177, 125, 128, 177, 177, 121, 69,  177, 177, 171, 177, 177, 177, 74,  177, 177,
+            123, 73,  177, 177, 177, 177, 177, 177, 132, 177, 177, 177, 177, 177, 177,
 
-      133,  177,  177,  177,   75,  177,  134,  113,  114,  177,
-      177,  177,   61,  177,  177,  172,  119,   76,    0
-    } ;
+            133, 177, 177, 177, 75,  177, 134, 113, 114, 177, 177, 177, 61,  177, 177, 172, 119,
+            76,  0};
 
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
-        2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    4,    1,    1,    1,    5,    6,    1,    7,
-        8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
-       18,   19,   20,   20,   20,   21,   21,   22,   23,   24,
-       25,   26,   27,    1,   28,   29,   30,   31,   32,   33,
-       34,   34,   34,   34,   34,   34,   35,   34,   36,   34,
-       34,   37,   38,   34,   39,   34,   34,   40,   34,   34,
-       41,    1,   42,   43,   44,    1,   45,   46,   47,   48,
+        static yyconst flex_int32_t yy_ec[256] = {
+            0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  3,  2,  2,  2,  1,  1,  1,  1,  1,  1,  1,
+            1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  4,  1,  1,  1,  5,  6,  1,  7,  8,
+            9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 21, 21, 22, 23, 24, 25, 26,
+            27, 1,  28, 29, 30, 31, 32, 33, 34, 34, 34, 34, 34, 34, 35, 34, 36, 34, 34, 37, 38,
+            34, 39, 34, 34, 40, 34, 34, 41, 1,  42, 43, 44, 1,  45, 46, 47, 48,
 
-       49,   50,   51,   52,   53,   34,   54,   55,   56,   57,
-       58,   59,   34,   60,   61,   62,   63,   64,   65,   66,
-       67,   68,   69,   70,   71,   72,    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,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+            49, 50, 51, 52, 53, 34, 54, 55, 56, 57, 58, 59, 34, 60, 61, 62, 63, 64, 65, 66, 67,
+            68, 69, 70, 71, 72, 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,  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,    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,  1};
 
-static yyconst flex_int32_t yy_meta[73] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    2,    2,    2,    2,    2,    2,
-        2,    1,    1,    1,    1,    1,    1,    3,    3,    3,
-        3,    2,    2,    4,    4,    4,    4,    4,    4,    4,
-        1,    1,    1,    4,    3,    3,    3,    3,    2,    2,
-        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
-        4,    4,    4,    4,    4,    4,    4,    4,    1,    1,
-        1,    1
-    } ;
+        static yyconst flex_int32_t yy_meta[73] = {
+            0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
+            1, 1, 1, 3, 3, 3, 3, 2, 2, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 4, 3, 3, 3, 3, 2,
+            2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1};
 
-static yyconst flex_int16_t yy_base[825] =
-    {   0,
-        0,    0,   72,    0, 1016, 1017, 1017, 1017,  990,  120,
-      141, 1017, 1017,  989,  138, 1017,  137,  135,  988,  154,
-      208,  986, 1017,  154,  986,  132, 1017,    0, 1017, 1017,
-      139,  130,  123,  140,  147,  133,  177,  952,  186,  151,
-      139,  116,  161,  946,  173,  959,  193,  199,  208,  215,
-      108, 1017,  184, 1017, 1017, 1017, 1017, 1017,    0, 1017,
-     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,  230,
-     1017,  235,  235,    0,  271, 1017,    0, 1017, 1017, 1017,
-      982, 1017, 1017, 1017,  981,    0, 1017, 1017,  943,  948,
-      152,  945,  953,  952,  939,  942,  953,  243,  947,  935,
+        static yyconst flex_int16_t yy_base[825] = {
+            0,    0,    0,    72,   0,    1016, 1017, 1017, 1017, 990,  120,  141,  1017,
+            1017, 989,  138,  1017, 137,  135,  988,  154,  208,  986,  1017, 154,  986,
+            132,  1017, 0,    1017, 1017, 139,  130,  123,  140,  147,  133,  177,  952,
+            186,  151,  139,  116,  161,  946,  173,  959,  193,  199,  208,  215,  108,
+            1017, 184,  1017, 1017, 1017, 1017, 1017, 0,    1017, 1017, 1017, 1017, 1017,
+            1017, 1017, 1017, 1017, 1017, 230,  1017, 235,  235,  0,    271,  1017, 0,
+            1017, 1017, 1017, 982,  1017, 1017, 1017, 981,  0,    1017, 1017, 943,  948,
+            152,  945,  953,  952,  939,  942,  953,  243,  947,  935,
 
-      932,  945,  932,  929,  929,  935,  147,  248,  929,  939,
-      925,  931,  934,  935,    0,  927,  937,  249,  936,  931,
-      912,  177,  916,  929,  920,  184,  913,  250,  925,  927,
-      257,  916,  913,  902,  911,  249,  257,  915,  911,  913,
-      902,  905,  196,  217,  269,  914,  902,  914,  262,  907,
-      906, 1017, 1017,    0,  311, 1017,  292,  328, 1017, 1017,
-      335,  342,  257, 1017, 1017,  905,    0,  901,  896,  900,
-      909,  906,  315,  890,  890,  901,  893,  215,  903,  900,
-      900,  898,  895,  887,  893,  880,  878,  890,  876,  892,
-        0,  889,  877,  884,  881,  885,  886,  879,  876,  865,
+            932,  945,  932,  929,  929,  935,  147,  248,  929,  939,  925,  931,  934,
+            935,  0,    927,  937,  249,  936,  931,  912,  177,  916,  929,  920,  184,
+            913,  250,  925,  927,  257,  916,  913,  902,  911,  249,  257,  915,  911,
+            913,  902,  905,  196,  217,  269,  914,  902,  914,  262,  907,  906,  1017,
+            1017, 0,    311,  1017, 292,  328,  1017, 1017, 335,  342,  257,  1017, 1017,
+            905,  0,    901,  896,  900,  909,  906,  315,  890,  890,  901,  893,  215,
+            903,  900,  900,  898,  895,  887,  893,  880,  878,  890,  876,  892,  0,
+            889,  877,  884,  881,  885,  886,  879,  876,  865,
 
-      864,  877,  880,  868,  876,  864,  870,  861,  316,  866,
-      869,  860,  867,  856,  860,  851,  865,  864,  855,  861,
-      307,  845,  848,  846,  856,  846,  841,  839,  841,  851,
-      837,  839,  836,  847,  846,  849,  831,  316,  839,  835,
-      833,  842,  821,  353,  839,  841,  830,  822,  363,  370,
-      378,  389, 1017, 1017,  819,  829,  828,    0,  826,  383,
-        0,    0,  819,  817,  817,  818,  813,  821,  810,  827,
-      816,  394,    0,    0,  810,  820,  819,  819,    0,  804,
-      397,    0,    0,  806,  400,  813,  814,  805,  799,  798,
-      799,  798,  798,  406,  793,    0,    0,  789,  788,  787,
+            864,  877,  880,  868,  876,  864,  870,  861,  316,  866,  869,  860,  867,
+            856,  860,  851,  865,  864,  855,  861,  307,  845,  848,  846,  856,  846,
+            841,  839,  841,  851,  837,  839,  836,  847,  846,  849,  831,  316,  839,
+            835,  833,  842,  821,  353,  839,  841,  830,  822,  363,  370,  378,  389,
+            1017, 1017, 819,  829,  828,  0,    826,  383,  0,    0,    819,  817,  817,
+            818,  813,  821,  810,  827,  816,  394,  0,    0,    810,  820,  819,  819,
+            0,    804,  397,  0,    0,    806,  400,  813,  814,  805,  799,  798,  799,
+            798,  798,  406,  793,  0,    0,    789,  788,  787,
 
-      789,  790,  795,  789,  785,  798,  793,  793,  791,  790,
-      784,  778,  780,  779,  783,  775,  778,  773,  781,  786,
-      774,  771,  783,  774,    0,    0,  780,  776,    0,  768,
-      768,  773,  764,  771,  409,  768,    0,    0,    0,    0,
-      758,  770,  769,  768,  769,  769,    0,    0,    0,    0,
-      756,    0,  764,  755,    0,  754,  755,  749,  759,    0,
-        0,    0,  750,    0,  746,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  756,  413,  755,    0,    0,  753,
-      749,  746,    0,    0,    0,  738,  415,  418,  427,  743,
-      739,  744,  735,  733,  746,  731,    0,  731,  744,  733,
+            789,  790,  795,  789,  785,  798,  793,  793,  791,  790,  784,  778,  780,
+            779,  783,  775,  778,  773,  781,  786,  774,  771,  783,  774,  0,    0,
+            780,  776,  0,    768,  768,  773,  764,  771,  409,  768,  0,    0,    0,
+            0,    758,  770,  769,  768,  769,  769,  0,    0,    0,    0,    756,  0,
+            764,  755,  0,    754,  755,  749,  759,  0,    0,    0,    750,  0,    746,
+            0,    0,    0,    0,    0,    0,    0,    0,    0,    756,  413,  755,  0,
+            0,    753,  749,  746,  0,    0,    0,    738,  415,  418,  427,  743,  739,
+            744,  735,  733,  746,  731,  0,    731,  744,  733,
 
-      729,  735,  730,  737,    0,  735,  732,  736,  720,  718,
-      721,  727,  733,  728,  727,  715,    0,  717,  718,    0,
-        0,    0,    0,  715,  718,    0,  712,    0,  725,  705,
-      714,  709,    0,  702,  702,  715,    0,  717,    0,  431,
-      730,  729,  728,  695,  694,    0,  711,  710,  705,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  694,
-      707,  694,  691,    0,    0,  696,  695,    0,  692,  699,
-      698,    0,  684,    0,    0,    0,    0,  681,    0,    0,
-      680,  691,  434,  684,  690,  689,  686,  681,  678,  671,
-      671,  684,  669,  681,    0,    0,  674,  697,  696,  695,
+            729,  735,  730,  737,  0,    735,  732,  736,  720,  718,  721,  727,  733,
+            728,  727,  715,  0,    717,  718,  0,    0,    0,    0,    715,  718,  0,
+            712,  0,    725,  705,  714,  709,  0,    702,  702,  715,  0,    717,  0,
+            431,  730,  729,  728,  695,  694,  0,    711,  710,  705,  0,    0,    0,
+            0,    0,    0,    0,    0,    0,    0,    694,  707,  694,  691,  0,    0,
+            696,  695,  0,    692,  699,  698,  0,    684,  0,    0,    0,    0,    681,
+            0,    0,    680,  691,  434,  684,  690,  689,  686,  681,  678,  671,  671,
+            684,  669,  681,  0,    0,    674,  697,  696,  695,
 
-      662,  661,  427,  428,    0,  673,  676,  674,  663,  659,
-        0,  671,  668,  667,  657,  656,  646,  663,  649,  441,
-      657,  660,    0,  677,  676,  675,  642,  641,    0,  655,
-      642,    0,  652,  645,  646,  649,    0,    0,    0,    0,
-      669,  668,    0,  645,  648,  633,  640,  631,  638,  639,
-      639,  638,  624,  451,  636,    0,  637,  626,  625,    0,
-        0,    0,  650,  649,  648,  615,  614,  610,  618,    0,
-      646,  645,    0,  622,  625,    0,  458,    0,  603,  612,
-        0,  608,  607,  616,  616,  604,  618,  602,  616,  611,
-        0,    0,    0,  628,  627,  626,  593,  592,    0,  592,
+            662,  661,  427,  428,  0,    673,  676,  674,  663,  659,  0,    671,  668,
+            667,  657,  656,  646,  663,  649,  441,  657,  660,  0,    677,  676,  675,
+            642,  641,  0,    655,  642,  0,    652,  645,  646,  649,  0,    0,    0,
+            0,    669,  668,  0,    645,  648,  633,  640,  631,  638,  639,  639,  638,
+            624,  451,  636,  0,    637,  626,  625,  0,    0,    0,    650,  649,  648,
+            615,  614,  610,  618,  0,    646,  645,  0,    622,  625,  0,    458,  0,
+            603,  612,  0,    608,  607,  616,  616,  604,  618,  602,  616,  611,  0,
+            0,    0,    628,  627,  626,  593,  592,  0,    592,
 
-        0,    0,  434,  454,  616,  602,  605,  588,  600,  588,
-      587,  596,  596,  613,  612,  611,  578,  577,    0,  577,
-      578,  577,  587,    0,  590,  586,  588,  584,  571,  602,
-      449,    0,  579,  582,  574,  566,  573,  564,  585,  573,
-      569,  571,  569,  569,  568,    0,  556,  555,  565,    0,
-      585,  462,    0,  562,  565,    0,  565,  564,  548,  540,
-      548,  538,  546,    0,  543,  542,  563,  551,  549,  549,
-      533,  536,  550,  534,  565,  545,  546,  543,  540,  550,
-      527,  541,  540,  524,  523,  522,  543,  531,  529,  529,
-      510,  509,    0,  537,  509,  535,  507,  511,  510,  541,
+            0,    0,    434,  454,  616,  602,  605,  588,  600,  588,  587,  596,  596,
+            613,  612,  611,  578,  577,  0,    577,  578,  577,  587,  0,    590,  586,
+            588,  584,  571,  602,  449,  0,    579,  582,  574,  566,  573,  564,  585,
+            573,  569,  571,  569,  569,  568,  0,    556,  555,  565,  0,    585,  462,
+            0,    562,  565,  0,    565,  564,  548,  540,  548,  538,  546,  0,    543,
+            542,  563,  551,  549,  549,  533,  536,  550,  534,  565,  545,  546,  543,
+            540,  550,  527,  541,  540,  524,  523,  522,  543,  531,  529,  529,  510,
+            509,  0,    537,  509,  535,  507,  511,  510,  541,
 
-      521,  518,    0,  517,  520,  516,  518,  502,  499,  512,
-      497,  498,  505,  499,  488,  487,    0,  493,  492,  523,
-      503,  500,    0,    0,    0,  496,    0,  495,    0,  501,
-      500,  484,  481,  482,    0,  474,  482,  472,  478,  499,
-      478,    0,    0,  490,  489,    0,    0,  488,  487,  471,
-      468,  469,  483,  482,  459,  458,  464,    0,    0,  485,
-      457,  483,  475,  467,  453,  132,  161,  177,  215,  245,
-        0,    0,  288,  289,    0,    0,  294,  315,    0,  316,
-      306,  331,    0,  363,  402,    0,    0,  395,  383,  395,
-      387,  433,  434,    0,  435,  420,  461,  427,  430,  431,
+            521,  518,  0,    517,  520,  516,  518,  502,  499,  512,  497,  498,  505,
+            499,  488,  487,  0,    493,  492,  523,  503,  500,  0,    0,    0,    496,
+            0,    495,  0,    501,  500,  484,  481,  482,  0,    474,  482,  472,  478,
+            499,  478,  0,    0,    490,  489,  0,    0,    488,  487,  471,  468,  469,
+            483,  482,  459,  458,  464,  0,    0,    485,  457,  483,  475,  467,  453,
+            132,  161,  177,  215,  245,  0,    0,    288,  289,  0,    0,    294,  315,
+            0,    316,  306,  331,  0,    363,  402,  0,    0,    395,  383,  395,  387,
+            433,  434,  0,    435,  420,  461,  427,  430,  431,
 
-        0,  450,  452,  443,    0,  464,    0,    0,    0,  445,
-      446,  440,    0,  441,  442,    0,    0,    0, 1017,  506,
-      509,  512,  513,  514
-    } ;
+            0,    450,  452,  443,  0,    464,  0,    0,    0,    445,  446,  440,  0,
+            441,  442,  0,    0,    0,    1017, 506,  509,  512,  513,  514};
 
-static yyconst flex_int16_t yy_def[825] =
-    {   0,
-      819,    1,  819,    3,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  820,  819,  819,
-      819,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  819,  819,  819,  819,  819,  819,  819,  821,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  822,
-      819,  823,   20,   21,  819,  819,  824,  819,  819,  819,
-      819,  819,  819,  819,  819,  820,  819,  819,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+        static yyconst flex_int16_t yy_def[825] = {
+            0,   819, 1,   819, 3,   819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 820, 819, 819, 819, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 819, 819, 819, 819, 819, 819, 819, 821, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 822, 819, 823, 20,  21,  819, 819, 824, 819, 819, 819, 819, 819, 819, 819,
+            819, 820, 819, 819, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  819,  819,  821,  819,  819,  823,  819,  819,  819,
-      819,  819,  824,  819,  819,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            819, 819, 821, 819, 819, 823, 819, 819, 819, 819, 819, 824, 819, 819, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  819,  819,
-      819,  819,  819,  819,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 819, 819, 819,
+            819, 819, 819, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
 
-      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
-      820,  820,  820,  820,  820,  820,  820,  820,    0,  819,
-      819,  819,  819,  819
-    } ;
+            820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820,
+            820, 0,   819, 819, 819, 819, 819};
 
-static yyconst flex_int16_t yy_nxt[1090] =
-    {   0,
-        6,    7,    8,    9,   10,   11,   12,   13,   14,   15,
-       16,   17,   18,   19,   20,   21,   21,   21,   21,   21,
-       21,   22,   23,   24,   25,   26,   27,   28,   28,   28,
-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-       29,   30,   31,   28,   32,   33,   34,   35,   36,   37,
-       38,   39,   40,   28,   41,   42,   43,   44,   45,   46,
-       47,   48,   49,   50,   51,   28,   28,   28,   52,   53,
-       54,   55,   56,   57,   58,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   59,
+        static yyconst flex_int16_t yy_nxt[1090] = {
+            0,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,
+            21,  21,  21,  21,  21,  22,  23,  24,  25,  26,  27,  28,  28,  28,  28,  28,  28,
+            28,  28,  28,  28,  28,  28,  28,  29,  30,  31,  28,  32,  33,  34,  35,  36,  37,
+            38,  39,  40,  28,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  28,  28,
+            28,  52,  53,  54,  55,  56,  57,  58,  56,  56,  56,  56,  56,  56,  56,  56,  56,
+            56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  56,  59,
 
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   56,   56,   56,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
-       56,   56,   56,   56,   61,   62,   63,   66,   68,   70,
-       70,   70,   70,   70,   70,   70,   84,   85,   79,  150,
-      123,   69,   67,   87,  124,   64,   72,  151,   73,   73,
-       73,   73,   73,   73,   74,   80,   89,   81,   82,  784,
-       92,   88,   93,  121,   95,   75,   94,  103,   96,  104,
-       90,   91,   76,   77,   97,   99,  122,   98,  105,  100,
+            59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  56,  56,  56,  59,  59,
+            59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,  59,
+            59,  59,  59,  59,  59,  59,  56,  56,  56,  56,  61,  62,  63,  66,  68,  70,  70,
+            70,  70,  70,  70,  70,  84,  85,  79,  150, 123, 69,  67,  87,  124, 64,  72,  151,
+            73,  73,  73,  73,  73,  73,  74,  80,  89,  81,  82,  784, 92,  88,  93,  121, 95,
+            75,  94,  103, 96,  104, 90,  91,  76,  77,  97,  99,  122, 98,  105, 100,
 
-      115,  187,   75,  116,  101,  125,  117,  118,  152,  168,
-      102,  119,  188,  169,  120,  785,   76,  128,  126,   77,
-       72,  106,   74,   74,   74,   74,   74,   74,   74,  107,
-      112,  108,  129,  207,  109,  130,  212,  132,  113,   75,
-      110,  208,  213,  786,  133,  134,   76,  139,  135,  114,
-      140,  236,  237,  153,  136,  137,   75,  138,  141,  147,
-      143,  155,  156,  148,  144,  142,  158,  159,  145,  238,
-       76,  146,  149,  160,  819,  267,  268,  239,  155,  156,
-      161,  787,  161,  158,  159,  162,  162,  162,  162,  162,
-      162,  162,  189,  227,  176,  254,  215,  160,  177,  178,
+            115, 187, 75,  116, 101, 125, 117, 118, 152, 168, 102, 119, 188, 169, 120, 785, 76,
+            128, 126, 77,  72,  106, 74,  74,  74,  74,  74,  74,  74,  107, 112, 108, 129, 207,
+            109, 130, 212, 132, 113, 75,  110, 208, 213, 786, 133, 134, 76,  139, 135, 114, 140,
+            236, 237, 153, 136, 137, 75,  138, 141, 147, 143, 155, 156, 148, 144, 142, 158, 159,
+            145, 238, 76,  146, 149, 160, 819, 267, 268, 239, 155, 156, 161, 787, 161, 158, 159,
+            162, 162, 162, 162, 162, 162, 162, 189, 227, 176, 254, 215, 160, 177, 178,
 
-      819,  220,  229,  199,  788,  190,  200,  201,  228,  216,
-      202,  217,  203,  240,  245,  230,  246,  221,  222,  254,
-      249,  241,  249,  158,  159,  250,  250,  250,  250,  250,
-      250,  250,  298,  299,  300,  789,  790,  251,  791,  251,
-      158,  159,  252,  252,  252,  252,  252,  252,  252,  162,
-      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
-      162,  162,  162,  261,  312,  330,  792,  793,  313,  337,
-      338,  339,  794,  331,  253,  795,  262,  250,  250,  250,
-      250,  250,  250,  250,  250,  250,  250,  250,  250,  250,
-      250,  253,  252,  252,  252,  252,  252,  252,  252,  348,
+            819, 220, 229, 199, 788, 190, 200, 201, 228, 216, 202, 217, 203, 240, 245, 230, 246,
+            221, 222, 254, 249, 241, 249, 158, 159, 250, 250, 250, 250, 250, 250, 250, 298, 299,
+            300, 789, 790, 251, 791, 251, 158, 159, 252, 252, 252, 252, 252, 252, 252, 162, 162,
+            162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 261, 312, 330, 792, 793,
+            313, 337, 338, 339, 794, 331, 253, 795, 262, 250, 250, 250, 250, 250, 250, 250, 250,
+            250, 250, 250, 250, 250, 250, 253, 252, 252, 252, 252, 252, 252, 252, 348,
 
-      349,  350,  156,  252,  252,  252,  252,  252,  252,  252,
-      360,  361,  362,  368,  369,  370,  372,  373,  374,  156,
-      796,  159,  383,  384,  385,  421,  422,  423,  441,  442,
-      443,  451,  452,  453,  454,  455,  456,  797,  159,  798,
-      799,  444,  445,  457,  458,  459,  498,  499,  500,  524,
-      525,  526,  800,  801,  546,  548,  563,  564,  565,  501,
-      502,  636,  527,  528,  547,  549,  594,  595,  596,  566,
-      567,  637,  568,  614,  615,  616,  666,  802,  803,  597,
-      598,  638,  804,  667,  805,  668,  617,  618,  639,  686,
-      640,  641,  806,  807,  808,  809,  687,  810,  688,  811,
+            349, 350, 156, 252, 252, 252, 252, 252, 252, 252, 360, 361, 362, 368, 369, 370, 372,
+            373, 374, 156, 796, 159, 383, 384, 385, 421, 422, 423, 441, 442, 443, 451, 452, 453,
+            454, 455, 456, 797, 159, 798, 799, 444, 445, 457, 458, 459, 498, 499, 500, 524, 525,
+            526, 800, 801, 546, 548, 563, 564, 565, 501, 502, 636, 527, 528, 547, 549, 594, 595,
+            596, 566, 567, 637, 568, 614, 615, 616, 666, 802, 803, 597, 598, 638, 804, 667, 805,
+            668, 617, 618, 639, 686, 640, 641, 806, 807, 808, 809, 687, 810, 688, 811,
 
-      812,  813,  814,  815,  816,  817,  818,   86,   86,   86,
-      154,  154,  154,   70,  157,  163,  163,  783,  782,  781,
-      780,  779,  778,  777,  776,  775,  774,  773,  772,  771,
-      770,  769,  768,  767,  766,  765,  764,  763,  762,  761,
-      760,  759,  758,  757,  756,  755,  754,  753,  752,  751,
-      750,  749,  748,  747,  746,  745,  744,  743,  742,  741,
-      740,  739,  738,  737,  736,  735,  734,  733,  732,  731,
-      730,  729,  728,  727,  726,  725,  724,  723,  722,  721,
-      720,  719,  718,  717,  716,  715,  714,  713,  712,  711,
-      710,  709,  708,  707,  706,  705,  704,  703,  702,  701,
+            812, 813, 814, 815, 816, 817, 818, 86,  86,  86,  154, 154, 154, 70,  157, 163, 163,
+            783, 782, 781, 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, 767,
+            766, 765, 764, 763, 762, 761, 760, 759, 758, 757, 756, 755, 754, 753, 752, 751, 750,
+            749, 748, 747, 746, 745, 744, 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, 733,
+            732, 731, 730, 729, 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, 716,
+            715, 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701,
 
-      700,  699,  698,  697,  696,  695,  694,  693,  692,  691,
-      690,  689,  685,  684,  683,  682,  681,  680,  679,  678,
-      677,  676,  675,  674,  673,  672,  671,  670,  669,  665,
-      664,  663,  662,  661,  660,  659,  658,  657,  656,  655,
-      654,  653,  652,  651,  650,  649,  648,  647,  646,  645,
-      644,  643,  642,  635,  634,  633,  632,  631,  630,  629,
-      628,  627,  626,  625,  624,  623,  622,  621,  620,  619,
-      613,  612,  611,  610,  609,  608,  607,  606,  605,  604,
-      603,  602,  601,  600,  599,  593,  592,  591,  590,  589,
-      588,  587,  586,  585,  584,  583,  582,  581,  580,  579,
+            700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 685, 684, 683, 682, 681,
+            680, 679, 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, 665, 664, 663, 662, 661,
+            660, 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, 649, 648, 647, 646, 645, 644,
+            643, 642, 635, 634, 633, 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, 622, 621,
+            620, 619, 613, 612, 611, 610, 609, 608, 607, 606, 605, 604, 603, 602, 601, 600, 599,
+            593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579,
 
-      578,  577,  576,  575,  574,  573,  572,  571,  570,  569,
-      562,  561,  560,  559,  558,  557,  556,  555,  554,  553,
-      552,  551,  550,  545,  544,  543,  542,  541,  540,  539,
-      538,  537,  536,  535,  534,  533,  532,  531,  530,  529,
-      523,  522,  521,  520,  519,  518,  517,  516,  515,  514,
-      513,  512,  511,  510,  509,  508,  507,  506,  505,  504,
-      503,  497,  496,  495,  494,  493,  492,  491,  490,  489,
-      488,  487,  486,  485,  484,  483,  482,  481,  480,  479,
-      478,  477,  476,  475,  474,  473,  472,  471,  470,  469,
-      468,  467,  466,  465,  464,  463,  462,  461,  460,  450,
+            578, 577, 576, 575, 574, 573, 572, 571, 570, 569, 562, 561, 560, 559, 558, 557, 556,
+            555, 554, 553, 552, 551, 550, 545, 544, 543, 542, 541, 540, 539, 538, 537, 536, 535,
+            534, 533, 532, 531, 530, 529, 523, 522, 521, 520, 519, 518, 517, 516, 515, 514, 513,
+            512, 511, 510, 509, 508, 507, 506, 505, 504, 503, 497, 496, 495, 494, 493, 492, 491,
+            490, 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, 477, 476, 475, 474,
+            473, 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, 462, 461, 460, 450,
 
-      449,  448,  447,  446,  440,  439,  438,  437,  436,  435,
-      434,  433,  432,  431,  430,  429,  428,  427,  426,  425,
-      424,  420,  419,  418,  417,  416,  415,  414,  413,  412,
-      411,  410,  409,  408,  407,  406,  405,  404,  403,  402,
-      401,  400,  399,  398,  397,  396,  395,  394,  393,  392,
-      391,  390,  389,  388,  387,  386,  382,  381,  380,  379,
-      378,  377,  376,  375,  371,  367,  366,  365,  364,  363,
-      359,  358,  357,  356,  355,  354,  353,  352,  351,  347,
-      346,  345,  344,  343,  342,  341,  340,  336,  335,  334,
-      333,  332,  329,  328,  327,  326,  325,  324,  323,  322,
+            449, 448, 447, 446, 440, 439, 438, 437, 436, 435, 434, 433, 432, 431, 430, 429, 428,
+            427, 426, 425, 424, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408,
+            407, 406, 405, 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, 394, 393, 392, 391,
+            390, 389, 388, 387, 386, 382, 381, 380, 379, 378, 377, 376, 375, 371, 367, 366, 365,
+            364, 363, 359, 358, 357, 356, 355, 354, 353, 352, 351, 347, 346, 345, 344, 343, 342,
+            341, 340, 336, 335, 334, 333, 332, 329, 328, 327, 326, 325, 324, 323, 322,
 
-      321,  320,  319,  318,  317,  316,  315,  314,  311,  310,
-      309,  308,  307,  306,  305,  304,  303,  302,  301,  297,
-      296,  295,  294,  293,  292,  291,  290,  289,  288,  287,
-      286,  285,  284,  283,  282,  281,  280,  279,  278,  277,
-      276,  275,  274,  273,  272,  271,  270,  269,  266,  265,
-      264,  263,  260,  259,  258,  257,  256,  255,  248,  247,
-      244,  243,  242,  235,  234,  233,  232,  231,  226,  225,
-      224,  223,  219,  218,  214,  211,  210,  209,  206,  205,
-      204,  198,  197,  196,  195,  194,  193,  192,  191,  186,
-      185,  184,  183,  182,  181,  180,  179,  175,  174,  173,
+            321, 320, 319, 318, 317, 316, 315, 314, 311, 310, 309, 308, 307, 306, 305, 304, 303,
+            302, 301, 297, 296, 295, 294, 293, 292, 291, 290, 289, 288, 287, 286, 285, 284, 283,
+            282, 281, 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, 270, 269, 266, 265, 264,
+            263, 260, 259, 258, 257, 256, 255, 248, 247, 244, 243, 242, 235, 234, 233, 232, 231,
+            226, 225, 224, 223, 219, 218, 214, 211, 210, 209, 206, 205, 204, 198, 197, 196, 195,
+            194, 193, 192, 191, 186, 185, 184, 183, 182, 181, 180, 179, 175, 174, 173,
 
-      172,  171,  170,  167,  166,  165,  164,  131,  127,  111,
-       83,   78,   71,   65,   60,  819,    5,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819
-    } ;
+            172, 171, 170, 167, 166, 165, 164, 131, 127, 111, 83,  78,  71,  65,  60,  819, 5,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819};
 
-static yyconst flex_int16_t yy_chk[1090] =
-    {   0,
-        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,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        static yyconst flex_int16_t yy_chk[1090] = {
+            0,   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,   1,   1,   1,   1,   1,   1,
+            1,   1,   1,   1,   1,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+            3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
 
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
-        3,    3,    3,    3,   10,   10,   11,   15,   17,   18,
-       18,   18,   18,   18,   18,   18,   26,   26,   24,   51,
-       42,   17,   15,   31,   42,   11,   20,   51,   20,   20,
-       20,   20,   20,   20,   20,   24,   32,   24,   24,  766,
-       33,   31,   33,   41,   34,   20,   33,   36,   34,   36,
-       32,   32,   20,   20,   34,   35,   41,   34,   36,   35,
+            3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+            3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
+            3,   3,   3,   3,   3,   3,   3,   3,   3,   3,   10,  10,  11,  15,  17,  18,  18,
+            18,  18,  18,  18,  18,  26,  26,  24,  51,  42,  17,  15,  31,  42,  11,  20,  51,
+            20,  20,  20,  20,  20,  20,  20,  24,  32,  24,  24,  766, 33,  31,  33,  41,  34,
+            20,  33,  36,  34,  36,  32,  32,  20,  20,  34,  35,  41,  34,  36,  35,
 
-       40,  107,   20,   40,   35,   43,   40,   40,   53,   91,
-       35,   40,  107,   91,   40,  767,   20,   45,   43,   20,
-       21,   37,   21,   21,   21,   21,   21,   21,   21,   37,
-       39,   37,   45,  122,   37,   45,  126,   47,   39,   21,
-       37,  122,  126,  768,   47,   47,   21,   48,   47,   39,
-       48,  143,  143,   53,   47,   47,   21,   47,   48,   50,
-       49,   70,   70,   50,   49,   48,   72,   72,   49,  144,
-       21,   49,   50,   73,   73,  178,  178,  144,   70,   70,
-       75,  769,   75,   72,   72,   75,   75,   75,   75,   75,
-       75,   75,  108,  136,   98,  163,  128,   73,   98,   98,
+            40,  107, 20,  40,  35,  43,  40,  40,  53,  91,  35,  40,  107, 91,  40,  767, 20,
+            45,  43,  20,  21,  37,  21,  21,  21,  21,  21,  21,  21,  37,  39,  37,  45,  122,
+            37,  45,  126, 47,  39,  21,  37,  122, 126, 768, 47,  47,  21,  48,  47,  39,  48,
+            143, 143, 53,  47,  47,  21,  47,  48,  50,  49,  70,  70,  50,  49,  48,  72,  72,
+            49,  144, 21,  49,  50,  73,  73,  178, 178, 144, 70,  70,  75,  769, 75,  72,  72,
+            75,  75,  75,  75,  75,  75,  75,  108, 136, 98,  163, 128, 73,  98,  98,
 
-       73,  131,  137,  118,  770,  108,  118,  118,  136,  128,
-      118,  128,  118,  145,  149,  137,  149,  131,  131,  163,
-      155,  145,  155,  157,  157,  155,  155,  155,  155,  155,
-      155,  155,  209,  209,  209,  773,  774,  158,  777,  158,
-      157,  157,  158,  158,  158,  158,  158,  158,  158,  161,
-      161,  161,  161,  161,  161,  161,  162,  162,  162,  162,
-      162,  162,  162,  173,  221,  238,  778,  780,  221,  244,
-      244,  244,  781,  238,  162,  782,  173,  249,  249,  249,
-      249,  249,  249,  249,  250,  250,  250,  250,  250,  250,
-      250,  162,  251,  251,  251,  251,  251,  251,  251,  260,
+            73,  131, 137, 118, 770, 108, 118, 118, 136, 128, 118, 128, 118, 145, 149, 137, 149,
+            131, 131, 163, 155, 145, 155, 157, 157, 155, 155, 155, 155, 155, 155, 155, 209, 209,
+            209, 773, 774, 158, 777, 158, 157, 157, 158, 158, 158, 158, 158, 158, 158, 161, 161,
+            161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, 173, 221, 238, 778, 780,
+            221, 244, 244, 244, 781, 238, 162, 782, 173, 249, 249, 249, 249, 249, 249, 249, 250,
+            250, 250, 250, 250, 250, 250, 162, 251, 251, 251, 251, 251, 251, 251, 260,
 
-      260,  260,  250,  252,  252,  252,  252,  252,  252,  252,
-      272,  272,  272,  281,  281,  281,  285,  285,  285,  250,
-      784,  252,  294,  294,  294,  335,  335,  335,  376,  376,
-      376,  387,  387,  387,  388,  388,  388,  785,  252,  788,
-      789,  376,  376,  389,  389,  389,  440,  440,  440,  483,
-      483,  483,  790,  791,  503,  504,  520,  520,  520,  440,
-      440,  603,  483,  483,  503,  504,  554,  554,  554,  520,
-      520,  603,  520,  577,  577,  577,  631,  792,  793,  554,
-      554,  604,  795,  631,  796,  631,  577,  577,  604,  652,
-      604,  604,  797,  798,  799,  800,  652,  802,  652,  803,
+            260, 260, 250, 252, 252, 252, 252, 252, 252, 252, 272, 272, 272, 281, 281, 281, 285,
+            285, 285, 250, 784, 252, 294, 294, 294, 335, 335, 335, 376, 376, 376, 387, 387, 387,
+            388, 388, 388, 785, 252, 788, 789, 376, 376, 389, 389, 389, 440, 440, 440, 483, 483,
+            483, 790, 791, 503, 504, 520, 520, 520, 440, 440, 603, 483, 483, 503, 504, 554, 554,
+            554, 520, 520, 603, 520, 577, 577, 577, 631, 792, 793, 554, 554, 604, 795, 631, 796,
+            631, 577, 577, 604, 652, 604, 604, 797, 798, 799, 800, 652, 802, 652, 803,
 
-      804,  806,  810,  811,  812,  814,  815,  820,  820,  820,
-      821,  821,  821,  822,  823,  824,  824,  765,  764,  763,
-      762,  761,  760,  757,  756,  755,  754,  753,  752,  751,
-      750,  749,  748,  745,  744,  741,  740,  739,  738,  737,
-      736,  734,  733,  732,  731,  730,  728,  726,  722,  721,
-      720,  719,  718,  716,  715,  714,  713,  712,  711,  710,
-      709,  708,  707,  706,  705,  704,  702,  701,  700,  699,
-      698,  697,  696,  695,  694,  692,  691,  690,  689,  688,
-      687,  686,  685,  684,  683,  682,  681,  680,  679,  678,
-      677,  676,  675,  674,  673,  672,  671,  670,  669,  668,
+            804, 806, 810, 811, 812, 814, 815, 820, 820, 820, 821, 821, 821, 822, 823, 824, 824,
+            765, 764, 763, 762, 761, 760, 757, 756, 755, 754, 753, 752, 751, 750, 749, 748, 745,
+            744, 741, 740, 739, 738, 737, 736, 734, 733, 732, 731, 730, 728, 726, 722, 721, 720,
+            719, 718, 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, 702, 701,
+            700, 699, 698, 697, 696, 695, 694, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683,
+            682, 681, 680, 679, 678, 677, 676, 675, 674, 673, 672, 671, 670, 669, 668,
 
-      667,  666,  665,  663,  662,  661,  660,  659,  658,  657,
-      655,  654,  651,  649,  648,  647,  645,  644,  643,  642,
-      641,  640,  639,  638,  637,  636,  635,  634,  633,  630,
-      629,  628,  627,  626,  625,  623,  622,  621,  620,  618,
-      617,  616,  615,  614,  613,  612,  611,  610,  609,  608,
-      607,  606,  605,  600,  598,  597,  596,  595,  594,  590,
-      589,  588,  587,  586,  585,  584,  583,  582,  580,  579,
-      575,  574,  572,  571,  569,  568,  567,  566,  565,  564,
-      563,  559,  558,  557,  555,  553,  552,  551,  550,  549,
-      548,  547,  546,  545,  544,  542,  541,  536,  535,  534,
+            667, 666, 665, 663, 662, 661, 660, 659, 658, 657, 655, 654, 651, 649, 648, 647, 645,
+            644, 643, 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, 630, 629, 628, 627, 626,
+            625, 623, 622, 621, 620, 618, 617, 616, 615, 614, 613, 612, 611, 610, 609, 608, 607,
+            606, 605, 600, 598, 597, 596, 595, 594, 590, 589, 588, 587, 586, 585, 584, 583, 582,
+            580, 579, 575, 574, 572, 571, 569, 568, 567, 566, 565, 564, 563, 559, 558, 557, 555,
+            553, 552, 551, 550, 549, 548, 547, 546, 545, 544, 542, 541, 536, 535, 534,
 
-      533,  531,  530,  528,  527,  526,  525,  524,  522,  521,
-      519,  518,  517,  516,  515,  514,  513,  512,  510,  509,
-      508,  507,  506,  502,  501,  500,  499,  498,  497,  494,
-      493,  492,  491,  490,  489,  488,  487,  486,  485,  484,
-      482,  481,  478,  473,  471,  470,  469,  467,  466,  463,
-      462,  461,  460,  449,  448,  447,  445,  444,  443,  442,
-      441,  438,  436,  435,  434,  432,  431,  430,  429,  427,
-      425,  424,  419,  418,  416,  415,  414,  413,  412,  411,
-      410,  409,  408,  407,  406,  404,  403,  402,  401,  400,
-      399,  398,  396,  395,  394,  393,  392,  391,  390,  386,
+            533, 531, 530, 528, 527, 526, 525, 524, 522, 521, 519, 518, 517, 516, 515, 514, 513,
+            512, 510, 509, 508, 507, 506, 502, 501, 500, 499, 498, 497, 494, 493, 492, 491, 490,
+            489, 488, 487, 486, 485, 484, 482, 481, 478, 473, 471, 470, 469, 467, 466, 463, 462,
+            461, 460, 449, 448, 447, 445, 444, 443, 442, 441, 438, 436, 435, 434, 432, 431, 430,
+            429, 427, 425, 424, 419, 418, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406,
+            404, 403, 402, 401, 400, 399, 398, 396, 395, 394, 393, 392, 391, 390, 386,
 
-      382,  381,  380,  377,  375,  365,  363,  359,  358,  357,
-      356,  354,  353,  351,  346,  345,  344,  343,  342,  341,
-      336,  334,  333,  332,  331,  330,  328,  327,  324,  323,
-      322,  321,  320,  319,  318,  317,  316,  315,  314,  313,
-      312,  311,  310,  309,  308,  307,  306,  305,  304,  303,
-      302,  301,  300,  299,  298,  295,  293,  292,  291,  290,
-      289,  288,  287,  286,  284,  280,  278,  277,  276,  275,
-      271,  270,  269,  268,  267,  266,  265,  264,  263,  259,
-      257,  256,  255,  248,  247,  246,  245,  243,  242,  241,
-      240,  239,  237,  236,  235,  234,  233,  232,  231,  230,
+            382, 381, 380, 377, 375, 365, 363, 359, 358, 357, 356, 354, 353, 351, 346, 345, 344,
+            343, 342, 341, 336, 334, 333, 332, 331, 330, 328, 327, 324, 323, 322, 321, 320, 319,
+            318, 317, 316, 315, 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, 304, 303, 302,
+            301, 300, 299, 298, 295, 293, 292, 291, 290, 289, 288, 287, 286, 284, 280, 278, 277,
+            276, 275, 271, 270, 269, 268, 267, 266, 265, 264, 263, 259, 257, 256, 255, 248, 247,
+            246, 245, 243, 242, 241, 240, 239, 237, 236, 235, 234, 233, 232, 231, 230,
 
-      229,  228,  227,  226,  225,  224,  223,  222,  220,  219,
-      218,  217,  216,  215,  214,  213,  212,  211,  210,  208,
-      207,  206,  205,  204,  203,  202,  201,  200,  199,  198,
-      197,  196,  195,  194,  193,  192,  190,  189,  188,  187,
-      186,  185,  184,  183,  182,  181,  180,  179,  177,  176,
-      175,  174,  172,  171,  170,  169,  168,  166,  151,  150,
-      148,  147,  146,  142,  141,  140,  139,  138,  135,  134,
-      133,  132,  130,  129,  127,  125,  124,  123,  121,  120,
-      119,  117,  116,  114,  113,  112,  111,  110,  109,  106,
-      105,  104,  103,  102,  101,  100,   99,   97,   96,   95,
+            229, 228, 227, 226, 225, 224, 223, 222, 220, 219, 218, 217, 216, 215, 214, 213, 212,
+            211, 210, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194,
+            193, 192, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 177, 176, 175,
+            174, 172, 171, 170, 169, 168, 166, 151, 150, 148, 147, 146, 142, 141, 140, 139, 138,
+            135, 134, 133, 132, 130, 129, 127, 125, 124, 123, 121, 120, 119, 117, 116, 114, 113,
+            112, 111, 110, 109, 106, 105, 104, 103, 102, 101, 100, 99,  97,  96,  95,
 
-       94,   93,   92,   90,   89,   85,   81,   46,   44,   38,
-       25,   22,   19,   14,    9,    5,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819,  819,
-      819,  819,  819,  819,  819,  819,  819,  819,  819
-    } ;
+            94,  93,  92,  90,  89,  85,  81,  46,  44,  38,  25,  22,  19,  14,  9,   5,   819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819,
+            819, 819, 819, 819};
 
-/* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[241] =
-    {   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, 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, 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, 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, 
-    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, 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, 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, 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, 
-    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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
-    0,     };
+        /* Table of booleans, true if rule could match eol. */
+        static yyconst flex_int32_t yy_rule_can_match_eol[241] = {
+            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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+        };
 
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
+        /* The intent behind this definition is that it'll catch
+         * any uses of REJECT which flex missed.
+         */
 #define REJECT reject_used_but_not_detected
 #define yymore() yymore_used_but_not_detected
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
-/*
-//
-// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
+        /*
+        //
+        // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
+        // Use of this source code is governed by a BSD-style license that can be
+        // found in the LICENSE file.
+        //
 
-This file contains the Lex specification for GLSL ES.
-Based on ANSI C grammar, Lex specification:
-http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
+        This file contains the Lex specification for GLSL ES.
+        Based on ANSI C grammar, Lex specification:
+        http://www.lysator.liu.se/c/ANSI-C-grammar-l.html
 
-IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh,
-WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp).
-*/
+        IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh,
+        WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp).
+        */
 
 #include "compiler/translator/glslang.h"
 #include "compiler/translator/ParseContext.h"
@@ -1054,6 +850,7 @@
 static int ES2_reserved_ES3_keyword(TParseContext *context, int token);
 static int ES2_keyword_ES3_reserved(TParseContext *context, int token);
 static int ES2_ident_ES3_keyword(TParseContext *context, int token);
+static int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token);
 static int uint_constant(TParseContext *context);
 static int int_constant(TParseContext *context);
 static int float_constant(yyscan_t yyscanner);
@@ -1700,21 +1497,49 @@
 YY_RULE_SETUP
 { return ES2_ident_ES3_keyword(context, LAYOUT); }
 	YY_BREAK
-/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
 case 79:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
+    YY_BREAK
 case 80:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
+    YY_BREAK
 case 81:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
+    YY_BREAK
 case 82:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
+    YY_BREAK
 case 83:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
+    YY_BREAK
 case 84:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
+    YY_BREAK
 case 85:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
+    YY_BREAK
 case 86:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
+    YY_BREAK
 case 87:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
+    YY_BREAK
 case 88:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
+    YY_BREAK
 case 89:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
+    YY_BREAK
 case 90:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
+    YY_BREAK
 case 91:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); }
+    YY_BREAK
 case 92:
+    YY_RULE_SETUP { return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
+    YY_BREAK
+/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
 case 93:
 case 94:
 case 95:
@@ -3301,6 +3126,24 @@
     return token;
 }
 
+int ES2_ident_ES3_reserved_ES3_1_keyword(TParseContext *context, int token)
+{
+    struct yyguts_t *yyg = (struct yyguts_t *)context->getScanner();
+    yyscan_t yyscanner   = (yyscan_t)context->getScanner();
+
+    if (context->getShaderVersion() < 300)
+    {
+        yylval->lex.string = NewPoolTString(yytext);
+        return check_type(yyscanner);
+    }
+    else if (context->getShaderVersion() == 300)
+    {
+        return reserved_word(yyscanner);
+    }
+
+    return token;
+}
+
 int ES2_ident_ES3_keyword(TParseContext *context, int token)
 {
     struct yyguts_t* yyg = (struct yyguts_t*) context->getScanner();
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index d9b8ada..4f7007d 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -190,80 +190,94 @@
     CENTROID = 306,
     FLAT = 307,
     SMOOTH = 308,
-    STRUCT = 309,
-    VOID_TYPE = 310,
-    WHILE = 311,
-    SAMPLER2D = 312,
-    SAMPLERCUBE = 313,
-    SAMPLER_EXTERNAL_OES = 314,
-    SAMPLER2DRECT = 315,
-    SAMPLER2DARRAY = 316,
-    ISAMPLER2D = 317,
-    ISAMPLER3D = 318,
-    ISAMPLERCUBE = 319,
-    ISAMPLER2DARRAY = 320,
-    USAMPLER2D = 321,
-    USAMPLER3D = 322,
-    USAMPLERCUBE = 323,
-    USAMPLER2DARRAY = 324,
-    SAMPLER3D = 325,
-    SAMPLER3DRECT = 326,
-    SAMPLER2DSHADOW = 327,
-    SAMPLERCUBESHADOW = 328,
-    SAMPLER2DARRAYSHADOW = 329,
-    LAYOUT = 330,
-    IDENTIFIER = 331,
-    TYPE_NAME = 332,
-    FLOATCONSTANT = 333,
-    INTCONSTANT = 334,
-    UINTCONSTANT = 335,
-    BOOLCONSTANT = 336,
-    FIELD_SELECTION = 337,
-    LEFT_OP = 338,
-    RIGHT_OP = 339,
-    INC_OP = 340,
-    DEC_OP = 341,
-    LE_OP = 342,
-    GE_OP = 343,
-    EQ_OP = 344,
-    NE_OP = 345,
-    AND_OP = 346,
-    OR_OP = 347,
-    XOR_OP = 348,
-    MUL_ASSIGN = 349,
-    DIV_ASSIGN = 350,
-    ADD_ASSIGN = 351,
-    MOD_ASSIGN = 352,
-    LEFT_ASSIGN = 353,
-    RIGHT_ASSIGN = 354,
-    AND_ASSIGN = 355,
-    XOR_ASSIGN = 356,
-    OR_ASSIGN = 357,
-    SUB_ASSIGN = 358,
-    LEFT_PAREN = 359,
-    RIGHT_PAREN = 360,
-    LEFT_BRACKET = 361,
-    RIGHT_BRACKET = 362,
-    LEFT_BRACE = 363,
-    RIGHT_BRACE = 364,
-    DOT = 365,
-    COMMA = 366,
-    COLON = 367,
-    EQUAL = 368,
-    SEMICOLON = 369,
-    BANG = 370,
-    DASH = 371,
-    TILDE = 372,
-    PLUS = 373,
-    STAR = 374,
-    SLASH = 375,
-    PERCENT = 376,
-    LEFT_ANGLE = 377,
-    RIGHT_ANGLE = 378,
-    VERTICAL_BAR = 379,
-    CARET = 380,
-    AMPERSAND = 381,
-    QUESTION = 382
+    READONLY = 309,
+    WRITEONLY = 310,
+    STRUCT = 311,
+    VOID_TYPE = 312,
+    WHILE = 313,
+    SAMPLER2D = 314,
+    SAMPLERCUBE = 315,
+    SAMPLER_EXTERNAL_OES = 316,
+    SAMPLER2DRECT = 317,
+    SAMPLER2DARRAY = 318,
+    ISAMPLER2D = 319,
+    ISAMPLER3D = 320,
+    ISAMPLERCUBE = 321,
+    ISAMPLER2DARRAY = 322,
+    USAMPLER2D = 323,
+    USAMPLER3D = 324,
+    USAMPLERCUBE = 325,
+    USAMPLER2DARRAY = 326,
+    SAMPLER3D = 327,
+    SAMPLER3DRECT = 328,
+    SAMPLER2DSHADOW = 329,
+    SAMPLERCUBESHADOW = 330,
+    SAMPLER2DARRAYSHADOW = 331,
+    IMAGE2D = 332,
+    IIMAGE2D = 333,
+    UIMAGE2D = 334,
+    IMAGE3D = 335,
+    IIMAGE3D = 336,
+    UIMAGE3D = 337,
+    IMAGE2DARRAY = 338,
+    IIMAGE2DARRAY = 339,
+    UIMAGE2DARRAY = 340,
+    IMAGECUBE = 341,
+    IIMAGECUBE = 342,
+    UIMAGECUBE = 343,
+    LAYOUT = 344,
+    IDENTIFIER = 345,
+    TYPE_NAME = 346,
+    FLOATCONSTANT = 347,
+    INTCONSTANT = 348,
+    UINTCONSTANT = 349,
+    BOOLCONSTANT = 350,
+    FIELD_SELECTION = 351,
+    LEFT_OP = 352,
+    RIGHT_OP = 353,
+    INC_OP = 354,
+    DEC_OP = 355,
+    LE_OP = 356,
+    GE_OP = 357,
+    EQ_OP = 358,
+    NE_OP = 359,
+    AND_OP = 360,
+    OR_OP = 361,
+    XOR_OP = 362,
+    MUL_ASSIGN = 363,
+    DIV_ASSIGN = 364,
+    ADD_ASSIGN = 365,
+    MOD_ASSIGN = 366,
+    LEFT_ASSIGN = 367,
+    RIGHT_ASSIGN = 368,
+    AND_ASSIGN = 369,
+    XOR_ASSIGN = 370,
+    OR_ASSIGN = 371,
+    SUB_ASSIGN = 372,
+    LEFT_PAREN = 373,
+    RIGHT_PAREN = 374,
+    LEFT_BRACKET = 375,
+    RIGHT_BRACKET = 376,
+    LEFT_BRACE = 377,
+    RIGHT_BRACE = 378,
+    DOT = 379,
+    COMMA = 380,
+    COLON = 381,
+    EQUAL = 382,
+    SEMICOLON = 383,
+    BANG = 384,
+    DASH = 385,
+    TILDE = 386,
+    PLUS = 387,
+    STAR = 388,
+    SLASH = 389,
+    PERCENT = 390,
+    LEFT_ANGLE = 391,
+    RIGHT_ANGLE = 392,
+    VERTICAL_BAR = 393,
+    CARET = 394,
+    AMPERSAND = 395,
+    QUESTION = 396
   };
 #endif
 
@@ -644,23 +658,23 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  109
+#define YYFINAL  123
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   2432
+#define YYLAST   2762
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  128
+#define YYNTOKENS  142
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  94
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  269
+#define YYNRULES  283
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  405
+#define YYNSTATES  419
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   382
+#define YYMAXUTOK   396
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -707,40 +721,43 @@
       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
      105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   237,   237,   238,   241,   251,   254,   259,   264,   269,
-     274,   280,   283,   286,   289,   292,   295,   301,   308,   319,
-     323,   331,   334,   340,   344,   351,   357,   366,   374,   380,
-     386,   395,   398,   401,   404,   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,   547,   548,   549,   550,   554,   555,   556,
-     560,   564,   568,   572,   579,   582,   588,   595,   602,   605,
-     611,   620,   624,   628,   632,   636,   643,   650,   653,   660,
-     668,   688,   698,   706,   731,   735,   739,   743,   750,   757,
-     760,   764,   768,   773,   778,   785,   789,   793,   797,   802,
-     807,   814,   824,   830,   833,   839,   843,   850,   856,   863,
+       0,   240,   240,   241,   244,   254,   257,   262,   267,   272,
+     277,   283,   286,   289,   292,   295,   298,   304,   311,   322,
+     326,   334,   337,   343,   347,   354,   360,   369,   377,   383,
+     389,   398,   401,   404,   407,   417,   418,   419,   420,   428,
+     429,   432,   435,   442,   443,   446,   452,   453,   457,   464,
+     465,   468,   471,   474,   480,   481,   484,   490,   491,   498,
+     499,   506,   507,   514,   515,   521,   522,   528,   529,   535,
+     536,   542,   543,   550,   551,   552,   553,   557,   558,   559,
+     563,   567,   571,   575,   582,   585,   591,   598,   605,   608,
+     614,   623,   627,   631,   635,   639,   646,   653,   656,   663,
+     671,   691,   701,   709,   734,   738,   742,   746,   753,   760,
+     763,   767,   771,   776,   781,   788,   792,   796,   800,   805,
+     810,   817,   827,   833,   836,   842,   846,   853,   859,   863,
      867,   870,   873,   882,   888,   896,   899,   919,   938,   945,
-     949,   956,   966,   969,   972,   978,   985,   988,   994,   997,
-    1000,  1006,  1009,  1014,  1025,  1028,  1031,  1034,  1037,  1040,
-    1044,  1048,  1052,  1056,  1060,  1064,  1068,  1072,  1076,  1080,
-    1084,  1088,  1092,  1096,  1100,  1104,  1108,  1112,  1116,  1120,
-    1124,  1127,  1130,  1133,  1136,  1139,  1142,  1145,  1148,  1151,
-    1154,  1157,  1160,  1163,  1166,  1169,  1176,  1182,  1185,  1197,
-    1197,  1200,  1200,  1206,  1209,  1224,  1227,  1234,  1238,  1244,
-    1250,  1262,  1266,  1270,  1271,  1277,  1278,  1279,  1280,  1281,
-    1282,  1283,  1287,  1288,  1288,  1288,  1297,  1298,  1302,  1302,
-    1303,  1303,  1308,  1311,  1320,  1325,  1332,  1333,  1337,  1344,
-    1348,  1355,  1355,  1362,  1365,  1372,  1376,  1389,  1389,  1394,
-    1394,  1400,  1400,  1408,  1411,  1417,  1420,  1426,  1430,  1437,
-    1440,  1443,  1446,  1449,  1458,  1464,  1470,  1473,  1479,  1479
+     949,   953,   956,   962,   972,   975,   978,   984,   991,   994,
+    1000,  1003,  1006,  1012,  1015,  1020,  1031,  1034,  1037,  1040,
+    1043,  1046,  1050,  1054,  1058,  1062,  1066,  1070,  1074,  1078,
+    1082,  1086,  1090,  1094,  1098,  1102,  1106,  1110,  1114,  1118,
+    1122,  1126,  1130,  1133,  1136,  1139,  1142,  1145,  1148,  1151,
+    1154,  1157,  1160,  1163,  1166,  1169,  1172,  1175,  1182,  1188,
+    1191,  1194,  1197,  1200,  1203,  1206,  1209,  1212,  1215,  1218,
+    1221,  1224,  1227,  1239,  1239,  1242,  1242,  1248,  1251,  1266,
+    1269,  1276,  1280,  1286,  1292,  1304,  1308,  1312,  1313,  1319,
+    1320,  1321,  1322,  1323,  1324,  1325,  1329,  1330,  1330,  1330,
+    1339,  1340,  1344,  1344,  1345,  1345,  1350,  1353,  1362,  1367,
+    1374,  1375,  1379,  1386,  1390,  1397,  1397,  1404,  1407,  1414,
+    1418,  1431,  1431,  1436,  1436,  1442,  1442,  1450,  1453,  1459,
+    1462,  1468,  1472,  1479,  1482,  1485,  1488,  1491,  1500,  1506,
+    1512,  1515,  1521,  1521
 };
 #endif
 
@@ -757,18 +774,21 @@
   "IVEC4", "VEC2", "VEC3", "VEC4", "UVEC2", "UVEC3", "UVEC4", "MATRIX2",
   "MATRIX3", "MATRIX4", "IN_QUAL", "OUT_QUAL", "INOUT_QUAL", "UNIFORM",
   "VARYING", "MATRIX2x3", "MATRIX3x2", "MATRIX2x4", "MATRIX4x2",
-  "MATRIX3x4", "MATRIX4x3", "CENTROID", "FLAT", "SMOOTH", "STRUCT",
-  "VOID_TYPE", "WHILE", "SAMPLER2D", "SAMPLERCUBE", "SAMPLER_EXTERNAL_OES",
-  "SAMPLER2DRECT", "SAMPLER2DARRAY", "ISAMPLER2D", "ISAMPLER3D",
-  "ISAMPLERCUBE", "ISAMPLER2DARRAY", "USAMPLER2D", "USAMPLER3D",
-  "USAMPLERCUBE", "USAMPLER2DARRAY", "SAMPLER3D", "SAMPLER3DRECT",
-  "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW", "SAMPLER2DARRAYSHADOW", "LAYOUT",
-  "IDENTIFIER", "TYPE_NAME", "FLOATCONSTANT", "INTCONSTANT",
-  "UINTCONSTANT", "BOOLCONSTANT", "FIELD_SELECTION", "LEFT_OP", "RIGHT_OP",
-  "INC_OP", "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP",
-  "OR_OP", "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN",
-  "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN",
-  "OR_ASSIGN", "SUB_ASSIGN", "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACKET",
+  "MATRIX3x4", "MATRIX4x3", "CENTROID", "FLAT", "SMOOTH", "READONLY",
+  "WRITEONLY", "STRUCT", "VOID_TYPE", "WHILE", "SAMPLER2D", "SAMPLERCUBE",
+  "SAMPLER_EXTERNAL_OES", "SAMPLER2DRECT", "SAMPLER2DARRAY", "ISAMPLER2D",
+  "ISAMPLER3D", "ISAMPLERCUBE", "ISAMPLER2DARRAY", "USAMPLER2D",
+  "USAMPLER3D", "USAMPLERCUBE", "USAMPLER2DARRAY", "SAMPLER3D",
+  "SAMPLER3DRECT", "SAMPLER2DSHADOW", "SAMPLERCUBESHADOW",
+  "SAMPLER2DARRAYSHADOW", "IMAGE2D", "IIMAGE2D", "UIMAGE2D", "IMAGE3D",
+  "IIMAGE3D", "UIMAGE3D", "IMAGE2DARRAY", "IIMAGE2DARRAY", "UIMAGE2DARRAY",
+  "IMAGECUBE", "IIMAGECUBE", "UIMAGECUBE", "LAYOUT", "IDENTIFIER",
+  "TYPE_NAME", "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT",
+  "BOOLCONSTANT", "FIELD_SELECTION", "LEFT_OP", "RIGHT_OP", "INC_OP",
+  "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP",
+  "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN",
+  "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN",
+  "SUB_ASSIGN", "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACKET",
   "RIGHT_BRACKET", "LEFT_BRACE", "RIGHT_BRACE", "DOT", "COMMA", "COLON",
   "EQUAL", "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", "STAR", "SLASH",
   "PERCENT", "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", "CARET",
@@ -825,16 +845,18 @@
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
      355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
      365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
-     375,   376,   377,   378,   379,   380,   381,   382
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396
 };
 # endif
 
-#define YYPACT_NINF -348
+#define YYPACT_NINF -362
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-348)))
+  (!!((Yystate) == (-362)))
 
-#define YYTABLE_NINF -229
+#define YYTABLE_NINF -243
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -843,47 +865,48 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    2144,  -348,  -348,  -348,  -348,   144,  -348,  -348,  -348,  -348,
-    -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-    -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-    -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-    -348,   -53,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-    -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-     -83,  -348,  -348,   -89,   -70,   -81,  2219,   -26,  -348,    60,
-    -348,  1163,  -348,  -348,  -348,  -348,  -348,  -348,  -348,   -66,
-    -348,  2069,  -348,  -348,  2355,  -348,  -348,  -348,   -41,    -2,
-    -348,   -30,  -348,  2219,  -348,  -348,  -348,  2219,    80,    80,
-    -348,   -17,   -75,   -65,  -348,  2219,  -348,  -348,  1233,  -348,
-    -348,   -15,  2219,  -348,   -10,   -85,  -348,   389,  -348,  -348,
-    -348,  -348,     1,   -49,  -348,  1331,  1622,  -348,  -348,  2219,
-      80,  1814,  -348,    19,  -348,  -348,  -348,  -348,  -348,  1622,
-    1622,  1622,  -348,  -348,  -348,  -348,  -348,  -348,  -348,   -24,
-    -348,  -348,  -348,    37,   -22,  1717,    67,  -348,  1622,    34,
-      14,    76,   -46,    72,    51,    75,    78,   112,   113,   -77,
-    -348,    98,  -348,  -348,  1899,  2219,    84,  -348,    -2,    94,
-      97,  -348,   108,   109,   100,  1429,   114,  1622,   104,   115,
-     111,  -348,  -348,   190,  -348,  -348,   -19,  -348,   -89,   117,
-    -348,  -348,  -348,  -348,   505,  -348,  -348,  -348,  -348,  -348,
-    -348,  1622,  1524,  1622,   116,   110,  -348,  -348,    80,   118,
-      27,  -348,   -58,  -348,  -348,  -348,    -5,  -348,  -348,  1622,
-    2287,  -348,  -348,  1622,   121,  -348,  -348,  -348,  1622,  1622,
-    1622,  1622,  1622,  1622,  1622,  1622,  1622,  1622,  1622,  1622,
-    1622,  1622,  1622,  1622,  1622,  1622,  1622,  1622,  -348,  -348,
-    1984,  -348,  -348,  -348,  -348,  -348,   119,  -348,  1622,  -348,
-    -348,    32,  1622,   122,  -348,  -348,  -348,   621,  -348,  -348,
-    -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  1622,
-    1622,  -348,  -348,  -348,   124,   120,   129,  -348,  1622,   125,
-      33,  1622,    80,  -348,   -87,  -348,  -348,   130,   128,  -348,
-     136,  -348,  -348,  -348,  -348,  -348,    34,    34,    14,    14,
-      76,    76,    76,    76,   -46,   -46,    72,    51,    75,    78,
-     112,   113,    54,  -348,   166,   -30,   853,   969,    -3,  -348,
-      -1,  -348,  1066,   621,  -348,  -348,  -348,  1622,   132,  -348,
-    1622,  -348,   135,  -348,  1622,  -348,  -348,  1622,   139,  -348,
-    -348,  -348,  -348,  1066,   119,  -348,   128,    80,  2219,   141,
-     140,  -348,  1622,  -348,  -348,   145,  -348,  1622,  -348,   134,
-     146,   236,  -348,   147,   143,   737,  -348,  -348,   148,    17,
-    1622,   737,   119,  -348,  1622,  -348,  -348,  -348,  -348,   149,
-     128,  -348,  -348,  -348,  -348
+    2418,  -362,  -362,  -362,  -362,   117,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,   -29,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,   -74,  -362,  -362,   -80,   -15,   -48,
+    2507,   -88,  -362,    27,  -362,  1283,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,     5,  -362,  2329,  -362,  -362,  2671,  -362,
+    -362,  -362,    16,    78,  -362,    48,  -362,  2507,  -362,  -362,
+    -362,  2507,    46,    46,  -362,    14,  -100,   -49,  -362,  2507,
+    -362,  -362,  1367,  -362,  -362,    50,  2507,  -362,    45,   -70,
+    -362,   411,  -362,  -362,  -362,  -362,    59,   -91,  -362,  1479,
+    1812,  -362,  -362,  2507,    46,  2032,  -362,    62,  -362,  -362,
+    -362,  -362,  -362,  1812,  1812,  1812,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,   -61,  -362,  -362,  -362,    64,   -44,  1921,
+      63,  -362,  1812,   -69,  -106,    44,   -79,    57,    47,    52,
+      56,    79,    85,   -90,  -362,    65,  -362,  -362,  2131,  2507,
+      54,  -362,    78,    67,    68,  -362,    82,    84,    69,  1591,
+      86,  1812,    77,    87,    83,  -362,  -362,    42,  -362,  -362,
+     -41,  -362,   -80,    89,  -362,  -362,  -362,  -362,   541,  -362,
+    -362,  -362,  -362,  -362,  -362,  1812,  1700,  1812,    58,    90,
+    -362,  -362,    46,    88,   -34,  -362,   -72,  -362,  -362,  -362,
+     -37,  -362,  -362,  1812,  2589,  -362,  -362,  1812,    91,  -362,
+    -362,  -362,  1812,  1812,  1812,  1812,  1812,  1812,  1812,  1812,
+    1812,  1812,  1812,  1812,  1812,  1812,  1812,  1812,  1812,  1812,
+    1812,  1812,  -362,  -362,  2230,  -362,  -362,  -362,  -362,  -362,
+      93,  -362,  1812,  -362,  -362,   -26,  1812,    94,  -362,  -362,
+    -362,   671,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  1812,  1812,  -362,  -362,  -362,    95,    92,
+      96,  -362,  1812,    98,   -22,  1812,    46,  -362,   -95,  -362,
+    -362,   100,    97,  -362,   108,  -362,  -362,  -362,  -362,  -362,
+     -69,   -69,  -106,  -106,    44,    44,    44,    44,   -79,   -79,
+      57,    47,    52,    56,    79,    85,    37,  -362,   154,    48,
+     931,  1061,   -36,  -362,   -33,  -362,  1172,   671,  -362,  -362,
+    -362,  1812,   101,  -362,  1812,  -362,   110,  -362,  1812,  -362,
+    -362,  1812,   111,  -362,  -362,  -362,  -362,  1172,    93,  -362,
+      97,    46,  2507,   114,   112,  -362,  1812,  -362,  -362,   115,
+    -362,  1812,  -362,   109,   119,   222,  -362,   118,   120,   801,
+    -362,  -362,   113,    -5,  1812,   801,    93,  -362,  1812,  -362,
+    -362,  -362,  -362,   123,    97,  -362,  -362,  -362,  -362
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -891,77 +914,78 @@
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,   127,   142,   143,   144,     0,   133,   135,   158,   155,
-     156,   157,   162,   163,   164,   165,   166,   167,   159,   160,
-     161,   168,   169,   170,   171,   172,   173,   136,   137,   138,
-     140,   134,   174,   175,   176,   177,   178,   179,   139,   124,
-     123,     0,   154,   180,   182,   195,   196,   183,   184,   185,
-     186,   187,   188,   189,   190,   191,   181,   192,   193,   194,
-       0,   198,   267,   268,     0,    98,    97,     0,   109,   115,
-     131,     0,   132,   125,   128,   121,   130,   129,   141,   151,
-     197,     0,   264,   266,     0,     2,     3,   201,     0,     0,
-      88,     0,    96,     0,   105,    99,   107,     0,   108,     0,
-      89,     2,   116,     0,    94,     0,   126,   122,     0,     1,
-     265,     0,     0,   199,   148,     0,   146,     0,   269,   100,
-     104,   106,   102,   110,   101,     0,     0,    87,    95,     0,
-       0,     0,   203,     4,     8,     6,     7,     9,    30,     0,
-       0,     0,   152,    37,    36,    38,    35,     5,    11,    31,
-      13,    18,    19,     0,     0,    24,     0,    39,     0,    43,
-      46,    49,    54,    57,    59,    61,    63,    65,    67,    69,
-      86,     0,    28,    90,     0,     0,     0,   145,     0,     0,
-       0,   249,     0,     0,     0,     0,     0,     0,     0,     0,
-     223,   232,   236,    39,    71,    84,     0,   212,     0,   141,
-     215,   234,   214,   213,     0,   216,   217,   218,   219,   220,
-     221,     0,     0,     0,     0,     0,   211,   120,     0,   209,
-       0,   207,     0,   204,    32,    33,     0,    15,    16,     0,
-       0,    22,    21,     0,   154,    25,    27,    34,     0,     0,
+       0,   127,   144,   145,   146,     0,   133,   135,   160,   157,
+     158,   159,   164,   165,   166,   167,   168,   169,   161,   162,
+     163,   170,   171,   172,   173,   174,   175,   136,   137,   138,
+     140,   134,   176,   177,   178,   179,   180,   181,   139,   124,
+     123,   141,   142,     0,   156,   182,   184,   197,   198,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,   183,   194,
+     195,   196,   200,   201,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,   211,     0,   212,   281,   282,     0,    98,
+      97,     0,   109,   115,   131,     0,   132,   125,   128,   121,
+     130,   129,   143,   153,   199,     0,   278,   280,     0,     2,
+       3,   215,     0,     0,    88,     0,    96,     0,   105,    99,
+     107,     0,   108,     0,    89,     2,   116,     0,    94,     0,
+     126,   122,     0,     1,   279,     0,     0,   213,   150,     0,
+     148,     0,   283,   100,   104,   106,   102,   110,   101,     0,
+       0,    87,    95,     0,     0,     0,   217,     4,     8,     6,
+       7,     9,    30,     0,     0,     0,   154,    37,    36,    38,
+      35,     5,    11,    31,    13,    18,    19,     0,     0,    24,
+       0,    39,     0,    43,    46,    49,    54,    57,    59,    61,
+      63,    65,    67,    69,    86,     0,    28,    90,     0,     0,
+       0,   147,     0,     0,     0,   263,     0,     0,     0,     0,
+       0,     0,     0,     0,   237,   246,   250,    39,    71,    84,
+       0,   226,     0,   143,   229,   248,   228,   227,     0,   230,
+     231,   232,   233,   234,   235,     0,     0,     0,     0,     0,
+     225,   120,     0,   223,     0,   221,     0,   218,    32,    33,
+       0,    15,    16,     0,     0,    22,    21,     0,   156,    25,
+      27,    34,     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,     0,   153,   202,
-       0,   149,   150,   147,   260,   259,   230,   251,     0,   263,
-     261,     0,     0,     0,   244,   247,   222,     0,    74,    75,
-      77,    76,    79,    80,    81,    82,    83,    78,    73,     0,
-       0,   237,   233,   235,     0,     0,     0,   114,     0,   117,
-       0,     0,     0,   205,     0,    91,    10,     0,    17,    29,
-      14,    20,    26,    40,    41,    42,    45,    44,    47,    48,
-      52,    53,    50,    51,    55,    56,    58,    60,    62,    64,
-      66,    68,     0,   200,     0,     0,     0,     0,     0,   262,
-       0,   243,     0,   224,    72,    85,   103,     0,   111,   118,
-       0,   206,     0,   208,     0,    92,    12,     0,     0,   229,
-     231,   254,   253,   256,   230,   241,   245,     0,     0,     0,
-       0,   112,     0,   119,   210,     0,    70,     0,   255,     0,
-       0,   240,   238,     0,     0,     0,   225,   113,     0,     0,
-     257,     0,   230,   242,     0,   227,   248,   226,    93,     0,
-     258,   252,   239,   246,   250
+       0,     0,   155,   216,     0,   151,   152,   149,   274,   273,
+     244,   265,     0,   277,   275,     0,     0,     0,   258,   261,
+     236,     0,    74,    75,    77,    76,    79,    80,    81,    82,
+      83,    78,    73,     0,     0,   251,   247,   249,     0,     0,
+       0,   114,     0,   117,     0,     0,     0,   219,     0,    91,
+      10,     0,    17,    29,    14,    20,    26,    40,    41,    42,
+      45,    44,    47,    48,    52,    53,    50,    51,    55,    56,
+      58,    60,    62,    64,    66,    68,     0,   214,     0,     0,
+       0,     0,     0,   276,     0,   257,     0,   238,    72,    85,
+     103,     0,   111,   118,     0,   220,     0,   222,     0,    92,
+      12,     0,     0,   243,   245,   268,   267,   270,   244,   255,
+     259,     0,     0,     0,     0,   112,     0,   119,   224,     0,
+      70,     0,   269,     0,     0,   254,   252,     0,     0,     0,
+     239,   113,     0,     0,   271,     0,   244,   256,     0,   241,
+     262,   240,    93,     0,   272,   266,   253,   260,   264
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -348,   -40,  -348,  -348,  -348,  -348,  -348,  -348,    28,  -348,
-    -348,  -348,  -348,   -60,  -348,   -72,   -71,  -127,   -52,     8,
-      12,    16,     7,    10,    11,  -348,   -86,  -122,  -348,  -133,
-     -78,  -348,     9,    13,  -348,  -348,  -348,   169,   177,   174,
-    -348,  -348,  -326,  -348,   -59,  -348,   -69,  -348,   -61,   268,
-    -348,  -348,    96,     0,  -348,  -348,  -348,  -348,  -100,  -120,
-      57,   -23,  -140,   -57,  -198,  -322,  -105,  -348,  -348,  -110,
-    -347,  -348,  -348,   -88,     5,   -42,  -348,  -348,  -348,  -348,
-    -348,   -67,  -348,  -348,  -348,  -348,  -348,  -348,  -348,  -348,
-    -348,   216,  -348,  -348
+    -362,   -42,  -362,  -362,  -362,  -362,  -362,  -362,    -2,  -362,
+    -362,  -362,  -362,    60,  -362,   -82,   -93,  -132,   -87,   -20,
+     -18,   -21,   -16,   -14,   -17,  -362,   -92,  -137,  -362,  -147,
+    -125,  -362,    10,    13,  -362,  -362,  -362,   143,   149,   147,
+    -362,  -362,  -335,  -362,   -73,  -362,   -83,  -362,   -76,   254,
+    -362,  -362,    70,     0,  -362,  -362,  -362,  -362,  -111,  -134,
+      28,   -53,  -215,   -86,  -213,  -331,  -133,  -362,  -362,  -139,
+    -361,  -362,  -362,   -99,   -24,   -81,  -362,  -362,  -362,  -362,
+    -362,  -109,  -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,   174,  -362,  -362
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   219,   147,   148,   149,   307,   150,   151,   152,   153,
-     154,   155,   156,   193,   158,   159,   160,   161,   162,   163,
-     164,   165,   166,   167,   168,   169,   194,   195,   289,   196,
-     171,   105,   197,   198,    64,    65,    66,    94,    95,    96,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,   115,   116,   172,    79,    80,   175,   112,   131,   132,
-     220,   221,   217,   200,   201,   202,   203,   277,   370,   396,
-     334,   335,   336,   397,   204,   205,   206,   382,   207,   383,
-     208,   369,   209,   342,   266,   337,   363,   379,   380,   210,
-      81,    82,    83,    91
+      -1,   233,   161,   162,   163,   321,   164,   165,   166,   167,
+     168,   169,   170,   207,   172,   173,   174,   175,   176,   177,
+     178,   179,   180,   181,   182,   183,   208,   209,   303,   210,
+     185,   119,   211,   212,    78,    79,    80,   108,   109,   110,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
+      91,   129,   130,   186,    93,    94,   189,   126,   145,   146,
+     234,   235,   231,   214,   215,   216,   217,   291,   384,   410,
+     348,   349,   350,   411,   218,   219,   220,   396,   221,   397,
+     222,   383,   223,   356,   280,   351,   377,   393,   394,   224,
+      95,    96,    97,   105
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -969,498 +993,564 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      78,    88,   106,   118,   216,    98,   293,    97,   226,    62,
-     107,   223,   174,    63,   360,   256,   367,   381,   304,   354,
-     177,    89,   170,    85,    86,    90,   178,   355,   106,   102,
-      93,   125,    98,   235,    97,    92,    98,   367,   126,   170,
-     108,   245,   246,   127,   130,   402,   129,   215,   157,   128,
-     257,   130,   271,   129,   223,    87,   305,   212,   122,   123,
-     106,   227,   228,   395,   213,   157,    78,   113,   218,   395,
-     130,    78,   129,   297,   114,   260,   247,   248,   117,   224,
-     225,    78,   229,   232,   111,    99,   230,   124,   100,   233,
-      62,   216,   290,    78,    63,   291,   308,    78,   237,   173,
-     306,   170,   364,   176,   365,    78,   290,   211,   290,   273,
-     290,   312,    78,   130,   130,   129,   129,   199,   320,   321,
-     322,   323,   399,   -29,   332,   170,   170,   157,   290,    78,
-     241,    78,   242,   294,   296,   338,   101,    86,   302,   340,
-     223,   303,   231,   290,   302,   293,   339,   351,     2,     3,
-       4,   157,   157,   238,   239,   240,    85,    86,   349,   243,
-     244,   249,   250,   261,   262,   290,   357,   344,   345,   316,
-     317,   236,   318,   319,    78,    78,   216,   251,   313,   314,
-     315,   157,   157,   157,   157,   157,   157,   157,   157,   157,
-     157,   157,   157,   157,   157,   157,   157,   324,   325,   130,
-     252,   129,   253,   254,   199,   258,   255,   371,   264,   366,
-     373,   265,   267,   268,   269,   170,   274,   299,   272,   275,
-     276,   -28,   358,   352,   301,   216,   -23,  -228,   216,   298,
-     366,   346,   387,   347,   341,   376,   348,   356,   350,   290,
-     -30,   157,   374,   377,   389,   372,   385,   359,   390,   386,
-     216,   391,   388,   392,   403,   190,   394,   400,   311,   326,
-      78,   329,   398,   404,   327,   330,   120,   331,   170,   328,
-     119,   121,   216,    84,   263,   300,   375,   199,   393,   353,
-     361,   401,   343,   368,   278,   279,   280,   281,   282,   283,
-     284,   285,   286,   287,   157,   362,   378,   110,     0,   106,
-       0,     0,     0,   288,   368,     0,     0,   107,     0,     0,
+      92,   102,   120,   230,   112,   307,   132,   111,   240,   121,
+      76,   237,   311,    77,   229,   188,   270,   395,   318,   374,
+     139,   381,   259,   260,   255,   368,   256,   140,   120,   226,
+     184,   112,   249,   369,   111,   112,   227,   113,   241,   242,
+     114,   116,   381,   144,   103,   416,   143,   184,   104,   191,
+     144,   271,   285,   143,   237,   192,   319,   261,   262,   243,
+     120,    99,   100,   244,   252,   253,   254,   232,   409,   144,
+     136,   137,   143,   141,   409,   246,   287,   107,   274,   142,
+      92,   247,   320,   378,   304,    92,   379,   305,   304,   304,
+     230,   316,   304,   101,   317,    92,   322,   363,   125,   304,
+     308,   310,   353,   316,   106,    76,   365,    92,    77,   184,
+     326,    92,   144,   144,   413,   143,   143,   115,   100,    92,
+     304,     2,     3,     4,   346,   122,    92,   334,   335,   336,
+     337,   213,   138,   184,   184,   352,    99,   100,   127,   354,
+     237,   257,   258,    92,   307,    92,   385,   275,   276,   387,
+     292,   293,   294,   295,   296,   297,   298,   299,   300,   301,
+     263,   264,   304,   371,   332,   333,   358,   359,   128,   302,
+     131,   401,   190,   330,   331,   230,   338,   339,   187,   225,
+     -29,   250,   171,   245,   268,   312,   272,   265,    92,    92,
+     366,   266,   269,   417,   267,   278,   279,   283,   144,   171,
+     281,   143,   282,   288,   286,   289,   290,   -28,   315,   380,
+     -23,   313,   372,   238,   239,  -242,   360,   362,   213,   361,
+     355,   370,   304,   184,   230,   364,   -30,   230,   386,   391,
+     380,   388,   251,   399,   390,   400,   402,   404,   405,   406,
+     204,   412,   325,   389,   403,   340,   342,   408,   341,   230,
+     373,   418,   343,   345,   134,   344,   133,   414,   135,    98,
+     314,   171,   277,   367,   407,   375,   415,   357,   392,   124,
+     376,   230,     0,     0,    92,     0,   184,     0,     0,     0,
+       0,     0,     0,   382,     0,   171,   171,     0,     0,     0,
+       0,   213,     0,     0,     0,     0,     0,     0,     0,   120,
+       0,     0,     0,     0,   382,     0,   121,     0,     0,     0,
+       0,     0,   327,   328,   329,   171,   171,   171,   171,   171,
+     171,   171,   171,   171,   171,   171,   171,   171,   171,   171,
+     171,     0,     0,     0,     0,     0,     0,     0,     0,   398,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   384,     0,     0,
-       0,     0,     0,     0,     0,     0,   199,   199,     0,     0,
-       0,     0,   199,   199,     0,     0,     0,     0,     0,     0,
+     213,   213,     0,     0,     0,     0,   213,   213,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   199,     0,     0,     0,     0,    78,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   199,     0,     0,     0,     0,
-       0,   199,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,   179,   180,   181,     0,   182,   183,   184,
-     185,   186,   187,   188,    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,   189,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,    60,   133,    61,   134,   135,   136,
-     137,   138,     0,     0,   139,   140,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   141,     0,     0,     0,   190,   191,     0,
-       0,     0,     0,   192,   143,   144,   145,   146,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,   179,
-     180,   181,     0,   182,   183,   184,   185,   186,   187,   188,
-      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,   189,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,     0,    57,    58,    59,
-      60,   133,    61,   134,   135,   136,   137,   138,     0,     0,
-     139,   140,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   141,
-       0,     0,     0,   190,   292,     0,     0,     0,     0,   192,
-     143,   144,   145,   146,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,   179,   180,   181,     0,   182,
-     183,   184,   185,   186,   187,   188,    12,    13,    14,    15,
+       0,     0,     0,     0,     0,   171,     0,   213,     0,     0,
+       0,     0,    92,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   213,
+       0,     0,     0,     0,     0,   213,     0,     0,     0,     0,
+       0,     0,     0,     0,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   193,   194,   195,   171,   196,
+     197,   198,   199,   200,   201,   202,    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,   189,    43,    44,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,   203,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,     0,    57,    58,    59,    60,   133,    61,   134,
-     135,   136,   137,   138,     0,     0,   139,   140,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   141,     0,     0,     0,   190,
-       0,     0,     0,     0,     0,   192,   143,   144,   145,   146,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,   179,   180,   181,     0,   182,   183,   184,   185,   186,
-     187,   188,    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,   189,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,     0,    57,
-      58,    59,    60,   133,    61,   134,   135,   136,   137,   138,
-       0,     0,   139,   140,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   141,     0,     0,     0,   117,     0,     0,     0,     0,
-       0,   192,   143,   144,   145,   146,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,   179,   180,   181,
-       0,   182,   183,   184,   185,   186,   187,   188,    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,   189,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,     0,    57,    58,    59,    60,   133,
-      61,   134,   135,   136,   137,   138,     0,     0,   139,   140,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   141,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   192,   143,   144,
-     145,   146,     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,     0,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,    60,   133,    61,   134,   135,   136,
-     137,   138,     0,     0,   139,   140,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     1,
-       2,     3,     4,   141,     6,     7,     8,     9,    10,    11,
-       0,     0,     0,   192,   143,   144,   145,   146,     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,     0,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    54,    55,    56,     0,    57,    58,
-      59,    60,   133,    61,   134,   135,   136,   137,   138,     0,
-       0,   139,   140,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     1,     2,     3,     4,
-     141,     6,     7,     8,     9,    10,    11,     0,     0,     0,
-       0,   143,   144,   145,   146,     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,     0,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,     0,    57,    58,    59,    60,   103,
-      61,     0,     0,     8,     9,    10,    11,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,     0,     0,     0,     0,   104,    32,    33,
-      34,    35,    36,    37,     0,     0,     0,    41,    42,     0,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,     0,    57,    58,    59,     0,   133,
-      61,   134,   135,   136,   137,   138,     0,     0,   139,   140,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   141,     0,     0,
-     142,     8,     9,    10,    11,     0,     0,     0,   143,   144,
-     145,   146,     0,     0,     0,     0,    12,    13,    14,    15,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       0,     0,     0,   204,   205,     0,     0,     0,     0,   206,
+     157,   158,   159,   160,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   193,   194,   195,     0,   196,
+     197,   198,   199,   200,   201,   202,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,     0,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,    37,     0,     0,     0,    41,    42,     0,    43,    44,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,   203,
       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,     0,    57,    58,    59,     0,   133,    61,   134,
-     135,   136,   137,   138,     0,     0,   139,   140,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   141,     0,     0,   214,     8,
-       9,    10,    11,     0,     0,     0,   143,   144,   145,   146,
-       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
-       0,     0,     0,     0,    32,    33,    34,    35,    36,    37,
-       0,     0,     0,    41,    42,     0,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,     0,   133,    61,   134,   135,   136,
-     137,   138,     0,     0,   139,   140,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   141,     8,     9,    10,    11,     0,     0,
-       0,     0,     0,   270,   143,   144,   145,   146,     0,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,     0,     0,     0,     0,     0,    32,
-      33,    34,    35,    36,    37,     0,     0,     0,    41,    42,
-       0,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,     0,    57,    58,    59,     0,
-     133,    61,   134,   135,   136,   137,   138,     0,     0,   139,
-     140,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   141,     0,
-       0,   295,     8,     9,    10,    11,     0,     0,     0,   143,
-     144,   145,   146,     0,     0,     0,     0,    12,    13,    14,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       0,     0,     0,   204,   306,     0,     0,     0,     0,   206,
+     157,   158,   159,   160,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   193,   194,   195,     0,   196,
+     197,   198,   199,   200,   201,   202,    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,   203,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       0,     0,     0,   204,     0,     0,     0,     0,     0,   206,
+     157,   158,   159,   160,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   193,   194,   195,     0,   196,
+     197,   198,   199,   200,   201,   202,    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,   203,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       0,     0,     0,   131,     0,     0,     0,     0,     0,   206,
+     157,   158,   159,   160,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,   193,   194,   195,     0,   196,
+     197,   198,   199,   200,   201,   202,    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,   203,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   206,
+     157,   158,   159,   160,     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,     0,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     1,     2,     3,     4,   155,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,   206,
+     157,   158,   159,   160,     0,     0,     0,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,     0,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,    37,     0,     0,     0,    41,    42,     0,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    56,     0,    57,    58,    59,     0,   133,    61,
-     134,   135,   136,   137,   138,     0,     0,   139,   140,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   141,     8,     9,    10,
-      11,     0,     0,     0,     0,     0,     0,   143,   144,   145,
-     146,     0,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
-       0,     0,    32,    33,    34,    35,    36,    37,     0,     0,
-       0,    41,   234,     0,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,     0,    57,
-      58,    59,     0,   133,    61,   134,   135,   136,   137,   138,
-       0,     0,   139,   140,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     1,     2,     3,
-       4,   141,     6,     7,     8,     9,    10,    11,     0,     0,
-       0,     0,   143,   144,   145,   146,     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,
-       0,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,     0,    57,    58,    59,    60,
-       0,    61,     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,   222,    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,     0,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,    60,     0,    61,     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,   259,    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,
-       0,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,     0,    57,    58,    59,    60,
-       0,    61,     0,     0,     0,     0,     0,     0,     0,   109,
-       0,     0,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   333,    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,     0,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,    60,     0,    61,     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,
-       0,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    54,    55,    56,     0,    57,    58,    59,    60,
-       0,    61,     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,     0,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
-       0,    57,    58,    59,    60,     0,    61,     8,     9,    10,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,     0,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,   147,    75,   148,   149,   150,   151,   152,     0,
+       0,   153,   154,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     1,     2,     3,     4,
+     155,     6,     7,     8,     9,    10,    11,     0,     0,     0,
+       0,   157,   158,   159,   160,     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,     0,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,     0,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    73,    74,   117,    75,     0,     0,     8,     9,    10,
       11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,     0,     0,     0,
-       0,     0,    32,    33,    34,    35,    36,    37,     0,     0,
-       0,    41,    42,     0,    43,    44,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,    54,    55,    56,     0,    57,
-      58,    59,     0,   309,    61,     8,     9,    10,    11,   310,
+       0,   118,    32,    33,    34,    35,    36,    37,     0,     0,
+       0,     0,     0,    43,    44,     0,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+       0,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,     0,   147,    75,   148,
+     149,   150,   151,   152,     0,     0,   153,   154,     0,     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,
-      32,    33,    34,    35,    36,    37,     0,     0,     0,    41,
-      42,     0,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,     0,    57,    58,    59,
-       0,     0,    61
+       0,     0,     0,     0,     0,   155,     0,     0,   156,     8,
+       9,    10,    11,     0,     0,     0,   157,   158,   159,   160,
+       0,     0,     0,     0,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,     0,
+       0,     0,     0,     0,    32,    33,    34,    35,    36,    37,
+       0,     0,     0,     0,     0,    43,    44,     0,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,     0,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,     0,   147,
+      75,   148,   149,   150,   151,   152,     0,     0,   153,   154,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   155,     0,     0,
+     228,     8,     9,    10,    11,     0,     0,     0,   157,   158,
+     159,   160,     0,     0,     0,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,    37,     0,     0,     0,     0,     0,    43,    44,     0,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+       0,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   155,
+       8,     9,    10,    11,     0,     0,     0,     0,     0,   284,
+     157,   158,   159,   160,     0,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+       0,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+      37,     0,     0,     0,     0,     0,    43,    44,     0,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,     0,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,     0,
+     147,    75,   148,   149,   150,   151,   152,     0,     0,   153,
+     154,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   155,     0,
+       0,   309,     8,     9,    10,    11,     0,     0,     0,   157,
+     158,   159,   160,     0,     0,     0,     0,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,     0,     0,     0,     0,     0,    32,    33,    34,
+      35,    36,    37,     0,     0,     0,     0,     0,    43,    44,
+       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,     0,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,     0,   147,    75,   148,   149,   150,   151,   152,     0,
+       0,   153,   154,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     155,     8,     9,    10,    11,     0,     0,     0,     0,     0,
+       0,   157,   158,   159,   160,     0,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,    37,     0,     0,     0,     0,     0,    43,   248,     0,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+       0,   147,    75,   148,   149,   150,   151,   152,     0,     0,
+     153,   154,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     1,     2,     3,     4,   155,
+       6,     7,     8,     9,    10,    11,     0,     0,     0,     0,
+     157,   158,   159,   160,     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,
+       0,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,     0,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    74,     0,    75,     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,   236,    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,     0,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,     0,    75,     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,   273,    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,     0,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,     0,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+       0,    75,     0,     0,     0,     0,     0,     0,     0,   123,
+       0,     0,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   347,    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,     0,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,     0,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,    74,     0,
+      75,     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,     0,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,     0,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    74,     0,    75,
+       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,     0,    45,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+       0,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    73,    74,     0,    75,     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,    32,    33,    34,    35,    36,    37,
+       0,     0,     0,     0,     0,    43,    44,     0,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    54,    55,    56,
+      57,    58,     0,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    71,    72,    73,     0,   323,
+      75,     8,     9,    10,    11,   324,     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,    32,    33,    34,    35,
+      36,    37,     0,     0,     0,     0,     0,    43,    44,     0,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,     0,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+       0,     0,    75
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    41,    71,    91,   126,    66,   204,    66,   141,     0,
-      71,   131,   112,     0,   336,    92,   342,   364,    76,   106,
-     105,   104,   108,    76,    77,   114,   111,   114,    97,    69,
-     111,   106,    93,   155,    93,   105,    97,   363,   113,   125,
-     106,    87,    88,   108,   105,   392,   105,   125,   108,   114,
-     127,   112,   185,   112,   174,   108,   114,   106,    98,    99,
-     129,    85,    86,   385,   113,   125,    66,   108,   129,   391,
-     131,    71,   131,   213,    76,   175,   122,   123,   108,   139,
-     140,    81,   106,   105,    84,   111,   110,   104,   114,   111,
-      81,   213,   111,    93,    81,   114,   229,    97,   158,   114,
-     105,   187,   105,   113,   105,   105,   111,   106,   111,   187,
-     111,   233,   112,   174,   175,   174,   175,   117,   245,   246,
-     247,   248,   105,   104,   257,   211,   212,   187,   111,   129,
-     116,   131,   118,   211,   212,   268,    76,    77,   111,   272,
-     260,   114,   105,   111,   111,   343,   114,   114,     4,     5,
-       6,   211,   212,   119,   120,   121,    76,    77,   298,    83,
-      84,    89,    90,    79,    80,   111,   112,   289,   290,   241,
-     242,   104,   243,   244,   174,   175,   298,   126,   238,   239,
-     240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
-     250,   251,   252,   253,   254,   255,   256,   249,   250,   260,
-     125,   260,   124,    91,   204,   107,    93,   347,   114,   342,
-     350,   114,   104,   104,   114,   301,   112,   107,   104,   104,
-     109,   104,    56,   301,   106,   347,   105,   108,   350,   113,
-     363,   107,   372,   113,   112,   357,   107,   107,   113,   111,
-     104,   301,   107,   104,   377,   113,   105,   335,   114,   109,
-     372,   105,   107,    17,   394,   108,   113,   390,   230,   251,
-     260,   254,   114,   114,   252,   255,    97,   256,   354,   253,
-      93,    97,   394,     5,   178,   218,   354,   277,   383,   302,
-     337,   391,   277,   342,    94,    95,    96,    97,    98,    99,
-     100,   101,   102,   103,   354,   337,   363,    81,    -1,   368,
-      -1,    -1,    -1,   113,   363,    -1,    -1,   368,    -1,    -1,
+       0,    43,    85,   140,    80,   218,   105,    80,   155,    85,
+       0,   145,   227,     0,   139,   126,   106,   378,    90,   350,
+     120,   356,   101,   102,   130,   120,   132,   127,   111,   120,
+     122,   107,   169,   128,   107,   111,   127,   125,    99,   100,
+     128,    83,   377,   119,   118,   406,   119,   139,   128,   119,
+     126,   141,   199,   126,   188,   125,   128,   136,   137,   120,
+     143,    90,    91,   124,   133,   134,   135,   143,   399,   145,
+     112,   113,   145,   122,   405,   119,   201,   125,   189,   128,
+      80,   125,   119,   119,   125,    85,   119,   128,   125,   125,
+     227,   125,   125,   122,   128,    95,   243,   312,    98,   125,
+     225,   226,   128,   125,   119,    95,   128,   107,    95,   201,
+     247,   111,   188,   189,   119,   188,   189,    90,    91,   119,
+     125,     4,     5,     6,   271,   120,   126,   259,   260,   261,
+     262,   131,   118,   225,   226,   282,    90,    91,   122,   286,
+     274,    97,    98,   143,   357,   145,   361,    93,    94,   364,
+     108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
+     103,   104,   125,   126,   257,   258,   303,   304,    90,   127,
+     122,   386,   127,   255,   256,   312,   263,   264,   128,   120,
+     118,   118,   122,   119,   105,   127,   121,   140,   188,   189,
+     315,   139,   107,   408,   138,   128,   128,   128,   274,   139,
+     118,   274,   118,   126,   118,   118,   123,   118,   120,   356,
+     119,   121,    58,   153,   154,   122,   121,   121,   218,   127,
+     126,   121,   125,   315,   361,   127,   118,   364,   127,   118,
+     377,   121,   172,   119,   371,   123,   121,   128,   119,    17,
+     122,   128,   244,   368,   391,   265,   267,   127,   266,   386,
+     349,   128,   268,   270,   111,   269,   107,   404,   111,     5,
+     232,   201,   192,   316,   397,   351,   405,   291,   377,    95,
+     351,   408,    -1,    -1,   274,    -1,   368,    -1,    -1,    -1,
+      -1,    -1,    -1,   356,    -1,   225,   226,    -1,    -1,    -1,
+      -1,   291,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   382,
+      -1,    -1,    -1,    -1,   377,    -1,   382,    -1,    -1,    -1,
+      -1,    -1,   252,   253,   254,   255,   256,   257,   258,   259,
+     260,   261,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   381,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   367,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   336,   337,    -1,    -1,
-      -1,    -1,   342,   343,    -1,    -1,    -1,    -1,    -1,    -1,
+     350,   351,    -1,    -1,    -1,    -1,   356,   357,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   363,    -1,    -1,    -1,    -1,   368,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   385,    -1,    -1,    -1,    -1,
-      -1,   391,     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,
-      -1,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   104,    -1,    -1,    -1,   108,   109,    -1,
-      -1,    -1,    -1,   114,   115,   116,   117,   118,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    -1,    18,    19,    20,    21,    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,    -1,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    -1,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,
-      -1,    -1,    -1,   108,   109,    -1,    -1,    -1,    -1,   114,
-     115,   116,   117,   118,     3,     4,     5,     6,     7,     8,
+      -1,    -1,    -1,    -1,    -1,   315,    -1,   377,    -1,    -1,
+      -1,    -1,   382,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   399,
+      -1,    -1,    -1,    -1,    -1,   405,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,   368,    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,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,   122,   123,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,     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,    -1,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,    -1,   108,
-      -1,    -1,    -1,    -1,    -1,   114,   115,   116,   117,   118,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    -1,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    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,    -1,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
-      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   104,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
-      -1,   114,   115,   116,   117,   118,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      -1,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,   122,   123,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,     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,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,     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,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,   122,    -1,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,     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,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,     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,    -1,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,   118,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,    -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,
+      -1,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    -1,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    90,    91,    92,    93,    94,    95,    96,    -1,
+      -1,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+     118,     8,     9,    10,    11,    12,    13,    -1,    -1,    -1,
+      -1,   129,   130,   131,   132,    -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,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    75,    76,
-      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   114,   115,   116,
-     117,   118,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,   104,     8,     9,    10,    11,    12,    13,
-      -1,    -1,    -1,   114,   115,   116,   117,   118,    -1,    -1,
-      -1,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      54,    55,    -1,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    -1,    72,    73,
-      74,    75,    76,    77,    78,    79,    80,    81,    82,    -1,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
-     104,     8,     9,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,   115,   116,   117,   118,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    51,    52,    53,    54,    55,    -1,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    75,    76,
-      77,    -1,    -1,    10,    11,    12,    13,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,   114,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,
-      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    -1,    72,    73,    74,    -1,    76,
-      77,    78,    79,    80,    81,    82,    -1,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,
-     107,    10,    11,    12,    13,    -1,    -1,    -1,   115,   116,
-     117,   118,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
-      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    -1,    72,    73,    74,    -1,    76,    77,    78,
-      79,    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   104,    -1,    -1,   107,    10,
-      11,    12,    13,    -1,    -1,    -1,   115,   116,   117,   118,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
-      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    -1,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    -1,    76,    77,    78,    79,    80,
-      81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   104,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,    -1,   114,   115,   116,   117,   118,    -1,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,    45,
-      46,    47,    48,    49,    50,    -1,    -1,    -1,    54,    55,
-      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    -1,
-      76,    77,    78,    79,    80,    81,    82,    -1,    -1,    85,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,    -1,
-      -1,   107,    10,    11,    12,    13,    -1,    -1,    -1,   115,
-     116,   117,   118,    -1,    -1,    -1,    -1,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
-      48,    49,    50,    -1,    -1,    -1,    54,    55,    -1,    57,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    -1,    72,    73,    74,    -1,    76,    77,
-      78,    79,    80,    81,    82,    -1,    -1,    85,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   104,    10,    11,    12,
-      13,    -1,    -1,    -1,    -1,    -1,    -1,   115,   116,   117,
-     118,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    -1,    76,    77,    78,    79,    80,    81,    82,
-      -1,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
-       6,   104,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,   115,   116,   117,   118,    -1,    -1,    -1,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
-      -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     3,     4,     5,     6,    -1,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   109,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    75,    -1,    77,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
-       6,    -1,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
-      -1,    77,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,
-      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   109,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    75,    -1,    77,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      -1,    57,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    -1,    72,    73,    74,    75,
-      -1,    77,     3,     4,     5,     6,    -1,     8,     9,    10,
-      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    -1,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      -1,    72,    73,    74,    75,    -1,    77,    10,    11,    12,
+      57,    -1,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    -1,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    84,    85,    86,
+      87,    88,    89,    90,    91,    -1,    -1,    10,    11,    12,
       13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
-      -1,    -1,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      -1,    54,    55,    -1,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    -1,    72,
-      73,    74,    -1,    76,    77,    10,    11,    12,    13,    82,
+      -1,   128,    45,    46,    47,    48,    49,    50,    -1,    -1,
+      -1,    -1,    -1,    56,    57,    -1,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      -1,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    -1,    90,    91,    92,
+      93,    94,    95,    96,    -1,    -1,    99,   100,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
-      45,    46,    47,    48,    49,    50,    -1,    -1,    -1,    54,
-      55,    -1,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    -1,    72,    73,    74,
-      -1,    -1,    77
+      -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,   121,    10,
+      11,    12,    13,    -1,    -1,    -1,   129,   130,   131,   132,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
+      -1,    -1,    -1,    -1,    -1,    56,    57,    -1,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    -1,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    -1,    90,
+      91,    92,    93,    94,    95,    96,    -1,    -1,    99,   100,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,
+     121,    10,    11,    12,    13,    -1,    -1,    -1,   129,   130,
+     131,   132,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    -1,    -1,    56,    57,    -1,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      -1,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,
+      10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,   128,
+     129,   130,   131,   132,    -1,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
+      50,    -1,    -1,    -1,    -1,    -1,    56,    57,    -1,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    -1,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    -1,
+      90,    91,    92,    93,    94,    95,    96,    -1,    -1,    99,
+     100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,
+      -1,   121,    10,    11,    12,    13,    -1,    -1,    -1,   129,
+     130,   131,   132,    -1,    -1,    -1,    -1,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
+      48,    49,    50,    -1,    -1,    -1,    -1,    -1,    56,    57,
+      -1,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    -1,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    -1,    90,    91,    92,    93,    94,    95,    96,    -1,
+      -1,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,    10,    11,    12,    13,    -1,    -1,    -1,    -1,    -1,
+      -1,   129,   130,   131,   132,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    -1,    -1,    56,    57,    -1,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      -1,    90,    91,    92,    93,    94,    95,    96,    -1,    -1,
+      99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,   118,
+       8,     9,    10,    11,    12,    13,    -1,    -1,    -1,    -1,
+     129,   130,   131,   132,    -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,
+      -1,    59,    60,    61,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,    71,    72,    -1,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    84,    85,    86,    87,
+      88,    89,    -1,    91,    -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,   123,    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,    -1,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    -1,    91,    -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,   123,    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,    -1,    59,
+      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,    71,    72,    -1,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      -1,    91,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,
+      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   123,    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,    -1,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    -1,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    -1,
+      91,     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,    -1,    59,    60,    61,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
+      72,    -1,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    84,    85,    86,    87,    88,    89,    -1,    91,
+       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,    -1,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      -1,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    87,    88,    89,    -1,    91,    10,
+      11,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
+      -1,    -1,    -1,    -1,    -1,    56,    57,    -1,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    -1,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    -1,    90,
+      91,    10,    11,    12,    13,    96,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    -1,    -1,    -1,    -1,    56,    57,    -1,
+      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    -1,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      -1,    -1,    91
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1471,75 +1561,78 @@
       12,    13,    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,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    72,    73,    74,
-      75,    77,   160,   161,   162,   163,   164,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   181,   182,
-     183,   218,   219,   220,   177,    76,    77,   108,   129,   104,
-     114,   221,   105,   111,   165,   166,   167,   172,   176,   111,
-     114,    76,   129,    76,   114,   159,   174,   176,   106,     0,
-     219,   181,   185,   108,    76,   179,   180,   108,   201,   166,
-     165,   167,   129,   129,   104,   106,   113,   108,   114,   172,
-     176,   186,   187,    76,    78,    79,    80,    81,    82,    85,
-      86,   104,   107,   115,   116,   117,   118,   130,   131,   132,
-     134,   135,   136,   137,   138,   139,   140,   141,   142,   143,
-     144,   145,   146,   147,   148,   149,   150,   151,   152,   153,
-     154,   158,   181,   114,   186,   184,   113,   105,   111,    14,
-      15,    16,    18,    19,    20,    21,    22,    23,    24,    56,
-     108,   109,   114,   141,   154,   155,   157,   160,   161,   181,
-     191,   192,   193,   194,   202,   203,   204,   206,   208,   210,
-     217,   106,   106,   113,   107,   158,   155,   190,   176,   129,
-     188,   189,   109,   187,   141,   141,   157,    85,    86,   106,
-     110,   105,   105,   111,    55,   155,   104,   141,   119,   120,
-     121,   116,   118,    83,    84,    87,    88,   122,   123,    89,
-      90,   126,   125,   124,    91,    93,    92,   127,   107,   109,
-     186,    79,    80,   180,   114,   114,   212,   104,   104,   114,
-     114,   157,   104,   158,   112,   104,   109,   195,    94,    95,
-      96,    97,    98,    99,   100,   101,   102,   103,   113,   156,
-     111,   114,   109,   192,   158,   107,   158,   190,   113,   107,
-     188,   106,   111,   114,    76,   114,   105,   133,   157,    76,
-      82,   136,   155,   141,   141,   141,   143,   143,   144,   144,
-     145,   145,   145,   145,   146,   146,   147,   148,   149,   150,
-     151,   152,   157,   109,   198,   199,   200,   213,   157,   114,
-     157,   112,   211,   202,   155,   155,   107,   113,   107,   190,
-     113,   114,   158,   189,   106,   114,   107,   112,    56,   201,
-     193,   191,   203,   214,   105,   105,   157,   170,   172,   209,
-     196,   190,   113,   190,   107,   158,   155,   104,   209,   215,
-     216,   198,   205,   207,   129,   105,   109,   190,   107,   157,
-     114,   105,    17,   194,   113,   193,   197,   201,   114,   105,
-     157,   197,   198,   190,   114
+      53,    54,    55,    56,    57,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    91,   174,   175,   176,   177,
+     178,   182,   183,   184,   185,   186,   187,   188,   189,   190,
+     191,   192,   195,   196,   197,   232,   233,   234,   191,    90,
+      91,   122,   143,   118,   128,   235,   119,   125,   179,   180,
+     181,   186,   190,   125,   128,    90,   143,    90,   128,   173,
+     188,   190,   120,     0,   233,   195,   199,   122,    90,   193,
+     194,   122,   215,   180,   179,   181,   143,   143,   118,   120,
+     127,   122,   128,   186,   190,   200,   201,    90,    92,    93,
+      94,    95,    96,    99,   100,   118,   121,   129,   130,   131,
+     132,   144,   145,   146,   148,   149,   150,   151,   152,   153,
+     154,   155,   156,   157,   158,   159,   160,   161,   162,   163,
+     164,   165,   166,   167,   168,   172,   195,   128,   200,   198,
+     127,   119,   125,    14,    15,    16,    18,    19,    20,    21,
+      22,    23,    24,    58,   122,   123,   128,   155,   168,   169,
+     171,   174,   175,   195,   205,   206,   207,   208,   216,   217,
+     218,   220,   222,   224,   231,   120,   120,   127,   121,   172,
+     169,   204,   190,   143,   202,   203,   123,   201,   155,   155,
+     171,    99,   100,   120,   124,   119,   119,   125,    57,   169,
+     118,   155,   133,   134,   135,   130,   132,    97,    98,   101,
+     102,   136,   137,   103,   104,   140,   139,   138,   105,   107,
+     106,   141,   121,   123,   200,    93,    94,   194,   128,   128,
+     226,   118,   118,   128,   128,   171,   118,   172,   126,   118,
+     123,   209,   108,   109,   110,   111,   112,   113,   114,   115,
+     116,   117,   127,   170,   125,   128,   123,   206,   172,   121,
+     172,   204,   127,   121,   202,   120,   125,   128,    90,   128,
+     119,   147,   171,    90,    96,   150,   169,   155,   155,   155,
+     157,   157,   158,   158,   159,   159,   159,   159,   160,   160,
+     161,   162,   163,   164,   165,   166,   171,   123,   212,   213,
+     214,   227,   171,   128,   171,   126,   225,   216,   169,   169,
+     121,   127,   121,   204,   127,   128,   172,   203,   120,   128,
+     121,   126,    58,   215,   207,   205,   217,   228,   119,   119,
+     171,   184,   186,   223,   210,   204,   127,   204,   121,   172,
+     169,   118,   223,   229,   230,   212,   219,   221,   143,   119,
+     123,   204,   121,   171,   128,   119,    17,   208,   127,   207,
+     211,   215,   128,   119,   171,   211,   212,   204,   128
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,   128,   129,   129,   130,   131,   131,   131,   131,   131,
-     131,   132,   132,   132,   132,   132,   132,   133,   134,   135,
-     135,   136,   136,   137,   137,   138,   138,   139,   140,   140,
-     140,   141,   141,   141,   141,   142,   142,   142,   142,   143,
-     143,   143,   143,   144,   144,   144,   145,   145,   145,   146,
-     146,   146,   146,   146,   147,   147,   147,   148,   148,   149,
-     149,   150,   150,   151,   151,   152,   152,   153,   153,   154,
-     154,   155,   155,   156,   156,   156,   156,   156,   156,   156,
-     156,   156,   156,   156,   157,   157,   158,   159,   160,   160,
-     160,   160,   160,   160,   160,   160,   161,   162,   162,   163,
-     163,   164,   165,   165,   166,   166,   166,   166,   167,   168,
-     168,   168,   168,   168,   168,   169,   169,   169,   169,   169,
-     169,   170,   170,   171,   171,   172,   172,   173,   174,   174,
-     174,   174,   174,   175,   175,   175,   175,   175,   175,   175,
-     175,   176,   177,   177,   177,   178,   179,   179,   180,   180,
-     180,   181,   181,   181,   182,   182,   182,   182,   182,   182,
-     182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
-     182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
-     182,   182,   182,   182,   182,   182,   182,   182,   182,   182,
-     182,   182,   182,   182,   182,   182,   182,   182,   182,   184,
-     183,   185,   183,   186,   186,   187,   187,   188,   188,   189,
-     189,   190,   191,   192,   192,   193,   193,   193,   193,   193,
-     193,   193,   194,   195,   196,   194,   197,   197,   199,   198,
-     200,   198,   201,   201,   202,   202,   203,   203,   204,   205,
-     205,   207,   206,   208,   208,   209,   209,   211,   210,   212,
-     210,   213,   210,   214,   214,   215,   215,   216,   216,   217,
-     217,   217,   217,   217,   218,   218,   219,   219,   221,   220
+       0,   142,   143,   143,   144,   145,   145,   145,   145,   145,
+     145,   146,   146,   146,   146,   146,   146,   147,   148,   149,
+     149,   150,   150,   151,   151,   152,   152,   153,   154,   154,
+     154,   155,   155,   155,   155,   156,   156,   156,   156,   157,
+     157,   157,   157,   158,   158,   158,   159,   159,   159,   160,
+     160,   160,   160,   160,   161,   161,   161,   162,   162,   163,
+     163,   164,   164,   165,   165,   166,   166,   167,   167,   168,
+     168,   169,   169,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   171,   171,   172,   173,   174,   174,
+     174,   174,   174,   174,   174,   174,   175,   176,   176,   177,
+     177,   178,   179,   179,   180,   180,   180,   180,   181,   182,
+     182,   182,   182,   182,   182,   183,   183,   183,   183,   183,
+     183,   184,   184,   185,   185,   186,   186,   187,   188,   188,
+     188,   188,   188,   189,   189,   189,   189,   189,   189,   189,
+     189,   189,   189,   190,   191,   191,   191,   192,   193,   193,
+     194,   194,   194,   195,   195,   195,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   196,   196,   196,   196,   196,   196,   196,
+     196,   196,   196,   198,   197,   199,   197,   200,   200,   201,
+     201,   202,   202,   203,   203,   204,   205,   206,   206,   207,
+     207,   207,   207,   207,   207,   207,   208,   209,   210,   208,
+     211,   211,   213,   212,   214,   212,   215,   215,   216,   216,
+     217,   217,   218,   219,   219,   221,   220,   222,   222,   223,
+     223,   225,   224,   226,   224,   227,   224,   228,   228,   229,
+     229,   230,   230,   231,   231,   231,   231,   231,   232,   232,
+     233,   233,   235,   234
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1559,19 +1652,21 @@
        3,     6,     7,     8,     5,     1,     2,     5,     6,     7,
        4,     1,     2,     1,     1,     1,     2,     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,     3,     4,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     4,     1,     3,
+       1,     3,     3,     1,     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,     0,
-       6,     0,     5,     1,     2,     3,     4,     1,     3,     1,
-       4,     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,     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,     4,     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
 };
 
 
@@ -3441,11 +3536,8 @@
   case 128:
 
     {
-        if (!context->declaringFunction() && (yyvsp[0].interm.qualifier) != EvqConst && !context->symbolTable.atGlobalLevel())
-        {
-            context->error((yylsp[0]), "Local variables can only use the const storage qualifier.", getQualifierString((yyvsp[0].interm.qualifier)));
-        }
-        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper((yyvsp[0].interm.qualifier), (yylsp[0]));
+        context->checkLocalVariableConstStorageQualifier(*(yyvsp[0].interm.qualifierWrapper));
+        (yyval.interm.qualifierWrapper) = (yyvsp[0].interm.qualifierWrapper);
     }
 
     break;
@@ -3490,7 +3582,7 @@
         VERTEX_ONLY("attribute", (yylsp[0]));
         ES2_ONLY("attribute", (yylsp[0]));
         context->checkIsAtGlobalLevel((yylsp[0]), "attribute");
-        (yyval.interm.qualifier) = EvqAttribute;
+        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqAttribute, (yylsp[0]));
     }
 
     break;
@@ -3501,9 +3593,9 @@
         ES2_ONLY("varying", (yylsp[0]));
         context->checkIsAtGlobalLevel((yylsp[0]), "varying");
         if (context->getShaderType() == GL_VERTEX_SHADER)
-            (yyval.interm.qualifier) = EvqVaryingOut;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqVaryingOut, (yylsp[0]));
         else
-            (yyval.interm.qualifier) = EvqVaryingIn;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqVaryingIn, (yylsp[0]));
     }
 
     break;
@@ -3511,7 +3603,7 @@
   case 135:
 
     {
-        (yyval.interm.qualifier) = EvqConst;
+        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqConst, (yylsp[0]));
     }
 
     break;
@@ -3521,21 +3613,21 @@
     {
         if (context->declaringFunction())
         {
-            (yyval.interm.qualifier) = EvqIn;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqIn, (yylsp[0]));
         }
         else if (context->getShaderType() == GL_FRAGMENT_SHADER)
         {
             ES3_OR_NEWER("in", (yylsp[0]), "storage qualifier");
-            (yyval.interm.qualifier) = EvqFragmentIn;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqFragmentIn, (yylsp[0]));
         }
         else if (context->getShaderType() == GL_VERTEX_SHADER)
         {
             ES3_OR_NEWER("in", (yylsp[0]), "storage qualifier");
-            (yyval.interm.qualifier) = EvqVertexIn;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqVertexIn, (yylsp[0]));
         }
         else
         {
-            (yyval.interm.qualifier) = EvqComputeIn;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqComputeIn, (yylsp[0]));
         }
     }
 
@@ -3546,7 +3638,7 @@
     {
         if (context->declaringFunction())
         {
-            (yyval.interm.qualifier) = EvqOut;
+            (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqOut, (yylsp[0]));
         }
         else
         {
@@ -3554,11 +3646,11 @@
             NON_COMPUTE_ONLY("out", (yylsp[0]));
             if (context->getShaderType() == GL_FRAGMENT_SHADER)
             {
-                (yyval.interm.qualifier) = EvqFragmentOut;
+                (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqFragmentOut, (yylsp[0]));
             }
             else
             {
-                (yyval.interm.qualifier) = EvqVertexOut;
+                (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqVertexOut, (yylsp[0]));
             }
         }
     }
@@ -3572,7 +3664,7 @@
         {
             context->error((yylsp[0]), "invalid inout qualifier", "'inout' can be only used with function parameters");
         }
-        (yyval.interm.qualifier) = EvqInOut;
+        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqInOut, (yylsp[0]));
     }
 
     break;
@@ -3581,7 +3673,7 @@
 
     {
         ES3_OR_NEWER("centroid", (yylsp[0]), "storage qualifier");
-        (yyval.interm.qualifier) = EvqCentroid;
+        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqCentroid, (yylsp[0]));
     }
 
     break;
@@ -3590,7 +3682,7 @@
 
     {
         context->checkIsAtGlobalLevel((yylsp[0]), "uniform");
-        (yyval.interm.qualifier) = EvqUniform;
+        (yyval.interm.qualifierWrapper) = new TStorageQualifierWrapper(EvqUniform, (yylsp[0]));
     }
 
     break;
@@ -3598,6 +3690,22 @@
   case 141:
 
     {
+        (yyval.interm.qualifierWrapper) = new TMemoryQualifierWrapper(EvqReadOnly, (yylsp[0]));
+    }
+
+    break;
+
+  case 142:
+
+    {
+        (yyval.interm.qualifierWrapper) = new TMemoryQualifierWrapper(EvqWriteOnly, (yylsp[0]));
+    }
+
+    break;
+
+  case 143:
+
+    {
         (yyval.interm.type) = (yyvsp[0].interm.type);
 
         if ((yyval.interm.type).precision == EbpUndefined) {
@@ -3607,7 +3715,7 @@
 
     break;
 
-  case 142:
+  case 144:
 
     {
         (yyval.interm.precision) = EbpHigh;
@@ -3615,7 +3723,7 @@
 
     break;
 
-  case 143:
+  case 145:
 
     {
         (yyval.interm.precision) = EbpMedium;
@@ -3623,7 +3731,7 @@
 
     break;
 
-  case 144:
+  case 146:
 
     {
         (yyval.interm.precision) = EbpLow;
@@ -3631,7 +3739,7 @@
 
     break;
 
-  case 145:
+  case 147:
 
     {
         ES3_OR_NEWER("layout", (yylsp[-3]), "qualifier");
@@ -3640,7 +3748,7 @@
 
     break;
 
-  case 146:
+  case 148:
 
     {
         (yyval.interm.layoutQualifier) = (yyvsp[0].interm.layoutQualifier);
@@ -3648,7 +3756,7 @@
 
     break;
 
-  case 147:
+  case 149:
 
     {
         (yyval.interm.layoutQualifier) = context->joinLayoutQualifiers((yyvsp[-2].interm.layoutQualifier), (yyvsp[0].interm.layoutQualifier), (yylsp[0]));
@@ -3656,7 +3764,7 @@
 
     break;
 
-  case 148:
+  case 150:
 
     {
         (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[0].lex).string, (yylsp[0]));
@@ -3664,31 +3772,31 @@
 
     break;
 
-  case 149:
-
-    {
-        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0]));
-    }
-
-    break;
-
-  case 150:
-
-    {
-        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0]));
-    }
-
-    break;
-
   case 151:
 
     {
+        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0]));
+    }
+
+    break;
+
+  case 152:
+
+    {
+        (yyval.interm.layoutQualifier) = context->parseLayoutQualifier(*(yyvsp[-2].lex).string, (yylsp[-2]), (yyvsp[0].lex).i, (yylsp[0]));
+    }
+
+    break;
+
+  case 153:
+
+    {
         (yyval.interm.type).initialize((yyvsp[0].interm.typeSpecifierNonArray), (context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary));
     }
 
     break;
 
-  case 152:
+  case 154:
 
     {
         ES3_OR_NEWER("[]", (yylsp[-1]), "implicitly sized array");
@@ -3698,7 +3806,7 @@
 
     break;
 
-  case 153:
+  case 155:
 
     {
         (yyval.interm.type).initialize((yyvsp[-3].interm.typeSpecifierNonArray), (context->symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary));
@@ -3711,7 +3819,7 @@
 
     break;
 
-  case 154:
+  case 156:
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtVoid, (yylsp[0]));
@@ -3719,26 +3827,10 @@
 
     break;
 
-  case 155:
-
-    {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-    }
-
-    break;
-
-  case 156:
-
-    {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
-    }
-
-    break;
-
   case 157:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
     }
 
     break;
@@ -3746,7 +3838,7 @@
   case 158:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
     }
 
     break;
@@ -3754,8 +3846,7 @@
   case 159:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
     }
 
     break;
@@ -3763,8 +3854,7 @@
   case 160:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(3);
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
     }
 
     break;
@@ -3773,7 +3863,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3781,8 +3871,8 @@
   case 162:
 
     {
-        (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;
@@ -3790,8 +3880,8 @@
   case 163:
 
     {
-        (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;
@@ -3800,7 +3890,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtBool, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3808,8 +3898,8 @@
   case 165:
 
     {
-        (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;
@@ -3817,8 +3907,8 @@
   case 166:
 
     {
-        (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;
@@ -3827,7 +3917,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3835,8 +3925,8 @@
   case 168:
 
     {
-        (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;
@@ -3844,8 +3934,8 @@
   case 169:
 
     {
-        (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;
@@ -3854,7 +3944,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtUInt, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setAggregate(4);
+        (yyval.interm.typeSpecifierNonArray).setAggregate(2);
     }
 
     break;
@@ -3862,8 +3952,8 @@
   case 171:
 
     {
-        (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;
@@ -3871,8 +3961,8 @@
   case 172:
 
     {
-        (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;
@@ -3881,7 +3971,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 2);
     }
 
     break;
@@ -3890,7 +3980,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 3);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 3);
     }
 
     break;
@@ -3899,7 +3989,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 2);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 4);
     }
 
     break;
@@ -3908,7 +3998,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 3);
     }
 
     break;
@@ -3917,7 +4007,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 2);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 2);
     }
 
     break;
@@ -3926,7 +4016,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 4);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(2, 4);
     }
 
     break;
@@ -3935,7 +4025,7 @@
 
     {
         (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
-        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 3);
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 2);
     }
 
     break;
@@ -3943,7 +4033,8 @@
   case 180:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setMatrix(3, 4);
     }
 
     break;
@@ -3951,7 +4042,8 @@
   case 181:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler3D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtFloat, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).setMatrix(4, 3);
     }
 
     break;
@@ -3959,7 +4051,7 @@
   case 182:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCube, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2D, (yylsp[0]));
     }
 
     break;
@@ -3967,7 +4059,7 @@
   case 183:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArray, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler3D, (yylsp[0]));
     }
 
     break;
@@ -3975,7 +4067,7 @@
   case 184:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCube, (yylsp[0]));
     }
 
     break;
@@ -3983,7 +4075,7 @@
   case 185:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler3D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArray, (yylsp[0]));
     }
 
     break;
@@ -3991,7 +4083,7 @@
   case 186:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtISamplerCube, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2D, (yylsp[0]));
     }
 
     break;
@@ -3999,7 +4091,7 @@
   case 187:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DArray, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler3D, (yylsp[0]));
     }
 
     break;
@@ -4007,7 +4099,7 @@
   case 188:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtISamplerCube, (yylsp[0]));
     }
 
     break;
@@ -4015,7 +4107,7 @@
   case 189:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler3D, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtISampler2DArray, (yylsp[0]));
     }
 
     break;
@@ -4023,7 +4115,7 @@
   case 190:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSamplerCube, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2D, (yylsp[0]));
     }
 
     break;
@@ -4031,7 +4123,7 @@
   case 191:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DArray, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler3D, (yylsp[0]));
     }
 
     break;
@@ -4039,7 +4131,7 @@
   case 192:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DShadow, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSamplerCube, (yylsp[0]));
     }
 
     break;
@@ -4047,7 +4139,7 @@
   case 193:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCubeShadow, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUSampler2DArray, (yylsp[0]));
     }
 
     break;
@@ -4055,7 +4147,7 @@
   case 194:
 
     {
-        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArrayShadow, (yylsp[0]));
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DShadow, (yylsp[0]));
     }
 
     break;
@@ -4063,6 +4155,22 @@
   case 195:
 
     {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSamplerCubeShadow, (yylsp[0]));
+    }
+
+    break;
+
+  case 196:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtSampler2DArrayShadow, (yylsp[0]));
+    }
+
+    break;
+
+  case 197:
+
+    {
         if (!context->supportsExtension("GL_OES_EGL_image_external") &&
             !context->supportsExtension("GL_NV_EGL_stream_consumer_external")) {
             context->error((yylsp[0]), "unsupported type", "samplerExternalOES");
@@ -4072,7 +4180,7 @@
 
     break;
 
-  case 196:
+  case 198:
 
     {
         if (!context->supportsExtension("GL_ARB_texture_rectangle")) {
@@ -4083,7 +4191,7 @@
 
     break;
 
-  case 197:
+  case 199:
 
     {
         (yyval.interm.typeSpecifierNonArray) = (yyvsp[0].interm.typeSpecifierNonArray);
@@ -4091,7 +4199,103 @@
 
     break;
 
-  case 198:
+  case 200:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2D, (yylsp[0]));
+    }
+
+    break;
+
+  case 201:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2D, (yylsp[0]));
+    }
+
+    break;
+
+  case 202:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2D, (yylsp[0]));
+    }
+
+    break;
+
+  case 203:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtImage3D, (yylsp[0]));
+    }
+
+    break;
+
+  case 204:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage3D, (yylsp[0]));
+    }
+
+    break;
+
+  case 205:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage3D, (yylsp[0]));
+    }
+
+    break;
+
+  case 206:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtImage2DArray, (yylsp[0]));
+    }
+
+    break;
+
+  case 207:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtIImage2DArray, (yylsp[0]));
+    }
+
+    break;
+
+  case 208:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUImage2DArray, (yylsp[0]));
+    }
+
+    break;
+
+  case 209:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtImageCube, (yylsp[0]));
+    }
+
+    break;
+
+  case 210:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtIImageCube, (yylsp[0]));
+    }
+
+    break;
+
+  case 211:
+
+    {
+        (yyval.interm.typeSpecifierNonArray).initialize(EbtUImageCube, (yylsp[0]));
+    }
+
+    break;
+
+  case 212:
 
     {
         //
@@ -4105,13 +4309,13 @@
 
     break;
 
-  case 199:
+  case 213:
 
     { context->enterStructDeclaration((yylsp[-1]), *(yyvsp[-1].lex).string); }
 
     break;
 
-  case 200:
+  case 214:
 
     {
         (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-5]), (yylsp[-4]), (yyvsp[-4].lex).string, (yyvsp[-1].interm.fieldList));
@@ -4119,13 +4323,13 @@
 
     break;
 
-  case 201:
+  case 215:
 
     { context->enterStructDeclaration((yylsp[0]), *(yyvsp[0].lex).string); }
 
     break;
 
-  case 202:
+  case 216:
 
     {
         (yyval.interm.typeSpecifierNonArray) = context->addStructure((yylsp[-4]), (yyloc), NewPoolTString(""), (yyvsp[-1].interm.fieldList));
@@ -4133,7 +4337,7 @@
 
     break;
 
-  case 203:
+  case 217:
 
     {
         (yyval.interm.fieldList) = (yyvsp[0].interm.fieldList);
@@ -4141,7 +4345,7 @@
 
     break;
 
-  case 204:
+  case 218:
 
     {
         (yyval.interm.fieldList) = (yyvsp[-1].interm.fieldList);
@@ -4158,7 +4362,7 @@
 
     break;
 
-  case 205:
+  case 219:
 
     {
         (yyval.interm.fieldList) = context->addStructDeclaratorList((yyvsp[-2].interm.type), (yyvsp[-1].interm.fieldList));
@@ -4166,7 +4370,7 @@
 
     break;
 
-  case 206:
+  case 220:
 
     {
         // ES3 Only, but errors should be handled elsewhere
@@ -4175,7 +4379,7 @@
 
     break;
 
-  case 207:
+  case 221:
 
     {
         (yyval.interm.fieldList) = NewPoolTFieldList();
@@ -4184,7 +4388,7 @@
 
     break;
 
-  case 208:
+  case 222:
 
     {
         (yyval.interm.fieldList)->push_back((yyvsp[0].interm.field));
@@ -4192,7 +4396,7 @@
 
     break;
 
-  case 209:
+  case 223:
 
     {
         context->checkIsNotReserved((yylsp[0]), *(yyvsp[0].lex).string);
@@ -4203,7 +4407,7 @@
 
     break;
 
-  case 210:
+  case 224:
 
     {
         context->checkIsNotReserved((yylsp[-3]), *(yyvsp[-3].lex).string);
@@ -4217,91 +4421,91 @@
 
     break;
 
-  case 211:
+  case 225:
 
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
 
     break;
 
-  case 212:
+  case 226:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 213:
+  case 227:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
-  case 214:
+  case 228:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 215:
+  case 229:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 216:
+  case 230:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 217:
+  case 231:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 218:
+  case 232:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermSwitch); }
 
     break;
 
-  case 219:
+  case 233:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermCase); }
 
     break;
 
-  case 220:
+  case 234:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 221:
+  case 235:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 222:
+  case 236:
 
     { (yyval.interm.intermBlock) = 0; }
 
     break;
 
-  case 223:
+  case 237:
 
     { context->symbolTable.push(); }
 
     break;
 
-  case 224:
+  case 238:
 
     { context->symbolTable.pop(); }
 
     break;
 
-  case 225:
+  case 239:
 
     {
         if ((yyvsp[-2].interm.intermBlock) != 0) {
@@ -4312,43 +4516,43 @@
 
     break;
 
-  case 226:
+  case 240:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
-  case 227:
+  case 241:
 
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 228:
+  case 242:
 
     { context->symbolTable.push(); }
 
     break;
 
-  case 229:
+  case 243:
 
     { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermBlock); }
 
     break;
 
-  case 230:
+  case 244:
 
     { context->symbolTable.push(); }
 
     break;
 
-  case 231:
+  case 245:
 
     { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
 
     break;
 
-  case 232:
+  case 246:
 
     {
         (yyval.interm.intermBlock) = 0;
@@ -4356,7 +4560,7 @@
 
     break;
 
-  case 233:
+  case 247:
 
     {
         if ((yyvsp[-1].interm.intermBlock)) {
@@ -4367,7 +4571,7 @@
 
     break;
 
-  case 234:
+  case 248:
 
     {
         (yyval.interm.intermBlock) = new TIntermBlock();
@@ -4377,7 +4581,7 @@
 
     break;
 
-  case 235:
+  case 249:
 
     {
         (yyval.interm.intermBlock) = (yyvsp[-1].interm.intermBlock);
@@ -4386,19 +4590,19 @@
 
     break;
 
-  case 236:
+  case 250:
 
     { (yyval.interm.intermNode) = 0; }
 
     break;
 
-  case 237:
+  case 251:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
 
     break;
 
-  case 238:
+  case 252:
 
     {
         context->checkIsScalarBool((yylsp[-4]), (yyvsp[-2].interm.intermTypedNode));
@@ -4407,7 +4611,7 @@
 
     break;
 
-  case 239:
+  case 253:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
@@ -4416,7 +4620,7 @@
 
     break;
 
-  case 240:
+  case 254:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
@@ -4425,13 +4629,13 @@
 
     break;
 
-  case 241:
+  case 255:
 
     { context->incrSwitchNestingLevel(); }
 
     break;
 
-  case 242:
+  case 256:
 
     {
         (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermBlock), (yylsp[-5]));
@@ -4440,7 +4644,7 @@
 
     break;
 
-  case 243:
+  case 257:
 
     {
         (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4448,7 +4652,7 @@
 
     break;
 
-  case 244:
+  case 258:
 
     {
         (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
@@ -4456,7 +4660,7 @@
 
     break;
 
-  case 245:
+  case 259:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
@@ -4465,7 +4669,7 @@
 
     break;
 
-  case 246:
+  case 260:
 
     {
         TIntermNode *intermNode;
@@ -4480,13 +4684,13 @@
 
     break;
 
-  case 247:
+  case 261:
 
     { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
-  case 248:
+  case 262:
 
     {
         context->symbolTable.pop();
@@ -4496,13 +4700,13 @@
 
     break;
 
-  case 249:
+  case 263:
 
     { context->incrLoopNestingLevel(); }
 
     break;
 
-  case 250:
+  case 264:
 
     {
         context->checkIsScalarBool((yylsp[0]), (yyvsp[-2].interm.intermTypedNode));
@@ -4513,136 +4717,18 @@
 
     break;
 
-  case 251:
-
-    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
-
-    break;
-
-  case 252:
-
-    {
-        context->symbolTable.pop();
-        (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
-        context->decrLoopNestingLevel();
-    }
-
-    break;
-
-  case 253:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
-  case 254:
-
-    {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
-    }
-
-    break;
-
-  case 255:
-
-    {
-        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
-    }
-
-    break;
-
-  case 256:
-
-    {
-        (yyval.interm.intermTypedNode) = 0;
-    }
-
-    break;
-
-  case 257:
-
-    {
-        (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
-        (yyval.interm.nodePair).node2 = 0;
-    }
-
-    break;
-
-  case 258:
-
-    {
-        (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
-        (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
-    }
-
-    break;
-
-  case 259:
-
-    {
-        (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
-    }
-
-    break;
-
-  case 260:
-
-    {
-        (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
-    }
-
-    break;
-
-  case 261:
-
-    {
-        (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
-    }
-
-    break;
-
-  case 262:
-
-    {
-        (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
-    }
-
-    break;
-
-  case 263:
-
-    {
-        FRAG_ONLY("discard", (yylsp[-1]));
-        (yyval.interm.intermNode) = context->addBranch(EOpKill, (yylsp[-1]));
-    }
-
-    break;
-
-  case 264:
-
-    {
-        (yyval.interm.intermBlock) = new TIntermBlock();
-        (yyval.interm.intermBlock)->setLine((yyloc));
-        (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode));
-        context->setTreeRoot((yyval.interm.intermBlock));
-    }
-
-    break;
-
   case 265:
 
-    {
-        (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode));
-    }
+    { context->symbolTable.push(); context->incrLoopNestingLevel(); }
 
     break;
 
   case 266:
 
     {
-        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+        context->symbolTable.pop();
+        (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
+        context->decrLoopNestingLevel();
     }
 
     break;
@@ -4658,7 +4744,7 @@
   case 268:
 
     {
-        context->parseFunctionDefinitionHeader((yylsp[0]), &((yyvsp[0].interm).function), &(yyvsp[0].interm).intermAggregate);
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
 
     break;
@@ -4666,6 +4752,124 @@
   case 269:
 
     {
+        (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+    }
+
+    break;
+
+  case 270:
+
+    {
+        (yyval.interm.intermTypedNode) = 0;
+    }
+
+    break;
+
+  case 271:
+
+    {
+        (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
+        (yyval.interm.nodePair).node2 = 0;
+    }
+
+    break;
+
+  case 272:
+
+    {
+        (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
+        (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
+    }
+
+    break;
+
+  case 273:
+
+    {
+        (yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
+    }
+
+    break;
+
+  case 274:
+
+    {
+        (yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
+    }
+
+    break;
+
+  case 275:
+
+    {
+        (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
+    }
+
+    break;
+
+  case 276:
+
+    {
+        (yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
+    }
+
+    break;
+
+  case 277:
+
+    {
+        FRAG_ONLY("discard", (yylsp[-1]));
+        (yyval.interm.intermNode) = context->addBranch(EOpKill, (yylsp[-1]));
+    }
+
+    break;
+
+  case 278:
+
+    {
+        (yyval.interm.intermBlock) = new TIntermBlock();
+        (yyval.interm.intermBlock)->setLine((yyloc));
+        (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode));
+        context->setTreeRoot((yyval.interm.intermBlock));
+    }
+
+    break;
+
+  case 279:
+
+    {
+        (yyval.interm.intermBlock)->appendStatement((yyvsp[0].interm.intermNode));
+    }
+
+    break;
+
+  case 280:
+
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 281:
+
+    {
+        (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+    }
+
+    break;
+
+  case 282:
+
+    {
+        context->parseFunctionDefinitionHeader((yylsp[0]), &((yyvsp[0].interm).function), &(yyvsp[0].interm).intermAggregate);
+    }
+
+    break;
+
+  case 283:
+
+    {
         (yyval.interm.intermNode) = context->addFunctionDefinition(*((yyvsp[-2].interm).function), (yyvsp[-2].interm).intermAggregate, (yyvsp[0].interm.intermBlock), (yylsp[-2]));
     }
 
diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h
index d0e691d..09025b0 100644
--- a/src/compiler/translator/glslang_tab.h
+++ b/src/compiler/translator/glslang_tab.h
@@ -50,134 +50,148 @@
 /* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-  enum yytokentype
-  {
-    INVARIANT = 258,
-    HIGH_PRECISION = 259,
-    MEDIUM_PRECISION = 260,
-    LOW_PRECISION = 261,
-    PRECISION = 262,
-    ATTRIBUTE = 263,
-    CONST_QUAL = 264,
-    BOOL_TYPE = 265,
-    FLOAT_TYPE = 266,
-    INT_TYPE = 267,
-    UINT_TYPE = 268,
-    BREAK = 269,
-    CONTINUE = 270,
-    DO = 271,
-    ELSE = 272,
-    FOR = 273,
-    IF = 274,
-    DISCARD = 275,
-    RETURN = 276,
-    SWITCH = 277,
-    CASE = 278,
-    DEFAULT = 279,
-    BVEC2 = 280,
-    BVEC3 = 281,
-    BVEC4 = 282,
-    IVEC2 = 283,
-    IVEC3 = 284,
-    IVEC4 = 285,
-    VEC2 = 286,
-    VEC3 = 287,
-    VEC4 = 288,
-    UVEC2 = 289,
-    UVEC3 = 290,
-    UVEC4 = 291,
-    MATRIX2 = 292,
-    MATRIX3 = 293,
-    MATRIX4 = 294,
-    IN_QUAL = 295,
-    OUT_QUAL = 296,
-    INOUT_QUAL = 297,
-    UNIFORM = 298,
-    VARYING = 299,
-    MATRIX2x3 = 300,
-    MATRIX3x2 = 301,
-    MATRIX2x4 = 302,
-    MATRIX4x2 = 303,
-    MATRIX3x4 = 304,
-    MATRIX4x3 = 305,
-    CENTROID = 306,
-    FLAT = 307,
-    SMOOTH = 308,
-    STRUCT = 309,
-    VOID_TYPE = 310,
-    WHILE = 311,
-    SAMPLER2D = 312,
-    SAMPLERCUBE = 313,
-    SAMPLER_EXTERNAL_OES = 314,
-    SAMPLER2DRECT = 315,
-    SAMPLER2DARRAY = 316,
-    ISAMPLER2D = 317,
-    ISAMPLER3D = 318,
-    ISAMPLERCUBE = 319,
-    ISAMPLER2DARRAY = 320,
-    USAMPLER2D = 321,
-    USAMPLER3D = 322,
-    USAMPLERCUBE = 323,
-    USAMPLER2DARRAY = 324,
-    SAMPLER3D = 325,
-    SAMPLER3DRECT = 326,
-    SAMPLER2DSHADOW = 327,
-    SAMPLERCUBESHADOW = 328,
-    SAMPLER2DARRAYSHADOW = 329,
-    LAYOUT = 330,
-    IDENTIFIER = 331,
-    TYPE_NAME = 332,
-    FLOATCONSTANT = 333,
-    INTCONSTANT = 334,
-    UINTCONSTANT = 335,
-    BOOLCONSTANT = 336,
-    FIELD_SELECTION = 337,
-    LEFT_OP = 338,
-    RIGHT_OP = 339,
-    INC_OP = 340,
-    DEC_OP = 341,
-    LE_OP = 342,
-    GE_OP = 343,
-    EQ_OP = 344,
-    NE_OP = 345,
-    AND_OP = 346,
-    OR_OP = 347,
-    XOR_OP = 348,
-    MUL_ASSIGN = 349,
-    DIV_ASSIGN = 350,
-    ADD_ASSIGN = 351,
-    MOD_ASSIGN = 352,
-    LEFT_ASSIGN = 353,
-    RIGHT_ASSIGN = 354,
-    AND_ASSIGN = 355,
-    XOR_ASSIGN = 356,
-    OR_ASSIGN = 357,
-    SUB_ASSIGN = 358,
-    LEFT_PAREN = 359,
-    RIGHT_PAREN = 360,
-    LEFT_BRACKET = 361,
-    RIGHT_BRACKET = 362,
-    LEFT_BRACE = 363,
-    RIGHT_BRACE = 364,
-    DOT = 365,
-    COMMA = 366,
-    COLON = 367,
-    EQUAL = 368,
-    SEMICOLON = 369,
-    BANG = 370,
-    DASH = 371,
-    TILDE = 372,
-    PLUS = 373,
-    STAR = 374,
-    SLASH = 375,
-    PERCENT = 376,
-    LEFT_ANGLE = 377,
-    RIGHT_ANGLE = 378,
-    VERTICAL_BAR = 379,
-    CARET = 380,
-    AMPERSAND = 381,
-    QUESTION = 382
-  };
+enum yytokentype
+{
+    INVARIANT            = 258,
+    HIGH_PRECISION       = 259,
+    MEDIUM_PRECISION     = 260,
+    LOW_PRECISION        = 261,
+    PRECISION            = 262,
+    ATTRIBUTE            = 263,
+    CONST_QUAL           = 264,
+    BOOL_TYPE            = 265,
+    FLOAT_TYPE           = 266,
+    INT_TYPE             = 267,
+    UINT_TYPE            = 268,
+    BREAK                = 269,
+    CONTINUE             = 270,
+    DO                   = 271,
+    ELSE                 = 272,
+    FOR                  = 273,
+    IF                   = 274,
+    DISCARD              = 275,
+    RETURN               = 276,
+    SWITCH               = 277,
+    CASE                 = 278,
+    DEFAULT              = 279,
+    BVEC2                = 280,
+    BVEC3                = 281,
+    BVEC4                = 282,
+    IVEC2                = 283,
+    IVEC3                = 284,
+    IVEC4                = 285,
+    VEC2                 = 286,
+    VEC3                 = 287,
+    VEC4                 = 288,
+    UVEC2                = 289,
+    UVEC3                = 290,
+    UVEC4                = 291,
+    MATRIX2              = 292,
+    MATRIX3              = 293,
+    MATRIX4              = 294,
+    IN_QUAL              = 295,
+    OUT_QUAL             = 296,
+    INOUT_QUAL           = 297,
+    UNIFORM              = 298,
+    VARYING              = 299,
+    MATRIX2x3            = 300,
+    MATRIX3x2            = 301,
+    MATRIX2x4            = 302,
+    MATRIX4x2            = 303,
+    MATRIX3x4            = 304,
+    MATRIX4x3            = 305,
+    CENTROID             = 306,
+    FLAT                 = 307,
+    SMOOTH               = 308,
+    READONLY             = 309,
+    WRITEONLY            = 310,
+    STRUCT               = 311,
+    VOID_TYPE            = 312,
+    WHILE                = 313,
+    SAMPLER2D            = 314,
+    SAMPLERCUBE          = 315,
+    SAMPLER_EXTERNAL_OES = 316,
+    SAMPLER2DRECT        = 317,
+    SAMPLER2DARRAY       = 318,
+    ISAMPLER2D           = 319,
+    ISAMPLER3D           = 320,
+    ISAMPLERCUBE         = 321,
+    ISAMPLER2DARRAY      = 322,
+    USAMPLER2D           = 323,
+    USAMPLER3D           = 324,
+    USAMPLERCUBE         = 325,
+    USAMPLER2DARRAY      = 326,
+    SAMPLER3D            = 327,
+    SAMPLER3DRECT        = 328,
+    SAMPLER2DSHADOW      = 329,
+    SAMPLERCUBESHADOW    = 330,
+    SAMPLER2DARRAYSHADOW = 331,
+    IMAGE2D              = 332,
+    IIMAGE2D             = 333,
+    UIMAGE2D             = 334,
+    IMAGE3D              = 335,
+    IIMAGE3D             = 336,
+    UIMAGE3D             = 337,
+    IMAGE2DARRAY         = 338,
+    IIMAGE2DARRAY        = 339,
+    UIMAGE2DARRAY        = 340,
+    IMAGECUBE            = 341,
+    IIMAGECUBE           = 342,
+    UIMAGECUBE           = 343,
+    LAYOUT               = 344,
+    IDENTIFIER           = 345,
+    TYPE_NAME            = 346,
+    FLOATCONSTANT        = 347,
+    INTCONSTANT          = 348,
+    UINTCONSTANT         = 349,
+    BOOLCONSTANT         = 350,
+    FIELD_SELECTION      = 351,
+    LEFT_OP              = 352,
+    RIGHT_OP             = 353,
+    INC_OP               = 354,
+    DEC_OP               = 355,
+    LE_OP                = 356,
+    GE_OP                = 357,
+    EQ_OP                = 358,
+    NE_OP                = 359,
+    AND_OP               = 360,
+    OR_OP                = 361,
+    XOR_OP               = 362,
+    MUL_ASSIGN           = 363,
+    DIV_ASSIGN           = 364,
+    ADD_ASSIGN           = 365,
+    MOD_ASSIGN           = 366,
+    LEFT_ASSIGN          = 367,
+    RIGHT_ASSIGN         = 368,
+    AND_ASSIGN           = 369,
+    XOR_ASSIGN           = 370,
+    OR_ASSIGN            = 371,
+    SUB_ASSIGN           = 372,
+    LEFT_PAREN           = 373,
+    RIGHT_PAREN          = 374,
+    LEFT_BRACKET         = 375,
+    RIGHT_BRACKET        = 376,
+    LEFT_BRACE           = 377,
+    RIGHT_BRACE          = 378,
+    DOT                  = 379,
+    COMMA                = 380,
+    COLON                = 381,
+    EQUAL                = 382,
+    SEMICOLON            = 383,
+    BANG                 = 384,
+    DASH                 = 385,
+    TILDE                = 386,
+    PLUS                 = 387,
+    STAR                 = 388,
+    SLASH                = 389,
+    PERCENT              = 390,
+    LEFT_ANGLE           = 391,
+    RIGHT_ANGLE          = 392,
+    VERTICAL_BAR         = 393,
+    CARET                = 394,
+    AMPERSAND            = 395,
+    QUESTION             = 396
+};
 #endif
 
 /* Value type.  */
@@ -204,6 +218,7 @@
             TIntermNodePair nodePair;
             TIntermTyped* intermTypedNode;
             TIntermAggregate* intermAggregate;
+            TIntermBlock *intermBlock;
             TIntermSwitch* intermSwitch;
             TIntermCase* intermCase;
         };
diff --git a/src/compiler/translator/util.cpp b/src/compiler/translator/util.cpp
index 584d653..54a1a2c 100644
--- a/src/compiler/translator/util.cpp
+++ b/src/compiler/translator/util.cpp
@@ -159,6 +159,30 @@
       case EbtSampler2DShadow:      return GL_SAMPLER_2D_SHADOW;
       case EbtSamplerCubeShadow:    return GL_SAMPLER_CUBE_SHADOW;
       case EbtSampler2DArrayShadow: return GL_SAMPLER_2D_ARRAY_SHADOW;
+      case EbtImage2D:
+          return GL_IMAGE_2D;
+      case EbtIImage2D:
+          return GL_INT_IMAGE_2D;
+      case EbtUImage2D:
+          return GL_UNSIGNED_INT_IMAGE_2D;
+      case EbtImage2DArray:
+          return GL_IMAGE_2D_ARRAY;
+      case EbtIImage2DArray:
+          return GL_INT_IMAGE_2D_ARRAY;
+      case EbtUImage2DArray:
+          return GL_UNSIGNED_INT_IMAGE_2D_ARRAY;
+      case EbtImage3D:
+          return GL_IMAGE_3D;
+      case EbtIImage3D:
+          return GL_INT_IMAGE_3D;
+      case EbtUImage3D:
+          return GL_UNSIGNED_INT_IMAGE_3D;
+      case EbtImageCube:
+          return GL_IMAGE_CUBE;
+      case EbtIImageCube:
+          return GL_INT_IMAGE_CUBE;
+      case EbtUImageCube:
+          return GL_UNSIGNED_INT_IMAGE_CUBE;
       default: UNREACHABLE();
     }